diff --git a/examples/htlc-logicsig/signature.algo.ts b/examples/htlc-logicsig/signature.algo.ts new file mode 100644 index 0000000..df6cf1f --- /dev/null +++ b/examples/htlc-logicsig/signature.algo.ts @@ -0,0 +1,39 @@ +import { Account, Bytes, Global, LogicSig, op, TransactionType, Txn, Uint64, uint64 } from '@algorandfoundation/algorand-typescript' +import algosdk from 'algosdk' + +export default class HashedTimeLockedLogicSig extends LogicSig { + program(): boolean | uint64 { + // Participants + const sellerAddress = Bytes(algosdk.decodeAddress('6ZHGHH5Z5CTPCF5WCESXMGRSVK7QJETR63M3NY5FJCUYDHO57VTCMJOBGY').publicKey) + const buyerAddress = Bytes(algosdk.decodeAddress('7Z5PWO2C6LFNQFGHWKSK5H47IQP5OJW2M3HA2QPXTY3WTNP5NU2MHBW27M').publicKey) + const seller = Account(sellerAddress) + const buyer = Account(buyerAddress) + + // Contract parameters + const feeLimit = Uint64(1000) + const secretHash = Bytes.fromHex('2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b') + const timeout = Uint64(3000) + + // Transaction conditions + const isPayment = Txn.typeEnum === TransactionType.Payment + const isFeeAcceptable = Txn.fee < feeLimit + const isNoCloseTo = Txn.closeRemainderTo === Global.zeroAddress + const isNoRekey = Txn.rekeyTo === Global.zeroAddress + + // Safety conditions + const safetyConditions = isPayment && isNoCloseTo && isNoRekey + + // Seller receives payment if correct secret is provided + const isToSeller = Txn.receiver === seller + const isSecretCorrect = op.sha256(op.arg(0)) === secretHash + const sellerReceives = isToSeller && isSecretCorrect + + // Buyer receives refund after timeout + const isToBuyer = Txn.receiver === buyer + const isAfterTimeout = Txn.firstValid > timeout + const buyerReceivesRefund = isToBuyer && isAfterTimeout + + // Final contract logic + return isFeeAcceptable && safetyConditions && (sellerReceives || buyerReceivesRefund) + } +} diff --git a/examples/htlc-logicsig/signature.spec.ts b/examples/htlc-logicsig/signature.spec.ts new file mode 100644 index 0000000..2224f10 --- /dev/null +++ b/examples/htlc-logicsig/signature.spec.ts @@ -0,0 +1,32 @@ +import { Account, Bytes } from '@algorandfoundation/algorand-typescript' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import algosdk from 'algosdk' +import { afterEach, describe, expect, it } from 'vitest' +import { ZERO_ADDRESS } from '../../src/constants' +import HashedTimeLockedLogicSig from './signature.algo' + +describe('HTLC LogicSig', () => { + const ctx = new TestExecutionContext() + + afterEach(() => { + ctx.reset() + }) + + it('seller receives payment if correct secret is provided', () => { + const receiverAddress = Bytes(algosdk.decodeAddress('6ZHGHH5Z5CTPCF5WCESXMGRSVK7QJETR63M3NY5FJCUYDHO57VTCMJOBGY').publicKey) + ctx.txn + .createScope([ + ctx.any.txn.payment({ + fee: 500, + firstValid: 1000, + closeRemainderTo: Account(ZERO_ADDRESS), + rekeyTo: Account(ZERO_ADDRESS), + receiver: Account(receiverAddress), + }), + ]) + .execute(() => { + const result = ctx.executeLogicSig(new HashedTimeLockedLogicSig(), Bytes('secret')) + expect(result).toBe(true) + }) + }) +}) diff --git a/examples/rollup.config.ts b/examples/rollup.config.ts index bc04ab8..79ef1aa 100644 --- a/examples/rollup.config.ts +++ b/examples/rollup.config.ts @@ -12,6 +12,7 @@ const config: RollupOptions = { 'examples/auction/contract.algo.ts', 'examples/voting/contract.algo.ts', 'examples/simple-voting/contract.algo.ts', + 'examples/zk-whitelist/contract.algo.ts', ], output: [ { diff --git a/examples/zk-whitelist/contract.algo.ts b/examples/zk-whitelist/contract.algo.ts new file mode 100644 index 0000000..d1a9224 --- /dev/null +++ b/examples/zk-whitelist/contract.algo.ts @@ -0,0 +1,94 @@ +import { + abimethod, + Account, + arc4, + assert, + BigUint, + Bytes, + ensureBudget, + Global, + itxn, + LocalState, + op, + OpUpFeeSource, + TemplateVar, + Txn, + uint64, +} from '@algorandfoundation/algorand-typescript' + +const curveMod = 21888242871839275222246405745257275088548364400416034343698204186575808495617n +const verifierBudget = 145000 + +export default class ZkWhitelistContract extends arc4.Contract { + appName: arc4.Str | undefined + whiteList = LocalState() + + @abimethod({ onCreate: 'require' }) + create(name: arc4.Str) { + // Create the application + this.appName = name + } + + @abimethod({ allowActions: ['UpdateApplication', 'DeleteApplication'] }) + update() { + // Update the application if it is mutable (manager only) + assert(Global.creatorAddress === Txn.sender) + } + + @abimethod({ allowActions: ['OptIn', 'CloseOut'] }) + optInOrOut() { + // Opt in or out of the application + return + } + + @abimethod() + addAddressToWhitelist(address: arc4.Address, proof: arc4.DynamicArray): arc4.Str { + /* + Add caller to the whitelist if the zk proof is valid. + On success, will return an empty string. Otherwise, will return an error + message. + */ + ensureBudget(verifierBudget, OpUpFeeSource.GroupCredit) + // The verifier expects public inputs to be in the curve field, but an + // Algorand address might represent a number larger than the field + // modulus, so to be safe we take the address modulo the field modulus + const addressMod = arc4.interpretAsArc4(op.bzero(32).bitwiseOr(Bytes(BigUint(address.bytes) % curveMod))) + // Verify the proof by calling the deposit verifier app + const verified = this.verifyProof(TemplateVar('VERIFIER_APP_ID'), proof, new arc4.DynamicArray(addressMod)) + if (!verified.native) { + return new arc4.Str('Proof verification failed') + } + // if successful, add the sender to the whitelist by setting local state + const account = Account(address.bytes) + if (Txn.sender !== account) { + return new arc4.Str('Sender address does not match authorized address') + } + this.whiteList(account).value = true + return new arc4.Str('') + } + + @abimethod() + isOnWhitelist(address: arc4.Address): arc4.Bool { + // Check if an address is on the whitelist + const account = address.native + const optedIn = op.appOptedIn(account, Global.currentApplicationId) + if (!optedIn) { + return new arc4.Bool(false) + } + const whitelisted = this.whiteList(account).value + return new arc4.Bool(whitelisted) + } + + verifyProof(appId: uint64, proof: arc4.DynamicArray, publicInputs: arc4.DynamicArray): arc4.Bool { + // Verify a proof using the verifier app. + const verified = itxn + .applicationCall({ + appId: appId, + fee: 0, + appArgs: [arc4.methodSelector('verify(byte[32][],byte[32][])bool'), proof.copy(), publicInputs.copy()], + onCompletion: arc4.OnCompleteAction.NoOp, + }) + .submit().lastLog + return arc4.interpretAsArc4(verified, 'log') + } +} diff --git a/examples/zk-whitelist/contract.spec.ts b/examples/zk-whitelist/contract.spec.ts new file mode 100644 index 0000000..468e93b --- /dev/null +++ b/examples/zk-whitelist/contract.spec.ts @@ -0,0 +1,79 @@ +import { arc4, Bytes } from '@algorandfoundation/algorand-typescript' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { afterEach, describe, expect, it } from 'vitest' +import { ABI_RETURN_VALUE_LOG_PREFIX } from '../../src/constants' +import ZkWhitelistContract from './contract.algo' + +describe('ZK Whitelist', () => { + const ctx = new TestExecutionContext() + + afterEach(() => { + ctx.reset() + }) + + it('should be able to add address to whitelist', () => { + // Arrange + const contract = ctx.contract.create(ZkWhitelistContract) + contract.create(ctx.any.arc4.str(10)) + + const address = new arc4.Address(ctx.defaultSender) + const proof = new arc4.DynamicArray(new arc4.Address(Bytes(new Uint8Array(Array(32).fill(0))))) + + const dummyVerifierApp = ctx.any.application({ appLogs: [ABI_RETURN_VALUE_LOG_PREFIX.concat(Bytes.fromHex('80'))] }) + ctx.setTemplateVar('VERIFIER_APP_ID', dummyVerifierApp.id) + + // Act + const result = contract.addAddressToWhitelist(address, proof) + + // Assert + expect(result.native).toEqual('') + expect(contract.whiteList(ctx.defaultSender).value).toEqual(true) + }) + + it('returns error message if proof verification fails', () => { + // Arrange + const contract = ctx.contract.create(ZkWhitelistContract) + contract.create(ctx.any.arc4.str(10)) + + const address = ctx.any.arc4.address() + const proof = new arc4.DynamicArray(new arc4.Address(Bytes(new Uint8Array(Array(32).fill(0))))) + const dummyVerifierApp = ctx.any.application({ appLogs: [ABI_RETURN_VALUE_LOG_PREFIX.concat(Bytes(''))] }) + ctx.setTemplateVar('VERIFIER_APP_ID', dummyVerifierApp.id) + + // Act + const result = contract.addAddressToWhitelist(address, proof) + + // Assert + expect(result.native).toEqual('Proof verification failed') + }) + + it('returns true if address is already in whitelist', () => { + // Arrange + const contract = ctx.contract.create(ZkWhitelistContract) + contract.create(ctx.any.arc4.str(10)) + + const dummyAccount = ctx.any.account({ optedApplications: [ctx.ledger.getApplicationForContract(contract)] }) + contract.whiteList(dummyAccount).value = true + + // Act + const result = contract.isOnWhitelist(new arc4.Address(dummyAccount)) + + // Assert + expect(result.native).toBe(true) + }) + + it('returns false if address is not in whitelist', () => { + // Arrange + const contract = ctx.contract.create(ZkWhitelistContract) + contract.create(ctx.any.arc4.str(10)) + + const dummyAccount = ctx.any.account({ optedApplications: [ctx.ledger.getApplicationForContract(contract)] }) + contract.whiteList(dummyAccount).value = false + + // Act + const result = contract.isOnWhitelist(new arc4.Address(dummyAccount)) + + // Assert + expect(result.native).toBe(false) + }) +}) diff --git a/package-lock.json b/package-lock.json index b96dcaf..8235042 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "hasInstallScript": true, "dependencies": { - "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.22", - "@algorandfoundation/puya-ts": "^1.0.0-alpha.34", + "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.23", + "@algorandfoundation/puya-ts": "^1.0.0-alpha.35", "elliptic": "^6.5.7", "js-sha256": "^0.11.0", "js-sha3": "^0.9.3", @@ -73,9 +73,9 @@ } }, "node_modules/@algorandfoundation/algorand-typescript": { - "version": "0.0.1-alpha.22", - "resolved": "https://registry.npmjs.org/@algorandfoundation/algorand-typescript/-/algorand-typescript-0.0.1-alpha.22.tgz", - "integrity": "sha512-RhPxX2wU3srIEmA8EgjEbE8lJQqJrUW78aKS2VnpVS/uejHMDDt+kQIjtjpNEB+vxli8shaBYZ8TM0h1wE5b0g==", + "version": "0.0.1-alpha.23", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algorand-typescript/-/algorand-typescript-0.0.1-alpha.23.tgz", + "integrity": "sha512-hK1rom4MD2qn3tO03Bsui8lcuA7WF5CeFGdUCIrRJgc+wLnWKNx0s9TkAotrl8VwfD5Wg7Gn3u9txz4RgdQsPw==", "peerDependencies": { "tslib": "^2.6.2" } @@ -13262,6 +13262,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 513f04a..0e2b138 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,8 @@ "tslib": "^2.6.2" }, "dependencies": { - "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.22", - "@algorandfoundation/puya-ts": "^1.0.0-alpha.34", + "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.23", + "@algorandfoundation/puya-ts": "^1.0.0-alpha.35", "elliptic": "^6.5.7", "js-sha256": "^0.11.0", "js-sha3": "^0.9.3", diff --git a/src/constants.ts b/src/constants.ts index 2637b14..b218a66 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,7 +3,11 @@ import { Bytes } from '@algorandfoundation/algorand-typescript' export const UINT64_SIZE = 64 export const UINT512_SIZE = 512 export const MAX_UINT8 = 2 ** 8 - 1 +export const MAX_UINT16 = 2 ** 16 - 1 +export const MAX_UINT32 = 2 ** 32 - 1 export const MAX_UINT64 = 2n ** 64n - 1n +export const MAX_UINT128 = 2n ** 128n - 1n +export const MAX_UINT256 = 2n ** 256n - 1n export const MAX_UINT512 = 2n ** 512n - 1n export const MAX_BYTES_SIZE = 4096 export const MAX_LOG_SIZE = 1024 @@ -43,6 +47,7 @@ export const ABI_RETURN_VALUE_LOG_PREFIX = Bytes.fromHex('151F7C75') export const UINT64_OVERFLOW_UNDERFLOW_MESSAGE = 'Uint64 overflow or underflow' export const BIGUINT_OVERFLOW_UNDERFLOW_MESSAGE = 'BigUint overflow or underflow' +export const DEFAULT_TEMPLATE_VAR_PREFIX = 'TMPL_' export const APP_ID_PREFIX = 'appID' export const HASH_BYTES_LENGTH = 32 diff --git a/src/impl/acct-params.ts b/src/impl/acct-params.ts index 2864405..9042446 100644 --- a/src/impl/acct-params.ts +++ b/src/impl/acct-params.ts @@ -1,6 +1,7 @@ -import { Account, gtxn, internal, uint64 } from '@algorandfoundation/algorand-typescript' +import { Account, Application, gtxn, internal, uint64 } from '@algorandfoundation/algorand-typescript' import { lazyContext } from '../context-helpers/internal-context' import { asMaybeUint64Cls } from '../util' +import { getApp } from './app-params' export const getAccount = (acct: Account | internal.primitives.StubUint64Compat): Account => { const acctId = asMaybeUint64Cls(acct) @@ -21,6 +22,19 @@ export const minBalance = (a: Account | internal.primitives.StubUint64Compat): u return acct.minBalance } +export const appOptedIn = ( + a: Account | internal.primitives.StubUint64Compat, + b: Application | internal.primitives.StubUint64Compat, +): boolean => { + const account = getAccount(a) + const app = getApp(b) + + if (account === undefined || app === undefined) { + return false + } + return account.isOptedIn(app) +} + export const AcctParams: internal.opTypes.AcctParamsType = { acctBalance(a: Account | internal.primitives.StubUint64Compat): readonly [uint64, boolean] { const acct = getAccount(a) diff --git a/src/impl/ensure-budget.ts b/src/impl/ensure-budget.ts new file mode 100644 index 0000000..3ebb307 --- /dev/null +++ b/src/impl/ensure-budget.ts @@ -0,0 +1,5 @@ +import { OpUpFeeSource, uint64 } from '@algorandfoundation/algorand-typescript' + +export function ensureBudgetImpl(_budget: uint64, _feeSource: OpUpFeeSource = OpUpFeeSource.GroupCredit) { + // ensureBudget function is emulated to be a no-op +} diff --git a/src/impl/index.ts b/src/impl/index.ts index 159e731..42bd62b 100644 --- a/src/impl/index.ts +++ b/src/impl/index.ts @@ -1,15 +1,16 @@ -export { AcctParams, balance, minBalance } from './acct-params' +export { AcctParams, appOptedIn, balance, minBalance } from './acct-params' export { AppGlobal } from './app-global' export { AppLocal } from './app-local' export { AppParams } from './app-params' export { AssetHolding } from './asset-holding' export { AssetParams } from './asset-params' +export { Block } from './block' export { Box } from './box' export * from './crypto' export { Global } from './global' export { GTxn } from './gtxn' export { GITxn, ITxn, ITxnCreate } from './itxn' +export { arg } from './logicSigArg' export * from './pure' -export { Scratch, gloadBytes, gloadUint64 } from './scratch' -export { Block } from './block' -export { Txn, gaid } from './txn' +export { gloadBytes, gloadUint64, Scratch } from './scratch' +export { gaid, Txn } from './txn' diff --git a/src/impl/logicSigArg.ts b/src/impl/logicSigArg.ts new file mode 100644 index 0000000..6d411fc --- /dev/null +++ b/src/impl/logicSigArg.ts @@ -0,0 +1,8 @@ +import { bytes, internal } from '@algorandfoundation/algorand-typescript' +import { lazyContext } from '../context-helpers/internal-context' +import { asNumber } from '../util' + +export const arg = (a: internal.primitives.StubUint64Compat): bytes => { + const index = asNumber(a) + return lazyContext.value.activeLogicSigArgs[index] +} diff --git a/src/impl/pure.ts b/src/impl/pure.ts index 6d655f7..c81a94b 100644 --- a/src/impl/pure.ts +++ b/src/impl/pure.ts @@ -1,7 +1,7 @@ import { Base64, biguint, Bytes, bytes, internal, Uint64, uint64 } from '@algorandfoundation/algorand-typescript' import { BITS_IN_BYTE, MAX_BYTES_SIZE, MAX_UINT64, MAX_UINT8, UINT64_SIZE } from '../constants' import { notImplementedError, testInvariant } from '../errors' -import { asBigUint, asBytes, asMaybeBytesCls, asMaybeUint64Cls, asUint64Cls, binaryStringToBytes } from '../util' +import { asBigUint, asBytes, asBytesCls, asMaybeBytesCls, asMaybeUint64Cls, asUint64Cls, binaryStringToBytes } from '../util' export const addw = (a: internal.primitives.StubUint64Compat, b: internal.primitives.StubUint64Compat): readonly [uint64, uint64] => { const uint64A = internal.primitives.Uint64Cls.fromCompat(a) @@ -172,6 +172,10 @@ export const itob = (a: internal.primitives.StubUint64Compat): bytes => { return asUint64Cls(a).toBytes().asAlgoTs() } +export const len = (a: internal.primitives.StubBytesCompat): uint64 => { + return asBytesCls(a).length.asAlgoTs() +} + export const mulw = (a: internal.primitives.StubUint64Compat, b: internal.primitives.StubUint64Compat): readonly [uint64, uint64] => { const uint64A = internal.primitives.Uint64Cls.fromCompat(a) const uint64B = internal.primitives.Uint64Cls.fromCompat(b) diff --git a/src/impl/template-var.ts b/src/impl/template-var.ts new file mode 100644 index 0000000..e49cfc4 --- /dev/null +++ b/src/impl/template-var.ts @@ -0,0 +1,11 @@ +import { internal } from '@algorandfoundation/algorand-typescript' +import { DEFAULT_TEMPLATE_VAR_PREFIX } from '../constants' +import { lazyContext } from '../context-helpers/internal-context' + +export function TemplateVarImpl(variableName: string, prefix = DEFAULT_TEMPLATE_VAR_PREFIX): T { + const key = prefix + variableName + if (!Object.hasOwn(lazyContext.value.templateVars, key)) { + throw internal.errors.codeError(`Template variable ${key} not found in test context!`) + } + return lazyContext.value.templateVars[prefix + variableName] as T +} diff --git a/src/runtime-helpers.ts b/src/runtime-helpers.ts index 5671a7e..48b08d6 100644 --- a/src/runtime-helpers.ts +++ b/src/runtime-helpers.ts @@ -2,11 +2,14 @@ import { internal } from '@algorandfoundation/algorand-typescript' import { ARC4Encoded } from '@algorandfoundation/algorand-typescript/arc4' import { MAX_UINT64 } from './constants' import type { TypeInfo } from './encoders' +import { AccountCls } from './impl/account' import { DeliberateAny } from './typescript-helpers' import { nameOfType } from './util' export { attachAbiMetadata } from './abi-metadata' export * from './impl/encoded-types' +export { ensureBudgetImpl } from './impl/ensure-budget' +export { TemplateVarImpl } from './impl/template-var' export function switchableValue(x: unknown): bigint | string | boolean { if (typeof x === 'boolean') return x @@ -37,6 +40,9 @@ export function binaryOp(left: unknown, right: unknown, op: BinaryOps) { if (left instanceof ARC4Encoded && right instanceof ARC4Encoded) { return arc4EncodedOp(left, right, op) } + if (left instanceof AccountCls && right instanceof AccountCls) { + return accountBinaryOp(left, right, op) + } if (left instanceof internal.primitives.BigUintCls || right instanceof internal.primitives.BigUintCls) { return bigUintBinaryOp(left, right, op) } @@ -84,6 +90,16 @@ function arc4EncodedOp(left: ARC4Encoded, right: ARC4Encoded, op: BinaryOps): De internal.errors.internalError(`Unsupported operator ${op}`) } } + +function accountBinaryOp(left: AccountCls, right: AccountCls, op: BinaryOps): DeliberateAny { + switch (op) { + case '===': + case '!==': + return bytesBinaryOp(left.bytes, right.bytes, op) + default: + internal.errors.internalError(`Unsupported operator ${op}`) + } +} function uint64BinaryOp(left: DeliberateAny, right: DeliberateAny, op: BinaryOps): DeliberateAny { const lbi = internal.primitives.Uint64Cls.fromCompat(left).valueOf() const rbi = internal.primitives.Uint64Cls.fromCompat(right).valueOf() diff --git a/src/test-execution-context.ts b/src/test-execution-context.ts index f86e183..efbf68e 100644 --- a/src/test-execution-context.ts +++ b/src/test-execution-context.ts @@ -1,5 +1,6 @@ -import { Account, Application, Asset, bytes, internal, uint64 } from '@algorandfoundation/algorand-typescript' +import { Account, Application, Asset, bytes, internal, LogicSig, uint64 } from '@algorandfoundation/algorand-typescript' import { captureMethodConfig } from './abi-metadata' +import { DEFAULT_TEMPLATE_VAR_PREFIX } from './constants' import { DecodedLogs, LogDecoding } from './decode-logs' import * as ops from './impl' import { AccountCls } from './impl/account' @@ -18,6 +19,7 @@ import { Box, BoxMap, BoxRef, GlobalState, LocalState } from './impl/state' import { ContractContext } from './subcontexts/contract-context' import { LedgerContext } from './subcontexts/ledger-context' import { TransactionContext } from './subcontexts/transaction-context' +import { DeliberateAny } from './typescript-helpers' import { getRandomBytes } from './util' import { ValueGenerator } from './value-generators' @@ -27,6 +29,8 @@ export class TestExecutionContext implements internal.ExecutionContext { #txnContext: TransactionContext #valueGenerator: ValueGenerator #defaultSender: Account + #activeLogicSigArgs: bytes[] + #template_vars: Record = {} constructor(defaultSenderAddress?: bytes) { internal.ctxMgr.instance = this @@ -35,6 +39,7 @@ export class TestExecutionContext implements internal.ExecutionContext { this.#txnContext = new TransactionContext() this.#valueGenerator = new ValueGenerator() this.#defaultSender = Account(defaultSenderAddress ?? getRandomBytes(32).asAlgoTs()) + this.#activeLogicSigArgs = [] } account(address?: bytes): Account { @@ -120,10 +125,33 @@ export class TestExecutionContext implements internal.ExecutionContext { } } + get activeLogicSigArgs(): bytes[] { + return this.#activeLogicSigArgs + } + + get templateVars(): Record { + return this.#template_vars + } + + executeLogicSig(logicSig: LogicSig, ...args: bytes[]): boolean | uint64 { + this.#activeLogicSigArgs = args + try { + return logicSig.program() + } finally { + this.#activeLogicSigArgs = [] + } + } + + setTemplateVar(name: string, value: DeliberateAny) { + this.#template_vars[DEFAULT_TEMPLATE_VAR_PREFIX + name] = value + } + reset() { this.#contractContext = new ContractContext() this.#ledgerContext = new LedgerContext() this.#txnContext = new TransactionContext() + this.#activeLogicSigArgs = [] + this.#template_vars = {} internal.ctxMgr.reset() internal.ctxMgr.instance = this } diff --git a/src/test-transformer/node-factory.ts b/src/test-transformer/node-factory.ts index 49d5607..684c734 100644 --- a/src/test-transformer/node-factory.ts +++ b/src/test-transformer/node-factory.ts @@ -94,12 +94,11 @@ export const nodeFactory = { ) }, - callARC4EncodingUtil(node: ts.CallExpression, typeInfo?: TypeInfo) { - const identifierExpression = node.expression as ts.Identifier + callStubbedFunction(functionName: string, node: ts.CallExpression, typeInfo?: TypeInfo) { const infoString = JSON.stringify(typeInfo) const updatedPropertyAccessExpression = factory.createPropertyAccessExpression( factory.createIdentifier('runtimeHelpers'), - `${identifierExpression.getText()}Impl`, + `${functionName}Impl`, ) return factory.createCallExpression( diff --git a/src/test-transformer/visitors.ts b/src/test-transformer/visitors.ts index 76e5edf..8275563 100644 --- a/src/test-transformer/visitors.ts +++ b/src/test-transformer/visitors.ts @@ -1,4 +1,5 @@ import { ptypes, SourceLocation, TypeResolver } from '@algorandfoundation/puya-ts' +import path from 'path' import ts from 'typescript' import type { TypeInfo } from '../encoders' import { instanceOfAny } from '../typescript-helpers' @@ -12,10 +13,16 @@ import { const { factory } = ts +const algotsModulePaths = [ + `@algorandfoundation${path.sep}algorand-typescript`, + `${path.sep}puya-ts${path.sep}packages${path.sep}algo-ts${path.sep}`, +] + type VisitorHelper = { additionalStatements: ts.Statement[] resolveType(node: ts.Node): ptypes.PType sourceLocation(node: ts.Node): SourceLocation + tryGetSymbol(node: ts.Node): ts.Symbol | undefined } export class SourceFileVisitor { @@ -26,8 +33,8 @@ export class SourceFileVisitor { program: ts.Program, private config: TransformerConfig, ) { - const typeResolver = new TypeResolver(program.getTypeChecker(), program.getCurrentDirectory()) - + const typeChecker = program.getTypeChecker() + const typeResolver = new TypeResolver(typeChecker, program.getCurrentDirectory()) this.helper = { additionalStatements: [], resolveType(node: ts.Node): ptypes.PType { @@ -37,6 +44,10 @@ export class SourceFileVisitor { return ptypes.anyPType } }, + tryGetSymbol(node: ts.Node): ts.Symbol | undefined { + const s = typeChecker.getSymbolAtLocation(node) + return s && s.flags & ts.SymbolFlags.Alias ? typeChecker.getAliasedSymbol(s) : s + }, sourceLocation(node: ts.Node): SourceLocation { return SourceLocation.fromNode(node, program.getCurrentDirectory()) }, @@ -45,7 +56,6 @@ export class SourceFileVisitor { public result(): ts.SourceFile { const updatedSourceFile = ts.visitNode(this.sourceFile, this.visit) as ts.SourceFile - return factory.updateSourceFile(updatedSourceFile, [ nodeFactory.importHelpers(this.config.testingPackageName), ...updatedSourceFile.statements, @@ -91,20 +101,21 @@ class ExpressionVisitor { const isGeneric = isGenericType(type) const isArc4Encoded = isArc4EncodedType(type) - if (isGeneric || isArc4Encoded) { - let updatedNode = node - const info = getGenericTypeInfo(type) + const info = isGeneric || isArc4Encoded ? getGenericTypeInfo(type) : undefined + let updatedNode = node + + if (ts.isNewExpression(updatedNode)) { if (isArc4EncodedType(type)) { - if (ts.isNewExpression(updatedNode)) { - updatedNode = nodeFactory.instantiateARC4EncodedType(updatedNode, info) - } else if (ts.isCallExpression(updatedNode) && isCallingARC4EncodingUtils(updatedNode)) { - updatedNode = nodeFactory.callARC4EncodingUtil(updatedNode, info) - } + updatedNode = nodeFactory.instantiateARC4EncodedType(updatedNode, info) } - return isGeneric - ? nodeFactory.captureGenericTypeInfo(ts.visitEachChild(updatedNode, this.visit, this.context), JSON.stringify(info)) - : ts.visitEachChild(updatedNode, this.visit, this.context) } + if (ts.isCallExpression(updatedNode)) { + const stubbedFunctionName = tryGetStubbedFunctionName(updatedNode, this.helper) + updatedNode = stubbedFunctionName ? nodeFactory.callStubbedFunction(stubbedFunctionName, updatedNode, info) : updatedNode + } + return isGeneric + ? nodeFactory.captureGenericTypeInfo(ts.visitEachChild(updatedNode, this.visit, this.context), JSON.stringify(info)) + : ts.visitEachChild(updatedNode, this.visit, this.context) } return ts.visitEachChild(node, this.visit, this.context) } @@ -194,7 +205,7 @@ class FunctionOrMethodVisitor { if (ts.isNewExpression(node)) { return new ExpressionVisitor(this.context, this.helper, node).result() } - if (ts.isCallExpression(node) && isCallingARC4EncodingUtils(node)) { + if (ts.isCallExpression(node) && tryGetStubbedFunctionName(node, this.helper)) { return new ExpressionVisitor(this.context, this.helper, node).result() } @@ -331,9 +342,17 @@ const getGenericTypeInfo = (type: ptypes.PType): TypeInfo => { return result } -const isCallingARC4EncodingUtils = (node: ts.CallExpression) => { - if (node.expression.kind !== ts.SyntaxKind.Identifier) return false - const identityExpression = node.expression as ts.Identifier - const utilMethods = ['interpretAsArc4', 'decodeArc4', 'encodeArc4'] - return utilMethods.includes(identityExpression.text) +const tryGetStubbedFunctionName = (node: ts.CallExpression, helper: VisitorHelper): string | undefined => { + if (node.expression.kind !== ts.SyntaxKind.Identifier && !ts.isPropertyAccessExpression(node.expression)) return undefined + const identityExpression = ts.isPropertyAccessExpression(node.expression) + ? (node.expression as ts.PropertyAccessExpression).name + : (node.expression as ts.Identifier) + const functionSymbol = helper.tryGetSymbol(identityExpression) + if (functionSymbol) { + const sourceFileName = functionSymbol.valueDeclaration?.getSourceFile().fileName + if (sourceFileName && !algotsModulePaths.some((s) => sourceFileName.includes(s))) return undefined + } + const functionName = functionSymbol?.getName() ?? identityExpression.text + const stubbedFunctionNames = ['interpretAsArc4', 'decodeArc4', 'encodeArc4', 'TemplateVar', 'ensureBudget'] + return stubbedFunctionNames.includes(functionName) ? functionName : undefined } diff --git a/src/value-generators/arc4.ts b/src/value-generators/arc4.ts new file mode 100644 index 0000000..e9df2ad --- /dev/null +++ b/src/value-generators/arc4.ts @@ -0,0 +1,114 @@ +import { arc4 } from '@algorandfoundation/algorand-typescript' +import { BITS_IN_BYTE, MAX_UINT128, MAX_UINT16, MAX_UINT256, MAX_UINT32, MAX_UINT512, MAX_UINT64, MAX_UINT8 } from '../constants' +import { AddressImpl, DynamicBytesImpl, StrImpl, UintNImpl } from '../impl/encoded-types' +import { getRandomBigInt, getRandomBytes, getRandomNumber } from '../util' +import { AvmValueGenerator } from './avm' + +export class Arc4ValueGenerator { + /** + * Generate a random Algorand address. + * @returns: A new, random Algorand address. + * */ + address(): arc4.Address { + const source = new AvmValueGenerator().account() + const result = new AddressImpl({ name: 'StaticArray', genericArgs: { elementType: { name: 'Byte' }, size: { name: '32' } } }, source) + return result + } + + /** + * Generate a random UintN8 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT8. + * @returns: A random UintN8 value. + * */ + uintN8(minValue = 0, maxValue = MAX_UINT8): arc4.UintN8 { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '8' }] }, getRandomNumber(minValue, maxValue)) + } + + /** + * Generate a random UintN16 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT16. + * @returns: A random UintN16 value. + * */ + uintN16(minValue = 0, maxValue = MAX_UINT16): arc4.UintN16 { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '16' }] }, getRandomNumber(minValue, maxValue)) + } + + /** + * Generate a random UintN32 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT32. + * @returns: A random UintN32 value. + * */ + uintN32(minValue = 0, maxValue = MAX_UINT32): arc4.UintN32 { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '32' }] }, getRandomNumber(minValue, maxValue)) + } + + /** + * Generate a random UintN64 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT64. + * @returns: A random UintN64 value. + * */ + uintN64(minValue = 0, maxValue = MAX_UINT64): arc4.UintN64 { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '64' }] }, getRandomBigInt(minValue, maxValue)) + } + + /** + * Generate a random UintN128 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT128. + * @returns: A random UintN128 value. + * */ + uintN128(minValue = 0, maxValue = MAX_UINT128): arc4.UintN128 { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '128' }] }, getRandomBigInt(minValue, maxValue)) + } + + /** + * Generate a random UintN256 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT256. + * @returns: A random UintN256 value. + * */ + uintN256(minValue = 0, maxValue = MAX_UINT256): arc4.UintN256 { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '256' }] }, getRandomBigInt(minValue, maxValue)) + } + + /** + * Generate a random UintN512 within the specified range. + * @param minValue: Minimum value (inclusive). Defaults to 0. + * @param maxValue: Maximum value (inclusive). Defaults to MAX_UINT512. + * @returns: A random UintN512 value. + * */ + uintN512(minValue = 0, maxValue = MAX_UINT512): arc4.UintN<512> { + return new UintNImpl({ name: 'UintN', genericArgs: [{ name: '512' }] }, getRandomBigInt(minValue, maxValue)) + } + + /** + * Generate a random dynamic bytes of size `n` bits. + * @param n: The number of bits for the dynamic bytes. Must be a multiple of 8, otherwise + * the last byte will be truncated. + * @returns: A new, random dynamic bytes of size `n` bits. + * */ + dynamicBytes(n: number): arc4.DynamicBytes { + return new DynamicBytesImpl( + { name: 'DynamicArray', genericArgs: { elementType: { name: 'Byte' } } }, + getRandomBytes(n / BITS_IN_BYTE).asAlgoTs(), + ) + } + + /** + * Generate a random dynamic string of size `n` bits. + * @param n: The number of bits for the string. + * @returns: A new, random string of size `n` bits. + * */ + str(n: number): arc4.Str { + // Calculate the number of characters needed (rounding up) + const numChars = n + 7 // 8 + + // Generate random string + const bytes = getRandomBytes(numChars) + return new StrImpl(JSON.stringify(undefined), bytes.toString()) + } +} diff --git a/src/value-generators/index.ts b/src/value-generators/index.ts index ad3fe82..f077945 100644 --- a/src/value-generators/index.ts +++ b/src/value-generators/index.ts @@ -1,11 +1,14 @@ +import { Arc4ValueGenerator } from './arc4' import { AvmValueGenerator } from './avm' import { TxnValueGenerator } from './txn' export class ValueGenerator extends AvmValueGenerator { txn: TxnValueGenerator + arc4: Arc4ValueGenerator constructor() { super() this.txn = new TxnValueGenerator() + this.arc4 = new Arc4ValueGenerator() } } diff --git a/tests/artifacts/miscellaneous-ops/contract.algo.ts b/tests/artifacts/miscellaneous-ops/contract.algo.ts index 0caefed..9876d85 100644 --- a/tests/artifacts/miscellaneous-ops/contract.algo.ts +++ b/tests/artifacts/miscellaneous-ops/contract.algo.ts @@ -144,6 +144,13 @@ export class MiscellaneousOpsContract extends arc4.Contract { return result } + @arc4.abimethod() + public verify_bytes_len(a: bytes, pad_a_size: uint64): uint64 { + const paddedA = op.bzero(pad_a_size).concat(a) + const result = op.len(paddedA) + return result + } + @arc4.abimethod() public verify_mulw(a: uint64, b: uint64): readonly [uint64, uint64] { const result = op.mulw(a, b) diff --git a/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.approval.teal b/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.approval.teal index 2fb67ab..a53da57 100644 --- a/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.approval.teal +++ b/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.approval.teal @@ -13,10 +13,10 @@ __puya_arc4_router__: // export class MiscellaneousOpsContract extends arc4.Contract { proto 0 1 txn NumAppArgs - bz __puya_arc4_router___bare_routing@38 - pushbytess 0x45847eea 0xf57aceb5 0x7d631730 0xa1b24441 0xcd7be1ac 0x7cfda64b 0x54a910d9 0xc46568de 0x7a46a6ae 0x04372209 0x7e5f6d72 0x24ebcf84 0x9c0b3397 0x0ad40da4 0x95178870 0xdeedc99b 0xab2150bb 0x02a54017 0x3db66b41 0xc7ea8c2a 0x1dcea50c 0x16166f9a 0x2f472065 0xd5a739c3 0x61f3b3e1 0x56cf368b 0x919ffbd2 0x8e30f4e7 0x89f81d92 0xd5260327 0x114c8c6d 0x39e9e62a 0xd6a4c05e 0x1ef8151a // method "verify_addw(uint64,uint64)(uint64,uint64)", method "verify_base64_decode_standard(byte[])byte[]", method "verify_base64_decode_url(byte[])byte[]", method "verify_bytes_bitlen(byte[],uint64)uint64", method "verify_uint64_bitlen(uint64)uint64", method "verify_bsqrt(byte[])byte[]", method "verify_btoi(byte[])uint64", method "verify_bzero(uint64)byte[]", method "verify_concat(byte[],byte[],uint64,uint64)byte[]", method "verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)", method "verify_divw(uint64,uint64,uint64)uint64", method "verify_err()void", method "verify_exp(uint64,uint64)uint64", method "verify_expw(uint64,uint64)(uint64,uint64)", method "verify_extract(byte[],uint64,uint64)byte[]", method "verify_extract_from_2(byte[])byte[]", method "verify_extract_uint16(byte[],uint64)uint64", method "verify_extract_uint32(byte[],uint64)uint64", method "verify_extract_uint64(byte[],uint64)uint64", method "verify_getbit_bytes(byte[],uint64)uint64", method "verify_getbit_uint64(uint64,uint64)uint64", method "verify_getbyte(byte[],uint64)uint64", method "verify_itob(uint64)byte[]", method "verify_mulw(uint64,uint64)(uint64,uint64)", method "verify_replace(byte[],uint64,byte[])byte[]", method "verify_select_bytes(byte[],byte[],uint64)byte[]", method "verify_select_uint64(uint64,uint64,uint64)uint64", method "verify_setbit_bytes(byte[],uint64,uint64)byte[]", method "verify_setbit_uint64(uint64,uint64,uint64)uint64", method "verify_setbyte(byte[],uint64,uint64)byte[]", method "verify_shl(uint64,uint64)uint64", method "verify_shr(uint64,uint64)uint64", method "verify_sqrt(uint64)uint64", method "verify_substring(byte[],uint64,uint64)byte[]" + bz __puya_arc4_router___bare_routing@39 + pushbytess 0x45847eea 0xf57aceb5 0x7d631730 0xa1b24441 0xcd7be1ac 0x7cfda64b 0x54a910d9 0xc46568de 0x7a46a6ae 0x04372209 0x7e5f6d72 0x24ebcf84 0x9c0b3397 0x0ad40da4 0x95178870 0xdeedc99b 0xab2150bb 0x02a54017 0x3db66b41 0xc7ea8c2a 0x1dcea50c 0x16166f9a 0x2f472065 0xc58d30e0 0xd5a739c3 0x61f3b3e1 0x56cf368b 0x919ffbd2 0x8e30f4e7 0x89f81d92 0xd5260327 0x114c8c6d 0x39e9e62a 0xd6a4c05e 0x1ef8151a // method "verify_addw(uint64,uint64)(uint64,uint64)", method "verify_base64_decode_standard(byte[])byte[]", method "verify_base64_decode_url(byte[])byte[]", method "verify_bytes_bitlen(byte[],uint64)uint64", method "verify_uint64_bitlen(uint64)uint64", method "verify_bsqrt(byte[])byte[]", method "verify_btoi(byte[])uint64", method "verify_bzero(uint64)byte[]", method "verify_concat(byte[],byte[],uint64,uint64)byte[]", method "verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)", method "verify_divw(uint64,uint64,uint64)uint64", method "verify_err()void", method "verify_exp(uint64,uint64)uint64", method "verify_expw(uint64,uint64)(uint64,uint64)", method "verify_extract(byte[],uint64,uint64)byte[]", method "verify_extract_from_2(byte[])byte[]", method "verify_extract_uint16(byte[],uint64)uint64", method "verify_extract_uint32(byte[],uint64)uint64", method "verify_extract_uint64(byte[],uint64)uint64", method "verify_getbit_bytes(byte[],uint64)uint64", method "verify_getbit_uint64(uint64,uint64)uint64", method "verify_getbyte(byte[],uint64)uint64", method "verify_itob(uint64)byte[]", method "verify_bytes_len(byte[],uint64)uint64", method "verify_mulw(uint64,uint64)(uint64,uint64)", method "verify_replace(byte[],uint64,byte[])byte[]", method "verify_select_bytes(byte[],byte[],uint64)byte[]", method "verify_select_uint64(uint64,uint64,uint64)uint64", method "verify_setbit_bytes(byte[],uint64,uint64)byte[]", method "verify_setbit_uint64(uint64,uint64,uint64)uint64", method "verify_setbyte(byte[],uint64,uint64)byte[]", method "verify_shl(uint64,uint64)uint64", method "verify_shr(uint64,uint64)uint64", method "verify_sqrt(uint64)uint64", method "verify_substring(byte[],uint64,uint64)byte[]" txna ApplicationArgs 0 - match __puya_arc4_router___verify_addw_route@2 __puya_arc4_router___verify_base64_decode_standard_route@3 __puya_arc4_router___verify_base64_decode_url_route@4 __puya_arc4_router___verify_bytes_bitlen_route@5 __puya_arc4_router___verify_uint64_bitlen_route@6 __puya_arc4_router___verify_bsqrt_route@7 __puya_arc4_router___verify_btoi_route@8 __puya_arc4_router___verify_bzero_route@9 __puya_arc4_router___verify_concat_route@10 __puya_arc4_router___verify_divmodw_route@11 __puya_arc4_router___verify_divw_route@12 __puya_arc4_router___verify_err_route@13 __puya_arc4_router___verify_exp_route@14 __puya_arc4_router___verify_expw_route@15 __puya_arc4_router___verify_extract_route@16 __puya_arc4_router___verify_extract_from_2_route@17 __puya_arc4_router___verify_extract_uint16_route@18 __puya_arc4_router___verify_extract_uint32_route@19 __puya_arc4_router___verify_extract_uint64_route@20 __puya_arc4_router___verify_getbit_bytes_route@21 __puya_arc4_router___verify_getbit_uint64_route@22 __puya_arc4_router___verify_getbyte_route@23 __puya_arc4_router___verify_itob_route@24 __puya_arc4_router___verify_mulw_route@25 __puya_arc4_router___verify_replace_route@26 __puya_arc4_router___verify_select_bytes_route@27 __puya_arc4_router___verify_select_uint64_route@28 __puya_arc4_router___verify_setbit_bytes_route@29 __puya_arc4_router___verify_setbit_uint64_route@30 __puya_arc4_router___verify_setbyte_route@31 __puya_arc4_router___verify_shl_route@32 __puya_arc4_router___verify_shr_route@33 __puya_arc4_router___verify_sqrt_route@34 __puya_arc4_router___verify_substring_route@35 + match __puya_arc4_router___verify_addw_route@2 __puya_arc4_router___verify_base64_decode_standard_route@3 __puya_arc4_router___verify_base64_decode_url_route@4 __puya_arc4_router___verify_bytes_bitlen_route@5 __puya_arc4_router___verify_uint64_bitlen_route@6 __puya_arc4_router___verify_bsqrt_route@7 __puya_arc4_router___verify_btoi_route@8 __puya_arc4_router___verify_bzero_route@9 __puya_arc4_router___verify_concat_route@10 __puya_arc4_router___verify_divmodw_route@11 __puya_arc4_router___verify_divw_route@12 __puya_arc4_router___verify_err_route@13 __puya_arc4_router___verify_exp_route@14 __puya_arc4_router___verify_expw_route@15 __puya_arc4_router___verify_extract_route@16 __puya_arc4_router___verify_extract_from_2_route@17 __puya_arc4_router___verify_extract_uint16_route@18 __puya_arc4_router___verify_extract_uint32_route@19 __puya_arc4_router___verify_extract_uint64_route@20 __puya_arc4_router___verify_getbit_bytes_route@21 __puya_arc4_router___verify_getbit_uint64_route@22 __puya_arc4_router___verify_getbyte_route@23 __puya_arc4_router___verify_itob_route@24 __puya_arc4_router___verify_bytes_len_route@25 __puya_arc4_router___verify_mulw_route@26 __puya_arc4_router___verify_replace_route@27 __puya_arc4_router___verify_select_bytes_route@28 __puya_arc4_router___verify_select_uint64_route@29 __puya_arc4_router___verify_setbit_bytes_route@30 __puya_arc4_router___verify_setbit_uint64_route@31 __puya_arc4_router___verify_setbyte_route@32 __puya_arc4_router___verify_shl_route@33 __puya_arc4_router___verify_shr_route@34 __puya_arc4_router___verify_sqrt_route@35 __puya_arc4_router___verify_substring_route@36 intc_1 // 0 retsub @@ -25,9 +25,9 @@ __puya_arc4_router___verify_addw_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -54,9 +54,9 @@ __puya_arc4_router___verify_base64_decode_standard_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -82,9 +82,9 @@ __puya_arc4_router___verify_base64_decode_url_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -110,9 +110,9 @@ __puya_arc4_router___verify_bytes_bitlen_route@5: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -135,9 +135,9 @@ __puya_arc4_router___verify_uint64_bitlen_route@6: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -158,9 +158,9 @@ __puya_arc4_router___verify_bsqrt_route@7: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -186,9 +186,9 @@ __puya_arc4_router___verify_btoi_route@8: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -209,9 +209,9 @@ __puya_arc4_router___verify_bzero_route@9: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -237,9 +237,9 @@ __puya_arc4_router___verify_concat_route@10: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -271,9 +271,9 @@ __puya_arc4_router___verify_divmodw_route@11: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -314,9 +314,9 @@ __puya_arc4_router___verify_divw_route@12: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -341,9 +341,9 @@ __puya_arc4_router___verify_err_route@13: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub verify_err intc_0 // 1 retsub @@ -353,9 +353,9 @@ __puya_arc4_router___verify_exp_route@14: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -378,9 +378,9 @@ __puya_arc4_router___verify_expw_route@15: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -407,9 +407,9 @@ __puya_arc4_router___verify_extract_route@16: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -435,18 +435,18 @@ __puya_arc4_router___verify_extract_route@16: retsub __puya_arc4_router___verify_extract_from_2_route@17: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:98 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:99 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:98 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:99 // @arc4.abimethod() callsub verify_extract_from_2 dup @@ -463,20 +463,20 @@ __puya_arc4_router___verify_extract_from_2_route@17: retsub __puya_arc4_router___verify_extract_uint16_route@18: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:104 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:105 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:104 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:105 // @arc4.abimethod() callsub verify_extract_uint16 itob @@ -488,20 +488,20 @@ __puya_arc4_router___verify_extract_uint16_route@18: retsub __puya_arc4_router___verify_extract_uint32_route@19: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:110 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:111 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:110 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:111 // @arc4.abimethod() callsub verify_extract_uint32 itob @@ -513,20 +513,20 @@ __puya_arc4_router___verify_extract_uint32_route@19: retsub __puya_arc4_router___verify_extract_uint64_route@20: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:116 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:117 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:116 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:117 // @arc4.abimethod() callsub verify_extract_uint64 itob @@ -538,20 +538,20 @@ __puya_arc4_router___verify_extract_uint64_route@20: retsub __puya_arc4_router___verify_getbit_bytes_route@21: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:122 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:123 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:122 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:123 // @arc4.abimethod() callsub verify_getbit_bytes itob @@ -563,20 +563,20 @@ __puya_arc4_router___verify_getbit_bytes_route@21: retsub __puya_arc4_router___verify_getbit_uint64_route@22: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:128 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:129 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:128 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:129 // @arc4.abimethod() callsub verify_getbit_uint64 itob @@ -588,20 +588,20 @@ __puya_arc4_router___verify_getbit_uint64_route@22: retsub __puya_arc4_router___verify_getbyte_route@23: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:134 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:135 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:134 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:135 // @arc4.abimethod() callsub verify_getbyte itob @@ -613,18 +613,18 @@ __puya_arc4_router___verify_getbyte_route@23: retsub __puya_arc4_router___verify_itob_route@24: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:140 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:141 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:140 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:141 // @arc4.abimethod() callsub verify_itob dup @@ -640,21 +640,46 @@ __puya_arc4_router___verify_itob_route@24: intc_0 // 1 retsub -__puya_arc4_router___verify_mulw_route@25: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:146 +__puya_arc4_router___verify_bytes_len_route@25: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:147 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating + // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 + // export class MiscellaneousOpsContract extends arc4.Contract { + txna ApplicationArgs 1 + extract 2 0 + txna ApplicationArgs 2 + btoi + // tests/artifacts/miscellaneous-ops/contract.algo.ts:147 + // @arc4.abimethod() + callsub verify_bytes_len + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___verify_mulw_route@26: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:154 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:146 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:154 // @arc4.abimethod() callsub verify_mulw swap @@ -669,14 +694,14 @@ __puya_arc4_router___verify_mulw_route@25: intc_0 // 1 retsub -__puya_arc4_router___verify_replace_route@26: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:152 +__puya_arc4_router___verify_replace_route@27: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:160 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -685,7 +710,7 @@ __puya_arc4_router___verify_replace_route@26: btoi txna ApplicationArgs 3 extract 2 0 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:152 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:160 // @arc4.abimethod() callsub verify_replace dup @@ -701,14 +726,14 @@ __puya_arc4_router___verify_replace_route@26: intc_0 // 1 retsub -__puya_arc4_router___verify_select_bytes_route@27: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:158 +__puya_arc4_router___verify_select_bytes_route@28: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:166 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -717,7 +742,7 @@ __puya_arc4_router___verify_select_bytes_route@27: extract 2 0 txna ApplicationArgs 3 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:158 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:166 // @arc4.abimethod() callsub verify_select_bytes dup @@ -733,14 +758,14 @@ __puya_arc4_router___verify_select_bytes_route@27: intc_0 // 1 retsub -__puya_arc4_router___verify_select_uint64_route@28: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:164 +__puya_arc4_router___verify_select_uint64_route@29: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:172 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -749,7 +774,7 @@ __puya_arc4_router___verify_select_uint64_route@28: btoi txna ApplicationArgs 3 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:164 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:172 // @arc4.abimethod() callsub verify_select_uint64 itob @@ -760,14 +785,14 @@ __puya_arc4_router___verify_select_uint64_route@28: intc_0 // 1 retsub -__puya_arc4_router___verify_setbit_bytes_route@29: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:170 +__puya_arc4_router___verify_setbit_bytes_route@30: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:178 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -776,7 +801,7 @@ __puya_arc4_router___verify_setbit_bytes_route@29: btoi txna ApplicationArgs 3 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:170 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:178 // @arc4.abimethod() callsub verify_setbit_bytes dup @@ -792,14 +817,14 @@ __puya_arc4_router___verify_setbit_bytes_route@29: intc_0 // 1 retsub -__puya_arc4_router___verify_setbit_uint64_route@30: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:176 +__puya_arc4_router___verify_setbit_uint64_route@31: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:184 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -808,7 +833,7 @@ __puya_arc4_router___verify_setbit_uint64_route@30: btoi txna ApplicationArgs 3 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:176 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:184 // @arc4.abimethod() callsub verify_setbit_uint64 itob @@ -819,14 +844,14 @@ __puya_arc4_router___verify_setbit_uint64_route@30: intc_0 // 1 retsub -__puya_arc4_router___verify_setbyte_route@31: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:182 +__puya_arc4_router___verify_setbyte_route@32: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:190 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -835,7 +860,7 @@ __puya_arc4_router___verify_setbyte_route@31: btoi txna ApplicationArgs 3 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:182 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:190 // @arc4.abimethod() callsub verify_setbyte dup @@ -851,21 +876,21 @@ __puya_arc4_router___verify_setbyte_route@31: intc_0 // 1 retsub -__puya_arc4_router___verify_shl_route@32: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:188 +__puya_arc4_router___verify_shl_route@33: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:196 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:188 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:196 // @arc4.abimethod() callsub verify_shl itob @@ -876,21 +901,21 @@ __puya_arc4_router___verify_shl_route@32: intc_0 // 1 retsub -__puya_arc4_router___verify_shr_route@33: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:194 +__puya_arc4_router___verify_shr_route@34: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:202 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:194 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:202 // @arc4.abimethod() callsub verify_shr itob @@ -901,19 +926,19 @@ __puya_arc4_router___verify_shr_route@33: intc_0 // 1 retsub -__puya_arc4_router___verify_sqrt_route@34: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:200 +__puya_arc4_router___verify_sqrt_route@35: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:208 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:200 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:208 // @arc4.abimethod() callsub verify_sqrt itob @@ -924,14 +949,14 @@ __puya_arc4_router___verify_sqrt_route@34: intc_0 // 1 retsub -__puya_arc4_router___verify_substring_route@35: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:206 +__puya_arc4_router___verify_substring_route@36: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:214 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txna ApplicationArgs 1 @@ -940,7 +965,7 @@ __puya_arc4_router___verify_substring_route@35: btoi txna ApplicationArgs 3 btoi - // tests/artifacts/miscellaneous-ops/contract.algo.ts:206 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:214 // @arc4.abimethod() callsub verify_substring dup @@ -956,18 +981,18 @@ __puya_arc4_router___verify_substring_route@35: intc_0 // 1 retsub -__puya_arc4_router___bare_routing@38: +__puya_arc4_router___bare_routing@39: // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { txn OnCompletion - bnz __puya_arc4_router___after_if_else@42 + bnz __puya_arc4_router___after_if_else@43 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub -__puya_arc4_router___after_if_else@42: +__puya_arc4_router___after_if_else@43: // tests/artifacts/miscellaneous-ops/contract.algo.ts:3 // export class MiscellaneousOpsContract extends arc4.Contract { intc_1 // 0 @@ -1227,307 +1252,327 @@ verify_extract: // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_extract_from_2(a: bytes) -> bytes: verify_extract_from_2: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:98-99 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:99-100 // @arc4.abimethod() // public verify_extract_from_2(a: bytes): bytes { proto 1 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:100 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:101 // const result = op.extract(a, 2, 0) frame_dig -1 extract 2 0 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:101 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:102 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_extract_uint16(a: bytes, b: uint64) -> uint64: verify_extract_uint16: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:104-105 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:105-106 // @arc4.abimethod() // public verify_extract_uint16(a: bytes, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:106 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:107 // const result = op.extractUint16(a, b) frame_dig -2 frame_dig -1 extract_uint16 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:107 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:108 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_extract_uint32(a: bytes, b: uint64) -> uint64: verify_extract_uint32: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:110-111 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:111-112 // @arc4.abimethod() // public verify_extract_uint32(a: bytes, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:112 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:113 // const result = op.extractUint32(a, b) frame_dig -2 frame_dig -1 extract_uint32 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:113 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:114 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_extract_uint64(a: bytes, b: uint64) -> uint64: verify_extract_uint64: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:116-117 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:117-118 // @arc4.abimethod() // public verify_extract_uint64(a: bytes, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:118 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:119 // const result = op.extractUint64(a, b) frame_dig -2 frame_dig -1 extract_uint64 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:119 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:120 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_getbit_bytes(a: bytes, b: uint64) -> uint64: verify_getbit_bytes: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:122-123 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:123-124 // @arc4.abimethod() // public verify_getbit_bytes(a: bytes, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:124 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:125 // const result = op.getBit(a, b) frame_dig -2 frame_dig -1 getbit - // tests/artifacts/miscellaneous-ops/contract.algo.ts:125 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:126 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_getbit_uint64(a: uint64, b: uint64) -> uint64: verify_getbit_uint64: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:128-129 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:129-130 // @arc4.abimethod() // public verify_getbit_uint64(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:130 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:131 // const result = op.getBit(a, b) frame_dig -2 frame_dig -1 getbit - // tests/artifacts/miscellaneous-ops/contract.algo.ts:131 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:132 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_getbyte(a: bytes, b: uint64) -> uint64: verify_getbyte: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:134-135 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:135-136 // @arc4.abimethod() // public verify_getbyte(a: bytes, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:136 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:137 // const result = op.getByte(a, b) frame_dig -2 frame_dig -1 getbyte - // tests/artifacts/miscellaneous-ops/contract.algo.ts:137 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:138 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_itob(a: uint64) -> bytes: verify_itob: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:140-141 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:141-142 // @arc4.abimethod() // public verify_itob(a: uint64): bytes { proto 1 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:142 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:143 // const result = op.itob(a) frame_dig -1 itob - // tests/artifacts/miscellaneous-ops/contract.algo.ts:143 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:144 + // return result + retsub + + +// tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_bytes_len(a: bytes, pad_a_size: uint64) -> uint64: +verify_bytes_len: + // tests/artifacts/miscellaneous-ops/contract.algo.ts:147-148 + // @arc4.abimethod() + // public verify_bytes_len(a: bytes, pad_a_size: uint64): uint64 { + proto 2 1 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:149 + // const paddedA = op.bzero(pad_a_size).concat(a) + frame_dig -1 + bzero + frame_dig -2 + concat + // tests/artifacts/miscellaneous-ops/contract.algo.ts:150 + // const result = op.len(paddedA) + len + // tests/artifacts/miscellaneous-ops/contract.algo.ts:151 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_mulw(a: uint64, b: uint64) -> uint64, uint64: verify_mulw: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:146-147 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:154-155 // @arc4.abimethod() // public verify_mulw(a: uint64, b: uint64): readonly [uint64, uint64] { proto 2 2 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:148 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:156 // const result = op.mulw(a, b) frame_dig -2 frame_dig -1 mulw - // tests/artifacts/miscellaneous-ops/contract.algo.ts:149 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:157 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_replace(a: bytes, b: uint64, c: bytes) -> bytes: verify_replace: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:152-153 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:160-161 // @arc4.abimethod() // public verify_replace(a: bytes, b: uint64, c: bytes): bytes { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:154 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:162 // const result = op.replace(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 replace3 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:155 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:163 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_select_bytes(a: bytes, b: bytes, c: uint64) -> bytes: verify_select_bytes: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:158-159 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:166-167 // @arc4.abimethod() // public verify_select_bytes(a: bytes, b: bytes, c: uint64): bytes { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:160 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:168 // const result = op.select(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 select - // tests/artifacts/miscellaneous-ops/contract.algo.ts:161 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:169 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_select_uint64(a: uint64, b: uint64, c: uint64) -> uint64: verify_select_uint64: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:164-165 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:172-173 // @arc4.abimethod() // public verify_select_uint64(a: uint64, b: uint64, c: uint64): uint64 { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:166 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:174 // const result = op.select(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 select - // tests/artifacts/miscellaneous-ops/contract.algo.ts:167 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:175 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_setbit_bytes(a: bytes, b: uint64, c: uint64) -> bytes: verify_setbit_bytes: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:170-171 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:178-179 // @arc4.abimethod() // public verify_setbit_bytes(a: bytes, b: uint64, c: uint64): bytes { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:172 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:180 // const result = op.setBit(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 setbit - // tests/artifacts/miscellaneous-ops/contract.algo.ts:173 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:181 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_setbit_uint64(a: uint64, b: uint64, c: uint64) -> uint64: verify_setbit_uint64: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:176-177 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:184-185 // @arc4.abimethod() // public verify_setbit_uint64(a: uint64, b: uint64, c: uint64): uint64 { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:178 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:186 // const result = op.setBit(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 setbit - // tests/artifacts/miscellaneous-ops/contract.algo.ts:179 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:187 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_setbyte(a: bytes, b: uint64, c: uint64) -> bytes: verify_setbyte: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:182-183 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:190-191 // @arc4.abimethod() // public verify_setbyte(a: bytes, b: uint64, c: uint64): bytes { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:184 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:192 // const result = op.setByte(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 setbyte - // tests/artifacts/miscellaneous-ops/contract.algo.ts:185 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:193 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_shl(a: uint64, b: uint64) -> uint64: verify_shl: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:188-189 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:196-197 // @arc4.abimethod() // public verify_shl(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:190 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:198 // const result = op.shl(a, b) frame_dig -2 frame_dig -1 shl - // tests/artifacts/miscellaneous-ops/contract.algo.ts:191 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:199 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_shr(a: uint64, b: uint64) -> uint64: verify_shr: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:194-195 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:202-203 // @arc4.abimethod() // public verify_shr(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:196 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:204 // const result = op.shr(a, b) frame_dig -2 frame_dig -1 shr - // tests/artifacts/miscellaneous-ops/contract.algo.ts:197 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:205 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_sqrt(a: uint64) -> uint64: verify_sqrt: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:200-201 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:208-209 // @arc4.abimethod() // public verify_sqrt(a: uint64): uint64 { proto 1 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:202 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:210 // const result = op.sqrt(a) frame_dig -1 sqrt - // tests/artifacts/miscellaneous-ops/contract.algo.ts:203 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:211 // return result retsub // tests/artifacts/miscellaneous-ops/contract.algo.ts::MiscellaneousOpsContract.verify_substring(a: bytes, b: uint64, c: uint64) -> bytes: verify_substring: - // tests/artifacts/miscellaneous-ops/contract.algo.ts:206-207 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:214-215 // @arc4.abimethod() // public verify_substring(a: bytes, b: uint64, c: uint64): bytes { proto 3 1 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:208 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:216 // const result = op.substring(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 substring3 - // tests/artifacts/miscellaneous-ops/contract.algo.ts:209 + // tests/artifacts/miscellaneous-ops/contract.algo.ts:217 // return result retsub diff --git a/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc32.json b/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc32.json index 3825523..ad99366 100644 --- a/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc32.json +++ b/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc32.json @@ -115,6 +115,11 @@ "no_op": "CALL" } }, + "verify_bytes_len(byte[],uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, "verify_mulw(uint64,uint64)(uint64,uint64)": { "call_config": { "no_op": "CALL" @@ -172,7 +177,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMzgKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweGM3ZWE4YzJhIDB4MWRjZWE1MGMgMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHg4ZTMwZjRlNyAweDg5ZjgxZDkyIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRieXRlKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfaXRvYih1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfbXVsdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X3JlcGxhY2UoYnl0ZVtdLHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X2J5dGVzKGJ5dGVbXSxieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NlbGVjdF91aW50NjQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2V0Yml0X2J5dGVzKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2V0Ynl0ZShieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zaHIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zcXJ0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zdWJzdHJpbmcoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FkZHdfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybF9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19iaXRsZW5fcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2JpdGxlbl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ic3FydF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9idG9pX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J6ZXJvX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2NvbmNhdF9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZGl2bW9kd19yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZGl2d19yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXJyX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHBfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4cHdfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3Rfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfZnJvbV8yX3JvdXRlQDE3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHRyYWN0X3VpbnQxNl9yb3V0ZUAxOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF91aW50MzJfcm91dGVAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfdWludDY0X3JvdXRlQDIwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRiaXRfYnl0ZXNfcm91dGVAMjEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF91aW50NjRfcm91dGVAMjIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJ5dGVfcm91dGVAMjMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2l0b2Jfcm91dGVAMjQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X211bHdfcm91dGVAMjUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3JlcGxhY2Vfcm91dGVAMjYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF9ieXRlc19yb3V0ZUAyNyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2VsZWN0X3VpbnQ2NF9yb3V0ZUAyOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Yml0X2J5dGVzX3JvdXRlQDI5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZXRiaXRfdWludDY0X3JvdXRlQDMwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZXRieXRlX3JvdXRlQDMxIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaGxfcm91dGVAMzIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3Nocl9yb3V0ZUAzMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc3FydF9yb3V0ZUAzNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc3Vic3RyaW5nX3JvdXRlQDM1CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWRkd19yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hZGR3CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmFzZTY0X2RlY29kZV91cmxfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfYml0bGVuX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX2JpdGxlbgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9iaXRsZW5fcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfYml0bGVuCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnNxcnRfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnNxcnQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnRvaV9yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9idG9pCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnplcm9fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iemVybwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9jb25jYXRfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9jb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZGl2bW9kd19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9kaXZtb2R3CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZ3X3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2RpdncKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9lcnJfcm91dGVAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdmVyaWZ5X2VycgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4cF9yb3V0ZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHB3X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4cHcKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3Rfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9mcm9tXzJfcm91dGVAMTc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3RfZnJvbV8yCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfdWludDE2X3JvdXRlQDE4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3RfdWludDE2CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF91aW50MzJfcm91dGVAMTk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZXh0cmFjdF91aW50MzIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHRyYWN0X3VpbnQ2NF9yb3V0ZUAyMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF9ieXRlc19yb3V0ZUAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRiaXRfYnl0ZXMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRiaXRfdWludDY0X3JvdXRlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJ5dGVfcm91dGVAMjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0Ynl0ZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2l0b2Jfcm91dGVAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9pdG9iCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X211bHdfcm91dGVAMjU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9tdWx3CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yZXBsYWNlX3JvdXRlQDI2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9yZXBsYWNlCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF9ieXRlc19yb3V0ZUAyNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfc2VsZWN0X2J5dGVzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF91aW50NjRfcm91dGVAMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zZWxlY3RfdWludDY0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Yml0X2J5dGVzX3JvdXRlQDI5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NldGJpdF9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZXRiaXRfdWludDY0X3JvdXRlQDMwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfc2V0Yml0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NldGJ5dGVfcm91dGVAMzE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfc2V0Ynl0ZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaGxfcm91dGVAMzI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zaGwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaHJfcm91dGVAMzM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zaHIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zcXJ0X3JvdXRlQDM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfc3FydAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3N1YnN0cmluZ19yb3V0ZUAzNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zdWJzdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMzg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA0MgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9hZGR3KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQsIHVpbnQ2NDoKdmVyaWZ5X2FkZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0LTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FkZHcoYTogdWludDY0LCBiOiB1aW50NjQpOiByZWFkb25seSBbdWludDY0LCB1aW50NjRdIHsKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NgogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYWRkdyhhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGE6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMgogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYmFzZTY0RGVjb2RlKEJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYmFzZTY0X2RlY29kZSBTdGRFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsKGE6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYtMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsKGE6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYmFzZTY0RGVjb2RlKEJhc2U2NC5VUkxFbmNvZGluZywgYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2JpdGxlbihhOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9ieXRlc19iaXRsZW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMi0yMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYml0bGVuKGE6IGJ5dGVzLCBwYWRfYV9zaXplOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyNAogICAgLy8gY29uc3QgcGFkZGVkQSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpLmNvbmNhdChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5iaXRMZW5ndGgocGFkZGVkQSkKICAgIGJpdGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9iaXRsZW4oYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjktMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9iaXRsZW4oYTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJpdExlbmd0aChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ic3FydChhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9ic3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1LTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ic3FydChhOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJzcXJ0KGFfYmlndWludCkKICAgIGZyYW1lX2RpZyAtMQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyByZXR1cm4gQnl0ZXMocmVzdWx0KQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnRvaShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyLTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9idG9pKGE6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJ0b2koYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iemVybzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4LTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iemVybyhhOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjUwCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5iemVybyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBiemVybwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHJldHVybiBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9jb25jYXQoYTogYnl0ZXMsIGI6IGJ5dGVzLCBwYWRfYV9zaXplOiB1aW50NjQsIHBhZF9iX3NpemU6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1NC01NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfY29uY2F0KGE6IGJ5dGVzLCBiOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0LCBwYWRfYl9zaXplOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byA0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwYWRkZWRBID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIGNvbnN0IHBhZGRlZEIgPSBvcC5iemVybyhwYWRfYl9zaXplKS5jb25jYXQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1OAogICAgLy8gY29uc3QgcmVzdWx0ID0gcGFkZGVkQS5jb25jYXQocGFkZGVkQikKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo2MAogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdm1vZHcoYTogdWludDY0LCBiOiB1aW50NjQsIGM6IHVpbnQ2NCwgZDogdWludDY0KSAtPiB1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQ6CnZlcmlmeV9kaXZtb2R3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjMtNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Rpdm1vZHcoYTogdWludDY0LCBiOiB1aW50NjQsIGM6IHVpbnQ2NCwgZDogdWludDY0KTogcmVhZG9ubHkgW3VpbnQ2NCwgdWludDY0LCB1aW50NjQsIHVpbnQ2NF0gewogICAgcHJvdG8gNCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZGl2bW9kdyhhLCBiLCBjLCBkKQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo2NgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZGl2dyhhOiB1aW50NjQsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9kaXZ3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjktNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2RpdncoYTogdWludDY0LCBiOiB1aW50NjQsIGM6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5kaXZ3KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3MgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXJyKCkgLT4gdm9pZDoKdmVyaWZ5X2VycjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9lcnIoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3CiAgICAvLyBlcnIoKQogICAgZXJyCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9leHA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4MC04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXhwKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHcoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NCwgdWludDY0Ogp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2LTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9leHB3KGE6IHVpbnQ2NCwgYjogdWludDY0KTogcmVhZG9ubHkgW3VpbnQ2NCwgdWludDY0XSB7CiAgICBwcm90byAyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHB3KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXhwdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3QoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5Mi05MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXh0cmFjdChhOiBieXRlcywgYjogdWludDY0LCBjOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHRyYWN0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yKGE6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTgtOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4dHJhY3RfZnJvbV8yKGE6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmV4dHJhY3QoYSwgMiwgMCkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50MTYoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZXh0cmFjdF91aW50MTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMDQtMTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9leHRyYWN0X3VpbnQxNihhOiBieXRlcywgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA2CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHRyYWN0VWludDE2KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50MzIoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZXh0cmFjdF91aW50MzI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTAtMTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9leHRyYWN0X3VpbnQzMihhOiBieXRlcywgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHRyYWN0VWludDMyKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTYtMTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9leHRyYWN0X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHRyYWN0VWludDY0KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzKGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMi0xMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2dldGJpdF9ieXRlcyhhOiBieXRlcywgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5nZXRCaXQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0Yml0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyOC0xMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2dldGJpdF91aW50NjQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmdldEJpdChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRieXRlKGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMzQtMTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9nZXRieXRlKGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMzYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmdldEJ5dGUoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBnZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2IoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2l0b2I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDAtMTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9pdG9iKGE6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5pdG9iKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ2LTE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfbXVsdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NF0gewogICAgcHJvdG8gMiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLm11bHcoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2UoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3JlcGxhY2UoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AucmVwbGFjZShhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmVwbGFjZTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2VsZWN0X2J5dGVzKGE6IGJ5dGVzLCBiOiBieXRlcywgYzogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X3NlbGVjdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1OC0xNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3NlbGVjdF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZWxlY3QoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjQtMTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZWxlY3RfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnNlbGVjdChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc2VsZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJpdF9ieXRlcyhhOiBieXRlcywgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfc2V0Yml0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcwLTE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2V0Yml0X2J5dGVzKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZXRCaXQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTczCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRiaXRfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3NldGJpdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNzYtMTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZXRiaXRfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNzgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnNldEJpdChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGUoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X3NldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODItMTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZXRieXRlKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZXRCeXRlKGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NobChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg4LTE4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2hsKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzaGwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9zaHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTQtMTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zaHIoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnNocihhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zcXJ0KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMC0yMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3NxcnQoYTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zcXJ0KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIHNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9zdWJzdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDYtMjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zdWJzdHJpbmcoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIK=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0-IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMzkKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweGM3ZWE4YzJhIDB4MWRjZWE1MGMgMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4YzU4ZDMwZTAgMHhkNWE3MzljMyAweDYxZjNiM2UxIDB4NTZjZjM2OGIgMHg5MTlmZmJkMiAweDhlMzBmNGU3IDB4ODlmODFkOTIgMHhkNTI2MDMyNyAweDExNGM4YzZkIDB4MzllOWU2MmEgMHhkNmE0YzA1ZSAweDFlZjgxNTFhIC8vIG1ldGhvZCAidmVyaWZ5X2FkZHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYml0bGVuKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2JpdGxlbih1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYnNxcnQoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J0b2koYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2J6ZXJvKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9jb25jYXQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Rpdm1vZHcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZGl2dyh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9lcnIoKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leHAodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHB3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdChieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X2Zyb21fMihieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MTYoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQzMihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDY0KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X2J5dGVzKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19sZW4oYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRieXRlKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NobCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3Nocih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NxcnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3N1YnN0cmluZyhieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWRkd19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2JpdGxlbl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYml0bGVuX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JzcXJ0X3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J0b2lfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnplcm9fcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfY29uY2F0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZtb2R3X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZ3X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9lcnJfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4cF9yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXhwd19yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9yb3V0ZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9mcm9tXzJfcm91dGVAMTcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfdWludDE2X3JvdXRlQDE4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHRyYWN0X3VpbnQzMl9yb3V0ZUAxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF91aW50NjRfcm91dGVAMjAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF9ieXRlc19yb3V0ZUAyMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0Yml0X3VpbnQ2NF9yb3V0ZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0Ynl0ZV9yb3V0ZUAyMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfaXRvYl9yb3V0ZUAyNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbGVuX3JvdXRlQDI1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9tdWx3X3JvdXRlQDI2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yZXBsYWNlX3JvdXRlQDI3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZWxlY3RfYnl0ZXNfcm91dGVAMjggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF91aW50NjRfcm91dGVAMjkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NldGJpdF9ieXRlc19yb3V0ZUAzMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Yml0X3VpbnQ2NF9yb3V0ZUAzMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Ynl0ZV9yb3V0ZUAzMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2hsX3JvdXRlQDMzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaHJfcm91dGVAMzQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NxcnRfcm91dGVAMzUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3N1YnN0cmluZ19yb3V0ZUAzNgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FkZHdfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hZGR3CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2JpdGxlbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX2JpdGxlbgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9iaXRsZW5fcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9iaXRsZW4KICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ic3FydF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JzcXJ0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J0b2lfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9idG9pCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnplcm9fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J6ZXJvCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2NvbmNhdF9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Rpdm1vZHdfcm91dGVAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9kaXZtb2R3CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZ3X3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZGl2dwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Vycl9yb3V0ZUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHZlcmlmeV9lcnIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHBfcm91dGVAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHB3X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZXhwdwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9yb3V0ZUAxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHRyYWN0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfZnJvbV8yX3JvdXRlQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3RfZnJvbV8yCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfdWludDE2X3JvdXRlQDE4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZXh0cmFjdF91aW50MTYKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHRyYWN0X3VpbnQzMl9yb3V0ZUAxOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3RfdWludDMyCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF91aW50NjRfcm91dGVAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF9ieXRlc19yb3V0ZUAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldGJpdF9ieXRlcwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF91aW50NjRfcm91dGVAMjI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldGJpdF91aW50NjQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRieXRlX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0Ynl0ZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2l0b2Jfcm91dGVAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2l0b2IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbGVuX3JvdXRlQDI1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfbGVuCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfbXVsd19yb3V0ZUAyNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfbXVsdwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcmVwbGFjZV9yb3V0ZUAyNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9yZXBsYWNlCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF9ieXRlc19yb3V0ZUAyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zZWxlY3RfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2VsZWN0X3VpbnQ2NF9yb3V0ZUAyOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfc2VsZWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NldGJpdF9ieXRlc19yb3V0ZUAzMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NldGJpdF9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZXRiaXRfdWludDY0X3JvdXRlQDMxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zZXRiaXRfdWludDY0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Ynl0ZV9yb3V0ZUAzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NldGJ5dGUKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2hsX3JvdXRlQDMzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zaGwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaHJfcm91dGVAMzQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NocgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NxcnRfcm91dGVAMzU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NxcnQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zdWJzdHJpbmdfcm91dGVAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zdWJzdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMzk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA0MwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NC01CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hZGR3KGE6IHVpbnQ2NCwgYjogdWludDY0KTogcmVhZG9ubHkgW3VpbnQ2NCwgdWludDY0XSB7CiAgICBwcm90byAyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhZGR3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGE6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChhOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJhc2U2NERlY29kZShCYXNlNjQuU3RkRW5jb2RpbmcsIGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChhOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJhc2U2NERlY29kZShCYXNlNjQuVVJMRW5jb2RpbmcsIGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJhc2U2NF9kZWNvZGUgVVJMRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19iaXRsZW4oYTogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYnl0ZXNfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2J5dGVzX2JpdGxlbihhOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQKICAgIC8vIGNvbnN0IHBhZGRlZEEgPSBvcC5iemVybyhwYWRfYV9zaXplKS5jb25jYXQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyNQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYml0TGVuZ3RoKHBhZGRlZEEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYml0bGVuKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5LTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfYml0bGVuKGE6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5iaXRMZW5ndGgoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnQoYTogYnl0ZXMpIC0-IGJ5dGVzOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozNS0zNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnNxcnQoYTogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5ic3FydChhX2JpZ3VpbnQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJzcXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozOQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2koYTogYnl0ZXMpIC0-IHVpbnQ2NDoKdmVyaWZ5X2J0b2k6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnRvaShhOiBieXRlcyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9iemVybyhhOiB1aW50NjQpIC0-IGJ5dGVzOgp2ZXJpZnlfYnplcm86CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0OC00OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnplcm8oYTogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfY29uY2F0KGE6IGJ5dGVzLCBiOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0LCBwYWRfYl9zaXplOiB1aW50NjQpIC0-IGJ5dGVzOgp2ZXJpZnlfY29uY2F0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2NvbmNhdChhOiBieXRlcywgYjogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCwgcGFkX2Jfc2l6ZTogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gNCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY29uc3QgcGFkZGVkQSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpLmNvbmNhdChhKQogICAgZnJhbWVfZGlnIC0yCiAgICBiemVybwogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCBwYWRkZWRCID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkuY29uY2F0KGIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IHBhZGRlZEEuY29uY2F0KHBhZGRlZEIpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCByZXN1bHRIYXNoID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIHJldHVybiByZXN1bHRIYXNoCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQsIGQ6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgdWludDY0Ogp2ZXJpZnlfZGl2bW9kdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzLTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9kaXZtb2R3KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQsIGQ6IHVpbnQ2NCk6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjRdIHsKICAgIHByb3RvIDQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmRpdm1vZHcoYSwgYiwgYywgZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2bW9kdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2RpdncoYTogdWludDY0LCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5LTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9kaXZ3KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3MQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZGl2dyhhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2VycigpIC0-IHZvaWQ6CnZlcmlmeV9lcnI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXJyKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gZXJyKCkKICAgIGVycgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZXhwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODAtODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4cChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHAoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHB3KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQsIHVpbnQ2NDoKdmVyaWZ5X2V4cHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4Ni04NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXhwdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NF0gewogICAgcHJvdG8gMiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXhwdyhhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0KGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9leHRyYWN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTItOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4dHJhY3QoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X2Zyb21fMihhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9leHRyYWN0X2Zyb21fMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjk5LTEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYTogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQxNihhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9leHRyYWN0X3VpbnQxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNS0xMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4dHJhY3RfdWludDE2KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMDcKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmV4dHJhY3RVaW50MTYoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMihhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMS0xMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4dHJhY3RfdWludDMyKGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmV4dHJhY3RVaW50MzIoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0X3VpbnQzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9leHRyYWN0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNy0xMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4dHJhY3RfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmV4dHJhY3RVaW50NjQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRiaXRfYnl0ZXMoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0Yml0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTIzLTEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZ2V0Yml0X2J5dGVzKGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmdldEJpdChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRiaXRfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI5LTEzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZ2V0Qml0KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGUoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzNS0xMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2dldGJ5dGUoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZ2V0Qnl0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzOAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfaXRvYihhOiB1aW50NjQpIC0-IGJ5dGVzOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MS0xNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2l0b2IoYTogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLml0b2IoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19sZW4oYTogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYnl0ZXNfbGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ3LTE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfbGVuKGE6IGJ5dGVzLCBwYWRfYV9zaXplOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIGNvbnN0IHBhZGRlZEEgPSBvcC5iemVybyhwYWRfYV9zaXplKS5jb25jYXQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmxlbihwYWRkZWRBKQogICAgbGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X211bHcoYTogdWludDY0LCBiOiB1aW50NjQpIC0-IHVpbnQ2NCwgdWludDY0Ogp2ZXJpZnlfbXVsdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NC0xNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X211bHcoYTogdWludDY0LCBiOiB1aW50NjQpOiByZWFkb25seSBbdWludDY0LCB1aW50NjRdIHsKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9yZXBsYWNlKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X3JlcGxhY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjAtMTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9yZXBsYWNlKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnJlcGxhY2UoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJlcGxhY2UzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMsIGM6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjYtMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZWxlY3RfYnl0ZXMoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3Auc2VsZWN0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2VsZWN0X3VpbnQ2NChhOiB1aW50NjQsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9zZWxlY3RfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcyLTE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2VsZWN0X3VpbnQ2NChhOiB1aW50NjQsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZWxlY3QoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRiaXRfYnl0ZXMoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OC0xNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3NldGJpdF9ieXRlcyhhOiBieXRlcywgYjogdWludDY0LCBjOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3Auc2V0Qml0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NChhOiB1aW50NjQsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg0LTE4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2V0Yml0X3VpbnQ2NChhOiB1aW50NjQsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg2CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZXRCaXQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRieXRlKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9zZXRieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkwLTE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2V0Ynl0ZShhOiBieXRlcywgYjogdWludDY0LCBjOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MgogICAgLy8gY29uc3QgcmVzdWx0ID0gb3Auc2V0Qnl0ZShhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc2V0Ynl0ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGwoYTogdWludDY0LCBiOiB1aW50NjQpIC0-IHVpbnQ2NDoKdmVyaWZ5X3NobDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5Ni0xOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3NobChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5OAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3Auc2hsKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NocihhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfc2hyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAyLTIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2hyKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zaHIoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3FydChhOiB1aW50NjQpIC0-IHVpbnQ2NDoKdmVyaWZ5X3NxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDgtMjA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zcXJ0KGE6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3Auc3FydChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBzcXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3N1YnN0cmluZyhhOiBieXRlcywgYjogdWludDY0LCBjOiB1aW50NjQpIC0-IGJ5dGVzOgp2ZXJpZnlfc3Vic3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjE0LTIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc3Vic3RyaW5nKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zdWJzdHJpbmcoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LmNsZWFyU3RhdGVQcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { @@ -572,6 +577,23 @@ "type": "byte[]" } }, + { + "name": "verify_bytes_len", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "pad_a_size" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, { "name": "verify_mulw", "args": [ diff --git a/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc56.json b/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc56.json new file mode 100644 index 0000000..2c01953 --- /dev/null +++ b/tests/artifacts/miscellaneous-ops/data/MiscellaneousOpsContract.arc56.json @@ -0,0 +1,1024 @@ +{ + "name": "MiscellaneousOpsContract", + "structs": {}, + "methods": [ + { + "name": "verify_addw", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "(uint64,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_base64_decode_standard", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_base64_decode_url", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_bitlen", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "pad_a_size" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_bitlen", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bsqrt", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_btoi", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bzero", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_concat", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "uint64", + "name": "pad_a_size" + }, + { + "type": "uint64", + "name": "pad_b_size" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_divmodw", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + }, + { + "type": "uint64", + "name": "d" + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_divw", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_err", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_exp", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_expw", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "(uint64,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_extract", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_extract_from_2", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_extract_uint16", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_extract_uint32", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_extract_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_getbit_bytes", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_getbit_uint64", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_getbyte", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_itob", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_len", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "pad_a_size" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_mulw", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "(uint64,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_replace", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "byte[]", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_select_bytes", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_select_uint64", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_setbit_bytes", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_setbit_uint64", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_setbyte", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_shl", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_shr", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_sqrt", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_substring", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 281, + 310, + 340, + 370, + 397, + 418, + 448, + 471, + 499, + 543, + 597, + 626, + 638, + 663, + 692, + 730, + 760, + 787, + 814, + 841, + 868, + 893, + 920, + 948, + 975, + 1004, + 1044, + 1084, + 1113, + 1151, + 1180, + 1218, + 1243, + 1268, + 1289 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 1332 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 284, + 313, + 343, + 373, + 400, + 421, + 451, + 474, + 502, + 546, + 600, + 629, + 641, + 666, + 695, + 733, + 763, + 790, + 817, + 844, + 871, + 896, + 923, + 951, + 978, + 1007, + 1047, + 1087, + 1116, + 1154, + 1183, + 1221, + 1246, + 1271, + 1292 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMzkKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweGM3ZWE4YzJhIDB4MWRjZWE1MGMgMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4YzU4ZDMwZTAgMHhkNWE3MzljMyAweDYxZjNiM2UxIDB4NTZjZjM2OGIgMHg5MTlmZmJkMiAweDhlMzBmNGU3IDB4ODlmODFkOTIgMHhkNTI2MDMyNyAweDExNGM4YzZkIDB4MzllOWU2MmEgMHhkNmE0YzA1ZSAweDFlZjgxNTFhIC8vIG1ldGhvZCAidmVyaWZ5X2FkZHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYml0bGVuKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2JpdGxlbih1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYnNxcnQoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J0b2koYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2J6ZXJvKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9jb25jYXQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Rpdm1vZHcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZGl2dyh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9lcnIoKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leHAodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHB3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdChieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X2Zyb21fMihieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MTYoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQzMihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDY0KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X2J5dGVzKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19sZW4oYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRieXRlKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NobCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3Nocih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NxcnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3N1YnN0cmluZyhieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWRkd19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2JpdGxlbl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYml0bGVuX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JzcXJ0X3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J0b2lfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnplcm9fcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfY29uY2F0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZtb2R3X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZ3X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9lcnJfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4cF9yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXhwd19yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9yb3V0ZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9mcm9tXzJfcm91dGVAMTcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfdWludDE2X3JvdXRlQDE4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHRyYWN0X3VpbnQzMl9yb3V0ZUAxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF91aW50NjRfcm91dGVAMjAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF9ieXRlc19yb3V0ZUAyMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0Yml0X3VpbnQ2NF9yb3V0ZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0Ynl0ZV9yb3V0ZUAyMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfaXRvYl9yb3V0ZUAyNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbGVuX3JvdXRlQDI1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9tdWx3X3JvdXRlQDI2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yZXBsYWNlX3JvdXRlQDI3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZWxlY3RfYnl0ZXNfcm91dGVAMjggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF91aW50NjRfcm91dGVAMjkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NldGJpdF9ieXRlc19yb3V0ZUAzMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Yml0X3VpbnQ2NF9yb3V0ZUAzMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Ynl0ZV9yb3V0ZUAzMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2hsX3JvdXRlQDMzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaHJfcm91dGVAMzQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NxcnRfcm91dGVAMzUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3N1YnN0cmluZ19yb3V0ZUAzNgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FkZHdfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hZGR3CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2JpdGxlbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX2JpdGxlbgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9iaXRsZW5fcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9iaXRsZW4KICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ic3FydF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JzcXJ0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J0b2lfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9idG9pCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnplcm9fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J6ZXJvCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2NvbmNhdF9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Rpdm1vZHdfcm91dGVAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9kaXZtb2R3CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9kaXZ3X3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZGl2dwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Vycl9yb3V0ZUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHZlcmlmeV9lcnIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHBfcm91dGVAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHB3X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZXhwdwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF9yb3V0ZUAxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHRyYWN0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfZnJvbV8yX3JvdXRlQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3RfZnJvbV8yCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2V4dHJhY3RfdWludDE2X3JvdXRlQDE4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZXh0cmFjdF91aW50MTYKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leHRyYWN0X3VpbnQzMl9yb3V0ZUAxOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4dHJhY3RfdWludDMyCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZXh0cmFjdF91aW50NjRfcm91dGVAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9leHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF9ieXRlc19yb3V0ZUAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldGJpdF9ieXRlcwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldGJpdF91aW50NjRfcm91dGVAMjI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldGJpdF91aW50NjQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRieXRlX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0Ynl0ZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2l0b2Jfcm91dGVAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2l0b2IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbGVuX3JvdXRlQDI1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfbGVuCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfbXVsd19yb3V0ZUAyNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfbXVsdwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcmVwbGFjZV9yb3V0ZUAyNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9yZXBsYWNlCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NlbGVjdF9ieXRlc19yb3V0ZUAyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zZWxlY3RfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2VsZWN0X3VpbnQ2NF9yb3V0ZUAyOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfc2VsZWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NldGJpdF9ieXRlc19yb3V0ZUAzMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NldGJpdF9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zZXRiaXRfdWludDY0X3JvdXRlQDMxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zZXRiaXRfdWludDY0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2V0Ynl0ZV9yb3V0ZUAzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIE1pc2NlbGxhbmVvdXNPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NldGJ5dGUKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfc2hsX3JvdXRlQDMzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zaGwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zaHJfcm91dGVAMzQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NocgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3NxcnRfcm91dGVAMzU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3NxcnQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9zdWJzdHJpbmdfcm91dGVAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9zdWJzdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMzk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA0MwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NC01CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hZGR3KGE6IHVpbnQ2NCwgYjogdWludDY0KTogcmVhZG9ubHkgW3VpbnQ2NCwgdWludDY0XSB7CiAgICBwcm90byAyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhZGR3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGE6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChhOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJhc2U2NERlY29kZShCYXNlNjQuU3RkRW5jb2RpbmcsIGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChhOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmJhc2U2NERlY29kZShCYXNlNjQuVVJMRW5jb2RpbmcsIGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJhc2U2NF9kZWNvZGUgVVJMRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19iaXRsZW4oYTogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYnl0ZXNfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2J5dGVzX2JpdGxlbihhOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQKICAgIC8vIGNvbnN0IHBhZGRlZEEgPSBvcC5iemVybyhwYWRfYV9zaXplKS5jb25jYXQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyNQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYml0TGVuZ3RoKHBhZGRlZEEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYml0bGVuKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5LTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfYml0bGVuKGE6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5iaXRMZW5ndGgoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnQoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozNS0zNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnNxcnQoYTogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5ic3FydChhX2JpZ3VpbnQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJzcXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czozOQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2koYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J0b2k6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnRvaShhOiBieXRlcyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9iemVybyhhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYnplcm86CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo0OC00OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnplcm8oYTogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfY29uY2F0KGE6IGJ5dGVzLCBiOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0LCBwYWRfYl9zaXplOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfY29uY2F0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2NvbmNhdChhOiBieXRlcywgYjogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCwgcGFkX2Jfc2l6ZTogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gNCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY29uc3QgcGFkZGVkQSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpLmNvbmNhdChhKQogICAgZnJhbWVfZGlnIC0yCiAgICBiemVybwogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBjb25zdCBwYWRkZWRCID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkuY29uY2F0KGIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IHBhZGRlZEEuY29uY2F0KHBhZGRlZEIpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCByZXN1bHRIYXNoID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIHJldHVybiByZXN1bHRIYXNoCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQsIGQ6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgdWludDY0Ogp2ZXJpZnlfZGl2bW9kdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzLTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9kaXZtb2R3KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQsIGQ6IHVpbnQ2NCk6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjRdIHsKICAgIHByb3RvIDQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLmRpdm1vZHcoYSwgYiwgYywgZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2bW9kdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2RpdncoYTogdWludDY0LCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5LTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9kaXZ3KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3MQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZGl2dyhhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZGl2dwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2VycigpIC0+IHZvaWQ6CnZlcmlmeV9lcnI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXJyKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gZXJyKCkKICAgIGVycgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfZXhwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODAtODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4cChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5leHAoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHB3KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQsIHVpbnQ2NDoKdmVyaWZ5X2V4cHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4Ni04NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXhwdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NF0gewogICAgcHJvdG8gMiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXhwdyhhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0KGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9leHRyYWN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTItOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2V4dHJhY3QoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X2Zyb21fMihhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9leHRyYWN0X2Zyb21fMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjk5LTEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYTogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIgLy8gMgogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2KGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1LTEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXh0cmFjdF91aW50MTYoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdFVpbnQxNihhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDMyKGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2V4dHJhY3RfdWludDMyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTExLTExMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXh0cmFjdF91aW50MzIoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdFVpbnQzMihhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3RfdWludDMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2V4dHJhY3RfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZXh0cmFjdF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZXh0cmFjdFVpbnQ2NChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjAKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJpdF9ieXRlcyhhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9nZXRiaXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjMtMTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9nZXRiaXRfYnl0ZXMoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyNQogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuZ2V0Qml0KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJpdF91aW50NjQoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldGJpdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxMjktMTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9nZXRiaXRfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5nZXRCaXQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Ynl0ZShhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9nZXRieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM1LTEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfZ2V0Ynl0ZShhOiBieXRlcywgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5nZXRCeXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZ2V0Ynl0ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9pdG9iKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9pdG9iOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQxLTE0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfaXRvYihhOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AuaXRvYihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2xlbihhOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9ieXRlc19sZW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNDctMTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19sZW4oYTogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gY29uc3QgcGFkZGVkQSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpLmNvbmNhdChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AubGVuKHBhZGRlZEEpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU0LTE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfbXVsdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NF0gewogICAgcHJvdG8gMiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLm11bHcoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2UoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MC0xNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3JlcGxhY2UoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gY29uc3QgcmVzdWx0ID0gb3AucmVwbGFjZShhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmVwbGFjZTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2VsZWN0X2J5dGVzKGE6IGJ5dGVzLCBiOiBieXRlcywgYzogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X3NlbGVjdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3NlbGVjdF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZWxlY3QoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNzItMTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZWxlY3RfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnNlbGVjdChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc2VsZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJpdF9ieXRlcyhhOiBieXRlcywgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfc2V0Yml0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2V0Yml0X2J5dGVzKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgwCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZXRCaXQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRiaXRfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3NldGJpdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODQtMTg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZXRiaXRfdWludDY0KGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnNldEJpdChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGUoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X3NldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTAtMTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zZXRieXRlKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkyCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zZXRCeXRlKGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjpNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NobChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2LTE5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfc2hsKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzaGwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9zaHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDItMjAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zaHIoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnNocihhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zcXJ0KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwOC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3NxcnQoYTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5zcXJ0KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIHNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9taXNjZWxsYW5lb3VzLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6Ok1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nKGE6IGJ5dGVzLCBiOiB1aW50NjQsIGM6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9zdWJzdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTQtMjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9zdWJzdHJpbmcoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czoyMTYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL21pc2NlbGxhbmVvdXMtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvbWlzY2VsbGFuZW91cy1vcHMvY29udHJhY3QuYWxnby50czo6TWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LmNsZWFyU3RhdGVQcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/pure-op-codes.spec.ts b/tests/pure-op-codes.spec.ts index 9f795c4..7ab8575 100644 --- a/tests/pure-op-codes.spec.ts +++ b/tests/pure-op-codes.spec.ts @@ -672,6 +672,24 @@ describe('Pure op codes', async () => { }) }) + describe('len', async () => { + test.each([ + [Bytes(internal.encodingUtil.bigIntToUint8Array(0n)), 0], + [Bytes(internal.encodingUtil.bigIntToUint8Array(1n)), 0], + [Bytes(internal.encodingUtil.bigIntToUint8Array(MAX_UINT64)), 0], + [Bytes(internal.encodingUtil.bigIntToUint8Array(MAX_UINT512)), 0], + [Bytes(internal.encodingUtil.bigIntToUint8Array(MAX_UINT512 * MAX_UINT512)), 0], + [Bytes(Array(8).fill(0x00).concat(Array(4).fill(0x0f))), 0], + [Bytes([0x0f]), MAX_BYTES_SIZE - 1], + [Bytes(), 0], + ])('should return the length of the bytes input', async (a, padSize) => { + const avmResult = await getAvmResult({ appClient }, 'verify_bytes_len', asUint8Array(a), padSize) + const paddedA = getPaddedBytes(padSize, a) + const result = op.len(paddedA) + expect(result).toEqual(avmResult) + }) + }) + describe('mulw', async () => { test.each([ [0, 0],