aws-cdk-neuronx-patterns
Version:
> [!WARNING] > This library is experimental module.
287 lines • 36.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const aws_cdk_lib_1 = require("aws-cdk-lib");
const batch = require("aws-cdk-lib/aws-batch");
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
const vllm_engine_argments_1 = require("./vllm-engine-argments");
describe("VllmEngineArgumentsToConfig", () => {
const app = new aws_cdk_lib_1.App();
const stack = new aws_cdk_lib_1.Stack(app);
const secret = aws_secretsmanager_1.Secret.fromSecretNameV2(stack, "DummySecret", "huggingface-token");
it("should convert all camelCase properties to kebab-case", () => {
const testObj = {
host: "localhost",
port: 8080,
uvicornLogLevel: vllm_engine_argments_1.UvicornLogLevel.INFO,
disableUvicornAccessLog: true,
allowCredentials: true,
allowedOrigins: ["*"],
allowedMethods: ["GET"],
allowedHeaders: ["Authorization"],
apiKey: "secret",
loraModules: { name: "name", path: "lora_path", base_model_name: "id" },
promptAdapters: ["adapter=path"],
chatTemplate: "template.json",
chatTemplateContentFormat: vllm_engine_argments_1.ChatTemplateContentFormat.AUTO,
responseRole: "assistant",
sslKeyfile: "key.pem",
sslCertfile: "cert.pem",
sslCaCerts: "ca.pem",
enableSslRefresh: true,
sslCertReqs: 1,
rootPath: "/api",
middleware: ["middleware1"],
returnTokensAsTokenIds: true,
disableFrontendMultiprocessing: true,
enableRequestIdHeaders: true,
enableAutoToolChoice: true,
toolCallParser: vllm_engine_argments_1.ToolCallParser.GRANITE,
toolParserPlugin: "plugin",
model: "model-name",
task: vllm_engine_argments_1.VllmTask.GENERATE,
tokenizer: "tokenizer-name",
hfConfigPath: "config.json",
skipTokenizerInit: true,
revision: "v1.0",
codeRevision: "v2.0",
tokenizerRevision: "v1.5",
tokenizerMode: vllm_engine_argments_1.TokenizerMode.AUTO,
trustRemoteCode: true,
allowedLocalMediaPath: "/media",
configFormat: vllm_engine_argments_1.ConfigFormat.HF,
dtype: vllm_engine_argments_1.DataType.FLOAT16,
maxModelLen: 2048,
logitsProcessorPattern: "pattern",
modelImpl: vllm_engine_argments_1.ModelImpl.VLLM,
disableSlidingWindow: true,
useV2BlockManager: true,
seed: 42,
maxLogprobs: 10,
disableLogStats: true,
quantization: vllm_engine_argments_1.Quantization.AWQ,
ropeScaling: {},
ropeTheta: 1.0,
hfToken: batch.Secret.fromSecretsManager(secret),
hfOverrides: {},
enforceEager: true,
maxSeqLenToCapture: 4096,
mmProcessorKwargs: {},
disableMmPreprocessorCache: true,
enableLora: true,
enableLoraBias: true,
maxLoras: 2,
maxLoraRank: 32,
loraExtraVocabSize: 512,
loraDtype: vllm_engine_argments_1.LoraDtype.FLOAT16,
longLoraScalingFactors: 1,
maxCpuLoras: 4,
fullyShardedLoras: true,
enablePromptAdapter: true,
maxPromptAdapters: 2,
maxPromptAdapterToken: 256,
numSchedulerSteps: 2,
speculativeConfig: {},
ignorePatterns: ["pattern"],
preemptionMode: vllm_engine_argments_1.PreemptionMode.SWAP,
servedModelName: ["model1"],
qloraAdapterNameOrPath: "qlora",
showHiddenMetricsForVersion: "0.5",
otlpTracesEndpoint: "http://localhost",
collectDetailedTraces: "modules",
disableAsyncOutputProc: true,
maxNumBatchedTokens: 512,
maxNumSeqs: 16,
maxNumPartialPrefills: 4,
maxLongPartialPrefills: 2,
longPrefillTokenThreshold: 256,
numLookaheadSlots: 4,
schedulerDelayFactor: 0.5,
enableChunkedPrefill: true,
multiStepStreamOutputs: false,
schedulingPolicy: vllm_engine_argments_1.SchedulingPolicy.PRIORITY,
disableChunkedMmInput: true,
schedulerCls: "custom.Scheduler",
overrideNeuronConfig: {},
overridePoolerConfig: {},
compilationConfig: {},
kvTransferConfig: {},
workerCls: "CustomWorker",
workerExtensionCls: "Extension",
generationConfig: "config",
overrideGenerationConfig: {},
enableSleepMode: true,
additionalConfig: {},
enableReasoning: true,
disableCascadeAttn: true,
disableLogRequests: true,
maxLogLen: 100,
disableFastApiDocs: true,
enablePromptTokensDetails: true,
enableServerLoadTracking: true,
loadFormat: vllm_engine_argments_1.LoadFormat.SAFETENSORS,
downloadDir: "/downloads",
modelLoaderExtraConfig: {},
useTqdmOnLoad: false,
guidedDecodingBackend: vllm_engine_argments_1.GuidedDecodingBackend.OUTLINES,
reasoningParser: vllm_engine_argments_1.ReasoningParser.DEEPSEEK_R1,
distributedExecutorBackend: vllm_engine_argments_1.DistributedExecutorBackend.RAY,
pipelineParallelSize: 2,
tensorParallelSize: 2,
dataParallelSize: 2,
enableExpertParallel: true,
maxParallelLoadingWorkers: 4,
rayWorkersUseNsight: true,
disableCustomAllReduce: true,
blockSize: 16,
gpuMemoryUtilization: 0.8,
swapSpace: 8,
kvCacheDtype: vllm_engine_argments_1.KvCacheDtype.FP8,
numGpuBlocksOverride: 16,
enablePrefixCaching: true,
prefixCachingHashAlgo: vllm_engine_argments_1.PrefixCachingHashAlgo.SHA256,
cpuOffloadGb: 2,
calculateKvScales: true,
limitMmPerPrompt: {},
device: vllm_engine_argments_1.Device.NEURON,
};
const result = vllm_engine_argments_1.VllmEngineArgumentsParser.config(testObj);
expect(result).toMatchObject({
host: "localhost",
port: 8080,
"uvicorn-log-level": "info",
"disable-uvicorn-access-log": true,
"allow-credentials": true,
"allowed-origins": '["*"]',
"allowed-methods": '["GET"]',
"allowed-headers": '["Authorization"]',
"api-key": "secret",
"lora-modules": '{"name":"name","path":"lora_path","base_model_name":"id"}',
"prompt-adapters": ["adapter=path"],
"chat-template": "template.json",
"chat-template-content-format": "auto",
"response-role": "assistant",
"ssl-keyfile": "key.pem",
"ssl-certfile": "cert.pem",
"ssl-ca-certs": "ca.pem",
"enable-ssl-refresh": true,
"ssl-cert-reqs": 1,
"root-path": "/api",
middleware: ["middleware1"],
"return-tokens-as-token-ids": true,
"disable-frontend-multiprocessing": true,
"enable-request-id-headers": true,
"enable-auto-tool-choice": true,
"tool-call-parser": "granite",
"tool-parser-plugin": "plugin",
// should ignore the model property
// model: "model-name",
task: "generate",
tokenizer: "tokenizer-name",
// should ignore the hf-token property
// "hf-token": "dummy",
"hf-config-path": "config.json",
"skip-tokenizer-init": true,
revision: "v1.0",
"code-revision": "v2.0",
"tokenizer-revision": "v1.5",
"tokenizer-mode": "auto",
"trust-remote-code": true,
"allowed-local-media-path": "/media",
"config-format": "hf",
dtype: "float16",
"max-model-len": 2048,
"logits-processor-pattern": "pattern",
"model-impl": "vllm",
"disable-sliding-window": true,
"use-v2-block-manager": true,
seed: 42,
"max-logprobs": 10,
"disable-log-stats": true,
quantization: "awq",
"rope-scaling": "{}",
"rope-theta": 1.0,
"hf-overrides": "{}",
"enforce-eager": true,
"max-seq-len-to-capture": 4096,
"mm-processor-kwargs": "{}",
"disable-mm-preprocessor-cache": true,
"enable-lora": true,
"enable-lora-bias": true,
"max-loras": 2,
"max-lora-rank": 32,
"lora-extra-vocab-size": 512,
"lora-dtype": "float16",
"long-lora-scaling-factors": 1,
"max-cpu-loras": 4,
"fully-sharded-loras": true,
"enable-prompt-adapter": true,
"max-prompt-adapters": 2,
"max-prompt-adapter-token": 256,
"num-scheduler-steps": 2,
"speculative-config": "{}",
"ignore-patterns": ["pattern"],
"preemption-mode": "swap",
"served-model-name": ["model1"],
"qlora-adapter-name-or-path": "qlora",
"show-hidden-metrics-for-version": "0.5",
"otlp-traces-endpoint": "http://localhost",
"collect-detailed-traces": "modules",
"disable-async-output-proc": true,
"max-num-batched-tokens": 512,
"max-num-seqs": 16,
"max-num-partial-prefills": 4,
"max-long-partial-prefills": 2,
"long-prefill-token-threshold": 256,
"num-lookahead-slots": 4,
"scheduler-delay-factor": 0.5,
"enable-chunked-prefill": true,
"multi-step-stream-outputs": false,
"scheduling-policy": "priority",
"disable-chunked-mm-input": true,
"scheduler-cls": "custom.Scheduler",
"override-neuron-config": "{}",
"override-pooler-config": "{}",
"compilation-config": "{}",
"kv-transfer-config": "{}",
"worker-cls": "CustomWorker",
"worker-extension-cls": "Extension",
"generation-config": "config",
"override-generation-config": "{}",
"enable-sleep-mode": true,
"additional-config": "{}",
"enable-reasoning": true,
"disable-cascade-attn": true,
"disable-log-requests": true,
"max-log-len": 100,
"disable-fast-api-docs": true,
"enable-prompt-tokens-details": true,
"enable-server-load-tracking": true,
"load-format": "safetensors",
"download-dir": "/downloads",
"model-loader-extra-config": "{}",
"use-tqdm-on-load": false,
"guided-decoding-backend": "outlines",
"reasoning-parser": "deepseek_r1",
"distributed-executor-backend": "ray",
"pipeline-parallel-size": 2,
"tensor-parallel-size": 2,
"data-parallel-size": 2,
"enable-expert-parallel": true,
"max-parallel-loading-workers": 4,
"ray-workers-use-nsight": true,
"disable-custom-all-reduce": true,
"block-size": 16,
"gpu-memory-utilization": 0.8,
"swap-space": 8,
"kv-cache-dtype": "fp8",
"num-gpu-blocks-override": 16,
"enable-prefix-caching": true,
"prefix-caching-hash-algo": "sha256",
"cpu-offload-gb": 2,
"calculate-kv-scales": true,
"limit-mm-per-prompt": "{}",
device: "neuron",
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmxsbS1lbmdpbmUtYXJnbWVudHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iYXNlL3NlcnZlci1lbmdpbmUvdmxsbS1lbmdpbmUvdmxsbS1lbmdpbmUtYXJnbWVudHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF5QztBQUN6QywrQ0FBK0M7QUFDL0MsdUVBQXdEO0FBQ3hELGlFQXNCZ0M7QUFFaEMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsMkJBQU0sQ0FBQyxnQkFBZ0IsQ0FDcEMsS0FBSyxFQUNMLGFBQWEsRUFDYixtQkFBbUIsQ0FDcEIsQ0FBQztJQUNGLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7UUFDL0QsTUFBTSxPQUFPLEdBQXdCO1lBQ25DLElBQUksRUFBRSxXQUFXO1lBQ2pCLElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLHNDQUFlLENBQUMsSUFBSTtZQUNyQyx1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ3JCLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN2QixjQUFjLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDakMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUU7WUFDdkUsY0FBYyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxlQUFlO1lBQzdCLHlCQUF5QixFQUFFLGdEQUF5QixD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NUIsYUFBYSxFQUFFLEdBQUc7WUFDbEIsdUJBQXVCLEVBQUUsSUFBSTtZQUM3Qiw4QkFBOEIsRUFBRSxJQUFJO1lBQ3BDLDZCQUE2QixFQUFFLElBQUk7WUFDbkMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsY0FBYyxFQUFFLFlBQVk7WUFDNUIsMkJBQTJCLEVBQUUsSUFBSTtZQUNqQyxrQkFBa0IsRUFBRSxLQUFLO1lBQ3pCLHlCQUF5QixFQUFFLFVBQVU7WUFDckMsa0JBQWtCLEVBQUUsYUFBYTtZQUNqQyw4QkFBOEIsRUFBRSxLQUFLO1lBQ3JDLHdCQUF3QixFQUFFLENBQUM7WUFDM0Isc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLHdCQUF3QixFQUFFLElBQUk7WUFDOUIsOEJBQThCLEVBQUUsQ0FBQztZQUNqQyx3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLDJCQUEyQixFQUFFLElBQUk7WUFDakMsWUFBWSxFQUFFLEVBQUU7WUFDaEIsd0JBQXdCLEVBQUUsR0FBRztZQUM3QixZQUFZLEVBQUUsQ0FBQztZQUNmLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIseUJBQXlCLEVBQUUsRUFBRTtZQUM3Qix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLDBCQUEwQixFQUFFLFFBQVE7WUFDcEMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixxQkFBcUIsRUFBRSxJQUFJO1lBQzNCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsTUFBTSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGJhdGNoIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYmF0Y2hcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQsXG4gIENvbmZpZ0Zvcm1hdCxcbiAgRGF0YVR5cGUsXG4gIERldmljZSxcbiAgRGlzdHJpYnV0ZWRFeGVjdXRvckJhY2tlbmQsXG4gIEd1aWRlZERlY29kaW5nQmFja2VuZCxcbiAgS3ZDYWNoZUR0eXBlLFxuICBMb2FkRm9ybWF0LFxuICBMb3JhRHR5cGUsXG4gIE1vZGVsSW1wbCxcbiAgUHJlZW1wdGlvbk1vZGUsXG4gIFByZWZpeENhY2hpbmdIYXNoQWxnbyxcbiAgUXVhbnRpemF0aW9uLFxuICBSZWFzb25pbmdQYXJzZXIsXG4gIFNjaGVkdWxpbmdQb2xpY3ksXG4gIFRva2VuaXplck1vZGUsXG4gIFRvb2xDYWxsUGFyc2VyLFxuICBVdmljb3JuTG9nTGV2ZWwsXG4gIFZsbG1FbmdpbmVBcmd1bWVudHMsXG4gIFZsbG1FbmdpbmVBcmd1bWVudHNQYXJzZXIsXG4gIFZsbG1UYXNrLFxufSBmcm9tIFwiLi92bGxtLWVuZ2luZS1hcmdtZW50c1wiO1xuXG5kZXNjcmliZShcIlZsbG1FbmdpbmVBcmd1bWVudHNUb0NvbmZpZ1wiLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwKTtcbiAgY29uc3Qgc2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgc3RhY2ssXG4gICAgXCJEdW1teVNlY3JldFwiLFxuICAgIFwiaHVnZ2luZ2ZhY2UtdG9rZW5cIixcbiAgKTtcbiAgaXQoXCJzaG91bGQgY29udmVydCBhbGwgY2FtZWxDYXNlIHByb3BlcnRpZXMgdG8ga2ViYWItY2FzZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdE9iajogVmxsbUVuZ2luZUFyZ3VtZW50cyA9IHtcbiAgICAgIGhvc3Q6IFwibG9jYWxob3N0XCIsXG4gICAgICBwb3J0OiA4MDgwLFxuICAgICAgdXZpY29ybkxvZ0xldmVsOiBVdmljb3JuTG9nTGV2ZWwuSU5GTyxcbiAgICAgIGRpc2FibGVVdmljb3JuQWNjZXNzTG9nOiB0cnVlLFxuICAgICAgYWxsb3dDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGFsbG93ZWRPcmlnaW5zOiBbXCIqXCJdLFxuICAgICAgYWxsb3dlZE1ldGhvZHM6IFtcIkdFVFwiXSxcbiAgICAgIGFsbG93ZWRIZWFkZXJzOiBbXCJBdXRob3JpemF0aW9uXCJdLFxuICAgICAgYXBpS2V5OiBcInNlY3JldFwiLFxuICAgICAgbG9yYU1vZHVsZXM6IHsgbmFtZTogXCJuYW1lXCIsIHBhdGg6IFwibG9yYV9wYXRoXCIsIGJhc2VfbW9kZWxfbmFtZTogXCJpZFwiIH0sXG4gICAgICBwcm9tcHRBZGFwdGVyczogW1wiYWRhcHRlcj1wYXRoXCJdLFxuICAgICAgY2hhdFRlbXBsYXRlOiBcInRlbXBsYXRlLmpzb25cIixcbiAgICAgIGNoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQ6IENoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQuQVVUTyxcbiAgICAgIHJlc3BvbnNlUm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIHNzbEtleWZpbGU6IFwia2V5LnBlbVwiLFxuICAgICAgc3NsQ2VydGZpbGU6IFwiY2VydC5wZW1cIixcbiAgICAgIHNzbENhQ2VydHM6IFwiY2EucGVtXCIsXG4gICAgICBlbmFibGVTc2xSZWZyZXNoOiB0cnVlLFxuICAgICAgc3NsQ2VydFJlcXM6IDEsXG4gICAgICByb290UGF0aDogXCIvYXBpXCIsXG4gICAgICBtaWRkbGV3YXJlOiBbXCJtaWRkbGV3YXJlMVwiXSxcbiAgICAgIHJldHVyblRva2Vuc0FzVG9rZW5JZHM6IHRydWUsXG4gICAgICBkaXNhYmxlRnJvbnRlbmRNdWx0aXByb2Nlc3Npbmc6IHRydWUsXG4gICAgICBlbmFibGVSZXF1ZXN0SWRIZWFkZXJzOiB0cnVlLFxuICAgICAgZW5hYmxlQXV0b1Rvb2xDaG9pY2U6IHRydWUsXG4gICAgICB0b29sQ2FsbFBhcnNlcjogVG9vbENhbGxQYXJzZXIuR1JBTklURSxcbiAgICAgIHRvb2xQYXJzZXJQbHVnaW46IFwicGx1Z2luXCIsXG4gICAgICBtb2RlbDogXCJtb2RlbC1uYW1lXCIsXG4gICAgICB0YXNrOiBWbGxtVGFzay5HRU5FUkFURSxcbiAgICAgIHRva2VuaXplcjogXCJ0b2tlbml6ZXItbmFtZVwiLFxuICAgICAgaGZDb25maWdQYXRoOiBcImNvbmZpZy5qc29uXCIsXG4gICAgICBza2lwVG9rZW5pemVySW5pdDogdHJ1ZSxcbiAgICAgIHJldmlzaW9uOiBcInYxLjBcIixcbiAgICAgIGNvZGVSZXZpc2lvbjogXCJ2Mi4wXCIsXG4gICAgICB0b2tlbml6ZXJSZXZpc2lvbjogXCJ2MS41XCIsXG4gICAgICB0b2tlbml6ZXJNb2RlOiBUb2tlbml6ZXJNb2RlLkFVVE8sXG4gICAgICB0cnVzdFJlbW90ZUNvZGU6IHRydWUsXG4gICAgICBhbGxvd2VkTG9jYWxNZWRpYVBhdGg6IFwiL21lZGlhXCIsXG4gICAgICBjb25maWdGb3JtYXQ6IENvbmZpZ0Zvcm1hdC5IRixcbiAgICAgIGR0eXBlOiBEYXRhVHlwZS5GTE9BVDE2LFxuICAgICAgbWF4TW9kZWxMZW46IDIwNDgsXG4gICAgICBsb2dpdHNQcm9jZXNzb3JQYXR0ZXJuOiBcInBhdHRlcm5cIixcbiAgICAgIG1vZGVsSW1wbDogTW9kZWxJbXBsLlZMTE0sXG4gICAgICBkaXNhYmxlU2xpZGluZ1dpbmRvdzogdHJ1ZSxcbiAgICAgIHVzZVYyQmxvY2tNYW5hZ2VyOiB0cnVlLFxuICAgICAgc2VlZDogNDIsXG4gICAgICBtYXhMb2dwcm9iczogMTAsXG4gICAgICBkaXNhYmxlTG9nU3RhdHM6IHRydWUsXG4gICAgICBxdWFudGl6YXRpb246IFF1YW50aXphdGlvbi5BV1EsXG4gICAgICByb3BlU2NhbGluZzoge30sXG4gICAgICByb3BlVGhldGE6IDEuMCxcbiAgICAgIGhmVG9rZW46IGJhdGNoLlNlY3JldC5mcm9tU2VjcmV0c01hbmFnZXIoc2VjcmV0KSxcbiAgICAgIGhmT3ZlcnJpZGVzOiB7fSxcbiAgICAgIGVuZm9yY2VFYWdlcjogdHJ1ZSxcbiAgICAgIG1heFNlcUxlblRvQ2FwdHVyZTogNDA5NixcbiAgICAgIG1tUHJvY2Vzc29yS3dhcmdzOiB7fSxcbiAgICAgIGRpc2FibGVNbVByZXByb2Nlc3NvckNhY2hlOiB0cnVlLFxuICAgICAgZW5hYmxlTG9yYTogdHJ1ZSxcbiAgICAgIGVuYWJsZUxvcmFCaWFzOiB0cnVlLFxuICAgICAgbWF4TG9yYXM6IDIsXG4gICAgICBtYXhMb3JhUmFuazogMzIsXG4gICAgICBsb3JhRXh0cmFWb2NhYlNpemU6IDUxMixcbiAgICAgIGxvcmFEdHlwZTogTG9yYUR0eXBlLkZMT0FUMTYsXG4gICAgICBsb25nTG9yYVNjYWxpbmdGYWN0b3JzOiAxLFxuICAgICAgbWF4Q3B1TG9yYXM6IDQsXG4gICAgICBmdWxseVNoYXJkZWRMb3JhczogdHJ1ZSxcbiAgICAgIGVuYWJsZVByb21wdEFkYXB0ZXI6IHRydWUsXG4gICAgICBtYXhQcm9tcHRBZGFwdGVyczogMixcbiAgICAgIG1heFByb21wdEFkYXB0ZXJUb2tlbjogMjU2LFxuICAgICAgbnVtU2NoZWR1bGVyU3RlcHM6IDIsXG4gICAgICBzcGVjdWxhdGl2ZUNvbmZpZzoge30sXG4gICAgICBpZ25vcmVQYXR0ZXJuczogW1wicGF0dGVyblwiXSxcbiAgICAgIHByZWVtcHRpb25Nb2RlOiBQcmVlbXB0aW9uTW9kZS5TV0FQLFxuICAgICAgc2VydmVkTW9kZWxOYW1lOiBbXCJtb2RlbDFcIl0sXG4gICAgICBxbG9yYUFkYXB0ZXJOYW1lT3JQYXRoOiBcInFsb3JhXCIsXG4gICAgICBzaG93SGlkZGVuTWV0cmljc0ZvclZlcnNpb246IFwiMC41XCIsXG4gICAgICBvdGxwVHJhY2VzRW5kcG9pbnQ6IFwiaHR0cDovL2xvY2FsaG9zdFwiLFxuICAgICAgY29sbGVjdERldGFpbGVkVHJhY2VzOiBcIm1vZHVsZXNcIixcbiAgICAgIGRpc2FibGVBc3luY091dHB1dFByb2M6IHRydWUsXG4gICAgICBtYXhOdW1CYXRjaGVkVG9rZW5zOiA1MTIsXG4gICAgICBtYXhOdW1TZXFzOiAxNixcbiAgICAgIG1heE51bVBhcnRpYWxQcmVmaWxsczogNCxcbiAgICAgIG1heExvbmdQYXJ0aWFsUHJlZmlsbHM6IDIsXG4gICAgICBsb25nUHJlZmlsbFRva2VuVGhyZXNob2xkOiAyNTYsXG4gICAgICBudW1Mb29rYWhlYWRTbG90czogNCxcbiAgICAgIHNjaGVkdWxlckRlbGF5RmFjdG9yOiAwLjUsXG4gICAgICBlbmFibGVDaHVua2VkUHJlZmlsbDogdHJ1ZSxcbiAgICAgIG11bHRpU3RlcFN0cmVhbU91dHB1dHM6IGZhbHNlLFxuICAgICAgc2NoZWR1bGluZ1BvbGljeTogU2NoZWR1bGluZ1BvbGljeS5QUklPUklUWSxcbiAgICAgIGRpc2FibGVDaHVua2VkTW1JbnB1dDogdHJ1ZSxcbiAgICAgIHNjaGVkdWxlckNsczogXCJjdXN0b20uU2NoZWR1bGVyXCIsXG4gICAgICBvdmVycmlkZU5ldXJvbkNvbmZpZzoge30sXG4gICAgICBvdmVycmlkZVBvb2xlckNvbmZpZzoge30sXG4gICAgICBjb21waWxhdGlvbkNvbmZpZzoge30sXG4gICAgICBrdlRyYW5zZmVyQ29uZmlnOiB7fSxcbiAgICAgIHdvcmtlckNsczogXCJDdXN0b21Xb3JrZXJcIixcbiAgICAgIHdvcmtlckV4dGVuc2lvbkNsczogXCJFeHRlbnNpb25cIixcbiAgICAgIGdlbmVyYXRpb25Db25maWc6IFwiY29uZmlnXCIsXG4gICAgICBvdmVycmlkZUdlbmVyYXRpb25Db25maWc6IHt9LFxuICAgICAgZW5hYmxlU2xlZXBNb2RlOiB0cnVlLFxuICAgICAgYWRkaXRpb25hbENvbmZpZzoge30sXG4gICAgICBlbmFibGVSZWFzb25pbmc6IHRydWUsXG4gICAgICBkaXNhYmxlQ2FzY2FkZUF0dG46IHRydWUsXG4gICAgICBkaXNhYmxlTG9nUmVxdWVzdHM6IHRydWUsXG4gICAgICBtYXhMb2dMZW46IDEwMCxcbiAgICAgIGRpc2FibGVGYXN0QXBpRG9jczogdHJ1ZSxcbiAgICAgIGVuYWJsZVByb21wdFRva2Vuc0RldGFpbHM6IHRydWUsXG4gICAgICBlbmFibGVTZXJ2ZXJMb2FkVHJhY2tpbmc6IHRydWUsXG4gICAgICBsb2FkRm9ybWF0OiBMb2FkRm9ybWF0LlNBRkVURU5TT1JTLFxuICAgICAgZG93bmxvYWREaXI6IFwiL2Rvd25sb2Fkc1wiLFxuICAgICAgbW9kZWxMb2FkZXJFeHRyYUNvbmZpZzoge30sXG4gICAgICB1c2VUcWRtT25Mb2FkOiBmYWxzZSxcbiAgICAgIGd1aWRlZERlY29kaW5nQmFja2VuZDogR3VpZGVkRGVjb2RpbmdCYWNrZW5kLk9VVExJTkVTLFxuICAgICAgcmVhc29uaW5nUGFyc2VyOiBSZWFzb25pbmdQYXJzZXIuREVFUFNFRUtfUjEsXG4gICAgICBkaXN0cmlidXRlZEV4ZWN1dG9yQmFja2VuZDogRGlzdHJpYnV0ZWRFeGVjdXRvckJhY2tlbmQuUkFZLFxuICAgICAgcGlwZWxpbmVQYXJhbGxlbFNpemU6IDIsXG4gICAgICB0ZW5zb3JQYXJhbGxlbFNpemU6IDIsXG4gICAgICBkYXRhUGFyYWxsZWxTaXplOiAyLFxuICAgICAgZW5hYmxlRXhwZXJ0UGFyYWxsZWw6IHRydWUsXG4gICAgICBtYXhQYXJhbGxlbExvYWRpbmdXb3JrZXJzOiA0LFxuICAgICAgcmF5V29ya2Vyc1VzZU5zaWdodDogdHJ1ZSxcbiAgICAgIGRpc2FibGVDdXN0b21BbGxSZWR1Y2U6IHRydWUsXG4gICAgICBibG9ja1NpemU6IDE2LFxuICAgICAgZ3B1TWVtb3J5VXRpbGl6YXRpb246IDAuOCxcbiAgICAgIHN3YXBTcGFjZTogOCxcbiAgICAgIGt2Q2FjaGVEdHlwZTogS3ZDYWNoZUR0eXBlLkZQOCxcbiAgICAgIG51bUdwdUJsb2Nrc092ZXJyaWRlOiAxNixcbiAgICAgIGVuYWJsZVByZWZpeENhY2hpbmc6IHRydWUsXG4gICAgICBwcmVmaXhDYWNoaW5nSGFzaEFsZ286IFByZWZpeENhY2hpbmdIYXNoQWxnby5TSEEyNTYsXG4gICAgICBjcHVPZmZsb2FkR2I6IDIsXG4gICAgICBjYWxjdWxhdGVLdlNjYWxlczogdHJ1ZSxcbiAgICAgIGxpbWl0TW1QZXJQcm9tcHQ6IHt9LFxuICAgICAgZGV2aWNlOiBEZXZpY2UuTkVVUk9OLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBWbGxtRW5naW5lQXJndW1lbnRzUGFyc2VyLmNvbmZpZyh0ZXN0T2JqKTtcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaG9zdDogXCJsb2NhbGhvc3RcIixcbiAgICAgIHBvcnQ6IDgwODAsXG4gICAgICBcInV2aWNvcm4tbG9nLWxldmVsXCI6IFwiaW5mb1wiLFxuICAgICAgXCJkaXNhYmxlLXV2aWNvcm4tYWNjZXNzLWxvZ1wiOiB0cnVlLFxuICAgICAgXCJhbGxvdy1jcmVkZW50aWFsc1wiOiB0cnVlLFxuICAgICAgXCJhbGxvd2VkLW9yaWdpbnNcIjogJ1tcIipcIl0nLFxuICAgICAgXCJhbGxvd2VkLW1ldGhvZHNcIjogJ1tcIkdFVFwiXScsXG4gICAgICBcImFsbG93ZWQtaGVhZGVyc1wiOiAnW1wiQXV0aG9yaXphdGlvblwiXScsXG4gICAgICBcImFwaS1rZXlcIjogXCJzZWNyZXRcIixcbiAgICAgIFwibG9yYS1tb2R1bGVzXCI6XG4gICAgICAgICd7XCJuYW1lXCI6XCJuYW1lXCIsXCJwYXRoXCI6XCJsb3JhX3BhdGhcIixcImJhc2VfbW9kZWxfbmFtZVwiOlwiaWRcIn0nLFxuICAgICAgXCJwcm9tcHQtYWRhcHRlcnNcIjogW1wiYWRhcHRlcj1wYXRoXCJdLFxuICAgICAgXCJjaGF0LXRlbXBsYXRlXCI6IFwidGVtcGxhdGUuanNvblwiLFxuICAgICAgXCJjaGF0LXRlbXBsYXRlLWNvbnRlbnQtZm9ybWF0XCI6IFwiYXV0b1wiLFxuICAgICAgXCJyZXNwb25zZS1yb2xlXCI6IFwiYXNzaXN0YW50XCIsXG4gICAgICBcInNzbC1rZXlmaWxlXCI6IFwia2V5LnBlbVwiLFxuICAgICAgXCJzc2wtY2VydGZpbGVcIjogXCJjZXJ0LnBlbVwiLFxuICAgICAgXCJzc2wtY2EtY2VydHNcIjogXCJjYS5wZW1cIixcbiAgICAgIFwiZW5hYmxlLXNzbC1yZWZyZXNoXCI6IHRydWUsXG4gICAgICBcInNzbC1jZXJ0LXJlcXNcIjogMSxcbiAgICAgIFwicm9vdC1wYXRoXCI6IFwiL2FwaVwiLFxuICAgICAgbWlkZGxld2FyZTogW1wibWlkZGxld2FyZTFcIl0sXG4gICAgICBcInJldHVybi10b2tlbnMtYXMtdG9rZW4taWRzXCI6IHRydWUsXG4gICAgICBcImRpc2FibGUtZnJvbnRlbmQtbXVsdGlwcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICBcImVuYWJsZS1yZXF1ZXN0LWlkLWhlYWRlcnNcIjogdHJ1ZSxcbiAgICAgIFwiZW5hYmxlLWF1dG8tdG9vbC1jaG9pY2VcIjogdHJ1ZSxcbiAgICAgIFwidG9vbC1jYWxsLXBhcnNlclwiOiBcImdyYW5pdGVcIixcbiAgICAgIFwidG9vbC1wYXJzZXItcGx1Z2luXCI6IFwicGx1Z2luXCIsXG4gICAgICAvLyBzaG91bGQgaWdub3JlIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgLy8gbW9kZWw6IFwibW9kZWwtbmFtZVwiLFxuICAgICAgdGFzazogXCJnZW5lcmF0ZVwiLFxuICAgICAgdG9rZW5pemVyOiBcInRva2VuaXplci1uYW1lXCIsXG4gICAgICAvLyBzaG91bGQgaWdub3JlIHRoZSBoZi10b2tlbiBwcm9wZXJ0eVxuICAgICAgLy8gXCJoZi10b2tlblwiOiBcImR1bW15XCIsXG4gICAgICBcImhmLWNvbmZpZy1wYXRoXCI6IFwiY29uZmlnLmpzb25cIixcbiAgICAgIFwic2tpcC10b2tlbml6ZXItaW5pdFwiOiB0cnVlLFxuICAgICAgcmV2aXNpb246IFwidjEuMFwiLFxuICAgICAgXCJjb2RlLXJldmlzaW9uXCI6IFwidjIuMFwiLFxuICAgICAgXCJ0b2tlbml6ZXItcmV2aXNpb25cIjogXCJ2MS41XCIsXG4gICAgICBcInRva2VuaXplci1tb2RlXCI6IFwiYXV0b1wiLFxuICAgICAgXCJ0cnVzdC1yZW1vdGUtY29kZVwiOiB0cnVlLFxuICAgICAgXCJhbGxvd2VkLWxvY2FsLW1lZGlhLXBhdGhcIjogXCIvbWVkaWFcIixcbiAgICAgIFwiY29uZmlnLWZvcm1hdFwiOiBcImhmXCIsXG4gICAgICBkdHlwZTogXCJmbG9hdDE2XCIsXG4gICAgICBcIm1heC1tb2RlbC1sZW5cIjogMjA0OCxcbiAgICAgIFwibG9naXRzLXByb2Nlc3Nvci1wYXR0ZXJuXCI6IFwicGF0dGVyblwiLFxuICAgICAgXCJtb2RlbC1pbXBsXCI6IFwidmxsbVwiLFxuICAgICAgXCJkaXNhYmxlLXNsaWRpbmctd2luZG93XCI6IHRydWUsXG4gICAgICBcInVzZS12Mi1ibG9jay1tYW5hZ2VyXCI6IHRydWUsXG4gICAgICBzZWVkOiA0MixcbiAgICAgIFwibWF4LWxvZ3Byb2JzXCI6IDEwLFxuICAgICAgXCJkaXNhYmxlLWxvZy1zdGF0c1wiOiB0cnVlLFxuICAgICAgcXVhbnRpemF0aW9uOiBcImF3cVwiLFxuICAgICAgXCJyb3BlLXNjYWxpbmdcIjogXCJ7fVwiLFxuICAgICAgXCJyb3BlLXRoZXRhXCI6IDEuMCxcbiAgICAgIFwiaGYtb3ZlcnJpZGVzXCI6IFwie31cIixcbiAgICAgIFwiZW5mb3JjZS1lYWdlclwiOiB0cnVlLFxuICAgICAgXCJtYXgtc2VxLWxlbi10by1jYXB0dXJlXCI6IDQwOTYsXG4gICAgICBcIm1tLXByb2Nlc3Nvci1rd2FyZ3NcIjogXCJ7fVwiLFxuICAgICAgXCJkaXNhYmxlLW1tLXByZXByb2Nlc3Nvci1jYWNoZVwiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtbG9yYVwiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtbG9yYS1iaWFzXCI6IHRydWUsXG4gICAgICBcIm1heC1sb3Jhc1wiOiAyLFxuICAgICAgXCJtYXgtbG9yYS1yYW5rXCI6IDMyLFxuICAgICAgXCJsb3JhLWV4dHJhLXZvY2FiLXNpemVcIjogNTEyLFxuICAgICAgXCJsb3JhLWR0eXBlXCI6IFwiZmxvYXQxNlwiLFxuICAgICAgXCJsb25nLWxvcmEtc2NhbGluZy1mYWN0b3JzXCI6IDEsXG4gICAgICBcIm1heC1jcHUtbG9yYXNcIjogNCxcbiAgICAgIFwiZnVsbHktc2hhcmRlZC1sb3Jhc1wiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtcHJvbXB0LWFkYXB0ZXJcIjogdHJ1ZSxcbiAgICAgIFwibWF4LXByb21wdC1hZGFwdGVyc1wiOiAyLFxuICAgICAgXCJtYXgtcHJvbXB0LWFkYXB0ZXItdG9rZW5cIjogMjU2LFxuICAgICAgXCJudW0tc2NoZWR1bGVyLXN0ZXBzXCI6IDIsXG4gICAgICBcInNwZWN1bGF0aXZlLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImlnbm9yZS1wYXR0ZXJuc1wiOiBbXCJwYXR0ZXJuXCJdLFxuICAgICAgXCJwcmVlbXB0aW9uLW1vZGVcIjogXCJzd2FwXCIsXG4gICAgICBcInNlcnZlZC1tb2RlbC1uYW1lXCI6IFtcIm1vZGVsMVwiXSxcbiAgICAgIFwicWxvcmEtYWRhcHRlci1uYW1lLW9yLXBhdGhcIjogXCJxbG9yYVwiLFxuICAgICAgXCJzaG93LWhpZGRlbi1tZXRyaWNzLWZvci12ZXJzaW9uXCI6IFwiMC41XCIsXG4gICAgICBcIm90bHAtdHJhY2VzLWVuZHBvaW50XCI6IFwiaHR0cDovL2xvY2FsaG9zdFwiLFxuICAgICAgXCJjb2xsZWN0LWRldGFpbGVkLXRyYWNlc1wiOiBcIm1vZHVsZXNcIixcbiAgICAgIFwiZGlzYWJsZS1hc3luYy1vdXRwdXQtcHJvY1wiOiB0cnVlLFxuICAgICAgXCJtYXgtbnVtLWJhdGNoZWQtdG9rZW5zXCI6IDUxMixcbiAgICAgIFwibWF4LW51bS1zZXFzXCI6IDE2LFxuICAgICAgXCJtYXgtbnVtLXBhcnRpYWwtcHJlZmlsbHNcIjogNCxcbiAgICAgIFwibWF4LWxvbmctcGFydGlhbC1wcmVmaWxsc1wiOiAyLFxuICAgICAgXCJsb25nLXByZWZpbGwtdG9rZW4tdGhyZXNob2xkXCI6IDI1NixcbiAgICAgIFwibnVtLWxvb2thaGVhZC1zbG90c1wiOiA0LFxuICAgICAgXCJzY2hlZHVsZXItZGVsYXktZmFjdG9yXCI6IDAuNSxcbiAgICAgIFwiZW5hYmxlLWNodW5rZWQtcHJlZmlsbFwiOiB0cnVlLFxuICAgICAgXCJtdWx0aS1zdGVwLXN0cmVhbS1vdXRwdXRzXCI6IGZhbHNlLFxuICAgICAgXCJzY2hlZHVsaW5nLXBvbGljeVwiOiBcInByaW9yaXR5XCIsXG4gICAgICBcImRpc2FibGUtY2h1bmtlZC1tbS1pbnB1dFwiOiB0cnVlLFxuICAgICAgXCJzY2hlZHVsZXItY2xzXCI6IFwiY3VzdG9tLlNjaGVkdWxlclwiLFxuICAgICAgXCJvdmVycmlkZS1uZXVyb24tY29uZmlnXCI6IFwie31cIixcbiAgICAgIFwib3ZlcnJpZGUtcG9vbGVyLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImNvbXBpbGF0aW9uLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImt2LXRyYW5zZmVyLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcIndvcmtlci1jbHNcIjogXCJDdXN0b21Xb3JrZXJcIixcbiAgICAgIFwid29ya2VyLWV4dGVuc2lvbi1jbHNcIjogXCJFeHRlbnNpb25cIixcbiAgICAgIFwiZ2VuZXJhdGlvbi1jb25maWdcIjogXCJjb25maWdcIixcbiAgICAgIFwib3ZlcnJpZGUtZ2VuZXJhdGlvbi1jb25maWdcIjogXCJ7fVwiLFxuICAgICAgXCJlbmFibGUtc2xlZXAtbW9kZVwiOiB0cnVlLFxuICAgICAgXCJhZGRpdGlvbmFsLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImVuYWJsZS1yZWFzb25pbmdcIjogdHJ1ZSxcbiAgICAgIFwiZGlzYWJsZS1jYXNjYWRlLWF0dG5cIjogdHJ1ZSxcbiAgICAgIFwiZGlzYWJsZS1sb2ctcmVxdWVzdHNcIjogdHJ1ZSxcbiAgICAgIFwibWF4LWxvZy1sZW5cIjogMTAwLFxuICAgICAgXCJkaXNhYmxlLWZhc3QtYXBpLWRvY3NcIjogdHJ1ZSxcbiAgICAgIFwiZW5hYmxlLXByb21wdC10b2tlbnMtZGV0YWlsc1wiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtc2VydmVyLWxvYWQtdHJhY2tpbmdcIjogdHJ1ZSxcbiAgICAgIFwibG9hZC1mb3JtYXRcIjogXCJzYWZldGVuc29yc1wiLFxuICAgICAgXCJkb3dubG9hZC1kaXJcIjogXCIvZG93bmxvYWRzXCIsXG4gICAgICBcIm1vZGVsLWxvYWRlci1leHRyYS1jb25maWdcIjogXCJ7fVwiLFxuICAgICAgXCJ1c2UtdHFkbS1vbi1sb2FkXCI6IGZhbHNlLFxuICAgICAgXCJndWlkZWQtZGVjb2RpbmctYmFja2VuZFwiOiBcIm91dGxpbmVzXCIsXG4gICAgICBcInJlYXNvbmluZy1wYXJzZXJcIjogXCJkZWVwc2Vla19yMVwiLFxuICAgICAgXCJkaXN0cmlidXRlZC1leGVjdXRvci1iYWNrZW5kXCI6IFwicmF5XCIsXG4gICAgICBcInBpcGVsaW5lLXBhcmFsbGVsLXNpemVcIjogMixcbiAgICAgIFwidGVuc29yLXBhcmFsbGVsLXNpemVcIjogMixcbiAgICAgIFwiZGF0YS1wYXJhbGxlbC1zaXplXCI6IDIsXG4gICAgICBcImVuYWJsZS1leHBlcnQtcGFyYWxsZWxcIjogdHJ1ZSxcbiAgICAgIFwibWF4LXBhcmFsbGVsLWxvYWRpbmctd29ya2Vyc1wiOiA0LFxuICAgICAgXCJyYXktd29ya2Vycy11c2UtbnNpZ2h0XCI6IHRydWUsXG4gICAgICBcImRpc2FibGUtY3VzdG9tLWFsbC1yZWR1Y2VcIjogdHJ1ZSxcbiAgICAgIFwiYmxvY2stc2l6ZVwiOiAxNixcbiAgICAgIFwiZ3B1LW1lbW9yeS11dGlsaXphdGlvblwiOiAwLjgsXG4gICAgICBcInN3YXAtc3BhY2VcIjogOCxcbiAgICAgIFwia3YtY2FjaGUtZHR5cGVcIjogXCJmcDhcIixcbiAgICAgIFwibnVtLWdwdS1ibG9ja3Mtb3ZlcnJpZGVcIjogMTYsXG4gICAgICBcImVuYWJsZS1wcmVmaXgtY2FjaGluZ1wiOiB0cnVlLFxuICAgICAgXCJwcmVmaXgtY2FjaGluZy1oYXNoLWFsZ29cIjogXCJzaGEyNTZcIixcbiAgICAgIFwiY3B1LW9mZmxvYWQtZ2JcIjogMixcbiAgICAgIFwiY2FsY3VsYXRlLWt2LXNjYWxlc1wiOiB0cnVlLFxuICAgICAgXCJsaW1pdC1tbS1wZXItcHJvbXB0XCI6IFwie31cIixcbiAgICAgIGRldmljZTogXCJuZXVyb25cIixcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==