diff --git a/CHANGELOG.md b/CHANGELOG.md index ff37fdee..33830699 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,34 @@ +## 0.7.8 (2026-05-08) + +### 🚀 Features + +- **product-bulletin:** new `@novasamatech/product-bulletin` package — a Bulletin Chain client adapter for product apps. +- **host-papp:** the paired Polkadot Mobile app now reports a dedicated identity account alongside the remote signing account, and `UserSession` exposes it as `identityAccountId`. The `useSessionIdentity` hook reads from this field, so on-chain identity (display name, avatar) resolves against the user's identity account rather than the per-product signing account. +- **host-worker-sandbox:** `fetchResolver` now receives the in-VM `Request`'s `mode`, `credentials`, and `redirect`, so the host can apply CORS / auth / redirect-handling policy per request. + +### ⚠️ Breaking Changes + +- **host-papp:** the SSO handshake response payload now carries an `identityAccountId` field. Older paired Polkadot Mobile clients that don't send this field will fail to handshake — both ends must be on a compatible version. +- **storage-adapter:** `createLocalStorageAdapter` now writes under a `polkadot__` key namespace instead of `PAPP__`. Data written by earlier versions will not be found after upgrade — hosts that need to preserve user state must migrate the old keys. + +### 🩹 Fixes + +- **host-worker-sandbox:** sandbox `console` output is sanitized before being forwarded to the host logger — control characters (including ANSI escapes) are stripped and each string argument is capped at 64 KiB, so sandbox code can no longer drive a terminal-aware logger or dump multi-megabyte strings into host logs. +- **host-worker-sandbox:** `crypto.subtle` algorithm names are canonicalized at the bridge (e.g. `aes-gcm` → `AES-GCM`), so a resolver doing its own case-sensitive switch on `algorithm.name` can't be bypassed by case confusion; prototype-pollution keys (`__proto__`, `constructor`, `prototype`) are also stripped from values crossing the bridge in either direction. +- **host-worker-sandbox:** `setTimeout` / `setInterval` delays are floored at 4 ms and `queueMicrotask` is capped at 1024 pending callbacks per sandbox, so sandbox code cannot flood the host event loop with zero-delay timers or microtask spam. +- **host-worker-sandbox:** per-port `message` listeners are capped at 32 — sandbox code that registers fresh closures in a loop can no longer grow the host-side handle array unbounded and exhaust the QuickJS heap. +- **host-worker-sandbox:** sandboxes whose wrappers are garbage-collected without an explicit `dispose()` now free the underlying WASM context via a `FinalizationRegistry`, so a leaked sandbox no longer pins its QuickJS runtime indefinitely. + +### Chore + +- Refined e2e and unit tests + +### ❤️ Thank You + +- Sergey Zhuravlev @johnthecat +- Filippo +- RafalMirowski1 + ## 0.7.7 (2026-05-07) ### 🚀 Features diff --git a/__tests__/hostApi/accounts.spec.ts b/__tests__/hostApi/accounts.spec.ts index aba1e16e..d3921aff 100644 --- a/__tests__/hostApi/accounts.spec.ts +++ b/__tests__/hostApi/accounts.spec.ts @@ -340,38 +340,6 @@ describe('Host API: Accounts', () => { await expect(signer.signBytes(new Uint8Array([1, 2, 3]))).rejects.toEqual(error); }); - - it('should sign payload via handleSignPayload', async () => { - const { container, accountsProvider } = setup(); - const signatureBytes = new Uint8Array(64).fill(0xcd); - let handlerCalled = false; - - container.handleSignPayload((_, { ok }) => { - handlerCalled = true; - return ok({ signature: toHex(signatureBytes), signedTransaction: undefined }); - }); - - const signer = accountsProvider.getProductAccountSigner(mockAccount); - // Invoke via the PJS signPayload interface underlying the PolkadotSigner - const pjsSignPayload = (signer as unknown as { _signPayload: (p: unknown) => Promise })._signPayload; - if (pjsSignPayload) { - await pjsSignPayload.call(signer, { - address: '0x00', - genesisHash: '0x00', - nonce: '0x00', - method: '0x0002', - blockHash: '0x00', - blockNumber: '0x00', - era: '0x00', - version: 4, - specVersion: '0x00', - tip: '0x00', - signedExtensions: [], - transactionVersion: '0x00', - }); - expect(handlerCalled).toBe(true); - } - }); }); describe('getLegacyAccountSigner', () => { diff --git a/__tests__/hostApi/chainInteraction.e2e.spec.ts b/__tests__/hostApi/chainInteraction.e2e.spec.ts index 49d4894e..587b8285 100644 --- a/__tests__/hostApi/chainInteraction.e2e.spec.ts +++ b/__tests__/hostApi/chainInteraction.e2e.spec.ts @@ -1,12 +1,34 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion,@typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { createTransport } from '@novasamatech/host-api'; import { createContainer } from '@novasamatech/host-container'; import { WellKnownChain, createPapiProvider } from '@novasamatech/product-sdk'; -import type { JsonRpcMessage, JsonRpcProvider } from '@polkadot-api/json-rpc-provider'; +import type { JsonRpcMessage, JsonRpcProvider, JsonRpcRequest, JsonRpcResponse } from '@polkadot-api/json-rpc-provider'; +import { isRequest, isResponse } from '@polkadot-api/json-rpc-provider'; import { describe, expect, it } from 'vitest'; +// chainHead_v1_followEvent notification shape — params carries the subscription +// id and a result envelope with an event-discriminated body. +type FollowNotification = JsonRpcRequest<{ + subscription: string; + result: { event: string; operationId?: string; [key: string]: unknown }; +}>; + +const isFollowEventOf = + (event: string, operationId?: string) => + (m: JsonRpcMessage): m is FollowNotification => { + if (!isRequest(m) || m.method !== 'chainHead_v1_followEvent') return false; + const params = m.params; + if (!params || params.result?.event !== event) return false; + return operationId === undefined || params.result?.operationId === operationId; + }; + +const isResponseFor = + (id: number) => + (m: JsonRpcMessage): m is JsonRpcResponse => + isResponse(m) && m.id === id && ('result' in m || 'error' in m); + import { delay } from './__mocks__/helpers.js'; import { createHostApiProviders } from './__mocks__/hostApiProviders.js'; @@ -45,9 +67,21 @@ function createWebSocketProvider(url: string): JsonRpcProvider { * Polls for a message matching `predicate` in `messages`. * Returns the matching message or undefined if not found within the timeout. */ +async function pollForMessage( + messages: JsonRpcMessage[], + predicate: (parsed: JsonRpcMessage) => parsed is T, + maxIterations?: number, + interval?: number, +): Promise; async function pollForMessage( messages: JsonRpcMessage[], - predicate: (parsed: Record) => boolean, + predicate: (parsed: JsonRpcMessage) => boolean, + maxIterations?: number, + interval?: number, +): Promise; +async function pollForMessage( + messages: JsonRpcMessage[], + predicate: (parsed: JsonRpcMessage) => boolean, maxIterations = 150, interval = 200, ): Promise { @@ -111,17 +145,14 @@ async function createChainHeadSetup(): Promise { setup.sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); - const followResp = await pollForMessage(setup.receivedMessages, p => p.id === 1 && p.result !== undefined); - if (!followResp) throw new Error('Failed to start follow subscription'); - const followSubId = 'result' in followResp ? (followResp.result as string) : ''; + const followResp = await pollForMessage(setup.receivedMessages, isResponseFor(1)); + if (!followResp || !('result' in followResp)) throw new Error('Failed to start follow subscription'); + const followSubId = followResp.result as string; - const initEvent = await pollForMessage( - setup.receivedMessages, - p => (p as any).method === 'chainHead_v1_followEvent' && (p as any).params?.result?.event === 'initialized', - ); + const initEvent = await pollForMessage(setup.receivedMessages, isFollowEventOf('initialized')); if (!initEvent) throw new Error('Did not receive initialized event'); - const initialBlockHash = (initEvent as any).params.result.finalizedBlockHashes[0] as string; + const initialBlockHash = (initEvent.params!.result.finalizedBlockHashes as string[])[0]!; return { ...setup, followSubId, initialBlockHash }; } @@ -136,10 +167,9 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou try { sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainSpec_v1_genesisHash', params: [] }); - const response = await pollForMessage(receivedMessages, p => p.id === 1 && p.result !== undefined); + const response = await pollForMessage(receivedMessages, isResponseFor(1)); expect(response).toBeDefined(); - - expect((response! as any).result).toBe(POLKADOT_GENESIS_HASH); + expect(response).toHaveProperty('result', POLKADOT_GENESIS_HASH); } finally { await cleanup(); } @@ -150,12 +180,12 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou try { sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainSpec_v1_chainName', params: [] }); - const response = await pollForMessage(receivedMessages, p => p.id === 1 && p.result !== undefined); + const response = await pollForMessage(receivedMessages, isResponseFor(1)); expect(response).toBeDefined(); - - const parsed = response as any; - expect(typeof parsed.result).toBe('string'); - expect(parsed.result.length).toBeGreaterThan(0); + expect(response).toHaveProperty('result'); + const result = (response as JsonRpcResponse & { result: string }).result; + expect(typeof result).toBe('string'); + expect(result.length).toBeGreaterThan(0); } finally { await cleanup(); } @@ -166,11 +196,10 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou try { sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainSpec_v1_properties', params: [] }); - const response = await pollForMessage(receivedMessages, p => p.id === 1 && p.result !== undefined); + const response = await pollForMessage(receivedMessages, isResponseFor(1)); expect(response).toBeDefined(); - - const parsed = response as any; - const props = parsed.result; + expect(response).toHaveProperty('result'); + const props = (response as JsonRpcResponse & { result: { tokenSymbol: string; tokenDecimals: number } }).result; expect(props).toBeDefined(); expect(props.tokenSymbol).toBe('DOT'); expect(props.tokenDecimals).toBe(10); @@ -186,24 +215,22 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou try { sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); - const followResp = await pollForMessage(receivedMessages, p => p.id === 1 && p.result !== undefined); + const followResp = await pollForMessage(receivedMessages, isResponseFor(1)); expect(followResp).toBeDefined(); + expect(followResp).toHaveProperty('result'); - const followSubId = (followResp as any).result; + const followSubId = (followResp as JsonRpcResponse & { result: string }).result; expect(typeof followSubId).toBe('string'); - const initEvent = await pollForMessage( - receivedMessages, - p => (p as any).method === 'chainHead_v1_followEvent' && (p as any).params?.result?.event === 'initialized', - ); - + const initEvent = await pollForMessage(receivedMessages, isFollowEventOf('initialized')); expect(initEvent).toBeDefined(); - const parsedInit = initEvent as any; - expect(parsedInit.params.result.event).toBe('initialized'); - expect(Array.isArray(parsedInit.params.result.finalizedBlockHashes)).toBe(true); - expect(parsedInit.params.result.finalizedBlockHashes.length).toBeGreaterThan(0); - for (const hash of parsedInit.params.result.finalizedBlockHashes) { + const initResult = initEvent!.params!.result as { event: string; finalizedBlockHashes: string[] }; + expect(initResult.event).toBe('initialized'); + expect(Array.isArray(initResult.finalizedBlockHashes)).toBe(true); + expect(initResult.finalizedBlockHashes.length).toBeGreaterThan(0); + + for (const hash of initResult.finalizedBlockHashes) { expect(hash).toMatch(/^0x[0-9a-fA-F]+$/); } } finally { @@ -221,16 +248,13 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou params: [followSubId, initialBlockHash], }); - const response = await pollForMessage( - receivedMessages, - p => p.id === 2 && (p.result !== undefined || p.error !== undefined), - ); - + const response = await pollForMessage(receivedMessages, isResponseFor(2)); expect(response).toBeDefined(); - const parsed = response as any; - expect(parsed.result).toBeDefined(); - expect(typeof parsed.result).toBe('string'); - expect(parsed.result).toMatch(/^0x/); + expect(response).toHaveProperty('result'); + + const result = (response as JsonRpcResponse & { result: string }).result; + expect(typeof result).toBe('string'); + expect(result).toMatch(/^0x/); } finally { await cleanup(); } @@ -246,41 +270,31 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou params: [followSubId, initialBlockHash, [{ key: SYSTEM_NUMBER_KEY, type: 'value' }], null], }); - const storageResp = await pollForMessage( - receivedMessages, - p => p.id === 2 && (p.result !== undefined || p.error !== undefined), - ); - + const storageResp = await pollForMessage(receivedMessages, isResponseFor(2)); expect(storageResp).toBeDefined(); - const parsedResp = storageResp as any; - expect(parsedResp.result).toBeDefined(); - expect(parsedResp.result.result).toBe('started'); - expect(parsedResp.result.operationId).toBeDefined(); + expect(storageResp).toHaveProperty('result'); - const operationId = parsedResp.result.operationId; + const result = (storageResp as JsonRpcResponse & { result: { result: string; operationId: string } }).result; + expect(result.result).toBe('started'); + expect(result.operationId).toBeDefined(); + + const operationId = result.operationId; const storageItemsEvent = await pollForMessage( receivedMessages, - p => - (p as any).method === 'chainHead_v1_followEvent' && - (p as any).params?.result?.event === 'operationStorageItems' && - (p as any).params?.result?.operationId === operationId, + isFollowEventOf('operationStorageItems', operationId), ); - expect(storageItemsEvent).toBeDefined(); - const parsedItems = storageItemsEvent as any; - expect(parsedItems.params.result.items.length).toBeGreaterThan(0); - expect(parsedItems.params.result.items[0].key).toBe(SYSTEM_NUMBER_KEY); - expect(parsedItems.params.result.items[0].value).toMatch(/^0x/); + + const items = storageItemsEvent!.params!.result.items as Array<{ key: string; value: string }>; + expect(items.length).toBeGreaterThan(0); + expect(items[0]!.key).toBe(SYSTEM_NUMBER_KEY); + expect(items[0]!.value).toMatch(/^0x/); const storageDoneEvent = await pollForMessage( receivedMessages, - p => - (p as any).method === 'chainHead_v1_followEvent' && - (p as any).params?.result?.event === 'operationStorageDone' && - (p as any).params?.result?.operationId === operationId, + isFollowEventOf('operationStorageDone', operationId), ); - expect(storageDoneEvent).toBeDefined(); } finally { await cleanup(); @@ -297,15 +311,10 @@ describe('E2E: Chain Interaction against real Polkadot node', { retry: 2, timeou params: [followSubId, [initialBlockHash]], }); - const response = await pollForMessage( - receivedMessages, - p => p.id === 2 && (p.result !== undefined || p.error !== undefined), - ); - + const response = await pollForMessage(receivedMessages, isResponseFor(2)); expect(response).toBeDefined(); - const parsed = response as any; - expect(parsed.error).toBeUndefined(); - expect(parsed.result).toBe(null); + expect(response).toHaveProperty('result', null); + expect(response).not.toHaveProperty('error'); } finally { await cleanup(); } diff --git a/__tests__/hostApi/chainInteraction.spec.ts b/__tests__/hostApi/chainInteraction.spec.ts index 92af638a..4aeebc0e 100644 --- a/__tests__/hostApi/chainInteraction.spec.ts +++ b/__tests__/hostApi/chainInteraction.spec.ts @@ -5,6 +5,8 @@ import { createHostApi, createTransport, enumValue } from '@novasamatech/host-ap import { createContainer } from '@novasamatech/host-container'; import { WellKnownChain, createPapiProvider } from '@novasamatech/product-sdk'; +import type { JsonRpcMessage } from '@polkadot-api/json-rpc-provider'; +import type { JsonRpcProvider } from 'polkadot-api'; import { describe, expect, it, vi } from 'vitest'; import { delay } from './__mocks__/helpers.js'; @@ -37,14 +39,12 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - followFn(parsed.params[0]); + send(message) { + if (message.method === 'chainHead_v1_follow') { + followFn(message.params[0]); // Respond with subscription ID - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'chain_sub_1' } as any); + + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'chain_sub_1' }); // Send initialized event after a tick setTimeout(() => { @@ -59,11 +59,10 @@ describe('Host API: Chain Interaction', () => { finalizedBlockRuntime: null, }, }, - } as any); + }); }, 10); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -76,8 +75,8 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); // PAPI sends chainHead_v1_follow - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [true] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [true] }); await delay(100); @@ -116,15 +115,11 @@ describe('Host API: Chain Interaction', () => { chainOnMessage = onMessage; return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -136,8 +131,7 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); @@ -205,18 +199,13 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else if (parsed.method === 'chainHead_v1_header') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: '0xdd000001' } as any); + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); + } else if (message.method === 'chainHead_v1_header') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: '0xdd000001' }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -229,8 +218,8 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); // Start follow first - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); @@ -244,7 +233,7 @@ describe('Host API: Chain Interaction', () => { id: 2, method: 'chainHead_v1_header', params: [followSubId, '0xcc000001'], - } as any); + }); await delay(100); @@ -269,18 +258,15 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else if (parsed.method === 'chainHead_v1_storage') { + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); + } else if (message.method === 'chainHead_v1_storage') { onMessage({ jsonrpc: '2.0', - id: parsed.id, + id: message.id ?? null, result: { result: 'started', operationId: 'op_storage_1' }, - } as any); + }); // Send storage items event setTimeout(() => { @@ -302,7 +288,7 @@ describe('Host API: Chain Interaction', () => { ], }, }, - } as any); + }); onMessage({ jsonrpc: '2.0', @@ -311,11 +297,10 @@ describe('Host API: Chain Interaction', () => { subscription: 'sub_1', result: { event: 'operationStorageDone', operationId: 'op_storage_1' }, }, - } as any); + }); }, 10); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -328,8 +313,8 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); // Start follow - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); const followSubId = receivedMessages.find(m => m.id === 1)!.result; @@ -341,7 +326,7 @@ describe('Host API: Chain Interaction', () => { id: 2, method: 'chainHead_v1_storage', params: [followSubId, '0xcc000001', [{ key: '0xee000001', type: 'value' }], null], - } as any); + }); await delay(100); @@ -379,18 +364,15 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else if (parsed.method === 'chainHead_v1_call') { + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); + } else if (message.method === 'chainHead_v1_call') { onMessage({ jsonrpc: '2.0', - id: parsed.id, + id: message.id ?? null, result: { result: 'started', operationId: 'op_call_1' }, - } as any); + }); setTimeout(() => { onMessage({ @@ -400,11 +382,10 @@ describe('Host API: Chain Interaction', () => { subscription: 'sub_1', result: { event: 'operationCallDone', operationId: 'op_call_1', output: '0x11000001' }, }, - } as any); + }); }, 10); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -416,8 +397,7 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); const followSubId = receivedMessages.find(m => m.id === 1)!.result; @@ -427,7 +407,7 @@ describe('Host API: Chain Interaction', () => { id: 2, method: 'chainHead_v1_call', params: [followSubId, '0xcc000001', 'Metadata_metadata', '0x'], - } as any); + }); await delay(100); @@ -459,19 +439,15 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else if (parsed.method === 'chainHead_v1_unpin') { - unpinFn(parsed.params); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); + } else if (message.method === 'chainHead_v1_unpin') { + unpinFn(message.params); + + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -483,8 +459,7 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); const followSubId = receivedMessages.find(m => m.id === 1)!.result; @@ -494,7 +469,7 @@ describe('Host API: Chain Interaction', () => { id: 2, method: 'chainHead_v1_unpin', params: [followSubId, ['0xaa000001', '0xaa000002']], - } as any); + }); await delay(100); @@ -520,27 +495,21 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainSpec_v1_genesisHash') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: WellKnownChain.polkadotRelay } as any); - } else if (parsed.method === 'chainSpec_v1_chainName') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'Polkadot' } as any); - } else if (parsed.method === 'chainSpec_v1_properties') { + send(message) { + if (message.method === 'chainSpec_v1_genesisHash') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: WellKnownChain.polkadotRelay }); + } else if (message.method === 'chainSpec_v1_chainName') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'Polkadot' }); + } else if (message.method === 'chainSpec_v1_properties') { onMessage({ jsonrpc: '2.0', - id: parsed.id, + id: message.id ?? null, result: { ss58Format: 0, tokenDecimals: 10, tokenSymbol: 'DOT' }, - } as any); - } else if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); + }); + } else if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -553,21 +522,21 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); // Need to establish follow first for the connection to exist - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); // Query genesis hash - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 2, method: 'chainSpec_v1_genesisHash', params: [] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 2, method: 'chainSpec_v1_genesisHash', params: [] }); // Query chain name - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 3, method: 'chainSpec_v1_chainName', params: [] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 3, method: 'chainSpec_v1_chainName', params: [] }); // Query properties - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 4, method: 'chainSpec_v1_properties', params: [] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 4, method: 'chainSpec_v1_properties', params: [] }); await delay(200); @@ -600,19 +569,15 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else if (parsed.method === 'chainHead_v1_unfollow') { - unfollowFn(parsed.params[0]); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); + } else if (message.method === 'chainHead_v1_unfollow') { + unfollowFn(message.params[0]); + + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect: disconnectFn, @@ -624,8 +589,7 @@ describe('Host API: Chain Interaction', () => { /* ignore */ }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); @@ -658,16 +622,13 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'transaction_v1_broadcast') { - broadcastFn(parsed.params[0]); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'tx_op_1' } as any); + send(message) { + if (message.method === 'transaction_v1_broadcast') { + broadcastFn(message.params[0]); + + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'tx_op_1' }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -699,11 +660,8 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + send(message) { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); }, disconnect() { /* empty */ @@ -733,16 +691,13 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'transaction_v1_stop') { - stopFn(parsed.params[0]); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + send(message) { + if (message.method === 'transaction_v1_stop') { + stopFn(message.params[0]); + + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -775,11 +730,8 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + send(message) { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); }, disconnect() { /* empty */ @@ -805,129 +757,77 @@ describe('Host API: Chain Interaction', () => { it('should not collide request IDs when two products share the same chain backend', async () => { const chainId = WellKnownChain.polkadotRelay; - // Shared broadcasting chain backend — simulates BranchedProvider behavior - // where ALL responses from the single RPC connection are broadcast to ALL branches - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const allBranches: ((msg: any) => void)[] = []; + // Shared backend that simulates BranchedProvider: every response is + // broadcast to ALL onMessage callbacks. Each chainHead_v1_follow gets a + // distinct subId + a distinct initialized block hash so any cross-leak + // surfaces as an identical hash on both products. + const branches: ((msg: JsonRpcMessage) => void)[] = []; let subCounter = 0; - - function broadcastingChainFactory(chain: HexString) { + const broadcast = (msg: JsonRpcMessage) => branches.forEach(b => b(msg)); + const sharedFactory = (chain: HexString): JsonRpcProvider | null => { if (chain !== chainId) return null; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (onMessage: (msg: any) => void) => { - allBranches.push(onMessage); - + return onMessage => { + branches.push(onMessage); return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - subCounter++; - const subId = `sub_${subCounter}`; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const response = { jsonrpc: '2.0', id: parsed.id, result: subId } as any; - // Broadcast to ALL branches (simulating BranchedProvider) - for (const branch of allBranches) { - branch(response); - } - // Send initialized event after a tick (also broadcast) - // Use valid hex strings — invalid hex gets mangled by SCALE encoding roundtrip - const blockHash = subCounter === 1 ? '0xaa00000000000001' : '0xbb00000000000002'; - setTimeout(() => { - const event = { - jsonrpc: '2.0', - method: 'chainHead_v1_followEvent', - params: { - subscription: subId, - result: { - event: 'initialized', - finalizedBlockHashes: [blockHash], - finalizedBlockRuntime: null, - }, - }, - } as any; - for (const branch of allBranches) { - branch(event); - } - }, 10); - } else if (parsed.method === 'chainHead_v1_unfollow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const response = { jsonrpc: '2.0', id: parsed.id, result: null } as any; - for (const branch of allBranches) { - branch(response); - } - } + send(message) { + if (message.method !== 'chainHead_v1_follow') return; + const subId = `sub_${++subCounter}`; + const blockHash = `0x${subCounter.toString(16).padStart(16, '0')}` as const; + broadcast({ jsonrpc: '2.0', id: message.id ?? null, result: subId }); + setTimeout(() => { + broadcast({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + params: { + subscription: subId, + result: { event: 'initialized', finalizedBlockHashes: [blockHash], finalizedBlockRuntime: null }, + }, + }); + }, 10); }, disconnect() { /* empty */ }, }; }; - } - - // Two separate product setups — each with own transport + container - const providers1 = createHostApiProviders(); - const providers2 = createHostApiProviders(); - - const container1 = createContainer(providers1.host); - const container2 = createContainer(providers2.host); - - container1.handleFeatureSupported((params, { ok }) => ok(params.tag === 'Chain' && params.value === chainId)); - container2.handleFeatureSupported((params, { ok }) => ok(params.tag === 'Chain' && params.value === chainId)); - - container1.handleChainConnection(broadcastingChainFactory); - container2.handleChainConnection(broadcastingChainFactory); - - const sdkTransport1 = createTransport(providers1.sdk); - const sdkTransport2 = createTransport(providers2.sdk); - - const papiProvider1 = createPapiProvider(chainId, undefined, { transport: sdkTransport1 }); - const papiProvider2 = createPapiProvider(chainId, undefined, { transport: sdkTransport2 }); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const messages1: any[] = []; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const messages2: any[] = []; - - const conn1 = papiProvider1(msg => messages1.push(msg)); - const conn2 = papiProvider2(msg => messages2.push(msg)); - - // Both products start follow simultaneously - // eslint-disable-next-line @typescript-eslint/no-explicit-any - conn1.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [true] } as any); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - conn2.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [true] } as any); + }; + + // One product setup; receives messages into its own buffer. + const createProduct = () => { + const providers = createHostApiProviders(); + const container = createContainer(providers.host); + container.handleFeatureSupported((p, { ok }) => ok(p.tag === 'Chain' && p.value === chainId)); + container.handleChainConnection(sharedFactory); + const messages: JsonRpcMessage[] = []; + const conn = createPapiProvider(chainId, undefined, { transport: createTransport(providers.sdk) })(msg => + messages.push(msg), + ); + conn.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [true] }); + return messages; + }; + + const messages1 = createProduct(); + const messages2 = createProduct(); await delay(200); - // Each product should get exactly one follow response - const followResp1 = messages1.filter(m => m.id === 1 && typeof m.result === 'string'); - const followResp2 = messages2.filter(m => m.id === 1 && typeof m.result === 'string'); - - expect(followResp1.length).toBe(1); - expect(followResp2.length).toBe(1); - - // Each product should receive exactly one initialized event - const initEvents1 = messages1.filter( - m => m.method === 'chainHead_v1_followEvent' && m.params?.result?.event === 'initialized', - ); - const initEvents2 = messages2.filter( - m => m.method === 'chainHead_v1_followEvent' && m.params?.result?.event === 'initialized', - ); - - expect(initEvents1.length).toBe(1); - expect(initEvents2.length).toBe(1); - - // Each product should receive initialized events with DIFFERENT block data - // (sub_1 gets 0xblock_1, sub_2 gets 0xblock_2 from the chain backend). - // Without the ID collision fix, both would receive 0xblock_1 because both - // managers would resolve with the same chain subscription ID. - const blocks1 = initEvents1[0].params.result.finalizedBlockHashes; - const blocks2 = initEvents2[0].params.result.finalizedBlockHashes; - - expect(blocks1).not.toEqual(blocks2); - expect([blocks1[0], blocks2[0]].sort()).toEqual(['0xaa00000000000001', '0xbb00000000000002']); + type InitNotification = { method: string; params: { result: { finalizedBlockHashes: string[] } } }; + const isFollowResp = (m: JsonRpcMessage) => + 'id' in m && m.id === 1 && 'result' in m && typeof m.result === 'string'; + const isInit = (m: JsonRpcMessage): m is JsonRpcMessage & InitNotification => { + if (!('method' in m) || m.method !== 'chainHead_v1_followEvent') return false; + return (m.params as { result?: { event?: string } } | undefined)?.result?.event === 'initialized'; + }; + const initBlocks = (msgs: JsonRpcMessage[]) => msgs.filter(isInit)[0]!.params.result.finalizedBlockHashes; + + expect(messages1.filter(isFollowResp)).toHaveLength(1); + expect(messages2.filter(isFollowResp)).toHaveLength(1); + expect(messages1.filter(isInit)).toHaveLength(1); + expect(messages2.filter(isInit)).toHaveLength(1); + // Each product must observe a DIFFERENT block hash. Without the JSON-RPC + // id-collision fix, the chainConnectionManager would resolve both follows + // against the same chain subscription and observe identical hashes. + expect(initBlocks(messages1)).not.toEqual(initBlocks(messages2)); }); }); @@ -947,20 +847,16 @@ describe('Host API: Chain Interaction', () => { return onMessage => { return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else if (parsed.method === 'chainHead_v1_unfollow') { - unfollowFn(parsed.params[0]); + send(message) { + if (message.method === 'chainHead_v1_follow') { + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: 'sub_1' }); + } else if (message.method === 'chainHead_v1_unfollow') { + unfollowFn(message.params[0]); callOrder.push('unfollow'); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); + onMessage({ jsonrpc: '2.0', id: message.id ?? null, result: null }); } }, disconnect() { @@ -976,8 +872,8 @@ describe('Host API: Chain Interaction', () => { }); // Establish a follow subscription - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); @@ -1016,8 +912,7 @@ describe('Host API: Chain Interaction', () => { const sdkConnection = provider(msg => receivedMessages.push(msg)); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); + sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] }); await delay(100); diff --git a/__tests__/hostApi/chatReactRenderer.spec.tsx b/__tests__/hostApi/chatReactRenderer.spec.tsx index 293ec1c0..38b53072 100644 --- a/__tests__/hostApi/chatReactRenderer.spec.tsx +++ b/__tests__/hostApi/chatReactRenderer.spec.tsx @@ -1,11 +1,10 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ // @ts-expect-error Untyped globalThis['IS_REACT_ACT_ENVIRONMENT'] = true; import type { CodecType } from '@novasamatech/host-api'; -import { CustomRendererNode, createTransport, enumValue } from '@novasamatech/host-api'; +import { CustomRendererNode, Modifier, createTransport, enumValue } from '@novasamatech/host-api'; import { createContainer } from '@novasamatech/host-container'; import { Box, @@ -26,6 +25,27 @@ import { describe, expect, it, vi } from 'vitest'; import { createHostApiProviders } from './__mocks__/hostApiProviders.js'; +type RendererNode = CodecType; +type RendererModifier = CodecType; + +function findChildOfTag( + children: RendererNode[], + tag: T, +): Extract { + const found = children.find((c): c is Extract => c.tag === tag); + if (!found) throw new Error(`No child with tag ${tag}`); + return found; +} + +type ActionMsg = { + roomId: string; + peer: string; + payload: { + tag: 'ActionTriggered'; + value: { messageId: string; actionId: string; payload: Uint8Array }; + }; +}; + function setup() { const providers = createHostApiProviders(); const container = createContainer(providers.host); @@ -38,7 +58,7 @@ function setup() { * triggerAction fans out to all of them so the per-messageId filter inside * subscribeActions can route each event to the correct renderer. */ - const sendActions: ((action: any) => void)[] = []; + const sendActions: ((action: ActionMsg) => void)[] = []; container.handleChatActionSubscribe((_, send) => { sendActions.push(send); return () => { @@ -51,13 +71,14 @@ function setup() { * payload is optional — omit it for Button clicks, pass a SCALE-encoded value * (e.g. str.enc('text')) for TextField changes. */ - function triggerAction(messageId: string, actionId: string, payload?: Uint8Array) { - const action = { - roomId: 'room', - peer: 'bot', - payload: enumValue('ActionTriggered', { messageId, actionId, payload }), - }; - sendActions.forEach(send => send(action)); + function triggerAction(messageId: string, actionId: string, payload: Uint8Array) { + sendActions.forEach(send => + send({ + roomId: 'room', + peer: 'bot', + payload: enumValue('ActionTriggered', { messageId, actionId, payload }), + }), + ); } /** @@ -183,17 +204,21 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( expect(node.tag).toBe('Column'); expect(node.value.props.horizontalAlignment).toBe('center'); expect(node.value.props.verticalArrangement).toBe('spaceBetween'); - const colMods = node.value.modifiers as any[]; + const colMods = node.value.modifiers as RendererModifier[]; expect(colMods).toContainEqual({ tag: 'padding', value: [16, 16, undefined, undefined] }); expect(colMods).toContainEqual({ tag: 'fillWidth', value: true }); - const [boxA, boxB, rowNode, headlineText, topSpacer, btnPrimary, btnSecondary, btnText, tfNode, textNode] = node - .value.children as any[]; + // Children form a heterogeneous tagged-union tree; the cast here lets the + // test navigate the deeply-nested shape without per-access narrowing. + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + const children = node.value.children as any[]; + const [boxA, boxB, rowNode, headlineText, topSpacer, btnPrimary, btnSecondary, btnText, tfNode, textNode] = + children; // Box A: contentAlignment, background with Rounded shape, border, fillMaxWidth expect(boxA.tag).toBe('Box'); expect(boxA.value.props.contentAlignment).toBe('topStart'); - const boxAMods = boxA.value.modifiers as any[]; + const boxAMods = boxA.value.modifiers as RendererModifier[]; expect(boxAMods).toContainEqual({ tag: 'background', value: { color: 'backgroundSecondary', shape: { tag: 'Rounded', value: 8 } }, @@ -214,7 +239,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( // Box B: contentAlignment, background as plain color token, width/height/minWidth/minHeight expect(boxB.tag).toBe('Box'); expect(boxB.value.props.contentAlignment).toBe('center'); - const boxBMods = boxB.value.modifiers as any[]; + const boxBMods = boxB.value.modifiers as RendererModifier[]; expect(boxBMods).toContainEqual({ tag: 'background', value: { color: 'backgroundPrimary', shape: undefined } }); expect(boxBMods).toContainEqual({ tag: 'width', value: 40 }); expect(boxBMods).toContainEqual({ tag: 'height', value: 40 }); @@ -224,7 +249,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( // Box B > inner Box: background with Circle shape, fillMaxWidth + fillMaxHeight const innerBox = boxB.value.children[0]; expect(innerBox.tag).toBe('Box'); - const innerBoxMods = innerBox.value.modifiers as any[]; + const innerBoxMods = innerBox.value.modifiers as RendererModifier[]; expect(innerBoxMods).toContainEqual({ tag: 'background', value: { color: 'backgroundTertiary', shape: { tag: 'Circle', value: undefined } }, @@ -236,7 +261,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( expect(rowNode.tag).toBe('Row'); expect(rowNode.value.props.verticalAlignment).toBe('bottom'); expect(rowNode.value.props.horizontalArrangement).toBe('spaceEvenly'); - const rowMods = rowNode.value.modifiers as any[]; + const rowMods = rowNode.value.modifiers as RendererModifier[]; expect(rowMods).toContainEqual({ tag: 'margin', value: [8, 8, undefined, undefined] }); // Row > Text: bodyM + success @@ -249,7 +274,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( // Row > Spacer: width + height modifiers const rowSpacer = rowNode.value.children[1]; expect(rowSpacer.tag).toBe('Spacer'); - const rowSpacerMods = rowSpacer.value.modifiers as any[]; + const rowSpacerMods = rowSpacer.value.modifiers as RendererModifier[]; expect(rowSpacerMods).toContainEqual({ tag: 'width', value: 8 }); expect(rowSpacerMods).toContainEqual({ tag: 'height', value: 4 }); @@ -275,7 +300,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( // Spacer: fillMaxHeight expect(topSpacer.tag).toBe('Spacer'); - const topSpacerMods = topSpacer.value.modifiers as any[]; + const topSpacerMods = topSpacer.value.modifiers as RendererModifier[]; expect(topSpacerMods).toContainEqual({ tag: 'fillHeight', value: true }); // Button: primary variant, enabled, loading @@ -378,17 +403,17 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( const sub = await subscribe(messageId, 'counter', new Uint8Array(), callback); const firstNode = callback.mock.calls[callback.mock.calls.length - 1]![0]; - const btn = (firstNode.value.children as any[]).find((c: any) => c.tag === 'Button'); - const clickActionId: string = btn.value.props.clickAction; + const btn = findChildOfTag(firstNode.value.children as RendererNode[], 'Button'); + const clickActionId = btn.value.props.clickAction!; await act(async () => { - triggerAction(messageId, clickActionId); + triggerAction(messageId, clickActionId, new Uint8Array()); await new Promise(resolve => setTimeout(resolve, 10)); }); expect(callback.mock.calls.length).toBeGreaterThan(1); const updatedNode = callback.mock.calls[callback.mock.calls.length - 1]![0]; - const txt = (updatedNode.value.children as any[]).find((c: any) => c.tag === 'Text'); + const txt = findChildOfTag(updatedNode.value.children as RendererNode[], 'Text'); expect(txt.value.children[0]).toEqual({ tag: 'String', value: '1' }); await act(async () => { @@ -421,8 +446,8 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( const sub = await subscribe(messageId, 'form', new Uint8Array(), callback); const firstNode = callback.mock.calls[callback.mock.calls.length - 1]![0]; - const tf = (firstNode.value.children as any[]).find((c: any) => c.tag === 'TextField'); - const valueChangeActionId: string = tf.value.props.valueChangeAction; + const tf = findChildOfTag(firstNode.value.children as RendererNode[], 'TextField'); + const valueChangeActionId = tf.value.props.valueChangeAction!; await act(async () => { triggerAction(messageId, valueChangeActionId, str.enc('hello world')); @@ -430,7 +455,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( }); const updatedNode = callback.mock.calls[callback.mock.calls.length - 1]![0]; - const updatedTf = (updatedNode.value.children as any[]).find((c: any) => c.tag === 'TextField'); + const updatedTf = findChildOfTag(updatedNode.value.children as RendererNode[], 'TextField'); expect(updatedTf.value.props.text).toBe('hello world'); await act(async () => { @@ -458,7 +483,7 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( // Fire the action for a *different* messageId — onClick must not be called. await act(async () => { - triggerAction('other-message-id', clickActionId); + triggerAction('other-message-id', clickActionId, new Uint8Array()); }); expect(onClick).not.toHaveBeenCalled(); @@ -496,18 +521,18 @@ describe('registerChatMessageRenderer + createProductChatManager integration', ( const subB = await subscribe(messageIdB, 'b', new Uint8Array(), cbB); const nodeA = cbA.mock.calls[cbA.mock.calls.length - 1]![0]; - const btnA = (nodeA.value.children as any[]).find((c: any) => c.tag === 'Button'); + const btnA = findChildOfTag(nodeA.value.children as RendererNode[], 'Button'); // Click only message A's button await act(async () => { - triggerAction(messageIdA, btnA.value.props.clickAction); + triggerAction(messageIdA, btnA.value.props.clickAction!, new Uint8Array()); await new Promise(resolve => setTimeout(resolve, 10)); }); const updatedA = cbA.mock.calls[cbA.mock.calls.length - 1]![0]; const updatedB = cbB.mock.calls[cbB.mock.calls.length - 1]![0]; - const txtA = (updatedA.value.children as any[]).find((c: any) => c.tag === 'Text'); - const txtB = (updatedB.value.children as any[]).find((c: any) => c.tag === 'Text'); + const txtA = findChildOfTag(updatedA.value.children as RendererNode[], 'Text'); + const txtB = findChildOfTag(updatedB.value.children as RendererNode[], 'Text'); expect(txtA.value.children[0]).toEqual({ tag: 'String', value: '1' }); expect(txtB.value.children[0]).toEqual({ tag: 'String', value: '10' }); diff --git a/__tests__/hostApi/containerDefaultHandlers.spec.ts b/__tests__/hostApi/containerDefaultHandlers.spec.ts index 61128763..c022041c 100644 --- a/__tests__/hostApi/containerDefaultHandlers.spec.ts +++ b/__tests__/hostApi/containerDefaultHandlers.spec.ts @@ -103,14 +103,13 @@ describe('Container default handlers', () => { }); }); - it('should dispose correctly', async () => { + it('post-dispose teardown is idempotent (cleanup callbacks and dispose itself)', () => { const { container } = setup(); - - const unsub = container.handleGetLegacyAccounts((_, { ok }) => { - return ok([]); - }); + const unsub = container.handleGetLegacyAccounts((_, { ok }) => ok([])); container.dispose(); - expect(() => unsub()).not.to.throw(); + expect(() => unsub()).not.toThrow(); + expect(() => unsub()).not.toThrow(); + expect(() => container.dispose()).not.toThrow(); }); }); diff --git a/__tests__/hostApi/injectedWeb3Provider.spec.ts b/__tests__/hostApi/injectedWeb3Provider.spec.ts index ac165955..1b4e9746 100644 --- a/__tests__/hostApi/injectedWeb3Provider.spec.ts +++ b/__tests__/hostApi/injectedWeb3Provider.spec.ts @@ -134,7 +134,6 @@ describe('Host API: injected web3 provider', () => { const result = await injected.signer.createTransaction?.(payload); - expect(createTransaction).toBeCalledTimes(1); expect(result).toEqual(toHex(response)); }); diff --git a/__tests__/hostApi/jsonRpcProvider.spec.ts b/__tests__/hostApi/jsonRpcProvider.spec.ts deleted file mode 100644 index 45c26858..00000000 --- a/__tests__/hostApi/jsonRpcProvider.spec.ts +++ /dev/null @@ -1,197 +0,0 @@ -import type { HexString } from '@novasamatech/host-api'; -import { createTransport } from '@novasamatech/host-api'; -import { createContainer } from '@novasamatech/host-container'; -import { WellKnownChain, createPapiProvider } from '@novasamatech/product-sdk'; - -import { describe, expect, it, vi } from 'vitest'; - -import { delay } from './__mocks__/helpers.js'; -import { createHostApiProviders } from './__mocks__/hostApiProviders.js'; - -function setup(chainId: HexString) { - const providers = createHostApiProviders(); - const container = createContainer(providers.host); - const sdkTransport = createTransport(providers.sdk); - - const provider = createPapiProvider(chainId, undefined, { transport: sdkTransport }); - - return { container, provider }; -} - -describe('Host API: JSON RPC provider', () => { - it('should send and receive messages through typed chain interaction', async () => { - const { container, provider } = setup(WellKnownChain.polkadotRelay); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const receivedBySDK: any[] = []; - - container.handleFeatureSupported((params, { ok }) => - ok(params.tag === 'Chain' && params.value === WellKnownChain.polkadotRelay), - ); - container.handleChainConnection(chain => { - if (chain !== WellKnownChain.polkadotRelay) return null; - - return onMessage => { - return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainSpec_v1_chainName') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'Polkadot' } as any); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); - } - }, - disconnect() { - /* empty */ - }, - }; - }; - }); - - const sdkConnection = provider(message => receivedBySDK.push(message)); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainSpec_v1_chainName', params: [] } as any); - - await delay(100); - - const response = receivedBySDK.find(m => m.id === 1); - expect(response).toBeDefined(); - expect(response!.result).toBe('Polkadot'); - }); - - it('should not send messages when feature is not supported', async () => { - const { container, provider } = setup(WellKnownChain.polkadotRelay); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const receivedByProvider: any[] = []; - - // Feature returns false - chain not supported - container.handleFeatureSupported((_, { ok }) => ok(false)); - container.handleChainConnection(chain => { - if (chain !== WellKnownChain.polkadotRelay) return null; - - return onMessage => { - return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - receivedByProvider.push(message); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: message.id, result: 'ok' } as any); - }, - disconnect() { - /* empty */ - }, - }; - }; - }); - - const sdkConnection = provider(() => { - /* ignore responses */ - }); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainSpec_v1_chainName', params: [] } as any); - - await delay(100); - - // Messages should not reach the provider when feature is not supported - expect(receivedByProvider).toEqual([]); - }); - - it('should handle disconnect gracefully', async () => { - const { container, provider } = setup(WellKnownChain.polkadotRelay); - const disconnectFn = vi.fn(); - - container.handleFeatureSupported((params, { ok }) => - ok(params.tag === 'Chain' && params.value === WellKnownChain.polkadotRelay), - ); - container.handleChainConnection(chain => { - if (chain !== WellKnownChain.polkadotRelay) return null; - - return onMessage => { - return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - const parsed = message; - if (parsed.method === 'chainHead_v1_follow') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'sub_1' } as any); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); - } - }, - disconnect: disconnectFn, - }; - }; - }); - - const sdkConnection = provider(() => { - /* ignore responses */ - }); - - // Establish a connection first via follow - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainHead_v1_follow', params: [false] } as any); - - await delay(100); - - sdkConnection.disconnect(); - - await delay(50); - - expect(disconnectFn).toHaveBeenCalled(); - }); - - it('should route messages to correct chain provider', async () => { - const { container, provider } = setup(WellKnownChain.polkadotRelay); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const receivedByPolkadot: any[] = []; - - container.handleFeatureSupported((params, { ok }) => - ok(params.tag === 'Chain' && params.value === WellKnownChain.polkadotRelay), - ); - container.handleChainConnection(chain => { - if (chain === WellKnownChain.polkadotRelay) { - return onMessage => ({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - send(message: any) { - receivedByPolkadot.push(message); - const parsed = message; - if (parsed.method === 'chainSpec_v1_chainName') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: 'Polkadot' } as any); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage({ jsonrpc: '2.0', id: parsed.id, result: null } as any); - } - }, - disconnect() { - /* empty */ - }, - }); - } - - return null; - }); - - const sdkConnection = provider(() => { - /* ignore */ - }); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sdkConnection.send({ jsonrpc: '2.0', id: 1, method: 'chainSpec_v1_chainName', params: [] } as any); - - await delay(100); - - // Only Polkadot provider should receive the request - expect(receivedByPolkadot.length).toBeGreaterThan(0); - const receivedMethod = receivedByPolkadot[0]!.method; - expect(receivedMethod).toBe('chainSpec_v1_chainName'); - }); -}); diff --git a/__tests__/hostApi/metaProvider.spec.ts b/__tests__/hostApi/metaProvider.spec.ts index 3ac190cc..6c94ef4e 100644 --- a/__tests__/hostApi/metaProvider.spec.ts +++ b/__tests__/hostApi/metaProvider.spec.ts @@ -59,43 +59,39 @@ describe('Host API: meta provider', () => { expect(statuses).toContain('connected'); }); - it('should unsubscribe from connection status', async () => { + it('stops delivering updates after unsubscribe', async () => { const { container } = setup(); const callback = vi.fn(); const unsubscribe = container.subscribeProductConnectionStatus(callback); - - // Unsubscribe before ready + // subscribe is documented to replay the current status synchronously. + const callsBeforeUnsubscribe = callback.mock.calls.length; unsubscribe(); await container.isReady(); - // Callback should have been called at least once before unsubscribe - // but the exact count depends on timing - expect(callback).toHaveBeenCalled(); + // No further deliveries after unsubscribe even though the status changed. + expect(callback).toHaveBeenCalledTimes(callsBeforeUnsubscribe); }); - it('should handle multiple status subscribers', async () => { + it('delivers the final connected status to every subscriber', async () => { const { container } = setup(); - const statuses1: ConnectionStatus[] = []; - const statuses2: ConnectionStatus[] = []; - - // Subscribe both before any init happens - container.subscribeProductConnectionStatus(status => { - statuses1.push(status); - }); - - // Second subscriber may miss 'disconnected' if first subscriber triggered init - container.subscribeProductConnectionStatus(status => { - statuses2.push(status); - }); + const observe = () => { + const statuses: ConnectionStatus[] = []; + container.subscribeProductConnectionStatus(s => statuses.push(s)); + return statuses; + }; + const seen = [observe(), observe()]; await container.isReady(); - // First subscriber sees full lifecycle - expect(statuses1).toEqual(['disconnected', 'connecting', 'connected']); - // Second subscriber may miss initial 'disconnected' as init was already triggered - expect(statuses2).toEqual(['connecting', 'connected']); + // Both subscribers must observe the 'connecting' transition and converge + // on 'connected'. The starting status depends on whether init has already + // fired by subscribe-time and is not part of the contract. + for (const s of seen) { + expect(s.at(-1)).toBe('connected'); + expect(s).toContain('connecting'); + } }); it('should report disconnected status initially in meta provider', () => { diff --git a/__tests__/hostApi/payments.spec.ts b/__tests__/hostApi/payments.spec.ts index 45721e91..72351082 100644 --- a/__tests__/hostApi/payments.spec.ts +++ b/__tests__/hostApi/payments.spec.ts @@ -37,19 +37,6 @@ describe('Host API: Payments', () => { expect(received).toEqual([{ available: 100n }]); }); - - it('should interrupt when no handler is registered', async () => { - const { payments } = setup(); - - let interrupted = false; - const sub = payments.subscribeBalance(noop); - sub.onInterrupt(() => { - interrupted = true; - }); - - await delay(50); - expect(interrupted).toBe(true); - }); }); describe('topUp', () => { @@ -194,18 +181,5 @@ describe('Host API: Payments', () => { expect(handler).toHaveBeenCalledWith('my-payment-id', expect.anything(), expect.anything()); }); - - it('should interrupt when no handler is registered', async () => { - const { payments } = setup(); - - let interrupted = false; - const sub = payments.subscribePaymentStatus('unknown-id', noop); - sub.onInterrupt(() => { - interrupted = true; - }); - - await delay(50); - expect(interrupted).toBe(true); - }); }); }); diff --git a/package-lock.json b/package-lock.json index d6cdc74d..502ce75f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16881,7 +16881,7 @@ }, "packages/handoff-service": { "name": "@novasamatech/handoff-service", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "2.2.0", @@ -16894,10 +16894,10 @@ }, "packages/host-api": { "name": "@novasamatech/host-api", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/scale": "0.7.7", + "@novasamatech/scale": "0.7.8", "nanoevents": "9.1.0", "nanoid": "5.1.9", "neverthrow": "^8.2.0", @@ -16924,12 +16924,12 @@ }, "packages/host-chat": { "name": "@novasamatech/host-chat", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/scale": "0.7.7", - "@novasamatech/statement-store": "0.7.7", - "@novasamatech/storage-adapter": "0.7.7", + "@novasamatech/scale": "0.7.8", + "@novasamatech/statement-store": "0.7.8", + "@novasamatech/storage-adapter": "0.7.8", "nanoid": "5.1.9", "neverthrow": "^8.2.0" } @@ -16954,11 +16954,11 @@ }, "packages/host-container": { "name": "@novasamatech/host-container", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { "@noble/hashes": "2.2.0", - "@novasamatech/host-api": "0.7.7", + "@novasamatech/host-api": "0.7.8", "@polkadot-api/substrate-client": "^0.7.0", "nanoid": "5.1.9", "neverthrow": "^8.2.0", @@ -16988,16 +16988,16 @@ }, "packages/host-papp": { "name": "@novasamatech/host-papp", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "2.2.0", "@noble/curves": "2.2.0", "@noble/hashes": "2.2.0", - "@novasamatech/host-api": "0.7.7", - "@novasamatech/scale": "0.7.7", - "@novasamatech/statement-store": "0.7.7", - "@novasamatech/storage-adapter": "0.7.7", + "@novasamatech/host-api": "0.7.8", + "@novasamatech/scale": "0.7.8", + "@novasamatech/statement-store": "0.7.8", + "@novasamatech/storage-adapter": "0.7.8", "@polkadot-labs/hdkd-helpers": "^0.0.30", "nanoevents": "9.1.0", "nanoid": "5.1.9", @@ -17009,11 +17009,11 @@ }, "packages/host-papp-react-ui": { "name": "@novasamatech/host-papp-react-ui", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/host-papp": "0.7.7", - "@novasamatech/statement-store": "0.7.7", + "@novasamatech/host-papp": "0.7.8", + "@novasamatech/statement-store": "0.7.8", "@novasamatech/tr-ui": "0.2.7", "@polkadot-api/utils": "^0.4.0", "@radix-ui/react-dialog": "1.1.15", @@ -17054,10 +17054,10 @@ }, "packages/host-substrate-chain-connection": { "name": "@novasamatech/host-substrate-chain-connection", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/storage-adapter": "0.7.7", + "@novasamatech/storage-adapter": "0.7.8", "@polkadot-api/json-rpc-provider": "^0.2.0", "@polkadot-api/json-rpc-provider-proxy": "^0.4.0", "@polkadot-api/ws-provider": "^0.9.0", @@ -17067,31 +17067,31 @@ }, "packages/host-worker-sandbox": { "name": "@novasamatech/host-worker-sandbox", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/host-api": "0.7.7", - "@novasamatech/host-container": "0.7.7", + "@novasamatech/host-api": "0.7.8", + "@novasamatech/host-container": "0.7.8", "quickjs-emscripten": "0.32.0" } }, "packages/product-bulletin": { "name": "@novasamatech/product-bulletin", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/product-sdk": "0.7.7", + "@novasamatech/product-sdk": "0.7.8", "@parity/bulletin-sdk": "^0.3.0", "polkadot-api": ">=2" } }, "packages/product-react-renderer": { "name": "@novasamatech/product-react-renderer", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/host-api": "0.7.7", - "@novasamatech/product-sdk": "0.7.7", + "@novasamatech/host-api": "0.7.8", + "@novasamatech/product-sdk": "0.7.8", "react-reconciler": "0.33.0", "scale-ts": "1.6.1" }, @@ -17104,10 +17104,10 @@ }, "packages/product-sdk": { "name": "@novasamatech/product-sdk", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { - "@novasamatech/host-api": "0.7.7", + "@novasamatech/host-api": "0.7.8", "@polkadot-api/json-rpc-provider-proxy": "^0.4.0", "@polkadot/extension-inject": "^0.63.1", "neverthrow": "^8.2.0", @@ -17116,7 +17116,7 @@ }, "packages/scale": { "name": "@novasamatech/scale", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { "@polkadot-api/utils": "^0.4.0", @@ -17125,12 +17125,12 @@ }, "packages/statement-store": { "name": "@novasamatech/statement-store", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "2.2.0", "@noble/hashes": "2.2.0", - "@novasamatech/scale": "0.7.7", + "@novasamatech/scale": "0.7.8", "@novasamatech/sdk-statement": "^0.6.0", "@polkadot-api/substrate-bindings": "^0.20.1", "@polkadot-api/substrate-client": "^0.7.0", @@ -17162,7 +17162,7 @@ }, "packages/storage-adapter": { "name": "@novasamatech/storage-adapter", - "version": "0.7.7", + "version": "0.7.8", "license": "Apache-2.0", "dependencies": { "nanoevents": "^9.1.0", diff --git a/packages/handoff-service/package.json b/packages/handoff-service/package.json index 6bb68d28..6b2533af 100644 --- a/packages/handoff-service/package.json +++ b/packages/handoff-service/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/handoff-service", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "HOP (Handoff Pool) file transfer service for P2P chat", "license": "Apache-2.0", "repository": { diff --git a/packages/handoff-service/src/fileLoader/fileLoader.spec.ts b/packages/handoff-service/src/fileLoader/fileLoader.spec.ts index 6b8aa773..16bf1970 100644 --- a/packages/handoff-service/src/fileLoader/fileLoader.spec.ts +++ b/packages/handoff-service/src/fileLoader/fileLoader.spec.ts @@ -50,7 +50,7 @@ function createMockHopClient() { describe('file loader', () => { it('uploads and downloads a small file (single chunk)', async () => { - const { client, submitMock } = createMockHopClient(); + const { client } = createMockHopClient(); const data = new TextEncoder().encode('hello world'); const uploadResult = await uploadFile({ data, hopClient: client }); @@ -60,9 +60,6 @@ describe('file loader', () => { expect(identifier.length).toBe(32); expect(claimTicket.length).toBe(32); - // 1 chunk + 1 metadata = 2 submissions - expect(submitMock).toHaveBeenCalledTimes(2); - const downloadResult = await downloadFile({ identifier, claimTicket, @@ -74,8 +71,8 @@ describe('file loader', () => { }); it('uploads and downloads a multi-chunk file', async () => { - const { client, submitMock } = createMockHopClient(); - const data = randomBytes(5_000); // 5KB with 2KB chunk size + const { client } = createMockHopClient(); + const data = randomBytes(5_000); const uploadResult = await uploadFile({ data, @@ -86,9 +83,6 @@ describe('file loader', () => { const { identifier, claimTicket } = uploadResult._unsafeUnwrap(); - // 3 chunks (2000 + 2000 + 1000) + 1 metadata = 4 submissions - expect(submitMock).toHaveBeenCalledTimes(4); - const downloadResult = await downloadFile({ identifier, claimTicket, diff --git a/packages/host-api/package.json b/packages/host-api/package.json index 8cc2d92f..53418e2b 100644 --- a/packages/host-api/package.json +++ b/packages/host-api/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-api", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Host API: transport implementation for host - product integration.", "license": "Apache-2.0", "repository": { @@ -22,7 +22,7 @@ "README.md" ], "dependencies": { - "@novasamatech/scale": "0.7.7", + "@novasamatech/scale": "0.7.8", "nanoevents": "9.1.0", "nanoid": "5.1.9", "neverthrow": "^8.2.0", diff --git a/packages/host-chat/package.json b/packages/host-chat/package.json index f75c15f4..aff0a550 100644 --- a/packages/host-chat/package.json +++ b/packages/host-chat/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-chat", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "private": "true", "description": "Host statement store chat integration", "license": "Apache-2.0", @@ -41,9 +41,9 @@ "README.md" ], "dependencies": { - "@novasamatech/scale": "0.7.7", - "@novasamatech/statement-store": "0.7.7", - "@novasamatech/storage-adapter": "0.7.7", + "@novasamatech/scale": "0.7.8", + "@novasamatech/statement-store": "0.7.8", + "@novasamatech/storage-adapter": "0.7.8", "nanoid": "5.1.9", "neverthrow": "^8.2.0" }, diff --git a/packages/host-chat/src/codec/attachment.spec.ts b/packages/host-chat/src/codec/attachment.spec.ts index fa3d9e57..ec6c742a 100644 --- a/packages/host-chat/src/codec/attachment.spec.ts +++ b/packages/host-chat/src/codec/attachment.spec.ts @@ -38,30 +38,6 @@ describe('attachment codecs', () => { }); describe('FileMeta', () => { - it('encodes general variant at index 0', () => { - const meta = { tag: 'general' as const, value: { mimeType: 'text/plain', fileSize: 42 } }; - const encoded = FileMeta.enc(meta); - expect(encoded[0]).toBe(0); - }); - - it('encodes image variant at index 1', () => { - const meta = { - tag: 'image' as const, - value: { general: { mimeType: 'image/png', fileSize: 100 }, width: 64, height: 64 }, - }; - const encoded = FileMeta.enc(meta); - expect(encoded[0]).toBe(1); - }); - - it('encodes video variant at index 2', () => { - const meta = { - tag: 'video' as const, - value: { general: { mimeType: 'video/mp4', fileSize: 999 }, duration: 30 }, - }; - const encoded = FileMeta.enc(meta); - expect(encoded[0]).toBe(2); - }); - it('round-trips all variants', () => { const variants = [ { tag: 'general' as const, value: { mimeType: 'application/pdf', fileSize: 1024 } }, @@ -106,7 +82,7 @@ describe('attachment codecs', () => { }); describe('FileVariant', () => { - it('encodes p2pMixnet at index 0', () => { + it('round-trips p2pMixnet variant', () => { const variant = { tag: 'p2pMixnet' as const, value: { @@ -116,10 +92,8 @@ describe('attachment codecs', () => { }, }; const encoded = FileVariant.enc(variant); - expect(encoded[0]).toBe(0); - const decoded = FileVariant.dec(encoded); - expect(decoded.tag).toBe('p2pMixnet'); + expect(decoded).toEqual(variant); }); }); }); diff --git a/packages/host-container/package.json b/packages/host-container/package.json index a16bd59d..3ce29ffb 100644 --- a/packages/host-container/package.json +++ b/packages/host-container/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-container", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Host container for hosting and managing products within the Polkadot ecosystem.", "license": "Apache-2.0", "repository": { @@ -28,7 +28,7 @@ "@noble/hashes": "2.2.0", "polkadot-api": ">=2", "@polkadot-api/substrate-client": "^0.7.0", - "@novasamatech/host-api": "0.7.7", + "@novasamatech/host-api": "0.7.8", "nanoid": "5.1.9", "neverthrow": "^8.2.0" }, diff --git a/packages/host-container/src/chainConnectionManager.spec.ts b/packages/host-container/src/chainConnectionManager.spec.ts index ba0ec168..2ef98dec 100644 --- a/packages/host-container/src/chainConnectionManager.spec.ts +++ b/packages/host-container/src/chainConnectionManager.spec.ts @@ -164,6 +164,82 @@ describe('chainConnectionManager', () => { mock.simulateMessage({ jsonrpc: '2.0', id: followCalls[1]!.id, result: 'sub-id-2' }); expect(manager.hasActiveFollow(GENESIS)).toBe(true); }); + + it('routes follow events to the new listener after stop+refollow (regression: best blocks must keep flowing)', () => { + // Reproduces the user-reported scenario: WS reconnect produces a Stop, + // the papp refollows, and subsequent chain events (notably + // bestBlockChanged) must reach the NEW listener under the NEW chainSubId. + const mock = createMockProvider(); + const manager = createChainConnectionManager(() => mock.provider); + + const firstEvents: unknown[] = []; + const secondEvents: unknown[] = []; + + manager.getOrCreateChain(GENESIS); + manager.startFollow(GENESIS, true, e => firstEvents.push(e)); + mock.simulateMessage({ jsonrpc: '2.0', id: findCallId(mock, 'chainHead_v1_follow'), result: 'sub-id-1' }); + + // Sanity: events on the first follow reach the first listener. + mock.simulateMessage({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + params: { subscription: 'sub-id-1', result: { event: 'bestBlockChanged', bestBlockHash: '0xaa' } }, + }); + expect(firstEvents).toContainEqual({ event: 'bestBlockChanged', bestBlockHash: '0xaa' }); + + // Stop kills the first follow. + mock.simulateMessage({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + params: { subscription: 'sub-id-1', result: { event: 'stop' } }, + }); + + // Papp refollows with a fresh listener. + manager.startFollow(GENESIS, true, e => secondEvents.push(e)); + const followCalls = sentMessages(mock).filter(m => m.method === 'chainHead_v1_follow'); + expect(followCalls).toHaveLength(2); + mock.simulateMessage({ jsonrpc: '2.0', id: followCalls[1]!.id, result: 'sub-id-2' }); + + // Server now streams events under the NEW chainSubId. + mock.simulateMessage({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + params: { + subscription: 'sub-id-2', + result: { + event: 'initialized', + finalizedBlockHashes: ['0xbb'], + finalizedBlockRuntime: { + type: 'valid', + spec: { specName: 'x', implName: 'y', specVersion: 1, implVersion: 1, apis: {} }, + }, + }, + }, + }); + mock.simulateMessage({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + params: { + subscription: 'sub-id-2', + result: { event: 'newBlock', blockHash: '0xcc', parentBlockHash: '0xbb' }, + }, + }); + mock.simulateMessage({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + params: { subscription: 'sub-id-2', result: { event: 'bestBlockChanged', bestBlockHash: '0xcc' } }, + }); + + // The new listener must receive the new follow's events. + expect(secondEvents).toContainEqual(expect.objectContaining({ event: 'initialized' })); + expect(secondEvents).toContainEqual({ event: 'newBlock', blockHash: '0xcc', parentBlockHash: '0xbb' }); + expect(secondEvents).toContainEqual({ event: 'bestBlockChanged', bestBlockHash: '0xcc' }); + + // Old listener must NOT receive events from the new follow — leaking + // sub-id-2 events to the dead first listener would mean substrate-client + // never cleared the old subscription handle. + expect(firstEvents).not.toContainEqual({ event: 'bestBlockChanged', bestBlockHash: '0xcc' }); + }); }); describe('chainHeadOp', () => { diff --git a/packages/host-papp-react-ui/package.json b/packages/host-papp-react-ui/package.json index fe4a91ad..87b36454 100644 --- a/packages/host-papp-react-ui/package.json +++ b/packages/host-papp-react-ui/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-papp-react-ui", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Polkadot app UI Flow", "license": "Apache-2.0", "repository": { @@ -30,8 +30,8 @@ "react-dom": ">=18" }, "dependencies": { - "@novasamatech/host-papp": "0.7.7", - "@novasamatech/statement-store": "0.7.7", + "@novasamatech/host-papp": "0.7.8", + "@novasamatech/statement-store": "0.7.8", "@polkadot-api/utils": "^0.4.0", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-popover": "1.1.15", diff --git a/packages/host-papp/.papi/descriptors/dist/common-types.d.ts b/packages/host-papp/.papi/descriptors/dist/common-types.d.ts index c7768f6d..a5c65f2e 100644 --- a/packages/host-papp/.papi/descriptors/dist/common-types.d.ts +++ b/packages/host-papp/.papi/descriptors/dist/common-types.d.ts @@ -41,46 +41,9 @@ export type DigestItem = Enum<{ }>; export declare const DigestItem: GetEnum; export type I82jm9g7pufuel = [SizedHex<4>, Uint8Array]; -export type If3cj9t96ueeqn = Array<{ +export type Ia9ctkgrquvhdh = Array<{ "phase": Phase; - "event": Enum<{ - "System": Anonymize; - "ParachainSystem": Anonymize; - "Balances": Anonymize; - "TransactionPayment": TransactionPaymentEvent; - "SkipFeelessPayment": Anonymize; - "OriginRestriction": Anonymize; - "Assets": Anonymize; - "AssetsHolder": Anonymize; - "AssetRate": Anonymize; - "AssetTxPayment": Anonymize; - "CollatorSelection": Anonymize; - "Session": Anonymize; - "XcmpQueue": Anonymize; - "PolkadotXcm": Anonymize; - "CumulusXcm": Anonymize; - "MessageQueue": Anonymize; - "Utility": Anonymize; - "Multisig": Anonymize; - "Sudo": Anonymize; - "Proxy": Anonymize; - "Identity": Anonymize; - "People": Anonymize; - "MobRule": Anonymize; - "ProofOfInk": Anonymize; - "Game": Anonymize; - "Score": Anonymize; - "DummyDim": Anonymize; - "PeopleLite": Anonymize; - "Resources": Anonymize; - "ChunksManager": Anonymize; - "Members": Anonymize; - "Coinage": Anonymize; - "StorageInitialization": Anonymize; - "StorageInitializationLite": Anonymize; - "Airdrop": Anonymize; - "MultiBlockMigrations": Anonymize; - }>; + "event": Anonymize; "topics": Anonymize; }>; export type Phase = Enum<{ @@ -89,7 +52,46 @@ export type Phase = Enum<{ "Initialization": undefined; }>; export declare const Phase: GetEnum; -export type Ifofu507b4ql2m = AnonymousEnum<{ +export type I82glou9nvbdu6 = AnonymousEnum<{ + "System": Anonymize; + "ParachainSystem": Anonymize; + "Balances": Anonymize; + "TransactionPayment": TransactionPaymentEvent; + "SkipFeelessPayment": Anonymize; + "OriginRestriction": Anonymize; + "Assets": Anonymize; + "AssetsHolder": Anonymize; + "AssetRate": Anonymize; + "AssetTxPayment": Anonymize; + "CollatorSelection": Anonymize; + "Session": Anonymize; + "XcmpQueue": Anonymize; + "PolkadotXcm": Anonymize; + "CumulusXcm": Anonymize; + "MessageQueue": Anonymize; + "Utility": Anonymize; + "Multisig": Anonymize; + "Sudo": Anonymize; + "Proxy": Anonymize; + "Identity": Anonymize; + "People": Anonymize; + "MobRule": Anonymize; + "ProofOfInk": Anonymize; + "Game": Anonymize; + "Score": Anonymize; + "DummyDim": Anonymize; + "PeopleLite": Anonymize; + "Resources": Anonymize; + "ChunksManager": Anonymize; + "Members": Anonymize; + "Coinage": Anonymize; + "MembersNotifier": Anonymize; + "StorageInitialization": Anonymize; + "StorageInitializationLite": Anonymize; + "Airdrop": Anonymize; + "MultiBlockMigrations": Anonymize; +}>; +export type Icr5gatejcin46 = AnonymousEnum<{ /** * An extrinsic completed successfully. */ @@ -97,11 +99,11 @@ export type Ifofu507b4ql2m = AnonymousEnum<{ /** * An extrinsic failed. */ - "ExtrinsicFailed": Anonymize; + "ExtrinsicFailed": Anonymize; /** - * `:code` was updated. + * `:code` was updated to the code with the given hash. */ - "CodeUpdated": undefined; + "CodeUpdated": Anonymize; /** * A new account was created. */ @@ -121,7 +123,7 @@ export type Ifofu507b4ql2m = AnonymousEnum<{ /** * An invalid authorized upgrade was rejected while trying to apply it. */ - "RejectedInvalidAuthorizedUpgrade": Anonymize; + "RejectedInvalidAuthorizedUpgrade": Anonymize; }>; export type Ia82mnkmeo2rhc = { "dispatch_info": Anonymize; @@ -129,10 +131,7 @@ export type Ia82mnkmeo2rhc = { export type Ic9s8f85vjtncc = { "weight": Anonymize; "class": DispatchClass; - "pays_fee": Enum<{ - "Yes": undefined; - "No": undefined; - }>; + "pays_fee": Anonymize; }; export type DispatchClass = Enum<{ "Normal": undefined; @@ -140,11 +139,15 @@ export type DispatchClass = Enum<{ "Mandatory": undefined; }>; export declare const DispatchClass: GetEnum; -export type I9rkcukfi09eph = { - "dispatch_error": Anonymize; +export type Iehg04bj71rkd = AnonymousEnum<{ + "Yes": undefined; + "No": undefined; +}>; +export type I682dmd1dh82o7 = { + "dispatch_error": Anonymize; "dispatch_info": Anonymize; }; -export type I5pvq44l06a3og = AnonymousEnum<{ +export type Ib1rdh37tsufsr = AnonymousEnum<{ "Other": undefined; "CannotLookup": undefined; "BadOrigin": undefined; @@ -177,20 +180,21 @@ export type I5pvq44l06a3og = AnonymousEnum<{ "VerifySignature": undefined; "Proxy": Anonymize; "Identity": Anonymize; - "People": Anonymize; + "People": Anonymize; "MobRule": Anonymize; "ProofOfInk": Anonymize; - "Game": Anonymize; + "Game": Anonymize; "Score": Anonymize; "DummyDim": Anonymize; - "PeopleLite": Anonymize; - "Resources": Anonymize; + "PeopleLite": Anonymize; + "Resources": Anonymize; "ChunksManager": Anonymize; - "Members": Anonymize; - "Coinage": Anonymize; + "Members": Anonymize; + "Coinage": Anonymize; + "MembersNotifier": Anonymize; "StorageInitialization": undefined; "StorageInitializationLite": undefined; - "Airdrop": Anonymize; + "Airdrop": Anonymize; "MultiBlockMigrations": Anonymize; }>; "ConsumerRemaining": undefined; @@ -1064,7 +1068,7 @@ export type I6ngmnhrhffg3o = AnonymousEnum<{ */ "UsernameJudgementOngoing": undefined; }>; -export type I4mhu1059shhs0 = AnonymousEnum<{ +export type I7crjg7o7jiji6 = AnonymousEnum<{ /** * The supplied identifier does not represent a person. */ @@ -1165,6 +1169,10 @@ export type I4mhu1059shhs0 = AnonymousEnum<{ * Cannot merge rings while a suspension session is in progress. */ "SuspensionSessionInProgress": undefined; + /** + * The alias mapping is not stale. + */ + "AliasNotStale": undefined; /** * Call is too late or too early. */ @@ -1202,6 +1210,14 @@ export type I4mhu1059shhs0 = AnonymousEnum<{ * The people collection has already been created. */ "PeopleCollectionAlreadyExists": undefined; + /** + * The provided alias does not match the account's current alias mapping. + */ + "AliasMismatch": undefined; + /** + * None of the supplied aliases were stale. + */ + "NoStaleAliases": undefined; }>; export type I940ulmo4j2d84 = AnonymousEnum<{ /** @@ -1447,7 +1463,7 @@ export type Icouc1975ac8ae = AnonymousEnum<{ */ "InvalidReimbursementValues": undefined; }>; -export type Ib2m42ffigj3u7 = AnonymousEnum<{ +export type Is6cds08sq63f = AnonymousEnum<{ /** * Game ongoing. */ @@ -1556,6 +1572,36 @@ export type Ib2m42ffigj3u7 = AnonymousEnum<{ * Invalid state */ "InvalidState": undefined; + /** + * No concluded game with available scratch card rewards. + */ + "NoScratchReward": undefined; + /** + * The player is not eligible for the current scratch card reward. + */ + "NotEligible": undefined; + /** + * The person did not win the scratch card for this game. + */ + "DidNotWin": undefined; + /** + * The alias has already claimed a scratch card reward. + */ + "AlreadyClaimed": undefined; + /** + * The scratch card pot balance is zero. + */ + "ScratchPotEmpty": undefined; + /** + * `claim_game_prize`: `pool_id` is not a `GameParticipants` pool (or no + * such pool exists). + */ + "PoolNotForGame": undefined; + /** + * `claim_game_prize`: the resolved origin identity has no recorded + * attendance for the pool's game. + */ + "NotParticipant": undefined; }>; export type Ib3125ra6v0rq0 = AnonymousEnum<{ /** @@ -1661,7 +1707,7 @@ export type I4dumqe8b5q0ce = AnonymousEnum<{ */ "TooManyPeople": undefined; }>; -export type I5mjfroiq2c71i = AnonymousEnum<{ +export type I3tva1ioru4b0 = AnonymousEnum<{ /** * No attestation allowance. */ @@ -1678,8 +1724,36 @@ export type I5mjfroiq2c71i = AnonymousEnum<{ * The candidate is already registered. */ "AlreadyRegistered": undefined; + /** + * The ring VRF key is already enrolled by another lite person. + */ + "KeyAlreadyInUse": undefined; + /** + * The account is already in use. + */ + "AccountInUse": undefined; + /** + * The alias <-> account mapping is already set and current. + */ + "AliasAccountAlreadySet": undefined; + /** + * The alias <-> account mapping is not set. + */ + "AliasAccountNotSet": undefined; + /** + * The requested alias setup block window is invalid for the current block. + */ + "CallBlockOutOfRange": undefined; + /** + * The alias context is invalid. + */ + "InvalidAliasContext": undefined; + /** + * The lite people member collection has not been initialized yet. + */ + "LitePeopleCollectionNotCreated": undefined; }>; -export type Ifu2j71jv4roq4 = AnonymousEnum<{ +export type I3lcis8epk78u = AnonymousEnum<{ /** * Username does not fit the requirements. */ @@ -1732,14 +1806,6 @@ export type Ifu2j71jv4roq4 = AnonymousEnum<{ * The lite consumer is already linked to a full person consumer. */ "AlreadyLinked": undefined; - /** - * The requested slot number is out of range. - */ - "InvalidSlot": undefined; - /** - * The account already has an allowance in the slot. - */ - "AccountAlreadyHasAllowance": undefined; /** * The person's authorization has not expired yet. */ @@ -1760,6 +1826,30 @@ export type Ifu2j71jv4roq4 = AnonymousEnum<{ * Account already has a reservation for another username. */ "AlreadyHasReservation": undefined; + /** + * Friend request sequence is invalid for the consumer. + */ + "InvalidFriendRequestSequence": undefined; + /** + * Friend request period is not the current period. + */ + "InvalidFriendRequestPeriod": undefined; + /** + * Friend request registration is not expired yet. + */ + "FriendRequestRegistrationNotExpired": undefined; + /** + * Friend request registration already exists for the alias/context. + */ + "FriendRequestRegistrationAlreadyExists": undefined; + /** + * The replacement cooldown has not elapsed since the entry was last set. + */ + "StmtStoreReplacementTooEarly": undefined; + /** + * The provided `limit` exceeds `LongTermStorageCleanupLimit`. + */ + "LongTermStorageCleanupLimitExceeded": undefined; }>; export type I81gtj1f3ennke = AnonymousEnum<{ /** @@ -1775,7 +1865,7 @@ export type I81gtj1f3ennke = AnonymousEnum<{ */ "InvalidChunkRange": undefined; }>; -export type Ibul94l5l6rt51 = AnonymousEnum<{ +export type Idecbp1bqjv3s9 = AnonymousEnum<{ /** * The supplied identifier does not represent a member. */ @@ -1792,10 +1882,6 @@ export type Ibul94l5l6rt51 = AnonymousEnum<{ * The root cannot be finalized as there are still unpushed members. */ "Incomplete": undefined; - /** - * The root is still fresh. - */ - "StillFresh": undefined; /** * Too many members have been pushed. */ @@ -1885,8 +1971,16 @@ export type Ibul94l5l6rt51 = AnonymousEnum<{ * The caller is not the owner of the collection. */ "NotCollectionOwner": undefined; + /** + * The member is not in the onboarding queue. + */ + "NotOnboarding": undefined; + /** + * There is no ring root to build. + */ + "NothingToBuild": undefined; }>; -export type I49gv5a5vl0e9 = AnonymousEnum<{ +export type I3jrk6qdrhg23e = AnonymousEnum<{ "MemberKeyAlreadyUsed": undefined; "InvalidMemberKey": undefined; "InternalError": undefined; @@ -1897,6 +1991,11 @@ export type I49gv5a5vl0e9 = AnonymousEnum<{ "CoinValueTooSmall": undefined; "CoinValueIsLessThanFee": undefined; "CoinValueOutOfBound": undefined; + /** + * The coin value cannot be losslessly converted to an asset amount because + * `UnderlyingAssetUnit` is not evenly divisible by `2^|value|`. + */ + "LossyCoinValueConversion": undefined; "InvalidAliasProof": undefined; "NoUnloadingRecycler": undefined; "ProofAndAliasMismatch": undefined; @@ -1927,44 +2026,139 @@ export type I49gv5a5vl0e9 = AnonymousEnum<{ */ "FreshCoinRequired": undefined; "CannotConvertNativeToAsset": undefined; + /** + * When using Prepaid fee mode, max_fee must be 0. + */ + "MaxFeeNotAllowedForPrepaid": undefined; + /** + * The max_fee exceeds the total input value. + */ + "MaxFeeExceedsInput": undefined; + /** + * The max fee argument doesn't satisfy the requirements. + */ + "InvalidMaxFee": undefined; + /** + * The recycler collection does not exist and could not be created on-demand. + */ + "CannotCreateRecyclerCollection": undefined; }>; -export type I78qr63roofevv = AnonymousEnum<{ +export type Id2ueql1n8r6lh = AnonymousEnum<{ + /** + * Subscriber not found. + */ + "SubscriberNotFound": undefined; + /** + * Subscriber already exists. + */ + "AlreadySubscribed": undefined; + /** + * Maximum subscribers reached. + */ + "TooManySubscribers": undefined; + /** + * Collections list must be sorted in strictly ascending order with no duplicates. + */ + "InvalidCollectionsList": undefined; + /** + * Too many ring root updates to fit in a single batch. + */ + "TooManyUpdates": undefined; /** - * No active airdrop event. + * XCM send failed. */ - "NoActiveEvent": undefined; + "XcmSendFailed": undefined; /** - * The origin is not a person. + * Subscriber is not subscribed to the requested collection. */ - "NotAPerson": undefined; + "NotSubscribedToCollection": undefined; /** - * The alias is already registered. + * Ring root index is out of range. */ - "AliasAlreadyRegistered": undefined; + "InvalidRingIndex": undefined; /** - * The event registration time is invalid. + * Requested updates exceed the subscriber's HRMP channel capacity. */ - "InvalidEventRegistrationTime": undefined; + "ExceedsChannelCapacity": undefined; /** - * Participant ID overflow. + * No active batch exists. */ - "ParticipantIdOverflow": undefined; + "NoBatchActive": undefined; /** - * The participant has no prize to claim for the event. + * No pending initialization for this subscriber. */ - "NoPrizeToClaimForEvent": undefined; + "NoPendingInit": undefined; /** - * The event doesn't exist. + * Replay cooldown has not elapsed for this subscriber and collection. */ - "NoEventFound": undefined; + "ReplayCooldownActive": undefined; /** - * The schedule is full. + * Replay requested with an empty list of ring root indices. */ - "ScheduleFull": undefined; + "EmptyRingIndices": undefined; +}>; +export type Ia79u794e6j2gt = AnonymousEnum<{ /** - * The prize must be more or equal to the minimum balance. + * The prize must be at least the asset's minimum balance. */ "PrizeMustBeMoreOrEqualToMinBalance": undefined; + /** + * Validity exceeds `MaxValiditySeconds`. + */ + "ValidityTooLong": undefined; + /** + * Validity is below `MinValiditySeconds`. + */ + "ValidityTooShort": undefined; + /** + * `num_prizes` must be greater than zero. + */ + "NoPrizes": undefined; + /** + * Funding account does not cover `prize_value * num_prizes`. + */ + "InsufficientFunds": undefined; + /** + * `MAX_CONCURRENT_PRIZE_POOLS` is full. + */ + "TooManyConcurrentPrizePools": undefined; + /** + * `pool_id` is not in `PrizePools`. + */ + "NoSuchPrizePool": undefined; + /** + * Prize pool has expired (`now >= expires_at`). + */ + "PrizePoolExpired": undefined; + /** + * Prize pool has no remaining prizes. + */ + "PrizePoolExhausted": undefined; + /** + * Caller's identity has already claimed from this pool. + */ + "AlreadyClaimed": undefined; + /** + * Arithmetic overflow when computing the per-pool hold amount. + */ + "PoolValueOverflow": undefined; + /** + * [`AirdropApi::claim_game_prize`] was called on a pool whose target is not + * `GameParticipants` (the trait method is for game pools only). + */ + "WrongTarget": undefined; + /** + * Claimant's winner-hash is not below the pool's threshold. + */ + "DidNotWin": undefined; + /** + * Ring-membership proof failed to verify against `PEOPLE_LITE_IDENTIFIER`. + */ + "InvalidProof": undefined; + /** + * Supplied `alias` does not match the alias the proof verifies to. + */ + "AliasMismatch": undefined; }>; export type Iaaqq5jevtahm8 = AnonymousEnum<{ /** @@ -1996,6 +2190,9 @@ export type TransactionalError = Enum<{ "NoLayer": undefined; }>; export declare const TransactionalError: GetEnum; +export type I1jm8m1rh9e20v = { + "hash": SizedHex<32>; +}; export type Icbccs0ug47ilf = { "account": SS58String; }; @@ -2007,9 +2204,9 @@ export type Ibgl04rn6nbfm6 = { "code_hash": SizedHex<32>; "check_version": boolean; }; -export type I3sflsrdvuq35i = { +export type I38icn8oj6uv8q = { "code_hash": SizedHex<32>; - "error": Anonymize; + "error": Anonymize; }; export type Icbsekf57miplo = AnonymousEnum<{ /** @@ -2279,16 +2476,16 @@ export type Ier2cke86dqbr2 = { "actual_fee": bigint; "tip": bigint; }; -export type Ie86pdva84devd = AnonymousEnum<{ +export type Iaa6hgkkd01gkt = AnonymousEnum<{ /** * A transaction fee was skipped. */ - "FeeSkipped": Anonymize; + "FeeSkipped": Anonymize; }>; -export type Ibsq380ld6eu40 = { - "origin": Anonymize; +export type Iblesbqf0lfloi = { + "origin": Anonymize; }; -export type Idg7v9f2eslg1v = AnonymousEnum<{ +export type I3l05tjm1loph7 = AnonymousEnum<{ "system": Enum<{ "Root": undefined; "Signed": SS58String; @@ -2320,9 +2517,16 @@ export type Idg7v9f2eslg1v = AnonymousEnum<{ }>; "PeopleLite": Enum<{ "LitePerson": SS58String; + "LiteAlias": Anonymize; + }>; + "Resources": Enum<{ + "FriendRequestAlias": SizedHex<32>; + "StmtStoreAlias": SizedHex<32>; + "LongTermStorageClaim": [SizedHex<32>, Anonymize]; }>; "Members": Enum<{ "MemberAlias": [SizedHex<32>, Anonymize]; + "SelfInclude": SizedHex<32>; }>; "Coinage": Enum<{ "Coin": { @@ -2340,6 +2544,7 @@ export type Idg7v9f2eslg1v = AnonymousEnum<{ }; }>; }; + "InfallibleUnpaidSigned": Anonymize; }>; }>; export type If9iqq7i64mur8 = { @@ -2446,6 +2651,10 @@ export type Icq9999ubti4jr = { "alias": SizedHex<32>; "context": SizedHex<32>; }; +export type I7fnmgdak2nuqf = AnonymousEnum<{ + "People": undefined; + "LitePeople": undefined; +}>; export type I6sjgjftjavcbd = { "value": number; "age": number; @@ -2468,7 +2677,7 @@ export type I8arc778cv9pqq = AnonymousEnum<{ "InvitedCandidate": SS58String; "LitePerson": SS58String; }>; -export type I7r4u2ebvv7606 = AnonymousEnum<{ +export type I4nr69fhfof48s = AnonymousEnum<{ /** * Some asset class was created. */ @@ -2582,6 +2791,22 @@ export type I7r4u2ebvv7606 = AnonymousEnum<{ * Reserve information was removed for `asset_id`. */ "ReservesRemoved": Anonymize; + /** + * Some assets were issued as Credit (no owner yet). + */ + "IssuedCredit": Anonymize; + /** + * Some assets Credit was destroyed. + */ + "BurnedCredit": Anonymize; + /** + * Some assets were burned and a Debt was created. + */ + "IssuedDebt": Anonymize; + /** + * Some assets Debt was destroyed (and assets issued). + */ + "BurnedDebt": Anonymize; }>; export type Icqe266pmnr25o = { "asset_id": Anonymize; @@ -2678,6 +2903,10 @@ export type If2801grpltbp8 = Array<{ "reserve": Anonymize; "teleportable": boolean; }>; +export type Ibtugueatkkr9s = { + "asset_id": Anonymize; + "amount": bigint; +}; export type I7jvog6mrt6b2r = AnonymousEnum<{ /** * `who`s balance on hold was increased by `amount`. @@ -3599,12 +3828,12 @@ export type I7tmrp94r9sq4n = { */ "index": number; }; -export type Idul53tft5reqc = AnonymousEnum<{ +export type Ifjmvqjqd1bhpl = AnonymousEnum<{ /** * Batch of dispatches did not complete fully. Index of first failing dispatch given, as * well as the error. */ - "BatchInterrupted": Anonymize; + "BatchInterrupted": Anonymize; /** * Batch of dispatches completed fully with no error. */ @@ -3620,11 +3849,11 @@ export type Idul53tft5reqc = AnonymousEnum<{ /** * A single item within a Batch of dispatches has completed with error. */ - "ItemFailed": Anonymize; + "ItemFailed": Anonymize; /** * A call was dispatched. */ - "DispatchedAs": Anonymize; + "DispatchedAs": Anonymize; /** * Main call was dispatched. */ @@ -3632,23 +3861,23 @@ export type Idul53tft5reqc = AnonymousEnum<{ /** * The fallback call was dispatched. */ - "IfElseFallbackCalled": Anonymize; + "IfElseFallbackCalled": Anonymize; }>; -export type I79le71ktscd50 = { +export type I66uqe1tndt513 = { "index": number; - "error": Anonymize; + "error": Anonymize; }; -export type I70ckf4r79j73 = { - "error": Anonymize; +export type I9m3mb6r2i2eeq = { + "error": Anonymize; }; -export type Id9b74nn3tchdg = { - "result": Anonymize; +export type Idbn36j11p05sj = { + "result": Anonymize; }; -export type I42nm2din5rq69 = ResultPayload>; -export type Ian9q7t9erse0r = { - "main_error": Anonymize; +export type Ie2ve0lvajsd9s = ResultPayload>; +export type I12la7j60vkuj3 = { + "main_error": Anonymize; }; -export type Id871khc9is0ck = AnonymousEnum<{ +export type I9244tqnhb14kl = AnonymousEnum<{ /** * A new multisig operation has begun. */ @@ -3660,7 +3889,7 @@ export type Id871khc9is0ck = AnonymousEnum<{ /** * A multisig operation has been executed. */ - "MultisigExecuted": Anonymize; + "MultisigExecuted": Anonymize; /** * A multisig operation has been cancelled. */ @@ -3685,12 +3914,12 @@ export type Itvprrpb0nm3o = { "height": number; "index": number; }; -export type I1ujdbplbo9mv = { +export type I8ktnt89fcg3hj = { "approving": SS58String; "timepoint": Anonymize; "multisig": SS58String; "call_hash": SizedHex<32>; - "result": Anonymize; + "result": Anonymize; }; export type I5qolde99acmd1 = { "cancelling": SS58String; @@ -3704,11 +3933,11 @@ export type I8gtde5abn1g9a = { "old_deposit": bigint; "new_deposit": bigint; }; -export type I7vk784dpkt0sh = AnonymousEnum<{ +export type I32iah2j2m52t5 = AnonymousEnum<{ /** * A sudo call just took place. */ - "Sudid": Anonymize; + "Sudid": Anonymize; /** * The sudo key has been updated. */ @@ -3720,13 +3949,13 @@ export type I7vk784dpkt0sh = AnonymousEnum<{ /** * A [sudo_as](Pallet::sudo_as) call just took place. */ - "SudoAsDone": Anonymize; + "SudoAsDone": Anonymize; }>; -export type I2006ti8jidts7 = { +export type I6fn8r3em1pi9r = { /** * The result of the call made by the sudo user. */ - "sudo_result": Anonymize; + "sudo_result": Anonymize; }; export type I5rtkmhm2dng4u = { /** @@ -3739,11 +3968,11 @@ export type I5rtkmhm2dng4u = { "new": SS58String; }; export type Ihfphjolmsqq1 = (SS58String) | undefined; -export type I81tnet08pjf8d = AnonymousEnum<{ +export type I835iaql6082vl = AnonymousEnum<{ /** * A proxy was executed correctly, with the given. */ - "ProxyExecuted": Anonymize; + "ProxyExecuted": Anonymize; /** * A pure account has been created by new proxy with given * disambiguation index and proxy type. @@ -4014,7 +4243,7 @@ export type Id32895epm7otq = AnonymousEnum<{ }>; "Contempt": undefined; }>; -export type I8gfuga4as8uuv = AnonymousEnum<{ +export type Idundv7m4eqe4f = AnonymousEnum<{ /** * An individual has had their personhood recognised and indexed. */ @@ -4051,6 +4280,10 @@ export type I8gfuga4as8uuv = AnonymousEnum<{ * Personhood was forcefully recognized by root. */ "ForcePersonhoodRecognized": Anonymize; + /** + * An alias-to-account mapping was cleaned up. + */ + "AliasCleanedUp": Anonymize; }>; export type I53pb13fh9bdtb = { "who": bigint; @@ -4068,7 +4301,7 @@ export type I6tuqjmsr5ahcq = { "people": Anonymize; }; export type Ic5m5lp1oioo8r = Array>; -export type I1d3k986qbgsge = AnonymousEnum<{ +export type Ifim1d8ge5bt7k = AnonymousEnum<{ /** * A case has been created. */ @@ -4076,7 +4309,7 @@ export type I1d3k986qbgsge = AnonymousEnum<{ /** * A callback was triggered from mob-rule. */ - "Callback": Anonymize; + "Callback": Anonymize; /** * There was a codec error when trying to execute the callback. */ @@ -4440,7 +4673,7 @@ export type I63ubv9qb76gl3 = { "init_alloc_count": number; "timeout": number; }; -export type I13i6a99rj37i4 = AnonymousEnum<{ +export type I3jh9ku4488ni8 = AnonymousEnum<{ /** * A new game is starting. */ @@ -4497,6 +4730,22 @@ export type I13i6a99rj37i4 = AnonymousEnum<{ * Some invites have been removed for the inviter, some are remaining. */ "SomeInvitesRemoved": Anonymize; + /** + * Scratch card rewards are available for the concluded game. + */ + "ScratchRewardAvailable": Anonymize; + /** + * A player successfully claimed a scratch card reward. + */ + "ScratchRewardClaimed": Anonymize; + /** + * A new game opened a recurring-prize pool in the airdrop pallet. + */ + "GamePrizePoolOpened": Anonymize; + /** + * `new_game` could not open its companion prize pool. The game still starts. + */ + "GamePrizePoolOpenFailed": Anonymize; }>; export type I4dge44jia159s = { "registration_ends": number; @@ -4520,6 +4769,21 @@ export type Ibi26id9j1t520 = { export type Ic9lb0ksm6bqp9 = { "game_play_time": number; }; +export type I8s2eo7q9t6vgf = { + "game_index": number; +}; +export type Idscf6boak49q1 = { + "beneficiary": SS58String; + "amount": bigint; +}; +export type Iet3fv7oighgft = { + "game_index": number; + "pool_id": number; +}; +export type I6kmurc4thdo8g = { + "game_index": number; + "error": Anonymize; +}; export type If82rqk1ehcsot = AnonymousEnum<{ /** * A person has claimed credit. @@ -4631,7 +4895,7 @@ export type Inci5ucc4j6it = AnonymousEnum<{ export type I4ov6e94l79mbg = { "id": bigint; }; -export type Iat4ai9vs8l9k5 = AnonymousEnum<{ +export type I8rnqb4fs2u0s5 = AnonymousEnum<{ /** * All attestation allowance has been removed for the verifier. */ @@ -4648,6 +4912,14 @@ export type Iat4ai9vs8l9k5 = AnonymousEnum<{ * A lite person was registered as a consumer. */ "ConsumerRegistered": Anonymize; + /** + * An alias-to-account mapping was set or updated. + */ + "AliasAccountSet": Anonymize; + /** + * An alias-to-account mapping was removed. + */ + "AliasAccountUnset": Anonymize; }>; export type I58bu3hm7657hm = { "verifier": SS58String; @@ -4656,7 +4928,7 @@ export type Icc0fkkhtd78sc = { "candidate": SS58String; "verifier": SS58String; }; -export type Ia0v5qonnbfrul = AnonymousEnum<{ +export type Ibdjm4ghdk920m = AnonymousEnum<{ /** * A person has registered as a consumer. */ @@ -4665,6 +4937,14 @@ export type Ia0v5qonnbfrul = AnonymousEnum<{ * A lite person has registered as a consumer. */ "LitePersonRegistered": Anonymize; + /** + * Friend request statement usage has been assigned for a sequence. + */ + "FriendRequestStmtUsageSet": Anonymize; + /** + * Friend request statement usage has been removed. + */ + "FriendRequestStmtUsageRemoved": Anonymize; /** * A person's authorization was touched. */ @@ -4682,18 +4962,41 @@ export type Ia0v5qonnbfrul = AnonymousEnum<{ */ "UsernameReservationDurationSet": Anonymize; /** - * A statement store slot was updated. + * An anonymous statement store allowance was granted. + */ + "StmtStoreAllowanceSet": Anonymize; + /** + * Expired statement store allowances were cleaned up. */ - "StmtStoreSlotUpdated": Anonymize; + "StmtStoreAllowancesCleared": Anonymize; /** * A full person was demoted due to expired authorization. */ "PersonDemoted": Anonymize; + /** + * Long-term storage has been claimed for an account. + */ + "LongTermStorageClaimed": Anonymize; + /** + * A long-term storage claim was accepted but the downstream allocation failed. The alias + * is still marked spent for the period. + */ + "LongTermStorageAllocationFailed": Anonymize; + /** + * Expired long-term storage aliases have been cleared for a period. + */ + "LongTermStorageAliasesCleared": Anonymize; }>; export type I9vf1so75dnrom = { "alias": SizedHex<32>; "account": SS58String; }; +export type I9hg8vptgbqai = { + "alias": SizedHex<32>; + "period": number; + "seq": number; + "account": SS58String; +}; export type I28tfrqrmts741 = { "username": Uint8Array; "account": SS58String; @@ -4701,9 +5004,21 @@ export type I28tfrqrmts741 = { export type I1i6t85s8phv1c = { "duration": bigint; }; -export type I9lf1r3fch8ino = { +export type I16m4f7hclkkad = { + "period": number; + "first_key": SizedHex<32>; + "count": number; +}; +export type I5dvnb65dm4f56 = { + "alias": SizedHex<32>; + "period": number; + "counter": number; "account": SS58String; - "slot_number": number; + "collection": Anonymize; +}; +export type I2abip8j5bmg27 = { + "period": number; + "count": number; }; export type I2g1s4krv9s4p2 = AnonymousEnum<{ /** @@ -4729,7 +5044,7 @@ export type I3ns5kg6jo268n = { "start_index": number; "count": number; }; -export type I5t3lr0t9e1sk = AnonymousEnum<{ +export type If4h4847mmr709 = AnonymousEnum<{ /** * An entity has had their membership recognised and indexed. */ @@ -4747,11 +5062,11 @@ export type I5t3lr0t9e1sk = AnonymousEnum<{ */ "CollectionDeleted": Anonymize; /** - * A ring was built manually. + * A ring root was built. */ "RingBuilt": Anonymize; /** - * Members were onboarded manually. + * Members were onboarded. */ "MembersOnboarded": Anonymize; /** @@ -4762,6 +5077,14 @@ export type I5t3lr0t9e1sk = AnonymousEnum<{ * The onboarding size was set for a collection. */ "OnboardingSizeSet": Anonymize; + /** + * A member self-included into a ring. + */ + "MemberSelfIncluded": Anonymize; + /** + * An old root revision has been cleaned up. + */ + "OldRootCleanedUp": Anonymize; }>; export type I7hu7hl7r35nrm = { "key": SizedHex<32>; @@ -4782,13 +5105,23 @@ export type Ichkkipipv6vbf = { "identifier": SizedHex<32>; "onboarding_size": number; }; -export type Ibhe0l6jcu2ska = AnonymousEnum<{ +export type Ia783as0f2ls27 = { + "identifier": SizedHex<32>; + "key": SizedHex<32>; +}; +export type I298u2lqese6h0 = { + "identifier": SizedHex<32>; + "ring_index": number; + "revision": number; +}; +export type Icpqn6nu23ut66 = AnonymousEnum<{ "CoinSplit": Anonymize; "CoinTransferred": Anonymize; "RecyclerLoadedWithCoin": Anonymize; "RecyclerLoadedWithExternalAsset": Anonymize; "RecyclerUnloadedIntoCoin": Anonymize; "RecyclerUnloadedIntoExternalAsset": Anonymize; + "RecyclerUnloadedIntoExternalAssetAndVouchers": Anonymize; "PaidUnloadTokenRegisteredWithCoin": Anonymize; "PaidUnloadTokenRegisteredWithNative": Anonymize; "PaidUnloadTokenRegisteredWithStable": Anonymize; @@ -4834,6 +5167,13 @@ export type Ie2d9d2u1qa7ro = { "input_count": number; "amount": bigint; }; +export type Iebdi09jg1ifvr = { + "to": SS58String; + "value": number; + "input_count": number; + "external_asset_amount": bigint; + "voucher_count": number; +}; export type I5kek6hgenovr0 = { "fee": bigint; "destroyed": bigint; @@ -4880,7 +5220,48 @@ export type I7315hlp5liq47 = { "period": number; "ring_index": number; }; -export type I41rd0clbf4u3l = AnonymousEnum<{ +export type Ieg96uk2l11u40 = AnonymousEnum<{ + /** + * A parachain subscribed. + */ + "Subscribed": Anonymize; + /** + * A parachain unsubscribed. + */ + "Unsubscribed": Anonymize; + /** + * Update batch sent to subscriber. + */ + "UpdatesSent": Anonymize; + /** + * Sending ring root updates to a subscriber failed. + */ + "UpdateSendFailed": Anonymize; + /** + * Replay of ring roots requested by a subscriber. + */ + "ReplayRequested": Anonymize; + /** + * A stuck batch was abandoned by the offchain worker. + */ + "BatchAbandoned": Anonymize; +}>; +export type I37r4bdai8o9mp = { + "para_id": number; +}; +export type Ifrvjscp9m1e73 = { + "para_id": number; + "update_count": number; +}; +export type Iamcee9e6bogsv = { + "para_id": number; + "identifier": SizedHex<32>; + "indices_count": number; +}; +export type I2e1ek76m34991 = { + "sequence": bigint; +}; +export type I75687rtju65kk = AnonymousEnum<{ /** * The foreign asset was created and reserves were set. */ @@ -4910,7 +5291,17 @@ export type I41rd0clbf4u3l = AnonymousEnum<{ */ "ScorePayoutsScheduled": undefined; /** - * The on_poll initialization has completed. + * An airdrop prize pool has been opened by the on_poll scheduler. + */ + "AirdropPoolOpened": Anonymize; + /** + * Airdrop scheduling was enabled or disabled via `set_airdrop_scheduling_enabled`. + */ + "AirdropSchedulingEnabledChanged": Anonymize; + /** + * The one-time on_poll initialization has completed. Recurring airdrop prize + * pool opening continues afterward in `OpeningAirdropPools` while + * `AirdropSchedulingEnabled` is `true`. */ "OnPollInitializationCompleted": undefined; /** @@ -4946,94 +5337,90 @@ export type I41rd0clbf4u3l = AnonymousEnum<{ */ "MigrationCompleted": undefined; }>; +export type I931cottvong90 = { + "pool_id": number; +}; +export type I94dejtmu6d72i = { + "enabled": boolean; +}; export type Ieo7gfiinkohj8 = AnonymousEnum<{ /** * Attestation allowances have been set and initialization is complete. */ "InitializationCompleted": undefined; }>; -export type I7055fe1dtfso8 = AnonymousEnum<{ - /** - * A participant registered for an event. - */ - "ParticipantRegistered": Anonymize; +export type I1p385vhhegak3 = AnonymousEnum<{ /** - * The event is started. + * A prize pool was opened. */ - "EventStarted": Anonymize; + "PrizePoolOpened": Anonymize; /** - * The scheduled event is skipped. + * A prize was claimed from a prize pool. `claimant` is the identity that + * satisfied the pool's eligibility predicate — a Person alias for + * [`Call::claim_prize`] (verified-people pools), and whatever + * `AccountOrPerson` the game pallet supplied for game-pool claims via + * [`AirdropApi::claim_game_prize`]. */ - "EventSkipped": Anonymize; + "PrizeClaimed": Anonymize; /** - * An event was scheduled. + * A prize pool delivered its last prize. The pool stays in storage until + * `expires_at` so `PrizePoolClaims` keeps the replay window; further claim + * attempts return `Error::PrizePoolExhausted`. */ - "EventScheduled": Anonymize; + "AllPrizesClaimed": Anonymize; /** - * A scheduled event was removed. + * A prize pool reached `expires_at` and was cleaned up; remaining held funds were + * released. */ - "ScheduledEventRemoved": Anonymize; + "PrizePoolExpired": Anonymize; /** - * A failed transfer prize was claimed. + * A prize pool was closed early by its dispatcher (or `ManagerOrigin`); remaining held + * funds were released. */ - "FailedTransferPrizeClaimed": Anonymize; + "PrizePoolClosed": Anonymize; /** - * The event transitioned to waiting for entropy to build. + * The slot was awarded but the immediate payout transfer failed (e.g. dusted + * beneficiary). The release+transfer was rolled back so the funds remain held + * on the pot, but `PrizePoolClaims` and `prizes_remaining` still reflect the + * claim — the slot is consumed without a recovery path. Emitted in addition + * to `PrizeClaimed`. */ - "WaitingForEntropyToBuild": Anonymize; - /** - * The event transitioned to drawing winners. - */ - "DrawingWinners": Anonymize; - /** - * The event transitioned to distributing prizes. - */ - "Distributing": Anonymize; - /** - * A prize was distributed to a winner. - */ - "PrizeDistributed": Anonymize; - /** - * A prize transfer failed during distribution. - */ - "PrizeDistributionFailed": Anonymize; - /** - * The event transitioned to clearing storage. - */ - "ClearingStorage": Anonymize; - /** - * The event has completed and been removed. - */ - "EventCompleted": Anonymize; + "PrizeTransferFailed": Anonymize; }>; -export type Iflaqn0or9nfpj = { - "event_id": number; - "participant_id": number; - "alias": SizedHex<32>; -}; -export type Ib248pp8oe1coj = { +export type I6fdggv3obvfs5 = { "id": number; - "event": Anonymize; + "dispatcher": SS58String; + "target": Anonymize; + "asset_id": Anonymize; + "num_prizes": number; + "prize_value": bigint; + "expires_at": bigint; +}; +export type I7vnvn4s3p6kuf = AnonymousEnum<{ + "People": undefined; + "GameParticipants": number; +}>; +export type I6uvt8pub5nl1g = { + "pool_id": number; + "claimant": Anonymize; + "beneficiary": SS58String; + "asset_id": Anonymize; + "amount": bigint; }; -export type I41gsc0it2tv5p = AnonymousEnum<{ - "PrizeSet": { - "asset_id": Anonymize; - "asset_amount": bigint; - "winners": number; - }; -}>; -export type Id6g2uejluf2av = { - "event_id": number; +export type Ia9o5rqpv3sn2g = { + "id": number; + "asset_id": Anonymize; }; -export type I6os196hd8lgc2 = { - "who": SS58String; - "event_id": number; +export type Iah53milao1ikg = { + "id": number; + "asset_id": Anonymize; + "refunded": bigint; }; -export type I71gd3i0mgtnp1 = { - "event_id": number; - "dest": SS58String; +export type I25h8dena9rh5c = { + "pool_id": number; + "beneficiary": SS58String; "asset_id": Anonymize; - "asset_amount": bigint; + "amount": bigint; }; export type I94co7vj7h6bo = AnonymousEnum<{ /** @@ -5109,6 +5496,21 @@ export type Ieniouoqkq4icf = { "spec_version": number; "spec_name": string; }; +export type I8re9183nrhr3n = AnonymousEnum<{ + "FullCore": { + "context": number; + }; + "PotentialFullCore": { + "context": number; + "first_transaction_index"?: Anonymize; + "target_weight": Anonymize; + }; + "FractionOfCore": { + "context": number; + "first_transaction_index"?: Anonymize; + }; +}>; +export type I4arjljr6dpflb = (number) | undefined; export type I1v7jbnil3tjns = Array<{ "used_bandwidth": Anonymize; "para_head_hash"?: Anonymize; @@ -5133,7 +5535,6 @@ export type I8jgj1nhcr2dg8 = { "hrmp_watermark"?: Anonymize; "consumed_go_ahead_signal"?: Anonymize; }; -export type I4arjljr6dpflb = (number) | undefined; export type Ifn6q3equiq9qi = { "parent_head": Uint8Array; "relay_parent_number": number; @@ -5194,6 +5595,14 @@ export type I6r5cbv8ttrb09 = Array<{ "recipient": number; "data": Uint8Array; }>; +export type Inofn0qqbjtb9 = { + "relay_storage_root_or_hash": SizedHex<32>; + "core_selector": number; + "bundle_index": number; + "ump_msg_count": number; + "hrmp_outbound_count": number; + "hrmp_outbound_recipients": Anonymize; +}; export type I8ds64oj6581v0 = Array<{ "id": SizedHex<8>; "amount": bigint; @@ -5273,7 +5682,7 @@ export type Ifi4da1gej1fri = Array>; export type Ifvgo9568rpmqc = Array>; export type I8uo3fpd3bcc6f = [SS58String, SizedHex<32>]; export type I6cs1itejju2vv = [bigint, number]; -export type Ib77b0fp1a6mjr = Array<{ +export type I9pvau8qut93lg = Array<{ "recipient": number; "state": Enum<{ "Ok": undefined; @@ -5282,6 +5691,7 @@ export type Ib77b0fp1a6mjr = Array<{ "signals_exist": boolean; "first_index": number; "last_index": number; + "flags": number; }>; export type I5g2vv0ckl2m8b = [number, number]; export type Ifup3lg9ro8a0f = { @@ -5678,19 +6088,26 @@ export type I191vhdj2skphj = AnonymousEnum<{ "first_game": number; }; }>; -export type Idfgmv0r2plk6t = { +export type Ievlctk0hj2fed = { "first_game": number; "registered": boolean; "sent_report": boolean; + "early_attendance_enactment"?: ({ + "attendance": boolean; + "externally_recognized": boolean; + "zero_score": boolean; + }) | undefined; "yes_person": number; "no_not_person": number; + "expected_max_vote_weight": number; + "vote_weight": number; "credibility": Enum<{ "Invited": undefined; "Recognized": undefined; "Deposit": bigint; }>; }; -export type I5dmkj9ep3uuaq = { +export type Iehnjl0g9ebdqu = { "index": number; "registration_ends": number; "shuffle_deadline": number; @@ -5707,25 +6124,42 @@ export type I5dmkj9ep3uuaq = { "next_player_index": number; "recognized_finished": boolean; }; + "Step3ComputeWeights": Anonymize; + "Step4AwaitSession": Anonymize; }>; }; - "Reporting": { - "player_count": number; - }; - "PlayerProcess": Anonymize; + "Reporting": Anonymize; + "PlayerProcess": Anonymize; "Cancelling": Anonymize; }>; "max_group_size": number; "rounds": number; + "pending_attendance": number; }; export type Ian857vvm41akm = { - "last_iteration"?: (Anonymize) | undefined; + "last_iteration"?: Anonymize; +}; +export type I6ut7269ghmf35 = (Anonymize) | undefined; +export type Ia5kr65gtmjmug = { + "last_iteration"?: Anonymize; + "player_count": number; +}; +export type I641idg32qb13l = { + "player_count": number; }; export type I1v8hffmq0a2s2 = Array<{ "game_play_time": number; "rounds": number; "max_group_size": number; }>; +export type Idqtb21truteet = { + "game_index": number; + "randomness": SizedHex<32>; +}; +export type I6cpea5eggna34 = AnonymousEnum<{ + "Eligible": number; + "Claimed": undefined; +}>; export type Iesh4knl67dirc = { "score": number; "streak": Enum<{ @@ -5775,7 +6209,7 @@ export type I81vbsdqasdsr1 = { "UniqueDevice": SS58String; }>; }; -export type I7odqmvebn62ca = { +export type I23bplm6qtgrpd = { "identifier_key": SizedHex<65>; "full_username"?: Anonymize; "lite_username": Uint8Array; @@ -5787,70 +6221,75 @@ export type I7odqmvebn62ca = { "demoted": boolean; }; }>; - "stmt_store_slots": Array>; +}; +export type Ifopum5rctcidn = { + "account_id": SS58String; + "seq": number; + "since": bigint; +}; +export type I9jea06984vfti = [SizedHex<4>, SizedHex<32>]; +export type I8vqqii9cbfqng = [SS58String, Anonymize]; +export type Ib55cg44k2chb5 = [SizedHex<4>, number, SizedHex<32>]; +export type Id77vvrgqmru2o = { + "account_id": SS58String; + "reference": { + "period": number; + "seq": number; + }; }; export type Ic66kva37scc9l = Array<{ "account": SS58String; "joined_at": bigint; }>; -export type I53g8q9761kkrn = Array>; +export type I1fa62uavcqia6 = Array>; export type I7hvvp2oeegqa0 = [Anonymize, number]; -export type Iaq2bjd3j738m9 = { +export type Ie3d56aup8po4r = { "owner": Anonymize; "mode": Enum<{ "AppendOnly": undefined; "Flexible": undefined; }>; "ring_size": Anonymize; + "self_inclusion_delay"?: Anonymize; }; export type I9lcj3313n9e9v = AnonymousEnum<{ "External": Anonymize; "Local": SS58String; }>; -export type I6t8fqjt3u136v = { - "root": SizedHex<384>; +export type I3136o2hmi4al3 = { + "root": SizedHex<768>; "revision": number; - "intermediate": SizedHex<432>; + "intermediate": SizedHex<848>; }; export type I4pact7n2e9a0i = [SizedHex<32>, number]; +export type Iff5ulsdvgntip = { + "root": SizedHex<768>; + "archived_at": bigint; +}; +export type Iara29l6qkt9is = [SizedHex<32>, number, SizedHex<4>]; export type I2t447bb26t9i6 = [SizedHex<32>, number, number]; export type I831tj5voub6u0 = { "total": number; "included": number; "immutable_since"?: Anonymize; }; -export type I6cufgusp40k9i = { - "identifier": SizedHex<32>; - "position": Enum<{ - "Onboarding": { - "queue_page": number; - }; - "Included": { - "ring_index": number; - "ring_page": number; - "ring_position": number; - }; - "Suspended": undefined; - }>; -}; +export type I54g1hqjgru9ba = AnonymousEnum<{ + "Onboarding": { + "queue_page": number; + "queued_at": bigint; + }; + "Included": { + "ring_index": number; + "ring_page": number; + "ring_position": number; + }; + "Suspended": undefined; +}>; +export type I2ccsdtloqt0h4 = FixedSizeArray<2, SizedHex<32>>; export type I766emmc9ccni0 = AnonymousEnum<{ "AppendOnly": undefined; "Mutating": number; }>; -export type Ie1vuhuh0vpgrb = { - "identifier": SizedHex<32>; - "stage": Enum<{ - "DeletingRings": undefined; - "DeletingOnboardingQueue": undefined; - "Finalizing": undefined; - }>; -}; export type I2l7r05e3266s4 = { "reason": Enum<{ "FailedDispatch": { @@ -5860,7 +6299,33 @@ export type I2l7r05e3266s4 = { "until": bigint; }; export type I5eoome1iv99mc = [number, number, SizedHex<32>]; -export type I35mml84uvstml = AnonymousEnum<{ +export type I6msd8eb5ee1ee = { + "collections": Anonymize; + "last_init_sequence": bigint; + "pallet_index": number; +}; +export type I94prpltebu6vs = Array<[SizedHex<32>, Anonymize]>; +export type I5b6v7o79lps5k = { + "write_page": number; + "send_page": number; + "last_update_block": number; +}; +export type I4hus3s8lblmj7 = [number, SizedHex<32>, number]; +export type Iff773s2hdisds = { + "collections": Anonymize; + "current_collection_index": number; + "after_ring_index"?: Anonymize; + "sequence": bigint; + "source_time": bigint; + "pallet_index": number; +}; +export type Ieenjgm8k62jr1 = { + "sequence": bigint; + "source_time": bigint; + "sealed_at": number; + "remaining_subscribers": number; +}; +export type I183k62sm9tgqf = AnonymousEnum<{ "Inactive": undefined; "CreatingAsset": undefined; "XcmFundsTransfer": undefined; @@ -5868,46 +6333,21 @@ export type I35mml84uvstml = AnonymousEnum<{ "FundingPots": undefined; "SchedulingMobRulePayouts": undefined; "SchedulingScorePayouts": undefined; - "Completed": undefined; + "OpeningAirdropPools": undefined; }>; export type I83hq8olm7phlp = AnonymousEnum<{ "Inactive": undefined; "Completed": undefined; }>; -export type Ianbabfvoj16rj = Array<{ +export type I29r7jgavo472s = { "id": number; - "info": Anonymize; -}>; -export type I7dj7e35j88qa = { - "prize": Anonymize; - "registration_starts": number; - "registration_duration": number; -}; -export type I6dk4nvven1i08 = { - "id": number; - "next_participant_id": number; - "info": Anonymize; - "status": Enum<{ - "Registering": undefined; - "WaitingForEntropyToBuild": { - "started_at_rc_bn": number; - }; - "DrawingWinners": { - "entropy": SizedHex<32>; - }; - "Distributing": undefined; - "ClearingStorage": undefined; - }>; -}; -export type I3sean4dbblfft = [SizedHex<32>, SS58String]; -export type I3n8fv9mo53kq5 = [Anonymize, bigint]; -export type I6ouflveob4eli = [SS58String, number]; -export type Ibuqgslo88n368 = { - "prize": Anonymize; - "registration_starts": number; - "registration_duration": number; - "total_participants": number; - "winners": Anonymize; + "target": Anonymize; + "dispatcher": SS58String; + "expires_at": bigint; + "prizes_remaining": number; + "prize_value": bigint; + "asset_id": Anonymize; + "target_threshold": FixedSizeArray<4, bigint>; }; export type Iepbsvlk3qceij = AnonymousEnum<{ "Active": { @@ -5941,10 +6381,13 @@ export type In7a38730s6qs = { }; }; }; -export type If15el53dd76v9 = { - "normal": number; - "operational": number; - "mandatory": number; +export type Ibtil0ss5munbk = { + "max": { + "normal": number; + "operational": number; + "mandatory": number; + }; + "max_header_size"?: Anonymize; }; export type I9s0ave7t0vnrk = { "read": bigint; @@ -7074,14 +7517,16 @@ export type I8fougodaj6di6 = { export type I77dda7hps0u37 = AnonymousEnum<{ /** * Sets the session key(s) of the function caller to `keys`. + * * Allows an account to set its session key prior to becoming a validator. * This doesn't take effect until the next session. * - * The dispatch origin of this function must be signed. - * - * ## Complexity - * - `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is - * fixed. + * - `origin`: The dispatch origin of this function must be signed. + * - `keys`: The new session keys to set. These are the public keys of all sessions keys + * setup in the runtime. + * - `proof`: The proof that `origin` has access to the private keys of `keys`. See + * [`impl_opaque_keys`](sp_runtime::impl_opaque_keys) for more information about the + * proof format. */ "set_keys": Anonymize; /** @@ -7093,10 +7538,6 @@ export type I77dda7hps0u37 = AnonymousEnum<{ * convertible to a validator ID using the chain's typical addressing system (this usually * means being a controller account) or directly convertible into a validator ID (which * usually means being a stash account). - * - * ## Complexity - * - `O(1)` in number of key types. Actual cost depends on the number of length of - * `T::Keys::key_ids()` which is fixed. */ "purge_keys": undefined; }>; @@ -7800,7 +8241,7 @@ export type I1r4c2ghbtvjuc = { "index": number; "weight_limit": Anonymize; }; -export type I1lrb1j9ag11jt = AnonymousEnum<{ +export type Ibkm9cph19qu2e = AnonymousEnum<{ /** * Send a batch of dispatch calls. * @@ -7821,7 +8262,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * and the error of the failed call. If all were successful, then the `BatchCompleted` * event is deposited. */ - "batch": Anonymize; + "batch": Anonymize; /** * Send a call through an indexed pseudonym of the sender. * @@ -7837,7 +8278,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * * The dispatch origin for this call must be _Signed_. */ - "as_derivative": Anonymize; + "as_derivative": Anonymize; /** * Send a batch of dispatch calls and atomically execute them. * The whole transaction will rollback and fail if any of the calls failed. @@ -7853,7 +8294,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * ## Complexity * - O(C) where C is the number of calls to be batched. */ - "batch_all": Anonymize; + "batch_all": Anonymize; /** * Dispatches a function call with a provided origin. * @@ -7862,7 +8303,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * ## Complexity * - O(1). */ - "dispatch_as": Anonymize; + "dispatch_as": Anonymize; /** * Send a batch of dispatch calls. * Unlike `batch`, it allows errors and won't interrupt. @@ -7878,7 +8319,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * ## Complexity * - O(C) where C is the number of calls to be batched. */ - "force_batch": Anonymize; + "force_batch": Anonymize; /** * Dispatch a function call with a specified weight. * @@ -7887,7 +8328,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * * The dispatch origin for this call must be _Root_. */ - "with_weight": Anonymize; + "with_weight": Anonymize; /** * Dispatch a fallback call in the event the main call fails to execute. * May be called from any origin except `None`. @@ -7913,7 +8354,7 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * - Some use cases might involve submitting a `batch` type call in either main, fallback * or both. */ - "if_else": Anonymize; + "if_else": Anonymize; /** * Dispatches a function call with a provided origin. * @@ -7921,28 +8362,28 @@ export type I1lrb1j9ag11jt = AnonymousEnum<{ * * The dispatch origin for this call must be _Root_. */ - "dispatch_as_fallible": Anonymize; + "dispatch_as_fallible": Anonymize; }>; -export type I152bmabo1ja8r = { +export type Icrfq6sihf9s7d = { "calls": Array; }; -export type I5gr18losjkfla = { +export type Idgkjnpm8ga334 = { "index": number; "call": TxCallData; }; -export type Ia1a97fvmufuk9 = { - "as_origin": Anonymize; +export type Ie1rsmrsrog847 = { + "as_origin": Anonymize; "call": TxCallData; }; -export type Ier9vl0psdeggp = { +export type I39hqnpmrp1r81 = { "call": TxCallData; "weight": Anonymize; }; -export type I5rom81gl99ha6 = { +export type I93ri1gd07v5fi = { "main": TxCallData; "fallback": TxCallData; }; -export type I3lgodtanj1u5q = AnonymousEnum<{ +export type Iej8sp32dbe5tu = AnonymousEnum<{ /** * Immediately dispatch a multi-signature call using a single approval from the caller. * @@ -7957,12 +8398,14 @@ export type I3lgodtanj1u5q = AnonymousEnum<{ * ## Complexity * O(Z + C) where Z is the length of the call and C its execution weight. */ - "as_multi_threshold_1": Anonymize; + "as_multi_threshold_1": Anonymize; /** * Register approval for a dispatch to be made from a deterministic composite account if * approved by a total of `threshold - 1` of `other_signatories`. * - * If there are enough, then dispatch the call. + * **If the approval threshold is met (including the sender's approval), this will + * immediately execute the call.** This is the only way to execute a multisig call - + * `approve_as_multi` will never trigger execution. * * Payment: `DepositBase` will be reserved if this is the first approval, plus * `threshold` times `DepositFactor`. It is returned once this dispatch happens or @@ -7978,8 +8421,9 @@ export type I3lgodtanj1u5q = AnonymousEnum<{ * transaction index) of the first approval transaction. * - `call`: The call to be executed. * - * NOTE: Unless this is the final approval, you will generally want to use - * `approve_as_multi` instead, since it only requires a hash of the call. + * NOTE: For intermediate approvals (not the final approval), you should generally use + * `approve_as_multi` instead, since it only requires a hash of the call and is more + * efficient. * * Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise * on success, result is `Ok` and the result from the interior call, if it was executed, @@ -7999,11 +8443,18 @@ export type I3lgodtanj1u5q = AnonymousEnum<{ * - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit * taken for its lifetime of `DepositBase + threshold * DepositFactor`. */ - "as_multi": Anonymize; + "as_multi": Anonymize; /** * Register approval for a dispatch to be made from a deterministic composite account if * approved by a total of `threshold - 1` of `other_signatories`. * + * **This function will NEVER execute the call, even if the approval threshold is + * reached.** It only registers approval. To actually execute the call, `as_multi` must + * be called with the full call data by any of the signatories. + * + * This function is more efficient than `as_multi` for intermediate approvals since it + * only requires the call hash, not the full call data. + * * Payment: `DepositBase` will be reserved if this is the first approval, plus * `threshold` times `DepositFactor`. It is returned once this dispatch happens or * is cancelled. @@ -8018,7 +8469,8 @@ export type I3lgodtanj1u5q = AnonymousEnum<{ * transaction index) of the first approval transaction. * - `call_hash`: The hash of the call to be executed. * - * NOTE: If this is the final approval, you will want to use `as_multi` instead. + * NOTE: To execute the call after approvals are gathered, any signatory must call + * `as_multi` with the full call data. This function cannot execute the call. * * ## Complexity * - `O(S)`. @@ -8074,11 +8526,11 @@ export type I3lgodtanj1u5q = AnonymousEnum<{ */ "poke_deposit": Anonymize; }>; -export type I7bfb7cb54ioch = { +export type I7840qsg0nkgru = { "other_signatories": Anonymize; "call": TxCallData; }; -export type Iant3bti5h6pr5 = { +export type I2ajh25ofhvcua = { "threshold": number; "other_signatories": Anonymize; "maybe_timepoint"?: Anonymize; @@ -8104,11 +8556,11 @@ export type I6lqh1vgb4mcja = { "other_signatories": Anonymize; "call_hash": SizedHex<32>; }; -export type Iet0lhejv1ea1t = AnonymousEnum<{ +export type Id3lelf20detgo = AnonymousEnum<{ /** * Authenticates the sudo key and dispatches a function call with `Root` origin. */ - "sudo": Anonymize; + "sudo": Anonymize; /** * Authenticates the sudo key and dispatches a function call with `Root` origin. * This function does not check the weight of the call, and instead allows the @@ -8116,7 +8568,7 @@ export type Iet0lhejv1ea1t = AnonymousEnum<{ * * The dispatch origin for this call must be _Signed_. */ - "sudo_unchecked_weight": Anonymize; + "sudo_unchecked_weight": Anonymize; /** * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo * key. @@ -8128,7 +8580,7 @@ export type Iet0lhejv1ea1t = AnonymousEnum<{ * * The dispatch origin for this call must be _Signed_. */ - "sudo_as": Anonymize; + "sudo_as": Anonymize; /** * Permanently removes the sudo key. * @@ -8136,17 +8588,17 @@ export type Iet0lhejv1ea1t = AnonymousEnum<{ */ "remove_key": undefined; }>; -export type Ifbu3sk81n1s98 = { +export type Ice56905d72v4c = { "call": TxCallData; }; export type I8k3rnvpeeh4hv = { "new": MultiAddress; }; -export type Ibm3nepcfano8f = { +export type I52hq8921se3sb = { "who": MultiAddress; "call": TxCallData; }; -export type I1mbimc2g4f9c7 = AnonymousEnum<{ +export type I2an3qjs9d0f04 = AnonymousEnum<{ /** * Dispatch the given `call` from an account that the sender is authorised for through * `add_proxy`. @@ -8158,7 +8610,7 @@ export type I1mbimc2g4f9c7 = AnonymousEnum<{ * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. * - `call`: The call to be made by the `real` account. */ - "proxy": Anonymize; + "proxy": Anonymize; /** * Register a proxy account for the sender that is able to make calls on its behalf. * @@ -8287,7 +8739,7 @@ export type I1mbimc2g4f9c7 = AnonymousEnum<{ * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. * - `call`: The call to be made by the `real` account. */ - "proxy_announced": Anonymize; + "proxy_announced": Anonymize; /** * Poke / Adjust deposits made for proxies and announcements based on current values. * This can be used by accounts to possibly lower their locked amount. @@ -8300,7 +8752,7 @@ export type I1mbimc2g4f9c7 = AnonymousEnum<{ */ "poke_deposit": undefined; }>; -export type I85imvra134bvp = { +export type I54b3f8hqshk56 = { "real": MultiAddress; "force_proxy_type"?: Anonymize; "call": TxCallData; @@ -8331,7 +8783,7 @@ export type Ianmuoljk2sk1u = { "delegate": MultiAddress; "call_hash": SizedHex<32>; }; -export type I6neqijlncmft9 = { +export type Ilh4h42jvp82e = { "delegate": MultiAddress; "real": MultiAddress; "force_proxy_type"?: Anonymize; @@ -8718,14 +9170,14 @@ export type I79nh52dspn15s = { "context": Uint8Array; "judgement": Anonymize; }; -export type I5p4kcd7d4mpq7 = AnonymousEnum<{ +export type I1ch694vojefa5 = AnonymousEnum<{ /** * Dispatch a call under an alias using the `account <-> alias` mapping. * * This is a call version of the transaction extension `AsPersonalAliasWithAccount`. * It is recommended to use the transaction extension instead when suitable. */ - "under_alias": Anonymize; + "under_alias": Anonymize; /** * This transaction is refunded if successful and no alias was previously set. * @@ -8747,8 +9199,6 @@ export type I5p4kcd7d4mpq7 = AnonymousEnum<{ * * The people are identified by the provided list of keys and will each be assigned, in * order, the next available personal ID. - * - * The origin for this call must have root privileges. */ "force_recognize_personhood": Anonymize; /** @@ -8786,11 +9236,37 @@ export type I5p4kcd7d4mpq7 = AnonymousEnum<{ * - Ring size: `R2e9` */ "create_people_collection": undefined; + /** + * Remove stale alias <-> account mappings. + * + * A mapping is stale when: + * - its context has been removed from [`Config::AccountContexts`] (governance + * reconfiguration, ended airdrop etc.), or + * - its ring has been deleted. + * + * Revision mismatches do not render an alias stale. The user can continue + * transacting via `AsPersonalAliasWithAccountRevised` without having to + * redo account setup. + * + * Typically submitted by the OCW, but the dispatch does not trust + * the caller. Each alias is re-validated via + * [`Self::ensure_alias_is_stale`]; those that are not stale are + * skipped. + * + * At most [`MAX_BULK_CLEANUP`] aliases are processed per call. + * + * The transaction source must be local or in-block. Thus, external + * invocations are not permitted. + */ + "clean_up_stale_aliases": Anonymize; }>; export type I6viutd279aov3 = { "account": SS58String; "call_valid_at": number; }; +export type I8k2cd3v73pgjh = { + "aliases": Array>; +}; export type Id7gcu75dd10kk = AnonymousEnum<{ /** * Feeless on success (determined only by top three lines). @@ -9032,7 +9508,7 @@ export type I1b497vgt5ie3v = { "referred_values": Anonymize; "referrer_values": Anonymize; }; -export type I6jae6u05fbnsi = AnonymousEnum<{ +export type Ibcoau6livivvd = AnonymousEnum<{ /** * Sign up for the game using an account and an invite. * @@ -9084,6 +9560,11 @@ export type I6jae6u05fbnsi = AnonymousEnum<{ * * The origin must be an alias, or signed by an account, or signed by an account and use * `ScoreAsParticipant` extension. + * + * After the votes from the report are counted, the reporter and each of the reported + * players whose attendance can now be determined are processed early. This lets the + * game skip the player-process phase entirely when every player has been processed by + * the end of reporting. */ "report": Anonymize; /** @@ -9145,6 +9626,41 @@ export type I6jae6u05fbnsi = AnonymousEnum<{ */ "schedule_games": Anonymize; "remove_scheduled_game": Anonymize; + /** + * Claim the scratch card reward (a.k.a. "star prize") for the current game. + * + * The caller must be a signed account or a participant/person origin whose game + * identity was eligible (attended + recognized) for the current scratch reward. + * The player's scratch hash must fall below the winner threshold, and each player + * may claim at most once across all games. Eligible players can claim only until + * the next game finishes; once that happens, the unclaimed reward is dropped. + * + * Per-game prize-pool airdrops are claimed via [`Self::claim_game_prize`] + * (which forwards into the airdrop pallet), not through this call. + * + * Parameters: + * - `origin`: a signed account, participant or person origin. + * - `beneficiary`: the account to receive the reward. + */ + "claim_reward": Anonymize; + /** + * Claim a prize from the recurring per-game prize pool opened by the + * airdrop pallet for `game_id`. The pool is identified by `pool_id`, + * which must be a `PrizeTarget::GameParticipants` pool. + * + * The origin must be a signed account, a participant origin, or a + * person origin. The resolved [`AccountOrPerson`] identity must appear + * in [`PlayerAttendanceHistory`] for the pool's game; otherwise + * [`Error::NotParticipant`]. + * + * `proof` is a ring-membership proof that the caller is a lite person. + * It is verified by the airdrop pallet against the pool's context and + * `beneficiary` (so a captured proof cannot redirect the prize). The + * alias recovered from that verification drives the per-pool winner-hash + * check; the replay guard keys on the resolved identity from the origin + * (Account or Person), so each identity can claim at most once per pool. + */ + "claim_game_prize": Anonymize; /** * Force start the shuffle before its normal start time. * @@ -9155,10 +9671,6 @@ export type I6jae6u05fbnsi = AnonymousEnum<{ * Force end a game's reporting phase before its normal end time. * * This action can only be performed by the root origin and is only meant for testing. - * - * The reporting phase only start when the mutation session can be started. The call will - * fail if the mutation session cannot be started. It can be retried few blocks later the - * time for the people mutation sessions to be proceed. */ "testnet_force_end_reporting": undefined; /** @@ -9192,6 +9704,16 @@ export type Ifpsbvfoe7erus = { export type Isicv7jbqf8q2 = { "games_schedules": Anonymize; }; +export type I8ligieds2efci = { + "beneficiary": SS58String; +}; +export type Ib5qs0kka2gvvq = { + "pool_id": number; + "ring_index": number; + "revision": number; + "proof": SizedHex<788>; + "beneficiary": SS58String; +}; export type I49vkvcrq1mpqd = { "phases": Anonymize; }; @@ -9199,13 +9721,13 @@ export type I99srnbmesb7pd = AnonymousEnum<{ /** * Schedule payout rounds. * - * Called from `ScheduleOrigin` or root. + * Called from `ManagerOrigin` or root. */ "schedule_payout_rounds": Anonymize; /** * Remove a scheduled payout round. * - * Called from `ScheduleOrigin` or root. + * Called from `ManagerOrigin` or root. */ "remove_payout_schedule": Anonymize; /** @@ -9286,7 +9808,7 @@ export type I99srnbmesb7pd = AnonymousEnum<{ * of the next report session when `update_thresholds()` recalculates * `AbsenceGraceRatio`. * - * Called from `ScheduleOrigin` or root. + * Called from `ManagerOrigin` or root. */ "set_absence_grace_schedule": Anonymize; }>; @@ -9345,7 +9867,7 @@ export type Ib5ou59k6na5qv = { export type I7qh4t1qniuepu = { "ids": Array; }; -export type I9edk4gqb8qj54 = AnonymousEnum<{ +export type I6qfkq1vdkgugd = AnonymousEnum<{ /** * Grant some attestation allowance to an account so they can attest people. * @@ -9379,6 +9901,12 @@ export type I9edk4gqb8qj54 = AnonymousEnum<{ * the user's account (`candidate`), and the encoded bytes of the ring VRF key * (`ring_vrf_key`). * + * On success, this call: + * - stores lite registration data in `LitePeople`, + * - adds the user's ring VRF key to the lite member collection. + * + * The lite member collection must already have been initialized by `on_poll`. + * * - `candidate`: The candidate to be recognized as a lite person. * - `candidate_signature`: The signature, provided by the candidate, to allow the attester * to complete the registration process on their behalf. @@ -9393,7 +9921,15 @@ export type I9edk4gqb8qj54 = AnonymousEnum<{ * [types::LiteConsumerRegistrationParams::signing_payload]. */ "attest": Anonymize; - "dispatch_as_signer": Anonymize; + "dispatch_as_signer": Anonymize; + /** + * Set the account associated with a lite alias. + * + * The call is valid from `valid_at_block` until + * `valid_at_block + account_setup_block_tolerance`. + */ + "set_alias_account": Anonymize; + "unset_alias_account": undefined; }>; export type I6gk1lo90mp8d9 = { "candidate": SS58String; @@ -9408,7 +9944,11 @@ export type I6gk1lo90mp8d9 = { "reserved_username"?: Anonymize; }) | undefined; }; -export type I526v6vcah1gur = AnonymousEnum<{ +export type Iefam38o91ona9 = { + "account": SS58String; + "valid_at_block": number; +}; +export type I4n7unmaqs9i43 = AnonymousEnum<{ /** * Register a lite person as a consumer. */ @@ -9457,25 +9997,91 @@ export type I526v6vcah1gur = AnonymousEnum<{ */ "set_username_reservation_duration": Anonymize; /** - * Associate an account with a slot for statement store access, or reset a slot. + * Demote a full person to a lite person after their authorization has expired. * - * The associated account can submit statements to the statement store. - * The origin must be a lite person. - * Refunded when assigning an account to a free slot, or when replacing/clearing an - * occupied slot whose last update is older than `AccountsApiRefundCooldown`. + * This is a permissionless call; the origin must be authorized. + */ + "demote_auth_expired": Anonymize; + /** + * Associate a statement account with a friend request context sequence. + * + * The associated account can submit statements while this friend request registration is + * active. + * The origin must be `Origin::FriendRequestAlias`, created by the `AsResources` + * (`RegisterFriendRequestWithProof(..)`) transaction extension after proof validation. + * On success, increases statement allowance and stores registration state + * `{account_id, reference}`. * * Parameters: - * * `slot_number`: must be in `0..AccountsApiSlotCount`. (`AccountsApiSlotCount` is - * available in the constant metadata) - * * `set_account`: `Some` to set a new account, or `None` to reset to no account. + * * `reference`: friend request period/sequence pair. + * - `reference.period` must be in the accepted period window: `[period(now - + * FriendRequestGraceWindow), period(now)]`. + * - `reference.seq` must be in `0..=FriendRequestSlotsPerPeriod`. + * * `account_id`: statement account to authorize. Must not already be used by another + * friend request registration. */ - "set_stmt_store_associated_account_id_at_slot": Anonymize; + "set_friend_request_statement_account_for_sequence": Anonymize; /** - * Demote a full person to a lite person after their authorization has expired. + * Clear a stale friend request registration and revoke its statement allowance. * * This is a permissionless call; the origin must be authorized. + * Succeeds only when the registration's period-derived expiry has elapsed. + * On success, removes friend request registration state and decreases statement allowance. + * + * Parameters: + * * `account`: statement account previously associated with a friend request registration. + * * `seq`: friend request sequence to clear. Must match stored registration sequence and + * be in `0..=FriendRequestSlotsPerPeriod`. */ - "demote_auth_expired": Anonymize; + "clear_expired_friend_request_sequence": Anonymize; + /** + * Claim an anonymous statement store allowance for a target account. + * + * The origin must be `Origin::StmtStoreAlias`, produced by the `AsResources` + * (`RegisterStatementStoreAllowance(..)`) transaction extension after proof validation. + * On success, increases the statement allowance for `target_account` and stores the + * mapping in `StatementStoreAllowances`. + * + * Parameters: + * * `period`: day number since Unix epoch. Must be in the accepted period window. + * * `seq`: slot number within the period, bounded by the collection-specific limit. + * * `target_account`: statement account to authorize. + */ + "set_statement_store_account": Anonymize; + /** + * Remove expired statement store allowances for a past period. + * + * This is a permissionless call; the origin must be authorized. + * Removes up to `StmtStoreCleanupLimit` entries from `StatementStoreAllowances` for + * the given `period`, decreasing the statement allowance for each removed account. + */ + "clear_expired_stmt_store_allowances": Anonymize; + /** + * Claim long-term storage on a remote chain using an anonymous membership proof. + * + * The origin must be `Origin::LongTermStorageClaim(alias, collection)`, created by the + * `AsResources` (`ClaimLongTermStorage(..)`) transaction extension after ring-VRF proof + * validation. + * + * Parameters: + * * `period`: the claiming period. Must be the current period or the previous one if + * within the grace window. + * * `counter`: the claim counter within the period. Must be less than + * `LongTermStorageClaimsPerPeriod`. Each counter produces a distinct alias. + * * `account_id`: the account to authorize for storage on the remote chain. + */ + "claim_long_term_storage": Anonymize; + /** + * Clear spent long-term storage aliases for an expired period. + * + * This is a permissionless call authorized via the `authorize` attribute. It can be + * called by anyone once a period has fully expired (past the grace window). + * + * Parameters: + * * `period`: the expired period to clear aliases for. + * * `limit`: the maximum number of entries to remove in this call. + */ + "clear_expired_long_term_storage_aliases": Anonymize; }>; export type Ifd8dbgpm7srdt = { "identifier_key": SizedHex<65>; @@ -9490,9 +10096,27 @@ export type Ifbug00rch8etj = { "Reservation": Uint8Array; }>; }; -export type Igmmsl9pnapid = { - "slot_number": number; - "set_account"?: Anonymize; +export type I5os021n9mtdcr = { + "account": SS58String; + "seq": number; +}; +export type I66tl4phltl6bg = { + "period": number; + "seq": number; + "target_account": SS58String; +}; +export type I4t3pgt4ilgpf6 = { + "period": number; + "first_entry": SizedHex<32>; +}; +export type Ifles5ioatcuip = { + "period": number; + "counter": number; + "account_id": SS58String; +}; +export type Id2jcn0qee7h6f = { + "period": number; + "limit": number; }; export type I9sqknhnkp2m32 = AnonymousEnum<{ /** @@ -9505,10 +10129,10 @@ export type I9sqknhnkp2m32 = AnonymousEnum<{ /** * Sets the expected hashes for chunk pages for a given ring exponent. * - * This is a root-only call that allows setting the expected hashes that chunks - * must match when added via `add_chunks`. + * Allows setting the expected hashes that chunks must match when added via + * `add_chunks`. * - * Can only be called by root origin. + * The origin must be `ManagerOrigin` or root. */ "set_chunk_page_hashes": Anonymize; }>; @@ -9521,25 +10145,7 @@ export type Iasnonvq8v9o5g = { "ring_exponent": Anonymize; "page_hashes": Anonymize; }; -export type I6sv4qujr95uct = AnonymousEnum<{ - /** - * Build a ring root by including registered members. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ - "build_ring_manual": Anonymize; - /** - * Onboard members into a ring by taking their keys from the onboarding queue and - * registering them into the ring. This does not compute the root, that is done using - * `build_ring`. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ - "onboard_members_manual": Anonymize; +export type Ierhmhea1o4d6a = AnonymousEnum<{ /** * Merge the members in two rings into a single, new ring. In order for the rings to be * eligible for merging, they must be below 1/2 of max capacity, have no pending @@ -9550,13 +10156,140 @@ export type I6sv4qujr95uct = AnonymousEnum<{ * Force set the onboarding size for a collection. This call requires root privileges. */ "set_onboarding_size": Anonymize; + /** + * Allow a member waiting in the onboarding queue to include themselves into a ring + * after enough time has passed. This bypasses the normal cohort-based onboarding size + * requirement. + * + * This call must be dispatched with a `SelfInclude` origin, authenticated by the + * `AsMember` transaction extension. The rings must be in append-only mode. + * + * The `call_valid_at` parameter dictates the time window in which this transaction is + * valid and represents the timestamp (in seconds since the UNIX epoch) when this call + * becomes valid. + */ + "self_include": Anonymize; + /** + * Build a ring root for a specific ring in a collection. + * + * Submitted by the OCW with a `to_include` snapshot from + * [`Self::should_build_ring`]. Leftovers from later onboarding are picked up + * on the next OCW tick, or by the member via [`Self::self_include`] when + * cohort gating stalls onboarding. + */ + "build_ring_authorized": Anonymize; + /** + * Onboard members from the onboarding queue for a specific collection. + * + * Submitted by the offchain worker. + */ + "onboard_members_authorized": Anonymize; + /** + * Merge the top two onboarding queue pages for a specific collection. + * + * Submitted by the offchain worker. + */ + "merge_queue_pages_authorized": Anonymize; + /** + * Remove suspended keys from a specific ring in a collection. + * + * Submitted by the offchain worker. + */ + "remove_suspended_keys_authorized": Anonymize; + /** + * Delete a page for a specific ring in a collection. + * + * Submitted by the offchain worker. + */ + "delete_ring_page_authorized": Anonymize; + /** + * Enqueue a ring for deletion as part of collection deletion. + * + * Archives the ring root, notifies subscribers, removes ring metadata, and + * enqueues ring pages into `RingDeletionQueue` for processing by + * `delete_ring_page_authorized`. + * + * Submitted by the offchain worker. + */ + "enqueue_ring_deletion_authorized": Anonymize; + /** + * Delete an onboarding queue page as part of collection deletion. + * + * Removes all `Members` entries for the members in the page, then removes + * the page itself. Can only proceed when all rings and ring pages have been + * fully deleted. + * + * Submitted by the offchain worker. + */ + "delete_onboarding_queue_page_authorized": Anonymize; + /** + * Finalize collection deletion. + * + * Removes all remaining per-collection storage and the owner's identifier + * reference. Can only proceed when all rings, ring pages, and onboarding + * queue pages have been fully deleted. + * + * Submitted by the offchain worker. + */ + "finalize_collection_deletion_authorized": Anonymize; + /** + * Mark a ring as stale so the offchain worker will rebuild it. + * + * Anyone can submit this transaction if the ring has members that are not + * yet included in the root (`total > included`) and the ring is not already + * marked stale. This is a recovery mechanism in case the `StaleRings` entry + * was lost or never inserted. + */ + "mark_ring_stale_authorized": Anonymize; + /** + * Clean up expired old ring roots. + * + * Removes up to `limit` old ring roots for the given ring in the given + * collection. + * + * The transaction source must be `Local` or `InBlock`. + * + * This is a maintenance call. Submitted by the offchain worker. + */ + "clean_up_old_roots_authorized": Anonymize; }>; -export type I1tqpuolr7lnbt = { +export type Ie0n67dnlcbpcf = { + "identifier": SizedHex<32>; + "member": SizedHex<32>; + "call_valid_at": bigint; +}; +export type I1bv5scdc27nbb = { + "identifier": SizedHex<32>; + "ring_index": number; + "ring_exponent": Anonymize; + "revision": number; + "to_include": number; +}; +export type I12c2udla9t40g = { "identifier": SizedHex<32>; "ring_index": number; - "limit"?: Anonymize; + "head": number; +}; +export type I4eperb3q65q14 = { + "identifier": SizedHex<32>; + "initial_head": number; + "new_head": number; }; -export type If13aq7jdorcr5 = AnonymousEnum<{ +export type I8lare4sf457ul = { + "identifier": SizedHex<32>; + "ring_index": number; + "page_index": number; +}; +export type I2gt0vglt3agsj = { + "identifier": SizedHex<32>; + "page_index": number; +}; +export type I4maqh2jefgv7u = { + "identifier": SizedHex<32>; + "ring_index": number; + "limit": number; +}; +export type I4t0k0u2ichbls = AnonymousEnum<{ /** * Split a coin into multiple coins. * @@ -9570,6 +10303,7 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ * value is created for each destination account id. * * Validity requirements: + * (an invalid transaction won't be included in a block, the coin is not consumed) * * The coin's age must be less than [Config::MaximumAge]. * * The coin value must be within the bounds defined by [Config::MinimumExponent] and * [Config::MaximumExponent]. @@ -9588,6 +10322,7 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ * The call is free and ages the resulting coin by one. * * Validity requirements: + * (an invalid transaction won't be included in a block, the coin is not consumed) * * The destination account must not already have a coin. * * The coin's age must be less than [Config::MaximumAge]. */ @@ -9604,10 +10339,12 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ * alias is used to unload from the recycler. * * Validity requirements: + * (an invalid transaction won't be included in a block, the coin is not consumed) * * The `member_key` must not already be used in another recycler. * * The `member_key` must be valid (i.e. well formed). * * The `proof_of_ownership` must be a valid signature of the coin's account id by the * `member_key`. + * * The recycler collection for the coin's value must already exist */ "load_recycler_with_coin": Anonymize; /** @@ -9641,6 +10378,42 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ * `member_key`. */ "load_recycler_with_external_asset": Anonymize; + /** + * Load external asset into a recycler (infallible, validated unpaid variant). + * + * The origin must be [Origin::InfallibleUnpaidSigned], which can be obtained from the + * transaction extension variant [AsCoinage::InfallibleUnpaidSigned]. + * + * The transaction extension validation phase must ensure: + * - The `member_key` is valid and not already used in another recycler. + * - The `proof_of_ownership` is a valid signature of the signer's account id by the + * `member_key`. + * - The `value` is within the bounds defined by [Config::MinimumExponent] and + * [Config::MaximumExponent], and can be losslessly converted to an asset amount. + * - The signer has enough balance of the underlying asset to cover the equivalent amount + * for the given coin value (respecting `preservation`). + * - The nonce is valid for replay protection. + * - The recycler collection for `value` already exists. + * + * The call is free. + */ + "load_recycler_with_external_asset_unpaid": Anonymize; + /** + * Batched variant of [`Self::load_recycler_with_external_asset_unpaid`]. + * + * The origin must be [Origin::InfallibleUnpaidSigned], which can be obtained from the + * transaction extension variant [AsCoinage::InfallibleUnpaidSigned]. The extension + * validates each inner item and additionally checks within-batch member-key uniqueness + * and that the signer's balance covers the sum of all inner asset amounts. + * + * This call dispatches each inner load by re-running the same checks the extension + * just performed (see [`RecyclerManager::load`]). The redundancy matches the defensive + * pattern used by [`Self::load_recycler_with_external_asset_unpaid`]: a dispatch path + * that fails any of these checks is a logic bug in the extension, not a user error. + * + * The call is free. + */ + "load_recycler_with_external_asset_unpaid_batch": Anonymize; /** * Unload a recycler to mint a new coin. * @@ -9758,63 +10531,43 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ */ "pay_for_recycler_unload_fee_token_with_stable": Anonymize; /** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. Also, - * this call may leak too much information because the resulting coin inherits the worst - * recycler privacy. - * - * Unload multiple recyclers to mint a new consolidated coin. - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`, which can be - * obtained from the transaction extension [AsCoinage] using `AsUnloadTokenPeople`, - * `AsUnloadTokenLitePeople`, or `AsUnloadTokenPaid` variants. - * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) into a single output coin. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the new coin. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * The total value of unloaded coins must be a power of two. - * * The resulting coin value must not exceed [Config::MaximumExponent]. - * * `inputs` must not be empty, and each element must contain at least one alias. - */ - "unload_recyclers_into_coin_unstable": Anonymize; - /** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. - * - * Unload multiple recyclers to withdraw the underlying external asset. + * Unload a recycler into a mix of external asset and fresh vouchers. * * The origin must be [Origin::UnloadToken], which can be obtained from the transaction * extension [AsCoinage]. * - * When `fee` is [UnloadFee::Prepaid] (via free or paid unload token), no fee is deducted. - * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the unloaded assets. + * This function allows a user to offboard part of the unloaded value into the underlying + * asset while reminting the rest as fresh recycler vouchers. * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) and withdraw the total value as the underlying asset. + * When `fee` is [UnloadFee::Prepaid], `external_asset_amount` is transferred as-is. + * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the specified + * `external_asset_amount`, so the recipient receives the remainder. * * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the asset. + * * `aliases`: the list of aliases corresponding to the member keys included in the + * recycler. The proofs for these aliases are contained in the origin. + * * `value` and `index`: identifies the recycler being unloaded. + * * `revision`: the recycler revision used for the alias proofs. + * * `to`: the destination account for the external asset portion. + * * `external_asset_amount`: the gross asset portion to offboard from the unloaded value. + * * `new_vouchers`: the fresh recycler vouchers to mint from the remaining unloaded value. + * + * The total unloaded value must always equal the asset portion plus the voucher portion. + * In `FromOutput` mode, the asset portion must be large enough to cover the unload fee. * * Requirements: * * The origin must be [Origin::UnloadToken]. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * `inputs` must not be empty, and each element must contain at least one alias. - * * For [UnloadFee::FromOutput], the first alias of the first input was pre-marked in the - * extension. + * * The recycler identified by `value` and `index` must exist. + * * The alias proofs provided in the origin must be valid for the recycler's revision. + * * The aliases must not have been already unloaded (except for the first one when `fee` + * is [UnloadFee::FromOutput], which was pre-marked in the extension). + * * `new_vouchers` must not be empty, and all voucher member keys must be valid and + * unused. + * * The total unloaded value must equal `external_asset_amount` plus the total asset value + * of `new_vouchers`. + * * When using [UnloadFee::FromOutput], `external_asset_amount` must cover the fee. */ - "unload_recyclers_into_external_asset_unstable": Anonymize; + "unload_recycler_into_external_asset_and_vouchers": Anonymize; /** * Unload a recycler to withdraw the underlying external asset (non-anonymous). * @@ -9827,9 +10580,11 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ /** * Unload multiple recyclers to withdraw the underlying external asset (non-anonymous). * - * This is a non-anonymous version of [Self::unload_recyclers_into_external_asset_unstable] + * This is a non-anonymous version of [Self::unload_recyclers_into_external_asset] * where the fee is paid explicitly by the signer rather than through the anonymous - * unload token ring. + * unload token ring, and for multiple recyclers. + * + * The fee charged is one unload token fee per recycler (i.e., `inputs.len()`). * * Parameters: * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. @@ -9844,7 +10599,7 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ * * All specified recyclers must exist. * * The alias proofs must correspond sequentially to the aliases in `inputs`. * * `inputs` must not be empty and each element must contain at least one alias. - * * The signer must have sufficient balance to pay the fee. + * * The signer must have sufficient balance to pay the fee (one fee per recycler). */ "unload_recyclers_into_external_asset_non_anonymous": Anonymize; /** @@ -9858,27 +10613,43 @@ export type If13aq7jdorcr5 = AnonymousEnum<{ * are not entirely fresh, they can be linked to other coins. * * Unlike [Self::unload_recycler_into_coin], this call does **not** require the number of - * aliases to be a power of two. The only requirement is that the total value of the - * unloaded aliases matches the total value of the new coins specified in `split_into`. + * aliases to be a power of two. * * Parameters: * * `aliases`: the list of aliases corresponding to the member keys included in the * recycler. The proofs for these aliases are contained in the origin. * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. + * * `revision`: the recycler revision used for the alias_proofs. * * `split_into`: a vector of pairs, each pair containing a coin value and a list of * destination account ids. + * * `max_fee`: the maximum fee the caller is willing to pay, expressed in the underlying + * asset balance. It must be equal to the difference between the total value of the + * unloaded coins and the total value of the new coins defined in `split_into`. + * + * When using [UnloadFee::Prepaid], this must be 0. + * When using [UnloadFee::FromOutput], this amount is deducted from the input: the + * network fee is transferred to [Config::FeeDestination] and any remainder is burned. + * The caller can query `get_paid_unload_token_fee_in_asset` to estimate the fee. + * + * This parameter serves as a safeguard: the transaction is rejected at validation if the + * actual network fee exceeds `max_fee`, protecting the caller from excessive fee + * increases that would render the argument `split_into` invalid (unloaded funds must be + * higher than the split plus the fee). * * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. + * * The origin must be [Origin::UnloadToken]. * * The recycler identified by `value` and `index` must exist. * * The alias proofs provided in the origin must be valid for the recycler's revision. * * The `aliases` provided must match the aliases derived from the proofs. - * * The total value of the new coins defined in `split_into` must equal the total value of - * the unloaded coins. + * * The total value of the new coins defined in `split_into` plus `max_fee` must equal the + * total value of the unloaded coins. + * * `max_fee` must be a multiple of the minimum coin. (This is implied by the condition + * above). * * Each destination account must not already have a coin. + * * When using [UnloadFee::Prepaid], `max_fee` must be 0. + * * When using [UnloadFee::FromOutput], `max_fee` must cover the network fee. */ - "unload_recycler_into_coins": Anonymize; + "unload_recycler_into_coins": Anonymize; /** * Directly offboard a fresh, 0-age coin into the underlying external asset. * @@ -9966,6 +10737,9 @@ export type I9cbgq5mcmbt3f = { "member_key": SizedHex<32>; "proof_of_ownership": SizedHex<96>; }; +export type I4694teukj6drg = { + "items": Array>; +}; export type I8en8uvi5isgvj = { "aliases": Anonymize; "value": number; @@ -9973,16 +10747,14 @@ export type I8en8uvi5isgvj = { "revision": number; "to": SS58String; }; -export type I43mn70lup4q9c = { - "inputs": Anonymize; - "to": SS58String; -}; -export type I1d6jcc1nomglu = Array>; -export type Iblrnm4k0nni51 = { +export type Ibg509ejf21uui = { + "aliases": Anonymize; "value": number; "index": number; "revision": number; - "aliases": Anonymize; + "to": SS58String; + "external_asset_amount": bigint; + "new_vouchers": Anonymize; }; export type I286qhrd3thf21 = { "input": Anonymize; @@ -9990,76 +10762,183 @@ export type I286qhrd3thf21 = { "to": SS58String; "fee_currency": Anonymize; }; +export type Iblrnm4k0nni51 = { + "value": number; + "index": number; + "revision": number; + "aliases": Anonymize; +}; export type Iefn145htl05b6 = { - "inputs": Anonymize; + "inputs": Array>; "alias_proofs": Anonymize; "to": SS58String; "fee_currency": Anonymize; }; -export type I3kigttc60kr03 = { +export type I497d2v63rjmg = { "aliases": Anonymize; "value": number; "index": number; "revision": number; "split_into": Anonymize; + "max_fee": bigint; }; -export type I631cq2ecsn8vg = AnonymousEnum<{ +export type I4fsg1b207pt46 = AnonymousEnum<{ /** - * Schedule a airdrop event. + * Registers the parachain as a subscriber. + * The initial state will be sent over shortly via XCM. * - * The origin must be `ScheduleOrigin`. + * ## Origin + * Requires `ManageOrigin` (governance/root). * - * The total amount to be distributed in prizes will be put on hold. The event will be - * added to the schedule and be given an event id. + * ## Parameters + * - `subscriber_parachain_id`: The ParaId of the subscribing parachain. + * - `members_collections`: List of collection identifiers to subscribe to and their + * respective ring exponents. + * - `pallet_index`: Pallet index of members-subscriber on the subscriber chain. */ - "schedule_event": Anonymize; + "subscribe": Anonymize; /** - * Remove a scheduled airdrop event. + * Unsubscribes a parachain. * - * The origin must be `ScheduleOrigin`. + * ## Origin + * - **Self-unsubscribe**: Subscriber parachain via XCM (`EnsureSubscriberOrigin`) + * - **Governance unsubscribe**: Requires `ManageOrigin` * - * The event id must refer to a scheduled event. + * ## Parameters + * - `subscriber_parachain_id`: The ParaId to unsubscribe. Required for governance, ignored + * for self-unsubscribe (derived from XCM origin). + */ + "unsubscribe": Anonymize; + /** + * Requests replay of specific ring roots. * - * The total amount to be distributed in prizes will be released from hold. - * The event will be removed from the schedule. + * Permissionless — any signed origin can request a replay for any subscriber. + * The subscriber parachain is identified by the `subscriber_parachain_id` parameter. + * + * Parameters: + * - `subscriber_parachain_id`: The ParaId of the subscriber. + * - `identifier`: Collection identifier. + * - `ring_root_indices`: List of ring root indices, must be in strictly ascending order. */ - "remove_scheduled_event": Anonymize; + "request_replay": Anonymize; /** - * Register for a particular event. + * Enqueues pending updates into a sealed batch for distribution. * - * The origin must be the alias of a person in the context: airdrop context base - * concatenated to the airdrop event id in little-endian encoding in 4 bytes. - * The airdrop context base can be found in the metadata. + * Authorized call submitted by the offchain worker. + */ + "enqueue_updates": Anonymize; + /** + * Sends the current batch to a specific subscriber. * - * The event id must refer to an active event in the registering phase. - * The alias must not be already registered. + * Authorized maintenance call submitted by the offchain worker. + */ + "send_batch": Anonymize; + /** + * Sends one page of initialization data to a subscriber. * - * `dest` can be any account, it is the destination receiving the prize when winning the - * airdrop. It is better to set a different account for each airdrop to avoid linking - * information about winners. + * Authorized maintenance call submitted by the offchain worker. + */ + "send_init_page": Anonymize; + /** + * Abandons a stuck batch that exceeded `StuckBatchTimeout`. + * Subscribers that did not receive the batch can recover via `request_replay`. + * + * Authorized maintenance call submitted by the offchain worker when a batch has + * been active longer than `StuckBatchTimeout`. + */ + "abandon_stuck_batch": undefined; +}>; +export type Ic73rrpct6ckoa = { + "subscriber_parachain_id": number; + "members_collections": Anonymize; + "pallet_index": number; +}; +export type Ib1hmb261fe7mh = { + "subscriber_parachain_id"?: Anonymize; +}; +export type I9jfggcqa8oi6c = { + "subscriber_parachain_id": number; + "identifier": SizedHex<32>; + "ring_root_indices": Anonymize; +}; +export type I437snu8jbuaj2 = { + "send_page": number; +}; +export type Ic44opm4fbhp4r = { + "para_id": number; + "sequence": bigint; +}; +export type Ia7k5rk3a67fgt = { + "para_id": number; + "current_collection_index": number; + "after_ring_index"?: Anonymize; +}; +export type Idhb3rlvpbttgb = AnonymousEnum<{ + /** + * Enable or disable on_poll airdrop scheduling. While disabled the + * `OpeningAirdropPools` state remains active but opens no new pools. + * Re-enabling does not back-fill skipped periods: at most one pool is opened + * per period, and only for the current period. + */ + "set_airdrop_scheduling_enabled": Anonymize; +}>; +export type I49d4r1vpskv3o = AnonymousEnum<{ + /** + * Open a new prize pool from which `num_prizes` aliases in the `target` population + * may claim a fixed `prize_value`. * - * When registering the caller is assigned an index. This index will be used to identify - * the winners. + * Origin must be `T::ManagerOrigin`. Other pallets can use + * [`AirdropApi::open_prize_pool`] (gated by `T::TraitCallerOrigin`). */ - "register_for_event": Anonymize; + "open_prize_pool": Anonymize; /** - * Claim the prize of a failed transfer. + * Claim a prize from a `PrizeTarget::People` pool by submitting a ring- + * membership proof directly. * - * Prize are automatically transfered, but if unexpected event happens the transfer can - * fail, this transaction allows to claim the prize. + * This is an authorized extrinsic: the proof itself is the authentication. The + * per-pool [`PrizePoolClaims`] storage is the replay guard — each alias may claim + * once per pool. The proof is bound to `beneficiary` (so a captured proof cannot + * redirect the prize) and to the pool's context (so a proof cannot be replayed on + * a different pool). * - * The origin must signed by the destination of the prize. + * `alias` is the value the proof verifies to; the authorize closure rejects + * `AliasMismatch` if it disagrees with the proof. The dispatch body trusts + * `alias` and skips a second verification — this is sound because the call is + * only reachable through `ensure_authorized`, which proves the authorize closure + * accepted. * - * The signer must have a failed transfer prize for the given event id. + * The proof's context is `context_for_pool_id(pool_id)`; the proof is verified + * against `PEOPLE_IDENTIFIER` (lite-people are not eligible). The pool's target + * must be `PrizeTarget::People`; `GameParticipants` pools are claimed via the + * game pallet, which forwards to [`AirdropApi::claim_game_prize`]. + */ + "claim_prize": Anonymize; + /** + * Close a prize pool early. Origin must be the pool's `dispatcher` or satisfy + * `T::ManagerOrigin`. Releases `prize_value * prizes_remaining` of held funds back + * to the airdrop pot and marks the pool expired-now so the on-poll cleanup loop + * drains `PrizePoolClaims` over multiple ticks. This keeps the extrinsic's weight + * bounded by `PrizePoolClearLimit` regardless of how many claims the pool + * accumulated. */ - "claim_failed_transfer_prize": Anonymize; + "close_prize_pool": Anonymize; }>; -export type I6carn61qjeh6d = { - "event_info": Anonymize; +export type I3q0ci59rqeel6 = { + "target": Anonymize; + "dispatcher": SS58String; + "validity": number; + "num_prizes": number; + "prize_value": bigint; + "asset_id": Anonymize; + "winner_ratio": number; }; -export type I24nmtkeq4rln8 = { - "event_id": number; - "dest": SS58String; +export type Iferob091njnjq = { + "pool_id": number; + "ring_index": number; + "revision": number; + "proof": SizedHex<788>; + "alias": SizedHex<32>; + "beneficiary": SS58String; }; export type I4oqb168b2d4er = AnonymousEnum<{ /** @@ -10114,7 +10993,7 @@ export type I95iqep3b8snn9 = { }; export type I6052turo9tavh = (Anonymize) | undefined; export type Iemk0s5gdc9ruv = (Anonymize) | undefined; -export type I1v6u80pcf53ne = AnonymousEnum<{ +export type Ic6sunr27jf8hd = AnonymousEnum<{ "System": Anonymize; "ParachainSystem": Anonymize; "Timestamp": Anonymize; @@ -10129,28 +11008,46 @@ export type I1v6u80pcf53ne = AnonymousEnum<{ "PolkadotXcm": Anonymize; "CumulusXcm": undefined; "MessageQueue": Anonymize; - "Utility": Anonymize; - "Multisig": Anonymize; - "Sudo": Anonymize; - "Proxy": Anonymize; + "Utility": Anonymize; + "Multisig": Anonymize; + "Sudo": Anonymize; + "Proxy": Anonymize; "Identity": Anonymize; - "People": Anonymize; + "People": Anonymize; "MobRule": Anonymize; "ProofOfInk": Anonymize; - "Game": Anonymize; + "Game": Anonymize; "Score": Anonymize; "DummyDim": Anonymize; - "PeopleLite": Anonymize; - "Resources": Anonymize; + "PeopleLite": Anonymize; + "Resources": Anonymize; "ChunksManager": Anonymize; - "Members": Anonymize; - "Coinage": Anonymize; - "Airdrop": Anonymize; + "Members": Anonymize; + "Coinage": Anonymize; + "MembersNotifier": Anonymize; + "StorageInitialization": Anonymize; + "Airdrop": Anonymize; "MultiBlockMigrations": Anonymize; }>; export type Iavc33atjrmdmp = FixedSizeArray<2, Anonymize>; export type I596b7bbfu4tap = (Anonymize) | undefined; export type Ia4n949ohqh8lm = (Anonymize) | undefined; +export type I9vodnt2k1kha = AnonymousEnum<{ + "Yes": undefined; + "No": undefined; + "Stuck": undefined; +}>; +export type I4ao1le27fcisl = ({ + "current_migration": number; + "total_migrations": number; + "current_migration_steps": number; + "current_migration_max_steps"?: Anonymize; +}) | undefined; +export type Ih4ursllob8fg = { + "ongoing": Anonymize; + "progress"?: Anonymize; + "prefixes": Anonymize; +}; export type Iaqet9jc3ihboe = { "header": Anonymize; "extrinsics": Anonymize; @@ -10168,7 +11065,7 @@ export type I7u915mvkdsb08 = ResultPayload; "Codec": undefined; }>>; -export type Ie7mmsj6dufc7j = ResultPayload, Anonymize>; +export type I36df3b03i92s9 = ResultPayload, Anonymize>; export type I5nrjkj9qumobs = AnonymousEnum<{ "Invalid": Enum<{ "Call": undefined; @@ -10212,6 +11109,10 @@ export type I9ask1o4tfvcvs = ResultPayload<{ "longevity": bigint; "propagate": boolean; }, Anonymize>; +export type I4ph3d1eepnmr1 = { + "keys": Uint8Array; + "proof": Uint8Array; +}; export type Icerf8h8pdu8ss = (Array<[Uint8Array, SizedHex<4>]>) | undefined; export type I6spmpef2c7svf = { "weight": Anonymize; @@ -10238,53 +11139,34 @@ export type Iavct6f844hfju = AnonymousEnum<{ export type Ic0c3req3mlc1l = ResultPayload, Anonymize>; export type I7ocn4njqde3v5 = ResultPayload>; export type Iek7ha36da9mf5 = ResultPayload>; +export type Ibtr2nt1h0uqqj = ResultPayload<{ + "execution_result": ResultPayload, { + "post_info": Anonymize; + "error": Anonymize; + }>; + "emitted_events": Anonymize; + "local_xcm"?: (XcmVersionedXcm) | undefined; + "forwarded_xcms": Anonymize; +}, Anonymize>; +export type Ia1u1r3n74r13c = { + "actual_weight"?: Anonymize; + "pays_fee": Anonymize; +}; +export type Idpcji8r4t3a05 = Array>; +export type Ialhmrpub9sefe = Array<[XcmVersionedLocation, Array]>; +export type I55ku9c5gk50hb = AnonymousEnum<{ + "Unimplemented": undefined; + "VersionedConversionFailed": undefined; +}>; +export type I903fknvm1u4c2 = ResultPayload<{ + "execution_result": Anonymize; + "emitted_events": Anonymize; + "forwarded_xcms": Anonymize; +}, Anonymize>; export type Ieh6nis3hdbtgi = ResultPayload>; -export type Ico18ks790i2bl = AnonymousEnum<{ - "Chain": undefined; - "Network": undefined; - "Local": undefined; -}>; -export type I815pbp5omtss = { - "proof"?: (Enum<{ - "Sr25519": { - "signature": SizedHex<64>; - "signer": SizedHex<32>; - }; - "Ed25519": { - "signature": SizedHex<64>; - "signer": SizedHex<32>; - }; - "Secp256k1Ecdsa": { - "signature": SizedHex<65>; - "signer": SizedHex<33>; - }; - "OnChain": { - "who": SizedHex<32>; - "block_hash": SizedHex<32>; - "event_index": bigint; - }; - }>) | undefined; - "decryption_key"?: Anonymize; - "channel"?: Anonymize; - "priority"?: Anonymize; - "num_topics": number; - "topics": FixedSizeArray<4, SizedHex<32>>; - "data"?: Anonymize; -}; -export type Ib808ejar4brae = ResultPayload, Enum<{ - "NoReportingPhase": undefined; - "StatementIsNotSigned": undefined; - "InvalidSignature": undefined; - "InvalidTopic0": { - "expected"?: Anonymize; - "actual"?: Anonymize; - }; - "AccountIsNotAPlayer": undefined; - "PlayerIsNotRegistered": undefined; -}>>; export type Ic1d4u2opv3fst = { "upward_messages": Anonymize; "horizontal_messages": Anonymize; @@ -10296,26 +11178,22 @@ export type Ic1d4u2opv3fst = { export type Ie9sr1iqcg3cgm = ResultPayload; export type I1mqgk2tmnn9i2 = (string) | undefined; export type I6lr8sctk0bi4e = Array; -export type I3ju6ot8lfmk90 = ResultPayload, Enum<{ - "BadProof": undefined; - "NoProof": undefined; - "InternalError": undefined; -}>>; export type Id3vovj0ihlrsb = AnonymousEnum<{ - "Signed": Anonymize; "Disabled": undefined; + "Signed": { + "signature": Anonymize; + "account": SS58String; + }; }>; -export type I66dpqsgl2h4uc = { - "signature": Anonymize; - "account": SS58String; -}; export type I1rmvc8k7ssl0 = (Enum<{ "AsPersonalAliasWithAccount": number; - "AsPersonalAliasWithProof": [SizedHex<788>, number, SizedHex<32>]; + "AsPersonalAliasWithProof": Anonymize; "AsPersonalIdentityWithProof": [SizedHex<96>, bigint]; "AsPersonalIdentityWithAccount": number; - "AsPersonalAliasWithAccountRevised": [number, SizedHex<788>, number, SizedHex<32>]; + "AsPersonalAliasWithAccountRevised": Anonymize; }>) | undefined; +export type Ib87s2hfisv4o9 = [SizedHex<788>, number, SizedHex<32>]; +export type I6ade96413bp3l = [number, SizedHex<788>, number, SizedHex<32>]; export type I4rnuci7kia2r1 = (Enum<{ "AsApplyWithSig": number; "AsReferred": number; @@ -10327,12 +11205,16 @@ export type I6k0juar2doko8 = ({ "ticket": SS58String; "signature": Anonymize; }) | undefined; -export type Icbb3ruvdvu6qp = (Enum<{ - "AsLitePerson": { - "nonce": number; - }; +export type I6ul9o7lquu20t = (Enum<{ + "AsLitePerson": number; + "AsLiteAliasWithAccount": number; + "AsLiteAliasWithProof": Anonymize; + "AsLiteAliasWithAccountRevised": Anonymize; +}>) | undefined; +export type Iffdld0va52cu6 = (Enum<{ + "SelfInclude": SizedHex<96>; }>) | undefined; -export type Ied6o1m0g5iajq = (Enum<{ +export type I98dq16mf7vpj3 = (Enum<{ "AsCoin": undefined; "AsUnloadTokenPeople": { "proof": { @@ -10344,7 +11226,10 @@ export type Ied6o1m0g5iajq = (Enum<{ "alias_proofs": Anonymize; }; "AsUnloadTokenLitePeople": { - "proof": Anonymize; + "proof": { + "proof": SizedHex<788>; + "ring": number; + }; "period": number; "counter": number; "alias_proofs": Anonymize; @@ -10362,5 +11247,14 @@ export type Ied6o1m0g5iajq = (Enum<{ "fee_recycler_revision": number; "alias_proofs": Anonymize; }; + "InfallibleUnpaidSigned": { + "nonce": number; + }; +}>) | undefined; +export type Ic3b9c1lrhkh77 = (Enum<{ + "RegisterFriendRequestWithProof": [SizedHex<788>, number]; + "RegisterFriendRequestForCollection": [SizedHex<788>, number, Anonymize]; + "RegisterStatementStoreAllowance": [SizedHex<788>, number, Anonymize]; + "ClaimLongTermStorage": [SizedHex<788>, number, number, Anonymize]; }>) | undefined; export {}; diff --git a/packages/host-papp/.papi/descriptors/dist/descriptors-D5oN4i7I.js b/packages/host-papp/.papi/descriptors/dist/descriptors-D5oN4i7I.js new file mode 100644 index 00000000..eaea22c1 --- /dev/null +++ b/packages/host-papp/.papi/descriptors/dist/descriptors-D5oN4i7I.js @@ -0,0 +1,25 @@ +const [minified, commonTrees, tokens] = JSON.parse(`[{"people_lite":{"storage":{"1":{"0":0,"ExtrinsicCount":1,"InherentsApplied":2,"BlockWeight":3,"BlockSize":1,"BlockHash":4,"ExtrinsicData":5,"Number":1,"ParentHash":6,"Digest":7,"Events":8,"EventCount":1,"EventTopics":9,"LastRuntimeUpgrade":10,"BlocksTillUpgrade":1,"UpgradedToU32RefCount":2,"UpgradedToTripleRefCount":2,"ExecutionPhase":11,"AuthorizedUpgrade":12,"ExtrinsicWeightReclaimed":13},"2":{"BlockWeightMode":33,"PreviousCoreCount":1,"UnincludedSegment":34,"AggregatedUnincludedSegment":35,"PendingValidationCode":36,"NewValidationCode":36,"ValidationData":37,"DidSetValidationCode":2,"LastRelayChainBlockNumber":1,"UpgradeRestrictionSignal":38,"UpgradeGoAhead":39,"RelayStateProof":40,"RelevantMessagingState":41,"HostConfiguration":42,"LastDmqMqcHead":6,"LastHrmpMqcHeads":43,"ProcessedDownwardMessages":1,"LastProcessedDownwardMessage":44,"HrmpWatermark":1,"LastProcessedHrmpMessage":44,"HrmpOutboundMessages":45,"UpwardMessages":40,"PendingUpwardMessages":40,"PendingUpwardSignals":40,"PendingApprovedPeer":36,"UpwardDeliveryFeeFactor":46,"AnnouncedHrmpMessagesPerCandidate":1,"ReservedXcmpWeightOverride":13,"ReservedDmpWeightOverride":13,"CustomValidationHeadData":36,"PoVMessagesTracker":47},"3":{"Now":46,"DidUpdate":2},"4":{"ParachainId":1},"5":0,"8":{"0":56,"6":58,"7":59,"TotalIssuance":46,"InactiveIssuance":46,"Locks":57,"Freezes":60},"9":{"NextFeeMultiplier":46,"StorageVersion":82,"TxPaymentCredit":46},"10":0,"11":{"Usages":85},"13":{"0":89,"6":92,"12":91,"Asset":88,"Approvals":90,"NextAssetId":93},"14":{"7":138,"BalancesOnHold":139},"15":{"ConversionRateToNative":141},"16":0,"17":{"Author":148},"18":{"Invulnerables":149,"CandidateList":150,"LastAuthoredBlock":151,"DesiredCandidates":1,"CandidacyBond":46},"19":{"Validators":149,"CurrentIndex":1,"QueuedChanged":2,"QueuedKeys":166,"DisabledValidators":167,"NextKeys":168,"KeyOwner":169,"ExternallySetKeys":170},"21":{"20":174,"CurrentSlot":46},"22":{"20":174,"RelaySlotInfo":175},"23":{"InboundXcmpSuspended":176,"OutboundXcmpStatus":177,"OutboundXcmpMessages":178,"SignalMessages":5,"QueueConfig":179,"QueueSuspended":2,"DeliveryFeeFactor":180},"24":{"QueryCounter":46,"Queries":183,"AssetTraps":184,"SafeXcmVersion":1,"SupportedVersion":185,"VersionNotifiers":186,"VersionNotifyTargets":187,"VersionDiscoveryQueue":188,"CurrentMigration":189,"RemoteLockedFungibles":190,"LockedFungibles":191,"XcmExecutionSuspended":2,"ShouldRecordXcm":2,"RecordedXcm":192,"AuthorizedAliases":193},"25":0,"26":{"BookStateFor":232,"ServiceHead":233,"Pages":234},"27":0,"28":{"Multisigs":251},"29":{"Key":148},"30":0,"31":{"Proxies":267,"Announcements":268},"33":{"32":168,"IdentityOf":283,"UsernameOf":284,"SuperOf":285,"SubsOf":286,"Registrars":287,"AuthorityOf":288,"UsernameInfoOf":289,"PendingUsernames":290,"UnbindingUsernames":291,"PersonIdentities":292,"PendingUsernameReports":293},"34":{"32":332,"34":330,"35":331,"Keys":329,"CounterForKeys":1,"AccountToPersonalId":333,"NextPersonalId":46,"PeopleCollectionCreated":2,"ReservedPersonalId":334},"37":{"36":350,"Credits":343,"VotingPenalties":184,"VotingPoints":344,"Votes":345,"CaseCount":1,"OpenCases":346,"RipeCases":347,"DoneCases":348,"AccumulatedPoints":46,"PayoutDistribution":349,"ActiveSince":46},"40":{"34":374,"38":151,"39":379,"Candidates":373,"ReferralTickets":375,"DesignFamilies":376,"CommittedDesigns":377,"AllocationCount":1,"Configuration":378,"ReferrerReimbursementValues":380,"ReferredReimbursementValues":380},"41":{"38":151,"39":379,"41":412,"TestnetStoredPhaseDurations":407,"Nfts":408,"NftCandidates":409,"ArchivedPlayers":410,"Players":411,"GameIndex":1,"GameHistory":413,"PlayerAttendanceHistory":414,"GameParticipantCount":413,"IndexToPlayer":415,"PlayerToIndex":414,"ShuffleRecognized":416,"ShuffleNotRecognized":416,"GameSchedules":417,"AliasToStmtAccount":418,"StmtAccountToAlias":168,"CommunicationIdentifiers":419,"ScratchReward":420,"ScratchEligibilityMap":421,"ScratchClaimedCount":1},"42":{"36":446,"Participants":440,"PersonhoodThreshold":1,"AbsenceGraceSchedule":441,"AbsenceGraceRatio":442,"CurrentRoundPoints":1,"CurrentRoundIndex":1,"RoundsPointsForParticipant":443,"RoundPayouts":444,"RoundPlanning":445},"43":{"34":456,"ReservedIds":334},"44":{"32":332,"35":331,"LitePeople":462,"LitePeopleCollectionCreated":2,"AttestationAllowance":151},"45":{"Consumers":467,"StatementStoreAllowances":468,"StmtStoreAllowanceByAccount":469,"FriendRequestRegistrationByAlias":470,"FriendRequestAliasByAccount":168,"SpentLongTermStorageAliases":471,"UsernameOwnerOf":472,"AccountOfAlias":418,"UsernameReservationDuration":46,"UsernameReservationQueue":473,"ReservationOf":284},"46":{"Chunks":494,"ChunkPageHashes":495},"47":{"47":507,"Collections":500,"SuspendedCollections":500,"IdentifiersOf":501,"Root":502,"OldRoots":503,"CurrentRingIndex":184,"OnboardingSize":184,"RingKeys":504,"RingKeysStatus":505,"PendingSuspensions":506,"ActiveMembers":184,"RingsState":508,"StaleRings":509,"QueuePageIndices":510,"OnboardingQueue":511,"RingDeletionQueue":512},"48":{"CoinsByOwner":531,"LockedCoins":532,"TotalValueOfDestroyedCoins":46,"ConsumedFreeUnloadTokens":533,"RecyclerCollectionCreated":534,"RecyclersLastRemovedRingIndex":413,"RecyclersCoinToRecycler":184,"RecyclersUnloaded":535,"RecyclersDusting":536,"PaidUnloadTokenMembers":537,"PaidUnloadTokenConsumed":538,"PaidTokenCollectionsCreated":539,"PaidUnloadTokenDusting":539,"PaidUnloadTokenNextRingToClean":540,"InitializePalletAccount":541},"49":{"Subscribers":588,"CounterForSubscribers":1,"SealedBatchSequence":46,"PageState":589,"PendingUpdates":590,"PageUpdatesCount":413,"PendingInit":591,"CounterForPendingInit":1,"SealedBatchIndices":592,"CurrentBatch":593,"SubscribersWithCurrentBatch":534,"LastReplayTime":594},"51":{"50":605,"XcmTransferInitiatedAt":1,"LastAirdropPoolPeriod":1,"AirdropSchedulingEnabled":2},"52":{"50":609},"53":{"NextPrizePoolId":1,"PrizePools":610,"CounterForPrizePools":1,"PrizePoolClaims":611},"54":{"Cursor":620,"Historic":621}},"tx":{"1":{"remark":18,"set_heap_pages":19,"set_code":20,"set_code_without_checks":20,"set_storage":21,"kill_storage":22,"kill_prefix":23,"remark_with_event":18,"authorize_upgrade":24,"authorize_upgrade_without_checks":24,"apply_authorized_upgrade":20},"2":{"set_validation_data":48,"sudo_send_upward_message":49},"3":{"set":55},"4":0,"5":0,"8":{"55":62,"56":61,"57":63,"58":68,"transfer_allow_death":61,"force_unreserve":64,"upgrade_accounts":65,"force_set_balance":66,"force_adjust_total_issuance":67},"9":0,"10":0,"11":{"clean_usage":86},"13":{"55":104,"56":103,"57":117,"58":102,"59":98,"60":103,"force_create":99,"start_destroy":100,"destroy_accounts":100,"destroy_approvals":100,"finish_destroy":100,"mint":101,"freeze":105,"thaw":105,"freeze_asset":100,"thaw_asset":100,"transfer_ownership":106,"set_team":107,"set_metadata":108,"clear_metadata":100,"force_set_metadata":109,"force_clear_metadata":100,"force_asset_status":110,"approve_transfer":111,"cancel_approval":112,"force_cancel_approval":113,"transfer_approved":114,"touch":100,"refund":115,"set_min_balance":116,"touch_other":105,"refund_other":105,"block":105,"set_reserves":118},"14":0,"15":{"59":142,"update":142,"remove":143},"16":0,"17":0,"18":{"set_invulnerables":153,"set_desired_candidates":154,"set_candidacy_bond":155,"register_as_candidate":156,"leave_intent":156,"add_invulnerable":157,"remove_invulnerable":157,"update_bond":158,"take_candidate_slot":159},"19":{"set_keys":171,"purge_keys":156},"21":0,"22":0,"23":{"suspend_xcm_execution":156,"resume_xcm_execution":156,"update_suspend_threshold":181,"update_drop_threshold":181,"update_resume_threshold":181},"24":{"send":195,"teleport_assets":196,"reserve_transfer_assets":196,"execute":197,"force_xcm_version":198,"force_default_xcm_version":199,"force_subscribe_version_notify":200,"force_unsubscribe_version_notify":200,"limited_reserve_transfer_assets":201,"limited_teleport_assets":201,"force_suspension":202,"transfer_assets":201,"claim_assets":203,"transfer_assets_using_type_and_then":204,"add_authorized_alias":205,"remove_authorized_alias":206,"remove_all_authorized_aliases":156},"25":0,"26":{"reap_page":236,"execute_overweight":237},"27":{"batch":242,"as_derivative":243,"batch_all":242,"dispatch_as":244,"force_batch":242,"with_weight":245,"if_else":246,"dispatch_as_fallible":244},"28":{"61":256,"as_multi_threshold_1":252,"as_multi":253,"approve_as_multi":254,"cancel_as_multi":255},"29":{"sudo":262,"sudo_unchecked_weight":245,"set_key":263,"sudo_as":264,"remove_key":156},"30":0,"31":{"61":156,"proxy":271,"add_proxy":272,"remove_proxy":272,"remove_proxies":156,"create_pure":273,"kill_pure":274,"announce":275,"remove_announcement":275,"reject_announcement":276,"proxy_announced":277},"33":{"add_registrar":294,"set_identity":295,"set_subs":296,"clear_identity":156,"request_judgement":297,"cancel_request":298,"set_fee":299,"set_account_id":300,"set_fields":301,"provide_judgement":302,"kill_identity":303,"add_sub":304,"rename_sub":304,"remove_sub":305,"quit_sub":156,"add_username_authority":306,"remove_username_authority":307,"set_username_for":308,"accept_username":309,"remove_expired_approval":309,"set_primary_username":309,"unbind_username":309,"remove_username":309,"kill_username":309,"set_personal_identity":310,"submit_personal_credential_evidence":311,"personal_credential_judged":312,"clear_personal_identity":156,"report_username":309,"reported_username_judged":312},"34":{"62":336,"63":156,"under_alias":262,"force_recognize_personhood":337,"set_personal_id_account":336,"unset_personal_id_account":156,"create_people_collection":156,"clean_up_stale_aliases":338},"37":{"64":357,"65":358,"vote":351,"close_case":352,"clean_vote":353,"reap_case":352,"intervene":354,"claim_vote":352,"payout_rewards":355,"claim_votes":356,"start_payout_round":156,"claim_credit":156,"clean_points":359,"force_ripen_case":352,"touch_case":352,"clear_voting_penalty":156,"clean_vote_signed":353},"40":{"66":389,"67":390,"68":388,"69":388,"apply":156,"submit_evidence":381,"judged":312,"register_referred":382,"register_non_referred":382,"reroll":156,"commit":383,"allocate_full":156,"timeout":384,"flakeout":156,"apply_with_signature":385,"apply_with_invitation":386,"add_design_family":387,"set_referral_ticket":388,"cancel_referral_ticket":388,"register_successful_referral_reward":355,"set_configuration":391,"set_reimbursement_values":392},"41":{"66":389,"67":390,"68":388,"69":388,"sign_up_with_invite":422,"sign_up_with_account":422,"sign_up_with_alias":423,"report":424,"offboard":156,"kickout":425,"schedule_games":426,"remove_scheduled_game":427,"claim_reward":428,"claim_game_prize":429,"testnet_force_start_shuffle":156,"testnet_force_end_reporting":156,"testnet_set_game_phases":430,"testnet_kill_current_game":156},"42":{"64":447,"65":358,"transition_round":448,"operate_payout_round":449,"cash_out":156,"redeem_credit":355,"register":450,"set_absence_grace_schedule":451},"43":{"reserve_ids":457,"renew_id_reservation":458,"cancel_id_reservation":458,"recognize_personhood":459,"suspend_personhood":460,"resume_personhood":458,"start_mutation_session":156,"end_mutation_session":156},"44":{"62":464,"63":156,"increase_attestation_allowance":389,"clear_attestation_allowance":384,"attest":463,"dispatch_as_signer":262},"45":{"register_lite_person":477,"register_person":478,"touch_person_authorization":156,"remove_expired_username_reservation":479,"update_identifier_key":422,"set_username_reservation_duration":480,"demote_auth_expired":384,"set_friend_request_statement_account_for_sequence":481,"clear_expired_friend_request_sequence":482,"set_statement_store_account":483,"clear_expired_stmt_store_allowances":484,"claim_long_term_storage":485,"clear_expired_long_term_storage_aliases":486},"46":{"add_chunks":496,"set_chunk_page_hashes":497},"47":{"merge_rings":513,"set_onboarding_size":514,"self_include":515,"build_ring_authorized":516,"onboard_members_authorized":517,"merge_queue_pages_authorized":518,"remove_suspended_keys_authorized":519,"delete_ring_page_authorized":520,"enqueue_ring_deletion_authorized":519,"delete_onboarding_queue_page_authorized":521,"finalize_collection_deletion_authorized":522,"mark_ring_stale_authorized":519,"clean_up_old_roots_authorized":523},"48":{"60":560,"split":559,"load_recycler_with_coin":561,"load_recycler_with_external_asset":562,"load_recycler_with_external_asset_unpaid":562,"load_recycler_with_external_asset_unpaid_batch":563,"unload_recycler_into_coin":564,"unload_recycler_into_external_asset":564,"pay_for_recycler_unload_fee_token_with_coin":561,"pay_for_recycler_unload_fee_token_with_native":561,"pay_for_recycler_unload_fee_token_with_stable":561,"unload_recycler_into_external_asset_and_vouchers":565,"unload_recycler_into_external_asset_non_anonymous":566,"unload_recyclers_into_external_asset_non_anonymous":567,"unload_recycler_into_coins":568,"direct_offboard_coin_into_external_asset":560,"clean_recycler":569,"clean_consumed_free_token":570,"clean_paid_unload_token_ring":571,"clean_recycler_dust":156,"clean_paid_unload_token_dust":156,"delete_expired_paid_unload_token_collection":570},"49":{"subscribe":595,"unsubscribe":596,"request_replay":597,"enqueue_updates":598,"send_batch":599,"send_init_page":600,"abandon_stuck_batch":156},"51":{"set_airdrop_scheduling_enabled":606},"52":0,"53":{"open_prize_pool":612,"claim_prize":613,"close_prize_pool":614},"54":{"force_set_cursor":626,"force_set_active_cursor":627,"force_onboard_mbms":156,"clear_historic":628}},"events":{"1":{"ExtrinsicSuccess":25,"ExtrinsicFailed":26,"CodeUpdated":27,"NewAccount":28,"KilledAccount":28,"Remarked":29,"UpgradeAuthorized":30,"RejectedInvalidAuthorizedUpgrade":31},"2":{"ValidationFunctionStored":50,"ValidationFunctionApplied":51,"ValidationFunctionDiscarded":50,"DownwardMessagesReceived":52,"DownwardMessagesProcessed":53,"UpwardMessageSent":54},"3":0,"4":0,"5":0,"8":{"70":73,"71":75,"72":75,"73":73,"74":73,"75":78,"76":78,"Endowed":69,"DustLost":70,"Transfer":71,"BalanceSet":72,"Reserved":73,"Unreserved":73,"ReserveRepatriated":74,"Deposit":73,"Withdraw":73,"Slashed":73,"Minted":73,"MintedCredit":75,"Suspended":73,"Restored":73,"Upgraded":76,"Rescinded":75,"Locked":73,"Unlocked":73,"TotalIssuanceForced":77,"BurnedHeld":78,"TransferOnHold":79,"TransferAndHold":80,"Unexpected":81},"9":{"TransactionFeePaid":83},"10":{"FeeSkipped":84},"11":{"UsageCleaned":87},"13":{"70":122,"71":137,"72":120,"73":125,"74":125,"Created":119,"Transferred":121,"TeamChanged":123,"OwnerChanged":124,"AssetFrozen":126,"AssetThawed":126,"AccountsDestroyed":127,"ApprovalsDestroyed":128,"DestructionStarted":126,"Destroyed":126,"ForceCreated":124,"MetadataSet":129,"MetadataCleared":126,"ApprovedTransfer":130,"ApprovalCancelled":131,"TransferredApproved":132,"AssetStatusChanged":126,"AssetMinBalanceChanged":133,"Touched":134,"Blocked":125,"Deposited":135,"Withdrawn":135,"ReservesUpdated":136,"ReservesRemoved":126,"IssuedCredit":137,"BurnedCredit":137,"IssuedDebt":137},"14":{"70":140,"75":140,"76":140},"15":{"AssetRateCreated":144,"AssetRateRemoved":145,"AssetRateUpdated":146},"16":{"AssetTxFeePaid":147},"17":0,"18":{"NewInvulnerables":160,"InvulnerableAdded":161,"InvulnerableRemoved":161,"NewDesiredCandidates":162,"NewCandidacyBond":163,"CandidateAdded":164,"CandidateBondUpdated":164,"CandidateRemoved":161,"CandidateReplaced":165,"InvalidInvulnerableSkipped":161},"19":{"NewSession":172,"NewQueued":50,"ValidatorDisabled":173,"ValidatorReenabled":173},"21":0,"22":0,"23":{"XcmpMessageSent":182},"24":{"Attempted":207,"Sent":208,"SendFailed":209,"ProcessXcmError":210,"UnexpectedResponse":211,"ResponseReady":212,"Notified":213,"NotifyOverweight":214,"NotifyDispatchError":213,"NotifyDecodeFailed":213,"InvalidResponder":215,"InvalidResponderVersion":211,"ResponseTaken":216,"AssetsTrapped":217,"VersionChangeNotified":218,"SupportedVersionChanged":219,"NotifyTargetSendFail":220,"NotifyTargetMigrationFail":221,"InvalidQuerierVersion":211,"InvalidQuerier":222,"VersionNotifyStarted":223,"VersionNotifyRequested":223,"VersionNotifyUnrequested":223,"FeesPaid":224,"AssetsClaimed":217,"VersionMigrationFinished":225,"AliasAuthorized":226,"AliasAuthorizationRemoved":227,"AliasesAuthorizationsRemoved":228},"25":{"InvalidFormat":230,"UnsupportedVersion":230,"ExecutedDownward":231},"26":{"ProcessingFailed":238,"Processed":239,"OverweightEnqueued":240,"PageReaped":241},"27":{"BatchInterrupted":247,"BatchCompleted":50,"BatchCompletedWithErrors":50,"ItemCompleted":50,"ItemFailed":248,"DispatchedAs":249,"IfElseMainSuccess":50,"IfElseFallbackCalled":250},"28":{"77":261,"NewMultisig":257,"MultisigApproval":258,"MultisigExecuted":259,"MultisigCancelled":260},"29":{"Sudid":265,"KeyChanged":266,"KeyRemoved":50,"SudoAsDone":265},"30":0,"31":{"77":282,"ProxyExecuted":249,"PureCreated":278,"PureKilled":279,"Announced":280,"ProxyAdded":281,"ProxyRemoved":281},"33":{"78":314,"IdentitySet":76,"IdentityCleared":313,"IdentityKilled":313,"JudgementUnrequested":314,"JudgementGiven":315,"RegistrarAdded":316,"SubIdentityAdded":317,"SubIdentitiesSet":318,"SubIdentityRenamed":319,"SubIdentityRemoved":317,"SubIdentityRevoked":317,"AuthorityAdded":320,"AuthorityRemoved":320,"UsernameSet":321,"UsernameQueued":322,"PreapprovalExpired":323,"PrimaryUsernameSet":321,"DanglingUsernameRemoved":321,"UsernameUnbound":324,"UsernameRemoved":324,"UsernameKilled":324,"UsernameReported":325,"PersonalIdentitySet":326,"EvidenceSubmitted":327,"CredentialAccepted":327,"CredentialRejected":327,"PersonBanned":327,"PersonalIdentityCleared":327,"ReportedUsernameJudgedValid":324,"ReportedUsernameJudgedInvalid":324,"ReportedUsernameWeakOrUnclearJudgement":328},"34":{"79":339,"80":340,"81":340,"PersonOnboarding":339,"AliasDispatched":340,"PersonalIdAccountSet":341,"PersonalIdAccountUnset":341,"CollectionCreated":50,"ForcePersonhoodRecognized":342,"AliasCleanedUp":340},"37":{"82":367,"83":368,"84":369,"CaseCreated":360,"Callback":249,"CallbackError":50,"CaseClosed":361,"Voted":362,"VoteCleaned":363,"CaseRemoved":360,"CaseIntervened":361,"VotesClaimed":364,"RewardPayout":365,"PayoutRoundStarted":366,"PointsCleaned":370,"CaseTouched":371,"VotingPenaltyCleared":372},"40":{"78":161,"85":395,"86":401,"87":401,"88":404,"89":405,"90":405,"CandidateApplied":161,"JudgementProvided":393,"RetryGranted":394,"CandidateReferred":396,"Rerolled":161,"DesignCommitted":397,"FullyAllocated":161,"TimedOut":161,"FlakedOut":161,"TicketReferred":398,"TicketCancelled":398,"TicketApplied":399,"FamilyAdded":400,"InvitedCandidateApplied":402,"ReferralVoucherRegistered":403,"ConfigurationSet":406},"41":{"86":401,"87":401,"88":404,"89":401,"90":401,"NewGame":431,"GameEnded":368,"SignedUp":432,"ReportSubmitted":433,"Offboarded":432,"KickedOut":434,"GamesScheduled":52,"ScheduledGameRemoved":435,"StmtUsageRemoved":372,"ScratchRewardAvailable":436,"ScratchRewardClaimed":437,"GamePrizePoolOpened":438,"GamePrizePoolOpenFailed":439},"42":{"79":453,"82":454,"83":368,"84":452,"RoundTransitioned":455,"PayoutRoundOperated":455,"CashedOut":432},"43":{"IdsReserved":52,"IdRenewed":461,"IdUnreserved":461,"PeopleRegistered":52,"PeopleSuspended":52,"PersonhoodResumed":461,"SuspensionsStarted":50,"SuspensionsEnded":50},"44":{"80":340,"81":340,"AllAttestationAllowanceCleared":465,"AttestationAllowanceIncreased":404,"PersonAttested":466,"ConsumerRegistered":28},"45":{"85":487,"LitePersonRegistered":28,"FriendRequestStmtUsageSet":488,"FriendRequestStmtUsageRemoved":28,"PersonAuthorizationTouched":28,"ExpiredUsernameReservationRemoved":489,"IdentifierKeyUpdated":28,"UsernameReservationDurationSet":490,"StmtStoreAllowanceSet":488,"StmtStoreAllowancesCleared":491,"PersonDemoted":28,"LongTermStorageClaimed":492,"LongTermStorageAllocationFailed":492,"LongTermStorageAliasesCleared":493},"46":{"ChunkPageHashesInitialized":498,"ChunksAdded":499},"47":{"MemberAdded":524,"MemberRemoved":524,"CollectionMarkedForDeletion":525,"CollectionDeleted":525,"RingBuilt":526,"MembersOnboarded":525,"RingsMerged":527,"OnboardingSizeSet":528,"MemberSelfIncluded":529,"OldRootCleanedUp":530},"48":{"CoinSplit":572,"CoinTransferred":573,"RecyclerLoadedWithCoin":574,"RecyclerLoadedWithExternalAsset":575,"RecyclerUnloadedIntoCoin":576,"RecyclerUnloadedIntoExternalAsset":577,"RecyclerUnloadedIntoExternalAssetAndVouchers":578,"PaidUnloadTokenRegisteredWithCoin":579,"PaidUnloadTokenRegisteredWithNative":580,"PaidUnloadTokenRegisteredWithStable":580,"PeopleFreeUnloadTokenConsumed":581,"LitePeopleFreeUnloadTokenConsumed":581,"RecyclersUnloadedIntoCoin":582,"RecyclersUnloadedIntoExternalAsset":583,"RecyclersUnloadedIntoExternalAssetNonAnonymous":584,"RecyclerUnloadedIntoCoins":572,"CoinOffboardedIntoExternalAsset":585,"RecyclerCleaned":586,"ConsumedFreeTokensCleaned":581,"PaidUnloadTokenRingCleaned":587,"RecyclerDustCleaned":50,"PaidUnloadTokenDustCleaned":50,"ExpiredPaidUnloadTokenCollectionDeleted":581},"49":{"Subscribed":601,"Unsubscribed":601,"UpdatesSent":602,"UpdateSendFailed":601,"ReplayRequested":603,"BatchAbandoned":604},"51":{"91":50,"AssetCreated":50,"XcmFundsTransferSent":50,"XcmFundsTransferTimedOut":50,"FundsVerified":50,"PotsFunded":50,"MobRulePayoutsScheduled":50,"ScorePayoutsScheduled":50,"AirdropPoolOpened":607,"AirdropSchedulingEnabledChanged":608,"OnPollInitializationCompleted":50,"MigrationPeopleRecognized":50,"MigrationOnboardingSizeSet":50,"MigrationProofOfInkInitialized":50,"MigrationGamesScheduled":50,"MigrationInvitesGranted":50,"MigrationReimbursementValuesSet":50,"MigrationAttestationAllowancesSet":50},"52":{"InitializationCompleted":50},"53":{"PrizePoolOpened":615,"PrizeClaimed":616,"AllPrizesClaimed":617,"PrizePoolExpired":618,"PrizePoolClosed":618,"PrizeTransferFailed":619},"54":{"91":630,"UpgradeStarted":629,"UpgradeCompleted":50,"UpgradeFailed":50,"MigrationSkipped":368,"MigrationAdvanced":630,"MigrationFailed":630,"HistoricCleared":631}},"constants":{"1":{"BlockWeights":14,"BlockLength":15,"BlockHashCount":1,"DbWeight":16,"Version":17,"SS58Prefix":1},"2":{"SelfParaId":1},"3":{"MinimumPeriod":46},"4":0,"5":0,"8":{"ExistentialDeposit":46,"MaxLocks":1,"MaxReserves":1,"MaxFreezes":1},"9":{"OperationalFeeMultiplier":1},"10":0,"11":0,"13":{"RemoveItemsLimit":1,"AssetDeposit":46,"AssetAccountDeposit":46,"MetadataDepositBase":46,"MetadataDepositPerByte":46,"ApprovalDeposit":46,"StringLimit":1},"14":0,"15":0,"16":0,"17":0,"18":{"92":152,"MaxCandidates":1,"MinEligibleCollators":1,"MaxInvulnerables":1,"KickThreshold":1,"pot_account":148},"19":{"KeyDeposit":46},"21":{"SlotDuration":46},"22":0,"23":{"MaxInboundSuspended":1,"MaxActiveOutboundChannels":1,"MaxPageSize":1},"24":{"UniversalLocation":194,"AdvertisedXcmVersion":1,"MaxLockers":1,"MaxRemoteLockConsumers":1},"25":0,"26":{"HeapSize":1,"MaxStale":1,"ServiceWeight":235,"IdleMaxServiceWeight":235},"27":{"batched_calls_limit":1},"28":{"DepositBase":46,"DepositFactor":46,"MaxSignatories":1},"29":0,"30":0,"31":{"ProxyDepositBase":46,"ProxyDepositFactor":46,"MaxProxies":1,"MaxPending":1,"AnnouncementDepositBase":46,"AnnouncementDepositFactor":46},"33":{"93":1,"94":1,"BasicDeposit":46,"ByteDeposit":46,"UsernameDeposit":46,"SubAccountDeposit":46,"UsernameReportDeposit":46,"MaxSubAccounts":1,"UsernameReportTimeout":1,"MaxRegistrars":1,"MaxJudgements":1,"PendingUsernameExpiration":1,"UsernameGracePeriod":1,"MaxSuffixLength":1,"CredentialRemovalPenalty":46,"identity_context":6},"34":{"95":1,"RingExponent":335,"StaleAliasCleanupInterval":1,"account_setup_time_tolerance":1},"37":{"96":93,"97":1,"MaxVoteClaimDuration":46,"MinCaseDuration":1,"MaxVotingDuration":1,"MinTurnoutNominal":1,"MinTurnoutPercentage":1,"VotingPenaltyDuration":1,"MaxVotesClaimable":1,"CleanVotesBatchSize":1,"VotesOpenForClaimsDuration":1,"MinimumVoterThreshold":1,"mob_rule_pot_id":148,"mob_rule_context":6},"40":{"92":152,"MaxActiveReferrals":1,"proof_of_ink_pot_id":148},"41":{"MaxRounds":1,"MaxGroupSize":1,"MinGroupSize":1,"NonPlayingKickoutTime":1,"PhaseDurations":407,"MaxGameSchedules":1,"MaxAttendanceHistoryDepth":1,"RewardPerWinner":46,"proof_of_ownership_msg_base":6},"42":{"96":93,"97":1,"score_pot_id":148,"score_context":6,"ubi_points":1},"43":0,"44":{"LiteRingExponent":335,"LiteOnboardingSize":1,"account_setup_block_tolerance":1},"45":{"93":1,"94":1,"98":1,"PersonAuthDuration":1,"MinPersonAuthUpdateInterval":1,"MaxReservationQueueLength":1,"AccountsApiAllowance":474,"StmtStoreSlotsPerPeriod":1,"LiteStmtStoreSlotsPerPeriod":1,"StmtStoreCleanupLimit":1,"StmtStoreReplacementCooldown":1,"FriendRequestAllowance":474,"FriendRequestSlotsPerPeriod":1,"LiteFriendRequestSlotsPerPeriod":1,"FriendRequestPeriodDuration":1,"FriendRequestGraceWindow":1,"FriendRequestRetentionDuration":46,"LongTermStoragePeriodDuration":1,"LongTermStorageClaimsPerPeriod":1,"LongTermStorageGraceWindow":1,"LongTermStorageCleanupLimit":1},"46":{"PageSize":1},"47":{"95":1,"98":1,"99":1,"MaxFlexibleRingExponent":335,"RingBuildingMemberLimit":1,"OldRootRetentionDuration":46},"48":{"98":1,"RecyclerRingExponent":335,"PaidUnloadTokenRingExponent":335,"UnderlyingAssetId":93,"UnderlyingAssetUnit":46,"MinimumExponent":1,"MaximumExponent":1,"MinimumExponentForOutputUnloadFee":1,"MaxSplitOutputs":1,"MaxConsolidation":1,"MaxBatchUnpaidLoad":1,"UnloadTokenTimePeriodPeopleLitePeople":1,"UnloadTokenAllowancePerTimePeriodForPeople":46,"UnloadTokenAllowancePerTimePeriodForLitePeople":46,"MaxFreeUnloadTokensPerTimePeriod":1,"CoinFailureLockPeriod":46,"pallet_account":148},"49":{"98":1,"99":1,"MaxSubscribers":1,"MaxUpdatesPerBatch":1,"MaxCollectionsPerSubscriber":1,"UpdateTriggerBlocks":1,"UpdateTriggerThreshold":1,"RequestReplayRemoteWeight":13,"StuckBatchTimeout":1,"ReplayCooldownSeconds":46},"51":0,"52":0,"53":{"MinValiditySeconds":1,"MaxValiditySeconds":1,"PrizePoolClearLimit":1,"airdrop_pot_id":148},"54":{"CursorMaxLen":1,"IdentifierMaxLen":1}},"viewFns":{"1":0,"2":0,"3":0,"4":0,"5":0,"8":0,"9":0,"10":0,"11":0,"13":{"asset_details":94,"balance_of":95,"get_metadata":96,"get_reserves_data":97},"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":{"check_permissions":269,"is_superset":270},"33":0,"34":0,"37":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":{"current_stmt_store_period":475,"stmt_store_slot_context_for":476,"friend_request_context_for":476},"46":0,"47":0,"48":{"get_free_unload_token_info":542,"get_recycler_ring_status":543,"get_recycler_ring_revision":544,"get_paid_token_ring_status":545,"get_paid_token_ring_revision":546,"get_paid_unload_token_fee_in_asset":547,"get_paid_unload_token_fee_in_native":548,"get_coin_by_owner":549,"get_coin_lock_until":550,"get_recycler_member_info":551,"is_paid_token_member":552,"get_recycler_members":553,"get_paid_token_ring_members":554,"is_recycler_alias_unloaded":555,"is_paid_token_alias_consumed":556,"is_free_token_alias_consumed":557,"weight_for_unload_recycler_paying_using_output":558},"49":0,"51":0,"52":0,"53":0,"54":{"ongoing_status":622,"progress":623,"affected_prefixes":624,"status":625}},"apis":{"12":{"metadata":637,"metadata_at_version":638,"metadata_versions":639},"AuraApi":{"slot_duration":548,"authorities":632},"RelayParentOffsetApi":{"relay_parent_offset":475},"AuraUnincludedSegmentApi":{"can_build_upon":633},"Core":{"version":634,"execute_block":635,"initialize_block":636},"RuntimeViewFunction":{"execute_view_function":640},"BlockBuilder":{"apply_extrinsic":641,"finalize_block":642,"inherent_extrinsics":643,"check_inherents":644},"TaggedTransactionQueue":{"validate_transaction":645},"OffchainWorkerApi":{"offchain_worker":646},"SessionKeys":{"generate_session_keys":647,"decode_session_keys":648},"AccountNonceApi":{"account_nonce":649},"TransactionPaymentApi":{"100":652,"101":653,"query_info":650,"query_fee_details":651},"TransactionPaymentCallApi":{"100":652,"101":653,"query_call_info":654,"query_call_fee_details":655},"XcmPaymentApi":{"query_acceptable_payment_assets":656,"query_xcm_weight":657,"query_weight_to_asset_fee":658,"query_delivery_fees":659},"DryRunApi":{"dry_run_call":660,"dry_run_xcm":661},"LocationToAccountApi":{"convert_location":662},"MobRuleApi":{"voted_on":663},"ProofOfInkApi":{"candidacy_deposit":548},"PalletGameApi":{"play_deposit":548},"CollectCollationInfo":{"collect_collation_info":664},"GenesisBuilder":{"build_state":665,"get_preset":666,"preset_names":667}}}},[{}],["Account","System","ParachainSystem","Timestamp","ParachainInfo","WeightReclaim","Reserves","Holds","Balances","TransactionPayment","SkipFeelessPayment","OriginRestriction","Metadata","Assets","AssetsHolder","AssetRate","AssetTxPayment","Authorship","CollatorSelection","Session","Authorities","Aura","AuraExt","XcmpQueue","PolkadotXcm","CumulusXcm","MessageQueue","Utility","Multisig","Sudo","VerifySignature","Proxy","AccountToAlias","Identity","People","AliasToAccount","RoundSchedules","MobRule","AvailableInvites","PendingInvites","ProofOfInk","Game","Score","DummyDim","PeopleLite","Resources","ChunksManager","Members","Coinage","MembersNotifier","OnPollStatus","StorageInitialization","StorageInitializationLite","Airdrop","MultiBlockMigrations","force_transfer","transfer_keep_alive","transfer_all","burn","create","transfer","poke_deposit","set_alias_account","unset_alias_account","schedule_payout_rounds","remove_payout_schedule","grant_invites","remove_available_and_pending_invites","set_invite_ticket","cancel_invite_ticket","Burned","BurnedDebt","Issued","Frozen","Thawed","Held","Released","DepositPoked","JudgementRequested","PersonhoodRecognized","AliasAccountSet","AliasAccountUnset","PayoutRoundsScheduled","PayoutScheduleRemoved","CreditClaimed","PersonRegistered","AllInvitesRemoved","SomeInvitesRemoved","InvitesGranted","InviteTicketSet","InviteTicketCancelled","MigrationCompleted","PotId","MaxUsernameLength","MinUsernameLength","OnboardingQueuePageSize","CurrencyLocationInfo","OffchainWorkInterval","OffchainWorkerInterval","MaxCollections","query_weight_to_fee","query_length_to_fee"]]`); +const replaceTokens = (obj) => Object.fromEntries( + Object.entries(obj).map(([key, value]) => { + const unwrappedValue = typeof value === "object" ? replaceTokens(value) : value; + const numericKey = Number(key); + if (Number.isNaN(numericKey)) { + return [key, unwrappedValue]; + } + return [tokens[numericKey], unwrappedValue]; + }) +); +const tokenizedCommonTrees = commonTrees.map(replaceTokens); +const unwrap = (obj, depth) => depth === 0 ? obj : Object.fromEntries( + Object.entries(obj).map(([key, value]) => [ + key, + unwrap( + typeof value === "object" ? value : tokenizedCommonTrees[value], + depth - 1 + ) + ]) +); +const getChainDescriptors = (key) => unwrap(replaceTokens(minified[key]), 2); +const People_lite = getChainDescriptors("people_lite"); + +export { People_lite }; diff --git a/packages/host-papp/.papi/descriptors/dist/descriptors-DDm-U7Zd.js b/packages/host-papp/.papi/descriptors/dist/descriptors-DDm-U7Zd.js deleted file mode 100644 index e0828bb3..00000000 --- a/packages/host-papp/.papi/descriptors/dist/descriptors-DDm-U7Zd.js +++ /dev/null @@ -1,25 +0,0 @@ -const [minified, commonTrees, tokens] = JSON.parse(`[{"people_lite":{"storage":{"1":{"0":0,"ExtrinsicCount":1,"InherentsApplied":2,"BlockWeight":3,"AllExtrinsicsLen":1,"BlockHash":4,"ExtrinsicData":5,"Number":1,"ParentHash":6,"Digest":7,"Events":8,"EventCount":1,"EventTopics":9,"LastRuntimeUpgrade":10,"UpgradedToU32RefCount":2,"UpgradedToTripleRefCount":2,"ExecutionPhase":11,"AuthorizedUpgrade":12,"ExtrinsicWeightReclaimed":13},"2":{"UnincludedSegment":33,"AggregatedUnincludedSegment":34,"PendingValidationCode":35,"NewValidationCode":35,"ValidationData":36,"DidSetValidationCode":2,"LastRelayChainBlockNumber":1,"UpgradeRestrictionSignal":37,"UpgradeGoAhead":38,"RelayStateProof":39,"RelevantMessagingState":40,"HostConfiguration":41,"LastDmqMqcHead":6,"LastHrmpMqcHeads":42,"ProcessedDownwardMessages":1,"LastProcessedDownwardMessage":43,"HrmpWatermark":1,"LastProcessedHrmpMessage":43,"HrmpOutboundMessages":44,"UpwardMessages":39,"PendingUpwardMessages":39,"PendingUpwardSignals":39,"UpwardDeliveryFeeFactor":45,"AnnouncedHrmpMessagesPerCandidate":1,"ReservedXcmpWeightOverride":13,"ReservedDmpWeightOverride":13,"CustomValidationHeadData":35},"3":{"Now":45,"DidUpdate":2},"4":{"ParachainId":1},"5":0,"8":{"0":53,"6":55,"7":56,"TotalIssuance":45,"InactiveIssuance":45,"Locks":54,"Freezes":57},"9":{"NextFeeMultiplier":45,"StorageVersion":79,"TxPaymentCredit":45},"10":0,"11":{"Usages":82},"13":{"0":86,"6":89,"12":88,"Asset":85,"Approvals":87,"NextAssetId":90},"14":{"7":134,"BalancesOnHold":135},"15":{"ConversionRateToNative":137},"16":0,"17":{"Author":144},"18":{"Invulnerables":145,"CandidateList":146,"LastAuthoredBlock":147,"DesiredCandidates":1,"CandidacyBond":45},"19":{"Validators":145,"CurrentIndex":1,"QueuedChanged":2,"QueuedKeys":162,"DisabledValidators":163,"NextKeys":164,"KeyOwner":165},"21":{"20":169,"CurrentSlot":45},"22":{"20":169,"RelaySlotInfo":170},"23":{"InboundXcmpSuspended":171,"OutboundXcmpStatus":172,"OutboundXcmpMessages":173,"SignalMessages":5,"QueueConfig":174,"QueueSuspended":2,"DeliveryFeeFactor":175},"24":{"QueryCounter":45,"Queries":178,"AssetTraps":179,"SafeXcmVersion":1,"SupportedVersion":180,"VersionNotifiers":181,"VersionNotifyTargets":182,"VersionDiscoveryQueue":183,"CurrentMigration":184,"RemoteLockedFungibles":185,"LockedFungibles":186,"XcmExecutionSuspended":2,"ShouldRecordXcm":2,"RecordedXcm":187,"AuthorizedAliases":188},"25":0,"26":{"BookStateFor":227,"ServiceHead":228,"Pages":229},"27":0,"28":{"Multisigs":246},"29":{"Key":144},"30":0,"31":{"Proxies":262,"Announcements":263},"33":{"32":164,"IdentityOf":278,"UsernameOf":279,"SuperOf":280,"SubsOf":281,"Registrars":282,"AuthorityOf":283,"UsernameInfoOf":284,"PendingUsernames":285,"UnbindingUsernames":286,"PersonIdentities":287,"PendingUsernameReports":288},"34":{"32":327,"34":325,"Keys":324,"CounterForKeys":1,"AliasToAccount":326,"AccountToPersonalId":328,"NextPersonalId":45,"PeopleCollectionCreated":2,"ReservedPersonalId":329},"36":{"35":344,"Credits":337,"VotingPenalties":179,"VotingPoints":338,"Votes":339,"CaseCount":1,"OpenCases":340,"RipeCases":341,"DoneCases":342,"AccumulatedPoints":45,"PayoutDistribution":343,"ActiveSince":45},"39":{"34":368,"37":147,"38":373,"Candidates":367,"ReferralTickets":369,"DesignFamilies":370,"CommittedDesigns":371,"AllocationCount":1,"Configuration":372,"ReferrerReimbursementValues":374,"ReferredReimbursementValues":374},"40":{"37":147,"38":373,"40":405,"TestnetStoredPhaseDurations":401,"Nfts":402,"ArchivedPlayers":403,"Players":404,"GameIndex":1,"GameHistory":406,"PlayerAttendanceHistory":407,"IndexToPlayer":408,"PlayerToIndex":407,"ShuffleRecognized":409,"ShuffleNotRecognized":409,"GameSchedules":410,"AliasToStmtAccount":411,"StmtAccountToAlias":164,"CommunicationIdentifiers":412},"41":{"35":431,"Participants":425,"PersonhoodThreshold":1,"AbsenceGraceSchedule":426,"AbsenceGraceRatio":427,"CurrentRoundPoints":1,"CurrentRoundIndex":1,"RoundsPointsForParticipant":428,"RoundPayouts":429,"RoundPlanning":430},"42":{"34":441,"ReservedIds":329},"43":{"LitePeople":447,"AttestationAllowance":147},"44":{"Consumers":451,"StmtStoreAssociatedAccount":452,"UsernameOwnerOf":453,"AccountOfAlias":411,"UsernameReservationDuration":45,"UsernameReservationQueue":454,"ReservationOf":279},"45":{"Chunks":465,"ChunkPageHashes":466},"46":{"46":477,"Collections":471,"SuspendedCollections":471,"IdentifiersOf":472,"Root":473,"CurrentRingIndex":179,"OnboardingSize":179,"RingKeys":474,"RingKeysStatus":475,"PendingSuspensions":476,"ActiveMembers":179,"RingsState":478,"StaleRings":479,"QueuePageIndices":480,"OnboardingQueue":481,"DeletionInProgress":482,"RingDeletionQueue":483},"47":{"CoinsByOwner":493,"LockedCoins":494,"TotalValueOfDestroyedCoins":45,"ConsumedFreeUnloadTokens":495,"RecyclerCollectionCreated":496,"RecyclersLastRemovedRingIndex":406,"RecyclersCoinToRecycler":179,"RecyclersUnloaded":497,"RecyclersDusting":498,"PaidUnloadTokenMembers":499,"PaidUnloadTokenConsumed":497,"PaidTokenCollectionsCreated":496,"PaidUnloadTokenDusting":496,"PaidUnloadTokenNextRingToClean":406,"InitializePalletAccount":500},"49":{"48":544,"XcmTransferInitiatedAt":1},"50":{"48":545},"51":{"EventSchedule":546,"EventScheduleFirstStartTime":1,"NextEventId":1,"ActiveEvents":547,"ActiveEventIds":171,"ParticipantIdToAliasAndDest":548,"ParticipantAliasToId":338,"WinnersToDistributeTo":549,"WinnersWithFailedTransfer":550,"PastAirdrops":551},"52":{"Cursor":561,"Historic":562}},"tx":{"1":{"remark":18,"set_heap_pages":19,"set_code":20,"set_code_without_checks":20,"set_storage":21,"kill_storage":22,"kill_prefix":23,"remark_with_event":18,"authorize_upgrade":24,"authorize_upgrade_without_checks":24,"apply_authorized_upgrade":20},"2":{"set_validation_data":46,"sudo_send_upward_message":47},"3":{"set":52},"4":0,"5":0,"8":{"53":59,"54":58,"55":60,"56":65,"transfer_allow_death":58,"force_unreserve":61,"upgrade_accounts":62,"force_set_balance":63,"force_adjust_total_issuance":64},"9":0,"10":0,"11":{"clean_usage":83},"13":{"53":101,"54":100,"55":114,"56":99,"57":95,"58":100,"force_create":96,"start_destroy":97,"destroy_accounts":97,"destroy_approvals":97,"finish_destroy":97,"mint":98,"freeze":102,"thaw":102,"freeze_asset":97,"thaw_asset":97,"transfer_ownership":103,"set_team":104,"set_metadata":105,"clear_metadata":97,"force_set_metadata":106,"force_clear_metadata":97,"force_asset_status":107,"approve_transfer":108,"cancel_approval":109,"force_cancel_approval":110,"transfer_approved":111,"touch":97,"refund":112,"set_min_balance":113,"touch_other":102,"refund_other":102,"block":102,"set_reserves":115},"14":0,"15":{"57":138,"update":138,"remove":139},"16":0,"17":0,"18":{"set_invulnerables":149,"set_desired_candidates":150,"set_candidacy_bond":151,"register_as_candidate":152,"leave_intent":152,"add_invulnerable":153,"remove_invulnerable":153,"update_bond":154,"take_candidate_slot":155},"19":{"set_keys":166,"purge_keys":152},"21":0,"22":0,"23":{"suspend_xcm_execution":152,"resume_xcm_execution":152,"update_suspend_threshold":176,"update_drop_threshold":176,"update_resume_threshold":176},"24":{"send":190,"teleport_assets":191,"reserve_transfer_assets":191,"execute":192,"force_xcm_version":193,"force_default_xcm_version":194,"force_subscribe_version_notify":195,"force_unsubscribe_version_notify":195,"limited_reserve_transfer_assets":196,"limited_teleport_assets":196,"force_suspension":197,"transfer_assets":196,"claim_assets":198,"transfer_assets_using_type_and_then":199,"add_authorized_alias":200,"remove_authorized_alias":201,"remove_all_authorized_aliases":152},"25":0,"26":{"reap_page":231,"execute_overweight":232},"27":{"batch":237,"as_derivative":238,"batch_all":237,"dispatch_as":239,"force_batch":237,"with_weight":240,"if_else":241,"dispatch_as_fallible":239},"28":{"59":251,"as_multi_threshold_1":247,"as_multi":248,"approve_as_multi":249,"cancel_as_multi":250},"29":{"sudo":257,"sudo_unchecked_weight":240,"set_key":258,"sudo_as":259,"remove_key":152},"30":0,"31":{"59":152,"proxy":266,"add_proxy":267,"remove_proxy":267,"remove_proxies":152,"create_pure":268,"kill_pure":269,"announce":270,"remove_announcement":270,"reject_announcement":271,"proxy_announced":272},"33":{"add_registrar":289,"set_identity":290,"set_subs":291,"clear_identity":152,"request_judgement":292,"cancel_request":293,"set_fee":294,"set_account_id":295,"set_fields":296,"provide_judgement":297,"kill_identity":298,"add_sub":299,"rename_sub":299,"remove_sub":300,"quit_sub":152,"add_username_authority":301,"remove_username_authority":302,"set_username_for":303,"accept_username":304,"remove_expired_approval":304,"set_primary_username":304,"unbind_username":304,"remove_username":304,"kill_username":304,"set_personal_identity":305,"submit_personal_credential_evidence":306,"personal_credential_judged":307,"clear_personal_identity":152,"report_username":304,"reported_username_judged":307},"34":{"under_alias":257,"set_alias_account":331,"unset_alias_account":152,"force_recognize_personhood":332,"set_personal_id_account":331,"unset_personal_id_account":152,"create_people_collection":152},"36":{"60":351,"61":352,"vote":345,"close_case":346,"clean_vote":347,"reap_case":346,"intervene":348,"claim_vote":346,"payout_rewards":349,"claim_votes":350,"start_payout_round":152,"claim_credit":152,"clean_points":353,"force_ripen_case":346,"touch_case":346,"clear_voting_penalty":152,"clean_vote_signed":347},"39":{"62":383,"63":384,"64":382,"65":382,"apply":152,"submit_evidence":375,"judged":307,"register_referred":376,"register_non_referred":376,"reroll":152,"commit":377,"allocate_full":152,"timeout":378,"flakeout":152,"apply_with_signature":379,"apply_with_invitation":380,"add_design_family":381,"set_referral_ticket":382,"cancel_referral_ticket":382,"register_successful_referral_reward":349,"set_configuration":385,"set_reimbursement_values":386},"40":{"62":383,"63":384,"64":382,"65":382,"sign_up_with_invite":413,"sign_up_with_account":413,"sign_up_with_alias":414,"report":415,"offboard":152,"kickout":416,"schedule_games":417,"remove_scheduled_game":418,"testnet_force_start_shuffle":152,"testnet_force_end_reporting":152,"testnet_set_game_phases":419,"testnet_kill_current_game":152},"41":{"60":432,"61":352,"transition_round":433,"operate_payout_round":434,"cash_out":152,"redeem_credit":349,"register":435,"set_absence_grace_schedule":436},"42":{"reserve_ids":442,"renew_id_reservation":443,"cancel_id_reservation":443,"recognize_personhood":444,"suspend_personhood":445,"resume_personhood":443,"start_mutation_session":152,"end_mutation_session":152},"43":{"increase_attestation_allowance":383,"clear_attestation_allowance":378,"attest":448,"dispatch_as_signer":257},"44":{"register_lite_person":456,"register_person":457,"touch_person_authorization":152,"remove_expired_username_reservation":458,"update_identifier_key":413,"set_username_reservation_duration":459,"set_stmt_store_associated_account_id_at_slot":460,"demote_auth_expired":378},"45":{"add_chunks":467,"set_chunk_page_hashes":468},"46":{"build_ring_manual":484,"onboard_members_manual":485,"merge_rings":486,"set_onboarding_size":487},"47":{"58":518,"split":517,"load_recycler_with_coin":519,"load_recycler_with_external_asset":520,"unload_recycler_into_coin":521,"unload_recycler_into_external_asset":521,"pay_for_recycler_unload_fee_token_with_coin":519,"pay_for_recycler_unload_fee_token_with_native":519,"pay_for_recycler_unload_fee_token_with_stable":519,"unload_recyclers_into_coin_unstable":522,"unload_recyclers_into_external_asset_unstable":522,"unload_recycler_into_external_asset_non_anonymous":523,"unload_recyclers_into_external_asset_non_anonymous":524,"unload_recycler_into_coins":525,"direct_offboard_coin_into_external_asset":518,"clean_recycler":526,"clean_consumed_free_token":527,"clean_paid_unload_token_ring":528,"clean_recycler_dust":152,"clean_paid_unload_token_dust":152,"delete_expired_paid_unload_token_collection":527},"49":0,"50":0,"51":{"schedule_event":553,"remove_scheduled_event":554,"register_for_event":555,"claim_failed_transfer_prize":554},"52":{"force_set_cursor":563,"force_set_active_cursor":564,"force_onboard_mbms":152,"clear_historic":565}},"events":{"1":{"ExtrinsicSuccess":25,"ExtrinsicFailed":26,"CodeUpdated":27,"NewAccount":28,"KilledAccount":28,"Remarked":29,"UpgradeAuthorized":30,"RejectedInvalidAuthorizedUpgrade":31},"2":{"ValidationFunctionStored":27,"ValidationFunctionApplied":48,"ValidationFunctionDiscarded":27,"DownwardMessagesReceived":49,"DownwardMessagesProcessed":50,"UpwardMessageSent":51},"3":0,"4":0,"5":0,"8":{"66":70,"67":72,"68":70,"69":70,"70":75,"71":75,"Endowed":66,"DustLost":67,"Transfer":68,"BalanceSet":69,"Reserved":70,"Unreserved":70,"ReserveRepatriated":71,"Deposit":70,"Withdraw":70,"Slashed":70,"Minted":70,"MintedCredit":72,"BurnedDebt":72,"Suspended":70,"Restored":70,"Upgraded":73,"Rescinded":72,"Locked":70,"Unlocked":70,"TotalIssuanceForced":74,"BurnedHeld":75,"TransferOnHold":76,"TransferAndHold":77,"Unexpected":78},"9":{"TransactionFeePaid":80},"10":{"FeeSkipped":81},"11":{"UsageCleaned":84},"13":{"66":119,"67":117,"68":122,"69":122,"Created":116,"Transferred":118,"TeamChanged":120,"OwnerChanged":121,"AssetFrozen":123,"AssetThawed":123,"AccountsDestroyed":124,"ApprovalsDestroyed":125,"DestructionStarted":123,"Destroyed":123,"ForceCreated":121,"MetadataSet":126,"MetadataCleared":123,"ApprovedTransfer":127,"ApprovalCancelled":128,"TransferredApproved":129,"AssetStatusChanged":123,"AssetMinBalanceChanged":130,"Touched":131,"Blocked":122,"Deposited":132,"Withdrawn":132,"ReservesUpdated":133,"ReservesRemoved":123},"14":{"66":136,"70":136,"71":136},"15":{"AssetRateCreated":140,"AssetRateRemoved":141,"AssetRateUpdated":142},"16":{"AssetTxFeePaid":143},"17":0,"18":{"NewInvulnerables":156,"InvulnerableAdded":157,"InvulnerableRemoved":157,"NewDesiredCandidates":158,"NewCandidacyBond":159,"CandidateAdded":160,"CandidateBondUpdated":160,"CandidateRemoved":157,"CandidateReplaced":161,"InvalidInvulnerableSkipped":157},"19":{"NewSession":167,"NewQueued":27,"ValidatorDisabled":168,"ValidatorReenabled":168},"21":0,"22":0,"23":{"XcmpMessageSent":177},"24":{"Attempted":202,"Sent":203,"SendFailed":204,"ProcessXcmError":205,"UnexpectedResponse":206,"ResponseReady":207,"Notified":208,"NotifyOverweight":209,"NotifyDispatchError":208,"NotifyDecodeFailed":208,"InvalidResponder":210,"InvalidResponderVersion":206,"ResponseTaken":211,"AssetsTrapped":212,"VersionChangeNotified":213,"SupportedVersionChanged":214,"NotifyTargetSendFail":215,"NotifyTargetMigrationFail":216,"InvalidQuerierVersion":206,"InvalidQuerier":217,"VersionNotifyStarted":218,"VersionNotifyRequested":218,"VersionNotifyUnrequested":218,"FeesPaid":219,"AssetsClaimed":212,"VersionMigrationFinished":220,"AliasAuthorized":221,"AliasAuthorizationRemoved":222,"AliasesAuthorizationsRemoved":223},"25":{"InvalidFormat":225,"UnsupportedVersion":225,"ExecutedDownward":226},"26":{"ProcessingFailed":233,"Processed":234,"OverweightEnqueued":235,"PageReaped":236},"27":{"BatchInterrupted":242,"BatchCompleted":27,"BatchCompletedWithErrors":27,"ItemCompleted":27,"ItemFailed":243,"DispatchedAs":244,"IfElseMainSuccess":27,"IfElseFallbackCalled":245},"28":{"72":256,"NewMultisig":252,"MultisigApproval":253,"MultisigExecuted":254,"MultisigCancelled":255},"29":{"Sudid":260,"KeyChanged":261,"KeyRemoved":27,"SudoAsDone":260},"30":0,"31":{"72":277,"ProxyExecuted":244,"PureCreated":273,"PureKilled":274,"Announced":275,"ProxyAdded":276,"ProxyRemoved":276},"33":{"73":309,"IdentitySet":73,"IdentityCleared":308,"IdentityKilled":308,"JudgementUnrequested":309,"JudgementGiven":310,"RegistrarAdded":311,"SubIdentityAdded":312,"SubIdentitiesSet":313,"SubIdentityRenamed":314,"SubIdentityRemoved":312,"SubIdentityRevoked":312,"AuthorityAdded":315,"AuthorityRemoved":315,"UsernameSet":316,"UsernameQueued":317,"PreapprovalExpired":318,"PrimaryUsernameSet":316,"DanglingUsernameRemoved":316,"UsernameUnbound":319,"UsernameRemoved":319,"UsernameKilled":319,"UsernameReported":320,"PersonalIdentitySet":321,"EvidenceSubmitted":322,"CredentialAccepted":322,"CredentialRejected":322,"PersonBanned":322,"PersonalIdentityCleared":322,"ReportedUsernameJudgedValid":319,"ReportedUsernameJudgedInvalid":319,"ReportedUsernameWeakOrUnclearJudgement":323},"34":{"74":333,"PersonOnboarding":333,"AliasDispatched":334,"AliasAccountSet":334,"AliasAccountUnset":334,"PersonalIdAccountSet":335,"PersonalIdAccountUnset":335,"CollectionCreated":27,"ForcePersonhoodRecognized":336},"36":{"75":361,"76":362,"77":363,"CaseCreated":354,"Callback":244,"CallbackError":27,"CaseClosed":355,"Voted":356,"VoteCleaned":357,"CaseRemoved":354,"CaseIntervened":355,"VotesClaimed":358,"RewardPayout":359,"PayoutRoundStarted":360,"PointsCleaned":364,"CaseTouched":365,"VotingPenaltyCleared":366},"39":{"73":157,"78":389,"79":395,"80":395,"81":398,"82":399,"83":399,"CandidateApplied":157,"JudgementProvided":387,"RetryGranted":388,"CandidateReferred":390,"Rerolled":157,"DesignCommitted":391,"FullyAllocated":157,"TimedOut":157,"FlakedOut":157,"TicketReferred":392,"TicketCancelled":392,"TicketApplied":393,"FamilyAdded":394,"InvitedCandidateApplied":396,"ReferralVoucherRegistered":397,"ConfigurationSet":400},"40":{"79":395,"80":395,"81":398,"82":395,"83":395,"NewGame":420,"GameEnded":362,"SignedUp":421,"ReportSubmitted":422,"Offboarded":421,"KickedOut":423,"GamesScheduled":49,"ScheduledGameRemoved":424,"StmtUsageRemoved":366},"41":{"74":438,"75":439,"76":362,"77":437,"RoundTransitioned":440,"PayoutRoundOperated":440,"CashedOut":421},"42":{"IdsReserved":49,"IdRenewed":446,"IdUnreserved":446,"PeopleRegistered":49,"PeopleSuspended":49,"PersonhoodResumed":446,"SuspensionsStarted":27,"SuspensionsEnded":27},"43":{"AllAttestationAllowanceCleared":449,"AttestationAllowanceIncreased":398,"PersonAttested":450,"ConsumerRegistered":28},"44":{"78":461,"LitePersonRegistered":28,"PersonAuthorizationTouched":28,"ExpiredUsernameReservationRemoved":462,"IdentifierKeyUpdated":28,"UsernameReservationDurationSet":463,"StmtStoreSlotUpdated":464,"PersonDemoted":28},"45":{"ChunkPageHashesInitialized":469,"ChunksAdded":470},"46":{"MemberAdded":488,"MemberRemoved":488,"CollectionMarkedForDeletion":489,"CollectionDeleted":489,"RingBuilt":490,"MembersOnboarded":489,"RingsMerged":491,"OnboardingSizeSet":492},"47":{"CoinSplit":529,"CoinTransferred":530,"RecyclerLoadedWithCoin":531,"RecyclerLoadedWithExternalAsset":532,"RecyclerUnloadedIntoCoin":533,"RecyclerUnloadedIntoExternalAsset":534,"PaidUnloadTokenRegisteredWithCoin":535,"PaidUnloadTokenRegisteredWithNative":536,"PaidUnloadTokenRegisteredWithStable":536,"PeopleFreeUnloadTokenConsumed":537,"LitePeopleFreeUnloadTokenConsumed":537,"RecyclersUnloadedIntoCoin":538,"RecyclersUnloadedIntoExternalAsset":539,"RecyclersUnloadedIntoExternalAssetNonAnonymous":540,"RecyclerUnloadedIntoCoins":529,"CoinOffboardedIntoExternalAsset":541,"RecyclerCleaned":542,"ConsumedFreeTokensCleaned":537,"PaidUnloadTokenRingCleaned":543,"RecyclerDustCleaned":27,"PaidUnloadTokenDustCleaned":27,"ExpiredPaidUnloadTokenCollectionDeleted":537},"49":{"84":27,"AssetCreated":27,"XcmFundsTransferSent":27,"XcmFundsTransferTimedOut":27,"FundsVerified":27,"PotsFunded":27,"MobRulePayoutsScheduled":27,"ScorePayoutsScheduled":27,"OnPollInitializationCompleted":27,"MigrationPeopleRecognized":27,"MigrationOnboardingSizeSet":27,"MigrationProofOfInkInitialized":27,"MigrationGamesScheduled":27,"MigrationInvitesGranted":27,"MigrationReimbursementValuesSet":27,"MigrationAttestationAllowancesSet":27},"50":{"InitializationCompleted":27},"51":{"ParticipantRegistered":556,"EventStarted":557,"EventSkipped":557,"EventScheduled":558,"ScheduledEventRemoved":558,"FailedTransferPrizeClaimed":559,"WaitingForEntropyToBuild":558,"DrawingWinners":558,"Distributing":558,"PrizeDistributed":560,"PrizeDistributionFailed":560,"ClearingStorage":558,"EventCompleted":558},"52":{"84":567,"UpgradeStarted":566,"UpgradeCompleted":27,"UpgradeFailed":27,"MigrationSkipped":362,"MigrationAdvanced":567,"MigrationFailed":567,"HistoricCleared":568}},"constants":{"1":{"BlockWeights":14,"BlockLength":15,"BlockHashCount":1,"DbWeight":16,"Version":17,"SS58Prefix":1},"2":{"SelfParaId":1},"3":{"MinimumPeriod":45},"4":0,"5":0,"8":{"ExistentialDeposit":45,"MaxLocks":1,"MaxReserves":1,"MaxFreezes":1},"9":{"OperationalFeeMultiplier":1},"10":0,"11":0,"13":{"RemoveItemsLimit":1,"AssetDeposit":45,"AssetAccountDeposit":45,"MetadataDepositBase":45,"MetadataDepositPerByte":45,"ApprovalDeposit":45,"StringLimit":1},"14":0,"15":0,"16":0,"17":0,"18":{"85":148,"MaxCandidates":1,"MinEligibleCollators":1,"MaxInvulnerables":1,"KickThreshold":1,"pot_account":144},"19":{"KeyDeposit":45},"21":{"SlotDuration":45},"22":0,"23":{"MaxInboundSuspended":1,"MaxActiveOutboundChannels":1,"MaxPageSize":1},"24":{"UniversalLocation":189,"AdvertisedXcmVersion":1,"MaxLockers":1,"MaxRemoteLockConsumers":1},"25":0,"26":{"HeapSize":1,"MaxStale":1,"ServiceWeight":230,"IdleMaxServiceWeight":230},"27":{"batched_calls_limit":1},"28":{"DepositBase":45,"DepositFactor":45,"MaxSignatories":1},"29":0,"30":0,"31":{"ProxyDepositBase":45,"ProxyDepositFactor":45,"MaxProxies":1,"MaxPending":1,"AnnouncementDepositBase":45,"AnnouncementDepositFactor":45},"33":{"86":1,"87":1,"BasicDeposit":45,"ByteDeposit":45,"UsernameDeposit":45,"SubAccountDeposit":45,"UsernameReportDeposit":45,"MaxSubAccounts":1,"UsernameReportTimeout":1,"MaxRegistrars":1,"MaxJudgements":1,"PendingUsernameExpiration":1,"UsernameGracePeriod":1,"MaxSuffixLength":1,"CredentialRemovalPenalty":45,"identity_context":6},"34":{"88":1,"RingExponent":330,"account_setup_time_tolerance":1},"36":{"89":90,"90":1,"MaxVoteClaimDuration":45,"MinCaseDuration":1,"MaxVotingDuration":1,"MinTurnoutNominal":1,"MinTurnoutPercentage":1,"VotingPenaltyDuration":1,"MaxVotesClaimable":1,"CleanVotesBatchSize":1,"VotesOpenForClaimsDuration":1,"MinimumVoterThreshold":1,"mob_rule_pot_id":144,"mob_rule_context":6},"39":{"85":148,"MaxActiveReferrals":1,"proof_of_ink_pot_id":144},"40":{"MaxRounds":1,"MaxGroupSize":1,"MinGroupSize":1,"NonPlayingKickoutTime":1,"PhaseDurations":401,"MaxGameSchedules":1,"MaxAttendanceHistoryDepth":1,"proof_of_ownership_msg_base":6},"41":{"89":90,"90":1,"score_pot_id":144,"score_context":6,"ubi_points":1},"42":0,"43":0,"44":{"86":1,"87":1,"PersonAuthDuration":1,"MinPersonAuthUpdateInterval":1,"MaxReservationQueueLength":1,"AccountsApiSlotCount":1,"AccountsApiRefundCooldown":1,"AccountsApiAllowance":455},"45":{"PageSize":1},"46":{"88":1,"MaxCollections":1,"MaxFlexibleRingExponent":330,"RingBuildingMemberLimit":1},"47":{"RecyclerRingExponent":330,"PaidUnloadTokenRingExponent":330,"UnderlyingAssetId":90,"UnderlyingAssetUnit":45,"MinimumExponent":1,"MaximumExponent":1,"MaxSplitOutputs":1,"MaxConsolidation":1,"UnloadTokenTimePeriodPeopleLitePeople":1,"UnloadTokenAllowancePerTimePeriodForPeople":45,"UnloadTokenAllowancePerTimePeriodForLitePeople":45,"MaxFreeUnloadTokensPerTimePeriod":1,"OffchainWorkerInterval":1,"CoinFailureLockPeriod":45,"pallet_account":144},"49":0,"50":0,"51":{"airdrop_pot_id":144,"airdrop_context_base":552},"52":{"CursorMaxLen":1,"IdentifierMaxLen":1}},"viewFns":{"1":0,"2":0,"3":0,"4":0,"5":0,"8":0,"9":0,"10":0,"11":0,"13":{"asset_details":91,"balance_of":92,"get_metadata":93,"get_reserves_data":94},"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":{"check_permissions":264,"is_superset":265},"33":0,"34":0,"36":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":{"get_free_unload_token_info":501,"get_recycler_ring_status":502,"get_recycler_ring_revision":503,"get_paid_token_ring_status":504,"get_paid_token_ring_revision":505,"get_paid_unload_token_fee_in_asset":506,"get_paid_unload_token_fee_in_native":507,"get_coin_by_owner":508,"get_coin_lock_until":509,"get_recycler_member_info":510,"is_paid_token_member":511,"get_recycler_members":512,"get_paid_token_ring_members":513,"is_recycler_alias_unloaded":514,"is_paid_token_alias_consumed":515,"is_free_token_alias_consumed":516},"49":0,"50":0,"51":0,"52":0},"apis":{"12":{"metadata":575,"metadata_at_version":576,"metadata_versions":577},"AuraApi":{"slot_duration":507,"authorities":569},"RelayParentOffsetApi":{"relay_parent_offset":570},"AuraUnincludedSegmentApi":{"can_build_upon":571},"Core":{"version":572,"execute_block":573,"initialize_block":574},"RuntimeViewFunction":{"execute_view_function":578},"BlockBuilder":{"apply_extrinsic":579,"finalize_block":580,"inherent_extrinsics":581,"check_inherents":582},"TaggedTransactionQueue":{"validate_transaction":583},"OffchainWorkerApi":{"offchain_worker":584},"SessionKeys":{"generate_session_keys":585,"decode_session_keys":586},"AccountNonceApi":{"account_nonce":587},"TransactionPaymentApi":{"91":590,"92":591,"query_info":588,"query_fee_details":589},"TransactionPaymentCallApi":{"91":590,"92":591,"query_call_info":592,"query_call_fee_details":593},"XcmPaymentApi":{"query_acceptable_payment_assets":594,"query_xcm_weight":595,"query_weight_to_asset_fee":596,"query_delivery_fees":597},"LocationToAccountApi":{"convert_location":598},"MobRuleApi":{"voted_on":599},"ProofOfInkApi":{"candidacy_deposit":507},"PalletGameApi":{"play_deposit":507,"validate_statement_with_reason":600},"CollectCollationInfo":{"collect_collation_info":601},"GenesisBuilder":{"build_state":602,"get_preset":603,"preset_names":604},"ValidateStatement":{"validate_statement":605}}}},[{}],["Account","System","ParachainSystem","Timestamp","ParachainInfo","WeightReclaim","Reserves","Holds","Balances","TransactionPayment","SkipFeelessPayment","OriginRestriction","Metadata","Assets","AssetsHolder","AssetRate","AssetTxPayment","Authorship","CollatorSelection","Session","Authorities","Aura","AuraExt","XcmpQueue","PolkadotXcm","CumulusXcm","MessageQueue","Utility","Multisig","Sudo","VerifySignature","Proxy","AccountToAlias","Identity","People","RoundSchedules","MobRule","AvailableInvites","PendingInvites","ProofOfInk","Game","Score","DummyDim","PeopleLite","Resources","ChunksManager","Members","Coinage","OnPollStatus","StorageInitialization","StorageInitializationLite","Airdrop","MultiBlockMigrations","force_transfer","transfer_keep_alive","transfer_all","burn","create","transfer","poke_deposit","schedule_payout_rounds","remove_payout_schedule","grant_invites","remove_available_and_pending_invites","set_invite_ticket","cancel_invite_ticket","Burned","Issued","Frozen","Thawed","Held","Released","DepositPoked","JudgementRequested","PersonhoodRecognized","PayoutRoundsScheduled","PayoutScheduleRemoved","CreditClaimed","PersonRegistered","AllInvitesRemoved","SomeInvitesRemoved","InvitesGranted","InviteTicketSet","InviteTicketCancelled","MigrationCompleted","PotId","MaxUsernameLength","MinUsernameLength","OnboardingQueuePageSize","CurrencyLocationInfo","OffchainWorkInterval","query_weight_to_fee","query_length_to_fee"]]`); -const replaceTokens = (obj) => Object.fromEntries( - Object.entries(obj).map(([key, value]) => { - const unwrappedValue = typeof value === "object" ? replaceTokens(value) : value; - const numericKey = Number(key); - if (Number.isNaN(numericKey)) { - return [key, unwrappedValue]; - } - return [tokens[numericKey], unwrappedValue]; - }) -); -const tokenizedCommonTrees = commonTrees.map(replaceTokens); -const unwrap = (obj, depth) => depth === 0 ? obj : Object.fromEntries( - Object.entries(obj).map(([key, value]) => [ - key, - unwrap( - typeof value === "object" ? value : tokenizedCommonTrees[value], - depth - 1 - ) - ]) -); -const getChainDescriptors = (key) => unwrap(replaceTokens(minified[key]), 2); -const People_lite = getChainDescriptors("people_lite"); - -export { People_lite }; diff --git a/packages/host-papp/.papi/descriptors/dist/index.d.ts b/packages/host-papp/.papi/descriptors/dist/index.d.ts index 80d17376..3f7bce91 100644 --- a/packages/host-papp/.papi/descriptors/dist/index.d.ts +++ b/packages/host-papp/.papi/descriptors/dist/index.d.ts @@ -1,7 +1,7 @@ import { default as people_lite, type People_liteWhitelistEntry } from "./people_lite.js"; export { people_lite }; export type * from "./people_lite.js"; -export { DigestItem, Phase, DispatchClass, TokenError, ArithmeticError, TransactionalError, BalanceStatus, TransactionPaymentEvent, XcmV5Junctions, XcmV5Junction, XcmV5NetworkId, XcmV3JunctionBodyId, XcmV2JunctionBodyPart, XcmV5Instruction, XcmV3MultiassetFungibility, XcmV3MultiassetAssetInstance, XcmV3MaybeErrorCode, XcmV2OriginKind, XcmV5AssetFilter, XcmV5WildAsset, XcmV2MultiassetWildFungibility, XcmV3WeightLimit, XcmVersionedAssets, XcmV3MultiassetAssetId, XcmV3Junctions, XcmV3Junction, XcmV3JunctionNetworkId, XcmVersionedLocation, UpgradeGoAhead, UpgradeRestriction, BalancesTypesReasons, TransactionPaymentReleases, XcmV3Response, XcmV3TraitsError, XcmV4Response, XcmPalletVersionMigrationStage, XcmVersionedAssetId, IdentityData, MultiAddress, BalancesAdjustmentDirection, XcmVersionedXcm, XcmV3Instruction, XcmV3MultiassetMultiAssetFilter, XcmV3MultiassetWildMultiAsset, XcmV4Instruction, XcmV4AssetAssetFilter, XcmV4AssetWildAsset, TransactionValidityUnknownTransaction, TransactionValidityTransactionSource } from './common-types.js'; +export { DigestItem, Phase, DispatchClass, TokenError, ArithmeticError, TransactionalError, BalanceStatus, TransactionPaymentEvent, XcmV5Junctions, XcmV5Junction, XcmV5NetworkId, XcmV3JunctionBodyId, XcmV2JunctionBodyPart, XcmV5Instruction, XcmV3MultiassetFungibility, XcmV3MultiassetAssetInstance, XcmV3MaybeErrorCode, XcmV2OriginKind, XcmV5AssetFilter, XcmV5WildAsset, XcmV2MultiassetWildFungibility, XcmV3WeightLimit, XcmVersionedAssets, XcmV3MultiassetAssetId, XcmV3Junctions, XcmV3Junction, XcmV3JunctionNetworkId, XcmVersionedLocation, UpgradeGoAhead, UpgradeRestriction, BalancesTypesReasons, TransactionPaymentReleases, XcmV3Response, XcmV3TraitsError, XcmV4Response, XcmPalletVersionMigrationStage, XcmVersionedAssetId, IdentityData, MultiAddress, BalancesAdjustmentDirection, XcmVersionedXcm, XcmV3Instruction, XcmV3MultiassetMultiAssetFilter, XcmV3MultiassetWildMultiAsset, XcmV4Instruction, XcmV4AssetAssetFilter, XcmV4AssetWildAsset, TransactionValidityUnknownTransaction, TransactionValidityTransactionSource } from './common-types'; export declare const getMetadata: (codeHash: string) => Promise; export type WhitelistEntry = People_liteWhitelistEntry; export type WhitelistEntriesByChain = Partial<{ diff --git a/packages/host-papp/.papi/descriptors/dist/index.js b/packages/host-papp/.papi/descriptors/dist/index.js index a4d76209..9d9aaf81 100644 --- a/packages/host-papp/.papi/descriptors/dist/index.js +++ b/packages/host-papp/.papi/descriptors/dist/index.js @@ -14,16 +14,16 @@ const toBinary = (base64) => { return bytes; }; -const descriptorValues = import('./descriptors-DDm-U7Zd.js').then((module) => module["People_lite"]); -const metadataTypes = import('./metadataTypes-DOUrKMCQ.js').then( +const descriptorValues = import('./descriptors-D5oN4i7I.js').then((module) => module["People_lite"]); +const metadataTypes = import('./metadataTypes-BaUy_4gO.js').then( (module) => toBinary("default" in module ? module.default : module) ); const asset = {}; const extensions = {}; -const getMetadata$1 = () => import('./people_lite_metadata-DRlJN3X6.js').then( +const getMetadata$1 = () => import('./people_lite_metadata-Cj1JLFI2.js').then( (module) => toBinary("default" in module ? module.default : module) ); -const genesis = "0xd01475fde5d0592989b7715ae1d2e89fdb4f8c7688c09c850d75e1d4bdb47d64"; +const genesis = "0xa22a2424d2cbf561eaecf7da8b1b548fa9d1939f60265e942b1049616a012f71"; const _allDescriptors = { descriptors: descriptorValues, metadataTypes, asset, extensions, getMetadata: getMetadata$1, genesis }; const DigestItem = _Enum; @@ -76,7 +76,7 @@ const XcmV4AssetWildAsset = _Enum; const TransactionValidityUnknownTransaction = _Enum; const TransactionValidityTransactionSource = _Enum; -const metadatas = { ["0xee12eb3f12f8387448d2bf78c773dda08731483357a1b8fb773374f7b7bc417c"]: _allDescriptors }; +const metadatas = { ["0x0e48da626edc33a96d18d81fdc5eebe5d6a9b624af4ca4b9dbcc1345a3b03bb6"]: _allDescriptors }; const getMetadata = async (codeHash) => { try { return await metadatas[codeHash].getMetadata(); diff --git a/packages/host-papp/.papi/descriptors/dist/metadataTypes-BaUy_4gO.js b/packages/host-papp/.papi/descriptors/dist/metadataTypes-BaUy_4gO.js new file mode 100644 index 00000000..fe819af7 --- /dev/null +++ b/packages/host-papp/.papi/descriptors/dist/metadataTypes-BaUy_4gO.js @@ -0,0 +1,3 @@ +const content = "cQoAAAAQAQEFAAQBAQUAFAEBBQAcAAQAIAAEACQBAQUAIAEBBQAwAQEFAD0DACAARQMBAQUATQMBAQUANAEBBQBRAwEBBQAYAQEFAF0DAQEFAGkDAQEFAG0DAQEFAHkDAQAEGHJlbWFyayQBAQUBAAQUcGFnZXMIAQEFAQAEEGNvZGUkAQEFAQAEFGl0ZW1zgQMBAQUBAAQQa2V5c4UDAQEFAQAIGHByZWZpeCQcc3Via2V5cwQBAQUBAAQkY29kZV9oYXNoIAEBBQEBBQEABDRkaXNwYXRjaF9pbmZvQAEBBQEACDhkaXNwYXRjaF9lcnJvctg0ZGlzcGF0Y2hfaW5mb0ABAQUBAAQQaGFzaCABAQUBAAQcYWNjb3VudAABAQUBAAgYc2VuZGVyABBoYXNoIAEBBQEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAQEFAQAIJGNvZGVfaGFzaCAUZXJyb3LYAQEFAQEFAQEFAIkDAQEFAKkDAQEFAK0DAQEFACQBAQUAsQMBAQUAuQMBAQUAoQMBAQUAhQMBAQUAzQMBAQUA1QMBAQUA3QMBAQUA4QMBAQUA6QMBAQUACAEBBQDtAwEACBBkYXRh+QNUaW5ib3VuZF9tZXNzYWdlc19kYXRhKQQBAQUBAAQcbWVzc2FnZSQBAQUBAQUBAQUBAQUBAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBAEBBQEABBRjb3VudAQBAQUBAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIAEBBQEABDBtZXNzYWdlX2hhc2jgAQAEDG5vdwgBAQUAAAAMAAAANQQAAAA9BAAAAEUEAAAATQQBAAgQZGVzdFEEFHZhbHVlCAEBBQEADBhzb3VyY2VRBBBkZXN0UQQUdmFsdWUIAQEFAQAIEGRlc3RRBChrZWVwX2FsaXZlFAEBBQEACAx3aG9RBBhhbW91bnQIAQEFAQAEDHdob8kBAQEFAQAIDHdob1EEIG5ld19mcmVlCAEBBQEACCRkaXJlY3Rpb25VBBRkZWx0YQgBAQUBAAgUdmFsdWUIKGtlZXBfYWxpdmUUAQEFAQEFAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQgBAQUBAAgcYWNjb3VudAAYYW1vdW50CAEBBQEADBBmcm9tAAh0bwAYYW1vdW50CAEBBQEACAx3aG8AEGZyZWUIAQEFAQAIDHdobwAYYW1vdW50CAEBBQEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPoAQEFAQAEGGFtb3VudAgBAQUBAAQMd2hvAAEBBQEACAxvbGQIDG5ldwgBAQUBAAwYcmVhc29uCQEMd2hvABhhbW91bnQIAQEFAQAQGHJlYXNvbgkBGHNvdXJjZQAQZGVzdAAYYW1vdW50CAEBBQEAEBhyZWFzb24JARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCAEBBQANAQEBBQBZBAEBBQEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgBAQUBAAQYb3JpZ2lunQEApQEAXQQBAAQYZW50aXR5pQEBAQUBAQUBAAQYZW50aXR5pQEAVQEAZQQAaQQAdQQAeQQAfQQAVQEAgQQAVQEAsQEBAQUAVQEBAwRVAQCFBAEDCABVAQCFAgEDBFUBAIkEAQMEVQEAsQEBAAwIaWRVARRhZG1pblEELG1pbl9iYWxhbmNlCAEBBQEAEAhpZFUBFG93bmVyUQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UIAQEFAQAECGlkVQEBAQUBAAwIaWRVASxiZW5lZmljaWFyeVEEGGFtb3VudAgBAQUBAAwIaWRVAQx3aG9RBBhhbW91bnQIAQEFAQAMCGlkVQEYdGFyZ2V0UQQYYW1vdW50CAEBBQEAEAhpZFUBGHNvdXJjZVEEEGRlc3RRBBhhbW91bnQIAQEFAQAICGlkVQEMd2hvUQQBAQUBAAgIaWRVARRvd25lclEEAQEFAQAQCGlkVQEYaXNzdWVyUQQUYWRtaW5RBBxmcmVlemVyUQQBAQUBABAIaWRVARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBAEBBQEAFAhpZFUBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQBAQUBACAIaWRVARRvd25lclEEGGlzc3VlclEEFGFkbWluUQQcZnJlZXplclEELG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCRpc19mcm96ZW4UAQEFAQAMCGlkVQEgZGVsZWdhdGVRBBhhbW91bnQIAQEFAQAICGlkVQEgZGVsZWdhdGVRBAEBBQEADAhpZFUBFG93bmVyUQQgZGVsZWdhdGVRBAEBBQEAEAhpZFUBFG93bmVyUQQsZGVzdGluYXRpb25RBBhhbW91bnQIAQEFAQAICGlkVQEoYWxsb3dfYnVybhQBAQUBAAgIaWRVASxtaW5fYmFsYW5jZQgBAQUBAAwIaWRVARBkZXN0UQQoa2VlcF9hbGl2ZRQBAQUBAAgIaWRVASByZXNlcnZlc7EBAQEFAQEFAQAMIGFzc2V0X2lkVQEcY3JlYXRvcgAUb3duZXIAAQEFAQAMIGFzc2V0X2lkVQEUb3duZXIAGGFtb3VudAgBAQUBABAgYXNzZXRfaWRVARBmcm9tAAh0bwAYYW1vdW50CAEBBQEADCBhc3NldF9pZFUBFG93bmVyABxiYWxhbmNlCAEBBQEAECBhc3NldF9pZFUBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAAQEFAQAIIGFzc2V0X2lkVQEUb3duZXIAAQEFAQAIIGFzc2V0X2lkVQEMd2hvAAEBBQEABCBhc3NldF9pZFUBAQEFAQAMIGFzc2V0X2lkVQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcEAQEFAQAMIGFzc2V0X2lkVQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwQBAQUBABQgYXNzZXRfaWRVARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UAQEFAQAQIGFzc2V0X2lkVQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CAEBBQEADCBhc3NldF9pZFUBFG93bmVyACBkZWxlZ2F0ZQABAQUBABQgYXNzZXRfaWRVARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAIIGFzc2V0X2lkVQE8bmV3X21pbl9iYWxhbmNlCAEBBQEADCBhc3NldF9pZFUBDHdobwAkZGVwb3NpdG9yAAEBBQEADCBhc3NldF9pZFUBDHdobwAYYW1vdW50CAEBBQEACCBhc3NldF9pZFUBIHJlc2VydmVzsQEBAQUBAAggYXNzZXRfaWRVARhhbW91bnQIAGkEAEUEAGkEAAgBAQUBABAMd2hvACBhc3NldF9pZFUBGHJlYXNvbgkBGGFtb3VudAgAVQEACAEACChhc3NldF9raW5kVQEQcmF0ZQgBAQUBAAQoYXNzZXRfa2luZFUBAQEFAQEFAQAIKGFzc2V0X2tpbmRVARByYXRlCAEBBQEABChhc3NldF9raW5kVQEBAQUBAAwoYXNzZXRfa2luZFUBDG9sZAgMbmV3CAEBBQEAEAx3aG8AKGFjdHVhbF9mZWUIDHRpcAggYXNzZXRfaWTBAQEBBQAAAQEFAMkBAQEFAJEEAAAABAEBBQDlAQEABAxuZXfJAQEBBQEABAxtYXgEAQEFAQAEEGJvbmQIAQEFAQEFAQEFAQAEDHdobwABAQUBAAQsbmV3X2RlcG9zaXQIAQEFAQAIHGRlcG9zaXQIGHRhcmdldAABAQUBAQUBAAQ0aW52dWxuZXJhYmxlc8kBAQEFAQAEKGFjY291bnRfaWQAAQEFAQAESGRlc2lyZWRfY2FuZGlkYXRlcwQBAQUBAAQsYm9uZF9hbW91bnQIAQEFAQAIKGFjY291bnRfaWQAHGRlcG9zaXQIAQEFAQAMDG9sZAAMbmV3ABxkZXBvc2l0CAEBBQCZBAEBBQBFAwAAACAAnQQAAAAAAJ0CAQAIEGtleXMgFHByb29mJAEBBQEBBQEABDRzZXNzaW9uX2luZGV4BAEBBQEABCR2YWxpZGF0b3IAAQEFANECAQEFAKEEAQEFANkCAQEFAK0EALEEACQBAQUAtQQABAAIAQAEDG5ldwQBAQUBAQUBAAQwbWVzc2FnZV9oYXNoIAAIAN0EACAABADhBAAEAOEEAAgA4QQA5QQBAQUA7QQBAQUA8QQA+QQABQUAAAANBQEBBQBNAgCBAgAZBQEBBQBRAQEACBBkZXN0gQIcbWVzc2FnZUUFAQEFAQAQEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlRQUobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb25VARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbmUDAQEFAQAEIGxvY2F0aW9ugQIBAQUBABQQZGVzdIECLGJlbmVmaWNpYXJ5gQIYYXNzZXRzfQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdC0CAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzfQIsYmVuZWZpY2lhcnmBAgEBBQEAHBBkZXN0gQIYYXNzZXRzfQJQYXNzZXRzX3RyYW5zZmVyX3R5cGVJBThyZW1vdGVfZmVlc19pZPUESGZlZXNfdHJhbnNmZXJfdHlwZUkFSGN1c3RvbV94Y21fb25fZGVzdEUFMHdlaWdodF9saW1pdC0CAQEFAQAIHGFsaWFzZXKBAhxleHBpcmVzhQIBAQUBAAQcYWxpYXNlcoECAQEFAQEFAQAEHG91dGNvbWXhAQEBBQEAEBhvcmlnaW5VASxkZXN0aW5hdGlvblUBHG1lc3NhZ2VNAihtZXNzYWdlX2lkIAEBBQEAEBhvcmlnaW5VASxkZXN0aW5hdGlvblUBFGVycm9yUQIobWVzc2FnZV9pZCABAQUBAAwYb3JpZ2luVQEUZXJyb3LZAShtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW5VASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNlEQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2luVQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9uwQEBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpblUBGGFzc2V0c30CAQEFAQAQLGRlc3RpbmF0aW9uVQEYcmVzdWx0BBBjb3N0+QEobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb25VARx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvblUBIHF1ZXJ5X2lkCBRlcnJvctkBAQEFAQAIIGxvY2F0aW9ugQIgcXVlcnlfaWQIAQEFAQAQGG9yaWdpblUBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyVQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXLBAQEBBQEADCxkZXN0aW5hdGlvblUBEGNvc3T5AShtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmdVARBmZWVz+QEBAQUBAAQcdmVyc2lvbgQBAQUBAAwcYWxpYXNlclUBGHRhcmdldFUBGGV4cGlyeYUCAQEFAQAIHGFsaWFzZXJVARh0YXJnZXRVAQEBBQEABBh0YXJnZXRVAQEBBQEACBRpbmRleAQUZXJyb3JsAQEFACABAQUBAwgg4QEAkQIAVQUBAQUAkQIAWQUAXQUBAQUAGQIBAAg4bWVzc2FnZV9vcmlnaW6RAihwYWdlX2luZGV4BAEBBQEAEDhtZXNzYWdlX29yaWdpbpECEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYAQEFAQEFAQAMCGlkIBhvcmlnaW6RAhRlcnJvcpUCAQEFAQAQCGlkIBhvcmlnaW6RAix3ZWlnaHRfdXNlZBgcc3VjY2VzcxQBAQUBABAIaWQgGG9yaWdpbpECKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEAQEFAQAIGG9yaWdpbpECFGluZGV4BAEABBRjYWxscwUHAQEFAQAIFGluZGV4BBBjYWxsAQcBAQUBAAgkYXNfb3JpZ2lunQEQY2FsbAEHAQEFAQAIEGNhbGwBBxh3ZWlnaHQYAQEFAQAIEG1haW4BByBmYWxsYmFjawEHAQEFAQEFAQAIFGluZGV4BBRlcnJvctgBAQUBAAQUZXJyb3LYAQEFAQAEGHJlc3VsdKECAQEFAQAEKG1haW5fZXJyb3LYAJUEAAkHAQAIRG90aGVyX3NpZ25hdG9yaWVzyQEQY2FsbAEHAQEFAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPJATxtYXliZV90aW1lcG9pbnSVBRBjYWxsAQcobWF4X3dlaWdodBgBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBPG1heWJlX3RpbWVwb2ludJUFJGNhbGxfaGFzaCAobWF4X3dlaWdodBgBAQUBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBJHRpbWVwb2ludKkCJGNhbGxfaGFzaCABAQUBAAwkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBJGNhbGxfaGFzaCABAQUBAQUBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIAEBBQEAECRhcHByb3ZpbmcAJHRpbWVwb2ludKkCIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAUJGFwcHJvdmluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0oQIBAQUBABAoY2FuY2VsbGluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABAMd2hvACRjYWxsX2hhc2ggLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAQQY2FsbAEHAQEFAQAEDG5ld1EEAQEFAQAIDHdob1EEEGNhbGwBBwEBBQEBBQEABCxzdWRvX3Jlc3VsdKECAQEFAQAIDG9sZLECDG5ldwAAAAAVBwAAACEHAQMIAQe5AgAUAQMIuQK5AgAUAQAMEHJlYWxRBEBmb3JjZV9wcm94eV90eXBloQUQY2FsbAEHAQEFAQAMIGRlbGVnYXRlUQQocHJveHlfdHlwZbkCFGRlbGF5BAEBBQEADChwcm94eV90eXBluQIUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVyUQQocHJveHlfdHlwZbkCFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBAAgQcmVhbFEEJGNhbGxfaGFzaCABAQUBAAggZGVsZWdhdGVRBCRjYWxsX2hhc2ggAQEFAQAQIGRlbGVnYXRlUQQQcmVhbFEEQGZvcmNlX3Byb3h5X3R5cGWhBRBjYWxsAQcBAQUBAQUBABgQcHVyZQAMd2hvAChwcm94eV90eXBluQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEAQEFAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGW5AlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGW5AhRkZWxheQQBAQUBABAMd2hvABBraW5kvQIsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAAAAC0HAAAAJAAAABkGAAAAMQcBAQUAPQcAJABBBwAkAEkHACQATQcAJAAEACAAWQcAIABdBwEABBxhY2NvdW50UQQBAQUBAAQQaW5mbxUGAQEFAQAEEHN1YnMdBgEBBQEACCRyZWdfaW5kZXgEHG1heF9mZWUIAQEFAQAEJHJlZ19pbmRleAQBAQUBAAgUaW5kZXgEDGZlZQgBAQUBAAgUaW5kZXgEDG5ld1EEAQEFAQAIFGluZGV4BBhmaWVsZHMIAQEFAQAQJHJlZ19pbmRleAQYdGFyZ2V0UQQkanVkZ2VtZW50IQYgaWRlbnRpdHkgAQEFAQAEGHRhcmdldFEEAQEFAQAIDHN1YlEEEGRhdGENBgEBBQEABAxzdWJRBAEBBQEADCRhdXRob3JpdHlRBBhzdWZmaXgkKGFsbG9jYXRpb24EAQEFAQAIGHN1ZmZpeCQkYXV0aG9yaXR5UQQBAQUBABAMd2hvUQQgdXNlcm5hbWUkJHNpZ25hdHVyZTEGOHVzZV9hbGxvY2F0aW9uFAEBBQEABCB1c2VybmFtZSQBAQUBAAwcYWNjb3VudAAkc2lnbmF0dXJlLQYgdXNlcm5hbWUkAQEFAQAEKGNyZWRlbnRpYWw1BgEBBQEADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudMkCAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEBBQEACCByZXBvcnRlcgAgdXNlcm5hbWUkAQEFAQAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSQBAQUBAAQUYWxpYXMgAQEFAQAIIHVzZXJuYW1lJCRqdWRnZW1lbnTJAgAgAAgACABhBwBhAQAAAAAAZQEAAAAIAAgAnQIBAQUABQMBAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdAQBAQUBAAQYcGVvcGxl0QIBAQUBAAQcYWxpYXNlcz0GAQEFAQEFAQAIDHdobwgMa2V5IAEBBQEACBRhbGlhc2EBHGFjY291bnQAAQEFAQAIDHdobwgcYWNjb3VudAABAQUBAAQYcGVvcGxl0QIAIABlBwDZAwAEANkDAMkCAAQAfQcABACBBwAEAIUHAQEFAIkHAQEFAJEHAQAIKGNhc2VfaW5kZXgEHG9waW5pb27JAgEBBQEABChjYXNlX2luZGV4BAEBBQEACChjYXNlX2luZGV4BBR2b3RlciABAQUBAAgoY2FzZV9pbmRleAQcdmVyZGljdMkCAQEFAQAELGRlc3RpbmF0aW9uAAEBBQEABDBjYXNlX2luZGljZXPZAgEBBQEADBhhbW91bnQIFGNvdW50BBhwZXJpb2QEAQEFAQAEFGluZGV4BAEBBQEACBRyb3VuZAQUdm90ZXIgAQEFAQEFAQAEKGNhc2VfaW5kZXgEAQEFAQAIKGNhc2VfaW5kZXgEHHZlcmRpY3TJAgEBBQEADChjYXNlX2luZGV4BBR2b3RlciAcb3BpbmlvbskCAQEFAQAIKGNhc2VfaW5kZXgEFHZvdGVyIAEBBQEACBR2b3RlciAwY2FzZV9pbmRpY2Vz2QIBAQUBAAwUdm90ZXIgLGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAMFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIMHRvdGFsX3BvaW50cwgBAQUBAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBAEBBQEABBRpbmRleAQBAQUBAAgUdm90ZXIgGGFtb3VudAgBAQUBAAgUcm91bmQEFHZvdGVyIAEBBQEACChjYXNlX2luZGV4BBxyaXBlbmVkFAEBBQEABAx3aG8gAAAAnQcACAClBwAIAMkBAAQAqQcAQQMArQcBAQUA5QIAsQcAnQIBAQUAUQYBAAQgZXZpZGVuY2UgAQEFAQAMDGtleSAsZGVzdGluYXRpb24ASHByb29mX29mX293bmVyc2hpcEkGAQEFAQAIGGNob2ljZU0GKHJlcXVpcmVfaWSFAgEBBQEABBxhY2NvdW50AAEBBQEADCByZWZlcnJlcggkc2lnbmF0dXJlLQYYdGlja2V0AAEBBQEADBxpbnZpdGVyABh0aWNrZXQAJHNpZ25hdHVyZS0GAQEFAQAMFGluZGV4BBBraW5k4QIIaWQgAQEFAQAEGHRpY2tldAABAQUBAAgcYWNjb3VudAAUY291bnQEAQEFAQAIHGFjY291bnQAFGxpbWl0BAEBBQEABBhjb25maWflAgEBBQEACDxyZWZlcnJlZF92YWx1ZXNRBjxyZWZlcnJlcl92YWx1ZXNRBgEBBQEBBQEACChhY2NvdW50X2lkACRqdWRnZW1lbnTJAgEBBQEACChhY2NvdW50X2lkACBmYWlsdXJlcwQBAQUBAAgoYWNjb3VudF9pZAAscGVyc29uYWxfaWQIAQEFAQAIIHJlZmVycmVyCCByZWZlcnJlZAABAQUBAAgoYWNjb3VudF9pZAAscmVzZXJ2ZWRfaWQIAQEFAQAIIHJlZmVycmVyCBh0aWNrZXQAAQEFAQAIKGFjY291bnRfaWQAIHJlZmVycmVyCAEBBQEADBRpbmRleAQQa2luZOECCGlkIAEBBQEABBxpbnZpdGVyAAEBBQEACAx3aG8AHGludml0ZXIAAQEFAQAEIHJlZmVycmVyCAEBBQEACBxhY2NvdW50ABRjb3VudAQBAQUBAAgcaW52aXRlcgAYdGlja2V0AAEBBQEABBhjb25maWflAgEBBQBtBgC1BwAEALUHAJ0CAO0CALkHAO0CAMkHAQEFANkHAAQABADtAgDZAgCxBADtAgDZAwDtAgEBBQBpBgAgAAAAAAApBgEBBQDdBwDtAgDhBwEABDhpZGVudGlmaWVyX2tleSkGAQEFAQAMOGlkZW50aWZpZXJfa2V5KQZEc3RhdGVtZW50X2FjY291bnQADHNpZy0GAQEFAQAELGZ1bGxfcmVwb3J0YQYBAQUBAAQYcGxheWVyAAEBBQEABDxnYW1lc19zY2hlZHVsZXNpBgEBBQEABDhnYW1lX3BsYXlfdGltZQQBAQUBAAQsYmVuZWZpY2lhcnkAAQEFAQAUHHBvb2xfaWQEKHJpbmdfaW5kZXgEIHJldmlzaW9uBBRwcm9vZo0BLGJlbmVmaWNpYXJ5AAEBBQEABBhwaGFzZXNtBgEBBQEBBQEADERyZWdpc3RyYXRpb25fZW5kcwQkZ2FtZV9kYXRlBCxyZXBvcnRfZW5kcwQBAQUBAAQMd2hv7QIBAQUBAAgMd2hv7QIoZ2FtZV9pbmRleAQBAQUBAAQYcGxheWVy7QIBAQUBAAQ4Z2FtZV9wbGF5X3RpbWUEAQEFAQAEKGdhbWVfaW5kZXgEAQEFAQAILGJlbmVmaWNpYXJ5ABhhbW91bnQIAQEFAQAIKGdhbWVfaW5kZXgEHHBvb2xfaWQEAQEFAQAIKGdhbWVfaW5kZXgEFGVycm9y2ADtAgDtBwEBBQCBBgEBBQC9BADxBwAEAAQA9QcBAQUA+QcBAQUAAQgBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAEBBQEACCxyb3VuZF9pbmRleAQUbGltaXQEAQEFAQAEDGtleXkGAQEFAQAEIHNjaGVkdWxlgQYBAQUBAQUBAAwMd2hv7QIsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAgMd2hv7QIccmVzdW1lZBQBAQUBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAAIAAUIAQAEFGNvdW50BAEBBQEABAhpZAgBAQUBAAQwaWRzX2FuZF9rZXlzjQYBAQUBAAQMaWRzkQYBAQUBAQUBAAQIaWQIAAAADQgBABQkY2FuZGlkYXRlAExjYW5kaWRhdGVfc2lnbmF0dXJlLQYwcmluZ192cmZfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBlRjb25zdW1lcl9yZWdpc3RyYXRpb26dBgEBBQEACBxhY2NvdW50ADh2YWxpZF9hdF9ibG9jawQBAQUBAQUBAAQgdmVyaWZpZXIAAQEFAQAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIAAAAAFQgAGQgAHQgAJQgAnQIAIAApCAAZCACdAgAkAAAAJAAxCAEBBQA1CAEDAAAEAQMIBAQAIAEADDhpZGVudGlmaWVyX2tleSkGIHVzZXJuYW1lJERyZXNlcnZlZF91c2VybmFtZS0DAQEFAQAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mLQY8dXNlcm5hbWVfY2hvaWNlpQYBAQUBAAggdXNlcm5hbWUkHGFjY291bnQAAQEFAQAEIGR1cmF0aW9uCAEBBQEACCRyZWZlcmVuY2WpBihhY2NvdW50X2lkAAEBBQEACBxhY2NvdW50AAxzZXEEAQEFAQAMGHBlcmlvZAQMc2VxBDh0YXJnZXRfYWNjb3VudAABAQUBAAgYcGVyaW9kBCxmaXJzdF9lbnRyeSABAQUBAAwYcGVyaW9kBBxjb3VudGVyBChhY2NvdW50X2lkAAEBBQEACBhwZXJpb2QEFGxpbWl0BAEBBQEBBQEACBRhbGlhcyAcYWNjb3VudAABAQUBABAUYWxpYXMgGHBlcmlvZAQMc2VxBBxhY2NvdW50AAEBBQEACCB1c2VybmFtZSQcYWNjb3VudAABAQUBAAQgZHVyYXRpb24IAQEFAQAMGHBlcmlvZAQkZmlyc3Rfa2V5IBRjb3VudAQBAQUBABQUYWxpYXMgGHBlcmlvZAQcY291bnRlcgQcYWNjb3VudAAoY29sbGVjdGlvbn0BAQEFAQAIGHBlcmlvZAQUY291bnQEADkIAD0IADkIACABAAw0cmluZ19leHBvbmVudAUDKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJAEBBQEACDRyaW5nX2V4cG9uZW50BQMscGFnZV9oYXNoZXPRAgEBBQEBBQEACDRyaW5nX2V4cG9uZW50BQMsdG90YWxfcGFnZXMEAQEFAQAMNHJpbmdfZXhwb25lbnQFAyxzdGFydF9pbmRleAQUY291bnQEACAASQgAQQgA0QIATQgAWQgAXQgAYQgAZQgA0QIATQgAaQgATQgA2QIAbQgAcQgAIAB1CABNCACdAgAgAEEDAE0IANECAGUIAJ0CAQAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgEAQEFAQAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQBAQUBAAwoaWRlbnRpZmllciAYbWVtYmVyIDRjYWxsX3ZhbGlkX2F0CAEBBQEAFChpZGVudGlmaWVyIChyaW5nX2luZGV4BDRyaW5nX2V4cG9uZW50BQMgcmV2aXNpb24EKHRvX2luY2x1ZGUEAQEFAQAMKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEEGhlYWQEAQEFAQAMKGlkZW50aWZpZXIgMGluaXRpYWxfaGVhZAQgbmV3X2hlYWQEAQEFAQAIKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEAQEFAQAMKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEKHBhZ2VfaW5kZXgEAQEFAQAIKGlkZW50aWZpZXIgKHBhZ2VfaW5kZXgEAQEFAQAEKGlkZW50aWZpZXIgAQEFAQAMKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEFGxpbWl0BAEBBQEBBQEABAxrZXkgAQEFAQAEKGlkZW50aWZpZXIgAQEFAQAIKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEAQEFAQAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgEAQEFAQAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQBAQUBAAgoaWRlbnRpZmllciAMa2V5IAEBBQEADChpZGVudGlmaWVyIChyaW5nX2luZGV4BCByZXZpc2lvbgQAAACJAQAAAH0IANkDAJ0CAAQAnQIAgQgAnQIAsQQAnQIAIACdAgAhCACdAgAoAJ0CACgABAEBBQCdAgEDAACFCAEDCAQEAIkIAQMIBAQAZQMBAwgEBACJCAEDCAQEAGUDAQMAAIUCAQMAAAgBAwQAAI0IAQMEAACFAgEDBCAAZQMBAwQgABQBAwgEBADRAgEDCAQEANECAQMMBAQgABQBAwwEBCAAFAEDCAQgABQBAwAAGAEABChzcGxpdF9pbnRvvQYBAQUBAAQIdG8AAQEFAQAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcEkGAQEFAQAQMHByZXNlcnZhdGlvbsEGFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBgEBBQEABBRpdGVtc8kGAQEFAQAUHGFsaWFzZXPRAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwABAQUBABwcYWxpYXNlc9ECFHZhbHVlBBRpbmRleAQgcmV2aXNpb24ECHRvAFRleHRlcm5hbF9hc3NldF9hbW91bnQIMG5ld192b3VjaGVyc90DAQEFAQAQFGlucHV0zQYwYWxpYXNfcHJvb2ZzkQEIdG8AMGZlZV9jdXJyZW5jeREDAQEFAQAQGGlucHV0c9EGMGFsaWFzX3Byb29mc5EBCHRvADBmZWVfY3VycmVuY3kRAwEBBQEAGBxhbGlhc2Vz0QIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQoc3BsaXRfaW50b70GHG1heF9mZWUIAQEFAQAEFHZhbHVlBAEBBQEABBhwZXJpb2QEAQEFAQAIGHBlcmlvZAQocmluZ19pbmRleAQBAQUBAQUBAAQwb3V0cHV0X2NvdW50BAEBBQEADAh0bwAUdmFsdWUEHG5ld19hZ2UEAQEFAQAEFHZhbHVlBAEBBQEADAx3aG8AFHZhbHVlBBhhbW91bnQIAQEFAQAQCHRvACxpbnB1dF92YWx1ZQQwb3V0cHV0X3ZhbHVlBCxpbnB1dF9jb3VudAQBAQUBABAIdG8AFHZhbHVlBCxpbnB1dF9jb3VudAQYYW1vdW50CAEBBQEAFAh0bwAUdmFsdWUELGlucHV0X2NvdW50BFRleHRlcm5hbF9hc3NldF9hbW91bnQINHZvdWNoZXJfY291bnQEAQEFAQAIDGZlZQgkZGVzdHJveWVkCAEBBQEACAx3aG8ADGZlZQgBAQUBAAQYcGVyaW9kBAEBBQEADAh0bwAwb3V0cHV0X3ZhbHVlBCxpbnB1dF9jb3VudAQBAQUBAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIAQEFAQAUDHdobwAIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIMGZlZV9jdXJyZW5jeREDAQEFAQAMCHRvABR2YWx1ZQQYYW1vdW50CAEBBQEADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CAEBBQEACBhwZXJpb2QEKHJpbmdfaW5kZXgEAAQAkQgBAQUAlQgAmQgAnQIABACdCAAgANkCAQEFAKEIANkDAAgBAAxcc3Vic2NyaWJlcl9wYXJhY2hhaW5faWQETG1lbWJlcnNfY29sbGVjdGlvbnPdBjBwYWxsZXRfaW5kZXgEAQEFAQAEXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkZQMBAQUBAAxcc3Vic2NyaWJlcl9wYXJhY2hhaW5faWQEKGlkZW50aWZpZXIgRHJpbmdfcm9vdF9pbmRpY2Vz2QIBAQUBAAQkc2VuZF9wYWdlBAEBBQEACBxwYXJhX2lkBCBzZXF1ZW5jZQgBAQUBAAwccGFyYV9pZARgY3VycmVudF9jb2xsZWN0aW9uX2luZGV4BEBhZnRlcl9yaW5nX2luZGV4ZQMBAQUBAQUBAAQccGFyYV9pZAQBAQUBAAgccGFyYV9pZAQwdXBkYXRlX2NvdW50BAEBBQEADBxwYXJhX2lkBChpZGVudGlmaWVyIDRpbmRpY2VzX2NvdW50BAEBBQEABCBzZXF1ZW5jZQgBAQUApQgBAAQcZW5hYmxlZBQBAQUBAQUBAAQccG9vbF9pZAQBAQUBAAQcZW5hYmxlZBQBAQUAqQgABACxCADxBwCdAgEAHBh0YXJnZXQlAyhkaXNwYXRjaGVyACB2YWxpZGl0eQQobnVtX3ByaXplcwQscHJpemVfdmFsdWUIIGFzc2V0X2lkVQEwd2lubmVyX3JhdGlvBAEBBQEAGBxwb29sX2lkBChyaW5nX2luZGV4BCByZXZpc2lvbgQUcHJvb2aNARRhbGlhcyAsYmVuZWZpY2lhcnkAAQEFAQAEHHBvb2xfaWQEAQEFAQEFAQAcCGlkBChkaXNwYXRjaGVyABh0YXJnZXQlAyBhc3NldF9pZFUBKG51bV9wcml6ZXMELHByaXplX3ZhbHVlCChleHBpcmVzX2F0CAEBBQEAFBxwb29sX2lkBCBjbGFpbWFudO0CLGJlbmVmaWNpYXJ5ACBhc3NldF9pZFUBGGFtb3VudAgBAQUBAAgIaWQEIGFzc2V0X2lkVQEBAQUBAAwIaWQEIGFzc2V0X2lkVQEgcmVmdW5kZWQIAQEFAQAQHHBvb2xfaWQELGJlbmVmaWNpYXJ5ACBhc3NldF9pZFUBGGFtb3VudAgBAQUA8QYAJACdAgEDAAC1CAEDAAC9CAEDAACFAwEDAADBCAEABBhjdXJzb3L1BgEBBQEADBRpbmRleAQwaW5uZXJfY3Vyc29yLQMoc3RhcnRlZF9hdGUDAQEFAQAEIHNlbGVjdG9y+QYBAQUBAQUBAAQobWlncmF0aW9ucwQBAQUBAAgUaW5kZXgEEHRvb2sEAQEFAQAELG5leHRfY3Vyc29yLQMBAwAA0QIBAwggCAAUAQMAAHkDAQMExQgAnQIBAwTxAwDJCAEDAAAkAQMEBAAtAwEDAADZAgEDCM0IJADVCAEDBCQA5QgBAwAA8QMBAwTtCACFAwEDCMUI7QgA8QgBAwz1CCQgAP0IAQME8QMAnQIBAwgkLQMAAQkBAwQkAA0JAQMEAAAEAQMIJAQAEQkBAwgkBAAdCQEDBBgACAEDBAQACAEDCAEHBAARCQEDCAEHBAAdCQEDBAQAKQkBAwRFBQAtCQEDCBj1BAAxCQEDDIECRQX1BAA1CQEDDJ0BAQcEAGEJAQMIgQJFBQBpCQEDBIECAHEJAQMIIBQA2QIBAwTxAwB1CQEDBCQAeQkBAwR9CQAtAwEDAACBCYUJAQEBAgEDABAQZnJlZQggcmVzZXJ2ZWQIGGZyb3plbggUZmxhZ3MIABQUbm9uY2UEJGNvbnN1bWVycwQkcHJvdmlkZXJzBCxzdWZmaWNpZW50cwQQZGF0YQwBAAAIIHJlZl90aW1lCChwcm9vZl9zaXplCAAMGG5vcm1hbBgsb3BlcmF0aW9uYWwYJG1hbmRhdG9yeRgFAYAFAAUBEAIUKFByZVJ1bnRpbWUAAwgoJCRDb25zZW5zdXMAAwgoJBBTZWFsAAMIKCQUT3RoZXIBJGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAEFBCwAAgw4QXBwbHlFeHRyaW5zaWMBBDBGaW5hbGl6YXRpb24AAQU4SW5pdGlhbGl6YXRpb24AAQUCDBhOb3JtYWwAAQUsT3BlcmF0aW9uYWwAAQUkTWFuZGF0b3J5AAEFAggMWWVzAAEFCE5vAAEFAAwYd2VpZ2h0GBRjbGFzczggcGF5c19mZWU8AiQ8SW52YWxpZFNwZWNOYW1lAAEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAAEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAAEFTE5vbkRlZmF1bHRDb21wb3NpdGUAAQU8Tm9uWmVyb1JlZkNvdW50AAEFMENhbGxGaWx0ZXJlZAABBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcAAQVETm90aGluZ0F1dGhvcml6ZWQAAQUwVW5hdXRob3JpemVkAAEFAhhMT3ZlcmxhcHBpbmdVcGdyYWRlcwABBVBQcm9oaWJpdGVkQnlQb2xrYWRvdAABBRhUb29CaWcAAQVoVmFsaWRhdGlvbkRhdGFOb3RBdmFpbGFibGUAAQV0SG9zdENvbmZpZ3VyYXRpb25Ob3RBdmFpbGFibGUAAQUwTm90U2NoZWR1bGVkAAEFAjA4VmVzdGluZ0JhbGFuY2UAAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAAEFTEluc3VmZmljaWVudEJhbGFuY2UAAQVIRXhpc3RlbnRpYWxEZXBvc2l0AAEFNEV4cGVuZGFiaWxpdHkAAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUAAQUsRGVhZEFjY291bnQAAQU8VG9vTWFueVJlc2VydmVzAAEFMFRvb01hbnlIb2xkcwABBThUb29NYW55RnJlZXplcwABBUxJc3N1YW5jZURlYWN0aXZhdGVkAAEFJERlbHRhWmVybwABBQIIHE5vVXNhZ2UAAQUcTm90WmVybwABBQJgKEJhbGFuY2VMb3cAAQUkTm9BY2NvdW50AAEFME5vUGVybWlzc2lvbgABBRxVbmtub3duAAEFGEZyb3plbgABBRRJblVzZQABBShCYWRXaXRuZXNzAAEFOE1pbkJhbGFuY2VaZXJvAAEFTFVuYXZhaWxhYmxlQ29uc3VtZXIAAQUsQmFkTWV0YWRhdGEAAQUoVW5hcHByb3ZlZAABBSBXb3VsZERpZQABBTRBbHJlYWR5RXhpc3RzAAEFJE5vRGVwb3NpdAABBSRXb3VsZEJ1cm4AAQUkTGl2ZUFzc2V0AAEFMEFzc2V0Tm90TGl2ZQABBTxJbmNvcnJlY3RTdGF0dXMAAQUkTm90RnJvemVuAAEFOENhbGxiYWNrRmFpbGVkAAEFKEJhZEFzc2V0SWQAAQU8Q29udGFpbnNGcmVlemVzAAEFNENvbnRhaW5zSG9sZHMAAQU8VG9vTWFueVJlc2VydmVzAAEFAgQwVG9vTWFueUhvbGRzAAEFAgxAVW5rbm93bkFzc2V0S2luZAABBTRBbHJlYWR5RXhpc3RzAAEFIE92ZXJmbG93AAEFAkREVG9vTWFueUNhbmRpZGF0ZXMAAQVcVG9vRmV3RWxpZ2libGVDb2xsYXRvcnMAAQVAQWxyZWFkeUNhbmRpZGF0ZQABBTBOb3RDYW5kaWRhdGUAAQVQVG9vTWFueUludnVsbmVyYWJsZXMAAQVMQWxyZWFkeUludnVsbmVyYWJsZQABBTxOb3RJbnZ1bG5lcmFibGUAAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQVYVmFsaWRhdG9yTm90UmVnaXN0ZXJlZAABBWxJbnNlcnRUb0NhbmRpZGF0ZUxpc3RGYWlsZWQAAQV0UmVtb3ZlRnJvbUNhbmRpZGF0ZUxpc3RGYWlsZWQAAQU0RGVwb3NpdFRvb0xvdwABBWRVcGRhdGVDYW5kaWRhdGVMaXN0RmFpbGVkAAEFQEluc3VmZmljaWVudEJvbmQAAQVQVGFyZ2V0SXNOb3RDYW5kaWRhdGUAAQVASWRlbnRpY2FsRGVwb3NpdAABBUBJbnZhbGlkVW5yZXNlcnZlAAEFAhQwSW52YWxpZFByb29mAAEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAEFNER1cGxpY2F0ZWRLZXkAAQUYTm9LZXlzAAEFJE5vQWNjb3VudAABBQIUOEJhZFF1ZXVlQ29uZmlnAAEFQEFscmVhZHlTdXNwZW5kZWQAAQU4QWxyZWFkeVJlc3VtZWQAAQV0VG9vTWFueUFjdGl2ZU91dGJvdW5kQ2hhbm5lbHMAAQUYVG9vQmlnAAEFAqQgT3ZlcmZsb3cAAQU0VW5pbXBsZW1lbnRlZAABBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgABBTBMb2NhdGlvbkZ1bGwAAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAEFJEJhZE9yaWdpbgABBTxJbnZhbGlkTG9jYXRpb24AAQU0QXNzZXROb3RGb3VuZAABBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQAAQU8Tm90V2l0aGRyYXdhYmxlAAEFSExvY2F0aW9uQ2Fubm90SG9sZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBTBVbmtub3duQ2xhaW0AAQU4RmFpbGVkVG9EZWNvZGUAAQVATWF4V2VpZ2h0SW52YWxpZAABBThOb3RIb2xkaW5nRmVlcwABBTBUb29FeHBlbnNpdmUAAQUQVHJhcAABBUBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBTRUb29NYW55QXNzZXRzAAEFTFVuaGFuZGxlZFhjbVZlcnNpb24AAQVIV2VpZ2h0TGltaXRSZWFjaGVkAAEFHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQJwLFVucmVhY2hhYmxlAAEFLFNlbmRGYWlsdXJlAAEFIEZpbHRlcmVkAAEFSFVud2VpZ2hhYmxlTWVzc2FnZQABBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUAAQUURW1wdHkAAQU4Q2Fubm90UmVhbmNob3IAAQU0VG9vTWFueUFzc2V0cwABBTRJbnZhbGlkT3JpZ2luAAEFKEJhZFZlcnNpb24AAQUsQmFkTG9jYXRpb24AAQU4Tm9TdWJzY3JpcHRpb24AAQVEQWxyZWFkeVN1YnNjcmliZWQAAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAABBShMb3dCYWxhbmNlAAEFMFRvb01hbnlMb2NrcwABBUxBY2NvdW50Tm90U292ZXJlaWduAAEFKEZlZXNOb3RNZXQAAQUwTG9ja05vdEZvdW5kAAEFFEluVXNlAAEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAAEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQABBTxUb29NYW55UmVzZXJ2ZXMAAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAAEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwABBTRFeHBpcmVzSW5QYXN0AAEFNEFsaWFzTm90Rm91bmQAAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAAAIFGluZGV4BBRlcnJvcmwCJCxOb3RSZWFwYWJsZQABBRhOb1BhZ2UAAQUkTm9NZXNzYWdlAAEFQEFscmVhZHlQcm9jZXNzZWQAAQUYUXVldWVkAAEFSEluc3VmZmljaWVudFdlaWdodAABBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUAAQUsUXVldWVQYXVzZWQAAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAABBQIEMFRvb01hbnlDYWxscwABBQI4QE1pbmltdW1UaHJlc2hvbGQAAQU8QWxyZWFkeUFwcHJvdmVkAAEFRE5vQXBwcm92YWxzTmVlZGVkAAEFRFRvb0Zld1NpZ25hdG9yaWVzAAEFSFRvb01hbnlTaWduYXRvcmllcwABBVRTaWduYXRvcmllc091dE9mT3JkZXIAAQVMU2VuZGVySW5TaWduYXRvcmllcwABBSBOb3RGb3VuZAABBSBOb3RPd25lcgABBSxOb1RpbWVwb2ludAABBThXcm9uZ1RpbWVwb2ludAABBUxVbmV4cGVjdGVkVGltZXBvaW50AAEFPE1heFdlaWdodFRvb0xvdwABBTRBbHJlYWR5U3RvcmVkAAEFAgQsUmVxdWlyZVN1ZG8AAQUCIBxUb29NYW55AAEFIE5vdEZvdW5kAAEFIE5vdFByb3h5AAEFLFVucHJveHlhYmxlAAEFJER1cGxpY2F0ZQABBTBOb1Blcm1pc3Npb24AAQUsVW5hbm5vdW5jZWQAAQUsTm9TZWxmUHJveHkAAQUCpEhUb29NYW55U3ViQWNjb3VudHMAAQUcTm9BbGlhcwABBSBOb3RGb3VuZAABBSBOb3ROYW1lZAABBShFbXB0eUluZGV4AAEFKEZlZUNoYW5nZWQAAQUoTm9JZGVudGl0eQABBTxTdGlja3lKdWRnZW1lbnQAAQU4SnVkZ2VtZW50R2l2ZW4AAQVASW52YWxpZEp1ZGdlbWVudAABBTBJbnZhbGlkSW5kZXgAAQU0SW52YWxpZFRhcmdldAABBURUb29NYW55UmVnaXN0cmFycwABBThBbHJlYWR5Q2xhaW1lZAABBTxBbHJlYWR5UmVwb3J0ZWQAAQUYTm90U3ViAAEFIE5vdE93bmVkAAEFdEp1ZGdlbWVudEZvckRpZmZlcmVudElkZW50aXR5AAEFWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAAQU0SW52YWxpZFN1ZmZpeAABBVBOb3RVc2VybmFtZUF1dGhvcml0eQABBTBOb0FsbG9jYXRpb24AAQVASW52YWxpZFNpZ25hdHVyZQABBURSZXF1aXJlc1NpZ25hdHVyZQABBTxJbnZhbGlkVXNlcm5hbWUAAQU0VXNlcm5hbWVUYWtlbgABBShOb1VzZXJuYW1lAAEFZE5vdFN5c3RlbVByb3ZpZGVkVXNlcm5hbWUAAQUoTm90RXhwaXJlZAABBSBUb29FYXJseQABBTBOb3RVbmJpbmRpbmcAAQVAQWxyZWFkeVVuYmluZGluZwABBVhJbnN1ZmZpY2llbnRQcml2aWxlZ2VzAAEFKEJhZENvbnRleHQAAQVMVW5leHBlY3RlZEp1ZGdlbWVudAABBTBOb3RTdXBwb3J0ZWQAAQUYQmFubmVkAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFREp1ZGdlbWVudExpc3RGdWxsAAEFbExhc3RVc2VybmFtZVJlcG9ydFRvb1JlY2VudAABBWBVc2VybmFtZUp1ZGdlbWVudE9uZ29pbmcAAQUClCROb3RQZXJzb24AAQUUTm9LZXkAAQU4SW52YWxpZENvbnRleHQAAQU4SW52YWxpZEFjY291bnQAAQUwQWNjb3VudEluVXNlAAEFMEludmFsaWRQcm9vZgABBUBJbnZhbGlkU2lnbmF0dXJlAAEFJE5vTWVtYmVycwABBShJbmNvbXBsZXRlAAEFKFN0aWxsRnJlc2gAAQU4VG9vTWFueU1lbWJlcnMAAQU8S2V5QWxyZWFkeUluVXNlAAEFLEtleU5vdEZvdW5kAAEFMENvdWxkTm90UHVzaAABBRxTYW1lS2V5AAEFVFBlcnNvbmFsSWROb3RSZXNlcnZlZAABBYBQZXJzb25hbElkUmVzZXJ2YXRpb25DYW5ub3RSZW5ldwABBZBQZXJzb25hbElkTm90UmVzZXJ2ZWRPck5vdFJlY29nbml6ZWQAAQUsSW52YWxpZFJpbmcAAQVIU3VzcGVuc2lvbnNQZW5kaW5nAAEFXFJpbmdBYm92ZU1lcmdlVGhyZXNob2xkAAEFSEludmFsaWRTdXNwZW5zaW9ucwABBUROb011dGF0aW9uU2Vzc2lvbgABBXBDb3VsZE5vdFN0YXJ0TXV0YXRpb25TZXNzaW9uAAEFbFN1c3BlbnNpb25TZXNzaW9uSW5Qcm9ncmVzcwABBTRBbGlhc05vdFN0YWxlAAEFOFRpbWVPdXRPZlJhbmdlAAEFWEFsaWFzQWNjb3VudEFscmVhZHlTZXQAAQUwTm90U3VzcGVuZGVkAAEFJFN1c3BlbmRlZAABBUxJbnZhbGlkS2V5TWlncmF0aW9uAAEFTEtleUFscmVhZHlTdXNwZW5kZWQAAQVUSW52YWxpZE9uYm9hcmRpbmdTaXplAAEFQEludmFsaWRNZW1iZXJLZXkAAQV0UGVvcGxlQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQU0QWxpYXNNaXNtYXRjaAABBThOb1N0YWxlQWxpYXNlcwABBQJQKE5vU3VjaENhc2UAAQUoTm9TdWNoVm90ZQABBRxOb3RPcGVuAAEFHE5vdFJpcGUAAQUcTm90RG9uZQABBShDb2RlY0Vycm9yAAEFNERpc3BhdGNoRXJyb3IAAQUYUmVjZW50AAEFIE5vQ3JlZGl0AAEFIE5vUmV3YXJkAAEFIE5vUG9pbnRzAAEFNFRvb01hbnlDbGFpbXMAAQUgTm9QYXlvdXQAAQVIQXJpdGhtZXRpY092ZXJmbG93AAEFQFRvb01hbnlTY2hlZHVsZXMAAQUoTm9TY2hlZHVsZQABBSROb1BlbmFsdHkAAQUURWFybHkAAQUwVW5kZXJQZW5hbHR5AAEFWENhc2VFeHBpcmF0aW9uRGlzYWJsZWQAAQUCoChJblByb2dyZXNzAAEFKE5vUmVmZXJyYWwAAQUoQmFkQ29udGV4dAABBUxVbmV4cGVjdGVkSnVkZ2VtZW50AAEFGE5vQXJncwABBShOb3RBcHBsaWVkAAEFLE5vdFNlbGVjdGVkAAEFJE5vdFByb3ZlbgABBThBbHJlYWR5U3RhcnRlZAABBShPdXRPZlJhbmdlAAEFMEFscmVhZHlUYWtlbgABBTxOb01vcmVSZWZlcnJhbHMAAQUgVG9vRWFybHkAAQU0RGVzaWduSW52YWxpZAABBSxEZXNpZ25UYWtlbgABBSRCYWRQYXJlbnQAAQUkQmFkRmFtaWx5AAEFLFdyb25nRmFtaWx5AAEFLEluZGV4VG9vQmlnAAEFEEJ1c3kAAQUYQmFubmVkAAEFKEltcHJvYmFibGUAAQUoSWRSZXNlcnZlZAABBRhJZFVzZWQAAQU0SW52YWxpZFRpY2tldAABBSBOb1RpY2tldAABBTROb3RBdXRob3JpemVkAAEFJE5vdFBlcnNvbgABBURSZWZlcnJlZENhbmRpZGF0ZQABBVBOb3RSZWZlcnJlZENhbmRpZGF0ZQABBUhOb1Jld2FyZFRvUmVnaXN0ZXIAAQVAUmV3YXJkVG9SZWdpc3RlcgABBSROb0ludml0ZXIAAQVASW52YWxpZFNpZ25hdHVyZQABBSROb0ludml0ZXMAAQU4QWxyZWFkeUludml0ZWQAAQUoTm9SZWZlcnJlcgABBTBOb3RQb2lQZXJzb24AAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQVoSW52YWxpZFJlaW1idXJzZW1lbnRWYWx1ZXMAAQUCiCxHYW1lT25nb2luZwABBThOb1JlZ2lzdHJhdGlvbgABBURPdXRkYXRlZEdhbWVTZXR1cAABBUBJbnZhbGlkR2FtZVNldHVwAAEFNEludmFsaWRSZXBvcnQAAQUYTm9HYW1lAAEFLE5vUmVwb3J0aW5nAAEFNE5vdFJlZ2lzdGVyZWQAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVEUmVwb3J0QWxyZWFkeVNlbnQAAQUURWFybHkAAQVETm90S2lja2FibGVQbGF5ZXIAAQVATm9BcmNoaXZlZFBsYXllcgABBSBOb1RpY2tldAABBSROb0ludml0ZXMAAQU4QWxyZWFkeUludml0ZWQAAQVATm90QWNjb3VudFBsYXllcgABBWhVc2VJbnZpdGVCdXRBbHJlYWR5UGxheWluZwABBVBUb29NYW55R2FtZVNjaGVkdWxlcwABBUxOb1N1Y2hHYW1lU2NoZWR1bGVkAAEFgEludmFsaWRTdGF0ZW1lbnRBY2NvdW50U2lnbmF0dXJlAAEFcFN0YXRlbWVudEFjY291bnRBbHJlYWR5SW5Vc2UAAQVkSW50ZXJuYWxFcnJvckludmFsaWRTdGF0ZQABBUBJbnZhbGlkR2FtZVN0YXRlAAEFIE5vUGxheWVyAAEFkENhbm5vdE9mZmJvYXJkV2hpbGVSZWdpc3RlcmVkRm9yR2FtZQABBTBJbnZhbGlkU3RhdGUAAQU8Tm9TY3JhdGNoUmV3YXJkAAEFLE5vdEVsaWdpYmxlAAEFJERpZE5vdFdpbgABBThBbHJlYWR5Q2xhaW1lZAABBTxTY3JhdGNoUG90RW1wdHkAAQU4UG9vbE5vdEZvckdhbWUAAQU4Tm90UGFydGljaXBhbnQAAQUCVCROb3RQZXJzb24AAQVcSGFzTm90UmVhY2hlZFBlcnNvbmhvb2QAAQUgTm9SZXdhcmQAAQUcTm9TY29yZQABBShOb1NjaGVkdWxlAAEFQFRvb01hbnlTY2hlZHVsZXMAAQUoUmVjb2duaXplZAABBTxDYXNoT3V0Q29vbGRvd24AAQVgUm91bmRPbkdvaW5nT3JOb1NjaGVkdWxlAAEFHE5vUm91bmQAAQVsQmFkT3JpZ2luTm90UGVyc29uTm90U2lnbmVkAAEFwEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZE5vdEFjY291bnRQYXJ0aWNpcGFudAABBZxCYWRPcmlnaW5Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQAAQVQQWxyZWFkeVBhcnRpY2lwYXRpbmcAAQVES2V5TXVzdEJlUHJvdmlkZWQAAQVQS2V5TXVzdE5vdEJlUHJvdmlkZWQAAQVQSGFzUmVhY2hlZFBlcnNvbmhvb2QAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU4V2luZG93VG9vTGFyZ2UAAQVUQWxsb3dlZE1pc3Nlc1Rvb0xhcmdlAAEFRFNjaGVkdWxlTm90U29ydGVkAAEFAhAkTm90UGVyc29uAAEFME5vdFN1c3BlbmRlZAABBSxOb3RSZXNlcnZlZAABBTRUb29NYW55UGVvcGxlAAEFAixYTm9BdHRlc3RhdGlvbkFsbG93YW5jZQABBWxJbnZhbGlkQXR0ZXN0YXRpb25TaWduYXR1cmUAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQU8S2V5QWxyZWFkeUluVXNlAAEFMEFjY291bnRJblVzZQABBVhBbGlhc0FjY291bnRBbHJlYWR5U2V0AAEFSEFsaWFzQWNjb3VudE5vdFNldAABBUxDYWxsQmxvY2tPdXRPZlJhbmdlAAEFTEludmFsaWRBbGlhc0NvbnRleHQAAQV4TGl0ZVBlb3BsZUNvbGxlY3Rpb25Ob3RDcmVhdGVkAAEFAmA8SW52YWxpZFVzZXJuYW1lAAEFNFVzZXJuYW1lVGFrZW4AAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU0Tm90UmVnaXN0ZXJlZAABBTROb3RGdWxsUGVyc29uAAEFNFRvdWNoTm90UmVhZHkAAQU0Tm9SZXNlcnZhdGlvbgABBVBOb3RSZXNlcnZhdGlvbkhvbGRlcgABBWBVc2VybmFtZVJlc2VydmF0aW9uVGFrZW4AAQVAUmVzZXJ2YXRpb25GcmVzaAABBUBOb0xpbmtlZElkZW50aXR5AAEFNEFscmVhZHlMaW5rZWQAAQVQUGVyc29uQXV0aE5vdEV4cGlyZWQAAQU4QWxyZWFkeURlbW90ZWQAAQUkUXVldWVGdWxsAAEFKE5vdEluUXVldWUAAQVUQWxyZWFkeUhhc1Jlc2VydmF0aW9uAAEFcEludmFsaWRGcmllbmRSZXF1ZXN0U2VxdWVuY2UAAQVoSW52YWxpZEZyaWVuZFJlcXVlc3RQZXJpb2QAAQWMRnJpZW5kUmVxdWVzdFJlZ2lzdHJhdGlvbk5vdEV4cGlyZWQAAQWYRnJpZW5kUmVxdWVzdFJlZ2lzdHJhdGlvbkFscmVhZHlFeGlzdHMAAQVwU3RtdFN0b3JlUmVwbGFjZW1lbnRUb29FYXJseQABBYxMb25nVGVybVN0b3JhZ2VDbGVhbnVwTGltaXRFeGNlZWRlZAABBQIMNENodW5rTm90Rm91bmQAAQU0SW52YWxpZENodW5rcwABBURJbnZhbGlkQ2h1bmtSYW5nZQABBQJwJE5vdE1lbWJlcgABBRhOb1Jvb3QAAQUwSW52YWxpZFByb29mAAEFKEluY29tcGxldGUAAQU4VG9vTWFueU1lbWJlcnMAAQU8S2V5QWxyZWFkeUluVXNlAAEFLEtleU5vdEZvdW5kAAEFMENvdWxkTm90UHVzaAABBSxJbnZhbGlkUmluZwABBUhTdXNwZW5zaW9uc1BlbmRpbmcAAQVcUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQAAQVISW52YWxpZFN1c3BlbnNpb25zAAEFQE5vUmVtb3ZhbFNlc3Npb24AAQVsQ291bGROb3RTdGFydFJlbW92YWxTZXNzaW9uAAEFYFJlbW92YWxTZXNzaW9uSW5Qcm9ncmVzcwABBUxLZXlBbHJlYWR5U3VzcGVuZGVkAAEFVEludmFsaWRPbmJvYXJkaW5nU2l6ZQABBUBJbnZhbGlkTWVtYmVyS2V5AAEFSENvbGxlY3Rpb25Ob3RGb3VuZAABBVxDb2xsZWN0aW9uQWxyZWFkeUV4aXN0cwABBUhUb29NYW55Q29sbGVjdGlvbnMAAQVoSW52YWxpZFJpbmdTaXplRm9yRmxleGlibGUAAQVMSW52YWxpZFJpbmdFeHBvbmVudAABBUxQcmVtYXR1cmVPbmJvYXJkaW5nAAEFbENvbGxlY3Rpb25NYXJrZWRGb3JEZWxldGlvbgABBUhOb3RDb2xsZWN0aW9uT3duZXIAAQU0Tm90T25ib2FyZGluZwABBThOb3RoaW5nVG9CdWlsZAABBQJ4UE1lbWJlcktleUFscmVhZHlVc2VkAAEFQEludmFsaWRNZW1iZXJLZXkAAQU0SW50ZXJuYWxFcnJvcgABBVxSZWN5Y2xlckFscmVhZHlVbmxvYWRlZAABBVBJbnZhbGlkQ29uc29saWRhdGlvbgABBUxDb25zb2xpZGF0aW9uVG9vQmlnAAEFPENvaW5WYWx1ZVRvb0JpZwABBURDb2luVmFsdWVUb29TbWFsbAABBVhDb2luVmFsdWVJc0xlc3NUaGFuRmVlAAEFTENvaW5WYWx1ZU91dE9mQm91bmQAAQVgTG9zc3lDb2luVmFsdWVDb252ZXJzaW9uAAEFREludmFsaWRBbGlhc1Byb29mAAEFTE5vVW5sb2FkaW5nUmVjeWNsZXIAAQVUUHJvb2ZBbmRBbGlhc01pc21hdGNoAAEFOE5vdGhpbmdUb0J1aWxkAAEFMFRvb01hbnlSaW5ncwABBVRBZGRyZXNzQWxyZWFkeUhhc0NvaW4AAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQUsRW1wdHlJbnB1dHMAAQVAUmVjeWNsZXJNaXNtYXRjaAABBWBJbnN1ZmZpY2llbnRVbmxvYWRGb3JGZWUAAQVEQWxpYXNOb3RQcmVtYXJrZWQAAQVcSW52YWxpZFJlY3ljbGVyUmV2aXNpb24AAQUwSW52YWxpZFNwbGl0AAEFREZyZXNoQ29pblJlcXVpcmVkAAEFaENhbm5vdENvbnZlcnROYXRpdmVUb0Fzc2V0AAEFaE1heEZlZU5vdEFsbG93ZWRGb3JQcmVwYWlkAAEFSE1heEZlZUV4Y2VlZHNJbnB1dAABBTRJbnZhbGlkTWF4RmVlAAEFeENhbm5vdENyZWF0ZVJlY3ljbGVyQ29sbGVjdGlvbgABBQI0SFN1YnNjcmliZXJOb3RGb3VuZAABBURBbHJlYWR5U3Vic2NyaWJlZAABBUhUb29NYW55U3Vic2NyaWJlcnMAAQVYSW52YWxpZENvbGxlY3Rpb25zTGlzdAABBThUb29NYW55VXBkYXRlcwABBTRYY21TZW5kRmFpbGVkAAEFZE5vdFN1YnNjcmliZWRUb0NvbGxlY3Rpb24AAQVASW52YWxpZFJpbmdJbmRleAABBVhFeGNlZWRzQ2hhbm5lbENhcGFjaXR5AAEFNE5vQmF0Y2hBY3RpdmUAAQU0Tm9QZW5kaW5nSW5pdAABBVBSZXBsYXlDb29sZG93bkFjdGl2ZQABBUBFbXB0eVJpbmdJbmRpY2VzAAEFAjyIUHJpemVNdXN0QmVNb3JlT3JFcXVhbFRvTWluQmFsYW5jZQABBTxWYWxpZGl0eVRvb0xvbmcAAQVAVmFsaWRpdHlUb29TaG9ydAABBSBOb1ByaXplcwABBURJbnN1ZmZpY2llbnRGdW5kcwABBWxUb29NYW55Q29uY3VycmVudFByaXplUG9vbHMAAQU8Tm9TdWNoUHJpemVQb29sAAEFQFByaXplUG9vbEV4cGlyZWQAAQVIUHJpemVQb29sRXhoYXVzdGVkAAEFOEFscmVhZHlDbGFpbWVkAAEFRFBvb2xWYWx1ZU92ZXJmbG93AAEFLFdyb25nVGFyZ2V0AAEFJERpZE5vdFdpbgABBTBJbnZhbGlkUHJvb2YAAQU0QWxpYXNNaXNtYXRjaAABBQIEHE9uZ29pbmcAAQUCsBhTeXN0ZW0BRDxQYXJhY2hhaW5TeXN0ZW0BSCRUaW1lc3RhbXAAAQU0UGFyYWNoYWluSW5mbwABBTRXZWlnaHRSZWNsYWltAAEFIEJhbGFuY2VzAUxIVHJhbnNhY3Rpb25QYXltZW50AAEFSFNraXBGZWVsZXNzUGF5bWVudAABBURPcmlnaW5SZXN0cmljdGlvbgFQGEFzc2V0cwFUMEFzc2V0c0hvbGRlcgFYJEFzc2V0UmF0ZQFcOEFzc2V0VHhQYXltZW50AAEFKEF1dGhvcnNoaXAAAQVEQ29sbGF0b3JTZWxlY3Rpb24BYBxTZXNzaW9uAWQQQXVyYQABBRxBdXJhRXh0AAEFJFhjbXBRdWV1ZQFoLFBvbGthZG90WGNtAXAoQ3VtdWx1c1hjbQABBTBNZXNzYWdlUXVldWUBdBxVdGlsaXR5AXggTXVsdGlzaWcBfBBTdWRvAYA8VmVyaWZ5U2lnbmF0dXJlAAEFFFByb3h5AYQgSWRlbnRpdHkBiBhQZW9wbGUBjBxNb2JSdWxlAZAoUHJvb2ZPZkluawGUEEdhbWUBmBRTY29yZQGcIER1bW15RGltAaAoUGVvcGxlTGl0ZQGkJFJlc291cmNlcwGoNENodW5rc01hbmFnZXIBrBxNZW1iZXJzAbAcQ29pbmFnZQG0PE1lbWJlcnNOb3RpZmllcgG4VFN0b3JhZ2VJbml0aWFsaXphdGlvbgABBWRTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlAAEFHEFpcmRyb3ABvFBNdWx0aUJsb2NrTWlncmF0aW9ucwHAAihARnVuZHNVbmF2YWlsYWJsZQABBTBPbmx5UHJvdmlkZXIAAQUwQmVsb3dNaW5pbXVtAAEFMENhbm5vdENyZWF0ZQABBTBVbmtub3duQXNzZXQAAQUYRnJvemVuAAEFLFVuc3VwcG9ydGVkAAEFQENhbm5vdENyZWF0ZUhvbGQAAQU0Tm90RXhwZW5kYWJsZQABBRxCbG9ja2VkAAEFAgwkVW5kZXJmbG93AAEFIE92ZXJmbG93AAEFOERpdmlzaW9uQnlaZXJvAAEFAggwTGltaXRSZWFjaGVkAAEFHE5vTGF5ZXIAAQUCOEBJbnZhbGlkU3RhdGVSb290AAEFSEluY29tcGxldGVEYXRhYmFzZQABBVBWYWx1ZUF0SW5jb21wbGV0ZUtleQABBTBEZWNvZGVyRXJyb3IAAQUsSW52YWxpZEhhc2gAAQUwRHVwbGljYXRlS2V5AAEFOEV4dHJhbmVvdXNOb2RlAAEFPEV4dHJhbmVvdXNWYWx1ZQABBVxFeHRyYW5lb3VzSGFzaFJlZmVyZW5jZQABBVRJbnZhbGlkQ2hpbGRSZWZlcmVuY2UAAQU0VmFsdWVNaXNtYXRjaAABBTxJbmNvbXBsZXRlUHJvb2YAAQUwUm9vdE1pc21hdGNoAAEFLERlY29kZUVycm9yAAEFAjwUT3RoZXIAAQUwQ2Fubm90TG9va3VwAAEFJEJhZE9yaWdpbgABBRhNb2R1bGUBxERDb25zdW1lclJlbWFpbmluZwABBSxOb1Byb3ZpZGVycwABBUBUb29NYW55Q29uc3VtZXJzAAEFFFRva2VuAcgoQXJpdGhtZXRpYwHMNFRyYW5zYWN0aW9uYWwB0CRFeGhhdXN0ZWQAAQUoQ29ycnVwdGlvbgABBSxVbmF2YWlsYWJsZQABBThSb290Tm90QWxsb3dlZAABBRBUcmllAdQCIEBFeHRyaW5zaWNTdWNjZXNzAAAENGRpc3BhdGNoX2luZm9APEV4dHJpbnNpY0ZhaWxlZAAACDhkaXNwYXRjaF9lcnJvctg0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQAAAQQaGFzaCAoTmV3QWNjb3VudAAABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AAAEHGFjY291bnQAIFJlbWFya2VkAAAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQAAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQAACCRjb2RlX2hhc2ggFGVycm9y2AYgAhhgVmFsaWRhdGlvbkZ1bmN0aW9uU3RvcmVkAAEFZFZhbGlkYXRpb25GdW5jdGlvbkFwcGxpZWQAAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBGxWYWxpZGF0aW9uRnVuY3Rpb25EaXNjYXJkZWQAAQVgRG93bndhcmRNZXNzYWdlc1JlY2VpdmVkAAAEFGNvdW50BGREb3dud2FyZE1lc3NhZ2VzUHJvY2Vzc2VkAAAILHdlaWdodF91c2VkGCBkbXFfaGVhZCBEVXB3YXJkTWVzc2FnZVNlbnQAAAQwbWVzc2FnZV9oYXNo4AIIEEZyZWUAAQUgUmVzZXJ2ZWQAAQUCBBBLZXlzAAEFAgQ4QXV0aG9yaXplQWxpYXMAAQUCCBhQYXlvdXQAAQUYQ3JlZGl0AAEFAgQoUHJvb2ZPZkluawABBQIEIFBsYXlHYW1lAAEFAgQcV3JhcHBlZAABBQIEHEFpcmRyb3AAAQUCIBxTZXNzaW9uAewsUG9sa2Fkb3RYY20B8BxNb2JSdWxlAfQoUHJvb2ZPZkluawH4EEdhbWUB/BRTY29yZQH0HENvaW5hZ2UBAQEcQWlyZHJvcAEFAQIIOEJhbGFuY2VVcGRhdGVkAAEFVEZhaWxlZFRvTXV0YXRlQWNjb3VudAABBQJ4HEVuZG93ZWQAAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAAACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAAAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQAAAgMd2hvABBmcmVlCCBSZXNlcnZlZAAACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAAACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAAAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1c+gcRGVwb3NpdAAACAx3aG8AGGFtb3VudAggV2l0aGRyYXcAAAgMd2hvABhhbW91bnQIHFNsYXNoZWQAAAgMd2hvABhhbW91bnQIGE1pbnRlZAAACAx3aG8AGGFtb3VudAgwTWludGVkQ3JlZGl0AAAEGGFtb3VudAgYQnVybmVkAAAIDHdobwAYYW1vdW50CChCdXJuZWREZWJ0AAAEGGFtb3VudAgkU3VzcGVuZGVkAAAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAAACAx3aG8AGGFtb3VudAggVXBncmFkZWQAAAQMd2hvABhJc3N1ZWQAAAQYYW1vdW50CCRSZXNjaW5kZWQAAAQYYW1vdW50CBhMb2NrZWQAAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAAAIDHdobwAYYW1vdW50CBhGcm96ZW4AAAgMd2hvABhhbW91bnQIGFRoYXdlZAAACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAAACAxvbGQIDG5ldwgQSGVsZAAADBhyZWFzb24JAQx3aG8AGGFtb3VudAgoQnVybmVkSGVsZAAADBhyZWFzb24JAQx3aG8AGGFtb3VudAg4VHJhbnNmZXJPbkhvbGQAABAYcmVhc29uCQEYc291cmNlABBkZXN0ABhhbW91bnQIPFRyYW5zZmVyQW5kSG9sZAAAEBhyZWFzb24JARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCCBSZWxlYXNlZAAADBhyZWFzb24JAQx3aG8AGGFtb3VudAgoVW5leHBlY3RlZAENAQIESFRyYW5zYWN0aW9uRmVlUGFpZAAADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgCEBBSb290AAEFGFNpZ25lZAEAEE5vbmUAAQUoQXV0aG9yaXplZAABBQIgJEJ5R2VuZXNpcwEgGEJ5Rm9yawAACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AAEFGEt1c2FtYQABBSBFdGhlcmV1bQAABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUAAQUsQml0Y29pbkNhc2gAAQVAUG9sa2Fkb3RCdWxsZXRpbgABBQYdAQUBUAIoEFVuaXQAAQUcTW9uaWtlcgEoFEluZGV4AQQkRXhlY3V0aXZlAAEFJFRlY2huaWNhbAABBSxMZWdpc2xhdGl2ZQABBSBKdWRpY2lhbAABBRxEZWZlbnNlAAEFOEFkbWluaXN0cmF0aW9uAAEFIFRyZWFzdXJ5AAEFAhQUVm9pY2UAAQUcTWVtYmVycwAABBRjb3VudAQgRnJhY3Rpb24AAAgMbm9tBBRkZW5vbQREQXRMZWFzdFByb3BvcnRpb24AAAgMbm9tBBRkZW5vbQRITW9yZVRoYW5Qcm9wb3J0aW9uAAAIDG5vbQQUZGVub20EAigkUGFyYWNoYWluAQQsQWNjb3VudElkMzIAAAgcbmV0d29yayEBCGlkIDhBY2NvdW50SW5kZXg2NAAACBxuZXR3b3JrIQEUaW5kZXgIMEFjY291bnRLZXkyMAAACBxuZXR3b3JrIQEMa2V5JQE4UGFsbGV0SW5zdGFuY2UBBDBHZW5lcmFsSW5kZXgBCChHZW5lcmFsS2V5AAAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAAEFJFBsdXJhbGl0eQAACAhpZCkBEHBhcnQtATxHbG9iYWxDb25zZW5zdXMBHQEEMQEBCAQxAQEMBDEBARAEMQEBFAQxAQEYBDEBARwEMQEBIAIkEEhlcmUAAQUIWDEBMQEIWDIBNQEIWDMBOQEIWDQBPQEIWDUBQQEIWDYBRQEIWDcBSQEIWDgBTQEACBxwYXJlbnRzBCBpbnRlcmlvclEBAggMWGNtAVUBIFJlc3BvbnNlAVUBAggUUmVsYXkAAQVAU2libGluZ1BhcmFjaGFpbgEEAAgUYWxpYXMgHGNvbnRleHQgAAwgcmV2aXNpb24EEHJpbmcECGNhYQECCEBQZXJzb25hbElkZW50aXR5AQg0UGVyc29uYWxBbGlhcwFlAQIMWEF1dGhvcml6ZWRBcHBseVdpdGhTaWcBAERSZWZlcnJlZENhbmRpZGF0ZQEAQEludml0ZWRDYW5kaWRhdGUBAAIEHEludml0ZWQBAAIESEFjY291bnRQYXJ0aWNpcGFudAEAAggoTGl0ZVBlcnNvbgEAJExpdGVBbGlhcwFlAQIIGFBlb3BsZQABBShMaXRlUGVvcGxlAAEFAgxIRnJpZW5kUmVxdWVzdEFsaWFzASA4U3RtdFN0b3JlQWxpYXMBIFBMb25nVGVybVN0b3JhZ2VDbGFpbQADCCB9AQIILE1lbWJlckFsaWFzAAMIIGUBLFNlbGZJbmNsdWRlASAACBR2YWx1ZQQMYWdlBAUBUQwEjQEAAggcUHJlcGFpZAABBShGcm9tT3V0cHV0AAAISGZlZV9yZWN5Y2xlcl92YWx1ZQRIZmVlX3JlY3ljbGVyX2luZGV4BAIMEENvaW4AAAgcY29pbl9pZAAQY29pbokBLFVubG9hZFRva2VuAAAMMGFsaWFzX3Byb29mc5EBKHByb3Zlbl9tc2cgDGZlZZUBWEluZmFsbGlibGVVbnBhaWRTaWduZWQAAAQMd2hvAAIsGHN5c3RlbQEZASxQb2xrYWRvdFhjbQFZAShDdW11bHVzWGNtAV0BGFBlb3BsZQFpAShQcm9vZk9mSW5rAW0BEEdhbWUBcQEUU2NvcmUBdQEoUGVvcGxlTGl0ZQF5ASRSZXNvdXJjZXMBgQEcTWVtYmVycwGFARxDb2luYWdlAZkBAgQoRmVlU2tpcHBlZAAABBhvcmlnaW6dAQIYNFBlcnNvbmFsQWxpYXMBIEBQZXJzb25hbElkZW50aXR5AQhEUmVmZXJyZWRDYW5kaWRhdGUBAEhBY2NvdW50UGFydGljaXBhbnQBAEBJbnZpdGVkQ2FuZGlkYXRlAQAoTGl0ZVBlcnNvbgEAAgQwVXNhZ2VDbGVhbmVkAAAEGGVudGl0eaUBAAgccmVzZXJ2ZVUBMHRlbGVwb3J0YWJsZRQErQEAAoAcQ3JlYXRlZAAADCBhc3NldF9pZFUBHGNyZWF0b3IAFG93bmVyABhJc3N1ZWQAAAwgYXNzZXRfaWRVARRvd25lcgAYYW1vdW50CCxUcmFuc2ZlcnJlZAAAECBhc3NldF9pZFUBEGZyb20ACHRvABhhbW91bnQIGEJ1cm5lZAAADCBhc3NldF9pZFUBFG93bmVyABxiYWxhbmNlCCxUZWFtQ2hhbmdlZAAAECBhc3NldF9pZFUBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAME93bmVyQ2hhbmdlZAAACCBhc3NldF9pZFUBFG93bmVyABhGcm96ZW4AAAggYXNzZXRfaWRVAQx3aG8AGFRoYXdlZAAACCBhc3NldF9pZFUBDHdobwAsQXNzZXRGcm96ZW4AAAQgYXNzZXRfaWRVASxBc3NldFRoYXdlZAAABCBhc3NldF9pZFUBREFjY291bnRzRGVzdHJveWVkAAAMIGFzc2V0X2lkVQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcESEFwcHJvdmFsc0Rlc3Ryb3llZAAADCBhc3NldF9pZFUBTGFwcHJvdmFsc19kZXN0cm95ZWQETGFwcHJvdmFsc19yZW1haW5pbmcESERlc3RydWN0aW9uU3RhcnRlZAAABCBhc3NldF9pZFUBJERlc3Ryb3llZAAABCBhc3NldF9pZFUBMEZvcmNlQ3JlYXRlZAAACCBhc3NldF9pZFUBFG93bmVyACxNZXRhZGF0YVNldAAAFCBhc3NldF9pZFUBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQ8TWV0YWRhdGFDbGVhcmVkAAAEIGFzc2V0X2lkVQFAQXBwcm92ZWRUcmFuc2ZlcgAAECBhc3NldF9pZFUBGHNvdXJjZQAgZGVsZWdhdGUAGGFtb3VudAhEQXBwcm92YWxDYW5jZWxsZWQAAAwgYXNzZXRfaWRVARRvd25lcgAgZGVsZWdhdGUATFRyYW5zZmVycmVkQXBwcm92ZWQAABQgYXNzZXRfaWRVARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQISEFzc2V0U3RhdHVzQ2hhbmdlZAAABCBhc3NldF9pZFUBWEFzc2V0TWluQmFsYW5jZUNoYW5nZWQAAAggYXNzZXRfaWRVATxuZXdfbWluX2JhbGFuY2UIHFRvdWNoZWQAAAwgYXNzZXRfaWRVAQx3aG8AJGRlcG9zaXRvcgAcQmxvY2tlZAAACCBhc3NldF9pZFUBDHdobwAkRGVwb3NpdGVkAAAMIGFzc2V0X2lkVQEMd2hvABhhbW91bnQIJFdpdGhkcmF3bgAADCBhc3NldF9pZFUBDHdobwAYYW1vdW50CDxSZXNlcnZlc1VwZGF0ZWQAAAggYXNzZXRfaWRVASByZXNlcnZlc7EBPFJlc2VydmVzUmVtb3ZlZAAABCBhc3NldF9pZFUBMElzc3VlZENyZWRpdAAACCBhc3NldF9pZFUBGGFtb3VudAgwQnVybmVkQ3JlZGl0AAAIIGFzc2V0X2lkVQEYYW1vdW50CChJc3N1ZWREZWJ0AAAIIGFzc2V0X2lkVQEYYW1vdW50CChCdXJuZWREZWJ0AAAIIGFzc2V0X2lkVQEYYW1vdW50CAIMEEhlbGQAABAMd2hvACBhc3NldF9pZFUBGHJlYXNvbgkBGGFtb3VudAggUmVsZWFzZWQAABAMd2hvACBhc3NldF9pZFUBGHJlYXNvbgkBGGFtb3VudAgYQnVybmVkAAAQDHdobwAgYXNzZXRfaWRVARhyZWFzb24JARhhbW91bnQIAgxAQXNzZXRSYXRlQ3JlYXRlZAAACChhc3NldF9raW5kVQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAAABChhc3NldF9raW5kVQFAQXNzZXRSYXRlVXBkYXRlZAAADChhc3NldF9raW5kVQEMb2xkCAxuZXcIBlUBAgQ4QXNzZXRUeEZlZVBhaWQAABAMd2hvAChhY3R1YWxfZmVlCAx0aXAIIGFzc2V0X2lkwQEEAAACKEBOZXdJbnZ1bG5lcmFibGVzAAAENGludnVsbmVyYWJsZXPJAURJbnZ1bG5lcmFibGVBZGRlZAAABChhY2NvdW50X2lkAExJbnZ1bG5lcmFibGVSZW1vdmVkAAAEKGFjY291bnRfaWQAUE5ld0Rlc2lyZWRDYW5kaWRhdGVzAAAESGRlc2lyZWRfY2FuZGlkYXRlcwRATmV3Q2FuZGlkYWN5Qm9uZAAABCxib25kX2Ftb3VudAg4Q2FuZGlkYXRlQWRkZWQAAAgoYWNjb3VudF9pZAAcZGVwb3NpdAhQQ2FuZGlkYXRlQm9uZFVwZGF0ZWQAAAgoYWNjb3VudF9pZAAcZGVwb3NpdAhAQ2FuZGlkYXRlUmVtb3ZlZAAABChhY2NvdW50X2lkAERDYW5kaWRhdGVSZXBsYWNlZAAADAxvbGQADG5ldwAcZGVwb3NpdAhoSW52YWxpZEludnVsbmVyYWJsZVNraXBwZWQAAAQoYWNjb3VudF9pZAACEChOZXdTZXNzaW9uAAAENHNlc3Npb25faW5kZXgEJE5ld1F1ZXVlZAABBURWYWxpZGF0b3JEaXNhYmxlZAAABCR2YWxpZGF0b3IASFZhbGlkYXRvclJlZW5hYmxlZAAABCR2YWxpZGF0b3IAAgQ8WGNtcE1lc3NhZ2VTZW50AAAEMG1lc3NhZ2VfaGFzaCACpCBPdmVyZmxvdwABBTRVbmltcGxlbWVudGVkAAEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgABBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAEFMExvY2F0aW9uRnVsbAABBVRMb2NhdGlvbk5vdEludmVydGlibGUAAQUkQmFkT3JpZ2luAAEFPEludmFsaWRMb2NhdGlvbgABBTRBc3NldE5vdEZvdW5kAAEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAABBTxOb3RXaXRoZHJhd2FibGUAAQVITG9jYXRpb25DYW5ub3RIb2xkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFJFRyYW5zcG9ydAABBShVbnJvdXRhYmxlAAEFMFVua25vd25DbGFpbQABBThGYWlsZWRUb0RlY29kZQABBUBNYXhXZWlnaHRJbnZhbGlkAAEFOE5vdEhvbGRpbmdGZWVzAAEFMFRvb0V4cGVuc2l2ZQABBRBUcmFwAQhARXhwZWN0YXRpb25GYWxzZQABBThQYWxsZXROb3RGb3VuZAABBTBOYW1lTWlzbWF0Y2gAAQVMVmVyc2lvbkluY29tcGF0aWJsZQABBVBIb2xkaW5nV291bGRPdmVyZmxvdwABBSxFeHBvcnRFcnJvcgABBThSZWFuY2hvckZhaWxlZAABBRhOb0RlYWwAAQUoRmVlc05vdE1ldAABBSRMb2NrRXJyb3IAAQUwTm9QZXJtaXNzaW9uAAEFKFVuYW5jaG9yZWQAAQU4Tm90RGVwb3NpdGFibGUAAQU0VG9vTWFueUFzc2V0cwABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQAIFGluZGV4BBRlcnJvctkBAgwgQ29tcGxldGUAAAQQdXNlZBgoSW5jb21wbGV0ZQAACBB1c2VkGBRlcnJvct0BFEVycm9yAd0BBQEgBQFAAhgkVW5kZWZpbmVkAAEFFEluZGV4AQgYQXJyYXk0ASgYQXJyYXk4AeUBHEFycmF5MTYB6QEcQXJyYXkzMgEgAgggRnVuZ2libGUBCCxOb25GdW5naWJsZQHtAQAICGlkVQEMZnVu8QEE9QEAAwgE2QEG/QEAGBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkFG1ham9yBBRtaW5vcgQUcGF0Y2gEBAUCAAIMHFN1Y2Nlc3MAAQUURXJyb3IBJDhUcnVuY2F0ZWRFcnJvcgEkAhgQTnVsbAABBRhBc3NldHMB+QE8RXhlY3V0aW9uUmVzdWx0AQECHFZlcnNpb24BBCxQYWxsZXRzSW5mbwEJAjhEaXNwYXRjaFJlc3VsdAENAgIQGE5hdGl2ZQABBUBTb3ZlcmVpZ25BY2NvdW50AAEFJFN1cGVydXNlcgABBQxYY20AAQUGGAAMLGRlc3RpbmF0aW9uVQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYAgggRnVuZ2libGUAAQUsTm9uRnVuZ2libGUAAQUCEAxBbGwAAQUUQWxsT2YAAAgIaWRVAQxmdW4hAihBbGxDb3VudGVkAQQwQWxsT2ZDb3VudGVkAAAMCGlkVQEMZnVuIQIUY291bnQEAgggRGVmaW5pdGUB+QEQV2lsZAElAgIIJFVubGltaXRlZAABBRxMaW1pdGVkARgCDCBUZWxlcG9ydAEpAjhSZXNlcnZlRGVwb3NpdAEpAjxSZXNlcnZlV2l0aGRyYXcBKQIGMQIEMQIABlEBAgQwQXNzZXRDbGFpbWVyAAAEIGxvY2F0aW9uVQEEQQIAAtA0V2l0aGRyYXdBc3NldAH5AVRSZXNlcnZlQXNzZXREZXBvc2l0ZWQB+QFYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAH5ATRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZRECKG1heF93ZWlnaHQYHHF1ZXJpZXLBATRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c/kBLGJlbmVmaWNpYXJ5VQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRz+QEQZGVzdFUBDHhjbU0CIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kFQJMZmFsbGJhY2tfbWF4X3dlaWdodBkCEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QAAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQAAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcAAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4AAQU0RGVzY2VuZE9yaWdpbgFRASxSZXBvcnRFcnJvcgEdAjBEZXBvc2l0QXNzZXQAAAgYYXNzZXRzKQIsYmVuZWZpY2lhcnlVAUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AAAMGGFzc2V0cykCEGRlc3RVAQx4Y21NAjRFeGNoYW5nZUFzc2V0AAAMEGdpdmUpAhB3YW50+QEcbWF4aW1hbBRcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcAAAwYYXNzZXRzKQIccmVzZXJ2ZVUBDHhjbU0CQEluaXRpYXRlVGVsZXBvcnQAAAwYYXNzZXRzKQIQZGVzdFUBDHhjbU0CNFJlcG9ydEhvbGRpbmcAAAg0cmVzcG9uc2VfaW5mbx0CGGFzc2V0cykCMEJ1eUV4ZWN1dGlvbgAACBBmZWVz9QEwd2VpZ2h0X2xpbWl0LQI0UmVmdW5kU3VycGx1cwABBTxTZXRFcnJvckhhbmRsZXIBTQIsU2V0QXBwZW5kaXgBTQIoQ2xlYXJFcnJvcgABBShDbGFpbUFzc2V0AAAIGGFzc2V0c/kBGHRpY2tldFUBEFRyYXABCEBTdWJzY3JpYmVWZXJzaW9uAAAIIHF1ZXJ5X2lkCExtYXhfcmVzcG9uc2Vfd2VpZ2h0GEhVbnN1YnNjcmliZVZlcnNpb24AAQUkQnVybkFzc2V0AfkBLEV4cGVjdEFzc2V0AfkBMEV4cGVjdE9yaWdpbgHBASxFeHBlY3RFcnJvcgEBAlBFeHBlY3RUcmFuc2FjdFN0YXR1cwENAixRdWVyeVBhbGxldAAACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mbx0CMEV4cGVjdFBhbGxldAAAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAR0CTENsZWFyVHJhbnNhY3RTdGF0dXMAAQU8VW5pdmVyc2FsT3JpZ2luATEBNEV4cG9ydE1lc3NhZ2UAAAwcbmV0d29yax0BLGRlc3RpbmF0aW9uUQEMeGNtTQIkTG9ja0Fzc2V0AAAIFGFzc2V09QEgdW5sb2NrZXJVASxVbmxvY2tBc3NldAAACBRhc3NldPUBGHRhcmdldFUBOE5vdGVVbmxvY2thYmxlAAAIFGFzc2V09QEUb3duZXJVATRSZXF1ZXN0VW5sb2NrAAAIFGFzc2V09QEYbG9ja2VyVQEsU2V0RmVlc01vZGUAAAQwaml0X3dpdGhkcmF3FCBTZXRUb3BpYwEgKENsZWFyVG9waWMAAQUsQWxpYXNPcmlnaW4BVQE8VW5wYWlkRXhlY3V0aW9uAAAIMHdlaWdodF9saW1pdC0CMGNoZWNrX29yaWdpbsEBHFBheUZlZXMAAAQUYXNzZXT1AUBJbml0aWF0ZVRyYW5zZmVyAAAULGRlc3RpbmF0aW9uVQEscmVtb3RlX2ZlZXM1AjxwcmVzZXJ2ZV9vcmlnaW4UGGFzc2V0czkCKHJlbW90ZV94Y21NAkRFeGVjdXRlV2l0aE9yaWdpbgAACERkZXNjZW5kYW50X29yaWdpbj0CDHhjbU0CIFNldEhpbnRzAAAEFGhpbnRzRQIESQIAAhw0Tm90QXBwbGljYWJsZQABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBTxNaXNzaW5nQXJndW1lbnQAAQUQRmVlcwABBQIsJEJ5R2VuZXNpcwEgGEJ5Rm9yawAACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AAEFGEt1c2FtYQABBRxXZXN0ZW5kAAEFGFJvY29jbwABBRhXb2NvY28AAQUgRXRoZXJldW0AAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAAEFLEJpdGNvaW5DYXNoAAEFQFBvbGthZG90QnVsbGV0aW4AAQUGVQICKCRQYXJhY2hhaW4BBCxBY2NvdW50SWQzMgAACBxuZXR3b3JrWQIIaWQgOEFjY291bnRJbmRleDY0AAAIHG5ldHdvcmtZAhRpbmRleAgwQWNjb3VudEtleTIwAAAIHG5ldHdvcmtZAgxrZXklAThQYWxsZXRJbnN0YW5jZQEEMEdlbmVyYWxJbmRleAEIKEdlbmVyYWxLZXkAAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQAAQUkUGx1cmFsaXR5AAAICGlkKQEQcGFydC0BPEdsb2JhbENvbnNlbnN1cwFVAgIkEEhlcmUAAQUIWDEBXQIIWDIABF0CAQgIWDMABF0CAQwIWDQABF0CARAIWDUABF0CARQIWDYABF0CARgIWDcABF0CARwIWDgABF0CASAACBxwYXJlbnRzBCBpbnRlcmlvcmECAgggQ29uY3JldGUBZQIgQWJzdHJhY3QBIAAICGlkaQIMZnVu8QEEbQIAAAgIaWRlAgxmdW7xAQR1AgACDAhWMwFxAghWNAF5AghWNQH5AQIMCFYzAWUCCFY0AWUCCFY1AVUBBggCdCRBdHRlbXB0ZWQAAAQcb3V0Y29tZeEBEFNlbnQAABAYb3JpZ2luVQEsZGVzdGluYXRpb25VARxtZXNzYWdlTQIobWVzc2FnZV9pZCAoU2VuZEZhaWxlZAAAEBhvcmlnaW5VASxkZXN0aW5hdGlvblUBFGVycm9yUQIobWVzc2FnZV9pZCA8UHJvY2Vzc1hjbUVycm9yAAAMGG9yaWdpblUBFGVycm9y2QEobWVzc2FnZV9pZCBIVW5leHBlY3RlZFJlc3BvbnNlAAAIGG9yaWdpblUBIHF1ZXJ5X2lkCDRSZXNwb25zZVJlYWR5AAAIIHF1ZXJ5X2lkCCByZXNwb25zZRECIE5vdGlmaWVkAAAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQE5vdGlmeU92ZXJ3ZWlnaHQAABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBhMTm90aWZ5RGlzcGF0Y2hFcnJvcgAADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEhOb3RpZnlEZWNvZGVGYWlsZWQAAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARASW52YWxpZFJlc3BvbmRlcgAADBhvcmlnaW5VASBxdWVyeV9pZAhEZXhwZWN0ZWRfbG9jYXRpb27BAVxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbgAACBhvcmlnaW5VASBxdWVyeV9pZAg0UmVzcG9uc2VUYWtlbgAABCBxdWVyeV9pZAg0QXNzZXRzVHJhcHBlZAAADBBoYXNoIBhvcmlnaW5VARhhc3NldHN9AlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQAABAsZGVzdGluYXRpb25VARhyZXN1bHQEEGNvc3T5AShtZXNzYWdlX2lkIFxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAAACCBsb2NhdGlvblUBHHZlcnNpb24EUE5vdGlmeVRhcmdldFNlbmRGYWlsAAAMIGxvY2F0aW9uVQEgcXVlcnlfaWQIFGVycm9y2QFkTm90aWZ5VGFyZ2V0TWlncmF0aW9uRmFpbAAACCBsb2NhdGlvboECIHF1ZXJ5X2lkCFRJbnZhbGlkUXVlcmllclZlcnNpb24AAAgYb3JpZ2luVQEgcXVlcnlfaWQIOEludmFsaWRRdWVyaWVyAAAQGG9yaWdpblUBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyVQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXLBAVBWZXJzaW9uTm90aWZ5U3RhcnRlZAAADCxkZXN0aW5hdGlvblUBEGNvc3T5AShtZXNzYWdlX2lkIFhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkAAAMLGRlc3RpbmF0aW9uVQEQY29zdPkBKG1lc3NhZ2VfaWQgYFZlcnNpb25Ob3RpZnlVbnJlcXVlc3RlZAAADCxkZXN0aW5hdGlvblUBEGNvc3T5AShtZXNzYWdlX2lkICBGZWVzUGFpZAAACBhwYXlpbmdVARBmZWVz+QE0QXNzZXRzQ2xhaW1lZAAADBBoYXNoIBhvcmlnaW5VARhhc3NldHN9AmBWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQAAAQcdmVyc2lvbgQ8QWxpYXNBdXRob3JpemVkAAAMHGFsaWFzZXJVARh0YXJnZXRVARhleHBpcnmFAmRBbGlhc0F1dGhvcml6YXRpb25SZW1vdmVkAAAIHGFsaWFzZXJVARh0YXJnZXRVAXBBbGlhc2VzQXV0aG9yaXphdGlvbnNSZW1vdmVkAAAEGHRhcmdldFUBAgw0SW52YWxpZEZvcm1hdAEgSFVuc3VwcG9ydGVkVmVyc2lvbgEgQEV4ZWN1dGVkRG93bndhcmQAAwgg4QECDBBIZXJlAAEFGFBhcmVudAABBRxTaWJsaW5nAQQCGCRCYWRGb3JtYXQAAQUcQ29ycnVwdAABBSxVbnN1cHBvcnRlZAABBShPdmVyd2VpZ2h0ARgUWWllbGQAAQVEU3RhY2tMaW1pdFJlYWNoZWQAAQUCEEBQcm9jZXNzaW5nRmFpbGVkAAAMCGlkIBhvcmlnaW6RAhRlcnJvcpUCJFByb2Nlc3NlZAAAEAhpZCAYb3JpZ2lukQIsd2VpZ2h0X3VzZWQYHHN1Y2Nlc3MUSE92ZXJ3ZWlnaHRFbnF1ZXVlZAAAEAhpZCAYb3JpZ2lukQIocGFnZV9pbmRleAQ0bWVzc2FnZV9pbmRleAQoUGFnZVJlYXBlZAAACBhvcmlnaW6RAhRpbmRleAQBBQedAtgCIEBCYXRjaEludGVycnVwdGVkAAAIFGluZGV4BBRlcnJvctg4QmF0Y2hDb21wbGV0ZWQAAQVgQmF0Y2hDb21wbGV0ZWRXaXRoRXJyb3JzAAEFNEl0ZW1Db21wbGV0ZWQAAQUoSXRlbUZhaWxlZAAABBRlcnJvctgwRGlzcGF0Y2hlZEFzAAAEGHJlc3VsdKECRElmRWxzZU1haW5TdWNjZXNzAAEFUElmRWxzZUZhbGxiYWNrQ2FsbGVkAAAEKG1haW5fZXJyb3LYAAgYaGVpZ2h0BBRpbmRleAQCFCxOZXdNdWx0aXNpZwAADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwAABAkYXBwcm92aW5nACR0aW1lcG9pbnSpAiBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAAAUJGFwcHJvdmluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0oQJETXVsdGlzaWdDYW5jZWxsZWQAABAoY2FuY2VsbGluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAwRGVwb3NpdFBva2VkAAAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIBgACEBRTdWRpZAAABCxzdWRvX3Jlc3VsdKECKEtleUNoYW5nZWQAAAgMb2xksQIMbmV3AChLZXlSZW1vdmVkAAEFKFN1ZG9Bc0RvbmUAAAQsc3Vkb19yZXN1bHShAgIYDEFueQABBSxOb25UcmFuc2ZlcgABBSxDYW5jZWxQcm94eQABBSBJZGVudGl0eQABBURJZGVudGl0eUp1ZGdlbWVudAABBSBDb2xsYXRvcgABBQIIHFByb3hpZXMAAQU0QW5ub3VuY2VtZW50cwABBQIcNFByb3h5RXhlY3V0ZWQAAAQYcmVzdWx0oQIsUHVyZUNyZWF0ZWQAABgQcHVyZQAMd2hvAChwcm94eV90eXBluQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEKFB1cmVLaWxsZWQAABAQcHVyZQAcc3Bhd25lcgAocHJveHlfdHlwZbkCUGRpc2FtYmlndWF0aW9uX2luZGV4BCRBbm5vdW5jZWQAAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCAoUHJveHlBZGRlZAAAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZbkCFGRlbGF5BDBQcm94eVJlbW92ZWQAABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGW5AhRkZWxheQQwRGVwb3NpdFBva2VkAAAQDHdobwAQa2luZL0CLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgCCBBUcnVlAAEFFEZhbHNlAAEFAggUVHJ1dGgBxQIgQ29udGVtcHQAAQUCgCxJZGVudGl0eVNldAAABAx3aG8APElkZW50aXR5Q2xlYXJlZAAACAx3aG8AHGRlcG9zaXQIOElkZW50aXR5S2lsbGVkAAAIDHdobwAcZGVwb3NpdAhISnVkZ2VtZW50UmVxdWVzdGVkAAAIDHdobwA8cmVnaXN0cmFyX2luZGV4BFBKdWRnZW1lbnRVbnJlcXVlc3RlZAAACAx3aG8APHJlZ2lzdHJhcl9pbmRleAQ4SnVkZ2VtZW50R2l2ZW4AAAgYdGFyZ2V0ADxyZWdpc3RyYXJfaW5kZXgEOFJlZ2lzdHJhckFkZGVkAAAEPHJlZ2lzdHJhcl9pbmRleARAU3ViSWRlbnRpdHlBZGRlZAAADAxzdWIAEG1haW4AHGRlcG9zaXQIQFN1YklkZW50aXRpZXNTZXQAAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CEhTdWJJZGVudGl0eVJlbmFtZWQAAAgMc3ViABBtYWluAEhTdWJJZGVudGl0eVJlbW92ZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CEhTdWJJZGVudGl0eVJldm9rZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CDhBdXRob3JpdHlBZGRlZAAABCRhdXRob3JpdHkAQEF1dGhvcml0eVJlbW92ZWQAAAQkYXV0aG9yaXR5ACxVc2VybmFtZVNldAAACAx3aG8AIHVzZXJuYW1lJDhVc2VybmFtZVF1ZXVlZAAADAx3aG8AIHVzZXJuYW1lJChleHBpcmF0aW9uBEhQcmVhcHByb3ZhbEV4cGlyZWQAAAQUd2hvc2UASFByaW1hcnlVc2VybmFtZVNldAAACAx3aG8AIHVzZXJuYW1lJFxEYW5nbGluZ1VzZXJuYW1lUmVtb3ZlZAAACAx3aG8AIHVzZXJuYW1lJDxVc2VybmFtZVVuYm91bmQAAAQgdXNlcm5hbWUkPFVzZXJuYW1lUmVtb3ZlZAAABCB1c2VybmFtZSQ4VXNlcm5hbWVLaWxsZWQAAAQgdXNlcm5hbWUkQFVzZXJuYW1lUmVwb3J0ZWQAAAggcmVwb3J0ZXIAIHVzZXJuYW1lJExQZXJzb25hbElkZW50aXR5U2V0AAAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSRERXZpZGVuY2VTdWJtaXR0ZWQAAAQUYWxpYXMgSENyZWRlbnRpYWxBY2NlcHRlZAAABBRhbGlhcyBIQ3JlZGVudGlhbFJlamVjdGVkAAAEFGFsaWFzIDBQZXJzb25CYW5uZWQAAAQUYWxpYXMgXFBlcnNvbmFsSWRlbnRpdHlDbGVhcmVkAAAEFGFsaWFzIGxSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkVmFsaWQAAAQgdXNlcm5hbWUkdFJlcG9ydGVkVXNlcm5hbWVKdWRnZWRJbnZhbGlkAAAEIHVzZXJuYW1lJJhSZXBvcnRlZFVzZXJuYW1lV2Vha09yVW5jbGVhckp1ZGdlbWVudAAACCB1c2VybmFtZSQkanVkZ2VtZW50yQIEIAACKFBQZXJzb25ob29kUmVjb2duaXplZAAACAx3aG8IDGtleSBAUGVyc29uT25ib2FyZGluZwAACAx3aG8IDGtleSA8QWxpYXNEaXNwYXRjaGVkAAAIFGFsaWFzYQEcYWNjb3VudAA8QWxpYXNBY2NvdW50U2V0AAAIFGFsaWFzYQEcYWNjb3VudABEQWxpYXNBY2NvdW50VW5zZXQAAAgUYWxpYXNhARxhY2NvdW50AFBQZXJzb25hbElkQWNjb3VudFNldAAACAx3aG8IHGFjY291bnQAWFBlcnNvbmFsSWRBY2NvdW50VW5zZXQAAAgMd2hvCBxhY2NvdW50AERDb2xsZWN0aW9uQ3JlYXRlZAABBWRGb3JjZVBlcnNvbmhvb2RSZWNvZ25pemVkAAAEGHBlb3BsZdECOEFsaWFzQ2xlYW5lZFVwAAAIFGFsaWFzYQEcYWNjb3VudAAEBAACRCxDYXNlQ3JlYXRlZAAABChjYXNlX2luZGV4BCBDYWxsYmFjawAABBhyZXN1bHShAjRDYWxsYmFja0Vycm9yAAEFKENhc2VDbG9zZWQAAAgoY2FzZV9pbmRleAQcdmVyZGljdMkCFFZvdGVkAAAMKGNhc2VfaW5kZXgEFHZvdGVyIBxvcGluaW9uyQIsVm90ZUNsZWFuZWQAAAgoY2FzZV9pbmRleAQUdm90ZXIgLENhc2VSZW1vdmVkAAAEKGNhc2VfaW5kZXgEOENhc2VJbnRlcnZlbmVkAAAIKGNhc2VfaW5kZXgEHHZlcmRpY3TJAjBWb3Rlc0NsYWltZWQAAAgUdm90ZXIgMGNhc2VfaW5kaWNlc9kCMFJld2FyZFBheW91dAAADBR2b3RlciAsZGVzdGluYXRpb24AGGFtb3VudAhIUGF5b3V0Um91bmRTdGFydGVkAAAMFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIMHRvdGFsX3BvaW50cwhUUGF5b3V0Um91bmRzU2NoZWR1bGVkAAAMGGFtb3VudAgUY291bnQEGHBlcmlvZARUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BDRDcmVkaXRDbGFpbWVkAAAIFHZvdGVyIBhhbW91bnQINFBvaW50c0NsZWFuZWQAAAgUcm91bmQEFHZvdGVyICxDYXNlVG91Y2hlZAAACChjYXNlX2luZGV4BBxyaXBlbmVkFFBWb3RpbmdQZW5hbHR5Q2xlYXJlZAAABAx3aG8gAhAgRGVzaWduZWQAAAQUY291bnQERFByb2NlZHVyYWxBY2NvdW50AAEFSFByb2NlZHVyYWxQZXJzb25hbAABBShQcm9jZWR1cmFsAAAEFHJhbmdlBAAgOHJlcm9sbF90aW1lb3V0BDxmYXN0dHJhY2tfY291bnQEHG1heGltdW0EOGZ1bGxfYWxsb2NfbGVuCEBmdWxsX2FsbG9jX2NvdW50BDhpbml0X2FsbG9jX2xlbghAaW5pdF9hbGxvY19jb3VudAQcdGltZW91dAQCXEBDYW5kaWRhdGVBcHBsaWVkAAAEKGFjY291bnRfaWQASEp1ZGdlbWVudFJlcXVlc3RlZAAABChhY2NvdW50X2lkAERKdWRnZW1lbnRQcm92aWRlZAAACChhY2NvdW50X2lkACRqdWRnZW1lbnTJAjBSZXRyeUdyYW50ZWQAAAgoYWNjb3VudF9pZAAgZmFpbHVyZXMEQFBlcnNvblJlZ2lzdGVyZWQAAAgoYWNjb3VudF9pZAAscGVyc29uYWxfaWQIRENhbmRpZGF0ZVJlZmVycmVkAAAIIHJlZmVycmVyCCByZWZlcnJlZAAgUmVyb2xsZWQAAAQoYWNjb3VudF9pZAA8RGVzaWduQ29tbWl0dGVkAAAIKGFjY291bnRfaWQALHJlc2VydmVkX2lkCDhGdWxseUFsbG9jYXRlZAAABChhY2NvdW50X2lkACBUaW1lZE91dAAABChhY2NvdW50X2lkACRGbGFrZWRPdXQAAAQoYWNjb3VudF9pZAA4VGlja2V0UmVmZXJyZWQAAAggcmVmZXJyZXIIGHRpY2tldAA8VGlja2V0Q2FuY2VsbGVkAAAIIHJlZmVycmVyCBh0aWNrZXQANFRpY2tldEFwcGxpZWQAAAgoYWNjb3VudF9pZAAgcmVmZXJyZXIILEZhbWlseUFkZGVkAAAMFGluZGV4BBBraW5k4QIIaWQgREFsbEludml0ZXNSZW1vdmVkAAAEHGludml0ZXIASFNvbWVJbnZpdGVzUmVtb3ZlZAAABBxpbnZpdGVyAFxJbnZpdGVkQ2FuZGlkYXRlQXBwbGllZAAACAx3aG8AHGludml0ZXIAZFJlZmVycmFsVm91Y2hlclJlZ2lzdGVyZWQAAAQgcmVmZXJyZXIIOEludml0ZXNHcmFudGVkAAAIHGFjY291bnQAFGNvdW50BDxJbnZpdGVUaWNrZXRTZXQAAAgcaW52aXRlcgAYdGlja2V0AFRJbnZpdGVUaWNrZXRDYW5jZWxsZWQAAAgcaW52aXRlcgAYdGlja2V0AEBDb25maWd1cmF0aW9uU2V0AAAEGGNvbmZpZ+UCAggcQWNjb3VudAEAGFBlcnNvbgEgAkgcTmV3R2FtZQAADERyZWdpc3RyYXRpb25fZW5kcwQkZ2FtZV9kYXRlBCxyZXBvcnRfZW5kcwQkR2FtZUVuZGVkAAAEFGluZGV4BCBTaWduZWRVcAAABAx3aG/tAjxSZXBvcnRTdWJtaXR0ZWQAAAgMd2hv7QIoZ2FtZV9pbmRleAQoT2ZmYm9hcmRlZAAABAx3aG/tAiRLaWNrZWRPdXQAAAQYcGxheWVy7QI4SW52aXRlc0dyYW50ZWQAAAgcYWNjb3VudAAUY291bnQEPEludml0ZVRpY2tldFNldAAABBxpbnZpdGVyAFRJbnZpdGVUaWNrZXRDYW5jZWxsZWQAAAQcaW52aXRlcgA4R2FtZXNTY2hlZHVsZWQAAAQUY291bnQEUFNjaGVkdWxlZEdhbWVSZW1vdmVkAAAEOGdhbWVfcGxheV90aW1lBEBTdG10VXNhZ2VSZW1vdmVkAAAEDHdobyBEQWxsSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgBIU29tZUludml0ZXNSZW1vdmVkAAAEHGludml0ZXIAWFNjcmF0Y2hSZXdhcmRBdmFpbGFibGUAAAQoZ2FtZV9pbmRleARQU2NyYXRjaFJld2FyZENsYWltZWQAAAgsYmVuZWZpY2lhcnkAGGFtb3VudAhMR2FtZVByaXplUG9vbE9wZW5lZAAACChnYW1lX2luZGV4BBxwb29sX2lkBFxHYW1lUHJpemVQb29sT3BlbkZhaWxlZAAACChnYW1lX2luZGV4BBRlcnJvctgCHDRDcmVkaXRDbGFpbWVkAAAMDHdob+0CLGRlc3RpbmF0aW9uABhhbW91bnQIUFBlcnNvbmhvb2RSZWNvZ25pemVkAAAIDHdob+0CHHJlc3VtZWQUVFBheW91dFJvdW5kc1NjaGVkdWxlZAAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BERSb3VuZFRyYW5zaXRpb25lZAAABCxyb3VuZF9pbmRleARMUGF5b3V0Um91bmRPcGVyYXRlZAAABCxyb3VuZF9pbmRleAQkQ2FzaGVkT3V0AAAEDHdob+0CAiAsSWRzUmVzZXJ2ZWQAAAQUY291bnQEJElkUmVuZXdlZAAABAhpZAgwSWRVbnJlc2VydmVkAAAECGlkCEBQZW9wbGVSZWdpc3RlcmVkAAAEFGNvdW50BDxQZW9wbGVTdXNwZW5kZWQAAAQUY291bnQERFBlcnNvbmhvb2RSZXN1bWVkAAAECGlkCEhTdXNwZW5zaW9uc1N0YXJ0ZWQAAQVAU3VzcGVuc2lvbnNFbmRlZAABBQIYeEFsbEF0dGVzdGF0aW9uQWxsb3dhbmNlQ2xlYXJlZAAABCB2ZXJpZmllcgB0QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQAAAgcYWNjb3VudAAUY291bnQEOFBlcnNvbkF0dGVzdGVkAAAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIASENvbnN1bWVyUmVnaXN0ZXJlZAAABBxhY2NvdW50ADxBbGlhc0FjY291bnRTZXQAAAgUYWxpYXNhARxhY2NvdW50AERBbGlhc0FjY291bnRVbnNldAAACBRhbGlhc2EBHGFjY291bnQAAjhAUGVyc29uUmVnaXN0ZXJlZAAACBRhbGlhcyAcYWNjb3VudABQTGl0ZVBlcnNvblJlZ2lzdGVyZWQAAAQcYWNjb3VudABkRnJpZW5kUmVxdWVzdFN0bXRVc2FnZVNldAAAEBRhbGlhcyAYcGVyaW9kBAxzZXEEHGFjY291bnQAdEZyaWVuZFJlcXVlc3RTdG10VXNhZ2VSZW1vdmVkAAAEHGFjY291bnQAaFBlcnNvbkF1dGhvcml6YXRpb25Ub3VjaGVkAAAEHGFjY291bnQAhEV4cGlyZWRVc2VybmFtZVJlc2VydmF0aW9uUmVtb3ZlZAAACCB1c2VybmFtZSQcYWNjb3VudABQSWRlbnRpZmllcktleVVwZGF0ZWQAAAQcYWNjb3VudAB4VXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uU2V0AAAEIGR1cmF0aW9uCFRTdG10U3RvcmVBbGxvd2FuY2VTZXQAABAUYWxpYXMgGHBlcmlvZAQMc2VxBBxhY2NvdW50AGhTdG10U3RvcmVBbGxvd2FuY2VzQ2xlYXJlZAAADBhwZXJpb2QEJGZpcnN0X2tleSAUY291bnQENFBlcnNvbkRlbW90ZWQAAAQcYWNjb3VudABYTG9uZ1Rlcm1TdG9yYWdlQ2xhaW1lZAAAFBRhbGlhcyAYcGVyaW9kBBxjb3VudGVyBBxhY2NvdW50AChjb2xsZWN0aW9ufQF8TG9uZ1Rlcm1TdG9yYWdlQWxsb2NhdGlvbkZhaWxlZAAAFBRhbGlhcyAYcGVyaW9kBBxjb3VudGVyBBxhY2NvdW50AChjb2xsZWN0aW9ufQF0TG9uZ1Rlcm1TdG9yYWdlQWxpYXNlc0NsZWFyZWQAAAgYcGVyaW9kBBRjb3VudAQCDBBSMmU5AAEFFFIyZTEwAAEFFFIyZTE0AAEFAghoQ2h1bmtQYWdlSGFzaGVzSW5pdGlhbGl6ZWQAAAg0cmluZ19leHBvbmVudAUDLHRvdGFsX3BhZ2VzBCxDaHVua3NBZGRlZAAADDRyaW5nX2V4cG9uZW50BQMsc3RhcnRfaW5kZXgEFGNvdW50BAIoLE1lbWJlckFkZGVkAAAEDGtleSA0TWVtYmVyUmVtb3ZlZAAABAxrZXkgbENvbGxlY3Rpb25NYXJrZWRGb3JEZWxldGlvbgAABChpZGVudGlmaWVyIERDb2xsZWN0aW9uRGVsZXRlZAAABChpZGVudGlmaWVyICRSaW5nQnVpbHQAAAgoaWRlbnRpZmllciAocmluZ19pbmRleARATWVtYmVyc09uYm9hcmRlZAAABChpZGVudGlmaWVyICxSaW5nc01lcmdlZAAADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BERPbmJvYXJkaW5nU2l6ZVNldAAACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUESE1lbWJlclNlbGZJbmNsdWRlZAAACChpZGVudGlmaWVyIAxrZXkgQE9sZFJvb3RDbGVhbmVkVXAAAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQgcmV2aXNpb24EAggYTmF0aXZlAAEFGFN0YWJsZQABBQJcJENvaW5TcGxpdAAABDBvdXRwdXRfY291bnQEPENvaW5UcmFuc2ZlcnJlZAAADAh0bwAUdmFsdWUEHG5ld19hZ2UEWFJlY3ljbGVyTG9hZGVkV2l0aENvaW4AAAQUdmFsdWUEfFJlY3ljbGVyTG9hZGVkV2l0aEV4dGVybmFsQXNzZXQAAAwMd2hvABR2YWx1ZQQYYW1vdW50CGBSZWN5Y2xlclVubG9hZGVkSW50b0NvaW4AABAIdG8ALGlucHV0X3ZhbHVlBDBvdXRwdXRfdmFsdWUELGlucHV0X2NvdW50BIRSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAABAIdG8AFHZhbHVlBCxpbnB1dF9jb3VudAQYYW1vdW50CLBSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXRBbmRWb3VjaGVycwAAFAh0bwAUdmFsdWUELGlucHV0X2NvdW50BFRleHRlcm5hbF9hc3NldF9hbW91bnQINHZvdWNoZXJfY291bnQEhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbgAACAxmZWUIJGRlc3Ryb3llZAiMUGFpZFVubG9hZFRva2VuUmVnaXN0ZXJlZFdpdGhOYXRpdmUAAAgMd2hvAAxmZWUIjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoU3RhYmxlAAAIDHdobwAMZmVlCHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEhExpdGVQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEZFJlY3ljbGVyc1VubG9hZGVkSW50b0NvaW4AAAwIdG8AMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMAABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5EQNkUmVjeWNsZXJVbmxvYWRlZEludG9Db2lucwAABDBvdXRwdXRfY291bnQEfENvaW5PZmZib2FyZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8AFHZhbHVlBBhhbW91bnQIPFJlY3ljbGVyQ2xlYW5lZAAADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CGRDb25zdW1lZEZyZWVUb2tlbnNDbGVhbmVkAAAEGHBlcmlvZARoUGFpZFVubG9hZFRva2VuUmluZ0NsZWFuZWQAAAgYcGVyaW9kBChyaW5nX2luZGV4BExSZWN5Y2xlckR1c3RDbGVhbmVkAAEFaFBhaWRVbmxvYWRUb2tlbkR1c3RDbGVhbmVkAAEFnEV4cGlyZWRQYWlkVW5sb2FkVG9rZW5Db2xsZWN0aW9uRGVsZXRlZAAABBhwZXJpb2QEAhgoU3Vic2NyaWJlZAAABBxwYXJhX2lkBDBVbnN1YnNjcmliZWQAAAQccGFyYV9pZAQsVXBkYXRlc1NlbnQAAAgccGFyYV9pZAQwdXBkYXRlX2NvdW50BEBVcGRhdGVTZW5kRmFpbGVkAAAEHHBhcmFfaWQEPFJlcGxheVJlcXVlc3RlZAAADBxwYXJhX2lkBChpZGVudGlmaWVyIDRpbmRpY2VzX2NvdW50BDhCYXRjaEFiYW5kb25lZAAABCBzZXF1ZW5jZQgCSDBBc3NldENyZWF0ZWQAAQVQWGNtRnVuZHNUcmFuc2ZlclNlbnQAAQVgWGNtRnVuZHNUcmFuc2ZlclRpbWVkT3V0AAEFNEZ1bmRzVmVyaWZpZWQAAQUoUG90c0Z1bmRlZAABBVxNb2JSdWxlUGF5b3V0c1NjaGVkdWxlZAABBVRTY29yZVBheW91dHNTY2hlZHVsZWQAAQVEQWlyZHJvcFBvb2xPcGVuZWQAAAQccG9vbF9pZAR8QWlyZHJvcFNjaGVkdWxpbmdFbmFibGVkQ2hhbmdlZAAABBxlbmFibGVkFHRPblBvbGxJbml0aWFsaXphdGlvbkNvbXBsZXRlZAABBWRNaWdyYXRpb25QZW9wbGVSZWNvZ25pemVkAAEFaE1pZ3JhdGlvbk9uYm9hcmRpbmdTaXplU2V0AAEFeE1pZ3JhdGlvblByb29mT2ZJbmtJbml0aWFsaXplZAABBVxNaWdyYXRpb25HYW1lc1NjaGVkdWxlZAABBVxNaWdyYXRpb25JbnZpdGVzR3JhbnRlZAABBXxNaWdyYXRpb25SZWltYnVyc2VtZW50VmFsdWVzU2V0AAEFhE1pZ3JhdGlvbkF0dGVzdGF0aW9uQWxsb3dhbmNlc1NldAABBUhNaWdyYXRpb25Db21wbGV0ZWQAAQUCBFxJbml0aWFsaXphdGlvbkNvbXBsZXRlZAABBQIIGFBlb3BsZQABBUBHYW1lUGFydGljaXBhbnRzAQQCGDxQcml6ZVBvb2xPcGVuZWQAABwIaWQEKGRpc3BhdGNoZXIAGHRhcmdldCUDIGFzc2V0X2lkVQEobnVtX3ByaXplcwQscHJpemVfdmFsdWUIKGV4cGlyZXNfYXQIMFByaXplQ2xhaW1lZAAAFBxwb29sX2lkBCBjbGFpbWFudO0CLGJlbmVmaWNpYXJ5ACBhc3NldF9pZFUBGGFtb3VudAhAQWxsUHJpemVzQ2xhaW1lZAAACAhpZAQgYXNzZXRfaWRVAUBQcml6ZVBvb2xFeHBpcmVkAAAMCGlkBCBhc3NldF9pZFUBIHJlZnVuZGVkCDxQcml6ZVBvb2xDbG9zZWQAAAwIaWQEIGFzc2V0X2lkVQEgcmVmdW5kZWQITFByaXplVHJhbnNmZXJGYWlsZWQAABAccG9vbF9pZAQsYmVuZWZpY2lhcnkAIGFzc2V0X2lkVQEYYW1vdW50CAYkAiA4VXBncmFkZVN0YXJ0ZWQAAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAABBTRVcGdyYWRlRmFpbGVkAAEFQE1pZ3JhdGlvblNraXBwZWQAAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAAAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQAAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAAACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAAAELG5leHRfY3Vyc29yLQMClBhTeXN0ZW0B3DxQYXJhY2hhaW5TeXN0ZW0B5CBCYWxhbmNlcwERAUhUcmFuc2FjdGlvblBheW1lbnQBFQFIU2tpcEZlZWxlc3NQYXltZW50AaEBRE9yaWdpblJlc3RyaWN0aW9uAakBGEFzc2V0cwG1ATBBc3NldHNIb2xkZXIBuQEkQXNzZXRSYXRlAb0BOEFzc2V0VHhQYXltZW50AcUBRENvbGxhdG9yU2VsZWN0aW9uAc0BHFNlc3Npb24B0QEkWGNtcFF1ZXVlAdUBLFBvbGthZG90WGNtAYkCKEN1bXVsdXNYY20BjQIwTWVzc2FnZVF1ZXVlAZkCHFV0aWxpdHkBpQIgTXVsdGlzaWcBrQIQU3VkbwG1AhRQcm94eQHBAiBJZGVudGl0eQHNAhhQZW9wbGUB1QIcTW9iUnVsZQHdAihQcm9vZk9mSW5rAekCEEdhbWUB8QIUU2NvcmUB9QIgRHVtbXlEaW0B+QIoUGVvcGxlTGl0ZQH9AiRSZXNvdXJjZXMBAQM0Q2h1bmtzTWFuYWdlcgEJAxxNZW1iZXJzAQ0DHENvaW5hZ2UBFQM8TWVtYmVyc05vdGlmaWVyARkDVFN0b3JhZ2VJbml0aWFsaXphdGlvbgEdA2RTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlASEDHEFpcmRyb3ABKQNQTXVsdGlCbG9ja01pZ3JhdGlvbnMBMQMADBRwaGFzZTQUZXZlbnQ1Axh0b3BpY3PRAgQ5AwAEBAEIBEEDAAEBAAgwc3BlY192ZXJzaW9uBCRzcGVjX25hbWVJAwAIJGNvZGVfaGFzaCA0Y2hlY2tfdmVyc2lvbhQAEDhiYXNlX2V4dHJpbnNpYxg0bWF4X2V4dHJpbnNpYxkCJG1heF90b3RhbBkCIHJlc2VydmVkGQIADBhub3JtYWxVAyxvcGVyYXRpb25hbFUDJG1hbmRhdG9yeVUDAAwoYmFzZV9ibG9jaxgkbWF4X2Jsb2NrGCRwZXJfY2xhc3NZAwAMGG5vcm1hbAQsb3BlcmF0aW9uYWwEJG1hbmRhdG9yeQQGBAAIDG1heGEDPG1heF9oZWFkZXJfc2l6ZWUDAAgQcmVhZAgUd3JpdGUIAwjlAQQEcQMAACAkc3BlY19uYW1lSQMkaW1wbF9uYW1lSQNEYXV0aG9yaW5nX3ZlcnNpb24EMHNwZWNfdmVyc2lvbgQwaW1wbF92ZXJzaW9uBBBhcGlzdQNMdHJhbnNhY3Rpb25fdmVyc2lvbgQ4c3lzdGVtX3ZlcnNpb24EBCQBCAR9AwAEJAACDCBGdWxsQ29yZQAABBxjb250ZXh0BERQb3RlbnRpYWxGdWxsQ29yZQAADBxjb250ZXh0BFxmaXJzdF90cmFuc2FjdGlvbl9pbmRleGUDNHRhcmdldF93ZWlnaHQYOEZyYWN0aW9uT2ZDb3JlAAAIHGNvbnRleHQEXGZpcnN0X3RyYW5zYWN0aW9uX2luZGV4ZQMACCRtc2dfY291bnQELHRvdGFsX2J5dGVzBAMIBI0DBJEDAAAMNHVtcF9tc2dfY291bnQEPHVtcF90b3RhbF9ieXRlcwQ0aHJtcF9vdXRnb2luZ5UDAggUQWJvcnQAAQUcR29BaGVhZAABBQadAwAMOHVzZWRfYmFuZHdpZHRomQM4cGFyYV9oZWFkX2hhc2jgYGNvbnN1bWVkX2dvX2FoZWFkX3NpZ25hbKEDBKUDAAAMOHVzZWRfYmFuZHdpZHRomQM4aHJtcF93YXRlcm1hcmtlA2Bjb25zdW1lZF9nb19haGVhZF9zaWduYWyhAwAQLHBhcmVudF9oZWFkJExyZWxheV9wYXJlbnRfbnVtYmVyBGRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290IDBtYXhfcG92X3NpemUEAgQcUHJlc2VudAABBQa1AwAIPHJlbWFpbmluZ19jb3VudAQ4cmVtYWluaW5nX3NpemUEABgwbWF4X2NhcGFjaXR5BDhtYXhfdG90YWxfc2l6ZQRAbWF4X21lc3NhZ2Vfc2l6ZQQkbXNnX2NvdW50BCh0b3RhbF9zaXplBCBtcWNfaGVhZOADCATBAwTFAwAAEDBkbXFfbXFjX2hlYWQgnHJlbGF5X2Rpc3BhdGNoX3F1ZXVlX3JlbWFpbmluZ19jYXBhY2l0eb0DQGluZ3Jlc3NfY2hhbm5lbHPJAzxlZ3Jlc3NfY2hhbm5lbHPJAwAITG1heF9jYW5kaWRhdGVfZGVwdGgEUGFsbG93ZWRfYW5jZXN0cnlfbGVuBAAoNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXPRAwMIBCAE2QMAAAgcc2VudF9hdAQscmV2ZXJzZV9pZHgEAAgkcmVjaXBpZW50BBBkYXRhJATlAwAAGGhyZWxheV9zdG9yYWdlX3Jvb3Rfb3JfaGFzaCA0Y29yZV9zZWxlY3RvcgQwYnVuZGxlX2luZGV4BDR1bXBfbXNnX2NvdW50BExocm1wX291dGJvdW5kX2NvdW50BGBocm1wX291dGJvdW5kX3JlY2lwaWVudHPZAgAULHBhcmVudF9oYXNoIBhudW1iZXIEKHN0YXRlX3Jvb3QgPGV4dHJpbnNpY3Nfcm9vdCAYZGlnZXN0MATxAwAAEDx2YWxpZGF0aW9uX2RhdGGxA0RyZWxheV9jaGFpbl9zdGF0ZYUDYHJlbGF5X3BhcmVudF9kZXNjZW5kYW50c/UDQGNvbGxhdG9yX3BlZXJfaWQtAwAIHHNlbnRfYXQEDG1zZyQE/QMAAAgcc2VudF9hdAQgbXNnX2hhc2ggBAUEAAAINGZ1bGxfbWVzc2FnZXMBBDxoYXNoZWRfbWVzc2FnZXMJBAAIHHNlbnRfYXQEEGRhdGEkAwgEEQQEFQQAAwgEBQQEHQQAAAg0ZnVsbF9tZXNzYWdlcxkEPGhhc2hlZF9tZXNzYWdlcyEEAAhEZG93bndhcmRfbWVzc2FnZXMNBExob3Jpem9udGFsX21lc3NhZ2VzJQQCDAxGZWUAAQUQTWlzYwABBQxBbGwAAQUADAhpZOUBGGFtb3VudAgccmVhc29ucy0EBDEEAAAICGlk5QEYYW1vdW50CAQ5BAAACAhpZAkBGGFtb3VudAgEQQQAAAQYYW1vdW50CARJBAACFAhJZAEAFEluZGV4AZ0CDFJhdwEkJEFkZHJlc3MzMgEgJEFkZHJlc3MyMAElAQIIIEluY3JlYXNlAAEFIERlY3JlYXNlAAEFAggkVjFBbmNpZW50AAEFCFYyAAEFAAgQdXNlZAggYXRfYmxvY2sEAgwQTGl2ZQABBRhGcm96ZW4AAQUoRGVzdHJveWluZwABBQAwFG93bmVyABhpc3N1ZXIAFGFkbWluABxmcmVlemVyABhzdXBwbHkIHGRlcG9zaXQILG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCBhY2NvdW50cwQsc3VmZmljaWVudHMEJGFwcHJvdmFscwQYc3RhdHVzYQQDCFUBAAIMGExpcXVpZAABBRhGcm96ZW4AAQUcQmxvY2tlZAABBQIUIENvbnN1bWVyAAEFKFN1ZmZpY2llbnQAAQUsRGVwb3NpdEhlbGQBCDxEZXBvc2l0UmVmdW5kZWQAAQUsRGVwb3NpdEZyb20AAwgACAAMHGJhbGFuY2UIGHN0YXR1c20EGHJlYXNvbnEEAwxVAQAAAAgYYW1vdW50CBxkZXBvc2l0CAAUHGRlcG9zaXQIEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQGZQQGgQQACAx3aG8AHGRlcG9zaXQIBI0EAAMIACAElQQAAwgoJAMICAQCCAhPawABBSRTdXNwZW5kZWQAAQUAGCRyZWNpcGllbnQEFHN0YXRlpQQ0c2lnbmFsc19leGlzdBQsZmlyc3RfaW5kZXgEKGxhc3RfaW5kZXgEFGZsYWdzBASpBAADCAQEAAxEc3VzcGVuZF90aHJlc2hvbGQEOGRyb3BfdGhyZXNob2xkBEByZXN1bWVfdGhyZXNob2xkBAaBAgUBCAa9BAKgIE92ZXJmbG93AAEFNFVuaW1wbGVtZW50ZWQAAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAQUwTG9jYXRpb25GdWxsAAEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQABBSRCYWRPcmlnaW4AAQU8SW52YWxpZExvY2F0aW9uAAEFNEFzc2V0Tm90Rm91bmQAAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAEFPE5vdFdpdGhkcmF3YWJsZQABBUhMb2NhdGlvbkNhbm5vdEhvbGQAAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAAEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQUwVW5rbm93bkNsYWltAAEFOEZhaWxlZFRvRGVjb2RlAAEFQE1heFdlaWdodEludmFsaWQAAQU4Tm90SG9sZGluZ0ZlZXMAAQUwVG9vRXhwZW5zaXZlAAEFEFRyYXABCEBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQMIBMUEBskEAhgQTnVsbAABBRhBc3NldHMBcQI8RXhlY3V0aW9uUmVzdWx0Ac0EHFZlcnNpb24BBCxQYWxsZXRzSW5mbwEJAjhEaXNwYXRjaFJlc3VsdAENAgIYEE51bGwAAQUYQXNzZXRzAXkCPEV4ZWN1dGlvblJlc3VsdAHNBBxWZXJzaW9uAQQsUGFsbGV0c0luZm8BCQI4RGlzcGF0Y2hSZXN1bHQBDQICDAhWMwHRBAhWNAHVBAhWNQERAgIMHFBlbmRpbmcAABAkcmVzcG9uZGVygQJMbWF5YmVfbWF0Y2hfcXVlcmllcrkEMG1heWJlX25vdGlmecEEHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgAACBhvcmlnaW6BAiRpc19hY3RpdmUUFFJlYWR5AAAIIHJlc3BvbnNl2QQIYXQEAwgEgQIDDAgYBAMIgQIEBOkEAAIQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAEFXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEFUE5vdGlmeUN1cnJlbnRUYXJnZXRzAS0DaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAEFAgwIVjMBaQIIVjQBZQIIVjUBVQEDDAQA9QQDCJ0CCAT9BAAAEBhhbW91bnQIFG93bmVygQIYbG9ja2VygQIkY29uc3VtZXJzAQUDCAiBAgQJBQAACCBsb2NhdGlvboECGGV4cGlyeYUCBBEFAAAEIGFsaWFzZXJzFQUGZQIADCxkZXN0aW5hdGlvbmUCIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIQDEFsbAABBRRBbGxPZgAACAhpZGkCDGZ1biECKEFsbENvdW50ZWQBBDBBbGxPZkNvdW50ZWQAAAwIaWRpAgxmdW4hAhRjb3VudAQCCCBEZWZpbml0ZQFxAhBXaWxkASUFAsA0V2l0aGRyYXdBc3NldAFxAlRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBcQJYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAFxAjRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZdEEKG1heF93ZWlnaHQYHHF1ZXJpZXIdBTRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c3ECLGJlbmVmaWNpYXJ5ZQJQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRzcQIQZGVzdGUCDHhjbTEFIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kFQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAAADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAAABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwAADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgABBTREZXNjZW5kT3JpZ2luAWECLFJlcG9ydEVycm9yASEFMERlcG9zaXRBc3NldAAACBhhc3NldHMpBSxiZW5lZmljaWFyeWUCTERlcG9zaXRSZXNlcnZlQXNzZXQAAAwYYXNzZXRzKQUQZGVzdGUCDHhjbTEFNEV4Y2hhbmdlQXNzZXQAAAwQZ2l2ZSkFEHdhbnRxAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwAADBhhc3NldHMpBRxyZXNlcnZlZQIMeGNtMQVASW5pdGlhdGVUZWxlcG9ydAAADBhhc3NldHMpBRBkZXN0ZQIMeGNtMQU0UmVwb3J0SG9sZGluZwAACDRyZXNwb25zZV9pbmZvIQUYYXNzZXRzKQUwQnV5RXhlY3V0aW9uAAAIEGZlZXNtAjB3ZWlnaHRfbGltaXQtAjRSZWZ1bmRTdXJwbHVzAAEFPFNldEVycm9ySGFuZGxlcgExBSxTZXRBcHBlbmRpeAExBShDbGVhckVycm9yAAEFKENsYWltQXNzZXQAAAgYYXNzZXRzcQIYdGlja2V0ZQIQVHJhcAEIQFN1YnNjcmliZVZlcnNpb24AAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgABBSRCdXJuQXNzZXQBcQIsRXhwZWN0QXNzZXQBcQIwRXhwZWN0T3JpZ2luAR0FLEV4cGVjdEVycm9yAc0EUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQ0CLFF1ZXJ5UGFsbGV0AAAILG1vZHVsZV9uYW1lJDRyZXNwb25zZV9pbmZvIQUwRXhwZWN0UGFsbGV0AAAUFGluZGV4BBBuYW1lJCxtb2R1bGVfbmFtZSQsY3JhdGVfbWFqb3IEPG1pbl9jcmF0ZV9taW5vcgRQUmVwb3J0VHJhbnNhY3RTdGF0dXMBIQVMQ2xlYXJUcmFuc2FjdFN0YXR1cwABBTxVbml2ZXJzYWxPcmlnaW4BXQI0RXhwb3J0TWVzc2FnZQAADBxuZXR3b3JrVQIsZGVzdGluYXRpb25hAgx4Y20xBSRMb2NrQXNzZXQAAAgUYXNzZXRtAiB1bmxvY2tlcmUCLFVubG9ja0Fzc2V0AAAIFGFzc2V0bQIYdGFyZ2V0ZQI4Tm90ZVVubG9ja2FibGUAAAgUYXNzZXRtAhRvd25lcmUCNFJlcXVlc3RVbmxvY2sAAAgUYXNzZXRtAhhsb2NrZXJlAixTZXRGZWVzTW9kZQAABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljASAoQ2xlYXJUb3BpYwABBSxBbGlhc09yaWdpbgFlAjxVbnBhaWRFeGVjdXRpb24AAAgwd2VpZ2h0X2xpbWl0LQIwY2hlY2tfb3JpZ2luHQUELQUAAhAMQWxsAAEFFEFsbE9mAAAICGlkZQIMZnVuIQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZGUCDGZ1biECFGNvdW50BAIIIERlZmluaXRlAXkCEFdpbGQBNQUCwDRXaXRoZHJhd0Fzc2V0AXkCVFJlc2VydmVBc3NldERlcG9zaXRlZAF5AlhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AXkCNFF1ZXJ5UmVzcG9uc2UAABAgcXVlcnlfaWQIIHJlc3BvbnNl1QQobWF4X3dlaWdodBgccXVlcmllch0FNFRyYW5zZmVyQXNzZXQAAAgYYXNzZXRzeQIsYmVuZWZpY2lhcnllAlBUcmFuc2ZlclJlc2VydmVBc3NldAAADBhhc3NldHN5AhBkZXN0ZQIMeGNtQQUgVHJhbnNhY3QAAAwsb3JpZ2luX2tpbmQVAlhyZXF1aXJlX3dlaWdodF9hdF9tb3N0GBBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BYQIsUmVwb3J0RXJyb3IBIQUwRGVwb3NpdEFzc2V0AAAIGGFzc2V0czkFLGJlbmVmaWNpYXJ5ZQJMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHM5BRBkZXN0ZQIMeGNtQQU0RXhjaGFuZ2VBc3NldAAADBBnaXZlOQUQd2FudHkCHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0czkFHHJlc2VydmVlAgx4Y21BBUBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0czkFEGRlc3RlAgx4Y21BBTRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8hBRhhc3NldHM5BTBCdXlFeGVjdXRpb24AAAgQZmVlc3UCMHdlaWdodF9saW1pdC0CNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyAUEFLFNldEFwcGVuZGl4AUEFKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHN5Ahh0aWNrZXRlAhBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAF5AixFeHBlY3RBc3NldAF5AjBFeHBlY3RPcmlnaW4BHQUsRXhwZWN0RXJyb3IBzQRQRXhwZWN0VHJhbnNhY3RTdGF0dXMBDQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8hBTBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEhBUxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgFdAjRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmtVAixkZXN0aW5hdGlvbmECDHhjbUEFJExvY2tBc3NldAAACBRhc3NldHUCIHVubG9ja2VyZQIsVW5sb2NrQXNzZXQAAAgUYXNzZXR1Ahh0YXJnZXRlAjhOb3RlVW5sb2NrYWJsZQAACBRhc3NldHUCFG93bmVyZQI0UmVxdWVzdFVubG9jawAACBRhc3NldHUCGGxvY2tlcmUCLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAWUCPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQtAjBjaGVja19vcmlnaW4dBQQ9BQACDAhWMwExBQhWNAFBBQhWNQFNAgIQIFRlbGVwb3J0AAEFMExvY2FsUmVzZXJ2ZQABBUhEZXN0aW5hdGlvblJlc2VydmUAAQU0UmVtb3RlUmVzZXJ2ZQGBAgAIEHByZXaRAhBuZXh0kQIGTQUAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3Vyc1EFNG1lc3NhZ2VfY291bnQIEHNpemUIAwiRAgQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkAiwYcmVtYXJrAAAEGHJlbWFyayQ4c2V0X2hlYXBfcGFnZXMAAAQUcGFnZXMIIHNldF9jb2RlAAAEEGNvZGUkXHNldF9jb2RlX3dpdGhvdXRfY2hlY2tzAAAEEGNvZGUkLHNldF9zdG9yYWdlAAAEFGl0ZW1zgQMwa2lsbF9zdG9yYWdlAAAEEGtleXOFAyxraWxsX3ByZWZpeAAACBhwcmVmaXgkHHN1YmtleXMERHJlbWFya193aXRoX2V2ZW50AAAEGHJlbWFyayREYXV0aG9yaXplX3VwZ3JhZGUAAAQkY29kZV9oYXNoIIBhdXRob3JpemVfdXBncmFkZV93aXRob3V0X2NoZWNrcwAABCRjb2RlX2hhc2ggYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQAABBBjb2RlJAIITHNldF92YWxpZGF0aW9uX2RhdGEAAAgQZGF0YfkDVGluYm91bmRfbWVzc2FnZXNfZGF0YSkEYHN1ZG9fc2VuZF91cHdhcmRfbWVzc2FnZQAABBxtZXNzYWdlJAIEDHNldAAABAxub3cIAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgAAAgQZGVzdFEEFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgAADBhzb3VyY2VRBBBkZXN0UQQUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAgQZGVzdFEEFHZhbHVlCDB0cmFuc2Zlcl9hbGwAAAgQZGVzdFEEKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQAACAx3aG9RBBhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMAAAQMd2hvyQFEZm9yY2Vfc2V0X2JhbGFuY2UAAAgMd2hvUQQgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQAACCRkaXJlY3Rpb25VBBRkZWx0YQgQYnVybgAACBR2YWx1ZQgoa2VlcF9hbGl2ZRQCBCxjbGVhbl91c2FnZQAABBhlbnRpdHmlAQKIGGNyZWF0ZQAADAhpZFUBFGFkbWluUQQsbWluX2JhbGFuY2UIMGZvcmNlX2NyZWF0ZQAAEAhpZFUBFG93bmVyUQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UINHN0YXJ0X2Rlc3Ryb3kAAAQIaWRVAUBkZXN0cm95X2FjY291bnRzAAAECGlkVQFEZGVzdHJveV9hcHByb3ZhbHMAAAQIaWRVAThmaW5pc2hfZGVzdHJveQAABAhpZFUBEG1pbnQAAAwIaWRVASxiZW5lZmljaWFyeVEEGGFtb3VudAgQYnVybgAADAhpZFUBDHdob1EEGGFtb3VudAggdHJhbnNmZXIAAAwIaWRVARh0YXJnZXRRBBhhbW91bnQITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAwIaWRVARh0YXJnZXRRBBhhbW91bnQIOGZvcmNlX3RyYW5zZmVyAAAQCGlkVQEYc291cmNlUQQQZGVzdFEEGGFtb3VudAgYZnJlZXplAAAICGlkVQEMd2hvUQQQdGhhdwAACAhpZFUBDHdob1EEMGZyZWV6ZV9hc3NldAAABAhpZFUBKHRoYXdfYXNzZXQAAAQIaWRVAUh0cmFuc2Zlcl9vd25lcnNoaXAAAAgIaWRVARRvd25lclEEIHNldF90ZWFtAAAQCGlkVQEYaXNzdWVyUQQUYWRtaW5RBBxmcmVlemVyUQQwc2V0X21ldGFkYXRhAAAQCGlkVQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQ4Y2xlYXJfbWV0YWRhdGEAAAQIaWRVAUhmb3JjZV9zZXRfbWV0YWRhdGEAABQIaWRVARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UUGZvcmNlX2NsZWFyX21ldGFkYXRhAAAECGlkVQFIZm9yY2VfYXNzZXRfc3RhdHVzAAAgCGlkVQEUb3duZXJRBBhpc3N1ZXJRBBRhZG1pblEEHGZyZWV6ZXJRBCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQkaXNfZnJvemVuFEBhcHByb3ZlX3RyYW5zZmVyAAAMCGlkVQEgZGVsZWdhdGVRBBhhbW91bnQIPGNhbmNlbF9hcHByb3ZhbAAACAhpZFUBIGRlbGVnYXRlUQRUZm9yY2VfY2FuY2VsX2FwcHJvdmFsAAAMCGlkVQEUb3duZXJRBCBkZWxlZ2F0ZVEERHRyYW5zZmVyX2FwcHJvdmVkAAAQCGlkVQEUb3duZXJRBCxkZXN0aW5hdGlvblEEGGFtb3VudAgUdG91Y2gAAAQIaWRVARhyZWZ1bmQAAAgIaWRVAShhbGxvd19idXJuFDxzZXRfbWluX2JhbGFuY2UAAAgIaWRVASxtaW5fYmFsYW5jZQgsdG91Y2hfb3RoZXIAAAgIaWRVAQx3aG9RBDByZWZ1bmRfb3RoZXIAAAgIaWRVAQx3aG9RBBRibG9jawAACAhpZFUBDHdob1EEMHRyYW5zZmVyX2FsbAAADAhpZFUBEGRlc3RRBChrZWVwX2FsaXZlFDBzZXRfcmVzZXJ2ZXMAAAgIaWRVASByZXNlcnZlc7EBAgwYY3JlYXRlAAAIKGFzc2V0X2tpbmRVARByYXRlCBh1cGRhdGUAAAgoYXNzZXRfa2luZFUBEHJhdGUIGHJlbW92ZQAABChhc3NldF9raW5kVQECJERzZXRfaW52dWxuZXJhYmxlcwAABAxuZXfJAVhzZXRfZGVzaXJlZF9jYW5kaWRhdGVzAAAEDG1heARIc2V0X2NhbmRpZGFjeV9ib25kAAAEEGJvbmQIVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQABBTBsZWF2ZV9pbnRlbnQAAQVAYWRkX2ludnVsbmVyYWJsZQAABAx3aG8ATHJlbW92ZV9pbnZ1bG5lcmFibGUAAAQMd2hvACx1cGRhdGVfYm9uZAAABCxuZXdfZGVwb3NpdAhMdGFrZV9jYW5kaWRhdGVfc2xvdAAACBxkZXBvc2l0CBh0YXJnZXQAAgggc2V0X2tleXMAAAgQa2V5cyAUcHJvb2YkKHB1cmdlX2tleXMAAQUCFFRzdXNwZW5kX3hjbV9leGVjdXRpb24AAQVQcmVzdW1lX3hjbV9leGVjdXRpb24AAQVgdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkAAAEDG5ldwRUdXBkYXRlX2Ryb3BfdGhyZXNob2xkAAAEDG5ldwRcdXBkYXRlX3Jlc3VtZV90aHJlc2hvbGQAAAQMbmV3BAJEEHNlbmQAAAgQZGVzdIECHG1lc3NhZ2VFBTx0ZWxlcG9ydF9hc3NldHMAABAQZGVzdIECLGJlbmVmaWNpYXJ5gQIYYXNzZXRzfQI4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAAAQEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAAAIHG1lc3NhZ2VFBShtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgAACCBsb2NhdGlvblUBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24AAAREbWF5YmVfeGNtX3ZlcnNpb25lA3hmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkAAAQgbG9jYXRpb26BAoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQAABCBsb2NhdGlvboECfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMAABQQZGVzdIECLGJlbmVmaWNpYXJ5gQIYYXNzZXRzfQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdC0CXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAAAUEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQtAkBmb3JjZV9zdXNwZW5zaW9uAAAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAAAUEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQtAjBjbGFpbV9hc3NldHMAAAgYYXNzZXRzfQIsYmVuZWZpY2lhcnmBAox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgAAHBBkZXN0gQIYYXNzZXRzfQJQYXNzZXRzX3RyYW5zZmVyX3R5cGVJBThyZW1vdGVfZmVlc19pZPUESGZlZXNfdHJhbnNmZXJfdHlwZUkFSGN1c3RvbV94Y21fb25fZGVzdEUFMHdlaWdodF9saW1pdC0CUGFkZF9hdXRob3JpemVkX2FsaWFzAAAIHGFsaWFzZXKBAhxleHBpcmVzhQJccmVtb3ZlX2F1dGhvcml6ZWRfYWxpYXMAAAQcYWxpYXNlcoECdHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzAAEFAggkcmVhcF9wYWdlAAAIOG1lc3NhZ2Vfb3JpZ2lukQIocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AAAQOG1lc3NhZ2Vfb3JpZ2lukQIQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCIBRiYXRjaAAABBRjYWxscwUHNGFzX2Rlcml2YXRpdmUAAAgUaW5kZXgEEGNhbGwBByRiYXRjaF9hbGwAAAQUY2FsbHMFByxkaXNwYXRjaF9hcwAACCRhc19vcmlnaW6dARBjYWxsAQcsZm9yY2VfYmF0Y2gAAAQUY2FsbHMFByx3aXRoX3dlaWdodAAACBBjYWxsAQcYd2VpZ2h0GBxpZl9lbHNlAAAIEG1haW4BByBmYWxsYmFjawEHUGRpc3BhdGNoX2FzX2ZhbGxpYmxlAAAIJGFzX29yaWdpbp0BEGNhbGwBBwapAgIUUGFzX211bHRpX3RocmVzaG9sZF8xAAAIRG90aGVyX3NpZ25hdG9yaWVzyQEQY2FsbAEHIGFzX211bHRpAAAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPJATxtYXliZV90aW1lcG9pbnSVBRBjYWxsAQcobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQAAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVzyQE8bWF5YmVfdGltZXBvaW50lQUkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkAABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBJHRpbWVwb2ludKkCJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AAAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPJASRjYWxsX2hhc2ggAhQQc3VkbwAABBBjYWxsAQdUc3Vkb191bmNoZWNrZWRfd2VpZ2h0AAAIEGNhbGwBBxh3ZWlnaHQYHHNldF9rZXkAAAQMbmV3UQQcc3Vkb19hcwAACAx3aG9RBBBjYWxsAQcocmVtb3ZlX2tleQABBQa5AgIsFHByb3h5AAAMEHJlYWxRBEBmb3JjZV9wcm94eV90eXBloQUQY2FsbAEHJGFkZF9wcm94eQAADCBkZWxlZ2F0ZVEEKHByb3h5X3R5cGW5AhRkZWxheQQwcmVtb3ZlX3Byb3h5AAAMIGRlbGVnYXRlUQQocHJveHlfdHlwZbkCFGRlbGF5BDhyZW1vdmVfcHJveGllcwABBSxjcmVhdGVfcHVyZQAADChwcm94eV90eXBluQIUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUAABQcc3Bhd25lclEEKHByb3h5X3R5cGW5AhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAAAIEHJlYWxRBCRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQAAAgQcmVhbFEEJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAAACCBkZWxlZ2F0ZVEEJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAAAQIGRlbGVnYXRlUQQQcmVhbFEEQGZvcmNlX3Byb3h5X3R5cGWhBRBjYWxsAQcwcG9rZV9kZXBvc2l0AAEFBQEMBQEUBQEYBQEcBQEkBQEoBQEsBQEwBQE0BQE4BQE8BQFEBQFIBQFMBQFUBQFYBQFcBQFgBQFkBQFoBQFsBQFwBQF0BQF4BQF8ApgQTm9uZQABBRBSYXcwAZ0CEFJhdzEBBBBSYXcyAb0EEFJhdzMBqQUQUmF3NAEoEFJhdzUBrQUQUmF3NgGxBRBSYXc3AbUFEFJhdzgB5QEQUmF3OQG5BRRSYXcxMAG9BRRSYXcxMQHBBRRSYXcxMgHFBRRSYXcxMwHJBRRSYXcxNAHNBRRSYXcxNQHRBRRSYXcxNgHpARRSYXcxNwHVBRRSYXcxOAHZBRRSYXcxOQHdBRRSYXcyMAElARRSYXcyMQHhBRRSYXcyMgHlBRRSYXcyMwHpBRRSYXcyNAHtBRRSYXcyNQHxBRRSYXcyNgH1BRRSYXcyNwH5BRRSYXcyOAH9BRRSYXcyOQEBBhRSYXczMAEFBhRSYXczMQEJBhRSYXczMgEgLEJsYWtlVHdvMjU2ASAYU2hhMjU2ASAkS2VjY2FrMjU2ASAsU2hhVGhyZWUyNTYBIAYlAQAoHGRpc3BsYXkNBhRsZWdhbA0GDHdlYg0GGG1hdHJpeA0GFGVtYWlsDQY8cGdwX2ZpbmdlcnByaW50EQYUaW1hZ2UNBhx0d2l0dGVyDQYYZ2l0aHViDQYcZGlzY29yZA0GAwgADQYEGQYAAiAcVW5rbm93bgABBRxGZWVQYWlkAQgoUmVhc29uYWJsZQABBSRLbm93bkdvb2QAAQUkT3V0T2ZEYXRlAAEFKExvd1F1YWxpdHkAAQUkRXJyb25lb3VzAAEFIEV4dGVybmFsAAEFBQEBAQUBBQECEBxFZDI1NTE5ASUGHFNyMjU1MTkBJQYURWNkc2EBKQYMRXRoASkGBi0GAgwcVHdpdHRlcgAABCB1c2VybmFtZSQYR2l0aHViAAAEIHVzZXJuYW1lJBxEaXNjb3JkAAAEPGRpc3BsYXlfYW5kX3RhZyQCeDRhZGRfcmVnaXN0cmFyAAAEHGFjY291bnRRBDBzZXRfaWRlbnRpdHkAAAQQaW5mbxUGIHNldF9zdWJzAAAEEHN1YnMdBjhjbGVhcl9pZGVudGl0eQABBURyZXF1ZXN0X2p1ZGdlbWVudAAACCRyZWdfaW5kZXgEHG1heF9mZWUIOGNhbmNlbF9yZXF1ZXN0AAAEJHJlZ19pbmRleAQcc2V0X2ZlZQAACBRpbmRleAQMZmVlCDhzZXRfYWNjb3VudF9pZAAACBRpbmRleAQMbmV3UQQoc2V0X2ZpZWxkcwAACBRpbmRleAQYZmllbGRzCERwcm92aWRlX2p1ZGdlbWVudAAAECRyZWdfaW5kZXgEGHRhcmdldFEEJGp1ZGdlbWVudCEGIGlkZW50aXR5IDRraWxsX2lkZW50aXR5AAAEGHRhcmdldFEEHGFkZF9zdWIAAAgMc3ViUQQQZGF0YQ0GKHJlbmFtZV9zdWIAAAgMc3ViUQQQZGF0YQ0GKHJlbW92ZV9zdWIAAAQMc3ViUQQgcXVpdF9zdWIAAQVYYWRkX3VzZXJuYW1lX2F1dGhvcml0eQAADCRhdXRob3JpdHlRBBhzdWZmaXgkKGFsbG9jYXRpb24EZHJlbW92ZV91c2VybmFtZV9hdXRob3JpdHkAAAgYc3VmZml4JCRhdXRob3JpdHlRBEBzZXRfdXNlcm5hbWVfZm9yAAAQDHdob1EEIHVzZXJuYW1lJCRzaWduYXR1cmUxBjh1c2VfYWxsb2NhdGlvbhQ8YWNjZXB0X3VzZXJuYW1lAAAEIHVzZXJuYW1lJFxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAAABCB1c2VybmFtZSRQc2V0X3ByaW1hcnlfdXNlcm5hbWUAAAQgdXNlcm5hbWUkPHVuYmluZF91c2VybmFtZQAABCB1c2VybmFtZSQ8cmVtb3ZlX3VzZXJuYW1lAAAEIHVzZXJuYW1lJDRraWxsX3VzZXJuYW1lAAAEIHVzZXJuYW1lJFRzZXRfcGVyc29uYWxfaWRlbnRpdHkAAAwcYWNjb3VudAAkc2lnbmF0dXJlLQYgdXNlcm5hbWUkjHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlAAAEKGNyZWRlbnRpYWw1BmhwZXJzb25hbF9jcmVkZW50aWFsX2p1ZGdlZAAADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudMkCXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5AAEFPHJlcG9ydF91c2VybmFtZQAABCB1c2VybmFtZSRgcmVwb3J0ZWRfdXNlcm5hbWVfanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50yQIEYQEAAiAsdW5kZXJfYWxpYXMAAAQQY2FsbAEHRHNldF9hbGlhc19hY2NvdW50AAAIHGFjY291bnQANGNhbGxfdmFsaWRfYXQETHVuc2V0X2FsaWFzX2FjY291bnQAAQVoZm9yY2VfcmVjb2duaXplX3BlcnNvbmhvb2QAAAQYcGVvcGxl0QJcc2V0X3BlcnNvbmFsX2lkX2FjY291bnQAAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdARkdW5zZXRfcGVyc29uYWxfaWRfYWNjb3VudAABBWBjcmVhdGVfcGVvcGxlX2NvbGxlY3Rpb24AAQVYY2xlYW5fdXBfc3RhbGVfYWxpYXNlcwAABBxhbGlhc2VzPQYCRBB2b3RlAAAIKGNhc2VfaW5kZXgEHG9waW5pb27JAihjbG9zZV9jYXNlAAAEKGNhc2VfaW5kZXgEKGNsZWFuX3ZvdGUAAAgoY2FzZV9pbmRleAQUdm90ZXIgJHJlYXBfY2FzZQAABChjYXNlX2luZGV4BCRpbnRlcnZlbmUAAAgoY2FzZV9pbmRleAQcdmVyZGljdMkCKGNsYWltX3ZvdGUAAAQoY2FzZV9pbmRleAQ4cGF5b3V0X3Jld2FyZHMAAAQsZGVzdGluYXRpb24ALGNsYWltX3ZvdGVzAAAEMGNhc2VfaW5kaWNlc9kCSHN0YXJ0X3BheW91dF9yb3VuZAABBVhzY2hlZHVsZV9wYXlvdXRfcm91bmRzAAAMGGFtb3VudAgUY291bnQEGHBlcmlvZARYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleAQwY2xhaW1fY3JlZGl0AAEFMGNsZWFuX3BvaW50cwAACBRyb3VuZAQUdm90ZXIgQGZvcmNlX3JpcGVuX2Nhc2UAAAQoY2FzZV9pbmRleAQodG91Y2hfY2FzZQAABChjYXNlX2luZGV4BFBjbGVhcl92b3RpbmdfcGVuYWx0eQABBURjbGVhbl92b3RlX3NpZ25lZAAACChjYXNlX2luZGV4BBR2b3RlciAFAYEBAhRARGVzaWduZWRFbGVjdGl2ZQAEBAEIRFByb2NlZHVyYWxBY2NvdW50AQRIUHJvY2VkdXJhbFBlcnNvbmFsAQQoUHJvY2VkdXJhbAADCAQEUFByb2NlZHVyYWxEZXJpdmF0aXZlAAMICIUCBKEEAAJYFGFwcGx5AAEFPHN1Ym1pdF9ldmlkZW5jZQAABCBldmlkZW5jZSAYanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50yQJEcmVnaXN0ZXJfcmVmZXJyZWQAAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwSQZUcmVnaXN0ZXJfbm9uX3JlZmVycmVkAAAMDGtleSAsZGVzdGluYXRpb24ASHByb29mX29mX293bmVyc2hpcEkGGHJlcm9sbAABBRhjb21taXQAAAgYY2hvaWNlTQYocmVxdWlyZV9pZIUCNGFsbG9jYXRlX2Z1bGwAAQUcdGltZW91dAAABBxhY2NvdW50ACBmbGFrZW91dAABBVBhcHBseV93aXRoX3NpZ25hdHVyZQAADCByZWZlcnJlcggkc2lnbmF0dXJlLQYYdGlja2V0AFRhcHBseV93aXRoX2ludml0YXRpb24AAAwcaW52aXRlcgAYdGlja2V0ACRzaWduYXR1cmUtBkRhZGRfZGVzaWduX2ZhbWlseQAADBRpbmRleAQQa2luZOECCGlkIExzZXRfcmVmZXJyYWxfdGlja2V0AAAEGHRpY2tldABYY2FuY2VsX3JlZmVycmFsX3RpY2tldAAABBh0aWNrZXQAjHJlZ2lzdGVyX3N1Y2Nlc3NmdWxfcmVmZXJyYWxfcmV3YXJkAAAELGRlc3RpbmF0aW9uADRncmFudF9pbnZpdGVzAAAIHGFjY291bnQAFGNvdW50BJByZW1vdmVfYXZhaWxhYmxlX2FuZF9wZW5kaW5nX2ludml0ZXMAAAgcYWNjb3VudAAUbGltaXQERHNldF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldABQY2FuY2VsX2ludml0ZV90aWNrZXQAAAQYdGlja2V0AERzZXRfY29uZmlndXJhdGlvbgAABBhjb25maWflAmBzZXRfcmVpbWJ1cnNlbWVudF92YWx1ZXMAAAg8cmVmZXJyZWRfdmFsdWVzUQY8cmVmZXJyZXJfdmFsdWVzUQYCCBhQZXJzb24AAQUkTm90UGVyc29uAAEFBFkGAARdBgAADDhnYW1lX3BsYXlfdGltZQQYcm91bmRzBDhtYXhfZ3JvdXBfc2l6ZQQEZQYAABQwcmVnaXN0cmF0aW9uBBxzaHVmZmxlBExwb3N0X3NodWZmbGVfbWFyZ2luBCRyZXBvcnRpbmcEOHBsYXllcl9wcm9jZXNzBAJITHNpZ25fdXBfd2l0aF9pbnZpdGUAAAQ4aWRlbnRpZmllcl9rZXkpBlBzaWduX3VwX3dpdGhfYWNjb3VudAAABDhpZGVudGlmaWVyX2tleSkGSHNpZ25fdXBfd2l0aF9hbGlhcwAADDhpZGVudGlmaWVyX2tleSkGRHN0YXRlbWVudF9hY2NvdW50AAxzaWctBhhyZXBvcnQAAAQsZnVsbF9yZXBvcnRhBiBvZmZib2FyZAABBRxraWNrb3V0AAAEGHBsYXllcgA0Z3JhbnRfaW52aXRlcwAACBxhY2NvdW50ABRjb3VudASQcmVtb3ZlX2F2YWlsYWJsZV9hbmRfcGVuZGluZ19pbnZpdGVzAAAIHGFjY291bnQAFGxpbWl0BERzZXRfaW52aXRlX3RpY2tldAAABBh0aWNrZXQAUGNhbmNlbF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldAA4c2NoZWR1bGVfZ2FtZXMAAAQ8Z2FtZXNfc2NoZWR1bGVzaQZUcmVtb3ZlX3NjaGVkdWxlZF9nYW1lAAAEOGdhbWVfcGxheV90aW1lBDBjbGFpbV9yZXdhcmQAAAQsYmVuZWZpY2lhcnkAQGNsYWltX2dhbWVfcHJpemUAABQccG9vbF9pZAQocmluZ19pbmRleAQgcmV2aXNpb24EFHByb29mjQEsYmVuZWZpY2lhcnkAbHRlc3RuZXRfZm9yY2Vfc3RhcnRfc2h1ZmZsZQABBWx0ZXN0bmV0X2ZvcmNlX2VuZF9yZXBvcnRpbmcAAQVcdGVzdG5ldF9zZXRfZ2FtZV9waGFzZXMAAAQYcGhhc2VzbQZkdGVzdG5ldF9raWxsX2N1cnJlbnRfZ2FtZQABBQMIIEkGBnUGAAxkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZAQYd2luZG93BDhhbGxvd2VkX21pc3NlcwQEfQYAAiBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleARAdHJhbnNpdGlvbl9yb3VuZAAABCxyb3VuZF9pbmRleARQb3BlcmF0ZV9wYXlvdXRfcm91bmQAAAgscm91bmRfaW5kZXgEFGxpbWl0BCBjYXNoX291dAABBTRyZWRlZW1fY3JlZGl0AAAELGRlc3RpbmF0aW9uACByZWdpc3RlcgAABAxrZXl5BmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQAABCBzY2hlZHVsZYEGAwgIIASJBgAECAACICxyZXNlcnZlX2lkcwAABBRjb3VudARQcmVuZXdfaWRfcmVzZXJ2YXRpb24AAAQIaWQIVGNhbmNlbF9pZF9yZXNlcnZhdGlvbgAABAhpZAhQcmVjb2duaXplX3BlcnNvbmhvb2QAAAQwaWRzX2FuZF9rZXlzjQZIc3VzcGVuZF9wZXJzb25ob29kAAAEDGlkc5EGRHJlc3VtZV9wZXJzb25ob29kAAAECGlkCFhzdGFydF9tdXRhdGlvbl9zZXNzaW9uAAEFUGVuZF9tdXRhdGlvbl9zZXNzaW9uAAEFABQkc2lnbmF0dXJlLQYcYWNjb3VudAA4aWRlbnRpZmllcl9rZXkpBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUtAwaZBgIYeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQAACBxhY2NvdW50ABRjb3VudARsY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlAAAEHGFjY291bnQAGGF0dGVzdAAAFCRjYW5kaWRhdGUATGNhbmRpZGF0ZV9zaWduYXR1cmUtBjByaW5nX3ZyZl9rZXkgSHByb29mX29mX293bmVyc2hpcEkGVGNvbnN1bWVyX3JlZ2lzdHJhdGlvbp0GSGRpc3BhdGNoX2FzX3NpZ25lcgAABBBjYWxsAQdEc2V0X2FsaWFzX2FjY291bnQAAAgcYWNjb3VudAA4dmFsaWRfYXRfYmxvY2sETHVuc2V0X2FsaWFzX2FjY291bnQAAQUCCChTdGFuZGFsb25lASQsUmVzZXJ2YXRpb24BJAAIGHBlcmlvZAQMc2VxBAI0UHJlZ2lzdGVyX2xpdGVfcGVyc29uAAAMOGlkZW50aWZpZXJfa2V5KQYgdXNlcm5hbWUkRHJlc2VydmVkX3VzZXJuYW1lLQM8cmVnaXN0ZXJfcGVyc29uAAAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mLQY8dXNlcm5hbWVfY2hvaWNlpQZodG91Y2hfcGVyc29uX2F1dGhvcml6YXRpb24AAQWMcmVtb3ZlX2V4cGlyZWRfdXNlcm5hbWVfcmVzZXJ2YXRpb24AAAggdXNlcm5hbWUkHGFjY291bnQAVHVwZGF0ZV9pZGVudGlmaWVyX2tleQAABDhpZGVudGlmaWVyX2tleSkGhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgAABCBkdXJhdGlvbghMZGVtb3RlX2F1dGhfZXhwaXJlZAAABBxhY2NvdW50AMRzZXRfZnJpZW5kX3JlcXVlc3Rfc3RhdGVtZW50X2FjY291bnRfZm9yX3NlcXVlbmNlAAAIJHJlZmVyZW5jZakGKGFjY291bnRfaWQAlGNsZWFyX2V4cGlyZWRfZnJpZW5kX3JlcXVlc3Rfc2VxdWVuY2UAAAgcYWNjb3VudAAMc2VxBGxzZXRfc3RhdGVtZW50X3N0b3JlX2FjY291bnQAAAwYcGVyaW9kBAxzZXEEOHRhcmdldF9hY2NvdW50AIxjbGVhcl9leHBpcmVkX3N0bXRfc3RvcmVfYWxsb3dhbmNlcwAACBhwZXJpb2QELGZpcnN0X2VudHJ5IFxjbGFpbV9sb25nX3Rlcm1fc3RvcmFnZQAADBhwZXJpb2QEHGNvdW50ZXIEKGFjY291bnRfaWQAnGNsZWFyX2V4cGlyZWRfbG9uZ190ZXJtX3N0b3JhZ2VfYWxpYXNlcwAACBhwZXJpb2QEFGxpbWl0BAIIKGFkZF9jaHVua3MAAAw0cmluZ19leHBvbmVudAUDKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJFRzZXRfY2h1bmtfcGFnZV9oYXNoZXMAAAg0cmluZ19leHBvbmVudAUDLHBhZ2VfaGFzaGVz0QICNCxtZXJnZV9yaW5ncwAADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BExzZXRfb25ib2FyZGluZ19zaXplAAAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQwc2VsZl9pbmNsdWRlAAAMKGlkZW50aWZpZXIgGG1lbWJlciA0Y2FsbF92YWxpZF9hdAhUYnVpbGRfcmluZ19hdXRob3JpemVkAAAUKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgENHJpbmdfZXhwb25lbnQFAyByZXZpc2lvbgQodG9faW5jbHVkZQRob25ib2FyZF9tZW1iZXJzX2F1dGhvcml6ZWQAAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQQaGVhZARwbWVyZ2VfcXVldWVfcGFnZXNfYXV0aG9yaXplZAAADChpZGVudGlmaWVyIDBpbml0aWFsX2hlYWQEIG5ld19oZWFkBIByZW1vdmVfc3VzcGVuZGVkX2tleXNfYXV0aG9yaXplZAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BGxkZWxldGVfcmluZ19wYWdlX2F1dGhvcml6ZWQAAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQocGFnZV9pbmRleASAZW5xdWV1ZV9yaW5nX2RlbGV0aW9uX2F1dGhvcml6ZWQAAAgoaWRlbnRpZmllciAocmluZ19pbmRleAScZGVsZXRlX29uYm9hcmRpbmdfcXVldWVfcGFnZV9hdXRob3JpemVkAAAIKGlkZW50aWZpZXIgKHBhZ2VfaW5kZXgEnGZpbmFsaXplX2NvbGxlY3Rpb25fZGVsZXRpb25fYXV0aG9yaXplZAAABChpZGVudGlmaWVyIGhtYXJrX3Jpbmdfc3RhbGVfYXV0aG9yaXplZAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BHRjbGVhbl91cF9vbGRfcm9vdHNfYXV0aG9yaXplZAAADChpZGVudGlmaWVyIChyaW5nX2luZGV4BBRsaW1pdAQDCATJAQS5BgACDChFeHBlbmRhYmxlAAEFHFByb3RlY3QAAQUgUHJlc2VydmUAAQUAEDBwcmVzZXJ2YXRpb27BBhR2YWx1ZQQobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwSQYExQYAABAUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQcYWxpYXNlc9ECBM0GAAJYFHNwbGl0AAAEKHNwbGl0X2ludG+9BiB0cmFuc2ZlcgAABAh0bwBcbG9hZF9yZWN5Y2xlcl93aXRoX2NvaW4AAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwSQaEbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0AAAQMHByZXNlcnZhdGlvbsEGFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBqBsb2FkX3JlY3ljbGVyX3dpdGhfZXh0ZXJuYWxfYXNzZXRfdW5wYWlkAAAQMHByZXNlcnZhdGlvbsEGFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBrhsb2FkX3JlY3ljbGVyX3dpdGhfZXh0ZXJuYWxfYXNzZXRfdW5wYWlkX2JhdGNoAAAEFGl0ZW1zyQZkdW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbgAAFBxhbGlhc2Vz0QIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AjHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAUHGFsaWFzZXPRAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwCscGF5X2Zvcl9yZWN5Y2xlcl91bmxvYWRfZmVlX3Rva2VuX3dpdGhfY29pbgAACChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBrRwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9uYXRpdmUAAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwSQa0cGF5X2Zvcl9yZWN5Y2xlcl91bmxvYWRfZmVlX3Rva2VuX3dpdGhfc3RhYmxlAAAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcEkGwHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0X2FuZF92b3VjaGVycwAAHBxhbGlhc2Vz0QIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AVGV4dGVybmFsX2Fzc2V0X2Ftb3VudAgwbmV3X3ZvdWNoZXJz3QPEdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBRpbnB1dM0GMGFsaWFzX3Byb29mc5EBCHRvADBmZWVfY3VycmVuY3kRA8h1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBhpbnB1dHPRBjBhbGlhc19wcm9vZnORAQh0bwAwZmVlX2N1cnJlbmN5EQNodW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbnMAABgcYWxpYXNlc9ECFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+9BhxtYXhfZmVlCKBkaXJlY3Rfb2ZmYm9hcmRfY29pbl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAECHRvADhjbGVhbl9yZWN5Y2xlcgAABBR2YWx1ZQRkY2xlYW5fY29uc3VtZWRfZnJlZV90b2tlbgAABBhwZXJpb2QEcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcAAAgYcGVyaW9kBChyaW5nX2luZGV4BExjbGVhbl9yZWN5Y2xlcl9kdXN0AAEFcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAAQWsZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbgAABBhwZXJpb2QEAwggBQME2QYAAhwkc3Vic2NyaWJlAAAMXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkBExtZW1iZXJzX2NvbGxlY3Rpb25z3QYwcGFsbGV0X2luZGV4BCx1bnN1YnNjcmliZQAABFxzdWJzY3JpYmVyX3BhcmFjaGFpbl9pZGUDOHJlcXVlc3RfcmVwbGF5AAAMXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkBChpZGVudGlmaWVyIERyaW5nX3Jvb3RfaW5kaWNlc9kCPGVucXVldWVfdXBkYXRlcwAABCRzZW5kX3BhZ2UEKHNlbmRfYmF0Y2gAAAgccGFyYV9pZAQgc2VxdWVuY2UIOHNlbmRfaW5pdF9wYWdlAAAMHHBhcmFfaWQEYGN1cnJlbnRfY29sbGVjdGlvbl9pbmRleARAYWZ0ZXJfcmluZ19pbmRleGUDTGFiYW5kb25fc3R1Y2tfYmF0Y2gAAQUCBHhzZXRfYWlyZHJvcF9zY2hlZHVsaW5nX2VuYWJsZWQAAAQcZW5hYmxlZBQCDDxvcGVuX3ByaXplX3Bvb2wAABwYdGFyZ2V0JQMoZGlzcGF0Y2hlcgAgdmFsaWRpdHkEKG51bV9wcml6ZXMELHByaXplX3ZhbHVlCCBhc3NldF9pZFUBMHdpbm5lcl9yYXRpbwQsY2xhaW1fcHJpemUAABgccG9vbF9pZAQocmluZ19pbmRleAQgcmV2aXNpb24EFHByb29mjQEUYWxpYXMgLGJlbmVmaWNpYXJ5AEBjbG9zZV9wcml6ZV9wb29sAAAEHHBvb2xfaWQEAAwUaW5kZXgEMGlubmVyX2N1cnNvci0DKHN0YXJ0ZWRfYXQEAggYQWN0aXZlAe0GFFN0dWNrAAEFBvEGAgggU3BlY2lmaWMBhQMgV2lsZGNhcmQAAAgUbGltaXRlAzxwcmV2aW91c19jdXJzb3ItAwIQQGZvcmNlX3NldF9jdXJzb3IAAAQYY3Vyc29y9QZcZm9yY2Vfc2V0X2FjdGl2ZV9jdXJzb3IAAAwUaW5kZXgEMGlubmVyX2N1cnNvci0DKHN0YXJ0ZWRfYXRlA0hmb3JjZV9vbmJvYXJkX21ibXMAAQU4Y2xlYXJfaGlzdG9yaWMAAAQgc2VsZWN0b3L5BgKIGFN5c3RlbQFhBTxQYXJhY2hhaW5TeXN0ZW0BZQUkVGltZXN0YW1wAWkFNFBhcmFjaGFpbkluZm8BnQIgQmFsYW5jZXMBbQVET3JpZ2luUmVzdHJpY3Rpb24BcQUYQXNzZXRzAXUFJEFzc2V0UmF0ZQF5BURDb2xsYXRvclNlbGVjdGlvbgF9BRxTZXNzaW9uAYEFJFhjbXBRdWV1ZQGFBSxQb2xrYWRvdFhjbQGJBShDdW11bHVzWGNtAZ0CME1lc3NhZ2VRdWV1ZQGNBRxVdGlsaXR5AZEFIE11bHRpc2lnAZkFEFN1ZG8BnQUUUHJveHkBpQUgSWRlbnRpdHkBOQYYUGVvcGxlAUEGHE1vYlJ1bGUBRQYoUHJvb2ZPZkluawFVBhBHYW1lAXEGFFNjb3JlAYUGIER1bW15RGltAZUGKFBlb3BsZUxpdGUBoQYkUmVzb3VyY2VzAa0GNENodW5rc01hbmFnZXIBsQYcTWVtYmVycwG1BhxDb2luYWdlAdUGPE1lbWJlcnNOb3RpZmllcgHhBlRTdG9yYWdlSW5pdGlhbGl6YXRpb24B5QYcQWlyZHJvcAHpBlBNdWx0aUJsb2NrTWlncmF0aW9ucwH9BgQBBwAAEBB3aGVuqQIcZGVwb3NpdAgkZGVwb3NpdG9yACRhcHByb3ZhbHPJAQAMIGRlbGVnYXRlAChwcm94eV90eXBluQIUZGVsYXkEBA0HAAMIEQcIAAwQcmVhbAAkY2FsbF9oYXNoIBhoZWlnaHQEBBkHAAMIHQcIAwgEIQYEJQcAAAwoanVkZ2VtZW50cykHHGRlcG9zaXQIEGluZm8VBgMICMkBAAwcYWNjb3VudAAMZmVlCBhmaWVsZHMIBjUHBDkHAAAIKGFjY291bnRfaWQAKGFsbG9jYXRpb24EAgwoQWxsb2NhdGlvbgABBUBBdXRob3JpdHlEZXBvc2l0AQgYU3lzdGVtAAEFAAgUb3duZXIAIHByb3ZpZGVyRQcDDAAERQcDCDUGBARRBwAAEBxhY2NvdW50AEhwZW5kaW5nX2p1ZGdlbWVudHNVBxhiYW5uZWQUZHVzZXJuYW1lX2xhc3RfcmVwb3J0ZWRfYXRlAwAMIHJlcG9ydGVyACB1c2VybmFtZSQcY2FzZV9pZAQACAxrZXkgHGFjY291bnSxAgAQFHZvdGVkBBxjbGVhbmVkBBxjb3JyZWN0BBhjcmVkaXQIAhBARGVzaWduZWRFbGVjdGl2ZQAEBAEIRFByb2NlZHVyYWxBY2NvdW50AAMIBCBIUHJvY2VkdXJhbFBlcnNvbmFsAAMIBAgoUHJvY2VkdXJhbAADCAQoAgwoUHJvb2ZPZkluawAADBhkZXNpZ25pByBldmlkZW5jZSBMcHJvYmFibGVfYWNjZXB0YWJsZRRISWRlbnRpdHlDcmVkZW50aWFsAAAIIHBsYXRmb3JtNQYgZXZpZGVuY2UkNFVzZXJuYW1lVmFsaWQAAAQgdXNlcm5hbWUkAAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BAAMJHN0YXRlbWVudG0HHGNvbnRleHQkIGNhbGxiYWNrcQcADAxheWUEDG5heQQgY29udGVtcHQEAAwUc2luY2UIHGRldGFpbHN1BxR0YWxseXkHAAgcZGV0YWlsc3UHHHZlcmRpY3TJAgAIFHNpbmNlCBx2ZXJkaWN0yQIAFBRyb3VuZAQ8aW5pdGlhbF9iYWxhbmNlCERyZW1haW5pbmdfYmFsYW5jZQgwdG90YWxfcG9pbnRzCBRzdGFydAQADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIGHBlcmlvZAQEjQcAAgwgUmVmZXJyZWQBCBxEZXBvc2l0AQgcSW52aXRlZAEAAgwcSW5pdGlhbAABBSBJbml0RG9uZQABBRBGdWxsAAEFAgwcQXBwbGllZAAADBBjcmVklQccZW50cm9weSA0ZW50cm9weV9zaW5jZQQgU2VsZWN0ZWQAACAUc2luY2UEEGNyZWSVByByZXNlcnZlZAgcZW50cm9weSAYZGVzaWduaQcoYWxsb2NhdGlvbpkHHGp1ZGdpbmdlAxhmYWlsZWQEGFByb3ZlbgAAEBhkZXNpZ25pByByZXNlcnZlZAgwd2FzX3JlZmVycmVkFCx3YXNfaW52aXRlZBQGaQcAJBhkZXNpZ26hB0BhY3RpdmVfcmVmZXJyYWxzyQFgYWxsb3dlZF9yZWZlcnJhbF90aWNrZXRzBDRiYWRfcmVmZXJyYWxzBFBzdWNjZXNzZnVsX3JlZmVycmFscwQkcmVmZXJyYWxzBCxkZXJpdmF0aXZlcwQYYmFubmVkFGBwZW5kaW5nX3JlZmVycmFsX3Jld2FyZHMEAAgQa2luZOECCGlkIAIIIFJlc2VydmVkAAEFJENvbW1pdHRlZAABBQQAAQgDCO0CIAIIIEtpY2thYmxlAAAIKGZpcnN0X2dhbWUEOGFyY2hpdmVkX3NpbmNlBChVbmtpY2thYmxlAAAEKGZpcnN0X2dhbWUEAAwoYXR0ZW5kYW5jZRRUZXh0ZXJuYWxseV9yZWNvZ25pemVkFCh6ZXJvX3Njb3JlFAa9BwIMHEludml0ZWQAAQUoUmVjb2duaXplZAABBRxEZXBvc2l0AQgAJChmaXJzdF9nYW1lBChyZWdpc3RlcmVkFCxzZW50X3JlcG9ydBRoZWFybHlfYXR0ZW5kYW5jZV9lbmFjdG1lbnTBByh5ZXNfcGVyc29uBDRub19ub3RfcGVyc29uBGBleHBlY3RlZF9tYXhfdm90ZV93ZWlnaHQELHZvdGVfd2VpZ2h0BCxjcmVkaWJpbGl0ecUHBu0CAhAsU3RlcDFJbnNlcnQAAAQ4bGFzdF9pdGVyYXRpb27NBzRTdGVwMlJldHJpZXZlAAAIRG5leHRfcGxheWVyX2luZGV4BExyZWNvZ25pemVkX2ZpbmlzaGVkFExTdGVwM0NvbXB1dGVXZWlnaHRzAAAIOGxhc3RfaXRlcmF0aW9uzQcwcGxheWVyX2NvdW50BERTdGVwNEF3YWl0U2Vzc2lvbgAABDBwbGF5ZXJfY291bnQEAhQwUmVnaXN0cmF0aW9uAAAERG5leHRfcGxheWVyX2luZGV4BBxTaHVmZmxlAAAEEHN0ZXDRByRSZXBvcnRpbmcAAAQwcGxheWVyX2NvdW50BDRQbGF5ZXJQcm9jZXNzAAAIOGxhc3RfaXRlcmF0aW9uzQcwcGxheWVyX2NvdW50BChDYW5jZWxsaW5nAAAEOGxhc3RfaXRlcmF0aW9uzQcAJBRpbmRleAREcmVnaXN0cmF0aW9uX2VuZHMEQHNodWZmbGVfZGVhZGxpbmUEJGdhbWVfZGF0ZQQscmVwb3J0X2VuZHMEFHN0YXRl1Qc4bWF4X2dyb3VwX3NpemUEGHJvdW5kcwRIcGVuZGluZ19hdHRlbmRhbmNlBAAIKGdhbWVfaW5kZXgEKHJhbmRvbW5lc3MgAgggRWxpZ2libGUBBBxDbGFpbWVkAAEFAgggQXR0ZW5kZWQBBBhBYnNlbnQBBAIQUEV4dGVybmFsbHlSZWNvZ25pemVkAAEFNE5vdFJlY29nbml6ZWQAAQUkU3VzcGVuZGVkAQgoUmVjb2duaXplZAEIACAUc2NvcmUEGHN0cmVha+UHSGF0dGVuZGFuY2VfaGlzdG9yeQQYY3JlZGl0CChjYXNoZWRfb3V0FEhyZWFjaGVkX3BlcnNvbmhvb2QUbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZBQscmVjb2duaXRpb27pBwMIBO0CABBEcmVtYWluaW5nX2JhbGFuY2UILHBvaW50X3ByaWNlCCRyZW1haW5kZXIIMHRvdGFsX3BvaW50cwQACCRmaW5pc2hfYXQEGGNyZWRpdAgADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIIGR1cmF0aW9uBAT9BwAACAxrZXkgJHN1c3BlbmRlZBQCBDBVbmlxdWVEZXZpY2UBAAAIMHJpbmdfdnJmX2tleSAYbWV0aG9kCQgCCBBMaXRlAAEFGFBlcnNvbgAADBRhbGlhcyAsbGFzdF91cGRhdGUIHGRlbW90ZWQUABA4aWRlbnRpZmllcl9rZXkpBjRmdWxsX3VzZXJuYW1lLQM0bGl0ZV91c2VybmFtZSQsY3JlZGliaWxpdHkRCAMIKCAADChhY2NvdW50X2lkAAxzZXEEFHNpbmNlCAMMKAQgAwgAIQgACChhY2NvdW50X2lkACRyZWZlcmVuY2WpBgAIHGFjY291bnQAJGpvaW5lZF9hdAgELQgAAAgkbWF4X2NvdW50BCBtYXhfc2l6ZQQDCAUDBARJBgACCCBFeHRlcm5hbAFVARRMb2NhbAEAAggoQXBwZW5kT25seQABBSBGbGV4aWJsZQABBQAQFG93bmVyQQgQbW9kZUUIJHJpbmdfc2l6ZQUDUHNlbGZfaW5jbHVzaW9uX2RlbGF5hQIDCCAEBQEBDAUBQQ0ADBByb290UQggcmV2aXNpb24EMGludGVybWVkaWF0ZVUIAwwgBCgACBByb290UQgsYXJjaGl2ZWRfYXQIAwwgBAQADBR0b3RhbAQgaW5jbHVkZWQEPGltbXV0YWJsZV9zaW5jZYUCBCABCAIMKE9uYm9hcmRpbmcAAAgocXVldWVfcGFnZQQkcXVldWVkX2F0CCBJbmNsdWRlZAAADChyaW5nX2luZGV4BCRyaW5nX3BhZ2UENHJpbmdfcG9zaXRpb24EJFN1c3BlbmRlZAABBQIIKEFwcGVuZE9ubHkAAQUgTXV0YXRpbmcBBAIEOEZhaWxlZERpc3BhdGNoAAAEHHJldHJpZXMEAAgYcmVhc29ueQgUdW50aWwIAwwEBCAEZQMBCAZpCAaJAQAMLGNvbGxlY3Rpb25z3QZIbGFzdF9pbml0X3NlcXVlbmNlCDBwYWxsZXRfaW5kZXgEAAwod3JpdGVfcGFnZQQkc2VuZF9wYWdlBERsYXN0X3VwZGF0ZV9ibG9jawQDDAQgBAAYLGNvbGxlY3Rpb25z3QZgY3VycmVudF9jb2xsZWN0aW9uX2luZGV4BEBhZnRlcl9yaW5nX2luZGV4ZQMgc2VxdWVuY2UILHNvdXJjZV90aW1lCDBwYWxsZXRfaW5kZXgEABAgc2VxdWVuY2UILHNvdXJjZV90aW1lCCRzZWFsZWRfYXQEVHJlbWFpbmluZ19zdWJzY3JpYmVycwQCICBJbmFjdGl2ZQABBTRDcmVhdGluZ0Fzc2V0AAEFQFhjbUZ1bmRzVHJhbnNmZXIAAQU4VmVyaWZ5aW5nRnVuZHMAAQUsRnVuZGluZ1BvdHMAAQVgU2NoZWR1bGluZ01vYlJ1bGVQYXlvdXRzAAEFWFNjaGVkdWxpbmdTY29yZVBheW91dHMAAQVMT3BlbmluZ0FpcmRyb3BQb29scwABBQIIIEluYWN0aXZlAAEFJENvbXBsZXRlZAABBQQIARAAIAhpZAQYdGFyZ2V0JQMoZGlzcGF0Y2hlcgAoZXhwaXJlc19hdAhAcHJpemVzX3JlbWFpbmluZwQscHJpemVfdmFsdWUIIGFzc2V0X2lkVQFAdGFyZ2V0X3RocmVzaG9sZK0IAgwMWWVzAAEFCE5vAAEFFFN0dWNrAAEFABBEY3VycmVudF9taWdyYXRpb24EQHRvdGFsX21pZ3JhdGlvbnMEXGN1cnJlbnRfbWlncmF0aW9uX3N0ZXBzBGxjdXJyZW50X21pZ3JhdGlvbl9tYXhfc3RlcHNlAwa5CAAMHG9uZ29pbme1CCBwcm9ncmVzc70IIHByZWZpeGVzhQMACBhoZWFkZXLxAyhleHRyaW5zaWNzhQMCCDRBbGxFeHRyaW5zaWNzAAEFNE9ubHlJbmhlcmVudHMAAQUACBhwcmVmaXjpARhzdWZmaXjpAQIMOE5vdEltcGxlbWVudGVkAAEFIE5vdEZvdW5kAc0IFENvZGVjAAEFByTRCAI0EENhbGwAAQUcUGF5bWVudAABBRhGdXR1cmUAAQUUU3RhbGUAAQUgQmFkUHJvb2YAAQVEQW5jaWVudEJpcnRoQmxvY2sAAQVERXhoYXVzdHNSZXNvdXJjZXMAAQUYQ3VzdG9tAQQwQmFkTWFuZGF0b3J5AAEFTE1hbmRhdG9yeVZhbGlkYXRpb24AAQUkQmFkU2lnbmVyAAEFVEluZGV0ZXJtaW5hdGVJbXBsaWNpdAABBTRVbmtub3duT3JpZ2luAAEFAgwwQ2Fubm90TG9va3VwAAEFTE5vVW5zaWduZWRWYWxpZGF0b3IAAQUYQ3VzdG9tAQQCCBxJbnZhbGlkAdkIHFVua25vd24B3QgHoQLhCAMI5QEkBOkIAAAMEG9rYXkULGZhdGFsX2Vycm9yFBhlcnJvcnPtCAIMHEluQmxvY2sAAQUUTG9jYWwAAQUgRXh0ZXJuYWwAAQUAFCBwcmlvcml0eQggcmVxdWlyZXOFAyBwcm92aWRlc4UDJGxvbmdldml0eQgkcHJvcGFnYXRlFAf5COEIAAgQa2V5cyQUcHJvb2YkAwgkKAQFCQAGCQkADBh3ZWlnaHQYFGNsYXNzOCxwYXJ0aWFsX2ZlZQgADCBiYXNlX2ZlZQgcbGVuX2ZlZQhMYWRqdXN0ZWRfd2VpZ2h0X2ZlZQgGFQkACDRpbmNsdXNpb25fZmVlGQkMdGlwCAT1BAACGDRVbmltcGxlbWVudGVkAAEFZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFNEFzc2V0Tm90Rm91bmQAAQUoVW5yb3V0YWJsZQABBQchCSUJBxglCQcIJQkHfQIlCQAINGFjdHVhbF93ZWlnaHQZAiBwYXlzX2ZlZTwACCRwb3N0X2luZm85CRRlcnJvctgHOQk9CQQ1AwAGRQUERQUAAwiBAk0JBFEJAAAQQGV4ZWN1dGlvbl9yZXN1bHRBCThlbWl0dGVkX2V2ZW50c0UJJGxvY2FsX3hjbUkJOGZvcndhcmRlZF94Y21zVQkCCDRVbmltcGxlbWVudGVkAAEFZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQUHWQldCQAMQGV4ZWN1dGlvbl9yZXN1bHThAThlbWl0dGVkX2V2ZW50c0UJOGZvcndhcmRlZF94Y21zVQkHZQldCQIILFVuc3VwcG9ydGVkAAEFZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQUHAG0JABg8dXB3YXJkX21lc3NhZ2VzhQNMaG9yaXpvbnRhbF9tZXNzYWdlc+kDTG5ld192YWxpZGF0aW9uX2NvZGUtA2xwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMEOGhybXBfd2F0ZXJtYXJrBCRoZWFkX2RhdGEkB50CSQMGSQMESQMA"; + +export { content as default }; diff --git a/packages/host-papp/.papi/descriptors/dist/metadataTypes-DOUrKMCQ.js b/packages/host-papp/.papi/descriptors/dist/metadataTypes-DOUrKMCQ.js deleted file mode 100644 index 83aa82f6..00000000 --- a/packages/host-papp/.papi/descriptors/dist/metadataTypes-DOUrKMCQ.js +++ /dev/null @@ -1,3 +0,0 @@ -const content = "eQkAAAAQAQEFAAQBAQUAFAEBBQAcAAQAIAAEACQBAQUAIAEBBQAwAQEFAC0DACAANQMBAQUAPQMBAQUANAEBBQBBAwEBBQAYAQEFAE0DAQEFAFEDAQEFAFUDAQEFAGEDAQAEGHJlbWFyayQBAQUBAAQUcGFnZXMIAQEFAQAEEGNvZGUkAQEFAQAEFGl0ZW1zaQMBAQUBAAQQa2V5c20DAQEFAQAIGHByZWZpeCQcc3Via2V5cwQBAQUBAAQkY29kZV9oYXNoIAEBBQEBBQEABDRkaXNwYXRjaF9pbmZvQAEBBQEACDhkaXNwYXRjaF9lcnJvctQ0ZGlzcGF0Y2hfaW5mb0ABAQUBAQUBAQUBAAQcYWNjb3VudAABAQUBAAgYc2VuZGVyABBoYXNoIAEBBQEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAQEFAQAIJGNvZGVfaGFzaCAUZXJyb3LUAQEFAQEFAQEFAI0DAQEFAJUDAQEFACQBAQUAmQMBAQUAoQMBAQUAhQMBAQUAbQMBAQUAtQMBAQUAvQMBAQUAxQMBAQUAyQMBAQUA0QMBAQUACAEACBBkYXRh3QNUaW5ib3VuZF9tZXNzYWdlc19kYXRhDQQBAQUBAAQcbWVzc2FnZSQBAQUBAQUBAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBAEBBQEABBRjb3VudAQBAQUBAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIAEBBQEABDBtZXNzYWdlX2hhc2jcAQAEDG5vdwgBAQUAAAAMAAAAGQQAAAAhBAAAACkEAAAAMQQBAAgQZGVzdDUEFHZhbHVlCAEBBQEADBhzb3VyY2U1BBBkZXN0NQQUdmFsdWUIAQEFAQAIEGRlc3Q1BChrZWVwX2FsaXZlFAEBBQEACAx3aG81BBhhbW91bnQIAQEFAQAEDHdob70BAQEFAQAIDHdobzUEIG5ld19mcmVlCAEBBQEACCRkaXJlY3Rpb245BBRkZWx0YQgBAQUBAAgUdmFsdWUIKGtlZXBfYWxpdmUUAQEFAQEFAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQgBAQUBAAgcYWNjb3VudAAYYW1vdW50CAEBBQEADBBmcm9tAAh0bwAYYW1vdW50CAEBBQEACAx3aG8AEGZyZWUIAQEFAQAIDHdobwAYYW1vdW50CAEBBQEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPkAQEFAQAEGGFtb3VudAgBAQUBAAQMd2hvAAEBBQEACAxvbGQIDG5ldwgBAQUBAAwYcmVhc29uBQEMd2hvABhhbW91bnQIAQEFAQAQGHJlYXNvbgUBGHNvdXJjZQAQZGVzdAAYYW1vdW50CAEBBQEAEBhyZWFzb24FARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCAEBBQAJAQEBBQA9BAEBBQEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgBAQUBAAQYb3JpZ2lukQEAmQEAQQQBAAQYZW50aXR5mQEBAQUBAQUBAAQYZW50aXR5mQEAUQEASQQATQQAWQQAXQQAYQQAUQEAZQQAUQEApQEBAQUAUQEBAwRRAQBpBAEDCABRAQB5AgEDBFEBAG0EAQMEUQEApQEBAAwIaWRRARRhZG1pbjUELG1pbl9iYWxhbmNlCAEBBQEAEAhpZFEBFG93bmVyNQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UIAQEFAQAECGlkUQEBAQUBAAwIaWRRASxiZW5lZmljaWFyeTUEGGFtb3VudAgBAQUBAAwIaWRRAQx3aG81BBhhbW91bnQIAQEFAQAMCGlkUQEYdGFyZ2V0NQQYYW1vdW50CAEBBQEAEAhpZFEBGHNvdXJjZTUEEGRlc3Q1BBhhbW91bnQIAQEFAQAICGlkUQEMd2hvNQQBAQUBAAgIaWRRARRvd25lcjUEAQEFAQAQCGlkUQEYaXNzdWVyNQQUYWRtaW41BBxmcmVlemVyNQQBAQUBABAIaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBAEBBQEAFAhpZFEBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQBAQUBACAIaWRRARRvd25lcjUEGGlzc3VlcjUEFGFkbWluNQQcZnJlZXplcjUELG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCRpc19mcm96ZW4UAQEFAQAMCGlkUQEgZGVsZWdhdGU1BBhhbW91bnQIAQEFAQAICGlkUQEgZGVsZWdhdGU1BAEBBQEADAhpZFEBFG93bmVyNQQgZGVsZWdhdGU1BAEBBQEAEAhpZFEBFG93bmVyNQQsZGVzdGluYXRpb241BBhhbW91bnQIAQEFAQAICGlkUQEoYWxsb3dfYnVybhQBAQUBAAgIaWRRASxtaW5fYmFsYW5jZQgBAQUBAAwIaWRRARBkZXN0NQQoa2VlcF9hbGl2ZRQBAQUBAAgIaWRRASByZXNlcnZlc6UBAQEFAQEFAQAMIGFzc2V0X2lkUQEcY3JlYXRvcgAUb3duZXIAAQEFAQAMIGFzc2V0X2lkUQEUb3duZXIAGGFtb3VudAgBAQUBABAgYXNzZXRfaWRRARBmcm9tAAh0bwAYYW1vdW50CAEBBQEADCBhc3NldF9pZFEBFG93bmVyABxiYWxhbmNlCAEBBQEAECBhc3NldF9pZFEBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAAQEFAQAIIGFzc2V0X2lkUQEUb3duZXIAAQEFAQAIIGFzc2V0X2lkUQEMd2hvAAEBBQEABCBhc3NldF9pZFEBAQEFAQAMIGFzc2V0X2lkUQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcEAQEFAQAMIGFzc2V0X2lkUQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwQBAQUBABQgYXNzZXRfaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UAQEFAQAQIGFzc2V0X2lkUQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CAEBBQEADCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQABAQUBABQgYXNzZXRfaWRRARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAIIGFzc2V0X2lkUQE8bmV3X21pbl9iYWxhbmNlCAEBBQEADCBhc3NldF9pZFEBDHdobwAkZGVwb3NpdG9yAAEBBQEADCBhc3NldF9pZFEBDHdobwAYYW1vdW50CAEBBQEACCBhc3NldF9pZFEBIHJlc2VydmVzpQEATQQAKQQATQQACAEBBQEAEAx3aG8AIGFzc2V0X2lkUQEYcmVhc29uBQEYYW1vdW50CABRAQAIAQAIKGFzc2V0X2tpbmRRARByYXRlCAEBBQEABChhc3NldF9raW5kUQEBAQUBAQUBAAgoYXNzZXRfa2luZFEBEHJhdGUIAQEFAQAEKGFzc2V0X2tpbmRRAQEBBQEADChhc3NldF9raW5kUQEMb2xkCAxuZXcIAQEFAQAQDHdobwAoYWN0dWFsX2ZlZQgMdGlwCCBhc3NldF9pZLUBAQEFAAABAQUAvQEBAQUAdQQAAAAEAQEFANkBAQAEDG5ld70BAQEFAQAEDG1heAQBAQUBAAQQYm9uZAgBAQUBAQUBAQUBAAQMd2hvAAEBBQEABCxuZXdfZGVwb3NpdAgBAQUBAAgcZGVwb3NpdAgYdGFyZ2V0AAEBBQEBBQEABDRpbnZ1bG5lcmFibGVzvQEBAQUBAAQoYWNjb3VudF9pZAABAQUBAARIZGVzaXJlZF9jYW5kaWRhdGVzBAEBBQEABCxib25kX2Ftb3VudAgBAQUBAAgoYWNjb3VudF9pZAAcZGVwb3NpdAgBAQUBAAwMb2xkAAxuZXcAHGRlcG9zaXQIAQEFAH0EAQEFADUDAAAAIACBBAAAAQAIEGtleXMgFHByb29mJAEBBQEBBQEABDRzZXNzaW9uX2luZGV4BAEBBQEABCR2YWxpZGF0b3IAAQEFAMUCAQEFAIUEAQEFAM0CAQEFAJEEAJUEACQBAQUAmQQABAAIAQAEDG5ldwQBAQUBAQUBAAQwbWVzc2FnZV9oYXNoIAAIAMEEACAABADFBAAEAMUEAAgAxQQAyQQBAQUA0QQBAQUA1QQA3QQA6QQAAADxBAEBBQBBAgB1AgD9BAEBBQBNAQEACBBkZXN0dQIcbWVzc2FnZSkFAQEFAQAQEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlKQUobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb25RARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbpEDAQEFAQAEIGxvY2F0aW9udQIBAQUBABQQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdCECAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzcQIsYmVuZWZpY2lhcnl1AgEBBQEAHBBkZXN0dQIYYXNzZXRzcQJQYXNzZXRzX3RyYW5zZmVyX3R5cGUtBThyZW1vdGVfZmVlc19pZNkESGZlZXNfdHJhbnNmZXJfdHlwZS0FSGN1c3RvbV94Y21fb25fZGVzdCkFMHdlaWdodF9saW1pdCECAQEFAQAIHGFsaWFzZXJ1AhxleHBpcmVzeQIBAQUBAAQcYWxpYXNlcnUCAQEFAQEFAQAEHG91dGNvbWXVAQEBBQEAEBhvcmlnaW5RASxkZXN0aW5hdGlvblEBHG1lc3NhZ2VBAihtZXNzYWdlX2lkIAEBBQEAEBhvcmlnaW5RASxkZXN0aW5hdGlvblEBFGVycm9yRQIobWVzc2FnZV9pZCABAQUBAAwYb3JpZ2luUQEUZXJyb3LNAShtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW5RASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNlBQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2luUQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9utQEBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpblEBGGFzc2V0c3ECAQEFAQAQLGRlc3RpbmF0aW9uUQEYcmVzdWx0BBBjb3N07QEobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb25RARx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvblEBIHF1ZXJ5X2lkCBRlcnJvcs0BAQEFAQAIIGxvY2F0aW9udQIgcXVlcnlfaWQIAQEFAQAQGG9yaWdpblEBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyUQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXK1AQEBBQEADCxkZXN0aW5hdGlvblEBEGNvc3TtAShtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmdRARBmZWVz7QEBAQUBAAQcdmVyc2lvbgQBAQUBAAwcYWxpYXNlclEBGHRhcmdldFEBGGV4cGlyeXkCAQEFAQAIHGFsaWFzZXJRARh0YXJnZXRRAQEBBQEABBh0YXJnZXRRAQEBBQEACBRpbmRleAQUZXJyb3JsAQEFACABAQUBAwgg1QEAhQIAOQUBAQUAhQIAPQUAQQUBAQUADQIBAAg4bWVzc2FnZV9vcmlnaW6FAihwYWdlX2luZGV4BAEBBQEAEDhtZXNzYWdlX29yaWdpboUCEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYAQEFAQEFAQAMCGlkIBhvcmlnaW6FAhRlcnJvcokCAQEFAQAQCGlkIBhvcmlnaW6FAix3ZWlnaHRfdXNlZBgcc3VjY2VzcxQBAQUBABAIaWQgGG9yaWdpboUCKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEAQEFAQAIGG9yaWdpboUCFGluZGV4BAEABBRjYWxsc80GAQEFAQAIFGluZGV4BBBjYWxsyQYBAQUBAAgkYXNfb3JpZ2lukQEQY2FsbMkGAQEFAQAIEGNhbGzJBhh3ZWlnaHQYAQEFAQAIEG1haW7JBiBmYWxsYmFja8kGAQEFAQEFAQAIFGluZGV4BBRlcnJvctQBAQUBAAQUZXJyb3LUAQEFAQAEGHJlc3VsdJUCAQEFAQAEKG1haW5fZXJyb3LUAHkEANEGAQAIRG90aGVyX3NpZ25hdG9yaWVzvQEQY2FsbMkGAQEFAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ATxtYXliZV90aW1lcG9pbnR5BRBjYWxsyQYobWF4X3dlaWdodBgBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BPG1heWJlX3RpbWVwb2ludHkFJGNhbGxfaGFzaCAobWF4X3dlaWdodBgBAQUBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJHRpbWVwb2ludJ0CJGNhbGxfaGFzaCABAQUBAAwkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJGNhbGxfaGFzaCABAQUBAQUBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIAEBBQEAECRhcHByb3ZpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAUJGFwcHJvdmluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0lQIBAQUBABAoY2FuY2VsbGluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABAMd2hvACRjYWxsX2hhc2ggLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAQQY2FsbMkGAQEFAQAEDG5ldzUEAQEFAQAIDHdobzUEEGNhbGzJBgEBBQEBBQEABCxzdWRvX3Jlc3VsdJUCAQEFAQAIDG9sZKUCDG5ldwAAAADdBgAAAOkGAQMIyQatAgAUAQMIrQKtAgAUAQAMEHJlYWw1BEBmb3JjZV9wcm94eV90eXBlhQUQY2FsbMkGAQEFAQAMIGRlbGVnYXRlNQQocHJveHlfdHlwZa0CFGRlbGF5BAEBBQEADChwcm94eV90eXBlrQIUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVyNQQocHJveHlfdHlwZa0CFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBAAgQcmVhbDUEJGNhbGxfaGFzaCABAQUBAAggZGVsZWdhdGU1BCRjYWxsX2hhc2ggAQEFAQAQIGRlbGVnYXRlNQQQcmVhbDUEQGZvcmNlX3Byb3h5X3R5cGWFBRBjYWxsyQYBAQUBAQUBABgQcHVyZQAMd2hvAChwcm94eV90eXBlrQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEAQEFAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGWtAlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtAhRkZWxheQQBAQUBABAMd2hvABBraW5ksQIsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAAAAPUGAAAAJAAAAP0FAAAA+QYBAQUABQcAJAAJBwAkABEHACQAFQcAJAAEACAAIQcAIAAlBwEABBxhY2NvdW50NQQBAQUBAAQQaW5mb/kFAQEFAQAEEHN1YnMBBgEBBQEACCRyZWdfaW5kZXgEHG1heF9mZWUIAQEFAQAEJHJlZ19pbmRleAQBAQUBAAgUaW5kZXgEDGZlZQgBAQUBAAgUaW5kZXgEDG5ldzUEAQEFAQAIFGluZGV4BBhmaWVsZHMIAQEFAQAQJHJlZ19pbmRleAQYdGFyZ2V0NQQkanVkZ2VtZW50BQYgaWRlbnRpdHkgAQEFAQAEGHRhcmdldDUEAQEFAQAIDHN1YjUEEGRhdGHxBQEBBQEABAxzdWI1BAEBBQEADCRhdXRob3JpdHk1BBhzdWZmaXgkKGFsbG9jYXRpb24EAQEFAQAIGHN1ZmZpeCQkYXV0aG9yaXR5NQQBAQUBABAMd2hvNQQgdXNlcm5hbWUkJHNpZ25hdHVyZRUGOHVzZV9hbGxvY2F0aW9uFAEBBQEABCB1c2VybmFtZSQBAQUBAAwcYWNjb3VudAAkc2lnbmF0dXJlEQYgdXNlcm5hbWUkAQEFAQAEKGNyZWRlbnRpYWwZBgEBBQEADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudL0CAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEBBQEACCByZXBvcnRlcgAgdXNlcm5hbWUkAQEFAQAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSQBAQUBAAQUYWxpYXMgAQEFAQAIIHVzZXJuYW1lJCRqdWRnZW1lbnS9AgAgAAgACAApBwBdAQAAAAAAYQEAAAAIAAgAkQIBAQUA+QIBAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdAQBAQUBAAQYcGVvcGxlxQIBAQUBAQUBAAgMd2hvCAxrZXkgAQEFAQAIFGFsaWFzXQEcYWNjb3VudAABAQUBAAgMd2hvCBxhY2NvdW50AAEBBQEABBhwZW9wbGXFAgAgAC0HAMEDAAQAwQMAvQIABABFBwAEAEkHAAQATQcBAQUAUQcBAQUAWQcBAAgoY2FzZV9pbmRleAQcb3Bpbmlvbr0CAQEFAQAEKGNhc2VfaW5kZXgEAQEFAQAIKGNhc2VfaW5kZXgEFHZvdGVyIAEBBQEACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIBAQUBAAQsZGVzdGluYXRpb24AAQEFAQAEMGNhc2VfaW5kaWNlc80CAQEFAQAMGGFtb3VudAgUY291bnQEGHBlcmlvZAQBAQUBAAQUaW5kZXgEAQEFAQAIFHJvdW5kBBR2b3RlciABAQUBAQUBAAQoY2FzZV9pbmRleAQBAQUBAAgoY2FzZV9pbmRleAQcdmVyZGljdL0CAQEFAQAMKGNhc2VfaW5kZXgEFHZvdGVyIBxvcGluaW9uvQIBAQUBAAgoY2FzZV9pbmRleAQUdm90ZXIgAQEFAQAIFHZvdGVyIDBjYXNlX2luZGljZXPNAgEBBQEADBR2b3RlciAsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAwUcm91bmQEPGluaXRpYWxfYmFsYW5jZQgwdG90YWxfcG9pbnRzCAEBBQEADBhhbW91bnQIFGNvdW50BBhwZXJpb2QEAQEFAQAEFGluZGV4BAEBBQEACBR2b3RlciAYYW1vdW50CAEBBQEACBRyb3VuZAQUdm90ZXIgAQEFAQAIKGNhc2VfaW5kZXgEHHJpcGVuZWQUAQEFAQAEDHdobyAAAABlBwAIAG0HAAgAvQEABABxBwAxAwB1BwEBBQDZAgB5BwCRAgEBBQAxBgEABCBldmlkZW5jZSABAQUBAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwKQYBAQUBAAgYY2hvaWNlLQYocmVxdWlyZV9pZHkCAQEFAQAEHGFjY291bnQAAQEFAQAMIHJlZmVycmVyCCRzaWduYXR1cmURBhh0aWNrZXQAAQEFAQAMHGludml0ZXIAGHRpY2tldAAkc2lnbmF0dXJlEQYBAQUBAAwUaW5kZXgEEGtpbmTVAghpZCABAQUBAAQYdGlja2V0AAEBBQEACBxhY2NvdW50ABRjb3VudAQBAQUBAAgcYWNjb3VudAAUbGltaXQEAQEFAQAEGGNvbmZpZ9kCAQEFAQAIPHJlZmVycmVkX3ZhbHVlczEGPHJlZmVycmVyX3ZhbHVlczEGAQEFAQEFAQAIKGFjY291bnRfaWQAJGp1ZGdlbWVudL0CAQEFAQAIKGFjY291bnRfaWQAIGZhaWx1cmVzBAEBBQEACChhY2NvdW50X2lkACxwZXJzb25hbF9pZAgBAQUBAAggcmVmZXJyZXIIIHJlZmVycmVkAAEBBQEACChhY2NvdW50X2lkACxyZXNlcnZlZF9pZAgBAQUBAAggcmVmZXJyZXIIGHRpY2tldAABAQUBAAgoYWNjb3VudF9pZAAgcmVmZXJyZXIIAQEFAQAMFGluZGV4BBBraW5k1QIIaWQgAQEFAQAEHGludml0ZXIAAQEFAQAIDHdobwAcaW52aXRlcgABAQUBAAQgcmVmZXJyZXIIAQEFAQAIHGFjY291bnQAFGNvdW50BAEBBQEACBxpbnZpdGVyABh0aWNrZXQAAQEFAQAEGGNvbmZpZ9kCAQEFAE0GAH0HAJECAOECAIEHAOECAIkHAQEFAJkHAAQABADhAgDNAgCVBADhAgDBAwDhAgEBBQBJBgAgAAAAAAANBgEABDhpZGVudGlmaWVyX2tleQ0GAQEFAQAMOGlkZW50aWZpZXJfa2V5DQZEc3RhdGVtZW50X2FjY291bnQADHNpZxEGAQEFAQAELGZ1bGxfcmVwb3J0QQYBAQUBAAQYcGxheWVyAAEBBQEABDxnYW1lc19zY2hlZHVsZXNJBgEBBQEABDhnYW1lX3BsYXlfdGltZQQBAQUBAAQYcGhhc2VzTQYBAQUBAQUBAAxEcmVnaXN0cmF0aW9uX2VuZHMEJGdhbWVfZGF0ZQQscmVwb3J0X2VuZHMEAQEFAQAEDHdob+ECAQEFAQAIDHdob+ECKGdhbWVfaW5kZXgEAQEFAQAEGHBsYXllcuECAQEFAQAEOGdhbWVfcGxheV90aW1lBADhAgClBwEBBQBhBgEBBQChBACpBwAEAAQArQcBAQUAsQcBAQUAuQcBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAEBBQEACCxyb3VuZF9pbmRleAQUbGltaXQEAQEFAQAEDGtleVkGAQEFAQAEIHNjaGVkdWxlYQYBAQUBAQUBAAwMd2hv4QIsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAgMd2hv4QIccmVzdW1lZBQBAQUBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAAIAL0HAQAEFGNvdW50BAEBBQEABAhpZAgBAQUBAAQwaWRzX2FuZF9rZXlzbQYBAQUBAAQMaWRzcQYBAQUBAQUBAAQIaWQIAAAAxQcBABQkY2FuZGlkYXRlAExjYW5kaWRhdGVfc2lnbmF0dXJlEQYwcmluZ192cmZfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBlRjb25zdW1lcl9yZWdpc3RyYXRpb259BgEBBQEBBQEABCB2ZXJpZmllcgABAQUBAAgkY2FuZGlkYXRlACB2ZXJpZmllcgAAAADVBwAAAAAAJAAAACQA3QcBAQUA4QcBAAw4aWRlbnRpZmllcl9rZXkNBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUdAwEBBQEADFBsaW5rZWRfbGl0ZV9pZGVudGl0eQBMbGl0ZV9pZGVudGl0eV9wcm9vZhEGPHVzZXJuYW1lX2Nob2ljZYUGAQEFAQAIIHVzZXJuYW1lJBxhY2NvdW50AAEBBQEABCBkdXJhdGlvbggBAQUBAAgsc2xvdF9udW1iZXIELHNldF9hY2NvdW50pQIBAQUBAQUBAAgUYWxpYXMgHGFjY291bnQAAQEFAQAIIHVzZXJuYW1lJBxhY2NvdW50AAEBBQEABCBkdXJhdGlvbggBAQUBAAgcYWNjb3VudAAsc2xvdF9udW1iZXIEAOUHAO0HAOUHACABAAw0cmluZ19leHBvbmVudPkCKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJAEBBQEACDRyaW5nX2V4cG9uZW50+QIscGFnZV9oYXNoZXPFAgEBBQEBBQEACDRyaW5nX2V4cG9uZW50+QIsdG90YWxfcGFnZXMEAQEFAQAMNHJpbmdfZXhwb25lbnT5AixzdGFydF9pbmRleAQUY291bnQEACAA+QcA8QcAxQIA/QcACQgADQgAxQIA/QcAEQgA/QcAzQIAIAAZCAAgAB0IAP0HAJECACAAMQMA/QcAxQIBAQUAJQgADQgAkQIBAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQUbGltaXSRAwEBBQEABChpZGVudGlmaWVyIAEBBQEADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BAEBBQEACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUEAQEFAQEFAQAEDGtleSABAQUBAAQoaWRlbnRpZmllciABAQUBAAgoaWRlbnRpZmllciAocmluZ19pbmRleAQBAQUBAAwoaWRlbnRpZmllciA8YmFzZV9yaW5nX2luZGV4BER0YXJnZXRfcmluZ19pbmRleAQBAQUBAAgoaWRlbnRpZmllciA8b25ib2FyZGluZ19zaXplBAAAAH0BAAAALQgAwQMAkQIABACRAgAxCACRAgCVBACRAgAgAJECAQEFAJECAQMAADUIAQMIBAQAOQgBAwgEBACRAwEDCAQEADkIAQMIBAQAkQMBAwAAeQIBAwAACAEDBAAAPQgBAwQAAHkCAQMEIACRAwEDBCAAFAEDCAQEAMUCAQMIBAQAxQIBAwwEBCAAFAEDDAQEIAAUAQMIBCAAFAEABChzcGxpdF9pbnRvmQYBAQUBAAQIdG8AAQEFAQAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGAQEFAQAQMHByZXNlcnZhdGlvbp0GFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBgEBBQEAFBxhbGlhc2VzxQIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AAQEFAQAIGGlucHV0c6UGCHRvAAEBBQEAEBRpbnB1dKEGMGFsaWFzX3Byb29mc4UBCHRvADBmZWVfY3VycmVuY3kFAwEBBQEAEBhpbnB1dHOlBjBhbGlhc19wcm9vZnOFAQh0bwAwZmVlX2N1cnJlbmN5BQMBAQUBABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+ZBgEBBQEABBR2YWx1ZQQBAQUBAAQYcGVyaW9kBAEBBQEACBhwZXJpb2QEKHJpbmdfaW5kZXgEAQEFAQEFAQAEMG91dHB1dF9jb3VudAQBAQUBAAwIdG8AFHZhbHVlBBxuZXdfYWdlBAEBBQEABBR2YWx1ZQQBAQUBAAwMd2hvABR2YWx1ZQQYYW1vdW50CAEBBQEAEAh0bwAsaW5wdXRfdmFsdWUEMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEAQEFAQAQCHRvABR2YWx1ZQQsaW5wdXRfY291bnQEGGFtb3VudAgBAQUBAAgMZmVlCCRkZXN0cm95ZWQIAQEFAQAIDHdobwAMZmVlCAEBBQEABBhwZXJpb2QEAQEFAQAMCHRvADBvdXRwdXRfdmFsdWUELGlucHV0X2NvdW50BAEBBQEADAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgBAQUBABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5BQMBAQUBAAwIdG8AFHZhbHVlBBhhbW91bnQIAQEFAQAMFHZhbHVlBDxyZW1haW5pbmdfY29pbnMEQGRlc3Ryb3llZF9hbW91bnQIAQEFAQAIGHBlcmlvZAQocmluZ19pbmRleAQBAQUAQQgBAQUARQgBAQUATQgABABVCAAxAwBZCAAEAM0CAF0IAGEIAAQAZQgBAQUA4QUBAAQoZXZlbnRfaW5mb60GAQEFAQAEIGV2ZW50X2lkBAEBBQEACCBldmVudF9pZAQQZGVzdAABAQUBAQUBAAwgZXZlbnRfaWQEOHBhcnRpY2lwYW50X2lkBBRhbGlhcyABAQUBAAgIaWQEFGV2ZW50FQMBAQUBAAQgZXZlbnRfaWQEAQEFAQAIDHdobwAgZXZlbnRfaWQEAQEFAQAQIGV2ZW50X2lkBBBkZXN0ACBhc3NldF9pZFEBMGFzc2V0X2Ftb3VudAgBAQUAuQYAJACRAgEABBhjdXJzb3K9BgEBBQEADBRpbmRleAQwaW5uZXJfY3Vyc29yHQMoc3RhcnRlZF9hdJEDAQEFAQAEIHNlbGVjdG9ywQYBAQUBAQUBAAQobWlncmF0aW9ucwQBAQUBAAgUaW5kZXgEEHRvb2sEAQEFAQAELG5leHRfY3Vyc29yHQMBAwAAxQIBAwAABAEDCCAIABQBAwAAYQMBAwRpCACRAgEDBNUDAG0IAQMAACQBAwQEAB0DAQMAAM0CAQMIcQgkAHkIAQMEJACJCAEDAADVAwEDBJEIAG0DAQMIaQiRCACVCAEDDJkIJCAAoQgBAwTVAwCRAgEDBB0DACQBAwQkAK0IAQMEAAAEAQMIJAQAsQgBAwgkBAC9CAEDBBgACAEDBAQACAEDCMkGBACxCAEDCMkGBAC9CAEDBAQAyQgBAwQpBQDNCAEDCBjZBADRCAEDDHUCKQXZBADVCAEDBHUCAN0IAQMIIBQAzQIBAwjhCPUIAP0IAQME1QMAAQkBAwQkAAUJAQMECQkAHQMBAwAADQkBAwjhCPUIABUJGQkBAQECAQMAEBBmcmVlCCByZXNlcnZlZAgYZnJvemVuCBRmbGFncwgAFBRub25jZQQkY29uc3VtZXJzBCRwcm92aWRlcnMELHN1ZmZpY2llbnRzBBBkYXRhDAEAAAggcmVmX3RpbWUIKHByb29mX3NpemUIAAwYbm9ybWFsGCxvcGVyYXRpb25hbBgkbWFuZGF0b3J5GAUBgAUABQEQAhQoUHJlUnVudGltZQADCCgkJENvbnNlbnN1cwADCCgkEFNlYWwAAwgoJBRPdGhlcgEkZFJ1bnRpbWVFbnZpcm9ubWVudFVwZGF0ZWQAAQUELAACDDhBcHBseUV4dHJpbnNpYwEEMEZpbmFsaXphdGlvbgABBThJbml0aWFsaXphdGlvbgABBQIMGE5vcm1hbAABBSxPcGVyYXRpb25hbAABBSRNYW5kYXRvcnkAAQUCCAxZZXMAAQUITm8AAQUADBh3ZWlnaHQYFGNsYXNzOCBwYXlzX2ZlZTwCJDxJbnZhbGlkU3BlY05hbWUAAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQABBTxOb25aZXJvUmVmQ291bnQAAQUwQ2FsbEZpbHRlcmVkAAEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwABBUROb3RoaW5nQXV0aG9yaXplZAABBTBVbmF1dGhvcml6ZWQAAQUCGExPdmVybGFwcGluZ1VwZ3JhZGVzAAEFUFByb2hpYml0ZWRCeVBvbGthZG90AAEFGFRvb0JpZwABBWhWYWxpZGF0aW9uRGF0YU5vdEF2YWlsYWJsZQABBXRIb3N0Q29uZmlndXJhdGlvbk5vdEF2YWlsYWJsZQABBTBOb3RTY2hlZHVsZWQAAQUCMDhWZXN0aW5nQmFsYW5jZQABBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQVMSW5zdWZmaWNpZW50QmFsYW5jZQABBUhFeGlzdGVudGlhbERlcG9zaXQAAQU0RXhwZW5kYWJpbGl0eQABBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQABBSxEZWFkQWNjb3VudAABBTxUb29NYW55UmVzZXJ2ZXMAAQUwVG9vTWFueUhvbGRzAAEFOFRvb01hbnlGcmVlemVzAAEFTElzc3VhbmNlRGVhY3RpdmF0ZWQAAQUkRGVsdGFaZXJvAAEFAggcTm9Vc2FnZQABBRxOb3RaZXJvAAEFAmAoQmFsYW5jZUxvdwABBSROb0FjY291bnQAAQUwTm9QZXJtaXNzaW9uAAEFHFVua25vd24AAQUYRnJvemVuAAEFFEluVXNlAAEFKEJhZFdpdG5lc3MAAQU4TWluQmFsYW5jZVplcm8AAQVMVW5hdmFpbGFibGVDb25zdW1lcgABBSxCYWRNZXRhZGF0YQABBShVbmFwcHJvdmVkAAEFIFdvdWxkRGllAAEFNEFscmVhZHlFeGlzdHMAAQUkTm9EZXBvc2l0AAEFJFdvdWxkQnVybgABBSRMaXZlQXNzZXQAAQUwQXNzZXROb3RMaXZlAAEFPEluY29ycmVjdFN0YXR1cwABBSROb3RGcm96ZW4AAQU4Q2FsbGJhY2tGYWlsZWQAAQUoQmFkQXNzZXRJZAABBTxDb250YWluc0ZyZWV6ZXMAAQU0Q29udGFpbnNIb2xkcwABBTxUb29NYW55UmVzZXJ2ZXMAAQUCBDBUb29NYW55SG9sZHMAAQUCDEBVbmtub3duQXNzZXRLaW5kAAEFNEFscmVhZHlFeGlzdHMAAQUgT3ZlcmZsb3cAAQUCRERUb29NYW55Q2FuZGlkYXRlcwABBVxUb29GZXdFbGlnaWJsZUNvbGxhdG9ycwABBUBBbHJlYWR5Q2FuZGlkYXRlAAEFME5vdENhbmRpZGF0ZQABBVBUb29NYW55SW52dWxuZXJhYmxlcwABBUxBbHJlYWR5SW52dWxuZXJhYmxlAAEFPE5vdEludnVsbmVyYWJsZQABBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBVhWYWxpZGF0b3JOb3RSZWdpc3RlcmVkAAEFbEluc2VydFRvQ2FuZGlkYXRlTGlzdEZhaWxlZAABBXRSZW1vdmVGcm9tQ2FuZGlkYXRlTGlzdEZhaWxlZAABBTREZXBvc2l0VG9vTG93AAEFZFVwZGF0ZUNhbmRpZGF0ZUxpc3RGYWlsZWQAAQVASW5zdWZmaWNpZW50Qm9uZAABBVBUYXJnZXRJc05vdENhbmRpZGF0ZQABBUBJZGVudGljYWxEZXBvc2l0AAEFQEludmFsaWRVbnJlc2VydmUAAQUCFDBJbnZhbGlkUHJvb2YAAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQU0RHVwbGljYXRlZEtleQABBRhOb0tleXMAAQUkTm9BY2NvdW50AAEFAhQ4QmFkUXVldWVDb25maWcAAQVAQWxyZWFkeVN1c3BlbmRlZAABBThBbHJlYWR5UmVzdW1lZAABBXRUb29NYW55QWN0aXZlT3V0Ym91bmRDaGFubmVscwABBRhUb29CaWcAAQUCpCBPdmVyZmxvdwABBTRVbmltcGxlbWVudGVkAAEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgABBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAEFMExvY2F0aW9uRnVsbAABBVRMb2NhdGlvbk5vdEludmVydGlibGUAAQUkQmFkT3JpZ2luAAEFPEludmFsaWRMb2NhdGlvbgABBTRBc3NldE5vdEZvdW5kAAEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAABBTxOb3RXaXRoZHJhd2FibGUAAQVITG9jYXRpb25DYW5ub3RIb2xkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFJFRyYW5zcG9ydAABBShVbnJvdXRhYmxlAAEFMFVua25vd25DbGFpbQABBThGYWlsZWRUb0RlY29kZQABBUBNYXhXZWlnaHRJbnZhbGlkAAEFOE5vdEhvbGRpbmdGZWVzAAEFMFRvb0V4cGVuc2l2ZQABBRBUcmFwAAEFQEV4cGVjdGF0aW9uRmFsc2UAAQU4UGFsbGV0Tm90Rm91bmQAAQUwTmFtZU1pc21hdGNoAAEFTFZlcnNpb25JbmNvbXBhdGlibGUAAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAAQUsRXhwb3J0RXJyb3IAAQU4UmVhbmNob3JGYWlsZWQAAQUYTm9EZWFsAAEFKEZlZXNOb3RNZXQAAQUkTG9ja0Vycm9yAAEFME5vUGVybWlzc2lvbgABBShVbmFuY2hvcmVkAAEFOE5vdERlcG9zaXRhYmxlAAEFNFRvb01hbnlBc3NldHMAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBUhXZWlnaHRMaW1pdFJlYWNoZWQAAQUcQmFycmllcgABBUxXZWlnaHROb3RDb21wdXRhYmxlAAEFREV4Y2VlZHNTdGFja0xpbWl0AAEFAnAsVW5yZWFjaGFibGUAAQUsU2VuZEZhaWx1cmUAAQUgRmlsdGVyZWQAAQVIVW53ZWlnaGFibGVNZXNzYWdlAAEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQABBRRFbXB0eQABBThDYW5ub3RSZWFuY2hvcgABBTRUb29NYW55QXNzZXRzAAEFNEludmFsaWRPcmlnaW4AAQUoQmFkVmVyc2lvbgABBSxCYWRMb2NhdGlvbgABBThOb1N1YnNjcmlwdGlvbgABBURBbHJlYWR5U3Vic2NyaWJlZAABBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AAEFKExvd0JhbGFuY2UAAQUwVG9vTWFueUxvY2tzAAEFTEFjY291bnROb3RTb3ZlcmVpZ24AAQUoRmVlc05vdE1ldAABBTBMb2NrTm90Rm91bmQAAQUUSW5Vc2UAAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUAAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAAEFPFRvb01hbnlSZXNlcnZlcwABBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUAAQVgVG9vTWFueUF1dGhvcml6ZWRBbGlhc2VzAAEFNEV4cGlyZXNJblBhc3QAAQU0QWxpYXNOb3RGb3VuZAABBYRMb2NhbEV4ZWN1dGlvbkluY29tcGxldGVXaXRoRXJyb3IAAAgUaW5kZXgEFGVycm9ybAIkLE5vdFJlYXBhYmxlAAEFGE5vUGFnZQABBSROb01lc3NhZ2UAAQVAQWxyZWFkeVByb2Nlc3NlZAABBRhRdWV1ZWQAAQVISW5zdWZmaWNpZW50V2VpZ2h0AAEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQABBSxRdWV1ZVBhdXNlZAABBUxSZWN1cnNpdmVEaXNhbGxvd2VkAAEFAgQwVG9vTWFueUNhbGxzAAEFAjhATWluaW11bVRocmVzaG9sZAABBTxBbHJlYWR5QXBwcm92ZWQAAQVETm9BcHByb3ZhbHNOZWVkZWQAAQVEVG9vRmV3U2lnbmF0b3JpZXMAAQVIVG9vTWFueVNpZ25hdG9yaWVzAAEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgABBUxTZW5kZXJJblNpZ25hdG9yaWVzAAEFIE5vdEZvdW5kAAEFIE5vdE93bmVyAAEFLE5vVGltZXBvaW50AAEFOFdyb25nVGltZXBvaW50AAEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQAAQU8TWF4V2VpZ2h0VG9vTG93AAEFNEFscmVhZHlTdG9yZWQAAQUCBCxSZXF1aXJlU3VkbwABBQIgHFRvb01hbnkAAQUgTm90Rm91bmQAAQUgTm90UHJveHkAAQUsVW5wcm94eWFibGUAAQUkRHVwbGljYXRlAAEFME5vUGVybWlzc2lvbgABBSxVbmFubm91bmNlZAABBSxOb1NlbGZQcm94eQABBQKkSFRvb01hbnlTdWJBY2NvdW50cwABBRxOb0FsaWFzAAEFIE5vdEZvdW5kAAEFIE5vdE5hbWVkAAEFKEVtcHR5SW5kZXgAAQUoRmVlQ2hhbmdlZAABBShOb0lkZW50aXR5AAEFPFN0aWNreUp1ZGdlbWVudAABBThKdWRnZW1lbnRHaXZlbgABBUBJbnZhbGlkSnVkZ2VtZW50AAEFMEludmFsaWRJbmRleAABBTRJbnZhbGlkVGFyZ2V0AAEFRFRvb01hbnlSZWdpc3RyYXJzAAEFOEFscmVhZHlDbGFpbWVkAAEFPEFscmVhZHlSZXBvcnRlZAABBRhOb3RTdWIAAQUgTm90T3duZWQAAQV0SnVkZ2VtZW50Rm9yRGlmZmVyZW50SWRlbnRpdHkAAQVYSnVkZ2VtZW50UGF5bWVudEZhaWxlZAABBTRJbnZhbGlkU3VmZml4AAEFUE5vdFVzZXJuYW1lQXV0aG9yaXR5AAEFME5vQWxsb2NhdGlvbgABBUBJbnZhbGlkU2lnbmF0dXJlAAEFRFJlcXVpcmVzU2lnbmF0dXJlAAEFPEludmFsaWRVc2VybmFtZQABBTRVc2VybmFtZVRha2VuAAEFKE5vVXNlcm5hbWUAAQVkTm90U3lzdGVtUHJvdmlkZWRVc2VybmFtZQABBShOb3RFeHBpcmVkAAEFIFRvb0Vhcmx5AAEFME5vdFVuYmluZGluZwABBUBBbHJlYWR5VW5iaW5kaW5nAAEFWEluc3VmZmljaWVudFByaXZpbGVnZXMAAQUoQmFkQ29udGV4dAABBUxVbmV4cGVjdGVkSnVkZ2VtZW50AAEFME5vdFN1cHBvcnRlZAABBRhCYW5uZWQAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVESnVkZ2VtZW50TGlzdEZ1bGwAAQVsTGFzdFVzZXJuYW1lUmVwb3J0VG9vUmVjZW50AAEFYFVzZXJuYW1lSnVkZ2VtZW50T25nb2luZwABBQKIJE5vdFBlcnNvbgABBRROb0tleQABBThJbnZhbGlkQ29udGV4dAABBThJbnZhbGlkQWNjb3VudAABBTBBY2NvdW50SW5Vc2UAAQUwSW52YWxpZFByb29mAAEFQEludmFsaWRTaWduYXR1cmUAAQUkTm9NZW1iZXJzAAEFKEluY29tcGxldGUAAQUoU3RpbGxGcmVzaAABBThUb29NYW55TWVtYmVycwABBTxLZXlBbHJlYWR5SW5Vc2UAAQUsS2V5Tm90Rm91bmQAAQUwQ291bGROb3RQdXNoAAEFHFNhbWVLZXkAAQVUUGVyc29uYWxJZE5vdFJlc2VydmVkAAEFgFBlcnNvbmFsSWRSZXNlcnZhdGlvbkNhbm5vdFJlbmV3AAEFkFBlcnNvbmFsSWROb3RSZXNlcnZlZE9yTm90UmVjb2duaXplZAABBSxJbnZhbGlkUmluZwABBUhTdXNwZW5zaW9uc1BlbmRpbmcAAQVcUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQAAQVISW52YWxpZFN1c3BlbnNpb25zAAEFRE5vTXV0YXRpb25TZXNzaW9uAAEFcENvdWxkTm90U3RhcnRNdXRhdGlvblNlc3Npb24AAQVsU3VzcGVuc2lvblNlc3Npb25JblByb2dyZXNzAAEFOFRpbWVPdXRPZlJhbmdlAAEFWEFsaWFzQWNjb3VudEFscmVhZHlTZXQAAQUwTm90U3VzcGVuZGVkAAEFJFN1c3BlbmRlZAABBUxJbnZhbGlkS2V5TWlncmF0aW9uAAEFTEtleUFscmVhZHlTdXNwZW5kZWQAAQVUSW52YWxpZE9uYm9hcmRpbmdTaXplAAEFQEludmFsaWRNZW1iZXJLZXkAAQV0UGVvcGxlQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQUCUChOb1N1Y2hDYXNlAAEFKE5vU3VjaFZvdGUAAQUcTm90T3BlbgABBRxOb3RSaXBlAAEFHE5vdERvbmUAAQUoQ29kZWNFcnJvcgABBTREaXNwYXRjaEVycm9yAAEFGFJlY2VudAABBSBOb0NyZWRpdAABBSBOb1Jld2FyZAABBSBOb1BvaW50cwABBTRUb29NYW55Q2xhaW1zAAEFIE5vUGF5b3V0AAEFSEFyaXRobWV0aWNPdmVyZmxvdwABBUBUb29NYW55U2NoZWR1bGVzAAEFKE5vU2NoZWR1bGUAAQUkTm9QZW5hbHR5AAEFFEVhcmx5AAEFMFVuZGVyUGVuYWx0eQABBVhDYXNlRXhwaXJhdGlvbkRpc2FibGVkAAEFAqAoSW5Qcm9ncmVzcwABBShOb1JlZmVycmFsAAEFKEJhZENvbnRleHQAAQVMVW5leHBlY3RlZEp1ZGdlbWVudAABBRhOb0FyZ3MAAQUoTm90QXBwbGllZAABBSxOb3RTZWxlY3RlZAABBSROb3RQcm92ZW4AAQU4QWxyZWFkeVN0YXJ0ZWQAAQUoT3V0T2ZSYW5nZQABBTBBbHJlYWR5VGFrZW4AAQU8Tm9Nb3JlUmVmZXJyYWxzAAEFIFRvb0Vhcmx5AAEFNERlc2lnbkludmFsaWQAAQUsRGVzaWduVGFrZW4AAQUkQmFkUGFyZW50AAEFJEJhZEZhbWlseQABBSxXcm9uZ0ZhbWlseQABBSxJbmRleFRvb0JpZwABBRBCdXN5AAEFGEJhbm5lZAABBShJbXByb2JhYmxlAAEFKElkUmVzZXJ2ZWQAAQUYSWRVc2VkAAEFNEludmFsaWRUaWNrZXQAAQUgTm9UaWNrZXQAAQU0Tm90QXV0aG9yaXplZAABBSROb3RQZXJzb24AAQVEUmVmZXJyZWRDYW5kaWRhdGUAAQVQTm90UmVmZXJyZWRDYW5kaWRhdGUAAQVITm9SZXdhcmRUb1JlZ2lzdGVyAAEFQFJld2FyZFRvUmVnaXN0ZXIAAQUkTm9JbnZpdGVyAAEFQEludmFsaWRTaWduYXR1cmUAAQUkTm9JbnZpdGVzAAEFOEFscmVhZHlJbnZpdGVkAAEFKE5vUmVmZXJyZXIAAQUwTm90UG9pUGVyc29uAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFaEludmFsaWRSZWltYnVyc2VtZW50VmFsdWVzAAEFAmwsR2FtZU9uZ29pbmcAAQU4Tm9SZWdpc3RyYXRpb24AAQVET3V0ZGF0ZWRHYW1lU2V0dXAAAQVASW52YWxpZEdhbWVTZXR1cAABBTRJbnZhbGlkUmVwb3J0AAEFGE5vR2FtZQABBSxOb1JlcG9ydGluZwABBTROb3RSZWdpc3RlcmVkAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFRFJlcG9ydEFscmVhZHlTZW50AAEFFEVhcmx5AAEFRE5vdEtpY2thYmxlUGxheWVyAAEFQE5vQXJjaGl2ZWRQbGF5ZXIAAQUgTm9UaWNrZXQAAQUkTm9JbnZpdGVzAAEFOEFscmVhZHlJbnZpdGVkAAEFQE5vdEFjY291bnRQbGF5ZXIAAQVoVXNlSW52aXRlQnV0QWxyZWFkeVBsYXlpbmcAAQVQVG9vTWFueUdhbWVTY2hlZHVsZXMAAQVMTm9TdWNoR2FtZVNjaGVkdWxlZAABBYBJbnZhbGlkU3RhdGVtZW50QWNjb3VudFNpZ25hdHVyZQABBXBTdGF0ZW1lbnRBY2NvdW50QWxyZWFkeUluVXNlAAEFZEludGVybmFsRXJyb3JJbnZhbGlkU3RhdGUAAQVASW52YWxpZEdhbWVTdGF0ZQABBSBOb1BsYXllcgABBZBDYW5ub3RPZmZib2FyZFdoaWxlUmVnaXN0ZXJlZEZvckdhbWUAAQUwSW52YWxpZFN0YXRlAAEFAlQkTm90UGVyc29uAAEFXEhhc05vdFJlYWNoZWRQZXJzb25ob29kAAEFIE5vUmV3YXJkAAEFHE5vU2NvcmUAAQUoTm9TY2hlZHVsZQABBUBUb29NYW55U2NoZWR1bGVzAAEFKFJlY29nbml6ZWQAAQU8Q2FzaE91dENvb2xkb3duAAEFYFJvdW5kT25Hb2luZ09yTm9TY2hlZHVsZQABBRxOb1JvdW5kAAEFbEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZAABBcBCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQAAQWcQmFkT3JpZ2luTm90U2lnbmVkTm90QWNjb3VudFBhcnRpY2lwYW50AAEFUEFscmVhZHlQYXJ0aWNpcGF0aW5nAAEFREtleU11c3RCZVByb3ZpZGVkAAEFUEtleU11c3ROb3RCZVByb3ZpZGVkAAEFUEhhc1JlYWNoZWRQZXJzb25ob29kAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFOFdpbmRvd1Rvb0xhcmdlAAEFVEFsbG93ZWRNaXNzZXNUb29MYXJnZQABBURTY2hlZHVsZU5vdFNvcnRlZAABBQIQJE5vdFBlcnNvbgABBTBOb3RTdXNwZW5kZWQAAQUsTm90UmVzZXJ2ZWQAAQU0VG9vTWFueVBlb3BsZQABBQIQWE5vQXR0ZXN0YXRpb25BbGxvd2FuY2UAAQVsSW52YWxpZEF0dGVzdGF0aW9uU2lnbmF0dXJlAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFAlA8SW52YWxpZFVzZXJuYW1lAAEFNFVzZXJuYW1lVGFrZW4AAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU0Tm90UmVnaXN0ZXJlZAABBTROb3RGdWxsUGVyc29uAAEFNFRvdWNoTm90UmVhZHkAAQU0Tm9SZXNlcnZhdGlvbgABBVBOb3RSZXNlcnZhdGlvbkhvbGRlcgABBWBVc2VybmFtZVJlc2VydmF0aW9uVGFrZW4AAQVAUmVzZXJ2YXRpb25GcmVzaAABBUBOb0xpbmtlZElkZW50aXR5AAEFNEFscmVhZHlMaW5rZWQAAQUsSW52YWxpZFNsb3QAAQVoQWNjb3VudEFscmVhZHlIYXNBbGxvd2FuY2UAAQVQUGVyc29uQXV0aE5vdEV4cGlyZWQAAQU4QWxyZWFkeURlbW90ZWQAAQUkUXVldWVGdWxsAAEFKE5vdEluUXVldWUAAQVUQWxyZWFkeUhhc1Jlc2VydmF0aW9uAAEFAgw0Q2h1bmtOb3RGb3VuZAABBTRJbnZhbGlkQ2h1bmtzAAEFREludmFsaWRDaHVua1JhbmdlAAEFAmwkTm90TWVtYmVyAAEFGE5vUm9vdAABBTBJbnZhbGlkUHJvb2YAAQUoSW5jb21wbGV0ZQABBShTdGlsbEZyZXNoAAEFOFRvb01hbnlNZW1iZXJzAAEFPEtleUFscmVhZHlJblVzZQABBSxLZXlOb3RGb3VuZAABBTBDb3VsZE5vdFB1c2gAAQUsSW52YWxpZFJpbmcAAQVIU3VzcGVuc2lvbnNQZW5kaW5nAAEFXFJpbmdBYm92ZU1lcmdlVGhyZXNob2xkAAEFSEludmFsaWRTdXNwZW5zaW9ucwABBUBOb1JlbW92YWxTZXNzaW9uAAEFbENvdWxkTm90U3RhcnRSZW1vdmFsU2Vzc2lvbgABBWBSZW1vdmFsU2Vzc2lvbkluUHJvZ3Jlc3MAAQVMS2V5QWxyZWFkeVN1c3BlbmRlZAABBVRJbnZhbGlkT25ib2FyZGluZ1NpemUAAQVASW52YWxpZE1lbWJlcktleQABBUhDb2xsZWN0aW9uTm90Rm91bmQAAQVcQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQVIVG9vTWFueUNvbGxlY3Rpb25zAAEFaEludmFsaWRSaW5nU2l6ZUZvckZsZXhpYmxlAAEFTEludmFsaWRSaW5nRXhwb25lbnQAAQVMUHJlbWF0dXJlT25ib2FyZGluZwABBWxDb2xsZWN0aW9uTWFya2VkRm9yRGVsZXRpb24AAQVITm90Q29sbGVjdGlvbk93bmVyAAEFAmRQTWVtYmVyS2V5QWxyZWFkeVVzZWQAAQVASW52YWxpZE1lbWJlcktleQABBTRJbnRlcm5hbEVycm9yAAEFXFJlY3ljbGVyQWxyZWFkeVVubG9hZGVkAAEFUEludmFsaWRDb25zb2xpZGF0aW9uAAEFTENvbnNvbGlkYXRpb25Ub29CaWcAAQU8Q29pblZhbHVlVG9vQmlnAAEFRENvaW5WYWx1ZVRvb1NtYWxsAAEFWENvaW5WYWx1ZUlzTGVzc1RoYW5GZWUAAQVMQ29pblZhbHVlT3V0T2ZCb3VuZAABBURJbnZhbGlkQWxpYXNQcm9vZgABBUxOb1VubG9hZGluZ1JlY3ljbGVyAAEFVFByb29mQW5kQWxpYXNNaXNtYXRjaAABBThOb3RoaW5nVG9CdWlsZAABBTBUb29NYW55UmluZ3MAAQVUQWRkcmVzc0FscmVhZHlIYXNDb2luAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFLEVtcHR5SW5wdXRzAAEFQFJlY3ljbGVyTWlzbWF0Y2gAAQVgSW5zdWZmaWNpZW50VW5sb2FkRm9yRmVlAAEFREFsaWFzTm90UHJlbWFya2VkAAEFXEludmFsaWRSZWN5Y2xlclJldmlzaW9uAAEFMEludmFsaWRTcGxpdAABBURGcmVzaENvaW5SZXF1aXJlZAABBWhDYW5ub3RDb252ZXJ0TmF0aXZlVG9Bc3NldAABBQIkNE5vQWN0aXZlRXZlbnQAAQUoTm90QVBlcnNvbgABBVhBbGlhc0FscmVhZHlSZWdpc3RlcmVkAAEFcEludmFsaWRFdmVudFJlZ2lzdHJhdGlvblRpbWUAAQVUUGFydGljaXBhbnRJZE92ZXJmbG93AAEFWE5vUHJpemVUb0NsYWltRm9yRXZlbnQAAQUwTm9FdmVudEZvdW5kAAEFMFNjaGVkdWxlRnVsbAABBYhQcml6ZU11c3RCZU1vcmVPckVxdWFsVG9NaW5CYWxhbmNlAAEFAgQcT25nb2luZwABBQKsGFN5c3RlbQFEPFBhcmFjaGFpblN5c3RlbQFIJFRpbWVzdGFtcAABBTRQYXJhY2hhaW5JbmZvAAEFNFdlaWdodFJlY2xhaW0AAQUgQmFsYW5jZXMBTEhUcmFuc2FjdGlvblBheW1lbnQAAQVIU2tpcEZlZWxlc3NQYXltZW50AAEFRE9yaWdpblJlc3RyaWN0aW9uAVAYQXNzZXRzAVQwQXNzZXRzSG9sZGVyAVgkQXNzZXRSYXRlAVw4QXNzZXRUeFBheW1lbnQAAQUoQXV0aG9yc2hpcAABBURDb2xsYXRvclNlbGVjdGlvbgFgHFNlc3Npb24BZBBBdXJhAAEFHEF1cmFFeHQAAQUkWGNtcFF1ZXVlAWgsUG9sa2Fkb3RYY20BcChDdW11bHVzWGNtAAEFME1lc3NhZ2VRdWV1ZQF0HFV0aWxpdHkBeCBNdWx0aXNpZwF8EFN1ZG8BgDxWZXJpZnlTaWduYXR1cmUAAQUUUHJveHkBhCBJZGVudGl0eQGIGFBlb3BsZQGMHE1vYlJ1bGUBkChQcm9vZk9mSW5rAZQQR2FtZQGYFFNjb3JlAZwgRHVtbXlEaW0BoChQZW9wbGVMaXRlAaQkUmVzb3VyY2VzAag0Q2h1bmtzTWFuYWdlcgGsHE1lbWJlcnMBsBxDb2luYWdlAbRUU3RvcmFnZUluaXRpYWxpemF0aW9uAAEFZFN0b3JhZ2VJbml0aWFsaXphdGlvbkxpdGUAAQUcQWlyZHJvcAG4UE11bHRpQmxvY2tNaWdyYXRpb25zAbwCKEBGdW5kc1VuYXZhaWxhYmxlAAEFME9ubHlQcm92aWRlcgABBTBCZWxvd01pbmltdW0AAQUwQ2Fubm90Q3JlYXRlAAEFMFVua25vd25Bc3NldAABBRhGcm96ZW4AAQUsVW5zdXBwb3J0ZWQAAQVAQ2Fubm90Q3JlYXRlSG9sZAABBTROb3RFeHBlbmRhYmxlAAEFHEJsb2NrZWQAAQUCDCRVbmRlcmZsb3cAAQUgT3ZlcmZsb3cAAQU4RGl2aXNpb25CeVplcm8AAQUCCDBMaW1pdFJlYWNoZWQAAQUcTm9MYXllcgABBQI4QEludmFsaWRTdGF0ZVJvb3QAAQVISW5jb21wbGV0ZURhdGFiYXNlAAEFUFZhbHVlQXRJbmNvbXBsZXRlS2V5AAEFMERlY29kZXJFcnJvcgABBSxJbnZhbGlkSGFzaAABBTBEdXBsaWNhdGVLZXkAAQU4RXh0cmFuZW91c05vZGUAAQU8RXh0cmFuZW91c1ZhbHVlAAEFXEV4dHJhbmVvdXNIYXNoUmVmZXJlbmNlAAEFVEludmFsaWRDaGlsZFJlZmVyZW5jZQABBTRWYWx1ZU1pc21hdGNoAAEFPEluY29tcGxldGVQcm9vZgABBTBSb290TWlzbWF0Y2gAAQUsRGVjb2RlRXJyb3IAAQUCPBRPdGhlcgABBTBDYW5ub3RMb29rdXAAAQUkQmFkT3JpZ2luAAEFGE1vZHVsZQHARENvbnN1bWVyUmVtYWluaW5nAAEFLE5vUHJvdmlkZXJzAAEFQFRvb01hbnlDb25zdW1lcnMAAQUUVG9rZW4BxChBcml0aG1ldGljAcg0VHJhbnNhY3Rpb25hbAHMJEV4aGF1c3RlZAABBShDb3JydXB0aW9uAAEFLFVuYXZhaWxhYmxlAAEFOFJvb3ROb3RBbGxvd2VkAAEFEFRyaWUB0AIgQEV4dHJpbnNpY1N1Y2Nlc3MAAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAAAIOGRpc3BhdGNoX2Vycm9y1DRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAABBShOZXdBY2NvdW50AAAEHGFjY291bnQANEtpbGxlZEFjY291bnQAAAQcYWNjb3VudAAgUmVtYXJrZWQAAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAAACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UgFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlAAAIJGNvZGVfaGFzaCAUZXJyb3LUBiACGGBWYWxpZGF0aW9uRnVuY3Rpb25TdG9yZWQAAQVkVmFsaWRhdGlvbkZ1bmN0aW9uQXBwbGllZAAABFRyZWxheV9jaGFpbl9ibG9ja19udW0EbFZhbGlkYXRpb25GdW5jdGlvbkRpc2NhcmRlZAABBWBEb3dud2FyZE1lc3NhZ2VzUmVjZWl2ZWQAAAQUY291bnQEZERvd253YXJkTWVzc2FnZXNQcm9jZXNzZWQAAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIERVcHdhcmRNZXNzYWdlU2VudAAABDBtZXNzYWdlX2hhc2jcAggQRnJlZQABBSBSZXNlcnZlZAABBQIEEEtleXMAAQUCBDhBdXRob3JpemVBbGlhcwABBQIIGFBheW91dAABBRhDcmVkaXQAAQUCBChQcm9vZk9mSW5rAAEFAgQgUGxheUdhbWUAAQUCBBxXcmFwcGVkAAEFAgQcQWlyZHJvcAABBQIgHFNlc3Npb24B6CxQb2xrYWRvdFhjbQHsHE1vYlJ1bGUB8ChQcm9vZk9mSW5rAfQQR2FtZQH4FFNjb3JlAfAcQ29pbmFnZQH8HEFpcmRyb3ABAQECCDhCYWxhbmNlVXBkYXRlZAABBVRGYWlsZWRUb011dGF0ZUFjY291bnQAAQUCeBxFbmRvd2VkAAAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QAAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgAADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AAAIDHdobwAQZnJlZQggUmVzZXJ2ZWQAAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQAAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAAAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPkHERlcG9zaXQAAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AAAIDHdobwAYYW1vdW50CBxTbGFzaGVkAAAIDHdobwAYYW1vdW50CBhNaW50ZWQAAAgMd2hvABhhbW91bnQIME1pbnRlZENyZWRpdAAABBhhbW91bnQIGEJ1cm5lZAAACAx3aG8AGGFtb3VudAgoQnVybmVkRGVidAAABBhhbW91bnQIJFN1c3BlbmRlZAAACAx3aG8AGGFtb3VudAggUmVzdG9yZWQAAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAAAEDHdobwAYSXNzdWVkAAAEGGFtb3VudAgkUmVzY2luZGVkAAAEGGFtb3VudAgYTG9ja2VkAAAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAAACAx3aG8AGGFtb3VudAgYRnJvemVuAAAIDHdobwAYYW1vdW50CBhUaGF3ZWQAAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQAAAgMb2xkCAxuZXcIEEhlbGQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIKEJ1cm5lZEhlbGQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIOFRyYW5zZmVyT25Ib2xkAAAQGHJlYXNvbgUBGHNvdXJjZQAQZGVzdAAYYW1vdW50CDxUcmFuc2ZlckFuZEhvbGQAABAYcmVhc29uBQEYc291cmNlABBkZXN0ACx0cmFuc2ZlcnJlZAggUmVsZWFzZWQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIKFVuZXhwZWN0ZWQBCQECBEhUcmFuc2FjdGlvbkZlZVBhaWQAAAwMd2hvAChhY3R1YWxfZmVlCAx0aXAIAhAQUm9vdAABBRhTaWduZWQBABBOb25lAAEFKEF1dGhvcml6ZWQAAQUCICRCeUdlbmVzaXMBIBhCeUZvcmsAAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAABBRhLdXNhbWEAAQUgRXRoZXJldW0AAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAAEFLEJpdGNvaW5DYXNoAAEFQFBvbGthZG90QnVsbGV0aW4AAQUGGQEFAVACKBBVbml0AAEFHE1vbmlrZXIBKBRJbmRleAEEJEV4ZWN1dGl2ZQABBSRUZWNobmljYWwAAQUsTGVnaXNsYXRpdmUAAQUgSnVkaWNpYWwAAQUcRGVmZW5zZQABBThBZG1pbmlzdHJhdGlvbgABBSBUcmVhc3VyeQABBQIUFFZvaWNlAAEFHE1lbWJlcnMAAAQUY291bnQEIEZyYWN0aW9uAAAIDG5vbQQUZGVub20EREF0TGVhc3RQcm9wb3J0aW9uAAAIDG5vbQQUZGVub20ESE1vcmVUaGFuUHJvcG9ydGlvbgAACAxub20EFGRlbm9tBAIoJFBhcmFjaGFpbgEELEFjY291bnRJZDMyAAAIHG5ldHdvcmsdAQhpZCA4QWNjb3VudEluZGV4NjQAAAgcbmV0d29yax0BFGluZGV4CDBBY2NvdW50S2V5MjAAAAgcbmV0d29yax0BDGtleSEBOFBhbGxldEluc3RhbmNlAQQwR2VuZXJhbEluZGV4AQgoR2VuZXJhbEtleQAACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAABBSRQbHVyYWxpdHkAAAgIaWQlARBwYXJ0KQE8R2xvYmFsQ29uc2Vuc3VzARkBBC0BAQgELQEBDAQtAQEQBC0BARQELQEBGAQtAQEcBC0BASACJBBIZXJlAAEFCFgxAS0BCFgyATEBCFgzATUBCFg0ATkBCFg1AT0BCFg2AUEBCFg3AUUBCFg4AUkBAAgccGFyZW50cwQgaW50ZXJpb3JNAQIIDFhjbQFRASBSZXNwb25zZQFRAQIIFFJlbGF5AAEFQFNpYmxpbmdQYXJhY2hhaW4BBAAIFGFsaWFzIBxjb250ZXh0IAAMIHJldmlzaW9uBBByaW5nBAhjYV0BAghAUGVyc29uYWxJZGVudGl0eQEINFBlcnNvbmFsQWxpYXMBYQECDFhBdXRob3JpemVkQXBwbHlXaXRoU2lnAQBEUmVmZXJyZWRDYW5kaWRhdGUBAEBJbnZpdGVkQ2FuZGlkYXRlAQACBBxJbnZpdGVkAQACBEhBY2NvdW50UGFydGljaXBhbnQBAAIEKExpdGVQZXJzb24BAAIELE1lbWJlckFsaWFzAAMIIGEBAAgUdmFsdWUEDGFnZQQFAVEMBIEBAAIIHFByZXBhaWQAAQUoRnJvbU91dHB1dAAACEhmZWVfcmVjeWNsZXJfdmFsdWUESGZlZV9yZWN5Y2xlcl9pbmRleAQCCBBDb2luAAAIHGNvaW5faWQAEGNvaW59ASxVbmxvYWRUb2tlbgAADDBhbGlhc19wcm9vZnOFAShwcm92ZW5fbXNnIAxmZWWJAQIoGHN5c3RlbQEVASxQb2xrYWRvdFhjbQFVAShDdW11bHVzWGNtAVkBGFBlb3BsZQFlAShQcm9vZk9mSW5rAWkBEEdhbWUBbQEUU2NvcmUBcQEoUGVvcGxlTGl0ZQF1ARxNZW1iZXJzAXkBHENvaW5hZ2UBjQECBChGZWVTa2lwcGVkAAAEGG9yaWdpbpEBAhg0UGVyc29uYWxBbGlhcwEgQFBlcnNvbmFsSWRlbnRpdHkBCERSZWZlcnJlZENhbmRpZGF0ZQEASEFjY291bnRQYXJ0aWNpcGFudAEAQEludml0ZWRDYW5kaWRhdGUBAChMaXRlUGVyc29uAQACBDBVc2FnZUNsZWFuZWQAAAQYZW50aXR5mQEACBxyZXNlcnZlUQEwdGVsZXBvcnRhYmxlFAShAQACcBxDcmVhdGVkAAAMIGFzc2V0X2lkUQEcY3JlYXRvcgAUb3duZXIAGElzc3VlZAAADCBhc3NldF9pZFEBFG93bmVyABhhbW91bnQILFRyYW5zZmVycmVkAAAQIGFzc2V0X2lkUQEQZnJvbQAIdG8AGGFtb3VudAgYQnVybmVkAAAMIGFzc2V0X2lkUQEUb3duZXIAHGJhbGFuY2UILFRlYW1DaGFuZ2VkAAAQIGFzc2V0X2lkUQEYaXNzdWVyABRhZG1pbgAcZnJlZXplcgAwT3duZXJDaGFuZ2VkAAAIIGFzc2V0X2lkUQEUb3duZXIAGEZyb3plbgAACCBhc3NldF9pZFEBDHdobwAYVGhhd2VkAAAIIGFzc2V0X2lkUQEMd2hvACxBc3NldEZyb3plbgAABCBhc3NldF9pZFEBLEFzc2V0VGhhd2VkAAAEIGFzc2V0X2lkUQFEQWNjb3VudHNEZXN0cm95ZWQAAAwgYXNzZXRfaWRRAUhhY2NvdW50c19kZXN0cm95ZWQESGFjY291bnRzX3JlbWFpbmluZwRIQXBwcm92YWxzRGVzdHJveWVkAAAMIGFzc2V0X2lkUQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwRIRGVzdHJ1Y3Rpb25TdGFydGVkAAAEIGFzc2V0X2lkUQEkRGVzdHJveWVkAAAEIGFzc2V0X2lkUQEwRm9yY2VDcmVhdGVkAAAIIGFzc2V0X2lkUQEUb3duZXIALE1ldGFkYXRhU2V0AAAUIGFzc2V0X2lkUQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQkaXNfZnJvemVuFDxNZXRhZGF0YUNsZWFyZWQAAAQgYXNzZXRfaWRRAUBBcHByb3ZlZFRyYW5zZmVyAAAQIGFzc2V0X2lkUQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CERBcHByb3ZhbENhbmNlbGxlZAAADCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQBMVHJhbnNmZXJyZWRBcHByb3ZlZAAAFCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQAsZGVzdGluYXRpb24AGGFtb3VudAhIQXNzZXRTdGF0dXNDaGFuZ2VkAAAEIGFzc2V0X2lkUQFYQXNzZXRNaW5CYWxhbmNlQ2hhbmdlZAAACCBhc3NldF9pZFEBPG5ld19taW5fYmFsYW5jZQgcVG91Y2hlZAAADCBhc3NldF9pZFEBDHdobwAkZGVwb3NpdG9yABxCbG9ja2VkAAAIIGFzc2V0X2lkUQEMd2hvACREZXBvc2l0ZWQAAAwgYXNzZXRfaWRRAQx3aG8AGGFtb3VudAgkV2l0aGRyYXduAAAMIGFzc2V0X2lkUQEMd2hvABhhbW91bnQIPFJlc2VydmVzVXBkYXRlZAAACCBhc3NldF9pZFEBIHJlc2VydmVzpQE8UmVzZXJ2ZXNSZW1vdmVkAAAEIGFzc2V0X2lkUQECDBBIZWxkAAAQDHdobwAgYXNzZXRfaWRRARhyZWFzb24FARhhbW91bnQIIFJlbGVhc2VkAAAQDHdobwAgYXNzZXRfaWRRARhyZWFzb24FARhhbW91bnQIGEJ1cm5lZAAAEAx3aG8AIGFzc2V0X2lkUQEYcmVhc29uBQEYYW1vdW50CAIMQEFzc2V0UmF0ZUNyZWF0ZWQAAAgoYXNzZXRfa2luZFEBEHJhdGUIQEFzc2V0UmF0ZVJlbW92ZWQAAAQoYXNzZXRfa2luZFEBQEFzc2V0UmF0ZVVwZGF0ZWQAAAwoYXNzZXRfa2luZFEBDG9sZAgMbmV3CAZRAQIEOEFzc2V0VHhGZWVQYWlkAAAQDHdobwAoYWN0dWFsX2ZlZQgMdGlwCCBhc3NldF9pZLUBBAAAAihATmV3SW52dWxuZXJhYmxlcwAABDRpbnZ1bG5lcmFibGVzvQFESW52dWxuZXJhYmxlQWRkZWQAAAQoYWNjb3VudF9pZABMSW52dWxuZXJhYmxlUmVtb3ZlZAAABChhY2NvdW50X2lkAFBOZXdEZXNpcmVkQ2FuZGlkYXRlcwAABEhkZXNpcmVkX2NhbmRpZGF0ZXMEQE5ld0NhbmRpZGFjeUJvbmQAAAQsYm9uZF9hbW91bnQIOENhbmRpZGF0ZUFkZGVkAAAIKGFjY291bnRfaWQAHGRlcG9zaXQIUENhbmRpZGF0ZUJvbmRVcGRhdGVkAAAIKGFjY291bnRfaWQAHGRlcG9zaXQIQENhbmRpZGF0ZVJlbW92ZWQAAAQoYWNjb3VudF9pZABEQ2FuZGlkYXRlUmVwbGFjZWQAAAwMb2xkAAxuZXcAHGRlcG9zaXQIaEludmFsaWRJbnZ1bG5lcmFibGVTa2lwcGVkAAAEKGFjY291bnRfaWQAAhAoTmV3U2Vzc2lvbgAABDRzZXNzaW9uX2luZGV4BCROZXdRdWV1ZWQAAQVEVmFsaWRhdG9yRGlzYWJsZWQAAAQkdmFsaWRhdG9yAEhWYWxpZGF0b3JSZWVuYWJsZWQAAAQkdmFsaWRhdG9yAAIEPFhjbXBNZXNzYWdlU2VudAAABDBtZXNzYWdlX2hhc2ggAqQgT3ZlcmZsb3cAAQU0VW5pbXBsZW1lbnRlZAABBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgABBTBMb2NhdGlvbkZ1bGwAAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAEFJEJhZE9yaWdpbgABBTxJbnZhbGlkTG9jYXRpb24AAQU0QXNzZXROb3RGb3VuZAABBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQAAQU8Tm90V2l0aGRyYXdhYmxlAAEFSExvY2F0aW9uQ2Fubm90SG9sZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBTBVbmtub3duQ2xhaW0AAQU4RmFpbGVkVG9EZWNvZGUAAQVATWF4V2VpZ2h0SW52YWxpZAABBThOb3RIb2xkaW5nRmVlcwABBTBUb29FeHBlbnNpdmUAAQUQVHJhcAEIQEV4cGVjdGF0aW9uRmFsc2UAAQU4UGFsbGV0Tm90Rm91bmQAAQUwTmFtZU1pc21hdGNoAAEFTFZlcnNpb25JbmNvbXBhdGlibGUAAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAAQUsRXhwb3J0RXJyb3IAAQU4UmVhbmNob3JGYWlsZWQAAQUYTm9EZWFsAAEFKEZlZXNOb3RNZXQAAQUkTG9ja0Vycm9yAAEFME5vUGVybWlzc2lvbgABBShVbmFuY2hvcmVkAAEFOE5vdERlcG9zaXRhYmxlAAEFNFRvb01hbnlBc3NldHMAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBUhXZWlnaHRMaW1pdFJlYWNoZWQBGBxCYXJyaWVyAAEFTFdlaWdodE5vdENvbXB1dGFibGUAAQVERXhjZWVkc1N0YWNrTGltaXQAAQUACBRpbmRleAQUZXJyb3LNAQIMIENvbXBsZXRlAAAEEHVzZWQYKEluY29tcGxldGUAAAgQdXNlZBgUZXJyb3LRARRFcnJvcgHRAQUBIAUBQAIYJFVuZGVmaW5lZAABBRRJbmRleAEIGEFycmF5NAEoGEFycmF5OAHZARxBcnJheTE2Ad0BHEFycmF5MzIBIAIIIEZ1bmdpYmxlAQgsTm9uRnVuZ2libGUB4QEACAhpZFEBDGZ1buUBBOkBAAMIBM0BBvEBABgUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJBRtYWpvcgQUbWlub3IEFHBhdGNoBAT5AQACDBxTdWNjZXNzAAEFFEVycm9yASQ4VHJ1bmNhdGVkRXJyb3IBJAIYEE51bGwAAQUYQXNzZXRzAe0BPEV4ZWN1dGlvblJlc3VsdAH1ARxWZXJzaW9uAQQsUGFsbGV0c0luZm8B/QE4RGlzcGF0Y2hSZXN1bHQBAQICEBhOYXRpdmUAAQVAU292ZXJlaWduQWNjb3VudAABBSRTdXBlcnVzZXIAAQUMWGNtAAEFBhgADCxkZXN0aW5hdGlvblEBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIIIEZ1bmdpYmxlAAEFLE5vbkZ1bmdpYmxlAAEFAhAMQWxsAAEFFEFsbE9mAAAICGlkUQEMZnVuFQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZFEBDGZ1bhUCFGNvdW50BAIIIERlZmluaXRlAe0BEFdpbGQBGQICCCRVbmxpbWl0ZWQAAQUcTGltaXRlZAEYAgwgVGVsZXBvcnQBHQI4UmVzZXJ2ZURlcG9zaXQBHQI8UmVzZXJ2ZVdpdGhkcmF3AR0CBiUCBCUCAAZNAQIEMEFzc2V0Q2xhaW1lcgAABCBsb2NhdGlvblEBBDUCAALQNFdpdGhkcmF3QXNzZXQB7QFUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkAe0BWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQB7QE0UXVlcnlSZXNwb25zZQAAECBxdWVyeV9pZAggcmVzcG9uc2UFAihtYXhfd2VpZ2h0GBxxdWVyaWVytQE0VHJhbnNmZXJBc3NldAAACBhhc3NldHPtASxiZW5lZmljaWFyeVEBUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0AAAMGGFzc2V0c+0BEGRlc3RRAQx4Y21BAiBUcmFuc2FjdAAADCxvcmlnaW5fa2luZAkCTGZhbGxiYWNrX21heF93ZWlnaHQNAhBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BTQEsUmVwb3J0RXJyb3IBEQIwRGVwb3NpdEFzc2V0AAAIGGFzc2V0cx0CLGJlbmVmaWNpYXJ5UQFMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHMdAhBkZXN0UQEMeGNtQQI0RXhjaGFuZ2VBc3NldAAADBBnaXZlHQIQd2FudO0BHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0cx0CHHJlc2VydmVRAQx4Y21BAkBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0cx0CEGRlc3RRAQx4Y21BAjRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8RAhhhc3NldHMdAjBCdXlFeGVjdXRpb24AAAgQZmVlc+kBMHdlaWdodF9saW1pdCECNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyAUECLFNldEFwcGVuZGl4AUECKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHPtARh0aWNrZXRRARBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAHtASxFeHBlY3RBc3NldAHtATBFeHBlY3RPcmlnaW4BtQEsRXhwZWN0RXJyb3IB9QFQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8RAjBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwERAkxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgEtATRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmsZASxkZXN0aW5hdGlvbk0BDHhjbUECJExvY2tBc3NldAAACBRhc3NldOkBIHVubG9ja2VyUQEsVW5sb2NrQXNzZXQAAAgUYXNzZXTpARh0YXJnZXRRAThOb3RlVW5sb2NrYWJsZQAACBRhc3NldOkBFG93bmVyUQE0UmVxdWVzdFVubG9jawAACBRhc3NldOkBGGxvY2tlclEBLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAVEBPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQhAjBjaGVja19vcmlnaW61ARxQYXlGZWVzAAAEFGFzc2V06QFASW5pdGlhdGVUcmFuc2ZlcgAAFCxkZXN0aW5hdGlvblEBLHJlbW90ZV9mZWVzKQI8cHJlc2VydmVfb3JpZ2luFBhhc3NldHMtAihyZW1vdGVfeGNtQQJERXhlY3V0ZVdpdGhPcmlnaW4AAAhEZGVzY2VuZGFudF9vcmlnaW4xAgx4Y21BAiBTZXRIaW50cwAABBRoaW50czkCBD0CAAIcNE5vdEFwcGxpY2FibGUAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQU8TWlzc2luZ0FyZ3VtZW50AAEFEEZlZXMAAQUCLCRCeUdlbmVzaXMBIBhCeUZvcmsAAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAABBRhLdXNhbWEAAQUcV2VzdGVuZAABBRhSb2NvY28AAQUYV29jb2NvAAEFIEV0aGVyZXVtAAAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQABBSxCaXRjb2luQ2FzaAABBUBQb2xrYWRvdEJ1bGxldGluAAEFBkkCAigkUGFyYWNoYWluAQQsQWNjb3VudElkMzIAAAgcbmV0d29ya00CCGlkIDhBY2NvdW50SW5kZXg2NAAACBxuZXR3b3JrTQIUaW5kZXgIMEFjY291bnRLZXkyMAAACBxuZXR3b3JrTQIMa2V5IQE4UGFsbGV0SW5zdGFuY2UBBDBHZW5lcmFsSW5kZXgBCChHZW5lcmFsS2V5AAAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAAEFJFBsdXJhbGl0eQAACAhpZCUBEHBhcnQpATxHbG9iYWxDb25zZW5zdXMBSQICJBBIZXJlAAEFCFgxAVECCFgyAARRAgEICFgzAARRAgEMCFg0AARRAgEQCFg1AARRAgEUCFg2AARRAgEYCFg3AARRAgEcCFg4AARRAgEgAAgccGFyZW50cwQgaW50ZXJpb3JVAgIIIENvbmNyZXRlAVkCIEFic3RyYWN0ASAACAhpZF0CDGZ1buUBBGECAAAICGlkWQIMZnVu5QEEaQIAAgwIVjMBZQIIVjQBbQIIVjUB7QECDAhWMwFZAghWNAFZAghWNQFRAQYIAnQkQXR0ZW1wdGVkAAAEHG91dGNvbWXVARBTZW50AAAQGG9yaWdpblEBLGRlc3RpbmF0aW9uUQEcbWVzc2FnZUECKG1lc3NhZ2VfaWQgKFNlbmRGYWlsZWQAABAYb3JpZ2luUQEsZGVzdGluYXRpb25RARRlcnJvckUCKG1lc3NhZ2VfaWQgPFByb2Nlc3NYY21FcnJvcgAADBhvcmlnaW5RARRlcnJvcs0BKG1lc3NhZ2VfaWQgSFVuZXhwZWN0ZWRSZXNwb25zZQAACBhvcmlnaW5RASBxdWVyeV9pZAg0UmVzcG9uc2VSZWFkeQAACCBxdWVyeV9pZAggcmVzcG9uc2UFAiBOb3RpZmllZAAADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBOb3RpZnlPdmVyd2VpZ2h0AAAUIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgENGFjdHVhbF93ZWlnaHQYTG1heF9idWRnZXRlZF93ZWlnaHQYTE5vdGlmeURpc3BhdGNoRXJyb3IAAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARITm90aWZ5RGVjb2RlRmFpbGVkAAAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQEludmFsaWRSZXNwb25kZXIAAAwYb3JpZ2luUQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9utQFcSW52YWxpZFJlc3BvbmRlclZlcnNpb24AAAgYb3JpZ2luUQEgcXVlcnlfaWQINFJlc3BvbnNlVGFrZW4AAAQgcXVlcnlfaWQINEFzc2V0c1RyYXBwZWQAAAwQaGFzaCAYb3JpZ2luUQEYYXNzZXRzcQJUVmVyc2lvbkNoYW5nZU5vdGlmaWVkAAAQLGRlc3RpbmF0aW9uUQEYcmVzdWx0BBBjb3N07QEobWVzc2FnZV9pZCBcU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQAAAggbG9jYXRpb25RARx2ZXJzaW9uBFBOb3RpZnlUYXJnZXRTZW5kRmFpbAAADCBsb2NhdGlvblEBIHF1ZXJ5X2lkCBRlcnJvcs0BZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwAAAggbG9jYXRpb251AiBxdWVyeV9pZAhUSW52YWxpZFF1ZXJpZXJWZXJzaW9uAAAIGG9yaWdpblEBIHF1ZXJ5X2lkCDhJbnZhbGlkUXVlcmllcgAAEBhvcmlnaW5RASBxdWVyeV9pZAhAZXhwZWN0ZWRfcXVlcmllclEBUG1heWJlX2FjdHVhbF9xdWVyaWVytQFQVmVyc2lvbk5vdGlmeVN0YXJ0ZWQAAAwsZGVzdGluYXRpb25RARBjb3N07QEobWVzc2FnZV9pZCBYVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAAADCxkZXN0aW5hdGlvblEBEGNvc3TtAShtZXNzYWdlX2lkIGBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQAAAwsZGVzdGluYXRpb25RARBjb3N07QEobWVzc2FnZV9pZCAgRmVlc1BhaWQAAAgYcGF5aW5nUQEQZmVlc+0BNEFzc2V0c0NsYWltZWQAAAwQaGFzaCAYb3JpZ2luUQEYYXNzZXRzcQJgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkAAAEHHZlcnNpb24EPEFsaWFzQXV0aG9yaXplZAAADBxhbGlhc2VyUQEYdGFyZ2V0UQEYZXhwaXJ5eQJkQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAAACBxhbGlhc2VyUQEYdGFyZ2V0UQFwQWxpYXNlc0F1dGhvcml6YXRpb25zUmVtb3ZlZAAABBh0YXJnZXRRAQIMNEludmFsaWRGb3JtYXQBIEhVbnN1cHBvcnRlZFZlcnNpb24BIEBFeGVjdXRlZERvd253YXJkAAMIINUBAgwQSGVyZQABBRhQYXJlbnQAAQUcU2libGluZwEEAhgkQmFkRm9ybWF0AAEFHENvcnJ1cHQAAQUsVW5zdXBwb3J0ZWQAAQUoT3ZlcndlaWdodAEYFFlpZWxkAAEFRFN0YWNrTGltaXRSZWFjaGVkAAEFAhBAUHJvY2Vzc2luZ0ZhaWxlZAAADAhpZCAYb3JpZ2luhQIUZXJyb3KJAiRQcm9jZXNzZWQAABAIaWQgGG9yaWdpboUCLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQAABAIaWQgGG9yaWdpboUCKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQAAAgYb3JpZ2luhQIUaW5kZXgEAQUHkQLUAiBAQmF0Y2hJbnRlcnJ1cHRlZAAACBRpbmRleAQUZXJyb3LUOEJhdGNoQ29tcGxldGVkAAEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwABBTRJdGVtQ29tcGxldGVkAAEFKEl0ZW1GYWlsZWQAAAQUZXJyb3LUMERpc3BhdGNoZWRBcwAABBhyZXN1bHSVAkRJZkVsc2VNYWluU3VjY2VzcwABBVBJZkVsc2VGYWxsYmFja0NhbGxlZAAABChtYWluX2Vycm9y1AAIGGhlaWdodAQUaW5kZXgEAhQsTmV3TXVsdGlzaWcAAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAAAQJGFwcHJvdmluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAAAFCRhcHByb3ZpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdJUCRE11bHRpc2lnQ2FuY2VsbGVkAAAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggMERlcG9zaXRQb2tlZAAAEAx3aG8AJGNhbGxfaGFzaCAsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAYAAhAUU3VkaWQAAAQsc3Vkb19yZXN1bHSVAihLZXlDaGFuZ2VkAAAIDG9sZKUCDG5ldwAoS2V5UmVtb3ZlZAABBShTdWRvQXNEb25lAAAELHN1ZG9fcmVzdWx0lQICGAxBbnkAAQUsTm9uVHJhbnNmZXIAAQUsQ2FuY2VsUHJveHkAAQUgSWRlbnRpdHkAAQVESWRlbnRpdHlKdWRnZW1lbnQAAQUgQ29sbGF0b3IAAQUCCBxQcm94aWVzAAEFNEFubm91bmNlbWVudHMAAQUCHDRQcm94eUV4ZWN1dGVkAAAEGHJlc3VsdJUCLFB1cmVDcmVhdGVkAAAYEHB1cmUADHdobwAocHJveHlfdHlwZa0CUGRpc2FtYmlndWF0aW9uX2luZGV4BAhhdAQ8ZXh0cmluc2ljX2luZGV4BChQdXJlS2lsbGVkAAAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGWtAlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAAAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQAABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtAhRkZWxheQQwUHJveHlSZW1vdmVkAAAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQIUZGVsYXkEMERlcG9zaXRQb2tlZAAAEAx3aG8AEGtpbmSxAixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAggQVHJ1ZQABBRRGYWxzZQABBQIIFFRydXRoAbkCIENvbnRlbXB0AAEFAoAsSWRlbnRpdHlTZXQAAAQMd2hvADxJZGVudGl0eUNsZWFyZWQAAAgMd2hvABxkZXBvc2l0CDhJZGVudGl0eUtpbGxlZAAACAx3aG8AHGRlcG9zaXQISEp1ZGdlbWVudFJlcXVlc3RlZAAACAx3aG8APHJlZ2lzdHJhcl9pbmRleARQSnVkZ2VtZW50VW5yZXF1ZXN0ZWQAAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEOEp1ZGdlbWVudEdpdmVuAAAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BDhSZWdpc3RyYXJBZGRlZAAABDxyZWdpc3RyYXJfaW5kZXgEQFN1YklkZW50aXR5QWRkZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CEBTdWJJZGVudGl0aWVzU2V0AAAMEG1haW4AOG51bWJlcl9vZl9zdWJzBCxuZXdfZGVwb3NpdAhIU3ViSWRlbnRpdHlSZW5hbWVkAAAIDHN1YgAQbWFpbgBIU3ViSWRlbnRpdHlSZW1vdmVkAAAMDHN1YgAQbWFpbgAcZGVwb3NpdAhIU3ViSWRlbnRpdHlSZXZva2VkAAAMDHN1YgAQbWFpbgAcZGVwb3NpdAg4QXV0aG9yaXR5QWRkZWQAAAQkYXV0aG9yaXR5AEBBdXRob3JpdHlSZW1vdmVkAAAEJGF1dGhvcml0eQAsVXNlcm5hbWVTZXQAAAgMd2hvACB1c2VybmFtZSQ4VXNlcm5hbWVRdWV1ZWQAAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgRIUHJlYXBwcm92YWxFeHBpcmVkAAAEFHdob3NlAEhQcmltYXJ5VXNlcm5hbWVTZXQAAAgMd2hvACB1c2VybmFtZSRcRGFuZ2xpbmdVc2VybmFtZVJlbW92ZWQAAAgMd2hvACB1c2VybmFtZSQ8VXNlcm5hbWVVbmJvdW5kAAAEIHVzZXJuYW1lJDxVc2VybmFtZVJlbW92ZWQAAAQgdXNlcm5hbWUkOFVzZXJuYW1lS2lsbGVkAAAEIHVzZXJuYW1lJEBVc2VybmFtZVJlcG9ydGVkAAAIIHJlcG9ydGVyACB1c2VybmFtZSRMUGVyc29uYWxJZGVudGl0eVNldAAADBRhbGlhcyAcYWNjb3VudAAgdXNlcm5hbWUkREV2aWRlbmNlU3VibWl0dGVkAAAEFGFsaWFzIEhDcmVkZW50aWFsQWNjZXB0ZWQAAAQUYWxpYXMgSENyZWRlbnRpYWxSZWplY3RlZAAABBRhbGlhcyAwUGVyc29uQmFubmVkAAAEFGFsaWFzIFxQZXJzb25hbElkZW50aXR5Q2xlYXJlZAAABBRhbGlhcyBsUmVwb3J0ZWRVc2VybmFtZUp1ZGdlZFZhbGlkAAAEIHVzZXJuYW1lJHRSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkSW52YWxpZAAABCB1c2VybmFtZSSYUmVwb3J0ZWRVc2VybmFtZVdlYWtPclVuY2xlYXJKdWRnZW1lbnQAAAggdXNlcm5hbWUkJGp1ZGdlbWVudL0CBCAAAiRQUGVyc29uaG9vZFJlY29nbml6ZWQAAAgMd2hvCAxrZXkgQFBlcnNvbk9uYm9hcmRpbmcAAAgMd2hvCAxrZXkgPEFsaWFzRGlzcGF0Y2hlZAAACBRhbGlhc10BHGFjY291bnQAPEFsaWFzQWNjb3VudFNldAAACBRhbGlhc10BHGFjY291bnQAREFsaWFzQWNjb3VudFVuc2V0AAAIFGFsaWFzXQEcYWNjb3VudABQUGVyc29uYWxJZEFjY291bnRTZXQAAAgMd2hvCBxhY2NvdW50AFhQZXJzb25hbElkQWNjb3VudFVuc2V0AAAIDHdobwgcYWNjb3VudABEQ29sbGVjdGlvbkNyZWF0ZWQAAQVkRm9yY2VQZXJzb25ob29kUmVjb2duaXplZAAABBhwZW9wbGXFAgQEAAJELENhc2VDcmVhdGVkAAAEKGNhc2VfaW5kZXgEIENhbGxiYWNrAAAEGHJlc3VsdJUCNENhbGxiYWNrRXJyb3IAAQUoQ2FzZUNsb3NlZAAACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIUVm90ZWQAAAwoY2FzZV9pbmRleAQUdm90ZXIgHG9waW5pb269AixWb3RlQ2xlYW5lZAAACChjYXNlX2luZGV4BBR2b3RlciAsQ2FzZVJlbW92ZWQAAAQoY2FzZV9pbmRleAQ4Q2FzZUludGVydmVuZWQAAAgoY2FzZV9pbmRleAQcdmVyZGljdL0CMFZvdGVzQ2xhaW1lZAAACBR2b3RlciAwY2FzZV9pbmRpY2VzzQIwUmV3YXJkUGF5b3V0AAAMFHZvdGVyICxkZXN0aW5hdGlvbgAYYW1vdW50CEhQYXlvdXRSb3VuZFN0YXJ0ZWQAAAwUcm91bmQEPGluaXRpYWxfYmFsYW5jZQgwdG90YWxfcG9pbnRzCFRQYXlvdXRSb3VuZHNTY2hlZHVsZWQAAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBFRQYXlvdXRTY2hlZHVsZVJlbW92ZWQAAAQUaW5kZXgENENyZWRpdENsYWltZWQAAAgUdm90ZXIgGGFtb3VudAg0UG9pbnRzQ2xlYW5lZAAACBRyb3VuZAQUdm90ZXIgLENhc2VUb3VjaGVkAAAIKGNhc2VfaW5kZXgEHHJpcGVuZWQUUFZvdGluZ1BlbmFsdHlDbGVhcmVkAAAEDHdobyACECBEZXNpZ25lZAAABBRjb3VudAREUHJvY2VkdXJhbEFjY291bnQAAQVIUHJvY2VkdXJhbFBlcnNvbmFsAAEFKFByb2NlZHVyYWwAAAQUcmFuZ2UEACA4cmVyb2xsX3RpbWVvdXQEPGZhc3R0cmFja19jb3VudAQcbWF4aW11bQQ4ZnVsbF9hbGxvY19sZW4IQGZ1bGxfYWxsb2NfY291bnQEOGluaXRfYWxsb2NfbGVuCEBpbml0X2FsbG9jX2NvdW50BBx0aW1lb3V0BAJcQENhbmRpZGF0ZUFwcGxpZWQAAAQoYWNjb3VudF9pZABISnVkZ2VtZW50UmVxdWVzdGVkAAAEKGFjY291bnRfaWQAREp1ZGdlbWVudFByb3ZpZGVkAAAIKGFjY291bnRfaWQAJGp1ZGdlbWVudL0CMFJldHJ5R3JhbnRlZAAACChhY2NvdW50X2lkACBmYWlsdXJlcwRAUGVyc29uUmVnaXN0ZXJlZAAACChhY2NvdW50X2lkACxwZXJzb25hbF9pZAhEQ2FuZGlkYXRlUmVmZXJyZWQAAAggcmVmZXJyZXIIIHJlZmVycmVkACBSZXJvbGxlZAAABChhY2NvdW50X2lkADxEZXNpZ25Db21taXR0ZWQAAAgoYWNjb3VudF9pZAAscmVzZXJ2ZWRfaWQIOEZ1bGx5QWxsb2NhdGVkAAAEKGFjY291bnRfaWQAIFRpbWVkT3V0AAAEKGFjY291bnRfaWQAJEZsYWtlZE91dAAABChhY2NvdW50X2lkADhUaWNrZXRSZWZlcnJlZAAACCByZWZlcnJlcggYdGlja2V0ADxUaWNrZXRDYW5jZWxsZWQAAAggcmVmZXJyZXIIGHRpY2tldAA0VGlja2V0QXBwbGllZAAACChhY2NvdW50X2lkACByZWZlcnJlcggsRmFtaWx5QWRkZWQAAAwUaW5kZXgEEGtpbmTVAghpZCBEQWxsSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgBIU29tZUludml0ZXNSZW1vdmVkAAAEHGludml0ZXIAXEludml0ZWRDYW5kaWRhdGVBcHBsaWVkAAAIDHdobwAcaW52aXRlcgBkUmVmZXJyYWxWb3VjaGVyUmVnaXN0ZXJlZAAABCByZWZlcnJlcgg4SW52aXRlc0dyYW50ZWQAAAgcYWNjb3VudAAUY291bnQEPEludml0ZVRpY2tldFNldAAACBxpbnZpdGVyABh0aWNrZXQAVEludml0ZVRpY2tldENhbmNlbGxlZAAACBxpbnZpdGVyABh0aWNrZXQAQENvbmZpZ3VyYXRpb25TZXQAAAQYY29uZmln2QICCBxBY2NvdW50AQAYUGVyc29uASACOBxOZXdHYW1lAAAMRHJlZ2lzdHJhdGlvbl9lbmRzBCRnYW1lX2RhdGUELHJlcG9ydF9lbmRzBCRHYW1lRW5kZWQAAAQUaW5kZXgEIFNpZ25lZFVwAAAEDHdob+ECPFJlcG9ydFN1Ym1pdHRlZAAACAx3aG/hAihnYW1lX2luZGV4BChPZmZib2FyZGVkAAAEDHdob+ECJEtpY2tlZE91dAAABBhwbGF5ZXLhAjhJbnZpdGVzR3JhbnRlZAAACBxhY2NvdW50ABRjb3VudAQ8SW52aXRlVGlja2V0U2V0AAAEHGludml0ZXIAVEludml0ZVRpY2tldENhbmNlbGxlZAAABBxpbnZpdGVyADhHYW1lc1NjaGVkdWxlZAAABBRjb3VudARQU2NoZWR1bGVkR2FtZVJlbW92ZWQAAAQ4Z2FtZV9wbGF5X3RpbWUEQFN0bXRVc2FnZVJlbW92ZWQAAAQMd2hvIERBbGxJbnZpdGVzUmVtb3ZlZAAABBxpbnZpdGVyAEhTb21lSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgACHDRDcmVkaXRDbGFpbWVkAAAMDHdob+ECLGRlc3RpbmF0aW9uABhhbW91bnQIUFBlcnNvbmhvb2RSZWNvZ25pemVkAAAIDHdob+ECHHJlc3VtZWQUVFBheW91dFJvdW5kc1NjaGVkdWxlZAAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BERSb3VuZFRyYW5zaXRpb25lZAAABCxyb3VuZF9pbmRleARMUGF5b3V0Um91bmRPcGVyYXRlZAAABCxyb3VuZF9pbmRleAQkQ2FzaGVkT3V0AAAEDHdob+ECAiAsSWRzUmVzZXJ2ZWQAAAQUY291bnQEJElkUmVuZXdlZAAABAhpZAgwSWRVbnJlc2VydmVkAAAECGlkCEBQZW9wbGVSZWdpc3RlcmVkAAAEFGNvdW50BDxQZW9wbGVTdXNwZW5kZWQAAAQUY291bnQERFBlcnNvbmhvb2RSZXN1bWVkAAAECGlkCEhTdXNwZW5zaW9uc1N0YXJ0ZWQAAQVAU3VzcGVuc2lvbnNFbmRlZAABBQIQeEFsbEF0dGVzdGF0aW9uQWxsb3dhbmNlQ2xlYXJlZAAABCB2ZXJpZmllcgB0QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQAAAgcYWNjb3VudAAUY291bnQEOFBlcnNvbkF0dGVzdGVkAAAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIASENvbnN1bWVyUmVnaXN0ZXJlZAAABBxhY2NvdW50AAIgQFBlcnNvblJlZ2lzdGVyZWQAAAgUYWxpYXMgHGFjY291bnQAUExpdGVQZXJzb25SZWdpc3RlcmVkAAAEHGFjY291bnQAaFBlcnNvbkF1dGhvcml6YXRpb25Ub3VjaGVkAAAEHGFjY291bnQAhEV4cGlyZWRVc2VybmFtZVJlc2VydmF0aW9uUmVtb3ZlZAAACCB1c2VybmFtZSQcYWNjb3VudABQSWRlbnRpZmllcktleVVwZGF0ZWQAAAQcYWNjb3VudAB4VXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uU2V0AAAEIGR1cmF0aW9uCFBTdG10U3RvcmVTbG90VXBkYXRlZAAACBxhY2NvdW50ACxzbG90X251bWJlcgQ0UGVyc29uRGVtb3RlZAAABBxhY2NvdW50AAIMEFIyZTkAAQUUUjJlMTAAAQUUUjJlMTQAAQUCCGhDaHVua1BhZ2VIYXNoZXNJbml0aWFsaXplZAAACDRyaW5nX2V4cG9uZW50+QIsdG90YWxfcGFnZXMELENodW5rc0FkZGVkAAAMNHJpbmdfZXhwb25lbnT5AixzdGFydF9pbmRleAQUY291bnQEAiAsTWVtYmVyQWRkZWQAAAQMa2V5IDRNZW1iZXJSZW1vdmVkAAAEDGtleSBsQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uAAAEKGlkZW50aWZpZXIgRENvbGxlY3Rpb25EZWxldGVkAAAEKGlkZW50aWZpZXIgJFJpbmdCdWlsdAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BEBNZW1iZXJzT25ib2FyZGVkAAAEKGlkZW50aWZpZXIgLFJpbmdzTWVyZ2VkAAAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgERE9uYm9hcmRpbmdTaXplU2V0AAAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQCCBhOYXRpdmUAAQUYU3RhYmxlAAEFAlgkQ29pblNwbGl0AAAEMG91dHB1dF9jb3VudAQ8Q29pblRyYW5zZmVycmVkAAAMCHRvABR2YWx1ZQQcbmV3X2FnZQRYUmVjeWNsZXJMb2FkZWRXaXRoQ29pbgAABBR2YWx1ZQR8UmVjeWNsZXJMb2FkZWRXaXRoRXh0ZXJuYWxBc3NldAAADAx3aG8AFHZhbHVlBBhhbW91bnQIYFJlY3ljbGVyVW5sb2FkZWRJbnRvQ29pbgAAEAh0bwAsaW5wdXRfdmFsdWUEMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEhFJlY3ljbGVyVW5sb2FkZWRJbnRvRXh0ZXJuYWxBc3NldAAAEAh0bwAUdmFsdWUELGlucHV0X2NvdW50BBhhbW91bnQIhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbgAACAxmZWUIJGRlc3Ryb3llZAiMUGFpZFVubG9hZFRva2VuUmVnaXN0ZXJlZFdpdGhOYXRpdmUAAAgMd2hvAAxmZWUIjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoU3RhYmxlAAAIDHdobwAMZmVlCHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEhExpdGVQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEZFJlY3ljbGVyc1VubG9hZGVkSW50b0NvaW4AAAwIdG8AMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMAABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5BQNkUmVjeWNsZXJVbmxvYWRlZEludG9Db2lucwAABDBvdXRwdXRfY291bnQEfENvaW5PZmZib2FyZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8AFHZhbHVlBBhhbW91bnQIPFJlY3ljbGVyQ2xlYW5lZAAADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CGRDb25zdW1lZEZyZWVUb2tlbnNDbGVhbmVkAAAEGHBlcmlvZARoUGFpZFVubG9hZFRva2VuUmluZ0NsZWFuZWQAAAgYcGVyaW9kBChyaW5nX2luZGV4BExSZWN5Y2xlckR1c3RDbGVhbmVkAAEFaFBhaWRVbmxvYWRUb2tlbkR1c3RDbGVhbmVkAAEFnEV4cGlyZWRQYWlkVW5sb2FkVG9rZW5Db2xsZWN0aW9uRGVsZXRlZAAABBhwZXJpb2QEAkAwQXNzZXRDcmVhdGVkAAEFUFhjbUZ1bmRzVHJhbnNmZXJTZW50AAEFYFhjbUZ1bmRzVHJhbnNmZXJUaW1lZE91dAABBTRGdW5kc1ZlcmlmaWVkAAEFKFBvdHNGdW5kZWQAAQVcTW9iUnVsZVBheW91dHNTY2hlZHVsZWQAAQVUU2NvcmVQYXlvdXRzU2NoZWR1bGVkAAEFdE9uUG9sbEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAEFZE1pZ3JhdGlvblBlb3BsZVJlY29nbml6ZWQAAQVoTWlncmF0aW9uT25ib2FyZGluZ1NpemVTZXQAAQV4TWlncmF0aW9uUHJvb2ZPZklua0luaXRpYWxpemVkAAEFXE1pZ3JhdGlvbkdhbWVzU2NoZWR1bGVkAAEFXE1pZ3JhdGlvbkludml0ZXNHcmFudGVkAAEFfE1pZ3JhdGlvblJlaW1idXJzZW1lbnRWYWx1ZXNTZXQAAQWETWlncmF0aW9uQXR0ZXN0YXRpb25BbGxvd2FuY2VzU2V0AAEFSE1pZ3JhdGlvbkNvbXBsZXRlZAABBQIEXEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAEFAgQgUHJpemVTZXQAAAwgYXNzZXRfaWRRATBhc3NldF9hbW91bnQIHHdpbm5lcnMEAjRUUGFydGljaXBhbnRSZWdpc3RlcmVkAAAMIGV2ZW50X2lkBDhwYXJ0aWNpcGFudF9pZAQUYWxpYXMgMEV2ZW50U3RhcnRlZAAACAhpZAQUZXZlbnQVAzBFdmVudFNraXBwZWQAAAgIaWQEFGV2ZW50FQM4RXZlbnRTY2hlZHVsZWQAAAQgZXZlbnRfaWQEVFNjaGVkdWxlZEV2ZW50UmVtb3ZlZAAABCBldmVudF9pZARoRmFpbGVkVHJhbnNmZXJQcml6ZUNsYWltZWQAAAgMd2hvACBldmVudF9pZARgV2FpdGluZ0ZvckVudHJvcHlUb0J1aWxkAAAEIGV2ZW50X2lkBDhEcmF3aW5nV2lubmVycwAABCBldmVudF9pZAQwRGlzdHJpYnV0aW5nAAAEIGV2ZW50X2lkBEBQcml6ZURpc3RyaWJ1dGVkAAAQIGV2ZW50X2lkBBBkZXN0ACBhc3NldF9pZFEBMGFzc2V0X2Ftb3VudAhcUHJpemVEaXN0cmlidXRpb25GYWlsZWQAABAgZXZlbnRfaWQEEGRlc3QAIGFzc2V0X2lkUQEwYXNzZXRfYW1vdW50CDxDbGVhcmluZ1N0b3JhZ2UAAAQgZXZlbnRfaWQEOEV2ZW50Q29tcGxldGVkAAAEIGV2ZW50X2lkBAYkAiA4VXBncmFkZVN0YXJ0ZWQAAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAABBTRVcGdyYWRlRmFpbGVkAAEFQE1pZ3JhdGlvblNraXBwZWQAAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAAAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQAAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAAACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAAAELG5leHRfY3Vyc29yHQMCkBhTeXN0ZW0B2DxQYXJhY2hhaW5TeXN0ZW0B4CBCYWxhbmNlcwENAUhUcmFuc2FjdGlvblBheW1lbnQBEQFIU2tpcEZlZWxlc3NQYXltZW50AZUBRE9yaWdpblJlc3RyaWN0aW9uAZ0BGEFzc2V0cwGpATBBc3NldHNIb2xkZXIBrQEkQXNzZXRSYXRlAbEBOEFzc2V0VHhQYXltZW50AbkBRENvbGxhdG9yU2VsZWN0aW9uAcEBHFNlc3Npb24BxQEkWGNtcFF1ZXVlAckBLFBvbGthZG90WGNtAX0CKEN1bXVsdXNYY20BgQIwTWVzc2FnZVF1ZXVlAY0CHFV0aWxpdHkBmQIgTXVsdGlzaWcBoQIQU3VkbwGpAhRQcm94eQG1AiBJZGVudGl0eQHBAhhQZW9wbGUByQIcTW9iUnVsZQHRAihQcm9vZk9mSW5rAd0CEEdhbWUB5QIUU2NvcmUB6QIgRHVtbXlEaW0B7QIoUGVvcGxlTGl0ZQHxAiRSZXNvdXJjZXMB9QI0Q2h1bmtzTWFuYWdlcgH9AhxNZW1iZXJzAQEDHENvaW5hZ2UBCQNUU3RvcmFnZUluaXRpYWxpemF0aW9uAQ0DZFN0b3JhZ2VJbml0aWFsaXphdGlvbkxpdGUBEQMcQWlyZHJvcAEZA1BNdWx0aUJsb2NrTWlncmF0aW9ucwEhAwAMFHBoYXNlNBRldmVudCUDGHRvcGljc8UCBCkDAAQEAQgEMQMAAQEACDBzcGVjX3ZlcnNpb24EJHNwZWNfbmFtZTkDAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAAQOGJhc2VfZXh0cmluc2ljGDRtYXhfZXh0cmluc2ljDQIkbWF4X3RvdGFsDQIgcmVzZXJ2ZWQNAgAMGG5vcm1hbEUDLG9wZXJhdGlvbmFsRQMkbWFuZGF0b3J5RQMADChiYXNlX2Jsb2NrGCRtYXhfYmxvY2sYJHBlcl9jbGFzc0kDAAwYbm9ybWFsBCxvcGVyYXRpb25hbAQkbWFuZGF0b3J5BAAIEHJlYWQIFHdyaXRlCAMI2QEEBFkDAAAgJHNwZWNfbmFtZTkDJGltcGxfbmFtZTkDRGF1dGhvcmluZ192ZXJzaW9uBDBzcGVjX3ZlcnNpb24EMGltcGxfdmVyc2lvbgQQYXBpc10DTHRyYW5zYWN0aW9uX3ZlcnNpb24EOHN5c3RlbV92ZXJzaW9uBAQkAQgEZQMABCQAAAgkbXNnX2NvdW50BCx0b3RhbF9ieXRlcwQDCARxAwR1AwAADDR1bXBfbXNnX2NvdW50BDx1bXBfdG90YWxfYnl0ZXMENGhybXBfb3V0Z29pbmd5AwIIFEFib3J0AAEFHEdvQWhlYWQAAQUGgQMADDh1c2VkX2JhbmR3aWR0aH0DOHBhcmFfaGVhZF9oYXNo3GBjb25zdW1lZF9nb19haGVhZF9zaWduYWyFAwSJAwAGBAAMOHVzZWRfYmFuZHdpZHRofQM4aHJtcF93YXRlcm1hcmuRA2Bjb25zdW1lZF9nb19haGVhZF9zaWduYWyFAwAQLHBhcmVudF9oZWFkJExyZWxheV9wYXJlbnRfbnVtYmVyBGRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290IDBtYXhfcG92X3NpemUEAgQcUHJlc2VudAABBQadAwAIPHJlbWFpbmluZ19jb3VudAQ4cmVtYWluaW5nX3NpemUEABgwbWF4X2NhcGFjaXR5BDhtYXhfdG90YWxfc2l6ZQRAbWF4X21lc3NhZ2Vfc2l6ZQQkbXNnX2NvdW50BCh0b3RhbF9zaXplBCBtcWNfaGVhZNwDCASpAwStAwAAEDBkbXFfbXFjX2hlYWQgnHJlbGF5X2Rpc3BhdGNoX3F1ZXVlX3JlbWFpbmluZ19jYXBhY2l0eaUDQGluZ3Jlc3NfY2hhbm5lbHOxAzxlZ3Jlc3NfY2hhbm5lbHOxAwAITG1heF9jYW5kaWRhdGVfZGVwdGgEUGFsbG93ZWRfYW5jZXN0cnlfbGVuBAAoNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXO5AwMIBCAEwQMAAAgcc2VudF9hdAQscmV2ZXJzZV9pZHgEAAgkcmVjaXBpZW50BBBkYXRhJATNAwAAFCxwYXJlbnRfaGFzaCAYbnVtYmVyBChzdGF0ZV9yb290IDxleHRyaW5zaWNzX3Jvb3QgGGRpZ2VzdDAE1QMAABA8dmFsaWRhdGlvbl9kYXRhmQNEcmVsYXlfY2hhaW5fc3RhdGVtA2ByZWxheV9wYXJlbnRfZGVzY2VuZGFudHPZA0Bjb2xsYXRvcl9wZWVyX2lkHQMACBxzZW50X2F0BAxtc2ckBOEDAAAIHHNlbnRfYXQEIG1zZ19oYXNoIATpAwAACDRmdWxsX21lc3NhZ2Vz5QM8aGFzaGVkX21lc3NhZ2Vz7QMACBxzZW50X2F0BBBkYXRhJAMIBPUDBPkDAAMIBOkDBAEEAAAINGZ1bGxfbWVzc2FnZXP9AzxoYXNoZWRfbWVzc2FnZXMFBAAIRGRvd253YXJkX21lc3NhZ2Vz8QNMaG9yaXpvbnRhbF9tZXNzYWdlcwkEAgwMRmVlAAEFEE1pc2MAAQUMQWxsAAEFAAwIaWTZARhhbW91bnQIHHJlYXNvbnMRBAQVBAAACAhpZNkBGGFtb3VudAgEHQQAAAgIaWQFARhhbW91bnQIBCUEAAAEGGFtb3VudAgELQQAAhQISWQBABRJbmRleAGRAgxSYXcBJCRBZGRyZXNzMzIBICRBZGRyZXNzMjABIQECCCBJbmNyZWFzZQABBSBEZWNyZWFzZQABBQIIJFYxQW5jaWVudAABBQhWMgABBQAIEHVzZWQIIGF0X2Jsb2NrBAIMEExpdmUAAQUYRnJvemVuAAEFKERlc3Ryb3lpbmcAAQUAMBRvd25lcgAYaXNzdWVyABRhZG1pbgAcZnJlZXplcgAYc3VwcGx5CBxkZXBvc2l0CCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQgYWNjb3VudHMELHN1ZmZpY2llbnRzBCRhcHByb3ZhbHMEGHN0YXR1c0UEAwhRAQACDBhMaXF1aWQAAQUYRnJvemVuAAEFHEJsb2NrZWQAAQUCFCBDb25zdW1lcgABBShTdWZmaWNpZW50AAEFLERlcG9zaXRIZWxkAQg8RGVwb3NpdFJlZnVuZGVkAAEFLERlcG9zaXRGcm9tAAMIAAgADBxiYWxhbmNlCBhzdGF0dXNRBBhyZWFzb25VBAMMUQEAAAAIGGFtb3VudAgcZGVwb3NpdAgAFBxkZXBvc2l0CBBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UBkkEBmUEAAgMd2hvABxkZXBvc2l0CARxBAADCAAgBHkEAAMIKCQDCAgEAggIT2sAAQUkU3VzcGVuZGVkAAEFABQkcmVjaXBpZW50BBRzdGF0ZYkENHNpZ25hbHNfZXhpc3QULGZpcnN0X2luZGV4BChsYXN0X2luZGV4BASNBAADCAQEAAxEc3VzcGVuZF90aHJlc2hvbGQEOGRyb3BfdGhyZXNob2xkBEByZXN1bWVfdGhyZXNob2xkBAZ1AgUBCAahBAKgIE92ZXJmbG93AAEFNFVuaW1wbGVtZW50ZWQAAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAQUwTG9jYXRpb25GdWxsAAEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQABBSRCYWRPcmlnaW4AAQU8SW52YWxpZExvY2F0aW9uAAEFNEFzc2V0Tm90Rm91bmQAAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAEFPE5vdFdpdGhkcmF3YWJsZQABBUhMb2NhdGlvbkNhbm5vdEhvbGQAAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAAEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQUwVW5rbm93bkNsYWltAAEFOEZhaWxlZFRvRGVjb2RlAAEFQE1heFdlaWdodEludmFsaWQAAQU4Tm90SG9sZGluZ0ZlZXMAAQUwVG9vRXhwZW5zaXZlAAEFEFRyYXABCEBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQMIBKkEBq0EAhgQTnVsbAABBRhBc3NldHMBZQI8RXhlY3V0aW9uUmVzdWx0AbEEHFZlcnNpb24BBCxQYWxsZXRzSW5mbwH9AThEaXNwYXRjaFJlc3VsdAEBAgIYEE51bGwAAQUYQXNzZXRzAW0CPEV4ZWN1dGlvblJlc3VsdAGxBBxWZXJzaW9uAQQsUGFsbGV0c0luZm8B/QE4RGlzcGF0Y2hSZXN1bHQBAQICDAhWMwG1BAhWNAG5BAhWNQEFAgIMHFBlbmRpbmcAABAkcmVzcG9uZGVydQJMbWF5YmVfbWF0Y2hfcXVlcmllcp0EMG1heWJlX25vdGlmeaUEHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgAACBhvcmlnaW51AiRpc19hY3RpdmUUFFJlYWR5AAAIIHJlc3BvbnNlvQQIYXQEAwgEdQIDDAgYBAMIdQIEBM0EAAIQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAEFXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEFUE5vdGlmeUN1cnJlbnRUYXJnZXRzAR0DaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAEFAgwIVjMBXQIIVjQBWQIIVjUBUQEDDAQA2QQDCJECCAThBAAAEBhhbW91bnQIFG93bmVydQIYbG9ja2VydQIkY29uc3VtZXJz5QQDCAh1AgTtBAAACCBsb2NhdGlvbnUCGGV4cGlyeXkCBPUEAAAEIGFsaWFzZXJz+QQGWQIADCxkZXN0aW5hdGlvblkCIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIQDEFsbAABBRRBbGxPZgAACAhpZF0CDGZ1bhUCKEFsbENvdW50ZWQBBDBBbGxPZkNvdW50ZWQAAAwIaWRdAgxmdW4VAhRjb3VudAQCCCBEZWZpbml0ZQFlAhBXaWxkAQkFAsA0V2l0aGRyYXdBc3NldAFlAlRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBZQJYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAFlAjRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZbUEKG1heF93ZWlnaHQYHHF1ZXJpZXIBBTRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c2UCLGJlbmVmaWNpYXJ5WQJQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRzZQIQZGVzdFkCDHhjbRUFIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kCQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAAADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAAABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwAADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgABBTREZXNjZW5kT3JpZ2luAVUCLFJlcG9ydEVycm9yAQUFMERlcG9zaXRBc3NldAAACBhhc3NldHMNBSxiZW5lZmljaWFyeVkCTERlcG9zaXRSZXNlcnZlQXNzZXQAAAwYYXNzZXRzDQUQZGVzdFkCDHhjbRUFNEV4Y2hhbmdlQXNzZXQAAAwQZ2l2ZQ0FEHdhbnRlAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwAADBhhc3NldHMNBRxyZXNlcnZlWQIMeGNtFQVASW5pdGlhdGVUZWxlcG9ydAAADBhhc3NldHMNBRBkZXN0WQIMeGNtFQU0UmVwb3J0SG9sZGluZwAACDRyZXNwb25zZV9pbmZvBQUYYXNzZXRzDQUwQnV5RXhlY3V0aW9uAAAIEGZlZXNhAjB3ZWlnaHRfbGltaXQhAjRSZWZ1bmRTdXJwbHVzAAEFPFNldEVycm9ySGFuZGxlcgEVBSxTZXRBcHBlbmRpeAEVBShDbGVhckVycm9yAAEFKENsYWltQXNzZXQAAAgYYXNzZXRzZQIYdGlja2V0WQIQVHJhcAEIQFN1YnNjcmliZVZlcnNpb24AAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgABBSRCdXJuQXNzZXQBZQIsRXhwZWN0QXNzZXQBZQIwRXhwZWN0T3JpZ2luAQEFLEV4cGVjdEVycm9yAbEEUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQECLFF1ZXJ5UGFsbGV0AAAILG1vZHVsZV9uYW1lJDRyZXNwb25zZV9pbmZvBQUwRXhwZWN0UGFsbGV0AAAUFGluZGV4BBBuYW1lJCxtb2R1bGVfbmFtZSQsY3JhdGVfbWFqb3IEPG1pbl9jcmF0ZV9taW5vcgRQUmVwb3J0VHJhbnNhY3RTdGF0dXMBBQVMQ2xlYXJUcmFuc2FjdFN0YXR1cwABBTxVbml2ZXJzYWxPcmlnaW4BUQI0RXhwb3J0TWVzc2FnZQAADBxuZXR3b3JrSQIsZGVzdGluYXRpb25VAgx4Y20VBSRMb2NrQXNzZXQAAAgUYXNzZXRhAiB1bmxvY2tlclkCLFVubG9ja0Fzc2V0AAAIFGFzc2V0YQIYdGFyZ2V0WQI4Tm90ZVVubG9ja2FibGUAAAgUYXNzZXRhAhRvd25lclkCNFJlcXVlc3RVbmxvY2sAAAgUYXNzZXRhAhhsb2NrZXJZAixTZXRGZWVzTW9kZQAABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljASAoQ2xlYXJUb3BpYwABBSxBbGlhc09yaWdpbgFZAjxVbnBhaWRFeGVjdXRpb24AAAgwd2VpZ2h0X2xpbWl0IQIwY2hlY2tfb3JpZ2luAQUEEQUAAhAMQWxsAAEFFEFsbE9mAAAICGlkWQIMZnVuFQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZFkCDGZ1bhUCFGNvdW50BAIIIERlZmluaXRlAW0CEFdpbGQBGQUCwDRXaXRoZHJhd0Fzc2V0AW0CVFJlc2VydmVBc3NldERlcG9zaXRlZAFtAlhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AW0CNFF1ZXJ5UmVzcG9uc2UAABAgcXVlcnlfaWQIIHJlc3BvbnNluQQobWF4X3dlaWdodBgccXVlcmllcgEFNFRyYW5zZmVyQXNzZXQAAAgYYXNzZXRzbQIsYmVuZWZpY2lhcnlZAlBUcmFuc2ZlclJlc2VydmVBc3NldAAADBhhc3NldHNtAhBkZXN0WQIMeGNtJQUgVHJhbnNhY3QAAAwsb3JpZ2luX2tpbmQJAlhyZXF1aXJlX3dlaWdodF9hdF9tb3N0GBBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BVQIsUmVwb3J0RXJyb3IBBQUwRGVwb3NpdEFzc2V0AAAIGGFzc2V0cx0FLGJlbmVmaWNpYXJ5WQJMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHMdBRBkZXN0WQIMeGNtJQU0RXhjaGFuZ2VBc3NldAAADBBnaXZlHQUQd2FudG0CHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0cx0FHHJlc2VydmVZAgx4Y20lBUBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0cx0FEGRlc3RZAgx4Y20lBTRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8FBRhhc3NldHMdBTBCdXlFeGVjdXRpb24AAAgQZmVlc2kCMHdlaWdodF9saW1pdCECNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyASUFLFNldEFwcGVuZGl4ASUFKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHNtAhh0aWNrZXRZAhBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAFtAixFeHBlY3RBc3NldAFtAjBFeHBlY3RPcmlnaW4BAQUsRXhwZWN0RXJyb3IBsQRQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8FBTBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEFBUxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgFRAjRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmtJAixkZXN0aW5hdGlvblUCDHhjbSUFJExvY2tBc3NldAAACBRhc3NldGkCIHVubG9ja2VyWQIsVW5sb2NrQXNzZXQAAAgUYXNzZXRpAhh0YXJnZXRZAjhOb3RlVW5sb2NrYWJsZQAACBRhc3NldGkCFG93bmVyWQI0UmVxdWVzdFVubG9jawAACBRhc3NldGkCGGxvY2tlclkCLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAVkCPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQhAjBjaGVja19vcmlnaW4BBQQhBQACDAhWMwEVBQhWNAElBQhWNQFBAgIQIFRlbGVwb3J0AAEFMExvY2FsUmVzZXJ2ZQABBUhEZXN0aW5hdGlvblJlc2VydmUAAQU0UmVtb3RlUmVzZXJ2ZQF1AgAIEHByZXaFAhBuZXh0hQIGMQUAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3VyczUFNG1lc3NhZ2VfY291bnQIEHNpemUIAwiFAgQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkAiwYcmVtYXJrAAAEGHJlbWFyayQ4c2V0X2hlYXBfcGFnZXMAAAQUcGFnZXMIIHNldF9jb2RlAAAEEGNvZGUkXHNldF9jb2RlX3dpdGhvdXRfY2hlY2tzAAAEEGNvZGUkLHNldF9zdG9yYWdlAAAEFGl0ZW1zaQMwa2lsbF9zdG9yYWdlAAAEEGtleXNtAyxraWxsX3ByZWZpeAAACBhwcmVmaXgkHHN1YmtleXMERHJlbWFya193aXRoX2V2ZW50AAAEGHJlbWFyayREYXV0aG9yaXplX3VwZ3JhZGUAAAQkY29kZV9oYXNoIIBhdXRob3JpemVfdXBncmFkZV93aXRob3V0X2NoZWNrcwAABCRjb2RlX2hhc2ggYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQAABBBjb2RlJAIITHNldF92YWxpZGF0aW9uX2RhdGEAAAgQZGF0Yd0DVGluYm91bmRfbWVzc2FnZXNfZGF0YQ0EYHN1ZG9fc2VuZF91cHdhcmRfbWVzc2FnZQAABBxtZXNzYWdlJAIEDHNldAAABAxub3cIAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgAAAgQZGVzdDUEFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgAADBhzb3VyY2U1BBBkZXN0NQQUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAgQZGVzdDUEFHZhbHVlCDB0cmFuc2Zlcl9hbGwAAAgQZGVzdDUEKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQAACAx3aG81BBhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMAAAQMd2hvvQFEZm9yY2Vfc2V0X2JhbGFuY2UAAAgMd2hvNQQgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQAACCRkaXJlY3Rpb245BBRkZWx0YQgQYnVybgAACBR2YWx1ZQgoa2VlcF9hbGl2ZRQCBCxjbGVhbl91c2FnZQAABBhlbnRpdHmZAQKIGGNyZWF0ZQAADAhpZFEBFGFkbWluNQQsbWluX2JhbGFuY2UIMGZvcmNlX2NyZWF0ZQAAEAhpZFEBFG93bmVyNQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UINHN0YXJ0X2Rlc3Ryb3kAAAQIaWRRAUBkZXN0cm95X2FjY291bnRzAAAECGlkUQFEZGVzdHJveV9hcHByb3ZhbHMAAAQIaWRRAThmaW5pc2hfZGVzdHJveQAABAhpZFEBEG1pbnQAAAwIaWRRASxiZW5lZmljaWFyeTUEGGFtb3VudAgQYnVybgAADAhpZFEBDHdobzUEGGFtb3VudAggdHJhbnNmZXIAAAwIaWRRARh0YXJnZXQ1BBhhbW91bnQITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAwIaWRRARh0YXJnZXQ1BBhhbW91bnQIOGZvcmNlX3RyYW5zZmVyAAAQCGlkUQEYc291cmNlNQQQZGVzdDUEGGFtb3VudAgYZnJlZXplAAAICGlkUQEMd2hvNQQQdGhhdwAACAhpZFEBDHdobzUEMGZyZWV6ZV9hc3NldAAABAhpZFEBKHRoYXdfYXNzZXQAAAQIaWRRAUh0cmFuc2Zlcl9vd25lcnNoaXAAAAgIaWRRARRvd25lcjUEIHNldF90ZWFtAAAQCGlkUQEYaXNzdWVyNQQUYWRtaW41BBxmcmVlemVyNQQwc2V0X21ldGFkYXRhAAAQCGlkUQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQ4Y2xlYXJfbWV0YWRhdGEAAAQIaWRRAUhmb3JjZV9zZXRfbWV0YWRhdGEAABQIaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UUGZvcmNlX2NsZWFyX21ldGFkYXRhAAAECGlkUQFIZm9yY2VfYXNzZXRfc3RhdHVzAAAgCGlkUQEUb3duZXI1BBhpc3N1ZXI1BBRhZG1pbjUEHGZyZWV6ZXI1BCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQkaXNfZnJvemVuFEBhcHByb3ZlX3RyYW5zZmVyAAAMCGlkUQEgZGVsZWdhdGU1BBhhbW91bnQIPGNhbmNlbF9hcHByb3ZhbAAACAhpZFEBIGRlbGVnYXRlNQRUZm9yY2VfY2FuY2VsX2FwcHJvdmFsAAAMCGlkUQEUb3duZXI1BCBkZWxlZ2F0ZTUERHRyYW5zZmVyX2FwcHJvdmVkAAAQCGlkUQEUb3duZXI1BCxkZXN0aW5hdGlvbjUEGGFtb3VudAgUdG91Y2gAAAQIaWRRARhyZWZ1bmQAAAgIaWRRAShhbGxvd19idXJuFDxzZXRfbWluX2JhbGFuY2UAAAgIaWRRASxtaW5fYmFsYW5jZQgsdG91Y2hfb3RoZXIAAAgIaWRRAQx3aG81BDByZWZ1bmRfb3RoZXIAAAgIaWRRAQx3aG81BBRibG9jawAACAhpZFEBDHdobzUEMHRyYW5zZmVyX2FsbAAADAhpZFEBEGRlc3Q1BChrZWVwX2FsaXZlFDBzZXRfcmVzZXJ2ZXMAAAgIaWRRASByZXNlcnZlc6UBAgwYY3JlYXRlAAAIKGFzc2V0X2tpbmRRARByYXRlCBh1cGRhdGUAAAgoYXNzZXRfa2luZFEBEHJhdGUIGHJlbW92ZQAABChhc3NldF9raW5kUQECJERzZXRfaW52dWxuZXJhYmxlcwAABAxuZXe9AVhzZXRfZGVzaXJlZF9jYW5kaWRhdGVzAAAEDG1heARIc2V0X2NhbmRpZGFjeV9ib25kAAAEEGJvbmQIVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQABBTBsZWF2ZV9pbnRlbnQAAQVAYWRkX2ludnVsbmVyYWJsZQAABAx3aG8ATHJlbW92ZV9pbnZ1bG5lcmFibGUAAAQMd2hvACx1cGRhdGVfYm9uZAAABCxuZXdfZGVwb3NpdAhMdGFrZV9jYW5kaWRhdGVfc2xvdAAACBxkZXBvc2l0CBh0YXJnZXQAAgggc2V0X2tleXMAAAgQa2V5cyAUcHJvb2YkKHB1cmdlX2tleXMAAQUCFFRzdXNwZW5kX3hjbV9leGVjdXRpb24AAQVQcmVzdW1lX3hjbV9leGVjdXRpb24AAQVgdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkAAAEDG5ldwRUdXBkYXRlX2Ryb3BfdGhyZXNob2xkAAAEDG5ldwRcdXBkYXRlX3Jlc3VtZV90aHJlc2hvbGQAAAQMbmV3BAJEEHNlbmQAAAgQZGVzdHUCHG1lc3NhZ2UpBTx0ZWxlcG9ydF9hc3NldHMAABAQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAAAQEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAAAIHG1lc3NhZ2UpBShtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgAACCBsb2NhdGlvblEBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24AAAREbWF5YmVfeGNtX3ZlcnNpb26RA3hmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkAAAQgbG9jYXRpb251AoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQAABCBsb2NhdGlvbnUCfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMAABQQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdCECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAAAUEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQhAkBmb3JjZV9zdXNwZW5zaW9uAAAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAAAUEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQhAjBjbGFpbV9hc3NldHMAAAgYYXNzZXRzcQIsYmVuZWZpY2lhcnl1Aox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgAAHBBkZXN0dQIYYXNzZXRzcQJQYXNzZXRzX3RyYW5zZmVyX3R5cGUtBThyZW1vdGVfZmVlc19pZNkESGZlZXNfdHJhbnNmZXJfdHlwZS0FSGN1c3RvbV94Y21fb25fZGVzdCkFMHdlaWdodF9saW1pdCECUGFkZF9hdXRob3JpemVkX2FsaWFzAAAIHGFsaWFzZXJ1AhxleHBpcmVzeQJccmVtb3ZlX2F1dGhvcml6ZWRfYWxpYXMAAAQcYWxpYXNlcnUCdHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzAAEFAggkcmVhcF9wYWdlAAAIOG1lc3NhZ2Vfb3JpZ2luhQIocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AAAQOG1lc3NhZ2Vfb3JpZ2luhQIQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCIBRiYXRjaAAABBRjYWxsc80GNGFzX2Rlcml2YXRpdmUAAAgUaW5kZXgEEGNhbGzJBiRiYXRjaF9hbGwAAAQUY2FsbHPNBixkaXNwYXRjaF9hcwAACCRhc19vcmlnaW6RARBjYWxsyQYsZm9yY2VfYmF0Y2gAAAQUY2FsbHPNBix3aXRoX3dlaWdodAAACBBjYWxsyQYYd2VpZ2h0GBxpZl9lbHNlAAAIEG1haW7JBiBmYWxsYmFja8kGUGRpc3BhdGNoX2FzX2ZhbGxpYmxlAAAIJGFzX29yaWdpbpEBEGNhbGzJBgadAgIUUGFzX211bHRpX3RocmVzaG9sZF8xAAAIRG90aGVyX3NpZ25hdG9yaWVzvQEQY2FsbMkGIGFzX211bHRpAAAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ATxtYXliZV90aW1lcG9pbnR5BRBjYWxsyQYobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQAAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVzvQE8bWF5YmVfdGltZXBvaW50eQUkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkAABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJHRpbWVwb2ludJ0CJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AAAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ASRjYWxsX2hhc2ggAhQQc3VkbwAABBBjYWxsyQZUc3Vkb191bmNoZWNrZWRfd2VpZ2h0AAAIEGNhbGzJBhh3ZWlnaHQYHHNldF9rZXkAAAQMbmV3NQQcc3Vkb19hcwAACAx3aG81BBBjYWxsyQYocmVtb3ZlX2tleQABBQatAgIsFHByb3h5AAAMEHJlYWw1BEBmb3JjZV9wcm94eV90eXBlhQUQY2FsbMkGJGFkZF9wcm94eQAADCBkZWxlZ2F0ZTUEKHByb3h5X3R5cGWtAhRkZWxheQQwcmVtb3ZlX3Byb3h5AAAMIGRlbGVnYXRlNQQocHJveHlfdHlwZa0CFGRlbGF5BDhyZW1vdmVfcHJveGllcwABBSxjcmVhdGVfcHVyZQAADChwcm94eV90eXBlrQIUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUAABQcc3Bhd25lcjUEKHByb3h5X3R5cGWtAhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAAAIEHJlYWw1BCRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQAAAgQcmVhbDUEJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAAACCBkZWxlZ2F0ZTUEJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAAAQIGRlbGVnYXRlNQQQcmVhbDUEQGZvcmNlX3Byb3h5X3R5cGWFBRBjYWxsyQYwcG9rZV9kZXBvc2l0AAEFBQEMBQEUBQEYBQEcBQEkBQEoBQEsBQEwBQE0BQE4BQE8BQFEBQFIBQFMBQFUBQFYBQFcBQFgBQFkBQFoBQFsBQFwBQF0BQF4BQF8ApgQTm9uZQABBRBSYXcwAZECEFJhdzEBBBBSYXcyAaEEEFJhdzMBjQUQUmF3NAEoEFJhdzUBkQUQUmF3NgGVBRBSYXc3AZkFEFJhdzgB2QEQUmF3OQGdBRRSYXcxMAGhBRRSYXcxMQGlBRRSYXcxMgGpBRRSYXcxMwGtBRRSYXcxNAGxBRRSYXcxNQG1BRRSYXcxNgHdARRSYXcxNwG5BRRSYXcxOAG9BRRSYXcxOQHBBRRSYXcyMAEhARRSYXcyMQHFBRRSYXcyMgHJBRRSYXcyMwHNBRRSYXcyNAHRBRRSYXcyNQHVBRRSYXcyNgHZBRRSYXcyNwHdBRRSYXcyOAHhBRRSYXcyOQHlBRRSYXczMAHpBRRSYXczMQHtBRRSYXczMgEgLEJsYWtlVHdvMjU2ASAYU2hhMjU2ASAkS2VjY2FrMjU2ASAsU2hhVGhyZWUyNTYBIAYhAQAoHGRpc3BsYXnxBRRsZWdhbPEFDHdlYvEFGG1hdHJpePEFFGVtYWls8QU8cGdwX2ZpbmdlcnByaW509QUUaW1hZ2XxBRx0d2l0dGVy8QUYZ2l0aHVi8QUcZGlzY29yZPEFAwgA8QUE/QUAAiAcVW5rbm93bgABBRxGZWVQYWlkAQgoUmVhc29uYWJsZQABBSRLbm93bkdvb2QAAQUkT3V0T2ZEYXRlAAEFKExvd1F1YWxpdHkAAQUkRXJyb25lb3VzAAEFIEV4dGVybmFsAAEFBQEBAQUBBQECEBxFZDI1NTE5AQkGHFNyMjU1MTkBCQYURWNkc2EBDQYMRXRoAQ0GBhEGAgwcVHdpdHRlcgAABCB1c2VybmFtZSQYR2l0aHViAAAEIHVzZXJuYW1lJBxEaXNjb3JkAAAEPGRpc3BsYXlfYW5kX3RhZyQCeDRhZGRfcmVnaXN0cmFyAAAEHGFjY291bnQ1BDBzZXRfaWRlbnRpdHkAAAQQaW5mb/kFIHNldF9zdWJzAAAEEHN1YnMBBjhjbGVhcl9pZGVudGl0eQABBURyZXF1ZXN0X2p1ZGdlbWVudAAACCRyZWdfaW5kZXgEHG1heF9mZWUIOGNhbmNlbF9yZXF1ZXN0AAAEJHJlZ19pbmRleAQcc2V0X2ZlZQAACBRpbmRleAQMZmVlCDhzZXRfYWNjb3VudF9pZAAACBRpbmRleAQMbmV3NQQoc2V0X2ZpZWxkcwAACBRpbmRleAQYZmllbGRzCERwcm92aWRlX2p1ZGdlbWVudAAAECRyZWdfaW5kZXgEGHRhcmdldDUEJGp1ZGdlbWVudAUGIGlkZW50aXR5IDRraWxsX2lkZW50aXR5AAAEGHRhcmdldDUEHGFkZF9zdWIAAAgMc3ViNQQQZGF0YfEFKHJlbmFtZV9zdWIAAAgMc3ViNQQQZGF0YfEFKHJlbW92ZV9zdWIAAAQMc3ViNQQgcXVpdF9zdWIAAQVYYWRkX3VzZXJuYW1lX2F1dGhvcml0eQAADCRhdXRob3JpdHk1BBhzdWZmaXgkKGFsbG9jYXRpb24EZHJlbW92ZV91c2VybmFtZV9hdXRob3JpdHkAAAgYc3VmZml4JCRhdXRob3JpdHk1BEBzZXRfdXNlcm5hbWVfZm9yAAAQDHdobzUEIHVzZXJuYW1lJCRzaWduYXR1cmUVBjh1c2VfYWxsb2NhdGlvbhQ8YWNjZXB0X3VzZXJuYW1lAAAEIHVzZXJuYW1lJFxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAAABCB1c2VybmFtZSRQc2V0X3ByaW1hcnlfdXNlcm5hbWUAAAQgdXNlcm5hbWUkPHVuYmluZF91c2VybmFtZQAABCB1c2VybmFtZSQ8cmVtb3ZlX3VzZXJuYW1lAAAEIHVzZXJuYW1lJDRraWxsX3VzZXJuYW1lAAAEIHVzZXJuYW1lJFRzZXRfcGVyc29uYWxfaWRlbnRpdHkAAAwcYWNjb3VudAAkc2lnbmF0dXJlEQYgdXNlcm5hbWUkjHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlAAAEKGNyZWRlbnRpYWwZBmhwZXJzb25hbF9jcmVkZW50aWFsX2p1ZGdlZAAADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudL0CXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5AAEFPHJlcG9ydF91c2VybmFtZQAABCB1c2VybmFtZSRgcmVwb3J0ZWRfdXNlcm5hbWVfanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50vQICHCx1bmRlcl9hbGlhcwAABBBjYWxsyQZEc2V0X2FsaWFzX2FjY291bnQAAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdARMdW5zZXRfYWxpYXNfYWNjb3VudAABBWhmb3JjZV9yZWNvZ25pemVfcGVyc29uaG9vZAAABBhwZW9wbGXFAlxzZXRfcGVyc29uYWxfaWRfYWNjb3VudAAACBxhY2NvdW50ADRjYWxsX3ZhbGlkX2F0BGR1bnNldF9wZXJzb25hbF9pZF9hY2NvdW50AAEFYGNyZWF0ZV9wZW9wbGVfY29sbGVjdGlvbgABBQJEEHZvdGUAAAgoY2FzZV9pbmRleAQcb3Bpbmlvbr0CKGNsb3NlX2Nhc2UAAAQoY2FzZV9pbmRleAQoY2xlYW5fdm90ZQAACChjYXNlX2luZGV4BBR2b3RlciAkcmVhcF9jYXNlAAAEKGNhc2VfaW5kZXgEJGludGVydmVuZQAACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIoY2xhaW1fdm90ZQAABChjYXNlX2luZGV4BDhwYXlvdXRfcmV3YXJkcwAABCxkZXN0aW5hdGlvbgAsY2xhaW1fdm90ZXMAAAQwY2FzZV9pbmRpY2VzzQJIc3RhcnRfcGF5b3V0X3JvdW5kAAEFWHNjaGVkdWxlX3BheW91dF9yb3VuZHMAAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBFhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlAAAEFGluZGV4BDBjbGFpbV9jcmVkaXQAAQUwY2xlYW5fcG9pbnRzAAAIFHJvdW5kBBR2b3RlciBAZm9yY2VfcmlwZW5fY2FzZQAABChjYXNlX2luZGV4BCh0b3VjaF9jYXNlAAAEKGNhc2VfaW5kZXgEUGNsZWFyX3ZvdGluZ19wZW5hbHR5AAEFRGNsZWFuX3ZvdGVfc2lnbmVkAAAIKGNhc2VfaW5kZXgEFHZvdGVyIAUBgQECFEBEZXNpZ25lZEVsZWN0aXZlAAQEAQhEUHJvY2VkdXJhbEFjY291bnQBBEhQcm9jZWR1cmFsUGVyc29uYWwBBChQcm9jZWR1cmFsAAMIBARQUHJvY2VkdXJhbERlcml2YXRpdmUAAwgIeQIEhQQAAlgUYXBwbHkAAQU8c3VibWl0X2V2aWRlbmNlAAAEIGV2aWRlbmNlIBhqdWRnZWQAAAwYdGlja2V0BBxjb250ZXh0JCRqdWRnZW1lbnS9AkRyZWdpc3Rlcl9yZWZlcnJlZAAADAxrZXkgLGRlc3RpbmF0aW9uAEhwcm9vZl9vZl9vd25lcnNoaXApBlRyZWdpc3Rlcl9ub25fcmVmZXJyZWQAAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwKQYYcmVyb2xsAAEFGGNvbW1pdAAACBhjaG9pY2UtBihyZXF1aXJlX2lkeQI0YWxsb2NhdGVfZnVsbAABBRx0aW1lb3V0AAAEHGFjY291bnQAIGZsYWtlb3V0AAEFUGFwcGx5X3dpdGhfc2lnbmF0dXJlAAAMIHJlZmVycmVyCCRzaWduYXR1cmURBhh0aWNrZXQAVGFwcGx5X3dpdGhfaW52aXRhdGlvbgAADBxpbnZpdGVyABh0aWNrZXQAJHNpZ25hdHVyZREGRGFkZF9kZXNpZ25fZmFtaWx5AAAMFGluZGV4BBBraW5k1QIIaWQgTHNldF9yZWZlcnJhbF90aWNrZXQAAAQYdGlja2V0AFhjYW5jZWxfcmVmZXJyYWxfdGlja2V0AAAEGHRpY2tldACMcmVnaXN0ZXJfc3VjY2Vzc2Z1bF9yZWZlcnJhbF9yZXdhcmQAAAQsZGVzdGluYXRpb24ANGdyYW50X2ludml0ZXMAAAgcYWNjb3VudAAUY291bnQEkHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwAACBxhY2NvdW50ABRsaW1pdAREc2V0X2ludml0ZV90aWNrZXQAAAQYdGlja2V0AFBjYW5jZWxfaW52aXRlX3RpY2tldAAABBh0aWNrZXQARHNldF9jb25maWd1cmF0aW9uAAAEGGNvbmZpZ9kCYHNldF9yZWltYnVyc2VtZW50X3ZhbHVlcwAACDxyZWZlcnJlZF92YWx1ZXMxBjxyZWZlcnJlcl92YWx1ZXMxBgIIGFBlcnNvbgABBSROb3RQZXJzb24AAQUEOQYABD0GAAAMOGdhbWVfcGxheV90aW1lBBhyb3VuZHMEOG1heF9ncm91cF9zaXplBARFBgAAFDByZWdpc3RyYXRpb24EHHNodWZmbGUETHBvc3Rfc2h1ZmZsZV9tYXJnaW4EJHJlcG9ydGluZwQ4cGxheWVyX3Byb2Nlc3MEAkBMc2lnbl91cF93aXRoX2ludml0ZQAABDhpZGVudGlmaWVyX2tleQ0GUHNpZ25fdXBfd2l0aF9hY2NvdW50AAAEOGlkZW50aWZpZXJfa2V5DQZIc2lnbl91cF93aXRoX2FsaWFzAAAMOGlkZW50aWZpZXJfa2V5DQZEc3RhdGVtZW50X2FjY291bnQADHNpZxEGGHJlcG9ydAAABCxmdWxsX3JlcG9ydEEGIG9mZmJvYXJkAAEFHGtpY2tvdXQAAAQYcGxheWVyADRncmFudF9pbnZpdGVzAAAIHGFjY291bnQAFGNvdW50BJByZW1vdmVfYXZhaWxhYmxlX2FuZF9wZW5kaW5nX2ludml0ZXMAAAgcYWNjb3VudAAUbGltaXQERHNldF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldABQY2FuY2VsX2ludml0ZV90aWNrZXQAAAQYdGlja2V0ADhzY2hlZHVsZV9nYW1lcwAABDxnYW1lc19zY2hlZHVsZXNJBlRyZW1vdmVfc2NoZWR1bGVkX2dhbWUAAAQ4Z2FtZV9wbGF5X3RpbWUEbHRlc3RuZXRfZm9yY2Vfc3RhcnRfc2h1ZmZsZQABBWx0ZXN0bmV0X2ZvcmNlX2VuZF9yZXBvcnRpbmcAAQVcdGVzdG5ldF9zZXRfZ2FtZV9waGFzZXMAAAQYcGhhc2VzTQZkdGVzdG5ldF9raWxsX2N1cnJlbnRfZ2FtZQABBQMIICkGBlUGAAxkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZAQYd2luZG93BDhhbGxvd2VkX21pc3NlcwQEXQYAAiBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleARAdHJhbnNpdGlvbl9yb3VuZAAABCxyb3VuZF9pbmRleARQb3BlcmF0ZV9wYXlvdXRfcm91bmQAAAgscm91bmRfaW5kZXgEFGxpbWl0BCBjYXNoX291dAABBTRyZWRlZW1fY3JlZGl0AAAELGRlc3RpbmF0aW9uACByZWdpc3RlcgAABAxrZXlZBmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQAABCBzY2hlZHVsZWEGAwgIIARpBgAECAACICxyZXNlcnZlX2lkcwAABBRjb3VudARQcmVuZXdfaWRfcmVzZXJ2YXRpb24AAAQIaWQIVGNhbmNlbF9pZF9yZXNlcnZhdGlvbgAABAhpZAhQcmVjb2duaXplX3BlcnNvbmhvb2QAAAQwaWRzX2FuZF9rZXlzbQZIc3VzcGVuZF9wZXJzb25ob29kAAAEDGlkc3EGRHJlc3VtZV9wZXJzb25ob29kAAAECGlkCFhzdGFydF9tdXRhdGlvbl9zZXNzaW9uAAEFUGVuZF9tdXRhdGlvbl9zZXNzaW9uAAEFABQkc2lnbmF0dXJlEQYcYWNjb3VudAA4aWRlbnRpZmllcl9rZXkNBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUdAwZ5BgIQeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQAACBxhY2NvdW50ABRjb3VudARsY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlAAAEHGFjY291bnQAGGF0dGVzdAAAFCRjYW5kaWRhdGUATGNhbmRpZGF0ZV9zaWduYXR1cmURBjByaW5nX3ZyZl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGVGNvbnN1bWVyX3JlZ2lzdHJhdGlvbn0GSGRpc3BhdGNoX2FzX3NpZ25lcgAABBBjYWxsyQYCCChTdGFuZGFsb25lASQsUmVzZXJ2YXRpb24BJAIgUHJlZ2lzdGVyX2xpdGVfcGVyc29uAAAMOGlkZW50aWZpZXJfa2V5DQYgdXNlcm5hbWUkRHJlc2VydmVkX3VzZXJuYW1lHQM8cmVnaXN0ZXJfcGVyc29uAAAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mEQY8dXNlcm5hbWVfY2hvaWNlhQZodG91Y2hfcGVyc29uX2F1dGhvcml6YXRpb24AAQWMcmVtb3ZlX2V4cGlyZWRfdXNlcm5hbWVfcmVzZXJ2YXRpb24AAAggdXNlcm5hbWUkHGFjY291bnQAVHVwZGF0ZV9pZGVudGlmaWVyX2tleQAABDhpZGVudGlmaWVyX2tleQ0GhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgAABCBkdXJhdGlvbgiwc2V0X3N0bXRfc3RvcmVfYXNzb2NpYXRlZF9hY2NvdW50X2lkX2F0X3Nsb3QAAAgsc2xvdF9udW1iZXIELHNldF9hY2NvdW50pQJMZGVtb3RlX2F1dGhfZXhwaXJlZAAABBxhY2NvdW50AAIIKGFkZF9jaHVua3MAAAw0cmluZ19leHBvbmVudPkCKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJFRzZXRfY2h1bmtfcGFnZV9oYXNoZXMAAAg0cmluZ19leHBvbmVudPkCLHBhZ2VfaGFzaGVzxQICEERidWlsZF9yaW5nX21hbnVhbAAADChpZGVudGlmaWVyIChyaW5nX2luZGV4BBRsaW1pdJEDWG9uYm9hcmRfbWVtYmVyc19tYW51YWwAAAQoaWRlbnRpZmllciAsbWVyZ2VfcmluZ3MAAAwoaWRlbnRpZmllciA8YmFzZV9yaW5nX2luZGV4BER0YXJnZXRfcmluZ19pbmRleARMc2V0X29uYm9hcmRpbmdfc2l6ZQAACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUEAwgEvQEElQYAAgwoRXhwZW5kYWJsZQABBRxQcm90ZWN0AAEFIFByZXNlcnZlAAEFABAUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQcYWxpYXNlc8UCBKEGAAJUFHNwbGl0AAAEKHNwbGl0X2ludG+ZBiB0cmFuc2ZlcgAABAh0bwBcbG9hZF9yZWN5Y2xlcl93aXRoX2NvaW4AAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwKQaEbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0AAAQMHByZXNlcnZhdGlvbp0GFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBmR1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luAAAUHGFsaWFzZXPFAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwCMdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXQAABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24ECHRvAKxwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9jb2luAAAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGtHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX25hdGl2ZQAACChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBrRwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9zdGFibGUAAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwKQaMdW5sb2FkX3JlY3ljbGVyc19pbnRvX2NvaW5fdW5zdGFibGUAAAgYaW5wdXRzpQYIdG8AtHVubG9hZF9yZWN5Y2xlcnNfaW50b19leHRlcm5hbF9hc3NldF91bnN0YWJsZQAACBhpbnB1dHOlBgh0bwDEdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBRpbnB1dKEGMGFsaWFzX3Byb29mc4UBCHRvADBmZWVfY3VycmVuY3kFA8h1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBhpbnB1dHOlBjBhbGlhc19wcm9vZnOFAQh0bwAwZmVlX2N1cnJlbmN5BQNodW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbnMAABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+ZBqBkaXJlY3Rfb2ZmYm9hcmRfY29pbl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAECHRvADhjbGVhbl9yZWN5Y2xlcgAABBR2YWx1ZQRkY2xlYW5fY29uc3VtZWRfZnJlZV90b2tlbgAABBhwZXJpb2QEcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcAAAgYcGVyaW9kBChyaW5nX2luZGV4BExjbGVhbl9yZWN5Y2xlcl9kdXN0AAEFcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAAQWsZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbgAABBhwZXJpb2QEAAwUcHJpemUVA0xyZWdpc3RyYXRpb25fc3RhcnRzBFRyZWdpc3RyYXRpb25fZHVyYXRpb24EAhA4c2NoZWR1bGVfZXZlbnQAAAQoZXZlbnRfaW5mb60GWHJlbW92ZV9zY2hlZHVsZWRfZXZlbnQAAAQgZXZlbnRfaWQESHJlZ2lzdGVyX2Zvcl9ldmVudAAACCBldmVudF9pZAQQZGVzdABsY2xhaW1fZmFpbGVkX3RyYW5zZmVyX3ByaXplAAAEIGV2ZW50X2lkBAAMFGluZGV4BDBpbm5lcl9jdXJzb3IdAyhzdGFydGVkX2F0BAIIGEFjdGl2ZQG1BhRTdHVjawABBQa5BgIIIFNwZWNpZmljAW0DIFdpbGRjYXJkAAAIFGxpbWl0kQM8cHJldmlvdXNfY3Vyc29yHQMCEEBmb3JjZV9zZXRfY3Vyc29yAAAEGGN1cnNvcr0GXGZvcmNlX3NldF9hY3RpdmVfY3Vyc29yAAAMFGluZGV4BDBpbm5lcl9jdXJzb3IdAyhzdGFydGVkX2F0kQNIZm9yY2Vfb25ib2FyZF9tYm1zAAEFOGNsZWFyX2hpc3RvcmljAAAEIHNlbGVjdG9ywQYCgBhTeXN0ZW0BRQU8UGFyYWNoYWluU3lzdGVtAUkFJFRpbWVzdGFtcAFNBTRQYXJhY2hhaW5JbmZvAZECIEJhbGFuY2VzAVEFRE9yaWdpblJlc3RyaWN0aW9uAVUFGEFzc2V0cwFZBSRBc3NldFJhdGUBXQVEQ29sbGF0b3JTZWxlY3Rpb24BYQUcU2Vzc2lvbgFlBSRYY21wUXVldWUBaQUsUG9sa2Fkb3RYY20BbQUoQ3VtdWx1c1hjbQGRAjBNZXNzYWdlUXVldWUBcQUcVXRpbGl0eQF1BSBNdWx0aXNpZwF9BRBTdWRvAYEFFFByb3h5AYkFIElkZW50aXR5AR0GGFBlb3BsZQEhBhxNb2JSdWxlASUGKFByb29mT2ZJbmsBNQYQR2FtZQFRBhRTY29yZQFlBiBEdW1teURpbQF1BihQZW9wbGVMaXRlAYEGJFJlc291cmNlcwGJBjRDaHVua3NNYW5hZ2VyAY0GHE1lbWJlcnMBkQYcQ29pbmFnZQGpBhxBaXJkcm9wAbEGUE11bHRpQmxvY2tNaWdyYXRpb25zAcUGBMkGAAAQEHdoZW6dAhxkZXBvc2l0CCRkZXBvc2l0b3IAJGFwcHJvdmFsc70BAAwgZGVsZWdhdGUAKHByb3h5X3R5cGWtAhRkZWxheQQE1QYAAwjZBggADBByZWFsACRjYWxsX2hhc2ggGGhlaWdodAQE4QYAAwjlBggDCAQFBgTtBgAADChqdWRnZW1lbnRz8QYcZGVwb3NpdAgQaW5mb/kFAwgIvQEADBxhY2NvdW50AAxmZWUIGGZpZWxkcwgG/QYEAQcAAAgoYWNjb3VudF9pZAAoYWxsb2NhdGlvbgQCDChBbGxvY2F0aW9uAAEFQEF1dGhvcml0eURlcG9zaXQBCBhTeXN0ZW0AAQUACBRvd25lcgAgcHJvdmlkZXINBwMMAAQNBwMIGQYEBBkHAAAQHGFjY291bnQASHBlbmRpbmdfanVkZ2VtZW50cx0HGGJhbm5lZBRkdXNlcm5hbWVfbGFzdF9yZXBvcnRlZF9hdJEDAAwgcmVwb3J0ZXIAIHVzZXJuYW1lJBxjYXNlX2lkBAAIDGtleSAcYWNjb3VudKUCABAUdm90ZWQEHGNsZWFuZWQEHGNvcnJlY3QEGGNyZWRpdAgCEEBEZXNpZ25lZEVsZWN0aXZlAAQEAQhEUHJvY2VkdXJhbEFjY291bnQAAwgEIEhQcm9jZWR1cmFsUGVyc29uYWwAAwgECChQcm9jZWR1cmFsAAMIBCgCDChQcm9vZk9mSW5rAAAMGGRlc2lnbjEHIGV2aWRlbmNlIExwcm9iYWJsZV9hY2NlcHRhYmxlFEhJZGVudGl0eUNyZWRlbnRpYWwAAAggcGxhdGZvcm0ZBiBldmlkZW5jZSQ0VXNlcm5hbWVWYWxpZAAABCB1c2VybmFtZSQACDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEAAwkc3RhdGVtZW50NQccY29udGV4dCQgY2FsbGJhY2s5BwAMDGF5ZQQMbmF5BCBjb250ZW1wdAQADBRzaW5jZQgcZGV0YWlscz0HFHRhbGx5QQcACBxkZXRhaWxzPQccdmVyZGljdL0CAAgUc2luY2UIHHZlcmRpY3S9AgAUFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIRHJlbWFpbmluZ19iYWxhbmNlCDB0b3RhbF9wb2ludHMIFHN0YXJ0BAAMJHJlbWFpbmluZwRAYW1vdW50X3Blcl9yb3VuZAgYcGVyaW9kBARVBwACDCBSZWZlcnJlZAEIHERlcG9zaXQBCBxJbnZpdGVkAQACDBxJbml0aWFsAAEFIEluaXREb25lAAEFEEZ1bGwAAQUCDBxBcHBsaWVkAAAMEGNyZWRdBxxlbnRyb3B5IDRlbnRyb3B5X3NpbmNlBCBTZWxlY3RlZAAAIBRzaW5jZQQQY3JlZF0HIHJlc2VydmVkCBxlbnRyb3B5IBhkZXNpZ24xByhhbGxvY2F0aW9uYQccanVkZ2luZ5EDGGZhaWxlZAQYUHJvdmVuAAAQGGRlc2lnbjEHIHJlc2VydmVkCDB3YXNfcmVmZXJyZWQULHdhc19pbnZpdGVkFAYxBwAkGGRlc2lnbmkHQGFjdGl2ZV9yZWZlcnJhbHO9AWBhbGxvd2VkX3JlZmVycmFsX3RpY2tldHMENGJhZF9yZWZlcnJhbHMEUHN1Y2Nlc3NmdWxfcmVmZXJyYWxzBCRyZWZlcnJhbHMELGRlcml2YXRpdmVzBBhiYW5uZWQUYHBlbmRpbmdfcmVmZXJyYWxfcmV3YXJkcwQACBBraW5k1QIIaWQgAgggUmVzZXJ2ZWQAAQUkQ29tbWl0dGVkAAEFBAABCAMI4QIgAgggS2lja2FibGUAAAgoZmlyc3RfZ2FtZQQ4YXJjaGl2ZWRfc2luY2UEKFVua2lja2FibGUAAAQoZmlyc3RfZ2FtZQQCDBxJbnZpdGVkAAEFKFJlY29nbml6ZWQAAQUcRGVwb3NpdAEIABgoZmlyc3RfZ2FtZQQocmVnaXN0ZXJlZBQsc2VudF9yZXBvcnQUKHllc19wZXJzb24ENG5vX25vdF9wZXJzb24ELGNyZWRpYmlsaXR5hQcG4QICCCxTdGVwMUluc2VydAAABDhsYXN0X2l0ZXJhdGlvbo0HNFN0ZXAyUmV0cmlldmUAAAhEbmV4dF9wbGF5ZXJfaW5kZXgETHJlY29nbml6ZWRfZmluaXNoZWQUAhQwUmVnaXN0cmF0aW9uAAAERG5leHRfcGxheWVyX2luZGV4BBxTaHVmZmxlAAAEEHN0ZXCRByRSZXBvcnRpbmcAAAQwcGxheWVyX2NvdW50BDRQbGF5ZXJQcm9jZXNzAAAEOGxhc3RfaXRlcmF0aW9ujQcoQ2FuY2VsbGluZwAABDhsYXN0X2l0ZXJhdGlvbo0HACAUaW5kZXgERHJlZ2lzdHJhdGlvbl9lbmRzBEBzaHVmZmxlX2RlYWRsaW5lBCRnYW1lX2RhdGUELHJlcG9ydF9lbmRzBBRzdGF0ZZUHOG1heF9ncm91cF9zaXplBBhyb3VuZHMEAgggQXR0ZW5kZWQBBBhBYnNlbnQBBAIQUEV4dGVybmFsbHlSZWNvZ25pemVkAAEFNE5vdFJlY29nbml6ZWQAAQUkU3VzcGVuZGVkAQgoUmVjb2duaXplZAEIACAUc2NvcmUEGHN0cmVha50HSGF0dGVuZGFuY2VfaGlzdG9yeQQYY3JlZGl0CChjYXNoZWRfb3V0FEhyZWFjaGVkX3BlcnNvbmhvb2QUbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZBQscmVjb2duaXRpb26hBwMIBOECABBEcmVtYWluaW5nX2JhbGFuY2UILHBvaW50X3ByaWNlCCRyZW1haW5kZXIIMHRvdGFsX3BvaW50cwQACCRmaW5pc2hfYXQEGGNyZWRpdAgADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIIGR1cmF0aW9uBAS1BwAACAxrZXkgJHN1c3BlbmRlZBQCBDBVbmlxdWVEZXZpY2UBAAAIMHJpbmdfdnJmX2tleSAYbWV0aG9kwQcCCBBMaXRlAAEFGFBlcnNvbgAADBRhbGlhcyAsbGFzdF91cGRhdGUIHGRlbW90ZWQUAgggT2NjdXBpZWQAAAgoYWNjb3VudF9pZAAUc2luY2UIEEZyZWUAAQUEzQcAABQ4aWRlbnRpZmllcl9rZXkNBjRmdWxsX3VzZXJuYW1lHQM0bGl0ZV91c2VybmFtZSQsY3JlZGliaWxpdHnJB0BzdG10X3N0b3JlX3Nsb3Rz0QcACBxhY2NvdW50ACRqb2luZWRfYXQIBNkHAAAIJG1heF9jb3VudAQgbWF4X3NpemUEAwj5AgQFAcAE6QcAAgggRXh0ZXJuYWwBUQEUTG9jYWwBAAIIKEFwcGVuZE9ubHkAAQUgRmxleGlibGUAAQUADBRvd25lcvEHEG1vZGX1ByRyaW5nX3NpemX5AgMIIAQFAQEGBQHBBgAMEHJvb3QBCCByZXZpc2lvbgQwaW50ZXJtZWRpYXRlBQgDDCAEBAAMFHRvdGFsBCBpbmNsdWRlZAQ8aW1tdXRhYmxlX3NpbmNleQICDChPbmJvYXJkaW5nAAAEKHF1ZXVlX3BhZ2UEIEluY2x1ZGVkAAAMKHJpbmdfaW5kZXgEJHJpbmdfcGFnZQQ0cmluZ19wb3NpdGlvbgQkU3VzcGVuZGVkAAEFAAgoaWRlbnRpZmllciAgcG9zaXRpb24VCAIIKEFwcGVuZE9ubHkAAQUgTXV0YXRpbmcBBAIMNERlbGV0aW5nUmluZ3MAAQVcRGVsZXRpbmdPbmJvYXJkaW5nUXVldWUAAQUoRmluYWxpemluZwABBQAIKGlkZW50aWZpZXIgFHN0YWdlIQgCBDhGYWlsZWREaXNwYXRjaAAABBxyZXRyaWVzBAAIGHJlYXNvbikIFHVudGlsCAMMBAQgBJEDAQgGEQgGfQECICBJbmFjdGl2ZQABBTRDcmVhdGluZ0Fzc2V0AAEFQFhjbUZ1bmRzVHJhbnNmZXIAAQU4VmVyaWZ5aW5nRnVuZHMAAQUsRnVuZGluZ1BvdHMAAQVgU2NoZWR1bGluZ01vYlJ1bGVQYXlvdXRzAAEFWFNjaGVkdWxpbmdTY29yZVBheW91dHMAAQUkQ29tcGxldGVkAAEFAgggSW5hY3RpdmUAAQUkQ29tcGxldGVkAAEFAAgIaWQEEGluZm+tBgRJCAACFCxSZWdpc3RlcmluZwABBWBXYWl0aW5nRm9yRW50cm9weVRvQnVpbGQAAARAc3RhcnRlZF9hdF9yY19ibgQ4RHJhd2luZ1dpbm5lcnMAAAQcZW50cm9weSAwRGlzdHJpYnV0aW5nAAEFPENsZWFyaW5nU3RvcmFnZQABBQAQCGlkBExuZXh0X3BhcnRpY2lwYW50X2lkBBBpbmZvrQYYc3RhdHVzUQgDCCAAAwgABAMIUQEIABQUcHJpemUVA0xyZWdpc3RyYXRpb25fc3RhcnRzBFRyZWdpc3RyYXRpb25fZHVyYXRpb24ESHRvdGFsX3BhcnRpY2lwYW50cwQcd2lubmVyc8UCAAgYaGVhZGVy1QMoZXh0cmluc2ljc20DAgg0QWxsRXh0cmluc2ljcwABBTRPbmx5SW5oZXJlbnRzAAEFAAgYcHJlZml43QEYc3VmZml43QECDDhOb3RJbXBsZW1lbnRlZAABBSBOb3RGb3VuZAFxCBRDb2RlYwABBQckdQgCNBBDYWxsAAEFHFBheW1lbnQAAQUYRnV0dXJlAAEFFFN0YWxlAAEFIEJhZFByb29mAAEFREFuY2llbnRCaXJ0aEJsb2NrAAEFREV4aGF1c3RzUmVzb3VyY2VzAAEFGEN1c3RvbQEEMEJhZE1hbmRhdG9yeQABBUxNYW5kYXRvcnlWYWxpZGF0aW9uAAEFJEJhZFNpZ25lcgABBVRJbmRldGVybWluYXRlSW1wbGljaXQAAQU0VW5rbm93bk9yaWdpbgABBQIMMENhbm5vdExvb2t1cAABBUxOb1Vuc2lnbmVkVmFsaWRhdG9yAAEFGEN1c3RvbQEEAggcSW52YWxpZAF9CBxVbmtub3duAYEIB5UChQgDCNkBJASNCAAADBBva2F5FCxmYXRhbF9lcnJvchQYZXJyb3JzkQgCDBxJbkJsb2NrAAEFFExvY2FsAAEFIEV4dGVybmFsAAEFABQgcHJpb3JpdHkIIHJlcXVpcmVzbQMgcHJvdmlkZXNtAyRsb25nZXZpdHkIJHByb3BhZ2F0ZRQHnQiFCAMIJCgEpQgABqkIAAwYd2VpZ2h0GBRjbGFzczgscGFydGlhbF9mZWUIAAwgYmFzZV9mZWUIHGxlbl9mZWUITGFkanVzdGVkX3dlaWdodF9mZWUIBrUIAAg0aW5jbHVzaW9uX2ZlZbkIDHRpcAgE2QQAAhg0VW5pbXBsZW1lbnRlZAABBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEFTFdlaWdodE5vdENvbXB1dGFibGUAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBTRBc3NldE5vdEZvdW5kAAEFKFVucm91dGFibGUAAQUHwQjFCAcYxQgHCMUIB3ECxQgCCCxVbnN1cHBvcnRlZAABBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEFBwDZCAIMFENoYWluAAEFHE5ldHdvcmsAAQUUTG9jYWwAAQUFAYQCEBxTcjI1NTE5AAAIJHNpZ25hdHVyZQkGGHNpZ25lciAcRWQyNTUxOQAACCRzaWduYXR1cmUJBhhzaWduZXIgOFNlY3AyNTZrMUVjZHNhAAAIJHNpZ25hdHVyZQ0GGHNpZ25lcuUIHE9uQ2hhaW4AAAwMd2hvIChibG9ja19oYXNoICxldmVudF9pbmRleAgG6QgEIAEQABwUcHJvb2btCDhkZWNyeXB0aW9uX2tledwcY2hhbm5lbNwgcHJpb3JpdHmRAyhudW1fdG9waWNzBBh0b3BpY3PxCBBkYXRhHQMCGEBOb1JlcG9ydGluZ1BoYXNlAAEFUFN0YXRlbWVudElzTm90U2lnbmVkAAEFQEludmFsaWRTaWduYXR1cmUAAQU0SW52YWxpZFRvcGljMAAACCBleHBlY3RlZNwYYWN0dWFs3ExBY2NvdW50SXNOb3RBUGxheWVyAAEFVFBsYXllcklzTm90UmVnaXN0ZXJlZAABBQfhB/kIABg8dXB3YXJkX21lc3NhZ2VzbQNMaG9yaXpvbnRhbF9tZXNzYWdlc9EDTG5ld192YWxpZGF0aW9uX2NvZGUdA2xwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMEOGhybXBfd2F0ZXJtYXJrBCRoZWFkX2RhdGEkB5ECOQMGOQMEOQMAAgwgQmFkUHJvb2YAAQUcTm9Qcm9vZgABBTRJbnRlcm5hbEVycm9yAAEFB+EHEQk="; - -export { content as default }; diff --git a/packages/host-papp/.papi/descriptors/dist/metadataTypes.d.ts b/packages/host-papp/.papi/descriptors/dist/metadataTypes.d.ts index d728c73c..6c4dca85 100644 --- a/packages/host-papp/.papi/descriptors/dist/metadataTypes.d.ts +++ b/packages/host-papp/.papi/descriptors/dist/metadataTypes.d.ts @@ -1,2 +1,2 @@ -declare const content = "eQkAAAAQAQEFAAQBAQUAFAEBBQAcAAQAIAAEACQBAQUAIAEBBQAwAQEFAC0DACAANQMBAQUAPQMBAQUANAEBBQBBAwEBBQAYAQEFAE0DAQEFAFEDAQEFAFUDAQEFAGEDAQAEGHJlbWFyayQBAQUBAAQUcGFnZXMIAQEFAQAEEGNvZGUkAQEFAQAEFGl0ZW1zaQMBAQUBAAQQa2V5c20DAQEFAQAIGHByZWZpeCQcc3Via2V5cwQBAQUBAAQkY29kZV9oYXNoIAEBBQEBBQEABDRkaXNwYXRjaF9pbmZvQAEBBQEACDhkaXNwYXRjaF9lcnJvctQ0ZGlzcGF0Y2hfaW5mb0ABAQUBAQUBAQUBAAQcYWNjb3VudAABAQUBAAgYc2VuZGVyABBoYXNoIAEBBQEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAQEFAQAIJGNvZGVfaGFzaCAUZXJyb3LUAQEFAQEFAQEFAI0DAQEFAJUDAQEFACQBAQUAmQMBAQUAoQMBAQUAhQMBAQUAbQMBAQUAtQMBAQUAvQMBAQUAxQMBAQUAyQMBAQUA0QMBAQUACAEACBBkYXRh3QNUaW5ib3VuZF9tZXNzYWdlc19kYXRhDQQBAQUBAAQcbWVzc2FnZSQBAQUBAQUBAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBAEBBQEABBRjb3VudAQBAQUBAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIAEBBQEABDBtZXNzYWdlX2hhc2jcAQAEDG5vdwgBAQUAAAAMAAAAGQQAAAAhBAAAACkEAAAAMQQBAAgQZGVzdDUEFHZhbHVlCAEBBQEADBhzb3VyY2U1BBBkZXN0NQQUdmFsdWUIAQEFAQAIEGRlc3Q1BChrZWVwX2FsaXZlFAEBBQEACAx3aG81BBhhbW91bnQIAQEFAQAEDHdob70BAQEFAQAIDHdobzUEIG5ld19mcmVlCAEBBQEACCRkaXJlY3Rpb245BBRkZWx0YQgBAQUBAAgUdmFsdWUIKGtlZXBfYWxpdmUUAQEFAQEFAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQgBAQUBAAgcYWNjb3VudAAYYW1vdW50CAEBBQEADBBmcm9tAAh0bwAYYW1vdW50CAEBBQEACAx3aG8AEGZyZWUIAQEFAQAIDHdobwAYYW1vdW50CAEBBQEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPkAQEFAQAEGGFtb3VudAgBAQUBAAQMd2hvAAEBBQEACAxvbGQIDG5ldwgBAQUBAAwYcmVhc29uBQEMd2hvABhhbW91bnQIAQEFAQAQGHJlYXNvbgUBGHNvdXJjZQAQZGVzdAAYYW1vdW50CAEBBQEAEBhyZWFzb24FARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCAEBBQAJAQEBBQA9BAEBBQEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgBAQUBAAQYb3JpZ2lukQEAmQEAQQQBAAQYZW50aXR5mQEBAQUBAQUBAAQYZW50aXR5mQEAUQEASQQATQQAWQQAXQQAYQQAUQEAZQQAUQEApQEBAQUAUQEBAwRRAQBpBAEDCABRAQB5AgEDBFEBAG0EAQMEUQEApQEBAAwIaWRRARRhZG1pbjUELG1pbl9iYWxhbmNlCAEBBQEAEAhpZFEBFG93bmVyNQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UIAQEFAQAECGlkUQEBAQUBAAwIaWRRASxiZW5lZmljaWFyeTUEGGFtb3VudAgBAQUBAAwIaWRRAQx3aG81BBhhbW91bnQIAQEFAQAMCGlkUQEYdGFyZ2V0NQQYYW1vdW50CAEBBQEAEAhpZFEBGHNvdXJjZTUEEGRlc3Q1BBhhbW91bnQIAQEFAQAICGlkUQEMd2hvNQQBAQUBAAgIaWRRARRvd25lcjUEAQEFAQAQCGlkUQEYaXNzdWVyNQQUYWRtaW41BBxmcmVlemVyNQQBAQUBABAIaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBAEBBQEAFAhpZFEBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQBAQUBACAIaWRRARRvd25lcjUEGGlzc3VlcjUEFGFkbWluNQQcZnJlZXplcjUELG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCRpc19mcm96ZW4UAQEFAQAMCGlkUQEgZGVsZWdhdGU1BBhhbW91bnQIAQEFAQAICGlkUQEgZGVsZWdhdGU1BAEBBQEADAhpZFEBFG93bmVyNQQgZGVsZWdhdGU1BAEBBQEAEAhpZFEBFG93bmVyNQQsZGVzdGluYXRpb241BBhhbW91bnQIAQEFAQAICGlkUQEoYWxsb3dfYnVybhQBAQUBAAgIaWRRASxtaW5fYmFsYW5jZQgBAQUBAAwIaWRRARBkZXN0NQQoa2VlcF9hbGl2ZRQBAQUBAAgIaWRRASByZXNlcnZlc6UBAQEFAQEFAQAMIGFzc2V0X2lkUQEcY3JlYXRvcgAUb3duZXIAAQEFAQAMIGFzc2V0X2lkUQEUb3duZXIAGGFtb3VudAgBAQUBABAgYXNzZXRfaWRRARBmcm9tAAh0bwAYYW1vdW50CAEBBQEADCBhc3NldF9pZFEBFG93bmVyABxiYWxhbmNlCAEBBQEAECBhc3NldF9pZFEBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAAQEFAQAIIGFzc2V0X2lkUQEUb3duZXIAAQEFAQAIIGFzc2V0X2lkUQEMd2hvAAEBBQEABCBhc3NldF9pZFEBAQEFAQAMIGFzc2V0X2lkUQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcEAQEFAQAMIGFzc2V0X2lkUQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwQBAQUBABQgYXNzZXRfaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UAQEFAQAQIGFzc2V0X2lkUQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CAEBBQEADCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQABAQUBABQgYXNzZXRfaWRRARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAIIGFzc2V0X2lkUQE8bmV3X21pbl9iYWxhbmNlCAEBBQEADCBhc3NldF9pZFEBDHdobwAkZGVwb3NpdG9yAAEBBQEADCBhc3NldF9pZFEBDHdobwAYYW1vdW50CAEBBQEACCBhc3NldF9pZFEBIHJlc2VydmVzpQEATQQAKQQATQQACAEBBQEAEAx3aG8AIGFzc2V0X2lkUQEYcmVhc29uBQEYYW1vdW50CABRAQAIAQAIKGFzc2V0X2tpbmRRARByYXRlCAEBBQEABChhc3NldF9raW5kUQEBAQUBAQUBAAgoYXNzZXRfa2luZFEBEHJhdGUIAQEFAQAEKGFzc2V0X2tpbmRRAQEBBQEADChhc3NldF9raW5kUQEMb2xkCAxuZXcIAQEFAQAQDHdobwAoYWN0dWFsX2ZlZQgMdGlwCCBhc3NldF9pZLUBAQEFAAABAQUAvQEBAQUAdQQAAAAEAQEFANkBAQAEDG5ld70BAQEFAQAEDG1heAQBAQUBAAQQYm9uZAgBAQUBAQUBAQUBAAQMd2hvAAEBBQEABCxuZXdfZGVwb3NpdAgBAQUBAAgcZGVwb3NpdAgYdGFyZ2V0AAEBBQEBBQEABDRpbnZ1bG5lcmFibGVzvQEBAQUBAAQoYWNjb3VudF9pZAABAQUBAARIZGVzaXJlZF9jYW5kaWRhdGVzBAEBBQEABCxib25kX2Ftb3VudAgBAQUBAAgoYWNjb3VudF9pZAAcZGVwb3NpdAgBAQUBAAwMb2xkAAxuZXcAHGRlcG9zaXQIAQEFAH0EAQEFADUDAAAAIACBBAAAAQAIEGtleXMgFHByb29mJAEBBQEBBQEABDRzZXNzaW9uX2luZGV4BAEBBQEABCR2YWxpZGF0b3IAAQEFAMUCAQEFAIUEAQEFAM0CAQEFAJEEAJUEACQBAQUAmQQABAAIAQAEDG5ldwQBAQUBAQUBAAQwbWVzc2FnZV9oYXNoIAAIAMEEACAABADFBAAEAMUEAAgAxQQAyQQBAQUA0QQBAQUA1QQA3QQA6QQAAADxBAEBBQBBAgB1AgD9BAEBBQBNAQEACBBkZXN0dQIcbWVzc2FnZSkFAQEFAQAQEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlKQUobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb25RARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbpEDAQEFAQAEIGxvY2F0aW9udQIBAQUBABQQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdCECAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzcQIsYmVuZWZpY2lhcnl1AgEBBQEAHBBkZXN0dQIYYXNzZXRzcQJQYXNzZXRzX3RyYW5zZmVyX3R5cGUtBThyZW1vdGVfZmVlc19pZNkESGZlZXNfdHJhbnNmZXJfdHlwZS0FSGN1c3RvbV94Y21fb25fZGVzdCkFMHdlaWdodF9saW1pdCECAQEFAQAIHGFsaWFzZXJ1AhxleHBpcmVzeQIBAQUBAAQcYWxpYXNlcnUCAQEFAQEFAQAEHG91dGNvbWXVAQEBBQEAEBhvcmlnaW5RASxkZXN0aW5hdGlvblEBHG1lc3NhZ2VBAihtZXNzYWdlX2lkIAEBBQEAEBhvcmlnaW5RASxkZXN0aW5hdGlvblEBFGVycm9yRQIobWVzc2FnZV9pZCABAQUBAAwYb3JpZ2luUQEUZXJyb3LNAShtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW5RASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNlBQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2luUQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9utQEBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpblEBGGFzc2V0c3ECAQEFAQAQLGRlc3RpbmF0aW9uUQEYcmVzdWx0BBBjb3N07QEobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb25RARx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvblEBIHF1ZXJ5X2lkCBRlcnJvcs0BAQEFAQAIIGxvY2F0aW9udQIgcXVlcnlfaWQIAQEFAQAQGG9yaWdpblEBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyUQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXK1AQEBBQEADCxkZXN0aW5hdGlvblEBEGNvc3TtAShtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmdRARBmZWVz7QEBAQUBAAQcdmVyc2lvbgQBAQUBAAwcYWxpYXNlclEBGHRhcmdldFEBGGV4cGlyeXkCAQEFAQAIHGFsaWFzZXJRARh0YXJnZXRRAQEBBQEABBh0YXJnZXRRAQEBBQEACBRpbmRleAQUZXJyb3JsAQEFACABAQUBAwgg1QEAhQIAOQUBAQUAhQIAPQUAQQUBAQUADQIBAAg4bWVzc2FnZV9vcmlnaW6FAihwYWdlX2luZGV4BAEBBQEAEDhtZXNzYWdlX29yaWdpboUCEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYAQEFAQEFAQAMCGlkIBhvcmlnaW6FAhRlcnJvcokCAQEFAQAQCGlkIBhvcmlnaW6FAix3ZWlnaHRfdXNlZBgcc3VjY2VzcxQBAQUBABAIaWQgGG9yaWdpboUCKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEAQEFAQAIGG9yaWdpboUCFGluZGV4BAEABBRjYWxsc80GAQEFAQAIFGluZGV4BBBjYWxsyQYBAQUBAAgkYXNfb3JpZ2lukQEQY2FsbMkGAQEFAQAIEGNhbGzJBhh3ZWlnaHQYAQEFAQAIEG1haW7JBiBmYWxsYmFja8kGAQEFAQEFAQAIFGluZGV4BBRlcnJvctQBAQUBAAQUZXJyb3LUAQEFAQAEGHJlc3VsdJUCAQEFAQAEKG1haW5fZXJyb3LUAHkEANEGAQAIRG90aGVyX3NpZ25hdG9yaWVzvQEQY2FsbMkGAQEFAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ATxtYXliZV90aW1lcG9pbnR5BRBjYWxsyQYobWF4X3dlaWdodBgBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BPG1heWJlX3RpbWVwb2ludHkFJGNhbGxfaGFzaCAobWF4X3dlaWdodBgBAQUBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJHRpbWVwb2ludJ0CJGNhbGxfaGFzaCABAQUBAAwkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJGNhbGxfaGFzaCABAQUBAQUBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIAEBBQEAECRhcHByb3ZpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAUJGFwcHJvdmluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0lQIBAQUBABAoY2FuY2VsbGluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABAMd2hvACRjYWxsX2hhc2ggLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAQQY2FsbMkGAQEFAQAEDG5ldzUEAQEFAQAIDHdobzUEEGNhbGzJBgEBBQEBBQEABCxzdWRvX3Jlc3VsdJUCAQEFAQAIDG9sZKUCDG5ldwAAAADdBgAAAOkGAQMIyQatAgAUAQMIrQKtAgAUAQAMEHJlYWw1BEBmb3JjZV9wcm94eV90eXBlhQUQY2FsbMkGAQEFAQAMIGRlbGVnYXRlNQQocHJveHlfdHlwZa0CFGRlbGF5BAEBBQEADChwcm94eV90eXBlrQIUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVyNQQocHJveHlfdHlwZa0CFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBAAgQcmVhbDUEJGNhbGxfaGFzaCABAQUBAAggZGVsZWdhdGU1BCRjYWxsX2hhc2ggAQEFAQAQIGRlbGVnYXRlNQQQcmVhbDUEQGZvcmNlX3Byb3h5X3R5cGWFBRBjYWxsyQYBAQUBAQUBABgQcHVyZQAMd2hvAChwcm94eV90eXBlrQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEAQEFAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGWtAlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtAhRkZWxheQQBAQUBABAMd2hvABBraW5ksQIsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAAAAPUGAAAAJAAAAP0FAAAA+QYBAQUABQcAJAAJBwAkABEHACQAFQcAJAAEACAAIQcAIAAlBwEABBxhY2NvdW50NQQBAQUBAAQQaW5mb/kFAQEFAQAEEHN1YnMBBgEBBQEACCRyZWdfaW5kZXgEHG1heF9mZWUIAQEFAQAEJHJlZ19pbmRleAQBAQUBAAgUaW5kZXgEDGZlZQgBAQUBAAgUaW5kZXgEDG5ldzUEAQEFAQAIFGluZGV4BBhmaWVsZHMIAQEFAQAQJHJlZ19pbmRleAQYdGFyZ2V0NQQkanVkZ2VtZW50BQYgaWRlbnRpdHkgAQEFAQAEGHRhcmdldDUEAQEFAQAIDHN1YjUEEGRhdGHxBQEBBQEABAxzdWI1BAEBBQEADCRhdXRob3JpdHk1BBhzdWZmaXgkKGFsbG9jYXRpb24EAQEFAQAIGHN1ZmZpeCQkYXV0aG9yaXR5NQQBAQUBABAMd2hvNQQgdXNlcm5hbWUkJHNpZ25hdHVyZRUGOHVzZV9hbGxvY2F0aW9uFAEBBQEABCB1c2VybmFtZSQBAQUBAAwcYWNjb3VudAAkc2lnbmF0dXJlEQYgdXNlcm5hbWUkAQEFAQAEKGNyZWRlbnRpYWwZBgEBBQEADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudL0CAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEBBQEACCByZXBvcnRlcgAgdXNlcm5hbWUkAQEFAQAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSQBAQUBAAQUYWxpYXMgAQEFAQAIIHVzZXJuYW1lJCRqdWRnZW1lbnS9AgAgAAgACAApBwBdAQAAAAAAYQEAAAAIAAgAkQIBAQUA+QIBAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdAQBAQUBAAQYcGVvcGxlxQIBAQUBAQUBAAgMd2hvCAxrZXkgAQEFAQAIFGFsaWFzXQEcYWNjb3VudAABAQUBAAgMd2hvCBxhY2NvdW50AAEBBQEABBhwZW9wbGXFAgAgAC0HAMEDAAQAwQMAvQIABABFBwAEAEkHAAQATQcBAQUAUQcBAQUAWQcBAAgoY2FzZV9pbmRleAQcb3Bpbmlvbr0CAQEFAQAEKGNhc2VfaW5kZXgEAQEFAQAIKGNhc2VfaW5kZXgEFHZvdGVyIAEBBQEACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIBAQUBAAQsZGVzdGluYXRpb24AAQEFAQAEMGNhc2VfaW5kaWNlc80CAQEFAQAMGGFtb3VudAgUY291bnQEGHBlcmlvZAQBAQUBAAQUaW5kZXgEAQEFAQAIFHJvdW5kBBR2b3RlciABAQUBAQUBAAQoY2FzZV9pbmRleAQBAQUBAAgoY2FzZV9pbmRleAQcdmVyZGljdL0CAQEFAQAMKGNhc2VfaW5kZXgEFHZvdGVyIBxvcGluaW9uvQIBAQUBAAgoY2FzZV9pbmRleAQUdm90ZXIgAQEFAQAIFHZvdGVyIDBjYXNlX2luZGljZXPNAgEBBQEADBR2b3RlciAsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAwUcm91bmQEPGluaXRpYWxfYmFsYW5jZQgwdG90YWxfcG9pbnRzCAEBBQEADBhhbW91bnQIFGNvdW50BBhwZXJpb2QEAQEFAQAEFGluZGV4BAEBBQEACBR2b3RlciAYYW1vdW50CAEBBQEACBRyb3VuZAQUdm90ZXIgAQEFAQAIKGNhc2VfaW5kZXgEHHJpcGVuZWQUAQEFAQAEDHdobyAAAABlBwAIAG0HAAgAvQEABABxBwAxAwB1BwEBBQDZAgB5BwCRAgEBBQAxBgEABCBldmlkZW5jZSABAQUBAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwKQYBAQUBAAgYY2hvaWNlLQYocmVxdWlyZV9pZHkCAQEFAQAEHGFjY291bnQAAQEFAQAMIHJlZmVycmVyCCRzaWduYXR1cmURBhh0aWNrZXQAAQEFAQAMHGludml0ZXIAGHRpY2tldAAkc2lnbmF0dXJlEQYBAQUBAAwUaW5kZXgEEGtpbmTVAghpZCABAQUBAAQYdGlja2V0AAEBBQEACBxhY2NvdW50ABRjb3VudAQBAQUBAAgcYWNjb3VudAAUbGltaXQEAQEFAQAEGGNvbmZpZ9kCAQEFAQAIPHJlZmVycmVkX3ZhbHVlczEGPHJlZmVycmVyX3ZhbHVlczEGAQEFAQEFAQAIKGFjY291bnRfaWQAJGp1ZGdlbWVudL0CAQEFAQAIKGFjY291bnRfaWQAIGZhaWx1cmVzBAEBBQEACChhY2NvdW50X2lkACxwZXJzb25hbF9pZAgBAQUBAAggcmVmZXJyZXIIIHJlZmVycmVkAAEBBQEACChhY2NvdW50X2lkACxyZXNlcnZlZF9pZAgBAQUBAAggcmVmZXJyZXIIGHRpY2tldAABAQUBAAgoYWNjb3VudF9pZAAgcmVmZXJyZXIIAQEFAQAMFGluZGV4BBBraW5k1QIIaWQgAQEFAQAEHGludml0ZXIAAQEFAQAIDHdobwAcaW52aXRlcgABAQUBAAQgcmVmZXJyZXIIAQEFAQAIHGFjY291bnQAFGNvdW50BAEBBQEACBxpbnZpdGVyABh0aWNrZXQAAQEFAQAEGGNvbmZpZ9kCAQEFAE0GAH0HAJECAOECAIEHAOECAIkHAQEFAJkHAAQABADhAgDNAgCVBADhAgDBAwDhAgEBBQBJBgAgAAAAAAANBgEABDhpZGVudGlmaWVyX2tleQ0GAQEFAQAMOGlkZW50aWZpZXJfa2V5DQZEc3RhdGVtZW50X2FjY291bnQADHNpZxEGAQEFAQAELGZ1bGxfcmVwb3J0QQYBAQUBAAQYcGxheWVyAAEBBQEABDxnYW1lc19zY2hlZHVsZXNJBgEBBQEABDhnYW1lX3BsYXlfdGltZQQBAQUBAAQYcGhhc2VzTQYBAQUBAQUBAAxEcmVnaXN0cmF0aW9uX2VuZHMEJGdhbWVfZGF0ZQQscmVwb3J0X2VuZHMEAQEFAQAEDHdob+ECAQEFAQAIDHdob+ECKGdhbWVfaW5kZXgEAQEFAQAEGHBsYXllcuECAQEFAQAEOGdhbWVfcGxheV90aW1lBADhAgClBwEBBQBhBgEBBQChBACpBwAEAAQArQcBAQUAsQcBAQUAuQcBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAEBBQEACCxyb3VuZF9pbmRleAQUbGltaXQEAQEFAQAEDGtleVkGAQEFAQAEIHNjaGVkdWxlYQYBAQUBAQUBAAwMd2hv4QIsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAgMd2hv4QIccmVzdW1lZBQBAQUBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAAIAL0HAQAEFGNvdW50BAEBBQEABAhpZAgBAQUBAAQwaWRzX2FuZF9rZXlzbQYBAQUBAAQMaWRzcQYBAQUBAQUBAAQIaWQIAAAAxQcBABQkY2FuZGlkYXRlAExjYW5kaWRhdGVfc2lnbmF0dXJlEQYwcmluZ192cmZfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBlRjb25zdW1lcl9yZWdpc3RyYXRpb259BgEBBQEBBQEABCB2ZXJpZmllcgABAQUBAAgkY2FuZGlkYXRlACB2ZXJpZmllcgAAAADVBwAAAAAAJAAAACQA3QcBAQUA4QcBAAw4aWRlbnRpZmllcl9rZXkNBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUdAwEBBQEADFBsaW5rZWRfbGl0ZV9pZGVudGl0eQBMbGl0ZV9pZGVudGl0eV9wcm9vZhEGPHVzZXJuYW1lX2Nob2ljZYUGAQEFAQAIIHVzZXJuYW1lJBxhY2NvdW50AAEBBQEABCBkdXJhdGlvbggBAQUBAAgsc2xvdF9udW1iZXIELHNldF9hY2NvdW50pQIBAQUBAQUBAAgUYWxpYXMgHGFjY291bnQAAQEFAQAIIHVzZXJuYW1lJBxhY2NvdW50AAEBBQEABCBkdXJhdGlvbggBAQUBAAgcYWNjb3VudAAsc2xvdF9udW1iZXIEAOUHAO0HAOUHACABAAw0cmluZ19leHBvbmVudPkCKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJAEBBQEACDRyaW5nX2V4cG9uZW50+QIscGFnZV9oYXNoZXPFAgEBBQEBBQEACDRyaW5nX2V4cG9uZW50+QIsdG90YWxfcGFnZXMEAQEFAQAMNHJpbmdfZXhwb25lbnT5AixzdGFydF9pbmRleAQUY291bnQEACAA+QcA8QcAxQIA/QcACQgADQgAxQIA/QcAEQgA/QcAzQIAIAAZCAAgAB0IAP0HAJECACAAMQMA/QcAxQIBAQUAJQgADQgAkQIBAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQUbGltaXSRAwEBBQEABChpZGVudGlmaWVyIAEBBQEADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BAEBBQEACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUEAQEFAQEFAQAEDGtleSABAQUBAAQoaWRlbnRpZmllciABAQUBAAgoaWRlbnRpZmllciAocmluZ19pbmRleAQBAQUBAAwoaWRlbnRpZmllciA8YmFzZV9yaW5nX2luZGV4BER0YXJnZXRfcmluZ19pbmRleAQBAQUBAAgoaWRlbnRpZmllciA8b25ib2FyZGluZ19zaXplBAAAAH0BAAAALQgAwQMAkQIABACRAgAxCACRAgCVBACRAgAgAJECAQEFAJECAQMAADUIAQMIBAQAOQgBAwgEBACRAwEDCAQEADkIAQMIBAQAkQMBAwAAeQIBAwAACAEDBAAAPQgBAwQAAHkCAQMEIACRAwEDBCAAFAEDCAQEAMUCAQMIBAQAxQIBAwwEBCAAFAEDDAQEIAAUAQMIBCAAFAEABChzcGxpdF9pbnRvmQYBAQUBAAQIdG8AAQEFAQAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGAQEFAQAQMHByZXNlcnZhdGlvbp0GFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBgEBBQEAFBxhbGlhc2VzxQIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AAQEFAQAIGGlucHV0c6UGCHRvAAEBBQEAEBRpbnB1dKEGMGFsaWFzX3Byb29mc4UBCHRvADBmZWVfY3VycmVuY3kFAwEBBQEAEBhpbnB1dHOlBjBhbGlhc19wcm9vZnOFAQh0bwAwZmVlX2N1cnJlbmN5BQMBAQUBABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+ZBgEBBQEABBR2YWx1ZQQBAQUBAAQYcGVyaW9kBAEBBQEACBhwZXJpb2QEKHJpbmdfaW5kZXgEAQEFAQEFAQAEMG91dHB1dF9jb3VudAQBAQUBAAwIdG8AFHZhbHVlBBxuZXdfYWdlBAEBBQEABBR2YWx1ZQQBAQUBAAwMd2hvABR2YWx1ZQQYYW1vdW50CAEBBQEAEAh0bwAsaW5wdXRfdmFsdWUEMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEAQEFAQAQCHRvABR2YWx1ZQQsaW5wdXRfY291bnQEGGFtb3VudAgBAQUBAAgMZmVlCCRkZXN0cm95ZWQIAQEFAQAIDHdobwAMZmVlCAEBBQEABBhwZXJpb2QEAQEFAQAMCHRvADBvdXRwdXRfdmFsdWUELGlucHV0X2NvdW50BAEBBQEADAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgBAQUBABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5BQMBAQUBAAwIdG8AFHZhbHVlBBhhbW91bnQIAQEFAQAMFHZhbHVlBDxyZW1haW5pbmdfY29pbnMEQGRlc3Ryb3llZF9hbW91bnQIAQEFAQAIGHBlcmlvZAQocmluZ19pbmRleAQBAQUAQQgBAQUARQgBAQUATQgABABVCAAxAwBZCAAEAM0CAF0IAGEIAAQAZQgBAQUA4QUBAAQoZXZlbnRfaW5mb60GAQEFAQAEIGV2ZW50X2lkBAEBBQEACCBldmVudF9pZAQQZGVzdAABAQUBAQUBAAwgZXZlbnRfaWQEOHBhcnRpY2lwYW50X2lkBBRhbGlhcyABAQUBAAgIaWQEFGV2ZW50FQMBAQUBAAQgZXZlbnRfaWQEAQEFAQAIDHdobwAgZXZlbnRfaWQEAQEFAQAQIGV2ZW50X2lkBBBkZXN0ACBhc3NldF9pZFEBMGFzc2V0X2Ftb3VudAgBAQUAuQYAJACRAgEABBhjdXJzb3K9BgEBBQEADBRpbmRleAQwaW5uZXJfY3Vyc29yHQMoc3RhcnRlZF9hdJEDAQEFAQAEIHNlbGVjdG9ywQYBAQUBAQUBAAQobWlncmF0aW9ucwQBAQUBAAgUaW5kZXgEEHRvb2sEAQEFAQAELG5leHRfY3Vyc29yHQMBAwAAxQIBAwAABAEDCCAIABQBAwAAYQMBAwRpCACRAgEDBNUDAG0IAQMAACQBAwQEAB0DAQMAAM0CAQMIcQgkAHkIAQMEJACJCAEDAADVAwEDBJEIAG0DAQMIaQiRCACVCAEDDJkIJCAAoQgBAwTVAwCRAgEDBB0DACQBAwQkAK0IAQMEAAAEAQMIJAQAsQgBAwgkBAC9CAEDBBgACAEDBAQACAEDCMkGBACxCAEDCMkGBAC9CAEDBAQAyQgBAwQpBQDNCAEDCBjZBADRCAEDDHUCKQXZBADVCAEDBHUCAN0IAQMIIBQAzQIBAwjhCPUIAP0IAQME1QMAAQkBAwQkAAUJAQMECQkAHQMBAwAADQkBAwjhCPUIABUJGQkBAQECAQMAEBBmcmVlCCByZXNlcnZlZAgYZnJvemVuCBRmbGFncwgAFBRub25jZQQkY29uc3VtZXJzBCRwcm92aWRlcnMELHN1ZmZpY2llbnRzBBBkYXRhDAEAAAggcmVmX3RpbWUIKHByb29mX3NpemUIAAwYbm9ybWFsGCxvcGVyYXRpb25hbBgkbWFuZGF0b3J5GAUBgAUABQEQAhQoUHJlUnVudGltZQADCCgkJENvbnNlbnN1cwADCCgkEFNlYWwAAwgoJBRPdGhlcgEkZFJ1bnRpbWVFbnZpcm9ubWVudFVwZGF0ZWQAAQUELAACDDhBcHBseUV4dHJpbnNpYwEEMEZpbmFsaXphdGlvbgABBThJbml0aWFsaXphdGlvbgABBQIMGE5vcm1hbAABBSxPcGVyYXRpb25hbAABBSRNYW5kYXRvcnkAAQUCCAxZZXMAAQUITm8AAQUADBh3ZWlnaHQYFGNsYXNzOCBwYXlzX2ZlZTwCJDxJbnZhbGlkU3BlY05hbWUAAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQABBTxOb25aZXJvUmVmQ291bnQAAQUwQ2FsbEZpbHRlcmVkAAEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwABBUROb3RoaW5nQXV0aG9yaXplZAABBTBVbmF1dGhvcml6ZWQAAQUCGExPdmVybGFwcGluZ1VwZ3JhZGVzAAEFUFByb2hpYml0ZWRCeVBvbGthZG90AAEFGFRvb0JpZwABBWhWYWxpZGF0aW9uRGF0YU5vdEF2YWlsYWJsZQABBXRIb3N0Q29uZmlndXJhdGlvbk5vdEF2YWlsYWJsZQABBTBOb3RTY2hlZHVsZWQAAQUCMDhWZXN0aW5nQmFsYW5jZQABBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQVMSW5zdWZmaWNpZW50QmFsYW5jZQABBUhFeGlzdGVudGlhbERlcG9zaXQAAQU0RXhwZW5kYWJpbGl0eQABBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQABBSxEZWFkQWNjb3VudAABBTxUb29NYW55UmVzZXJ2ZXMAAQUwVG9vTWFueUhvbGRzAAEFOFRvb01hbnlGcmVlemVzAAEFTElzc3VhbmNlRGVhY3RpdmF0ZWQAAQUkRGVsdGFaZXJvAAEFAggcTm9Vc2FnZQABBRxOb3RaZXJvAAEFAmAoQmFsYW5jZUxvdwABBSROb0FjY291bnQAAQUwTm9QZXJtaXNzaW9uAAEFHFVua25vd24AAQUYRnJvemVuAAEFFEluVXNlAAEFKEJhZFdpdG5lc3MAAQU4TWluQmFsYW5jZVplcm8AAQVMVW5hdmFpbGFibGVDb25zdW1lcgABBSxCYWRNZXRhZGF0YQABBShVbmFwcHJvdmVkAAEFIFdvdWxkRGllAAEFNEFscmVhZHlFeGlzdHMAAQUkTm9EZXBvc2l0AAEFJFdvdWxkQnVybgABBSRMaXZlQXNzZXQAAQUwQXNzZXROb3RMaXZlAAEFPEluY29ycmVjdFN0YXR1cwABBSROb3RGcm96ZW4AAQU4Q2FsbGJhY2tGYWlsZWQAAQUoQmFkQXNzZXRJZAABBTxDb250YWluc0ZyZWV6ZXMAAQU0Q29udGFpbnNIb2xkcwABBTxUb29NYW55UmVzZXJ2ZXMAAQUCBDBUb29NYW55SG9sZHMAAQUCDEBVbmtub3duQXNzZXRLaW5kAAEFNEFscmVhZHlFeGlzdHMAAQUgT3ZlcmZsb3cAAQUCRERUb29NYW55Q2FuZGlkYXRlcwABBVxUb29GZXdFbGlnaWJsZUNvbGxhdG9ycwABBUBBbHJlYWR5Q2FuZGlkYXRlAAEFME5vdENhbmRpZGF0ZQABBVBUb29NYW55SW52dWxuZXJhYmxlcwABBUxBbHJlYWR5SW52dWxuZXJhYmxlAAEFPE5vdEludnVsbmVyYWJsZQABBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBVhWYWxpZGF0b3JOb3RSZWdpc3RlcmVkAAEFbEluc2VydFRvQ2FuZGlkYXRlTGlzdEZhaWxlZAABBXRSZW1vdmVGcm9tQ2FuZGlkYXRlTGlzdEZhaWxlZAABBTREZXBvc2l0VG9vTG93AAEFZFVwZGF0ZUNhbmRpZGF0ZUxpc3RGYWlsZWQAAQVASW5zdWZmaWNpZW50Qm9uZAABBVBUYXJnZXRJc05vdENhbmRpZGF0ZQABBUBJZGVudGljYWxEZXBvc2l0AAEFQEludmFsaWRVbnJlc2VydmUAAQUCFDBJbnZhbGlkUHJvb2YAAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQU0RHVwbGljYXRlZEtleQABBRhOb0tleXMAAQUkTm9BY2NvdW50AAEFAhQ4QmFkUXVldWVDb25maWcAAQVAQWxyZWFkeVN1c3BlbmRlZAABBThBbHJlYWR5UmVzdW1lZAABBXRUb29NYW55QWN0aXZlT3V0Ym91bmRDaGFubmVscwABBRhUb29CaWcAAQUCpCBPdmVyZmxvdwABBTRVbmltcGxlbWVudGVkAAEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgABBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAEFMExvY2F0aW9uRnVsbAABBVRMb2NhdGlvbk5vdEludmVydGlibGUAAQUkQmFkT3JpZ2luAAEFPEludmFsaWRMb2NhdGlvbgABBTRBc3NldE5vdEZvdW5kAAEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAABBTxOb3RXaXRoZHJhd2FibGUAAQVITG9jYXRpb25DYW5ub3RIb2xkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFJFRyYW5zcG9ydAABBShVbnJvdXRhYmxlAAEFMFVua25vd25DbGFpbQABBThGYWlsZWRUb0RlY29kZQABBUBNYXhXZWlnaHRJbnZhbGlkAAEFOE5vdEhvbGRpbmdGZWVzAAEFMFRvb0V4cGVuc2l2ZQABBRBUcmFwAAEFQEV4cGVjdGF0aW9uRmFsc2UAAQU4UGFsbGV0Tm90Rm91bmQAAQUwTmFtZU1pc21hdGNoAAEFTFZlcnNpb25JbmNvbXBhdGlibGUAAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAAQUsRXhwb3J0RXJyb3IAAQU4UmVhbmNob3JGYWlsZWQAAQUYTm9EZWFsAAEFKEZlZXNOb3RNZXQAAQUkTG9ja0Vycm9yAAEFME5vUGVybWlzc2lvbgABBShVbmFuY2hvcmVkAAEFOE5vdERlcG9zaXRhYmxlAAEFNFRvb01hbnlBc3NldHMAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBUhXZWlnaHRMaW1pdFJlYWNoZWQAAQUcQmFycmllcgABBUxXZWlnaHROb3RDb21wdXRhYmxlAAEFREV4Y2VlZHNTdGFja0xpbWl0AAEFAnAsVW5yZWFjaGFibGUAAQUsU2VuZEZhaWx1cmUAAQUgRmlsdGVyZWQAAQVIVW53ZWlnaGFibGVNZXNzYWdlAAEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQABBRRFbXB0eQABBThDYW5ub3RSZWFuY2hvcgABBTRUb29NYW55QXNzZXRzAAEFNEludmFsaWRPcmlnaW4AAQUoQmFkVmVyc2lvbgABBSxCYWRMb2NhdGlvbgABBThOb1N1YnNjcmlwdGlvbgABBURBbHJlYWR5U3Vic2NyaWJlZAABBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AAEFKExvd0JhbGFuY2UAAQUwVG9vTWFueUxvY2tzAAEFTEFjY291bnROb3RTb3ZlcmVpZ24AAQUoRmVlc05vdE1ldAABBTBMb2NrTm90Rm91bmQAAQUUSW5Vc2UAAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUAAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAAEFPFRvb01hbnlSZXNlcnZlcwABBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUAAQVgVG9vTWFueUF1dGhvcml6ZWRBbGlhc2VzAAEFNEV4cGlyZXNJblBhc3QAAQU0QWxpYXNOb3RGb3VuZAABBYRMb2NhbEV4ZWN1dGlvbkluY29tcGxldGVXaXRoRXJyb3IAAAgUaW5kZXgEFGVycm9ybAIkLE5vdFJlYXBhYmxlAAEFGE5vUGFnZQABBSROb01lc3NhZ2UAAQVAQWxyZWFkeVByb2Nlc3NlZAABBRhRdWV1ZWQAAQVISW5zdWZmaWNpZW50V2VpZ2h0AAEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQABBSxRdWV1ZVBhdXNlZAABBUxSZWN1cnNpdmVEaXNhbGxvd2VkAAEFAgQwVG9vTWFueUNhbGxzAAEFAjhATWluaW11bVRocmVzaG9sZAABBTxBbHJlYWR5QXBwcm92ZWQAAQVETm9BcHByb3ZhbHNOZWVkZWQAAQVEVG9vRmV3U2lnbmF0b3JpZXMAAQVIVG9vTWFueVNpZ25hdG9yaWVzAAEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgABBUxTZW5kZXJJblNpZ25hdG9yaWVzAAEFIE5vdEZvdW5kAAEFIE5vdE93bmVyAAEFLE5vVGltZXBvaW50AAEFOFdyb25nVGltZXBvaW50AAEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQAAQU8TWF4V2VpZ2h0VG9vTG93AAEFNEFscmVhZHlTdG9yZWQAAQUCBCxSZXF1aXJlU3VkbwABBQIgHFRvb01hbnkAAQUgTm90Rm91bmQAAQUgTm90UHJveHkAAQUsVW5wcm94eWFibGUAAQUkRHVwbGljYXRlAAEFME5vUGVybWlzc2lvbgABBSxVbmFubm91bmNlZAABBSxOb1NlbGZQcm94eQABBQKkSFRvb01hbnlTdWJBY2NvdW50cwABBRxOb0FsaWFzAAEFIE5vdEZvdW5kAAEFIE5vdE5hbWVkAAEFKEVtcHR5SW5kZXgAAQUoRmVlQ2hhbmdlZAABBShOb0lkZW50aXR5AAEFPFN0aWNreUp1ZGdlbWVudAABBThKdWRnZW1lbnRHaXZlbgABBUBJbnZhbGlkSnVkZ2VtZW50AAEFMEludmFsaWRJbmRleAABBTRJbnZhbGlkVGFyZ2V0AAEFRFRvb01hbnlSZWdpc3RyYXJzAAEFOEFscmVhZHlDbGFpbWVkAAEFPEFscmVhZHlSZXBvcnRlZAABBRhOb3RTdWIAAQUgTm90T3duZWQAAQV0SnVkZ2VtZW50Rm9yRGlmZmVyZW50SWRlbnRpdHkAAQVYSnVkZ2VtZW50UGF5bWVudEZhaWxlZAABBTRJbnZhbGlkU3VmZml4AAEFUE5vdFVzZXJuYW1lQXV0aG9yaXR5AAEFME5vQWxsb2NhdGlvbgABBUBJbnZhbGlkU2lnbmF0dXJlAAEFRFJlcXVpcmVzU2lnbmF0dXJlAAEFPEludmFsaWRVc2VybmFtZQABBTRVc2VybmFtZVRha2VuAAEFKE5vVXNlcm5hbWUAAQVkTm90U3lzdGVtUHJvdmlkZWRVc2VybmFtZQABBShOb3RFeHBpcmVkAAEFIFRvb0Vhcmx5AAEFME5vdFVuYmluZGluZwABBUBBbHJlYWR5VW5iaW5kaW5nAAEFWEluc3VmZmljaWVudFByaXZpbGVnZXMAAQUoQmFkQ29udGV4dAABBUxVbmV4cGVjdGVkSnVkZ2VtZW50AAEFME5vdFN1cHBvcnRlZAABBRhCYW5uZWQAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVESnVkZ2VtZW50TGlzdEZ1bGwAAQVsTGFzdFVzZXJuYW1lUmVwb3J0VG9vUmVjZW50AAEFYFVzZXJuYW1lSnVkZ2VtZW50T25nb2luZwABBQKIJE5vdFBlcnNvbgABBRROb0tleQABBThJbnZhbGlkQ29udGV4dAABBThJbnZhbGlkQWNjb3VudAABBTBBY2NvdW50SW5Vc2UAAQUwSW52YWxpZFByb29mAAEFQEludmFsaWRTaWduYXR1cmUAAQUkTm9NZW1iZXJzAAEFKEluY29tcGxldGUAAQUoU3RpbGxGcmVzaAABBThUb29NYW55TWVtYmVycwABBTxLZXlBbHJlYWR5SW5Vc2UAAQUsS2V5Tm90Rm91bmQAAQUwQ291bGROb3RQdXNoAAEFHFNhbWVLZXkAAQVUUGVyc29uYWxJZE5vdFJlc2VydmVkAAEFgFBlcnNvbmFsSWRSZXNlcnZhdGlvbkNhbm5vdFJlbmV3AAEFkFBlcnNvbmFsSWROb3RSZXNlcnZlZE9yTm90UmVjb2duaXplZAABBSxJbnZhbGlkUmluZwABBUhTdXNwZW5zaW9uc1BlbmRpbmcAAQVcUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQAAQVISW52YWxpZFN1c3BlbnNpb25zAAEFRE5vTXV0YXRpb25TZXNzaW9uAAEFcENvdWxkTm90U3RhcnRNdXRhdGlvblNlc3Npb24AAQVsU3VzcGVuc2lvblNlc3Npb25JblByb2dyZXNzAAEFOFRpbWVPdXRPZlJhbmdlAAEFWEFsaWFzQWNjb3VudEFscmVhZHlTZXQAAQUwTm90U3VzcGVuZGVkAAEFJFN1c3BlbmRlZAABBUxJbnZhbGlkS2V5TWlncmF0aW9uAAEFTEtleUFscmVhZHlTdXNwZW5kZWQAAQVUSW52YWxpZE9uYm9hcmRpbmdTaXplAAEFQEludmFsaWRNZW1iZXJLZXkAAQV0UGVvcGxlQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQUCUChOb1N1Y2hDYXNlAAEFKE5vU3VjaFZvdGUAAQUcTm90T3BlbgABBRxOb3RSaXBlAAEFHE5vdERvbmUAAQUoQ29kZWNFcnJvcgABBTREaXNwYXRjaEVycm9yAAEFGFJlY2VudAABBSBOb0NyZWRpdAABBSBOb1Jld2FyZAABBSBOb1BvaW50cwABBTRUb29NYW55Q2xhaW1zAAEFIE5vUGF5b3V0AAEFSEFyaXRobWV0aWNPdmVyZmxvdwABBUBUb29NYW55U2NoZWR1bGVzAAEFKE5vU2NoZWR1bGUAAQUkTm9QZW5hbHR5AAEFFEVhcmx5AAEFMFVuZGVyUGVuYWx0eQABBVhDYXNlRXhwaXJhdGlvbkRpc2FibGVkAAEFAqAoSW5Qcm9ncmVzcwABBShOb1JlZmVycmFsAAEFKEJhZENvbnRleHQAAQVMVW5leHBlY3RlZEp1ZGdlbWVudAABBRhOb0FyZ3MAAQUoTm90QXBwbGllZAABBSxOb3RTZWxlY3RlZAABBSROb3RQcm92ZW4AAQU4QWxyZWFkeVN0YXJ0ZWQAAQUoT3V0T2ZSYW5nZQABBTBBbHJlYWR5VGFrZW4AAQU8Tm9Nb3JlUmVmZXJyYWxzAAEFIFRvb0Vhcmx5AAEFNERlc2lnbkludmFsaWQAAQUsRGVzaWduVGFrZW4AAQUkQmFkUGFyZW50AAEFJEJhZEZhbWlseQABBSxXcm9uZ0ZhbWlseQABBSxJbmRleFRvb0JpZwABBRBCdXN5AAEFGEJhbm5lZAABBShJbXByb2JhYmxlAAEFKElkUmVzZXJ2ZWQAAQUYSWRVc2VkAAEFNEludmFsaWRUaWNrZXQAAQUgTm9UaWNrZXQAAQU0Tm90QXV0aG9yaXplZAABBSROb3RQZXJzb24AAQVEUmVmZXJyZWRDYW5kaWRhdGUAAQVQTm90UmVmZXJyZWRDYW5kaWRhdGUAAQVITm9SZXdhcmRUb1JlZ2lzdGVyAAEFQFJld2FyZFRvUmVnaXN0ZXIAAQUkTm9JbnZpdGVyAAEFQEludmFsaWRTaWduYXR1cmUAAQUkTm9JbnZpdGVzAAEFOEFscmVhZHlJbnZpdGVkAAEFKE5vUmVmZXJyZXIAAQUwTm90UG9pUGVyc29uAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFaEludmFsaWRSZWltYnVyc2VtZW50VmFsdWVzAAEFAmwsR2FtZU9uZ29pbmcAAQU4Tm9SZWdpc3RyYXRpb24AAQVET3V0ZGF0ZWRHYW1lU2V0dXAAAQVASW52YWxpZEdhbWVTZXR1cAABBTRJbnZhbGlkUmVwb3J0AAEFGE5vR2FtZQABBSxOb1JlcG9ydGluZwABBTROb3RSZWdpc3RlcmVkAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFRFJlcG9ydEFscmVhZHlTZW50AAEFFEVhcmx5AAEFRE5vdEtpY2thYmxlUGxheWVyAAEFQE5vQXJjaGl2ZWRQbGF5ZXIAAQUgTm9UaWNrZXQAAQUkTm9JbnZpdGVzAAEFOEFscmVhZHlJbnZpdGVkAAEFQE5vdEFjY291bnRQbGF5ZXIAAQVoVXNlSW52aXRlQnV0QWxyZWFkeVBsYXlpbmcAAQVQVG9vTWFueUdhbWVTY2hlZHVsZXMAAQVMTm9TdWNoR2FtZVNjaGVkdWxlZAABBYBJbnZhbGlkU3RhdGVtZW50QWNjb3VudFNpZ25hdHVyZQABBXBTdGF0ZW1lbnRBY2NvdW50QWxyZWFkeUluVXNlAAEFZEludGVybmFsRXJyb3JJbnZhbGlkU3RhdGUAAQVASW52YWxpZEdhbWVTdGF0ZQABBSBOb1BsYXllcgABBZBDYW5ub3RPZmZib2FyZFdoaWxlUmVnaXN0ZXJlZEZvckdhbWUAAQUwSW52YWxpZFN0YXRlAAEFAlQkTm90UGVyc29uAAEFXEhhc05vdFJlYWNoZWRQZXJzb25ob29kAAEFIE5vUmV3YXJkAAEFHE5vU2NvcmUAAQUoTm9TY2hlZHVsZQABBUBUb29NYW55U2NoZWR1bGVzAAEFKFJlY29nbml6ZWQAAQU8Q2FzaE91dENvb2xkb3duAAEFYFJvdW5kT25Hb2luZ09yTm9TY2hlZHVsZQABBRxOb1JvdW5kAAEFbEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZAABBcBCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQAAQWcQmFkT3JpZ2luTm90U2lnbmVkTm90QWNjb3VudFBhcnRpY2lwYW50AAEFUEFscmVhZHlQYXJ0aWNpcGF0aW5nAAEFREtleU11c3RCZVByb3ZpZGVkAAEFUEtleU11c3ROb3RCZVByb3ZpZGVkAAEFUEhhc1JlYWNoZWRQZXJzb25ob29kAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFOFdpbmRvd1Rvb0xhcmdlAAEFVEFsbG93ZWRNaXNzZXNUb29MYXJnZQABBURTY2hlZHVsZU5vdFNvcnRlZAABBQIQJE5vdFBlcnNvbgABBTBOb3RTdXNwZW5kZWQAAQUsTm90UmVzZXJ2ZWQAAQU0VG9vTWFueVBlb3BsZQABBQIQWE5vQXR0ZXN0YXRpb25BbGxvd2FuY2UAAQVsSW52YWxpZEF0dGVzdGF0aW9uU2lnbmF0dXJlAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFAlA8SW52YWxpZFVzZXJuYW1lAAEFNFVzZXJuYW1lVGFrZW4AAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU0Tm90UmVnaXN0ZXJlZAABBTROb3RGdWxsUGVyc29uAAEFNFRvdWNoTm90UmVhZHkAAQU0Tm9SZXNlcnZhdGlvbgABBVBOb3RSZXNlcnZhdGlvbkhvbGRlcgABBWBVc2VybmFtZVJlc2VydmF0aW9uVGFrZW4AAQVAUmVzZXJ2YXRpb25GcmVzaAABBUBOb0xpbmtlZElkZW50aXR5AAEFNEFscmVhZHlMaW5rZWQAAQUsSW52YWxpZFNsb3QAAQVoQWNjb3VudEFscmVhZHlIYXNBbGxvd2FuY2UAAQVQUGVyc29uQXV0aE5vdEV4cGlyZWQAAQU4QWxyZWFkeURlbW90ZWQAAQUkUXVldWVGdWxsAAEFKE5vdEluUXVldWUAAQVUQWxyZWFkeUhhc1Jlc2VydmF0aW9uAAEFAgw0Q2h1bmtOb3RGb3VuZAABBTRJbnZhbGlkQ2h1bmtzAAEFREludmFsaWRDaHVua1JhbmdlAAEFAmwkTm90TWVtYmVyAAEFGE5vUm9vdAABBTBJbnZhbGlkUHJvb2YAAQUoSW5jb21wbGV0ZQABBShTdGlsbEZyZXNoAAEFOFRvb01hbnlNZW1iZXJzAAEFPEtleUFscmVhZHlJblVzZQABBSxLZXlOb3RGb3VuZAABBTBDb3VsZE5vdFB1c2gAAQUsSW52YWxpZFJpbmcAAQVIU3VzcGVuc2lvbnNQZW5kaW5nAAEFXFJpbmdBYm92ZU1lcmdlVGhyZXNob2xkAAEFSEludmFsaWRTdXNwZW5zaW9ucwABBUBOb1JlbW92YWxTZXNzaW9uAAEFbENvdWxkTm90U3RhcnRSZW1vdmFsU2Vzc2lvbgABBWBSZW1vdmFsU2Vzc2lvbkluUHJvZ3Jlc3MAAQVMS2V5QWxyZWFkeVN1c3BlbmRlZAABBVRJbnZhbGlkT25ib2FyZGluZ1NpemUAAQVASW52YWxpZE1lbWJlcktleQABBUhDb2xsZWN0aW9uTm90Rm91bmQAAQVcQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQVIVG9vTWFueUNvbGxlY3Rpb25zAAEFaEludmFsaWRSaW5nU2l6ZUZvckZsZXhpYmxlAAEFTEludmFsaWRSaW5nRXhwb25lbnQAAQVMUHJlbWF0dXJlT25ib2FyZGluZwABBWxDb2xsZWN0aW9uTWFya2VkRm9yRGVsZXRpb24AAQVITm90Q29sbGVjdGlvbk93bmVyAAEFAmRQTWVtYmVyS2V5QWxyZWFkeVVzZWQAAQVASW52YWxpZE1lbWJlcktleQABBTRJbnRlcm5hbEVycm9yAAEFXFJlY3ljbGVyQWxyZWFkeVVubG9hZGVkAAEFUEludmFsaWRDb25zb2xpZGF0aW9uAAEFTENvbnNvbGlkYXRpb25Ub29CaWcAAQU8Q29pblZhbHVlVG9vQmlnAAEFRENvaW5WYWx1ZVRvb1NtYWxsAAEFWENvaW5WYWx1ZUlzTGVzc1RoYW5GZWUAAQVMQ29pblZhbHVlT3V0T2ZCb3VuZAABBURJbnZhbGlkQWxpYXNQcm9vZgABBUxOb1VubG9hZGluZ1JlY3ljbGVyAAEFVFByb29mQW5kQWxpYXNNaXNtYXRjaAABBThOb3RoaW5nVG9CdWlsZAABBTBUb29NYW55UmluZ3MAAQVUQWRkcmVzc0FscmVhZHlIYXNDb2luAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFLEVtcHR5SW5wdXRzAAEFQFJlY3ljbGVyTWlzbWF0Y2gAAQVgSW5zdWZmaWNpZW50VW5sb2FkRm9yRmVlAAEFREFsaWFzTm90UHJlbWFya2VkAAEFXEludmFsaWRSZWN5Y2xlclJldmlzaW9uAAEFMEludmFsaWRTcGxpdAABBURGcmVzaENvaW5SZXF1aXJlZAABBWhDYW5ub3RDb252ZXJ0TmF0aXZlVG9Bc3NldAABBQIkNE5vQWN0aXZlRXZlbnQAAQUoTm90QVBlcnNvbgABBVhBbGlhc0FscmVhZHlSZWdpc3RlcmVkAAEFcEludmFsaWRFdmVudFJlZ2lzdHJhdGlvblRpbWUAAQVUUGFydGljaXBhbnRJZE92ZXJmbG93AAEFWE5vUHJpemVUb0NsYWltRm9yRXZlbnQAAQUwTm9FdmVudEZvdW5kAAEFMFNjaGVkdWxlRnVsbAABBYhQcml6ZU11c3RCZU1vcmVPckVxdWFsVG9NaW5CYWxhbmNlAAEFAgQcT25nb2luZwABBQKsGFN5c3RlbQFEPFBhcmFjaGFpblN5c3RlbQFIJFRpbWVzdGFtcAABBTRQYXJhY2hhaW5JbmZvAAEFNFdlaWdodFJlY2xhaW0AAQUgQmFsYW5jZXMBTEhUcmFuc2FjdGlvblBheW1lbnQAAQVIU2tpcEZlZWxlc3NQYXltZW50AAEFRE9yaWdpblJlc3RyaWN0aW9uAVAYQXNzZXRzAVQwQXNzZXRzSG9sZGVyAVgkQXNzZXRSYXRlAVw4QXNzZXRUeFBheW1lbnQAAQUoQXV0aG9yc2hpcAABBURDb2xsYXRvclNlbGVjdGlvbgFgHFNlc3Npb24BZBBBdXJhAAEFHEF1cmFFeHQAAQUkWGNtcFF1ZXVlAWgsUG9sa2Fkb3RYY20BcChDdW11bHVzWGNtAAEFME1lc3NhZ2VRdWV1ZQF0HFV0aWxpdHkBeCBNdWx0aXNpZwF8EFN1ZG8BgDxWZXJpZnlTaWduYXR1cmUAAQUUUHJveHkBhCBJZGVudGl0eQGIGFBlb3BsZQGMHE1vYlJ1bGUBkChQcm9vZk9mSW5rAZQQR2FtZQGYFFNjb3JlAZwgRHVtbXlEaW0BoChQZW9wbGVMaXRlAaQkUmVzb3VyY2VzAag0Q2h1bmtzTWFuYWdlcgGsHE1lbWJlcnMBsBxDb2luYWdlAbRUU3RvcmFnZUluaXRpYWxpemF0aW9uAAEFZFN0b3JhZ2VJbml0aWFsaXphdGlvbkxpdGUAAQUcQWlyZHJvcAG4UE11bHRpQmxvY2tNaWdyYXRpb25zAbwCKEBGdW5kc1VuYXZhaWxhYmxlAAEFME9ubHlQcm92aWRlcgABBTBCZWxvd01pbmltdW0AAQUwQ2Fubm90Q3JlYXRlAAEFMFVua25vd25Bc3NldAABBRhGcm96ZW4AAQUsVW5zdXBwb3J0ZWQAAQVAQ2Fubm90Q3JlYXRlSG9sZAABBTROb3RFeHBlbmRhYmxlAAEFHEJsb2NrZWQAAQUCDCRVbmRlcmZsb3cAAQUgT3ZlcmZsb3cAAQU4RGl2aXNpb25CeVplcm8AAQUCCDBMaW1pdFJlYWNoZWQAAQUcTm9MYXllcgABBQI4QEludmFsaWRTdGF0ZVJvb3QAAQVISW5jb21wbGV0ZURhdGFiYXNlAAEFUFZhbHVlQXRJbmNvbXBsZXRlS2V5AAEFMERlY29kZXJFcnJvcgABBSxJbnZhbGlkSGFzaAABBTBEdXBsaWNhdGVLZXkAAQU4RXh0cmFuZW91c05vZGUAAQU8RXh0cmFuZW91c1ZhbHVlAAEFXEV4dHJhbmVvdXNIYXNoUmVmZXJlbmNlAAEFVEludmFsaWRDaGlsZFJlZmVyZW5jZQABBTRWYWx1ZU1pc21hdGNoAAEFPEluY29tcGxldGVQcm9vZgABBTBSb290TWlzbWF0Y2gAAQUsRGVjb2RlRXJyb3IAAQUCPBRPdGhlcgABBTBDYW5ub3RMb29rdXAAAQUkQmFkT3JpZ2luAAEFGE1vZHVsZQHARENvbnN1bWVyUmVtYWluaW5nAAEFLE5vUHJvdmlkZXJzAAEFQFRvb01hbnlDb25zdW1lcnMAAQUUVG9rZW4BxChBcml0aG1ldGljAcg0VHJhbnNhY3Rpb25hbAHMJEV4aGF1c3RlZAABBShDb3JydXB0aW9uAAEFLFVuYXZhaWxhYmxlAAEFOFJvb3ROb3RBbGxvd2VkAAEFEFRyaWUB0AIgQEV4dHJpbnNpY1N1Y2Nlc3MAAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAAAIOGRpc3BhdGNoX2Vycm9y1DRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAABBShOZXdBY2NvdW50AAAEHGFjY291bnQANEtpbGxlZEFjY291bnQAAAQcYWNjb3VudAAgUmVtYXJrZWQAAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAAACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UgFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlAAAIJGNvZGVfaGFzaCAUZXJyb3LUBiACGGBWYWxpZGF0aW9uRnVuY3Rpb25TdG9yZWQAAQVkVmFsaWRhdGlvbkZ1bmN0aW9uQXBwbGllZAAABFRyZWxheV9jaGFpbl9ibG9ja19udW0EbFZhbGlkYXRpb25GdW5jdGlvbkRpc2NhcmRlZAABBWBEb3dud2FyZE1lc3NhZ2VzUmVjZWl2ZWQAAAQUY291bnQEZERvd253YXJkTWVzc2FnZXNQcm9jZXNzZWQAAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIERVcHdhcmRNZXNzYWdlU2VudAAABDBtZXNzYWdlX2hhc2jcAggQRnJlZQABBSBSZXNlcnZlZAABBQIEEEtleXMAAQUCBDhBdXRob3JpemVBbGlhcwABBQIIGFBheW91dAABBRhDcmVkaXQAAQUCBChQcm9vZk9mSW5rAAEFAgQgUGxheUdhbWUAAQUCBBxXcmFwcGVkAAEFAgQcQWlyZHJvcAABBQIgHFNlc3Npb24B6CxQb2xrYWRvdFhjbQHsHE1vYlJ1bGUB8ChQcm9vZk9mSW5rAfQQR2FtZQH4FFNjb3JlAfAcQ29pbmFnZQH8HEFpcmRyb3ABAQECCDhCYWxhbmNlVXBkYXRlZAABBVRGYWlsZWRUb011dGF0ZUFjY291bnQAAQUCeBxFbmRvd2VkAAAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QAAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgAADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AAAIDHdobwAQZnJlZQggUmVzZXJ2ZWQAAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQAAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAAAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPkHERlcG9zaXQAAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AAAIDHdobwAYYW1vdW50CBxTbGFzaGVkAAAIDHdobwAYYW1vdW50CBhNaW50ZWQAAAgMd2hvABhhbW91bnQIME1pbnRlZENyZWRpdAAABBhhbW91bnQIGEJ1cm5lZAAACAx3aG8AGGFtb3VudAgoQnVybmVkRGVidAAABBhhbW91bnQIJFN1c3BlbmRlZAAACAx3aG8AGGFtb3VudAggUmVzdG9yZWQAAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAAAEDHdobwAYSXNzdWVkAAAEGGFtb3VudAgkUmVzY2luZGVkAAAEGGFtb3VudAgYTG9ja2VkAAAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAAACAx3aG8AGGFtb3VudAgYRnJvemVuAAAIDHdobwAYYW1vdW50CBhUaGF3ZWQAAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQAAAgMb2xkCAxuZXcIEEhlbGQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIKEJ1cm5lZEhlbGQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIOFRyYW5zZmVyT25Ib2xkAAAQGHJlYXNvbgUBGHNvdXJjZQAQZGVzdAAYYW1vdW50CDxUcmFuc2ZlckFuZEhvbGQAABAYcmVhc29uBQEYc291cmNlABBkZXN0ACx0cmFuc2ZlcnJlZAggUmVsZWFzZWQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIKFVuZXhwZWN0ZWQBCQECBEhUcmFuc2FjdGlvbkZlZVBhaWQAAAwMd2hvAChhY3R1YWxfZmVlCAx0aXAIAhAQUm9vdAABBRhTaWduZWQBABBOb25lAAEFKEF1dGhvcml6ZWQAAQUCICRCeUdlbmVzaXMBIBhCeUZvcmsAAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAABBRhLdXNhbWEAAQUgRXRoZXJldW0AAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAAEFLEJpdGNvaW5DYXNoAAEFQFBvbGthZG90QnVsbGV0aW4AAQUGGQEFAVACKBBVbml0AAEFHE1vbmlrZXIBKBRJbmRleAEEJEV4ZWN1dGl2ZQABBSRUZWNobmljYWwAAQUsTGVnaXNsYXRpdmUAAQUgSnVkaWNpYWwAAQUcRGVmZW5zZQABBThBZG1pbmlzdHJhdGlvbgABBSBUcmVhc3VyeQABBQIUFFZvaWNlAAEFHE1lbWJlcnMAAAQUY291bnQEIEZyYWN0aW9uAAAIDG5vbQQUZGVub20EREF0TGVhc3RQcm9wb3J0aW9uAAAIDG5vbQQUZGVub20ESE1vcmVUaGFuUHJvcG9ydGlvbgAACAxub20EFGRlbm9tBAIoJFBhcmFjaGFpbgEELEFjY291bnRJZDMyAAAIHG5ldHdvcmsdAQhpZCA4QWNjb3VudEluZGV4NjQAAAgcbmV0d29yax0BFGluZGV4CDBBY2NvdW50S2V5MjAAAAgcbmV0d29yax0BDGtleSEBOFBhbGxldEluc3RhbmNlAQQwR2VuZXJhbEluZGV4AQgoR2VuZXJhbEtleQAACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAABBSRQbHVyYWxpdHkAAAgIaWQlARBwYXJ0KQE8R2xvYmFsQ29uc2Vuc3VzARkBBC0BAQgELQEBDAQtAQEQBC0BARQELQEBGAQtAQEcBC0BASACJBBIZXJlAAEFCFgxAS0BCFgyATEBCFgzATUBCFg0ATkBCFg1AT0BCFg2AUEBCFg3AUUBCFg4AUkBAAgccGFyZW50cwQgaW50ZXJpb3JNAQIIDFhjbQFRASBSZXNwb25zZQFRAQIIFFJlbGF5AAEFQFNpYmxpbmdQYXJhY2hhaW4BBAAIFGFsaWFzIBxjb250ZXh0IAAMIHJldmlzaW9uBBByaW5nBAhjYV0BAghAUGVyc29uYWxJZGVudGl0eQEINFBlcnNvbmFsQWxpYXMBYQECDFhBdXRob3JpemVkQXBwbHlXaXRoU2lnAQBEUmVmZXJyZWRDYW5kaWRhdGUBAEBJbnZpdGVkQ2FuZGlkYXRlAQACBBxJbnZpdGVkAQACBEhBY2NvdW50UGFydGljaXBhbnQBAAIEKExpdGVQZXJzb24BAAIELE1lbWJlckFsaWFzAAMIIGEBAAgUdmFsdWUEDGFnZQQFAVEMBIEBAAIIHFByZXBhaWQAAQUoRnJvbU91dHB1dAAACEhmZWVfcmVjeWNsZXJfdmFsdWUESGZlZV9yZWN5Y2xlcl9pbmRleAQCCBBDb2luAAAIHGNvaW5faWQAEGNvaW59ASxVbmxvYWRUb2tlbgAADDBhbGlhc19wcm9vZnOFAShwcm92ZW5fbXNnIAxmZWWJAQIoGHN5c3RlbQEVASxQb2xrYWRvdFhjbQFVAShDdW11bHVzWGNtAVkBGFBlb3BsZQFlAShQcm9vZk9mSW5rAWkBEEdhbWUBbQEUU2NvcmUBcQEoUGVvcGxlTGl0ZQF1ARxNZW1iZXJzAXkBHENvaW5hZ2UBjQECBChGZWVTa2lwcGVkAAAEGG9yaWdpbpEBAhg0UGVyc29uYWxBbGlhcwEgQFBlcnNvbmFsSWRlbnRpdHkBCERSZWZlcnJlZENhbmRpZGF0ZQEASEFjY291bnRQYXJ0aWNpcGFudAEAQEludml0ZWRDYW5kaWRhdGUBAChMaXRlUGVyc29uAQACBDBVc2FnZUNsZWFuZWQAAAQYZW50aXR5mQEACBxyZXNlcnZlUQEwdGVsZXBvcnRhYmxlFAShAQACcBxDcmVhdGVkAAAMIGFzc2V0X2lkUQEcY3JlYXRvcgAUb3duZXIAGElzc3VlZAAADCBhc3NldF9pZFEBFG93bmVyABhhbW91bnQILFRyYW5zZmVycmVkAAAQIGFzc2V0X2lkUQEQZnJvbQAIdG8AGGFtb3VudAgYQnVybmVkAAAMIGFzc2V0X2lkUQEUb3duZXIAHGJhbGFuY2UILFRlYW1DaGFuZ2VkAAAQIGFzc2V0X2lkUQEYaXNzdWVyABRhZG1pbgAcZnJlZXplcgAwT3duZXJDaGFuZ2VkAAAIIGFzc2V0X2lkUQEUb3duZXIAGEZyb3plbgAACCBhc3NldF9pZFEBDHdobwAYVGhhd2VkAAAIIGFzc2V0X2lkUQEMd2hvACxBc3NldEZyb3plbgAABCBhc3NldF9pZFEBLEFzc2V0VGhhd2VkAAAEIGFzc2V0X2lkUQFEQWNjb3VudHNEZXN0cm95ZWQAAAwgYXNzZXRfaWRRAUhhY2NvdW50c19kZXN0cm95ZWQESGFjY291bnRzX3JlbWFpbmluZwRIQXBwcm92YWxzRGVzdHJveWVkAAAMIGFzc2V0X2lkUQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwRIRGVzdHJ1Y3Rpb25TdGFydGVkAAAEIGFzc2V0X2lkUQEkRGVzdHJveWVkAAAEIGFzc2V0X2lkUQEwRm9yY2VDcmVhdGVkAAAIIGFzc2V0X2lkUQEUb3duZXIALE1ldGFkYXRhU2V0AAAUIGFzc2V0X2lkUQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQkaXNfZnJvemVuFDxNZXRhZGF0YUNsZWFyZWQAAAQgYXNzZXRfaWRRAUBBcHByb3ZlZFRyYW5zZmVyAAAQIGFzc2V0X2lkUQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CERBcHByb3ZhbENhbmNlbGxlZAAADCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQBMVHJhbnNmZXJyZWRBcHByb3ZlZAAAFCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQAsZGVzdGluYXRpb24AGGFtb3VudAhIQXNzZXRTdGF0dXNDaGFuZ2VkAAAEIGFzc2V0X2lkUQFYQXNzZXRNaW5CYWxhbmNlQ2hhbmdlZAAACCBhc3NldF9pZFEBPG5ld19taW5fYmFsYW5jZQgcVG91Y2hlZAAADCBhc3NldF9pZFEBDHdobwAkZGVwb3NpdG9yABxCbG9ja2VkAAAIIGFzc2V0X2lkUQEMd2hvACREZXBvc2l0ZWQAAAwgYXNzZXRfaWRRAQx3aG8AGGFtb3VudAgkV2l0aGRyYXduAAAMIGFzc2V0X2lkUQEMd2hvABhhbW91bnQIPFJlc2VydmVzVXBkYXRlZAAACCBhc3NldF9pZFEBIHJlc2VydmVzpQE8UmVzZXJ2ZXNSZW1vdmVkAAAEIGFzc2V0X2lkUQECDBBIZWxkAAAQDHdobwAgYXNzZXRfaWRRARhyZWFzb24FARhhbW91bnQIIFJlbGVhc2VkAAAQDHdobwAgYXNzZXRfaWRRARhyZWFzb24FARhhbW91bnQIGEJ1cm5lZAAAEAx3aG8AIGFzc2V0X2lkUQEYcmVhc29uBQEYYW1vdW50CAIMQEFzc2V0UmF0ZUNyZWF0ZWQAAAgoYXNzZXRfa2luZFEBEHJhdGUIQEFzc2V0UmF0ZVJlbW92ZWQAAAQoYXNzZXRfa2luZFEBQEFzc2V0UmF0ZVVwZGF0ZWQAAAwoYXNzZXRfa2luZFEBDG9sZAgMbmV3CAZRAQIEOEFzc2V0VHhGZWVQYWlkAAAQDHdobwAoYWN0dWFsX2ZlZQgMdGlwCCBhc3NldF9pZLUBBAAAAihATmV3SW52dWxuZXJhYmxlcwAABDRpbnZ1bG5lcmFibGVzvQFESW52dWxuZXJhYmxlQWRkZWQAAAQoYWNjb3VudF9pZABMSW52dWxuZXJhYmxlUmVtb3ZlZAAABChhY2NvdW50X2lkAFBOZXdEZXNpcmVkQ2FuZGlkYXRlcwAABEhkZXNpcmVkX2NhbmRpZGF0ZXMEQE5ld0NhbmRpZGFjeUJvbmQAAAQsYm9uZF9hbW91bnQIOENhbmRpZGF0ZUFkZGVkAAAIKGFjY291bnRfaWQAHGRlcG9zaXQIUENhbmRpZGF0ZUJvbmRVcGRhdGVkAAAIKGFjY291bnRfaWQAHGRlcG9zaXQIQENhbmRpZGF0ZVJlbW92ZWQAAAQoYWNjb3VudF9pZABEQ2FuZGlkYXRlUmVwbGFjZWQAAAwMb2xkAAxuZXcAHGRlcG9zaXQIaEludmFsaWRJbnZ1bG5lcmFibGVTa2lwcGVkAAAEKGFjY291bnRfaWQAAhAoTmV3U2Vzc2lvbgAABDRzZXNzaW9uX2luZGV4BCROZXdRdWV1ZWQAAQVEVmFsaWRhdG9yRGlzYWJsZWQAAAQkdmFsaWRhdG9yAEhWYWxpZGF0b3JSZWVuYWJsZWQAAAQkdmFsaWRhdG9yAAIEPFhjbXBNZXNzYWdlU2VudAAABDBtZXNzYWdlX2hhc2ggAqQgT3ZlcmZsb3cAAQU0VW5pbXBsZW1lbnRlZAABBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgABBTBMb2NhdGlvbkZ1bGwAAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAEFJEJhZE9yaWdpbgABBTxJbnZhbGlkTG9jYXRpb24AAQU0QXNzZXROb3RGb3VuZAABBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQAAQU8Tm90V2l0aGRyYXdhYmxlAAEFSExvY2F0aW9uQ2Fubm90SG9sZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBTBVbmtub3duQ2xhaW0AAQU4RmFpbGVkVG9EZWNvZGUAAQVATWF4V2VpZ2h0SW52YWxpZAABBThOb3RIb2xkaW5nRmVlcwABBTBUb29FeHBlbnNpdmUAAQUQVHJhcAEIQEV4cGVjdGF0aW9uRmFsc2UAAQU4UGFsbGV0Tm90Rm91bmQAAQUwTmFtZU1pc21hdGNoAAEFTFZlcnNpb25JbmNvbXBhdGlibGUAAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAAQUsRXhwb3J0RXJyb3IAAQU4UmVhbmNob3JGYWlsZWQAAQUYTm9EZWFsAAEFKEZlZXNOb3RNZXQAAQUkTG9ja0Vycm9yAAEFME5vUGVybWlzc2lvbgABBShVbmFuY2hvcmVkAAEFOE5vdERlcG9zaXRhYmxlAAEFNFRvb01hbnlBc3NldHMAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBUhXZWlnaHRMaW1pdFJlYWNoZWQBGBxCYXJyaWVyAAEFTFdlaWdodE5vdENvbXB1dGFibGUAAQVERXhjZWVkc1N0YWNrTGltaXQAAQUACBRpbmRleAQUZXJyb3LNAQIMIENvbXBsZXRlAAAEEHVzZWQYKEluY29tcGxldGUAAAgQdXNlZBgUZXJyb3LRARRFcnJvcgHRAQUBIAUBQAIYJFVuZGVmaW5lZAABBRRJbmRleAEIGEFycmF5NAEoGEFycmF5OAHZARxBcnJheTE2Ad0BHEFycmF5MzIBIAIIIEZ1bmdpYmxlAQgsTm9uRnVuZ2libGUB4QEACAhpZFEBDGZ1buUBBOkBAAMIBM0BBvEBABgUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJBRtYWpvcgQUbWlub3IEFHBhdGNoBAT5AQACDBxTdWNjZXNzAAEFFEVycm9yASQ4VHJ1bmNhdGVkRXJyb3IBJAIYEE51bGwAAQUYQXNzZXRzAe0BPEV4ZWN1dGlvblJlc3VsdAH1ARxWZXJzaW9uAQQsUGFsbGV0c0luZm8B/QE4RGlzcGF0Y2hSZXN1bHQBAQICEBhOYXRpdmUAAQVAU292ZXJlaWduQWNjb3VudAABBSRTdXBlcnVzZXIAAQUMWGNtAAEFBhgADCxkZXN0aW5hdGlvblEBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIIIEZ1bmdpYmxlAAEFLE5vbkZ1bmdpYmxlAAEFAhAMQWxsAAEFFEFsbE9mAAAICGlkUQEMZnVuFQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZFEBDGZ1bhUCFGNvdW50BAIIIERlZmluaXRlAe0BEFdpbGQBGQICCCRVbmxpbWl0ZWQAAQUcTGltaXRlZAEYAgwgVGVsZXBvcnQBHQI4UmVzZXJ2ZURlcG9zaXQBHQI8UmVzZXJ2ZVdpdGhkcmF3AR0CBiUCBCUCAAZNAQIEMEFzc2V0Q2xhaW1lcgAABCBsb2NhdGlvblEBBDUCAALQNFdpdGhkcmF3QXNzZXQB7QFUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkAe0BWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQB7QE0UXVlcnlSZXNwb25zZQAAECBxdWVyeV9pZAggcmVzcG9uc2UFAihtYXhfd2VpZ2h0GBxxdWVyaWVytQE0VHJhbnNmZXJBc3NldAAACBhhc3NldHPtASxiZW5lZmljaWFyeVEBUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0AAAMGGFzc2V0c+0BEGRlc3RRAQx4Y21BAiBUcmFuc2FjdAAADCxvcmlnaW5fa2luZAkCTGZhbGxiYWNrX21heF93ZWlnaHQNAhBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BTQEsUmVwb3J0RXJyb3IBEQIwRGVwb3NpdEFzc2V0AAAIGGFzc2V0cx0CLGJlbmVmaWNpYXJ5UQFMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHMdAhBkZXN0UQEMeGNtQQI0RXhjaGFuZ2VBc3NldAAADBBnaXZlHQIQd2FudO0BHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0cx0CHHJlc2VydmVRAQx4Y21BAkBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0cx0CEGRlc3RRAQx4Y21BAjRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8RAhhhc3NldHMdAjBCdXlFeGVjdXRpb24AAAgQZmVlc+kBMHdlaWdodF9saW1pdCECNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyAUECLFNldEFwcGVuZGl4AUECKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHPtARh0aWNrZXRRARBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAHtASxFeHBlY3RBc3NldAHtATBFeHBlY3RPcmlnaW4BtQEsRXhwZWN0RXJyb3IB9QFQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8RAjBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwERAkxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgEtATRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmsZASxkZXN0aW5hdGlvbk0BDHhjbUECJExvY2tBc3NldAAACBRhc3NldOkBIHVubG9ja2VyUQEsVW5sb2NrQXNzZXQAAAgUYXNzZXTpARh0YXJnZXRRAThOb3RlVW5sb2NrYWJsZQAACBRhc3NldOkBFG93bmVyUQE0UmVxdWVzdFVubG9jawAACBRhc3NldOkBGGxvY2tlclEBLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAVEBPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQhAjBjaGVja19vcmlnaW61ARxQYXlGZWVzAAAEFGFzc2V06QFASW5pdGlhdGVUcmFuc2ZlcgAAFCxkZXN0aW5hdGlvblEBLHJlbW90ZV9mZWVzKQI8cHJlc2VydmVfb3JpZ2luFBhhc3NldHMtAihyZW1vdGVfeGNtQQJERXhlY3V0ZVdpdGhPcmlnaW4AAAhEZGVzY2VuZGFudF9vcmlnaW4xAgx4Y21BAiBTZXRIaW50cwAABBRoaW50czkCBD0CAAIcNE5vdEFwcGxpY2FibGUAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQU8TWlzc2luZ0FyZ3VtZW50AAEFEEZlZXMAAQUCLCRCeUdlbmVzaXMBIBhCeUZvcmsAAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAABBRhLdXNhbWEAAQUcV2VzdGVuZAABBRhSb2NvY28AAQUYV29jb2NvAAEFIEV0aGVyZXVtAAAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQABBSxCaXRjb2luQ2FzaAABBUBQb2xrYWRvdEJ1bGxldGluAAEFBkkCAigkUGFyYWNoYWluAQQsQWNjb3VudElkMzIAAAgcbmV0d29ya00CCGlkIDhBY2NvdW50SW5kZXg2NAAACBxuZXR3b3JrTQIUaW5kZXgIMEFjY291bnRLZXkyMAAACBxuZXR3b3JrTQIMa2V5IQE4UGFsbGV0SW5zdGFuY2UBBDBHZW5lcmFsSW5kZXgBCChHZW5lcmFsS2V5AAAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAAEFJFBsdXJhbGl0eQAACAhpZCUBEHBhcnQpATxHbG9iYWxDb25zZW5zdXMBSQICJBBIZXJlAAEFCFgxAVECCFgyAARRAgEICFgzAARRAgEMCFg0AARRAgEQCFg1AARRAgEUCFg2AARRAgEYCFg3AARRAgEcCFg4AARRAgEgAAgccGFyZW50cwQgaW50ZXJpb3JVAgIIIENvbmNyZXRlAVkCIEFic3RyYWN0ASAACAhpZF0CDGZ1buUBBGECAAAICGlkWQIMZnVu5QEEaQIAAgwIVjMBZQIIVjQBbQIIVjUB7QECDAhWMwFZAghWNAFZAghWNQFRAQYIAnQkQXR0ZW1wdGVkAAAEHG91dGNvbWXVARBTZW50AAAQGG9yaWdpblEBLGRlc3RpbmF0aW9uUQEcbWVzc2FnZUECKG1lc3NhZ2VfaWQgKFNlbmRGYWlsZWQAABAYb3JpZ2luUQEsZGVzdGluYXRpb25RARRlcnJvckUCKG1lc3NhZ2VfaWQgPFByb2Nlc3NYY21FcnJvcgAADBhvcmlnaW5RARRlcnJvcs0BKG1lc3NhZ2VfaWQgSFVuZXhwZWN0ZWRSZXNwb25zZQAACBhvcmlnaW5RASBxdWVyeV9pZAg0UmVzcG9uc2VSZWFkeQAACCBxdWVyeV9pZAggcmVzcG9uc2UFAiBOb3RpZmllZAAADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBOb3RpZnlPdmVyd2VpZ2h0AAAUIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgENGFjdHVhbF93ZWlnaHQYTG1heF9idWRnZXRlZF93ZWlnaHQYTE5vdGlmeURpc3BhdGNoRXJyb3IAAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARITm90aWZ5RGVjb2RlRmFpbGVkAAAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQEludmFsaWRSZXNwb25kZXIAAAwYb3JpZ2luUQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9utQFcSW52YWxpZFJlc3BvbmRlclZlcnNpb24AAAgYb3JpZ2luUQEgcXVlcnlfaWQINFJlc3BvbnNlVGFrZW4AAAQgcXVlcnlfaWQINEFzc2V0c1RyYXBwZWQAAAwQaGFzaCAYb3JpZ2luUQEYYXNzZXRzcQJUVmVyc2lvbkNoYW5nZU5vdGlmaWVkAAAQLGRlc3RpbmF0aW9uUQEYcmVzdWx0BBBjb3N07QEobWVzc2FnZV9pZCBcU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQAAAggbG9jYXRpb25RARx2ZXJzaW9uBFBOb3RpZnlUYXJnZXRTZW5kRmFpbAAADCBsb2NhdGlvblEBIHF1ZXJ5X2lkCBRlcnJvcs0BZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwAAAggbG9jYXRpb251AiBxdWVyeV9pZAhUSW52YWxpZFF1ZXJpZXJWZXJzaW9uAAAIGG9yaWdpblEBIHF1ZXJ5X2lkCDhJbnZhbGlkUXVlcmllcgAAEBhvcmlnaW5RASBxdWVyeV9pZAhAZXhwZWN0ZWRfcXVlcmllclEBUG1heWJlX2FjdHVhbF9xdWVyaWVytQFQVmVyc2lvbk5vdGlmeVN0YXJ0ZWQAAAwsZGVzdGluYXRpb25RARBjb3N07QEobWVzc2FnZV9pZCBYVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAAADCxkZXN0aW5hdGlvblEBEGNvc3TtAShtZXNzYWdlX2lkIGBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQAAAwsZGVzdGluYXRpb25RARBjb3N07QEobWVzc2FnZV9pZCAgRmVlc1BhaWQAAAgYcGF5aW5nUQEQZmVlc+0BNEFzc2V0c0NsYWltZWQAAAwQaGFzaCAYb3JpZ2luUQEYYXNzZXRzcQJgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkAAAEHHZlcnNpb24EPEFsaWFzQXV0aG9yaXplZAAADBxhbGlhc2VyUQEYdGFyZ2V0UQEYZXhwaXJ5eQJkQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAAACBxhbGlhc2VyUQEYdGFyZ2V0UQFwQWxpYXNlc0F1dGhvcml6YXRpb25zUmVtb3ZlZAAABBh0YXJnZXRRAQIMNEludmFsaWRGb3JtYXQBIEhVbnN1cHBvcnRlZFZlcnNpb24BIEBFeGVjdXRlZERvd253YXJkAAMIINUBAgwQSGVyZQABBRhQYXJlbnQAAQUcU2libGluZwEEAhgkQmFkRm9ybWF0AAEFHENvcnJ1cHQAAQUsVW5zdXBwb3J0ZWQAAQUoT3ZlcndlaWdodAEYFFlpZWxkAAEFRFN0YWNrTGltaXRSZWFjaGVkAAEFAhBAUHJvY2Vzc2luZ0ZhaWxlZAAADAhpZCAYb3JpZ2luhQIUZXJyb3KJAiRQcm9jZXNzZWQAABAIaWQgGG9yaWdpboUCLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQAABAIaWQgGG9yaWdpboUCKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQAAAgYb3JpZ2luhQIUaW5kZXgEAQUHkQLUAiBAQmF0Y2hJbnRlcnJ1cHRlZAAACBRpbmRleAQUZXJyb3LUOEJhdGNoQ29tcGxldGVkAAEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwABBTRJdGVtQ29tcGxldGVkAAEFKEl0ZW1GYWlsZWQAAAQUZXJyb3LUMERpc3BhdGNoZWRBcwAABBhyZXN1bHSVAkRJZkVsc2VNYWluU3VjY2VzcwABBVBJZkVsc2VGYWxsYmFja0NhbGxlZAAABChtYWluX2Vycm9y1AAIGGhlaWdodAQUaW5kZXgEAhQsTmV3TXVsdGlzaWcAAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAAAQJGFwcHJvdmluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAAAFCRhcHByb3ZpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdJUCRE11bHRpc2lnQ2FuY2VsbGVkAAAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggMERlcG9zaXRQb2tlZAAAEAx3aG8AJGNhbGxfaGFzaCAsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAYAAhAUU3VkaWQAAAQsc3Vkb19yZXN1bHSVAihLZXlDaGFuZ2VkAAAIDG9sZKUCDG5ldwAoS2V5UmVtb3ZlZAABBShTdWRvQXNEb25lAAAELHN1ZG9fcmVzdWx0lQICGAxBbnkAAQUsTm9uVHJhbnNmZXIAAQUsQ2FuY2VsUHJveHkAAQUgSWRlbnRpdHkAAQVESWRlbnRpdHlKdWRnZW1lbnQAAQUgQ29sbGF0b3IAAQUCCBxQcm94aWVzAAEFNEFubm91bmNlbWVudHMAAQUCHDRQcm94eUV4ZWN1dGVkAAAEGHJlc3VsdJUCLFB1cmVDcmVhdGVkAAAYEHB1cmUADHdobwAocHJveHlfdHlwZa0CUGRpc2FtYmlndWF0aW9uX2luZGV4BAhhdAQ8ZXh0cmluc2ljX2luZGV4BChQdXJlS2lsbGVkAAAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGWtAlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAAAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQAABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtAhRkZWxheQQwUHJveHlSZW1vdmVkAAAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQIUZGVsYXkEMERlcG9zaXRQb2tlZAAAEAx3aG8AEGtpbmSxAixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAggQVHJ1ZQABBRRGYWxzZQABBQIIFFRydXRoAbkCIENvbnRlbXB0AAEFAoAsSWRlbnRpdHlTZXQAAAQMd2hvADxJZGVudGl0eUNsZWFyZWQAAAgMd2hvABxkZXBvc2l0CDhJZGVudGl0eUtpbGxlZAAACAx3aG8AHGRlcG9zaXQISEp1ZGdlbWVudFJlcXVlc3RlZAAACAx3aG8APHJlZ2lzdHJhcl9pbmRleARQSnVkZ2VtZW50VW5yZXF1ZXN0ZWQAAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEOEp1ZGdlbWVudEdpdmVuAAAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BDhSZWdpc3RyYXJBZGRlZAAABDxyZWdpc3RyYXJfaW5kZXgEQFN1YklkZW50aXR5QWRkZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CEBTdWJJZGVudGl0aWVzU2V0AAAMEG1haW4AOG51bWJlcl9vZl9zdWJzBCxuZXdfZGVwb3NpdAhIU3ViSWRlbnRpdHlSZW5hbWVkAAAIDHN1YgAQbWFpbgBIU3ViSWRlbnRpdHlSZW1vdmVkAAAMDHN1YgAQbWFpbgAcZGVwb3NpdAhIU3ViSWRlbnRpdHlSZXZva2VkAAAMDHN1YgAQbWFpbgAcZGVwb3NpdAg4QXV0aG9yaXR5QWRkZWQAAAQkYXV0aG9yaXR5AEBBdXRob3JpdHlSZW1vdmVkAAAEJGF1dGhvcml0eQAsVXNlcm5hbWVTZXQAAAgMd2hvACB1c2VybmFtZSQ4VXNlcm5hbWVRdWV1ZWQAAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgRIUHJlYXBwcm92YWxFeHBpcmVkAAAEFHdob3NlAEhQcmltYXJ5VXNlcm5hbWVTZXQAAAgMd2hvACB1c2VybmFtZSRcRGFuZ2xpbmdVc2VybmFtZVJlbW92ZWQAAAgMd2hvACB1c2VybmFtZSQ8VXNlcm5hbWVVbmJvdW5kAAAEIHVzZXJuYW1lJDxVc2VybmFtZVJlbW92ZWQAAAQgdXNlcm5hbWUkOFVzZXJuYW1lS2lsbGVkAAAEIHVzZXJuYW1lJEBVc2VybmFtZVJlcG9ydGVkAAAIIHJlcG9ydGVyACB1c2VybmFtZSRMUGVyc29uYWxJZGVudGl0eVNldAAADBRhbGlhcyAcYWNjb3VudAAgdXNlcm5hbWUkREV2aWRlbmNlU3VibWl0dGVkAAAEFGFsaWFzIEhDcmVkZW50aWFsQWNjZXB0ZWQAAAQUYWxpYXMgSENyZWRlbnRpYWxSZWplY3RlZAAABBRhbGlhcyAwUGVyc29uQmFubmVkAAAEFGFsaWFzIFxQZXJzb25hbElkZW50aXR5Q2xlYXJlZAAABBRhbGlhcyBsUmVwb3J0ZWRVc2VybmFtZUp1ZGdlZFZhbGlkAAAEIHVzZXJuYW1lJHRSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkSW52YWxpZAAABCB1c2VybmFtZSSYUmVwb3J0ZWRVc2VybmFtZVdlYWtPclVuY2xlYXJKdWRnZW1lbnQAAAggdXNlcm5hbWUkJGp1ZGdlbWVudL0CBCAAAiRQUGVyc29uaG9vZFJlY29nbml6ZWQAAAgMd2hvCAxrZXkgQFBlcnNvbk9uYm9hcmRpbmcAAAgMd2hvCAxrZXkgPEFsaWFzRGlzcGF0Y2hlZAAACBRhbGlhc10BHGFjY291bnQAPEFsaWFzQWNjb3VudFNldAAACBRhbGlhc10BHGFjY291bnQAREFsaWFzQWNjb3VudFVuc2V0AAAIFGFsaWFzXQEcYWNjb3VudABQUGVyc29uYWxJZEFjY291bnRTZXQAAAgMd2hvCBxhY2NvdW50AFhQZXJzb25hbElkQWNjb3VudFVuc2V0AAAIDHdobwgcYWNjb3VudABEQ29sbGVjdGlvbkNyZWF0ZWQAAQVkRm9yY2VQZXJzb25ob29kUmVjb2duaXplZAAABBhwZW9wbGXFAgQEAAJELENhc2VDcmVhdGVkAAAEKGNhc2VfaW5kZXgEIENhbGxiYWNrAAAEGHJlc3VsdJUCNENhbGxiYWNrRXJyb3IAAQUoQ2FzZUNsb3NlZAAACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIUVm90ZWQAAAwoY2FzZV9pbmRleAQUdm90ZXIgHG9waW5pb269AixWb3RlQ2xlYW5lZAAACChjYXNlX2luZGV4BBR2b3RlciAsQ2FzZVJlbW92ZWQAAAQoY2FzZV9pbmRleAQ4Q2FzZUludGVydmVuZWQAAAgoY2FzZV9pbmRleAQcdmVyZGljdL0CMFZvdGVzQ2xhaW1lZAAACBR2b3RlciAwY2FzZV9pbmRpY2VzzQIwUmV3YXJkUGF5b3V0AAAMFHZvdGVyICxkZXN0aW5hdGlvbgAYYW1vdW50CEhQYXlvdXRSb3VuZFN0YXJ0ZWQAAAwUcm91bmQEPGluaXRpYWxfYmFsYW5jZQgwdG90YWxfcG9pbnRzCFRQYXlvdXRSb3VuZHNTY2hlZHVsZWQAAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBFRQYXlvdXRTY2hlZHVsZVJlbW92ZWQAAAQUaW5kZXgENENyZWRpdENsYWltZWQAAAgUdm90ZXIgGGFtb3VudAg0UG9pbnRzQ2xlYW5lZAAACBRyb3VuZAQUdm90ZXIgLENhc2VUb3VjaGVkAAAIKGNhc2VfaW5kZXgEHHJpcGVuZWQUUFZvdGluZ1BlbmFsdHlDbGVhcmVkAAAEDHdobyACECBEZXNpZ25lZAAABBRjb3VudAREUHJvY2VkdXJhbEFjY291bnQAAQVIUHJvY2VkdXJhbFBlcnNvbmFsAAEFKFByb2NlZHVyYWwAAAQUcmFuZ2UEACA4cmVyb2xsX3RpbWVvdXQEPGZhc3R0cmFja19jb3VudAQcbWF4aW11bQQ4ZnVsbF9hbGxvY19sZW4IQGZ1bGxfYWxsb2NfY291bnQEOGluaXRfYWxsb2NfbGVuCEBpbml0X2FsbG9jX2NvdW50BBx0aW1lb3V0BAJcQENhbmRpZGF0ZUFwcGxpZWQAAAQoYWNjb3VudF9pZABISnVkZ2VtZW50UmVxdWVzdGVkAAAEKGFjY291bnRfaWQAREp1ZGdlbWVudFByb3ZpZGVkAAAIKGFjY291bnRfaWQAJGp1ZGdlbWVudL0CMFJldHJ5R3JhbnRlZAAACChhY2NvdW50X2lkACBmYWlsdXJlcwRAUGVyc29uUmVnaXN0ZXJlZAAACChhY2NvdW50X2lkACxwZXJzb25hbF9pZAhEQ2FuZGlkYXRlUmVmZXJyZWQAAAggcmVmZXJyZXIIIHJlZmVycmVkACBSZXJvbGxlZAAABChhY2NvdW50X2lkADxEZXNpZ25Db21taXR0ZWQAAAgoYWNjb3VudF9pZAAscmVzZXJ2ZWRfaWQIOEZ1bGx5QWxsb2NhdGVkAAAEKGFjY291bnRfaWQAIFRpbWVkT3V0AAAEKGFjY291bnRfaWQAJEZsYWtlZE91dAAABChhY2NvdW50X2lkADhUaWNrZXRSZWZlcnJlZAAACCByZWZlcnJlcggYdGlja2V0ADxUaWNrZXRDYW5jZWxsZWQAAAggcmVmZXJyZXIIGHRpY2tldAA0VGlja2V0QXBwbGllZAAACChhY2NvdW50X2lkACByZWZlcnJlcggsRmFtaWx5QWRkZWQAAAwUaW5kZXgEEGtpbmTVAghpZCBEQWxsSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgBIU29tZUludml0ZXNSZW1vdmVkAAAEHGludml0ZXIAXEludml0ZWRDYW5kaWRhdGVBcHBsaWVkAAAIDHdobwAcaW52aXRlcgBkUmVmZXJyYWxWb3VjaGVyUmVnaXN0ZXJlZAAABCByZWZlcnJlcgg4SW52aXRlc0dyYW50ZWQAAAgcYWNjb3VudAAUY291bnQEPEludml0ZVRpY2tldFNldAAACBxpbnZpdGVyABh0aWNrZXQAVEludml0ZVRpY2tldENhbmNlbGxlZAAACBxpbnZpdGVyABh0aWNrZXQAQENvbmZpZ3VyYXRpb25TZXQAAAQYY29uZmln2QICCBxBY2NvdW50AQAYUGVyc29uASACOBxOZXdHYW1lAAAMRHJlZ2lzdHJhdGlvbl9lbmRzBCRnYW1lX2RhdGUELHJlcG9ydF9lbmRzBCRHYW1lRW5kZWQAAAQUaW5kZXgEIFNpZ25lZFVwAAAEDHdob+ECPFJlcG9ydFN1Ym1pdHRlZAAACAx3aG/hAihnYW1lX2luZGV4BChPZmZib2FyZGVkAAAEDHdob+ECJEtpY2tlZE91dAAABBhwbGF5ZXLhAjhJbnZpdGVzR3JhbnRlZAAACBxhY2NvdW50ABRjb3VudAQ8SW52aXRlVGlja2V0U2V0AAAEHGludml0ZXIAVEludml0ZVRpY2tldENhbmNlbGxlZAAABBxpbnZpdGVyADhHYW1lc1NjaGVkdWxlZAAABBRjb3VudARQU2NoZWR1bGVkR2FtZVJlbW92ZWQAAAQ4Z2FtZV9wbGF5X3RpbWUEQFN0bXRVc2FnZVJlbW92ZWQAAAQMd2hvIERBbGxJbnZpdGVzUmVtb3ZlZAAABBxpbnZpdGVyAEhTb21lSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgACHDRDcmVkaXRDbGFpbWVkAAAMDHdob+ECLGRlc3RpbmF0aW9uABhhbW91bnQIUFBlcnNvbmhvb2RSZWNvZ25pemVkAAAIDHdob+ECHHJlc3VtZWQUVFBheW91dFJvdW5kc1NjaGVkdWxlZAAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BERSb3VuZFRyYW5zaXRpb25lZAAABCxyb3VuZF9pbmRleARMUGF5b3V0Um91bmRPcGVyYXRlZAAABCxyb3VuZF9pbmRleAQkQ2FzaGVkT3V0AAAEDHdob+ECAiAsSWRzUmVzZXJ2ZWQAAAQUY291bnQEJElkUmVuZXdlZAAABAhpZAgwSWRVbnJlc2VydmVkAAAECGlkCEBQZW9wbGVSZWdpc3RlcmVkAAAEFGNvdW50BDxQZW9wbGVTdXNwZW5kZWQAAAQUY291bnQERFBlcnNvbmhvb2RSZXN1bWVkAAAECGlkCEhTdXNwZW5zaW9uc1N0YXJ0ZWQAAQVAU3VzcGVuc2lvbnNFbmRlZAABBQIQeEFsbEF0dGVzdGF0aW9uQWxsb3dhbmNlQ2xlYXJlZAAABCB2ZXJpZmllcgB0QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQAAAgcYWNjb3VudAAUY291bnQEOFBlcnNvbkF0dGVzdGVkAAAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIASENvbnN1bWVyUmVnaXN0ZXJlZAAABBxhY2NvdW50AAIgQFBlcnNvblJlZ2lzdGVyZWQAAAgUYWxpYXMgHGFjY291bnQAUExpdGVQZXJzb25SZWdpc3RlcmVkAAAEHGFjY291bnQAaFBlcnNvbkF1dGhvcml6YXRpb25Ub3VjaGVkAAAEHGFjY291bnQAhEV4cGlyZWRVc2VybmFtZVJlc2VydmF0aW9uUmVtb3ZlZAAACCB1c2VybmFtZSQcYWNjb3VudABQSWRlbnRpZmllcktleVVwZGF0ZWQAAAQcYWNjb3VudAB4VXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uU2V0AAAEIGR1cmF0aW9uCFBTdG10U3RvcmVTbG90VXBkYXRlZAAACBxhY2NvdW50ACxzbG90X251bWJlcgQ0UGVyc29uRGVtb3RlZAAABBxhY2NvdW50AAIMEFIyZTkAAQUUUjJlMTAAAQUUUjJlMTQAAQUCCGhDaHVua1BhZ2VIYXNoZXNJbml0aWFsaXplZAAACDRyaW5nX2V4cG9uZW50+QIsdG90YWxfcGFnZXMELENodW5rc0FkZGVkAAAMNHJpbmdfZXhwb25lbnT5AixzdGFydF9pbmRleAQUY291bnQEAiAsTWVtYmVyQWRkZWQAAAQMa2V5IDRNZW1iZXJSZW1vdmVkAAAEDGtleSBsQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uAAAEKGlkZW50aWZpZXIgRENvbGxlY3Rpb25EZWxldGVkAAAEKGlkZW50aWZpZXIgJFJpbmdCdWlsdAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BEBNZW1iZXJzT25ib2FyZGVkAAAEKGlkZW50aWZpZXIgLFJpbmdzTWVyZ2VkAAAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgERE9uYm9hcmRpbmdTaXplU2V0AAAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQCCBhOYXRpdmUAAQUYU3RhYmxlAAEFAlgkQ29pblNwbGl0AAAEMG91dHB1dF9jb3VudAQ8Q29pblRyYW5zZmVycmVkAAAMCHRvABR2YWx1ZQQcbmV3X2FnZQRYUmVjeWNsZXJMb2FkZWRXaXRoQ29pbgAABBR2YWx1ZQR8UmVjeWNsZXJMb2FkZWRXaXRoRXh0ZXJuYWxBc3NldAAADAx3aG8AFHZhbHVlBBhhbW91bnQIYFJlY3ljbGVyVW5sb2FkZWRJbnRvQ29pbgAAEAh0bwAsaW5wdXRfdmFsdWUEMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEhFJlY3ljbGVyVW5sb2FkZWRJbnRvRXh0ZXJuYWxBc3NldAAAEAh0bwAUdmFsdWUELGlucHV0X2NvdW50BBhhbW91bnQIhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbgAACAxmZWUIJGRlc3Ryb3llZAiMUGFpZFVubG9hZFRva2VuUmVnaXN0ZXJlZFdpdGhOYXRpdmUAAAgMd2hvAAxmZWUIjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoU3RhYmxlAAAIDHdobwAMZmVlCHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEhExpdGVQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEZFJlY3ljbGVyc1VubG9hZGVkSW50b0NvaW4AAAwIdG8AMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMAABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5BQNkUmVjeWNsZXJVbmxvYWRlZEludG9Db2lucwAABDBvdXRwdXRfY291bnQEfENvaW5PZmZib2FyZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8AFHZhbHVlBBhhbW91bnQIPFJlY3ljbGVyQ2xlYW5lZAAADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CGRDb25zdW1lZEZyZWVUb2tlbnNDbGVhbmVkAAAEGHBlcmlvZARoUGFpZFVubG9hZFRva2VuUmluZ0NsZWFuZWQAAAgYcGVyaW9kBChyaW5nX2luZGV4BExSZWN5Y2xlckR1c3RDbGVhbmVkAAEFaFBhaWRVbmxvYWRUb2tlbkR1c3RDbGVhbmVkAAEFnEV4cGlyZWRQYWlkVW5sb2FkVG9rZW5Db2xsZWN0aW9uRGVsZXRlZAAABBhwZXJpb2QEAkAwQXNzZXRDcmVhdGVkAAEFUFhjbUZ1bmRzVHJhbnNmZXJTZW50AAEFYFhjbUZ1bmRzVHJhbnNmZXJUaW1lZE91dAABBTRGdW5kc1ZlcmlmaWVkAAEFKFBvdHNGdW5kZWQAAQVcTW9iUnVsZVBheW91dHNTY2hlZHVsZWQAAQVUU2NvcmVQYXlvdXRzU2NoZWR1bGVkAAEFdE9uUG9sbEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAEFZE1pZ3JhdGlvblBlb3BsZVJlY29nbml6ZWQAAQVoTWlncmF0aW9uT25ib2FyZGluZ1NpemVTZXQAAQV4TWlncmF0aW9uUHJvb2ZPZklua0luaXRpYWxpemVkAAEFXE1pZ3JhdGlvbkdhbWVzU2NoZWR1bGVkAAEFXE1pZ3JhdGlvbkludml0ZXNHcmFudGVkAAEFfE1pZ3JhdGlvblJlaW1idXJzZW1lbnRWYWx1ZXNTZXQAAQWETWlncmF0aW9uQXR0ZXN0YXRpb25BbGxvd2FuY2VzU2V0AAEFSE1pZ3JhdGlvbkNvbXBsZXRlZAABBQIEXEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAEFAgQgUHJpemVTZXQAAAwgYXNzZXRfaWRRATBhc3NldF9hbW91bnQIHHdpbm5lcnMEAjRUUGFydGljaXBhbnRSZWdpc3RlcmVkAAAMIGV2ZW50X2lkBDhwYXJ0aWNpcGFudF9pZAQUYWxpYXMgMEV2ZW50U3RhcnRlZAAACAhpZAQUZXZlbnQVAzBFdmVudFNraXBwZWQAAAgIaWQEFGV2ZW50FQM4RXZlbnRTY2hlZHVsZWQAAAQgZXZlbnRfaWQEVFNjaGVkdWxlZEV2ZW50UmVtb3ZlZAAABCBldmVudF9pZARoRmFpbGVkVHJhbnNmZXJQcml6ZUNsYWltZWQAAAgMd2hvACBldmVudF9pZARgV2FpdGluZ0ZvckVudHJvcHlUb0J1aWxkAAAEIGV2ZW50X2lkBDhEcmF3aW5nV2lubmVycwAABCBldmVudF9pZAQwRGlzdHJpYnV0aW5nAAAEIGV2ZW50X2lkBEBQcml6ZURpc3RyaWJ1dGVkAAAQIGV2ZW50X2lkBBBkZXN0ACBhc3NldF9pZFEBMGFzc2V0X2Ftb3VudAhcUHJpemVEaXN0cmlidXRpb25GYWlsZWQAABAgZXZlbnRfaWQEEGRlc3QAIGFzc2V0X2lkUQEwYXNzZXRfYW1vdW50CDxDbGVhcmluZ1N0b3JhZ2UAAAQgZXZlbnRfaWQEOEV2ZW50Q29tcGxldGVkAAAEIGV2ZW50X2lkBAYkAiA4VXBncmFkZVN0YXJ0ZWQAAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAABBTRVcGdyYWRlRmFpbGVkAAEFQE1pZ3JhdGlvblNraXBwZWQAAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAAAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQAAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAAACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAAAELG5leHRfY3Vyc29yHQMCkBhTeXN0ZW0B2DxQYXJhY2hhaW5TeXN0ZW0B4CBCYWxhbmNlcwENAUhUcmFuc2FjdGlvblBheW1lbnQBEQFIU2tpcEZlZWxlc3NQYXltZW50AZUBRE9yaWdpblJlc3RyaWN0aW9uAZ0BGEFzc2V0cwGpATBBc3NldHNIb2xkZXIBrQEkQXNzZXRSYXRlAbEBOEFzc2V0VHhQYXltZW50AbkBRENvbGxhdG9yU2VsZWN0aW9uAcEBHFNlc3Npb24BxQEkWGNtcFF1ZXVlAckBLFBvbGthZG90WGNtAX0CKEN1bXVsdXNYY20BgQIwTWVzc2FnZVF1ZXVlAY0CHFV0aWxpdHkBmQIgTXVsdGlzaWcBoQIQU3VkbwGpAhRQcm94eQG1AiBJZGVudGl0eQHBAhhQZW9wbGUByQIcTW9iUnVsZQHRAihQcm9vZk9mSW5rAd0CEEdhbWUB5QIUU2NvcmUB6QIgRHVtbXlEaW0B7QIoUGVvcGxlTGl0ZQHxAiRSZXNvdXJjZXMB9QI0Q2h1bmtzTWFuYWdlcgH9AhxNZW1iZXJzAQEDHENvaW5hZ2UBCQNUU3RvcmFnZUluaXRpYWxpemF0aW9uAQ0DZFN0b3JhZ2VJbml0aWFsaXphdGlvbkxpdGUBEQMcQWlyZHJvcAEZA1BNdWx0aUJsb2NrTWlncmF0aW9ucwEhAwAMFHBoYXNlNBRldmVudCUDGHRvcGljc8UCBCkDAAQEAQgEMQMAAQEACDBzcGVjX3ZlcnNpb24EJHNwZWNfbmFtZTkDAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAAQOGJhc2VfZXh0cmluc2ljGDRtYXhfZXh0cmluc2ljDQIkbWF4X3RvdGFsDQIgcmVzZXJ2ZWQNAgAMGG5vcm1hbEUDLG9wZXJhdGlvbmFsRQMkbWFuZGF0b3J5RQMADChiYXNlX2Jsb2NrGCRtYXhfYmxvY2sYJHBlcl9jbGFzc0kDAAwYbm9ybWFsBCxvcGVyYXRpb25hbAQkbWFuZGF0b3J5BAAIEHJlYWQIFHdyaXRlCAMI2QEEBFkDAAAgJHNwZWNfbmFtZTkDJGltcGxfbmFtZTkDRGF1dGhvcmluZ192ZXJzaW9uBDBzcGVjX3ZlcnNpb24EMGltcGxfdmVyc2lvbgQQYXBpc10DTHRyYW5zYWN0aW9uX3ZlcnNpb24EOHN5c3RlbV92ZXJzaW9uBAQkAQgEZQMABCQAAAgkbXNnX2NvdW50BCx0b3RhbF9ieXRlcwQDCARxAwR1AwAADDR1bXBfbXNnX2NvdW50BDx1bXBfdG90YWxfYnl0ZXMENGhybXBfb3V0Z29pbmd5AwIIFEFib3J0AAEFHEdvQWhlYWQAAQUGgQMADDh1c2VkX2JhbmR3aWR0aH0DOHBhcmFfaGVhZF9oYXNo3GBjb25zdW1lZF9nb19haGVhZF9zaWduYWyFAwSJAwAGBAAMOHVzZWRfYmFuZHdpZHRofQM4aHJtcF93YXRlcm1hcmuRA2Bjb25zdW1lZF9nb19haGVhZF9zaWduYWyFAwAQLHBhcmVudF9oZWFkJExyZWxheV9wYXJlbnRfbnVtYmVyBGRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290IDBtYXhfcG92X3NpemUEAgQcUHJlc2VudAABBQadAwAIPHJlbWFpbmluZ19jb3VudAQ4cmVtYWluaW5nX3NpemUEABgwbWF4X2NhcGFjaXR5BDhtYXhfdG90YWxfc2l6ZQRAbWF4X21lc3NhZ2Vfc2l6ZQQkbXNnX2NvdW50BCh0b3RhbF9zaXplBCBtcWNfaGVhZNwDCASpAwStAwAAEDBkbXFfbXFjX2hlYWQgnHJlbGF5X2Rpc3BhdGNoX3F1ZXVlX3JlbWFpbmluZ19jYXBhY2l0eaUDQGluZ3Jlc3NfY2hhbm5lbHOxAzxlZ3Jlc3NfY2hhbm5lbHOxAwAITG1heF9jYW5kaWRhdGVfZGVwdGgEUGFsbG93ZWRfYW5jZXN0cnlfbGVuBAAoNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXO5AwMIBCAEwQMAAAgcc2VudF9hdAQscmV2ZXJzZV9pZHgEAAgkcmVjaXBpZW50BBBkYXRhJATNAwAAFCxwYXJlbnRfaGFzaCAYbnVtYmVyBChzdGF0ZV9yb290IDxleHRyaW5zaWNzX3Jvb3QgGGRpZ2VzdDAE1QMAABA8dmFsaWRhdGlvbl9kYXRhmQNEcmVsYXlfY2hhaW5fc3RhdGVtA2ByZWxheV9wYXJlbnRfZGVzY2VuZGFudHPZA0Bjb2xsYXRvcl9wZWVyX2lkHQMACBxzZW50X2F0BAxtc2ckBOEDAAAIHHNlbnRfYXQEIG1zZ19oYXNoIATpAwAACDRmdWxsX21lc3NhZ2Vz5QM8aGFzaGVkX21lc3NhZ2Vz7QMACBxzZW50X2F0BBBkYXRhJAMIBPUDBPkDAAMIBOkDBAEEAAAINGZ1bGxfbWVzc2FnZXP9AzxoYXNoZWRfbWVzc2FnZXMFBAAIRGRvd253YXJkX21lc3NhZ2Vz8QNMaG9yaXpvbnRhbF9tZXNzYWdlcwkEAgwMRmVlAAEFEE1pc2MAAQUMQWxsAAEFAAwIaWTZARhhbW91bnQIHHJlYXNvbnMRBAQVBAAACAhpZNkBGGFtb3VudAgEHQQAAAgIaWQFARhhbW91bnQIBCUEAAAEGGFtb3VudAgELQQAAhQISWQBABRJbmRleAGRAgxSYXcBJCRBZGRyZXNzMzIBICRBZGRyZXNzMjABIQECCCBJbmNyZWFzZQABBSBEZWNyZWFzZQABBQIIJFYxQW5jaWVudAABBQhWMgABBQAIEHVzZWQIIGF0X2Jsb2NrBAIMEExpdmUAAQUYRnJvemVuAAEFKERlc3Ryb3lpbmcAAQUAMBRvd25lcgAYaXNzdWVyABRhZG1pbgAcZnJlZXplcgAYc3VwcGx5CBxkZXBvc2l0CCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQgYWNjb3VudHMELHN1ZmZpY2llbnRzBCRhcHByb3ZhbHMEGHN0YXR1c0UEAwhRAQACDBhMaXF1aWQAAQUYRnJvemVuAAEFHEJsb2NrZWQAAQUCFCBDb25zdW1lcgABBShTdWZmaWNpZW50AAEFLERlcG9zaXRIZWxkAQg8RGVwb3NpdFJlZnVuZGVkAAEFLERlcG9zaXRGcm9tAAMIAAgADBxiYWxhbmNlCBhzdGF0dXNRBBhyZWFzb25VBAMMUQEAAAAIGGFtb3VudAgcZGVwb3NpdAgAFBxkZXBvc2l0CBBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UBkkEBmUEAAgMd2hvABxkZXBvc2l0CARxBAADCAAgBHkEAAMIKCQDCAgEAggIT2sAAQUkU3VzcGVuZGVkAAEFABQkcmVjaXBpZW50BBRzdGF0ZYkENHNpZ25hbHNfZXhpc3QULGZpcnN0X2luZGV4BChsYXN0X2luZGV4BASNBAADCAQEAAxEc3VzcGVuZF90aHJlc2hvbGQEOGRyb3BfdGhyZXNob2xkBEByZXN1bWVfdGhyZXNob2xkBAZ1AgUBCAahBAKgIE92ZXJmbG93AAEFNFVuaW1wbGVtZW50ZWQAAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAQUwTG9jYXRpb25GdWxsAAEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQABBSRCYWRPcmlnaW4AAQU8SW52YWxpZExvY2F0aW9uAAEFNEFzc2V0Tm90Rm91bmQAAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAEFPE5vdFdpdGhkcmF3YWJsZQABBUhMb2NhdGlvbkNhbm5vdEhvbGQAAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAAEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQUwVW5rbm93bkNsYWltAAEFOEZhaWxlZFRvRGVjb2RlAAEFQE1heFdlaWdodEludmFsaWQAAQU4Tm90SG9sZGluZ0ZlZXMAAQUwVG9vRXhwZW5zaXZlAAEFEFRyYXABCEBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQMIBKkEBq0EAhgQTnVsbAABBRhBc3NldHMBZQI8RXhlY3V0aW9uUmVzdWx0AbEEHFZlcnNpb24BBCxQYWxsZXRzSW5mbwH9AThEaXNwYXRjaFJlc3VsdAEBAgIYEE51bGwAAQUYQXNzZXRzAW0CPEV4ZWN1dGlvblJlc3VsdAGxBBxWZXJzaW9uAQQsUGFsbGV0c0luZm8B/QE4RGlzcGF0Y2hSZXN1bHQBAQICDAhWMwG1BAhWNAG5BAhWNQEFAgIMHFBlbmRpbmcAABAkcmVzcG9uZGVydQJMbWF5YmVfbWF0Y2hfcXVlcmllcp0EMG1heWJlX25vdGlmeaUEHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgAACBhvcmlnaW51AiRpc19hY3RpdmUUFFJlYWR5AAAIIHJlc3BvbnNlvQQIYXQEAwgEdQIDDAgYBAMIdQIEBM0EAAIQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAEFXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEFUE5vdGlmeUN1cnJlbnRUYXJnZXRzAR0DaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAEFAgwIVjMBXQIIVjQBWQIIVjUBUQEDDAQA2QQDCJECCAThBAAAEBhhbW91bnQIFG93bmVydQIYbG9ja2VydQIkY29uc3VtZXJz5QQDCAh1AgTtBAAACCBsb2NhdGlvbnUCGGV4cGlyeXkCBPUEAAAEIGFsaWFzZXJz+QQGWQIADCxkZXN0aW5hdGlvblkCIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIQDEFsbAABBRRBbGxPZgAACAhpZF0CDGZ1bhUCKEFsbENvdW50ZWQBBDBBbGxPZkNvdW50ZWQAAAwIaWRdAgxmdW4VAhRjb3VudAQCCCBEZWZpbml0ZQFlAhBXaWxkAQkFAsA0V2l0aGRyYXdBc3NldAFlAlRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBZQJYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAFlAjRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZbUEKG1heF93ZWlnaHQYHHF1ZXJpZXIBBTRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c2UCLGJlbmVmaWNpYXJ5WQJQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRzZQIQZGVzdFkCDHhjbRUFIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kCQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAAADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAAABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwAADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgABBTREZXNjZW5kT3JpZ2luAVUCLFJlcG9ydEVycm9yAQUFMERlcG9zaXRBc3NldAAACBhhc3NldHMNBSxiZW5lZmljaWFyeVkCTERlcG9zaXRSZXNlcnZlQXNzZXQAAAwYYXNzZXRzDQUQZGVzdFkCDHhjbRUFNEV4Y2hhbmdlQXNzZXQAAAwQZ2l2ZQ0FEHdhbnRlAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwAADBhhc3NldHMNBRxyZXNlcnZlWQIMeGNtFQVASW5pdGlhdGVUZWxlcG9ydAAADBhhc3NldHMNBRBkZXN0WQIMeGNtFQU0UmVwb3J0SG9sZGluZwAACDRyZXNwb25zZV9pbmZvBQUYYXNzZXRzDQUwQnV5RXhlY3V0aW9uAAAIEGZlZXNhAjB3ZWlnaHRfbGltaXQhAjRSZWZ1bmRTdXJwbHVzAAEFPFNldEVycm9ySGFuZGxlcgEVBSxTZXRBcHBlbmRpeAEVBShDbGVhckVycm9yAAEFKENsYWltQXNzZXQAAAgYYXNzZXRzZQIYdGlja2V0WQIQVHJhcAEIQFN1YnNjcmliZVZlcnNpb24AAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgABBSRCdXJuQXNzZXQBZQIsRXhwZWN0QXNzZXQBZQIwRXhwZWN0T3JpZ2luAQEFLEV4cGVjdEVycm9yAbEEUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQECLFF1ZXJ5UGFsbGV0AAAILG1vZHVsZV9uYW1lJDRyZXNwb25zZV9pbmZvBQUwRXhwZWN0UGFsbGV0AAAUFGluZGV4BBBuYW1lJCxtb2R1bGVfbmFtZSQsY3JhdGVfbWFqb3IEPG1pbl9jcmF0ZV9taW5vcgRQUmVwb3J0VHJhbnNhY3RTdGF0dXMBBQVMQ2xlYXJUcmFuc2FjdFN0YXR1cwABBTxVbml2ZXJzYWxPcmlnaW4BUQI0RXhwb3J0TWVzc2FnZQAADBxuZXR3b3JrSQIsZGVzdGluYXRpb25VAgx4Y20VBSRMb2NrQXNzZXQAAAgUYXNzZXRhAiB1bmxvY2tlclkCLFVubG9ja0Fzc2V0AAAIFGFzc2V0YQIYdGFyZ2V0WQI4Tm90ZVVubG9ja2FibGUAAAgUYXNzZXRhAhRvd25lclkCNFJlcXVlc3RVbmxvY2sAAAgUYXNzZXRhAhhsb2NrZXJZAixTZXRGZWVzTW9kZQAABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljASAoQ2xlYXJUb3BpYwABBSxBbGlhc09yaWdpbgFZAjxVbnBhaWRFeGVjdXRpb24AAAgwd2VpZ2h0X2xpbWl0IQIwY2hlY2tfb3JpZ2luAQUEEQUAAhAMQWxsAAEFFEFsbE9mAAAICGlkWQIMZnVuFQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZFkCDGZ1bhUCFGNvdW50BAIIIERlZmluaXRlAW0CEFdpbGQBGQUCwDRXaXRoZHJhd0Fzc2V0AW0CVFJlc2VydmVBc3NldERlcG9zaXRlZAFtAlhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AW0CNFF1ZXJ5UmVzcG9uc2UAABAgcXVlcnlfaWQIIHJlc3BvbnNluQQobWF4X3dlaWdodBgccXVlcmllcgEFNFRyYW5zZmVyQXNzZXQAAAgYYXNzZXRzbQIsYmVuZWZpY2lhcnlZAlBUcmFuc2ZlclJlc2VydmVBc3NldAAADBhhc3NldHNtAhBkZXN0WQIMeGNtJQUgVHJhbnNhY3QAAAwsb3JpZ2luX2tpbmQJAlhyZXF1aXJlX3dlaWdodF9hdF9tb3N0GBBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BVQIsUmVwb3J0RXJyb3IBBQUwRGVwb3NpdEFzc2V0AAAIGGFzc2V0cx0FLGJlbmVmaWNpYXJ5WQJMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHMdBRBkZXN0WQIMeGNtJQU0RXhjaGFuZ2VBc3NldAAADBBnaXZlHQUQd2FudG0CHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0cx0FHHJlc2VydmVZAgx4Y20lBUBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0cx0FEGRlc3RZAgx4Y20lBTRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8FBRhhc3NldHMdBTBCdXlFeGVjdXRpb24AAAgQZmVlc2kCMHdlaWdodF9saW1pdCECNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyASUFLFNldEFwcGVuZGl4ASUFKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHNtAhh0aWNrZXRZAhBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAFtAixFeHBlY3RBc3NldAFtAjBFeHBlY3RPcmlnaW4BAQUsRXhwZWN0RXJyb3IBsQRQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8FBTBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEFBUxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgFRAjRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmtJAixkZXN0aW5hdGlvblUCDHhjbSUFJExvY2tBc3NldAAACBRhc3NldGkCIHVubG9ja2VyWQIsVW5sb2NrQXNzZXQAAAgUYXNzZXRpAhh0YXJnZXRZAjhOb3RlVW5sb2NrYWJsZQAACBRhc3NldGkCFG93bmVyWQI0UmVxdWVzdFVubG9jawAACBRhc3NldGkCGGxvY2tlclkCLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAVkCPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQhAjBjaGVja19vcmlnaW4BBQQhBQACDAhWMwEVBQhWNAElBQhWNQFBAgIQIFRlbGVwb3J0AAEFMExvY2FsUmVzZXJ2ZQABBUhEZXN0aW5hdGlvblJlc2VydmUAAQU0UmVtb3RlUmVzZXJ2ZQF1AgAIEHByZXaFAhBuZXh0hQIGMQUAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3VyczUFNG1lc3NhZ2VfY291bnQIEHNpemUIAwiFAgQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkAiwYcmVtYXJrAAAEGHJlbWFyayQ4c2V0X2hlYXBfcGFnZXMAAAQUcGFnZXMIIHNldF9jb2RlAAAEEGNvZGUkXHNldF9jb2RlX3dpdGhvdXRfY2hlY2tzAAAEEGNvZGUkLHNldF9zdG9yYWdlAAAEFGl0ZW1zaQMwa2lsbF9zdG9yYWdlAAAEEGtleXNtAyxraWxsX3ByZWZpeAAACBhwcmVmaXgkHHN1YmtleXMERHJlbWFya193aXRoX2V2ZW50AAAEGHJlbWFyayREYXV0aG9yaXplX3VwZ3JhZGUAAAQkY29kZV9oYXNoIIBhdXRob3JpemVfdXBncmFkZV93aXRob3V0X2NoZWNrcwAABCRjb2RlX2hhc2ggYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQAABBBjb2RlJAIITHNldF92YWxpZGF0aW9uX2RhdGEAAAgQZGF0Yd0DVGluYm91bmRfbWVzc2FnZXNfZGF0YQ0EYHN1ZG9fc2VuZF91cHdhcmRfbWVzc2FnZQAABBxtZXNzYWdlJAIEDHNldAAABAxub3cIAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgAAAgQZGVzdDUEFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgAADBhzb3VyY2U1BBBkZXN0NQQUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAgQZGVzdDUEFHZhbHVlCDB0cmFuc2Zlcl9hbGwAAAgQZGVzdDUEKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQAACAx3aG81BBhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMAAAQMd2hvvQFEZm9yY2Vfc2V0X2JhbGFuY2UAAAgMd2hvNQQgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQAACCRkaXJlY3Rpb245BBRkZWx0YQgQYnVybgAACBR2YWx1ZQgoa2VlcF9hbGl2ZRQCBCxjbGVhbl91c2FnZQAABBhlbnRpdHmZAQKIGGNyZWF0ZQAADAhpZFEBFGFkbWluNQQsbWluX2JhbGFuY2UIMGZvcmNlX2NyZWF0ZQAAEAhpZFEBFG93bmVyNQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UINHN0YXJ0X2Rlc3Ryb3kAAAQIaWRRAUBkZXN0cm95X2FjY291bnRzAAAECGlkUQFEZGVzdHJveV9hcHByb3ZhbHMAAAQIaWRRAThmaW5pc2hfZGVzdHJveQAABAhpZFEBEG1pbnQAAAwIaWRRASxiZW5lZmljaWFyeTUEGGFtb3VudAgQYnVybgAADAhpZFEBDHdobzUEGGFtb3VudAggdHJhbnNmZXIAAAwIaWRRARh0YXJnZXQ1BBhhbW91bnQITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAwIaWRRARh0YXJnZXQ1BBhhbW91bnQIOGZvcmNlX3RyYW5zZmVyAAAQCGlkUQEYc291cmNlNQQQZGVzdDUEGGFtb3VudAgYZnJlZXplAAAICGlkUQEMd2hvNQQQdGhhdwAACAhpZFEBDHdobzUEMGZyZWV6ZV9hc3NldAAABAhpZFEBKHRoYXdfYXNzZXQAAAQIaWRRAUh0cmFuc2Zlcl9vd25lcnNoaXAAAAgIaWRRARRvd25lcjUEIHNldF90ZWFtAAAQCGlkUQEYaXNzdWVyNQQUYWRtaW41BBxmcmVlemVyNQQwc2V0X21ldGFkYXRhAAAQCGlkUQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQ4Y2xlYXJfbWV0YWRhdGEAAAQIaWRRAUhmb3JjZV9zZXRfbWV0YWRhdGEAABQIaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UUGZvcmNlX2NsZWFyX21ldGFkYXRhAAAECGlkUQFIZm9yY2VfYXNzZXRfc3RhdHVzAAAgCGlkUQEUb3duZXI1BBhpc3N1ZXI1BBRhZG1pbjUEHGZyZWV6ZXI1BCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQkaXNfZnJvemVuFEBhcHByb3ZlX3RyYW5zZmVyAAAMCGlkUQEgZGVsZWdhdGU1BBhhbW91bnQIPGNhbmNlbF9hcHByb3ZhbAAACAhpZFEBIGRlbGVnYXRlNQRUZm9yY2VfY2FuY2VsX2FwcHJvdmFsAAAMCGlkUQEUb3duZXI1BCBkZWxlZ2F0ZTUERHRyYW5zZmVyX2FwcHJvdmVkAAAQCGlkUQEUb3duZXI1BCxkZXN0aW5hdGlvbjUEGGFtb3VudAgUdG91Y2gAAAQIaWRRARhyZWZ1bmQAAAgIaWRRAShhbGxvd19idXJuFDxzZXRfbWluX2JhbGFuY2UAAAgIaWRRASxtaW5fYmFsYW5jZQgsdG91Y2hfb3RoZXIAAAgIaWRRAQx3aG81BDByZWZ1bmRfb3RoZXIAAAgIaWRRAQx3aG81BBRibG9jawAACAhpZFEBDHdobzUEMHRyYW5zZmVyX2FsbAAADAhpZFEBEGRlc3Q1BChrZWVwX2FsaXZlFDBzZXRfcmVzZXJ2ZXMAAAgIaWRRASByZXNlcnZlc6UBAgwYY3JlYXRlAAAIKGFzc2V0X2tpbmRRARByYXRlCBh1cGRhdGUAAAgoYXNzZXRfa2luZFEBEHJhdGUIGHJlbW92ZQAABChhc3NldF9raW5kUQECJERzZXRfaW52dWxuZXJhYmxlcwAABAxuZXe9AVhzZXRfZGVzaXJlZF9jYW5kaWRhdGVzAAAEDG1heARIc2V0X2NhbmRpZGFjeV9ib25kAAAEEGJvbmQIVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQABBTBsZWF2ZV9pbnRlbnQAAQVAYWRkX2ludnVsbmVyYWJsZQAABAx3aG8ATHJlbW92ZV9pbnZ1bG5lcmFibGUAAAQMd2hvACx1cGRhdGVfYm9uZAAABCxuZXdfZGVwb3NpdAhMdGFrZV9jYW5kaWRhdGVfc2xvdAAACBxkZXBvc2l0CBh0YXJnZXQAAgggc2V0X2tleXMAAAgQa2V5cyAUcHJvb2YkKHB1cmdlX2tleXMAAQUCFFRzdXNwZW5kX3hjbV9leGVjdXRpb24AAQVQcmVzdW1lX3hjbV9leGVjdXRpb24AAQVgdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkAAAEDG5ldwRUdXBkYXRlX2Ryb3BfdGhyZXNob2xkAAAEDG5ldwRcdXBkYXRlX3Jlc3VtZV90aHJlc2hvbGQAAAQMbmV3BAJEEHNlbmQAAAgQZGVzdHUCHG1lc3NhZ2UpBTx0ZWxlcG9ydF9hc3NldHMAABAQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAAAQEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAAAIHG1lc3NhZ2UpBShtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgAACCBsb2NhdGlvblEBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24AAAREbWF5YmVfeGNtX3ZlcnNpb26RA3hmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkAAAQgbG9jYXRpb251AoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQAABCBsb2NhdGlvbnUCfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMAABQQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdCECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAAAUEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQhAkBmb3JjZV9zdXNwZW5zaW9uAAAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAAAUEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQhAjBjbGFpbV9hc3NldHMAAAgYYXNzZXRzcQIsYmVuZWZpY2lhcnl1Aox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgAAHBBkZXN0dQIYYXNzZXRzcQJQYXNzZXRzX3RyYW5zZmVyX3R5cGUtBThyZW1vdGVfZmVlc19pZNkESGZlZXNfdHJhbnNmZXJfdHlwZS0FSGN1c3RvbV94Y21fb25fZGVzdCkFMHdlaWdodF9saW1pdCECUGFkZF9hdXRob3JpemVkX2FsaWFzAAAIHGFsaWFzZXJ1AhxleHBpcmVzeQJccmVtb3ZlX2F1dGhvcml6ZWRfYWxpYXMAAAQcYWxpYXNlcnUCdHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzAAEFAggkcmVhcF9wYWdlAAAIOG1lc3NhZ2Vfb3JpZ2luhQIocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AAAQOG1lc3NhZ2Vfb3JpZ2luhQIQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCIBRiYXRjaAAABBRjYWxsc80GNGFzX2Rlcml2YXRpdmUAAAgUaW5kZXgEEGNhbGzJBiRiYXRjaF9hbGwAAAQUY2FsbHPNBixkaXNwYXRjaF9hcwAACCRhc19vcmlnaW6RARBjYWxsyQYsZm9yY2VfYmF0Y2gAAAQUY2FsbHPNBix3aXRoX3dlaWdodAAACBBjYWxsyQYYd2VpZ2h0GBxpZl9lbHNlAAAIEG1haW7JBiBmYWxsYmFja8kGUGRpc3BhdGNoX2FzX2ZhbGxpYmxlAAAIJGFzX29yaWdpbpEBEGNhbGzJBgadAgIUUGFzX211bHRpX3RocmVzaG9sZF8xAAAIRG90aGVyX3NpZ25hdG9yaWVzvQEQY2FsbMkGIGFzX211bHRpAAAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ATxtYXliZV90aW1lcG9pbnR5BRBjYWxsyQYobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQAAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVzvQE8bWF5YmVfdGltZXBvaW50eQUkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkAABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJHRpbWVwb2ludJ0CJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AAAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ASRjYWxsX2hhc2ggAhQQc3VkbwAABBBjYWxsyQZUc3Vkb191bmNoZWNrZWRfd2VpZ2h0AAAIEGNhbGzJBhh3ZWlnaHQYHHNldF9rZXkAAAQMbmV3NQQcc3Vkb19hcwAACAx3aG81BBBjYWxsyQYocmVtb3ZlX2tleQABBQatAgIsFHByb3h5AAAMEHJlYWw1BEBmb3JjZV9wcm94eV90eXBlhQUQY2FsbMkGJGFkZF9wcm94eQAADCBkZWxlZ2F0ZTUEKHByb3h5X3R5cGWtAhRkZWxheQQwcmVtb3ZlX3Byb3h5AAAMIGRlbGVnYXRlNQQocHJveHlfdHlwZa0CFGRlbGF5BDhyZW1vdmVfcHJveGllcwABBSxjcmVhdGVfcHVyZQAADChwcm94eV90eXBlrQIUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUAABQcc3Bhd25lcjUEKHByb3h5X3R5cGWtAhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAAAIEHJlYWw1BCRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQAAAgQcmVhbDUEJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAAACCBkZWxlZ2F0ZTUEJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAAAQIGRlbGVnYXRlNQQQcmVhbDUEQGZvcmNlX3Byb3h5X3R5cGWFBRBjYWxsyQYwcG9rZV9kZXBvc2l0AAEFBQEMBQEUBQEYBQEcBQEkBQEoBQEsBQEwBQE0BQE4BQE8BQFEBQFIBQFMBQFUBQFYBQFcBQFgBQFkBQFoBQFsBQFwBQF0BQF4BQF8ApgQTm9uZQABBRBSYXcwAZECEFJhdzEBBBBSYXcyAaEEEFJhdzMBjQUQUmF3NAEoEFJhdzUBkQUQUmF3NgGVBRBSYXc3AZkFEFJhdzgB2QEQUmF3OQGdBRRSYXcxMAGhBRRSYXcxMQGlBRRSYXcxMgGpBRRSYXcxMwGtBRRSYXcxNAGxBRRSYXcxNQG1BRRSYXcxNgHdARRSYXcxNwG5BRRSYXcxOAG9BRRSYXcxOQHBBRRSYXcyMAEhARRSYXcyMQHFBRRSYXcyMgHJBRRSYXcyMwHNBRRSYXcyNAHRBRRSYXcyNQHVBRRSYXcyNgHZBRRSYXcyNwHdBRRSYXcyOAHhBRRSYXcyOQHlBRRSYXczMAHpBRRSYXczMQHtBRRSYXczMgEgLEJsYWtlVHdvMjU2ASAYU2hhMjU2ASAkS2VjY2FrMjU2ASAsU2hhVGhyZWUyNTYBIAYhAQAoHGRpc3BsYXnxBRRsZWdhbPEFDHdlYvEFGG1hdHJpePEFFGVtYWls8QU8cGdwX2ZpbmdlcnByaW509QUUaW1hZ2XxBRx0d2l0dGVy8QUYZ2l0aHVi8QUcZGlzY29yZPEFAwgA8QUE/QUAAiAcVW5rbm93bgABBRxGZWVQYWlkAQgoUmVhc29uYWJsZQABBSRLbm93bkdvb2QAAQUkT3V0T2ZEYXRlAAEFKExvd1F1YWxpdHkAAQUkRXJyb25lb3VzAAEFIEV4dGVybmFsAAEFBQEBAQUBBQECEBxFZDI1NTE5AQkGHFNyMjU1MTkBCQYURWNkc2EBDQYMRXRoAQ0GBhEGAgwcVHdpdHRlcgAABCB1c2VybmFtZSQYR2l0aHViAAAEIHVzZXJuYW1lJBxEaXNjb3JkAAAEPGRpc3BsYXlfYW5kX3RhZyQCeDRhZGRfcmVnaXN0cmFyAAAEHGFjY291bnQ1BDBzZXRfaWRlbnRpdHkAAAQQaW5mb/kFIHNldF9zdWJzAAAEEHN1YnMBBjhjbGVhcl9pZGVudGl0eQABBURyZXF1ZXN0X2p1ZGdlbWVudAAACCRyZWdfaW5kZXgEHG1heF9mZWUIOGNhbmNlbF9yZXF1ZXN0AAAEJHJlZ19pbmRleAQcc2V0X2ZlZQAACBRpbmRleAQMZmVlCDhzZXRfYWNjb3VudF9pZAAACBRpbmRleAQMbmV3NQQoc2V0X2ZpZWxkcwAACBRpbmRleAQYZmllbGRzCERwcm92aWRlX2p1ZGdlbWVudAAAECRyZWdfaW5kZXgEGHRhcmdldDUEJGp1ZGdlbWVudAUGIGlkZW50aXR5IDRraWxsX2lkZW50aXR5AAAEGHRhcmdldDUEHGFkZF9zdWIAAAgMc3ViNQQQZGF0YfEFKHJlbmFtZV9zdWIAAAgMc3ViNQQQZGF0YfEFKHJlbW92ZV9zdWIAAAQMc3ViNQQgcXVpdF9zdWIAAQVYYWRkX3VzZXJuYW1lX2F1dGhvcml0eQAADCRhdXRob3JpdHk1BBhzdWZmaXgkKGFsbG9jYXRpb24EZHJlbW92ZV91c2VybmFtZV9hdXRob3JpdHkAAAgYc3VmZml4JCRhdXRob3JpdHk1BEBzZXRfdXNlcm5hbWVfZm9yAAAQDHdobzUEIHVzZXJuYW1lJCRzaWduYXR1cmUVBjh1c2VfYWxsb2NhdGlvbhQ8YWNjZXB0X3VzZXJuYW1lAAAEIHVzZXJuYW1lJFxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAAABCB1c2VybmFtZSRQc2V0X3ByaW1hcnlfdXNlcm5hbWUAAAQgdXNlcm5hbWUkPHVuYmluZF91c2VybmFtZQAABCB1c2VybmFtZSQ8cmVtb3ZlX3VzZXJuYW1lAAAEIHVzZXJuYW1lJDRraWxsX3VzZXJuYW1lAAAEIHVzZXJuYW1lJFRzZXRfcGVyc29uYWxfaWRlbnRpdHkAAAwcYWNjb3VudAAkc2lnbmF0dXJlEQYgdXNlcm5hbWUkjHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlAAAEKGNyZWRlbnRpYWwZBmhwZXJzb25hbF9jcmVkZW50aWFsX2p1ZGdlZAAADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudL0CXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5AAEFPHJlcG9ydF91c2VybmFtZQAABCB1c2VybmFtZSRgcmVwb3J0ZWRfdXNlcm5hbWVfanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50vQICHCx1bmRlcl9hbGlhcwAABBBjYWxsyQZEc2V0X2FsaWFzX2FjY291bnQAAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdARMdW5zZXRfYWxpYXNfYWNjb3VudAABBWhmb3JjZV9yZWNvZ25pemVfcGVyc29uaG9vZAAABBhwZW9wbGXFAlxzZXRfcGVyc29uYWxfaWRfYWNjb3VudAAACBxhY2NvdW50ADRjYWxsX3ZhbGlkX2F0BGR1bnNldF9wZXJzb25hbF9pZF9hY2NvdW50AAEFYGNyZWF0ZV9wZW9wbGVfY29sbGVjdGlvbgABBQJEEHZvdGUAAAgoY2FzZV9pbmRleAQcb3Bpbmlvbr0CKGNsb3NlX2Nhc2UAAAQoY2FzZV9pbmRleAQoY2xlYW5fdm90ZQAACChjYXNlX2luZGV4BBR2b3RlciAkcmVhcF9jYXNlAAAEKGNhc2VfaW5kZXgEJGludGVydmVuZQAACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIoY2xhaW1fdm90ZQAABChjYXNlX2luZGV4BDhwYXlvdXRfcmV3YXJkcwAABCxkZXN0aW5hdGlvbgAsY2xhaW1fdm90ZXMAAAQwY2FzZV9pbmRpY2VzzQJIc3RhcnRfcGF5b3V0X3JvdW5kAAEFWHNjaGVkdWxlX3BheW91dF9yb3VuZHMAAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBFhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlAAAEFGluZGV4BDBjbGFpbV9jcmVkaXQAAQUwY2xlYW5fcG9pbnRzAAAIFHJvdW5kBBR2b3RlciBAZm9yY2VfcmlwZW5fY2FzZQAABChjYXNlX2luZGV4BCh0b3VjaF9jYXNlAAAEKGNhc2VfaW5kZXgEUGNsZWFyX3ZvdGluZ19wZW5hbHR5AAEFRGNsZWFuX3ZvdGVfc2lnbmVkAAAIKGNhc2VfaW5kZXgEFHZvdGVyIAUBgQECFEBEZXNpZ25lZEVsZWN0aXZlAAQEAQhEUHJvY2VkdXJhbEFjY291bnQBBEhQcm9jZWR1cmFsUGVyc29uYWwBBChQcm9jZWR1cmFsAAMIBARQUHJvY2VkdXJhbERlcml2YXRpdmUAAwgIeQIEhQQAAlgUYXBwbHkAAQU8c3VibWl0X2V2aWRlbmNlAAAEIGV2aWRlbmNlIBhqdWRnZWQAAAwYdGlja2V0BBxjb250ZXh0JCRqdWRnZW1lbnS9AkRyZWdpc3Rlcl9yZWZlcnJlZAAADAxrZXkgLGRlc3RpbmF0aW9uAEhwcm9vZl9vZl9vd25lcnNoaXApBlRyZWdpc3Rlcl9ub25fcmVmZXJyZWQAAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwKQYYcmVyb2xsAAEFGGNvbW1pdAAACBhjaG9pY2UtBihyZXF1aXJlX2lkeQI0YWxsb2NhdGVfZnVsbAABBRx0aW1lb3V0AAAEHGFjY291bnQAIGZsYWtlb3V0AAEFUGFwcGx5X3dpdGhfc2lnbmF0dXJlAAAMIHJlZmVycmVyCCRzaWduYXR1cmURBhh0aWNrZXQAVGFwcGx5X3dpdGhfaW52aXRhdGlvbgAADBxpbnZpdGVyABh0aWNrZXQAJHNpZ25hdHVyZREGRGFkZF9kZXNpZ25fZmFtaWx5AAAMFGluZGV4BBBraW5k1QIIaWQgTHNldF9yZWZlcnJhbF90aWNrZXQAAAQYdGlja2V0AFhjYW5jZWxfcmVmZXJyYWxfdGlja2V0AAAEGHRpY2tldACMcmVnaXN0ZXJfc3VjY2Vzc2Z1bF9yZWZlcnJhbF9yZXdhcmQAAAQsZGVzdGluYXRpb24ANGdyYW50X2ludml0ZXMAAAgcYWNjb3VudAAUY291bnQEkHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwAACBxhY2NvdW50ABRsaW1pdAREc2V0X2ludml0ZV90aWNrZXQAAAQYdGlja2V0AFBjYW5jZWxfaW52aXRlX3RpY2tldAAABBh0aWNrZXQARHNldF9jb25maWd1cmF0aW9uAAAEGGNvbmZpZ9kCYHNldF9yZWltYnVyc2VtZW50X3ZhbHVlcwAACDxyZWZlcnJlZF92YWx1ZXMxBjxyZWZlcnJlcl92YWx1ZXMxBgIIGFBlcnNvbgABBSROb3RQZXJzb24AAQUEOQYABD0GAAAMOGdhbWVfcGxheV90aW1lBBhyb3VuZHMEOG1heF9ncm91cF9zaXplBARFBgAAFDByZWdpc3RyYXRpb24EHHNodWZmbGUETHBvc3Rfc2h1ZmZsZV9tYXJnaW4EJHJlcG9ydGluZwQ4cGxheWVyX3Byb2Nlc3MEAkBMc2lnbl91cF93aXRoX2ludml0ZQAABDhpZGVudGlmaWVyX2tleQ0GUHNpZ25fdXBfd2l0aF9hY2NvdW50AAAEOGlkZW50aWZpZXJfa2V5DQZIc2lnbl91cF93aXRoX2FsaWFzAAAMOGlkZW50aWZpZXJfa2V5DQZEc3RhdGVtZW50X2FjY291bnQADHNpZxEGGHJlcG9ydAAABCxmdWxsX3JlcG9ydEEGIG9mZmJvYXJkAAEFHGtpY2tvdXQAAAQYcGxheWVyADRncmFudF9pbnZpdGVzAAAIHGFjY291bnQAFGNvdW50BJByZW1vdmVfYXZhaWxhYmxlX2FuZF9wZW5kaW5nX2ludml0ZXMAAAgcYWNjb3VudAAUbGltaXQERHNldF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldABQY2FuY2VsX2ludml0ZV90aWNrZXQAAAQYdGlja2V0ADhzY2hlZHVsZV9nYW1lcwAABDxnYW1lc19zY2hlZHVsZXNJBlRyZW1vdmVfc2NoZWR1bGVkX2dhbWUAAAQ4Z2FtZV9wbGF5X3RpbWUEbHRlc3RuZXRfZm9yY2Vfc3RhcnRfc2h1ZmZsZQABBWx0ZXN0bmV0X2ZvcmNlX2VuZF9yZXBvcnRpbmcAAQVcdGVzdG5ldF9zZXRfZ2FtZV9waGFzZXMAAAQYcGhhc2VzTQZkdGVzdG5ldF9raWxsX2N1cnJlbnRfZ2FtZQABBQMIICkGBlUGAAxkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZAQYd2luZG93BDhhbGxvd2VkX21pc3NlcwQEXQYAAiBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleARAdHJhbnNpdGlvbl9yb3VuZAAABCxyb3VuZF9pbmRleARQb3BlcmF0ZV9wYXlvdXRfcm91bmQAAAgscm91bmRfaW5kZXgEFGxpbWl0BCBjYXNoX291dAABBTRyZWRlZW1fY3JlZGl0AAAELGRlc3RpbmF0aW9uACByZWdpc3RlcgAABAxrZXlZBmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQAABCBzY2hlZHVsZWEGAwgIIARpBgAECAACICxyZXNlcnZlX2lkcwAABBRjb3VudARQcmVuZXdfaWRfcmVzZXJ2YXRpb24AAAQIaWQIVGNhbmNlbF9pZF9yZXNlcnZhdGlvbgAABAhpZAhQcmVjb2duaXplX3BlcnNvbmhvb2QAAAQwaWRzX2FuZF9rZXlzbQZIc3VzcGVuZF9wZXJzb25ob29kAAAEDGlkc3EGRHJlc3VtZV9wZXJzb25ob29kAAAECGlkCFhzdGFydF9tdXRhdGlvbl9zZXNzaW9uAAEFUGVuZF9tdXRhdGlvbl9zZXNzaW9uAAEFABQkc2lnbmF0dXJlEQYcYWNjb3VudAA4aWRlbnRpZmllcl9rZXkNBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUdAwZ5BgIQeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQAACBxhY2NvdW50ABRjb3VudARsY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlAAAEHGFjY291bnQAGGF0dGVzdAAAFCRjYW5kaWRhdGUATGNhbmRpZGF0ZV9zaWduYXR1cmURBjByaW5nX3ZyZl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGVGNvbnN1bWVyX3JlZ2lzdHJhdGlvbn0GSGRpc3BhdGNoX2FzX3NpZ25lcgAABBBjYWxsyQYCCChTdGFuZGFsb25lASQsUmVzZXJ2YXRpb24BJAIgUHJlZ2lzdGVyX2xpdGVfcGVyc29uAAAMOGlkZW50aWZpZXJfa2V5DQYgdXNlcm5hbWUkRHJlc2VydmVkX3VzZXJuYW1lHQM8cmVnaXN0ZXJfcGVyc29uAAAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mEQY8dXNlcm5hbWVfY2hvaWNlhQZodG91Y2hfcGVyc29uX2F1dGhvcml6YXRpb24AAQWMcmVtb3ZlX2V4cGlyZWRfdXNlcm5hbWVfcmVzZXJ2YXRpb24AAAggdXNlcm5hbWUkHGFjY291bnQAVHVwZGF0ZV9pZGVudGlmaWVyX2tleQAABDhpZGVudGlmaWVyX2tleQ0GhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgAABCBkdXJhdGlvbgiwc2V0X3N0bXRfc3RvcmVfYXNzb2NpYXRlZF9hY2NvdW50X2lkX2F0X3Nsb3QAAAgsc2xvdF9udW1iZXIELHNldF9hY2NvdW50pQJMZGVtb3RlX2F1dGhfZXhwaXJlZAAABBxhY2NvdW50AAIIKGFkZF9jaHVua3MAAAw0cmluZ19leHBvbmVudPkCKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJFRzZXRfY2h1bmtfcGFnZV9oYXNoZXMAAAg0cmluZ19leHBvbmVudPkCLHBhZ2VfaGFzaGVzxQICEERidWlsZF9yaW5nX21hbnVhbAAADChpZGVudGlmaWVyIChyaW5nX2luZGV4BBRsaW1pdJEDWG9uYm9hcmRfbWVtYmVyc19tYW51YWwAAAQoaWRlbnRpZmllciAsbWVyZ2VfcmluZ3MAAAwoaWRlbnRpZmllciA8YmFzZV9yaW5nX2luZGV4BER0YXJnZXRfcmluZ19pbmRleARMc2V0X29uYm9hcmRpbmdfc2l6ZQAACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUEAwgEvQEElQYAAgwoRXhwZW5kYWJsZQABBRxQcm90ZWN0AAEFIFByZXNlcnZlAAEFABAUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQcYWxpYXNlc8UCBKEGAAJUFHNwbGl0AAAEKHNwbGl0X2ludG+ZBiB0cmFuc2ZlcgAABAh0bwBcbG9hZF9yZWN5Y2xlcl93aXRoX2NvaW4AAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwKQaEbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0AAAQMHByZXNlcnZhdGlvbp0GFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBmR1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luAAAUHGFsaWFzZXPFAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwCMdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXQAABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24ECHRvAKxwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9jb2luAAAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGtHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX25hdGl2ZQAACChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBrRwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9zdGFibGUAAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwKQaMdW5sb2FkX3JlY3ljbGVyc19pbnRvX2NvaW5fdW5zdGFibGUAAAgYaW5wdXRzpQYIdG8AtHVubG9hZF9yZWN5Y2xlcnNfaW50b19leHRlcm5hbF9hc3NldF91bnN0YWJsZQAACBhpbnB1dHOlBgh0bwDEdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBRpbnB1dKEGMGFsaWFzX3Byb29mc4UBCHRvADBmZWVfY3VycmVuY3kFA8h1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBhpbnB1dHOlBjBhbGlhc19wcm9vZnOFAQh0bwAwZmVlX2N1cnJlbmN5BQNodW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbnMAABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+ZBqBkaXJlY3Rfb2ZmYm9hcmRfY29pbl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAECHRvADhjbGVhbl9yZWN5Y2xlcgAABBR2YWx1ZQRkY2xlYW5fY29uc3VtZWRfZnJlZV90b2tlbgAABBhwZXJpb2QEcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcAAAgYcGVyaW9kBChyaW5nX2luZGV4BExjbGVhbl9yZWN5Y2xlcl9kdXN0AAEFcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAAQWsZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbgAABBhwZXJpb2QEAAwUcHJpemUVA0xyZWdpc3RyYXRpb25fc3RhcnRzBFRyZWdpc3RyYXRpb25fZHVyYXRpb24EAhA4c2NoZWR1bGVfZXZlbnQAAAQoZXZlbnRfaW5mb60GWHJlbW92ZV9zY2hlZHVsZWRfZXZlbnQAAAQgZXZlbnRfaWQESHJlZ2lzdGVyX2Zvcl9ldmVudAAACCBldmVudF9pZAQQZGVzdABsY2xhaW1fZmFpbGVkX3RyYW5zZmVyX3ByaXplAAAEIGV2ZW50X2lkBAAMFGluZGV4BDBpbm5lcl9jdXJzb3IdAyhzdGFydGVkX2F0BAIIGEFjdGl2ZQG1BhRTdHVjawABBQa5BgIIIFNwZWNpZmljAW0DIFdpbGRjYXJkAAAIFGxpbWl0kQM8cHJldmlvdXNfY3Vyc29yHQMCEEBmb3JjZV9zZXRfY3Vyc29yAAAEGGN1cnNvcr0GXGZvcmNlX3NldF9hY3RpdmVfY3Vyc29yAAAMFGluZGV4BDBpbm5lcl9jdXJzb3IdAyhzdGFydGVkX2F0kQNIZm9yY2Vfb25ib2FyZF9tYm1zAAEFOGNsZWFyX2hpc3RvcmljAAAEIHNlbGVjdG9ywQYCgBhTeXN0ZW0BRQU8UGFyYWNoYWluU3lzdGVtAUkFJFRpbWVzdGFtcAFNBTRQYXJhY2hhaW5JbmZvAZECIEJhbGFuY2VzAVEFRE9yaWdpblJlc3RyaWN0aW9uAVUFGEFzc2V0cwFZBSRBc3NldFJhdGUBXQVEQ29sbGF0b3JTZWxlY3Rpb24BYQUcU2Vzc2lvbgFlBSRYY21wUXVldWUBaQUsUG9sa2Fkb3RYY20BbQUoQ3VtdWx1c1hjbQGRAjBNZXNzYWdlUXVldWUBcQUcVXRpbGl0eQF1BSBNdWx0aXNpZwF9BRBTdWRvAYEFFFByb3h5AYkFIElkZW50aXR5AR0GGFBlb3BsZQEhBhxNb2JSdWxlASUGKFByb29mT2ZJbmsBNQYQR2FtZQFRBhRTY29yZQFlBiBEdW1teURpbQF1BihQZW9wbGVMaXRlAYEGJFJlc291cmNlcwGJBjRDaHVua3NNYW5hZ2VyAY0GHE1lbWJlcnMBkQYcQ29pbmFnZQGpBhxBaXJkcm9wAbEGUE11bHRpQmxvY2tNaWdyYXRpb25zAcUGBMkGAAAQEHdoZW6dAhxkZXBvc2l0CCRkZXBvc2l0b3IAJGFwcHJvdmFsc70BAAwgZGVsZWdhdGUAKHByb3h5X3R5cGWtAhRkZWxheQQE1QYAAwjZBggADBByZWFsACRjYWxsX2hhc2ggGGhlaWdodAQE4QYAAwjlBggDCAQFBgTtBgAADChqdWRnZW1lbnRz8QYcZGVwb3NpdAgQaW5mb/kFAwgIvQEADBxhY2NvdW50AAxmZWUIGGZpZWxkcwgG/QYEAQcAAAgoYWNjb3VudF9pZAAoYWxsb2NhdGlvbgQCDChBbGxvY2F0aW9uAAEFQEF1dGhvcml0eURlcG9zaXQBCBhTeXN0ZW0AAQUACBRvd25lcgAgcHJvdmlkZXINBwMMAAQNBwMIGQYEBBkHAAAQHGFjY291bnQASHBlbmRpbmdfanVkZ2VtZW50cx0HGGJhbm5lZBRkdXNlcm5hbWVfbGFzdF9yZXBvcnRlZF9hdJEDAAwgcmVwb3J0ZXIAIHVzZXJuYW1lJBxjYXNlX2lkBAAIDGtleSAcYWNjb3VudKUCABAUdm90ZWQEHGNsZWFuZWQEHGNvcnJlY3QEGGNyZWRpdAgCEEBEZXNpZ25lZEVsZWN0aXZlAAQEAQhEUHJvY2VkdXJhbEFjY291bnQAAwgEIEhQcm9jZWR1cmFsUGVyc29uYWwAAwgECChQcm9jZWR1cmFsAAMIBCgCDChQcm9vZk9mSW5rAAAMGGRlc2lnbjEHIGV2aWRlbmNlIExwcm9iYWJsZV9hY2NlcHRhYmxlFEhJZGVudGl0eUNyZWRlbnRpYWwAAAggcGxhdGZvcm0ZBiBldmlkZW5jZSQ0VXNlcm5hbWVWYWxpZAAABCB1c2VybmFtZSQACDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEAAwkc3RhdGVtZW50NQccY29udGV4dCQgY2FsbGJhY2s5BwAMDGF5ZQQMbmF5BCBjb250ZW1wdAQADBRzaW5jZQgcZGV0YWlscz0HFHRhbGx5QQcACBxkZXRhaWxzPQccdmVyZGljdL0CAAgUc2luY2UIHHZlcmRpY3S9AgAUFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIRHJlbWFpbmluZ19iYWxhbmNlCDB0b3RhbF9wb2ludHMIFHN0YXJ0BAAMJHJlbWFpbmluZwRAYW1vdW50X3Blcl9yb3VuZAgYcGVyaW9kBARVBwACDCBSZWZlcnJlZAEIHERlcG9zaXQBCBxJbnZpdGVkAQACDBxJbml0aWFsAAEFIEluaXREb25lAAEFEEZ1bGwAAQUCDBxBcHBsaWVkAAAMEGNyZWRdBxxlbnRyb3B5IDRlbnRyb3B5X3NpbmNlBCBTZWxlY3RlZAAAIBRzaW5jZQQQY3JlZF0HIHJlc2VydmVkCBxlbnRyb3B5IBhkZXNpZ24xByhhbGxvY2F0aW9uYQccanVkZ2luZ5EDGGZhaWxlZAQYUHJvdmVuAAAQGGRlc2lnbjEHIHJlc2VydmVkCDB3YXNfcmVmZXJyZWQULHdhc19pbnZpdGVkFAYxBwAkGGRlc2lnbmkHQGFjdGl2ZV9yZWZlcnJhbHO9AWBhbGxvd2VkX3JlZmVycmFsX3RpY2tldHMENGJhZF9yZWZlcnJhbHMEUHN1Y2Nlc3NmdWxfcmVmZXJyYWxzBCRyZWZlcnJhbHMELGRlcml2YXRpdmVzBBhiYW5uZWQUYHBlbmRpbmdfcmVmZXJyYWxfcmV3YXJkcwQACBBraW5k1QIIaWQgAgggUmVzZXJ2ZWQAAQUkQ29tbWl0dGVkAAEFBAABCAMI4QIgAgggS2lja2FibGUAAAgoZmlyc3RfZ2FtZQQ4YXJjaGl2ZWRfc2luY2UEKFVua2lja2FibGUAAAQoZmlyc3RfZ2FtZQQCDBxJbnZpdGVkAAEFKFJlY29nbml6ZWQAAQUcRGVwb3NpdAEIABgoZmlyc3RfZ2FtZQQocmVnaXN0ZXJlZBQsc2VudF9yZXBvcnQUKHllc19wZXJzb24ENG5vX25vdF9wZXJzb24ELGNyZWRpYmlsaXR5hQcG4QICCCxTdGVwMUluc2VydAAABDhsYXN0X2l0ZXJhdGlvbo0HNFN0ZXAyUmV0cmlldmUAAAhEbmV4dF9wbGF5ZXJfaW5kZXgETHJlY29nbml6ZWRfZmluaXNoZWQUAhQwUmVnaXN0cmF0aW9uAAAERG5leHRfcGxheWVyX2luZGV4BBxTaHVmZmxlAAAEEHN0ZXCRByRSZXBvcnRpbmcAAAQwcGxheWVyX2NvdW50BDRQbGF5ZXJQcm9jZXNzAAAEOGxhc3RfaXRlcmF0aW9ujQcoQ2FuY2VsbGluZwAABDhsYXN0X2l0ZXJhdGlvbo0HACAUaW5kZXgERHJlZ2lzdHJhdGlvbl9lbmRzBEBzaHVmZmxlX2RlYWRsaW5lBCRnYW1lX2RhdGUELHJlcG9ydF9lbmRzBBRzdGF0ZZUHOG1heF9ncm91cF9zaXplBBhyb3VuZHMEAgggQXR0ZW5kZWQBBBhBYnNlbnQBBAIQUEV4dGVybmFsbHlSZWNvZ25pemVkAAEFNE5vdFJlY29nbml6ZWQAAQUkU3VzcGVuZGVkAQgoUmVjb2duaXplZAEIACAUc2NvcmUEGHN0cmVha50HSGF0dGVuZGFuY2VfaGlzdG9yeQQYY3JlZGl0CChjYXNoZWRfb3V0FEhyZWFjaGVkX3BlcnNvbmhvb2QUbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZBQscmVjb2duaXRpb26hBwMIBOECABBEcmVtYWluaW5nX2JhbGFuY2UILHBvaW50X3ByaWNlCCRyZW1haW5kZXIIMHRvdGFsX3BvaW50cwQACCRmaW5pc2hfYXQEGGNyZWRpdAgADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIIGR1cmF0aW9uBAS1BwAACAxrZXkgJHN1c3BlbmRlZBQCBDBVbmlxdWVEZXZpY2UBAAAIMHJpbmdfdnJmX2tleSAYbWV0aG9kwQcCCBBMaXRlAAEFGFBlcnNvbgAADBRhbGlhcyAsbGFzdF91cGRhdGUIHGRlbW90ZWQUAgggT2NjdXBpZWQAAAgoYWNjb3VudF9pZAAUc2luY2UIEEZyZWUAAQUEzQcAABQ4aWRlbnRpZmllcl9rZXkNBjRmdWxsX3VzZXJuYW1lHQM0bGl0ZV91c2VybmFtZSQsY3JlZGliaWxpdHnJB0BzdG10X3N0b3JlX3Nsb3Rz0QcACBxhY2NvdW50ACRqb2luZWRfYXQIBNkHAAAIJG1heF9jb3VudAQgbWF4X3NpemUEAwj5AgQFAcAE6QcAAgggRXh0ZXJuYWwBUQEUTG9jYWwBAAIIKEFwcGVuZE9ubHkAAQUgRmxleGlibGUAAQUADBRvd25lcvEHEG1vZGX1ByRyaW5nX3NpemX5AgMIIAQFAQEGBQHBBgAMEHJvb3QBCCByZXZpc2lvbgQwaW50ZXJtZWRpYXRlBQgDDCAEBAAMFHRvdGFsBCBpbmNsdWRlZAQ8aW1tdXRhYmxlX3NpbmNleQICDChPbmJvYXJkaW5nAAAEKHF1ZXVlX3BhZ2UEIEluY2x1ZGVkAAAMKHJpbmdfaW5kZXgEJHJpbmdfcGFnZQQ0cmluZ19wb3NpdGlvbgQkU3VzcGVuZGVkAAEFAAgoaWRlbnRpZmllciAgcG9zaXRpb24VCAIIKEFwcGVuZE9ubHkAAQUgTXV0YXRpbmcBBAIMNERlbGV0aW5nUmluZ3MAAQVcRGVsZXRpbmdPbmJvYXJkaW5nUXVldWUAAQUoRmluYWxpemluZwABBQAIKGlkZW50aWZpZXIgFHN0YWdlIQgCBDhGYWlsZWREaXNwYXRjaAAABBxyZXRyaWVzBAAIGHJlYXNvbikIFHVudGlsCAMMBAQgBJEDAQgGEQgGfQECICBJbmFjdGl2ZQABBTRDcmVhdGluZ0Fzc2V0AAEFQFhjbUZ1bmRzVHJhbnNmZXIAAQU4VmVyaWZ5aW5nRnVuZHMAAQUsRnVuZGluZ1BvdHMAAQVgU2NoZWR1bGluZ01vYlJ1bGVQYXlvdXRzAAEFWFNjaGVkdWxpbmdTY29yZVBheW91dHMAAQUkQ29tcGxldGVkAAEFAgggSW5hY3RpdmUAAQUkQ29tcGxldGVkAAEFAAgIaWQEEGluZm+tBgRJCAACFCxSZWdpc3RlcmluZwABBWBXYWl0aW5nRm9yRW50cm9weVRvQnVpbGQAAARAc3RhcnRlZF9hdF9yY19ibgQ4RHJhd2luZ1dpbm5lcnMAAAQcZW50cm9weSAwRGlzdHJpYnV0aW5nAAEFPENsZWFyaW5nU3RvcmFnZQABBQAQCGlkBExuZXh0X3BhcnRpY2lwYW50X2lkBBBpbmZvrQYYc3RhdHVzUQgDCCAAAwgABAMIUQEIABQUcHJpemUVA0xyZWdpc3RyYXRpb25fc3RhcnRzBFRyZWdpc3RyYXRpb25fZHVyYXRpb24ESHRvdGFsX3BhcnRpY2lwYW50cwQcd2lubmVyc8UCAAgYaGVhZGVy1QMoZXh0cmluc2ljc20DAgg0QWxsRXh0cmluc2ljcwABBTRPbmx5SW5oZXJlbnRzAAEFAAgYcHJlZml43QEYc3VmZml43QECDDhOb3RJbXBsZW1lbnRlZAABBSBOb3RGb3VuZAFxCBRDb2RlYwABBQckdQgCNBBDYWxsAAEFHFBheW1lbnQAAQUYRnV0dXJlAAEFFFN0YWxlAAEFIEJhZFByb29mAAEFREFuY2llbnRCaXJ0aEJsb2NrAAEFREV4aGF1c3RzUmVzb3VyY2VzAAEFGEN1c3RvbQEEMEJhZE1hbmRhdG9yeQABBUxNYW5kYXRvcnlWYWxpZGF0aW9uAAEFJEJhZFNpZ25lcgABBVRJbmRldGVybWluYXRlSW1wbGljaXQAAQU0VW5rbm93bk9yaWdpbgABBQIMMENhbm5vdExvb2t1cAABBUxOb1Vuc2lnbmVkVmFsaWRhdG9yAAEFGEN1c3RvbQEEAggcSW52YWxpZAF9CBxVbmtub3duAYEIB5UChQgDCNkBJASNCAAADBBva2F5FCxmYXRhbF9lcnJvchQYZXJyb3JzkQgCDBxJbkJsb2NrAAEFFExvY2FsAAEFIEV4dGVybmFsAAEFABQgcHJpb3JpdHkIIHJlcXVpcmVzbQMgcHJvdmlkZXNtAyRsb25nZXZpdHkIJHByb3BhZ2F0ZRQHnQiFCAMIJCgEpQgABqkIAAwYd2VpZ2h0GBRjbGFzczgscGFydGlhbF9mZWUIAAwgYmFzZV9mZWUIHGxlbl9mZWUITGFkanVzdGVkX3dlaWdodF9mZWUIBrUIAAg0aW5jbHVzaW9uX2ZlZbkIDHRpcAgE2QQAAhg0VW5pbXBsZW1lbnRlZAABBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEFTFdlaWdodE5vdENvbXB1dGFibGUAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBTRBc3NldE5vdEZvdW5kAAEFKFVucm91dGFibGUAAQUHwQjFCAcYxQgHCMUIB3ECxQgCCCxVbnN1cHBvcnRlZAABBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEFBwDZCAIMFENoYWluAAEFHE5ldHdvcmsAAQUUTG9jYWwAAQUFAYQCEBxTcjI1NTE5AAAIJHNpZ25hdHVyZQkGGHNpZ25lciAcRWQyNTUxOQAACCRzaWduYXR1cmUJBhhzaWduZXIgOFNlY3AyNTZrMUVjZHNhAAAIJHNpZ25hdHVyZQ0GGHNpZ25lcuUIHE9uQ2hhaW4AAAwMd2hvIChibG9ja19oYXNoICxldmVudF9pbmRleAgG6QgEIAEQABwUcHJvb2btCDhkZWNyeXB0aW9uX2tledwcY2hhbm5lbNwgcHJpb3JpdHmRAyhudW1fdG9waWNzBBh0b3BpY3PxCBBkYXRhHQMCGEBOb1JlcG9ydGluZ1BoYXNlAAEFUFN0YXRlbWVudElzTm90U2lnbmVkAAEFQEludmFsaWRTaWduYXR1cmUAAQU0SW52YWxpZFRvcGljMAAACCBleHBlY3RlZNwYYWN0dWFs3ExBY2NvdW50SXNOb3RBUGxheWVyAAEFVFBsYXllcklzTm90UmVnaXN0ZXJlZAABBQfhB/kIABg8dXB3YXJkX21lc3NhZ2VzbQNMaG9yaXpvbnRhbF9tZXNzYWdlc9EDTG5ld192YWxpZGF0aW9uX2NvZGUdA2xwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMEOGhybXBfd2F0ZXJtYXJrBCRoZWFkX2RhdGEkB5ECOQMGOQMEOQMAAgwgQmFkUHJvb2YAAQUcTm9Qcm9vZgABBTRJbnRlcm5hbEVycm9yAAEFB+EHEQk="; +declare const content = "cQoAAAAQAQEFAAQBAQUAFAEBBQAcAAQAIAAEACQBAQUAIAEBBQAwAQEFAD0DACAARQMBAQUATQMBAQUANAEBBQBRAwEBBQAYAQEFAF0DAQEFAGkDAQEFAG0DAQEFAHkDAQAEGHJlbWFyayQBAQUBAAQUcGFnZXMIAQEFAQAEEGNvZGUkAQEFAQAEFGl0ZW1zgQMBAQUBAAQQa2V5c4UDAQEFAQAIGHByZWZpeCQcc3Via2V5cwQBAQUBAAQkY29kZV9oYXNoIAEBBQEBBQEABDRkaXNwYXRjaF9pbmZvQAEBBQEACDhkaXNwYXRjaF9lcnJvctg0ZGlzcGF0Y2hfaW5mb0ABAQUBAAQQaGFzaCABAQUBAAQcYWNjb3VudAABAQUBAAgYc2VuZGVyABBoYXNoIAEBBQEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAQEFAQAIJGNvZGVfaGFzaCAUZXJyb3LYAQEFAQEFAQEFAIkDAQEFAKkDAQEFAK0DAQEFACQBAQUAsQMBAQUAuQMBAQUAoQMBAQUAhQMBAQUAzQMBAQUA1QMBAQUA3QMBAQUA4QMBAQUA6QMBAQUACAEBBQDtAwEACBBkYXRh+QNUaW5ib3VuZF9tZXNzYWdlc19kYXRhKQQBAQUBAAQcbWVzc2FnZSQBAQUBAQUBAQUBAQUBAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBAEBBQEABBRjb3VudAQBAQUBAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIAEBBQEABDBtZXNzYWdlX2hhc2jgAQAEDG5vdwgBAQUAAAAMAAAANQQAAAA9BAAAAEUEAAAATQQBAAgQZGVzdFEEFHZhbHVlCAEBBQEADBhzb3VyY2VRBBBkZXN0UQQUdmFsdWUIAQEFAQAIEGRlc3RRBChrZWVwX2FsaXZlFAEBBQEACAx3aG9RBBhhbW91bnQIAQEFAQAEDHdob8kBAQEFAQAIDHdob1EEIG5ld19mcmVlCAEBBQEACCRkaXJlY3Rpb25VBBRkZWx0YQgBAQUBAAgUdmFsdWUIKGtlZXBfYWxpdmUUAQEFAQEFAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQgBAQUBAAgcYWNjb3VudAAYYW1vdW50CAEBBQEADBBmcm9tAAh0bwAYYW1vdW50CAEBBQEACAx3aG8AEGZyZWUIAQEFAQAIDHdobwAYYW1vdW50CAEBBQEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPoAQEFAQAEGGFtb3VudAgBAQUBAAQMd2hvAAEBBQEACAxvbGQIDG5ldwgBAQUBAAwYcmVhc29uCQEMd2hvABhhbW91bnQIAQEFAQAQGHJlYXNvbgkBGHNvdXJjZQAQZGVzdAAYYW1vdW50CAEBBQEAEBhyZWFzb24JARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCAEBBQANAQEBBQBZBAEBBQEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgBAQUBAAQYb3JpZ2lunQEApQEAXQQBAAQYZW50aXR5pQEBAQUBAQUBAAQYZW50aXR5pQEAVQEAZQQAaQQAdQQAeQQAfQQAVQEAgQQAVQEAsQEBAQUAVQEBAwRVAQCFBAEDCABVAQCFAgEDBFUBAIkEAQMEVQEAsQEBAAwIaWRVARRhZG1pblEELG1pbl9iYWxhbmNlCAEBBQEAEAhpZFUBFG93bmVyUQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UIAQEFAQAECGlkVQEBAQUBAAwIaWRVASxiZW5lZmljaWFyeVEEGGFtb3VudAgBAQUBAAwIaWRVAQx3aG9RBBhhbW91bnQIAQEFAQAMCGlkVQEYdGFyZ2V0UQQYYW1vdW50CAEBBQEAEAhpZFUBGHNvdXJjZVEEEGRlc3RRBBhhbW91bnQIAQEFAQAICGlkVQEMd2hvUQQBAQUBAAgIaWRVARRvd25lclEEAQEFAQAQCGlkVQEYaXNzdWVyUQQUYWRtaW5RBBxmcmVlemVyUQQBAQUBABAIaWRVARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBAEBBQEAFAhpZFUBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQBAQUBACAIaWRVARRvd25lclEEGGlzc3VlclEEFGFkbWluUQQcZnJlZXplclEELG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCRpc19mcm96ZW4UAQEFAQAMCGlkVQEgZGVsZWdhdGVRBBhhbW91bnQIAQEFAQAICGlkVQEgZGVsZWdhdGVRBAEBBQEADAhpZFUBFG93bmVyUQQgZGVsZWdhdGVRBAEBBQEAEAhpZFUBFG93bmVyUQQsZGVzdGluYXRpb25RBBhhbW91bnQIAQEFAQAICGlkVQEoYWxsb3dfYnVybhQBAQUBAAgIaWRVASxtaW5fYmFsYW5jZQgBAQUBAAwIaWRVARBkZXN0UQQoa2VlcF9hbGl2ZRQBAQUBAAgIaWRVASByZXNlcnZlc7EBAQEFAQEFAQAMIGFzc2V0X2lkVQEcY3JlYXRvcgAUb3duZXIAAQEFAQAMIGFzc2V0X2lkVQEUb3duZXIAGGFtb3VudAgBAQUBABAgYXNzZXRfaWRVARBmcm9tAAh0bwAYYW1vdW50CAEBBQEADCBhc3NldF9pZFUBFG93bmVyABxiYWxhbmNlCAEBBQEAECBhc3NldF9pZFUBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAAQEFAQAIIGFzc2V0X2lkVQEUb3duZXIAAQEFAQAIIGFzc2V0X2lkVQEMd2hvAAEBBQEABCBhc3NldF9pZFUBAQEFAQAMIGFzc2V0X2lkVQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcEAQEFAQAMIGFzc2V0X2lkVQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwQBAQUBABQgYXNzZXRfaWRVARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UAQEFAQAQIGFzc2V0X2lkVQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CAEBBQEADCBhc3NldF9pZFUBFG93bmVyACBkZWxlZ2F0ZQABAQUBABQgYXNzZXRfaWRVARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAIIGFzc2V0X2lkVQE8bmV3X21pbl9iYWxhbmNlCAEBBQEADCBhc3NldF9pZFUBDHdobwAkZGVwb3NpdG9yAAEBBQEADCBhc3NldF9pZFUBDHdobwAYYW1vdW50CAEBBQEACCBhc3NldF9pZFUBIHJlc2VydmVzsQEBAQUBAAggYXNzZXRfaWRVARhhbW91bnQIAGkEAEUEAGkEAAgBAQUBABAMd2hvACBhc3NldF9pZFUBGHJlYXNvbgkBGGFtb3VudAgAVQEACAEACChhc3NldF9raW5kVQEQcmF0ZQgBAQUBAAQoYXNzZXRfa2luZFUBAQEFAQEFAQAIKGFzc2V0X2tpbmRVARByYXRlCAEBBQEABChhc3NldF9raW5kVQEBAQUBAAwoYXNzZXRfa2luZFUBDG9sZAgMbmV3CAEBBQEAEAx3aG8AKGFjdHVhbF9mZWUIDHRpcAggYXNzZXRfaWTBAQEBBQAAAQEFAMkBAQEFAJEEAAAABAEBBQDlAQEABAxuZXfJAQEBBQEABAxtYXgEAQEFAQAEEGJvbmQIAQEFAQEFAQEFAQAEDHdobwABAQUBAAQsbmV3X2RlcG9zaXQIAQEFAQAIHGRlcG9zaXQIGHRhcmdldAABAQUBAQUBAAQ0aW52dWxuZXJhYmxlc8kBAQEFAQAEKGFjY291bnRfaWQAAQEFAQAESGRlc2lyZWRfY2FuZGlkYXRlcwQBAQUBAAQsYm9uZF9hbW91bnQIAQEFAQAIKGFjY291bnRfaWQAHGRlcG9zaXQIAQEFAQAMDG9sZAAMbmV3ABxkZXBvc2l0CAEBBQCZBAEBBQBFAwAAACAAnQQAAAAAAJ0CAQAIEGtleXMgFHByb29mJAEBBQEBBQEABDRzZXNzaW9uX2luZGV4BAEBBQEABCR2YWxpZGF0b3IAAQEFANECAQEFAKEEAQEFANkCAQEFAK0EALEEACQBAQUAtQQABAAIAQAEDG5ldwQBAQUBAQUBAAQwbWVzc2FnZV9oYXNoIAAIAN0EACAABADhBAAEAOEEAAgA4QQA5QQBAQUA7QQBAQUA8QQA+QQABQUAAAANBQEBBQBNAgCBAgAZBQEBBQBRAQEACBBkZXN0gQIcbWVzc2FnZUUFAQEFAQAQEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlRQUobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb25VARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbmUDAQEFAQAEIGxvY2F0aW9ugQIBAQUBABQQZGVzdIECLGJlbmVmaWNpYXJ5gQIYYXNzZXRzfQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdC0CAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzfQIsYmVuZWZpY2lhcnmBAgEBBQEAHBBkZXN0gQIYYXNzZXRzfQJQYXNzZXRzX3RyYW5zZmVyX3R5cGVJBThyZW1vdGVfZmVlc19pZPUESGZlZXNfdHJhbnNmZXJfdHlwZUkFSGN1c3RvbV94Y21fb25fZGVzdEUFMHdlaWdodF9saW1pdC0CAQEFAQAIHGFsaWFzZXKBAhxleHBpcmVzhQIBAQUBAAQcYWxpYXNlcoECAQEFAQEFAQAEHG91dGNvbWXhAQEBBQEAEBhvcmlnaW5VASxkZXN0aW5hdGlvblUBHG1lc3NhZ2VNAihtZXNzYWdlX2lkIAEBBQEAEBhvcmlnaW5VASxkZXN0aW5hdGlvblUBFGVycm9yUQIobWVzc2FnZV9pZCABAQUBAAwYb3JpZ2luVQEUZXJyb3LZAShtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW5VASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNlEQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2luVQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9uwQEBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpblUBGGFzc2V0c30CAQEFAQAQLGRlc3RpbmF0aW9uVQEYcmVzdWx0BBBjb3N0+QEobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb25VARx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvblUBIHF1ZXJ5X2lkCBRlcnJvctkBAQEFAQAIIGxvY2F0aW9ugQIgcXVlcnlfaWQIAQEFAQAQGG9yaWdpblUBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyVQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXLBAQEBBQEADCxkZXN0aW5hdGlvblUBEGNvc3T5AShtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmdVARBmZWVz+QEBAQUBAAQcdmVyc2lvbgQBAQUBAAwcYWxpYXNlclUBGHRhcmdldFUBGGV4cGlyeYUCAQEFAQAIHGFsaWFzZXJVARh0YXJnZXRVAQEBBQEABBh0YXJnZXRVAQEBBQEACBRpbmRleAQUZXJyb3JsAQEFACABAQUBAwgg4QEAkQIAVQUBAQUAkQIAWQUAXQUBAQUAGQIBAAg4bWVzc2FnZV9vcmlnaW6RAihwYWdlX2luZGV4BAEBBQEAEDhtZXNzYWdlX29yaWdpbpECEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYAQEFAQEFAQAMCGlkIBhvcmlnaW6RAhRlcnJvcpUCAQEFAQAQCGlkIBhvcmlnaW6RAix3ZWlnaHRfdXNlZBgcc3VjY2VzcxQBAQUBABAIaWQgGG9yaWdpbpECKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEAQEFAQAIGG9yaWdpbpECFGluZGV4BAEABBRjYWxscwUHAQEFAQAIFGluZGV4BBBjYWxsAQcBAQUBAAgkYXNfb3JpZ2lunQEQY2FsbAEHAQEFAQAIEGNhbGwBBxh3ZWlnaHQYAQEFAQAIEG1haW4BByBmYWxsYmFjawEHAQEFAQEFAQAIFGluZGV4BBRlcnJvctgBAQUBAAQUZXJyb3LYAQEFAQAEGHJlc3VsdKECAQEFAQAEKG1haW5fZXJyb3LYAJUEAAkHAQAIRG90aGVyX3NpZ25hdG9yaWVzyQEQY2FsbAEHAQEFAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPJATxtYXliZV90aW1lcG9pbnSVBRBjYWxsAQcobWF4X3dlaWdodBgBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBPG1heWJlX3RpbWVwb2ludJUFJGNhbGxfaGFzaCAobWF4X3dlaWdodBgBAQUBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBJHRpbWVwb2ludKkCJGNhbGxfaGFzaCABAQUBAAwkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBJGNhbGxfaGFzaCABAQUBAQUBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIAEBBQEAECRhcHByb3ZpbmcAJHRpbWVwb2ludKkCIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAUJGFwcHJvdmluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0oQIBAQUBABAoY2FuY2VsbGluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABAMd2hvACRjYWxsX2hhc2ggLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAQQY2FsbAEHAQEFAQAEDG5ld1EEAQEFAQAIDHdob1EEEGNhbGwBBwEBBQEBBQEABCxzdWRvX3Jlc3VsdKECAQEFAQAIDG9sZLECDG5ldwAAAAAVBwAAACEHAQMIAQe5AgAUAQMIuQK5AgAUAQAMEHJlYWxRBEBmb3JjZV9wcm94eV90eXBloQUQY2FsbAEHAQEFAQAMIGRlbGVnYXRlUQQocHJveHlfdHlwZbkCFGRlbGF5BAEBBQEADChwcm94eV90eXBluQIUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVyUQQocHJveHlfdHlwZbkCFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBAAgQcmVhbFEEJGNhbGxfaGFzaCABAQUBAAggZGVsZWdhdGVRBCRjYWxsX2hhc2ggAQEFAQAQIGRlbGVnYXRlUQQQcmVhbFEEQGZvcmNlX3Byb3h5X3R5cGWhBRBjYWxsAQcBAQUBAQUBABgQcHVyZQAMd2hvAChwcm94eV90eXBluQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEAQEFAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGW5AlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGW5AhRkZWxheQQBAQUBABAMd2hvABBraW5kvQIsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAAAAC0HAAAAJAAAABkGAAAAMQcBAQUAPQcAJABBBwAkAEkHACQATQcAJAAEACAAWQcAIABdBwEABBxhY2NvdW50UQQBAQUBAAQQaW5mbxUGAQEFAQAEEHN1YnMdBgEBBQEACCRyZWdfaW5kZXgEHG1heF9mZWUIAQEFAQAEJHJlZ19pbmRleAQBAQUBAAgUaW5kZXgEDGZlZQgBAQUBAAgUaW5kZXgEDG5ld1EEAQEFAQAIFGluZGV4BBhmaWVsZHMIAQEFAQAQJHJlZ19pbmRleAQYdGFyZ2V0UQQkanVkZ2VtZW50IQYgaWRlbnRpdHkgAQEFAQAEGHRhcmdldFEEAQEFAQAIDHN1YlEEEGRhdGENBgEBBQEABAxzdWJRBAEBBQEADCRhdXRob3JpdHlRBBhzdWZmaXgkKGFsbG9jYXRpb24EAQEFAQAIGHN1ZmZpeCQkYXV0aG9yaXR5UQQBAQUBABAMd2hvUQQgdXNlcm5hbWUkJHNpZ25hdHVyZTEGOHVzZV9hbGxvY2F0aW9uFAEBBQEABCB1c2VybmFtZSQBAQUBAAwcYWNjb3VudAAkc2lnbmF0dXJlLQYgdXNlcm5hbWUkAQEFAQAEKGNyZWRlbnRpYWw1BgEBBQEADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudMkCAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEBBQEACCByZXBvcnRlcgAgdXNlcm5hbWUkAQEFAQAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSQBAQUBAAQUYWxpYXMgAQEFAQAIIHVzZXJuYW1lJCRqdWRnZW1lbnTJAgAgAAgACABhBwBhAQAAAAAAZQEAAAAIAAgAnQIBAQUABQMBAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdAQBAQUBAAQYcGVvcGxl0QIBAQUBAAQcYWxpYXNlcz0GAQEFAQEFAQAIDHdobwgMa2V5IAEBBQEACBRhbGlhc2EBHGFjY291bnQAAQEFAQAIDHdobwgcYWNjb3VudAABAQUBAAQYcGVvcGxl0QIAIABlBwDZAwAEANkDAMkCAAQAfQcABACBBwAEAIUHAQEFAIkHAQEFAJEHAQAIKGNhc2VfaW5kZXgEHG9waW5pb27JAgEBBQEABChjYXNlX2luZGV4BAEBBQEACChjYXNlX2luZGV4BBR2b3RlciABAQUBAAgoY2FzZV9pbmRleAQcdmVyZGljdMkCAQEFAQAELGRlc3RpbmF0aW9uAAEBBQEABDBjYXNlX2luZGljZXPZAgEBBQEADBhhbW91bnQIFGNvdW50BBhwZXJpb2QEAQEFAQAEFGluZGV4BAEBBQEACBRyb3VuZAQUdm90ZXIgAQEFAQEFAQAEKGNhc2VfaW5kZXgEAQEFAQAIKGNhc2VfaW5kZXgEHHZlcmRpY3TJAgEBBQEADChjYXNlX2luZGV4BBR2b3RlciAcb3BpbmlvbskCAQEFAQAIKGNhc2VfaW5kZXgEFHZvdGVyIAEBBQEACBR2b3RlciAwY2FzZV9pbmRpY2Vz2QIBAQUBAAwUdm90ZXIgLGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAMFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIMHRvdGFsX3BvaW50cwgBAQUBAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBAEBBQEABBRpbmRleAQBAQUBAAgUdm90ZXIgGGFtb3VudAgBAQUBAAgUcm91bmQEFHZvdGVyIAEBBQEACChjYXNlX2luZGV4BBxyaXBlbmVkFAEBBQEABAx3aG8gAAAAnQcACAClBwAIAMkBAAQAqQcAQQMArQcBAQUA5QIAsQcAnQIBAQUAUQYBAAQgZXZpZGVuY2UgAQEFAQAMDGtleSAsZGVzdGluYXRpb24ASHByb29mX29mX293bmVyc2hpcEkGAQEFAQAIGGNob2ljZU0GKHJlcXVpcmVfaWSFAgEBBQEABBxhY2NvdW50AAEBBQEADCByZWZlcnJlcggkc2lnbmF0dXJlLQYYdGlja2V0AAEBBQEADBxpbnZpdGVyABh0aWNrZXQAJHNpZ25hdHVyZS0GAQEFAQAMFGluZGV4BBBraW5k4QIIaWQgAQEFAQAEGHRpY2tldAABAQUBAAgcYWNjb3VudAAUY291bnQEAQEFAQAIHGFjY291bnQAFGxpbWl0BAEBBQEABBhjb25maWflAgEBBQEACDxyZWZlcnJlZF92YWx1ZXNRBjxyZWZlcnJlcl92YWx1ZXNRBgEBBQEBBQEACChhY2NvdW50X2lkACRqdWRnZW1lbnTJAgEBBQEACChhY2NvdW50X2lkACBmYWlsdXJlcwQBAQUBAAgoYWNjb3VudF9pZAAscGVyc29uYWxfaWQIAQEFAQAIIHJlZmVycmVyCCByZWZlcnJlZAABAQUBAAgoYWNjb3VudF9pZAAscmVzZXJ2ZWRfaWQIAQEFAQAIIHJlZmVycmVyCBh0aWNrZXQAAQEFAQAIKGFjY291bnRfaWQAIHJlZmVycmVyCAEBBQEADBRpbmRleAQQa2luZOECCGlkIAEBBQEABBxpbnZpdGVyAAEBBQEACAx3aG8AHGludml0ZXIAAQEFAQAEIHJlZmVycmVyCAEBBQEACBxhY2NvdW50ABRjb3VudAQBAQUBAAgcaW52aXRlcgAYdGlja2V0AAEBBQEABBhjb25maWflAgEBBQBtBgC1BwAEALUHAJ0CAO0CALkHAO0CAMkHAQEFANkHAAQABADtAgDZAgCxBADtAgDZAwDtAgEBBQBpBgAgAAAAAAApBgEBBQDdBwDtAgDhBwEABDhpZGVudGlmaWVyX2tleSkGAQEFAQAMOGlkZW50aWZpZXJfa2V5KQZEc3RhdGVtZW50X2FjY291bnQADHNpZy0GAQEFAQAELGZ1bGxfcmVwb3J0YQYBAQUBAAQYcGxheWVyAAEBBQEABDxnYW1lc19zY2hlZHVsZXNpBgEBBQEABDhnYW1lX3BsYXlfdGltZQQBAQUBAAQsYmVuZWZpY2lhcnkAAQEFAQAUHHBvb2xfaWQEKHJpbmdfaW5kZXgEIHJldmlzaW9uBBRwcm9vZo0BLGJlbmVmaWNpYXJ5AAEBBQEABBhwaGFzZXNtBgEBBQEBBQEADERyZWdpc3RyYXRpb25fZW5kcwQkZ2FtZV9kYXRlBCxyZXBvcnRfZW5kcwQBAQUBAAQMd2hv7QIBAQUBAAgMd2hv7QIoZ2FtZV9pbmRleAQBAQUBAAQYcGxheWVy7QIBAQUBAAQ4Z2FtZV9wbGF5X3RpbWUEAQEFAQAEKGdhbWVfaW5kZXgEAQEFAQAILGJlbmVmaWNpYXJ5ABhhbW91bnQIAQEFAQAIKGdhbWVfaW5kZXgEHHBvb2xfaWQEAQEFAQAIKGdhbWVfaW5kZXgEFGVycm9y2ADtAgDtBwEBBQCBBgEBBQC9BADxBwAEAAQA9QcBAQUA+QcBAQUAAQgBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAEBBQEACCxyb3VuZF9pbmRleAQUbGltaXQEAQEFAQAEDGtleXkGAQEFAQAEIHNjaGVkdWxlgQYBAQUBAQUBAAwMd2hv7QIsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAgMd2hv7QIccmVzdW1lZBQBAQUBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAAIAAUIAQAEFGNvdW50BAEBBQEABAhpZAgBAQUBAAQwaWRzX2FuZF9rZXlzjQYBAQUBAAQMaWRzkQYBAQUBAQUBAAQIaWQIAAAADQgBABQkY2FuZGlkYXRlAExjYW5kaWRhdGVfc2lnbmF0dXJlLQYwcmluZ192cmZfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBlRjb25zdW1lcl9yZWdpc3RyYXRpb26dBgEBBQEACBxhY2NvdW50ADh2YWxpZF9hdF9ibG9jawQBAQUBAQUBAAQgdmVyaWZpZXIAAQEFAQAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIAAAAAFQgAGQgAHQgAJQgAnQIAIAApCAAZCACdAgAkAAAAJAAxCAEBBQA1CAEDAAAEAQMIBAQAIAEADDhpZGVudGlmaWVyX2tleSkGIHVzZXJuYW1lJERyZXNlcnZlZF91c2VybmFtZS0DAQEFAQAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mLQY8dXNlcm5hbWVfY2hvaWNlpQYBAQUBAAggdXNlcm5hbWUkHGFjY291bnQAAQEFAQAEIGR1cmF0aW9uCAEBBQEACCRyZWZlcmVuY2WpBihhY2NvdW50X2lkAAEBBQEACBxhY2NvdW50AAxzZXEEAQEFAQAMGHBlcmlvZAQMc2VxBDh0YXJnZXRfYWNjb3VudAABAQUBAAgYcGVyaW9kBCxmaXJzdF9lbnRyeSABAQUBAAwYcGVyaW9kBBxjb3VudGVyBChhY2NvdW50X2lkAAEBBQEACBhwZXJpb2QEFGxpbWl0BAEBBQEBBQEACBRhbGlhcyAcYWNjb3VudAABAQUBABAUYWxpYXMgGHBlcmlvZAQMc2VxBBxhY2NvdW50AAEBBQEACCB1c2VybmFtZSQcYWNjb3VudAABAQUBAAQgZHVyYXRpb24IAQEFAQAMGHBlcmlvZAQkZmlyc3Rfa2V5IBRjb3VudAQBAQUBABQUYWxpYXMgGHBlcmlvZAQcY291bnRlcgQcYWNjb3VudAAoY29sbGVjdGlvbn0BAQEFAQAIGHBlcmlvZAQUY291bnQEADkIAD0IADkIACABAAw0cmluZ19leHBvbmVudAUDKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJAEBBQEACDRyaW5nX2V4cG9uZW50BQMscGFnZV9oYXNoZXPRAgEBBQEBBQEACDRyaW5nX2V4cG9uZW50BQMsdG90YWxfcGFnZXMEAQEFAQAMNHJpbmdfZXhwb25lbnQFAyxzdGFydF9pbmRleAQUY291bnQEACAASQgAQQgA0QIATQgAWQgAXQgAYQgAZQgA0QIATQgAaQgATQgA2QIAbQgAcQgAIAB1CABNCACdAgAgAEEDAE0IANECAGUIAJ0CAQAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgEAQEFAQAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQBAQUBAAwoaWRlbnRpZmllciAYbWVtYmVyIDRjYWxsX3ZhbGlkX2F0CAEBBQEAFChpZGVudGlmaWVyIChyaW5nX2luZGV4BDRyaW5nX2V4cG9uZW50BQMgcmV2aXNpb24EKHRvX2luY2x1ZGUEAQEFAQAMKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEEGhlYWQEAQEFAQAMKGlkZW50aWZpZXIgMGluaXRpYWxfaGVhZAQgbmV3X2hlYWQEAQEFAQAIKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEAQEFAQAMKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEKHBhZ2VfaW5kZXgEAQEFAQAIKGlkZW50aWZpZXIgKHBhZ2VfaW5kZXgEAQEFAQAEKGlkZW50aWZpZXIgAQEFAQAMKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEFGxpbWl0BAEBBQEBBQEABAxrZXkgAQEFAQAEKGlkZW50aWZpZXIgAQEFAQAIKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgEAQEFAQAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgEAQEFAQAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQBAQUBAAgoaWRlbnRpZmllciAMa2V5IAEBBQEADChpZGVudGlmaWVyIChyaW5nX2luZGV4BCByZXZpc2lvbgQAAACJAQAAAH0IANkDAJ0CAAQAnQIAgQgAnQIAsQQAnQIAIACdAgAhCACdAgAoAJ0CACgABAEBBQCdAgEDAACFCAEDCAQEAIkIAQMIBAQAZQMBAwgEBACJCAEDCAQEAGUDAQMAAIUCAQMAAAgBAwQAAI0IAQMEAACFAgEDBCAAZQMBAwQgABQBAwgEBADRAgEDCAQEANECAQMMBAQgABQBAwwEBCAAFAEDCAQgABQBAwAAGAEABChzcGxpdF9pbnRvvQYBAQUBAAQIdG8AAQEFAQAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcEkGAQEFAQAQMHByZXNlcnZhdGlvbsEGFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBgEBBQEABBRpdGVtc8kGAQEFAQAUHGFsaWFzZXPRAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwABAQUBABwcYWxpYXNlc9ECFHZhbHVlBBRpbmRleAQgcmV2aXNpb24ECHRvAFRleHRlcm5hbF9hc3NldF9hbW91bnQIMG5ld192b3VjaGVyc90DAQEFAQAQFGlucHV0zQYwYWxpYXNfcHJvb2ZzkQEIdG8AMGZlZV9jdXJyZW5jeREDAQEFAQAQGGlucHV0c9EGMGFsaWFzX3Byb29mc5EBCHRvADBmZWVfY3VycmVuY3kRAwEBBQEAGBxhbGlhc2Vz0QIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQoc3BsaXRfaW50b70GHG1heF9mZWUIAQEFAQAEFHZhbHVlBAEBBQEABBhwZXJpb2QEAQEFAQAIGHBlcmlvZAQocmluZ19pbmRleAQBAQUBAQUBAAQwb3V0cHV0X2NvdW50BAEBBQEADAh0bwAUdmFsdWUEHG5ld19hZ2UEAQEFAQAEFHZhbHVlBAEBBQEADAx3aG8AFHZhbHVlBBhhbW91bnQIAQEFAQAQCHRvACxpbnB1dF92YWx1ZQQwb3V0cHV0X3ZhbHVlBCxpbnB1dF9jb3VudAQBAQUBABAIdG8AFHZhbHVlBCxpbnB1dF9jb3VudAQYYW1vdW50CAEBBQEAFAh0bwAUdmFsdWUELGlucHV0X2NvdW50BFRleHRlcm5hbF9hc3NldF9hbW91bnQINHZvdWNoZXJfY291bnQEAQEFAQAIDGZlZQgkZGVzdHJveWVkCAEBBQEACAx3aG8ADGZlZQgBAQUBAAQYcGVyaW9kBAEBBQEADAh0bwAwb3V0cHV0X3ZhbHVlBCxpbnB1dF9jb3VudAQBAQUBAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIAQEFAQAUDHdobwAIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIMGZlZV9jdXJyZW5jeREDAQEFAQAMCHRvABR2YWx1ZQQYYW1vdW50CAEBBQEADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CAEBBQEACBhwZXJpb2QEKHJpbmdfaW5kZXgEAAQAkQgBAQUAlQgAmQgAnQIABACdCAAgANkCAQEFAKEIANkDAAgBAAxcc3Vic2NyaWJlcl9wYXJhY2hhaW5faWQETG1lbWJlcnNfY29sbGVjdGlvbnPdBjBwYWxsZXRfaW5kZXgEAQEFAQAEXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkZQMBAQUBAAxcc3Vic2NyaWJlcl9wYXJhY2hhaW5faWQEKGlkZW50aWZpZXIgRHJpbmdfcm9vdF9pbmRpY2Vz2QIBAQUBAAQkc2VuZF9wYWdlBAEBBQEACBxwYXJhX2lkBCBzZXF1ZW5jZQgBAQUBAAwccGFyYV9pZARgY3VycmVudF9jb2xsZWN0aW9uX2luZGV4BEBhZnRlcl9yaW5nX2luZGV4ZQMBAQUBAQUBAAQccGFyYV9pZAQBAQUBAAgccGFyYV9pZAQwdXBkYXRlX2NvdW50BAEBBQEADBxwYXJhX2lkBChpZGVudGlmaWVyIDRpbmRpY2VzX2NvdW50BAEBBQEABCBzZXF1ZW5jZQgBAQUApQgBAAQcZW5hYmxlZBQBAQUBAQUBAAQccG9vbF9pZAQBAQUBAAQcZW5hYmxlZBQBAQUAqQgABACxCADxBwCdAgEAHBh0YXJnZXQlAyhkaXNwYXRjaGVyACB2YWxpZGl0eQQobnVtX3ByaXplcwQscHJpemVfdmFsdWUIIGFzc2V0X2lkVQEwd2lubmVyX3JhdGlvBAEBBQEAGBxwb29sX2lkBChyaW5nX2luZGV4BCByZXZpc2lvbgQUcHJvb2aNARRhbGlhcyAsYmVuZWZpY2lhcnkAAQEFAQAEHHBvb2xfaWQEAQEFAQEFAQAcCGlkBChkaXNwYXRjaGVyABh0YXJnZXQlAyBhc3NldF9pZFUBKG51bV9wcml6ZXMELHByaXplX3ZhbHVlCChleHBpcmVzX2F0CAEBBQEAFBxwb29sX2lkBCBjbGFpbWFudO0CLGJlbmVmaWNpYXJ5ACBhc3NldF9pZFUBGGFtb3VudAgBAQUBAAgIaWQEIGFzc2V0X2lkVQEBAQUBAAwIaWQEIGFzc2V0X2lkVQEgcmVmdW5kZWQIAQEFAQAQHHBvb2xfaWQELGJlbmVmaWNpYXJ5ACBhc3NldF9pZFUBGGFtb3VudAgBAQUA8QYAJACdAgEDAAC1CAEDAAC9CAEDAACFAwEDAADBCAEABBhjdXJzb3L1BgEBBQEADBRpbmRleAQwaW5uZXJfY3Vyc29yLQMoc3RhcnRlZF9hdGUDAQEFAQAEIHNlbGVjdG9y+QYBAQUBAQUBAAQobWlncmF0aW9ucwQBAQUBAAgUaW5kZXgEEHRvb2sEAQEFAQAELG5leHRfY3Vyc29yLQMBAwAA0QIBAwggCAAUAQMAAHkDAQMExQgAnQIBAwTxAwDJCAEDAAAkAQMEBAAtAwEDAADZAgEDCM0IJADVCAEDBCQA5QgBAwAA8QMBAwTtCACFAwEDCMUI7QgA8QgBAwz1CCQgAP0IAQME8QMAnQIBAwgkLQMAAQkBAwQkAA0JAQMEAAAEAQMIJAQAEQkBAwgkBAAdCQEDBBgACAEDBAQACAEDCAEHBAARCQEDCAEHBAAdCQEDBAQAKQkBAwRFBQAtCQEDCBj1BAAxCQEDDIECRQX1BAA1CQEDDJ0BAQcEAGEJAQMIgQJFBQBpCQEDBIECAHEJAQMIIBQA2QIBAwTxAwB1CQEDBCQAeQkBAwR9CQAtAwEDAACBCYUJAQEBAgEDABAQZnJlZQggcmVzZXJ2ZWQIGGZyb3plbggUZmxhZ3MIABQUbm9uY2UEJGNvbnN1bWVycwQkcHJvdmlkZXJzBCxzdWZmaWNpZW50cwQQZGF0YQwBAAAIIHJlZl90aW1lCChwcm9vZl9zaXplCAAMGG5vcm1hbBgsb3BlcmF0aW9uYWwYJG1hbmRhdG9yeRgFAYAFAAUBEAIUKFByZVJ1bnRpbWUAAwgoJCRDb25zZW5zdXMAAwgoJBBTZWFsAAMIKCQUT3RoZXIBJGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAEFBCwAAgw4QXBwbHlFeHRyaW5zaWMBBDBGaW5hbGl6YXRpb24AAQU4SW5pdGlhbGl6YXRpb24AAQUCDBhOb3JtYWwAAQUsT3BlcmF0aW9uYWwAAQUkTWFuZGF0b3J5AAEFAggMWWVzAAEFCE5vAAEFAAwYd2VpZ2h0GBRjbGFzczggcGF5c19mZWU8AiQ8SW52YWxpZFNwZWNOYW1lAAEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAAEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAAEFTE5vbkRlZmF1bHRDb21wb3NpdGUAAQU8Tm9uWmVyb1JlZkNvdW50AAEFMENhbGxGaWx0ZXJlZAABBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcAAQVETm90aGluZ0F1dGhvcml6ZWQAAQUwVW5hdXRob3JpemVkAAEFAhhMT3ZlcmxhcHBpbmdVcGdyYWRlcwABBVBQcm9oaWJpdGVkQnlQb2xrYWRvdAABBRhUb29CaWcAAQVoVmFsaWRhdGlvbkRhdGFOb3RBdmFpbGFibGUAAQV0SG9zdENvbmZpZ3VyYXRpb25Ob3RBdmFpbGFibGUAAQUwTm90U2NoZWR1bGVkAAEFAjA4VmVzdGluZ0JhbGFuY2UAAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAAEFTEluc3VmZmljaWVudEJhbGFuY2UAAQVIRXhpc3RlbnRpYWxEZXBvc2l0AAEFNEV4cGVuZGFiaWxpdHkAAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUAAQUsRGVhZEFjY291bnQAAQU8VG9vTWFueVJlc2VydmVzAAEFMFRvb01hbnlIb2xkcwABBThUb29NYW55RnJlZXplcwABBUxJc3N1YW5jZURlYWN0aXZhdGVkAAEFJERlbHRhWmVybwABBQIIHE5vVXNhZ2UAAQUcTm90WmVybwABBQJgKEJhbGFuY2VMb3cAAQUkTm9BY2NvdW50AAEFME5vUGVybWlzc2lvbgABBRxVbmtub3duAAEFGEZyb3plbgABBRRJblVzZQABBShCYWRXaXRuZXNzAAEFOE1pbkJhbGFuY2VaZXJvAAEFTFVuYXZhaWxhYmxlQ29uc3VtZXIAAQUsQmFkTWV0YWRhdGEAAQUoVW5hcHByb3ZlZAABBSBXb3VsZERpZQABBTRBbHJlYWR5RXhpc3RzAAEFJE5vRGVwb3NpdAABBSRXb3VsZEJ1cm4AAQUkTGl2ZUFzc2V0AAEFMEFzc2V0Tm90TGl2ZQABBTxJbmNvcnJlY3RTdGF0dXMAAQUkTm90RnJvemVuAAEFOENhbGxiYWNrRmFpbGVkAAEFKEJhZEFzc2V0SWQAAQU8Q29udGFpbnNGcmVlemVzAAEFNENvbnRhaW5zSG9sZHMAAQU8VG9vTWFueVJlc2VydmVzAAEFAgQwVG9vTWFueUhvbGRzAAEFAgxAVW5rbm93bkFzc2V0S2luZAABBTRBbHJlYWR5RXhpc3RzAAEFIE92ZXJmbG93AAEFAkREVG9vTWFueUNhbmRpZGF0ZXMAAQVcVG9vRmV3RWxpZ2libGVDb2xsYXRvcnMAAQVAQWxyZWFkeUNhbmRpZGF0ZQABBTBOb3RDYW5kaWRhdGUAAQVQVG9vTWFueUludnVsbmVyYWJsZXMAAQVMQWxyZWFkeUludnVsbmVyYWJsZQABBTxOb3RJbnZ1bG5lcmFibGUAAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQVYVmFsaWRhdG9yTm90UmVnaXN0ZXJlZAABBWxJbnNlcnRUb0NhbmRpZGF0ZUxpc3RGYWlsZWQAAQV0UmVtb3ZlRnJvbUNhbmRpZGF0ZUxpc3RGYWlsZWQAAQU0RGVwb3NpdFRvb0xvdwABBWRVcGRhdGVDYW5kaWRhdGVMaXN0RmFpbGVkAAEFQEluc3VmZmljaWVudEJvbmQAAQVQVGFyZ2V0SXNOb3RDYW5kaWRhdGUAAQVASWRlbnRpY2FsRGVwb3NpdAABBUBJbnZhbGlkVW5yZXNlcnZlAAEFAhQwSW52YWxpZFByb29mAAEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAEFNER1cGxpY2F0ZWRLZXkAAQUYTm9LZXlzAAEFJE5vQWNjb3VudAABBQIUOEJhZFF1ZXVlQ29uZmlnAAEFQEFscmVhZHlTdXNwZW5kZWQAAQU4QWxyZWFkeVJlc3VtZWQAAQV0VG9vTWFueUFjdGl2ZU91dGJvdW5kQ2hhbm5lbHMAAQUYVG9vQmlnAAEFAqQgT3ZlcmZsb3cAAQU0VW5pbXBsZW1lbnRlZAABBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgABBTBMb2NhdGlvbkZ1bGwAAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAEFJEJhZE9yaWdpbgABBTxJbnZhbGlkTG9jYXRpb24AAQU0QXNzZXROb3RGb3VuZAABBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQAAQU8Tm90V2l0aGRyYXdhYmxlAAEFSExvY2F0aW9uQ2Fubm90SG9sZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBTBVbmtub3duQ2xhaW0AAQU4RmFpbGVkVG9EZWNvZGUAAQVATWF4V2VpZ2h0SW52YWxpZAABBThOb3RIb2xkaW5nRmVlcwABBTBUb29FeHBlbnNpdmUAAQUQVHJhcAABBUBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBTRUb29NYW55QXNzZXRzAAEFTFVuaGFuZGxlZFhjbVZlcnNpb24AAQVIV2VpZ2h0TGltaXRSZWFjaGVkAAEFHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQJwLFVucmVhY2hhYmxlAAEFLFNlbmRGYWlsdXJlAAEFIEZpbHRlcmVkAAEFSFVud2VpZ2hhYmxlTWVzc2FnZQABBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUAAQUURW1wdHkAAQU4Q2Fubm90UmVhbmNob3IAAQU0VG9vTWFueUFzc2V0cwABBTRJbnZhbGlkT3JpZ2luAAEFKEJhZFZlcnNpb24AAQUsQmFkTG9jYXRpb24AAQU4Tm9TdWJzY3JpcHRpb24AAQVEQWxyZWFkeVN1YnNjcmliZWQAAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAABBShMb3dCYWxhbmNlAAEFMFRvb01hbnlMb2NrcwABBUxBY2NvdW50Tm90U292ZXJlaWduAAEFKEZlZXNOb3RNZXQAAQUwTG9ja05vdEZvdW5kAAEFFEluVXNlAAEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAAEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQABBTxUb29NYW55UmVzZXJ2ZXMAAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAAEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwABBTRFeHBpcmVzSW5QYXN0AAEFNEFsaWFzTm90Rm91bmQAAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAAAIFGluZGV4BBRlcnJvcmwCJCxOb3RSZWFwYWJsZQABBRhOb1BhZ2UAAQUkTm9NZXNzYWdlAAEFQEFscmVhZHlQcm9jZXNzZWQAAQUYUXVldWVkAAEFSEluc3VmZmljaWVudFdlaWdodAABBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUAAQUsUXVldWVQYXVzZWQAAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAABBQIEMFRvb01hbnlDYWxscwABBQI4QE1pbmltdW1UaHJlc2hvbGQAAQU8QWxyZWFkeUFwcHJvdmVkAAEFRE5vQXBwcm92YWxzTmVlZGVkAAEFRFRvb0Zld1NpZ25hdG9yaWVzAAEFSFRvb01hbnlTaWduYXRvcmllcwABBVRTaWduYXRvcmllc091dE9mT3JkZXIAAQVMU2VuZGVySW5TaWduYXRvcmllcwABBSBOb3RGb3VuZAABBSBOb3RPd25lcgABBSxOb1RpbWVwb2ludAABBThXcm9uZ1RpbWVwb2ludAABBUxVbmV4cGVjdGVkVGltZXBvaW50AAEFPE1heFdlaWdodFRvb0xvdwABBTRBbHJlYWR5U3RvcmVkAAEFAgQsUmVxdWlyZVN1ZG8AAQUCIBxUb29NYW55AAEFIE5vdEZvdW5kAAEFIE5vdFByb3h5AAEFLFVucHJveHlhYmxlAAEFJER1cGxpY2F0ZQABBTBOb1Blcm1pc3Npb24AAQUsVW5hbm5vdW5jZWQAAQUsTm9TZWxmUHJveHkAAQUCpEhUb29NYW55U3ViQWNjb3VudHMAAQUcTm9BbGlhcwABBSBOb3RGb3VuZAABBSBOb3ROYW1lZAABBShFbXB0eUluZGV4AAEFKEZlZUNoYW5nZWQAAQUoTm9JZGVudGl0eQABBTxTdGlja3lKdWRnZW1lbnQAAQU4SnVkZ2VtZW50R2l2ZW4AAQVASW52YWxpZEp1ZGdlbWVudAABBTBJbnZhbGlkSW5kZXgAAQU0SW52YWxpZFRhcmdldAABBURUb29NYW55UmVnaXN0cmFycwABBThBbHJlYWR5Q2xhaW1lZAABBTxBbHJlYWR5UmVwb3J0ZWQAAQUYTm90U3ViAAEFIE5vdE93bmVkAAEFdEp1ZGdlbWVudEZvckRpZmZlcmVudElkZW50aXR5AAEFWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAAQU0SW52YWxpZFN1ZmZpeAABBVBOb3RVc2VybmFtZUF1dGhvcml0eQABBTBOb0FsbG9jYXRpb24AAQVASW52YWxpZFNpZ25hdHVyZQABBURSZXF1aXJlc1NpZ25hdHVyZQABBTxJbnZhbGlkVXNlcm5hbWUAAQU0VXNlcm5hbWVUYWtlbgABBShOb1VzZXJuYW1lAAEFZE5vdFN5c3RlbVByb3ZpZGVkVXNlcm5hbWUAAQUoTm90RXhwaXJlZAABBSBUb29FYXJseQABBTBOb3RVbmJpbmRpbmcAAQVAQWxyZWFkeVVuYmluZGluZwABBVhJbnN1ZmZpY2llbnRQcml2aWxlZ2VzAAEFKEJhZENvbnRleHQAAQVMVW5leHBlY3RlZEp1ZGdlbWVudAABBTBOb3RTdXBwb3J0ZWQAAQUYQmFubmVkAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFREp1ZGdlbWVudExpc3RGdWxsAAEFbExhc3RVc2VybmFtZVJlcG9ydFRvb1JlY2VudAABBWBVc2VybmFtZUp1ZGdlbWVudE9uZ29pbmcAAQUClCROb3RQZXJzb24AAQUUTm9LZXkAAQU4SW52YWxpZENvbnRleHQAAQU4SW52YWxpZEFjY291bnQAAQUwQWNjb3VudEluVXNlAAEFMEludmFsaWRQcm9vZgABBUBJbnZhbGlkU2lnbmF0dXJlAAEFJE5vTWVtYmVycwABBShJbmNvbXBsZXRlAAEFKFN0aWxsRnJlc2gAAQU4VG9vTWFueU1lbWJlcnMAAQU8S2V5QWxyZWFkeUluVXNlAAEFLEtleU5vdEZvdW5kAAEFMENvdWxkTm90UHVzaAABBRxTYW1lS2V5AAEFVFBlcnNvbmFsSWROb3RSZXNlcnZlZAABBYBQZXJzb25hbElkUmVzZXJ2YXRpb25DYW5ub3RSZW5ldwABBZBQZXJzb25hbElkTm90UmVzZXJ2ZWRPck5vdFJlY29nbml6ZWQAAQUsSW52YWxpZFJpbmcAAQVIU3VzcGVuc2lvbnNQZW5kaW5nAAEFXFJpbmdBYm92ZU1lcmdlVGhyZXNob2xkAAEFSEludmFsaWRTdXNwZW5zaW9ucwABBUROb011dGF0aW9uU2Vzc2lvbgABBXBDb3VsZE5vdFN0YXJ0TXV0YXRpb25TZXNzaW9uAAEFbFN1c3BlbnNpb25TZXNzaW9uSW5Qcm9ncmVzcwABBTRBbGlhc05vdFN0YWxlAAEFOFRpbWVPdXRPZlJhbmdlAAEFWEFsaWFzQWNjb3VudEFscmVhZHlTZXQAAQUwTm90U3VzcGVuZGVkAAEFJFN1c3BlbmRlZAABBUxJbnZhbGlkS2V5TWlncmF0aW9uAAEFTEtleUFscmVhZHlTdXNwZW5kZWQAAQVUSW52YWxpZE9uYm9hcmRpbmdTaXplAAEFQEludmFsaWRNZW1iZXJLZXkAAQV0UGVvcGxlQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQU0QWxpYXNNaXNtYXRjaAABBThOb1N0YWxlQWxpYXNlcwABBQJQKE5vU3VjaENhc2UAAQUoTm9TdWNoVm90ZQABBRxOb3RPcGVuAAEFHE5vdFJpcGUAAQUcTm90RG9uZQABBShDb2RlY0Vycm9yAAEFNERpc3BhdGNoRXJyb3IAAQUYUmVjZW50AAEFIE5vQ3JlZGl0AAEFIE5vUmV3YXJkAAEFIE5vUG9pbnRzAAEFNFRvb01hbnlDbGFpbXMAAQUgTm9QYXlvdXQAAQVIQXJpdGhtZXRpY092ZXJmbG93AAEFQFRvb01hbnlTY2hlZHVsZXMAAQUoTm9TY2hlZHVsZQABBSROb1BlbmFsdHkAAQUURWFybHkAAQUwVW5kZXJQZW5hbHR5AAEFWENhc2VFeHBpcmF0aW9uRGlzYWJsZWQAAQUCoChJblByb2dyZXNzAAEFKE5vUmVmZXJyYWwAAQUoQmFkQ29udGV4dAABBUxVbmV4cGVjdGVkSnVkZ2VtZW50AAEFGE5vQXJncwABBShOb3RBcHBsaWVkAAEFLE5vdFNlbGVjdGVkAAEFJE5vdFByb3ZlbgABBThBbHJlYWR5U3RhcnRlZAABBShPdXRPZlJhbmdlAAEFMEFscmVhZHlUYWtlbgABBTxOb01vcmVSZWZlcnJhbHMAAQUgVG9vRWFybHkAAQU0RGVzaWduSW52YWxpZAABBSxEZXNpZ25UYWtlbgABBSRCYWRQYXJlbnQAAQUkQmFkRmFtaWx5AAEFLFdyb25nRmFtaWx5AAEFLEluZGV4VG9vQmlnAAEFEEJ1c3kAAQUYQmFubmVkAAEFKEltcHJvYmFibGUAAQUoSWRSZXNlcnZlZAABBRhJZFVzZWQAAQU0SW52YWxpZFRpY2tldAABBSBOb1RpY2tldAABBTROb3RBdXRob3JpemVkAAEFJE5vdFBlcnNvbgABBURSZWZlcnJlZENhbmRpZGF0ZQABBVBOb3RSZWZlcnJlZENhbmRpZGF0ZQABBUhOb1Jld2FyZFRvUmVnaXN0ZXIAAQVAUmV3YXJkVG9SZWdpc3RlcgABBSROb0ludml0ZXIAAQVASW52YWxpZFNpZ25hdHVyZQABBSROb0ludml0ZXMAAQU4QWxyZWFkeUludml0ZWQAAQUoTm9SZWZlcnJlcgABBTBOb3RQb2lQZXJzb24AAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQVoSW52YWxpZFJlaW1idXJzZW1lbnRWYWx1ZXMAAQUCiCxHYW1lT25nb2luZwABBThOb1JlZ2lzdHJhdGlvbgABBURPdXRkYXRlZEdhbWVTZXR1cAABBUBJbnZhbGlkR2FtZVNldHVwAAEFNEludmFsaWRSZXBvcnQAAQUYTm9HYW1lAAEFLE5vUmVwb3J0aW5nAAEFNE5vdFJlZ2lzdGVyZWQAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVEUmVwb3J0QWxyZWFkeVNlbnQAAQUURWFybHkAAQVETm90S2lja2FibGVQbGF5ZXIAAQVATm9BcmNoaXZlZFBsYXllcgABBSBOb1RpY2tldAABBSROb0ludml0ZXMAAQU4QWxyZWFkeUludml0ZWQAAQVATm90QWNjb3VudFBsYXllcgABBWhVc2VJbnZpdGVCdXRBbHJlYWR5UGxheWluZwABBVBUb29NYW55R2FtZVNjaGVkdWxlcwABBUxOb1N1Y2hHYW1lU2NoZWR1bGVkAAEFgEludmFsaWRTdGF0ZW1lbnRBY2NvdW50U2lnbmF0dXJlAAEFcFN0YXRlbWVudEFjY291bnRBbHJlYWR5SW5Vc2UAAQVkSW50ZXJuYWxFcnJvckludmFsaWRTdGF0ZQABBUBJbnZhbGlkR2FtZVN0YXRlAAEFIE5vUGxheWVyAAEFkENhbm5vdE9mZmJvYXJkV2hpbGVSZWdpc3RlcmVkRm9yR2FtZQABBTBJbnZhbGlkU3RhdGUAAQU8Tm9TY3JhdGNoUmV3YXJkAAEFLE5vdEVsaWdpYmxlAAEFJERpZE5vdFdpbgABBThBbHJlYWR5Q2xhaW1lZAABBTxTY3JhdGNoUG90RW1wdHkAAQU4UG9vbE5vdEZvckdhbWUAAQU4Tm90UGFydGljaXBhbnQAAQUCVCROb3RQZXJzb24AAQVcSGFzTm90UmVhY2hlZFBlcnNvbmhvb2QAAQUgTm9SZXdhcmQAAQUcTm9TY29yZQABBShOb1NjaGVkdWxlAAEFQFRvb01hbnlTY2hlZHVsZXMAAQUoUmVjb2duaXplZAABBTxDYXNoT3V0Q29vbGRvd24AAQVgUm91bmRPbkdvaW5nT3JOb1NjaGVkdWxlAAEFHE5vUm91bmQAAQVsQmFkT3JpZ2luTm90UGVyc29uTm90U2lnbmVkAAEFwEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZE5vdEFjY291bnRQYXJ0aWNpcGFudAABBZxCYWRPcmlnaW5Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQAAQVQQWxyZWFkeVBhcnRpY2lwYXRpbmcAAQVES2V5TXVzdEJlUHJvdmlkZWQAAQVQS2V5TXVzdE5vdEJlUHJvdmlkZWQAAQVQSGFzUmVhY2hlZFBlcnNvbmhvb2QAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU4V2luZG93VG9vTGFyZ2UAAQVUQWxsb3dlZE1pc3Nlc1Rvb0xhcmdlAAEFRFNjaGVkdWxlTm90U29ydGVkAAEFAhAkTm90UGVyc29uAAEFME5vdFN1c3BlbmRlZAABBSxOb3RSZXNlcnZlZAABBTRUb29NYW55UGVvcGxlAAEFAixYTm9BdHRlc3RhdGlvbkFsbG93YW5jZQABBWxJbnZhbGlkQXR0ZXN0YXRpb25TaWduYXR1cmUAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQU8S2V5QWxyZWFkeUluVXNlAAEFMEFjY291bnRJblVzZQABBVhBbGlhc0FjY291bnRBbHJlYWR5U2V0AAEFSEFsaWFzQWNjb3VudE5vdFNldAABBUxDYWxsQmxvY2tPdXRPZlJhbmdlAAEFTEludmFsaWRBbGlhc0NvbnRleHQAAQV4TGl0ZVBlb3BsZUNvbGxlY3Rpb25Ob3RDcmVhdGVkAAEFAmA8SW52YWxpZFVzZXJuYW1lAAEFNFVzZXJuYW1lVGFrZW4AAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU0Tm90UmVnaXN0ZXJlZAABBTROb3RGdWxsUGVyc29uAAEFNFRvdWNoTm90UmVhZHkAAQU0Tm9SZXNlcnZhdGlvbgABBVBOb3RSZXNlcnZhdGlvbkhvbGRlcgABBWBVc2VybmFtZVJlc2VydmF0aW9uVGFrZW4AAQVAUmVzZXJ2YXRpb25GcmVzaAABBUBOb0xpbmtlZElkZW50aXR5AAEFNEFscmVhZHlMaW5rZWQAAQVQUGVyc29uQXV0aE5vdEV4cGlyZWQAAQU4QWxyZWFkeURlbW90ZWQAAQUkUXVldWVGdWxsAAEFKE5vdEluUXVldWUAAQVUQWxyZWFkeUhhc1Jlc2VydmF0aW9uAAEFcEludmFsaWRGcmllbmRSZXF1ZXN0U2VxdWVuY2UAAQVoSW52YWxpZEZyaWVuZFJlcXVlc3RQZXJpb2QAAQWMRnJpZW5kUmVxdWVzdFJlZ2lzdHJhdGlvbk5vdEV4cGlyZWQAAQWYRnJpZW5kUmVxdWVzdFJlZ2lzdHJhdGlvbkFscmVhZHlFeGlzdHMAAQVwU3RtdFN0b3JlUmVwbGFjZW1lbnRUb29FYXJseQABBYxMb25nVGVybVN0b3JhZ2VDbGVhbnVwTGltaXRFeGNlZWRlZAABBQIMNENodW5rTm90Rm91bmQAAQU0SW52YWxpZENodW5rcwABBURJbnZhbGlkQ2h1bmtSYW5nZQABBQJwJE5vdE1lbWJlcgABBRhOb1Jvb3QAAQUwSW52YWxpZFByb29mAAEFKEluY29tcGxldGUAAQU4VG9vTWFueU1lbWJlcnMAAQU8S2V5QWxyZWFkeUluVXNlAAEFLEtleU5vdEZvdW5kAAEFMENvdWxkTm90UHVzaAABBSxJbnZhbGlkUmluZwABBUhTdXNwZW5zaW9uc1BlbmRpbmcAAQVcUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQAAQVISW52YWxpZFN1c3BlbnNpb25zAAEFQE5vUmVtb3ZhbFNlc3Npb24AAQVsQ291bGROb3RTdGFydFJlbW92YWxTZXNzaW9uAAEFYFJlbW92YWxTZXNzaW9uSW5Qcm9ncmVzcwABBUxLZXlBbHJlYWR5U3VzcGVuZGVkAAEFVEludmFsaWRPbmJvYXJkaW5nU2l6ZQABBUBJbnZhbGlkTWVtYmVyS2V5AAEFSENvbGxlY3Rpb25Ob3RGb3VuZAABBVxDb2xsZWN0aW9uQWxyZWFkeUV4aXN0cwABBUhUb29NYW55Q29sbGVjdGlvbnMAAQVoSW52YWxpZFJpbmdTaXplRm9yRmxleGlibGUAAQVMSW52YWxpZFJpbmdFeHBvbmVudAABBUxQcmVtYXR1cmVPbmJvYXJkaW5nAAEFbENvbGxlY3Rpb25NYXJrZWRGb3JEZWxldGlvbgABBUhOb3RDb2xsZWN0aW9uT3duZXIAAQU0Tm90T25ib2FyZGluZwABBThOb3RoaW5nVG9CdWlsZAABBQJ4UE1lbWJlcktleUFscmVhZHlVc2VkAAEFQEludmFsaWRNZW1iZXJLZXkAAQU0SW50ZXJuYWxFcnJvcgABBVxSZWN5Y2xlckFscmVhZHlVbmxvYWRlZAABBVBJbnZhbGlkQ29uc29saWRhdGlvbgABBUxDb25zb2xpZGF0aW9uVG9vQmlnAAEFPENvaW5WYWx1ZVRvb0JpZwABBURDb2luVmFsdWVUb29TbWFsbAABBVhDb2luVmFsdWVJc0xlc3NUaGFuRmVlAAEFTENvaW5WYWx1ZU91dE9mQm91bmQAAQVgTG9zc3lDb2luVmFsdWVDb252ZXJzaW9uAAEFREludmFsaWRBbGlhc1Byb29mAAEFTE5vVW5sb2FkaW5nUmVjeWNsZXIAAQVUUHJvb2ZBbmRBbGlhc01pc21hdGNoAAEFOE5vdGhpbmdUb0J1aWxkAAEFMFRvb01hbnlSaW5ncwABBVRBZGRyZXNzQWxyZWFkeUhhc0NvaW4AAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQUsRW1wdHlJbnB1dHMAAQVAUmVjeWNsZXJNaXNtYXRjaAABBWBJbnN1ZmZpY2llbnRVbmxvYWRGb3JGZWUAAQVEQWxpYXNOb3RQcmVtYXJrZWQAAQVcSW52YWxpZFJlY3ljbGVyUmV2aXNpb24AAQUwSW52YWxpZFNwbGl0AAEFREZyZXNoQ29pblJlcXVpcmVkAAEFaENhbm5vdENvbnZlcnROYXRpdmVUb0Fzc2V0AAEFaE1heEZlZU5vdEFsbG93ZWRGb3JQcmVwYWlkAAEFSE1heEZlZUV4Y2VlZHNJbnB1dAABBTRJbnZhbGlkTWF4RmVlAAEFeENhbm5vdENyZWF0ZVJlY3ljbGVyQ29sbGVjdGlvbgABBQI0SFN1YnNjcmliZXJOb3RGb3VuZAABBURBbHJlYWR5U3Vic2NyaWJlZAABBUhUb29NYW55U3Vic2NyaWJlcnMAAQVYSW52YWxpZENvbGxlY3Rpb25zTGlzdAABBThUb29NYW55VXBkYXRlcwABBTRYY21TZW5kRmFpbGVkAAEFZE5vdFN1YnNjcmliZWRUb0NvbGxlY3Rpb24AAQVASW52YWxpZFJpbmdJbmRleAABBVhFeGNlZWRzQ2hhbm5lbENhcGFjaXR5AAEFNE5vQmF0Y2hBY3RpdmUAAQU0Tm9QZW5kaW5nSW5pdAABBVBSZXBsYXlDb29sZG93bkFjdGl2ZQABBUBFbXB0eVJpbmdJbmRpY2VzAAEFAjyIUHJpemVNdXN0QmVNb3JlT3JFcXVhbFRvTWluQmFsYW5jZQABBTxWYWxpZGl0eVRvb0xvbmcAAQVAVmFsaWRpdHlUb29TaG9ydAABBSBOb1ByaXplcwABBURJbnN1ZmZpY2llbnRGdW5kcwABBWxUb29NYW55Q29uY3VycmVudFByaXplUG9vbHMAAQU8Tm9TdWNoUHJpemVQb29sAAEFQFByaXplUG9vbEV4cGlyZWQAAQVIUHJpemVQb29sRXhoYXVzdGVkAAEFOEFscmVhZHlDbGFpbWVkAAEFRFBvb2xWYWx1ZU92ZXJmbG93AAEFLFdyb25nVGFyZ2V0AAEFJERpZE5vdFdpbgABBTBJbnZhbGlkUHJvb2YAAQU0QWxpYXNNaXNtYXRjaAABBQIEHE9uZ29pbmcAAQUCsBhTeXN0ZW0BRDxQYXJhY2hhaW5TeXN0ZW0BSCRUaW1lc3RhbXAAAQU0UGFyYWNoYWluSW5mbwABBTRXZWlnaHRSZWNsYWltAAEFIEJhbGFuY2VzAUxIVHJhbnNhY3Rpb25QYXltZW50AAEFSFNraXBGZWVsZXNzUGF5bWVudAABBURPcmlnaW5SZXN0cmljdGlvbgFQGEFzc2V0cwFUMEFzc2V0c0hvbGRlcgFYJEFzc2V0UmF0ZQFcOEFzc2V0VHhQYXltZW50AAEFKEF1dGhvcnNoaXAAAQVEQ29sbGF0b3JTZWxlY3Rpb24BYBxTZXNzaW9uAWQQQXVyYQABBRxBdXJhRXh0AAEFJFhjbXBRdWV1ZQFoLFBvbGthZG90WGNtAXAoQ3VtdWx1c1hjbQABBTBNZXNzYWdlUXVldWUBdBxVdGlsaXR5AXggTXVsdGlzaWcBfBBTdWRvAYA8VmVyaWZ5U2lnbmF0dXJlAAEFFFByb3h5AYQgSWRlbnRpdHkBiBhQZW9wbGUBjBxNb2JSdWxlAZAoUHJvb2ZPZkluawGUEEdhbWUBmBRTY29yZQGcIER1bW15RGltAaAoUGVvcGxlTGl0ZQGkJFJlc291cmNlcwGoNENodW5rc01hbmFnZXIBrBxNZW1iZXJzAbAcQ29pbmFnZQG0PE1lbWJlcnNOb3RpZmllcgG4VFN0b3JhZ2VJbml0aWFsaXphdGlvbgABBWRTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlAAEFHEFpcmRyb3ABvFBNdWx0aUJsb2NrTWlncmF0aW9ucwHAAihARnVuZHNVbmF2YWlsYWJsZQABBTBPbmx5UHJvdmlkZXIAAQUwQmVsb3dNaW5pbXVtAAEFMENhbm5vdENyZWF0ZQABBTBVbmtub3duQXNzZXQAAQUYRnJvemVuAAEFLFVuc3VwcG9ydGVkAAEFQENhbm5vdENyZWF0ZUhvbGQAAQU0Tm90RXhwZW5kYWJsZQABBRxCbG9ja2VkAAEFAgwkVW5kZXJmbG93AAEFIE92ZXJmbG93AAEFOERpdmlzaW9uQnlaZXJvAAEFAggwTGltaXRSZWFjaGVkAAEFHE5vTGF5ZXIAAQUCOEBJbnZhbGlkU3RhdGVSb290AAEFSEluY29tcGxldGVEYXRhYmFzZQABBVBWYWx1ZUF0SW5jb21wbGV0ZUtleQABBTBEZWNvZGVyRXJyb3IAAQUsSW52YWxpZEhhc2gAAQUwRHVwbGljYXRlS2V5AAEFOEV4dHJhbmVvdXNOb2RlAAEFPEV4dHJhbmVvdXNWYWx1ZQABBVxFeHRyYW5lb3VzSGFzaFJlZmVyZW5jZQABBVRJbnZhbGlkQ2hpbGRSZWZlcmVuY2UAAQU0VmFsdWVNaXNtYXRjaAABBTxJbmNvbXBsZXRlUHJvb2YAAQUwUm9vdE1pc21hdGNoAAEFLERlY29kZUVycm9yAAEFAjwUT3RoZXIAAQUwQ2Fubm90TG9va3VwAAEFJEJhZE9yaWdpbgABBRhNb2R1bGUBxERDb25zdW1lclJlbWFpbmluZwABBSxOb1Byb3ZpZGVycwABBUBUb29NYW55Q29uc3VtZXJzAAEFFFRva2VuAcgoQXJpdGhtZXRpYwHMNFRyYW5zYWN0aW9uYWwB0CRFeGhhdXN0ZWQAAQUoQ29ycnVwdGlvbgABBSxVbmF2YWlsYWJsZQABBThSb290Tm90QWxsb3dlZAABBRBUcmllAdQCIEBFeHRyaW5zaWNTdWNjZXNzAAAENGRpc3BhdGNoX2luZm9APEV4dHJpbnNpY0ZhaWxlZAAACDhkaXNwYXRjaF9lcnJvctg0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQAAAQQaGFzaCAoTmV3QWNjb3VudAAABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AAAEHGFjY291bnQAIFJlbWFya2VkAAAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQAAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQAACCRjb2RlX2hhc2ggFGVycm9y2AYgAhhgVmFsaWRhdGlvbkZ1bmN0aW9uU3RvcmVkAAEFZFZhbGlkYXRpb25GdW5jdGlvbkFwcGxpZWQAAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBGxWYWxpZGF0aW9uRnVuY3Rpb25EaXNjYXJkZWQAAQVgRG93bndhcmRNZXNzYWdlc1JlY2VpdmVkAAAEFGNvdW50BGREb3dud2FyZE1lc3NhZ2VzUHJvY2Vzc2VkAAAILHdlaWdodF91c2VkGCBkbXFfaGVhZCBEVXB3YXJkTWVzc2FnZVNlbnQAAAQwbWVzc2FnZV9oYXNo4AIIEEZyZWUAAQUgUmVzZXJ2ZWQAAQUCBBBLZXlzAAEFAgQ4QXV0aG9yaXplQWxpYXMAAQUCCBhQYXlvdXQAAQUYQ3JlZGl0AAEFAgQoUHJvb2ZPZkluawABBQIEIFBsYXlHYW1lAAEFAgQcV3JhcHBlZAABBQIEHEFpcmRyb3AAAQUCIBxTZXNzaW9uAewsUG9sa2Fkb3RYY20B8BxNb2JSdWxlAfQoUHJvb2ZPZkluawH4EEdhbWUB/BRTY29yZQH0HENvaW5hZ2UBAQEcQWlyZHJvcAEFAQIIOEJhbGFuY2VVcGRhdGVkAAEFVEZhaWxlZFRvTXV0YXRlQWNjb3VudAABBQJ4HEVuZG93ZWQAAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAAACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAAAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQAAAgMd2hvABBmcmVlCCBSZXNlcnZlZAAACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAAACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAAAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1c+gcRGVwb3NpdAAACAx3aG8AGGFtb3VudAggV2l0aGRyYXcAAAgMd2hvABhhbW91bnQIHFNsYXNoZWQAAAgMd2hvABhhbW91bnQIGE1pbnRlZAAACAx3aG8AGGFtb3VudAgwTWludGVkQ3JlZGl0AAAEGGFtb3VudAgYQnVybmVkAAAIDHdobwAYYW1vdW50CChCdXJuZWREZWJ0AAAEGGFtb3VudAgkU3VzcGVuZGVkAAAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAAACAx3aG8AGGFtb3VudAggVXBncmFkZWQAAAQMd2hvABhJc3N1ZWQAAAQYYW1vdW50CCRSZXNjaW5kZWQAAAQYYW1vdW50CBhMb2NrZWQAAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAAAIDHdobwAYYW1vdW50CBhGcm96ZW4AAAgMd2hvABhhbW91bnQIGFRoYXdlZAAACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAAACAxvbGQIDG5ldwgQSGVsZAAADBhyZWFzb24JAQx3aG8AGGFtb3VudAgoQnVybmVkSGVsZAAADBhyZWFzb24JAQx3aG8AGGFtb3VudAg4VHJhbnNmZXJPbkhvbGQAABAYcmVhc29uCQEYc291cmNlABBkZXN0ABhhbW91bnQIPFRyYW5zZmVyQW5kSG9sZAAAEBhyZWFzb24JARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCCBSZWxlYXNlZAAADBhyZWFzb24JAQx3aG8AGGFtb3VudAgoVW5leHBlY3RlZAENAQIESFRyYW5zYWN0aW9uRmVlUGFpZAAADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgCEBBSb290AAEFGFNpZ25lZAEAEE5vbmUAAQUoQXV0aG9yaXplZAABBQIgJEJ5R2VuZXNpcwEgGEJ5Rm9yawAACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AAEFGEt1c2FtYQABBSBFdGhlcmV1bQAABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUAAQUsQml0Y29pbkNhc2gAAQVAUG9sa2Fkb3RCdWxsZXRpbgABBQYdAQUBUAIoEFVuaXQAAQUcTW9uaWtlcgEoFEluZGV4AQQkRXhlY3V0aXZlAAEFJFRlY2huaWNhbAABBSxMZWdpc2xhdGl2ZQABBSBKdWRpY2lhbAABBRxEZWZlbnNlAAEFOEFkbWluaXN0cmF0aW9uAAEFIFRyZWFzdXJ5AAEFAhQUVm9pY2UAAQUcTWVtYmVycwAABBRjb3VudAQgRnJhY3Rpb24AAAgMbm9tBBRkZW5vbQREQXRMZWFzdFByb3BvcnRpb24AAAgMbm9tBBRkZW5vbQRITW9yZVRoYW5Qcm9wb3J0aW9uAAAIDG5vbQQUZGVub20EAigkUGFyYWNoYWluAQQsQWNjb3VudElkMzIAAAgcbmV0d29yayEBCGlkIDhBY2NvdW50SW5kZXg2NAAACBxuZXR3b3JrIQEUaW5kZXgIMEFjY291bnRLZXkyMAAACBxuZXR3b3JrIQEMa2V5JQE4UGFsbGV0SW5zdGFuY2UBBDBHZW5lcmFsSW5kZXgBCChHZW5lcmFsS2V5AAAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAAEFJFBsdXJhbGl0eQAACAhpZCkBEHBhcnQtATxHbG9iYWxDb25zZW5zdXMBHQEEMQEBCAQxAQEMBDEBARAEMQEBFAQxAQEYBDEBARwEMQEBIAIkEEhlcmUAAQUIWDEBMQEIWDIBNQEIWDMBOQEIWDQBPQEIWDUBQQEIWDYBRQEIWDcBSQEIWDgBTQEACBxwYXJlbnRzBCBpbnRlcmlvclEBAggMWGNtAVUBIFJlc3BvbnNlAVUBAggUUmVsYXkAAQVAU2libGluZ1BhcmFjaGFpbgEEAAgUYWxpYXMgHGNvbnRleHQgAAwgcmV2aXNpb24EEHJpbmcECGNhYQECCEBQZXJzb25hbElkZW50aXR5AQg0UGVyc29uYWxBbGlhcwFlAQIMWEF1dGhvcml6ZWRBcHBseVdpdGhTaWcBAERSZWZlcnJlZENhbmRpZGF0ZQEAQEludml0ZWRDYW5kaWRhdGUBAAIEHEludml0ZWQBAAIESEFjY291bnRQYXJ0aWNpcGFudAEAAggoTGl0ZVBlcnNvbgEAJExpdGVBbGlhcwFlAQIIGFBlb3BsZQABBShMaXRlUGVvcGxlAAEFAgxIRnJpZW5kUmVxdWVzdEFsaWFzASA4U3RtdFN0b3JlQWxpYXMBIFBMb25nVGVybVN0b3JhZ2VDbGFpbQADCCB9AQIILE1lbWJlckFsaWFzAAMIIGUBLFNlbGZJbmNsdWRlASAACBR2YWx1ZQQMYWdlBAUBUQwEjQEAAggcUHJlcGFpZAABBShGcm9tT3V0cHV0AAAISGZlZV9yZWN5Y2xlcl92YWx1ZQRIZmVlX3JlY3ljbGVyX2luZGV4BAIMEENvaW4AAAgcY29pbl9pZAAQY29pbokBLFVubG9hZFRva2VuAAAMMGFsaWFzX3Byb29mc5EBKHByb3Zlbl9tc2cgDGZlZZUBWEluZmFsbGlibGVVbnBhaWRTaWduZWQAAAQMd2hvAAIsGHN5c3RlbQEZASxQb2xrYWRvdFhjbQFZAShDdW11bHVzWGNtAV0BGFBlb3BsZQFpAShQcm9vZk9mSW5rAW0BEEdhbWUBcQEUU2NvcmUBdQEoUGVvcGxlTGl0ZQF5ASRSZXNvdXJjZXMBgQEcTWVtYmVycwGFARxDb2luYWdlAZkBAgQoRmVlU2tpcHBlZAAABBhvcmlnaW6dAQIYNFBlcnNvbmFsQWxpYXMBIEBQZXJzb25hbElkZW50aXR5AQhEUmVmZXJyZWRDYW5kaWRhdGUBAEhBY2NvdW50UGFydGljaXBhbnQBAEBJbnZpdGVkQ2FuZGlkYXRlAQAoTGl0ZVBlcnNvbgEAAgQwVXNhZ2VDbGVhbmVkAAAEGGVudGl0eaUBAAgccmVzZXJ2ZVUBMHRlbGVwb3J0YWJsZRQErQEAAoAcQ3JlYXRlZAAADCBhc3NldF9pZFUBHGNyZWF0b3IAFG93bmVyABhJc3N1ZWQAAAwgYXNzZXRfaWRVARRvd25lcgAYYW1vdW50CCxUcmFuc2ZlcnJlZAAAECBhc3NldF9pZFUBEGZyb20ACHRvABhhbW91bnQIGEJ1cm5lZAAADCBhc3NldF9pZFUBFG93bmVyABxiYWxhbmNlCCxUZWFtQ2hhbmdlZAAAECBhc3NldF9pZFUBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAME93bmVyQ2hhbmdlZAAACCBhc3NldF9pZFUBFG93bmVyABhGcm96ZW4AAAggYXNzZXRfaWRVAQx3aG8AGFRoYXdlZAAACCBhc3NldF9pZFUBDHdobwAsQXNzZXRGcm96ZW4AAAQgYXNzZXRfaWRVASxBc3NldFRoYXdlZAAABCBhc3NldF9pZFUBREFjY291bnRzRGVzdHJveWVkAAAMIGFzc2V0X2lkVQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcESEFwcHJvdmFsc0Rlc3Ryb3llZAAADCBhc3NldF9pZFUBTGFwcHJvdmFsc19kZXN0cm95ZWQETGFwcHJvdmFsc19yZW1haW5pbmcESERlc3RydWN0aW9uU3RhcnRlZAAABCBhc3NldF9pZFUBJERlc3Ryb3llZAAABCBhc3NldF9pZFUBMEZvcmNlQ3JlYXRlZAAACCBhc3NldF9pZFUBFG93bmVyACxNZXRhZGF0YVNldAAAFCBhc3NldF9pZFUBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQ8TWV0YWRhdGFDbGVhcmVkAAAEIGFzc2V0X2lkVQFAQXBwcm92ZWRUcmFuc2ZlcgAAECBhc3NldF9pZFUBGHNvdXJjZQAgZGVsZWdhdGUAGGFtb3VudAhEQXBwcm92YWxDYW5jZWxsZWQAAAwgYXNzZXRfaWRVARRvd25lcgAgZGVsZWdhdGUATFRyYW5zZmVycmVkQXBwcm92ZWQAABQgYXNzZXRfaWRVARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQISEFzc2V0U3RhdHVzQ2hhbmdlZAAABCBhc3NldF9pZFUBWEFzc2V0TWluQmFsYW5jZUNoYW5nZWQAAAggYXNzZXRfaWRVATxuZXdfbWluX2JhbGFuY2UIHFRvdWNoZWQAAAwgYXNzZXRfaWRVAQx3aG8AJGRlcG9zaXRvcgAcQmxvY2tlZAAACCBhc3NldF9pZFUBDHdobwAkRGVwb3NpdGVkAAAMIGFzc2V0X2lkVQEMd2hvABhhbW91bnQIJFdpdGhkcmF3bgAADCBhc3NldF9pZFUBDHdobwAYYW1vdW50CDxSZXNlcnZlc1VwZGF0ZWQAAAggYXNzZXRfaWRVASByZXNlcnZlc7EBPFJlc2VydmVzUmVtb3ZlZAAABCBhc3NldF9pZFUBMElzc3VlZENyZWRpdAAACCBhc3NldF9pZFUBGGFtb3VudAgwQnVybmVkQ3JlZGl0AAAIIGFzc2V0X2lkVQEYYW1vdW50CChJc3N1ZWREZWJ0AAAIIGFzc2V0X2lkVQEYYW1vdW50CChCdXJuZWREZWJ0AAAIIGFzc2V0X2lkVQEYYW1vdW50CAIMEEhlbGQAABAMd2hvACBhc3NldF9pZFUBGHJlYXNvbgkBGGFtb3VudAggUmVsZWFzZWQAABAMd2hvACBhc3NldF9pZFUBGHJlYXNvbgkBGGFtb3VudAgYQnVybmVkAAAQDHdobwAgYXNzZXRfaWRVARhyZWFzb24JARhhbW91bnQIAgxAQXNzZXRSYXRlQ3JlYXRlZAAACChhc3NldF9raW5kVQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAAABChhc3NldF9raW5kVQFAQXNzZXRSYXRlVXBkYXRlZAAADChhc3NldF9raW5kVQEMb2xkCAxuZXcIBlUBAgQ4QXNzZXRUeEZlZVBhaWQAABAMd2hvAChhY3R1YWxfZmVlCAx0aXAIIGFzc2V0X2lkwQEEAAACKEBOZXdJbnZ1bG5lcmFibGVzAAAENGludnVsbmVyYWJsZXPJAURJbnZ1bG5lcmFibGVBZGRlZAAABChhY2NvdW50X2lkAExJbnZ1bG5lcmFibGVSZW1vdmVkAAAEKGFjY291bnRfaWQAUE5ld0Rlc2lyZWRDYW5kaWRhdGVzAAAESGRlc2lyZWRfY2FuZGlkYXRlcwRATmV3Q2FuZGlkYWN5Qm9uZAAABCxib25kX2Ftb3VudAg4Q2FuZGlkYXRlQWRkZWQAAAgoYWNjb3VudF9pZAAcZGVwb3NpdAhQQ2FuZGlkYXRlQm9uZFVwZGF0ZWQAAAgoYWNjb3VudF9pZAAcZGVwb3NpdAhAQ2FuZGlkYXRlUmVtb3ZlZAAABChhY2NvdW50X2lkAERDYW5kaWRhdGVSZXBsYWNlZAAADAxvbGQADG5ldwAcZGVwb3NpdAhoSW52YWxpZEludnVsbmVyYWJsZVNraXBwZWQAAAQoYWNjb3VudF9pZAACEChOZXdTZXNzaW9uAAAENHNlc3Npb25faW5kZXgEJE5ld1F1ZXVlZAABBURWYWxpZGF0b3JEaXNhYmxlZAAABCR2YWxpZGF0b3IASFZhbGlkYXRvclJlZW5hYmxlZAAABCR2YWxpZGF0b3IAAgQ8WGNtcE1lc3NhZ2VTZW50AAAEMG1lc3NhZ2VfaGFzaCACpCBPdmVyZmxvdwABBTRVbmltcGxlbWVudGVkAAEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgABBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAEFMExvY2F0aW9uRnVsbAABBVRMb2NhdGlvbk5vdEludmVydGlibGUAAQUkQmFkT3JpZ2luAAEFPEludmFsaWRMb2NhdGlvbgABBTRBc3NldE5vdEZvdW5kAAEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAABBTxOb3RXaXRoZHJhd2FibGUAAQVITG9jYXRpb25DYW5ub3RIb2xkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFJFRyYW5zcG9ydAABBShVbnJvdXRhYmxlAAEFMFVua25vd25DbGFpbQABBThGYWlsZWRUb0RlY29kZQABBUBNYXhXZWlnaHRJbnZhbGlkAAEFOE5vdEhvbGRpbmdGZWVzAAEFMFRvb0V4cGVuc2l2ZQABBRBUcmFwAQhARXhwZWN0YXRpb25GYWxzZQABBThQYWxsZXROb3RGb3VuZAABBTBOYW1lTWlzbWF0Y2gAAQVMVmVyc2lvbkluY29tcGF0aWJsZQABBVBIb2xkaW5nV291bGRPdmVyZmxvdwABBSxFeHBvcnRFcnJvcgABBThSZWFuY2hvckZhaWxlZAABBRhOb0RlYWwAAQUoRmVlc05vdE1ldAABBSRMb2NrRXJyb3IAAQUwTm9QZXJtaXNzaW9uAAEFKFVuYW5jaG9yZWQAAQU4Tm90RGVwb3NpdGFibGUAAQU0VG9vTWFueUFzc2V0cwABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQAIFGluZGV4BBRlcnJvctkBAgwgQ29tcGxldGUAAAQQdXNlZBgoSW5jb21wbGV0ZQAACBB1c2VkGBRlcnJvct0BFEVycm9yAd0BBQEgBQFAAhgkVW5kZWZpbmVkAAEFFEluZGV4AQgYQXJyYXk0ASgYQXJyYXk4AeUBHEFycmF5MTYB6QEcQXJyYXkzMgEgAgggRnVuZ2libGUBCCxOb25GdW5naWJsZQHtAQAICGlkVQEMZnVu8QEE9QEAAwgE2QEG/QEAGBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkFG1ham9yBBRtaW5vcgQUcGF0Y2gEBAUCAAIMHFN1Y2Nlc3MAAQUURXJyb3IBJDhUcnVuY2F0ZWRFcnJvcgEkAhgQTnVsbAABBRhBc3NldHMB+QE8RXhlY3V0aW9uUmVzdWx0AQECHFZlcnNpb24BBCxQYWxsZXRzSW5mbwEJAjhEaXNwYXRjaFJlc3VsdAENAgIQGE5hdGl2ZQABBUBTb3ZlcmVpZ25BY2NvdW50AAEFJFN1cGVydXNlcgABBQxYY20AAQUGGAAMLGRlc3RpbmF0aW9uVQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYAgggRnVuZ2libGUAAQUsTm9uRnVuZ2libGUAAQUCEAxBbGwAAQUUQWxsT2YAAAgIaWRVAQxmdW4hAihBbGxDb3VudGVkAQQwQWxsT2ZDb3VudGVkAAAMCGlkVQEMZnVuIQIUY291bnQEAgggRGVmaW5pdGUB+QEQV2lsZAElAgIIJFVubGltaXRlZAABBRxMaW1pdGVkARgCDCBUZWxlcG9ydAEpAjhSZXNlcnZlRGVwb3NpdAEpAjxSZXNlcnZlV2l0aGRyYXcBKQIGMQIEMQIABlEBAgQwQXNzZXRDbGFpbWVyAAAEIGxvY2F0aW9uVQEEQQIAAtA0V2l0aGRyYXdBc3NldAH5AVRSZXNlcnZlQXNzZXREZXBvc2l0ZWQB+QFYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAH5ATRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZRECKG1heF93ZWlnaHQYHHF1ZXJpZXLBATRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c/kBLGJlbmVmaWNpYXJ5VQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRz+QEQZGVzdFUBDHhjbU0CIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kFQJMZmFsbGJhY2tfbWF4X3dlaWdodBkCEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QAAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQAAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcAAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4AAQU0RGVzY2VuZE9yaWdpbgFRASxSZXBvcnRFcnJvcgEdAjBEZXBvc2l0QXNzZXQAAAgYYXNzZXRzKQIsYmVuZWZpY2lhcnlVAUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AAAMGGFzc2V0cykCEGRlc3RVAQx4Y21NAjRFeGNoYW5nZUFzc2V0AAAMEGdpdmUpAhB3YW50+QEcbWF4aW1hbBRcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcAAAwYYXNzZXRzKQIccmVzZXJ2ZVUBDHhjbU0CQEluaXRpYXRlVGVsZXBvcnQAAAwYYXNzZXRzKQIQZGVzdFUBDHhjbU0CNFJlcG9ydEhvbGRpbmcAAAg0cmVzcG9uc2VfaW5mbx0CGGFzc2V0cykCMEJ1eUV4ZWN1dGlvbgAACBBmZWVz9QEwd2VpZ2h0X2xpbWl0LQI0UmVmdW5kU3VycGx1cwABBTxTZXRFcnJvckhhbmRsZXIBTQIsU2V0QXBwZW5kaXgBTQIoQ2xlYXJFcnJvcgABBShDbGFpbUFzc2V0AAAIGGFzc2V0c/kBGHRpY2tldFUBEFRyYXABCEBTdWJzY3JpYmVWZXJzaW9uAAAIIHF1ZXJ5X2lkCExtYXhfcmVzcG9uc2Vfd2VpZ2h0GEhVbnN1YnNjcmliZVZlcnNpb24AAQUkQnVybkFzc2V0AfkBLEV4cGVjdEFzc2V0AfkBMEV4cGVjdE9yaWdpbgHBASxFeHBlY3RFcnJvcgEBAlBFeHBlY3RUcmFuc2FjdFN0YXR1cwENAixRdWVyeVBhbGxldAAACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mbx0CMEV4cGVjdFBhbGxldAAAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAR0CTENsZWFyVHJhbnNhY3RTdGF0dXMAAQU8VW5pdmVyc2FsT3JpZ2luATEBNEV4cG9ydE1lc3NhZ2UAAAwcbmV0d29yax0BLGRlc3RpbmF0aW9uUQEMeGNtTQIkTG9ja0Fzc2V0AAAIFGFzc2V09QEgdW5sb2NrZXJVASxVbmxvY2tBc3NldAAACBRhc3NldPUBGHRhcmdldFUBOE5vdGVVbmxvY2thYmxlAAAIFGFzc2V09QEUb3duZXJVATRSZXF1ZXN0VW5sb2NrAAAIFGFzc2V09QEYbG9ja2VyVQEsU2V0RmVlc01vZGUAAAQwaml0X3dpdGhkcmF3FCBTZXRUb3BpYwEgKENsZWFyVG9waWMAAQUsQWxpYXNPcmlnaW4BVQE8VW5wYWlkRXhlY3V0aW9uAAAIMHdlaWdodF9saW1pdC0CMGNoZWNrX29yaWdpbsEBHFBheUZlZXMAAAQUYXNzZXT1AUBJbml0aWF0ZVRyYW5zZmVyAAAULGRlc3RpbmF0aW9uVQEscmVtb3RlX2ZlZXM1AjxwcmVzZXJ2ZV9vcmlnaW4UGGFzc2V0czkCKHJlbW90ZV94Y21NAkRFeGVjdXRlV2l0aE9yaWdpbgAACERkZXNjZW5kYW50X29yaWdpbj0CDHhjbU0CIFNldEhpbnRzAAAEFGhpbnRzRQIESQIAAhw0Tm90QXBwbGljYWJsZQABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBTxNaXNzaW5nQXJndW1lbnQAAQUQRmVlcwABBQIsJEJ5R2VuZXNpcwEgGEJ5Rm9yawAACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AAEFGEt1c2FtYQABBRxXZXN0ZW5kAAEFGFJvY29jbwABBRhXb2NvY28AAQUgRXRoZXJldW0AAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAAEFLEJpdGNvaW5DYXNoAAEFQFBvbGthZG90QnVsbGV0aW4AAQUGVQICKCRQYXJhY2hhaW4BBCxBY2NvdW50SWQzMgAACBxuZXR3b3JrWQIIaWQgOEFjY291bnRJbmRleDY0AAAIHG5ldHdvcmtZAhRpbmRleAgwQWNjb3VudEtleTIwAAAIHG5ldHdvcmtZAgxrZXklAThQYWxsZXRJbnN0YW5jZQEEMEdlbmVyYWxJbmRleAEIKEdlbmVyYWxLZXkAAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQAAQUkUGx1cmFsaXR5AAAICGlkKQEQcGFydC0BPEdsb2JhbENvbnNlbnN1cwFVAgIkEEhlcmUAAQUIWDEBXQIIWDIABF0CAQgIWDMABF0CAQwIWDQABF0CARAIWDUABF0CARQIWDYABF0CARgIWDcABF0CARwIWDgABF0CASAACBxwYXJlbnRzBCBpbnRlcmlvcmECAgggQ29uY3JldGUBZQIgQWJzdHJhY3QBIAAICGlkaQIMZnVu8QEEbQIAAAgIaWRlAgxmdW7xAQR1AgACDAhWMwFxAghWNAF5AghWNQH5AQIMCFYzAWUCCFY0AWUCCFY1AVUBBggCdCRBdHRlbXB0ZWQAAAQcb3V0Y29tZeEBEFNlbnQAABAYb3JpZ2luVQEsZGVzdGluYXRpb25VARxtZXNzYWdlTQIobWVzc2FnZV9pZCAoU2VuZEZhaWxlZAAAEBhvcmlnaW5VASxkZXN0aW5hdGlvblUBFGVycm9yUQIobWVzc2FnZV9pZCA8UHJvY2Vzc1hjbUVycm9yAAAMGG9yaWdpblUBFGVycm9y2QEobWVzc2FnZV9pZCBIVW5leHBlY3RlZFJlc3BvbnNlAAAIGG9yaWdpblUBIHF1ZXJ5X2lkCDRSZXNwb25zZVJlYWR5AAAIIHF1ZXJ5X2lkCCByZXNwb25zZRECIE5vdGlmaWVkAAAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQE5vdGlmeU92ZXJ3ZWlnaHQAABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBhMTm90aWZ5RGlzcGF0Y2hFcnJvcgAADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEhOb3RpZnlEZWNvZGVGYWlsZWQAAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARASW52YWxpZFJlc3BvbmRlcgAADBhvcmlnaW5VASBxdWVyeV9pZAhEZXhwZWN0ZWRfbG9jYXRpb27BAVxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbgAACBhvcmlnaW5VASBxdWVyeV9pZAg0UmVzcG9uc2VUYWtlbgAABCBxdWVyeV9pZAg0QXNzZXRzVHJhcHBlZAAADBBoYXNoIBhvcmlnaW5VARhhc3NldHN9AlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQAABAsZGVzdGluYXRpb25VARhyZXN1bHQEEGNvc3T5AShtZXNzYWdlX2lkIFxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAAACCBsb2NhdGlvblUBHHZlcnNpb24EUE5vdGlmeVRhcmdldFNlbmRGYWlsAAAMIGxvY2F0aW9uVQEgcXVlcnlfaWQIFGVycm9y2QFkTm90aWZ5VGFyZ2V0TWlncmF0aW9uRmFpbAAACCBsb2NhdGlvboECIHF1ZXJ5X2lkCFRJbnZhbGlkUXVlcmllclZlcnNpb24AAAgYb3JpZ2luVQEgcXVlcnlfaWQIOEludmFsaWRRdWVyaWVyAAAQGG9yaWdpblUBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyVQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXLBAVBWZXJzaW9uTm90aWZ5U3RhcnRlZAAADCxkZXN0aW5hdGlvblUBEGNvc3T5AShtZXNzYWdlX2lkIFhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkAAAMLGRlc3RpbmF0aW9uVQEQY29zdPkBKG1lc3NhZ2VfaWQgYFZlcnNpb25Ob3RpZnlVbnJlcXVlc3RlZAAADCxkZXN0aW5hdGlvblUBEGNvc3T5AShtZXNzYWdlX2lkICBGZWVzUGFpZAAACBhwYXlpbmdVARBmZWVz+QE0QXNzZXRzQ2xhaW1lZAAADBBoYXNoIBhvcmlnaW5VARhhc3NldHN9AmBWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQAAAQcdmVyc2lvbgQ8QWxpYXNBdXRob3JpemVkAAAMHGFsaWFzZXJVARh0YXJnZXRVARhleHBpcnmFAmRBbGlhc0F1dGhvcml6YXRpb25SZW1vdmVkAAAIHGFsaWFzZXJVARh0YXJnZXRVAXBBbGlhc2VzQXV0aG9yaXphdGlvbnNSZW1vdmVkAAAEGHRhcmdldFUBAgw0SW52YWxpZEZvcm1hdAEgSFVuc3VwcG9ydGVkVmVyc2lvbgEgQEV4ZWN1dGVkRG93bndhcmQAAwgg4QECDBBIZXJlAAEFGFBhcmVudAABBRxTaWJsaW5nAQQCGCRCYWRGb3JtYXQAAQUcQ29ycnVwdAABBSxVbnN1cHBvcnRlZAABBShPdmVyd2VpZ2h0ARgUWWllbGQAAQVEU3RhY2tMaW1pdFJlYWNoZWQAAQUCEEBQcm9jZXNzaW5nRmFpbGVkAAAMCGlkIBhvcmlnaW6RAhRlcnJvcpUCJFByb2Nlc3NlZAAAEAhpZCAYb3JpZ2lukQIsd2VpZ2h0X3VzZWQYHHN1Y2Nlc3MUSE92ZXJ3ZWlnaHRFbnF1ZXVlZAAAEAhpZCAYb3JpZ2lukQIocGFnZV9pbmRleAQ0bWVzc2FnZV9pbmRleAQoUGFnZVJlYXBlZAAACBhvcmlnaW6RAhRpbmRleAQBBQedAtgCIEBCYXRjaEludGVycnVwdGVkAAAIFGluZGV4BBRlcnJvctg4QmF0Y2hDb21wbGV0ZWQAAQVgQmF0Y2hDb21wbGV0ZWRXaXRoRXJyb3JzAAEFNEl0ZW1Db21wbGV0ZWQAAQUoSXRlbUZhaWxlZAAABBRlcnJvctgwRGlzcGF0Y2hlZEFzAAAEGHJlc3VsdKECRElmRWxzZU1haW5TdWNjZXNzAAEFUElmRWxzZUZhbGxiYWNrQ2FsbGVkAAAEKG1haW5fZXJyb3LYAAgYaGVpZ2h0BBRpbmRleAQCFCxOZXdNdWx0aXNpZwAADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwAABAkYXBwcm92aW5nACR0aW1lcG9pbnSpAiBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAAAUJGFwcHJvdmluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0oQJETXVsdGlzaWdDYW5jZWxsZWQAABAoY2FuY2VsbGluZwAkdGltZXBvaW50qQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAwRGVwb3NpdFBva2VkAAAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIBgACEBRTdWRpZAAABCxzdWRvX3Jlc3VsdKECKEtleUNoYW5nZWQAAAgMb2xksQIMbmV3AChLZXlSZW1vdmVkAAEFKFN1ZG9Bc0RvbmUAAAQsc3Vkb19yZXN1bHShAgIYDEFueQABBSxOb25UcmFuc2ZlcgABBSxDYW5jZWxQcm94eQABBSBJZGVudGl0eQABBURJZGVudGl0eUp1ZGdlbWVudAABBSBDb2xsYXRvcgABBQIIHFByb3hpZXMAAQU0QW5ub3VuY2VtZW50cwABBQIcNFByb3h5RXhlY3V0ZWQAAAQYcmVzdWx0oQIsUHVyZUNyZWF0ZWQAABgQcHVyZQAMd2hvAChwcm94eV90eXBluQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEKFB1cmVLaWxsZWQAABAQcHVyZQAcc3Bhd25lcgAocHJveHlfdHlwZbkCUGRpc2FtYmlndWF0aW9uX2luZGV4BCRBbm5vdW5jZWQAAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCAoUHJveHlBZGRlZAAAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZbkCFGRlbGF5BDBQcm94eVJlbW92ZWQAABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGW5AhRkZWxheQQwRGVwb3NpdFBva2VkAAAQDHdobwAQa2luZL0CLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgCCBBUcnVlAAEFFEZhbHNlAAEFAggUVHJ1dGgBxQIgQ29udGVtcHQAAQUCgCxJZGVudGl0eVNldAAABAx3aG8APElkZW50aXR5Q2xlYXJlZAAACAx3aG8AHGRlcG9zaXQIOElkZW50aXR5S2lsbGVkAAAIDHdobwAcZGVwb3NpdAhISnVkZ2VtZW50UmVxdWVzdGVkAAAIDHdobwA8cmVnaXN0cmFyX2luZGV4BFBKdWRnZW1lbnRVbnJlcXVlc3RlZAAACAx3aG8APHJlZ2lzdHJhcl9pbmRleAQ4SnVkZ2VtZW50R2l2ZW4AAAgYdGFyZ2V0ADxyZWdpc3RyYXJfaW5kZXgEOFJlZ2lzdHJhckFkZGVkAAAEPHJlZ2lzdHJhcl9pbmRleARAU3ViSWRlbnRpdHlBZGRlZAAADAxzdWIAEG1haW4AHGRlcG9zaXQIQFN1YklkZW50aXRpZXNTZXQAAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CEhTdWJJZGVudGl0eVJlbmFtZWQAAAgMc3ViABBtYWluAEhTdWJJZGVudGl0eVJlbW92ZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CEhTdWJJZGVudGl0eVJldm9rZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CDhBdXRob3JpdHlBZGRlZAAABCRhdXRob3JpdHkAQEF1dGhvcml0eVJlbW92ZWQAAAQkYXV0aG9yaXR5ACxVc2VybmFtZVNldAAACAx3aG8AIHVzZXJuYW1lJDhVc2VybmFtZVF1ZXVlZAAADAx3aG8AIHVzZXJuYW1lJChleHBpcmF0aW9uBEhQcmVhcHByb3ZhbEV4cGlyZWQAAAQUd2hvc2UASFByaW1hcnlVc2VybmFtZVNldAAACAx3aG8AIHVzZXJuYW1lJFxEYW5nbGluZ1VzZXJuYW1lUmVtb3ZlZAAACAx3aG8AIHVzZXJuYW1lJDxVc2VybmFtZVVuYm91bmQAAAQgdXNlcm5hbWUkPFVzZXJuYW1lUmVtb3ZlZAAABCB1c2VybmFtZSQ4VXNlcm5hbWVLaWxsZWQAAAQgdXNlcm5hbWUkQFVzZXJuYW1lUmVwb3J0ZWQAAAggcmVwb3J0ZXIAIHVzZXJuYW1lJExQZXJzb25hbElkZW50aXR5U2V0AAAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSRERXZpZGVuY2VTdWJtaXR0ZWQAAAQUYWxpYXMgSENyZWRlbnRpYWxBY2NlcHRlZAAABBRhbGlhcyBIQ3JlZGVudGlhbFJlamVjdGVkAAAEFGFsaWFzIDBQZXJzb25CYW5uZWQAAAQUYWxpYXMgXFBlcnNvbmFsSWRlbnRpdHlDbGVhcmVkAAAEFGFsaWFzIGxSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkVmFsaWQAAAQgdXNlcm5hbWUkdFJlcG9ydGVkVXNlcm5hbWVKdWRnZWRJbnZhbGlkAAAEIHVzZXJuYW1lJJhSZXBvcnRlZFVzZXJuYW1lV2Vha09yVW5jbGVhckp1ZGdlbWVudAAACCB1c2VybmFtZSQkanVkZ2VtZW50yQIEIAACKFBQZXJzb25ob29kUmVjb2duaXplZAAACAx3aG8IDGtleSBAUGVyc29uT25ib2FyZGluZwAACAx3aG8IDGtleSA8QWxpYXNEaXNwYXRjaGVkAAAIFGFsaWFzYQEcYWNjb3VudAA8QWxpYXNBY2NvdW50U2V0AAAIFGFsaWFzYQEcYWNjb3VudABEQWxpYXNBY2NvdW50VW5zZXQAAAgUYWxpYXNhARxhY2NvdW50AFBQZXJzb25hbElkQWNjb3VudFNldAAACAx3aG8IHGFjY291bnQAWFBlcnNvbmFsSWRBY2NvdW50VW5zZXQAAAgMd2hvCBxhY2NvdW50AERDb2xsZWN0aW9uQ3JlYXRlZAABBWRGb3JjZVBlcnNvbmhvb2RSZWNvZ25pemVkAAAEGHBlb3BsZdECOEFsaWFzQ2xlYW5lZFVwAAAIFGFsaWFzYQEcYWNjb3VudAAEBAACRCxDYXNlQ3JlYXRlZAAABChjYXNlX2luZGV4BCBDYWxsYmFjawAABBhyZXN1bHShAjRDYWxsYmFja0Vycm9yAAEFKENhc2VDbG9zZWQAAAgoY2FzZV9pbmRleAQcdmVyZGljdMkCFFZvdGVkAAAMKGNhc2VfaW5kZXgEFHZvdGVyIBxvcGluaW9uyQIsVm90ZUNsZWFuZWQAAAgoY2FzZV9pbmRleAQUdm90ZXIgLENhc2VSZW1vdmVkAAAEKGNhc2VfaW5kZXgEOENhc2VJbnRlcnZlbmVkAAAIKGNhc2VfaW5kZXgEHHZlcmRpY3TJAjBWb3Rlc0NsYWltZWQAAAgUdm90ZXIgMGNhc2VfaW5kaWNlc9kCMFJld2FyZFBheW91dAAADBR2b3RlciAsZGVzdGluYXRpb24AGGFtb3VudAhIUGF5b3V0Um91bmRTdGFydGVkAAAMFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIMHRvdGFsX3BvaW50cwhUUGF5b3V0Um91bmRzU2NoZWR1bGVkAAAMGGFtb3VudAgUY291bnQEGHBlcmlvZARUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BDRDcmVkaXRDbGFpbWVkAAAIFHZvdGVyIBhhbW91bnQINFBvaW50c0NsZWFuZWQAAAgUcm91bmQEFHZvdGVyICxDYXNlVG91Y2hlZAAACChjYXNlX2luZGV4BBxyaXBlbmVkFFBWb3RpbmdQZW5hbHR5Q2xlYXJlZAAABAx3aG8gAhAgRGVzaWduZWQAAAQUY291bnQERFByb2NlZHVyYWxBY2NvdW50AAEFSFByb2NlZHVyYWxQZXJzb25hbAABBShQcm9jZWR1cmFsAAAEFHJhbmdlBAAgOHJlcm9sbF90aW1lb3V0BDxmYXN0dHJhY2tfY291bnQEHG1heGltdW0EOGZ1bGxfYWxsb2NfbGVuCEBmdWxsX2FsbG9jX2NvdW50BDhpbml0X2FsbG9jX2xlbghAaW5pdF9hbGxvY19jb3VudAQcdGltZW91dAQCXEBDYW5kaWRhdGVBcHBsaWVkAAAEKGFjY291bnRfaWQASEp1ZGdlbWVudFJlcXVlc3RlZAAABChhY2NvdW50X2lkAERKdWRnZW1lbnRQcm92aWRlZAAACChhY2NvdW50X2lkACRqdWRnZW1lbnTJAjBSZXRyeUdyYW50ZWQAAAgoYWNjb3VudF9pZAAgZmFpbHVyZXMEQFBlcnNvblJlZ2lzdGVyZWQAAAgoYWNjb3VudF9pZAAscGVyc29uYWxfaWQIRENhbmRpZGF0ZVJlZmVycmVkAAAIIHJlZmVycmVyCCByZWZlcnJlZAAgUmVyb2xsZWQAAAQoYWNjb3VudF9pZAA8RGVzaWduQ29tbWl0dGVkAAAIKGFjY291bnRfaWQALHJlc2VydmVkX2lkCDhGdWxseUFsbG9jYXRlZAAABChhY2NvdW50X2lkACBUaW1lZE91dAAABChhY2NvdW50X2lkACRGbGFrZWRPdXQAAAQoYWNjb3VudF9pZAA4VGlja2V0UmVmZXJyZWQAAAggcmVmZXJyZXIIGHRpY2tldAA8VGlja2V0Q2FuY2VsbGVkAAAIIHJlZmVycmVyCBh0aWNrZXQANFRpY2tldEFwcGxpZWQAAAgoYWNjb3VudF9pZAAgcmVmZXJyZXIILEZhbWlseUFkZGVkAAAMFGluZGV4BBBraW5k4QIIaWQgREFsbEludml0ZXNSZW1vdmVkAAAEHGludml0ZXIASFNvbWVJbnZpdGVzUmVtb3ZlZAAABBxpbnZpdGVyAFxJbnZpdGVkQ2FuZGlkYXRlQXBwbGllZAAACAx3aG8AHGludml0ZXIAZFJlZmVycmFsVm91Y2hlclJlZ2lzdGVyZWQAAAQgcmVmZXJyZXIIOEludml0ZXNHcmFudGVkAAAIHGFjY291bnQAFGNvdW50BDxJbnZpdGVUaWNrZXRTZXQAAAgcaW52aXRlcgAYdGlja2V0AFRJbnZpdGVUaWNrZXRDYW5jZWxsZWQAAAgcaW52aXRlcgAYdGlja2V0AEBDb25maWd1cmF0aW9uU2V0AAAEGGNvbmZpZ+UCAggcQWNjb3VudAEAGFBlcnNvbgEgAkgcTmV3R2FtZQAADERyZWdpc3RyYXRpb25fZW5kcwQkZ2FtZV9kYXRlBCxyZXBvcnRfZW5kcwQkR2FtZUVuZGVkAAAEFGluZGV4BCBTaWduZWRVcAAABAx3aG/tAjxSZXBvcnRTdWJtaXR0ZWQAAAgMd2hv7QIoZ2FtZV9pbmRleAQoT2ZmYm9hcmRlZAAABAx3aG/tAiRLaWNrZWRPdXQAAAQYcGxheWVy7QI4SW52aXRlc0dyYW50ZWQAAAgcYWNjb3VudAAUY291bnQEPEludml0ZVRpY2tldFNldAAABBxpbnZpdGVyAFRJbnZpdGVUaWNrZXRDYW5jZWxsZWQAAAQcaW52aXRlcgA4R2FtZXNTY2hlZHVsZWQAAAQUY291bnQEUFNjaGVkdWxlZEdhbWVSZW1vdmVkAAAEOGdhbWVfcGxheV90aW1lBEBTdG10VXNhZ2VSZW1vdmVkAAAEDHdobyBEQWxsSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgBIU29tZUludml0ZXNSZW1vdmVkAAAEHGludml0ZXIAWFNjcmF0Y2hSZXdhcmRBdmFpbGFibGUAAAQoZ2FtZV9pbmRleARQU2NyYXRjaFJld2FyZENsYWltZWQAAAgsYmVuZWZpY2lhcnkAGGFtb3VudAhMR2FtZVByaXplUG9vbE9wZW5lZAAACChnYW1lX2luZGV4BBxwb29sX2lkBFxHYW1lUHJpemVQb29sT3BlbkZhaWxlZAAACChnYW1lX2luZGV4BBRlcnJvctgCHDRDcmVkaXRDbGFpbWVkAAAMDHdob+0CLGRlc3RpbmF0aW9uABhhbW91bnQIUFBlcnNvbmhvb2RSZWNvZ25pemVkAAAIDHdob+0CHHJlc3VtZWQUVFBheW91dFJvdW5kc1NjaGVkdWxlZAAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BERSb3VuZFRyYW5zaXRpb25lZAAABCxyb3VuZF9pbmRleARMUGF5b3V0Um91bmRPcGVyYXRlZAAABCxyb3VuZF9pbmRleAQkQ2FzaGVkT3V0AAAEDHdob+0CAiAsSWRzUmVzZXJ2ZWQAAAQUY291bnQEJElkUmVuZXdlZAAABAhpZAgwSWRVbnJlc2VydmVkAAAECGlkCEBQZW9wbGVSZWdpc3RlcmVkAAAEFGNvdW50BDxQZW9wbGVTdXNwZW5kZWQAAAQUY291bnQERFBlcnNvbmhvb2RSZXN1bWVkAAAECGlkCEhTdXNwZW5zaW9uc1N0YXJ0ZWQAAQVAU3VzcGVuc2lvbnNFbmRlZAABBQIYeEFsbEF0dGVzdGF0aW9uQWxsb3dhbmNlQ2xlYXJlZAAABCB2ZXJpZmllcgB0QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQAAAgcYWNjb3VudAAUY291bnQEOFBlcnNvbkF0dGVzdGVkAAAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIASENvbnN1bWVyUmVnaXN0ZXJlZAAABBxhY2NvdW50ADxBbGlhc0FjY291bnRTZXQAAAgUYWxpYXNhARxhY2NvdW50AERBbGlhc0FjY291bnRVbnNldAAACBRhbGlhc2EBHGFjY291bnQAAjhAUGVyc29uUmVnaXN0ZXJlZAAACBRhbGlhcyAcYWNjb3VudABQTGl0ZVBlcnNvblJlZ2lzdGVyZWQAAAQcYWNjb3VudABkRnJpZW5kUmVxdWVzdFN0bXRVc2FnZVNldAAAEBRhbGlhcyAYcGVyaW9kBAxzZXEEHGFjY291bnQAdEZyaWVuZFJlcXVlc3RTdG10VXNhZ2VSZW1vdmVkAAAEHGFjY291bnQAaFBlcnNvbkF1dGhvcml6YXRpb25Ub3VjaGVkAAAEHGFjY291bnQAhEV4cGlyZWRVc2VybmFtZVJlc2VydmF0aW9uUmVtb3ZlZAAACCB1c2VybmFtZSQcYWNjb3VudABQSWRlbnRpZmllcktleVVwZGF0ZWQAAAQcYWNjb3VudAB4VXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uU2V0AAAEIGR1cmF0aW9uCFRTdG10U3RvcmVBbGxvd2FuY2VTZXQAABAUYWxpYXMgGHBlcmlvZAQMc2VxBBxhY2NvdW50AGhTdG10U3RvcmVBbGxvd2FuY2VzQ2xlYXJlZAAADBhwZXJpb2QEJGZpcnN0X2tleSAUY291bnQENFBlcnNvbkRlbW90ZWQAAAQcYWNjb3VudABYTG9uZ1Rlcm1TdG9yYWdlQ2xhaW1lZAAAFBRhbGlhcyAYcGVyaW9kBBxjb3VudGVyBBxhY2NvdW50AChjb2xsZWN0aW9ufQF8TG9uZ1Rlcm1TdG9yYWdlQWxsb2NhdGlvbkZhaWxlZAAAFBRhbGlhcyAYcGVyaW9kBBxjb3VudGVyBBxhY2NvdW50AChjb2xsZWN0aW9ufQF0TG9uZ1Rlcm1TdG9yYWdlQWxpYXNlc0NsZWFyZWQAAAgYcGVyaW9kBBRjb3VudAQCDBBSMmU5AAEFFFIyZTEwAAEFFFIyZTE0AAEFAghoQ2h1bmtQYWdlSGFzaGVzSW5pdGlhbGl6ZWQAAAg0cmluZ19leHBvbmVudAUDLHRvdGFsX3BhZ2VzBCxDaHVua3NBZGRlZAAADDRyaW5nX2V4cG9uZW50BQMsc3RhcnRfaW5kZXgEFGNvdW50BAIoLE1lbWJlckFkZGVkAAAEDGtleSA0TWVtYmVyUmVtb3ZlZAAABAxrZXkgbENvbGxlY3Rpb25NYXJrZWRGb3JEZWxldGlvbgAABChpZGVudGlmaWVyIERDb2xsZWN0aW9uRGVsZXRlZAAABChpZGVudGlmaWVyICRSaW5nQnVpbHQAAAgoaWRlbnRpZmllciAocmluZ19pbmRleARATWVtYmVyc09uYm9hcmRlZAAABChpZGVudGlmaWVyICxSaW5nc01lcmdlZAAADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BERPbmJvYXJkaW5nU2l6ZVNldAAACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUESE1lbWJlclNlbGZJbmNsdWRlZAAACChpZGVudGlmaWVyIAxrZXkgQE9sZFJvb3RDbGVhbmVkVXAAAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQgcmV2aXNpb24EAggYTmF0aXZlAAEFGFN0YWJsZQABBQJcJENvaW5TcGxpdAAABDBvdXRwdXRfY291bnQEPENvaW5UcmFuc2ZlcnJlZAAADAh0bwAUdmFsdWUEHG5ld19hZ2UEWFJlY3ljbGVyTG9hZGVkV2l0aENvaW4AAAQUdmFsdWUEfFJlY3ljbGVyTG9hZGVkV2l0aEV4dGVybmFsQXNzZXQAAAwMd2hvABR2YWx1ZQQYYW1vdW50CGBSZWN5Y2xlclVubG9hZGVkSW50b0NvaW4AABAIdG8ALGlucHV0X3ZhbHVlBDBvdXRwdXRfdmFsdWUELGlucHV0X2NvdW50BIRSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAABAIdG8AFHZhbHVlBCxpbnB1dF9jb3VudAQYYW1vdW50CLBSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXRBbmRWb3VjaGVycwAAFAh0bwAUdmFsdWUELGlucHV0X2NvdW50BFRleHRlcm5hbF9hc3NldF9hbW91bnQINHZvdWNoZXJfY291bnQEhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbgAACAxmZWUIJGRlc3Ryb3llZAiMUGFpZFVubG9hZFRva2VuUmVnaXN0ZXJlZFdpdGhOYXRpdmUAAAgMd2hvAAxmZWUIjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoU3RhYmxlAAAIDHdobwAMZmVlCHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEhExpdGVQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEZFJlY3ljbGVyc1VubG9hZGVkSW50b0NvaW4AAAwIdG8AMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMAABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5EQNkUmVjeWNsZXJVbmxvYWRlZEludG9Db2lucwAABDBvdXRwdXRfY291bnQEfENvaW5PZmZib2FyZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8AFHZhbHVlBBhhbW91bnQIPFJlY3ljbGVyQ2xlYW5lZAAADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CGRDb25zdW1lZEZyZWVUb2tlbnNDbGVhbmVkAAAEGHBlcmlvZARoUGFpZFVubG9hZFRva2VuUmluZ0NsZWFuZWQAAAgYcGVyaW9kBChyaW5nX2luZGV4BExSZWN5Y2xlckR1c3RDbGVhbmVkAAEFaFBhaWRVbmxvYWRUb2tlbkR1c3RDbGVhbmVkAAEFnEV4cGlyZWRQYWlkVW5sb2FkVG9rZW5Db2xsZWN0aW9uRGVsZXRlZAAABBhwZXJpb2QEAhgoU3Vic2NyaWJlZAAABBxwYXJhX2lkBDBVbnN1YnNjcmliZWQAAAQccGFyYV9pZAQsVXBkYXRlc1NlbnQAAAgccGFyYV9pZAQwdXBkYXRlX2NvdW50BEBVcGRhdGVTZW5kRmFpbGVkAAAEHHBhcmFfaWQEPFJlcGxheVJlcXVlc3RlZAAADBxwYXJhX2lkBChpZGVudGlmaWVyIDRpbmRpY2VzX2NvdW50BDhCYXRjaEFiYW5kb25lZAAABCBzZXF1ZW5jZQgCSDBBc3NldENyZWF0ZWQAAQVQWGNtRnVuZHNUcmFuc2ZlclNlbnQAAQVgWGNtRnVuZHNUcmFuc2ZlclRpbWVkT3V0AAEFNEZ1bmRzVmVyaWZpZWQAAQUoUG90c0Z1bmRlZAABBVxNb2JSdWxlUGF5b3V0c1NjaGVkdWxlZAABBVRTY29yZVBheW91dHNTY2hlZHVsZWQAAQVEQWlyZHJvcFBvb2xPcGVuZWQAAAQccG9vbF9pZAR8QWlyZHJvcFNjaGVkdWxpbmdFbmFibGVkQ2hhbmdlZAAABBxlbmFibGVkFHRPblBvbGxJbml0aWFsaXphdGlvbkNvbXBsZXRlZAABBWRNaWdyYXRpb25QZW9wbGVSZWNvZ25pemVkAAEFaE1pZ3JhdGlvbk9uYm9hcmRpbmdTaXplU2V0AAEFeE1pZ3JhdGlvblByb29mT2ZJbmtJbml0aWFsaXplZAABBVxNaWdyYXRpb25HYW1lc1NjaGVkdWxlZAABBVxNaWdyYXRpb25JbnZpdGVzR3JhbnRlZAABBXxNaWdyYXRpb25SZWltYnVyc2VtZW50VmFsdWVzU2V0AAEFhE1pZ3JhdGlvbkF0dGVzdGF0aW9uQWxsb3dhbmNlc1NldAABBUhNaWdyYXRpb25Db21wbGV0ZWQAAQUCBFxJbml0aWFsaXphdGlvbkNvbXBsZXRlZAABBQIIGFBlb3BsZQABBUBHYW1lUGFydGljaXBhbnRzAQQCGDxQcml6ZVBvb2xPcGVuZWQAABwIaWQEKGRpc3BhdGNoZXIAGHRhcmdldCUDIGFzc2V0X2lkVQEobnVtX3ByaXplcwQscHJpemVfdmFsdWUIKGV4cGlyZXNfYXQIMFByaXplQ2xhaW1lZAAAFBxwb29sX2lkBCBjbGFpbWFudO0CLGJlbmVmaWNpYXJ5ACBhc3NldF9pZFUBGGFtb3VudAhAQWxsUHJpemVzQ2xhaW1lZAAACAhpZAQgYXNzZXRfaWRVAUBQcml6ZVBvb2xFeHBpcmVkAAAMCGlkBCBhc3NldF9pZFUBIHJlZnVuZGVkCDxQcml6ZVBvb2xDbG9zZWQAAAwIaWQEIGFzc2V0X2lkVQEgcmVmdW5kZWQITFByaXplVHJhbnNmZXJGYWlsZWQAABAccG9vbF9pZAQsYmVuZWZpY2lhcnkAIGFzc2V0X2lkVQEYYW1vdW50CAYkAiA4VXBncmFkZVN0YXJ0ZWQAAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAABBTRVcGdyYWRlRmFpbGVkAAEFQE1pZ3JhdGlvblNraXBwZWQAAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAAAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQAAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAAACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAAAELG5leHRfY3Vyc29yLQMClBhTeXN0ZW0B3DxQYXJhY2hhaW5TeXN0ZW0B5CBCYWxhbmNlcwERAUhUcmFuc2FjdGlvblBheW1lbnQBFQFIU2tpcEZlZWxlc3NQYXltZW50AaEBRE9yaWdpblJlc3RyaWN0aW9uAakBGEFzc2V0cwG1ATBBc3NldHNIb2xkZXIBuQEkQXNzZXRSYXRlAb0BOEFzc2V0VHhQYXltZW50AcUBRENvbGxhdG9yU2VsZWN0aW9uAc0BHFNlc3Npb24B0QEkWGNtcFF1ZXVlAdUBLFBvbGthZG90WGNtAYkCKEN1bXVsdXNYY20BjQIwTWVzc2FnZVF1ZXVlAZkCHFV0aWxpdHkBpQIgTXVsdGlzaWcBrQIQU3VkbwG1AhRQcm94eQHBAiBJZGVudGl0eQHNAhhQZW9wbGUB1QIcTW9iUnVsZQHdAihQcm9vZk9mSW5rAekCEEdhbWUB8QIUU2NvcmUB9QIgRHVtbXlEaW0B+QIoUGVvcGxlTGl0ZQH9AiRSZXNvdXJjZXMBAQM0Q2h1bmtzTWFuYWdlcgEJAxxNZW1iZXJzAQ0DHENvaW5hZ2UBFQM8TWVtYmVyc05vdGlmaWVyARkDVFN0b3JhZ2VJbml0aWFsaXphdGlvbgEdA2RTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlASEDHEFpcmRyb3ABKQNQTXVsdGlCbG9ja01pZ3JhdGlvbnMBMQMADBRwaGFzZTQUZXZlbnQ1Axh0b3BpY3PRAgQ5AwAEBAEIBEEDAAEBAAgwc3BlY192ZXJzaW9uBCRzcGVjX25hbWVJAwAIJGNvZGVfaGFzaCA0Y2hlY2tfdmVyc2lvbhQAEDhiYXNlX2V4dHJpbnNpYxg0bWF4X2V4dHJpbnNpYxkCJG1heF90b3RhbBkCIHJlc2VydmVkGQIADBhub3JtYWxVAyxvcGVyYXRpb25hbFUDJG1hbmRhdG9yeVUDAAwoYmFzZV9ibG9jaxgkbWF4X2Jsb2NrGCRwZXJfY2xhc3NZAwAMGG5vcm1hbAQsb3BlcmF0aW9uYWwEJG1hbmRhdG9yeQQGBAAIDG1heGEDPG1heF9oZWFkZXJfc2l6ZWUDAAgQcmVhZAgUd3JpdGUIAwjlAQQEcQMAACAkc3BlY19uYW1lSQMkaW1wbF9uYW1lSQNEYXV0aG9yaW5nX3ZlcnNpb24EMHNwZWNfdmVyc2lvbgQwaW1wbF92ZXJzaW9uBBBhcGlzdQNMdHJhbnNhY3Rpb25fdmVyc2lvbgQ4c3lzdGVtX3ZlcnNpb24EBCQBCAR9AwAEJAACDCBGdWxsQ29yZQAABBxjb250ZXh0BERQb3RlbnRpYWxGdWxsQ29yZQAADBxjb250ZXh0BFxmaXJzdF90cmFuc2FjdGlvbl9pbmRleGUDNHRhcmdldF93ZWlnaHQYOEZyYWN0aW9uT2ZDb3JlAAAIHGNvbnRleHQEXGZpcnN0X3RyYW5zYWN0aW9uX2luZGV4ZQMACCRtc2dfY291bnQELHRvdGFsX2J5dGVzBAMIBI0DBJEDAAAMNHVtcF9tc2dfY291bnQEPHVtcF90b3RhbF9ieXRlcwQ0aHJtcF9vdXRnb2luZ5UDAggUQWJvcnQAAQUcR29BaGVhZAABBQadAwAMOHVzZWRfYmFuZHdpZHRomQM4cGFyYV9oZWFkX2hhc2jgYGNvbnN1bWVkX2dvX2FoZWFkX3NpZ25hbKEDBKUDAAAMOHVzZWRfYmFuZHdpZHRomQM4aHJtcF93YXRlcm1hcmtlA2Bjb25zdW1lZF9nb19haGVhZF9zaWduYWyhAwAQLHBhcmVudF9oZWFkJExyZWxheV9wYXJlbnRfbnVtYmVyBGRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290IDBtYXhfcG92X3NpemUEAgQcUHJlc2VudAABBQa1AwAIPHJlbWFpbmluZ19jb3VudAQ4cmVtYWluaW5nX3NpemUEABgwbWF4X2NhcGFjaXR5BDhtYXhfdG90YWxfc2l6ZQRAbWF4X21lc3NhZ2Vfc2l6ZQQkbXNnX2NvdW50BCh0b3RhbF9zaXplBCBtcWNfaGVhZOADCATBAwTFAwAAEDBkbXFfbXFjX2hlYWQgnHJlbGF5X2Rpc3BhdGNoX3F1ZXVlX3JlbWFpbmluZ19jYXBhY2l0eb0DQGluZ3Jlc3NfY2hhbm5lbHPJAzxlZ3Jlc3NfY2hhbm5lbHPJAwAITG1heF9jYW5kaWRhdGVfZGVwdGgEUGFsbG93ZWRfYW5jZXN0cnlfbGVuBAAoNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXPRAwMIBCAE2QMAAAgcc2VudF9hdAQscmV2ZXJzZV9pZHgEAAgkcmVjaXBpZW50BBBkYXRhJATlAwAAGGhyZWxheV9zdG9yYWdlX3Jvb3Rfb3JfaGFzaCA0Y29yZV9zZWxlY3RvcgQwYnVuZGxlX2luZGV4BDR1bXBfbXNnX2NvdW50BExocm1wX291dGJvdW5kX2NvdW50BGBocm1wX291dGJvdW5kX3JlY2lwaWVudHPZAgAULHBhcmVudF9oYXNoIBhudW1iZXIEKHN0YXRlX3Jvb3QgPGV4dHJpbnNpY3Nfcm9vdCAYZGlnZXN0MATxAwAAEDx2YWxpZGF0aW9uX2RhdGGxA0RyZWxheV9jaGFpbl9zdGF0ZYUDYHJlbGF5X3BhcmVudF9kZXNjZW5kYW50c/UDQGNvbGxhdG9yX3BlZXJfaWQtAwAIHHNlbnRfYXQEDG1zZyQE/QMAAAgcc2VudF9hdAQgbXNnX2hhc2ggBAUEAAAINGZ1bGxfbWVzc2FnZXMBBDxoYXNoZWRfbWVzc2FnZXMJBAAIHHNlbnRfYXQEEGRhdGEkAwgEEQQEFQQAAwgEBQQEHQQAAAg0ZnVsbF9tZXNzYWdlcxkEPGhhc2hlZF9tZXNzYWdlcyEEAAhEZG93bndhcmRfbWVzc2FnZXMNBExob3Jpem9udGFsX21lc3NhZ2VzJQQCDAxGZWUAAQUQTWlzYwABBQxBbGwAAQUADAhpZOUBGGFtb3VudAgccmVhc29ucy0EBDEEAAAICGlk5QEYYW1vdW50CAQ5BAAACAhpZAkBGGFtb3VudAgEQQQAAAQYYW1vdW50CARJBAACFAhJZAEAFEluZGV4AZ0CDFJhdwEkJEFkZHJlc3MzMgEgJEFkZHJlc3MyMAElAQIIIEluY3JlYXNlAAEFIERlY3JlYXNlAAEFAggkVjFBbmNpZW50AAEFCFYyAAEFAAgQdXNlZAggYXRfYmxvY2sEAgwQTGl2ZQABBRhGcm96ZW4AAQUoRGVzdHJveWluZwABBQAwFG93bmVyABhpc3N1ZXIAFGFkbWluABxmcmVlemVyABhzdXBwbHkIHGRlcG9zaXQILG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCBhY2NvdW50cwQsc3VmZmljaWVudHMEJGFwcHJvdmFscwQYc3RhdHVzYQQDCFUBAAIMGExpcXVpZAABBRhGcm96ZW4AAQUcQmxvY2tlZAABBQIUIENvbnN1bWVyAAEFKFN1ZmZpY2llbnQAAQUsRGVwb3NpdEhlbGQBCDxEZXBvc2l0UmVmdW5kZWQAAQUsRGVwb3NpdEZyb20AAwgACAAMHGJhbGFuY2UIGHN0YXR1c20EGHJlYXNvbnEEAwxVAQAAAAgYYW1vdW50CBxkZXBvc2l0CAAUHGRlcG9zaXQIEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQGZQQGgQQACAx3aG8AHGRlcG9zaXQIBI0EAAMIACAElQQAAwgoJAMICAQCCAhPawABBSRTdXNwZW5kZWQAAQUAGCRyZWNpcGllbnQEFHN0YXRlpQQ0c2lnbmFsc19leGlzdBQsZmlyc3RfaW5kZXgEKGxhc3RfaW5kZXgEFGZsYWdzBASpBAADCAQEAAxEc3VzcGVuZF90aHJlc2hvbGQEOGRyb3BfdGhyZXNob2xkBEByZXN1bWVfdGhyZXNob2xkBAaBAgUBCAa9BAKgIE92ZXJmbG93AAEFNFVuaW1wbGVtZW50ZWQAAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAQUwTG9jYXRpb25GdWxsAAEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQABBSRCYWRPcmlnaW4AAQU8SW52YWxpZExvY2F0aW9uAAEFNEFzc2V0Tm90Rm91bmQAAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAEFPE5vdFdpdGhkcmF3YWJsZQABBUhMb2NhdGlvbkNhbm5vdEhvbGQAAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAAEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQUwVW5rbm93bkNsYWltAAEFOEZhaWxlZFRvRGVjb2RlAAEFQE1heFdlaWdodEludmFsaWQAAQU4Tm90SG9sZGluZ0ZlZXMAAQUwVG9vRXhwZW5zaXZlAAEFEFRyYXABCEBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQMIBMUEBskEAhgQTnVsbAABBRhBc3NldHMBcQI8RXhlY3V0aW9uUmVzdWx0Ac0EHFZlcnNpb24BBCxQYWxsZXRzSW5mbwEJAjhEaXNwYXRjaFJlc3VsdAENAgIYEE51bGwAAQUYQXNzZXRzAXkCPEV4ZWN1dGlvblJlc3VsdAHNBBxWZXJzaW9uAQQsUGFsbGV0c0luZm8BCQI4RGlzcGF0Y2hSZXN1bHQBDQICDAhWMwHRBAhWNAHVBAhWNQERAgIMHFBlbmRpbmcAABAkcmVzcG9uZGVygQJMbWF5YmVfbWF0Y2hfcXVlcmllcrkEMG1heWJlX25vdGlmecEEHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgAACBhvcmlnaW6BAiRpc19hY3RpdmUUFFJlYWR5AAAIIHJlc3BvbnNl2QQIYXQEAwgEgQIDDAgYBAMIgQIEBOkEAAIQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAEFXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEFUE5vdGlmeUN1cnJlbnRUYXJnZXRzAS0DaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAEFAgwIVjMBaQIIVjQBZQIIVjUBVQEDDAQA9QQDCJ0CCAT9BAAAEBhhbW91bnQIFG93bmVygQIYbG9ja2VygQIkY29uc3VtZXJzAQUDCAiBAgQJBQAACCBsb2NhdGlvboECGGV4cGlyeYUCBBEFAAAEIGFsaWFzZXJzFQUGZQIADCxkZXN0aW5hdGlvbmUCIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIQDEFsbAABBRRBbGxPZgAACAhpZGkCDGZ1biECKEFsbENvdW50ZWQBBDBBbGxPZkNvdW50ZWQAAAwIaWRpAgxmdW4hAhRjb3VudAQCCCBEZWZpbml0ZQFxAhBXaWxkASUFAsA0V2l0aGRyYXdBc3NldAFxAlRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBcQJYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAFxAjRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZdEEKG1heF93ZWlnaHQYHHF1ZXJpZXIdBTRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c3ECLGJlbmVmaWNpYXJ5ZQJQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRzcQIQZGVzdGUCDHhjbTEFIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kFQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAAADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAAABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwAADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgABBTREZXNjZW5kT3JpZ2luAWECLFJlcG9ydEVycm9yASEFMERlcG9zaXRBc3NldAAACBhhc3NldHMpBSxiZW5lZmljaWFyeWUCTERlcG9zaXRSZXNlcnZlQXNzZXQAAAwYYXNzZXRzKQUQZGVzdGUCDHhjbTEFNEV4Y2hhbmdlQXNzZXQAAAwQZ2l2ZSkFEHdhbnRxAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwAADBhhc3NldHMpBRxyZXNlcnZlZQIMeGNtMQVASW5pdGlhdGVUZWxlcG9ydAAADBhhc3NldHMpBRBkZXN0ZQIMeGNtMQU0UmVwb3J0SG9sZGluZwAACDRyZXNwb25zZV9pbmZvIQUYYXNzZXRzKQUwQnV5RXhlY3V0aW9uAAAIEGZlZXNtAjB3ZWlnaHRfbGltaXQtAjRSZWZ1bmRTdXJwbHVzAAEFPFNldEVycm9ySGFuZGxlcgExBSxTZXRBcHBlbmRpeAExBShDbGVhckVycm9yAAEFKENsYWltQXNzZXQAAAgYYXNzZXRzcQIYdGlja2V0ZQIQVHJhcAEIQFN1YnNjcmliZVZlcnNpb24AAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgABBSRCdXJuQXNzZXQBcQIsRXhwZWN0QXNzZXQBcQIwRXhwZWN0T3JpZ2luAR0FLEV4cGVjdEVycm9yAc0EUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQ0CLFF1ZXJ5UGFsbGV0AAAILG1vZHVsZV9uYW1lJDRyZXNwb25zZV9pbmZvIQUwRXhwZWN0UGFsbGV0AAAUFGluZGV4BBBuYW1lJCxtb2R1bGVfbmFtZSQsY3JhdGVfbWFqb3IEPG1pbl9jcmF0ZV9taW5vcgRQUmVwb3J0VHJhbnNhY3RTdGF0dXMBIQVMQ2xlYXJUcmFuc2FjdFN0YXR1cwABBTxVbml2ZXJzYWxPcmlnaW4BXQI0RXhwb3J0TWVzc2FnZQAADBxuZXR3b3JrVQIsZGVzdGluYXRpb25hAgx4Y20xBSRMb2NrQXNzZXQAAAgUYXNzZXRtAiB1bmxvY2tlcmUCLFVubG9ja0Fzc2V0AAAIFGFzc2V0bQIYdGFyZ2V0ZQI4Tm90ZVVubG9ja2FibGUAAAgUYXNzZXRtAhRvd25lcmUCNFJlcXVlc3RVbmxvY2sAAAgUYXNzZXRtAhhsb2NrZXJlAixTZXRGZWVzTW9kZQAABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljASAoQ2xlYXJUb3BpYwABBSxBbGlhc09yaWdpbgFlAjxVbnBhaWRFeGVjdXRpb24AAAgwd2VpZ2h0X2xpbWl0LQIwY2hlY2tfb3JpZ2luHQUELQUAAhAMQWxsAAEFFEFsbE9mAAAICGlkZQIMZnVuIQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZGUCDGZ1biECFGNvdW50BAIIIERlZmluaXRlAXkCEFdpbGQBNQUCwDRXaXRoZHJhd0Fzc2V0AXkCVFJlc2VydmVBc3NldERlcG9zaXRlZAF5AlhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AXkCNFF1ZXJ5UmVzcG9uc2UAABAgcXVlcnlfaWQIIHJlc3BvbnNl1QQobWF4X3dlaWdodBgccXVlcmllch0FNFRyYW5zZmVyQXNzZXQAAAgYYXNzZXRzeQIsYmVuZWZpY2lhcnllAlBUcmFuc2ZlclJlc2VydmVBc3NldAAADBhhc3NldHN5AhBkZXN0ZQIMeGNtQQUgVHJhbnNhY3QAAAwsb3JpZ2luX2tpbmQVAlhyZXF1aXJlX3dlaWdodF9hdF9tb3N0GBBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BYQIsUmVwb3J0RXJyb3IBIQUwRGVwb3NpdEFzc2V0AAAIGGFzc2V0czkFLGJlbmVmaWNpYXJ5ZQJMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHM5BRBkZXN0ZQIMeGNtQQU0RXhjaGFuZ2VBc3NldAAADBBnaXZlOQUQd2FudHkCHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0czkFHHJlc2VydmVlAgx4Y21BBUBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0czkFEGRlc3RlAgx4Y21BBTRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8hBRhhc3NldHM5BTBCdXlFeGVjdXRpb24AAAgQZmVlc3UCMHdlaWdodF9saW1pdC0CNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyAUEFLFNldEFwcGVuZGl4AUEFKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHN5Ahh0aWNrZXRlAhBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAF5AixFeHBlY3RBc3NldAF5AjBFeHBlY3RPcmlnaW4BHQUsRXhwZWN0RXJyb3IBzQRQRXhwZWN0VHJhbnNhY3RTdGF0dXMBDQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8hBTBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEhBUxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgFdAjRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmtVAixkZXN0aW5hdGlvbmECDHhjbUEFJExvY2tBc3NldAAACBRhc3NldHUCIHVubG9ja2VyZQIsVW5sb2NrQXNzZXQAAAgUYXNzZXR1Ahh0YXJnZXRlAjhOb3RlVW5sb2NrYWJsZQAACBRhc3NldHUCFG93bmVyZQI0UmVxdWVzdFVubG9jawAACBRhc3NldHUCGGxvY2tlcmUCLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAWUCPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQtAjBjaGVja19vcmlnaW4dBQQ9BQACDAhWMwExBQhWNAFBBQhWNQFNAgIQIFRlbGVwb3J0AAEFMExvY2FsUmVzZXJ2ZQABBUhEZXN0aW5hdGlvblJlc2VydmUAAQU0UmVtb3RlUmVzZXJ2ZQGBAgAIEHByZXaRAhBuZXh0kQIGTQUAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3Vyc1EFNG1lc3NhZ2VfY291bnQIEHNpemUIAwiRAgQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkAiwYcmVtYXJrAAAEGHJlbWFyayQ4c2V0X2hlYXBfcGFnZXMAAAQUcGFnZXMIIHNldF9jb2RlAAAEEGNvZGUkXHNldF9jb2RlX3dpdGhvdXRfY2hlY2tzAAAEEGNvZGUkLHNldF9zdG9yYWdlAAAEFGl0ZW1zgQMwa2lsbF9zdG9yYWdlAAAEEGtleXOFAyxraWxsX3ByZWZpeAAACBhwcmVmaXgkHHN1YmtleXMERHJlbWFya193aXRoX2V2ZW50AAAEGHJlbWFyayREYXV0aG9yaXplX3VwZ3JhZGUAAAQkY29kZV9oYXNoIIBhdXRob3JpemVfdXBncmFkZV93aXRob3V0X2NoZWNrcwAABCRjb2RlX2hhc2ggYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQAABBBjb2RlJAIITHNldF92YWxpZGF0aW9uX2RhdGEAAAgQZGF0YfkDVGluYm91bmRfbWVzc2FnZXNfZGF0YSkEYHN1ZG9fc2VuZF91cHdhcmRfbWVzc2FnZQAABBxtZXNzYWdlJAIEDHNldAAABAxub3cIAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgAAAgQZGVzdFEEFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgAADBhzb3VyY2VRBBBkZXN0UQQUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAgQZGVzdFEEFHZhbHVlCDB0cmFuc2Zlcl9hbGwAAAgQZGVzdFEEKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQAACAx3aG9RBBhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMAAAQMd2hvyQFEZm9yY2Vfc2V0X2JhbGFuY2UAAAgMd2hvUQQgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQAACCRkaXJlY3Rpb25VBBRkZWx0YQgQYnVybgAACBR2YWx1ZQgoa2VlcF9hbGl2ZRQCBCxjbGVhbl91c2FnZQAABBhlbnRpdHmlAQKIGGNyZWF0ZQAADAhpZFUBFGFkbWluUQQsbWluX2JhbGFuY2UIMGZvcmNlX2NyZWF0ZQAAEAhpZFUBFG93bmVyUQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UINHN0YXJ0X2Rlc3Ryb3kAAAQIaWRVAUBkZXN0cm95X2FjY291bnRzAAAECGlkVQFEZGVzdHJveV9hcHByb3ZhbHMAAAQIaWRVAThmaW5pc2hfZGVzdHJveQAABAhpZFUBEG1pbnQAAAwIaWRVASxiZW5lZmljaWFyeVEEGGFtb3VudAgQYnVybgAADAhpZFUBDHdob1EEGGFtb3VudAggdHJhbnNmZXIAAAwIaWRVARh0YXJnZXRRBBhhbW91bnQITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAwIaWRVARh0YXJnZXRRBBhhbW91bnQIOGZvcmNlX3RyYW5zZmVyAAAQCGlkVQEYc291cmNlUQQQZGVzdFEEGGFtb3VudAgYZnJlZXplAAAICGlkVQEMd2hvUQQQdGhhdwAACAhpZFUBDHdob1EEMGZyZWV6ZV9hc3NldAAABAhpZFUBKHRoYXdfYXNzZXQAAAQIaWRVAUh0cmFuc2Zlcl9vd25lcnNoaXAAAAgIaWRVARRvd25lclEEIHNldF90ZWFtAAAQCGlkVQEYaXNzdWVyUQQUYWRtaW5RBBxmcmVlemVyUQQwc2V0X21ldGFkYXRhAAAQCGlkVQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQ4Y2xlYXJfbWV0YWRhdGEAAAQIaWRVAUhmb3JjZV9zZXRfbWV0YWRhdGEAABQIaWRVARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UUGZvcmNlX2NsZWFyX21ldGFkYXRhAAAECGlkVQFIZm9yY2VfYXNzZXRfc3RhdHVzAAAgCGlkVQEUb3duZXJRBBhpc3N1ZXJRBBRhZG1pblEEHGZyZWV6ZXJRBCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQkaXNfZnJvemVuFEBhcHByb3ZlX3RyYW5zZmVyAAAMCGlkVQEgZGVsZWdhdGVRBBhhbW91bnQIPGNhbmNlbF9hcHByb3ZhbAAACAhpZFUBIGRlbGVnYXRlUQRUZm9yY2VfY2FuY2VsX2FwcHJvdmFsAAAMCGlkVQEUb3duZXJRBCBkZWxlZ2F0ZVEERHRyYW5zZmVyX2FwcHJvdmVkAAAQCGlkVQEUb3duZXJRBCxkZXN0aW5hdGlvblEEGGFtb3VudAgUdG91Y2gAAAQIaWRVARhyZWZ1bmQAAAgIaWRVAShhbGxvd19idXJuFDxzZXRfbWluX2JhbGFuY2UAAAgIaWRVASxtaW5fYmFsYW5jZQgsdG91Y2hfb3RoZXIAAAgIaWRVAQx3aG9RBDByZWZ1bmRfb3RoZXIAAAgIaWRVAQx3aG9RBBRibG9jawAACAhpZFUBDHdob1EEMHRyYW5zZmVyX2FsbAAADAhpZFUBEGRlc3RRBChrZWVwX2FsaXZlFDBzZXRfcmVzZXJ2ZXMAAAgIaWRVASByZXNlcnZlc7EBAgwYY3JlYXRlAAAIKGFzc2V0X2tpbmRVARByYXRlCBh1cGRhdGUAAAgoYXNzZXRfa2luZFUBEHJhdGUIGHJlbW92ZQAABChhc3NldF9raW5kVQECJERzZXRfaW52dWxuZXJhYmxlcwAABAxuZXfJAVhzZXRfZGVzaXJlZF9jYW5kaWRhdGVzAAAEDG1heARIc2V0X2NhbmRpZGFjeV9ib25kAAAEEGJvbmQIVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQABBTBsZWF2ZV9pbnRlbnQAAQVAYWRkX2ludnVsbmVyYWJsZQAABAx3aG8ATHJlbW92ZV9pbnZ1bG5lcmFibGUAAAQMd2hvACx1cGRhdGVfYm9uZAAABCxuZXdfZGVwb3NpdAhMdGFrZV9jYW5kaWRhdGVfc2xvdAAACBxkZXBvc2l0CBh0YXJnZXQAAgggc2V0X2tleXMAAAgQa2V5cyAUcHJvb2YkKHB1cmdlX2tleXMAAQUCFFRzdXNwZW5kX3hjbV9leGVjdXRpb24AAQVQcmVzdW1lX3hjbV9leGVjdXRpb24AAQVgdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkAAAEDG5ldwRUdXBkYXRlX2Ryb3BfdGhyZXNob2xkAAAEDG5ldwRcdXBkYXRlX3Jlc3VtZV90aHJlc2hvbGQAAAQMbmV3BAJEEHNlbmQAAAgQZGVzdIECHG1lc3NhZ2VFBTx0ZWxlcG9ydF9hc3NldHMAABAQZGVzdIECLGJlbmVmaWNpYXJ5gQIYYXNzZXRzfQI4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAAAQEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAAAIHG1lc3NhZ2VFBShtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgAACCBsb2NhdGlvblUBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24AAAREbWF5YmVfeGNtX3ZlcnNpb25lA3hmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkAAAQgbG9jYXRpb26BAoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQAABCBsb2NhdGlvboECfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMAABQQZGVzdIECLGJlbmVmaWNpYXJ5gQIYYXNzZXRzfQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdC0CXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAAAUEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQtAkBmb3JjZV9zdXNwZW5zaW9uAAAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAAAUEGRlc3SBAixiZW5lZmljaWFyeYECGGFzc2V0c30COGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQtAjBjbGFpbV9hc3NldHMAAAgYYXNzZXRzfQIsYmVuZWZpY2lhcnmBAox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgAAHBBkZXN0gQIYYXNzZXRzfQJQYXNzZXRzX3RyYW5zZmVyX3R5cGVJBThyZW1vdGVfZmVlc19pZPUESGZlZXNfdHJhbnNmZXJfdHlwZUkFSGN1c3RvbV94Y21fb25fZGVzdEUFMHdlaWdodF9saW1pdC0CUGFkZF9hdXRob3JpemVkX2FsaWFzAAAIHGFsaWFzZXKBAhxleHBpcmVzhQJccmVtb3ZlX2F1dGhvcml6ZWRfYWxpYXMAAAQcYWxpYXNlcoECdHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzAAEFAggkcmVhcF9wYWdlAAAIOG1lc3NhZ2Vfb3JpZ2lukQIocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AAAQOG1lc3NhZ2Vfb3JpZ2lukQIQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCIBRiYXRjaAAABBRjYWxscwUHNGFzX2Rlcml2YXRpdmUAAAgUaW5kZXgEEGNhbGwBByRiYXRjaF9hbGwAAAQUY2FsbHMFByxkaXNwYXRjaF9hcwAACCRhc19vcmlnaW6dARBjYWxsAQcsZm9yY2VfYmF0Y2gAAAQUY2FsbHMFByx3aXRoX3dlaWdodAAACBBjYWxsAQcYd2VpZ2h0GBxpZl9lbHNlAAAIEG1haW4BByBmYWxsYmFjawEHUGRpc3BhdGNoX2FzX2ZhbGxpYmxlAAAIJGFzX29yaWdpbp0BEGNhbGwBBwapAgIUUGFzX211bHRpX3RocmVzaG9sZF8xAAAIRG90aGVyX3NpZ25hdG9yaWVzyQEQY2FsbAEHIGFzX211bHRpAAAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPJATxtYXliZV90aW1lcG9pbnSVBRBjYWxsAQcobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQAAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVzyQE8bWF5YmVfdGltZXBvaW50lQUkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkAABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc8kBJHRpbWVwb2ludKkCJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AAAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPJASRjYWxsX2hhc2ggAhQQc3VkbwAABBBjYWxsAQdUc3Vkb191bmNoZWNrZWRfd2VpZ2h0AAAIEGNhbGwBBxh3ZWlnaHQYHHNldF9rZXkAAAQMbmV3UQQcc3Vkb19hcwAACAx3aG9RBBBjYWxsAQcocmVtb3ZlX2tleQABBQa5AgIsFHByb3h5AAAMEHJlYWxRBEBmb3JjZV9wcm94eV90eXBloQUQY2FsbAEHJGFkZF9wcm94eQAADCBkZWxlZ2F0ZVEEKHByb3h5X3R5cGW5AhRkZWxheQQwcmVtb3ZlX3Byb3h5AAAMIGRlbGVnYXRlUQQocHJveHlfdHlwZbkCFGRlbGF5BDhyZW1vdmVfcHJveGllcwABBSxjcmVhdGVfcHVyZQAADChwcm94eV90eXBluQIUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUAABQcc3Bhd25lclEEKHByb3h5X3R5cGW5AhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAAAIEHJlYWxRBCRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQAAAgQcmVhbFEEJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAAACCBkZWxlZ2F0ZVEEJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAAAQIGRlbGVnYXRlUQQQcmVhbFEEQGZvcmNlX3Byb3h5X3R5cGWhBRBjYWxsAQcwcG9rZV9kZXBvc2l0AAEFBQEMBQEUBQEYBQEcBQEkBQEoBQEsBQEwBQE0BQE4BQE8BQFEBQFIBQFMBQFUBQFYBQFcBQFgBQFkBQFoBQFsBQFwBQF0BQF4BQF8ApgQTm9uZQABBRBSYXcwAZ0CEFJhdzEBBBBSYXcyAb0EEFJhdzMBqQUQUmF3NAEoEFJhdzUBrQUQUmF3NgGxBRBSYXc3AbUFEFJhdzgB5QEQUmF3OQG5BRRSYXcxMAG9BRRSYXcxMQHBBRRSYXcxMgHFBRRSYXcxMwHJBRRSYXcxNAHNBRRSYXcxNQHRBRRSYXcxNgHpARRSYXcxNwHVBRRSYXcxOAHZBRRSYXcxOQHdBRRSYXcyMAElARRSYXcyMQHhBRRSYXcyMgHlBRRSYXcyMwHpBRRSYXcyNAHtBRRSYXcyNQHxBRRSYXcyNgH1BRRSYXcyNwH5BRRSYXcyOAH9BRRSYXcyOQEBBhRSYXczMAEFBhRSYXczMQEJBhRSYXczMgEgLEJsYWtlVHdvMjU2ASAYU2hhMjU2ASAkS2VjY2FrMjU2ASAsU2hhVGhyZWUyNTYBIAYlAQAoHGRpc3BsYXkNBhRsZWdhbA0GDHdlYg0GGG1hdHJpeA0GFGVtYWlsDQY8cGdwX2ZpbmdlcnByaW50EQYUaW1hZ2UNBhx0d2l0dGVyDQYYZ2l0aHViDQYcZGlzY29yZA0GAwgADQYEGQYAAiAcVW5rbm93bgABBRxGZWVQYWlkAQgoUmVhc29uYWJsZQABBSRLbm93bkdvb2QAAQUkT3V0T2ZEYXRlAAEFKExvd1F1YWxpdHkAAQUkRXJyb25lb3VzAAEFIEV4dGVybmFsAAEFBQEBAQUBBQECEBxFZDI1NTE5ASUGHFNyMjU1MTkBJQYURWNkc2EBKQYMRXRoASkGBi0GAgwcVHdpdHRlcgAABCB1c2VybmFtZSQYR2l0aHViAAAEIHVzZXJuYW1lJBxEaXNjb3JkAAAEPGRpc3BsYXlfYW5kX3RhZyQCeDRhZGRfcmVnaXN0cmFyAAAEHGFjY291bnRRBDBzZXRfaWRlbnRpdHkAAAQQaW5mbxUGIHNldF9zdWJzAAAEEHN1YnMdBjhjbGVhcl9pZGVudGl0eQABBURyZXF1ZXN0X2p1ZGdlbWVudAAACCRyZWdfaW5kZXgEHG1heF9mZWUIOGNhbmNlbF9yZXF1ZXN0AAAEJHJlZ19pbmRleAQcc2V0X2ZlZQAACBRpbmRleAQMZmVlCDhzZXRfYWNjb3VudF9pZAAACBRpbmRleAQMbmV3UQQoc2V0X2ZpZWxkcwAACBRpbmRleAQYZmllbGRzCERwcm92aWRlX2p1ZGdlbWVudAAAECRyZWdfaW5kZXgEGHRhcmdldFEEJGp1ZGdlbWVudCEGIGlkZW50aXR5IDRraWxsX2lkZW50aXR5AAAEGHRhcmdldFEEHGFkZF9zdWIAAAgMc3ViUQQQZGF0YQ0GKHJlbmFtZV9zdWIAAAgMc3ViUQQQZGF0YQ0GKHJlbW92ZV9zdWIAAAQMc3ViUQQgcXVpdF9zdWIAAQVYYWRkX3VzZXJuYW1lX2F1dGhvcml0eQAADCRhdXRob3JpdHlRBBhzdWZmaXgkKGFsbG9jYXRpb24EZHJlbW92ZV91c2VybmFtZV9hdXRob3JpdHkAAAgYc3VmZml4JCRhdXRob3JpdHlRBEBzZXRfdXNlcm5hbWVfZm9yAAAQDHdob1EEIHVzZXJuYW1lJCRzaWduYXR1cmUxBjh1c2VfYWxsb2NhdGlvbhQ8YWNjZXB0X3VzZXJuYW1lAAAEIHVzZXJuYW1lJFxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAAABCB1c2VybmFtZSRQc2V0X3ByaW1hcnlfdXNlcm5hbWUAAAQgdXNlcm5hbWUkPHVuYmluZF91c2VybmFtZQAABCB1c2VybmFtZSQ8cmVtb3ZlX3VzZXJuYW1lAAAEIHVzZXJuYW1lJDRraWxsX3VzZXJuYW1lAAAEIHVzZXJuYW1lJFRzZXRfcGVyc29uYWxfaWRlbnRpdHkAAAwcYWNjb3VudAAkc2lnbmF0dXJlLQYgdXNlcm5hbWUkjHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlAAAEKGNyZWRlbnRpYWw1BmhwZXJzb25hbF9jcmVkZW50aWFsX2p1ZGdlZAAADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudMkCXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5AAEFPHJlcG9ydF91c2VybmFtZQAABCB1c2VybmFtZSRgcmVwb3J0ZWRfdXNlcm5hbWVfanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50yQIEYQEAAiAsdW5kZXJfYWxpYXMAAAQQY2FsbAEHRHNldF9hbGlhc19hY2NvdW50AAAIHGFjY291bnQANGNhbGxfdmFsaWRfYXQETHVuc2V0X2FsaWFzX2FjY291bnQAAQVoZm9yY2VfcmVjb2duaXplX3BlcnNvbmhvb2QAAAQYcGVvcGxl0QJcc2V0X3BlcnNvbmFsX2lkX2FjY291bnQAAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdARkdW5zZXRfcGVyc29uYWxfaWRfYWNjb3VudAABBWBjcmVhdGVfcGVvcGxlX2NvbGxlY3Rpb24AAQVYY2xlYW5fdXBfc3RhbGVfYWxpYXNlcwAABBxhbGlhc2VzPQYCRBB2b3RlAAAIKGNhc2VfaW5kZXgEHG9waW5pb27JAihjbG9zZV9jYXNlAAAEKGNhc2VfaW5kZXgEKGNsZWFuX3ZvdGUAAAgoY2FzZV9pbmRleAQUdm90ZXIgJHJlYXBfY2FzZQAABChjYXNlX2luZGV4BCRpbnRlcnZlbmUAAAgoY2FzZV9pbmRleAQcdmVyZGljdMkCKGNsYWltX3ZvdGUAAAQoY2FzZV9pbmRleAQ4cGF5b3V0X3Jld2FyZHMAAAQsZGVzdGluYXRpb24ALGNsYWltX3ZvdGVzAAAEMGNhc2VfaW5kaWNlc9kCSHN0YXJ0X3BheW91dF9yb3VuZAABBVhzY2hlZHVsZV9wYXlvdXRfcm91bmRzAAAMGGFtb3VudAgUY291bnQEGHBlcmlvZARYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleAQwY2xhaW1fY3JlZGl0AAEFMGNsZWFuX3BvaW50cwAACBRyb3VuZAQUdm90ZXIgQGZvcmNlX3JpcGVuX2Nhc2UAAAQoY2FzZV9pbmRleAQodG91Y2hfY2FzZQAABChjYXNlX2luZGV4BFBjbGVhcl92b3RpbmdfcGVuYWx0eQABBURjbGVhbl92b3RlX3NpZ25lZAAACChjYXNlX2luZGV4BBR2b3RlciAFAYEBAhRARGVzaWduZWRFbGVjdGl2ZQAEBAEIRFByb2NlZHVyYWxBY2NvdW50AQRIUHJvY2VkdXJhbFBlcnNvbmFsAQQoUHJvY2VkdXJhbAADCAQEUFByb2NlZHVyYWxEZXJpdmF0aXZlAAMICIUCBKEEAAJYFGFwcGx5AAEFPHN1Ym1pdF9ldmlkZW5jZQAABCBldmlkZW5jZSAYanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50yQJEcmVnaXN0ZXJfcmVmZXJyZWQAAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwSQZUcmVnaXN0ZXJfbm9uX3JlZmVycmVkAAAMDGtleSAsZGVzdGluYXRpb24ASHByb29mX29mX293bmVyc2hpcEkGGHJlcm9sbAABBRhjb21taXQAAAgYY2hvaWNlTQYocmVxdWlyZV9pZIUCNGFsbG9jYXRlX2Z1bGwAAQUcdGltZW91dAAABBxhY2NvdW50ACBmbGFrZW91dAABBVBhcHBseV93aXRoX3NpZ25hdHVyZQAADCByZWZlcnJlcggkc2lnbmF0dXJlLQYYdGlja2V0AFRhcHBseV93aXRoX2ludml0YXRpb24AAAwcaW52aXRlcgAYdGlja2V0ACRzaWduYXR1cmUtBkRhZGRfZGVzaWduX2ZhbWlseQAADBRpbmRleAQQa2luZOECCGlkIExzZXRfcmVmZXJyYWxfdGlja2V0AAAEGHRpY2tldABYY2FuY2VsX3JlZmVycmFsX3RpY2tldAAABBh0aWNrZXQAjHJlZ2lzdGVyX3N1Y2Nlc3NmdWxfcmVmZXJyYWxfcmV3YXJkAAAELGRlc3RpbmF0aW9uADRncmFudF9pbnZpdGVzAAAIHGFjY291bnQAFGNvdW50BJByZW1vdmVfYXZhaWxhYmxlX2FuZF9wZW5kaW5nX2ludml0ZXMAAAgcYWNjb3VudAAUbGltaXQERHNldF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldABQY2FuY2VsX2ludml0ZV90aWNrZXQAAAQYdGlja2V0AERzZXRfY29uZmlndXJhdGlvbgAABBhjb25maWflAmBzZXRfcmVpbWJ1cnNlbWVudF92YWx1ZXMAAAg8cmVmZXJyZWRfdmFsdWVzUQY8cmVmZXJyZXJfdmFsdWVzUQYCCBhQZXJzb24AAQUkTm90UGVyc29uAAEFBFkGAARdBgAADDhnYW1lX3BsYXlfdGltZQQYcm91bmRzBDhtYXhfZ3JvdXBfc2l6ZQQEZQYAABQwcmVnaXN0cmF0aW9uBBxzaHVmZmxlBExwb3N0X3NodWZmbGVfbWFyZ2luBCRyZXBvcnRpbmcEOHBsYXllcl9wcm9jZXNzBAJITHNpZ25fdXBfd2l0aF9pbnZpdGUAAAQ4aWRlbnRpZmllcl9rZXkpBlBzaWduX3VwX3dpdGhfYWNjb3VudAAABDhpZGVudGlmaWVyX2tleSkGSHNpZ25fdXBfd2l0aF9hbGlhcwAADDhpZGVudGlmaWVyX2tleSkGRHN0YXRlbWVudF9hY2NvdW50AAxzaWctBhhyZXBvcnQAAAQsZnVsbF9yZXBvcnRhBiBvZmZib2FyZAABBRxraWNrb3V0AAAEGHBsYXllcgA0Z3JhbnRfaW52aXRlcwAACBxhY2NvdW50ABRjb3VudASQcmVtb3ZlX2F2YWlsYWJsZV9hbmRfcGVuZGluZ19pbnZpdGVzAAAIHGFjY291bnQAFGxpbWl0BERzZXRfaW52aXRlX3RpY2tldAAABBh0aWNrZXQAUGNhbmNlbF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldAA4c2NoZWR1bGVfZ2FtZXMAAAQ8Z2FtZXNfc2NoZWR1bGVzaQZUcmVtb3ZlX3NjaGVkdWxlZF9nYW1lAAAEOGdhbWVfcGxheV90aW1lBDBjbGFpbV9yZXdhcmQAAAQsYmVuZWZpY2lhcnkAQGNsYWltX2dhbWVfcHJpemUAABQccG9vbF9pZAQocmluZ19pbmRleAQgcmV2aXNpb24EFHByb29mjQEsYmVuZWZpY2lhcnkAbHRlc3RuZXRfZm9yY2Vfc3RhcnRfc2h1ZmZsZQABBWx0ZXN0bmV0X2ZvcmNlX2VuZF9yZXBvcnRpbmcAAQVcdGVzdG5ldF9zZXRfZ2FtZV9waGFzZXMAAAQYcGhhc2VzbQZkdGVzdG5ldF9raWxsX2N1cnJlbnRfZ2FtZQABBQMIIEkGBnUGAAxkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZAQYd2luZG93BDhhbGxvd2VkX21pc3NlcwQEfQYAAiBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleARAdHJhbnNpdGlvbl9yb3VuZAAABCxyb3VuZF9pbmRleARQb3BlcmF0ZV9wYXlvdXRfcm91bmQAAAgscm91bmRfaW5kZXgEFGxpbWl0BCBjYXNoX291dAABBTRyZWRlZW1fY3JlZGl0AAAELGRlc3RpbmF0aW9uACByZWdpc3RlcgAABAxrZXl5BmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQAABCBzY2hlZHVsZYEGAwgIIASJBgAECAACICxyZXNlcnZlX2lkcwAABBRjb3VudARQcmVuZXdfaWRfcmVzZXJ2YXRpb24AAAQIaWQIVGNhbmNlbF9pZF9yZXNlcnZhdGlvbgAABAhpZAhQcmVjb2duaXplX3BlcnNvbmhvb2QAAAQwaWRzX2FuZF9rZXlzjQZIc3VzcGVuZF9wZXJzb25ob29kAAAEDGlkc5EGRHJlc3VtZV9wZXJzb25ob29kAAAECGlkCFhzdGFydF9tdXRhdGlvbl9zZXNzaW9uAAEFUGVuZF9tdXRhdGlvbl9zZXNzaW9uAAEFABQkc2lnbmF0dXJlLQYcYWNjb3VudAA4aWRlbnRpZmllcl9rZXkpBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUtAwaZBgIYeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQAACBxhY2NvdW50ABRjb3VudARsY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlAAAEHGFjY291bnQAGGF0dGVzdAAAFCRjYW5kaWRhdGUATGNhbmRpZGF0ZV9zaWduYXR1cmUtBjByaW5nX3ZyZl9rZXkgSHByb29mX29mX293bmVyc2hpcEkGVGNvbnN1bWVyX3JlZ2lzdHJhdGlvbp0GSGRpc3BhdGNoX2FzX3NpZ25lcgAABBBjYWxsAQdEc2V0X2FsaWFzX2FjY291bnQAAAgcYWNjb3VudAA4dmFsaWRfYXRfYmxvY2sETHVuc2V0X2FsaWFzX2FjY291bnQAAQUCCChTdGFuZGFsb25lASQsUmVzZXJ2YXRpb24BJAAIGHBlcmlvZAQMc2VxBAI0UHJlZ2lzdGVyX2xpdGVfcGVyc29uAAAMOGlkZW50aWZpZXJfa2V5KQYgdXNlcm5hbWUkRHJlc2VydmVkX3VzZXJuYW1lLQM8cmVnaXN0ZXJfcGVyc29uAAAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mLQY8dXNlcm5hbWVfY2hvaWNlpQZodG91Y2hfcGVyc29uX2F1dGhvcml6YXRpb24AAQWMcmVtb3ZlX2V4cGlyZWRfdXNlcm5hbWVfcmVzZXJ2YXRpb24AAAggdXNlcm5hbWUkHGFjY291bnQAVHVwZGF0ZV9pZGVudGlmaWVyX2tleQAABDhpZGVudGlmaWVyX2tleSkGhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgAABCBkdXJhdGlvbghMZGVtb3RlX2F1dGhfZXhwaXJlZAAABBxhY2NvdW50AMRzZXRfZnJpZW5kX3JlcXVlc3Rfc3RhdGVtZW50X2FjY291bnRfZm9yX3NlcXVlbmNlAAAIJHJlZmVyZW5jZakGKGFjY291bnRfaWQAlGNsZWFyX2V4cGlyZWRfZnJpZW5kX3JlcXVlc3Rfc2VxdWVuY2UAAAgcYWNjb3VudAAMc2VxBGxzZXRfc3RhdGVtZW50X3N0b3JlX2FjY291bnQAAAwYcGVyaW9kBAxzZXEEOHRhcmdldF9hY2NvdW50AIxjbGVhcl9leHBpcmVkX3N0bXRfc3RvcmVfYWxsb3dhbmNlcwAACBhwZXJpb2QELGZpcnN0X2VudHJ5IFxjbGFpbV9sb25nX3Rlcm1fc3RvcmFnZQAADBhwZXJpb2QEHGNvdW50ZXIEKGFjY291bnRfaWQAnGNsZWFyX2V4cGlyZWRfbG9uZ190ZXJtX3N0b3JhZ2VfYWxpYXNlcwAACBhwZXJpb2QEFGxpbWl0BAIIKGFkZF9jaHVua3MAAAw0cmluZ19leHBvbmVudAUDKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJFRzZXRfY2h1bmtfcGFnZV9oYXNoZXMAAAg0cmluZ19leHBvbmVudAUDLHBhZ2VfaGFzaGVz0QICNCxtZXJnZV9yaW5ncwAADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BExzZXRfb25ib2FyZGluZ19zaXplAAAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQwc2VsZl9pbmNsdWRlAAAMKGlkZW50aWZpZXIgGG1lbWJlciA0Y2FsbF92YWxpZF9hdAhUYnVpbGRfcmluZ19hdXRob3JpemVkAAAUKGlkZW50aWZpZXIgKHJpbmdfaW5kZXgENHJpbmdfZXhwb25lbnQFAyByZXZpc2lvbgQodG9faW5jbHVkZQRob25ib2FyZF9tZW1iZXJzX2F1dGhvcml6ZWQAAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQQaGVhZARwbWVyZ2VfcXVldWVfcGFnZXNfYXV0aG9yaXplZAAADChpZGVudGlmaWVyIDBpbml0aWFsX2hlYWQEIG5ld19oZWFkBIByZW1vdmVfc3VzcGVuZGVkX2tleXNfYXV0aG9yaXplZAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BGxkZWxldGVfcmluZ19wYWdlX2F1dGhvcml6ZWQAAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQocGFnZV9pbmRleASAZW5xdWV1ZV9yaW5nX2RlbGV0aW9uX2F1dGhvcml6ZWQAAAgoaWRlbnRpZmllciAocmluZ19pbmRleAScZGVsZXRlX29uYm9hcmRpbmdfcXVldWVfcGFnZV9hdXRob3JpemVkAAAIKGlkZW50aWZpZXIgKHBhZ2VfaW5kZXgEnGZpbmFsaXplX2NvbGxlY3Rpb25fZGVsZXRpb25fYXV0aG9yaXplZAAABChpZGVudGlmaWVyIGhtYXJrX3Jpbmdfc3RhbGVfYXV0aG9yaXplZAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BHRjbGVhbl91cF9vbGRfcm9vdHNfYXV0aG9yaXplZAAADChpZGVudGlmaWVyIChyaW5nX2luZGV4BBRsaW1pdAQDCATJAQS5BgACDChFeHBlbmRhYmxlAAEFHFByb3RlY3QAAQUgUHJlc2VydmUAAQUAEDBwcmVzZXJ2YXRpb27BBhR2YWx1ZQQobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwSQYExQYAABAUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQcYWxpYXNlc9ECBM0GAAJYFHNwbGl0AAAEKHNwbGl0X2ludG+9BiB0cmFuc2ZlcgAABAh0bwBcbG9hZF9yZWN5Y2xlcl93aXRoX2NvaW4AAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwSQaEbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0AAAQMHByZXNlcnZhdGlvbsEGFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBqBsb2FkX3JlY3ljbGVyX3dpdGhfZXh0ZXJuYWxfYXNzZXRfdW5wYWlkAAAQMHByZXNlcnZhdGlvbsEGFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBrhsb2FkX3JlY3ljbGVyX3dpdGhfZXh0ZXJuYWxfYXNzZXRfdW5wYWlkX2JhdGNoAAAEFGl0ZW1zyQZkdW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbgAAFBxhbGlhc2Vz0QIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AjHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAUHGFsaWFzZXPRAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwCscGF5X2Zvcl9yZWN5Y2xlcl91bmxvYWRfZmVlX3Rva2VuX3dpdGhfY29pbgAACChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXBJBrRwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9uYXRpdmUAAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwSQa0cGF5X2Zvcl9yZWN5Y2xlcl91bmxvYWRfZmVlX3Rva2VuX3dpdGhfc3RhYmxlAAAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcEkGwHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0X2FuZF92b3VjaGVycwAAHBxhbGlhc2Vz0QIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AVGV4dGVybmFsX2Fzc2V0X2Ftb3VudAgwbmV3X3ZvdWNoZXJz3QPEdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBRpbnB1dM0GMGFsaWFzX3Byb29mc5EBCHRvADBmZWVfY3VycmVuY3kRA8h1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBhpbnB1dHPRBjBhbGlhc19wcm9vZnORAQh0bwAwZmVlX2N1cnJlbmN5EQNodW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbnMAABgcYWxpYXNlc9ECFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+9BhxtYXhfZmVlCKBkaXJlY3Rfb2ZmYm9hcmRfY29pbl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAECHRvADhjbGVhbl9yZWN5Y2xlcgAABBR2YWx1ZQRkY2xlYW5fY29uc3VtZWRfZnJlZV90b2tlbgAABBhwZXJpb2QEcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcAAAgYcGVyaW9kBChyaW5nX2luZGV4BExjbGVhbl9yZWN5Y2xlcl9kdXN0AAEFcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAAQWsZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbgAABBhwZXJpb2QEAwggBQME2QYAAhwkc3Vic2NyaWJlAAAMXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkBExtZW1iZXJzX2NvbGxlY3Rpb25z3QYwcGFsbGV0X2luZGV4BCx1bnN1YnNjcmliZQAABFxzdWJzY3JpYmVyX3BhcmFjaGFpbl9pZGUDOHJlcXVlc3RfcmVwbGF5AAAMXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkBChpZGVudGlmaWVyIERyaW5nX3Jvb3RfaW5kaWNlc9kCPGVucXVldWVfdXBkYXRlcwAABCRzZW5kX3BhZ2UEKHNlbmRfYmF0Y2gAAAgccGFyYV9pZAQgc2VxdWVuY2UIOHNlbmRfaW5pdF9wYWdlAAAMHHBhcmFfaWQEYGN1cnJlbnRfY29sbGVjdGlvbl9pbmRleARAYWZ0ZXJfcmluZ19pbmRleGUDTGFiYW5kb25fc3R1Y2tfYmF0Y2gAAQUCBHhzZXRfYWlyZHJvcF9zY2hlZHVsaW5nX2VuYWJsZWQAAAQcZW5hYmxlZBQCDDxvcGVuX3ByaXplX3Bvb2wAABwYdGFyZ2V0JQMoZGlzcGF0Y2hlcgAgdmFsaWRpdHkEKG51bV9wcml6ZXMELHByaXplX3ZhbHVlCCBhc3NldF9pZFUBMHdpbm5lcl9yYXRpbwQsY2xhaW1fcHJpemUAABgccG9vbF9pZAQocmluZ19pbmRleAQgcmV2aXNpb24EFHByb29mjQEUYWxpYXMgLGJlbmVmaWNpYXJ5AEBjbG9zZV9wcml6ZV9wb29sAAAEHHBvb2xfaWQEAAwUaW5kZXgEMGlubmVyX2N1cnNvci0DKHN0YXJ0ZWRfYXQEAggYQWN0aXZlAe0GFFN0dWNrAAEFBvEGAgggU3BlY2lmaWMBhQMgV2lsZGNhcmQAAAgUbGltaXRlAzxwcmV2aW91c19jdXJzb3ItAwIQQGZvcmNlX3NldF9jdXJzb3IAAAQYY3Vyc29y9QZcZm9yY2Vfc2V0X2FjdGl2ZV9jdXJzb3IAAAwUaW5kZXgEMGlubmVyX2N1cnNvci0DKHN0YXJ0ZWRfYXRlA0hmb3JjZV9vbmJvYXJkX21ibXMAAQU4Y2xlYXJfaGlzdG9yaWMAAAQgc2VsZWN0b3L5BgKIGFN5c3RlbQFhBTxQYXJhY2hhaW5TeXN0ZW0BZQUkVGltZXN0YW1wAWkFNFBhcmFjaGFpbkluZm8BnQIgQmFsYW5jZXMBbQVET3JpZ2luUmVzdHJpY3Rpb24BcQUYQXNzZXRzAXUFJEFzc2V0UmF0ZQF5BURDb2xsYXRvclNlbGVjdGlvbgF9BRxTZXNzaW9uAYEFJFhjbXBRdWV1ZQGFBSxQb2xrYWRvdFhjbQGJBShDdW11bHVzWGNtAZ0CME1lc3NhZ2VRdWV1ZQGNBRxVdGlsaXR5AZEFIE11bHRpc2lnAZkFEFN1ZG8BnQUUUHJveHkBpQUgSWRlbnRpdHkBOQYYUGVvcGxlAUEGHE1vYlJ1bGUBRQYoUHJvb2ZPZkluawFVBhBHYW1lAXEGFFNjb3JlAYUGIER1bW15RGltAZUGKFBlb3BsZUxpdGUBoQYkUmVzb3VyY2VzAa0GNENodW5rc01hbmFnZXIBsQYcTWVtYmVycwG1BhxDb2luYWdlAdUGPE1lbWJlcnNOb3RpZmllcgHhBlRTdG9yYWdlSW5pdGlhbGl6YXRpb24B5QYcQWlyZHJvcAHpBlBNdWx0aUJsb2NrTWlncmF0aW9ucwH9BgQBBwAAEBB3aGVuqQIcZGVwb3NpdAgkZGVwb3NpdG9yACRhcHByb3ZhbHPJAQAMIGRlbGVnYXRlAChwcm94eV90eXBluQIUZGVsYXkEBA0HAAMIEQcIAAwQcmVhbAAkY2FsbF9oYXNoIBhoZWlnaHQEBBkHAAMIHQcIAwgEIQYEJQcAAAwoanVkZ2VtZW50cykHHGRlcG9zaXQIEGluZm8VBgMICMkBAAwcYWNjb3VudAAMZmVlCBhmaWVsZHMIBjUHBDkHAAAIKGFjY291bnRfaWQAKGFsbG9jYXRpb24EAgwoQWxsb2NhdGlvbgABBUBBdXRob3JpdHlEZXBvc2l0AQgYU3lzdGVtAAEFAAgUb3duZXIAIHByb3ZpZGVyRQcDDAAERQcDCDUGBARRBwAAEBxhY2NvdW50AEhwZW5kaW5nX2p1ZGdlbWVudHNVBxhiYW5uZWQUZHVzZXJuYW1lX2xhc3RfcmVwb3J0ZWRfYXRlAwAMIHJlcG9ydGVyACB1c2VybmFtZSQcY2FzZV9pZAQACAxrZXkgHGFjY291bnSxAgAQFHZvdGVkBBxjbGVhbmVkBBxjb3JyZWN0BBhjcmVkaXQIAhBARGVzaWduZWRFbGVjdGl2ZQAEBAEIRFByb2NlZHVyYWxBY2NvdW50AAMIBCBIUHJvY2VkdXJhbFBlcnNvbmFsAAMIBAgoUHJvY2VkdXJhbAADCAQoAgwoUHJvb2ZPZkluawAADBhkZXNpZ25pByBldmlkZW5jZSBMcHJvYmFibGVfYWNjZXB0YWJsZRRISWRlbnRpdHlDcmVkZW50aWFsAAAIIHBsYXRmb3JtNQYgZXZpZGVuY2UkNFVzZXJuYW1lVmFsaWQAAAQgdXNlcm5hbWUkAAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BAAMJHN0YXRlbWVudG0HHGNvbnRleHQkIGNhbGxiYWNrcQcADAxheWUEDG5heQQgY29udGVtcHQEAAwUc2luY2UIHGRldGFpbHN1BxR0YWxseXkHAAgcZGV0YWlsc3UHHHZlcmRpY3TJAgAIFHNpbmNlCBx2ZXJkaWN0yQIAFBRyb3VuZAQ8aW5pdGlhbF9iYWxhbmNlCERyZW1haW5pbmdfYmFsYW5jZQgwdG90YWxfcG9pbnRzCBRzdGFydAQADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIGHBlcmlvZAQEjQcAAgwgUmVmZXJyZWQBCBxEZXBvc2l0AQgcSW52aXRlZAEAAgwcSW5pdGlhbAABBSBJbml0RG9uZQABBRBGdWxsAAEFAgwcQXBwbGllZAAADBBjcmVklQccZW50cm9weSA0ZW50cm9weV9zaW5jZQQgU2VsZWN0ZWQAACAUc2luY2UEEGNyZWSVByByZXNlcnZlZAgcZW50cm9weSAYZGVzaWduaQcoYWxsb2NhdGlvbpkHHGp1ZGdpbmdlAxhmYWlsZWQEGFByb3ZlbgAAEBhkZXNpZ25pByByZXNlcnZlZAgwd2FzX3JlZmVycmVkFCx3YXNfaW52aXRlZBQGaQcAJBhkZXNpZ26hB0BhY3RpdmVfcmVmZXJyYWxzyQFgYWxsb3dlZF9yZWZlcnJhbF90aWNrZXRzBDRiYWRfcmVmZXJyYWxzBFBzdWNjZXNzZnVsX3JlZmVycmFscwQkcmVmZXJyYWxzBCxkZXJpdmF0aXZlcwQYYmFubmVkFGBwZW5kaW5nX3JlZmVycmFsX3Jld2FyZHMEAAgQa2luZOECCGlkIAIIIFJlc2VydmVkAAEFJENvbW1pdHRlZAABBQQAAQgDCO0CIAIIIEtpY2thYmxlAAAIKGZpcnN0X2dhbWUEOGFyY2hpdmVkX3NpbmNlBChVbmtpY2thYmxlAAAEKGZpcnN0X2dhbWUEAAwoYXR0ZW5kYW5jZRRUZXh0ZXJuYWxseV9yZWNvZ25pemVkFCh6ZXJvX3Njb3JlFAa9BwIMHEludml0ZWQAAQUoUmVjb2duaXplZAABBRxEZXBvc2l0AQgAJChmaXJzdF9nYW1lBChyZWdpc3RlcmVkFCxzZW50X3JlcG9ydBRoZWFybHlfYXR0ZW5kYW5jZV9lbmFjdG1lbnTBByh5ZXNfcGVyc29uBDRub19ub3RfcGVyc29uBGBleHBlY3RlZF9tYXhfdm90ZV93ZWlnaHQELHZvdGVfd2VpZ2h0BCxjcmVkaWJpbGl0ecUHBu0CAhAsU3RlcDFJbnNlcnQAAAQ4bGFzdF9pdGVyYXRpb27NBzRTdGVwMlJldHJpZXZlAAAIRG5leHRfcGxheWVyX2luZGV4BExyZWNvZ25pemVkX2ZpbmlzaGVkFExTdGVwM0NvbXB1dGVXZWlnaHRzAAAIOGxhc3RfaXRlcmF0aW9uzQcwcGxheWVyX2NvdW50BERTdGVwNEF3YWl0U2Vzc2lvbgAABDBwbGF5ZXJfY291bnQEAhQwUmVnaXN0cmF0aW9uAAAERG5leHRfcGxheWVyX2luZGV4BBxTaHVmZmxlAAAEEHN0ZXDRByRSZXBvcnRpbmcAAAQwcGxheWVyX2NvdW50BDRQbGF5ZXJQcm9jZXNzAAAIOGxhc3RfaXRlcmF0aW9uzQcwcGxheWVyX2NvdW50BChDYW5jZWxsaW5nAAAEOGxhc3RfaXRlcmF0aW9uzQcAJBRpbmRleAREcmVnaXN0cmF0aW9uX2VuZHMEQHNodWZmbGVfZGVhZGxpbmUEJGdhbWVfZGF0ZQQscmVwb3J0X2VuZHMEFHN0YXRl1Qc4bWF4X2dyb3VwX3NpemUEGHJvdW5kcwRIcGVuZGluZ19hdHRlbmRhbmNlBAAIKGdhbWVfaW5kZXgEKHJhbmRvbW5lc3MgAgggRWxpZ2libGUBBBxDbGFpbWVkAAEFAgggQXR0ZW5kZWQBBBhBYnNlbnQBBAIQUEV4dGVybmFsbHlSZWNvZ25pemVkAAEFNE5vdFJlY29nbml6ZWQAAQUkU3VzcGVuZGVkAQgoUmVjb2duaXplZAEIACAUc2NvcmUEGHN0cmVha+UHSGF0dGVuZGFuY2VfaGlzdG9yeQQYY3JlZGl0CChjYXNoZWRfb3V0FEhyZWFjaGVkX3BlcnNvbmhvb2QUbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZBQscmVjb2duaXRpb27pBwMIBO0CABBEcmVtYWluaW5nX2JhbGFuY2UILHBvaW50X3ByaWNlCCRyZW1haW5kZXIIMHRvdGFsX3BvaW50cwQACCRmaW5pc2hfYXQEGGNyZWRpdAgADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIIGR1cmF0aW9uBAT9BwAACAxrZXkgJHN1c3BlbmRlZBQCBDBVbmlxdWVEZXZpY2UBAAAIMHJpbmdfdnJmX2tleSAYbWV0aG9kCQgCCBBMaXRlAAEFGFBlcnNvbgAADBRhbGlhcyAsbGFzdF91cGRhdGUIHGRlbW90ZWQUABA4aWRlbnRpZmllcl9rZXkpBjRmdWxsX3VzZXJuYW1lLQM0bGl0ZV91c2VybmFtZSQsY3JlZGliaWxpdHkRCAMIKCAADChhY2NvdW50X2lkAAxzZXEEFHNpbmNlCAMMKAQgAwgAIQgACChhY2NvdW50X2lkACRyZWZlcmVuY2WpBgAIHGFjY291bnQAJGpvaW5lZF9hdAgELQgAAAgkbWF4X2NvdW50BCBtYXhfc2l6ZQQDCAUDBARJBgACCCBFeHRlcm5hbAFVARRMb2NhbAEAAggoQXBwZW5kT25seQABBSBGbGV4aWJsZQABBQAQFG93bmVyQQgQbW9kZUUIJHJpbmdfc2l6ZQUDUHNlbGZfaW5jbHVzaW9uX2RlbGF5hQIDCCAEBQEBDAUBQQ0ADBByb290UQggcmV2aXNpb24EMGludGVybWVkaWF0ZVUIAwwgBCgACBByb290UQgsYXJjaGl2ZWRfYXQIAwwgBAQADBR0b3RhbAQgaW5jbHVkZWQEPGltbXV0YWJsZV9zaW5jZYUCBCABCAIMKE9uYm9hcmRpbmcAAAgocXVldWVfcGFnZQQkcXVldWVkX2F0CCBJbmNsdWRlZAAADChyaW5nX2luZGV4BCRyaW5nX3BhZ2UENHJpbmdfcG9zaXRpb24EJFN1c3BlbmRlZAABBQIIKEFwcGVuZE9ubHkAAQUgTXV0YXRpbmcBBAIEOEZhaWxlZERpc3BhdGNoAAAEHHJldHJpZXMEAAgYcmVhc29ueQgUdW50aWwIAwwEBCAEZQMBCAZpCAaJAQAMLGNvbGxlY3Rpb25z3QZIbGFzdF9pbml0X3NlcXVlbmNlCDBwYWxsZXRfaW5kZXgEAAwod3JpdGVfcGFnZQQkc2VuZF9wYWdlBERsYXN0X3VwZGF0ZV9ibG9jawQDDAQgBAAYLGNvbGxlY3Rpb25z3QZgY3VycmVudF9jb2xsZWN0aW9uX2luZGV4BEBhZnRlcl9yaW5nX2luZGV4ZQMgc2VxdWVuY2UILHNvdXJjZV90aW1lCDBwYWxsZXRfaW5kZXgEABAgc2VxdWVuY2UILHNvdXJjZV90aW1lCCRzZWFsZWRfYXQEVHJlbWFpbmluZ19zdWJzY3JpYmVycwQCICBJbmFjdGl2ZQABBTRDcmVhdGluZ0Fzc2V0AAEFQFhjbUZ1bmRzVHJhbnNmZXIAAQU4VmVyaWZ5aW5nRnVuZHMAAQUsRnVuZGluZ1BvdHMAAQVgU2NoZWR1bGluZ01vYlJ1bGVQYXlvdXRzAAEFWFNjaGVkdWxpbmdTY29yZVBheW91dHMAAQVMT3BlbmluZ0FpcmRyb3BQb29scwABBQIIIEluYWN0aXZlAAEFJENvbXBsZXRlZAABBQQIARAAIAhpZAQYdGFyZ2V0JQMoZGlzcGF0Y2hlcgAoZXhwaXJlc19hdAhAcHJpemVzX3JlbWFpbmluZwQscHJpemVfdmFsdWUIIGFzc2V0X2lkVQFAdGFyZ2V0X3RocmVzaG9sZK0IAgwMWWVzAAEFCE5vAAEFFFN0dWNrAAEFABBEY3VycmVudF9taWdyYXRpb24EQHRvdGFsX21pZ3JhdGlvbnMEXGN1cnJlbnRfbWlncmF0aW9uX3N0ZXBzBGxjdXJyZW50X21pZ3JhdGlvbl9tYXhfc3RlcHNlAwa5CAAMHG9uZ29pbme1CCBwcm9ncmVzc70IIHByZWZpeGVzhQMACBhoZWFkZXLxAyhleHRyaW5zaWNzhQMCCDRBbGxFeHRyaW5zaWNzAAEFNE9ubHlJbmhlcmVudHMAAQUACBhwcmVmaXjpARhzdWZmaXjpAQIMOE5vdEltcGxlbWVudGVkAAEFIE5vdEZvdW5kAc0IFENvZGVjAAEFByTRCAI0EENhbGwAAQUcUGF5bWVudAABBRhGdXR1cmUAAQUUU3RhbGUAAQUgQmFkUHJvb2YAAQVEQW5jaWVudEJpcnRoQmxvY2sAAQVERXhoYXVzdHNSZXNvdXJjZXMAAQUYQ3VzdG9tAQQwQmFkTWFuZGF0b3J5AAEFTE1hbmRhdG9yeVZhbGlkYXRpb24AAQUkQmFkU2lnbmVyAAEFVEluZGV0ZXJtaW5hdGVJbXBsaWNpdAABBTRVbmtub3duT3JpZ2luAAEFAgwwQ2Fubm90TG9va3VwAAEFTE5vVW5zaWduZWRWYWxpZGF0b3IAAQUYQ3VzdG9tAQQCCBxJbnZhbGlkAdkIHFVua25vd24B3QgHoQLhCAMI5QEkBOkIAAAMEG9rYXkULGZhdGFsX2Vycm9yFBhlcnJvcnPtCAIMHEluQmxvY2sAAQUUTG9jYWwAAQUgRXh0ZXJuYWwAAQUAFCBwcmlvcml0eQggcmVxdWlyZXOFAyBwcm92aWRlc4UDJGxvbmdldml0eQgkcHJvcGFnYXRlFAf5COEIAAgQa2V5cyQUcHJvb2YkAwgkKAQFCQAGCQkADBh3ZWlnaHQYFGNsYXNzOCxwYXJ0aWFsX2ZlZQgADCBiYXNlX2ZlZQgcbGVuX2ZlZQhMYWRqdXN0ZWRfd2VpZ2h0X2ZlZQgGFQkACDRpbmNsdXNpb25fZmVlGQkMdGlwCAT1BAACGDRVbmltcGxlbWVudGVkAAEFZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFNEFzc2V0Tm90Rm91bmQAAQUoVW5yb3V0YWJsZQABBQchCSUJBxglCQcIJQkHfQIlCQAINGFjdHVhbF93ZWlnaHQZAiBwYXlzX2ZlZTwACCRwb3N0X2luZm85CRRlcnJvctgHOQk9CQQ1AwAGRQUERQUAAwiBAk0JBFEJAAAQQGV4ZWN1dGlvbl9yZXN1bHRBCThlbWl0dGVkX2V2ZW50c0UJJGxvY2FsX3hjbUkJOGZvcndhcmRlZF94Y21zVQkCCDRVbmltcGxlbWVudGVkAAEFZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQUHWQldCQAMQGV4ZWN1dGlvbl9yZXN1bHThAThlbWl0dGVkX2V2ZW50c0UJOGZvcndhcmRlZF94Y21zVQkHZQldCQIILFVuc3VwcG9ydGVkAAEFZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQUHAG0JABg8dXB3YXJkX21lc3NhZ2VzhQNMaG9yaXpvbnRhbF9tZXNzYWdlc+kDTG5ld192YWxpZGF0aW9uX2NvZGUtA2xwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMEOGhybXBfd2F0ZXJtYXJrBCRoZWFkX2RhdGEkB50CSQMGSQMESQMA"; export default content; diff --git a/packages/host-papp/.papi/descriptors/dist/people_lite.d.ts b/packages/host-papp/.papi/descriptors/dist/people_lite.d.ts index ba18ce0d..ee4ced4c 100644 --- a/packages/host-papp/.papi/descriptors/dist/people_lite.d.ts +++ b/packages/host-papp/.papi/descriptors/dist/people_lite.d.ts @@ -1,5 +1,5 @@ import { StorageDescriptor, PlainDescriptor, TxDescriptor, RuntimeDescriptor, Enum, ApisFromDef, QueryFromPalletsDef, TxFromPalletsDef, EventsFromPalletsDef, ErrorsFromPalletsDef, ConstFromPalletsDef, ViewFnsFromPalletsDef, SS58String, SizedHex, FixedSizeArray } from "polkadot-api"; -import type { I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, If3cj9t96ueeqn, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I4q39t5hn830vp, I1v7jbnil3tjns, I8jgj1nhcr2dg8, Ifn6q3equiq9qi, Ia3sb0vgvovhtg, Iav8k1edbj86k7, Itom7fk49o0c9, I4i91h98n3cv1b, I4iumukclgj8ej, Iqnbvitf7a7l3, I48i407regf59r, I6r5cbv8ttrb09, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, I2sr2hoa6imct2, I9bin2jc70qt6q, TransactionPaymentReleases, Icj0tssrh6ika3, I8arc778cv9pqq, I3qklfjubrljqh, If9iqq7i64mur8, Iag3f1hum3p4c8, I4v5g6i7bmt06o, I4s6jkha20aoh0, I84bhscllvv07n, I78s05f59eoi8b, If2801grpltbp8, Ia2lhg7l2hilo3, Ifi4da1gej1fri, Ifvgo9568rpmqc, I82jm9g7pufuel, Ic5m5lp1oioo8r, I6cs1itejju2vv, Icgljjb6j82uhn, Ib77b0fp1a6mjr, I5g2vv0ckl2m8b, Ifup3lg9ro8a0f, I5qfubnuvrnqn6, I8t3u2dv73ahbd, I7vlvrrl2pnbgk, Ie0rpl5bahldfk, XcmPalletVersionMigrationStage, I7e5oaj2qi4kl1, Ie849h3gncgvok, Iat62vud7hlod2, Ict03eedr8de9s, Ici7ejds60vj52, XcmVersionedLocation, Idh2ug6ou4a8og, Iejeo53sea6n4q, I53esa2ms463bk, Ib4jhb8tt3uung, Iag146hmjgqfgj, I8uo3fpd3bcc6f, I48e2fe747rjco, I9p9lq3rej5bhc, I8sp8i1c9u7kvv, I910puuahutflf, I4nfjdef0ibh44, I74af64m08r6as, Ic8ann3kre6vdm, I1j72qfgdejqsv, I60biiepd74113, I2skcsqibb3i2k, I4ekkp6f1d7a69, Ifpolrv9bn0ss8, Icq9999ubti4jr, I6vki5ip88t309, I5h2gdbrcdulu5, I4p5t2krb1gmvp, Id32895epm7otq, I14eopu9hl6hgk, Iaq1a4h34blh5u, Ieaqfchj8o5p3e, Ia11lg4mrmjqfg, Idevgv5mu1k9gt, Ic5ardbudan54b, I6n9krukma1mut, Ie6cl0ap8d265e, I9feps983hs1sf, I9jd27rnpm8ttv, I63ubv9qb76gl3, I2na29tt2afp0j, Ifip05kcrl65am, I644th47nna91b, I9u9nqhm3kqr8q, I191vhdj2skphj, Iavh3dqjok18o8, Idfgmv0r2plk6t, I5dmkj9ep3uuaq, I1v8hffmq0a2s2, Iesh4knl67dirc, Idrbto15rld189, I6lggg4mrl1u2s, I3nqube2n1nohj, Idodgrto60av5h, Id26d02t80vjh, I4009rejbekrdq, I81vbsdqasdsr1, I7odqmvebn62ca, Ic66kva37scc9l, I53g8q9761kkrn, I7hvvp2oeegqa0, Iaq2bjd3j738m9, I9lcj3313n9e9v, I6t8fqjt3u136v, I4pact7n2e9a0i, I2t447bb26t9i6, I831tj5voub6u0, I6cufgusp40k9i, I766emmc9ccni0, Ie1vuhuh0vpgrb, I6sjgjftjavcbd, I2l7r05e3266s4, I5eoome1iv99mc, I35mml84uvstml, I83hq8olm7phlp, Ianbabfvoj16rj, I6dk4nvven1i08, I3sean4dbblfft, I3n8fv9mo53kq5, I6ouflveob4eli, Ibuqgslo88n368, Iepbsvlk3qceij, In7a38730s6qs, If15el53dd76v9, I9s0ave7t0vnrk, I4fo08joqmcqnm, XcmV5Junctions, Iasb8k6ash5mjn, Idvob66qflhcgd, I7qcffr6se5g9, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, Ial23jn8hp0aen, Ifpj261e8s63m3, Idcr6u6361oad9, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, Iea5hvin03frku, I7t2thek61ghou, I61tdrsafr1vf3, Ibsk5g3rhm45pu, Icfoe9q8d4vs8f, Ibrfmvjrg4trnb, Iedih7t34maii9, I4e902qbfel1f1, Ie4met0joi8sv0, I1t8vq6a06ohhu, Icvt3pdunbinm7, I9ui3n41balr2q, I89sl7btgl24g2, I3u6g26k9kn96u, If1invp94rsjms, Ie5nc19gtiv5sv, Iald3dgvt1hjkb, Iurrhahet4gno, I5tamv2nk8bj8o, I8apq8e7c7qcpp, Id1e31ij0c35fv, Ic6vatc0h2tbq8, I72jcvr86rnvv8, I90c919drss29e, Ifccifqltb5obi, Iadtsfv699cq8b, Ialpmgmhr3gk5r, I4cbvqmqadhrea, I3sdol54kg5jaq, I8fougodaj6di6, I81vt5eq60l4b6, I3vh014cqgmrfd, Ia5cotcvi888ln, I21jsa919m88fd, Iegif7m3upfe1k, I9kt8c221c83ln, Ic76kfh5ebqkpl, Icscpmubum33bq, I21d2olof7eb60, Ibgm4rnf22lal1, Ie68np0vpihith, I9bnv6lu0crf1q, Iauhjqifrdklq7, Ie1uso9m8rt5cf, I40pqum1mu8qg3, I1r4c2ghbtvjuc, I152bmabo1ja8r, I5gr18losjkfla, Ia1a97fvmufuk9, Ier9vl0psdeggp, I5rom81gl99ha6, I7bfb7cb54ioch, Iant3bti5h6pr5, Ideaemvoneh309, I3d9o9d7epp66v, I6lqh1vgb4mcja, Ifbu3sk81n1s98, I8k3rnvpeeh4hv, Ibm3nepcfano8f, I85imvra134bvp, I6hk7temg1mga7, I2lbmfajhc5gdu, I2siheq6f2djrd, I2eb501t8s6hsq, Ianmuoljk2sk1u, I6neqijlncmft9, Ic6cqd9g0t65v0, I5sv83ib1q5mod, Ia9mkdf6l44shb, I9l2s4klu0831o, I2ctrt5nqb8o7c, I711qahikocb1c, I6o1er683vod1j, Id6gojh30v9ib2, Ibk29mtr51rukj, Id9uqtigc0il3v, Ic68lsi7chpv5k, Iek0boln8pgnko, I452bkd71b385t, Ie83f0p0ke1f4u, Ib9nmpn9ru9aeh, Ie5l999tf7t2te, I6b6ng21g2eap6, Ia5eqng70q48q6, I79nh52dspn15s, I6viutd279aov3, I6tuqjmsr5ahcq, Ia56ucs8f4gubv, Id1vp19i5a7adv, Ic01glfot2319, Ibi23t489qjaej, I6a7ia4g91p320, I7iebj213rflmh, I1c6o7t4005obp, I666bl2fqjkejo, I3sgg3ifcuhgsi, I2t4r3qi2bbfq5, In8qsbu1v3duv, I9cpejm8q1n41i, Icbccs0ug47ilf, I48li8do1boqsk, I8cj8rnq5f1nol, Idnsos6tvi9tt6, I95p7g3tmk59ap, Ibl1gaa0rn2c67, Id8vsjdockv55e, I4s48t49obgv40, I1b497vgt5ie3v, Ievhkup0angt51, Iagbfsso0n5e7i, I8dtsqbl6shss6, Ifpsbvfoe7erus, Isicv7jbqf8q2, Ic9lb0ksm6bqp9, I49vkvcrq1mpqd, Icpk5dvoekngbe, Iepoo00jurbs3c, I6vn2ukq88hmrf, I2vuilbucl2tir, I2onutgm9avq0n, Iafscmv8tjf0ou, I4ov6e94l79mbg, Ib5ou59k6na5qv, I7qh4t1qniuepu, I6gk1lo90mp8d9, Ifd8dbgpm7srdt, Ifbug00rch8etj, I28tfrqrmts741, I1i6t85s8phv1c, Igmmsl9pnapid, Ijgrep2ca50rk, Iasnonvq8v9o5g, I1tqpuolr7lnbt, Idjiu7vp8ovdab, I6mk90q9np5nf3, Ichkkipipv6vbf, Ibv24s7lkcbv1r, Iadkk9nq2cqqve, I5u969d5la0il0, I9cbgq5mcmbt3f, I8en8uvi5isgvj, I43mn70lup4q9c, I286qhrd3thf21, Iefn145htl05b6, I3kigttc60kr03, Icnkee0to4c5ac, I7ts20td7b1pmf, I7315hlp5liq47, I6carn61qjeh6d, Id6g2uejluf2av, I24nmtkeq4rln8, Ibou4u1engb441, Id6nbvqoqdj4o2, I95iqep3b8snn9, Ia82mnkmeo2rhc, I9rkcukfi09eph, I855j4i3kr8ko1, I3sflsrdvuq35i, Idd7hd99u0ho0n, I100l07kaehdlp, I6gnbnvip5vvdi, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, Id5fm4p8lj5qgi, I8tjvj9uq4b7hi, I3qt1hgg4djhgb, I4fooe9dun9o0t, I8vi83jdnuv7ad, I8td84k1e6i7l7, Ibthrs8djrs4ha, Iph9c4rn81ub2, Ier2cke86dqbr2, Ibsq380ld6eu40, Icqe266pmnr25o, I5hoiph0lqphp, I5k7oropl9ofc7, I48vagp1omigob, Ib5tst4ppem1g6, Ibn64edsrg3737, I83r9d02dh47j9, I22bm4d7re21j9, I3jnhifvaeuama, I8n1gia0lo42ok, I6gb0o7lqjfdjq, Idh36v6iegkmpq, I27hnueutmchbe, Iectm2em66uhao, I7q57goff3j72h, Ibe49veu9i9nro, I1rnkmiu7usb82, Iadvnek4gbu68j, Id7k54q1ita2p5, I5k7edfft48vsq, Iaeqj2ebnvkjqe, I39t01nnod9109, I6v8sm60vvkmk7, I1qmtmbe5so8r3, Ih99m6ehpcar7, Idgorhsbgdq2ap, I9ubb2kqevnu6t, I2hq50pu2kdjpo, I9acqruh7322g2, I137t1cld92pod, I61d51nv4cou88, If8u5kl4h8070m, Ibmuil6p3vl83l, I7lul91g50ae87, Icl7nl1rfeog3i, Iasr6pj6shs0fl, I2uqmls7kcdnii, Idg69klialbkb8, I7r6b7145022pp, I30pg328m00nr3, Icmrn7bogp28cs, I7m9b5plj4h5ot, I9onhk772nfs4f, I3l6bnksrmt56r, Idh09k0l2pmdcg, I7uoiphbm0tj4r, I512p1n7qt24l8, I6s1nbislhk619, I3gghqnh2mj0is, I6iv852roh6t3h, I9oc2o6itbiopq, Ibslgga81p36aa, I1rvj4ubaplho0, Ia3uu7lqcc1q1i, I7crucfnonitkn, I7tmrp94r9sq4n, I79le71ktscd50, I70ckf4r79j73, Id9b74nn3tchdg, Ian9q7t9erse0r, Iep27ialq4a7o7, Iasu5jvoqr43mv, I1ujdbplbo9mv, I5qolde99acmd1, I8gtde5abn1g9a, I2006ti8jidts7, I5rtkmhm2dng4u, Iquobi9ukq7tb, I4mj21qcksiuf3, I2ur0oeqg495j8, I8v2su1f60qoae, I1bhd210c3phjj, Iep1lmt6q3s6r3, I1fac16213rie2, Ifjt77oc391o43, Itvt1jsipv0lc, Ick3mveut33f44, I719lqkkbtikbl, Ie4intrc3n8jfu, I2rg5btjrsqec0, Ibdqerrooruuq9, I8u2ba9jeiu6q0, I7ieadb293k6b4, I86ooiomatht8n, I7v1eea9s3tjf6, Ifcon2ngg4leli, I7luomlm0cts8l, I53pb13fh9bdtb, I5eoknm3d4b0hp, I1267r4okm030g, I7v53d8lg25u6e, Ie732hi40q3bng, I4auq2rk2vmnof, I36d2sa03ne4gv, Id0mmcnagcakpt, I3fn79iu085nho, I1qepegjhn0439, I3g1h0napekm89, Ib4r095rdf5mqu, I816g8dafh3n9m, I5rguq5hs7ae5g, Id0n15ml7mlce1, I95dvhl27mlrti, I6mojmjujt2q9u, I3j43dj5855fif, I9m7e67l1rvair, I2fsu027d9jn8p, I1858d79avs8nu, I4dge44jia159s, I7uvflbq4g7rn, Icpl0grufrj09l, Ibi26id9j1t520, Ieitag1fl7hkds, Ie060ubkeme5vs, I58bu3hm7657hm, Icc0fkkhtd78sc, I9vf1so75dnrom, I9lf1r3fch8ino, Ickpn0png35631, I3ns5kg6jo268n, I7hu7hl7r35nrm, Idpufnltgsuodp, I4c20l83g9496a, I4gp88defd7an, Id113tpicu8sh3, I6ceb7pmur4hki, Ie2d9d2u1qa7ro, I5kek6hgenovr0, I91tbphb2dk7gn, I5509mqtnio180, Ifojd05k7ogo8n, I2h93i19beq4qk, I4lmgf1qe39res, Igvk3mrc51o9l, Iflaqn0or9nfpj, Ib248pp8oe1coj, I6os196hd8lgc2, I71gd3i0mgtnp1, If1co0pilmi7oq, Iae74gjak1qibn, I3escdojpj0551, I5r8t4iaend96p, I6052turo9tavh, I35p85j063s0il, Iemk0s5gdc9ruv, I1v6u80pcf53ne, Ieuemnllefri8h, Iavc33atjrmdmp, I596b7bbfu4tap, I4arjljr6dpflb, Ia4n949ohqh8lm, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, I4gil44d08grh, I7u915mvkdsb08, Ie7mmsj6dufc7j, If7uv525tdvv7a, I2an1fs2eiebjp, TransactionValidityTransactionSource, I9ask1o4tfvcvs, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, Iftvbctbo05fu4, XcmVersionedXcm, Ic0c3req3mlc1l, XcmVersionedAssetId, I7ocn4njqde3v5, Iek7ha36da9mf5, Ieh6nis3hdbtgi, Ico18ks790i2bl, I815pbp5omtss, Ib808ejar4brae, Ic1d4u2opv3fst, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, I3ju6ot8lfmk90, Id3vovj0ihlrsb, I1rmvc8k7ssl0, I4rnuci7kia2r1, I6k0juar2doko8, Icbb3ruvdvu6qp, Ied6o1m0g5iajq, I5pvq44l06a3og } from "./common-types.js"; +import type { I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, Ia9ctkgrquvhdh, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I4q39t5hn830vp, I8re9183nrhr3n, I1v7jbnil3tjns, I8jgj1nhcr2dg8, Ifn6q3equiq9qi, Ia3sb0vgvovhtg, Iav8k1edbj86k7, Itom7fk49o0c9, I4i91h98n3cv1b, I4iumukclgj8ej, Iqnbvitf7a7l3, I48i407regf59r, I6r5cbv8ttrb09, Inofn0qqbjtb9, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, I2sr2hoa6imct2, I9bin2jc70qt6q, TransactionPaymentReleases, Icj0tssrh6ika3, I8arc778cv9pqq, I3qklfjubrljqh, If9iqq7i64mur8, Iag3f1hum3p4c8, I4v5g6i7bmt06o, I4s6jkha20aoh0, I84bhscllvv07n, I78s05f59eoi8b, If2801grpltbp8, Ia2lhg7l2hilo3, Ifi4da1gej1fri, Ifvgo9568rpmqc, I82jm9g7pufuel, Ic5m5lp1oioo8r, I6cs1itejju2vv, Icgljjb6j82uhn, I9pvau8qut93lg, I5g2vv0ckl2m8b, Ifup3lg9ro8a0f, I5qfubnuvrnqn6, I8t3u2dv73ahbd, I7vlvrrl2pnbgk, Ie0rpl5bahldfk, XcmPalletVersionMigrationStage, I7e5oaj2qi4kl1, Ie849h3gncgvok, Iat62vud7hlod2, Ict03eedr8de9s, Ici7ejds60vj52, XcmVersionedLocation, Idh2ug6ou4a8og, Iejeo53sea6n4q, I53esa2ms463bk, Ib4jhb8tt3uung, Iag146hmjgqfgj, I8uo3fpd3bcc6f, I48e2fe747rjco, I9p9lq3rej5bhc, I8sp8i1c9u7kvv, I910puuahutflf, I4nfjdef0ibh44, I74af64m08r6as, Ic8ann3kre6vdm, I1j72qfgdejqsv, I60biiepd74113, I2skcsqibb3i2k, I4ekkp6f1d7a69, Ifpolrv9bn0ss8, Icq9999ubti4jr, I6vki5ip88t309, I5h2gdbrcdulu5, I4p5t2krb1gmvp, Id32895epm7otq, I14eopu9hl6hgk, Iaq1a4h34blh5u, Ieaqfchj8o5p3e, Ia11lg4mrmjqfg, Idevgv5mu1k9gt, Ic5ardbudan54b, I6n9krukma1mut, Ie6cl0ap8d265e, I9feps983hs1sf, I9jd27rnpm8ttv, I63ubv9qb76gl3, I2na29tt2afp0j, Ifip05kcrl65am, I644th47nna91b, I9u9nqhm3kqr8q, I191vhdj2skphj, Iavh3dqjok18o8, Ievlctk0hj2fed, Iehnjl0g9ebdqu, I1v8hffmq0a2s2, Idqtb21truteet, I6cpea5eggna34, Iesh4knl67dirc, Idrbto15rld189, I6lggg4mrl1u2s, I3nqube2n1nohj, Idodgrto60av5h, Id26d02t80vjh, I4009rejbekrdq, I81vbsdqasdsr1, I23bplm6qtgrpd, Ifopum5rctcidn, I9jea06984vfti, I8vqqii9cbfqng, Id77vvrgqmru2o, Ic66kva37scc9l, I1fa62uavcqia6, I7hvvp2oeegqa0, Ie3d56aup8po4r, I9lcj3313n9e9v, I3136o2hmi4al3, I4pact7n2e9a0i, Iff5ulsdvgntip, Iara29l6qkt9is, I2t447bb26t9i6, I831tj5voub6u0, I54g1hqjgru9ba, I2ccsdtloqt0h4, I766emmc9ccni0, I6sjgjftjavcbd, I2l7r05e3266s4, I5eoome1iv99mc, Ib55cg44k2chb5, I6msd8eb5ee1ee, I5b6v7o79lps5k, I4hus3s8lblmj7, Iff773s2hdisds, Ieenjgm8k62jr1, I183k62sm9tgqf, I83hq8olm7phlp, I29r7jgavo472s, Iepbsvlk3qceij, In7a38730s6qs, Ibtil0ss5munbk, I9s0ave7t0vnrk, I4fo08joqmcqnm, XcmV5Junctions, Iasb8k6ash5mjn, Idvob66qflhcgd, I7qcffr6se5g9, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, Ial23jn8hp0aen, Ifpj261e8s63m3, Idcr6u6361oad9, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, Iea5hvin03frku, I7t2thek61ghou, I61tdrsafr1vf3, Ibsk5g3rhm45pu, Icfoe9q8d4vs8f, Ibrfmvjrg4trnb, Iedih7t34maii9, I4e902qbfel1f1, Ie4met0joi8sv0, I1t8vq6a06ohhu, Icvt3pdunbinm7, I9ui3n41balr2q, I89sl7btgl24g2, I3u6g26k9kn96u, If1invp94rsjms, Ie5nc19gtiv5sv, Iald3dgvt1hjkb, Iurrhahet4gno, I5tamv2nk8bj8o, I8apq8e7c7qcpp, Id1e31ij0c35fv, Ic6vatc0h2tbq8, I72jcvr86rnvv8, I90c919drss29e, Ifccifqltb5obi, Iadtsfv699cq8b, Ialpmgmhr3gk5r, I4cbvqmqadhrea, I3sdol54kg5jaq, I8fougodaj6di6, I81vt5eq60l4b6, I3vh014cqgmrfd, Ia5cotcvi888ln, I21jsa919m88fd, Iegif7m3upfe1k, I9kt8c221c83ln, Ic76kfh5ebqkpl, Icscpmubum33bq, I21d2olof7eb60, Ibgm4rnf22lal1, Ie68np0vpihith, I9bnv6lu0crf1q, Iauhjqifrdklq7, Ie1uso9m8rt5cf, I40pqum1mu8qg3, I1r4c2ghbtvjuc, Icrfq6sihf9s7d, Idgkjnpm8ga334, Ie1rsmrsrog847, I39hqnpmrp1r81, I93ri1gd07v5fi, I7840qsg0nkgru, I2ajh25ofhvcua, Ideaemvoneh309, I3d9o9d7epp66v, I6lqh1vgb4mcja, Ice56905d72v4c, I8k3rnvpeeh4hv, I52hq8921se3sb, I54b3f8hqshk56, I6hk7temg1mga7, I2lbmfajhc5gdu, I2siheq6f2djrd, I2eb501t8s6hsq, Ianmuoljk2sk1u, Ilh4h42jvp82e, Ic6cqd9g0t65v0, I5sv83ib1q5mod, Ia9mkdf6l44shb, I9l2s4klu0831o, I2ctrt5nqb8o7c, I711qahikocb1c, I6o1er683vod1j, Id6gojh30v9ib2, Ibk29mtr51rukj, Id9uqtigc0il3v, Ic68lsi7chpv5k, Iek0boln8pgnko, I452bkd71b385t, Ie83f0p0ke1f4u, Ib9nmpn9ru9aeh, Ie5l999tf7t2te, I6b6ng21g2eap6, Ia5eqng70q48q6, I79nh52dspn15s, I6viutd279aov3, I6tuqjmsr5ahcq, I8k2cd3v73pgjh, Ia56ucs8f4gubv, Id1vp19i5a7adv, Ic01glfot2319, Ibi23t489qjaej, I6a7ia4g91p320, I7iebj213rflmh, I1c6o7t4005obp, I666bl2fqjkejo, I3sgg3ifcuhgsi, I2t4r3qi2bbfq5, In8qsbu1v3duv, I9cpejm8q1n41i, Icbccs0ug47ilf, I48li8do1boqsk, I8cj8rnq5f1nol, Idnsos6tvi9tt6, I95p7g3tmk59ap, Ibl1gaa0rn2c67, Id8vsjdockv55e, I4s48t49obgv40, I1b497vgt5ie3v, Ievhkup0angt51, Iagbfsso0n5e7i, I8dtsqbl6shss6, Ifpsbvfoe7erus, Isicv7jbqf8q2, Ic9lb0ksm6bqp9, I8ligieds2efci, Ib5qs0kka2gvvq, I49vkvcrq1mpqd, Icpk5dvoekngbe, Iepoo00jurbs3c, I6vn2ukq88hmrf, I2vuilbucl2tir, I2onutgm9avq0n, Iafscmv8tjf0ou, I4ov6e94l79mbg, Ib5ou59k6na5qv, I7qh4t1qniuepu, I6gk1lo90mp8d9, Iefam38o91ona9, Ifd8dbgpm7srdt, Ifbug00rch8etj, I28tfrqrmts741, I1i6t85s8phv1c, I5os021n9mtdcr, I66tl4phltl6bg, I4t3pgt4ilgpf6, Ifles5ioatcuip, Id2jcn0qee7h6f, Ijgrep2ca50rk, Iasnonvq8v9o5g, I6mk90q9np5nf3, Ichkkipipv6vbf, Ie0n67dnlcbpcf, I1bv5scdc27nbb, I12c2udla9t40g, I4eperb3q65q14, Idpufnltgsuodp, I8lare4sf457ul, I2gt0vglt3agsj, Idjiu7vp8ovdab, I4maqh2jefgv7u, Ibv24s7lkcbv1r, Iadkk9nq2cqqve, I5u969d5la0il0, I9cbgq5mcmbt3f, I4694teukj6drg, I8en8uvi5isgvj, Ibg509ejf21uui, I286qhrd3thf21, Iefn145htl05b6, I497d2v63rjmg, Icnkee0to4c5ac, I7ts20td7b1pmf, I7315hlp5liq47, Ic73rrpct6ckoa, Ib1hmb261fe7mh, I9jfggcqa8oi6c, I437snu8jbuaj2, Ic44opm4fbhp4r, Ia7k5rk3a67fgt, I94dejtmu6d72i, I3q0ci59rqeel6, Iferob091njnjq, I931cottvong90, Ibou4u1engb441, Id6nbvqoqdj4o2, I95iqep3b8snn9, Ia82mnkmeo2rhc, I682dmd1dh82o7, I1jm8m1rh9e20v, I855j4i3kr8ko1, I38icn8oj6uv8q, Idd7hd99u0ho0n, I100l07kaehdlp, I6gnbnvip5vvdi, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, Id5fm4p8lj5qgi, I8tjvj9uq4b7hi, I3qt1hgg4djhgb, I4fooe9dun9o0t, I8vi83jdnuv7ad, I8td84k1e6i7l7, Ibthrs8djrs4ha, Iph9c4rn81ub2, Ier2cke86dqbr2, Iblesbqf0lfloi, Icqe266pmnr25o, I5hoiph0lqphp, I5k7oropl9ofc7, I48vagp1omigob, Ib5tst4ppem1g6, Ibn64edsrg3737, I83r9d02dh47j9, I22bm4d7re21j9, I3jnhifvaeuama, I8n1gia0lo42ok, I6gb0o7lqjfdjq, Idh36v6iegkmpq, I27hnueutmchbe, Iectm2em66uhao, I7q57goff3j72h, Ibe49veu9i9nro, I1rnkmiu7usb82, Iadvnek4gbu68j, Ibtugueatkkr9s, Id7k54q1ita2p5, I5k7edfft48vsq, Iaeqj2ebnvkjqe, I39t01nnod9109, I6v8sm60vvkmk7, I1qmtmbe5so8r3, Ih99m6ehpcar7, Idgorhsbgdq2ap, I9ubb2kqevnu6t, I2hq50pu2kdjpo, I9acqruh7322g2, I137t1cld92pod, I61d51nv4cou88, If8u5kl4h8070m, Ibmuil6p3vl83l, I7lul91g50ae87, Icl7nl1rfeog3i, Iasr6pj6shs0fl, I2uqmls7kcdnii, Idg69klialbkb8, I7r6b7145022pp, I30pg328m00nr3, Icmrn7bogp28cs, I7m9b5plj4h5ot, I9onhk772nfs4f, I3l6bnksrmt56r, Idh09k0l2pmdcg, I7uoiphbm0tj4r, I512p1n7qt24l8, I6s1nbislhk619, I3gghqnh2mj0is, I6iv852roh6t3h, I9oc2o6itbiopq, Ibslgga81p36aa, I1rvj4ubaplho0, Ia3uu7lqcc1q1i, I7crucfnonitkn, I7tmrp94r9sq4n, I66uqe1tndt513, I9m3mb6r2i2eeq, Idbn36j11p05sj, I12la7j60vkuj3, Iep27ialq4a7o7, Iasu5jvoqr43mv, I8ktnt89fcg3hj, I5qolde99acmd1, I8gtde5abn1g9a, I6fn8r3em1pi9r, I5rtkmhm2dng4u, Iquobi9ukq7tb, I4mj21qcksiuf3, I2ur0oeqg495j8, I8v2su1f60qoae, I1bhd210c3phjj, Iep1lmt6q3s6r3, I1fac16213rie2, Ifjt77oc391o43, Itvt1jsipv0lc, Ick3mveut33f44, I719lqkkbtikbl, Ie4intrc3n8jfu, I2rg5btjrsqec0, Ibdqerrooruuq9, I8u2ba9jeiu6q0, I7ieadb293k6b4, I86ooiomatht8n, I7v1eea9s3tjf6, Ifcon2ngg4leli, I7luomlm0cts8l, I53pb13fh9bdtb, I5eoknm3d4b0hp, I1267r4okm030g, I7v53d8lg25u6e, Ie732hi40q3bng, I4auq2rk2vmnof, I36d2sa03ne4gv, Id0mmcnagcakpt, I3fn79iu085nho, I1qepegjhn0439, I3g1h0napekm89, Ib4r095rdf5mqu, I816g8dafh3n9m, I5rguq5hs7ae5g, Id0n15ml7mlce1, I95dvhl27mlrti, I6mojmjujt2q9u, I3j43dj5855fif, I9m7e67l1rvair, I2fsu027d9jn8p, I1858d79avs8nu, I4dge44jia159s, I7uvflbq4g7rn, Icpl0grufrj09l, Ibi26id9j1t520, I8s2eo7q9t6vgf, Idscf6boak49q1, Iet3fv7oighgft, I6kmurc4thdo8g, Ieitag1fl7hkds, Ie060ubkeme5vs, I58bu3hm7657hm, Icc0fkkhtd78sc, I9vf1so75dnrom, I9hg8vptgbqai, I16m4f7hclkkad, I5dvnb65dm4f56, I2abip8j5bmg27, Ickpn0png35631, I3ns5kg6jo268n, I7hu7hl7r35nrm, Ia783as0f2ls27, I298u2lqese6h0, I4c20l83g9496a, I4gp88defd7an, Id113tpicu8sh3, I6ceb7pmur4hki, Ie2d9d2u1qa7ro, Iebdi09jg1ifvr, I5kek6hgenovr0, I91tbphb2dk7gn, I5509mqtnio180, Ifojd05k7ogo8n, I2h93i19beq4qk, I4lmgf1qe39res, Igvk3mrc51o9l, I37r4bdai8o9mp, Ifrvjscp9m1e73, Iamcee9e6bogsv, I2e1ek76m34991, I6fdggv3obvfs5, I6uvt8pub5nl1g, Ia9o5rqpv3sn2g, Iah53milao1ikg, I25h8dena9rh5c, If1co0pilmi7oq, Iae74gjak1qibn, I3escdojpj0551, I5r8t4iaend96p, I6052turo9tavh, I35p85j063s0il, Iemk0s5gdc9ruv, Ic6sunr27jf8hd, Ieuemnllefri8h, Iavc33atjrmdmp, I596b7bbfu4tap, I4arjljr6dpflb, Ia4n949ohqh8lm, I9vodnt2k1kha, I4ao1le27fcisl, Ih4ursllob8fg, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, I4gil44d08grh, I7u915mvkdsb08, I36df3b03i92s9, If7uv525tdvv7a, I2an1fs2eiebjp, TransactionValidityTransactionSource, I9ask1o4tfvcvs, I4ph3d1eepnmr1, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, Iftvbctbo05fu4, XcmVersionedXcm, Ic0c3req3mlc1l, XcmVersionedAssetId, I7ocn4njqde3v5, Iek7ha36da9mf5, I3l05tjm1loph7, Ibtr2nt1h0uqqj, I903fknvm1u4c2, Ieh6nis3hdbtgi, Ic1d4u2opv3fst, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, Id3vovj0ihlrsb, I1rmvc8k7ssl0, I4rnuci7kia2r1, I6k0juar2doko8, I6ul9o7lquu20t, Iffdld0va52cu6, I98dq16mf7vpj3, Ic3b9c1lrhkh77, Ib1rdh37tsufsr } from "./common-types.js"; type AnonymousEnum = T & { __anonymous: true; }; @@ -29,9 +29,11 @@ type IStorage = { */ BlockWeight: StorageDescriptor<[], Anonymize, false, never>; /** - * Total length (in bytes) for all extrinsics put together, for the current block. + * Total size (in bytes) of the current block. + * + * Tracks the size of the header and all extrinsics. */ - AllExtrinsicsLen: StorageDescriptor<[], number, true, never>; + BlockSize: StorageDescriptor<[], number, true, never>; /** * Map of block numbers to block hashes. */ @@ -61,7 +63,7 @@ type IStorage = { * Events have a large in-memory size. Box the events to not go out-of-memory * just in case someone still reads them from within the runtime. */ - Events: StorageDescriptor<[], Anonymize, false, never>; + Events: StorageDescriptor<[], Anonymize, false, never>; /** * The number of events in the `Events` list. */ @@ -83,6 +85,10 @@ type IStorage = { * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. */ LastRuntimeUpgrade: StorageDescriptor<[], Anonymize, true, never>; + /** + * Number of blocks till the pending code upgrade is applied. + */ + BlocksTillUpgrade: StorageDescriptor<[], number, true, never>; /** * True if we have upgraded so that `type RefCount` is `u32`. False (default) if not. */ @@ -112,6 +118,21 @@ type IStorage = { ExtrinsicWeightReclaimed: StorageDescriptor<[], Anonymize, false, never>; }; ParachainSystem: { + /** + * The current block weight mode. + * + * This is used to determine what is the maximum allowed block weight, for more information see + * [`block_weight`]. + * + * Killed in [`Self::on_initialize`] and set by the [`block_weight`] logic. + */ + BlockWeightMode: StorageDescriptor<[], Anonymize, true, never>; + /** + * The core count available to the parachain in the previous block. + * + * This is mainly used for offchain functionality to calculate the correct target block weight. + */ + PreviousCoreCount: StorageDescriptor<[], number, true, never>; /** * Latest included block descendants the runtime accepted. In other words, these are * ancestors of the currently executing block which have not been included in the observed @@ -132,8 +153,8 @@ type IStorage = { * applied. * * As soon as the relay chain gives us the go-ahead signal, we will overwrite the - * [`:code`][sp_core::storage::well_known_keys::CODE] which will result the next block process - * with the new validation code. This concludes the upgrade process. + * [`:pending_code`][sp_core::storage::well_known_keys::PENDING_CODE] which will result the + * next block to be processed with the new validation code. This concludes the upgrade process. */ PendingValidationCode: StorageDescriptor<[], Uint8Array, false, never>; /** @@ -264,6 +285,10 @@ type IStorage = { * This will be cleared in `on_finalize` for each block. */ PendingUpwardSignals: StorageDescriptor<[], Anonymize, false, never>; + /** + * The approved peer id to be sent as a UMP signal on the last block of the PoV. + */ + PendingApprovedPeer: StorageDescriptor<[], Uint8Array, true, never>; /** * The factor to multiply the base delivery fee by for UMP. */ @@ -289,6 +314,12 @@ type IStorage = { * See `Pallet::set_custom_validation_head_data` for more information. */ CustomValidationHeadData: StorageDescriptor<[], Uint8Array, true, never>; + /** + * Tracks cumulative `UMP` and `HRMP` messages sent across blocks in the current `PoV`. + * + * Across different candidates/PoVs the budgets are tracked by [`AggregatedUnincludedSegment`]. + */ + PoVMessagesTracker: StorageDescriptor<[], Anonymize, true, never>; }; Timestamp: { /** @@ -514,6 +545,13 @@ type IStorage = { * The owner of a key. The key is the `KeyTypeId` + the encoded key. */ KeyOwner: StorageDescriptor<[Key: Anonymize], SS58String, true, never>; + /** + * Accounts whose keys were set via `SessionInterface` (external path) without + * incrementing the consumer reference or placing a key deposit. `do_purge_keys` + * only decrements consumers for accounts that were registered through the local + * session pallet. + */ + ExternallySetKeys: StorageDescriptor<[Key: SS58String], null, true, never>; }; Aura: { /** @@ -564,7 +602,7 @@ type IStorage = { * case of the need to send a high-priority signal message this block. * The bool is true if there is a signal message waiting to be sent. */ - OutboundXcmpStatus: StorageDescriptor<[], Anonymize, false, never>; + OutboundXcmpStatus: StorageDescriptor<[], Anonymize, false, never>; /** * The messages outbound in a given XCMP channel. */ @@ -950,9 +988,29 @@ type IStorage = { */ TestnetStoredPhaseDurations: StorageDescriptor<[], Anonymize, true, never>; /** - + * All minted NFTs, keyed by owner and NFT hash. The value is a Unix-seconds + * timestamp set whenever the entry is written: by the `report` extrinsic for a + * fresh `Person` vote, by `mint_attendance_nfts` when an attendee's attendance + * is finalised, or by `promote_nft_candidates` when a held `NotPerson` NFT is + * resolved. Backfill writes overwrite an earlier timestamp on the same key — + * the value is therefore the *most recent* mint time, not the first. Within a + * single game these timestamps are bounded together (typically the same block), + * so clients can use them as a per-game version marker (e.g. mapping old mints + * to one image collection and newer mints to another). + */ + Nfts: StorageDescriptor, number, true, never>; + /** + * Candidate NFTs staged from `NotPerson` reports, held until the attestee's + * attendance is decided. + * + * During the reporting phase a `NotPerson` vote stages the NFT here rather than + * minting directly into [`Nfts`]: the attestee only earns the NFT if they end up + * classed as having attended. The first key is the prospective owner (the + * attestee), the second is the NFT hash (same derivation as in [`Nfts`]). + * Resolved entries are either promoted into [`Nfts`] or discarded — see + * `promote_nft_candidates` / `discard_nft_candidates`. */ - Nfts: StorageDescriptor, null, true, never>; + NftCandidates: StorageDescriptor, null, true, never>; /** * All the player with zero score but still onboarded in indiv_pallet_score. */ @@ -963,7 +1021,7 @@ type IStorage = { * Account-based player accounts in this storage and statement accounts in * [`StmtAccountToAlias`] must not overlap. */ - Players: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + Players: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; /** * The current game index. */ @@ -971,16 +1029,29 @@ type IStorage = { /** * The information for the next game or ongoing game. */ - Game: StorageDescriptor<[], Anonymize, true, never>; + Game: StorageDescriptor<[], Anonymize, true, never>; /** * The mapping from past games, identified by their game index, to the start timestamp, in * seconds since the UNIX epoch. */ GameHistory: StorageDescriptor<[Key: number], number, true, never>; /** - * Entries of previously attended games of each player. + * Entries of previously attended games of each player. Retained on `offboard` + * and `kickout` so an attended identity keeps passing the participant check + * in `claim_game_prize` at claim time. Bounded by `MaxAttendanceHistoryDepth` + * per player. */ PlayerAttendanceHistory: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * Count of confirmed attendees per game index. Incremented by + * [`Pallet::note_attendance`] for every attendance entry, regardless of + * whether the player is recorded as `AccountOrPerson::Person` or + * `AccountOrPerson::Account` — both are eligible to claim from the per-game + * prize pool via [`Pallet::claim_game_prize`]. Exposed for off-chain + * consumers (e.g. clients computing the airdrop `winner_ratio` for the next + * per-game pool); not read by any on-chain code. + */ + GameParticipantCount: StorageDescriptor<[Key: number], number, false, never>; /** * The mapping from round index and player index to player. */ @@ -1040,6 +1111,20 @@ type IStorage = { * should be the same account used to interact with the statement store. */ CommunicationIdentifiers: StorageDescriptor<[Key: SS58String], SizedHex<65>, true, never>; + /** + * Scratch card reward info for the current or most recently concluded game. + * Overwritten by `finalize_scratch_rewards` at game end. Cleared on game + * cancellation. + */ + ScratchReward: StorageDescriptor<[], Anonymize, true, never>; + /** + * Per-player scratch card eligibility state. + */ + ScratchEligibilityMap: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Total number of scratch card successful claims across all games. + */ + ScratchClaimedCount: StorageDescriptor<[], number, false, never>; }; Score: { /** @@ -1124,6 +1209,18 @@ type IStorage = { */ LitePeople: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Conversion of a lite contextual alias to an account ID. + */ + AliasToAccount: StorageDescriptor<[Key: Anonymize], SS58String, true, never>; + /** + * Conversion of an account ID to a lite contextual alias. + */ + AccountToAlias: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Whether the lite people member collection has been created. + */ + LitePeopleCollectionCreated: StorageDescriptor<[], boolean, false, never>; /** * Number of attestations available to distribute for a verifier account id. */ @@ -1133,11 +1230,42 @@ type IStorage = { /** * Accounts used to identify consumers mapped to their consumer information. */ - Consumers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + Consumers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Accounts associated with a statement store slot through an anonymous allowance, per period. + * + * The period key is a big-endian encoded day number (seconds since Unix epoch / 86400) so + * that `Identity`-hashed iteration yields entries in chronological order to be removed by the + * offchain worker. + */ + StatementStoreAllowances: StorageDescriptor, Anonymize, true, never>; /** - * Accounts associated with a statement store slot. + * Reverse lookup from a statement account to all its active anonymous allowances. + * + * Keyed by `(AccountId, (BigEndianU32 period, u32 seq, Alias))` → `()`. Multiple + * entries per account are possible when the same statement account is authorized by + * different aliases or across grace-window overlaps. + */ + StmtStoreAllowanceByAccount: StorageDescriptor, null, true, never>; + /** + * Friend request registration by anonymous alias in friend request context. + */ + FriendRequestRegistrationByAlias: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; + /** + * Reverse lookup from friend request statement account to anonymous alias. + */ + FriendRequestAliasByAccount: StorageDescriptor<[Key: SS58String], SizedHex<32>, true, never>; + /** + * Aliases that have already been used to claim long-term storage in a given period. + * + * Keyed by `(period, alias)`. Each counter value in the proof context produces a unique + * alias, so a person can have up to `LongTermStorageClaimsPerPeriod` entries per period. + * Old periods can be cleaned up via `clear_expired_long_term_storage_aliases`. + * + * The period key is `BigEndianU32` with `Identity` so iteration yields entries in + * chronological order, matching `StatementStoreAllowances`. */ - StmtStoreAssociatedAccount: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + SpentLongTermStorageAliases: StorageDescriptor, null, true, never>; /** * Reverse lookup from `username` to the `AccountId` that has registered it. The `owner` value * should be a key in the `Consumers` map. There can be at most 2 usernames pointing to the @@ -1171,7 +1299,7 @@ type IStorage = { /** * Paginated collection of chunks (RingExponent -> PageIndex -> Chunks). */ - Chunks: StorageDescriptor, Anonymize, true, never>; + Chunks: StorageDescriptor, Anonymize, true, never>; /** * The hash for each page of chunks. */ @@ -1181,12 +1309,12 @@ type IStorage = { /** * Information about each collection, keyed by identifier. */ - Collections: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; + Collections: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; /** * Collections that have been marked for deletion and are being processed. * Once a collection is moved here, normal operations will fail with CollectionNotFound. */ - SuspendedCollections: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; + SuspendedCollections: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; /** * The identifiers of collections owned by an entity. */ @@ -1194,7 +1322,19 @@ type IStorage = { /** * The current members we recognise. */ - Root: StorageDescriptor, Anonymize, true, never>; + Root: StorageDescriptor, Anonymize, true, never>; + /** + * Old ring roots are retained for a grace period so that proofs generated against + * previous revisions remain valid. Each root in the map is identified by the composite key + * `(collection, ring index, ring revision)`. Entries can be cleaned up after + * `OldRootRetentionDuration` has passed since the `archived_at` timestamp. + * + * This storage can contain some roots for deleted collections or removed rings. + * The call `verify_membership_at_rev` and other operation using old roots must check the + * existence of the collection and the root in order to not validate against dust. + * The old roots will be removed after the retention duration. + */ + OldRoots: StorageDescriptor, Anonymize, true, never>; /** * Keeps track of the ring index currently being populated. */ @@ -1226,12 +1366,14 @@ type IStorage = { */ ActiveMembers: StorageDescriptor<[Key: SizedHex<32>], number, false, never>; /** - * The current members part of all collections (either included in rings, suspended and queued + * The current members in each collection (either included in rings, suspended and queued * for removal from a ring, suspended and not in any ring, or onboarding). * - * Member public key to information about their membership and status. + * Collection identifier to member public key to the member's status. + * + * A key can belong to multiple collections. */ - Members: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; + Members: StorageDescriptor, Anonymize, true, never>; /** * The current state of all rings managed for a given identifier. */ @@ -1248,19 +1390,11 @@ type IStorage = { * Paginated collection of member public keys ready to be included in a ring. */ OnboardingQueue: StorageDescriptor, Anonymize, false, never>; - /** - * The collection currently being deleted and its progress. - * - * Only one collection is actively deleted at a time. When a collection is marked - * for deletion, it is added here when deletion processing begins. Progress is - * tracked to allow resumption if weight runs out during `on_idle`. - */ - DeletionInProgress: StorageDescriptor<[], Anonymize, true, never>; /** * Queue of ring pages pending deletion. * * This is used both by `remove_ring` (individual ring deletion) and by - * collection deletion. Ring pages are processed from this queue in `on_idle` + * collection deletion. Ring pages are processed from this queue via OCW * regardless of which operation queued them. */ RingDeletionQueue: StorageDescriptor, null, true, never>; @@ -1427,7 +1561,7 @@ type IStorage = { * * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. */ - PaidUnloadTokenConsumed: StorageDescriptor, null, true, never>; + PaidUnloadTokenConsumed: StorageDescriptor, null, true, never>; /** * Tracks whether a paid token collection exists for a given period. * @@ -1444,7 +1578,7 @@ type IStorage = { * * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. */ - PaidTokenCollectionsCreated: StorageDescriptor<[Key: number], null, true, never>; + PaidTokenCollectionsCreated: StorageDescriptor<[Key: SizedHex<4>], null, true, never>; /** * Marks paid unload token periods that have consumed tokens pending removal. * @@ -1463,7 +1597,7 @@ type IStorage = { * * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. */ - PaidUnloadTokenDusting: StorageDescriptor<[Key: number], null, true, never>; + PaidUnloadTokenDusting: StorageDescriptor<[Key: SizedHex<4>], null, true, never>; /** * Tracks the next ring index to clean for each expired period. * @@ -1490,7 +1624,7 @@ type IStorage = { * * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. */ - PaidUnloadTokenNextRingToClean: StorageDescriptor<[Key: number], number, true, never>; + PaidUnloadTokenNextRingToClean: StorageDescriptor<[Key: SizedHex<4>], number, true, never>; /** * Whether the pallet account has been initialized. * @@ -1499,77 +1633,115 @@ type IStorage = { */ InitializePalletAccount: StorageDescriptor<[], null, true, never>; }; - StorageInitialization: { + MembersNotifier: { /** - * Current state of the initialization process in on_poll hook. + * Subscriber registry with their subscribed collections and initialization state. */ - OnPollStatus: StorageDescriptor<[], Anonymize, false, never>; + Subscribers: StorageDescriptor<[Key: number], Anonymize, true, never>; /** - * Block number when XCM transfer was initiated. - * Used to track transfer timeout. + * Counter for the related counted storage map */ - XcmTransferInitiatedAt: StorageDescriptor<[], number, true, never>; - }; - StorageInitializationLite: { + CounterForSubscribers: StorageDescriptor<[], number, false, never>; /** - * Current state of the initialization process in on_poll hook. + * Sequence number for sealed batch. + * Incremented when a batch is sealed - ready for distribution. + * Serves as the batch identifier for replay and distribution. */ - OnPollStatus: StorageDescriptor<[], Anonymize, false, never>; - }; - Airdrop: { + SealedBatchSequence: StorageDescriptor<[], bigint, false, never>; /** - * All the scheduled events. In order of registration start time. - * - * WARNING: This item must be kept consistent with `EventScheduleFirstStartTime`. + * Paging state: write page, send page, and last update block. */ - EventSchedule: StorageDescriptor<[], Anonymize, false, never>; + PageState: StorageDescriptor<[], Anonymize, false, never>; /** - * The first start time of the first scheduled event, if any. - * - * This is used to avoid the proof size cost of reading the entire schedule. - * - * WARNING: This item must be kept consistent with `EventSchedule`. + * Changed ring root keys, paged. + * Key: (page_index, identifier, ring_index). Populated by `OnRingRootChange`, + * consumed by `enqueue_updates` one page at a time from `PageState::send_page`. */ - EventScheduleFirstStartTime: StorageDescriptor<[], number, true, never>; + PendingUpdates: StorageDescriptor, null, true, never>; /** - * The next global event id. + * Per-page count of entries in PendingUpdates. */ - NextEventId: StorageDescriptor<[], number, false, never>; + PageUpdatesCount: StorageDescriptor<[Key: number], number, false, never>; /** - * The current active events. - * - * WARNING: This item must be kept consistent with `ActiveEventIds`. + * State for paginated subscriber initialization. */ - ActiveEvents: StorageDescriptor<[Key: number], Anonymize, true, never>; + PendingInit: StorageDescriptor<[Key: number], Anonymize, true, never>; /** - * The ids of the current active events. - * - * WARNING: This item must be kept consistent with `ActiveEvents`. + * Counter for the related counted storage map */ - ActiveEventIds: StorageDescriptor<[], Anonymize, false, never>; + CounterForPendingInit: StorageDescriptor<[], number, false, never>; /** - * The participant id to alias for the active events. + * Indices per collection for the sealed (current) batch. */ - ParticipantIdToAliasAndDest: StorageDescriptor, Anonymize, true, never>; + SealedBatchIndices: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>; /** - * The participant alias to id for the active events. + * Current batch distribution state. */ - ParticipantAliasToId: StorageDescriptor, number, true, never>; + CurrentBatch: StorageDescriptor<[], Anonymize, true, never>; /** - * The winners to whom to distribute the prize for the active events. - * - * The winners are removed from the list as their prize is distributed. + * Tracks which subscribers have received the current batch. + */ + SubscribersWithCurrentBatch: StorageDescriptor<[Key: number], null, true, never>; + /** + * Last replay time per (subscriber, collection) pair. + * Used to enforce a cooldown between replay requests. + */ + LastReplayTime: StorageDescriptor, bigint, true, never>; + }; + StorageInitialization: { + /** + * Current state of the initialization process in on_poll hook. + */ + OnPollStatus: StorageDescriptor<[], Anonymize, false, never>; + /** + * Block number when XCM transfer was initiated. + * Used to track transfer timeout. + */ + XcmTransferInitiatedAt: StorageDescriptor<[], number, true, never>; + /** + * Period index of the most recently opened recurring airdrop prize pool, where a + * "period" is a window of `AirdropPoolPeriod` seconds anchored at 12:00 UTC daily + * (see [`POOL_PERIOD_OFFSET`]). On each `on_poll` tick the scheduler computes the + * current period; if it exceeds this value, one pool is opened and this is bumped + * to the current period. A chain pause spanning multiple periods opens at most one + * pool on resume — missed periods are not back-filled. + */ + LastAirdropPoolPeriod: StorageDescriptor<[], number, false, never>; + /** + * Whether on_poll airdrop scheduling is currently enabled. Set to `true` when the + * initialization sequence transitions into [`OnPollState::OpeningAirdropPools`]; + * togglable thereafter via [`Pallet::set_airdrop_scheduling_enabled`]. + */ + AirdropSchedulingEnabled: StorageDescriptor<[], boolean, false, never>; + }; + StorageInitializationLite: { + /** + * Current state of the initialization process in on_poll hook. */ - WinnersToDistributeTo: StorageDescriptor<[Key: number], Anonymize, false, never>; + OnPollStatus: StorageDescriptor<[], Anonymize, false, never>; + }; + Airdrop: { + /** + * Counter that supplies [`PrizePool::id`] for the next pool opened. + */ + NextPrizePoolId: StorageDescriptor<[], number, false, never>; + /** + * Currently-open prize pools, keyed by id. The associated counter (from + * [`CountedStorageMap`]) drives the `MAX_CONCURRENT_PRIZE_POOLS` cap and replaces a + * separate "active ids" mirror. + */ + PrizePools: StorageDescriptor<[Key: number], Anonymize, true, never>; /** - * The prizes of winners that failed to be transferred automatically. + * Counter for the related counted storage map */ - WinnersWithFailedTransfer: StorageDescriptor, Anonymize, true, never>; + CounterForPrizePools: StorageDescriptor<[], number, false, never>; /** - * Historical record of all past airdrops which completed successfully up until the point of - * distributing the funds to the winners. + * Per-pool record of which claimants have already claimed. Keyed on + * [`AccountOrPerson`] so the Person and Account claim paths share a single + * replay-guard: each identity (whichever it is) can claim at most once per + * pool. */ - PastAirdrops: StorageDescriptor<[Key: number], Anonymize, true, never>; + PrizePoolClaims: StorageDescriptor, null, true, never>; }; MultiBlockMigrations: { /** @@ -2468,14 +2640,16 @@ type ICalls = { Session: { /** * Sets the session key(s) of the function caller to `keys`. + * * Allows an account to set its session key prior to becoming a validator. * This doesn't take effect until the next session. * - * The dispatch origin of this function must be signed. - * - * ## Complexity - * - `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is - * fixed. + * - `origin`: The dispatch origin of this function must be signed. + * - `keys`: The new session keys to set. These are the public keys of all sessions keys + * setup in the runtime. + * - `proof`: The proof that `origin` has access to the private keys of `keys`. See + * [`impl_opaque_keys`](sp_runtime::impl_opaque_keys) for more information about the + * proof format. */ set_keys: TxDescriptor>; /** @@ -2487,10 +2661,6 @@ type ICalls = { * convertible to a validator ID using the chain's typical addressing system (this usually * means being a controller account) or directly convertible into a validator ID (which * usually means being a stash account). - * - * ## Complexity - * - `O(1)` in number of key types. Actual cost depends on the number of length of - * `T::Keys::key_ids()` which is fixed. */ purge_keys: TxDescriptor; }; @@ -2862,7 +3032,7 @@ type ICalls = { * and the error of the failed call. If all were successful, then the `BatchCompleted` * event is deposited. */ - batch: TxDescriptor>; + batch: TxDescriptor>; /** * Send a call through an indexed pseudonym of the sender. * @@ -2878,7 +3048,7 @@ type ICalls = { * * The dispatch origin for this call must be _Signed_. */ - as_derivative: TxDescriptor>; + as_derivative: TxDescriptor>; /** * Send a batch of dispatch calls and atomically execute them. * The whole transaction will rollback and fail if any of the calls failed. @@ -2894,7 +3064,7 @@ type ICalls = { * ## Complexity * - O(C) where C is the number of calls to be batched. */ - batch_all: TxDescriptor>; + batch_all: TxDescriptor>; /** * Dispatches a function call with a provided origin. * @@ -2903,7 +3073,7 @@ type ICalls = { * ## Complexity * - O(1). */ - dispatch_as: TxDescriptor>; + dispatch_as: TxDescriptor>; /** * Send a batch of dispatch calls. * Unlike `batch`, it allows errors and won't interrupt. @@ -2919,7 +3089,7 @@ type ICalls = { * ## Complexity * - O(C) where C is the number of calls to be batched. */ - force_batch: TxDescriptor>; + force_batch: TxDescriptor>; /** * Dispatch a function call with a specified weight. * @@ -2928,7 +3098,7 @@ type ICalls = { * * The dispatch origin for this call must be _Root_. */ - with_weight: TxDescriptor>; + with_weight: TxDescriptor>; /** * Dispatch a fallback call in the event the main call fails to execute. * May be called from any origin except `None`. @@ -2954,7 +3124,7 @@ type ICalls = { * - Some use cases might involve submitting a `batch` type call in either main, fallback * or both. */ - if_else: TxDescriptor>; + if_else: TxDescriptor>; /** * Dispatches a function call with a provided origin. * @@ -2962,7 +3132,7 @@ type ICalls = { * * The dispatch origin for this call must be _Root_. */ - dispatch_as_fallible: TxDescriptor>; + dispatch_as_fallible: TxDescriptor>; }; Multisig: { /** @@ -2979,12 +3149,14 @@ type ICalls = { * ## Complexity * O(Z + C) where Z is the length of the call and C its execution weight. */ - as_multi_threshold_1: TxDescriptor>; + as_multi_threshold_1: TxDescriptor>; /** * Register approval for a dispatch to be made from a deterministic composite account if * approved by a total of `threshold - 1` of `other_signatories`. * - * If there are enough, then dispatch the call. + * **If the approval threshold is met (including the sender's approval), this will + * immediately execute the call.** This is the only way to execute a multisig call - + * `approve_as_multi` will never trigger execution. * * Payment: `DepositBase` will be reserved if this is the first approval, plus * `threshold` times `DepositFactor`. It is returned once this dispatch happens or @@ -3000,8 +3172,9 @@ type ICalls = { * transaction index) of the first approval transaction. * - `call`: The call to be executed. * - * NOTE: Unless this is the final approval, you will generally want to use - * `approve_as_multi` instead, since it only requires a hash of the call. + * NOTE: For intermediate approvals (not the final approval), you should generally use + * `approve_as_multi` instead, since it only requires a hash of the call and is more + * efficient. * * Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise * on success, result is `Ok` and the result from the interior call, if it was executed, @@ -3021,11 +3194,18 @@ type ICalls = { * - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit * taken for its lifetime of `DepositBase + threshold * DepositFactor`. */ - as_multi: TxDescriptor>; + as_multi: TxDescriptor>; /** * Register approval for a dispatch to be made from a deterministic composite account if * approved by a total of `threshold - 1` of `other_signatories`. * + * **This function will NEVER execute the call, even if the approval threshold is + * reached.** It only registers approval. To actually execute the call, `as_multi` must + * be called with the full call data by any of the signatories. + * + * This function is more efficient than `as_multi` for intermediate approvals since it + * only requires the call hash, not the full call data. + * * Payment: `DepositBase` will be reserved if this is the first approval, plus * `threshold` times `DepositFactor`. It is returned once this dispatch happens or * is cancelled. @@ -3040,7 +3220,8 @@ type ICalls = { * transaction index) of the first approval transaction. * - `call_hash`: The hash of the call to be executed. * - * NOTE: If this is the final approval, you will want to use `as_multi` instead. + * NOTE: To execute the call after approvals are gathered, any signatory must call + * `as_multi` with the full call data. This function cannot execute the call. * * ## Complexity * - `O(S)`. @@ -3100,7 +3281,7 @@ type ICalls = { /** * Authenticates the sudo key and dispatches a function call with `Root` origin. */ - sudo: TxDescriptor>; + sudo: TxDescriptor>; /** * Authenticates the sudo key and dispatches a function call with `Root` origin. * This function does not check the weight of the call, and instead allows the @@ -3108,7 +3289,7 @@ type ICalls = { * * The dispatch origin for this call must be _Signed_. */ - sudo_unchecked_weight: TxDescriptor>; + sudo_unchecked_weight: TxDescriptor>; /** * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo * key. @@ -3120,7 +3301,7 @@ type ICalls = { * * The dispatch origin for this call must be _Signed_. */ - sudo_as: TxDescriptor>; + sudo_as: TxDescriptor>; /** * Permanently removes the sudo key. * @@ -3140,7 +3321,7 @@ type ICalls = { * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. * - `call`: The call to be made by the `real` account. */ - proxy: TxDescriptor>; + proxy: TxDescriptor>; /** * Register a proxy account for the sender that is able to make calls on its behalf. * @@ -3269,7 +3450,7 @@ type ICalls = { * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. * - `call`: The call to be made by the `real` account. */ - proxy_announced: TxDescriptor>; + proxy_announced: TxDescriptor>; /** * Poke / Adjust deposits made for proxies and announcements based on current values. * This can be used by accounts to possibly lower their locked amount. @@ -3592,7 +3773,7 @@ type ICalls = { * This is a call version of the transaction extension `AsPersonalAliasWithAccount`. * It is recommended to use the transaction extension instead when suitable. */ - under_alias: TxDescriptor>; + under_alias: TxDescriptor>; /** * This transaction is refunded if successful and no alias was previously set. * @@ -3614,8 +3795,6 @@ type ICalls = { * * The people are identified by the provided list of keys and will each be assigned, in * order, the next available personal ID. - * - * The origin for this call must have root privileges. */ force_recognize_personhood: TxDescriptor>; /** @@ -3653,6 +3832,29 @@ type ICalls = { * - Ring size: `R2e9` */ create_people_collection: TxDescriptor; + /** + * Remove stale alias <-> account mappings. + * + * A mapping is stale when: + * - its context has been removed from [`Config::AccountContexts`] (governance + * reconfiguration, ended airdrop etc.), or + * - its ring has been deleted. + * + * Revision mismatches do not render an alias stale. The user can continue + * transacting via `AsPersonalAliasWithAccountRevised` without having to + * redo account setup. + * + * Typically submitted by the OCW, but the dispatch does not trust + * the caller. Each alias is re-validated via + * [`Self::ensure_alias_is_stale`]; those that are not stale are + * skipped. + * + * At most [`MAX_BULK_CLEANUP`] aliases are processed per call. + * + * The transaction source must be local or in-block. Thus, external + * invocations are not permitted. + */ + clean_up_stale_aliases: TxDescriptor>; }; MobRule: { /** @@ -3940,6 +4142,11 @@ type ICalls = { * * The origin must be an alias, or signed by an account, or signed by an account and use * `ScoreAsParticipant` extension. + * + * After the votes from the report are counted, the reporter and each of the reported + * players whose attendance can now be determined are processed early. This lets the + * game skip the player-process phase entirely when every player has been processed by + * the end of reporting. */ report: TxDescriptor>; /** @@ -4004,6 +4211,41 @@ type ICalls = { */ remove_scheduled_game: TxDescriptor>; + /** + * Claim the scratch card reward (a.k.a. "star prize") for the current game. + * + * The caller must be a signed account or a participant/person origin whose game + * identity was eligible (attended + recognized) for the current scratch reward. + * The player's scratch hash must fall below the winner threshold, and each player + * may claim at most once across all games. Eligible players can claim only until + * the next game finishes; once that happens, the unclaimed reward is dropped. + * + * Per-game prize-pool airdrops are claimed via [`Self::claim_game_prize`] + * (which forwards into the airdrop pallet), not through this call. + * + * Parameters: + * - `origin`: a signed account, participant or person origin. + * - `beneficiary`: the account to receive the reward. + */ + claim_reward: TxDescriptor>; + /** + * Claim a prize from the recurring per-game prize pool opened by the + * airdrop pallet for `game_id`. The pool is identified by `pool_id`, + * which must be a `PrizeTarget::GameParticipants` pool. + * + * The origin must be a signed account, a participant origin, or a + * person origin. The resolved [`AccountOrPerson`] identity must appear + * in [`PlayerAttendanceHistory`] for the pool's game; otherwise + * [`Error::NotParticipant`]. + * + * `proof` is a ring-membership proof that the caller is a lite person. + * It is verified by the airdrop pallet against the pool's context and + * `beneficiary` (so a captured proof cannot redirect the prize). The + * alias recovered from that verification drives the per-pool winner-hash + * check; the replay guard keys on the resolved identity from the origin + * (Account or Person), so each identity can claim at most once per pool. + */ + claim_game_prize: TxDescriptor>; /** * Force start the shuffle before its normal start time. * @@ -4014,10 +4256,6 @@ type ICalls = { * Force end a game's reporting phase before its normal end time. * * This action can only be performed by the root origin and is only meant for testing. - * - * The reporting phase only start when the mutation session can be started. The call will - * fail if the mutation session cannot be started. It can be retried few blocks later the - * time for the people mutation sessions to be proceed. */ testnet_force_end_reporting: TxDescriptor; /** @@ -4035,13 +4273,13 @@ type ICalls = { /** * Schedule payout rounds. * - * Called from `ScheduleOrigin` or root. + * Called from `ManagerOrigin` or root. */ schedule_payout_rounds: TxDescriptor>; /** * Remove a scheduled payout round. * - * Called from `ScheduleOrigin` or root. + * Called from `ManagerOrigin` or root. */ remove_payout_schedule: TxDescriptor>; /** @@ -4122,7 +4360,7 @@ type ICalls = { * of the next report session when `update_thresholds()` recalculates * `AbsenceGraceRatio`. * - * Called from `ScheduleOrigin` or root. + * Called from `ManagerOrigin` or root. */ set_absence_grace_schedule: TxDescriptor>; }; @@ -4199,6 +4437,12 @@ type ICalls = { * the user's account (`candidate`), and the encoded bytes of the ring VRF key * (`ring_vrf_key`). * + * On success, this call: + * - stores lite registration data in `LitePeople`, + * - adds the user's ring VRF key to the lite member collection. + * + * The lite member collection must already have been initialized by `on_poll`. + * * - `candidate`: The candidate to be recognized as a lite person. * - `candidate_signature`: The signature, provided by the candidate, to allow the attester * to complete the registration process on their behalf. @@ -4216,7 +4460,18 @@ type ICalls = { /** */ - dispatch_as_signer: TxDescriptor>; + dispatch_as_signer: TxDescriptor>; + /** + * Set the account associated with a lite alias. + * + * The call is valid from `valid_at_block` until + * `valid_at_block + account_setup_block_tolerance`. + */ + set_alias_account: TxDescriptor>; + /** + + */ + unset_alias_account: TxDescriptor; }; Resources: { /** @@ -4267,25 +4522,91 @@ type ICalls = { */ set_username_reservation_duration: TxDescriptor>; /** - * Associate an account with a slot for statement store access, or reset a slot. + * Demote a full person to a lite person after their authorization has expired. + * + * This is a permissionless call; the origin must be authorized. + */ + demote_auth_expired: TxDescriptor>; + /** + * Associate a statement account with a friend request context sequence. * - * The associated account can submit statements to the statement store. - * The origin must be a lite person. - * Refunded when assigning an account to a free slot, or when replacing/clearing an - * occupied slot whose last update is older than `AccountsApiRefundCooldown`. + * The associated account can submit statements while this friend request registration is + * active. + * The origin must be `Origin::FriendRequestAlias`, created by the `AsResources` + * (`RegisterFriendRequestWithProof(..)`) transaction extension after proof validation. + * On success, increases statement allowance and stores registration state + * `{account_id, reference}`. * * Parameters: - * * `slot_number`: must be in `0..AccountsApiSlotCount`. (`AccountsApiSlotCount` is - * available in the constant metadata) - * * `set_account`: `Some` to set a new account, or `None` to reset to no account. + * * `reference`: friend request period/sequence pair. + * - `reference.period` must be in the accepted period window: `[period(now - + * FriendRequestGraceWindow), period(now)]`. + * - `reference.seq` must be in `0..=FriendRequestSlotsPerPeriod`. + * * `account_id`: statement account to authorize. Must not already be used by another + * friend request registration. */ - set_stmt_store_associated_account_id_at_slot: TxDescriptor>; + set_friend_request_statement_account_for_sequence: TxDescriptor>; /** - * Demote a full person to a lite person after their authorization has expired. + * Clear a stale friend request registration and revoke its statement allowance. * * This is a permissionless call; the origin must be authorized. + * Succeeds only when the registration's period-derived expiry has elapsed. + * On success, removes friend request registration state and decreases statement allowance. + * + * Parameters: + * * `account`: statement account previously associated with a friend request registration. + * * `seq`: friend request sequence to clear. Must match stored registration sequence and + * be in `0..=FriendRequestSlotsPerPeriod`. */ - demote_auth_expired: TxDescriptor>; + clear_expired_friend_request_sequence: TxDescriptor>; + /** + * Claim an anonymous statement store allowance for a target account. + * + * The origin must be `Origin::StmtStoreAlias`, produced by the `AsResources` + * (`RegisterStatementStoreAllowance(..)`) transaction extension after proof validation. + * On success, increases the statement allowance for `target_account` and stores the + * mapping in `StatementStoreAllowances`. + * + * Parameters: + * * `period`: day number since Unix epoch. Must be in the accepted period window. + * * `seq`: slot number within the period, bounded by the collection-specific limit. + * * `target_account`: statement account to authorize. + */ + set_statement_store_account: TxDescriptor>; + /** + * Remove expired statement store allowances for a past period. + * + * This is a permissionless call; the origin must be authorized. + * Removes up to `StmtStoreCleanupLimit` entries from `StatementStoreAllowances` for + * the given `period`, decreasing the statement allowance for each removed account. + */ + clear_expired_stmt_store_allowances: TxDescriptor>; + /** + * Claim long-term storage on a remote chain using an anonymous membership proof. + * + * The origin must be `Origin::LongTermStorageClaim(alias, collection)`, created by the + * `AsResources` (`ClaimLongTermStorage(..)`) transaction extension after ring-VRF proof + * validation. + * + * Parameters: + * * `period`: the claiming period. Must be the current period or the previous one if + * within the grace window. + * * `counter`: the claim counter within the period. Must be less than + * `LongTermStorageClaimsPerPeriod`. Each counter produces a distinct alias. + * * `account_id`: the account to authorize for storage on the remote chain. + */ + claim_long_term_storage: TxDescriptor>; + /** + * Clear spent long-term storage aliases for an expired period. + * + * This is a permissionless call authorized via the `authorize` attribute. It can be + * called by anyone once a period has fully expired (past the grace window). + * + * Parameters: + * * `period`: the expired period to clear aliases for. + * * `limit`: the maximum number of entries to remove in this call. + */ + clear_expired_long_term_storage_aliases: TxDescriptor>; }; ChunksManager: { /** @@ -4298,32 +4619,14 @@ type ICalls = { /** * Sets the expected hashes for chunk pages for a given ring exponent. * - * This is a root-only call that allows setting the expected hashes that chunks - * must match when added via `add_chunks`. + * Allows setting the expected hashes that chunks must match when added via + * `add_chunks`. * - * Can only be called by root origin. + * The origin must be `ManagerOrigin` or root. */ set_chunk_page_hashes: TxDescriptor>; }; Members: { - /** - * Build a ring root by including registered members. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ - build_ring_manual: TxDescriptor>; - /** - * Onboard members into a ring by taking their keys from the onboarding queue and - * registering them into the ring. This does not compute the root, that is done using - * `build_ring`. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ - onboard_members_manual: TxDescriptor>; /** * Merge the members in two rings into a single, new ring. In order for the rings to be * eligible for merging, they must be below 1/2 of max capacity, have no pending @@ -4334,6 +4637,102 @@ type ICalls = { * Force set the onboarding size for a collection. This call requires root privileges. */ set_onboarding_size: TxDescriptor>; + /** + * Allow a member waiting in the onboarding queue to include themselves into a ring + * after enough time has passed. This bypasses the normal cohort-based onboarding size + * requirement. + * + * This call must be dispatched with a `SelfInclude` origin, authenticated by the + * `AsMember` transaction extension. The rings must be in append-only mode. + * + * The `call_valid_at` parameter dictates the time window in which this transaction is + * valid and represents the timestamp (in seconds since the UNIX epoch) when this call + * becomes valid. + */ + self_include: TxDescriptor>; + /** + * Build a ring root for a specific ring in a collection. + * + * Submitted by the OCW with a `to_include` snapshot from + * [`Self::should_build_ring`]. Leftovers from later onboarding are picked up + * on the next OCW tick, or by the member via [`Self::self_include`] when + * cohort gating stalls onboarding. + */ + build_ring_authorized: TxDescriptor>; + /** + * Onboard members from the onboarding queue for a specific collection. + * + * Submitted by the offchain worker. + */ + onboard_members_authorized: TxDescriptor>; + /** + * Merge the top two onboarding queue pages for a specific collection. + * + * Submitted by the offchain worker. + */ + merge_queue_pages_authorized: TxDescriptor>; + /** + * Remove suspended keys from a specific ring in a collection. + * + * Submitted by the offchain worker. + */ + remove_suspended_keys_authorized: TxDescriptor>; + /** + * Delete a page for a specific ring in a collection. + * + * Submitted by the offchain worker. + */ + delete_ring_page_authorized: TxDescriptor>; + /** + * Enqueue a ring for deletion as part of collection deletion. + * + * Archives the ring root, notifies subscribers, removes ring metadata, and + * enqueues ring pages into `RingDeletionQueue` for processing by + * `delete_ring_page_authorized`. + * + * Submitted by the offchain worker. + */ + enqueue_ring_deletion_authorized: TxDescriptor>; + /** + * Delete an onboarding queue page as part of collection deletion. + * + * Removes all `Members` entries for the members in the page, then removes + * the page itself. Can only proceed when all rings and ring pages have been + * fully deleted. + * + * Submitted by the offchain worker. + */ + delete_onboarding_queue_page_authorized: TxDescriptor>; + /** + * Finalize collection deletion. + * + * Removes all remaining per-collection storage and the owner's identifier + * reference. Can only proceed when all rings, ring pages, and onboarding + * queue pages have been fully deleted. + * + * Submitted by the offchain worker. + */ + finalize_collection_deletion_authorized: TxDescriptor>; + /** + * Mark a ring as stale so the offchain worker will rebuild it. + * + * Anyone can submit this transaction if the ring has members that are not + * yet included in the root (`total > included`) and the ring is not already + * marked stale. This is a recovery mechanism in case the `StaleRings` entry + * was lost or never inserted. + */ + mark_ring_stale_authorized: TxDescriptor>; + /** + * Clean up expired old ring roots. + * + * Removes up to `limit` old ring roots for the given ring in the given + * collection. + * + * The transaction source must be `Local` or `InBlock`. + * + * This is a maintenance call. Submitted by the offchain worker. + */ + clean_up_old_roots_authorized: TxDescriptor>; }; Coinage: { /** @@ -4349,6 +4748,7 @@ type ICalls = { * value is created for each destination account id. * * Validity requirements: + * (an invalid transaction won't be included in a block, the coin is not consumed) * * The coin's age must be less than [Config::MaximumAge]. * * The coin value must be within the bounds defined by [Config::MinimumExponent] and * [Config::MaximumExponent]. @@ -4367,6 +4767,7 @@ type ICalls = { * The call is free and ages the resulting coin by one. * * Validity requirements: + * (an invalid transaction won't be included in a block, the coin is not consumed) * * The destination account must not already have a coin. * * The coin's age must be less than [Config::MaximumAge]. */ @@ -4383,10 +4784,12 @@ type ICalls = { * alias is used to unload from the recycler. * * Validity requirements: + * (an invalid transaction won't be included in a block, the coin is not consumed) * * The `member_key` must not already be used in another recycler. * * The `member_key` must be valid (i.e. well formed). * * The `proof_of_ownership` must be a valid signature of the coin's account id by the * `member_key`. + * * The recycler collection for the coin's value must already exist */ load_recycler_with_coin: TxDescriptor>; /** @@ -4420,6 +4823,42 @@ type ICalls = { * `member_key`. */ load_recycler_with_external_asset: TxDescriptor>; + /** + * Load external asset into a recycler (infallible, validated unpaid variant). + * + * The origin must be [Origin::InfallibleUnpaidSigned], which can be obtained from the + * transaction extension variant [AsCoinage::InfallibleUnpaidSigned]. + * + * The transaction extension validation phase must ensure: + * - The `member_key` is valid and not already used in another recycler. + * - The `proof_of_ownership` is a valid signature of the signer's account id by the + * `member_key`. + * - The `value` is within the bounds defined by [Config::MinimumExponent] and + * [Config::MaximumExponent], and can be losslessly converted to an asset amount. + * - The signer has enough balance of the underlying asset to cover the equivalent amount + * for the given coin value (respecting `preservation`). + * - The nonce is valid for replay protection. + * - The recycler collection for `value` already exists. + * + * The call is free. + */ + load_recycler_with_external_asset_unpaid: TxDescriptor>; + /** + * Batched variant of [`Self::load_recycler_with_external_asset_unpaid`]. + * + * The origin must be [Origin::InfallibleUnpaidSigned], which can be obtained from the + * transaction extension variant [AsCoinage::InfallibleUnpaidSigned]. The extension + * validates each inner item and additionally checks within-batch member-key uniqueness + * and that the signer's balance covers the sum of all inner asset amounts. + * + * This call dispatches each inner load by re-running the same checks the extension + * just performed (see [`RecyclerManager::load`]). The redundancy matches the defensive + * pattern used by [`Self::load_recycler_with_external_asset_unpaid`]: a dispatch path + * that fails any of these checks is a logic bug in the extension, not a user error. + * + * The call is free. + */ + load_recycler_with_external_asset_unpaid_batch: TxDescriptor>; /** * Unload a recycler to mint a new coin. * @@ -4537,78 +4976,60 @@ type ICalls = { */ pay_for_recycler_unload_fee_token_with_stable: TxDescriptor>; /** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. Also, - * this call may leak too much information because the resulting coin inherits the worst - * recycler privacy. + * Unload a recycler into a mix of external asset and fresh vouchers. * - * Unload multiple recyclers to mint a new consolidated coin. + * The origin must be [Origin::UnloadToken], which can be obtained from the transaction + * extension [AsCoinage]. * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`, which can be - * obtained from the transaction extension [AsCoinage] using `AsUnloadTokenPeople`, - * `AsUnloadTokenLitePeople`, or `AsUnloadTokenPaid` variants. + * This function allows a user to offboard part of the unloaded value into the underlying + * asset while reminting the rest as fresh recycler vouchers. * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) into a single output coin. + * When `fee` is [UnloadFee::Prepaid], `external_asset_amount` is transferred as-is. + * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the specified + * `external_asset_amount`, so the recipient receives the remainder. * * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the new coin. + * * `aliases`: the list of aliases corresponding to the member keys included in the + * recycler. The proofs for these aliases are contained in the origin. + * * `value` and `index`: identifies the recycler being unloaded. + * * `revision`: the recycler revision used for the alias proofs. + * * `to`: the destination account for the external asset portion. + * * `external_asset_amount`: the gross asset portion to offboard from the unloaded value. + * * `new_vouchers`: the fresh recycler vouchers to mint from the remaining unloaded value. + * + * The total unloaded value must always equal the asset portion plus the voucher portion. + * In `FromOutput` mode, the asset portion must be large enough to cover the unload fee. * * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * The total value of unloaded coins must be a power of two. - * * The resulting coin value must not exceed [Config::MaximumExponent]. - * * `inputs` must not be empty, and each element must contain at least one alias. + * * The origin must be [Origin::UnloadToken]. + * * The recycler identified by `value` and `index` must exist. + * * The alias proofs provided in the origin must be valid for the recycler's revision. + * * The aliases must not have been already unloaded (except for the first one when `fee` + * is [UnloadFee::FromOutput], which was pre-marked in the extension). + * * `new_vouchers` must not be empty, and all voucher member keys must be valid and + * unused. + * * The total unloaded value must equal `external_asset_amount` plus the total asset value + * of `new_vouchers`. + * * When using [UnloadFee::FromOutput], `external_asset_amount` must cover the fee. */ - unload_recyclers_into_coin_unstable: TxDescriptor>; + unload_recycler_into_external_asset_and_vouchers: TxDescriptor>; /** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. + * Unload a recycler to withdraw the underlying external asset (non-anonymous). * - * Unload multiple recyclers to withdraw the underlying external asset. + * Convenience wrapper around [Self::unload_recyclers_into_external_asset_non_anonymous] + * for the single-recycler case. * - * The origin must be [Origin::UnloadToken], which can be obtained from the transaction - * extension [AsCoinage]. + * See [Self::unload_recyclers_into_external_asset_non_anonymous] for full documentation. + */ + unload_recycler_into_external_asset_non_anonymous: TxDescriptor>; + /** + * Unload multiple recyclers to withdraw the underlying external asset (non-anonymous). * - * When `fee` is [UnloadFee::Prepaid] (via free or paid unload token), no fee is deducted. - * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the unloaded assets. - * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) and withdraw the total value as the underlying asset. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the asset. - * - * Requirements: - * * The origin must be [Origin::UnloadToken]. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * `inputs` must not be empty, and each element must contain at least one alias. - * * For [UnloadFee::FromOutput], the first alias of the first input was pre-marked in the - * extension. - */ - unload_recyclers_into_external_asset_unstable: TxDescriptor>; - /** - * Unload a recycler to withdraw the underlying external asset (non-anonymous). - * - * Convenience wrapper around [Self::unload_recyclers_into_external_asset_non_anonymous] - * for the single-recycler case. - * - * See [Self::unload_recyclers_into_external_asset_non_anonymous] for full documentation. - */ - unload_recycler_into_external_asset_non_anonymous: TxDescriptor>; - /** - * Unload multiple recyclers to withdraw the underlying external asset (non-anonymous). - * - * This is a non-anonymous version of [Self::unload_recyclers_into_external_asset_unstable] + * This is a non-anonymous version of [Self::unload_recyclers_into_external_asset] * where the fee is paid explicitly by the signer rather than through the anonymous - * unload token ring. + * unload token ring, and for multiple recyclers. + * + * The fee charged is one unload token fee per recycler (i.e., `inputs.len()`). * * Parameters: * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. @@ -4623,7 +5044,7 @@ type ICalls = { * * All specified recyclers must exist. * * The alias proofs must correspond sequentially to the aliases in `inputs`. * * `inputs` must not be empty and each element must contain at least one alias. - * * The signer must have sufficient balance to pay the fee. + * * The signer must have sufficient balance to pay the fee (one fee per recycler). */ unload_recyclers_into_external_asset_non_anonymous: TxDescriptor>; /** @@ -4637,27 +5058,43 @@ type ICalls = { * are not entirely fresh, they can be linked to other coins. * * Unlike [Self::unload_recycler_into_coin], this call does **not** require the number of - * aliases to be a power of two. The only requirement is that the total value of the - * unloaded aliases matches the total value of the new coins specified in `split_into`. + * aliases to be a power of two. * * Parameters: * * `aliases`: the list of aliases corresponding to the member keys included in the * recycler. The proofs for these aliases are contained in the origin. * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. + * * `revision`: the recycler revision used for the alias_proofs. * * `split_into`: a vector of pairs, each pair containing a coin value and a list of * destination account ids. + * * `max_fee`: the maximum fee the caller is willing to pay, expressed in the underlying + * asset balance. It must be equal to the difference between the total value of the + * unloaded coins and the total value of the new coins defined in `split_into`. + * + * When using [UnloadFee::Prepaid], this must be 0. + * When using [UnloadFee::FromOutput], this amount is deducted from the input: the + * network fee is transferred to [Config::FeeDestination] and any remainder is burned. + * The caller can query `get_paid_unload_token_fee_in_asset` to estimate the fee. + * + * This parameter serves as a safeguard: the transaction is rejected at validation if the + * actual network fee exceeds `max_fee`, protecting the caller from excessive fee + * increases that would render the argument `split_into` invalid (unloaded funds must be + * higher than the split plus the fee). * * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. + * * The origin must be [Origin::UnloadToken]. * * The recycler identified by `value` and `index` must exist. * * The alias proofs provided in the origin must be valid for the recycler's revision. * * The `aliases` provided must match the aliases derived from the proofs. - * * The total value of the new coins defined in `split_into` must equal the total value of - * the unloaded coins. + * * The total value of the new coins defined in `split_into` plus `max_fee` must equal the + * total value of the unloaded coins. + * * `max_fee` must be a multiple of the minimum coin. (This is implied by the condition + * above). * * Each destination account must not already have a coin. + * * When using [UnloadFee::Prepaid], `max_fee` must be 0. + * * When using [UnloadFee::FromOutput], `max_fee` must cover the network fee. */ - unload_recycler_into_coins: TxDescriptor>; + unload_recycler_into_coins: TxDescriptor>; /** * Directly offboard a fresh, 0-age coin into the underlying external asset. * @@ -4724,56 +5161,121 @@ type ICalls = { */ delete_expired_paid_unload_token_collection: TxDescriptor>; }; - Airdrop: { + MembersNotifier: { /** - * Schedule a airdrop event. + * Registers the parachain as a subscriber. + * The initial state will be sent over shortly via XCM. * - * The origin must be `ScheduleOrigin`. + * ## Origin + * Requires `ManageOrigin` (governance/root). * - * The total amount to be distributed in prizes will be put on hold. The event will be - * added to the schedule and be given an event id. + * ## Parameters + * - `subscriber_parachain_id`: The ParaId of the subscribing parachain. + * - `members_collections`: List of collection identifiers to subscribe to and their + * respective ring exponents. + * - `pallet_index`: Pallet index of members-subscriber on the subscriber chain. */ - schedule_event: TxDescriptor>; + subscribe: TxDescriptor>; /** - * Remove a scheduled airdrop event. + * Unsubscribes a parachain. * - * The origin must be `ScheduleOrigin`. + * ## Origin + * - **Self-unsubscribe**: Subscriber parachain via XCM (`EnsureSubscriberOrigin`) + * - **Governance unsubscribe**: Requires `ManageOrigin` * - * The event id must refer to a scheduled event. + * ## Parameters + * - `subscriber_parachain_id`: The ParaId to unsubscribe. Required for governance, ignored + * for self-unsubscribe (derived from XCM origin). + */ + unsubscribe: TxDescriptor>; + /** + * Requests replay of specific ring roots. + * + * Permissionless — any signed origin can request a replay for any subscriber. + * The subscriber parachain is identified by the `subscriber_parachain_id` parameter. + * + * Parameters: + * - `subscriber_parachain_id`: The ParaId of the subscriber. + * - `identifier`: Collection identifier. + * - `ring_root_indices`: List of ring root indices, must be in strictly ascending order. + */ + request_replay: TxDescriptor>; + /** + * Enqueues pending updates into a sealed batch for distribution. * - * The total amount to be distributed in prizes will be released from hold. - * The event will be removed from the schedule. + * Authorized call submitted by the offchain worker. */ - remove_scheduled_event: TxDescriptor>; + enqueue_updates: TxDescriptor>; /** - * Register for a particular event. + * Sends the current batch to a specific subscriber. * - * The origin must be the alias of a person in the context: airdrop context base - * concatenated to the airdrop event id in little-endian encoding in 4 bytes. - * The airdrop context base can be found in the metadata. + * Authorized maintenance call submitted by the offchain worker. + */ + send_batch: TxDescriptor>; + /** + * Sends one page of initialization data to a subscriber. * - * The event id must refer to an active event in the registering phase. - * The alias must not be already registered. + * Authorized maintenance call submitted by the offchain worker. + */ + send_init_page: TxDescriptor>; + /** + * Abandons a stuck batch that exceeded `StuckBatchTimeout`. + * Subscribers that did not receive the batch can recover via `request_replay`. * - * `dest` can be any account, it is the destination receiving the prize when winning the - * airdrop. It is better to set a different account for each airdrop to avoid linking - * information about winners. + * Authorized maintenance call submitted by the offchain worker when a batch has + * been active longer than `StuckBatchTimeout`. + */ + abandon_stuck_batch: TxDescriptor; + }; + StorageInitialization: { + /** + * Enable or disable on_poll airdrop scheduling. While disabled the + * `OpeningAirdropPools` state remains active but opens no new pools. + * Re-enabling does not back-fill skipped periods: at most one pool is opened + * per period, and only for the current period. + */ + set_airdrop_scheduling_enabled: TxDescriptor>; + }; + Airdrop: { + /** + * Open a new prize pool from which `num_prizes` aliases in the `target` population + * may claim a fixed `prize_value`. * - * When registering the caller is assigned an index. This index will be used to identify - * the winners. + * Origin must be `T::ManagerOrigin`. Other pallets can use + * [`AirdropApi::open_prize_pool`] (gated by `T::TraitCallerOrigin`). */ - register_for_event: TxDescriptor>; + open_prize_pool: TxDescriptor>; /** - * Claim the prize of a failed transfer. + * Claim a prize from a `PrizeTarget::People` pool by submitting a ring- + * membership proof directly. * - * Prize are automatically transfered, but if unexpected event happens the transfer can - * fail, this transaction allows to claim the prize. + * This is an authorized extrinsic: the proof itself is the authentication. The + * per-pool [`PrizePoolClaims`] storage is the replay guard — each alias may claim + * once per pool. The proof is bound to `beneficiary` (so a captured proof cannot + * redirect the prize) and to the pool's context (so a proof cannot be replayed on + * a different pool). * - * The origin must signed by the destination of the prize. + * `alias` is the value the proof verifies to; the authorize closure rejects + * `AliasMismatch` if it disagrees with the proof. The dispatch body trusts + * `alias` and skips a second verification — this is sound because the call is + * only reachable through `ensure_authorized`, which proves the authorize closure + * accepted. * - * The signer must have a failed transfer prize for the given event id. + * The proof's context is `context_for_pool_id(pool_id)`; the proof is verified + * against `PEOPLE_IDENTIFIER` (lite-people are not eligible). The pool's target + * must be `PrizeTarget::People`; `GameParticipants` pools are claimed via the + * game pallet, which forwards to [`AirdropApi::claim_game_prize`]. + */ + claim_prize: TxDescriptor>; + /** + * Close a prize pool early. Origin must be the pool's `dispatcher` or satisfy + * `T::ManagerOrigin`. Releases `prize_value * prizes_remaining` of held funds back + * to the airdrop pot and marks the pool expired-now so the on-poll cleanup loop + * drains `PrizePoolClaims` over multiple ticks. This keeps the extrinsic's weight + * bounded by `PrizePoolClearLimit` regardless of how many claims the pool + * accumulated. */ - claim_failed_transfer_prize: TxDescriptor>; + close_prize_pool: TxDescriptor>; }; MultiBlockMigrations: { /** @@ -4819,11 +5321,11 @@ type IEvent = { /** * An extrinsic failed. */ - ExtrinsicFailed: PlainDescriptor>; + ExtrinsicFailed: PlainDescriptor>; /** - * `:code` was updated. + * `:code` was updated to the code with the given hash. */ - CodeUpdated: PlainDescriptor; + CodeUpdated: PlainDescriptor>; /** * A new account was created. */ @@ -4843,7 +5345,7 @@ type IEvent = { /** * An invalid authorized upgrade was rejected while trying to apply it. */ - RejectedInvalidAuthorizedUpgrade: PlainDescriptor>; + RejectedInvalidAuthorizedUpgrade: PlainDescriptor>; }; ParachainSystem: { /** @@ -5006,7 +5508,7 @@ type IEvent = { /** * A transaction fee was skipped. */ - FeeSkipped: PlainDescriptor>; + FeeSkipped: PlainDescriptor>; }; OriginRestriction: { /** @@ -5128,6 +5630,22 @@ type IEvent = { * Reserve information was removed for `asset_id`. */ ReservesRemoved: PlainDescriptor>; + /** + * Some assets were issued as Credit (no owner yet). + */ + IssuedCredit: PlainDescriptor>; + /** + * Some assets Credit was destroyed. + */ + BurnedCredit: PlainDescriptor>; + /** + * Some assets were burned and a Debt was created. + */ + IssuedDebt: PlainDescriptor>; + /** + * Some assets Debt was destroyed (and assets issued). + */ + BurnedDebt: PlainDescriptor>; }; AssetsHolder: { /** @@ -5424,7 +5942,7 @@ type IEvent = { * Batch of dispatches did not complete fully. Index of first failing dispatch given, as * well as the error. */ - BatchInterrupted: PlainDescriptor>; + BatchInterrupted: PlainDescriptor>; /** * Batch of dispatches completed fully with no error. */ @@ -5440,11 +5958,11 @@ type IEvent = { /** * A single item within a Batch of dispatches has completed with error. */ - ItemFailed: PlainDescriptor>; + ItemFailed: PlainDescriptor>; /** * A call was dispatched. */ - DispatchedAs: PlainDescriptor>; + DispatchedAs: PlainDescriptor>; /** * Main call was dispatched. */ @@ -5452,7 +5970,7 @@ type IEvent = { /** * The fallback call was dispatched. */ - IfElseFallbackCalled: PlainDescriptor>; + IfElseFallbackCalled: PlainDescriptor>; }; Multisig: { /** @@ -5466,7 +5984,7 @@ type IEvent = { /** * A multisig operation has been executed. */ - MultisigExecuted: PlainDescriptor>; + MultisigExecuted: PlainDescriptor>; /** * A multisig operation has been cancelled. */ @@ -5480,7 +5998,7 @@ type IEvent = { /** * A sudo call just took place. */ - Sudid: PlainDescriptor>; + Sudid: PlainDescriptor>; /** * The sudo key has been updated. */ @@ -5492,13 +6010,13 @@ type IEvent = { /** * A [sudo_as](Pallet::sudo_as) call just took place. */ - SudoAsDone: PlainDescriptor>; + SudoAsDone: PlainDescriptor>; }; Proxy: { /** * A proxy was executed correctly, with the given. */ - ProxyExecuted: PlainDescriptor>; + ProxyExecuted: PlainDescriptor>; /** * A pure account has been created by new proxy with given * disambiguation index and proxy type. @@ -5694,6 +6212,10 @@ type IEvent = { * Personhood was forcefully recognized by root. */ ForcePersonhoodRecognized: PlainDescriptor>; + /** + * An alias-to-account mapping was cleaned up. + */ + AliasCleanedUp: PlainDescriptor>; }; MobRule: { /** @@ -5703,7 +6225,7 @@ type IEvent = { /** * A callback was triggered from mob-rule. */ - Callback: PlainDescriptor>; + Callback: PlainDescriptor>; /** * There was a codec error when trying to execute the callback. */ @@ -5917,6 +6439,22 @@ type IEvent = { * Some invites have been removed for the inviter, some are remaining. */ SomeInvitesRemoved: PlainDescriptor>; + /** + * Scratch card rewards are available for the concluded game. + */ + ScratchRewardAvailable: PlainDescriptor>; + /** + * A player successfully claimed a scratch card reward. + */ + ScratchRewardClaimed: PlainDescriptor>; + /** + * A new game opened a recurring-prize pool in the airdrop pallet. + */ + GamePrizePoolOpened: PlainDescriptor>; + /** + * `new_game` could not open its companion prize pool. The game still starts. + */ + GamePrizePoolOpenFailed: PlainDescriptor>; }; Score: { /** @@ -5999,6 +6537,14 @@ type IEvent = { * A lite person was registered as a consumer. */ ConsumerRegistered: PlainDescriptor>; + /** + * An alias-to-account mapping was set or updated. + */ + AliasAccountSet: PlainDescriptor>; + /** + * An alias-to-account mapping was removed. + */ + AliasAccountUnset: PlainDescriptor>; }; Resources: { /** @@ -6009,6 +6555,14 @@ type IEvent = { * A lite person has registered as a consumer. */ LitePersonRegistered: PlainDescriptor>; + /** + * Friend request statement usage has been assigned for a sequence. + */ + FriendRequestStmtUsageSet: PlainDescriptor>; + /** + * Friend request statement usage has been removed. + */ + FriendRequestStmtUsageRemoved: PlainDescriptor>; /** * A person's authorization was touched. */ @@ -6026,13 +6580,30 @@ type IEvent = { */ UsernameReservationDurationSet: PlainDescriptor>; /** - * A statement store slot was updated. + * An anonymous statement store allowance was granted. */ - StmtStoreSlotUpdated: PlainDescriptor>; + StmtStoreAllowanceSet: PlainDescriptor>; + /** + * Expired statement store allowances were cleaned up. + */ + StmtStoreAllowancesCleared: PlainDescriptor>; /** * A full person was demoted due to expired authorization. */ PersonDemoted: PlainDescriptor>; + /** + * Long-term storage has been claimed for an account. + */ + LongTermStorageClaimed: PlainDescriptor>; + /** + * A long-term storage claim was accepted but the downstream allocation failed. The alias + * is still marked spent for the period. + */ + LongTermStorageAllocationFailed: PlainDescriptor>; + /** + * Expired long-term storage aliases have been cleared for a period. + */ + LongTermStorageAliasesCleared: PlainDescriptor>; }; ChunksManager: { /** @@ -6062,11 +6633,11 @@ type IEvent = { */ CollectionDeleted: PlainDescriptor>; /** - * A ring was built manually. + * A ring root was built. */ RingBuilt: PlainDescriptor>; /** - * Members were onboarded manually. + * Members were onboarded. */ MembersOnboarded: PlainDescriptor>; /** @@ -6077,6 +6648,14 @@ type IEvent = { * The onboarding size was set for a collection. */ OnboardingSizeSet: PlainDescriptor>; + /** + * A member self-included into a ring. + */ + MemberSelfIncluded: PlainDescriptor>; + /** + * An old root revision has been cleaned up. + */ + OldRootCleanedUp: PlainDescriptor>; }; Coinage: { /** @@ -6103,6 +6682,10 @@ type IEvent = { */ RecyclerUnloadedIntoExternalAsset: PlainDescriptor>; + /** + + */ + RecyclerUnloadedIntoExternalAssetAndVouchers: PlainDescriptor>; /** */ @@ -6168,6 +6751,32 @@ type IEvent = { */ ExpiredPaidUnloadTokenCollectionDeleted: PlainDescriptor>; }; + MembersNotifier: { + /** + * A parachain subscribed. + */ + Subscribed: PlainDescriptor>; + /** + * A parachain unsubscribed. + */ + Unsubscribed: PlainDescriptor>; + /** + * Update batch sent to subscriber. + */ + UpdatesSent: PlainDescriptor>; + /** + * Sending ring root updates to a subscriber failed. + */ + UpdateSendFailed: PlainDescriptor>; + /** + * Replay of ring roots requested by a subscriber. + */ + ReplayRequested: PlainDescriptor>; + /** + * A stuck batch was abandoned by the offchain worker. + */ + BatchAbandoned: PlainDescriptor>; + }; StorageInitialization: { /** * The foreign asset was created and reserves were set. @@ -6198,7 +6807,17 @@ type IEvent = { */ ScorePayoutsScheduled: PlainDescriptor; /** - * The on_poll initialization has completed. + * An airdrop prize pool has been opened by the on_poll scheduler. + */ + AirdropPoolOpened: PlainDescriptor>; + /** + * Airdrop scheduling was enabled or disabled via `set_airdrop_scheduling_enabled`. + */ + AirdropSchedulingEnabledChanged: PlainDescriptor>; + /** + * The one-time on_poll initialization has completed. Recurring airdrop prize + * pool opening continues afterward in `OpeningAirdropPools` while + * `AirdropSchedulingEnabled` is `true`. */ OnPollInitializationCompleted: PlainDescriptor; /** @@ -6242,57 +6861,41 @@ type IEvent = { }; Airdrop: { /** - * A participant registered for an event. - */ - ParticipantRegistered: PlainDescriptor>; - /** - * The event is started. - */ - EventStarted: PlainDescriptor>; - /** - * The scheduled event is skipped. - */ - EventSkipped: PlainDescriptor>; - /** - * An event was scheduled. - */ - EventScheduled: PlainDescriptor>; - /** - * A scheduled event was removed. - */ - ScheduledEventRemoved: PlainDescriptor>; - /** - * A failed transfer prize was claimed. - */ - FailedTransferPrizeClaimed: PlainDescriptor>; - /** - * The event transitioned to waiting for entropy to build. - */ - WaitingForEntropyToBuild: PlainDescriptor>; - /** - * The event transitioned to drawing winners. + * A prize pool was opened. */ - DrawingWinners: PlainDescriptor>; + PrizePoolOpened: PlainDescriptor>; /** - * The event transitioned to distributing prizes. + * A prize was claimed from a prize pool. `claimant` is the identity that + * satisfied the pool's eligibility predicate — a Person alias for + * [`Call::claim_prize`] (verified-people pools), and whatever + * `AccountOrPerson` the game pallet supplied for game-pool claims via + * [`AirdropApi::claim_game_prize`]. */ - Distributing: PlainDescriptor>; + PrizeClaimed: PlainDescriptor>; /** - * A prize was distributed to a winner. + * A prize pool delivered its last prize. The pool stays in storage until + * `expires_at` so `PrizePoolClaims` keeps the replay window; further claim + * attempts return `Error::PrizePoolExhausted`. */ - PrizeDistributed: PlainDescriptor>; + AllPrizesClaimed: PlainDescriptor>; /** - * A prize transfer failed during distribution. + * A prize pool reached `expires_at` and was cleaned up; remaining held funds were + * released. */ - PrizeDistributionFailed: PlainDescriptor>; + PrizePoolExpired: PlainDescriptor>; /** - * The event transitioned to clearing storage. + * A prize pool was closed early by its dispatcher (or `ManagerOrigin`); remaining held + * funds were released. */ - ClearingStorage: PlainDescriptor>; + PrizePoolClosed: PlainDescriptor>; /** - * The event has completed and been removed. + * The slot was awarded but the immediate payout transfer failed (e.g. dusted + * beneficiary). The release+transfer was rolled back so the funds remain held + * on the pot, but `PrizePoolClaims` and `prizes_remaining` still reflect the + * claim — the slot is consumed without a recovery path. Emitted in addition + * to `PrizeClaimed`. */ - EventCompleted: PlainDescriptor>; + PrizeTransferFailed: PlainDescriptor>; }; MultiBlockMigrations: { /** @@ -7237,6 +7840,10 @@ type IError = { * Cannot merge rings while a suspension session is in progress. */ SuspensionSessionInProgress: PlainDescriptor; + /** + * The alias mapping is not stale. + */ + AliasNotStale: PlainDescriptor; /** * Call is too late or too early. */ @@ -7274,6 +7881,14 @@ type IError = { * The people collection has already been created. */ PeopleCollectionAlreadyExists: PlainDescriptor; + /** + * The provided alias does not match the account's current alias mapping. + */ + AliasMismatch: PlainDescriptor; + /** + * None of the supplied aliases were stale. + */ + NoStaleAliases: PlainDescriptor; }; MobRule: { /** @@ -7628,6 +8243,36 @@ type IError = { * Invalid state */ InvalidState: PlainDescriptor; + /** + * No concluded game with available scratch card rewards. + */ + NoScratchReward: PlainDescriptor; + /** + * The player is not eligible for the current scratch card reward. + */ + NotEligible: PlainDescriptor; + /** + * The person did not win the scratch card for this game. + */ + DidNotWin: PlainDescriptor; + /** + * The alias has already claimed a scratch card reward. + */ + AlreadyClaimed: PlainDescriptor; + /** + * The scratch card pot balance is zero. + */ + ScratchPotEmpty: PlainDescriptor; + /** + * `claim_game_prize`: `pool_id` is not a `GameParticipants` pool (or no + * such pool exists). + */ + PoolNotForGame: PlainDescriptor; + /** + * `claim_game_prize`: the resolved origin identity has no recorded + * attendance for the pool's game. + */ + NotParticipant: PlainDescriptor; }; Score: { /** @@ -7750,6 +8395,34 @@ type IError = { * The candidate is already registered. */ AlreadyRegistered: PlainDescriptor; + /** + * The ring VRF key is already enrolled by another lite person. + */ + KeyAlreadyInUse: PlainDescriptor; + /** + * The account is already in use. + */ + AccountInUse: PlainDescriptor; + /** + * The alias <-> account mapping is already set and current. + */ + AliasAccountAlreadySet: PlainDescriptor; + /** + * The alias <-> account mapping is not set. + */ + AliasAccountNotSet: PlainDescriptor; + /** + * The requested alias setup block window is invalid for the current block. + */ + CallBlockOutOfRange: PlainDescriptor; + /** + * The alias context is invalid. + */ + InvalidAliasContext: PlainDescriptor; + /** + * The lite people member collection has not been initialized yet. + */ + LitePeopleCollectionNotCreated: PlainDescriptor; }; Resources: { /** @@ -7804,14 +8477,6 @@ type IError = { * The lite consumer is already linked to a full person consumer. */ AlreadyLinked: PlainDescriptor; - /** - * The requested slot number is out of range. - */ - InvalidSlot: PlainDescriptor; - /** - * The account already has an allowance in the slot. - */ - AccountAlreadyHasAllowance: PlainDescriptor; /** * The person's authorization has not expired yet. */ @@ -7832,6 +8497,30 @@ type IError = { * Account already has a reservation for another username. */ AlreadyHasReservation: PlainDescriptor; + /** + * Friend request sequence is invalid for the consumer. + */ + InvalidFriendRequestSequence: PlainDescriptor; + /** + * Friend request period is not the current period. + */ + InvalidFriendRequestPeriod: PlainDescriptor; + /** + * Friend request registration is not expired yet. + */ + FriendRequestRegistrationNotExpired: PlainDescriptor; + /** + * Friend request registration already exists for the alias/context. + */ + FriendRequestRegistrationAlreadyExists: PlainDescriptor; + /** + * The replacement cooldown has not elapsed since the entry was last set. + */ + StmtStoreReplacementTooEarly: PlainDescriptor; + /** + * The provided `limit` exceeds `LongTermStorageCleanupLimit`. + */ + LongTermStorageCleanupLimitExceeded: PlainDescriptor; }; ChunksManager: { /** @@ -7864,10 +8553,6 @@ type IError = { * The root cannot be finalized as there are still unpushed members. */ Incomplete: PlainDescriptor; - /** - * The root is still fresh. - */ - StillFresh: PlainDescriptor; /** * Too many members have been pushed. */ @@ -7957,6 +8642,14 @@ type IError = { * The caller is not the owner of the collection. */ NotCollectionOwner: PlainDescriptor; + /** + * The member is not in the onboarding queue. + */ + NotOnboarding: PlainDescriptor; + /** + * There is no ring root to build. + */ + NothingToBuild: PlainDescriptor; }; Coinage: { /** @@ -7999,6 +8692,11 @@ type IError = { */ CoinValueOutOfBound: PlainDescriptor; + /** + * The coin value cannot be losslessly converted to an asset amount because + * `UnderlyingAssetUnit` is not evenly divisible by `2^|value|`. + */ + LossyCoinValueConversion: PlainDescriptor; /** */ @@ -8059,44 +8757,139 @@ type IError = { */ CannotConvertNativeToAsset: PlainDescriptor; + /** + * When using Prepaid fee mode, max_fee must be 0. + */ + MaxFeeNotAllowedForPrepaid: PlainDescriptor; + /** + * The max_fee exceeds the total input value. + */ + MaxFeeExceedsInput: PlainDescriptor; + /** + * The max fee argument doesn't satisfy the requirements. + */ + InvalidMaxFee: PlainDescriptor; + /** + * The recycler collection does not exist and could not be created on-demand. + */ + CannotCreateRecyclerCollection: PlainDescriptor; }; - Airdrop: { + MembersNotifier: { + /** + * Subscriber not found. + */ + SubscriberNotFound: PlainDescriptor; /** - * No active airdrop event. + * Subscriber already exists. */ - NoActiveEvent: PlainDescriptor; + AlreadySubscribed: PlainDescriptor; + /** + * Maximum subscribers reached. + */ + TooManySubscribers: PlainDescriptor; + /** + * Collections list must be sorted in strictly ascending order with no duplicates. + */ + InvalidCollectionsList: PlainDescriptor; + /** + * Too many ring root updates to fit in a single batch. + */ + TooManyUpdates: PlainDescriptor; + /** + * XCM send failed. + */ + XcmSendFailed: PlainDescriptor; /** - * The origin is not a person. + * Subscriber is not subscribed to the requested collection. */ - NotAPerson: PlainDescriptor; + NotSubscribedToCollection: PlainDescriptor; /** - * The alias is already registered. + * Ring root index is out of range. */ - AliasAlreadyRegistered: PlainDescriptor; + InvalidRingIndex: PlainDescriptor; /** - * The event registration time is invalid. + * Requested updates exceed the subscriber's HRMP channel capacity. */ - InvalidEventRegistrationTime: PlainDescriptor; + ExceedsChannelCapacity: PlainDescriptor; /** - * Participant ID overflow. + * No active batch exists. */ - ParticipantIdOverflow: PlainDescriptor; + NoBatchActive: PlainDescriptor; /** - * The participant has no prize to claim for the event. + * No pending initialization for this subscriber. */ - NoPrizeToClaimForEvent: PlainDescriptor; + NoPendingInit: PlainDescriptor; /** - * The event doesn't exist. + * Replay cooldown has not elapsed for this subscriber and collection. */ - NoEventFound: PlainDescriptor; + ReplayCooldownActive: PlainDescriptor; /** - * The schedule is full. + * Replay requested with an empty list of ring root indices. */ - ScheduleFull: PlainDescriptor; + EmptyRingIndices: PlainDescriptor; + }; + Airdrop: { /** - * The prize must be more or equal to the minimum balance. + * The prize must be at least the asset's minimum balance. */ PrizeMustBeMoreOrEqualToMinBalance: PlainDescriptor; + /** + * Validity exceeds `MaxValiditySeconds`. + */ + ValidityTooLong: PlainDescriptor; + /** + * Validity is below `MinValiditySeconds`. + */ + ValidityTooShort: PlainDescriptor; + /** + * `num_prizes` must be greater than zero. + */ + NoPrizes: PlainDescriptor; + /** + * Funding account does not cover `prize_value * num_prizes`. + */ + InsufficientFunds: PlainDescriptor; + /** + * `MAX_CONCURRENT_PRIZE_POOLS` is full. + */ + TooManyConcurrentPrizePools: PlainDescriptor; + /** + * `pool_id` is not in `PrizePools`. + */ + NoSuchPrizePool: PlainDescriptor; + /** + * Prize pool has expired (`now >= expires_at`). + */ + PrizePoolExpired: PlainDescriptor; + /** + * Prize pool has no remaining prizes. + */ + PrizePoolExhausted: PlainDescriptor; + /** + * Caller's identity has already claimed from this pool. + */ + AlreadyClaimed: PlainDescriptor; + /** + * Arithmetic overflow when computing the per-pool hold amount. + */ + PoolValueOverflow: PlainDescriptor; + /** + * [`AirdropApi::claim_game_prize`] was called on a pool whose target is not + * `GameParticipants` (the trait method is for game pools only). + */ + WrongTarget: PlainDescriptor; + /** + * Claimant's winner-hash is not below the pool's threshold. + */ + DidNotWin: PlainDescriptor; + /** + * Ring-membership proof failed to verify against `PEOPLE_LITE_IDENTIFIER`. + */ + InvalidProof: PlainDescriptor; + /** + * Supplied `alias` does not match the alias the proof verifies to. + */ + AliasMismatch: PlainDescriptor; }; MultiBlockMigrations: { /** @@ -8114,7 +8907,7 @@ type IConstants = { /** * The maximum length of a block (in bytes). */ - BlockLength: PlainDescriptor>; + BlockLength: PlainDescriptor>; /** * Maximum number of block number to block hash mappings to keep (oldest pruned first). */ @@ -8282,7 +9075,8 @@ type IConstants = { Aura: { /** * The slot duration Aura should run with, expressed in milliseconds. - * The effective value of this type should not change while the chain is running. + * + * The effective value of this type can be changed with a runtime upgrade. * * For backwards compatibility either use [`MinimumPeriodTimesTwo`] or a const. */ @@ -8520,6 +9314,10 @@ type IConstants = { * created. */ OnboardingQueuePageSize: PlainDescriptor; + /** + * Interval (in blocks) at which the offchain worker runs stale alias cleanup. + */ + StaleAliasCleanupInterval: PlainDescriptor; /** * The amount of block number tolerance we allow for a setup account transaction. * @@ -8656,6 +9454,11 @@ type IConstants = { * entries older than this will be imminently purged from storage. */ MaxAttendanceHistoryDepth: PlainDescriptor; + /** + * Fixed reward amount per scratch card winner. The actual payout is + * `min(pot_balance, RewardPerWinner)`. + */ + RewardPerWinner: PlainDescriptor; /** * The base message of the proof of ownership of an account by an alias. * @@ -8687,6 +9490,20 @@ type IConstants = { */ ubi_points: PlainDescriptor; }; + PeopleLite: { + /** + * Ring exponent used for the lite people collection. + */ + LiteRingExponent: PlainDescriptor>; + /** + * Onboarding size used when creating the lite people collection. + */ + LiteOnboardingSize: PlainDescriptor; + /** + * The number of blocks of tolerance we allow for an alias setup transaction. + */ + account_setup_block_tolerance: PlainDescriptor; + }; Resources: { /** * The maximum length of a username, including any potential trailing digits. @@ -8712,19 +9529,110 @@ type IConstants = { */ MaxReservationQueueLength: PlainDescriptor; /** - * The number of slots for the accounts API authorization. + * The Statement Store allowance for the accounts API. + */ + AccountsApiAllowance: PlainDescriptor>; + /** + * Maximum number of statement store slots a person can claim within one period. + */ + StmtStoreSlotsPerPeriod: PlainDescriptor; + /** + * Maximum number of statement store slots a lite person can claim within one period. * - * Increasing or decreasing this value will require a migration. + * Same semantics as `StmtStoreSlotsPerPeriod` but applied when the proof targets the + * lite-people collection via `MembershipCollection::LitePeople`. */ - AccountsApiSlotCount: PlainDescriptor; + LiteStmtStoreSlotsPerPeriod: PlainDescriptor; /** - * The refund cooldown, in seconds, for the accounts API. + * Maximum number of stale statement store allowance entries to remove per cleanup call. */ - AccountsApiRefundCooldown: PlainDescriptor; + StmtStoreCleanupLimit: PlainDescriptor; /** - * The Statement Store allowance for the accounts API. + * Minimum time, in seconds, that must pass before an alias can replace its own + * statement store allowance entry within the same period. */ - AccountsApiAllowance: PlainDescriptor>; + StmtStoreReplacementCooldown: PlainDescriptor; + /** + * The Statement Store allowance for friend request statement registration. + */ + FriendRequestAllowance: PlainDescriptor>; + /** + * Maximum number of friend requests a person can send within one rate-limit period. + * + * For example, if this is `8`, each person can send up to 8 friend requests during the + * period selected by `FriendRequestPeriodDuration`. When the period advances, the slots + * reset. + */ + FriendRequestSlotsPerPeriod: PlainDescriptor; + /** + * Maximum number of friend requests a lite person can send within one rate-limit period. + * + * Same semantics as `FriendRequestSlotsPerPeriod` but applied when the proof targets the + * lite-people collection via `MembershipCollection::LitePeople`. + */ + LiteFriendRequestSlotsPerPeriod: PlainDescriptor; + /** + * Rolling time window for rate-limiting friend requests, in seconds. + * + * Time is divided into fixed-duration periods. The period index is computed as + * `now_secs / FriendRequestPeriodDuration`. + * + * For example, if this is `86_400` (24 hours), period `0` is the first 24 hours since the + * Unix epoch, period `1` is the next 24 hours, and so on. Combined with + * `FriendRequestSlotsPerPeriod`, this defines how many friend requests can be sent in each + * period. + */ + FriendRequestPeriodDuration: PlainDescriptor; + /** + * Extra time, in seconds, during which the previous friend request period is still + * accepted after a rollover. + * + * This allows transactions created close to a period boundary to still be included even if + * they are executed just after the next period begins. + */ + FriendRequestGraceWindow: PlainDescriptor; + /** + * Duration for which friend request registrations will be retained. Specified in seconds. + * + * A registration is created for a specific period. Once this period ends, + * the registration remains valid for the configured duration, after which + * it can be cleaned up. See `friend_request_expiration_time`. + */ + FriendRequestRetentionDuration: PlainDescriptor; + /** + * Number of blocks between offchain-worker maintenance runs. + */ + OffchainWorkerInterval: PlainDescriptor; + /** + * The duration of a long-term storage claiming period, in seconds. + * + * Time is divided into fixed-duration periods. The period index is computed as + * `now_secs / LongTermStoragePeriodDuration`. Each person can submit up to + * `LongTermStorageClaimsPerPeriod` claims per period. + */ + LongTermStoragePeriodDuration: PlainDescriptor; + /** + * Maximum number of long-term storage claims per person per period. + * + * Each claim uses a different counter value (0..claims_per_period) which produces a + * distinct alias in the proof context, ensuring one claim per counter slot. + */ + LongTermStorageClaimsPerPeriod: PlainDescriptor; + /** + * Extra time, in seconds, during which the previous long-term storage period is still + * accepted after a rollover. + * + * Same semantics as `FriendRequestGraceWindow` but applied to long-term storage claims. + */ + LongTermStorageGraceWindow: PlainDescriptor; + /** + * Maximum number of spent long-term storage aliases that can be cleared in a single + * `clear_expired_long_term_storage_aliases` call. + * + * Bounds the worst-case weight of the cleanup extrinsic; callers must pass a `limit` + * no greater than this value. + */ + LongTermStorageCleanupLimit: PlainDescriptor; }; ChunksManager: { /** @@ -8753,6 +9661,15 @@ type IConstants = { * call. */ RingBuildingMemberLimit: PlainDescriptor; + /** + * Duration in seconds that old ring roots are retained before they can be cleaned up. + * This allows proofs generated with older roots to remain valid for a grace period. + */ + OldRootRetentionDuration: PlainDescriptor; + /** + * The number of blocks between offchain worker executions. + */ + OffchainWorkerInterval: PlainDescriptor; }; Coinage: { /** @@ -8779,6 +9696,17 @@ type IConstants = { * The maximum exponent for the coin value. */ MaximumExponent: PlainDescriptor; + /** + * The minimum coin exponent that can be used to dispatch a call `unload_recycler_*` with + * the transaction extension `AsUnloadTokenFromOutput`. + * + * This ensures the fee coin is large enough to penalize failing transactions, but it does + * not need to cover the whole unload token fee. + * + * The helper function `weight_for_unload_recycler_paying_using_output` can be used to + * evaluate the worst-case weight for this operation. + */ + MinimumExponentForOutputUnloadFee: PlainDescriptor; /** * The maximum number of outputs for a split. */ @@ -8787,6 +9715,11 @@ type IConstants = { * The maximum number of alias proofs in a consolidation. */ MaxConsolidation: PlainDescriptor; + /** + * The maximum number of inner calls in a single + * [`Call::load_recycler_with_external_asset_unpaid_batch`] dispatch. + */ + MaxBatchUnpaidLoad: PlainDescriptor; /** * The time period duration for unload tokens, in seconds. */ @@ -8815,7 +9748,7 @@ type IConstants = { */ MaxFreeUnloadTokensPerTimePeriod: PlainDescriptor; /** - * The number of block between two offchain worker executions. + * The number of blocks between offchain worker executions. */ OffchainWorkerInterval: PlainDescriptor; /** @@ -8830,16 +9763,71 @@ type IConstants = { */ pallet_account: PlainDescriptor; }; + MembersNotifier: { + /** + * Maximum number of subscribers allowed. + */ + MaxSubscribers: PlainDescriptor; + /** + * Maximum updates per batch. + */ + MaxUpdatesPerBatch: PlainDescriptor; + /** + * Maximum collections a subscriber can subscribe to. + */ + MaxCollectionsPerSubscriber: PlainDescriptor; + /** + * Maximum number of ring collections. + */ + MaxCollections: PlainDescriptor; + /** + * Minimum number of blocks between update batches. + */ + UpdateTriggerBlocks: PlainDescriptor; + /** + * Minimum number of updates to trigger immediate batch send. + */ + UpdateTriggerThreshold: PlainDescriptor; + /** + * Per-index weight surcharge for remote execution on the subscriber chain. + */ + RequestReplayRemoteWeight: PlainDescriptor>; + /** + * Minimum number of blocks between offchain worker runs. + */ + OffchainWorkerInterval: PlainDescriptor; + /** + * Number of blocks after which a stuck batch is abandoned. + */ + StuckBatchTimeout: PlainDescriptor; + /** + * Cooldown, in seconds, between replay requests for the same subscriber and collection. + */ + ReplayCooldownSeconds: PlainDescriptor; + }; Airdrop: { /** - * The account id for the airdrop pot. + * Lower bound on a prize pool's `validity` (in seconds). A pool whose validity is + * below this is rejected with [`Error::ValidityTooShort`] — the floor exists so + * claimants have at least a minimum window in which to submit before the pool + * auto-cleans-up. */ - airdrop_pot_id: PlainDescriptor; + MinValiditySeconds: PlainDescriptor; /** - * The base context for airdrops. Each airdrop context is derived from this base context - * with the airdrop index in LE encoding added to it. + * Upper bound on a prize pool's `validity` (in seconds). Bounds the lifetime of + * `PrizePoolClaims` entries for a single pool. Default chosen by the runtime; + * the spec recommends one week (`604_800`). */ - airdrop_context_base: PlainDescriptor>; + MaxValiditySeconds: PlainDescriptor; + /** + * Maximum number of `PrizePoolClaims` entries to drop per `on_poll` tick when + * cleaning up an expired prize pool. + */ + PrizePoolClearLimit: PlainDescriptor; + /** + * The account id for the airdrop pot. + */ + airdrop_pot_id: PlainDescriptor; }; MultiBlockMigrations: { /** @@ -8881,12 +9869,30 @@ type IViewFns = { /** * Check if a `RuntimeCall` is allowed for a given `ProxyType`. */ - check_permissions: RuntimeDescriptor<[call: Anonymize, proxy_type: Anonymize], boolean>; + check_permissions: RuntimeDescriptor<[call: Anonymize, proxy_type: Anonymize], boolean>; /** * Check if one `ProxyType` is a subset of another `ProxyType`. */ is_superset: RuntimeDescriptor<[to_check: Anonymize, against: Anonymize], boolean>; }; + Resources: { + /** + * Returns the current statement store allowance period (day number since Unix epoch). + */ + current_stmt_store_period: RuntimeDescriptor<[], number>; + /** + * Returns the proof context for a statement store slot claim at the given + * `period` and `seq`. + * + * Layout: `SSS_SLOT:` padded to 32 bytes. + */ + stmt_store_slot_context_for: RuntimeDescriptor<[period: number, seq: number], SizedHex<32>>; + /** + * Returns the proof context for a friend request registration at the given + * `period` and `seq`. + */ + friend_request_context_for: RuntimeDescriptor<[period: number, seq: number], SizedHex<32>>; + }; Coinage: { /** * Get the current number of free unload tokens distributed to people and lite people @@ -8973,6 +9979,37 @@ type IViewFns = { * If the period is not current, the result is not significant. */ is_free_token_alias_consumed: RuntimeDescriptor<[period: number, alias: SizedHex<32>], boolean>; + /** + * Get the worst-case weight for a transaction using output-based fee payment. + * + * This function returns the maximum weight for transactions dispatched with + * `AsUnloadTokenFromOutput`, useful for runtime configuration to find a good value for + * `MinimumExponentForOutputUnloadFee`. + */ + weight_for_unload_recycler_paying_using_output: RuntimeDescriptor<[], Anonymize>; + }; + MultiBlockMigrations: { + /** + * Returns the ongoing status of migrations. + */ + ongoing_status: RuntimeDescriptor<[], Anonymize>; + /** + * Returns progress information about the current migration, if any. + * + * This function provides detailed information about the current migration's progress, + * including the number of steps completed and the maximum allowed steps. + */ + progress: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the storage prefixes affected by the current migration. + * + * Can be empty if the migration does not know or there are no prefixes. + */ + affected_prefixes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the comprehensive status of multi-block migrations. + */ + status: RuntimeDescriptor<[], Anonymize>; }; }; type IRuntimeCalls = { @@ -9091,7 +10128,7 @@ type IRuntimeCalls = { * Returns an inclusion outcome which specifies if this extrinsic is included in * this block or not. */ - apply_extrinsic: RuntimeDescriptor<[extrinsic: Uint8Array], Anonymize>; + apply_extrinsic: RuntimeDescriptor<[extrinsic: Uint8Array], Anonymize>; /** * Finish the current block. */ @@ -9144,7 +10181,7 @@ type IRuntimeCalls = { * * Returns the concatenated SCALE encoded public keys. */ - generate_session_keys: RuntimeDescriptor<[seed: Anonymize], Uint8Array>; + generate_session_keys: RuntimeDescriptor<[owner: Uint8Array, seed: Anonymize], Anonymize>; /** * Decode the given public session keys. * @@ -9189,11 +10226,11 @@ type IRuntimeCalls = { /** * Query information of a dispatch class, weight, and fee of a given encoded `Call`. */ - query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; /** * Query fee details of a given encoded `Call`. */ - query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; /** * Query the output of the current `WeightToFee` given some input. */ @@ -9256,6 +10293,27 @@ type IRuntimeCalls = { */ query_delivery_fees: RuntimeDescriptor<[destination: XcmVersionedLocation, message: XcmVersionedXcm, asset_id: XcmVersionedAssetId], Anonymize>; }; + /** + * API for dry-running extrinsics and XCM programs to get the programs that need to be passed to the fees API. + * + * All calls return a vector of tuples (location, xcm) where each "xcm" is executed in "location". + * If there's local execution, the location will be "Here". + * This vector can be used to calculate both execution and delivery fees. + * + * Calls or XCMs might fail when executed, this doesn't mean the result of these calls will be an `Err`. + * In those cases, there might still be a valid result, with the execution error inside it. + * The only reasons why these calls might return an error are listed in the [`Error`] enum. + */ + DryRunApi: { + /** + * Dry run call V2. + */ + dry_run_call: RuntimeDescriptor<[origin: Anonymize, call: Anonymize, result_xcms_version: number], Anonymize>; + /** + * Dry run XCM program + */ + dry_run_xcm: RuntimeDescriptor<[origin_location: XcmVersionedLocation, xcm: XcmVersionedXcm], Anonymize>; + }; /** * API for useful conversions between XCM `Location` and `AccountId`. */ @@ -9293,10 +10351,6 @@ type IRuntimeCalls = { * Returns the deposit necessary to play a game. */ play_deposit: RuntimeDescriptor<[], bigint>; - /** - * Statement validation with precise reason for invalid statements. - */ - validate_statement_with_reason: RuntimeDescriptor<[source: Anonymize, statement: Anonymize], Anonymize>; }; /** * Runtime api to collect information about a collation. @@ -9356,17 +10410,8 @@ type IRuntimeCalls = { */ preset_names: RuntimeDescriptor<[], Anonymize>; }; - /** - * Runtime API trait for statement validation. - */ - ValidateStatement: { - /** - * Validate the statement. - */ - validate_statement: RuntimeDescriptor<[source: Anonymize, statement: Anonymize], Anonymize>; - }; }; -export type People_liteDispatchError = Anonymize; +export type People_liteDispatchError = Anonymize; type IAsset = PlainDescriptor>; export type People_liteExtensions = { "VerifyMultiSignature": { @@ -9385,10 +10430,16 @@ export type People_liteExtensions = { value: Anonymize; }; "PeopleLiteAuth": { - value: Anonymize; + value: Anonymize; + }; + "AsMember": { + value: Anonymize; }; "AsCoinage": { - value: Anonymize; + value: Anonymize; + }; + "AsResources": { + value: Anonymize; }; "RestrictOrigins": { value: boolean; @@ -9422,15 +10473,15 @@ export type People_liteEvents = EventsFromPalletsDef; export type People_liteErrors = ErrorsFromPalletsDef; export type People_liteConstants = ConstFromPalletsDef; export type People_liteViewFns = ViewFnsFromPalletsDef; -export type People_liteCallData = Anonymize & { +export type People_liteCallData = Anonymize & { value: { type: string; }; }; type AllInteractions = { storage: { - System: ['Account', 'ExtrinsicCount', 'InherentsApplied', 'BlockWeight', 'AllExtrinsicsLen', 'BlockHash', 'ExtrinsicData', 'Number', 'ParentHash', 'Digest', 'Events', 'EventCount', 'EventTopics', 'LastRuntimeUpgrade', 'UpgradedToU32RefCount', 'UpgradedToTripleRefCount', 'ExecutionPhase', 'AuthorizedUpgrade', 'ExtrinsicWeightReclaimed']; - ParachainSystem: ['UnincludedSegment', 'AggregatedUnincludedSegment', 'PendingValidationCode', 'NewValidationCode', 'ValidationData', 'DidSetValidationCode', 'LastRelayChainBlockNumber', 'UpgradeRestrictionSignal', 'UpgradeGoAhead', 'RelayStateProof', 'RelevantMessagingState', 'HostConfiguration', 'LastDmqMqcHead', 'LastHrmpMqcHeads', 'ProcessedDownwardMessages', 'LastProcessedDownwardMessage', 'HrmpWatermark', 'LastProcessedHrmpMessage', 'HrmpOutboundMessages', 'UpwardMessages', 'PendingUpwardMessages', 'PendingUpwardSignals', 'UpwardDeliveryFeeFactor', 'AnnouncedHrmpMessagesPerCandidate', 'ReservedXcmpWeightOverride', 'ReservedDmpWeightOverride', 'CustomValidationHeadData']; + System: ['Account', 'ExtrinsicCount', 'InherentsApplied', 'BlockWeight', 'BlockSize', 'BlockHash', 'ExtrinsicData', 'Number', 'ParentHash', 'Digest', 'Events', 'EventCount', 'EventTopics', 'LastRuntimeUpgrade', 'BlocksTillUpgrade', 'UpgradedToU32RefCount', 'UpgradedToTripleRefCount', 'ExecutionPhase', 'AuthorizedUpgrade', 'ExtrinsicWeightReclaimed']; + ParachainSystem: ['BlockWeightMode', 'PreviousCoreCount', 'UnincludedSegment', 'AggregatedUnincludedSegment', 'PendingValidationCode', 'NewValidationCode', 'ValidationData', 'DidSetValidationCode', 'LastRelayChainBlockNumber', 'UpgradeRestrictionSignal', 'UpgradeGoAhead', 'RelayStateProof', 'RelevantMessagingState', 'HostConfiguration', 'LastDmqMqcHead', 'LastHrmpMqcHeads', 'ProcessedDownwardMessages', 'LastProcessedDownwardMessage', 'HrmpWatermark', 'LastProcessedHrmpMessage', 'HrmpOutboundMessages', 'UpwardMessages', 'PendingUpwardMessages', 'PendingUpwardSignals', 'PendingApprovedPeer', 'UpwardDeliveryFeeFactor', 'AnnouncedHrmpMessagesPerCandidate', 'ReservedXcmpWeightOverride', 'ReservedDmpWeightOverride', 'CustomValidationHeadData', 'PoVMessagesTracker']; Timestamp: ['Now', 'DidUpdate']; ParachainInfo: ['ParachainId']; Balances: ['TotalIssuance', 'InactiveIssuance', 'Account', 'Locks', 'Reserves', 'Holds', 'Freezes']; @@ -9441,7 +10492,7 @@ type AllInteractions = { AssetRate: ['ConversionRateToNative']; Authorship: ['Author']; CollatorSelection: ['Invulnerables', 'CandidateList', 'LastAuthoredBlock', 'DesiredCandidates', 'CandidacyBond']; - Session: ['Validators', 'CurrentIndex', 'QueuedChanged', 'QueuedKeys', 'DisabledValidators', 'NextKeys', 'KeyOwner']; + Session: ['Validators', 'CurrentIndex', 'QueuedChanged', 'QueuedKeys', 'DisabledValidators', 'NextKeys', 'KeyOwner', 'ExternallySetKeys']; Aura: ['Authorities', 'CurrentSlot']; AuraExt: ['Authorities', 'RelaySlotInfo']; XcmpQueue: ['InboundXcmpSuspended', 'OutboundXcmpStatus', 'OutboundXcmpMessages', 'SignalMessages', 'QueueConfig', 'QueueSuspended', 'DeliveryFeeFactor']; @@ -9454,17 +10505,18 @@ type AllInteractions = { People: ['Keys', 'CounterForKeys', 'People', 'AliasToAccount', 'AccountToAlias', 'AccountToPersonalId', 'NextPersonalId', 'PeopleCollectionCreated', 'ReservedPersonalId']; MobRule: ['Credits', 'VotingPenalties', 'VotingPoints', 'Votes', 'CaseCount', 'OpenCases', 'RipeCases', 'DoneCases', 'AccumulatedPoints', 'PayoutDistribution', 'RoundSchedules', 'ActiveSince']; ProofOfInk: ['Candidates', 'People', 'ReferralTickets', 'DesignFamilies', 'CommittedDesigns', 'AllocationCount', 'Configuration', 'AvailableInvites', 'PendingInvites', 'ReferrerReimbursementValues', 'ReferredReimbursementValues']; - Game: ['TestnetStoredPhaseDurations', 'Nfts', 'ArchivedPlayers', 'Players', 'GameIndex', 'Game', 'GameHistory', 'PlayerAttendanceHistory', 'IndexToPlayer', 'PlayerToIndex', 'ShuffleRecognized', 'ShuffleNotRecognized', 'GameSchedules', 'AvailableInvites', 'PendingInvites', 'AliasToStmtAccount', 'StmtAccountToAlias', 'CommunicationIdentifiers']; + Game: ['TestnetStoredPhaseDurations', 'Nfts', 'NftCandidates', 'ArchivedPlayers', 'Players', 'GameIndex', 'Game', 'GameHistory', 'PlayerAttendanceHistory', 'GameParticipantCount', 'IndexToPlayer', 'PlayerToIndex', 'ShuffleRecognized', 'ShuffleNotRecognized', 'GameSchedules', 'AvailableInvites', 'PendingInvites', 'AliasToStmtAccount', 'StmtAccountToAlias', 'CommunicationIdentifiers', 'ScratchReward', 'ScratchEligibilityMap', 'ScratchClaimedCount']; Score: ['Participants', 'PersonhoodThreshold', 'AbsenceGraceSchedule', 'AbsenceGraceRatio', 'CurrentRoundPoints', 'CurrentRoundIndex', 'RoundsPointsForParticipant', 'RoundPayouts', 'RoundPlanning', 'RoundSchedules']; DummyDim: ['ReservedIds', 'People']; - PeopleLite: ['LitePeople', 'AttestationAllowance']; - Resources: ['Consumers', 'StmtStoreAssociatedAccount', 'UsernameOwnerOf', 'AccountOfAlias', 'UsernameReservationDuration', 'UsernameReservationQueue', 'ReservationOf']; + PeopleLite: ['LitePeople', 'AliasToAccount', 'AccountToAlias', 'LitePeopleCollectionCreated', 'AttestationAllowance']; + Resources: ['Consumers', 'StatementStoreAllowances', 'StmtStoreAllowanceByAccount', 'FriendRequestRegistrationByAlias', 'FriendRequestAliasByAccount', 'SpentLongTermStorageAliases', 'UsernameOwnerOf', 'AccountOfAlias', 'UsernameReservationDuration', 'UsernameReservationQueue', 'ReservationOf']; ChunksManager: ['Chunks', 'ChunkPageHashes']; - Members: ['Collections', 'SuspendedCollections', 'IdentifiersOf', 'Root', 'CurrentRingIndex', 'OnboardingSize', 'RingKeys', 'RingKeysStatus', 'PendingSuspensions', 'ActiveMembers', 'Members', 'RingsState', 'StaleRings', 'QueuePageIndices', 'OnboardingQueue', 'DeletionInProgress', 'RingDeletionQueue']; + Members: ['Collections', 'SuspendedCollections', 'IdentifiersOf', 'Root', 'OldRoots', 'CurrentRingIndex', 'OnboardingSize', 'RingKeys', 'RingKeysStatus', 'PendingSuspensions', 'ActiveMembers', 'Members', 'RingsState', 'StaleRings', 'QueuePageIndices', 'OnboardingQueue', 'RingDeletionQueue']; Coinage: ['CoinsByOwner', 'LockedCoins', 'TotalValueOfDestroyedCoins', 'ConsumedFreeUnloadTokens', 'RecyclerCollectionCreated', 'RecyclersLastRemovedRingIndex', 'RecyclersCoinToRecycler', 'RecyclersUnloaded', 'RecyclersDusting', 'PaidUnloadTokenMembers', 'PaidUnloadTokenConsumed', 'PaidTokenCollectionsCreated', 'PaidUnloadTokenDusting', 'PaidUnloadTokenNextRingToClean', 'InitializePalletAccount']; - StorageInitialization: ['OnPollStatus', 'XcmTransferInitiatedAt']; + MembersNotifier: ['Subscribers', 'CounterForSubscribers', 'SealedBatchSequence', 'PageState', 'PendingUpdates', 'PageUpdatesCount', 'PendingInit', 'CounterForPendingInit', 'SealedBatchIndices', 'CurrentBatch', 'SubscribersWithCurrentBatch', 'LastReplayTime']; + StorageInitialization: ['OnPollStatus', 'XcmTransferInitiatedAt', 'LastAirdropPoolPeriod', 'AirdropSchedulingEnabled']; StorageInitializationLite: ['OnPollStatus']; - Airdrop: ['EventSchedule', 'EventScheduleFirstStartTime', 'NextEventId', 'ActiveEvents', 'ActiveEventIds', 'ParticipantIdToAliasAndDest', 'ParticipantAliasToId', 'WinnersToDistributeTo', 'WinnersWithFailedTransfer', 'PastAirdrops']; + Airdrop: ['NextPrizePoolId', 'PrizePools', 'CounterForPrizePools', 'PrizePoolClaims']; MultiBlockMigrations: ['Cursor', 'Historic']; }; tx: { @@ -9485,18 +10537,20 @@ type AllInteractions = { Sudo: ['sudo', 'sudo_unchecked_weight', 'set_key', 'sudo_as', 'remove_key']; Proxy: ['proxy', 'add_proxy', 'remove_proxy', 'remove_proxies', 'create_pure', 'kill_pure', 'announce', 'remove_announcement', 'reject_announcement', 'proxy_announced', 'poke_deposit']; Identity: ['add_registrar', 'set_identity', 'set_subs', 'clear_identity', 'request_judgement', 'cancel_request', 'set_fee', 'set_account_id', 'set_fields', 'provide_judgement', 'kill_identity', 'add_sub', 'rename_sub', 'remove_sub', 'quit_sub', 'add_username_authority', 'remove_username_authority', 'set_username_for', 'accept_username', 'remove_expired_approval', 'set_primary_username', 'unbind_username', 'remove_username', 'kill_username', 'set_personal_identity', 'submit_personal_credential_evidence', 'personal_credential_judged', 'clear_personal_identity', 'report_username', 'reported_username_judged']; - People: ['under_alias', 'set_alias_account', 'unset_alias_account', 'force_recognize_personhood', 'set_personal_id_account', 'unset_personal_id_account', 'create_people_collection']; + People: ['under_alias', 'set_alias_account', 'unset_alias_account', 'force_recognize_personhood', 'set_personal_id_account', 'unset_personal_id_account', 'create_people_collection', 'clean_up_stale_aliases']; MobRule: ['vote', 'close_case', 'clean_vote', 'reap_case', 'intervene', 'claim_vote', 'payout_rewards', 'claim_votes', 'start_payout_round', 'schedule_payout_rounds', 'remove_payout_schedule', 'claim_credit', 'clean_points', 'force_ripen_case', 'touch_case', 'clear_voting_penalty', 'clean_vote_signed']; ProofOfInk: ['apply', 'submit_evidence', 'judged', 'register_referred', 'register_non_referred', 'reroll', 'commit', 'allocate_full', 'timeout', 'flakeout', 'apply_with_signature', 'apply_with_invitation', 'add_design_family', 'set_referral_ticket', 'cancel_referral_ticket', 'register_successful_referral_reward', 'grant_invites', 'remove_available_and_pending_invites', 'set_invite_ticket', 'cancel_invite_ticket', 'set_configuration', 'set_reimbursement_values']; - Game: ['sign_up_with_invite', 'sign_up_with_account', 'sign_up_with_alias', 'report', 'offboard', 'kickout', 'grant_invites', 'remove_available_and_pending_invites', 'set_invite_ticket', 'cancel_invite_ticket', 'schedule_games', 'remove_scheduled_game', 'testnet_force_start_shuffle', 'testnet_force_end_reporting', 'testnet_set_game_phases', 'testnet_kill_current_game']; + Game: ['sign_up_with_invite', 'sign_up_with_account', 'sign_up_with_alias', 'report', 'offboard', 'kickout', 'grant_invites', 'remove_available_and_pending_invites', 'set_invite_ticket', 'cancel_invite_ticket', 'schedule_games', 'remove_scheduled_game', 'claim_reward', 'claim_game_prize', 'testnet_force_start_shuffle', 'testnet_force_end_reporting', 'testnet_set_game_phases', 'testnet_kill_current_game']; Score: ['schedule_payout_rounds', 'remove_payout_schedule', 'transition_round', 'operate_payout_round', 'cash_out', 'redeem_credit', 'register', 'set_absence_grace_schedule']; DummyDim: ['reserve_ids', 'renew_id_reservation', 'cancel_id_reservation', 'recognize_personhood', 'suspend_personhood', 'resume_personhood', 'start_mutation_session', 'end_mutation_session']; - PeopleLite: ['increase_attestation_allowance', 'clear_attestation_allowance', 'attest', 'dispatch_as_signer']; - Resources: ['register_lite_person', 'register_person', 'touch_person_authorization', 'remove_expired_username_reservation', 'update_identifier_key', 'set_username_reservation_duration', 'set_stmt_store_associated_account_id_at_slot', 'demote_auth_expired']; + PeopleLite: ['increase_attestation_allowance', 'clear_attestation_allowance', 'attest', 'dispatch_as_signer', 'set_alias_account', 'unset_alias_account']; + Resources: ['register_lite_person', 'register_person', 'touch_person_authorization', 'remove_expired_username_reservation', 'update_identifier_key', 'set_username_reservation_duration', 'demote_auth_expired', 'set_friend_request_statement_account_for_sequence', 'clear_expired_friend_request_sequence', 'set_statement_store_account', 'clear_expired_stmt_store_allowances', 'claim_long_term_storage', 'clear_expired_long_term_storage_aliases']; ChunksManager: ['add_chunks', 'set_chunk_page_hashes']; - Members: ['build_ring_manual', 'onboard_members_manual', 'merge_rings', 'set_onboarding_size']; - Coinage: ['split', 'transfer', 'load_recycler_with_coin', 'load_recycler_with_external_asset', 'unload_recycler_into_coin', 'unload_recycler_into_external_asset', 'pay_for_recycler_unload_fee_token_with_coin', 'pay_for_recycler_unload_fee_token_with_native', 'pay_for_recycler_unload_fee_token_with_stable', 'unload_recyclers_into_coin_unstable', 'unload_recyclers_into_external_asset_unstable', 'unload_recycler_into_external_asset_non_anonymous', 'unload_recyclers_into_external_asset_non_anonymous', 'unload_recycler_into_coins', 'direct_offboard_coin_into_external_asset', 'clean_recycler', 'clean_consumed_free_token', 'clean_paid_unload_token_ring', 'clean_recycler_dust', 'clean_paid_unload_token_dust', 'delete_expired_paid_unload_token_collection']; - Airdrop: ['schedule_event', 'remove_scheduled_event', 'register_for_event', 'claim_failed_transfer_prize']; + Members: ['merge_rings', 'set_onboarding_size', 'self_include', 'build_ring_authorized', 'onboard_members_authorized', 'merge_queue_pages_authorized', 'remove_suspended_keys_authorized', 'delete_ring_page_authorized', 'enqueue_ring_deletion_authorized', 'delete_onboarding_queue_page_authorized', 'finalize_collection_deletion_authorized', 'mark_ring_stale_authorized', 'clean_up_old_roots_authorized']; + Coinage: ['split', 'transfer', 'load_recycler_with_coin', 'load_recycler_with_external_asset', 'load_recycler_with_external_asset_unpaid', 'load_recycler_with_external_asset_unpaid_batch', 'unload_recycler_into_coin', 'unload_recycler_into_external_asset', 'pay_for_recycler_unload_fee_token_with_coin', 'pay_for_recycler_unload_fee_token_with_native', 'pay_for_recycler_unload_fee_token_with_stable', 'unload_recycler_into_external_asset_and_vouchers', 'unload_recycler_into_external_asset_non_anonymous', 'unload_recyclers_into_external_asset_non_anonymous', 'unload_recycler_into_coins', 'direct_offboard_coin_into_external_asset', 'clean_recycler', 'clean_consumed_free_token', 'clean_paid_unload_token_ring', 'clean_recycler_dust', 'clean_paid_unload_token_dust', 'delete_expired_paid_unload_token_collection']; + MembersNotifier: ['subscribe', 'unsubscribe', 'request_replay', 'enqueue_updates', 'send_batch', 'send_init_page', 'abandon_stuck_batch']; + StorageInitialization: ['set_airdrop_scheduling_enabled']; + Airdrop: ['open_prize_pool', 'claim_prize', 'close_prize_pool']; MultiBlockMigrations: ['force_set_cursor', 'force_set_active_cursor', 'force_onboard_mbms', 'clear_historic']; }; events: { @@ -9506,7 +10560,7 @@ type AllInteractions = { TransactionPayment: ['TransactionFeePaid']; SkipFeelessPayment: ['FeeSkipped']; OriginRestriction: ['UsageCleaned']; - Assets: ['Created', 'Issued', 'Transferred', 'Burned', 'TeamChanged', 'OwnerChanged', 'Frozen', 'Thawed', 'AssetFrozen', 'AssetThawed', 'AccountsDestroyed', 'ApprovalsDestroyed', 'DestructionStarted', 'Destroyed', 'ForceCreated', 'MetadataSet', 'MetadataCleared', 'ApprovedTransfer', 'ApprovalCancelled', 'TransferredApproved', 'AssetStatusChanged', 'AssetMinBalanceChanged', 'Touched', 'Blocked', 'Deposited', 'Withdrawn', 'ReservesUpdated', 'ReservesRemoved']; + Assets: ['Created', 'Issued', 'Transferred', 'Burned', 'TeamChanged', 'OwnerChanged', 'Frozen', 'Thawed', 'AssetFrozen', 'AssetThawed', 'AccountsDestroyed', 'ApprovalsDestroyed', 'DestructionStarted', 'Destroyed', 'ForceCreated', 'MetadataSet', 'MetadataCleared', 'ApprovedTransfer', 'ApprovalCancelled', 'TransferredApproved', 'AssetStatusChanged', 'AssetMinBalanceChanged', 'Touched', 'Blocked', 'Deposited', 'Withdrawn', 'ReservesUpdated', 'ReservesRemoved', 'IssuedCredit', 'BurnedCredit', 'IssuedDebt', 'BurnedDebt']; AssetsHolder: ['Held', 'Released', 'Burned']; AssetRate: ['AssetRateCreated', 'AssetRateRemoved', 'AssetRateUpdated']; AssetTxPayment: ['AssetTxFeePaid']; @@ -9521,20 +10575,21 @@ type AllInteractions = { Sudo: ['Sudid', 'KeyChanged', 'KeyRemoved', 'SudoAsDone']; Proxy: ['ProxyExecuted', 'PureCreated', 'PureKilled', 'Announced', 'ProxyAdded', 'ProxyRemoved', 'DepositPoked']; Identity: ['IdentitySet', 'IdentityCleared', 'IdentityKilled', 'JudgementRequested', 'JudgementUnrequested', 'JudgementGiven', 'RegistrarAdded', 'SubIdentityAdded', 'SubIdentitiesSet', 'SubIdentityRenamed', 'SubIdentityRemoved', 'SubIdentityRevoked', 'AuthorityAdded', 'AuthorityRemoved', 'UsernameSet', 'UsernameQueued', 'PreapprovalExpired', 'PrimaryUsernameSet', 'DanglingUsernameRemoved', 'UsernameUnbound', 'UsernameRemoved', 'UsernameKilled', 'UsernameReported', 'PersonalIdentitySet', 'EvidenceSubmitted', 'CredentialAccepted', 'CredentialRejected', 'PersonBanned', 'PersonalIdentityCleared', 'ReportedUsernameJudgedValid', 'ReportedUsernameJudgedInvalid', 'ReportedUsernameWeakOrUnclearJudgement']; - People: ['PersonhoodRecognized', 'PersonOnboarding', 'AliasDispatched', 'AliasAccountSet', 'AliasAccountUnset', 'PersonalIdAccountSet', 'PersonalIdAccountUnset', 'CollectionCreated', 'ForcePersonhoodRecognized']; + People: ['PersonhoodRecognized', 'PersonOnboarding', 'AliasDispatched', 'AliasAccountSet', 'AliasAccountUnset', 'PersonalIdAccountSet', 'PersonalIdAccountUnset', 'CollectionCreated', 'ForcePersonhoodRecognized', 'AliasCleanedUp']; MobRule: ['CaseCreated', 'Callback', 'CallbackError', 'CaseClosed', 'Voted', 'VoteCleaned', 'CaseRemoved', 'CaseIntervened', 'VotesClaimed', 'RewardPayout', 'PayoutRoundStarted', 'PayoutRoundsScheduled', 'PayoutScheduleRemoved', 'CreditClaimed', 'PointsCleaned', 'CaseTouched', 'VotingPenaltyCleared']; ProofOfInk: ['CandidateApplied', 'JudgementRequested', 'JudgementProvided', 'RetryGranted', 'PersonRegistered', 'CandidateReferred', 'Rerolled', 'DesignCommitted', 'FullyAllocated', 'TimedOut', 'FlakedOut', 'TicketReferred', 'TicketCancelled', 'TicketApplied', 'FamilyAdded', 'AllInvitesRemoved', 'SomeInvitesRemoved', 'InvitedCandidateApplied', 'ReferralVoucherRegistered', 'InvitesGranted', 'InviteTicketSet', 'InviteTicketCancelled', 'ConfigurationSet']; - Game: ['NewGame', 'GameEnded', 'SignedUp', 'ReportSubmitted', 'Offboarded', 'KickedOut', 'InvitesGranted', 'InviteTicketSet', 'InviteTicketCancelled', 'GamesScheduled', 'ScheduledGameRemoved', 'StmtUsageRemoved', 'AllInvitesRemoved', 'SomeInvitesRemoved']; + Game: ['NewGame', 'GameEnded', 'SignedUp', 'ReportSubmitted', 'Offboarded', 'KickedOut', 'InvitesGranted', 'InviteTicketSet', 'InviteTicketCancelled', 'GamesScheduled', 'ScheduledGameRemoved', 'StmtUsageRemoved', 'AllInvitesRemoved', 'SomeInvitesRemoved', 'ScratchRewardAvailable', 'ScratchRewardClaimed', 'GamePrizePoolOpened', 'GamePrizePoolOpenFailed']; Score: ['CreditClaimed', 'PersonhoodRecognized', 'PayoutRoundsScheduled', 'PayoutScheduleRemoved', 'RoundTransitioned', 'PayoutRoundOperated', 'CashedOut']; DummyDim: ['IdsReserved', 'IdRenewed', 'IdUnreserved', 'PeopleRegistered', 'PeopleSuspended', 'PersonhoodResumed', 'SuspensionsStarted', 'SuspensionsEnded']; - PeopleLite: ['AllAttestationAllowanceCleared', 'AttestationAllowanceIncreased', 'PersonAttested', 'ConsumerRegistered']; - Resources: ['PersonRegistered', 'LitePersonRegistered', 'PersonAuthorizationTouched', 'ExpiredUsernameReservationRemoved', 'IdentifierKeyUpdated', 'UsernameReservationDurationSet', 'StmtStoreSlotUpdated', 'PersonDemoted']; + PeopleLite: ['AllAttestationAllowanceCleared', 'AttestationAllowanceIncreased', 'PersonAttested', 'ConsumerRegistered', 'AliasAccountSet', 'AliasAccountUnset']; + Resources: ['PersonRegistered', 'LitePersonRegistered', 'FriendRequestStmtUsageSet', 'FriendRequestStmtUsageRemoved', 'PersonAuthorizationTouched', 'ExpiredUsernameReservationRemoved', 'IdentifierKeyUpdated', 'UsernameReservationDurationSet', 'StmtStoreAllowanceSet', 'StmtStoreAllowancesCleared', 'PersonDemoted', 'LongTermStorageClaimed', 'LongTermStorageAllocationFailed', 'LongTermStorageAliasesCleared']; ChunksManager: ['ChunkPageHashesInitialized', 'ChunksAdded']; - Members: ['MemberAdded', 'MemberRemoved', 'CollectionMarkedForDeletion', 'CollectionDeleted', 'RingBuilt', 'MembersOnboarded', 'RingsMerged', 'OnboardingSizeSet']; - Coinage: ['CoinSplit', 'CoinTransferred', 'RecyclerLoadedWithCoin', 'RecyclerLoadedWithExternalAsset', 'RecyclerUnloadedIntoCoin', 'RecyclerUnloadedIntoExternalAsset', 'PaidUnloadTokenRegisteredWithCoin', 'PaidUnloadTokenRegisteredWithNative', 'PaidUnloadTokenRegisteredWithStable', 'PeopleFreeUnloadTokenConsumed', 'LitePeopleFreeUnloadTokenConsumed', 'RecyclersUnloadedIntoCoin', 'RecyclersUnloadedIntoExternalAsset', 'RecyclersUnloadedIntoExternalAssetNonAnonymous', 'RecyclerUnloadedIntoCoins', 'CoinOffboardedIntoExternalAsset', 'RecyclerCleaned', 'ConsumedFreeTokensCleaned', 'PaidUnloadTokenRingCleaned', 'RecyclerDustCleaned', 'PaidUnloadTokenDustCleaned', 'ExpiredPaidUnloadTokenCollectionDeleted']; - StorageInitialization: ['AssetCreated', 'XcmFundsTransferSent', 'XcmFundsTransferTimedOut', 'FundsVerified', 'PotsFunded', 'MobRulePayoutsScheduled', 'ScorePayoutsScheduled', 'OnPollInitializationCompleted', 'MigrationPeopleRecognized', 'MigrationOnboardingSizeSet', 'MigrationProofOfInkInitialized', 'MigrationGamesScheduled', 'MigrationInvitesGranted', 'MigrationReimbursementValuesSet', 'MigrationAttestationAllowancesSet', 'MigrationCompleted']; + Members: ['MemberAdded', 'MemberRemoved', 'CollectionMarkedForDeletion', 'CollectionDeleted', 'RingBuilt', 'MembersOnboarded', 'RingsMerged', 'OnboardingSizeSet', 'MemberSelfIncluded', 'OldRootCleanedUp']; + Coinage: ['CoinSplit', 'CoinTransferred', 'RecyclerLoadedWithCoin', 'RecyclerLoadedWithExternalAsset', 'RecyclerUnloadedIntoCoin', 'RecyclerUnloadedIntoExternalAsset', 'RecyclerUnloadedIntoExternalAssetAndVouchers', 'PaidUnloadTokenRegisteredWithCoin', 'PaidUnloadTokenRegisteredWithNative', 'PaidUnloadTokenRegisteredWithStable', 'PeopleFreeUnloadTokenConsumed', 'LitePeopleFreeUnloadTokenConsumed', 'RecyclersUnloadedIntoCoin', 'RecyclersUnloadedIntoExternalAsset', 'RecyclersUnloadedIntoExternalAssetNonAnonymous', 'RecyclerUnloadedIntoCoins', 'CoinOffboardedIntoExternalAsset', 'RecyclerCleaned', 'ConsumedFreeTokensCleaned', 'PaidUnloadTokenRingCleaned', 'RecyclerDustCleaned', 'PaidUnloadTokenDustCleaned', 'ExpiredPaidUnloadTokenCollectionDeleted']; + MembersNotifier: ['Subscribed', 'Unsubscribed', 'UpdatesSent', 'UpdateSendFailed', 'ReplayRequested', 'BatchAbandoned']; + StorageInitialization: ['AssetCreated', 'XcmFundsTransferSent', 'XcmFundsTransferTimedOut', 'FundsVerified', 'PotsFunded', 'MobRulePayoutsScheduled', 'ScorePayoutsScheduled', 'AirdropPoolOpened', 'AirdropSchedulingEnabledChanged', 'OnPollInitializationCompleted', 'MigrationPeopleRecognized', 'MigrationOnboardingSizeSet', 'MigrationProofOfInkInitialized', 'MigrationGamesScheduled', 'MigrationInvitesGranted', 'MigrationReimbursementValuesSet', 'MigrationAttestationAllowancesSet', 'MigrationCompleted']; StorageInitializationLite: ['InitializationCompleted']; - Airdrop: ['ParticipantRegistered', 'EventStarted', 'EventSkipped', 'EventScheduled', 'ScheduledEventRemoved', 'FailedTransferPrizeClaimed', 'WaitingForEntropyToBuild', 'DrawingWinners', 'Distributing', 'PrizeDistributed', 'PrizeDistributionFailed', 'ClearingStorage', 'EventCompleted']; + Airdrop: ['PrizePoolOpened', 'PrizeClaimed', 'AllPrizesClaimed', 'PrizePoolExpired', 'PrizePoolClosed', 'PrizeTransferFailed']; MultiBlockMigrations: ['UpgradeStarted', 'UpgradeCompleted', 'UpgradeFailed', 'MigrationSkipped', 'MigrationAdvanced', 'MigrationCompleted', 'MigrationFailed', 'HistoricCleared']; }; errors: { @@ -9555,18 +10610,19 @@ type AllInteractions = { Sudo: ['RequireSudo']; Proxy: ['TooMany', 'NotFound', 'NotProxy', 'Unproxyable', 'Duplicate', 'NoPermission', 'Unannounced', 'NoSelfProxy']; Identity: ['TooManySubAccounts', 'NoAlias', 'NotFound', 'NotNamed', 'EmptyIndex', 'FeeChanged', 'NoIdentity', 'StickyJudgement', 'JudgementGiven', 'InvalidJudgement', 'InvalidIndex', 'InvalidTarget', 'TooManyRegistrars', 'AlreadyClaimed', 'AlreadyReported', 'NotSub', 'NotOwned', 'JudgementForDifferentIdentity', 'JudgementPaymentFailed', 'InvalidSuffix', 'NotUsernameAuthority', 'NoAllocation', 'InvalidSignature', 'RequiresSignature', 'InvalidUsername', 'UsernameTaken', 'NoUsername', 'NotSystemProvidedUsername', 'NotExpired', 'TooEarly', 'NotUnbinding', 'AlreadyUnbinding', 'InsufficientPrivileges', 'BadContext', 'UnexpectedJudgement', 'NotSupported', 'Banned', 'AlreadyRegistered', 'JudgementListFull', 'LastUsernameReportTooRecent', 'UsernameJudgementOngoing']; - People: ['NotPerson', 'NoKey', 'InvalidContext', 'InvalidAccount', 'AccountInUse', 'InvalidProof', 'InvalidSignature', 'NoMembers', 'Incomplete', 'StillFresh', 'TooManyMembers', 'KeyAlreadyInUse', 'KeyNotFound', 'CouldNotPush', 'SameKey', 'PersonalIdNotReserved', 'PersonalIdReservationCannotRenew', 'PersonalIdNotReservedOrNotRecognized', 'InvalidRing', 'SuspensionsPending', 'RingAboveMergeThreshold', 'InvalidSuspensions', 'NoMutationSession', 'CouldNotStartMutationSession', 'SuspensionSessionInProgress', 'TimeOutOfRange', 'AliasAccountAlreadySet', 'NotSuspended', 'Suspended', 'InvalidKeyMigration', 'KeyAlreadySuspended', 'InvalidOnboardingSize', 'InvalidMemberKey', 'PeopleCollectionAlreadyExists']; + People: ['NotPerson', 'NoKey', 'InvalidContext', 'InvalidAccount', 'AccountInUse', 'InvalidProof', 'InvalidSignature', 'NoMembers', 'Incomplete', 'StillFresh', 'TooManyMembers', 'KeyAlreadyInUse', 'KeyNotFound', 'CouldNotPush', 'SameKey', 'PersonalIdNotReserved', 'PersonalIdReservationCannotRenew', 'PersonalIdNotReservedOrNotRecognized', 'InvalidRing', 'SuspensionsPending', 'RingAboveMergeThreshold', 'InvalidSuspensions', 'NoMutationSession', 'CouldNotStartMutationSession', 'SuspensionSessionInProgress', 'AliasNotStale', 'TimeOutOfRange', 'AliasAccountAlreadySet', 'NotSuspended', 'Suspended', 'InvalidKeyMigration', 'KeyAlreadySuspended', 'InvalidOnboardingSize', 'InvalidMemberKey', 'PeopleCollectionAlreadyExists', 'AliasMismatch', 'NoStaleAliases']; MobRule: ['NoSuchCase', 'NoSuchVote', 'NotOpen', 'NotRipe', 'NotDone', 'CodecError', 'DispatchError', 'Recent', 'NoCredit', 'NoReward', 'NoPoints', 'TooManyClaims', 'NoPayout', 'ArithmeticOverflow', 'TooManySchedules', 'NoSchedule', 'NoPenalty', 'Early', 'UnderPenalty', 'CaseExpirationDisabled']; ProofOfInk: ['InProgress', 'NoReferral', 'BadContext', 'UnexpectedJudgement', 'NoArgs', 'NotApplied', 'NotSelected', 'NotProven', 'AlreadyStarted', 'OutOfRange', 'AlreadyTaken', 'NoMoreReferrals', 'TooEarly', 'DesignInvalid', 'DesignTaken', 'BadParent', 'BadFamily', 'WrongFamily', 'IndexTooBig', 'Busy', 'Banned', 'Improbable', 'IdReserved', 'IdUsed', 'InvalidTicket', 'NoTicket', 'NotAuthorized', 'NotPerson', 'ReferredCandidate', 'NotReferredCandidate', 'NoRewardToRegister', 'RewardToRegister', 'NoInviter', 'InvalidSignature', 'NoInvites', 'AlreadyInvited', 'NoReferrer', 'NotPoiPerson', 'InvalidProofOfOwnership', 'InvalidReimbursementValues']; - Game: ['GameOngoing', 'NoRegistration', 'OutdatedGameSetup', 'InvalidGameSetup', 'InvalidReport', 'NoGame', 'NoReporting', 'NotRegistered', 'AlreadyRegistered', 'ReportAlreadySent', 'Early', 'NotKickablePlayer', 'NoArchivedPlayer', 'NoTicket', 'NoInvites', 'AlreadyInvited', 'NotAccountPlayer', 'UseInviteButAlreadyPlaying', 'TooManyGameSchedules', 'NoSuchGameScheduled', 'InvalidStatementAccountSignature', 'StatementAccountAlreadyInUse', 'InternalErrorInvalidState', 'InvalidGameState', 'NoPlayer', 'CannotOffboardWhileRegisteredForGame', 'InvalidState']; + Game: ['GameOngoing', 'NoRegistration', 'OutdatedGameSetup', 'InvalidGameSetup', 'InvalidReport', 'NoGame', 'NoReporting', 'NotRegistered', 'AlreadyRegistered', 'ReportAlreadySent', 'Early', 'NotKickablePlayer', 'NoArchivedPlayer', 'NoTicket', 'NoInvites', 'AlreadyInvited', 'NotAccountPlayer', 'UseInviteButAlreadyPlaying', 'TooManyGameSchedules', 'NoSuchGameScheduled', 'InvalidStatementAccountSignature', 'StatementAccountAlreadyInUse', 'InternalErrorInvalidState', 'InvalidGameState', 'NoPlayer', 'CannotOffboardWhileRegisteredForGame', 'InvalidState', 'NoScratchReward', 'NotEligible', 'DidNotWin', 'AlreadyClaimed', 'ScratchPotEmpty', 'PoolNotForGame', 'NotParticipant']; Score: ['NotPerson', 'HasNotReachedPersonhood', 'NoReward', 'NoScore', 'NoSchedule', 'TooManySchedules', 'Recognized', 'CashOutCooldown', 'RoundOnGoingOrNoSchedule', 'NoRound', 'BadOriginNotPersonNotSigned', 'BadOriginNotPersonNotSignedNotAccountParticipant', 'BadOriginNotSignedNotAccountParticipant', 'AlreadyParticipating', 'KeyMustBeProvided', 'KeyMustNotBeProvided', 'HasReachedPersonhood', 'InvalidProofOfOwnership', 'WindowTooLarge', 'AllowedMissesTooLarge', 'ScheduleNotSorted']; DummyDim: ['NotPerson', 'NotSuspended', 'NotReserved', 'TooManyPeople']; - PeopleLite: ['NoAttestationAllowance', 'InvalidAttestationSignature', 'InvalidProofOfOwnership', 'AlreadyRegistered']; - Resources: ['InvalidUsername', 'UsernameTaken', 'AlreadyRegistered', 'InvalidProofOfOwnership', 'NotRegistered', 'NotFullPerson', 'TouchNotReady', 'NoReservation', 'NotReservationHolder', 'UsernameReservationTaken', 'ReservationFresh', 'NoLinkedIdentity', 'AlreadyLinked', 'InvalidSlot', 'AccountAlreadyHasAllowance', 'PersonAuthNotExpired', 'AlreadyDemoted', 'QueueFull', 'NotInQueue', 'AlreadyHasReservation']; + PeopleLite: ['NoAttestationAllowance', 'InvalidAttestationSignature', 'InvalidProofOfOwnership', 'AlreadyRegistered', 'KeyAlreadyInUse', 'AccountInUse', 'AliasAccountAlreadySet', 'AliasAccountNotSet', 'CallBlockOutOfRange', 'InvalidAliasContext', 'LitePeopleCollectionNotCreated']; + Resources: ['InvalidUsername', 'UsernameTaken', 'AlreadyRegistered', 'InvalidProofOfOwnership', 'NotRegistered', 'NotFullPerson', 'TouchNotReady', 'NoReservation', 'NotReservationHolder', 'UsernameReservationTaken', 'ReservationFresh', 'NoLinkedIdentity', 'AlreadyLinked', 'PersonAuthNotExpired', 'AlreadyDemoted', 'QueueFull', 'NotInQueue', 'AlreadyHasReservation', 'InvalidFriendRequestSequence', 'InvalidFriendRequestPeriod', 'FriendRequestRegistrationNotExpired', 'FriendRequestRegistrationAlreadyExists', 'StmtStoreReplacementTooEarly', 'LongTermStorageCleanupLimitExceeded']; ChunksManager: ['ChunkNotFound', 'InvalidChunks', 'InvalidChunkRange']; - Members: ['NotMember', 'NoRoot', 'InvalidProof', 'Incomplete', 'StillFresh', 'TooManyMembers', 'KeyAlreadyInUse', 'KeyNotFound', 'CouldNotPush', 'InvalidRing', 'SuspensionsPending', 'RingAboveMergeThreshold', 'InvalidSuspensions', 'NoRemovalSession', 'CouldNotStartRemovalSession', 'RemovalSessionInProgress', 'KeyAlreadySuspended', 'InvalidOnboardingSize', 'InvalidMemberKey', 'CollectionNotFound', 'CollectionAlreadyExists', 'TooManyCollections', 'InvalidRingSizeForFlexible', 'InvalidRingExponent', 'PrematureOnboarding', 'CollectionMarkedForDeletion', 'NotCollectionOwner']; - Coinage: ['MemberKeyAlreadyUsed', 'InvalidMemberKey', 'InternalError', 'RecyclerAlreadyUnloaded', 'InvalidConsolidation', 'ConsolidationTooBig', 'CoinValueTooBig', 'CoinValueTooSmall', 'CoinValueIsLessThanFee', 'CoinValueOutOfBound', 'InvalidAliasProof', 'NoUnloadingRecycler', 'ProofAndAliasMismatch', 'NothingToBuild', 'TooManyRings', 'AddressAlreadyHasCoin', 'InvalidProofOfOwnership', 'EmptyInputs', 'RecyclerMismatch', 'InsufficientUnloadForFee', 'AliasNotPremarked', 'InvalidRecyclerRevision', 'InvalidSplit', 'FreshCoinRequired', 'CannotConvertNativeToAsset']; - Airdrop: ['NoActiveEvent', 'NotAPerson', 'AliasAlreadyRegistered', 'InvalidEventRegistrationTime', 'ParticipantIdOverflow', 'NoPrizeToClaimForEvent', 'NoEventFound', 'ScheduleFull', 'PrizeMustBeMoreOrEqualToMinBalance']; + Members: ['NotMember', 'NoRoot', 'InvalidProof', 'Incomplete', 'TooManyMembers', 'KeyAlreadyInUse', 'KeyNotFound', 'CouldNotPush', 'InvalidRing', 'SuspensionsPending', 'RingAboveMergeThreshold', 'InvalidSuspensions', 'NoRemovalSession', 'CouldNotStartRemovalSession', 'RemovalSessionInProgress', 'KeyAlreadySuspended', 'InvalidOnboardingSize', 'InvalidMemberKey', 'CollectionNotFound', 'CollectionAlreadyExists', 'TooManyCollections', 'InvalidRingSizeForFlexible', 'InvalidRingExponent', 'PrematureOnboarding', 'CollectionMarkedForDeletion', 'NotCollectionOwner', 'NotOnboarding', 'NothingToBuild']; + Coinage: ['MemberKeyAlreadyUsed', 'InvalidMemberKey', 'InternalError', 'RecyclerAlreadyUnloaded', 'InvalidConsolidation', 'ConsolidationTooBig', 'CoinValueTooBig', 'CoinValueTooSmall', 'CoinValueIsLessThanFee', 'CoinValueOutOfBound', 'LossyCoinValueConversion', 'InvalidAliasProof', 'NoUnloadingRecycler', 'ProofAndAliasMismatch', 'NothingToBuild', 'TooManyRings', 'AddressAlreadyHasCoin', 'InvalidProofOfOwnership', 'EmptyInputs', 'RecyclerMismatch', 'InsufficientUnloadForFee', 'AliasNotPremarked', 'InvalidRecyclerRevision', 'InvalidSplit', 'FreshCoinRequired', 'CannotConvertNativeToAsset', 'MaxFeeNotAllowedForPrepaid', 'MaxFeeExceedsInput', 'InvalidMaxFee', 'CannotCreateRecyclerCollection']; + MembersNotifier: ['SubscriberNotFound', 'AlreadySubscribed', 'TooManySubscribers', 'InvalidCollectionsList', 'TooManyUpdates', 'XcmSendFailed', 'NotSubscribedToCollection', 'InvalidRingIndex', 'ExceedsChannelCapacity', 'NoBatchActive', 'NoPendingInit', 'ReplayCooldownActive', 'EmptyRingIndices']; + Airdrop: ['PrizeMustBeMoreOrEqualToMinBalance', 'ValidityTooLong', 'ValidityTooShort', 'NoPrizes', 'InsufficientFunds', 'TooManyConcurrentPrizePools', 'NoSuchPrizePool', 'PrizePoolExpired', 'PrizePoolExhausted', 'AlreadyClaimed', 'PoolValueOverflow', 'WrongTarget', 'DidNotWin', 'InvalidProof', 'AliasMismatch']; MultiBlockMigrations: ['Ongoing']; }; constants: { @@ -9586,22 +10642,26 @@ type AllInteractions = { Multisig: ['DepositBase', 'DepositFactor', 'MaxSignatories']; Proxy: ['ProxyDepositBase', 'ProxyDepositFactor', 'MaxProxies', 'MaxPending', 'AnnouncementDepositBase', 'AnnouncementDepositFactor']; Identity: ['BasicDeposit', 'ByteDeposit', 'UsernameDeposit', 'SubAccountDeposit', 'UsernameReportDeposit', 'MaxSubAccounts', 'UsernameReportTimeout', 'MaxRegistrars', 'MaxJudgements', 'PendingUsernameExpiration', 'UsernameGracePeriod', 'MaxSuffixLength', 'MaxUsernameLength', 'MinUsernameLength', 'CredentialRemovalPenalty', 'identity_context']; - People: ['RingExponent', 'OnboardingQueuePageSize', 'account_setup_time_tolerance']; + People: ['RingExponent', 'OnboardingQueuePageSize', 'StaleAliasCleanupInterval', 'account_setup_time_tolerance']; MobRule: ['CurrencyLocationInfo', 'MaxVoteClaimDuration', 'MinCaseDuration', 'MaxVotingDuration', 'MinTurnoutNominal', 'MinTurnoutPercentage', 'VotingPenaltyDuration', 'MaxVotesClaimable', 'OffchainWorkInterval', 'CleanVotesBatchSize', 'VotesOpenForClaimsDuration', 'MinimumVoterThreshold', 'mob_rule_pot_id', 'mob_rule_context']; ProofOfInk: ['MaxActiveReferrals', 'PotId', 'proof_of_ink_pot_id']; - Game: ['MaxRounds', 'MaxGroupSize', 'MinGroupSize', 'NonPlayingKickoutTime', 'PhaseDurations', 'MaxGameSchedules', 'MaxAttendanceHistoryDepth', 'proof_of_ownership_msg_base']; + Game: ['MaxRounds', 'MaxGroupSize', 'MinGroupSize', 'NonPlayingKickoutTime', 'PhaseDurations', 'MaxGameSchedules', 'MaxAttendanceHistoryDepth', 'RewardPerWinner', 'proof_of_ownership_msg_base']; Score: ['CurrencyLocationInfo', 'OffchainWorkInterval', 'score_pot_id', 'score_context', 'ubi_points']; - Resources: ['MaxUsernameLength', 'MinUsernameLength', 'PersonAuthDuration', 'MinPersonAuthUpdateInterval', 'MaxReservationQueueLength', 'AccountsApiSlotCount', 'AccountsApiRefundCooldown', 'AccountsApiAllowance']; + PeopleLite: ['LiteRingExponent', 'LiteOnboardingSize', 'account_setup_block_tolerance']; + Resources: ['MaxUsernameLength', 'MinUsernameLength', 'PersonAuthDuration', 'MinPersonAuthUpdateInterval', 'MaxReservationQueueLength', 'AccountsApiAllowance', 'StmtStoreSlotsPerPeriod', 'LiteStmtStoreSlotsPerPeriod', 'StmtStoreCleanupLimit', 'StmtStoreReplacementCooldown', 'FriendRequestAllowance', 'FriendRequestSlotsPerPeriod', 'LiteFriendRequestSlotsPerPeriod', 'FriendRequestPeriodDuration', 'FriendRequestGraceWindow', 'FriendRequestRetentionDuration', 'OffchainWorkerInterval', 'LongTermStoragePeriodDuration', 'LongTermStorageClaimsPerPeriod', 'LongTermStorageGraceWindow', 'LongTermStorageCleanupLimit']; ChunksManager: ['PageSize']; - Members: ['MaxCollections', 'OnboardingQueuePageSize', 'MaxFlexibleRingExponent', 'RingBuildingMemberLimit']; - Coinage: ['RecyclerRingExponent', 'PaidUnloadTokenRingExponent', 'UnderlyingAssetId', 'UnderlyingAssetUnit', 'MinimumExponent', 'MaximumExponent', 'MaxSplitOutputs', 'MaxConsolidation', 'UnloadTokenTimePeriodPeopleLitePeople', 'UnloadTokenAllowancePerTimePeriodForPeople', 'UnloadTokenAllowancePerTimePeriodForLitePeople', 'MaxFreeUnloadTokensPerTimePeriod', 'OffchainWorkerInterval', 'CoinFailureLockPeriod', 'pallet_account']; - Airdrop: ['airdrop_pot_id', 'airdrop_context_base']; + Members: ['MaxCollections', 'OnboardingQueuePageSize', 'MaxFlexibleRingExponent', 'RingBuildingMemberLimit', 'OldRootRetentionDuration', 'OffchainWorkerInterval']; + Coinage: ['RecyclerRingExponent', 'PaidUnloadTokenRingExponent', 'UnderlyingAssetId', 'UnderlyingAssetUnit', 'MinimumExponent', 'MaximumExponent', 'MinimumExponentForOutputUnloadFee', 'MaxSplitOutputs', 'MaxConsolidation', 'MaxBatchUnpaidLoad', 'UnloadTokenTimePeriodPeopleLitePeople', 'UnloadTokenAllowancePerTimePeriodForPeople', 'UnloadTokenAllowancePerTimePeriodForLitePeople', 'MaxFreeUnloadTokensPerTimePeriod', 'OffchainWorkerInterval', 'CoinFailureLockPeriod', 'pallet_account']; + MembersNotifier: ['MaxSubscribers', 'MaxUpdatesPerBatch', 'MaxCollectionsPerSubscriber', 'MaxCollections', 'UpdateTriggerBlocks', 'UpdateTriggerThreshold', 'RequestReplayRemoteWeight', 'OffchainWorkerInterval', 'StuckBatchTimeout', 'ReplayCooldownSeconds']; + Airdrop: ['MinValiditySeconds', 'MaxValiditySeconds', 'PrizePoolClearLimit', 'airdrop_pot_id']; MultiBlockMigrations: ['CursorMaxLen', 'IdentifierMaxLen']; }; viewFns: { Assets: ['asset_details', 'balance_of', 'get_metadata', 'get_reserves_data']; Proxy: ['check_permissions', 'is_superset']; - Coinage: ['get_free_unload_token_info', 'get_recycler_ring_status', 'get_recycler_ring_revision', 'get_paid_token_ring_status', 'get_paid_token_ring_revision', 'get_paid_unload_token_fee_in_asset', 'get_paid_unload_token_fee_in_native', 'get_coin_by_owner', 'get_coin_lock_until', 'get_recycler_member_info', 'is_paid_token_member', 'get_recycler_members', 'get_paid_token_ring_members', 'is_recycler_alias_unloaded', 'is_paid_token_alias_consumed', 'is_free_token_alias_consumed']; + Resources: ['current_stmt_store_period', 'stmt_store_slot_context_for', 'friend_request_context_for']; + Coinage: ['get_free_unload_token_info', 'get_recycler_ring_status', 'get_recycler_ring_revision', 'get_paid_token_ring_status', 'get_paid_token_ring_revision', 'get_paid_unload_token_fee_in_asset', 'get_paid_unload_token_fee_in_native', 'get_coin_by_owner', 'get_coin_lock_until', 'get_recycler_member_info', 'is_paid_token_member', 'get_recycler_members', 'get_paid_token_ring_members', 'is_recycler_alias_unloaded', 'is_paid_token_alias_consumed', 'is_free_token_alias_consumed', 'weight_for_unload_recycler_paying_using_output']; + MultiBlockMigrations: ['ongoing_status', 'progress', 'affected_prefixes', 'status']; }; apis: { AuraApi: ['slot_duration', 'authorities']; @@ -9618,13 +10678,13 @@ type AllInteractions = { TransactionPaymentApi: ['query_info', 'query_fee_details', 'query_weight_to_fee', 'query_length_to_fee']; TransactionPaymentCallApi: ['query_call_info', 'query_call_fee_details', 'query_weight_to_fee', 'query_length_to_fee']; XcmPaymentApi: ['query_acceptable_payment_assets', 'query_xcm_weight', 'query_weight_to_asset_fee', 'query_delivery_fees']; + DryRunApi: ['dry_run_call', 'dry_run_xcm']; LocationToAccountApi: ['convert_location']; MobRuleApi: ['voted_on']; ProofOfInkApi: ['candidacy_deposit']; - PalletGameApi: ['play_deposit', 'validate_statement_with_reason']; + PalletGameApi: ['play_deposit']; CollectCollationInfo: ['collect_collation_info']; GenesisBuilder: ['build_state', 'get_preset', 'preset_names']; - ValidateStatement: ['validate_statement']; }; }; export type People_liteWhitelistEntry = PalletKey | `query.${NestedKey}` | `tx.${NestedKey}` | `event.${NestedKey}` | `error.${NestedKey}` | `const.${NestedKey}` | `view.${NestedKey}` | `api.${NestedKey}`; diff --git a/packages/host-papp/.papi/descriptors/dist/people_lite_metadata-Cj1JLFI2.js b/packages/host-papp/.papi/descriptors/dist/people_lite_metadata-Cj1JLFI2.js new file mode 100644 index 00000000..253275a7 --- /dev/null +++ b/packages/host-papp/.papi/descriptors/dist/people_lite_metadata-Cj1JLFI2.js @@ -0,0 +1,3 @@ +const binMeta = "bWV0YRBNDQAMKHNwX3J1bnRpbWUwbXVsdGlhZGRyZXNzME11bHRpQWRkcmVzcwgkQWNjb3VudElkAQQwQWNjb3VudEluZGV4ARABFAhJZAQABAEkQWNjb3VudElkAAAAFEluZGV4BAAUATBBY2NvdW50SW5kZXgAAQAMUmF3BAAYARxWZWM8dTg+AAIAJEFkZHJlc3MzMgQACAEgW3U4OyAzMl0AAwAkQWRkcmVzczIwBAAcASBbdTg7IDIwXQAEAAAEDBxzcF9jb3JlGGNyeXB0byxBY2NvdW50SWQzMgAABAAIASBbdTg7IDMyXQAACAAAAyAAAAAMAAwAAAUDABAAAAQAABQAAAYQABgAAAIMABwAAAMUAAAADAAgCGRuZXh0X3Blb3BsZV9wYXNlb19ydW50aW1lLFJ1bnRpbWVDYWxsAAGIGFN5c3RlbQQAJAGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAPFBhcmFjaGFpblN5c3RlbQQAQAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhY2hhaW5TeXN0ZW0sIFJ1bnRpbWU+AAEAJFRpbWVzdGFtcAQAsAG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUaW1lc3RhbXAsIFJ1bnRpbWU+AAIANFBhcmFjaGFpbkluZm8EALgByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYWNoYWluSW5mbywgUnVudGltZT4AAwAgQmFsYW5jZXMEALwBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAoARE9yaWdpblJlc3RyaWN0aW9uBADUAdkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE9yaWdpblJlc3RyaWN0aW9uLCBSdW50aW1lPgANABhBc3NldHMEANwBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRzLCBSdW50aW1lPgAOACRBc3NldFJhdGUEACkBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AEABEQ29sbGF0b3JTZWxlY3Rpb24EADEBAdkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbGxhdG9yU2VsZWN0aW9uLCBSdW50aW1lPgAVABxTZXNzaW9uBAA1AQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTZXNzaW9uLCBSdW50aW1lPgAWACRYY21wUXVldWUEAEEBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbXBRdWV1ZSwgUnVudGltZT4AHgAsUG9sa2Fkb3RYY20EAEUBAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBvbGthZG90WGNtLCBSdW50aW1lPgAfAChDdW11bHVzWGNtBAAZAwG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDdW11bHVzWGNtLCBSdW50aW1lPgAgADBNZXNzYWdlUXVldWUEAB0DAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1lc3NhZ2VRdWV1ZSwgUnVudGltZT4AIgAcVXRpbGl0eQQAJQMBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AKAAgTXVsdGlzaWcEAIkDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE11bHRpc2lnLCBSdW50aW1lPgApABBTdWRvBACVAwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgAqABRQcm94eQQAmQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+ACwAIElkZW50aXR5BAClAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eSwgUnVudGltZT4AMgAYUGVvcGxlBABRBAGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQZW9wbGUsIFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAGEEAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1vYlJ1bGUsIFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEAGkEAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb29mT2ZJbmssIFJ1bnRpbWU+ADUAEEdhbWUEAIkEAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdhbWUsIFJ1bnRpbWU+ADcAFFNjb3JlBACtBAGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTY29yZSwgUnVudGltZT4AOAAgRHVtbXlEaW0EAMUEAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPER1bW15RGltLCBSdW50aW1lPgA7AChQZW9wbGVMaXRlBADdBAG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQZW9wbGVMaXRlLCBSdW50aW1lPgA+ACRSZXNvdXJjZXMEAO0EAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlc291cmNlcywgUnVudGltZT4APwA0Q2h1bmtzTWFuYWdlcgQA+QQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2h1bmtzTWFuYWdlciwgUnVudGltZT4AQAAcTWVtYmVycwQAAQUBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVtYmVycywgUnVudGltZT4AQwAcQ29pbmFnZQQABQUBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29pbmFnZSwgUnVudGltZT4ARAA8TWVtYmVyc05vdGlmaWVyBABFBQHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNZW1iZXJzTm90aWZpZXIsIFJ1bnRpbWU+AEUAVFN0b3JhZ2VJbml0aWFsaXphdGlvbgQAXQUB6QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3RvcmFnZUluaXRpYWxpemF0aW9uLCBSdW50aW1lPgA8ABxBaXJkcm9wBABhBQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxBaXJkcm9wLCBSdW50aW1lPgA9AFBNdWx0aUJsb2NrTWlncmF0aW9ucwQAbQUB5QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TXVsdGlCbG9ja01pZ3JhdGlvbnMsIFJ1bnRpbWU+AGIAACQMMGZyYW1lX3N5c3RlbRhwYWxsZXQQQ2FsbAQEVAABLBhyZW1hcmsEARhyZW1hcmsYARxWZWM8dTg+AAAMaE1ha2Ugc29tZSBvbi1jaGFpbiByZW1hcmsuAIhDYW4gYmUgZXhlY3V0ZWQgYnkgZXZlcnkgYG9yaWdpbmAuOHNldF9oZWFwX3BhZ2VzBAEUcGFnZXMoAQx1NjQAAQT4U2V0IHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIFdlYkFzc2VtYmx5IGVudmlyb25tZW50J3MgaGVhcC4gc2V0X2NvZGUEARBjb2RlGAEcVmVjPHU4PgACBGRTZXQgdGhlIG5ldyBydW50aW1lIGNvZGUuXHNldF9jb2RlX3dpdGhvdXRfY2hlY2tzBAEQY29kZRgBHFZlYzx1OD4AAxAZAVNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZSB3aXRob3V0IGRvaW5nIGFueSBjaGVja3Mgb2YgdGhlIGdpdmVuIGBjb2RlYC4AUQFOb3RlIHRoYXQgcnVudGltZSB1cGdyYWRlcyB3aWxsIG5vdCBydW4gaWYgdGhpcyBpcyBjYWxsZWQgd2l0aCBhIG5vdC1pbmNyZWFzaW5nIHNwZWMgdmVyc2lvbiEsc2V0X3N0b3JhZ2UEARRpdGVtcywBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5czQBIFZlYzxLZXk+AAUEdEtpbGwgc29tZSBpdGVtcyBmcm9tIHN0b3JhZ2UuLGtpbGxfcHJlZml4CAEYcHJlZml4GAEMS2V5AAEcc3Via2V5czgBDHUzMgAGEBEBS2lsbCBhbGwgc3RvcmFnZSBpdGVtcyB3aXRoIGEga2V5IHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeC4AOQEqKk5PVEU6KiogV2UgcmVseSBvbiB0aGUgUm9vdCBvcmlnaW4gdG8gcHJvdmlkZSB1cyB0aGUgbnVtYmVyIG9mIHN1YmtleXMgdW5kZXI9AXRoZSBwcmVmaXggd2UgYXJlIHJlbW92aW5nIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRlIHRoZSB3ZWlnaHQgb2YgdGhpcyBmdW5jdGlvbi5EcmVtYXJrX3dpdGhfZXZlbnQEARhyZW1hcmsYARxWZWM8dTg+AAcEpE1ha2Ugc29tZSBvbi1jaGFpbiByZW1hcmsgYW5kIGVtaXQgZXZlbnQuRGF1dGhvcml6ZV91cGdyYWRlBAEkY29kZV9oYXNoPAEcVDo6SGFzaAAJEGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AfFRoaXMgY2FsbCByZXF1aXJlcyBSb290IG9yaWdpbi6AYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MEASRjb2RlX2hhc2g8ARxUOjpIYXNoAAogYQFBdXRob3JpemUgYW4gdXBncmFkZSB0byBhIGdpdmVuIGBjb2RlX2hhc2hgIGZvciB0aGUgcnVudGltZS4gVGhlIHJ1bnRpbWUgY2FuIGJlIHN1cHBsaWVkGGxhdGVyLgBdAVdBUk5JTkc6IFRoaXMgYXV0aG9yaXplcyBhbiB1cGdyYWRlIHRoYXQgd2lsbCB0YWtlIHBsYWNlIHdpdGhvdXQgYW55IHNhZmV0eSBjaGVja3MsIGZvclkBZXhhbXBsZSB0aGF0IHRoZSBzcGVjIG5hbWUgcmVtYWlucyB0aGUgc2FtZSBhbmQgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW5jcmVhc2VzLiBOb3TwcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB1c2UuIFVzZSBgYXV0aG9yaXplX3VwZ3JhZGVgIGluc3RlYWQuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4uYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQQBEGNvZGUYARxWZWM8dTg+AAskVQFQcm92aWRlIHRoZSBwcmVpbWFnZSAocnVudGltZSBiaW5hcnkpIGBjb2RlYCBmb3IgYW4gdXBncmFkZSB0aGF0IGhhcyBiZWVuIGF1dGhvcml6ZWQuAEkBSWYgdGhlIGF1dGhvcml6YXRpb24gcmVxdWlyZWQgYSB2ZXJzaW9uIGNoZWNrLCB0aGlzIGNhbGwgd2lsbCBlbnN1cmUgdGhlIHNwZWMgbmFtZehyZW1haW5zIHVuY2hhbmdlZCBhbmQgdGhhdCB0aGUgc3BlYyB2ZXJzaW9uIGhhcyBpbmNyZWFzZWQuAFkBRGVwZW5kaW5nIG9uIHRoZSBydW50aW1lJ3MgYE9uU2V0Q29kZWAgY29uZmlndXJhdGlvbiwgdGhpcyBmdW5jdGlvbiBtYXkgZGlyZWN0bHkgYXBwbHkRAXRoZSBuZXcgYGNvZGVgIGluIHRoZSBzYW1lIGJsb2NrIG9yIGF0dGVtcHQgdG8gc2NoZWR1bGUgdGhlIHVwZ3JhZGUuAGBBbGwgb3JpZ2lucyBhcmUgYWxsb3dlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKAAABQYALAAAAjAAMAAABAgYGAA0AAACGAA4AAAFBQA8CDxwcmltaXRpdmVfdHlwZXMQSDI1NgAABAAIASBbdTg7IDMyXQAAQAx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbRhwYWxsZXQQQ2FsbAQEVAABCExzZXRfdmFsaWRhdGlvbl9kYXRhCAEQZGF0YUQBaEJhc2ljUGFyYWNoYWluSW5oZXJlbnREYXRhAAFUaW5ib3VuZF9tZXNzYWdlc19kYXRhfAFMSW5ib3VuZE1lc3NhZ2VzRGF0YQAAJIBTZXQgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBkYXRhLgBBAVRoaXMgc2hvdWxkIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIHBlciBibG9jay4gSXQgd2lsbCBwYW5pYyBhdCB0aGUgZmluYWxpemF0aW9uiHBoYXNlIGlmIHRoZSBjYWxsIHdhcyBub3QgaW52b2tlZC4A0FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBJbmhlcmVudGAAIQFBcyBhIHNpZGUgZWZmZWN0LCB0aGlzIGZ1bmN0aW9uIHVwZ3JhZGVzIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gZnVuY3Rpb26EaWYgdGhlIGFwcHJvcHJpYXRlIHRpbWUgaGFzIGNvbWUuYHN1ZG9fc2VuZF91cHdhcmRfbWVzc2FnZQQBHG1lc3NhZ2UYATRVcHdhcmRNZXNzYWdlAAEABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkQMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IcGFyYWNoYWluX2luaGVyZW50aEJhc2ljUGFyYWNoYWluSW5oZXJlbnREYXRhAAAQATx2YWxpZGF0aW9uX2RhdGFIAVxQZXJzaXN0ZWRWYWxpZGF0aW9uRGF0YQABRHJlbGF5X2NoYWluX3N0YXRlUAFUc3BfdHJpZTo6U3RvcmFnZVByb29mAAFgcmVsYXlfcGFyZW50X2Rlc2NlbmRhbnRzWAFAVmVjPFJlbGF5SGVhZGVyPgABQGNvbGxhdG9yX3BlZXJfaWR0AVhPcHRpb248QXBwcm92ZWRQZWVySWQ+AABIDExwb2xrYWRvdF9wcmltaXRpdmVzCHY5XFBlcnNpc3RlZFZhbGlkYXRpb25EYXRhCARIATwETgE4ABABLHBhcmVudF9oZWFkTAEgSGVhZERhdGEAAUxyZWxheV9wYXJlbnRfbnVtYmVyOAEETgABZHJlbGF5X3BhcmVudF9zdG9yYWdlX3Jvb3Q8AQRIAAEwbWF4X3Bvdl9zaXplOAEMdTMyAABMDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzIEhlYWREYXRhAAAEABgBHFZlYzx1OD4AAFAMHHNwX3RyaWU0c3RvcmFnZV9wcm9vZjBTdG9yYWdlUHJvb2YAAAQBKHRyaWVfbm9kZXNUAURCVHJlZVNldDxWZWM8dTg+PgAAVAQgQlRyZWVTZXQEBFQBGAAEADQAAABYAAACXABcEChzcF9ydW50aW1lHGdlbmVyaWMYaGVhZGVyGEhlYWRlcggYTnVtYmVyATgQSGFzaAAAFAEscGFyZW50X2hhc2g8ATBIYXNoOjpPdXRwdXQAARhudW1iZXJgARhOdW1iZXIAAShzdGF0ZV9yb290PAEwSGFzaDo6T3V0cHV0AAE8ZXh0cmluc2ljc19yb290PAEwSGFzaDo6T3V0cHV0AAEYZGlnZXN0ZAEYRGlnZXN0AABgAAAGOABkEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0GERpZ2VzdAAABAEQbG9nc2gBPFZlYzxEaWdlc3RJdGVtPgAAaAAAAmwAbBAoc3BfcnVudGltZRxnZW5lcmljGGRpZ2VzdChEaWdlc3RJdGVtAAEUKFByZVJ1bnRpbWUIAHABRENvbnNlbnN1c0VuZ2luZUlkAAAYARxWZWM8dTg+AAYAJENvbnNlbnN1cwgAcAFEQ29uc2Vuc3VzRW5naW5lSWQAABgBHFZlYzx1OD4ABAAQU2VhbAgAcAFEQ29uc2Vuc3VzRW5naW5lSWQAABgBHFZlYzx1OD4ABQAUT3RoZXIEABgBHFZlYzx1OD4AAABkUnVudGltZUVudmlyb25tZW50VXBkYXRlZAAIAABwAAADBAAAAAwAdAQYT3B0aW9uBARUAXgBCBBOb25lAAAAEFNvbWUEAHgAAAEAAHgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AAB8DHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudExJbmJvdW5kTWVzc2FnZXNEYXRhAAAIAURkb3dud2FyZF9tZXNzYWdlc4ABfEFicmlkZ2VkSW5ib3VuZERvd253YXJkTWVzc2FnZXMAAUxob3Jpem9udGFsX21lc3NhZ2VzlAFsQWJyaWRnZWRJbmJvdW5kSHJtcE1lc3NhZ2VzAACADHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudIRBYnJpZGdlZEluYm91bmRNZXNzYWdlc0NvbGxlY3Rpb24EHE1lc3NhZ2UBhAAIATRmdWxsX21lc3NhZ2VziAEwVmVjPE1lc3NhZ2U+AAE8aGFzaGVkX21lc3NhZ2VzjAF8VmVjPE1lc3NhZ2U6OkNvbXByZXNzZWRNZXNzYWdlPgAAhAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyATgACAEcc2VudF9hdDgBLEJsb2NrTnVtYmVyAAEMbXNnGAE8RG93bndhcmRNZXNzYWdlAACIAAAChACMAAACkACQCJRjdW11bHVzX3ByaW1pdGl2ZXNfcGFyYWNoYWluX2luaGVyZW50NEhhc2hlZE1lc3NhZ2UAAAgBHHNlbnRfYXQ4AVRSZWxheUNoYWluQmxvY2tOdW1iZXIAASBtc2dfaGFzaDwBNHNwX2NvcmU6OkgyNTYAAJQMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IcGFyYWNoYWluX2luaGVyZW50hEFicmlkZ2VkSW5ib3VuZE1lc3NhZ2VzQ29sbGVjdGlvbgQcTWVzc2FnZQGYAAgBNGZ1bGxfbWVzc2FnZXOkATBWZWM8TWVzc2FnZT4AATxoYXNoZWRfbWVzc2FnZXOoAXxWZWM8TWVzc2FnZTo6Q29tcHJlc3NlZE1lc3NhZ2U+AACYAAAECJygAJwMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXMISWQAAAQAOAEMdTMyAACgCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgE4AAgBHHNlbnRfYXQ4ASxCbG9ja051bWJlcgABEGRhdGEYAUxhbGxvYzo6dmVjOjpWZWM8dTg+AACkAAACmACoAAACrACsAAAECJyQALAMQHBhbGxldF90aW1lc3RhbXAYcGFsbGV0EENhbGwEBFQAAQQMc2V0BAEMbm93tAEkVDo6TW9tZW50AABMVFNldCB0aGUgY3VycmVudCB0aW1lLgBVAVRoaXMgY2FsbCBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UgcGVyIGJsb2NrLiBJdCB3aWxsIHBhbmljIGF0IHRoZSBmaW5hbGl6YXRpb27UcGhhc2UsIGlmIHRoaXMgY2FsbCBoYXNuJ3QgYmVlbiBpbnZva2VkIGJ5IHRoYXQgdGltZS4AQQFUaGUgdGltZXN0YW1wIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSBieSB0aGUgYW1vdW50IHNwZWNpZmllZCBieWhbYENvbmZpZzo6TWluaW11bVBlcmlvZGBdLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBRAVRoaXMgZGlzcGF0Y2ggY2xhc3MgaXMgX01hbmRhdG9yeV8gdG8gZW5zdXJlIGl0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGJsb2NrLiBCZSBhd2FyZVEBdGhhdCBjaGFuZ2luZyB0aGUgY29tcGxleGl0eSBvZiB0aGlzIGNhbGwgY291bGQgcmVzdWx0IGV4aGF1c3RpbmcgdGhlIHJlc291cmNlcyBpbiBhhGJsb2NrIHRvIGV4ZWN1dGUgYW55IG90aGVyIGNhbGxzLgA0IyMgQ29tcGxleGl0eTEBLSBgTygxKWAgKE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYE9uVGltZXN0YW1wU2V0YCBtdXN0IGFsc28gYmUgYE8oMSlgKVUBLSAxIHN0b3JhZ2UgcmVhZCBhbmQgMSBzdG9yYWdlIG11dGF0aW9uIChjb2RlYyBgTygxKWAgYmVjYXVzZSBvZiBgRGlkVXBkYXRlOjp0YWtlYCBpbkAgIGBvbl9maW5hbGl6ZWAp1C0gMSBldmVudCBoYW5kbGVyIGBvbl90aW1lc3RhbXBfc2V0YC4gTXVzdCBiZSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrQAAAYoALgMWHN0YWdpbmdfcGFyYWNoYWluX2luZm8YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuvAw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXAAShUOjpCYWxhbmNlAAAc1FRyYW5zZmVyIHNvbWUgbGlxdWlkIGZyZWUgYmFsYW5jZSB0byBhbm90aGVyIGFjY291bnQuADUBYHRyYW5zZmVyX2FsbG93X2RlYXRoYCB3aWxsIHNldCB0aGUgYEZyZWVCYWxhbmNlYCBvZiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlci4RAUlmIHRoZSBzZW5kZXIncyBhY2NvdW50IGlzIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0sG9mIHRoZSB0cmFuc2ZlciwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuABUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgYFNpZ25lZGAgYnkgdGhlIHRyYW5zYWN0b3IuOGZvcmNlX3RyYW5zZmVyDAEYc291cmNlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN0AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZcABKFQ6OkJhbGFuY2UAAghhAUV4YWN0bHkgYXMgYHRyYW5zZmVyX2FsbG93X2RlYXRoYCwgZXhjZXB0IHRoZSBvcmlnaW4gbXVzdCBiZSByb290IGFuZCB0aGUgc291cmNlIGFjY291bnREbWF5IGJlIHNwZWNpZmllZC5MdHJhbnNmZXJfa2VlcF9hbGl2ZQgBEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVlwAEoVDo6QmFsYW5jZQADGFkBU2FtZSBhcyB0aGUgW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdIGNhbGwsIGJ1dCB3aXRoIGEgY2hlY2sgdGhhdCB0aGUgdHJhbnNmZXIgd2lsbCBub3Rga2lsbCB0aGUgb3JpZ2luIGFjY291bnQuAOg5OSUgb2YgdGhlIHRpbWUgeW91IHdhbnQgW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdIGluc3RlYWQuAPBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF06IHN0cnVjdC5QYWxsZXQuaHRtbCNtZXRob2QudHJhbnNmZXIwdHJhbnNmZXJfYWxsCAEQZGVzdAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoa2VlcF9hbGl2ZcgBEGJvb2wABDwFAVRyYW5zZmVyIHRoZSBlbnRpcmUgdHJhbnNmZXJhYmxlIGJhbGFuY2UgZnJvbSB0aGUgY2FsbGVyIGFjY291bnQuAFkBTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGF0dGVtcHRzIHRvIHRyYW5zZmVyIF90cmFuc2ZlcmFibGVfIGJhbGFuY2VzLiBUaGlzIG1lYW5zIHRoYXRhAWFueSBsb2NrZWQsIHJlc2VydmVkLCBvciBleGlzdGVudGlhbCBkZXBvc2l0cyAod2hlbiBga2VlcF9hbGl2ZWAgaXMgYHRydWVgKSwgd2lsbCBub3QgYmVdAXRyYW5zZmVycmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVzdWx0cyBpbiBhIGtpbGxlZCBhY2NvdW50LEUBeW91IG1pZ2h0IG5lZWQgdG8gcHJlcGFyZSB0aGUgYWNjb3VudCBieSByZW1vdmluZyBhbnkgcmVmZXJlbmNlIGNvdW50ZXJzLCBzdG9yYWdlQGRlcG9zaXRzLCBldGMuLi4AwFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkLgCgLSBgZGVzdGA6IFRoZSByZWNpcGllbnQgb2YgdGhlIHRyYW5zZmVyLlkBLSBga2VlcF9hbGl2ZWA6IEEgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGB0cmFuc2Zlcl9hbGxgIG9wZXJhdGlvbiBzaG91bGQgc2VuZCBhbGxNASAgb2YgdGhlIGZ1bmRzIHRoZSBhY2NvdW50IGhhcywgY2F1c2luZyB0aGUgc2VuZGVyIGFjY291bnQgdG8gYmUga2lsbGVkIChmYWxzZSksIG9yWQEgIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IGF0IGxlYXN0IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0LCB3aGljaCB3aWxsIGd1YXJhbnRlZSB0b5wgIGtlZXAgdGhlIHNlbmRlciBhY2NvdW50IGFsaXZlICh0cnVlKS48Zm9yY2VfdW5yZXNlcnZlCAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTEAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdob8wBRFZlYzxUOjpBY2NvdW50SWQ+AAYgcFVwZ3JhZGUgYSBzcGVjaWZpZWQgYWNjb3VudC4AdC0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAukC0gYHdob2A6IFRoZSBhY2NvdW50IHRvIGJlIHVwZ3JhZGVkLgBVAVRoaXMgd2lsbCB3YWl2ZSB0aGUgdHJhbnNhY3Rpb24gZmVlIGlmIGF0IGxlYXN0IGFsbCBidXQgMTAlIG9mIHRoZSBhY2NvdW50cyBuZWVkZWQgdG9BAWJlIHVwZ3JhZGVkLiAoV2UgbGV0IHNvbWUgbm90IGhhdmUgdG8gYmUgdXBncmFkZWQganVzdCBpbiBvcmRlciB0byBhbGxvdyBmb3IgdGhlWHBvc3NpYmlsaXR5IG9mIGNodXJuKS5EZm9yY2Vfc2V0X2JhbGFuY2UIAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIG5ld19mcmVlwAEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb27QAUxBZGp1c3RtZW50RGlyZWN0aW9uAAEUZGVsdGHAAShUOjpCYWxhbmNlAAkUuEFkanVzdCB0aGUgdG90YWwgaXNzdWFuY2UgaW4gYSBzYXR1cmF0aW5nIHdheS4A/ENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFuZCBhbHdheXMgbmVlZHMgYSBwb3NpdGl2ZSBgZGVsdGFgLgAkIyBFeGFtcGxlEGJ1cm4IARR2YWx1ZcABKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlyAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7AAAAGxADEAAAFBwDIAAAFAADMAAACBADQDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXNMQWRqdXN0bWVudERpcmVjdGlvbgABCCBJbmNyZWFzZQAAACBEZWNyZWFzZQABAADUDHxpbmRpdl9wYWxsZXRfb3JpZ2luX3Jlc3RyaWN0aW9uGHBhbGxldBBDYWxsBARUAAEELGNsZWFuX3VzYWdlBAEYZW50aXR52AFMVDo6UmVzdHJpY3RlZEVudGl0eQABCEkBQWxsb3cgdG8gY2xlYW4gdXNhZ2UgYXNzb2NpYXRlZCB3aXRoIGFuIGVudGl0eSB3aGVuIGl0IGlzIHplcm8gb3Igd2hlbiB0aGVyZSBpcyBub5Bsb25nZXIgYW55IGFsbG93YW5jZSBmb3IgdGhlIG9yaWdpbi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2AhkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZUBSZXN0cmljdGVkRW50aXR5AAEYNFBlcnNvbmFsQWxpYXMEAAgBFEFsaWFzAAAAQFBlcnNvbmFsSWRlbnRpdHkEACgBDHU2NAABAERSZWZlcnJlZENhbmRpZGF0ZQQABAEkQWNjb3VudElkAAIASEFjY291bnRQYXJ0aWNpcGFudAQABAEkQWNjb3VudElkAAMAQEludml0ZWRDYW5kaWRhdGUEAAQBJEFjY291bnRJZAAEAChMaXRlUGVyc29uBAAEASRBY2NvdW50SWQABQAA3Aw0cGFsbGV0X2Fzc2V0cxhwYWxsZXQQQ2FsbAgEVAAESQABiBhjcmVhdGUMAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARRhZG1pbgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEsbWluX2JhbGFuY2XEAShUOjpCYWxhbmNlAABM6Elzc3VlIGEgbmV3IGNsYXNzIG9mIGZ1bmdpYmxlIGFzc2V0cyBmcm9tIGEgcHVibGljIG9yaWdpbi4AJQFUaGlzIG5ldyBhc3NldCBjbGFzcyBoYXMgbm8gYXNzZXRzIGluaXRpYWxseSBhbmQgaXRzIG93bmVyIGlzIHRoZSBvcmlnaW4uAGEBVGhlIG9yaWdpbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGNvbmZpZ3VyZWQgYENyZWF0ZU9yaWdpbmAgYW5kIGhhdmUgc3VmZmljaWVudCBmdW5kcyBmcmVlLgC8RnVuZHMgb2Ygc2VuZGVyIGFyZSByZXNlcnZlZCBieSBgQXNzZXREZXBvc2l0YC4ALFBhcmFtZXRlcnM6WQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBuZXcgYXNzZXQuIFRoaXMgbXVzdCBub3QgYmUgY3VycmVudGx5IGluIHVzZSB0byBpZGVudGlmeTEBYW4gZXhpc3RpbmcgYXNzZXQuIElmIFtgTmV4dEFzc2V0SWRgXSBpcyBzZXQsIHRoZW4gdGhpcyBtdXN0IGJlIGVxdWFsIHRvIGl0LlkBLSBgYWRtaW5gOiBUaGUgYWRtaW4gb2YgdGhpcyBjbGFzcyBvZiBhc3NldHMuIFRoZSBhZG1pbiBpcyB0aGUgaW5pdGlhbCBhZGRyZXNzIG9mIGVhY2icbWVtYmVyIG9mIHRoZSBhc3NldCBjbGFzcydzIGFkbWluIHRlYW0uTQEtIGBtaW5fYmFsYW5jZWA6IFRoZSBtaW5pbXVtIGJhbGFuY2Ugb2YgdGhpcyBuZXcgYXNzZXQgdGhhdCBhbnkgc2luZ2xlIGFjY291bnQgbXVzdD0BaGF2ZS4gSWYgYW4gYWNjb3VudCdzIGJhbGFuY2UgaXMgcmVkdWNlZCBiZWxvdyB0aGlzLCB0aGVuIGl0IGNvbGxhcHNlcyB0byB6ZXJvLgCYRW1pdHMgYENyZWF0ZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC4AOFdlaWdodDogYE8oMSlgMGZvcmNlX2NyZWF0ZRABCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABFG93bmVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AATRpc19zdWZmaWNpZW50yAEQYm9vbAABLG1pbl9iYWxhbmNlwAEoVDo6QmFsYW5jZQABTPhJc3N1ZSBhIG5ldyBjbGFzcyBvZiBmdW5naWJsZSBhc3NldHMgZnJvbSBhIHByaXZpbGVnZWQgb3JpZ2luLgC0VGhpcyBuZXcgYXNzZXQgY2xhc3MgaGFzIG5vIGFzc2V0cyBpbml0aWFsbHkuAKRUaGUgb3JpZ2luIG11c3QgY29uZm9ybSB0byBgRm9yY2VPcmlnaW5gLgCcVW5saWtlIGBjcmVhdGVgLCBubyBmdW5kcyBhcmUgcmVzZXJ2ZWQuAFkBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbmV3IGFzc2V0LiBUaGlzIG11c3Qgbm90IGJlIGN1cnJlbnRseSBpbiB1c2UgdG8gaWRlbnRpZnkxAWFuIGV4aXN0aW5nIGFzc2V0LiBJZiBbYE5leHRBc3NldElkYF0gaXMgc2V0LCB0aGVuIHRoaXMgbXVzdCBiZSBlcXVhbCB0byBpdC5ZAS0gYG93bmVyYDogVGhlIG93bmVyIG9mIHRoaXMgY2xhc3Mgb2YgYXNzZXRzLiBUaGUgb3duZXIgaGFzIGZ1bGwgc3VwZXJ1c2VyIHBlcm1pc3Npb25zJQFvdmVyIHRoaXMgYXNzZXQsIGJ1dCBtYXkgbGF0ZXIgY2hhbmdlIGFuZCBjb25maWd1cmUgdGhlIHBlcm1pc3Npb25zIHVzaW5nkGB0cmFuc2Zlcl9vd25lcnNoaXBgIGFuZCBgc2V0X3RlYW1gLk0BLSBgbWluX2JhbGFuY2VgOiBUaGUgbWluaW11bSBiYWxhbmNlIG9mIHRoaXMgbmV3IGFzc2V0IHRoYXQgYW55IHNpbmdsZSBhY2NvdW50IG11c3Q9AWhhdmUuIElmIGFuIGFjY291bnQncyBiYWxhbmNlIGlzIHJlZHVjZWQgYmVsb3cgdGhpcywgdGhlbiBpdCBjb2xsYXBzZXMgdG8gemVyby4ArEVtaXRzIGBGb3JjZUNyZWF0ZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC4AOFdlaWdodDogYE8oMSlgNHN0YXJ0X2Rlc3Ryb3kEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAjDcU3RhcnQgdGhlIHByb2Nlc3Mgb2YgZGVzdHJveWluZyBhIGZ1bmdpYmxlIGFzc2V0IGNsYXNzLgBZAWBzdGFydF9kZXN0cm95YCBpcyB0aGUgZmlyc3QgaW4gYSBzZXJpZXMgb2YgZXh0cmluc2ljcyB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIHRvIGFsbG93eGRlc3RydWN0aW9uIG9mIGFuIGFzc2V0IGNsYXNzLgBRAVRoZSBvcmlnaW4gbXVzdCBjb25mb3JtIHRvIGBGb3JjZU9yaWdpbmAgb3IgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgYXNzZXQncyBgb3duZXJgLgBNAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGRlc3Ryb3llZC4gVGhpcyBtdXN0IGlkZW50aWZ5IGFuIGV4aXN0aW5nICAgYXNzZXQuAEkBSXQgd2lsbCBmYWlsIHdpdGggZWl0aGVyIFtgRXJyb3I6OkNvbnRhaW5zSG9sZHNgXSBvciBbYEVycm9yOjpDb250YWluc0ZyZWV6ZXNgXSBpZrhhbiBhY2NvdW50IGNvbnRhaW5zIGhvbGRzIG9yIGZyZWV6ZXMgaW4gcGxhY2UuQGRlc3Ryb3lfYWNjb3VudHMEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAzDMRGVzdHJveSBhbGwgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYXNzZXQuAF0BYGRlc3Ryb3lfYWNjb3VudHNgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBgc3RhcnRfZGVzdHJveWAgaGFzIGJlZW4gY2FsbGVkLCBhbmQgdGhlhGFzc2V0IGlzIGluIGEgYERlc3Ryb3lpbmdgIHN0YXRlLgBdAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBmdWxseTEBZGVzdHJveSBhbGwgYWNjb3VudHMuIEl0IHdpbGwgZGVzdHJveSBgUmVtb3ZlSXRlbXNMaW1pdGAgYWNjb3VudHMgYXQgYSB0aW1lLgBNAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGRlc3Ryb3llZC4gVGhpcyBtdXN0IGlkZW50aWZ5IGFuIGV4aXN0aW5nICAgYXNzZXQuANRFYWNoIGNhbGwgZW1pdHMgdGhlIGBFdmVudDo6RGVzdHJveWVkQWNjb3VudHNgIGV2ZW50LkRkZXN0cm95X2FwcHJvdmFscwQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgAEMGEBRGVzdHJveSBhbGwgYXBwcm92YWxzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFzc2V0IHVwIHRvIHRoZSBtYXggKFQ6OlJlbW92ZUl0ZW1zTGltaXQpLgBhAWBkZXN0cm95X2FwcHJvdmFsc2Agc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGBzdGFydF9kZXN0cm95YCBoYXMgYmVlbiBjYWxsZWQsIGFuZCB0aGWEYXNzZXQgaXMgaW4gYSBgRGVzdHJveWluZ2Agc3RhdGUuAF0BRHVlIHRvIHdlaWdodCByZXN0cmljdGlvbnMsIHRoaXMgZnVuY3Rpb24gbWF5IG5lZWQgdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIGZ1bGx5OQFkZXN0cm95IGFsbCBhcHByb3ZhbHMuIEl0IHdpbGwgZGVzdHJveSBgUmVtb3ZlSXRlbXNMaW1pdGAgYXBwcm92YWxzIGF0IGEgdGltZS4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgDYRWFjaCBjYWxsIGVtaXRzIHRoZSBgRXZlbnQ6OkRlc3Ryb3llZEFwcHJvdmFsc2AgZXZlbnQuOGZpbmlzaF9kZXN0cm95BAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAUoxENvbXBsZXRlIGRlc3Ryb3lpbmcgYXNzZXQgYW5kIHVucmVzZXJ2ZSBjdXJyZW5jeS4AVQFgZmluaXNoX2Rlc3Ryb3lgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBgc3RhcnRfZGVzdHJveWAgaGFzIGJlZW4gY2FsbGVkLCBhbmQgdGhlWQFhc3NldCBpcyBpbiBhIGBEZXN0cm95aW5nYCBzdGF0ZS4gQWxsIGFjY291bnRzIG9yIGFwcHJvdmFscyBzaG91bGQgYmUgZGVzdHJveWVkIGJlZm9yZRRoYW5kLgBNAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGRlc3Ryb3llZC4gVGhpcyBtdXN0IGlkZW50aWZ5IGFuIGV4aXN0aW5nICAgYXNzZXQuAOBFYWNoIHN1Y2Nlc3NmdWwgY2FsbCBlbWl0cyB0aGUgYEV2ZW50OjpEZXN0cm95ZWRgIGV2ZW50LhBtaW50DAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEsYmVuZWZpY2lhcnkAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UABjCITWludCBhc3NldHMgb2YgYSBwYXJ0aWN1bGFyIGNsYXNzLgA5AVRoZSBvcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgSXNzdWVyIG9mIHRoZSBhc3NldCBgaWRgLgD8LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCBtaW50ZWQuDQEtIGBiZW5lZmljaWFyeWA6IFRoZSBhY2NvdW50IHRvIGJlIGNyZWRpdGVkIHdpdGggdGhlIG1pbnRlZCBhc3NldHMuxC0gYGFtb3VudGA6IFRoZSBhbW91bnQgb2YgdGhlIGFzc2V0IHRvIGJlIG1pbnRlZC4AlEVtaXRzIGBJc3N1ZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC4AOFdlaWdodDogYE8oMSlgVQFNb2RlczogUHJlLWV4aXN0aW5nIGJhbGFuY2Ugb2YgYGJlbmVmaWNpYXJ5YDsgQWNjb3VudCBwcmUtZXhpc3RlbmNlIG9mIGBiZW5lZmljaWFyeWAuEGJ1cm4MAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UABzxFAVJlZHVjZSB0aGUgYmFsYW5jZSBvZiBgd2hvYCBieSBhcyBtdWNoIGFzIHBvc3NpYmxlIHVwIHRvIGBhbW91bnRgIGFzc2V0cyBvZiBgaWRgLgA1AU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIE1hbmFnZXIgb2YgdGhlIGFzc2V0IGBpZGAuANBCYWlscyB3aXRoIGBOb0FjY291bnRgIGlmIHRoZSBgd2hvYCBpcyBhbHJlYWR5IGRlYWQuAPwtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBoYXZlIHNvbWUgYW1vdW50IGJ1cm5lZC6gLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgZGViaXRlZCBmcm9tLikBLSBgYW1vdW50YDogVGhlIG1heGltdW0gYW1vdW50IGJ5IHdoaWNoIGB3aG9gJ3MgYmFsYW5jZSBzaG91bGQgYmUgcmVkdWNlZC4AUQFFbWl0cyBgQnVybmVkYCB3aXRoIHRoZSBhY3R1YWwgYW1vdW50IGJ1cm5lZC4gSWYgdGhpcyB0YWtlcyB0aGUgYmFsYW5jZSB0byBiZWxvdyB0aGU5AW1pbmltdW0gZm9yIHRoZSBhc3NldCwgdGhlbiB0aGUgYW1vdW50IGJ1cm5lZCBpcyBpbmNyZWFzZWQgdG8gdGFrZSBpdCB0byB6ZXJvLgA4V2VpZ2h0OiBgTygxKWAJAU1vZGVzOiBQb3N0LWV4aXN0ZW5jZSBvZiBgd2hvYDsgUHJlICYgcG9zdCBab21iaWUtc3RhdHVzIG9mIGB3aG9gLiB0cmFuc2ZlcgwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABGHRhcmdldAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50wAEoVDo6QmFsYW5jZQAISNBNb3ZlIHNvbWUgYXNzZXRzIGZyb20gdGhlIHNlbmRlciBhY2NvdW50IHRvIGFub3RoZXIuAFhPcmlnaW4gbXVzdCBiZSBTaWduZWQuABEBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCB0cmFuc2ZlcnJlZC6cLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gYmUgY3JlZGl0ZWQuUQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzZW5kZXIncyBiYWxhbmNlIG9mIGFzc2V0cyBzaG91bGQgYmUgcmVkdWNlZCBhbmRhAWB0YXJnZXRgJ3MgYmFsYW5jZSBpbmNyZWFzZWQuIFRoZSBhbW91bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgbWF5IGJlIHNsaWdodGx5IGdyZWF0ZXIgaW5dAXRoZSBjYXNlIHRoYXQgdGhlIHRyYW5zZmVyIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBzZW5kZXIgYmFsYW5jZSBhYm92ZSB6ZXJvIGJ1dCBiZWxvd7x0aGUgbWluaW11bSBiYWxhbmNlLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgBhAUVtaXRzIGBUcmFuc2ZlcnJlZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCB0cmFuc2ZlcnJlZC4gSWYgdGhpcyB0YWtlcyB0aGUgc291cmNlIGJhbGFuY2VdAXRvIGJlbG93IHRoZSBtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBpcyBpbmNyZWFzZWQgdG8gdGFrZSBpdCB0byB6ZXJvLgA4V2VpZ2h0OiBgTygxKWBRAU1vZGVzOiBQcmUtZXhpc3RlbmNlIG9mIGB0YXJnZXRgOyBQb3N0LWV4aXN0ZW5jZSBvZiBzZW5kZXI7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZiRgdGFyZ2V0YC5MdHJhbnNmZXJfa2VlcF9hbGl2ZQwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABGHRhcmdldAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50wAEoVDo6QmFsYW5jZQAJSFkBTW92ZSBzb21lIGFzc2V0cyBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudCB0byBhbm90aGVyLCBrZWVwaW5nIHRoZSBzZW5kZXIgYWNjb3VudCBhbGl2ZS4AWE9yaWdpbiBtdXN0IGJlIFNpZ25lZC4AEQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBoYXZlIHNvbWUgYW1vdW50IHRyYW5zZmVycmVkLpwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB0byBiZSBjcmVkaXRlZC5RAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHNlbmRlcidzIGJhbGFuY2Ugb2YgYXNzZXRzIHNob3VsZCBiZSByZWR1Y2VkIGFuZGEBYHRhcmdldGAncyBiYWxhbmNlIGluY3JlYXNlZC4gVGhlIGFtb3VudCBhY3R1YWxseSB0cmFuc2ZlcnJlZCBtYXkgYmUgc2xpZ2h0bHkgZ3JlYXRlciBpbl0BdGhlIGNhc2UgdGhhdCB0aGUgdHJhbnNmZXIgd291bGQgb3RoZXJ3aXNlIHRha2UgdGhlIHNlbmRlciBiYWxhbmNlIGFib3ZlIHplcm8gYnV0IGJlbG93vHRoZSBtaW5pbXVtIGJhbGFuY2UuIE11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uAGEBRW1pdHMgYFRyYW5zZmVycmVkYCB3aXRoIHRoZSBhY3R1YWwgYW1vdW50IHRyYW5zZmVycmVkLiBJZiB0aGlzIHRha2VzIHRoZSBzb3VyY2UgYmFsYW5jZV0BdG8gYmVsb3cgdGhlIG1pbmltdW0gZm9yIHRoZSBhc3NldCwgdGhlbiB0aGUgYW1vdW50IHRyYW5zZmVycmVkIGlzIGluY3JlYXNlZCB0byB0YWtlIGl0IHRvIHplcm8uADhXZWlnaHQ6IGBPKDEpYFEBTW9kZXM6IFByZS1leGlzdGVuY2Ugb2YgYHRhcmdldGA7IFBvc3QtZXhpc3RlbmNlIG9mIHNlbmRlcjsgQWNjb3VudCBwcmUtZXhpc3RlbmNlIG9mJGB0YXJnZXRgLjhmb3JjZV90cmFuc2ZlchABCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABGHNvdXJjZQABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQZGVzdAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50wAEoVDo6QmFsYW5jZQAKTLRNb3ZlIHNvbWUgYXNzZXRzIGZyb20gb25lIGFjY291bnQgdG8gYW5vdGhlci4ALQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBBZG1pbiBvZiB0aGUgYXNzZXQgYGlkYC4AEQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBoYXZlIHNvbWUgYW1vdW50IHRyYW5zZmVycmVkLpgtIGBzb3VyY2VgOiBUaGUgYWNjb3VudCB0byBiZSBkZWJpdGVkLpQtIGBkZXN0YDogVGhlIGFjY291bnQgdG8gYmUgY3JlZGl0ZWQuWQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBgc291cmNlYCdzIGJhbGFuY2Ugb2YgYXNzZXRzIHNob3VsZCBiZSByZWR1Y2VkIGFuZFkBYGRlc3RgJ3MgYmFsYW5jZSBpbmNyZWFzZWQuIFRoZSBhbW91bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgbWF5IGJlIHNsaWdodGx5IGdyZWF0ZXIgaW5NAXRoZSBjYXNlIHRoYXQgdGhlIHRyYW5zZmVyIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBgc291cmNlYCBiYWxhbmNlIGFib3ZlIHplcm8gYnV01GJlbG93IHRoZSBtaW5pbXVtIGJhbGFuY2UuIE11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uAGEBRW1pdHMgYFRyYW5zZmVycmVkYCB3aXRoIHRoZSBhY3R1YWwgYW1vdW50IHRyYW5zZmVycmVkLiBJZiB0aGlzIHRha2VzIHRoZSBzb3VyY2UgYmFsYW5jZV0BdG8gYmVsb3cgdGhlIG1pbmltdW0gZm9yIHRoZSBhc3NldCwgdGhlbiB0aGUgYW1vdW50IHRyYW5zZmVycmVkIGlzIGluY3JlYXNlZCB0byB0YWtlIGl0IHRvIHplcm8uADhXZWlnaHQ6IGBPKDEpYFEBTW9kZXM6IFByZS1leGlzdGVuY2Ugb2YgYGRlc3RgOyBQb3N0LWV4aXN0ZW5jZSBvZiBgc291cmNlYDsgQWNjb3VudCBwcmUtZXhpc3RlbmNlIG9mHGBkZXN0YC4YZnJlZXplCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4ACzBVAURpc2FsbG93IGZ1cnRoZXIgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyBvZiBhbiBhc3NldCBgaWRgIGZyb20gYW4gYWNjb3VudCBgd2hvYC4gYHdob2BNAW11c3QgYWxyZWFkeSBleGlzdCBhcyBhbiBlbnRyeSBpbiBgQWNjb3VudGBzIG9mIHRoZSBhc3NldC4gSWYgeW91IHdhbnQgdG8gZnJlZXplIGFu9GFjY291bnQgdGhhdCBkb2VzIG5vdCBoYXZlIGFuIGVudHJ5LCB1c2UgYHRvdWNoX290aGVyYCBmaXJzdC4ANQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBGcmVlemVyIG9mIHRoZSBhc3NldCBgaWRgLgDELSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgZnJvemVuLogtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSBmcm96ZW4uADxFbWl0cyBgRnJvemVuYC4AOFdlaWdodDogYE8oMSlgEHRoYXcIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgAMKOhBbGxvdyB1bnByaXZpbGVnZWQgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIGFuIGFjY291bnQgYWdhaW4uAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgQWRtaW4gb2YgdGhlIGFzc2V0IGBpZGAuAMQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBmcm96ZW4ukC0gYHdob2A6IFRoZSBhY2NvdW50IHRvIGJlIHVuZnJvemVuLgA8RW1pdHMgYFRoYXdlZGAuADhXZWlnaHQ6IGBPKDEpYDBmcmVlemVfYXNzZXQEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIADSTwRGlzYWxsb3cgZnVydGhlciB1bnByaXZpbGVnZWQgdHJhbnNmZXJzIGZvciB0aGUgYXNzZXQgY2xhc3MuADUBT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgRnJlZXplciBvZiB0aGUgYXNzZXQgYGlkYC4AxC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGZyb3plbi4APEVtaXRzIGBGcm96ZW5gLgA4V2VpZ2h0OiBgTygxKWAodGhhd19hc3NldAQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgAOJMRBbGxvdyB1bnByaXZpbGVnZWQgdHJhbnNmZXJzIGZvciB0aGUgYXNzZXQgYWdhaW4uAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgQWRtaW4gb2YgdGhlIGFzc2V0IGBpZGAuAMQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSB0aGF3ZWQuADxFbWl0cyBgVGhhd2VkYC4AOFdlaWdodDogYE8oMSlgSHRyYW5zZmVyX293bmVyc2hpcAgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABFG93bmVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4ADyh0Q2hhbmdlIHRoZSBPd25lciBvZiBhbiBhc3NldC4ALQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LpwtIGBvd25lcmA6IFRoZSBuZXcgT3duZXIgb2YgdGhpcyBhc3NldC4AVEVtaXRzIGBPd25lckNoYW5nZWRgLgA4V2VpZ2h0OiBgTygxKWAgc2V0X3RlYW0QAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARhpc3N1ZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGFkbWluAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxmcmVlemVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AEDDEQ2hhbmdlIHRoZSBJc3N1ZXIsIEFkbWluIGFuZCBGcmVlemVyIG9mIGFuIGFzc2V0LgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIE93bmVyIG9mIHRoZSBhc3NldCBgaWRgLgDELSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgZnJvemVuLqQtIGBpc3N1ZXJgOiBUaGUgbmV3IElzc3VlciBvZiB0aGlzIGFzc2V0LpwtIGBhZG1pbmA6IFRoZSBuZXcgQWRtaW4gb2YgdGhpcyBhc3NldC6sLSBgZnJlZXplcmA6IFRoZSBuZXcgRnJlZXplciBvZiB0aGlzIGFzc2V0LgBQRW1pdHMgYFRlYW1DaGFuZ2VkYC4AOFdlaWdodDogYE8oMSlgMHNldF9tZXRhZGF0YRABCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABEG5hbWUYARxWZWM8dTg+AAEYc3ltYm9sGAEcVmVjPHU4PgABIGRlY2ltYWxzDAEIdTgAEUB4U2V0IHRoZSBtZXRhZGF0YSBmb3IgYW4gYXNzZXQuAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgT3duZXIgb2YgdGhlIGFzc2V0IGBpZGAuANhGdW5kcyBvZiBzZW5kZXIgYXJlIHJlc2VydmVkIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpRAWBNZXRhZGF0YURlcG9zaXRCYXNlICsgTWV0YWRhdGFEZXBvc2l0UGVyQnl0ZSAqIChuYW1lLmxlbiArIHN5bWJvbC5sZW4pYCB0YWtpbmcgaW50b4xhY2NvdW50IGFueSBhbHJlYWR5IHJlc2VydmVkIGZ1bmRzLgC4LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gdXBkYXRlLk0BLSBgbmFtZWA6IFRoZSB1c2VyIGZyaWVuZGx5IG5hbWUgb2YgdGhpcyBhc3NldC4gTGltaXRlZCBpbiBsZW5ndGggYnkgYFN0cmluZ0xpbWl0YC5NAS0gYHN5bWJvbGA6IFRoZSBleGNoYW5nZSBzeW1ib2wgZm9yIHRoaXMgYXNzZXQuIExpbWl0ZWQgaW4gbGVuZ3RoIGJ5IGBTdHJpbmdMaW1pdGAuLQEtIGBkZWNpbWFsc2A6IFRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdGhpcyBhc3NldCB1c2VzIHRvIHJlcHJlc2VudCBvbmUgdW5pdC4AUEVtaXRzIGBNZXRhZGF0YVNldGAuADhXZWlnaHQ6IGBPKDEpYDhjbGVhcl9tZXRhZGF0YQQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgASLIBDbGVhciB0aGUgbWV0YWRhdGEgZm9yIGFuIGFzc2V0LgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIE93bmVyIG9mIHRoZSBhc3NldCBgaWRgLgCkQW55IGRlcG9zaXQgaXMgZnJlZWQgZm9yIHRoZSBhc3NldCBvd25lci4AtC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGNsZWFyLgBgRW1pdHMgYE1ldGFkYXRhQ2xlYXJlZGAuADhXZWlnaHQ6IGBPKDEpYEhmb3JjZV9zZXRfbWV0YWRhdGEUAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARBuYW1lGAEcVmVjPHU4PgABGHN5bWJvbBgBHFZlYzx1OD4AASBkZWNpbWFscwwBCHU4AAEkaXNfZnJvemVuyAEQYm9vbAATOLhGb3JjZSB0aGUgbWV0YWRhdGEgZm9yIGFuIGFzc2V0IHRvIHNvbWUgdmFsdWUuAGxPcmlnaW4gbXVzdCBiZSBGb3JjZU9yaWdpbi4AaEFueSBkZXBvc2l0IGlzIGxlZnQgYWxvbmUuALgtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byB1cGRhdGUuTQEtIGBuYW1lYDogVGhlIHVzZXIgZnJpZW5kbHkgbmFtZSBvZiB0aGlzIGFzc2V0LiBMaW1pdGVkIGluIGxlbmd0aCBieSBgU3RyaW5nTGltaXRgLk0BLSBgc3ltYm9sYDogVGhlIGV4Y2hhbmdlIHN5bWJvbCBmb3IgdGhpcyBhc3NldC4gTGltaXRlZCBpbiBsZW5ndGggYnkgYFN0cmluZ0xpbWl0YC4tAS0gYGRlY2ltYWxzYDogVGhlIG51bWJlciBvZiBkZWNpbWFscyB0aGlzIGFzc2V0IHVzZXMgdG8gcmVwcmVzZW50IG9uZSB1bml0LgBQRW1pdHMgYE1ldGFkYXRhU2V0YC4AUQFXZWlnaHQ6IGBPKE4gKyBTKWAgd2hlcmUgTiBhbmQgUyBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgc3ltYm9sIHJlc3BlY3RpdmVseS5QZm9yY2VfY2xlYXJfbWV0YWRhdGEEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAFCyAQ2xlYXIgdGhlIG1ldGFkYXRhIGZvciBhbiBhc3NldC4AbE9yaWdpbiBtdXN0IGJlIEZvcmNlT3JpZ2luLgBgQW55IGRlcG9zaXQgaXMgcmV0dXJuZWQuALQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBjbGVhci4AYEVtaXRzIGBNZXRhZGF0YUNsZWFyZWRgLgA4V2VpZ2h0OiBgTygxKWBIZm9yY2VfYXNzZXRfc3RhdHVzIAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEUb3duZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGlzc3VlcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUYWRtaW4AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHGZyZWV6ZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLG1pbl9iYWxhbmNlwAEoVDo6QmFsYW5jZQABNGlzX3N1ZmZpY2llbnTIARBib29sAAEkaXNfZnJvemVuyAEQYm9vbAAVWJhBbHRlciB0aGUgYXR0cmlidXRlcyBvZiBhIGdpdmVuIGFzc2V0LgB0T3JpZ2luIG11c3QgYmUgYEZvcmNlT3JpZ2luYC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LpwtIGBvd25lcmA6IFRoZSBuZXcgT3duZXIgb2YgdGhpcyBhc3NldC6kLSBgaXNzdWVyYDogVGhlIG5ldyBJc3N1ZXIgb2YgdGhpcyBhc3NldC6cLSBgYWRtaW5gOiBUaGUgbmV3IEFkbWluIG9mIHRoaXMgYXNzZXQurC0gYGZyZWV6ZXJgOiBUaGUgbmV3IEZyZWV6ZXIgb2YgdGhpcyBhc3NldC5NAS0gYG1pbl9iYWxhbmNlYDogVGhlIG1pbmltdW0gYmFsYW5jZSBvZiB0aGlzIG5ldyBhc3NldCB0aGF0IGFueSBzaW5nbGUgYWNjb3VudCBtdXN0PQFoYXZlLiBJZiBhbiBhY2NvdW50J3MgYmFsYW5jZSBpcyByZWR1Y2VkIGJlbG93IHRoaXMsIHRoZW4gaXQgY29sbGFwc2VzIHRvIHplcm8uUQEtIGBpc19zdWZmaWNpZW50YDogV2hldGhlciBhIG5vbi16ZXJvIGJhbGFuY2Ugb2YgdGhpcyBhc3NldCBpcyBkZXBvc2l0IG9mIHN1ZmZpY2llbnRNAXZhbHVlIHRvIGFjY291bnQgZm9yIHRoZSBzdGF0ZSBibG9hdCBhc3NvY2lhdGVkIHdpdGggaXRzIGJhbGFuY2Ugc3RvcmFnZS4gSWYgc2V0IHRvVQFgdHJ1ZWAsIHRoZW4gbm9uLXplcm8gYmFsYW5jZXMgbWF5IGJlIHN0b3JlZCB3aXRob3V0IGEgYGNvbnN1bWVyYCByZWZlcmVuY2UgKGFuZCB0aHVzTQFhbiBFRCBpbiB0aGUgQmFsYW5jZXMgcGFsbGV0IG9yIHdoYXRldmVyIGVsc2UgaXMgdXNlZCB0byBjb250cm9sIHVzZXItYWNjb3VudCBzdGF0ZSBncm93dGgpLj0BLSBgaXNfZnJvemVuYDogV2hldGhlciB0aGlzIGFzc2V0IGNsYXNzIGlzIGZyb3plbiBleGNlcHQgZm9yIHBlcm1pc3Npb25lZC9hZG1pbjRpbnN0cnVjdGlvbnMuAOhFbWl0cyBgQXNzZXRTdGF0dXNDaGFuZ2VkYCB3aXRoIHRoZSBpZGVudGl0eSBvZiB0aGUgYXNzZXQuADhXZWlnaHQ6IGBPKDEpYEBhcHByb3ZlX3RyYW5zZmVyDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEgZGVsZWdhdGUAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UAFlAtAUFwcHJvdmUgYW4gYW1vdW50IG9mIGFzc2V0IGZvciB0cmFuc2ZlciBieSBhIGRlbGVnYXRlZCB0aGlyZC1wYXJ0eSBhY2NvdW50LgBYT3JpZ2luIG11c3QgYmUgU2lnbmVkLgBNAUVuc3VyZXMgdGhhdCBgQXBwcm92YWxEZXBvc2l0YCB3b3J0aCBvZiBgQ3VycmVuY3lgIGlzIHJlc2VydmVkIGZyb20gc2lnbmluZyBhY2NvdW50VQFmb3IgdGhlIHB1cnBvc2Ugb2YgaG9sZGluZyB0aGUgYXBwcm92YWwuIElmIHNvbWUgbm9uLXplcm8gYW1vdW50IG9mIGFzc2V0cyBpcyBhbHJlYWR5SQFhcHByb3ZlZCBmcm9tIHNpZ25pbmcgYWNjb3VudCB0byBgZGVsZWdhdGVgLCB0aGVuIGl0IGlzIHRvcHBlZCB1cCBvciB1bnJlc2VydmVkIHRvVG1lZXQgdGhlIHJpZ2h0IHZhbHVlLgBFAU5PVEU6IFRoZSBzaWduaW5nIGFjY291bnQgZG9lcyBub3QgbmVlZCB0byBvd24gYGFtb3VudGAgb2YgYXNzZXRzIGF0IHRoZSBwb2ludCBvZkRtYWtpbmcgdGhpcyBjYWxsLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQuDQEtIGBkZWxlZ2F0ZWA6IFRoZSBhY2NvdW50IHRvIGRlbGVnYXRlIHBlcm1pc3Npb24gdG8gdHJhbnNmZXIgYXNzZXQuSQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IG9mIGFzc2V0IHRoYXQgbWF5IGJlIHRyYW5zZmVycmVkIGJ5IGBkZWxlZ2F0ZWAuIElmIHRoZXJlIGlz4GFscmVhZHkgYW4gYXBwcm92YWwgaW4gcGxhY2UsIHRoZW4gdGhpcyBhY3RzIGFkZGl0aXZlbHkuAJBFbWl0cyBgQXBwcm92ZWRUcmFuc2ZlcmAgb24gc3VjY2Vzcy4AOFdlaWdodDogYE8oMSlgPGNhbmNlbF9hcHByb3ZhbAgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AFzRJAUNhbmNlbCBhbGwgb2Ygc29tZSBhc3NldCBhcHByb3ZlZCBmb3IgZGVsZWdhdGVkIHRyYW5zZmVyIGJ5IGEgdGhpcmQtcGFydHkgYWNjb3VudC4APQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZXJlIG11c3QgYmUgYW4gYXBwcm92YWwgaW4gcGxhY2UgYmV0d2VlbiBzaWduZXIgYW5kLGBkZWxlZ2F0ZWAuAEkBVW5yZXNlcnZlcyBhbnkgZGVwb3NpdCBwcmV2aW91c2x5IHJlc2VydmVkIGJ5IGBhcHByb3ZlX3RyYW5zZmVyYCBmb3IgdGhlIGFwcHJvdmFsLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQuBQEtIGBkZWxlZ2F0ZWA6IFRoZSBhY2NvdW50IGRlbGVnYXRlZCBwZXJtaXNzaW9uIHRvIHRyYW5zZmVyIGFzc2V0LgCURW1pdHMgYEFwcHJvdmFsQ2FuY2VsbGVkYCBvbiBzdWNjZXNzLgA4V2VpZ2h0OiBgTygxKWBUZm9yY2VfY2FuY2VsX2FwcHJvdmFsDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEUb3duZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AGDRJAUNhbmNlbCBhbGwgb2Ygc29tZSBhc3NldCBhcHByb3ZlZCBmb3IgZGVsZWdhdGVkIHRyYW5zZmVyIGJ5IGEgdGhpcmQtcGFydHkgYWNjb3VudC4ASQFPcmlnaW4gbXVzdCBiZSBlaXRoZXIgRm9yY2VPcmlnaW4gb3IgU2lnbmVkIG9yaWdpbiB3aXRoIHRoZSBzaWduZXIgYmVpbmcgdGhlIEFkbWluaGFjY291bnQgb2YgdGhlIGFzc2V0IGBpZGAuAEkBVW5yZXNlcnZlcyBhbnkgZGVwb3NpdCBwcmV2aW91c2x5IHJlc2VydmVkIGJ5IGBhcHByb3ZlX3RyYW5zZmVyYCBmb3IgdGhlIGFwcHJvdmFsLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQuBQEtIGBkZWxlZ2F0ZWA6IFRoZSBhY2NvdW50IGRlbGVnYXRlZCBwZXJtaXNzaW9uIHRvIHRyYW5zZmVyIGFzc2V0LgCURW1pdHMgYEFwcHJvdmFsQ2FuY2VsbGVkYCBvbiBzdWNjZXNzLgA4V2VpZ2h0OiBgTygxKWBEdHJhbnNmZXJfYXBwcm92ZWQQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARRvd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEsZGVzdGluYXRpb24AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UAGUhNAVRyYW5zZmVyIHNvbWUgYXNzZXQgYmFsYW5jZSBmcm9tIGEgcHJldmlvdXNseSBkZWxlZ2F0ZWQgYWNjb3VudCB0byBzb21lIHRoaXJkLXBhcnR5IGFjY291bnQuAEkBT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGVyZSBtdXN0IGJlIGFuIGFwcHJvdmFsIGluIHBsYWNlIGJ5IHRoZSBgb3duZXJgIHRvIHRoZRxzaWduZXIuAFkBSWYgdGhlIGVudGlyZSBhbW91bnQgYXBwcm92ZWQgZm9yIHRyYW5zZmVyIGlzIHRyYW5zZmVycmVkLCB0aGVuIGFueSBkZXBvc2l0IHByZXZpb3VzbHm0cmVzZXJ2ZWQgYnkgYGFwcHJvdmVfdHJhbnNmZXJgIGlzIHVucmVzZXJ2ZWQuAJAtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldC5hAS0gYG93bmVyYDogVGhlIGFjY291bnQgd2hpY2ggcHJldmlvdXNseSBhcHByb3ZlZCBmb3IgYSB0cmFuc2ZlciBvZiBhdCBsZWFzdCBgYW1vdW50YCBhbmS8ZnJvbSB3aGljaCB0aGUgYXNzZXQgYmFsYW5jZSB3aWxsIGJlIHdpdGhkcmF3bi5hAS0gYGRlc3RpbmF0aW9uYDogVGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIGFzc2V0IGJhbGFuY2Ugb2YgYGFtb3VudGAgd2lsbCBiZSB0cmFuc2ZlcnJlZC60LSBgYW1vdW50YDogVGhlIGFtb3VudCBvZiBhc3NldHMgdG8gdHJhbnNmZXIuAJxFbWl0cyBgVHJhbnNmZXJyZWRBcHByb3ZlZGAgb24gc3VjY2Vzcy4AOFdlaWdodDogYE8oMSlgFHRvdWNoBAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyABokwENyZWF0ZSBhbiBhc3NldCBhY2NvdW50IGZvciBub24tcHJvdmlkZXIgYXNzZXRzLgDAQSBkZXBvc2l0IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgc2lnbmVyIGFjY291bnQuAF0BLSBgb3JpZ2luYDogTXVzdCBiZSBTaWduZWQ7IHRoZSBzaWduZXIgYWNjb3VudCBtdXN0IGhhdmUgc3VmZmljaWVudCBmdW5kcyBmb3IgYSBkZXBvc2l0OCAgdG8gYmUgdGFrZW4uCQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBmb3IgdGhlIGFjY291bnQgdG8gYmUgY3JlYXRlZC4AmEVtaXRzIGBUb3VjaGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuGHJlZnVuZAgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABKGFsbG93X2J1cm7IARBib29sABs0WQFSZXR1cm4gdGhlIGRlcG9zaXQgKGlmIGFueSkgb2YgYW4gYXNzZXQgYWNjb3VudCBvciBhIGNvbnN1bWVyIHJlZmVyZW5jZSAoaWYgYW55KSBvZiBhbiBhY2NvdW50LgBoVGhlIG9yaWdpbiBtdXN0IGJlIFNpZ25lZC4APQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBmb3Igd2hpY2ggdGhlIGNhbGxlciB3b3VsZCBsaWtlIHRoZSBkZXBvc2l0LCAgcmVmdW5kZWQuXQEtIGBhbGxvd19idXJuYDogSWYgYHRydWVgIHRoZW4gYXNzZXRzIG1heSBiZSBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gY29tcGxldGUgdGhlIHJlZnVuZC4ASQFJdCB3aWxsIGZhaWwgd2l0aCBlaXRoZXIgW2BFcnJvcjo6Q29udGFpbnNIb2xkc2BdIG9yIFtgRXJyb3I6OkNvbnRhaW5zRnJlZXplc2BdIGlm1HRoZSBhc3NldCBhY2NvdW50IGNvbnRhaW5zIGhvbGRzIG9yIGZyZWV6ZXMgaW4gcGxhY2UuAJxFbWl0cyBgUmVmdW5kZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC48c2V0X21pbl9iYWxhbmNlCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEsbWluX2JhbGFuY2XEAShUOjpCYWxhbmNlABwwlFNldHMgdGhlIG1pbmltdW0gYmFsYW5jZSBvZiBhbiBhc3NldC4AIQFPbmx5IHdvcmtzIGlmIHRoZXJlIGFyZW4ndCBhbnkgYWNjb3VudHMgdGhhdCBhcmUgaG9sZGluZyB0aGUgYXNzZXQgb3IgaWbgdGhlIG5ldyB2YWx1ZSBvZiBgbWluX2JhbGFuY2VgIGlzIGxlc3MgdGhhbiB0aGUgb2xkIG9uZS4A/E9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBoYXMgdG8gYmUgdGhlIE93bmVyIG9mIHRoZSxhc3NldCBgaWRgLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQuwC0gYG1pbl9iYWxhbmNlYDogVGhlIG5ldyB2YWx1ZSBvZiBgbWluX2JhbGFuY2VgLgDURW1pdHMgYEFzc2V0TWluQmFsYW5jZUNoYW5nZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC4sdG91Y2hfb3RoZXIIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgAdLIhDcmVhdGUgYW4gYXNzZXQgYWNjb3VudCBmb3IgYHdob2AuAMBBIGRlcG9zaXQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBzaWduZXIgYWNjb3VudC4AXQEtIGBvcmlnaW5gOiBNdXN0IGJlIFNpZ25lZDsgdGhlIHNpZ25lciBhY2NvdW50IG11c3QgaGF2ZSBzdWZmaWNpZW50IGZ1bmRzIGZvciBhIGRlcG9zaXQ4ICB0byBiZSB0YWtlbi5hAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IGZvciB0aGUgYWNjb3VudCB0byBiZSBjcmVhdGVkLCB0aGUgYXNzZXQgc3RhdHVzIG11c3QoICBiZSBsaXZlLowtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSBjcmVhdGVkLgCYRW1pdHMgYFRvdWNoZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC4wcmVmdW5kX290aGVyCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AHjRdAVJldHVybiB0aGUgZGVwb3NpdCAoaWYgYW55KSBvZiBhIHRhcmdldCBhc3NldCBhY2NvdW50LiBVc2VmdWwgaWYgeW91IGFyZSB0aGUgZGVwb3NpdG9yLgBdAVRoZSBvcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIGVpdGhlciB0aGUgYWNjb3VudCBvd25lciwgZGVwb3NpdG9yLCBvciBhc3NldCBgQWRtaW5gLiBJbmEBb3JkZXIgdG8gYnVybiBhIG5vbi16ZXJvIGJhbGFuY2Ugb2YgdGhlIGFzc2V0LCB0aGUgY2FsbGVyIG11c3QgYmUgdGhlIGFjY291bnQgYW5kIHNob3VsZDR1c2UgYHJlZnVuZGAuABkBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgZm9yIHRoZSBhY2NvdW50IGhvbGRpbmcgYSBkZXBvc2l0LnwtIGB3aG9gOiBUaGUgYWNjb3VudCB0byByZWZ1bmQuAEkBSXQgd2lsbCBmYWlsIHdpdGggZWl0aGVyIFtgRXJyb3I6OkNvbnRhaW5zSG9sZHNgXSBvciBbYEVycm9yOjpDb250YWluc0ZyZWV6ZXNgXSBpZtR0aGUgYXNzZXQgYWNjb3VudCBjb250YWlucyBob2xkcyBvciBmcmVlemVzIGluIHBsYWNlLgCcRW1pdHMgYFJlZnVuZGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuFGJsb2NrCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AHyhZAURpc2FsbG93IGZ1cnRoZXIgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyBvZiBhbiBhc3NldCBgaWRgIHRvIGFuZCBmcm9tIGFuIGFjY291bnQgYHdob2AuADUBT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgRnJlZXplciBvZiB0aGUgYXNzZXQgYGlkYC4AuC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFjY291bnQncyBhc3NldC6ULSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgdW5ibG9ja2VkLgBARW1pdHMgYEJsb2NrZWRgLgA4V2VpZ2h0OiBgTygxKWAwdHJhbnNmZXJfYWxsDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEQZGVzdAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoa2VlcF9hbGl2ZcgBEGJvb2wAIEAdAVRyYW5zZmVyIHRoZSBlbnRpcmUgdHJhbnNmZXJhYmxlIGJhbGFuY2UgZnJvbSB0aGUgY2FsbGVyIGFzc2V0IGFjY291bnQuAFkBTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGF0dGVtcHRzIHRvIHRyYW5zZmVyIF90cmFuc2ZlcmFibGVfIGJhbGFuY2VzLiBUaGlzIG1lYW5zIHRoYXQ9AWFueSBoZWxkLCBmcm96ZW4sIG9yIG1pbmltdW0gYmFsYW5jZSAod2hlbiBga2VlcF9hbGl2ZWAgaXMgYHRydWVgKSwgd2lsbCBub3QgYmVdAXRyYW5zZmVycmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVzdWx0cyBpbiBhIGtpbGxlZCBhY2NvdW50LEUBeW91IG1pZ2h0IG5lZWQgdG8gcHJlcGFyZSB0aGUgYWNjb3VudCBieSByZW1vdmluZyBhbnkgcmVmZXJlbmNlIGNvdW50ZXJzLCBzdG9yYWdlQGRlcG9zaXRzLCBldGMuLi4AwFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkLgAZAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IGZvciB0aGUgYWNjb3VudCBob2xkaW5nIGEgZGVwb3NpdC6gLSBgZGVzdGA6IFRoZSByZWNpcGllbnQgb2YgdGhlIHRyYW5zZmVyLlkBLSBga2VlcF9hbGl2ZWA6IEEgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGB0cmFuc2Zlcl9hbGxgIG9wZXJhdGlvbiBzaG91bGQgc2VuZCBhbGxNASAgb2YgdGhlIGZ1bmRzIHRoZSBhc3NldCBhY2NvdW50IGhhcywgY2F1c2luZyB0aGUgc2VuZGVyIGFzc2V0IGFjY291bnQgdG8gYmUga2lsbGVkRQEgIChmYWxzZSksIG9yIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IGF0IGxlYXN0IHRoZSBtaW5pbXVtIGJhbGFuY2UsIHdoaWNoIHdpbGzoICBndWFyYW50ZWUgdG8ga2VlcCB0aGUgc2VuZGVyIGFzc2V0IGFjY291bnQgYWxpdmUgKHRydWUpLjBzZXRfcmVzZXJ2ZXMIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAASByZXNlcnZlcx0BAchCb3VuZGVkVmVjPFQ6OlJlc2VydmVEYXRhLCBDb25zdFUzMjxNQVhfUkVTRVJWRVM+PgAhJMRTZXRzIHRoZSB0cnVzdGVkIHJlc2VydmUgaW5mb3JtYXRpb24gb2YgYW4gYXNzZXQuAFUBT3JpZ2luIG11c3QgYmUgdGhlIE93bmVyIG9mIHRoZSBhc3NldCBgaWRgLiBUaGUgb3JpZ2luIG11c3QgY29uZm9ybSB0byB0aGUgY29uZmlndXJlZCUBYENyZWF0ZU9yaWdpbmAgb3IgYmUgdGhlIHNpZ25lZCBgb3duZXJgIGNvbmZpZ3VyZWQgZHVyaW5nIGFzc2V0IGNyZWF0aW9uLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQu8C0gYHJlc2VydmVzYDogVGhlIGZ1bGwgbGlzdCBvZiB0cnVzdGVkIHJlc2VydmVzIGluZm9ybWF0aW9uLgDURW1pdHMgYEFzc2V0TWluQmFsYW5jZUNoYW5nZWRgIGV2ZW50IHdoZW4gc3VjY2Vzc2Z1bC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu4BAsc3RhZ2luZ194Y20IdjUgbG9jYXRpb24gTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9y5AEkSnVuY3Rpb25zAADkECxzdGFnaW5nX3hjbQh2NSRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEAOgBSEFyYzxbSnVuY3Rpb247IDFdPgABAAhYMgQAAQEBSEFyYzxbSnVuY3Rpb247IDJdPgACAAhYMwQABQEBSEFyYzxbSnVuY3Rpb247IDNdPgADAAhYNAQACQEBSEFyYzxbSnVuY3Rpb247IDRdPgAEAAhYNQQADQEBSEFyYzxbSnVuY3Rpb247IDVdPgAFAAhYNgQAEQEBSEFyYzxbSnVuY3Rpb247IDZdPgAGAAhYNwQAFQEBSEFyYzxbSnVuY3Rpb247IDddPgAHAAhYOAQAGQEBSEFyYzxbSnVuY3Rpb247IDhdPgAIAADoAAADAQAAAOwA7BAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBABgAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAgBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXi0AQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V5HAEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAwBCHU4AAQAMEdlbmVyYWxJbmRleAQAwAEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoDAEIdTgAARBkYXRhCAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk+AEYQm9keUlkAAEQcGFydPwBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQA9AEkTmV0d29ya0lkAAkAAPAEGE9wdGlvbgQEVAH0AQgQTm9uZQAAABBTb21lBAD0AAABAAD0ECxzdGFnaW5nX3hjbQh2NSBqdW5jdGlvbiROZXR3b3JrSWQAASAkQnlHZW5lc2lzBAAIASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIoAQx1NjQAAShibG9ja19oYXNoCAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAD4EAx4Y20IdjMganVuY3Rpb24YQm9keUlkAAEoEFVuaXQAAAAcTW9uaWtlcgQAcAEcW3U4OyA0XQABABRJbmRleAQAYAEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAAD8EAx4Y20IdjMganVuY3Rpb24gQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW50YAEMdTMyAAEAIEZyYWN0aW9uCAEMbm9tYAEMdTMyAAEUZGVub21gAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub21gAQx1MzIAARRkZW5vbWABDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub21gAQx1MzIAARRkZW5vbWABDHUzMgAEAAABAQAAAwIAAADsAAUBAAADAwAAAOwACQEAAAMEAAAA7AANAQAAAwUAAADsABEBAAADBgAAAOwAFQEAAAMHAAAA7AAZAQAAAwgAAADsAB0BDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBIQEEUwAABAAlAQEYVmVjPFQ+AAAhAQw0YXNzZXRzX2NvbW1vbmBsb2NhbF9hbmRfZm9yZWlnbl9hc3NldHNcRm9yZWlnbkFzc2V0UmVzZXJ2ZURhdGEAAAgBHHJlc2VydmXgASBMb2NhdGlvbgABMHRlbGVwb3J0YWJsZcgBEGJvb2wAACUBAAACIQEAKQEMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBBDYWxsBARUAAEMGGNyZWF0ZQgBKGFzc2V0X2tpbmTgAURCb3g8VDo6QXNzZXRLaW5kPgABEHJhdGUtAQEkRml4ZWRVMTI4AAAQDQFJbml0aWFsaXplIGEgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRh1cGRhdGUIAShhc3NldF9raW5k4AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRlLQEBJEZpeGVkVTEyOAABEAUBVXBkYXRlIHRoZSBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpGHJlbW92ZQQBKGFzc2V0X2tpbmTgAURCb3g8VDo6QXNzZXRLaW5kPgACECUBUmVtb3ZlIGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuLQEMNHNwX2FyaXRobWV0aWMsZml4ZWRfcG9pbnQkRml4ZWRVMTI4AAAEAMQBEHUxMjgAADEBDGRwYWxsZXRfY29sbGF0b3Jfc2VsZWN0aW9uGHBhbGxldBBDYWxsBARUAAEkRHNldF9pbnZ1bG5lcmFibGVzBAEMbmV3zAFEVmVjPFQ6OkFjY291bnRJZD4AADQxAVNldCB0aGUgbGlzdCBvZiBpbnZ1bG5lcmFibGUgKGZpeGVkKSBjb2xsYXRvcnMuIFRoZXNlIGNvbGxhdG9ycyBtdXN0IGRvIHNvbWXQcHJlcGFyYXRpb24sIG5hbWVseSB0byBoYXZlIHJlZ2lzdGVyZWQgc2Vzc2lvbiBrZXlzLgBZAVRoZSBjYWxsIHdpbGwgcmVtb3ZlIGFueSBhY2NvdW50cyB0aGF0IGhhdmUgbm90IHJlZ2lzdGVyZWQga2V5cyBmcm9tIHRoZSBzZXQuIFRoYXQgaXMsXQFpdCBpcyBub24tYXRvbWljOyB0aGUgY2FsbGVyIGFjY2VwdHMgYWxsIGBBY2NvdW50SWRgcyBwYXNzZWQgaW4gYG5ld2AgX2luZGl2aWR1YWxseV8gYXMxAWFjY2VwdGFibGUgSW52dWxuZXJhYmxlcywgYW5kIGlzIG5vdCBwcm9wb3NpbmcgYSBfc2V0XyBvZiBuZXcgSW52dWxuZXJhYmxlcy4AWQFUaGlzIGNhbGwgZG9lcyBub3QgbWFpbnRhaW4gbXV0dWFsIGV4Y2x1c2l2aXR5IG9mIGBJbnZ1bG5lcmFibGVzYCBhbmQgYENhbmRpZGF0ZXNgLiBJdGEBaXMgcmVjb21tZW5kZWQgdG8gdXNlIGEgYmF0Y2ggb2YgYGFkZF9pbnZ1bG5lcmFibGVgIGFuZCBgcmVtb3ZlX2ludnVsbmVyYWJsZWAgaW5zdGVhZC4gQVEBYGJhdGNoX2FsbGAgY2FuIGFsc28gYmUgdXNlZCB0byBlbmZvcmNlIGF0b21pY2l0eS4gSWYgYW55IGNhbmRpZGF0ZXMgYXJlIGluY2x1ZGVkIGluTQFgbmV3YCwgdGhleSBzaG91bGQgYmUgcmVtb3ZlZCB3aXRoIGByZW1vdmVfaW52dWxuZXJhYmxlX2NhbmRpZGF0ZWAgYWZ0ZXIgZXhlY3V0aW9uLgCUTXVzdCBiZSBjYWxsZWQgYnkgdGhlIGBVcGRhdGVPcmlnaW5gLlhzZXRfZGVzaXJlZF9jYW5kaWRhdGVzBAEMbWF4OAEMdTMyAAEUVQFTZXQgdGhlIGlkZWFsIG51bWJlciBvZiBub24taW52dWxuZXJhYmxlIGNvbGxhdG9ycy4gSWYgbG93ZXJpbmcgdGhpcyBudW1iZXIsIHRoZW4gdGhlYQFudW1iZXIgb2YgcnVubmluZyBjb2xsYXRvcnMgY291bGQgYmUgaGlnaGVyIHRoYW4gdGhpcyBmaWd1cmUuIEFzaWRlIGZyb20gdGhhdCBlZGdlIGNhc2UsNQF0aGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgd2F5IHRvIGhhdmUgbW9yZSBjYW5kaWRhdGVzIHRoYW4gdGhlIGRlc2lyZWQgbnVtYmVyLgDQVGhlIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGBVcGRhdGVPcmlnaW5gLkhzZXRfY2FuZGlkYWN5X2JvbmQEARBib25kxAEwQmFsYW5jZU9mPFQ+AAIceFNldCB0aGUgY2FuZGlkYWN5IGJvbmQgYW1vdW50LgBRAUlmIHRoZSBjYW5kaWRhY3kgYm9uZCBpcyBpbmNyZWFzZWQgYnkgdGhpcyBjYWxsLCBhbGwgY3VycmVudCBjYW5kaWRhdGVzIHdoaWNoIGhhdmUgYU0BZGVwb3NpdCBsb3dlciB0aGFuIHRoZSBuZXcgYm9uZCB3aWxsIGJlIGtpY2tlZCBmcm9tIHRoZSBsaXN0IGFuZCBnZXQgdGhlaXIgZGVwb3NpdHMUYmFjay4A0FRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBgVXBkYXRlT3JpZ2luYC5UcmVnaXN0ZXJfYXNfY2FuZGlkYXRlAAMQQQFSZWdpc3RlciB0aGlzIGFjY291bnQgYXMgYSBjb2xsYXRvciBjYW5kaWRhdGUuIFRoZSBhY2NvdW50IG11c3QgKGEpIGFscmVhZHkgaGF2ZR0BcmVnaXN0ZXJlZCBzZXNzaW9uIGtleXMgYW5kIChiKSBiZSBhYmxlIHRvIHJlc2VydmUgdGhlIGBDYW5kaWRhY3lCb25kYC4A3FRoaXMgY2FsbCBpcyBub3QgYXZhaWxhYmxlIHRvIGBJbnZ1bG5lcmFibGVgIGNvbGxhdG9ycy4wbGVhdmVfaW50ZW50AAQUVQFEZXJlZ2lzdGVyIGBvcmlnaW5gIGFzIGEgY29sbGF0b3IgY2FuZGlkYXRlLiBOb3RlIHRoYXQgdGhlIGNvbGxhdG9yIGNhbiBvbmx5IGxlYXZlIG9uDQFzZXNzaW9uIGNoYW5nZS4gVGhlIGBDYW5kaWRhY3lCb25kYCB3aWxsIGJlIHVucmVzZXJ2ZWQgaW1tZWRpYXRlbHkuABkBVGhpcyBjYWxsIHdpbGwgZmFpbCBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbmRpZGF0ZXMgd291bGQgZHJvcCBiZWxvd1xgTWluRWxpZ2libGVDb2xsYXRvcnNgLkBhZGRfaW52dWxuZXJhYmxlBAEMd2hvBAEwVDo6QWNjb3VudElkAAUQRQFBZGQgYSBuZXcgYWNjb3VudCBgd2hvYCB0byB0aGUgbGlzdCBvZiBgSW52dWxuZXJhYmxlc2AgY29sbGF0b3JzLiBgd2hvYCBtdXN0IGhhdmUdAXJlZ2lzdGVyZWQgc2Vzc2lvbiBrZXlzLiBJZiBgd2hvYCBpcyBhIGNhbmRpZGF0ZSwgdGhleSB3aWxsIGJlIHJlbW92ZWQuANBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgYFVwZGF0ZU9yaWdpbmAuTHJlbW92ZV9pbnZ1bG5lcmFibGUEAQx3aG8EATBUOjpBY2NvdW50SWQABhBhAVJlbW92ZSBhbiBhY2NvdW50IGB3aG9gIGZyb20gdGhlIGxpc3Qgb2YgYEludnVsbmVyYWJsZXNgIGNvbGxhdG9ycy4gYEludnVsbmVyYWJsZXNgIG11c3QoYmUgc29ydGVkLgDQVGhlIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGBVcGRhdGVPcmlnaW5gLix1cGRhdGVfYm9uZAQBLG5ld19kZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAccXQFVcGRhdGUgdGhlIGNhbmRpZGFjeSBib25kIG9mIGNvbGxhdG9yIGNhbmRpZGF0ZSBgb3JpZ2luYCB0byBhIG5ldyBhbW91bnQgYG5ld19kZXBvc2l0YC4AQQFTZXR0aW5nIGEgYG5ld19kZXBvc2l0YCB0aGF0IGlzIGxvd2VyIHRoYW4gdGhlIGN1cnJlbnQgZGVwb3NpdCB3aGlsZSBgb3JpZ2luYCBpc+BvY2N1cHlpbmcgYSB0b3AtYERlc2lyZWRDYW5kaWRhdGVzYCBzbG90IGlzIG5vdCBhbGxvd2VkLgBZAVRoaXMgY2FsbCB3aWxsIGZhaWwgaWYgYG9yaWdpbmAgaXMgbm90IGEgY29sbGF0b3IgY2FuZGlkYXRlLCB0aGUgdXBkYXRlZCBib25kIGlzIGxvd2VyGQF0aGFuIHRoZSBtaW5pbXVtIGNhbmRpZGFjeSBib25kLCBhbmQvb3IgdGhlIGFtb3VudCBjYW5ub3QgYmUgcmVzZXJ2ZWQuTHRha2VfY2FuZGlkYXRlX3Nsb3QIARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAEYdGFyZ2V0BAEwVDo6QWNjb3VudElkAAgcTQFUaGUgY2FsbGVyIGBvcmlnaW5gIHJlcGxhY2VzIGEgY2FuZGlkYXRlIGB0YXJnZXRgIGluIHRoZSBjb2xsYXRvciBjYW5kaWRhdGUgbGlzdCBieVUBcmVzZXJ2aW5nIGBkZXBvc2l0YC4gVGhlIGFtb3VudCBgZGVwb3NpdGAgcmVzZXJ2ZWQgYnkgdGhlIGNhbGxlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbuB0aGUgZXhpc3RpbmcgYm9uZCBvZiB0aGUgdGFyZ2V0IGl0IGlzIHRyeWluZyB0byByZXBsYWNlLgBZAVRoaXMgY2FsbCB3aWxsIGZhaWwgaWYgdGhlIGNhbGxlciBpcyBhbHJlYWR5IGEgY29sbGF0b3IgY2FuZGlkYXRlIG9yIGludnVsbmVyYWJsZSwgdGhlVQFjYWxsZXIgZG9lcyBub3QgaGF2ZSByZWdpc3RlcmVkIHNlc3Npb24ga2V5cywgdGhlIHRhcmdldCBpcyBub3QgYSBjb2xsYXRvciBjYW5kaWRhdGUsvGFuZC9vciB0aGUgYGRlcG9zaXRgIGFtb3VudCBjYW5ub3QgYmUgcmVzZXJ2ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjUBDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXM5AQEcVDo6S2V5cwABFHByb29mGAEcVmVjPHU4PgAALORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4AHQFBbGxvd3MgYW4gYWNjb3VudCB0byBzZXQgaXRzIHNlc3Npb24ga2V5IHByaW9yIHRvIGJlY29taW5nIGEgdmFsaWRhdG9yLsBUaGlzIGRvZXNuJ3QgdGFrZSBlZmZlY3QgdW50aWwgdGhlIG5leHQgc2Vzc2lvbi4AAQEtIGBvcmlnaW5gOiBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBzaWduZWQuVQEtIGBrZXlzYDogVGhlIG5ldyBzZXNzaW9uIGtleXMgdG8gc2V0LiBUaGVzZSBhcmUgdGhlIHB1YmxpYyBrZXlzIG9mIGFsbCBzZXNzaW9ucyBrZXlzXCAgc2V0dXAgaW4gdGhlIHJ1bnRpbWUuQQEtIGBwcm9vZmA6IFRoZSBwcm9vZiB0aGF0IGBvcmlnaW5gIGhhcyBhY2Nlc3MgdG8gdGhlIHByaXZhdGUga2V5cyBvZiBga2V5c2AuIFNlZU0BICBbYGltcGxfb3BhcXVlX2tleXNgXShzcF9ydW50aW1lOjppbXBsX29wYXF1ZV9rZXlzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGU8ICBwcm9vZiBmb3JtYXQuKHB1cmdlX2tleXMAASDIUmVtb3ZlcyBhbnkgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlci4AwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSBlaXRoZXIgYmVdAWNvbnZlcnRpYmxlIHRvIGEgdmFsaWRhdG9yIElEIHVzaW5nIHRoZSBjaGFpbidzIHR5cGljYWwgYWRkcmVzc2luZyBzeXN0ZW0gKHRoaXMgdXN1YWxseVEBbWVhbnMgYmVpbmcgYSBjb250cm9sbGVyIGFjY291bnQpIG9yIGRpcmVjdGx5IGNvbnZlcnRpYmxlIGludG8gYSB2YWxpZGF0b3IgSUQgKHdoaWNolHVzdWFsbHkgbWVhbnMgYmVpbmcgYSBzdGFzaCBhY2NvdW50KS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuOQEIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUsU2Vzc2lvbktleXMAAAQBEGF1cmE9AQHEPEF1cmEgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwAAPQEQRHNwX2NvbnNlbnN1c19hdXJhHHNyMjU1MTksYXBwX3NyMjU1MTkYUHVibGljAAAEAAgBPHNyMjU1MTk6OlB1YmxpYwAAQQEMZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWUYcGFsbGV0EENhbGwEBFQAARRUc3VzcGVuZF94Y21fZXhlY3V0aW9uAAEMSQFTdXNwZW5kcyBhbGwgWENNIGV4ZWN1dGlvbnMgZm9yIHRoZSBYQ01QIHF1ZXVlLCByZWdhcmRsZXNzIG9mIHRoZSBzZW5kZXIncyBvcmlnaW4uAKQtIGBvcmlnaW5gOiBNdXN0IHBhc3MgYENvbnRyb2xsZXJPcmlnaW5gLlByZXN1bWVfeGNtX2V4ZWN1dGlvbgACFLhSZXN1bWVzIGFsbCBYQ00gZXhlY3V0aW9ucyBmb3IgdGhlIFhDTVAgcXVldWUuAD0BTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGFuZ2UgdGhlIHN0YXR1cyBvZiB0aGUgaW4vb3V0IGJvdW5kIGNoYW5uZWxzLgCkLSBgb3JpZ2luYDogTXVzdCBwYXNzIGBDb250cm9sbGVyT3JpZ2luYC5gdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkBAEMbmV3OAEMdTMyAAMUSQFPdmVyd3JpdGVzIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggbXVzdCBiZSBpbiB0aGUgcXVldWUgZm9yIHRoZSBvdGhlciBzaWRlIHRvIGJleHRvbGQgdG8gc3VzcGVuZCB0aGVpciBzZW5kaW5nLgB0LSBgb3JpZ2luYDogTXVzdCBwYXNzIGBSb290YC7oLSBgbmV3YDogRGVzaXJlZCB2YWx1ZSBmb3IgYFF1ZXVlQ29uZmlnRGF0YS5zdXNwZW5kX3ZhbHVlYFR1cGRhdGVfZHJvcF90aHJlc2hvbGQEAQxuZXc4AQx1MzIABBRFAU92ZXJ3cml0ZXMgdGhlIG51bWJlciBvZiBwYWdlcyB3aGljaCBtdXN0IGJlIGluIHRoZSBxdWV1ZSBhZnRlciB3aGljaCB3ZSBkcm9wIGFueYhmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gdGhlIGNoYW5uZWwuAHQtIGBvcmlnaW5gOiBNdXN0IHBhc3MgYFJvb3RgLuwtIGBuZXdgOiBEZXNpcmVkIHZhbHVlIGZvciBgUXVldWVDb25maWdEYXRhLmRyb3BfdGhyZXNob2xkYFx1cGRhdGVfcmVzdW1lX3RocmVzaG9sZAQBDG5ldzgBDHUzMgAFFE0BT3ZlcndyaXRlcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIHRoZSBxdWV1ZSBtdXN0IGJlIHJlZHVjZWQgdG8gYmVmb3JlIGl0IHNpZ25hbHMBAXRoYXQgbWVzc2FnZSBzZW5kaW5nIG1heSByZWNvbW1lbmNlIGFmdGVyIGl0IGhhcyBiZWVuIHN1c3BlbmRlZC4AdC0gYG9yaWdpbmA6IE11c3QgcGFzcyBgUm9vdGAu9C0gYG5ld2A6IERlc2lyZWQgdmFsdWUgZm9yIGBRdWV1ZUNvbmZpZ0RhdGEucmVzdW1lX3RocmVzaG9sZGAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQEMKHBhbGxldF94Y20YcGFsbGV0EENhbGwEBFQAAUQQc2VuZAgBEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABHG1lc3NhZ2WVAQFUQm94PFZlcnNpb25lZFhjbTwoKT4+AAAAPHRlbGVwb3J0X2Fzc2V0cxABEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbTgBDHUzMgABSBEBVGVsZXBvcnQgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gc29tZSBkZXN0aW5hdGlvbiBjaGFpbi4AHQEqKlRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDogVXNlIGBsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0c2AgaW5zdGVhZC4qKgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYC4gVGhlIHdlaWdodCBsaW1pdCBmb3IgZmVlcyBpcyBub3QgcHJvdmlkZWQgYW5kIHRodXMgaXMgdW5saW1pdGVkLLR3aXRoIGFsbCBmZWVzIHRha2VuIGFzIG5lZWRlZCBmcm9tIHRoZSBhc3NldC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzEAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAJ4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4APQEqKlRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDogVXNlIGBsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy4cZXhlY3V0ZQgBHG1lc3NhZ2XdAgG0Qm94PFZlcnNpb25lZFhjbTw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4+AAEobWF4X3dlaWdodNUBARhXZWlnaHQAAyDQRXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSBmcm9tIGEgbG9jYWwsIHNpZ25lZCwgb3JpZ2luLgBNAUFuIGV2ZW50IGlzIGRlcG9zaXRlZCBpbmRpY2F0aW5nIHdoZXRoZXIgYG1zZ2AgY291bGQgYmUgZXhlY3V0ZWQgY29tcGxldGVseSBvciBvbmx5KHBhcnRpYWxseS4AXQFObyBtb3JlIHRoYW4gYG1heF93ZWlnaHRgIHdpbGwgYmUgdXNlZCBpbiBpdHMgYXR0ZW1wdGVkIGV4ZWN1dGlvbi4gSWYgdGhpcyBpcyBsZXNzIHRoYW5BAXRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgdGhhdCB0aGUgbWVzc2FnZSBjb3VsZCB0YWtlIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIG5vfGV4ZWN1dGlvbiBhdHRlbXB0IHdpbGwgYmUgbWFkZS5EZm9yY2VfeGNtX3ZlcnNpb24IASBsb2NhdGlvbuABNEJveDxMb2NhdGlvbj4AARx2ZXJzaW9uOAEoWGNtVmVyc2lvbgAEGEkBRXh0b2xsIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIGNhbiBiZSBjb21tdW5pY2F0ZWQgd2l0aCB0aHJvdWdoIGEgcGFydGljdWxhcjx2ZXJzaW9uIG9mIFhDTS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7YLSBgbG9jYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdGhhdCBpcyBiZWluZyBkZXNjcmliZWQuEQEtIGB4Y21fdmVyc2lvbmA6IFRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYQ00gdGhhdCBgbG9jYXRpb25gIHN1cHBvcnRzLmRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uBAFEbWF5YmVfeGNtX3ZlcnNpb24JAwFIT3B0aW9uPFhjbVZlcnNpb24+AAUUWQFTZXQgYSBzYWZlIFhDTSB2ZXJzaW9uICh0aGUgdmVyc2lvbiB0aGF0IFhDTSBzaG91bGQgYmUgZW5jb2RlZCB3aXRoIGlmIHRoZSBtb3N0IHJlY2VudLR2ZXJzaW9uIGEgZGVzdGluYXRpb24gY2FuIGFjY2VwdCBpcyB1bmtub3duKS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi45AS0gYG1heWJlX3hjbV92ZXJzaW9uYDogVGhlIGRlZmF1bHQgWENNIGVuY29kaW5nIHZlcnNpb24sIG9yIGBOb25lYCB0byBkaXNhYmxlLnhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAYQOQFBc2sgYSBsb2NhdGlvbiB0byBub3RpZnkgdXMgcmVnYXJkaW5nIHRoZWlyIFhDTSB2ZXJzaW9uIGFuZCBhbnkgY2hhbmdlcyB0byBpdC4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi5ZAS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIHNob3VsZCBzdWJzY3JpYmUgZm9yIFhDTSB2ZXJzaW9uIG5vdGlmaWNhdGlvbnMugGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb25JAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAHGEkBUmVxdWlyZSB0aGF0IGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG5vdGlmeSB1cyByZWdhcmRpbmcgYW55IFhDTUB2ZXJzaW9uIGNoYW5nZXMuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uPQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBhcmUgY3VycmVudGx5IHN1YnNjcmliZWQgZm9yIFhDTSB2ZXJzaW9uqCAgbm90aWZpY2F0aW9ucyB3aGljaCB3ZSBubyBsb25nZXIgZGVzaXJlLnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzFAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0AAh4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzFAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0AAlIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5AZm9yY2Vfc3VzcGVuc2lvbgQBJHN1c3BlbmRlZMgBEGJvb2wAChD0U2V0IG9yIHVuc2V0IHRoZSBnbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtAtIGBzdXNwZW5kZWRgOiBgdHJ1ZWAgdG8gc3VzcGVuZCwgYGZhbHNlYCB0byByZXN1bWUuPHRyYW5zZmVyX2Fzc2V0cxQBEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbTgBDHUzMgABMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAALhF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWws0GRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLCBvciB0aHJvdWdoIHRlbGVwb3J0cy4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2Y1AWluZGV4IGBmZWVfYXNzZXRfaXRlbWAgKGhlbmNlIHJlZmVycmVkIHRvIGFzIGBmZWVzYCksIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yQQFgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0IGlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZdxvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAGEBYGFzc2V0c2AgKGV4Y2x1ZGluZyBgZmVlc2ApIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3Igb3RoZXJ3aXNlIGJlIHRlbGVwb3J0YWJsZbB0byBgZGVzdGAsIG5vIGxpbWl0YXRpb25zIGltcG9zZWQgb24gYGZlZXNgLk0BIC0gZm9yIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbiBjaGFpbiBhbmRNASAgIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvRCAgIGBiZW5lZmljaWFyeWAuYQEgLSBmb3IgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG8gYGRlc3RgIGNoYWluWQEgICB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5kIGRlcG9zaXQgdGhlbVAgICB0byBgYmVuZWZpY2lhcnlgLl0BIC0gZm9yIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlIHJlc2VydmVzXQEgICBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3RgIHRvIG1pbnTUICAgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5RASAtIGZvciB0ZWxlcG9ydHM6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG8gbWludC90ZWxlcG9ydLAgICBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uLQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFgyKFBhcmVudCxVASAgUGFyYWNoYWluKC4uKSlgIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgWDEoUGFyYWNoYWluKC4uKSlgIHRvIHNlbmRoICBmcm9tIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4wY2xhaW1fYXNzZXRzCAEYYXNzZXRz2QIBUEJveDxWZXJzaW9uZWRBc3NldHM+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAMGFUBQ2xhaW1zIGFzc2V0cyB0cmFwcGVkIG9uIHRoaXMgcGFsbGV0IGJlY2F1c2Ugb2YgbGVmdG92ZXIgYXNzZXRzIGR1cmluZyBYQ00gZXhlY3V0aW9uLgCsLSBgb3JpZ2luYDogQW55b25lIGNhbiBjYWxsIHRoaXMgZXh0cmluc2ljLl0BLSBgYXNzZXRzYDogVGhlIGV4YWN0IGFzc2V0cyB0aGF0IHdlcmUgdHJhcHBlZC4gVXNlIHRoZSB2ZXJzaW9uIHRvIHNwZWNpZnkgd2hhdCB2ZXJzaW9umHdhcyB0aGUgbGF0ZXN0IHdoZW4gdGhleSB3ZXJlIHRyYXBwZWQuRQEtIGBiZW5lZmljaWFyeWA6IFRoZSBsb2NhdGlvbi9hY2NvdW50IHdoZXJlIHRoZSBjbGFpbWVkIGFzc2V0cyB3aWxsIGJlIGRlcG9zaXRlZC6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4cARBkZXN0SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAVBhc3NldHNfdHJhbnNmZXJfdHlwZQ0DAURCb3g8VHJhbnNmZXJUeXBlPgABOHJlbW90ZV9mZWVzX2lkEQMBVEJveDxWZXJzaW9uZWRBc3NldElkPgABSGZlZXNfdHJhbnNmZXJfdHlwZQ0DAURCb3g8VHJhbnNmZXJUeXBlPgABSGN1c3RvbV94Y21fb25fZGVzdJUBAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQADcBVAVRyYW5zZmVyIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdXNpbmcgZXhwbGljaXQgdHJhbnNmZXJodHlwZXMgZm9yIGFzc2V0cyBhbmQgZmVlcy4AWQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG1heSBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLiBDYWxsZXIgbXVzdOxwcm92aWRlIHRoZSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgIHRvIGJlIHVzZWQgZm9yIGBhc3NldHNgOlEBIC0gYFRyYW5zZmVyVHlwZTo6TG9jYWxSZXNlcnZlYDogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OkRlc3RpbmF0aW9uUmVzZXJ2ZWA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OlJlbW90ZVJlc2VydmUocmVzZXJ2ZSlgOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gYHJlc2VydmVgYQEgICBjaGFpbiB0byBtb3ZlIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyVQEgICBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4gVHlwaWNhbGx5lCAgIHRoZSByZW1vdGUgYHJlc2VydmVgIGlzIEFzc2V0IEh1Yi5FASAtIGBUcmFuc2ZlclR5cGU6OlRlbGVwb3J0YDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0b+ggICBtaW50L3RlbGVwb3J0IGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuAFUBT24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLCBhcyB3ZWxsIGFzIGFueSBpbnRlcm1lZGlhcnkgaG9wcywgYEJ1eUV4ZWN1dGlvbmAgaXMgdXNlZCB0byEBYnV5IGV4ZWN1dGlvbiB1c2luZyB0cmFuc2ZlcnJlZCBgYXNzZXRzYCBpZGVudGlmaWVkIGJ5IGByZW1vdGVfZmVlc19pZGAuWQFNYWtlIHN1cmUgZW5vdWdoIG9mIHRoZSBzcGVjaWZpZWQgYHJlbW90ZV9mZWVzX2lkYCBhc3NldCBpcyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbGlzdGEBb2YgYGFzc2V0c2AuIGByZW1vdGVfZmVlc19pZGAgc2hvdWxkIGJlIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgLiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4ARQFgcmVtb3RlX2ZlZXNfaWRgIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zZmVyIHR5cGUgdGhhbiByZXN0IG9mIGBhc3NldHNgIGFuZCBjYW4gYmWcc3BlY2lmaWVkIHRocm91Z2ggYGZlZXNfdHJhbnNmZXJfdHlwZWAuAGEBVGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiB0byB0aGUgdHJhbnNmZXJyZWQgYXNzZXRzIG9uY2UgdGhleSByZWFjaEEBdGhlIGBkZXN0YCBjaGFpbi4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjdXN0b21feGNtX29uX2Rlc3RgIHBhcmFtZXRlciwgd2hpY2j8Y29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0byBleGVjdXRlIG9uIGBkZXN0YCBhcyBhIGZpbmFsIHN0ZXAufCAgVGhpcyBpcyB1c3VhbGx5IGFzIHNpbXBsZSBhczpRASAgYFhjbSh2ZWMhW0RlcG9zaXRBc3NldCB7IGFzc2V0czogV2lsZChBbGxDb3VudGVkKGFzc2V0cy5sZW4oKSkpLCBiZW5lZmljaWFyeSB9XSlgLDEBICBidXQgY291bGQgYmUgc29tZXRoaW5nIG1vcmUgZXhvdGljIGxpa2Ugc2VuZGluZyB0aGUgYGFzc2V0c2AgZXZlbiBmdXJ0aGVyLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tPQEgIHJlbGF5IHRvIHBhcmFjaGFpbiwgb3IgYChwYXJlbnRzOiAyLCAoR2xvYmFsQ29uc2Vuc3VzKC4uKSwgLi4pKWAgdG8gc2VuZCBmcm9t9CAgcGFyYWNoYWluIGFjcm9zcyBhIGJyaWRnZSB0byBhbm90aGVyIGVjb3N5c3RlbSBkZXN0aW5hdGlvbi5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuPQEtIGBhc3NldHNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGFzc2V0c2AuIQEtIGByZW1vdGVfZmVlc19pZGA6IE9uZSBvZiB0aGUgaW5jbHVkZWQgYGFzc2V0c2AgdG8gYmUgdXNlZCB0byBwYXkgZmVlcy5JAS0gYGZlZXNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGZlZXNgIGFzc2V0cy5ZAS0gYGN1c3RvbV94Y21fb25fZGVzdGA6IFRoZSBYQ00gdG8gYmUgZXhlY3V0ZWQgb24gYGRlc3RgIGNoYWluIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlWQEgIHRyYW5zZmVyLCB3aGljaCBhbHNvIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIHRoZSBhc3NldHMgb24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuUGFkZF9hdXRob3JpemVkX2FsaWFzCAEcYWxpYXNlckkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcZXhwaXJlcxUDASxPcHRpb248dTY0PgAOLF0BQXV0aG9yaXplIGFub3RoZXIgYGFsaWFzZXJgIGxvY2F0aW9uIHRvIGFsaWFzIGludG8gdGhlIGxvY2FsIGBvcmlnaW5gIG1ha2luZyB0aGlzIGNhbGwuKQFUaGUgYGFsaWFzZXJgIGlzIG9ubHkgYXV0aG9yaXplZCB1bnRpbCB0aGUgcHJvdmlkZWQgYGV4cGlyeWAgYmxvY2sgbnVtYmVyLkkBVGhlIGNhbGwgY2FuIGFsc28gYmUgdXNlZCBmb3IgYSBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYWxpYXMgaW4gb3JkZXIgdG8gdXBkYXRlIGl0c1hgZXhwaXJ5YCBibG9jayBudW1iZXIuAFEBVXN1YWxseSB1c2VmdWwgdG8gYWxsb3cgeW91ciBsb2NhbCBhY2NvdW50IHRvIGJlIGFsaWFzZWQgaW50byBmcm9tIGEgcmVtb3RlIGxvY2F0aW9u9GFsc28gdW5kZXIgeW91ciBjb250cm9sIChsaWtlIHlvdXIgYWNjb3VudCBvbiBhbm90aGVyIGNoYWluKS4AUQFXQVJOSU5HOiBtYWtlIHN1cmUgdGhlIGNhbGxlciBgb3JpZ2luYCAoeW91KSB0cnVzdHMgdGhlIGBhbGlhc2VyYCBsb2NhdGlvbiB0byBhY3QgaW5ZAXRoZWlyL3lvdXIgbmFtZS4gT25jZSBhdXRob3JpemVkIHVzaW5nIHRoaXMgY2FsbCwgdGhlIGBhbGlhc2VyYCBjYW4gZnJlZWx5IGltcGVyc29uYXRl1GBvcmlnaW5gIGluIFhDTSBwcm9ncmFtcyBleGVjdXRlZCBvbiB0aGUgbG9jYWwgY2hhaW4uXHJlbW92ZV9hdXRob3JpemVkX2FsaWFzBAEcYWxpYXNlckkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AA8IXQFSZW1vdmUgYSBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYGFsaWFzZXJgIGZyb20gdGhlIGxpc3Qgb2YgbG9jYXRpb25zIHRoYXQgY2FuIGFsaWFzIGludG+QdGhlIGxvY2FsIGBvcmlnaW5gIG1ha2luZyB0aGlzIGNhbGwudHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzABAISQFSZW1vdmUgYWxsIHByZXZpb3VzbHkgYXV0aG9yaXplZCBgYWxpYXNlcmBzIHRoYXQgY2FuIGFsaWFzIGludG8gdGhlIGxvY2FsIGBvcmlnaW5gRG1ha2luZyB0aGlzIGNhbGwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkBCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjMEAE0BAUR2Mzo6TXVsdGlMb2NhdGlvbgADAAhWNAQAYQEBMHY0OjpMb2NhdGlvbgAEAAhWNQQA4AEwdjU6OkxvY2F0aW9uAAUAAE0BECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9yUQEBJEp1bmN0aW9ucwAAUQEQDHhjbQh2MyRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEAFUBASBKdW5jdGlvbgABAAhYMggAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAgAIWDMMAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAwAIWDQQAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAEAAhYNRQAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ABQAIWDYYAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ABgAIWDccAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAHAAhYOCAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ACAAAVQEQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAGABDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmtZAQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAgBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya1kBAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4tAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmtZAQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXkcASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQADAEIdTgABAAwR2VuZXJhbEluZGV4BADAARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgMAQh1OAABEGRhdGEIASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWT4ARhCb2R5SWQAARBwYXJ0/AEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBABdAQEkTmV0d29ya0lkAAkAAFkBBBhPcHRpb24EBFQBXQEBCBBOb25lAAAAEFNvbWUEAF0BAAABAABdARAMeGNtCHYzIGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAgBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcigBDHU2NAABKGJsb2NrX2hhc2gIASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAABhARAsc3RhZ2luZ194Y20IdjQgbG9jYXRpb24gTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9yZQEBJEp1bmN0aW9ucwAAZQEQLHN0YWdpbmdfeGNtCHY0JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAaQEBSEFyYzxbSnVuY3Rpb247IDFdPgABAAhYMgQAeQEBSEFyYzxbSnVuY3Rpb247IDJdPgACAAhYMwQAfQEBSEFyYzxbSnVuY3Rpb247IDNdPgADAAhYNAQAgQEBSEFyYzxbSnVuY3Rpb247IDRdPgAEAAhYNQQAhQEBSEFyYzxbSnVuY3Rpb247IDVdPgAFAAhYNgQAiQEBSEFyYzxbSnVuY3Rpb247IDZdPgAGAAhYNwQAjQEBSEFyYzxbSnVuY3Rpb247IDddPgAHAAhYOAQAkQEBSEFyYzxbSnVuY3Rpb247IDhdPgAIAABpAQAAAwEAAABtAQBtARAsc3RhZ2luZ194Y20IdjQganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBABgAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrcQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQIASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmtxAQFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleLQBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrcQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V5HAEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAwBCHU4AAQAMEdlbmVyYWxJbmRleAQAwAEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoDAEIdTgAARBkYXRhCAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk+AEYQm9keUlkAAEQcGFydPwBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAdQEBJE5ldHdvcmtJZAAJAABxAQQYT3B0aW9uBARUAXUBAQgQTm9uZQAAABBTb21lBAB1AQAAAQAAdQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAgBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcigBDHU2NAABKGJsb2NrX2hhc2gIASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAB5AQAAAwIAAABtAQB9AQAAAwMAAABtAQCBAQAAAwQAAABtAQCFAQAAAwUAAABtAQCJAQAAAwYAAABtAQCNAQAAAwcAAABtAQCRAQAAAwgAAABtAQCVAQgMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAJkBAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAEQIBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BABdAgFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAAmQEMDHhjbQh2MwxYY20EEENhbGwAAAQAnQEBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAJ0BAAACoQEAoQEMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAClAQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAClAQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQApQEBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZLQBHFF1ZXJ5SWQAASByZXNwb25zZcUBASBSZXNwb25zZQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAEccXVlcmllcvEBAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5TQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHOlAQEsTXVsdGlBc3NldHMAARBkZXN0TQEBNE11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5k9QEBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N01QEBGFdlaWdodAABEGNhbGz5AQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBABRAQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAD9AQFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeU0BATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlAQIBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW50pQEBLE11bHRpQXNzZXRzAAEcbWF4aW1hbMgBEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZv/QEBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc60BAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACZAQEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACZAQEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABGHRpY2tldE0BATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQApQEBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAClAQEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADxAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/9AQFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAD9AQFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAFUBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya10BASROZXR3b3JrSWQAASxkZXN0aW5hdGlvblEBAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldK0BAShNdWx0aUFzc2V0AAEgdW5sb2NrZXJNAQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARh0YXJnZXRNAQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARRvd25lck0BATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldK0BAShNdWx0aUFzc2V0AAEYbG9ja2VyTQEBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBABNAQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7xAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAKUBEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACpAQE8VmVjPE11bHRpQXNzZXQ+AACpAQAAAq0BAK0BEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZLEBARxBc3NldElkAAEMZnVutQEBLEZ1bmdpYmlsaXR5AACxARAMeGNtCHYzKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQATQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEAAgBIFt1ODsgMzJdAAEAALUBEAx4Y20IdjMobXVsdGlhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQAwAEQdTEyOAAAACxOb25GdW5naWJsZQQAuQEBNEFzc2V0SW5zdGFuY2UAAQAAuQEQDHhjbQh2MyhtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADAARB1MTI4AAEAGEFycmF5NAQAcAEcW3U4OyA0XQACABhBcnJheTgEAL0BARxbdTg7IDhdAAMAHEFycmF5MTYEAMEBASBbdTg7IDE2XQAEABxBcnJheTMyBAAIASBbdTg7IDMyXQAFAAC9AQAAAwgAAAAMAMEBAAADEAAAAAwAxQEMDHhjbQh2MyBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQApQEBLE11bHRpQXNzZXRzAAEAPEV4ZWN1dGlvblJlc3VsdAQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AAIAHFZlcnNpb24EADgBOHN1cGVyOjpWZXJzaW9uAAMALFBhbGxldHNJbmZvBADZAQGYQm91bmRlZFZlYzxQYWxsZXRJbmZvLCBNYXhQYWxsZXRzSW5mbz4ABAA4RGlzcGF0Y2hSZXN1bHQEAOkBAThNYXliZUVycm9yQ29kZQAFAADJAQQYT3B0aW9uBARUAc0BAQgQTm9uZQAAABBTb21lBADNAQAAAQAAzQEAAAQIONEBANEBEAx4Y20IdjMYdHJhaXRzFEVycm9yAAGgIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwAwTG9jYXRpb25GdWxsAAQAVExvY2F0aW9uTm90SW52ZXJ0aWJsZQAFACRCYWRPcmlnaW4ABgA8SW52YWxpZExvY2F0aW9uAAcANEFzc2V0Tm90Rm91bmQACABURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAkAPE5vdFdpdGhkcmF3YWJsZQAKAEhMb2NhdGlvbkNhbm5vdEhvbGQACwBURXhjZWVkc01heE1lc3NhZ2VTaXplAAwAWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQADQAkVHJhbnNwb3J0AA4AKFVucm91dGFibGUADwAwVW5rbm93bkNsYWltABAAOEZhaWxlZFRvRGVjb2RlABEAQE1heFdlaWdodEludmFsaWQAEgA4Tm90SG9sZGluZ0ZlZXMAEwAwVG9vRXhwZW5zaXZlABQAEFRyYXAEACgBDHU2NAAVAEBFeHBlY3RhdGlvbkZhbHNlABYAOFBhbGxldE5vdEZvdW5kABcAME5hbWVNaXNtYXRjaAAYAExWZXJzaW9uSW5jb21wYXRpYmxlABkAUEhvbGRpbmdXb3VsZE92ZXJmbG93ABoALEV4cG9ydEVycm9yABsAOFJlYW5jaG9yRmFpbGVkABwAGE5vRGVhbAAdAChGZWVzTm90TWV0AB4AJExvY2tFcnJvcgAfADBOb1Blcm1pc3Npb24AIAAoVW5hbmNob3JlZAAhADhOb3REZXBvc2l0YWJsZQAiAExVbmhhbmRsZWRYY21WZXJzaW9uACMASFdlaWdodExpbWl0UmVhY2hlZAQA1QEBGFdlaWdodAAkABxCYXJyaWVyACUATFdlaWdodE5vdENvbXB1dGFibGUAJgBERXhjZWVkc1N0YWNrTGltaXQAJwAA1QEMKHNwX3dlaWdodHMkd2VpZ2h0X3YyGFdlaWdodAAACAEgcmVmX3RpbWW0AQx1NjQAAShwcm9vZl9zaXpltAEMdTY0AADZAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAd0BBFMAAAQA5QEBGFZlYzxUPgAA3QEMDHhjbQh2MyhQYWxsZXRJbmZvAAAYARRpbmRleGABDHUzMgABEG5hbWXhAQGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZeEBAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yYAEMdTMyAAEUbWlub3JgAQx1MzIAARRwYXRjaGABDHUzMgAA4QEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADlAQAAAt0BAOkBDAx4Y20IdjM4TWF5YmVFcnJvckNvZGUAAQwcU3VjY2VzcwAAABRFcnJvcgQA7QEBjEJvdW5kZWRWZWM8dTgsIE1heERpc3BhdGNoRXJyb3JMZW4+AAEAOFRydW5jYXRlZEVycm9yBADtAQGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAgAA7QEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADxAQQYT3B0aW9uBARUAU0BAQgQTm9uZQAAABBTb21lBABNAQAAAQAA9QEMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAA+QEMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkGAEcVmVjPHU4PgAA/QEMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb25NAQE0TXVsdGlMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAABAhAMeGNtCHYzKG11bHRpYXNzZXRATXVsdGlBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQApQEBLE11bHRpQXNzZXRzAAAAEFdpbGQEAAUCAThXaWxkTXVsdGlBc3NldAABAAAFAhAMeGNtCHYzKG11bHRpYXNzZXQ4V2lsZE11bHRpQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWSxAQEcQXNzZXRJZAABDGZ1bgkCATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQAYAEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlksQEBHEFzc2V0SWQAAQxmdW4JAgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnRgAQx1MzIAAwAACQIQDHhjbQh2MyhtdWx0aWFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAAANAgwMeGNtCHYzLFdlaWdodExpbWl0AAEIJFVubGltaXRlZAAAABxMaW1pdGVkBADVAQEYV2VpZ2h0AAEAABECDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAFQIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AABUCAAACGQIAGQIMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAB0CARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAAdAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAB0CARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlNQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVySQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cx0CARhBc3NldHMAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cx0CARhBc3NldHMAARBkZXN0YQEBIExvY2F0aW9uAAEMeGNtEQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdNUBARhXZWlnaHQAARBjYWxs+QEBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAZQEBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAE0CAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNRAgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlUQIBLEFzc2V0RmlsdGVyAAEQd2FudB0CARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c1ECASxBc3NldEZpbHRlcgABHHJlc2VydmVhAQEgTG9jYXRpb24AAQx4Y20RAgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMlAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEABECASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEABECASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzHQIBGEFzc2V0cwABGHRpY2tldGEBASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAB0CARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAB0CARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBABJAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQATQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBABtAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmt1AQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb25lAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbRECARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0JQIBFEFzc2V0AAEgdW5sb2NrZXJhAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldCUCARRBc3NldAABGHRhcmdldGEBASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0JQIBFEFzc2V0AAEUb3duZXJhAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0JQIBFEFzc2V0AAEYbG9ja2VyYQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3yAEQYm9vbAArACBTZXRUb3BpYwQACAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQAYQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbkkCAUBPcHRpb248TG9jYXRpb24+AC8AAB0CECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAIQIBKFZlYzxBc3NldD4AACECAAACJQIAJQIQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZCkCARxBc3NldElkAAEMZnVuLQIBLEZ1bmdpYmlsaXR5AAApAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABABhAQEgTG9jYXRpb24AAC0CECxzdGFnaW5nX3hjbQh2NBRhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQAwAEQdTEyOAAAACxOb25GdW5naWJsZQQAMQIBNEFzc2V0SW5zdGFuY2UAAQAAMQIQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADAARB1MTI4AAEAGEFycmF5NAQAcAEcW3U4OyA0XQACABhBcnJheTgEAL0BARxbdTg7IDhdAAMAHEFycmF5MTYEAMEBASBbdTg7IDE2XQAEABxBcnJheTMyBAAIASBbdTg7IDMyXQAFAAA1Agwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAB0CARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAOAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EADkCAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQA6QEBOE1heWJlRXJyb3JDb2RlAAUAADkCDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBPQIEUwAABABFAgEYVmVjPFQ+AAA9Agwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXhgAQx1MzIAARBuYW1lQQIBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVBAgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcmABDHUzMgABFG1pbm9yYAEMdTMyAAEUcGF0Y2hgAQx1MzIAAEECDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAARQIAAAI9AgBJAgQYT3B0aW9uBARUAWEBAQgQTm9uZQAAABBTb21lBABhAQAAAQAATQIMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbmEBASBMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AABRAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAB0CARhBc3NldHMAAAAQV2lsZAQAVQIBJFdpbGRBc3NldAABAABVAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkKQIBHEFzc2V0SWQAAQxmdW5ZAgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAGABDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZCkCARxBc3NldElkAAEMZnVuWQIBPFdpbGRGdW5naWJpbGl0eQABFGNvdW50YAEMdTMyAAMAAFkCECxzdGFnaW5nX3hjbQh2NBRhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAXQIMLHN0YWdpbmdfeGNtCHY1DFhjbQQQQ2FsbAAABABhAgFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAYQIAAAJlAgBlAgwsc3RhZ2luZ194Y20IdjUsSW5zdHJ1Y3Rpb24EEENhbGwAAdA0V2l0aGRyYXdBc3NldAQAaQIBGEFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAGkCARhBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAaQIBGEFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWS0ARxRdWVyeUlkAAEgcmVzcG9uc2WBAgEgUmVzcG9uc2UAAShtYXhfd2VpZ2h01QEBGFdlaWdodAABHHF1ZXJpZXKhAgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzaQIBGEFzc2V0cwABLGJlbmVmaWNpYXJ54AEgTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHNpAgEYQXNzZXRzAAEQZGVzdOABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodKUCAThPcHRpb248V2VpZ2h0PgABEGNhbGz5AQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBACpAgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnngASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEQZGVzdOABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWtAgEsQXNzZXRGaWx0ZXIAARB3YW50aQIBGEFzc2V0cwABHG1heGltYWzIARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZeABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXNxAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAF0CASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAF0CASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzaQIBGEFzc2V0cwABGHRpY2tldOABIExvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAaQIBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQAaQIBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAKECAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBACFAgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm+pAgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBACpAgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAOwBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3Jr9AEkTmV0d29ya0lkAAEsZGVzdGluYXRpb27kAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRxAgEUQXNzZXQAASB1bmxvY2tlcuABIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXRxAgEUQXNzZXQAARh0YXJnZXTgASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0cQIBFEFzc2V0AAEUb3duZXLgASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRxAgEUQXNzZXQAARhsb2NrZXLgASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhd8gBEGJvb2wAKwAgU2V0VG9waWMEAAgBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAOABIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbqECAUBPcHRpb248TG9jYXRpb24+AC8AHFBheUZlZXMEARRhc3NldHECARRBc3NldAAwAEBJbml0aWF0ZVRyYW5zZmVyFAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzuQIBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbsgBEGJvb2wAARhhc3NldHPBAgHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtXQIBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbskCAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y21dAgEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHPNAgGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAAGkCECxzdGFnaW5nX3hjbQh2NRRhc3NldBhBc3NldHMAAAQAbQIBKFZlYzxBc3NldD4AAG0CAAACcQIAcQIQLHN0YWdpbmdfeGNtCHY1FGFzc2V0FEFzc2V0AAAIAQhpZHUCARxBc3NldElkAAEMZnVueQIBLEZ1bmdpYmlsaXR5AAB1AhAsc3RhZ2luZ194Y20IdjUUYXNzZXQcQXNzZXRJZAAABADgASBMb2NhdGlvbgAAeQIQLHN0YWdpbmdfeGNtCHY1FGFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBADAARB1MTI4AAAALE5vbkZ1bmdpYmxlBAB9AgE0QXNzZXRJbnN0YW5jZQABAAB9AhAsc3RhZ2luZ194Y20IdjUUYXNzZXQ0QXNzZXRJbnN0YW5jZQABGCRVbmRlZmluZWQAAAAUSW5kZXgEAMABEHUxMjgAAQAYQXJyYXk0BABwARxbdTg7IDRdAAIAGEFycmF5OAQAvQEBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwQEBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAgBIFt1ODsgMzJdAAUAAIECDCxzdGFnaW5nX3hjbQh2NSBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQAaQIBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEAIUCAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAA4AThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAkQIBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BADpAQE4TWF5YmVFcnJvckNvZGUABQAAhQIEGE9wdGlvbgQEVAGJAgEIEE5vbmUAAAAQU29tZQQAiQIAAAEAAIkCAAAECDiNAgCNAhAMeGNtCHY1GHRyYWl0cxRFcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAoAQx1NjQAFQBARXhwZWN0YXRpb25GYWxzZQAWADhQYWxsZXROb3RGb3VuZAAXADBOYW1lTWlzbWF0Y2gAGABMVmVyc2lvbkluY29tcGF0aWJsZQAZAFBIb2xkaW5nV291bGRPdmVyZmxvdwAaACxFeHBvcnRFcnJvcgAbADhSZWFuY2hvckZhaWxlZAAcABhOb0RlYWwAHQAoRmVlc05vdE1ldAAeACRMb2NrRXJyb3IAHwAwTm9QZXJtaXNzaW9uACAAKFVuYW5jaG9yZWQAIQA4Tm90RGVwb3NpdGFibGUAIgA0VG9vTWFueUFzc2V0cwAjAExVbmhhbmRsZWRYY21WZXJzaW9uACQASFdlaWdodExpbWl0UmVhY2hlZAQA1QEBGFdlaWdodAAlABxCYXJyaWVyACYATFdlaWdodE5vdENvbXB1dGFibGUAJwBERXhjZWVkc1N0YWNrTGltaXQAKAAAkQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGVAgRTAAAEAJ0CARhWZWM8VD4AAJUCDCxzdGFnaW5nX3hjbQh2NShQYWxsZXRJbmZvAAAYARRpbmRleGABDHUzMgABEG5hbWWZAgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZZkCAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yYAEMdTMyAAEUbWlub3JgAQx1MzIAARRwYXRjaGABDHUzMgAAmQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AACdAgAAApUCAKECBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAApQIEGE9wdGlvbgQEVAHVAQEIEE5vbmUAAAAQU29tZQQA1QEAAAEAAKkCDCxzdGFnaW5nX3hjbQh2NURRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AACtAhAsc3RhZ2luZ194Y20IdjUUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAGkCARhBc3NldHMAAAAQV2lsZAQAsQIBJFdpbGRBc3NldAABAACxAhAsc3RhZ2luZ194Y20IdjUUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkdQIBHEFzc2V0SWQAAQxmdW61AgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAGABDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZHUCARxBc3NldElkAAEMZnVutQIBPFdpbGRGdW5naWJpbGl0eQABFGNvdW50YAEMdTMyAAMAALUCECxzdGFnaW5nX3hjbQh2NRRhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAuQIEGE9wdGlvbgQEVAG9AgEIEE5vbmUAAAAQU29tZQQAvQIAAAEAAL0CECxzdGFnaW5nX3hjbQh2NRRhc3NldExBc3NldFRyYW5zZmVyRmlsdGVyAAEMIFRlbGVwb3J0BACtAgEsQXNzZXRGaWx0ZXIAAAA4UmVzZXJ2ZURlcG9zaXQEAK0CASxBc3NldEZpbHRlcgABADxSZXNlcnZlV2l0aGRyYXcEAK0CASxBc3NldEZpbHRlcgACAADBAgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAb0CBFMAAAQAxQIBGFZlYzxUPgAAxQIAAAK9AgDJAgQYT3B0aW9uBARUAeQBCBBOb25lAAAAEFNvbWUEAOQAAAEAAM0CDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB0QIEUwAABADVAgEYVmVjPFQ+AADRAgwsc3RhZ2luZ194Y20IdjUQSGludAABBDBBc3NldENsYWltZXIEASBsb2NhdGlvbuABIExvY2F0aW9uAAAAANUCAAAC0QIA2QIIDHhjbTxWZXJzaW9uZWRBc3NldHMAAQwIVjMEAKUBATx2Mzo6TXVsdGlBc3NldHMAAwAIVjQEAB0CASh2NDo6QXNzZXRzAAQACFY1BABpAgEodjU6OkFzc2V0cwAFAADdAggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAOECAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQA8QIBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BAD9AgFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAA4QIMDHhjbQh2MwxYY20EEENhbGwAAAQA5QIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAOUCAAAC6QIA6QIMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAClAQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAClAQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQApQEBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZLQBHFF1ZXJ5SWQAASByZXNwb25zZcUBASBSZXNwb25zZQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAEccXVlcmllcvEBAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5TQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHOlAQEsTXVsdGlBc3NldHMAARBkZXN0TQEBNE11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5k9QEBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N01QEBGFdlaWdodAABEGNhbGztAgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBABRAQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAD9AQFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeU0BATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlAQIBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW50pQEBLE11bHRpQXNzZXRzAAEcbWF4aW1hbMgBEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZv/QEBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc60BAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADhAgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BADhAgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABGHRpY2tldE0BATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQApQEBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAClAQEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADxAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/9AQFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAD9AQFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAFUBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya10BASROZXR3b3JrSWQAASxkZXN0aW5hdGlvblEBAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldK0BAShNdWx0aUFzc2V0AAEgdW5sb2NrZXJNAQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARh0YXJnZXRNAQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARRvd25lck0BATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldK0BAShNdWx0aUFzc2V0AAEYbG9ja2VyTQEBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBABNAQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7xAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAO0CDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZBgBHFZlYzx1OD4AAPECDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQA9QIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAPUCAAAC+QIA+QIMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAB0CARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAAdAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAB0CARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlNQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVySQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cx0CARhBc3NldHMAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cx0CARhBc3NldHMAARBkZXN0YQEBIExvY2F0aW9uAAEMeGNtEQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdNUBARhXZWlnaHQAARBjYWxs7QIBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAZQEBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAE0CAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNRAgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlUQIBLEFzc2V0RmlsdGVyAAEQd2FudB0CARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c1ECASxBc3NldEZpbHRlcgABHHJlc2VydmVhAQEgTG9jYXRpb24AAQx4Y20RAgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMlAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAPECASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAPECASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzHQIBGEFzc2V0cwABGHRpY2tldGEBASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAB0CARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAB0CARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBABJAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQATQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBABtAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmt1AQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb25lAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbRECARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0JQIBFEFzc2V0AAEgdW5sb2NrZXJhAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldCUCARRBc3NldAABGHRhcmdldGEBASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0JQIBFEFzc2V0AAEUb3duZXJhAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0JQIBFEFzc2V0AAEYbG9ja2VyYQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3yAEQYm9vbAArACBTZXRUb3BpYwQACAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQAYQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbkkCAUBPcHRpb248TG9jYXRpb24+AC8AAP0CDCxzdGFnaW5nX3hjbQh2NQxYY20EEENhbGwAAAQAAQMBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAAEDAAACBQMABQMMLHN0YWdpbmdfeGNtCHY1LEluc3RydWN0aW9uBBBDYWxsAAHQNFdpdGhkcmF3QXNzZXQEAGkCARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABpAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAGkCARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlgQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVyoQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c2kCARhBc3NldHMAASxiZW5lZmljaWFyeeABIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzaQIBGEFzc2V0cwABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmT1AQEoT3JpZ2luS2luZAABTGZhbGxiYWNrX21heF93ZWlnaHSlAgE4T3B0aW9uPFdlaWdodD4AARBjYWxs7QIBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQA5AFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c60CASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlrQIBLEFzc2V0RmlsdGVyAAEQd2FudGkCARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABHHJlc2VydmXgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHOtAgEsQXNzZXRGaWx0ZXIAARBkZXN04AEgTG9jYXRpb24AAQx4Y21dAgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb6kCAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c60CASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzcQIBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBAD9AgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BAD9AgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c2kCARhBc3NldHMAARh0aWNrZXTgASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAGkCARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAGkCARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAChAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAhQIBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBADsASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya/QBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9u5AFASW50ZXJpb3JMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0cQIBFEFzc2V0AAEgdW5sb2NrZXLgASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0cQIBFEFzc2V0AAEYdGFyZ2V04AEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldHECARRBc3NldAABFG93bmVy4AEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0cQIBFEFzc2V0AAEYbG9ja2Vy4AEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBADgASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW6hAgFAT3B0aW9uPExvY2F0aW9uPgAvABxQYXlGZWVzBAEUYXNzZXRxAgEUQXNzZXQAMABASW5pdGlhdGVUcmFuc2ZlchQBLGRlc3RpbmF0aW9u4AEgTG9jYXRpb24AASxyZW1vdGVfZmVlc7kCAWxPcHRpb248QXNzZXRUcmFuc2ZlckZpbHRlcj4AATxwcmVzZXJ2ZV9vcmlnaW7IARBib29sAAEYYXNzZXRzwQIB4EJvdW5kZWRWZWM8QXNzZXRUcmFuc2ZlckZpbHRlciwgTWF4QXNzZXRUcmFuc2ZlckZpbHRlcnM+AAEocmVtb3RlX3hjbV0CARxYY208KCk+ADEAREV4ZWN1dGVXaXRoT3JpZ2luCAFEZGVzY2VuZGFudF9vcmlnaW7JAgFgT3B0aW9uPEludGVyaW9yTG9jYXRpb24+AAEMeGNt/QIBJFhjbTxDYWxsPgAyACBTZXRIaW50cwQBFGhpbnRzzQIBhEJvdW5kZWRWZWM8SGludCwgSGludE51bVZhcmlhbnRzPgAzAAAJAwQYT3B0aW9uBARUATgBCBBOb25lAAAAEFNvbWUEADgAAAEAAA0DEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQASQEBRFZlcnNpb25lZExvY2F0aW9uAAMAABEDCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABDAhWMwQAsQEBLHYzOjpBc3NldElkAAMACFY0BAApAgEsdjQ6OkFzc2V0SWQABAAIVjUEAHUCASx2NTo6QXNzZXRJZAAFAAAVAwQYT3B0aW9uBARUASgBCBBOb25lAAAAEFNvbWUEACgAAAEAABkDDEhjdW11bHVzX3BhbGxldF94Y20YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQMMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXg4ASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZTgBJFBhZ2VJbmRleAABFGluZGV4OAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdNUBARhXZWlnaHQAATR4RXhlY3V0ZSBhbiBvdmVyd2VpZ2h0IG1lc3NhZ2UuAE0BVGVtcG9yYXJ5IHByb2Nlc3NpbmcgZXJyb3JzIHdpbGwgYmUgcHJvcGFnYXRlZCB3aGVyZWFzIHBlcm1hbmVudCBlcnJvcnMgYXJlIHRyZWF0ZWRUYXMgc3VjY2VzcyBjb25kaXRpb24uAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLjUBLSBgbWVzc2FnZV9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgYXJyaXZlZC49AS0gYHBhZ2VgOiBUaGUgcGFnZSBpbiB0aGUgcXVldWUgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgaXMgc2l0dGluZy4JAS0gYGluZGV4YDogVGhlIGluZGV4IGludG8gdGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkLlkBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCBhbGxvd2VkIHRvIGJlIGNvbnN1bWVkIGluIHRoZSBleGVjdXRpb25EICBvZiB0aGUgbWVzc2FnZS4A9EJlbmNobWFyayBjb21wbGV4aXR5IGNvbnNpZGVyYXRpb25zOiBPKGluZGV4ICsgd2VpZ2h0X2xpbWl0KS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQMIXGN1bXVsdXNfcHJpbWl0aXZlc19jb3JlWEFnZ3JlZ2F0ZU1lc3NhZ2VPcmlnaW4AAQwQSGVyZQAAABhQYXJlbnQAAQAcU2libGluZwQAnAEYUGFyYUlkAAIAACUDDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABIBRiYXRjaAQBFGNhbGxzKQMBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4LQMBDHUxNgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAE03FNlbmQgYSBjYWxsIHRocm91Z2ggYW4gaW5kZXhlZCBwc2V1ZG9ueW0gb2YgdGhlIHNlbmRlci4AVQFGaWx0ZXIgZnJvbSBvcmlnaW4gYXJlIHBhc3NlZCBhbG9uZy4gVGhlIGNhbGwgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYW4gb3JpZ2luIHdoaWNovHVzZSB0aGUgc2FtZSBmaWx0ZXIgYXMgdGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwuAEUBTk9URTogSWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYW55IGFjY291bnQtYmFzZWQgZmlsdGVyaW5nIGlzIG5vdCBob25vcmVkIChpLmUuYQFiZWNhdXNlIHlvdSBleHBlY3QgYHByb3h5YCB0byBoYXZlIGJlZW4gdXNlZCBwcmlvciBpbiB0aGUgY2FsbCBzdGFjayBhbmQgeW91IGRvIG5vdCB3YW50UQF0aGUgY2FsbCByZXN0cmljdGlvbnMgdG8gYXBwbHkgdG8gYW55IHN1Yi1hY2NvdW50cyksIHRoZW4gdXNlIGBhc19tdWx0aV90aHJlc2hvbGRfMWB8aW4gdGhlIE11bHRpc2lnIHBhbGxldCBpbnN0ZWFkLgD0Tk9URTogUHJpb3IgdG8gdmVyc2lvbiAqMTIsIHRoaXMgd2FzIGNhbGxlZCBgYXNfbGltaXRlZF9zdWJgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uJGJhdGNoX2FsbAQBFGNhbGxzKQMBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAjTsU2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzIGFuZCBhdG9taWNhbGx5IGV4ZWN1dGUgdGhlbS4hAVRoZSB3aG9sZSB0cmFuc2FjdGlvbiB3aWxsIHJvbGxiYWNrIGFuZCBmYWlsIGlmIGFueSBvZiB0aGUgY2FsbHMgZmFpbGVkLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLixkaXNwYXRjaF9hcwgBJGFzX29yaWdpbjEDAVRCb3g8VDo6UGFsbGV0c09yaWdpbj4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADGMhEaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgcHJvdmlkZWQgb3JpZ2luLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuLGZvcmNlX2JhdGNoBAEUY2FsbHMpAwF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAENHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMu1FVubGlrZSBgYmF0Y2hgLCBpdCBhbGxvd3MgZXJyb3JzIGFuZCB3b24ndCBpbnRlcnJ1cHQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAE0BSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLix3aXRoX3dlaWdodAgBEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h01QEBGFdlaWdodAAFGMREaXNwYXRjaCBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHNwZWNpZmllZCB3ZWlnaHQuAC0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhluFJvb3Qgb3JpZ2luIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4caWZfZWxzZQgBEG1haW4gAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEgZmFsbGJhY2sgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAZcFQFEaXNwYXRjaCBhIGZhbGxiYWNrIGNhbGwgaW4gdGhlIGV2ZW50IHRoZSBtYWluIGNhbGwgZmFpbHMgdG8gZXhlY3V0ZS6wTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4A5FRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGhlIGBtYWluYCBjYWxsLtRJZiB0aGUgYG1haW5gIGNhbGwgZmFpbHMsIHRoZSBgZmFsbGJhY2tgIGlzIGF0dGVtdGVkLhUBaWYgdGhlIGZhbGxiYWNrIGlzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLCB0aGUgd2VpZ2h0cyBvZiBib3RoIGNhbGxzJQFhcmUgYWNjdW11bGF0ZWQgYW5kIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1haW4gY2FsbCBlcnJvciBpcyBkZXBvc2l0ZWQuANxJbiB0aGUgZXZlbnQgb2YgYSBmYWxsYmFjayBmYWlsdXJlIHRoZSB3aG9sZSBjYWxsIGZhaWxzaHdpdGggdGhlIHdlaWdodHMgcmV0dXJuZWQuAEEBLSBgbWFpbmA6IFRoZSBtYWluIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC4gVGhpcyBpcyB0aGUgcHJpbWFyeSBhY3Rpb24gdG8gZXhlY3V0ZS49AS0gYGZhbGxiYWNrYDogVGhlIGZhbGxiYWNrIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZCBpbiBjYXNlIHRoZSBgbWFpbmAgY2FsbCBmYWlscy4ARCMjIERpc3BhdGNoIExvZ2ljQQEtIElmIHRoZSBvcmlnaW4gaXMgYHJvb3RgLCBib3RoIHRoZSBtYWluIGFuZCBmYWxsYmFjayBjYWxscyBhcmUgZXhlY3V0ZWQgd2l0aG91dHggIGFwcGx5aW5nIGFueSBvcmlnaW4gZmlsdGVycy5JAS0gSWYgdGhlIG9yaWdpbiBpcyBub3QgYHJvb3RgLCB0aGUgb3JpZ2luIGZpbHRlciBpcyBhcHBsaWVkIHRvIGJvdGggdGhlIGBtYWluYCBhbmRMICBgZmFsbGJhY2tgIGNhbGxzLgAsIyMgVXNlIENhc2VZAS0gU29tZSB1c2UgY2FzZXMgbWlnaHQgaW52b2x2ZSBzdWJtaXR0aW5nIGEgYGJhdGNoYCB0eXBlIGNhbGwgaW4gZWl0aGVyIG1haW4sIGZhbGxiYWNrKCAgb3IgYm90aC5QZGlzcGF0Y2hfYXNfZmFsbGlibGUIASRhc19vcmlnaW4xAwFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABxTIRGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHByb3ZpZGVkIG9yaWdpbi4AUQFBbG1vc3QgdGhlIHNhbWUgYXMgW2BQYWxsZXQ6OmRpc3BhdGNoX2FzYF0gYnV0IGZvcndhcmRzIGFueSBlcnJvciBvZiB0aGUgaW5uZXIgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQMAAAIgAC0DAAAFBAAxAwhkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZTBPcmlnaW5DYWxsZXIAASwYc3lzdGVtBAA1AwF0ZnJhbWVfc3lzdGVtOjpPcmlnaW48UnVudGltZT4AAAAsUG9sa2Fkb3RYY20EADkDAUhwYWxsZXRfeGNtOjpPcmlnaW4AHwAoQ3VtdWx1c1hjbQQAPQMBaGN1bXVsdXNfcGFsbGV0X3hjbTo6T3JpZ2luACAAGFBlb3BsZQQAQQMBbGluZGl2X3BhbGxldF9wZW9wbGU6Ok9yaWdpbgAzAChQcm9vZk9mSW5rBABNAwGoaW5kaXZfcGFsbGV0X3Byb29mX29mX2luazo6T3JpZ2luPFJ1bnRpbWU+ADUAEEdhbWUEAFEDAYhpbmRpdl9wYWxsZXRfZ2FtZTo6T3JpZ2luPFJ1bnRpbWU+ADcAFFNjb3JlBABVAwGMaW5kaXZfcGFsbGV0X3Njb3JlOjpPcmlnaW48UnVudGltZT4AOAAoUGVvcGxlTGl0ZQQAWQMBpGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZTo6T3JpZ2luPFJ1bnRpbWU+AD4AJFJlc291cmNlcwQAXQMBeGluZGl2X3BhbGxldF9yZXNvdXJjZXM6Ok9yaWdpbgA/ABxNZW1iZXJzBABlAwGUaW5kaXZfcGFsbGV0X21lbWJlcnM6Ok9yaWdpbjxSdW50aW1lPgBDABxDb2luYWdlBABtAwGUaW5kaXZfcGFsbGV0X2NvaW5hZ2U6Ok9yaWdpbjxSdW50aW1lPgBEAAA1Aww0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEEARAQUm9vdAAAABhTaWduZWQEAAQBJEFjY291bnRJZAABABBOb25lAAIAKEF1dGhvcml6ZWQAAwAAOQMMKHBhbGxldF94Y20YcGFsbGV0GE9yaWdpbgABCAxYY20EAOABIExvY2F0aW9uAAAAIFJlc3BvbnNlBADgASBMb2NhdGlvbgABAAA9AwxIY3VtdWx1c19wYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgUUmVsYXkAAABAU2libGluZ1BhcmFjaGFpbgQAnAEYUGFyYUlkAAEAAEEDDExpbmRpdl9wYWxsZXRfcGVvcGxlGHBhbGxldBhPcmlnaW4AAQhAUGVyc29uYWxJZGVudGl0eQQAKAEoUGVyc29uYWxJZAAAADRQZXJzb25hbEFsaWFzBABFAwFYUmV2aXNlZENvbnRleHR1YWxBbGlhcwABAABFAxA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eVhSZXZpc2VkQ29udGV4dHVhbEFsaWFzAAAMASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAARByaW5nOAEkUmluZ0luZGV4AAEIY2FJAwE8Q29udGV4dHVhbEFsaWFzAABJAxA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eTxDb250ZXh0dWFsQWxpYXMAAAgBFGFsaWFzCAEUQWxpYXMAARxjb250ZXh0CAEcQ29udGV4dAAATQMMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0GE9yaWdpbgQEVAABDFhBdXRob3JpemVkQXBwbHlXaXRoU2lnBAAEATBUOjpBY2NvdW50SWQAAABEUmVmZXJyZWRDYW5kaWRhdGUEAAQBMFQ6OkFjY291bnRJZAABAEBJbnZpdGVkQ2FuZGlkYXRlBAAEATBUOjpBY2NvdW50SWQAAgAAUQMMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldBhPcmlnaW4EBFQAAQQcSW52aXRlZAQABAEwVDo6QWNjb3VudElkAAAAAFUDDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0GE9yaWdpbgQEVAABBEhBY2NvdW50UGFydGljaXBhbnQEAAQBMFQ6OkFjY291bnRJZAAAAABZAwxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBhPcmlnaW4EBFQAAQgoTGl0ZVBlcnNvbgQABAEwVDo6QWNjb3VudElkAAAAJExpdGVBbGlhcwQARQMBWFJldmlzZWRDb250ZXh0dWFsQWxpYXMAAQAAXQMMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMYcGFsbGV0GE9yaWdpbgABDEhGcmllbmRSZXF1ZXN0QWxpYXMEAAgBFEFsaWFzAAAAOFN0bXRTdG9yZUFsaWFzBAAIARRBbGlhcwABAFBMb25nVGVybVN0b3JhZ2VDbGFpbQgACAEUQWxpYXMAAGEDAVBNZW1iZXJzaGlwQ29sbGVjdGlvbgACAABhAwxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlc1BNZW1iZXJzaGlwQ29sbGVjdGlvbgABCBhQZW9wbGUAAAAoTGl0ZVBlb3BsZQABAABlAwxQaW5kaXZfcGFsbGV0X21lbWJlcnMYcGFsbGV0GE9yaWdpbgQEVAFpAwEILE1lbWJlckFsaWFzCAAIAShJZGVudGlmaWVyAABFAwFYUmV2aXNlZENvbnRleHR1YWxBbGlhcwAAACxTZWxmSW5jbHVkZQQACAEsTWVtYmVyT2Y8VD4AAQAAaQMIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUcUnVudGltZQAAAABtAwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0GE9yaWdpbgQEVAFpAwEMEENvaW4IARxjb2luX2lkBAEwVDo6QWNjb3VudElkAAEQY29pbnEDARBDb2luAAAALFVubG9hZFRva2VuDAEwYWxpYXNfcHJvb2ZzeQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAShwcm92ZW5fbXNnCAEgW3U4OyAzMl0AAQxmZWWFAwEkVW5sb2FkRmVlAAEAWEluZmFsbGlibGVVbnBhaWRTaWduZWQEAQx3aG8EATBUOjpBY2NvdW50SWQAAgAAcQMMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldBBDb2luAAAIARR2YWx1ZXUDASRDb2luVmFsdWUAAQxhZ2UtAwEMdTE2AAB1AwAABQkAeQMMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAF9AwRTAAAEAIEDARhWZWM8VD4AAH0DAAADFAMAAAwAgQMAAAJ9AwCFAwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0JFVubG9hZEZlZQABCBxQcmVwYWlkAAAAKEZyb21PdXRwdXQIAUhmZWVfcmVjeWNsZXJfdmFsdWV1AwEkQ29pblZhbHVlAAFIZmVlX3JlY3ljbGVyX2luZGV4OAEkUmluZ0luZGV4AAEAAIkDDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0EENhbGwEBFQAARRQYXNfbXVsdGlfdGhyZXNob2xkXzEIAURvdGhlcl9zaWduYXRvcmllc8wBRFZlYzxUOjpBY2NvdW50SWQ+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkLQMBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzzAFEVmVjPFQ6OkFjY291bnRJZD4AATxtYXliZV90aW1lcG9pbnSNAwGQT3B0aW9uPFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAShtYXhfd2VpZ2h01QEBGFdlaWdodAABqFUBUmVnaXN0ZXIgYXBwcm92YWwgZm9yIGEgZGlzcGF0Y2ggdG8gYmUgbWFkZSBmcm9tIGEgZGV0ZXJtaW5pc3RpYyBjb21wb3NpdGUgYWNjb3VudCBpZvhhcHByb3ZlZCBieSBhIHRvdGFsIG9mIGB0aHJlc2hvbGQgLSAxYCBvZiBgb3RoZXJfc2lnbmF0b3JpZXNgLgA9ASoqSWYgdGhlIGFwcHJvdmFsIHRocmVzaG9sZCBpcyBtZXQgKGluY2x1ZGluZyB0aGUgc2VuZGVyJ3MgYXBwcm92YWwpLCB0aGlzIHdpbGxFAWltbWVkaWF0ZWx5IGV4ZWN1dGUgdGhlIGNhbGwuKiogVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZXhlY3V0ZSBhIG11bHRpc2lnIGNhbGwgLcBgYXBwcm92ZV9hc19tdWx0aWAgd2lsbCBuZXZlciB0cmlnZ2VyIGV4ZWN1dGlvbi4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4ATQFOT1RFOiBGb3IgaW50ZXJtZWRpYXRlIGFwcHJvdmFscyAobm90IHRoZSBmaW5hbCBhcHByb3ZhbCksIHlvdSBzaG91bGQgZ2VuZXJhbGx5IHVzZUUBYGFwcHJvdmVfYXNfbXVsdGlgIGluc3RlYWQsIHNpbmNlIGl0IG9ubHkgcmVxdWlyZXMgYSBoYXNoIG9mIHRoZSBjYWxsIGFuZCBpcyBtb3JlKGVmZmljaWVudC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZC0DAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc8wBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50jQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABJGNhbGxfaGFzaAgBIFt1ODsgMzJdAAEobWF4X3dlaWdodNUBARhXZWlnaHQAAphVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AOQEqKlRoaXMgZnVuY3Rpb24gd2lsbCBORVZFUiBleGVjdXRlIHRoZSBjYWxsLCBldmVuIGlmIHRoZSBhcHByb3ZhbCB0aHJlc2hvbGQgaXNRAXJlYWNoZWQuKiogSXQgb25seSByZWdpc3RlcnMgYXBwcm92YWwuIFRvIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIGNhbGwsIGBhc19tdWx0aWAgbXVzdPBiZSBjYWxsZWQgd2l0aCB0aGUgZnVsbCBjYWxsIGRhdGEgYnkgYW55IG9mIHRoZSBzaWduYXRvcmllcy4ATQFUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gYGFzX211bHRpYCBmb3IgaW50ZXJtZWRpYXRlIGFwcHJvdmFscyBzaW5jZSBpdNBvbmx5IHJlcXVpcmVzIHRoZSBjYWxsIGhhc2gsIG5vdCB0aGUgZnVsbCBjYWxsIGRhdGEuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLswtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBleGVjdXRlZC4APQFOT1RFOiBUbyBleGVjdXRlIHRoZSBjYWxsIGFmdGVyIGFwcHJvdmFscyBhcmUgZ2F0aGVyZWQsIGFueSBzaWduYXRvcnkgbXVzdCBjYWxsKQFgYXNfbXVsdGlgIHdpdGggdGhlIGZ1bGwgY2FsbCBkYXRhLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBleGVjdXRlIHRoZSBjYWxsLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQuTQEtIFN0b3JhZ2U6IGluc2VydHMgb25lIGl0ZW0sIHZhbHVlIHNpemUgYm91bmRlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIGEgZGVwb3NpdBkBICB0YWtlbiBmb3IgaXRzIGxpZmV0aW1lIG9mIGBEZXBvc2l0QmFzZSArIHRocmVzaG9sZCAqIERlcG9zaXRGYWN0b3JgLjxjYW5jZWxfYXNfbXVsdGkQASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludJEDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoCAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uMHBva2VfZGVwb3NpdAwBJHRocmVzaG9sZC0DAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc8wBRFZlYzxUOjpBY2NvdW50SWQ+AAEkY2FsbF9oYXNoCAEgW3U4OyAzMl0ABDT0UG9rZSB0aGUgZGVwb3NpdCByZXNlcnZlZCBmb3IgYW4gZXhpc3RpbmcgbXVsdGlzaWcgb3BlcmF0aW9uLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3Igb2ZcdGhlIG11bHRpc2lnIG9wZXJhdGlvbi4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuABkBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgbmVlZGVkIGZvciB0aGlzIG11bHRpc2lnLj0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZSwgIG11bHRpc2lnLgUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdGhpcyBkZXBvc2l0IGlzIHJlc2VydmVkIGZvci4AjEVtaXRzIGBEZXBvc2l0UG9rZWRgIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLo0DBBhPcHRpb24EBFQBkQMBCBBOb25lAAAAEFNvbWUEAJEDAAABAACRAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBOAAIARhoZWlnaHQ4ASxCbG9ja051bWJlcgABFGluZGV4OAEMdTMyAACVAwwscGFsbGV0X3N1ZG8YcGFsbGV0EENhbGwEBFQAARQQc3VkbwQBEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAENQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLlRzdWRvX3VuY2hlY2tlZF93ZWlnaHQIARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABGHdlaWdodNUBARhXZWlnaHQAARQ1AUF1dGhlbnRpY2F0ZXMgdGhlIHN1ZG8ga2V5IGFuZCBkaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGBSb290YCBvcmlnaW4uLQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGWwU3VkbyB1c2VyIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLhxzZXRfa2V5BAEMbmV3AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AAghdAUF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgc3VkbyBrZXkgYW5kIHNldHMgdGhlIGdpdmVuIEFjY291bnRJZCAoYG5ld2ApIGFzIHRoZSBuZXcgc3VkbxBrZXkuHHN1ZG9fYXMIAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMQTQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgU2lnbmVkYCBvcmlnaW4gZnJvbUBhIGdpdmVuIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ocmVtb3ZlX2tleQAEDIRQZXJtYW5lbnRseSByZW1vdmVzIHRoZSBzdWRvIGtleS4AbCoqVGhpcyBjYW5ub3QgYmUgdW4tZG9uZS4qKgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6ZAwwwcGFsbGV0X3Byb3h5GHBhbGxldBBDYWxsBARUAAEsFHByb3h5DAEQcmVhbAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZZ0DAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAkTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXNlZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoNAS0gYHJlYWxgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBwcm94eSB3aWxsIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZi5hAS0gYGZvcmNlX3Byb3h5X3R5cGVgOiBTcGVjaWZ5IHRoZSBleGFjdCBwcm94eSB0eXBlIHRvIGJlIHVzZWQgYW5kIGNoZWNrZWQgZm9yIHRoaXMgY2FsbC7QLSBgY2FsbGA6IFRoZSBjYWxsIHRvIGJlIG1hZGUgYnkgdGhlIGByZWFsYCBhY2NvdW50LiRhZGRfcHJveHkMASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZaEDATBUOjpQcm94eVR5cGUAARRkZWxheTgBREJsb2NrTnVtYmVyRm9yPFQ+AAEkRQFSZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIgdGhhdCBpcyBhYmxlIHRvIG1ha2UgY2FsbHMgb24gaXRzIGJlaGFsZi4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoRAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byBtYWtlIGEgcHJveHku/C0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgYWxsb3dlZCBmb3IgdGhpcyBwcm94eSBhY2NvdW50Lk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4wcmVtb3ZlX3Byb3h5DAEgZGVsZWdhdGUAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGWhAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAF0BV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYGNyZWF0ZV9wdXJlYCwgaG93ZXZlciBpZiBkb25lLCB0aGVuWQF0aGUgdW5yZXNlcnZlZCBmZWVzIHdpbGwgYmUgaW5hY2Nlc3NpYmxlLiAqKkFsbCBhY2Nlc3MgdG8gdGhpcyBhY2NvdW50IHdpbGwgYmUgbG9zdC4qKixjcmVhdGVfcHVyZQwBKHByb3h5X3R5cGWhAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgABFGluZGV4LQMBDHUxNgAESDkBU3Bhd24gYSBmcmVzaCBuZXcgYWNjb3VudCB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb3RoZXJ3aXNlIGluYWNjZXNzaWJsZSwgYW5k/GluaXRpYWxpemUgaXQgd2l0aCBhIHByb3h5IG9mIGBwcm94eV90eXBlYCBmb3IgYG9yaWdpbmAgc2VuZGVyLgBsUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4uAFEBLSBgcHJveHlfdHlwZWA6IFRoZSB0eXBlIG9mIHRoZSBwcm94eSB0aGF0IHRoZSBzZW5kZXIgd2lsbCBiZSByZWdpc3RlcmVkIGFzIG92ZXIgdGhlTQFuZXcgYWNjb3VudC4gVGhpcyB3aWxsIGFsbW9zdCBhbHdheXMgYmUgdGhlIG1vc3QgcGVybWlzc2l2ZSBgUHJveHlUeXBlYCBwb3NzaWJsZSB0b3hhbGxvdyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eS5RAS0gYGluZGV4YDogQSBkaXNhbWJpZ3VhdGlvbiBpbmRleCwgaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZV0BdHJhbnNhY3Rpb24gKGUuZy4gd2l0aCBgdXRpbGl0eTo6YmF0Y2hgKS4gVW5sZXNzIHlvdSdyZSB1c2luZyBgYmF0Y2hgIHlvdSBwcm9iYWJseSBqdXN0QHdhbnQgdG8gdXNlIGAwYC5NAS0gYGRlbGF5YDogVGhlIGFubm91bmNlbWVudCBwZXJpb2QgcmVxdWlyZWQgb2YgdGhlIGluaXRpYWwgcHJveHkuIFdpbGwgZ2VuZXJhbGx5IGJlFHplcm8uAFEBRmFpbHMgd2l0aCBgRHVwbGljYXRlYCBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIGZyb20gdGhlmHNhbWUgc2VuZGVyLCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuAORGYWlscyBpZiB0aGVyZSBhcmUgaW5zdWZmaWNpZW50IGZ1bmRzIHRvIHBheSBmb3IgZGVwb3NpdC4ka2lsbF9wdXJlFAEcc3Bhd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZaEDATBUOjpQcm94eVR5cGUAARRpbmRleC0DAQx1MTYAARhoZWlnaHRgAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleGABDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+wYGNyZWF0ZV9wdXJlYCB3aXRoIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4AVQEtIGBzcGF3bmVyYDogVGhlIGFjY291bnQgdGhhdCBvcmlnaW5hbGx5IGNhbGxlZCBgY3JlYXRlX3B1cmVgIHRvIGNyZWF0ZSB0aGlzIGFjY291bnQuVQEtIGBpbmRleGA6IFRoZSBkaXNhbWJpZ3VhdGlvbiBpbmRleCBvcmlnaW5hbGx5IHBhc3NlZCB0byBgY3JlYXRlX3B1cmVgLiBQcm9iYWJseSBgMGAuCQEtIGBwcm94eV90eXBlYDogVGhlIHByb3h5IHR5cGUgb3JpZ2luYWxseSBwYXNzZWQgdG8gYGNyZWF0ZV9wdXJlYC5FAS0gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIGNoYWluIHdoZW4gdGhlIGNhbGwgdG8gYGNyZWF0ZV9wdXJlYCB3YXMgcHJvY2Vzc2VkLlEBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgY3JlYXRlX3B1cmVgIHdhcyBwcm9jZXNzZWQuADUBRmFpbHMgd2l0aCBgTm9QZXJtaXNzaW9uYCBpbiBjYXNlIHRoZSBjYWxsZXIgaXMgbm90IGEgcHJldmlvdXNseSBjcmVhdGVkIHB1cmX4YWNjb3VudCB3aG9zZSBgY3JlYXRlX3B1cmVgIGNhbGwgaGFzIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4gYW5ub3VuY2UIARByZWFsAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAY8BQFQdWJsaXNoIHRoZSBoYXNoIG9mIGEgcHJveHktY2FsbCB0aGF0IHdpbGwgYmUgbWFkZSBpbiB0aGUgZnV0dXJlLgBdAVRoaXMgbXVzdCBiZSBjYWxsZWQgc29tZSBudW1iZXIgb2YgYmxvY2tzIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBgcHJveHlgIGlzIGF0dGVtcHRlZCUBaWYgdGhlIGRlbGF5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJveHkgcmVsYXRpb25zaGlwIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgARAU5vIG1vcmUgdGhhbiBgTWF4UGVuZGluZ2AgYW5ub3VuY2VtZW50cyBtYXkgYmUgbWFkZSBhdCBhbnkgb25lIHRpbWUuAAkBVGhpcyB3aWxsIHRha2UgYSBkZXBvc2l0IG9mIGBBbm5vdW5jZW1lbnREZXBvc2l0RmFjdG9yYCBhcyB3ZWxsIGFzGQFgQW5ub3VuY2VtZW50RGVwb3NpdEJhc2VgIGlmIHRoZXJlIGFyZSBubyBvdGhlciBwZW5kaW5nIGFubm91bmNlbWVudHMuACUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgcHJveHkgb2YgYHJlYWxgLgAsUGFyYW1ldGVyczoNAS0gYHJlYWxgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBwcm94eSB3aWxsIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZi4VAS0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIG1hZGUgYnkgdGhlIGByZWFsYCBhY2NvdW50LkxyZW1vdmVfYW5ub3VuY2VtZW50CAEQcmVhbAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoPAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAgosFJlbW92ZSB0aGUgZ2l2ZW4gYW5ub3VuY2VtZW50IG9mIGEgZGVsZWdhdGUuAGEBTWF5IGJlIGNhbGxlZCBieSBhIHRhcmdldCAocHJveGllZCkgYWNjb3VudCB0byByZW1vdmUgYSBjYWxsIHRoYXQgb25lIG9mIHRoZWlyIGRlbGVnYXRlcyUBKGBkZWxlZ2F0ZWApIGhhcyBhbm5vdW5jZWQgdGhleSB3YW50IHRvIGV4ZWN1dGUuIFRoZSBkZXBvc2l0IGlzIHJldHVybmVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOvQtIGBkZWxlZ2F0ZWA6IFRoZSBhY2NvdW50IHRoYXQgcHJldmlvdXNseSBhbm5vdW5jZWQgdGhlIGNhbGwuvC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIG1hZGUuPHByb3h5X2Fubm91bmNlZBABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARByZWFsAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlnQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ACSxNAURpc3BhdGNoIHRoZSBnaXZlbiBgY2FsbGAgZnJvbSBhbiBhY2NvdW50IHRoYXQgdGhlIHNlbmRlciBpcyBhdXRob3JpemVkIGZvciB0aHJvdWdoMGBhZGRfcHJveHlgLgCoUmVtb3ZlcyBhbnkgY29ycmVzcG9uZGluZyBhbm5vdW5jZW1lbnQocykuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4wcG9rZV9kZXBvc2l0AAogSQFQb2tlIC8gQWRqdXN0IGRlcG9zaXRzIG1hZGUgZm9yIHByb3hpZXMgYW5kIGFubm91bmNlbWVudHMgYmFzZWQgb24gY3VycmVudCB2YWx1ZXMuDQFUaGlzIGNhbiBiZSB1c2VkIGJ5IGFjY291bnRzIHRvIHBvc3NpYmx5IGxvd2VyIHRoZWlyIGxvY2tlZCBhbW91bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuAIxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6dAwQYT3B0aW9uBARUAaEDAQgQTm9uZQAAABBTb21lBAChAwAAAQAAoQMIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUkUHJveHlUeXBlAAEYDEFueQAAACxOb25UcmFuc2ZlcgABACxDYW5jZWxQcm94eQACACBJZGVudGl0eQADAERJZGVudGl0eUp1ZGdlbWVudAAEACBDb2xsYXRvcgAFAAClAwxUaW5kaXZfcGFsbGV0X2lkZW50aXR5GHBhbGxldBBDYWxsBARUAAF4NGFkZF9yZWdpc3RyYXIEARxhY2NvdW50AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AABx4QWRkIGEgcmVnaXN0cmFyIHRvIHRoZSBzeXN0ZW0uAPxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgVDo6UmVnaXN0cmFyT3JpZ2luYC4AqC0gYGFjY291bnRgOiB0aGUgYWNjb3VudCBvZiB0aGUgcmVnaXN0cmFyLgCURW1pdHMgYFJlZ2lzdHJhckFkZGVkYCBpZiBzdWNjZXNzZnVsLjBzZXRfaWRlbnRpdHkEARBpbmZvqQMBbEJveDxUOjpJZGVudGl0eUluZm9ybWF0aW9uPgABKCkBU2V0IGFuIGFjY291bnQncyBpZGVudGl0eSBpbmZvcm1hdGlvbiBhbmQgcmVzZXJ2ZSB0aGUgYXBwcm9wcmlhdGUgZGVwb3NpdC4AVQFJZiB0aGUgYWNjb3VudCBhbHJlYWR5IGhhcyBpZGVudGl0eSBpbmZvcm1hdGlvbiwgdGhlIGRlcG9zaXQgaXMgdGFrZW4gYXMgcGFydCBwYXltZW50UGZvciB0aGUgbmV3IGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AjC0gYGluZm9gOiBUaGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uAIhFbWl0cyBgSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwuIHNldF9zdWJzBAEQc3VicyUEAWRWZWM8KFQ6OkFjY291bnRJZCwgRGF0YSk+AAIkjFNldCB0aGUgc3ViLWFjY291bnRzIG9mIHRoZSBzZW5kZXIuAFUBUGF5bWVudDogQW55IGFnZ3JlZ2F0ZSBiYWxhbmNlIHJlc2VydmVkIGJ5IHByZXZpb3VzIGBzZXRfc3Vic2AgY2FsbHMgd2lsbCBiZSByZXR1cm5lZC0BYW5kIGFuIGFtb3VudCBgU3ViQWNjb3VudERlcG9zaXRgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGVhY2ggaXRlbSBpbiBgc3Vic2AuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AsC0gYHN1YnNgOiBUaGUgaWRlbnRpdHkncyAobmV3KSBzdWItYWNjb3VudHMuOGNsZWFyX2lkZW50aXR5AAMgOQFDbGVhciBhbiBhY2NvdW50J3MgaWRlbnRpdHkgaW5mbyBhbmQgYWxsIHN1Yi1hY2NvdW50cyBhbmQgcmV0dXJuIGFsbCBkZXBvc2l0cy4A7FBheW1lbnQ6IEFsbCByZXNlcnZlZCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudCBhcmUgcmV0dXJuZWQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AmEVtaXRzIGBJZGVudGl0eUNsZWFyZWRgIGlmIHN1Y2Nlc3NmdWwuRHJlcXVlc3RfanVkZ2VtZW50CAEkcmVnX2luZGV4YAE4UmVnaXN0cmFySW5kZXgAARxtYXhfZmVlwAEwQmFsYW5jZU9mPFQ+AARAlFJlcXVlc3QgYSBqdWRnZW1lbnQgZnJvbSBhIHJlZ2lzdHJhci4AVQFQYXltZW50OiBBdCBtb3N0IGBtYXhfZmVlYCB3aWxsIGJlIHJlc2VydmVkIGZvciBwYXltZW50IHRvIHRoZSByZWdpc3RyYXIgaWYganVkZ2VtZW50GGdpdmVuLgA1AVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhUHJlZ2lzdGVyZWQgaWRlbnRpdHkuAB0BLSBgcmVnX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UganVkZ2VtZW50IGlzIHJlcXVlc3RlZC5VAS0gYG1heF9mZWVgOiBUaGUgbWF4aW11bSBmZWUgdGhhdCBtYXkgYmUgcGFpZC4gVGhpcyBzaG91bGQganVzdCBiZSBhdXRvLXBvcHVsYXRlZCBhczoAMGBgYG5vY29tcGlsZbhTZWxmOjpyZWdpc3RyYXJzKCkuZ2V0KHJlZ19pbmRleCkudW53cmFwKCkuZmVlDGBgYACkRW1pdHMgYEp1ZGdlbWVudFJlcXVlc3RlZGAgaWYgc3VjY2Vzc2Z1bC44Y2FuY2VsX3JlcXVlc3QEASRyZWdfaW5kZXg4AThSZWdpc3RyYXJJbmRleAAFKGhDYW5jZWwgYSBwcmV2aW91cyByZXF1ZXN0LgD4UGF5bWVudDogQSBwcmV2aW91c2x5IHJlc2VydmVkIGRlcG9zaXQgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4ANQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYVByZWdpc3RlcmVkIGlkZW50aXR5LgBFAS0gYHJlZ19pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBubyBsb25nZXIgcmVxdWVzdGVkLgCsRW1pdHMgYEp1ZGdlbWVudFVucmVxdWVzdGVkYCBpZiBzdWNjZXNzZnVsLhxzZXRfZmVlCAEUaW5kZXhgAThSZWdpc3RyYXJJbmRleAABDGZlZcABMEJhbGFuY2VPZjxUPgAGHBkBU2V0IHRoZSBmZWUgcmVxdWlyZWQgZm9yIGEganVkZ2VtZW50IHRvIGJlIHJlcXVlc3RlZCBmcm9tIGEgcmVnaXN0cmFyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIGFjY291bnSgb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBpbmRleCBpcyBgaW5kZXhgLgD0LSBgaW5kZXhgOiB0aGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBmZWUgaXMgdG8gYmUgc2V0LlQtIGBmZWVgOiB0aGUgbmV3IGZlZS44c2V0X2FjY291bnRfaWQIARRpbmRleGABOFJlZ2lzdHJhckluZGV4AAEMbmV3AAFQQWNjb3VudElkTG9va3VwT2Y8VD4ABxy8Q2hhbmdlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdHJhci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50oG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYGluZGV4YC4A9C0gYGluZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgZmVlIGlzIHRvIGJlIHNldC5wLSBgbmV3YDogdGhlIG5ldyBhY2NvdW50IElELihzZXRfZmllbGRzCAEUaW5kZXhgAThSZWdpc3RyYXJJbmRleAABGGZpZWxkcygBKQE8VDo6SWRlbnRpdHlJbmZvcm1hdGlvbiBhcyBJZGVudGl0eUluZm9ybWF0aW9uUHJvdmlkZXI+OjoKRmllbGRzSWRlbnRpZmllcgAIHKhTZXQgdGhlIGZpZWxkIGluZm9ybWF0aW9uIGZvciBhIHJlZ2lzdHJhci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50oG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYGluZGV4YC4A9C0gYGluZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgZmVlIGlzIHRvIGJlIHNldC4NAS0gYGZpZWxkc2A6IHRoZSBmaWVsZHMgdGhhdCB0aGUgcmVnaXN0cmFyIGNvbmNlcm5zIHRoZW1zZWx2ZXMgd2l0aC5EcHJvdmlkZV9qdWRnZW1lbnQQASRyZWdfaW5kZXhgAThSZWdpc3RyYXJJbmRleAABGHRhcmdldAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkanVkZ2VtZW50LQQBXEp1ZGdlbWVudDxCYWxhbmNlT2Y8VD4+AAEgaWRlbnRpdHk8ARxUOjpIYXNoAAk8uFByb3ZpZGUgYSBqdWRnZW1lbnQgZm9yIGFuIGFjY291bnQncyBpZGVudGl0eS4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50sG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYHJlZ19pbmRleGAuACEBLSBgcmVnX2luZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UganVkZ2VtZW50IGlzIGJlaW5nIG1hZGUuVQEtIGB0YXJnZXRgOiB0aGUgYWNjb3VudCB3aG9zZSBpZGVudGl0eSB0aGUganVkZ2VtZW50IGlzIHVwb24uIFRoaXMgbXVzdCBiZSBhbiBhY2NvdW50dCAgd2l0aCBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuSQEtIGBqdWRnZW1lbnRgOiB0aGUganVkZ2VtZW50IG9mIHRoZSByZWdpc3RyYXIgb2YgaW5kZXggYHJlZ19pbmRleGAgYWJvdXQgYHRhcmdldGAuXQEtIGBpZGVudGl0eWA6IFRoZSBoYXNoIG9mIHRoZSBbYElkZW50aXR5SW5mb3JtYXRpb25Qcm92aWRlcmBdIGZvciB0aGF0IHRoZSBqdWRnZW1lbnQgaXMsICBwcm92aWRlZC4AsE5vdGU6IEp1ZGdlbWVudHMgZG8gbm90IGFwcGx5IHRvIGEgdXNlcm5hbWUuAJRFbWl0cyBgSnVkZ2VtZW50R2l2ZW5gIGlmIHN1Y2Nlc3NmdWwuNGtpbGxfaWRlbnRpdHkEARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgAKMEEBUmVtb3ZlIGFuIGFjY291bnQncyBpZGVudGl0eSBhbmQgc3ViLWFjY291bnQgaW5mb3JtYXRpb24gYW5kIHNsYXNoIHRoZSBkZXBvc2l0cy4AYQFQYXltZW50OiBSZXNlcnZlZCBiYWxhbmNlcyBmcm9tIGBzZXRfc3Vic2AgYW5kIGBzZXRfaWRlbnRpdHlgIGFyZSBzbGFzaGVkIGFuZCBoYW5kbGVkIGJ5RQFgU2xhc2hgLiBWZXJpZmljYXRpb24gcmVxdWVzdCBkZXBvc2l0cyBhcmUgbm90IHJldHVybmVkOyB0aGV5IHNob3VsZCBiZSBjYW5jZWxsZWSAbWFudWFsbHkgdXNpbmcgYGNhbmNlbF9yZXF1ZXN0YC4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuAFUBLSBgdGFyZ2V0YDogdGhlIGFjY291bnQgd2hvc2UgaWRlbnRpdHkgdGhlIGp1ZGdlbWVudCBpcyB1cG9uLiBUaGlzIG11c3QgYmUgYW4gYWNjb3VudHQgIHdpdGggYSByZWdpc3RlcmVkIGlkZW50aXR5LgCURW1pdHMgYElkZW50aXR5S2lsbGVkYCBpZiBzdWNjZXNzZnVsLhxhZGRfc3ViCAEMc3ViAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhrQMBEERhdGEACxysQWRkIHRoZSBnaXZlbiBhY2NvdW50IHRvIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW5hbWVfc3ViCAEMc3ViAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhrQMBEERhdGEADBDMQWx0ZXIgdGhlIGFzc29jaWF0ZWQgbmFtZSBvZiB0aGUgZ2l2ZW4gc3ViLWFjY291bnQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZFhzdWIgaWRlbnRpdHkgb2YgYHN1YmAuKHJlbW92ZV9zdWIEAQxzdWIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgANHMBSZW1vdmUgdGhlIGdpdmVuIGFjY291bnQgZnJvbSB0aGUgc2VuZGVyJ3Mgc3Vicy4AXQFQYXltZW50OiBCYWxhbmNlIHJlc2VydmVkIGJ5IGEgcHJldmlvdXMgYHNldF9zdWJzYCBjYWxsIGZvciBvbmUgc3ViIHdpbGwgYmUgcmVwYXRyaWF0ZWQ4dG8gdGhlIHNlbmRlci4AYQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYSByZWdpc3RlcmVkWHN1YiBpZGVudGl0eSBvZiBgc3ViYC4gcXVpdF9zdWIADiiMUmVtb3ZlIHRoZSBzZW5kZXIgYXMgYSBzdWItYWNjb3VudC4AXQFQYXltZW50OiBCYWxhbmNlIHJlc2VydmVkIGJ5IGEgcHJldmlvdXMgYHNldF9zdWJzYCBjYWxsIGZvciBvbmUgc3ViIHdpbGwgYmUgcmVwYXRyaWF0ZWS0dG8gdGhlIHNlbmRlciAoKm5vdCogdGhlIG9yaWdpbmFsIGRlcG9zaXRvcikuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZDxzdXBlci1pZGVudGl0eS4ARQFOT1RFOiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgdXNlZCwgYnV0IGlzIHByb3ZpZGVkIGluIHRoZSBjYXNlIHRoYXQgdGhlIG5vbi0RAWNvbnRyb2xsZXIgb2YgYW4gYWNjb3VudCBpcyBtYWxpY2lvdXNseSByZWdpc3RlcmVkIGFzIGEgc3ViLWFjY291bnQuWGFkZF91c2VybmFtZV9hdXRob3JpdHkMASRhdXRob3JpdHkAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHN1ZmZpeBgBHFZlYzx1OD4AAShhbGxvY2F0aW9uOAEMdTMyAA8UVQFBZGQgYW4gYEFjY291bnRJZGAgd2l0aCBwZXJtaXNzaW9uIHRvIGdyYW50IHVzZXJuYW1lcyB3aXRoIGEgZ2l2ZW4gYHN1ZmZpeGAgYXBwZW5kZWQuAEUBVGhlIGF1dGhvcml0eSBjYW4gZ3JhbnQgdXAgdG8gYGFsbG9jYXRpb25gIHVzZXJuYW1lcy4gVG8gdG9wIHVwIHRoZSBhbGxvY2F0aW9uIG9ySQFjaGFuZ2UgdGhlIGFjY291bnQgdXNlZCB0byBncmFudCB1c2VybmFtZXMsIHRoaXMgY2FsbCBjYW4gYmUgdXNlZCB3aXRoIHRoZSB1cGRhdGVkzHBhcmFtZXRlcnMgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLmRyZW1vdmVfdXNlcm5hbWVfYXV0aG9yaXR5CAEYc3VmZml4GAEcVmVjPHU4PgABJGF1dGhvcml0eQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABAExFJlbW92ZSBgYXV0aG9yaXR5YCBmcm9tIHRoZSB1c2VybmFtZSBhdXRob3JpdGllcy5Ac2V0X3VzZXJuYW1lX2ZvchABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgdXNlcm5hbWUYARxWZWM8dTg+AAEkc2lnbmF0dXJlMQQBcE9wdGlvbjxUOjpPZmZjaGFpblNpZ25hdHVyZT4AATh1c2VfYWxsb2NhdGlvbsgBEGJvb2wAETQNAVNldCB0aGUgdXNlcm5hbWUgZm9yIGB3aG9gLiBNdXN0IGJlIGNhbGxlZCBieSBhIHVzZXJuYW1lIGF1dGhvcml0eS4AWQFJZiBgdXNlX2FsbG9jYXRpb25gIGlzIHNldCwgdGhlIGF1dGhvcml0eSBtdXN0IGhhdmUgYSB1c2VybmFtZSBhbGxvY2F0aW9uIGF2YWlsYWJsZSB0b0UBc3BlbmQuIE90aGVyd2lzZSwgdGhlIGF1dGhvcml0eSB3aWxsIG5lZWQgdG8gcHV0IHVwIGEgZGVwb3NpdCBmb3IgcmVnaXN0ZXJpbmcgdGhlJHVzZXJuYW1lLgCwVXNlcnMgY2FuIGVpdGhlciBwcmUtc2lnbiB0aGVpciB1c2VybmFtZXMgb3JIYWNjZXB0IHRoZW0gbGF0ZXIuADxVc2VybmFtZXMgbXVzdDrYICAtIE9ubHkgY29udGFpbiBsb3dlcmNhc2UgQVNDSUkgY2hhcmFjdGVycyBvciBkaWdpdHMuNQEgIC0gV2hlbiBjb21iaW5lZCB3aXRoIHRoZSBzdWZmaXggb2YgdGhlIGlzc3VpbmcgYXV0aG9yaXR5IGJlIF9sZXNzIHRoYW5fIHRoZWAgICAgYE1heFVzZXJuYW1lTGVuZ3RoYC48YWNjZXB0X3VzZXJuYW1lBAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AEgxNAUFjY2VwdCBhIGdpdmVuIHVzZXJuYW1lIHRoYXQgYW4gYGF1dGhvcml0eWAgZ3JhbnRlZC4gVGhlIGNhbGwgbXVzdCBpbmNsdWRlIHRoZSBmdWxsVQF1c2VybmFtZSwgYXMgaW4gYHVzZXJuYW1lLnN1ZmZpeGAuIEF1dGhvcml0aWVzIGNhbm5vdCBncmFudCB1c2VybmFtZXMgdG8gcGVvcGxlLCBvbmx5UHRvIHJlZ3VsYXIgYWNjb3VudHMuXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsBAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AEwxhAVJlbW92ZSBhbiBleHBpcmVkIHVzZXJuYW1lIGFwcHJvdmFsLiBUaGUgdXNlcm5hbWUgd2FzIGFwcHJvdmVkIGJ5IGFuIGF1dGhvcml0eSBidXQgbmV2ZXJVAWFjY2VwdGVkIGJ5IHRoZSB1c2VyIGFuZCBtdXN0IG5vdyBiZSBiZXlvbmQgaXRzIGV4cGlyYXRpb24uIFRoZSBjYWxsIG11c3QgaW5jbHVkZSB0aGWcZnVsbCB1c2VybmFtZSwgYXMgaW4gYHVzZXJuYW1lLnN1ZmZpeGAuUHNldF9wcmltYXJ5X3VzZXJuYW1lBAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AFAxFAVNldCBhIGdpdmVuIHVzZXJuYW1lIGFzIHRoZSBwcmltYXJ5LiBUaGUgdXNlcm5hbWUgc2hvdWxkIGluY2x1ZGUgdGhlIHN1ZmZpeC4gT25seVkBcmVndWxhciBhY2NvdW50cyBjYW4gc2V0IHRoZWlyIHByaW1hcnkgdXNlcm5hbWUsIGFzIHBlb3BsZSBjYW4gb25seSBoYXZlIG9uZSB1c2VybmFtZSyQZ3JhbnRlZCB0aHJvdWdoIGEgc3lzdGVtIGFsbG9jYXRpb24uPHVuYmluZF91c2VybmFtZQQBIHVzZXJuYW1lQQQBLFVzZXJuYW1lPFQ+ABUMWQFTdGFydCB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBhIHVzZXJuYW1lIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIHVuYmluZGluZyB1c2VybmFtZXMgbWFwLiEBT25jZSB0aGUgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQsIHRoZSB1c2VybmFtZSBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nwFtyZW1vdmVfdXNlcm5hbWVdKGNyYXRlOjpDYWxsOjpyZW1vdmVfdXNlcm5hbWUpLjxyZW1vdmVfdXNlcm5hbWUEASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgAWCGEBUGVybWFuZW50bHkgZGVsZXRlIGEgdXNlcm5hbWUgd2hpY2ggaGFzIGJlZW4gdW5iaW5kaW5nIGZvciBsb25nZXIgdGhhbiB0aGUgZ3JhY2UgcGVyaW9kLkkBQ2FsbGVyIGlzIHJlZnVuZGVkIHRoZSBmZWUgaWYgdGhlIHVzZXJuYW1lIGV4cGlyZWQgYW5kIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLjRraWxsX3VzZXJuYW1lBAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AFwhdAUNhbGwgd2l0aCBbRm9yY2VPcmlnaW5dKGNyYXRlOjpDb25maWc6OkZvcmNlT3JpZ2luKSBwcml2aWxlZ2VzIHdoaWNoIGRlbGV0ZXMgYSB1c2VybmFtZaxhbmQgc2xhc2hlcyBhbnkgZGVwb3NpdCBhc3NvY2lhdGVkIHdpdGggaXQuVHNldF9wZXJzb25hbF9pZGVudGl0eQwBHGFjY291bnQEATBUOjpBY2NvdW50SWQAASRzaWduYXR1cmU1BAFQVDo6T2ZmY2hhaW5TaWduYXR1cmUAASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgAYLF0BU2V0cyB0aGUgdXNlcm5hbWUgYW5kIG9uLWNoYWluIGFjY291bnQgZm9yIGEgcGVyc29uLCBhbG9uZyB3aXRoIGFuIGVtcHR5IGlkZW50aXR5IHdoaWNoYQFjYW4gb25seSBiZSBwb3B1bGF0ZWQgdXNpbmcgYW4gb3JhY2xlIHRocm91Z2ggdGhlIHNvY2lhbCBjcmVkZW50aWFsIHZlcmlmaWNhdGlvbiBzeXN0ZW0unFRoZSBjaG9zZW4gdXNlcm5hbWUgbXVzdCBiZSBkb21haW5sZXNzLgBJAVRoZSBzZW5kZXIgbXVzdCBzaWduIHRoZSBhbGlhcyB1c2luZyB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgb24tY2hhaW5sYWNjb3VudCB0byBwcm92ZSBvd25lcnNoaXAuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGNvbnRleHR1YWwgYWxpYXMgb2YgdGhlIHBlcnNvbiBhbmQgdGhlEQFzZW5kZXIgbXVzdCBub3QgaGF2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlaXIgaWRlbnRpdHkgYW5kIHVzZXJuYW1lLgCoRW1pdHMgYFBlcnNvbmFsSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwujHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlBAEoY3JlZGVudGlhbEUEARhTb2NpYWwAGRgNAU9wZW4gYSBjYXNlIGZvciBhbiBvcmFjbGUgdG8ganVkZ2UgYSBzb2NpYWwgY3JlZGVudGlhbCBvZiBhIHBlcnNvbi4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY29udGV4dHVhbCBhbGlhcyBvZiB0aGUgcGVyc29uIGFuZCB0aGWcc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuAKBFbWl0cyBgRXZpZGVuY2VTdWJtaXR0ZWRgIGlmIHN1Y2Nlc3NmdWwuaHBlcnNvbmFsX2NyZWRlbnRpYWxfanVkZ2VkDAEYdGlja2V0OAFET3JhY2xlVGlja2V0T2Y8VD4AARxjb250ZXh0eAFASnVkZ2VtZW50Q29udGV4dAABJGp1ZGdlbWVudEkEATxPcmFjbGVKdWRnZW1lbnQAGghZAUNhbGxiYWNrIHRvIGVuZm9yY2UgdGhlIGp1ZGdlbWVudCBvZiBhIHNvY2lhbCBjcmVkZW50aWFsLiBUaGlzIGlzIHRvIGJlIGNhbGxlZCBvbmx5IGJ5gHRoZSBvcmFjbGUgdGhhdCBqdWRnZWQgdGhlIGNhc2UuXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5ABscUQFDbGVhciBhIHBlcnNvbidzIGlkZW50aXR5IGluZm8uIFRoZSBzZW5kZXIgbXVzdCBwYXkgYSBwZW5hbHR5IHRocm91Z2ggdGhlIGFzc29jaWF0ZWSgYWxpYXMgYWNjb3VudCBmb3IgcmVtb3ZpbmcgdGhlIGlkZW50aXR5LgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjb250ZXh0dWFsIGFsaWFzIG9mIHRoZSBwZXJzb24gYW5kIHRoZZxzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCBpZGVudGl0eS4AuEVtaXRzIGBJZGVudGl0eVBlcnNvbmFsQ2xlYXJlZGAgaWYgc3VjY2Vzc2Z1bC48cmVwb3J0X3VzZXJuYW1lBAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AHBTsUmVwb3J0IGEgdXNlcm5hbWUgYXMgaW52YWxpZC9vZmZlbnNpdmUvd3JvbmcvYW55dGhpbmcgZWxzZS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGEgc2lnbmVkIGV4dHJpbnNpYy4AqC0gYHVzZXJuYW1lYDogVGhlIHVzZXJuYW1lIHRvIGJlIHJlcG9ydGVkLmByZXBvcnRlZF91c2VybmFtZV9qdWRnZWQMARh0aWNrZXQ4AWBjcmF0ZTo6T3JhY2xlVGlja2V0T2Y8VD4AARxjb250ZXh0eAFASnVkZ2VtZW50Q29udGV4dAABJGp1ZGdlbWVudEkEATxPcmFjbGVKdWRnZW1lbnQAHSTkR2l2ZW4ganVkZ2VtZW50IG9uIGEgcHJldmlvdXNseSByZXBvcnRlZCB1c2VybmFtZSBlaXRoZXI6kDEuIEluIGNhc2UgdXNlcm5hbWUgd2FzIGZvdW5kIHZhbGlkOrwtIHNsYXNoZXMgdGhlIGFtb3VudCBkZXBvc2l0ZWQgYnkgdGhlIHJlcG9ydGVyLPAtIGRvZXMgbm90aGluZyB0byB0aGUgaWRlbnRpdHkgYmVoaW5kIHRoZSByZXBvcnRlZCB1c2VybmFtZSyYMi4gSW4gY2FzZSB1c2VybmFtZSB3YXMgZm91bmQgaW52YWxpZDq4LSByZXR1cm5zIHRoZSBkZXBvc2l0ZWQgZnVuZHMgdG8gdGhlIHJlcG9ydGVyLMQtIGJhbnMgdGhlIGlkZW50aXR5IGJlaGluZCB0aGUgcmVwb3J0ZWQgdXNlcm5hbWUu/FNlcnZlcyBhcyBhIGNhbGxiYWNrIHVzZWQgdXBvbiBqdWRnZW1lbnQgcmVxdWVzdCB0byB0aGUgb3JhY2xlLqhNdXN0IG9ubHkgYmUgdXNlZCBieSB0aGUgc3RhdGVtZW50IG9yYWNsZS4EcElkZW50aXR5IHBhbGxldCBkZWNsYXJhdGlvbi6pAwxkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZRhwZW9wbGUwSWRlbnRpdHlJbmZvAAAoARxkaXNwbGF5rQMBEERhdGEAARRsZWdhbK0DARBEYXRhAAEMd2VirQMBEERhdGEAARhtYXRyaXitAwEQRGF0YQABFGVtYWlsrQMBEERhdGEAATxwZ3BfZmluZ2VycHJpbnQhBAFAT3B0aW9uPFt1ODsgMjBdPgABFGltYWdlrQMBEERhdGEAARx0d2l0dGVyrQMBEERhdGEAARhnaXRodWKtAwEQRGF0YQABHGRpc2NvcmStAwEQRGF0YQAArQMMVGluZGl2X3BhbGxldF9pZGVudGl0eRR0eXBlcxBEYXRhAAGYEE5vbmUAAAAQUmF3MAQAsQMAAAEAEFJhdzEEALUDAAACABBSYXcyBAC5AwAAAwAQUmF3MwQAvQMAAAQAEFJhdzQEAHAAAAUAEFJhdzUEAMEDAAAGABBSYXc2BADFAwAABwAQUmF3NwQAyQMAAAgAEFJhdzgEAL0BAAAJABBSYXc5BADNAwAACgAUUmF3MTAEANEDAAALABRSYXcxMQQA1QMAAAwAFFJhdzEyBADZAwAADQAUUmF3MTMEAN0DAAAOABRSYXcxNAQA4QMAAA8AFFJhdzE1BADlAwAAEAAUUmF3MTYEAMEBAAARABRSYXcxNwQA6QMAABIAFFJhdzE4BADtAwAAEwAUUmF3MTkEAPEDAAAUABRSYXcyMAQAHAAAFQAUUmF3MjEEAPUDAAAWABRSYXcyMgQA+QMAABcAFFJhdzIzBAD9AwAAGAAUUmF3MjQEAAEEAAAZABRSYXcyNQQABQQAABoAFFJhdzI2BAAJBAAAGwAUUmF3MjcEAA0EAAAcABRSYXcyOAQAEQQAAB0AFFJhdzI5BAAVBAAAHgAUUmF3MzAEABkEAAAfABRSYXczMQQAHQQAACAAFFJhdzMyBAAIAAAhACxCbGFrZVR3bzI1NgQACAAAIgAYU2hhMjU2BAAIAAAjACRLZWNjYWsyNTYEAAgAACQALFNoYVRocmVlMjU2BAAIAAAlAACxAwAAAwAAAAAMALUDAAADAQAAAAwAuQMAAAMCAAAADAC9AwAAAwMAAAAMAMEDAAADBQAAAAwAxQMAAAMGAAAADADJAwAAAwcAAAAMAM0DAAADCQAAAAwA0QMAAAMKAAAADADVAwAAAwsAAAAMANkDAAADDAAAAAwA3QMAAAMNAAAADADhAwAAAw4AAAAMAOUDAAADDwAAAAwA6QMAAAMRAAAADADtAwAAAxIAAAAMAPEDAAADEwAAAAwA9QMAAAMVAAAADAD5AwAAAxYAAAAMAP0DAAADFwAAAAwAAQQAAAMYAAAADAAFBAAAAxkAAAAMAAkEAAADGgAAAAwADQQAAAMbAAAADAARBAAAAxwAAAAMABUEAAADHQAAAAwAGQQAAAMeAAAADAAdBAAAAx8AAAAMACEEBBhPcHRpb24EBFQBHAEIEE5vbmUAAAAQU29tZQQAHAAAAQAAJQQAAAIpBAApBAAABAgErQMALQQMVGluZGl2X3BhbGxldF9pZGVudGl0eRR0eXBlcyRKdWRnZW1lbnQEHEJhbGFuY2UBxAEgHFVua25vd24AAAAcRmVlUGFpZAQAxAEcQmFsYW5jZQABAChSZWFzb25hYmxlAAIAJEtub3duR29vZAADACRPdXRPZkRhdGUABAAoTG93UXVhbGl0eQAFACRFcnJvbmVvdXMABgAgRXh0ZXJuYWwABwAAMQQEGE9wdGlvbgQEVAE1BAEIEE5vbmUAAAAQU29tZQQANQQAAAEAADUECChzcF9ydW50aW1lOE11bHRpU2lnbmF0dXJlAAEQHEVkMjU1MTkEADkEAUhlZDI1NTE5OjpTaWduYXR1cmUAAAAcU3IyNTUxOQQAOQQBSHNyMjU1MTk6OlNpZ25hdHVyZQABABRFY2RzYQQAPQQBQGVjZHNhOjpTaWduYXR1cmUAAgAMRXRoBAA9BAFYZWNkc2E6OktlY2Nha1NpZ25hdHVyZQADAAA5BAAAA0AAAAAMAD0EAAADQQAAAAwAQQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AABFBBQ0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSBpZGVudGl0eRhTb2NpYWwAAQwcVHdpdHRlcgQBIHVzZXJuYW1lQQQBEERhdGEAAAAYR2l0aHViBAEgdXNlcm5hbWVBBAEQRGF0YQABABxEaXNjb3JkBAE8ZGlzcGxheV9hbmRfdGFnQQQBEERhdGEAAgAASQQQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkkSnVkZ2VtZW50AAEIFFRydXRoBABNBAEUVHJ1dGgAAAAgQ29udGVtcHQAAQAATQQQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkUVHJ1dGgAAQgQVHJ1ZQAAABRGYWxzZQABAABRBAxMaW5kaXZfcGFsbGV0X3Blb3BsZRhwYWxsZXQQQ2FsbAQEVAABICx1bmRlcl9hbGlhcwQBEGNhbGwgAbRCb3g8PFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpSdW50aW1lQ2FsbD4AABAVAURpc3BhdGNoIGEgY2FsbCB1bmRlciBhbiBhbGlhcyB1c2luZyB0aGUgYGFjY291bnQgPC0+IGFsaWFzYCBtYXBwaW5nLgBFAVRoaXMgaXMgYSBjYWxsIHZlcnNpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBgQXNQZXJzb25hbEFsaWFzV2l0aEFjY291bnRgLiUBSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gaW5zdGVhZCB3aGVuIHN1aXRhYmxlLkRzZXRfYWxpYXNfYWNjb3VudAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAATRjYWxsX3ZhbGlkX2F0OAFEQmxvY2tOdW1iZXJGb3I8VD4AASQtAVRoaXMgdHJhbnNhY3Rpb24gaXMgcmVmdW5kZWQgaWYgc3VjY2Vzc2Z1bCBhbmQgbm8gYWxpYXMgd2FzIHByZXZpb3VzbHkgc2V0LgCwVGhlIGNhbGwgaXMgdmFsaWQgZnJvbSBgY2FsbF92YWxpZF9hdGAgdW50aWy8YGNhbGxfdmFsaWRfYXQgKyBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYC4dAWBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYCBpcyBhIGNvbnN0YW50IGF2YWlsYWJsZSBpbiB0aGUgbWV0YWRhdGEuACxQYXJhbWV0ZXJzOrgtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gc2V0IHRoZSBhbGlhcyBmb3IuAQEtIGBjYWxsX3ZhbGlkX2F0YDogVGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZSBjYWxsIGJlY29tZXMgdmFsaWQuTHVuc2V0X2FsaWFzX2FjY291bnQAAgQVAVJlbW92ZSB0aGUgbWFwcGluZyBmcm9tIGEgcGFydGljdWxhciBhbGlhcyB0byBpdHMgcmVnaXN0ZXJlZCBhY2NvdW50Lmhmb3JjZV9yZWNvZ25pemVfcGVyc29uaG9vZAQBGHBlb3BsZVUEAUBWZWM8TWVtYmVyT2Y8VD4+AAMQ4FJlY29nbml6ZSBhIHNldCBvZiBwZW9wbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBjaGVja3MuAFEBVGhlIHBlb3BsZSBhcmUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgbGlzdCBvZiBrZXlzIGFuZCB3aWxsIGVhY2ggYmUgYXNzaWduZWQsIGlumG9yZGVyLCB0aGUgbmV4dCBhdmFpbGFibGUgcGVyc29uYWwgSUQuXHNldF9wZXJzb25hbF9pZF9hY2NvdW50CAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABNGNhbGxfdmFsaWRfYXQ4AURCbG9ja051bWJlckZvcjxUPgAEPGhTZXQgYSBwZXJzb25hbCBpZCBhY2NvdW50LgBNAVRoZSBhY2NvdW50IGNhbiB0aGVuIGJlIHVzZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgb24gYmVoYWxmIG9mIHRoZSBwZXJzb25hbCBpZCwgYW5kpHByb3ZpZGUgcmVwbGF5IHByb3RlY3Rpb24gd2l0aCB0aGUgbm9uY2UuAFEBVGhpcyB0cmFuc2FjdGlvbiBpcyByZWZ1bmRlZCBpZiBzdWNjZXNzZnVsIGFuZCBubyBhY2NvdW50IHdhcyBwcmV2aW91c2x5IHNldCBmb3IgdGhlMHBlcnNvbmFsIGlkLgCwVGhlIGNhbGwgaXMgdmFsaWQgZnJvbSBgY2FsbF92YWxpZF9hdGAgdW50aWy8YGNhbGxfdmFsaWRfYXQgKyBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYC4dAWBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYCBpcyBhIGNvbnN0YW50IGF2YWlsYWJsZSBpbiB0aGUgbWV0YWRhdGEuACxQYXJhbWV0ZXJzOrgtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gc2V0IHRoZSBhbGlhcyBmb3IuAQEtIGBjYWxsX3ZhbGlkX2F0YDogVGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZSBjYWxsIGJlY29tZXMgdmFsaWQuZHVuc2V0X3BlcnNvbmFsX2lkX2FjY291bnQABQR4VW5zZXQgdGhlIHBlcnNvbmFsIGlkIGFjY291bnQuYGNyZWF0ZV9wZW9wbGVfY29sbGVjdGlvbgAGKHRDcmVhdGUgdGhlIHBlb3BsZSBjb2xsZWN0aW9uLgApAVRoaXMgY2FsbCBpcyB2YWxpZCBvbmx5IGlmIHRoZSBjb2xsZWN0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LiBPbmNlIGNyZWF0ZWQsjHRoaXMgY2FsbCBjYW5ub3QgYmUgZXhlY3V0ZWQgYWdhaW4uANRUaGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdpdGggYSBmaXhlZCBjb25maWd1cmF0aW9uOrgtIE93bmVyOiBDb25maWd1cmVkIHZpYSBgQ29sbGVjdGlvbk93bmVyYCB0eXBlwC0gT25ib2FyZGluZyBzaXplOiBgUEVPUExFX09OQk9BUkRJTkdfU0laRWAgKDEwKUgtIE1vZGU6IGBGbGV4aWJsZWBMLSBSaW5nIHNpemU6IGBSMmU5YFhjbGVhbl91cF9zdGFsZV9hbGlhc2VzBAEcYWxpYXNlc1kEAdxCb3VuZGVkVmVjPENvbnRleHR1YWxBbGlhcywgQ29uc3RVMzI8TUFYX0JVTEtfQ0xFQU5VUD4+AAdQoFJlbW92ZSBzdGFsZSBhbGlhcyA8LT4gYWNjb3VudCBtYXBwaW5ncy4AYEEgbWFwcGluZyBpcyBzdGFsZSB3aGVuOi0BLSBpdHMgY29udGV4dCBoYXMgYmVlbiByZW1vdmVkIGZyb20gW2BDb25maWc6OkFjY291bnRDb250ZXh0c2BdIChnb3Zlcm5hbmNlqCAgcmVjb25maWd1cmF0aW9uLCBlbmRlZCBhaXJkcm9wIGV0Yy4pLCBvcnAtIGl0cyByaW5nIGhhcyBiZWVuIGRlbGV0ZWQuAB0BUmV2aXNpb24gbWlzbWF0Y2hlcyBkbyBub3QgcmVuZGVyIGFuIGFsaWFzIHN0YWxlLiBUaGUgdXNlciBjYW4gY29udGludWUVAXRyYW5zYWN0aW5nIHZpYSBgQXNQZXJzb25hbEFsaWFzV2l0aEFjY291bnRSZXZpc2VkYCB3aXRob3V0IGhhdmluZyB0b0xyZWRvIGFjY291bnQgc2V0dXAuAPxUeXBpY2FsbHkgc3VibWl0dGVkIGJ5IHRoZSBPQ1csIGJ1dCB0aGUgZGlzcGF0Y2ggZG9lcyBub3QgdHJ1c3SodGhlIGNhbGxlci4gRWFjaCBhbGlhcyBpcyByZS12YWxpZGF0ZWQgdmlh9FtgU2VsZjo6ZW5zdXJlX2FsaWFzX2lzX3N0YWxlYF07IHRob3NlIHRoYXQgYXJlIG5vdCBzdGFsZSBhcmUgc2tpcHBlZC4A8EF0IG1vc3QgW2BNQVhfQlVMS19DTEVBTlVQYF0gYWxpYXNlcyBhcmUgcHJvY2Vzc2VkIHBlciBjYWxsLgABAVRoZSB0cmFuc2FjdGlvbiBzb3VyY2UgbXVzdCBiZSBsb2NhbCBvciBpbi1ibG9jay4gVGh1cywgZXh0ZXJuYWx4aW52b2NhdGlvbnMgYXJlIG5vdCBwZXJtaXR0ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLlUEAAACCABZBAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAUkDBFMAAAQAXQQBGFZlYzxUPgAAXQQAAAJJAwBhBAxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldBBDYWxsBARUAAFEEHZvdGUIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEcb3BpbmlvbkkEASRKdWRnZW1lbnQAAATgRmVlbGVzcyBvbiBzdWNjZXNzIChkZXRlcm1pbmVkIG9ubHkgYnkgdG9wIHRocmVlIGxpbmVzKS4oY2xvc2VfY2FzZQQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgAAQAoY2xlYW5fdm90ZQgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgAARR2b3RlcggBFEFsaWFzAAIMJQFPcmlnaW4gbXVzdCBiZSBgTm9uZWAuIFRoZSB0cmFuc2FjdGlvbiBpcyB2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgYQF3aGVuIHRoZSBzb3VyY2UgaXMgbG9jYWwgKGUuZy4gZnJvbSB0aGUgb2ZmY2hhaW4gd29ya2VyKS4gRm9yIGV4dGVybmFsIHRyYW5zYWN0aW9ucywgdXNlUGBjbGVhbl92b3RlX3NpZ25lZGAuJHJlYXBfY2FzZQQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgAAwAkaW50ZXJ2ZW5lCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAABHHZlcmRpY3RJBAEkSnVkZ2VtZW50AAQAKGNsYWltX3ZvdGUEAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAUIIQFBIHBlcnNvbiBjbGFpbXMgdGhlIG1vYiBjcmVkaXQgYXNzb2NpYXRlZCB3aXRoIGEgY29ycmVjdCB2b3RlIG9uIGEgY2FzZS5gVGhlIGNhc2UgbXVzdCBiZSBgRG9uZWAuOHBheW91dF9yZXdhcmRzBAEsZGVzdGluYXRpb24EATBUOjpBY2NvdW50SWQABgQJAUEgcGVyc29uIGNvbnZlcnRzIHRoZWlyIGNsYWltZWQgbW9iIGNyZWRpdCBpbnRvIGEgZGlyZWN0IHRyYW5zZmVyLixjbGFpbV92b3RlcwQBMGNhc2VfaW5kaWNlc2UEAThWZWM8Q2FzZUluZGV4PgAHCDUBQSBwZXJzb24gY2xhaW1zIG11bHRpcGxlIG1vYiBjcmVkaXRzIGFzc29jaWF0ZWQgYSBjb3JyZWN0IHZvdGUgb24gYSBjYXNlLiBUaGVQY2FzZSBtdXN0IGJlIGBEb25lYC5Ic3RhcnRfcGF5b3V0X3JvdW5kAAgAWHNjaGVkdWxlX3BheW91dF9yb3VuZHMMARhhbW91bnTEATBCYWxhbmNlT2Y8VD4AARRjb3VudDgBDHUzMgABGHBlcmlvZDgBREJsb2NrTnVtYmVyRm9yPFQ+AAkAWHJlbW92ZV9wYXlvdXRfc2NoZWR1bGUEARRpbmRleDgBDHUzMgAKADBjbGFpbV9jcmVkaXQACwAwY2xlYW5fcG9pbnRzCAEUcm91bmQ4AShSb3VuZEluZGV4AAEUdm90ZXIIARRBbGlhcwAMAEBmb3JjZV9yaXBlbl9jYXNlBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAANACh0b3VjaF9jYXNlBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAAOAFBjbGVhcl92b3RpbmdfcGVuYWx0eQAPAERjbGVhbl92b3RlX3NpZ25lZAgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgAARR2b3RlcggBFEFsaWFzABAEWE9yaWdpbiBtdXN0IGJlIHNpZ25lZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuZQQAAAI4AGkEDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldBBDYWxsBARUAAFYFGFwcGx5AAAMkC0gRGVjbGFyZSBpbnRlbnRpb24gdG8gZ2V0IGEgdGF0dG9vLkwtIERlcG9zaXQgaXMgdGFrZW4uuC0gYElua1R5cGVgIG1heSBub3QgYmUgYFByb2NlZHVyYWxEZXJpdmF0aXZlYC48c3VibWl0X2V2aWRlbmNlBAEgZXZpZGVuY2UIATBFdmlkZW5jZUhhc2gAARC8LSBPcGVuIGEganVkaWNpYWwgY2FzZSB0byBqdWRnZSB0aGUgYGV2aWRlbmNlYC7ULSBDYWxscyBKdWRpY2lhbC9gSnVkZ2VTdGF0ZW1lbnQoUE9JX0hBU0gsIGV2aWRlbmNlKWBRAS0gTmVlZHMgYFNpZ25lZEV4dGVuc2lvbmAgdG8gYXZvaWQgdXBmcm9udCByZXF1aXJlbWVudCBmb3IgZmVlIGlmIGBqdWRnZW1lbnRzID09IDBgLjkBLSBJZiBganVkZ2VtZW50cyA+IDBgLCB0aGVuIGFuIGFkZGl0aW9uYWwgZmVlIHNob3VsZCBiZSBjaGFyZ2VkIGludG8gVHJlYXN1cnkuGGp1ZGdlZAwBGHRpY2tldDgBRE9yYWNsZVRpY2tldE9mPFQ+AAEcY29udGV4dHgBQEp1ZGdlbWVudENvbnRleHQAASRqdWRnZW1lbnRJBAEkSnVkZ2VtZW50AAIE6ElzIGNhbGxlZCBieSB0aGUgT3JhY2xlIHdoZW4gdGhlIGV2aWRlbmNlIGhhcyBiZWVuIGp1ZGdlZC5EcmVnaXN0ZXJfcmVmZXJyZWQMAQxrZXkIASxNZW1iZXJPZjxUPgABLGRlc3RpbmF0aW9uBAEwVDo6QWNjb3VudElkAAFIcHJvb2Zfb2Zfb3duZXJzaGlwbQQBsDxUOjpDcnlwdG8gYXMgR2VuZXJhdGVWZXJpZmlhYmxlPjo6U2lnbmF0dXJlAAMkUC0gR2V0cyBhIG5ldyBgaW5kZXhgeC0gUHV0cyBhbiBlbnRyeSBpbnRvIGBQZW9wbGVgLpgtIENhbGxzIFBlb3BsZS9gbmV3UGVyc29uKGluZGV4LCBrZXkpYAAsIyBBcmd1bWVudHOwKiBga2V5YCAtIFRoZSBwZXJzb25hbCBpZGVudGl0eSB0byByZWdpc3Rlci4hASogYGRlc3RpbmF0aW9uYCAtIFRoZSBhY2NvdW50IHJlY2VpdmluZyB0aGUgY2FuZGlkYXRlJ3MgcmVmZXJyYWwgcmV3YXJkLkkBKiBgcHJvb2Zfb2Zfb3duZXJoc2lwYCAtIFRoZSBzaWduYXR1cmUgb2YgcHJlZGVmaW5lZCBwcmVmaXggYCJwb3AgcmVnaXN0ZXIgdXNpbmciYKggIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBzZW5kZXIgYWNjb3VudCBpZC5UcmVnaXN0ZXJfbm9uX3JlZmVycmVkDAEMa2V5CAEsTWVtYmVyT2Y8VD4AASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAABSHByb29mX29mX293bmVyc2hpcG0EAbA8VDo6Q3J5cHRvIGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAEOFAtIEdldHMgYSBuZXcgYGluZGV4YHgtIFB1dHMgYW4gZW50cnkgaW50byBgUGVvcGxlYC6YLSBDYWxscyBQZW9wbGUvYG5ld1BlcnNvbihpbmRleCwga2V5KWAALCMgQXJndW1lbnRzsCogYGtleWAgLSBUaGUgcGVyc29uYWwgaWRlbnRpdHkgdG8gcmVnaXN0ZXIuwCogYGRlc3RpbmF0aW9uYCAtIFRoZSBhY2NvdW50IHJlY2VpdmluZyByZXdhcmRzLkkBKiBgcHJvb2Zfb2Zfb3duZXJoc2lwYCAtIFRoZSBzaWduYXR1cmUgb2YgcHJlZGVmaW5lZCBwcmVmaXggYCJwb3AgcmVnaXN0ZXIgdXNpbmciYKggIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBzZW5kZXIgYWNjb3VudCBpZC4AKCMgV2FybmluZzoAOQFUaGlzIGNhbGwgY2FuIHBheSB0d28gcmV3YXJkcyB0byB0aGUgc2FtZSBhY2NvdW50IGZvciBub24tcmVmZXJyZWQgY2FuZGlkYXRlcy4pAVRoZSBhcHAgaXMgcmVzcG9uc2libGUgZm9yIGFueSBhZGRpdGlvbmFsIHByaXZhY3kgaGFuZGxpbmcgYWZ0ZXIgdHJhbnNmZXIuGHJlcm9sbAAFABhjb21taXQIARhjaG9pY2VxBAEkSW5rQ2hvaWNlAAEocmVxdWlyZV9pZBUDAUhPcHRpb248UGVyc29uYWxJZD4ABhRJAUNvbW1pdCB0byBhIGRlc2lnbiBhbmQgYXV0aG9yaXplIHRoZSBzdG9yYWdlIGZvciAocG9zc2libHkganVzdCBpbml0aWFsKSBldmlkZW5jZS4AVQFJZiBhIHNwZWNpZmljIHBlcnNvbmFsIGlkZW50aXR5IGlzIHJlcXVpcmVkLCB0aGVuIHRoaXMgY2FuIGJlIHBsYWNlZCBpbiBgcmVxdWlyZV9pZGAuQQFUaGlzIGNhbiBiZSBhbnkgdW51c2VkL3VucmVzZXJ2ZWQgcGVyc29uYWwgaWRlbnRpdHkgbm8gZ3JlYXRlciB0aGFuIHRoZSBgTmV4dElkYCBjb3VudGVyLjRhbGxvY2F0ZV9mdWxsAAcAHHRpbWVvdXQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAgMOQFPbmNlIGEgdGltZW91dCBwYXNzZXMsIHJlbW92ZXMgYSBjYW5kaWRhdGUgd2hvIGlzIHNlbGVjdGVkIGJ1dCBub3QgeWV0IHByb3Zlbi5ZAUlmIHRoZSBjYW5kaWRhdGUgd2FzIHJlZmVycmVkIHRoZW4gcmVmZXJyYWwgaXMgYmFkLCBpZiBjYW5kaWRhdGUgYXBwbGllZCB3aXRoIGRlcG9zaXQsTGRlcG9zaXQgaXMgc2xhc2hlZC4gZmxha2VvdXQACQS0UmVtb3ZlIGEgY2FuZGlkYXRlIHdobyBoYXMgbm90IHlldCBjb21taXR0ZWQuUGFwcGx5X3dpdGhfc2lnbmF0dXJlDAEgcmVmZXJyZXIoAShQZXJzb25hbElkAAEkc2lnbmF0dXJlNQQBSFQ6OlRpY2tldFNpZ25hdHVyZQABGHRpY2tldAQBJFQ6OlRpY2tldAAKEHRVdGlsaXplIGEgcmVmZXJyYWwgc2lnbmF0dXJlLgBdAVRoZSBwYXlsb2FkIHRvIGJlIHNpZ25lZCBieSB0aGUgcmVmZXJyZXIgdXNpbmcgdGhlaXIgcmVnaXN0ZXJlZCBrZXkgcGFpciBpcyB0aGUgZW5jb2RlZKRieXRlcyBvZiB0aGUgYWNjb3VudCBJRCBvZiB0aGUgY2FuZGlkYXRlLlRhcHBseV93aXRoX2ludml0YXRpb24MARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEsVGlja2V0T2Y8VD4AASRzaWduYXR1cmU1BAFIVDo6VGlja2V0U2lnbmF0dXJlABMQ1EFwcGx5IHRvIHRoZSBQcm9vZi1vZi1JbmsgcHJvY2VzcyB3aXRoIGFuIGludml0YXRpb24uAFkBVGhlIHBheWxvYWQgdG8gYmUgc2lnbmVkIGJ5IHRoZSBpbnZpdGVyIHVzaW5nIHRoZWlyIHJlZ2lzdGVyZWQga2V5IHBhaXIgaXMgdGhlIGVuY29kZWSkYnl0ZXMgb2YgdGhlIGFjY291bnQgSUQgb2YgdGhlIGNhbmRpZGF0ZS5EYWRkX2Rlc2lnbl9mYW1pbHkMARRpbmRleC0DASxGYW1pbHlJbmRleAABEGtpbmR1BAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQACwTwQWRkIGEgZGVzaWduIGZhbWlseS4gTXVzdCBoYXZlIHByaXZpbGVnZWQgYWNjZXNzIHRvIGRvIHRoaXMuTHNldF9yZWZlcnJhbF90aWNrZXQEARh0aWNrZXQEASRUOjpUaWNrZXQADBi8QWRkIGEgcmVmZXJyYWwgdGlja2V0IGFzc29jaWF0ZWQgd2l0aCBhIHBlcnNvbi4AVQFPbmx5IG9uZSByZWZlcnJhbCB0aWNrZXQgbWF5IGJlIGFjdGl2ZSBhdCBhbnkgZ2l2ZW4gdGltZSBmb3Igb25lIHBlcnNvbi4gQ2FsbGluZyB0aGlzJQFleHRyaW5zaWMgd2hpbGUgYSB2YWxpZCB0aWNrZXQgaXMgc2V0IHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyB0aWNrZXQuADkBSWYgYW55IHBlbmRpbmcgcmVmZXJyYWwgcmV3YXJkcyBhcmUgcHJlc2VudCwgdGhleSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgZmlyc3QuWGNhbmNlbF9yZWZlcnJhbF90aWNrZXQEARh0aWNrZXQEASRUOjpUaWNrZXQADQTIQ2FuY2VsIGEgcmVmZXJyYWwgdGlja2V0IGFzc29jaWF0ZWQgd2l0aCBhIHBlcnNvbi6McmVnaXN0ZXJfc3VjY2Vzc2Z1bF9yZWZlcnJhbF9yZXdhcmQEASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAAOADRncmFudF9pbnZpdGVzCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAA8Y5EdyYW50cyBpbnZpdGVzIHRvIGFuIGFjY291bnQgc28gdGhleSBjYW4gZGlzdHJpYnV0ZSB0aGVtLgCYVGhlIG9yaWdpbiBtdXN0IGJlIGBJbnZpdGF0aW9uc09yaWdpbi4AsC0gYGFjY291bnRgOiBUaGUgYWNjb3VudCB0byBnaXZlIGludml0ZXMgdG8upC0gYGNvdW50YDogVGhlIG51bWJlciBvZiBpbnZpdGVzIHRvIGdpdmUukHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRsaW1pdDgBDHUzMgAQGJxSZW1vdmUgYWxsIGludml0ZXMgZ2l2ZW4gdG8gYW4gYWNjb3VudC4AnFRoZSBvcmlnaW4gbXVzdCBiZSBgSW52aXRhdGlvbnNPcmlnaW5gLgDQLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgaW52aXRlcyBmcm9tLuwtIGBsaW1pdGA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIGludml0ZXMgdG8gcmVtb3ZlLkRzZXRfaW52aXRlX3RpY2tldAQBGHRpY2tldAQBLFRpY2tldE9mPFQ+ABEUSEludml0ZSBhbiBhY2NvdW50LgANAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgaGF2ZSBzb21lIGludml0ZXMgbGVmdC4AlC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIHNldC5QY2FuY2VsX2ludml0ZV90aWNrZXQEARh0aWNrZXQEASxUaWNrZXRPZjxUPgASFFRDYW5jZWwgYW4gaW52aXRhdGlvbi4AIQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IHRoZSBhY2NvdW50IHRoYXQgb3ducyB0aGUgdGlja2V0IHRvIGNhbmNlbC4AoC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIGNhbmNlbC5Ec2V0X2NvbmZpZ3VyYXRpb24EARhjb25maWd5BAF8Q29uZmlnUmVjb3JkPEJsb2NrTnVtYmVyRm9yPFQ+PgAyBBUBU2V0IHRoZSBjb25maWd1cmF0aW9uIHJlY29yZC4gTXVzdCBoYXZlIHByaXZpbGVnZWQgYWNjZXNzIHRvIGRvIHRoaXMuYHNldF9yZWltYnVyc2VtZW50X3ZhbHVlcwgBPHJlZmVycmVkX3ZhbHVlc30EAehCb3VuZGVkVmVjPChCYWxhbmNlT2Y8VD4sIHUzMiksIFQ6Ok1heFJlaW1idXJzZW1lbnRWYWx1ZXM+AAE8cmVmZXJyZXJfdmFsdWVzfQQB6EJvdW5kZWRWZWM8KEJhbGFuY2VPZjxUPiwgdTMyKSwgVDo6TWF4UmVpbWJ1cnNlbWVudFZhbHVlcz4AMyhNAVNldCB0aGUgdmFsdWVzIG9mIHRoZSByZWltYnVyc2VtZW50IGF3YXJkZWQgdG8gcmVmZXJyZWQgY2FuZGlkYXRlcyBhcyB3ZWxsIGFzIHRoZWlyTQFyZWZlcnJlcnMsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiByZWltYnVyc2VtZW50cyBmb3IgZWFjaCB2YWx1ZS4gVGhlc2UgdmFsdWVzIGFyZSRzdG9yZWQgaW5RAXJldmVyc2Ugb3JkZXIgb2YgdGhlaXIgcHJpb3JpdHksIHNvIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IG9uZUkBdG8gYmUgdXNlZCBieSB0aGUgcmVpbWJ1cnNlbWVudCBzeXN0ZW0uIFRoZSBsZW5ndGggb2YgdGhlIHR3byBsaXN0cyBtdXN0IGJlIGVxdWFsLgAgV0FSTklORyEATQFBZnRlciB0aGUgbnVtYmVyIG9mIHJlaW1idXJzZW1lbnRzIGlzIGV4aGF1c3RlZCBmb3IgYSB2YWx1ZSBpbiB0aGUgbGlzdCwgdGhlIHBhbGxldPRzdGFydHMgdXNpbmcgdGhlIG5leHQgdmFsdWUgaW1tZWRpYXRlbHkgZm9yIGZ1dHVyZSB0cmFuc2ZlcnMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLm0EAAADYAAAAAwAcQQMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0JElua0Nob2ljZQABFEBEZXNpZ25lZEVsZWN0aXZlCAAtAwEsRmFtaWx5SW5kZXgAAC0DASxEZXNpZ25JbmRleAAAAERQcm9jZWR1cmFsQWNjb3VudAQALQMBLEZhbWlseUluZGV4AAEASFByb2NlZHVyYWxQZXJzb25hbAQALQMBLEZhbWlseUluZGV4AAIAKFByb2NlZHVyYWwIAC0DASxGYW1pbHlJbmRleAAADAEwVmFyaWFudEluZGV4AAMAUFByb2NlZHVyYWxEZXJpdmF0aXZlCAAoAShQZXJzb25hbElkAAAVAwFIT3B0aW9uPFBlcnNvbmFsSWQ+AAQAAHUEDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldChGYW1pbHlLaW5kAAEQIERlc2lnbmVkBAEUY291bnQtAwEsRGVzaWduSW5kZXgAAABEUHJvY2VkdXJhbEFjY291bnQAAQBIUHJvY2VkdXJhbFBlcnNvbmFsAAIAKFByb2NlZHVyYWwEARRyYW5nZQwBMFZhcmlhbnRJbmRleAADAAB5BAxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQwQ29uZmlnUmVjb3JkBCxCbG9ja051bWJlcgE4ACABOHJlcm9sbF90aW1lb3V0OAEsQmxvY2tOdW1iZXIAATxmYXN0dHJhY2tfY291bnQ4AQx1MzIAARxtYXhpbXVtOAEMdTMyAAE4ZnVsbF9hbGxvY19sZW4oAQx1NjQAAUBmdWxsX2FsbG9jX2NvdW50OAEMdTMyAAE4aW5pdF9hbGxvY19sZW4oAQx1NjQAAUBpbml0X2FsbG9jX2NvdW50OAEMdTMyAAEcdGltZW91dDgBLEJsb2NrTnVtYmVyAAB9BAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAYEEBFMAAAQAhQQBGFZlYzxUPgAAgQQAAAQIxDgAhQQAAAKBBACJBAxEaW5kaXZfcGFsbGV0X2dhbWUYcGFsbGV0EENhbGwEBFQAAUhMc2lnbl91cF93aXRoX2ludml0ZQQBOGlkZW50aWZpZXJfa2V5PQQBXENvbW11bmljYXRpb25JZGVudGlmaWVyAAAg0FNpZ24gdXAgZm9yIHRoZSBnYW1lIHVzaW5nIGFuIGFjY291bnQgYW5kIGFuIGludml0ZS4AFQFUaGlzIGlzIGZvciBuZXcgcGxheWVycyBvciBhcmNoaXZlZCBwbGF5ZXJzLCBvdGhlciBwbGF5ZXJzIHNob3VsZCB1c2WoW2BQYWxsZXQ6OnNpZ25fdXBfd2l0aF9hY2NvdW50YF0gZm9yIGZyZWUuANRBIGdhbWUgbXVzdCBiZSBvbmdvaW5nIGFuZCBpbiBpdHMgcmVnaXN0cmF0aW9uIHBoYXNlLgBBAVRoZSBvcmlnaW4gbXVzdCBiZSBhIHNpZ25lZCBieSBhbiBhY2NvdW50IGFuZCB1c2UgdGhlIGBHYW1lQXNJbnZpdGVkYCBleHRlbnNpb24uUHNpZ25fdXBfd2l0aF9hY2NvdW50BAE4aWRlbnRpZmllcl9rZXk9BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAASSYU2lnbiB1cCBmb3IgdGhlIGdhbWUgdXNpbmcgYW4gYWNjb3VudC4APQFJZiB0aGUgcGxheWVyIGlzIG5ldyBvciBhcmNoaXZlZCwgdGhlbiBhIGRlcG9zaXQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBzaWduZXIubE90aGVyd2lzZSB0aGUgY2FsbCBpcyBmcmVlLgDUQSBnYW1lIG11c3QgYmUgb25nb2luZyBhbmQgaW4gaXRzIHJlZ2lzdHJhdGlvbiBwaGFzZS4AMQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IGFuIGFjY291bnQsIG9yLCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgdXNlfGBTY29yZUFzUGFydGljaXBhbnRgIGV4dGVuc2lvbi5Ic2lnbl91cF93aXRoX2FsaWFzDAE4aWRlbnRpZmllcl9rZXk9BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAAURzdGF0ZW1lbnRfYWNjb3VudAQBMFQ6OkFjY291bnRJZAABDHNpZzUEAUxUOjpBY2NvdW50U2lnbmF0dXJlAAJIVFNpZ24gdXAgZm9yIHRoZSBnYW1lLgBVAUlmIGEgcGxheWVyIGlzIGFscmVhZHkgcmVjb2duaXplZCBieSBhbm90aGVyIERJTSwgdGhleSBjYW4gc2lnbiB1c2luZyB0aGVpciBhbGlhcyBhbmQRAWRvbid0IG5lZWQgYW55IGRlcG9zaXQgb3IgaW52aXRlIHRvIHByb3ZlIHRoZWlyIGluaXRpYWwgY3JlZGliaWxpdHkuYQFPbiB0b3Agb2YgdGhpcyB0aGVpciBzY29yZSBpcyBuZXZlciBnb2luZyBiZWxvdyBwZXJzb25ob29kIHRocmVzaG9sZCBhbmQgdGhlIHBsYXllciB3aWxsTG5ldmVyIGdldCBhcmNoaXZlZC4A1EEgZ2FtZSBtdXN0IGJlIG9uZ29pbmcgYW5kIGluIGl0cyByZWdpc3RyYXRpb24gcGhhc2UuAJBUaGUgb3JpZ2luIG11c3QgYmUgYSBwZXJzb25hbCBhbGlhcy4ALFBhcmFtZXRlcnM6YQEtIGBzdGF0ZW1lbnRfYWNjb3VudGA6IHRoZSBhY2NvdW50IGlkIHRvIHVzZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBzdGF0ZW1lbnQgc3RvcmUgZHVyaW5nLCAgdGhlIGdhbWUuVQEtIGBzaWdgOiB0aGUgcHJvb2Ygb2Ygb3duZXJzaGlwIG9mIHRoZSBhY2NvdW50IGBzdGF0ZW1lbnRfYWNjb3VudGAgYnkgYW4gYWxpYXMsIGl0IGlzXQEgIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UgYCJwb3A6Z2FtZTpzdG10X2FjY291bnRfZm9yX2FsaWFzOiJgIGNvbmNhdGVuYXRlZCB0byB0aGVJASAgYWxpYXMsIGFuZCB0aGVuIGhhc2hlZCB3aXRoIGBibGFrZTJfMjU2YCAoYmxha2UyIDI1NmJpdCBvdXRwdXQpLiBUaGUgYmFzZSBvZiB0aGUZASAgbWVzc2FnZSBjYW4gYmUgZm91bmQgaW4gdGhlIGNvbnN0YW50OiBgcHJvb2Zfb2Zfb3duZXJzaGlwX21zZ19iYXNlYC4YcmVwb3J0BAEsZnVsbF9yZXBvcnSNBAE0RnVsbFJlcG9ydDxUPgADLJRBZnRlciB0aGUgZ2FtZSwgc2VuZCB0aGUgZnVsbCByZXBvcnQuANBUaGUgZ2FtZSBtdXN0IGJlIG9uZ29pbmcgYW5kIGluIGl0cyByZXBvcnRpbmcgcGhhc2UuAFUBVGhlIG9yaWdpbiBtdXN0IGJlIGFuIGFsaWFzLCBvciBzaWduZWQgYnkgYW4gYWNjb3VudCwgb3Igc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIHVzZXxgU2NvcmVBc1BhcnRpY2lwYW50YCBleHRlbnNpb24uAEkBQWZ0ZXIgdGhlIHZvdGVzIGZyb20gdGhlIHJlcG9ydCBhcmUgY291bnRlZCwgdGhlIHJlcG9ydGVyIGFuZCBlYWNoIG9mIHRoZSByZXBvcnRlZEUBcGxheWVycyB3aG9zZSBhdHRlbmRhbmNlIGNhbiBub3cgYmUgZGV0ZXJtaW5lZCBhcmUgcHJvY2Vzc2VkIGVhcmx5LiBUaGlzIGxldHMgdGhlTQFnYW1lIHNraXAgdGhlIHBsYXllci1wcm9jZXNzIHBoYXNlIGVudGlyZWx5IHdoZW4gZXZlcnkgcGxheWVyIGhhcyBiZWVuIHByb2Nlc3NlZCBieVR0aGUgZW5kIG9mIHJlcG9ydGluZy4gb2ZmYm9hcmQABByAT2ZmYm9hcmQgYSBwbGF5ZXIgZnJvbSB0aGUgZ2FtZS4AVQFUaGUgb3JpZ2luIG11c3QgYmUgYW4gYWxpYXMsIG9yIHNpZ25lZCBieSBhbiBhY2NvdW50LCBvciBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgdXNlfGBTY29yZUFzUGFydGljaXBhbnRgIGV4dGVuc2lvbi4AXQFUaGVyZSBtdXN0IGJlIG5vIGdhbWUgb3IgdGhlIGV4aXN0aW5nIGdhbWUgbXVzdCBiZSBpbiByZWdpc3RyYXRpb24gcGhhc2UgYW5kIHRoZSBwbGF5ZXKUbXVzdCBoYXZlIG5vdCBzaWduZWQgdXAgZm9yIHRoZSBnYW1lLhxraWNrb3V0BAEYcGxheWVyBAEwVDo6QWNjb3VudElkAAUYMQFLaWNrb3V0IGEga2lja2FibGUgcGxheWVyIHRoYXQgaXMgbm90IHBsYXlpbmcgYWZ0ZXIgYE5vblBsYXlpbmdLaWNrb3V0VGltZWAuAKBUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IGFuIGFjY291bnQuACEBLSBgcGxheWVyYDogVGhlIHBsYXllciB0byBraWNrb3V0LiBJdCBtdXN0IGJlIGFyY2hpdmVkIGFuZCBraWNrYWJsZSB3aXRo2CAgYGFyY2hpdmVkX3NpbmNlYCBvbGRlciB0aGFuIGBOb25QbGF5aW5nS2lja291dFRpbWVgLjRncmFudF9pbnZpdGVzCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAAYY9EdyYW50IHNvbWUgaW52aXRlcyB0byBhbiBhY2NvdW50IHNvIHRoZXkgY2FuIGRpc3RyaWJ1dGUgdGhlbS4AiFRoZSBvcmlnaW4gbXVzdCBiZSBgSW52aXRlSXNzdWVyYC4AtC0gYGFjY291bnRgOiBUaGUgYWNjb3VudCB0byBncmFudCBpbnZpdGVzIHRvLqgtIGBjb3VudGA6IFRoZSBudW1iZXIgb2YgaW52aXRlcyB0byBncmFudC6QcmVtb3ZlX2F2YWlsYWJsZV9hbmRfcGVuZGluZ19pbnZpdGVzCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGxpbWl0OAEMdTMyAAcYmENsZWFyIGFsbCBpbnZpdGVzIGdpdmVuIHRvIGFuIGFjY291bnQuAIhUaGUgb3JpZ2luIG11c3QgYmUgYEludml0ZUlzc3VlcmAuANAtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gcmVtb3ZlIGFsbCBpbnZpdGVzIGZyb20u7C0gYGxpbWl0YDogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlbmRpbmcgaW52aXRlcyB0byByZW1vdmUuRHNldF9pbnZpdGVfdGlja2V0BAEYdGlja2V0BAEsVGlja2V0T2Y8VD4ACBRISW52aXRlIGFuIGFjY291bnQuAA0BVGhlIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSBhbiBhY2NvdW50IGFuZCBoYXZlIHNvbWUgaW52aXRlcyBsZWZ0LgCULSBgdGlja2V0YDogVGhlIGludml0ZSB0aWNrZXQgdG8gc2V0LlBjYW5jZWxfaW52aXRlX3RpY2tldAQBGHRpY2tldAQBLFRpY2tldE9mPFQ+AAkURENhbmNlbCBhbiBpbnZpdGUuACEBVGhlIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYWNjb3VudCB0aGF0IG93bnMgdGhlIHRpY2tldCB0byBjYW5jZWwuAKAtIGB0aWNrZXRgOiBUaGUgaW52aXRlIHRpY2tldCB0byBjYW5jZWwuOHNjaGVkdWxlX2dhbWVzBAE8Z2FtZXNfc2NoZWR1bGVzoQQBRFZlYzxHYW1lU2NoZWR1bGU+AAoI0FNjaGVkdWxlcyBuZXcgZ2FtZXMgYWNjb3JkaW5nIHRvIHByb3ZpZGVkIHNjaGVkdWxlcy5dAVNjaGVkdWxlcyBtdXN0IGJlIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCBhZnRlciB0aGUgb25nb2luZyBnYW1lIChpZiB0aGVyZSBpcyBhbnkpLlRyZW1vdmVfc2NoZWR1bGVkX2dhbWUEAThnYW1lX3BsYXlfdGltZTgBDHUzMgALADBjbGFpbV9yZXdhcmQEASxiZW5lZmljaWFyeQQBMFQ6OkFjY291bnRJZAAMOCUBQ2xhaW0gdGhlIHNjcmF0Y2ggY2FyZCByZXdhcmQgKGEuay5hLiAic3RhciBwcml6ZSIpIGZvciB0aGUgY3VycmVudCBnYW1lLgA1AVRoZSBjYWxsZXIgbXVzdCBiZSBhIHNpZ25lZCBhY2NvdW50IG9yIGEgcGFydGljaXBhbnQvcGVyc29uIG9yaWdpbiB3aG9zZSBnYW1lNQFpZGVudGl0eSB3YXMgZWxpZ2libGUgKGF0dGVuZGVkICsgcmVjb2duaXplZCkgZm9yIHRoZSBjdXJyZW50IHNjcmF0Y2ggcmV3YXJkLj0BVGhlIHBsYXllcidzIHNjcmF0Y2ggaGFzaCBtdXN0IGZhbGwgYmVsb3cgdGhlIHdpbm5lciB0aHJlc2hvbGQsIGFuZCBlYWNoIHBsYXllcjkBbWF5IGNsYWltIGF0IG1vc3Qgb25jZSBhY3Jvc3MgYWxsIGdhbWVzLiBFbGlnaWJsZSBwbGF5ZXJzIGNhbiBjbGFpbSBvbmx5IHVudGlsLQF0aGUgbmV4dCBnYW1lIGZpbmlzaGVzOyBvbmNlIHRoYXQgaGFwcGVucywgdGhlIHVuY2xhaW1lZCByZXdhcmQgaXMgZHJvcHBlZC4AHQFQZXItZ2FtZSBwcml6ZS1wb29sIGFpcmRyb3BzIGFyZSBjbGFpbWVkIHZpYSBbYFNlbGY6OmNsYWltX2dhbWVfcHJpemVgXQEBKHdoaWNoIGZvcndhcmRzIGludG8gdGhlIGFpcmRyb3AgcGFsbGV0KSwgbm90IHRocm91Z2ggdGhpcyBjYWxsLgAsUGFyYW1ldGVyczrsLSBgb3JpZ2luYDogYSBzaWduZWQgYWNjb3VudCwgcGFydGljaXBhbnQgb3IgcGVyc29uIG9yaWdpbi7MLSBgYmVuZWZpY2lhcnlgOiB0aGUgYWNjb3VudCB0byByZWNlaXZlIHRoZSByZXdhcmQuQGNsYWltX2dhbWVfcHJpemUUARxwb29sX2lkOAGEaW5kaXZfcGFsbGV0X2FpcmRyb3A6OlByaXplUG9vbElkAAEocmluZ19pbmRleDgBJFJpbmdJbmRleAABIHJldmlzaW9uOAE0UmV2aXNpb25JbmRleAABFHByb29mfQMBhDxUOjpBaXJkcm9wIGFzIEFpcmRyb3BBcGk+OjpQcm9vZgABLGJlbmVmaWNpYXJ5BAEwVDo6QWNjb3VudElkAA08CQFDbGFpbSBhIHByaXplIGZyb20gdGhlIHJlY3VycmluZyBwZXItZ2FtZSBwcml6ZSBwb29sIG9wZW5lZCBieSB0aGUJAWFpcmRyb3AgcGFsbGV0IGZvciBgZ2FtZV9pZGAuIFRoZSBwb29sIGlzIGlkZW50aWZpZWQgYnkgYHBvb2xfaWRgLNR3aGljaCBtdXN0IGJlIGEgYFByaXplVGFyZ2V0OjpHYW1lUGFydGljaXBhbnRzYCBwb29sLgD8VGhlIG9yaWdpbiBtdXN0IGJlIGEgc2lnbmVkIGFjY291bnQsIGEgcGFydGljaXBhbnQgb3JpZ2luLCBvciBhEQFwZXJzb24gb3JpZ2luLiBUaGUgcmVzb2x2ZWQgW2BBY2NvdW50T3JQZXJzb25gXSBpZGVudGl0eSBtdXN0IGFwcGVhcvRpbiBbYFBsYXllckF0dGVuZGFuY2VIaXN0b3J5YF0gZm9yIHRoZSBwb29sJ3MgZ2FtZTsgb3RoZXJ3aXNlaFtgRXJyb3I6Ok5vdFBhcnRpY2lwYW50YF0uABEBYHByb29mYCBpcyBhIHJpbmctbWVtYmVyc2hpcCBwcm9vZiB0aGF0IHRoZSBjYWxsZXIgaXMgYSBsaXRlIHBlcnNvbi4NAUl0IGlzIHZlcmlmaWVkIGJ5IHRoZSBhaXJkcm9wIHBhbGxldCBhZ2FpbnN0IHRoZSBwb29sJ3MgY29udGV4dCBhbmQJAWBiZW5lZmljaWFyeWAgKHNvIGEgY2FwdHVyZWQgcHJvb2YgY2Fubm90IHJlZGlyZWN0IHRoZSBwcml6ZSkuIFRoZRkBYWxpYXMgcmVjb3ZlcmVkIGZyb20gdGhhdCB2ZXJpZmljYXRpb24gZHJpdmVzIHRoZSBwZXItcG9vbCB3aW5uZXItaGFzaBUBY2hlY2s7IHRoZSByZXBsYXkgZ3VhcmQga2V5cyBvbiB0aGUgcmVzb2x2ZWQgaWRlbnRpdHkgZnJvbSB0aGUgb3JpZ2luGQEoQWNjb3VudCBvciBQZXJzb24pLCBzbyBlYWNoIGlkZW50aXR5IGNhbiBjbGFpbSBhdCBtb3N0IG9uY2UgcGVyIHBvb2wubHRlc3RuZXRfZm9yY2Vfc3RhcnRfc2h1ZmZsZQBlDNRGb3JjZSBzdGFydCB0aGUgc2h1ZmZsZSBiZWZvcmUgaXRzIG5vcm1hbCBzdGFydCB0aW1lLgBNAVRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSB0aGUgcm9vdCBvcmlnaW4gYW5kIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcubHRlc3RuZXRfZm9yY2VfZW5kX3JlcG9ydGluZwBmDPhGb3JjZSBlbmQgYSBnYW1lJ3MgcmVwb3J0aW5nIHBoYXNlIGJlZm9yZSBpdHMgbm9ybWFsIGVuZCB0aW1lLgBNAVRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSB0aGUgcm9vdCBvcmlnaW4gYW5kIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuXHRlc3RuZXRfc2V0X2dhbWVfcGhhc2VzBAEYcGhhc2VzqQQBTFBoYXNlRHVyYXRpb25WYWx1ZXMAZwyERm9yY2Ugc2V0IHRoZSBnYW1lIHBoYXNlIHBlcmlvZHMuAE0BVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IHRoZSByb290IG9yaWdpbiBhbmQgaXMgb25seSBtZWFudCBmb3IgdGVzdGluZy5kdGVzdG5ldF9raWxsX2N1cnJlbnRfZ2FtZQBoBMxLaWxsIHRoZSBjdXJyZW50IGdhbWUuIFdoYXRldmVyIHRoZSBwaGFzZSBpdCBpcyBpbi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMujQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGRBARTAAAEAJ0EARhWZWM8VD4AAJEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBlQQEUwAABACZBAEYVmVjPFQ+AACVBAxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXMYUmVwb3J0AAEIGFBlcnNvbgAAACROb3RQZXJzb24AAQAAmQQAAAKVBACdBAAAApEEAKEEAAACpQQApQQMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzMEdhbWVTY2hlZHVsZQAADAE4Z2FtZV9wbGF5X3RpbWU4AQx1MzIAARhyb3VuZHMMAQh1OAABOG1heF9ncm91cF9zaXplOAEMdTMyAACpBAxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXNMUGhhc2VEdXJhdGlvblZhbHVlcwAAFAEwcmVnaXN0cmF0aW9uOAEMdTMyAAEcc2h1ZmZsZTgBDHUzMgABTHBvc3Rfc2h1ZmZsZV9tYXJnaW44AQx1MzIAASRyZXBvcnRpbmc4AQx1MzIAAThwbGF5ZXJfcHJvY2VzczgBDHUzMgAArQQMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQQQ2FsbAQEVAABIFhzY2hlZHVsZV9wYXlvdXRfcm91bmRzDAEYYW1vdW50xAEwQmFsYW5jZU9mPFQ+AAEUY291bnQ4AQx1MzIAASBkdXJhdGlvbjgBREJsb2NrTnVtYmVyRm9yPFQ+AAEMXFNjaGVkdWxlIHBheW91dCByb3VuZHMuAJBDYWxsZWQgZnJvbSBgTWFuYWdlck9yaWdpbmAgb3Igcm9vdC5YcmVtb3ZlX3BheW91dF9zY2hlZHVsZQQBFGluZGV4OAEMdTMyAAIMgFJlbW92ZSBhIHNjaGVkdWxlZCBwYXlvdXQgcm91bmQuAJBDYWxsZWQgZnJvbSBgTWFuYWdlck9yaWdpbmAgb3Igcm9vdC5AdHJhbnNpdGlvbl9yb3VuZAQBLHJvdW5kX2luZGV4OAEMdTMyAAMYSFN0YXJ0IGEgbmV3IHJvdW5kLgBRAVRoaXMgaXMgdmFsaWQgaWYgdGhlIGN1cnJlbnQgcm91bmQgaXMgZmluaXNoZWQsIG9yIGlmIHRoZSBjdXJyZW50IHJvdW5kIGRvZXNuJ3QgaGF2ZahwbGFubmluZyBhbmQgYSBzY2hlZHVsZSBleGlzdHMgdG8gcGxhbiBpdC4AvFRoaXMgaXMgYSB0YXNrLCBhbmQgY2FuIGJlIGNhbGxlZCBmcm9tIGFueWJvZHkuUG9wZXJhdGVfcGF5b3V0X3JvdW5kCAEscm91bmRfaW5kZXg4AShSb3VuZEluZGV4AAEUbGltaXQ4AQx1MzIABDx4T3BlcmF0ZSBzb21lIHJvdW5kIHBheWluZyBvdXQuAFEBRHJhaW5zIHJvdW5kJ3MgcGFydGljaXBhbnRzLCB1cCB0byBhIGxpbWl0LiBGb3IgZWFjaCBwYXJ0aWNpcGFudCwgYWRkIHRoZSBjYWxjdWxhdGVkFQFyZXdhcmQgKGBiYXNlX3Jld2FyZCArIHJlbWFpbmRlcl9wb3J0aW9uYCkgdG8gdGhlaXIgYGNyZWRpdGAgYmFsYW5jZS4AYQFUaGVuLCBtb3ZlcyBmdW5kcyBvbiB0aGUgcG90IGFjY291bnQgZnJvbSBQYXlvdXQgdG8gQ3JlZGl0LCBzbyB0aGV5IGFyZSBvd2VkIHRvIHNwZWNpZmljoHBhcnRpY2lwYW50cyByYXRoZXIgdGhhbiB0aGUgcm91bmQgcG9vbC4ARQFGaW5hbGx5LCByZWxlYXNlIHRoZSBsZWZ0b3ZlciBmcm9tIHRoZSBQYXlvdXQgaG9sZCBiYWNrIHRvIHRoZSBwb3QncyBmcmVlIGJhbGFuY2VUKGZ1bmRzIGFyZSByZWN5Y2xlZCkuALxUaGlzIGlzIGEgdGFzaywgYW5kIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnlib2R5LgDEKiByb3VuZF9pbmRleDogVGhlIGluZGV4IG9mIHRoZSByb3VuZCB0byBvcGVyYXRlLhEBKiBsaW1pdDogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0byBvcGVyYXRlIGluIHRoaXMgY2FsbC4gY2FzaF9vdXQABSRZAUNhc2ggb3V0IGhhbGYgb2YgdGhlIHNjb3JlLCByb3VuZGVkIHVwLiBDb252ZXJ0cyB0aGUgc2NvcmUgaW50byBwb2ludHMgZm9yIHRoZSBjdXJyZW50JQFwYXlvdXQgcm91bmQuIENhbGxlciBtdXN0IGhhdmUgbmV2ZXIgcmVhY2hlZCBwZXJzb25ob29kIHNpbmNlIG9uYm9hcmRpbmcuALRJdCBjYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGdhbWUgc2Vzc2lvbiAoZXJhKS4APQFPcmlnaW4gbXVzdCBiZSBzaWduZWQgb3IgcGFydGljaXBhbnQgKHNpZ25lZCBleHRyaW5zaWMgdXNpbmcgU2NvcmVBc1BhcnRpY2lwYW50WHRyYW5zYWN0aW9uIGV4dGVuc2lvbikAzEFsaWFzIG9yaWdpbiBpcyBub3QgYWxsb3dlZCBhcyB0aGV5IGNhbid0IGNhc2ggb3V0LjRyZWRlZW1fY3JlZGl0BAEsZGVzdGluYXRpb24EATBUOjpBY2NvdW50SWQABhhRAVJlZGVlbSBmdWxsIGFjY3VtdWxhdGVkIGNyZWRpdCwgdHJhbnNmZXJyaW5nIGl0IHRvIHRoZSBwcm92aWRlZCBkZXN0aW5hdGlvbiBhY2NvdW50LgDkQ3JlZGl0IGlzIGNvbnZlcnRlZCBmcm9tIHBvaW50cyBkdXJpbmcgcGF5b3V0IHByb2Nlc3NpbmcuAEkBT3JpZ2luIG11c3QgYmUgYSBwZXJzb24gYWxpYXMsIGEgc2lnbmVkIGFjY291bnQgb3IgYSBwYXJ0aWNpcGFudCAoc2lnbmVkIGV4dHJpbnNpY8B1c2luZyBTY29yZUFzUGFydGljaXBhbnQgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uKS4gcmVnaXN0ZXIEAQxrZXmxBAENAU9wdGlvbjwoTWVtYmVyT2Y8VD4sPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUpCj4ABzTwUmVnaXN0ZXIgYXMgYSBwZXJzb24sIG9yIHJlc3VtZSBwZXJzb25ob29kIGFmdGVyIHN1c3BlbnNpb24uACUBUmVxdWlyZXMgc2NvcmUgPj0gcGVyc29uaG9vZCB0aHJlc2hvbGQgKG9yIGhhdmluZyBwcmV2aW91c2x5IHJlYWNoZWQgaXQpLgBhAUlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgcHJldmlvdXNseSByZWNvZ25pc2VkIGFuZCBpcyBub3cgc3VzcGVuZGVkLCB0aGV5IG11c3Qgbm90IHByb3ZpZGWIYSBrZXkuIFRoZSBleGlzdGluZyBrZXkgaXMgcmV1c2VkLgA9AUlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgbmV2ZXIgcmVjb2duaXNlZCwgdGhleSBtdXN0IHByb3ZpZGUgYSBrZXkgYW5kIGEgcHJvb2Ygb2YZAW93bmVyc2hpcCAoYGtleWAgcGFyYW1ldGVyKTogYSBzaWduYXR1cmUgb3ZlciBgInBvcCByZWdpc3RlciB1c2luZyIgfHxMc2VuZGVyX2FjY291bnRfaWRgLgBFAU9yaWdpbiBtdXN0IGJlIHNpZ25lZCBvciBhIHBhcnRpY2lwYW50IChzaWduZWQgZXh0cmluc2ljIHVzaW5nIFNjb3JlQXNQYXJ0aWNpcGFudFx0cmFuc2FjdGlvbiBleHRlbnNpb24pLmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQQBIHNjaGVkdWxluQQBREFic2VuY2VHcmFjZVRpZXJzAAg4fFNldCB0aGUgYWJzZW5jZSBncmFjZSBzY2hlZHVsZS4AKQFFdmVyeSB0aWVyIG11c3Qgc2F0aXNmeTogYDAgPD0gd2luZG93IDw9IDhgIGFuZCBgYWxsb3dlZF9taXNzZXMgPCB3aW5kb3dgLhUBYGFsbG93ZWRfbWlzc2VzID0gMGAgZGlzYWJsZXMgZ3JhY2UgZW50aXJlbHkgKGFueSBhYnNlbmNlIGltbWVkaWF0ZWx5KHN1c3BlbmRzKS4AJQFUaWVycyBtdXN0IGJlIHByb3ZpZGVkIGluIGFzY2VuZGluZyBvcmRlciBvZiBgcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZGAuAPxBbiBlbXB0eSBzY2hlZHVsZSBkaXNhYmxlcyB0aGUgZ3JhY2UgcGVyaW9kIGVudGlyZWx5IChpbW1lZGlhdGUdAXN1c3BlbnNpb24gb24gYW55IG1pc3NlZCBnYW1lKS4gVGhlIG5ldyByYXRpbyB0YWtlcyBlZmZlY3QgYXQgdGhlIHN0YXJ0CQFvZiB0aGUgbmV4dCByZXBvcnQgc2Vzc2lvbiB3aGVuIGB1cGRhdGVfdGhyZXNob2xkcygpYCByZWNhbGN1bGF0ZXNQYEFic2VuY2VHcmFjZVJhdGlvYC4AkENhbGxlZCBmcm9tIGBNYW5hZ2VyT3JpZ2luYCBvciByb290LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6xBAQYT3B0aW9uBARUAbUEAQgQTm9uZQAAABBTb21lBAC1BAAAAQAAtQQAAAQICG0EALkEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBvQQEUwAABADBBAEYVmVjPFQ+AAC9BAxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzQEFic2VuY2VHcmFjZVRpZXIAAAwBZHBvcHVsYXRpb25fc2l6ZV90aHJlc2hvbGQ4AQx1MzIAARh3aW5kb3cMAQh1OAABOGFsbG93ZWRfbWlzc2VzDAEIdTgAAMEEAAACvQQAxQQMWGluZGl2X3BhbGxldF9kdW1teV9kaW0YcGFsbGV0EENhbGwEBFQAASAscmVzZXJ2ZV9pZHMEARRjb3VudDgBDHUzMgAABIRSZXNlcnZlIGEgbnVtYmVyIG9mIHBlcnNvbmFsIElEcy5QcmVuZXdfaWRfcmVzZXJ2YXRpb24EAQhpZCgBKFBlcnNvbmFsSWQAAQS8UmVuZXcgYSBwZXJzb25hbCBJRC4gVGhlIElEIG11c3Qgbm90IGJlIGluIHVzZS5UY2FuY2VsX2lkX3Jlc2VydmF0aW9uBAEIaWQoAShQZXJzb25hbElkAAIEhENhbmNlbCBhIHBlcnNvbmFsIElEIHJlc2VydmF0aW9uLlByZWNvZ25pemVfcGVyc29uaG9vZAQBMGlkc19hbmRfa2V5c8kEAfBCb3VuZGVkVmVjPChQZXJzb25hbElkLCBNZW1iZXJPZjxUPiksIFQ6Ok1heFBlcnNvbkJhdGNoU2l6ZT4AAwQpAUdyYW50IHBlcnNvbmhvb2QgZm9yIGEgbGlzdCBvZiBjYW5kaWRhdGVzIHRoYXQgaGF2ZSByZXNlcnZlZCBwZXJzb25hbCBJRHMuSHN1c3BlbmRfcGVyc29uaG9vZAQBDGlkc9UEAbRCb3VuZGVkVmVjPFBlcnNvbmFsSWQsIFQ6Ok1heFBlcnNvbkJhdGNoU2l6ZT4ABAhdAVN1c3BlbmQgdGhlIHBlcnNvbmhvb2Qgb2YgYSBsaXN0IG9mIHJlY29nbml6ZWQgcGVvcGxlLiBUaGUgcGVvcGxlIG11c3Qgbm90IGN1cnJlbnRseSBiZShzdXNwZW5kZWQuRHJlc3VtZV9wZXJzb25ob29kBAEIaWQoAShQZXJzb25hbElkAAUEEQFSZXN1bWUgc29tZW9uZSdzIHBlcnNvbmhvb2QuIFRoZSBwZXJzb24gbXVzdCBjdXJyZW50bHkgYmUgc3VzcGVuZGVkLlhzdGFydF9tdXRhdGlvbl9zZXNzaW9uAAYIXQFTdGFydCBhIG11dGF0aW9uIHNlc3Npb24gaW4gdGhlIHVuZGVybHlpbmcgYFBlb3BsZWAgaW50ZXJmYWNlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hlY2slAXdoZXRoZXIgYSBtdXRhdGlvbiBzZXNzaW9uIGlzIGFscmVhZHkgb25nb2luZyBhbmQgY2FuIHN0YXJ0IG5ldyBzZXNzaW9ucy5QZW5kX211dGF0aW9uX3Nlc3Npb24ABxBdAUVuZCBhIG11dGF0aW9uIHNlc3Npb24gaW4gdGhlIHVuZGVybHlpbmcgYFBlb3BsZWAgaW50ZXJmYWNlLiBUaGlzIGNhbGwgY2FuIGVuZCBtdWx0aXBsZeBtdXRhdGlvbiBzZXNzaW9ucywgZXZlbiBvbmVzIG5vdCBzdGFydGVkIGJ5IHRoaXMgcGFsbGV0LgDYVGhpcyBjYWxsIHdpbGwgZmFpbCBpZiBubyBtdXRhdGlvbiBzZXNzaW9uIGlzIG9uZ29pbmcuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLskEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBzQQEUwAABADRBAEYVmVjPFQ+AADNBAAABAgoCADRBAAAAs0EANUEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKARTAAAEANkEARhWZWM8VD4AANkEAAACKADdBAxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBBDYWxsBARUAAEYeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRjb3VudDgBDHUzMgAAGCUBR3JhbnQgc29tZSBhdHRlc3RhdGlvbiBhbGxvd2FuY2UgdG8gYW4gYWNjb3VudCBzbyB0aGV5IGNhbiBhdHRlc3QgcGVvcGxlLgDEVGhlIG9yaWdpbiBtdXN0IGJlIGBBdHRlc3RhdGlvbkFsbG93YW5jZU1hbmFnZXJgLgDILSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIGdyYW50IGF0dGVzdGF0aW9ucyB0by68LSBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGF0dGVzdGF0aW9ucyB0byBncmFudC5sY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlBAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFLxDbGVhciBhbGwgYXR0ZXN0YXRpb24gYWxsb3dhbmNlIGZvciBhbiBhY2NvdW50LgDEVGhlIG9yaWdpbiBtdXN0IGJlIGBBdHRlc3RhdGlvbkFsbG93YW5jZU1hbmFnZXJgLgDkLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgYXR0ZXN0YXRpb25zIGZyb20uGGF0dGVzdBQBJGNhbmRpZGF0ZQQBMFQ6OkFjY291bnRJZAABTGNhbmRpZGF0ZV9zaWduYXR1cmU1BAFcVDo6QXR0ZXN0YXRpb25TaWduYXR1cmUAATByaW5nX3ZyZl9rZXkIASxNZW1iZXJPZjxUPgABSHByb29mX29mX293bmVyc2hpcG0EAThTaWduYXR1cmVPZjxUPgABVGNvbnN1bWVyX3JlZ2lzdHJhdGlvbuEEAaxPcHRpb248TGl0ZUNvbnN1bWVyUmVnaXN0cmF0aW9uUGFyYW1zT2Y8VD4+AAKESEF0dGVzdCBhbiBhY2NvdW50LgBFAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgaGF2ZSBzb21lIGF0dGVzdGF0aW9uIGFsbG93YW5jZSBsZWZ0LgDwVGhlIGF1dGhvcml0eSB3aWxsIGhhdmUgdG8gZ2V0IHR3byBzaWduYXR1cmVzIGZyb20gdGhlIHVzZXI6TQEtIG9uZSBjcmVhdGVkIHVzaW5nIHRoZWlyIGFjY291bnQga2V5IGF0dGVzdGluZyB0byB0aGUgb3duZXJzaGlwIG9mIHRoZSBgY2FuZGlkYXRlYCggIGFjY291bnQ7XQEtIG9uZSBjcmVhdGVkIHVzaW5nIHRoZWlyIHJpbmctdnJmIGtleSBhdHRlc3RpbmcgdG8gdGhlIG93bmVyc2hpcCBvZiB0aGUgYHJpbmdfdnJmX2tleWAYICBrZXkuAGEBVGhlIG1lc3NhZ2UgdG8gYmUgc2lnbmVkIGJ5IGJvdGgga2V5cyBmcm9tIHdoaWNoIHRoZSBzaWduYXR1cmVzIGFyZSBnZW5lcmF0ZWQgaXMgY3JlYXRlZFUBYnkgY29uY2F0ZW5hdGluZyB0aGUgYnl0ZXMgInBvcDpwZW9wbGUtbGl0ZTpyZWdpc3RlciB1c2luZyIgd2l0aCB0aGUgZW5jb2RlZCBieXRlcyBvZi0BdGhlIHVzZXIncyBhY2NvdW50IChgY2FuZGlkYXRlYCksIGFuZCB0aGUgZW5jb2RlZCBieXRlcyBvZiB0aGUgcmluZyBWUkYga2V5RChgcmluZ192cmZfa2V5YCkuAFhPbiBzdWNjZXNzLCB0aGlzIGNhbGw6wC0gc3RvcmVzIGxpdGUgcmVnaXN0cmF0aW9uIGRhdGEgaW4gYExpdGVQZW9wbGVgLPQtIGFkZHMgdGhlIHVzZXIncyByaW5nIFZSRiBrZXkgdG8gdGhlIGxpdGUgbWVtYmVyIGNvbGxlY3Rpb24uAC0BVGhlIGxpdGUgbWVtYmVyIGNvbGxlY3Rpb24gbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBieSBgb25fcG9sbGAuAPwtIGBjYW5kaWRhdGVgOiBUaGUgY2FuZGlkYXRlIHRvIGJlIHJlY29nbml6ZWQgYXMgYSBsaXRlIHBlcnNvbi5hAS0gYGNhbmRpZGF0ZV9zaWduYXR1cmVgOiBUaGUgc2lnbmF0dXJlLCBwcm92aWRlZCBieSB0aGUgY2FuZGlkYXRlLCB0byBhbGxvdyB0aGUgYXR0ZXN0ZXLcICB0byBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3Mgb24gdGhlaXIgYmVoYWxmLiUBLSBgcmluZ192cmZfa2V5YDogVGhlIHJpbmcgVlJGIGtleSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpdGUgcGVyc29uLl0BLSBgcmluZ192cmZfa2V5X3NpZ25hdHVyZWA6IFRoZSByaW5nIFZSRiBzaWduYXR1cmUsIHByb3ZpZGVkIGJ5IHRoZSBjYW5kaWRhdGUsIHRvIGFsbG93VQEgIHRoZSBhdHRlc3RlciB0byBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MuIFRoaXMgYWxzbyBwcm92ZSB0aGUgb3duZXJzaGlwIG9mkCAgdGhlIHJpbmcgVlJGIGtleSBieSB0aGUgY2FuZGlkYXRlLl0BLSBjb25zdW1lcl9yZWdpc3RyYXRpb246IE9wdGlvbmFsIHBhcmFtZXRlciB3aGljaCBjYW4gY29udGFpbiB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uXQEgIHRvIGZvcndhcmQgYSBjb25zdW1lciByZWdpc3RyYXRpb24gcmVxdWVzdCB0byB0aGUgYExpdGVDb25zdW1lclJlZ2lzdHJhcmAgc2VydmljZS4gSWZRASAgcHJlc2VudCwgaXQgYWxzbyBjb250YWlucyBhIHNpZ25hdHVyZSBjcmVhdGVkIGJ5IHRoZSB1c2VyIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoZSUBICBpbnRlbnQuIE1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHNpZ25pbmcgcGF5bG9hZCBnZW5lcmF0aW9uIGF2YWlsYWJsZSBpbuwgIFt0eXBlczo6TGl0ZUNvbnN1bWVyUmVnaXN0cmF0aW9uUGFyYW1zOjpzaWduaW5nX3BheWxvYWRdLkhkaXNwYXRjaF9hc19zaWduZXIEARBjYWxsIAFMQm94PFQ6OlJ1bnRpbWVDYWxsPgAFAERzZXRfYWxpYXNfYWNjb3VudAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAATh2YWxpZF9hdF9ibG9jazgBREJsb2NrTnVtYmVyRm9yPFQ+AAYQtFNldCB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBsaXRlIGFsaWFzLgC0VGhlIGNhbGwgaXMgdmFsaWQgZnJvbSBgdmFsaWRfYXRfYmxvY2tgIHVudGlsxGB2YWxpZF9hdF9ibG9jayArIGFjY291bnRfc2V0dXBfYmxvY2tfdG9sZXJhbmNlYC5MdW5zZXRfYWxpYXNfYWNjb3VudAAHAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7hBAQYT3B0aW9uBARUAeUEAQgQTm9uZQAAABBTb21lBADlBAAAAQAA5QQMYGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZRR0eXBlc3hMaXRlQ29uc3VtZXJSZWdpc3RyYXRpb25QYXJhbXMIJEFjY291bnRJZAEEJFNpZ25hdHVyZQE1BAAUASRzaWduYXR1cmU1BAEkU2lnbmF0dXJlAAEcYWNjb3VudAQBJEFjY291bnRJZAABOGlkZW50aWZpZXJfa2V5PQQBXENvbW11bmljYXRpb25JZGVudGlmaWVyAAEgdXNlcm5hbWVBBAEgVXNlcm5hbWUAAURyZXNlcnZlZF91c2VybmFtZekEAUBPcHRpb248VXNlcm5hbWU+AADpBAQYT3B0aW9uBARUAUEEAQgQTm9uZQAAABBTb21lBABBBAAAAQAA7QQMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMYcGFsbGV0EENhbGwEBFQAATRQcmVnaXN0ZXJfbGl0ZV9wZXJzb24MAThpZGVudGlmaWVyX2tleT0EAVxDb21tdW5pY2F0aW9uSWRlbnRpZmllcgABIHVzZXJuYW1lQQQBIFVzZXJuYW1lAAFEcmVzZXJ2ZWRfdXNlcm5hbWXpBAFAT3B0aW9uPFVzZXJuYW1lPgAABJRSZWdpc3RlciBhIGxpdGUgcGVyc29uIGFzIGEgY29uc3VtZXIuPHJlZ2lzdGVyX3BlcnNvbgwBUGxpbmtlZF9saXRlX2lkZW50aXR5BAEwVDo6QWNjb3VudElkAAFMbGl0ZV9pZGVudGl0eV9wcm9vZjUEAVBUOjpPZmZjaGFpblNpZ25hdHVyZQABPHVzZXJuYW1lX2Nob2ljZfEEAVhQZXJzb25hbFVzZXJuYW1lQ2hvaWNlAAEknFJlZ2lzdGVyIGEgcHJvdmVuIHBlcnNvbiBhcyBhIGNvbnN1bWVyLgBdAVRoZSBwZXJzb24gbXVzdCBsaW5rIGEgcHJldmlvdXNseSByZWNvZ25pemVkIGxpdGUgaWRlbnRpdHksIHdoaWNoIHdpbGwgYmUgdXBncmFkZWQgdG8gYVkBZnVsbCBwZXJzb24gY29uc3VtZXIuIEluIG9yZGVyIHRvIHByb3ZlIHRoZXkgaG9sZCB0aGUgbGl0ZSBpZGVudGl0eSB0aGV5IHdhbnQgdG8gbGluayxhAXVzZXJzIG11c3QgcHJvdmlkZSBhIGBsaXRlX2lkZW50aXR5X3Byb29mYCBzaWduYXR1cmUsIGNyZWF0ZWQgYnkgc2lnbmluZyB0aGUgYWxpYXMgYnl0ZXOIdXNpbmcgdGhlaXIgbGl0ZSBjb25zdW1lciBhY2NvdW50LgA5AVRoZSBjb25zdW1lciBjYW4gY2hvb3NlIGlmIHRoZXkgd2FudCB0byBoYXZlIGEgbmV3IHVzZXJuYW1lIG9yIHVzZSBhbiBleGlzdGluZxUBcmVzZXJ2YXRpb24gbWFkZSBpbiB0aGUgbmFtZSBvZiB0aGUgbGl0ZSBjb25zdW1lciB3aG8gd2lsbCBiZSBsaW5rZWQuaHRvdWNoX3BlcnNvbl9hdXRob3JpemF0aW9uAAIQSQFVcGRhdGUgYSBwZXJzb24ncyBhdXRob3JpemF0aW9uIGJ5IGVuc3VyaW5nIHRoZXkgY2FuIHN0aWxsIGF1dGhlbnRpY2F0ZSBhcyBwZW9wbGUuAFEBVGhpcyBjYWxsIG11c3QgYmUgcGVyZm9ybWVkIGF0IGxlYXN0IGBNaW5QZXJzb25BdXRoVXBkYXRlSW50ZXJ2YWxgIHNlY29uZHMgYWZ0ZXIgdGhllGxhc3QgdXBkYXRlIGluIG9yZGVyIHRvIHByZXZlbnQgc3BhbS6McmVtb3ZlX2V4cGlyZWRfdXNlcm5hbWVfcmVzZXJ2YXRpb24IASB1c2VybmFtZUEEASBVc2VybmFtZQABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAyA5AVJlbW92ZSBhbiBleHBpcmVkIGVudHJ5IGZyb20gYSB1c2VybmFtZSByZXNlcnZhdGlvbiBxdWV1ZS4gVGhlIHRhcmdldCBlbnRyeSBpcwEBaWRlbnRpZmllZCBieSBgYWNjb3VudGAgYW5kIGNhbiBiZSBhdCBhbnkgcG9zaXRpb24gaW4gdGhlIHF1ZXVlLh0BRWFjaCBjYWxsIHJlbW92ZXMgZXhhY3RseSBvbmUgZW50cnksIHNvIGl0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG+QY2xlYXIgbXVsdGlwbGUgZXhwaXJlZCByZXNlcnZhdGlvbnMuAC0BVGhpcyBpcyBhIHBlcm1pc3Npb25sZXNzIGNhbGw7IHRoZSBvcmlnaW4gbXVzdCBiZSBhdXRob3JpemVkLiBUaGUgYGFjY291bnRgMQFwYXJhbWV0ZXIgaXMgYWxzbyB1c2VkIGZvciB0cmFuc2FjdGlvbiBwb29sIGRlZHVwbGljYXRpb24sIGFsbG93aW5nIHBhcmFsbGVsEQFzdWJtaXNzaW9ucyB0aGF0IHRhcmdldCBkaWZmZXJlbnQgZXhwaXJlZCBlbnRyaWVzIGluIHRoZSBzYW1lIHF1ZXVlLlR1cGRhdGVfaWRlbnRpZmllcl9rZXkEAThpZGVudGlmaWVyX2tleT0EAVxDb21tdW5pY2F0aW9uSWRlbnRpZmllcgAEENhVcGRhdGUgdGhlIGNvbW11bmljYXRpb24gaWRlbnRpZmllciBrZXkgb2YgYSBjb25zdW1lci4AQQFUaGUgb3JpZ2luIG11c3QgYmUgdGhlIGFjY291bnQgcmVnaXN0ZXJlZCBmb3IgdGhhdCBjb25zdW1lciwgcmVnYXJkbGVzcyBvZiB0aGVpcjBjcmVkaWJpbGl0eS6Ec2V0X3VzZXJuYW1lX3Jlc2VydmF0aW9uX2R1cmF0aW9uBAEgZHVyYXRpb24oAQx1NjQABQwdAVNldCB0aGUgZHVyYXRpb24gZm9yIHdoaWNoIGEgdXNlcm5hbWUgcmVzZXJ2YXRpb24gaXMgdmFsaWQsIGluIHNlY29uZHMuAGBUaGUgb3JpZ2luIG11c3QgYmUgcm9vdC5MZGVtb3RlX2F1dGhfZXhwaXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQABwwxAURlbW90ZSBhIGZ1bGwgcGVyc29uIHRvIGEgbGl0ZSBwZXJzb24gYWZ0ZXIgdGhlaXIgYXV0aG9yaXphdGlvbiBoYXMgZXhwaXJlZC4A9FRoaXMgaXMgYSBwZXJtaXNzaW9ubGVzcyBjYWxsOyB0aGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZC7Ec2V0X2ZyaWVuZF9yZXF1ZXN0X3N0YXRlbWVudF9hY2NvdW50X2Zvcl9zZXF1ZW5jZQgBJHJlZmVyZW5jZfUEAVhGcmllbmRSZXF1ZXN0UmVmZXJlbmNlAAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAAIQBUBQXNzb2NpYXRlIGEgc3RhdGVtZW50IGFjY291bnQgd2l0aCBhIGZyaWVuZCByZXF1ZXN0IGNvbnRleHQgc2VxdWVuY2UuAFkBVGhlIGFzc29jaWF0ZWQgYWNjb3VudCBjYW4gc3VibWl0IHN0YXRlbWVudHMgd2hpbGUgdGhpcyBmcmllbmQgcmVxdWVzdCByZWdpc3RyYXRpb24gaXMcYWN0aXZlLjUBVGhlIG9yaWdpbiBtdXN0IGJlIGBPcmlnaW46OkZyaWVuZFJlcXVlc3RBbGlhc2AsIGNyZWF0ZWQgYnkgdGhlIGBBc1Jlc291cmNlc2BRAShgUmVnaXN0ZXJGcmllbmRSZXF1ZXN0V2l0aFByb29mKC4uKWApIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBhZnRlciBwcm9vZiB2YWxpZGF0aW9uLh0BT24gc3VjY2VzcywgaW5jcmVhc2VzIHN0YXRlbWVudCBhbGxvd2FuY2UgYW5kIHN0b3JlcyByZWdpc3RyYXRpb24gc3RhdGVoYHthY2NvdW50X2lkLCByZWZlcmVuY2V9YC4ALFBhcmFtZXRlcnM6zCogYHJlZmVyZW5jZWA6IGZyaWVuZCByZXF1ZXN0IHBlcmlvZC9zZXF1ZW5jZSBwYWlyLjEBICAtIGByZWZlcmVuY2UucGVyaW9kYCBtdXN0IGJlIGluIHRoZSBhY2NlcHRlZCBwZXJpb2Qgd2luZG93OiBgW3BlcmlvZChub3cgLbQgICAgRnJpZW5kUmVxdWVzdEdyYWNlV2luZG93KSwgcGVyaW9kKG5vdyldYC4FASAgLSBgcmVmZXJlbmNlLnNlcWAgbXVzdCBiZSBpbiBgMC4uPUZyaWVuZFJlcXVlc3RTbG90c1BlclBlcmlvZGAuTQEqIGBhY2NvdW50X2lkYDogc3RhdGVtZW50IGFjY291bnQgdG8gYXV0aG9yaXplLiBNdXN0IG5vdCBhbHJlYWR5IGJlIHVzZWQgYnkgYW5vdGhlcnggIGZyaWVuZCByZXF1ZXN0IHJlZ2lzdHJhdGlvbi6UY2xlYXJfZXhwaXJlZF9mcmllbmRfcmVxdWVzdF9zZXF1ZW5jZQgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAAQxzZXEMAQh1OAAJKDUBQ2xlYXIgYSBzdGFsZSBmcmllbmQgcmVxdWVzdCByZWdpc3RyYXRpb24gYW5kIHJldm9rZSBpdHMgc3RhdGVtZW50IGFsbG93YW5jZS4A9FRoaXMgaXMgYSBwZXJtaXNzaW9ubGVzcyBjYWxsOyB0aGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZC4hAVN1Y2NlZWRzIG9ubHkgd2hlbiB0aGUgcmVnaXN0cmF0aW9uJ3MgcGVyaW9kLWRlcml2ZWQgZXhwaXJ5IGhhcyBlbGFwc2VkLmEBT24gc3VjY2VzcywgcmVtb3ZlcyBmcmllbmQgcmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdGUgYW5kIGRlY3JlYXNlcyBzdGF0ZW1lbnQgYWxsb3dhbmNlLgAsUGFyYW1ldGVyczphASogYGFjY291bnRgOiBzdGF0ZW1lbnQgYWNjb3VudCBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCBhIGZyaWVuZCByZXF1ZXN0IHJlZ2lzdHJhdGlvbi5ZASogYHNlcWA6IGZyaWVuZCByZXF1ZXN0IHNlcXVlbmNlIHRvIGNsZWFyLiBNdXN0IG1hdGNoIHN0b3JlZCByZWdpc3RyYXRpb24gc2VxdWVuY2UgYW5kqCAgYmUgaW4gYDAuLj1GcmllbmRSZXF1ZXN0U2xvdHNQZXJQZXJpb2RgLmxzZXRfc3RhdGVtZW50X3N0b3JlX2FjY291bnQMARhwZXJpb2Q4AQx1MzIAAQxzZXE4AQx1MzIAATh0YXJnZXRfYWNjb3VudAQBMFQ6OkFjY291bnRJZAAKLAkBQ2xhaW0gYW4gYW5vbnltb3VzIHN0YXRlbWVudCBzdG9yZSBhbGxvd2FuY2UgZm9yIGEgdGFyZ2V0IGFjY291bnQuACkBVGhlIG9yaWdpbiBtdXN0IGJlIGBPcmlnaW46OlN0bXRTdG9yZUFsaWFzYCwgcHJvZHVjZWQgYnkgdGhlIGBBc1Jlc291cmNlc2BVAShgUmVnaXN0ZXJTdGF0ZW1lbnRTdG9yZUFsbG93YW5jZSguLilgKSB0cmFuc2FjdGlvbiBleHRlbnNpb24gYWZ0ZXIgcHJvb2YgdmFsaWRhdGlvbi5FAU9uIHN1Y2Nlc3MsIGluY3JlYXNlcyB0aGUgc3RhdGVtZW50IGFsbG93YW5jZSBmb3IgYHRhcmdldF9hY2NvdW50YCBhbmQgc3RvcmVzIHRoZZhtYXBwaW5nIGluIGBTdGF0ZW1lbnRTdG9yZUFsbG93YW5jZXNgLgAsUGFyYW1ldGVyczo9ASogYHBlcmlvZGA6IGRheSBudW1iZXIgc2luY2UgVW5peCBlcG9jaC4gTXVzdCBiZSBpbiB0aGUgYWNjZXB0ZWQgcGVyaW9kIHdpbmRvdy5FASogYHNlcWA6IHNsb3QgbnVtYmVyIHdpdGhpbiB0aGUgcGVyaW9kLCBib3VuZGVkIGJ5IHRoZSBjb2xsZWN0aW9uLXNwZWNpZmljIGxpbWl0LswqIGB0YXJnZXRfYWNjb3VudGA6IHN0YXRlbWVudCBhY2NvdW50IHRvIGF1dGhvcml6ZS6MY2xlYXJfZXhwaXJlZF9zdG10X3N0b3JlX2FsbG93YW5jZXMIARhwZXJpb2Q4AQx1MzIAASxmaXJzdF9lbnRyeQgBFEFsaWFzAAsU8FJlbW92ZSBleHBpcmVkIHN0YXRlbWVudCBzdG9yZSBhbGxvd2FuY2VzIGZvciBhIHBhc3QgcGVyaW9kLgD0VGhpcyBpcyBhIHBlcm1pc3Npb25sZXNzIGNhbGw7IHRoZSBvcmlnaW4gbXVzdCBiZSBhdXRob3JpemVkLkUBUmVtb3ZlcyB1cCB0byBgU3RtdFN0b3JlQ2xlYW51cExpbWl0YCBlbnRyaWVzIGZyb20gYFN0YXRlbWVudFN0b3JlQWxsb3dhbmNlc2AgZm9yQQF0aGUgZ2l2ZW4gYHBlcmlvZGAsIGRlY3JlYXNpbmcgdGhlIHN0YXRlbWVudCBhbGxvd2FuY2UgZm9yIGVhY2ggcmVtb3ZlZCBhY2NvdW50LlxjbGFpbV9sb25nX3Rlcm1fc3RvcmFnZQwBGHBlcmlvZDgBDHUzMgABHGNvdW50ZXIMAQh1OAABKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQADDA5AUNsYWltIGxvbmctdGVybSBzdG9yYWdlIG9uIGEgcmVtb3RlIGNoYWluIHVzaW5nIGFuIGFub255bW91cyBtZW1iZXJzaGlwIHByb29mLgBRAVRoZSBvcmlnaW4gbXVzdCBiZSBgT3JpZ2luOjpMb25nVGVybVN0b3JhZ2VDbGFpbShhbGlhcywgY29sbGVjdGlvbilgLCBjcmVhdGVkIGJ5IHRoZVUBYEFzUmVzb3VyY2VzYCAoYENsYWltTG9uZ1Rlcm1TdG9yYWdlKC4uKWApIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBhZnRlciByaW5nLVZSRiBwcm9vZix2YWxpZGF0aW9uLgAsUGFyYW1ldGVyczpJASogYHBlcmlvZGA6IHRoZSBjbGFpbWluZyBwZXJpb2QuIE11c3QgYmUgdGhlIGN1cnJlbnQgcGVyaW9kIG9yIHRoZSBwcmV2aW91cyBvbmUgaWZoICB3aXRoaW4gdGhlIGdyYWNlIHdpbmRvdy4NASogYGNvdW50ZXJgOiB0aGUgY2xhaW0gY291bnRlciB3aXRoaW4gdGhlIHBlcmlvZC4gTXVzdCBiZSBsZXNzIHRoYW4tASAgYExvbmdUZXJtU3RvcmFnZUNsYWltc1BlclBlcmlvZGAuIEVhY2ggY291bnRlciBwcm9kdWNlcyBhIGRpc3RpbmN0IGFsaWFzLiUBKiBgYWNjb3VudF9pZGA6IHRoZSBhY2NvdW50IHRvIGF1dGhvcml6ZSBmb3Igc3RvcmFnZSBvbiB0aGUgcmVtb3RlIGNoYWluLpxjbGVhcl9leHBpcmVkX2xvbmdfdGVybV9zdG9yYWdlX2FsaWFzZXMIARhwZXJpb2Q4AQx1MzIAARRsaW1pdDgBDHUzMgANIPBDbGVhciBzcGVudCBsb25nLXRlcm0gc3RvcmFnZSBhbGlhc2VzIGZvciBhbiBleHBpcmVkIHBlcmlvZC4ARQFUaGlzIGlzIGEgcGVybWlzc2lvbmxlc3MgY2FsbCBhdXRob3JpemVkIHZpYSB0aGUgYGF1dGhvcml6ZWAgYXR0cmlidXRlLiBJdCBjYW4gYmUlAWNhbGxlZCBieSBhbnlvbmUgb25jZSBhIHBlcmlvZCBoYXMgZnVsbHkgZXhwaXJlZCAocGFzdCB0aGUgZ3JhY2Ugd2luZG93KS4ALFBhcmFtZXRlcnM60CogYHBlcmlvZGA6IHRoZSBleHBpcmVkIHBlcmlvZCB0byBjbGVhciBhbGlhc2VzIGZvci4BASogYGxpbWl0YDogdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gcmVtb3ZlIGluIHRoaXMgY2FsbC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu8QQMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXNYUGVyc29uYWxVc2VybmFtZUNob2ljZQABCChTdGFuZGFsb25lBABBBAEgVXNlcm5hbWUAAAAsUmVzZXJ2YXRpb24EAEEEASBVc2VybmFtZQABAAD1BAxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlc1hGcmllbmRSZXF1ZXN0UmVmZXJlbmNlAAAIARhwZXJpb2Q4AQx1MzIAAQxzZXEMAQh1OAAA+QQMbGluZGl2X3BhbGxldF9jaHVua3NfbWFuYWdlchhwYWxsZXQQQ2FsbAQEVAABCChhZGRfY2h1bmtzDAE0cmluZ19leHBvbmVudP0EATBSaW5nRXhwb25lbnQAAShwYWdlX2luZGV4OAEkUGFnZUluZGV4AAE4ZW5jb2RlZF9jaHVua3MYARxWZWM8dTg+AAAQaEFkZHMgYSBuZXcgcGFnZSBvZiBjaHVua3MuAEEBVGhlIGhhc2ggb2YgdGhlIGNodW5rcyBtdXN0IG1hdGNoIHRoZSBoYXNoIHN0b3JlZCBvbi1jaGFpbiBpbiBgQ2h1bmtQYWdlSGFzaGVzYC7cVGhlIGNhbGwgd2lsbCBmYWlsIGlmIHRoZSBwYWdlIGFscmVhZHkgZXhpc3RzIG9uLWNoYWluLlRzZXRfY2h1bmtfcGFnZV9oYXNoZXMIATRyaW5nX2V4cG9uZW50/QQBMFJpbmdFeHBvbmVudAABLHBhZ2VfaGFzaGVzVQQBSFZlYzxDaHVua1BhZ2VIYXNoPgABGA0BU2V0cyB0aGUgZXhwZWN0ZWQgaGFzaGVzIGZvciBjaHVuayBwYWdlcyBmb3IgYSBnaXZlbiByaW5nIGV4cG9uZW50LgAhAUFsbG93cyBzZXR0aW5nIHRoZSBleHBlY3RlZCBoYXNoZXMgdGhhdCBjaHVua3MgbXVzdCBtYXRjaCB3aGVuIGFkZGVkIHZpYTRgYWRkX2NodW5rc2AuAKxUaGUgb3JpZ2luIG11c3QgYmUgYE1hbmFnZXJPcmlnaW5gIG9yIHJvb3QuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLv0EEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5MFJpbmdFeHBvbmVudAABDBBSMmU5AAkAFFIyZTEwAAoAFFIyZTE0AA4AAAEFDFBpbmRpdl9wYWxsZXRfbWVtYmVycxhwYWxsZXQQQ2FsbAQEVAABNCxtZXJnZV9yaW5ncwwBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAE8YmFzZV9yaW5nX2luZGV4OAEkUmluZ0luZGV4AAFEdGFyZ2V0X3JpbmdfaW5kZXg4ASRSaW5nSW5kZXgAAAxRAU1lcmdlIHRoZSBtZW1iZXJzIGluIHR3byByaW5ncyBpbnRvIGEgc2luZ2xlLCBuZXcgcmluZy4gSW4gb3JkZXIgZm9yIHRoZSByaW5ncyB0byBiZTUBZWxpZ2libGUgZm9yIG1lcmdpbmcsIHRoZXkgbXVzdCBiZSBiZWxvdyAxLzIgb2YgbWF4IGNhcGFjaXR5LCBoYXZlIG5vIHBlbmRpbmfgc3VzcGVuc2lvbnMgYW5kIG5vdCBiZSB0aGUgdG9wIHJpbmcgdXNlZCBmb3Igb25ib2FyZGluZy5Mc2V0X29uYm9hcmRpbmdfc2l6ZQgBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAE8b25ib2FyZGluZ19zaXplOAEMdTMyAAEETQFGb3JjZSBzZXQgdGhlIG9uYm9hcmRpbmcgc2l6ZSBmb3IgYSBjb2xsZWN0aW9uLiBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2VzLjBzZWxmX2luY2x1ZGUMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABGG1lbWJlcggBLE1lbWJlck9mPFQ+AAE0Y2FsbF92YWxpZF9hdCgBDHU2NAACKEEBQWxsb3cgYSBtZW1iZXIgd2FpdGluZyBpbiB0aGUgb25ib2FyZGluZyBxdWV1ZSB0byBpbmNsdWRlIHRoZW1zZWx2ZXMgaW50byBhIHJpbmdNAWFmdGVyIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQuIFRoaXMgYnlwYXNzZXMgdGhlIG5vcm1hbCBjb2hvcnQtYmFzZWQgb25ib2FyZGluZyBzaXplMHJlcXVpcmVtZW50LgA5AVRoaXMgY2FsbCBtdXN0IGJlIGRpc3BhdGNoZWQgd2l0aCBhIGBTZWxmSW5jbHVkZWAgb3JpZ2luLCBhdXRoZW50aWNhdGVkIGJ5IHRoZSEBYEFzTWVtYmVyYCB0cmFuc2FjdGlvbiBleHRlbnNpb24uIFRoZSByaW5ncyBtdXN0IGJlIGluIGFwcGVuZC1vbmx5IG1vZGUuAE0BVGhlIGBjYWxsX3ZhbGlkX2F0YCBwYXJhbWV0ZXIgZGljdGF0ZXMgdGhlIHRpbWUgd2luZG93IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXNNAXZhbGlkIGFuZCByZXByZXNlbnRzIHRoZSB0aW1lc3RhbXAgKGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2gpIHdoZW4gdGhpcyBjYWxsOGJlY29tZXMgdmFsaWQuVGJ1aWxkX3JpbmdfYXV0aG9yaXplZBQBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAEocmluZ19pbmRleDgBJFJpbmdJbmRleAABNHJpbmdfZXhwb25lbnT9BAEwUmluZ0V4cG9uZW50AAEgcmV2aXNpb244ATRSZXZpc2lvbkluZGV4AAEodG9faW5jbHVkZTgBDHUzMgBkGNhCdWlsZCBhIHJpbmcgcm9vdCBmb3IgYSBzcGVjaWZpYyByaW5nIGluIGEgY29sbGVjdGlvbi4A2FN1Ym1pdHRlZCBieSB0aGUgT0NXIHdpdGggYSBgdG9faW5jbHVkZWAgc25hcHNob3QgZnJvbSkBW2BTZWxmOjpzaG91bGRfYnVpbGRfcmluZ2BdLiBMZWZ0b3ZlcnMgZnJvbSBsYXRlciBvbmJvYXJkaW5nIGFyZSBwaWNrZWQgdXAZAW9uIHRoZSBuZXh0IE9DVyB0aWNrLCBvciBieSB0aGUgbWVtYmVyIHZpYSBbYFNlbGY6OnNlbGZfaW5jbHVkZWBdIHdoZW6AY29ob3J0IGdhdGluZyBzdGFsbHMgb25ib2FyZGluZy5ob25ib2FyZF9tZW1iZXJzX2F1dGhvcml6ZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAARBoZWFkOAEkUGFnZUluZGV4AGUMEQFPbmJvYXJkIG1lbWJlcnMgZnJvbSB0aGUgb25ib2FyZGluZyBxdWV1ZSBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgCEU3VibWl0dGVkIGJ5IHRoZSBvZmZjaGFpbiB3b3JrZXIucG1lcmdlX3F1ZXVlX3BhZ2VzX2F1dGhvcml6ZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABMGluaXRpYWxfaGVhZDgBJFBhZ2VJbmRleAABIG5ld19oZWFkOAEkUGFnZUluZGV4AGYMDQFNZXJnZSB0aGUgdG9wIHR3byBvbmJvYXJkaW5nIHF1ZXVlIHBhZ2VzIGZvciBhIHNwZWNpZmljIGNvbGxlY3Rpb24uAIRTdWJtaXR0ZWQgYnkgdGhlIG9mZmNoYWluIHdvcmtlci6AcmVtb3ZlX3N1c3BlbmRlZF9rZXlzX2F1dGhvcml6ZWQIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAZwzsUmVtb3ZlIHN1c3BlbmRlZCBrZXlzIGZyb20gYSBzcGVjaWZpYyByaW5nIGluIGEgY29sbGVjdGlvbi4AhFN1Ym1pdHRlZCBieSB0aGUgb2ZmY2hhaW4gd29ya2VyLmxkZWxldGVfcmluZ19wYWdlX2F1dGhvcml6ZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAAShwYWdlX2luZGV4OAEkUGFnZUluZGV4AGgMyERlbGV0ZSBhIHBhZ2UgZm9yIGEgc3BlY2lmaWMgcmluZyBpbiBhIGNvbGxlY3Rpb24uAIRTdWJtaXR0ZWQgYnkgdGhlIG9mZmNoYWluIHdvcmtlci6AZW5xdWV1ZV9yaW5nX2RlbGV0aW9uX2F1dGhvcml6ZWQIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAaRzsRW5xdWV1ZSBhIHJpbmcgZm9yIGRlbGV0aW9uIGFzIHBhcnQgb2YgY29sbGVjdGlvbiBkZWxldGlvbi4AIQFBcmNoaXZlcyB0aGUgcmluZyByb290LCBub3RpZmllcyBzdWJzY3JpYmVycywgcmVtb3ZlcyByaW5nIG1ldGFkYXRhLCBhbmT4ZW5xdWV1ZXMgcmluZyBwYWdlcyBpbnRvIGBSaW5nRGVsZXRpb25RdWV1ZWAgZm9yIHByb2Nlc3NpbmcgYnl4YGRlbGV0ZV9yaW5nX3BhZ2VfYXV0aG9yaXplZGAuAIRTdWJtaXR0ZWQgYnkgdGhlIG9mZmNoYWluIHdvcmtlci6cZGVsZXRlX29uYm9hcmRpbmdfcXVldWVfcGFnZV9hdXRob3JpemVkCAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAShwYWdlX2luZGV4OAEkUGFnZUluZGV4AGoc/ERlbGV0ZSBhbiBvbmJvYXJkaW5nIHF1ZXVlIHBhZ2UgYXMgcGFydCBvZiBjb2xsZWN0aW9uIGRlbGV0aW9uLgAdAVJlbW92ZXMgYWxsIGBNZW1iZXJzYCBlbnRyaWVzIGZvciB0aGUgbWVtYmVycyBpbiB0aGUgcGFnZSwgdGhlbiByZW1vdmVzJQF0aGUgcGFnZSBpdHNlbGYuIENhbiBvbmx5IHByb2NlZWQgd2hlbiBhbGwgcmluZ3MgYW5kIHJpbmcgcGFnZXMgaGF2ZSBiZWVuOGZ1bGx5IGRlbGV0ZWQuAIRTdWJtaXR0ZWQgYnkgdGhlIG9mZmNoYWluIHdvcmtlci6cZmluYWxpemVfY29sbGVjdGlvbl9kZWxldGlvbl9hdXRob3JpemVkBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAaxx0RmluYWxpemUgY29sbGVjdGlvbiBkZWxldGlvbi4AHQFSZW1vdmVzIGFsbCByZW1haW5pbmcgcGVyLWNvbGxlY3Rpb24gc3RvcmFnZSBhbmQgdGhlIG93bmVyJ3MgaWRlbnRpZmllchkBcmVmZXJlbmNlLiBDYW4gb25seSBwcm9jZWVkIHdoZW4gYWxsIHJpbmdzLCByaW5nIHBhZ2VzLCBhbmQgb25ib2FyZGluZ5BxdWV1ZSBwYWdlcyBoYXZlIGJlZW4gZnVsbHkgZGVsZXRlZC4AhFN1Ym1pdHRlZCBieSB0aGUgb2ZmY2hhaW4gd29ya2VyLmhtYXJrX3Jpbmdfc3RhbGVfYXV0aG9yaXplZAgBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAEocmluZ19pbmRleDgBJFJpbmdJbmRleABsGPBNYXJrIGEgcmluZyBhcyBzdGFsZSBzbyB0aGUgb2ZmY2hhaW4gd29ya2VyIHdpbGwgcmVidWlsZCBpdC4AHQFBbnlvbmUgY2FuIHN1Ym1pdCB0aGlzIHRyYW5zYWN0aW9uIGlmIHRoZSByaW5nIGhhcyBtZW1iZXJzIHRoYXQgYXJlIG5vdCUBeWV0IGluY2x1ZGVkIGluIHRoZSByb290IChgdG90YWwgPiBpbmNsdWRlZGApIGFuZCB0aGUgcmluZyBpcyBub3QgYWxyZWFkeSUBbWFya2VkIHN0YWxlLiBUaGlzIGlzIGEgcmVjb3ZlcnkgbWVjaGFuaXNtIGluIGNhc2UgdGhlIGBTdGFsZVJpbmdzYCBlbnRyeWx3YXMgbG9zdCBvciBuZXZlciBpbnNlcnRlZC50Y2xlYW5fdXBfb2xkX3Jvb3RzX2F1dGhvcml6ZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAARRsaW1pdDgBDHUzMgBtIIBDbGVhbiB1cCBleHBpcmVkIG9sZCByaW5nIHJvb3RzLgARAVJlbW92ZXMgdXAgdG8gYGxpbWl0YCBvbGQgcmluZyByb290cyBmb3IgdGhlIGdpdmVuIHJpbmcgaW4gdGhlIGdpdmVuLGNvbGxlY3Rpb24uANBUaGUgdHJhbnNhY3Rpb24gc291cmNlIG11c3QgYmUgYExvY2FsYCBvciBgSW5CbG9ja2AuAPRUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gU3VibWl0dGVkIGJ5IHRoZSBvZmZjaGFpbiB3b3JrZXIuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgUFDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQQQ2FsbAQEVAABWBRzcGxpdAQBKHNwbGl0X2ludG8JBQFpAUJvdW5kZWRWZWM8KENvaW5WYWx1ZSwgQm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heFNwbGl0T3V0cHV0cz4pLApUOjpNYXhTcGxpdE91dHB1dHMsPgAAUIRTcGxpdCBhIGNvaW4gaW50byBtdWx0aXBsZSBjb2lucy4APQFUaGUgb3JpZ2luIG11c3QgYmUgYSBbT3JpZ2luOjpDb2luXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4A1FRoZSBjYWxsIGlzIGZyZWUgYW5kIGFnZXMgdGhlIHJlc3VsdGluZyBjb2lucyBieSBvbmUuAEkBVGhlIGBzcGxpdF9pbnRvYCBwYXJhbWV0ZXIgY29udGFpbnMgYSB2ZWN0b3Igb2YgcGFpcnMsIGVhY2ggcGFpciBjb250YWluaW5nIGEgY29pblUBdmFsdWUgYW5kIGEgbGlzdCBvZiBkZXN0aW5hdGlvbiBhY2NvdW50IGlkcy4gRm9yIGVhY2ggcGFpciwgYSBuZXcgY29pbiB3aXRoIHRoZSBnaXZlbsR2YWx1ZSBpcyBjcmVhdGVkIGZvciBlYWNoIGRlc3RpbmF0aW9uIGFjY291bnQgaWQuAFhWYWxpZGl0eSByZXF1aXJlbWVudHM6PQEoYW4gaW52YWxpZCB0cmFuc2FjdGlvbiB3b24ndCBiZSBpbmNsdWRlZCBpbiBhIGJsb2NrLCB0aGUgY29pbiBpcyBub3QgY29uc3VtZWQp4CogVGhlIGNvaW4ncyBhZ2UgbXVzdCBiZSBsZXNzIHRoYW4gW0NvbmZpZzo6TWF4aW11bUFnZV0uTQEqIFRoZSBjb2luIHZhbHVlIG11c3QgYmUgd2l0aGluIHRoZSBib3VuZHMgZGVmaW5lZCBieSBbQ29uZmlnOjpNaW5pbXVtRXhwb25lbnRdIGFuZHAgIFtDb25maWc6Ok1heGltdW1FeHBvbmVudF0uLQEqIFRoZSB0b3RhbCB2YWx1ZSBvZiB0aGUgbmV3IGNvaW5zIG11c3QgZXF1YWwgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW4gY29pbi4JASogVGhlIG51bWJlciBvZiBvdXRwdXRzIG11c3Qgbm90IGV4Y2VlZCBbQ29uZmlnOjpNYXhTcGxpdE91dHB1dHNdLiUBKiBUaGUgYWdlIG9mIHRoZSBuZXcgY29pbnMgaXMgc2V0IHRvIHRoZSBhZ2Ugb2YgdGhlIG9yaWdpbiBjb2luIHBsdXMgb25lLuAqIEVhY2ggZGVzdGluYXRpb24gYWNjb3VudCBtdXN0IG5vdCBhbHJlYWR5IGhhdmUgYSBjb2luLiB0cmFuc2ZlcgQBCHRvBAEwVDo6QWNjb3VudElkAAEsjFRyYW5zZmVyIGEgY29pbiB0byBhbm90aGVyIGFjY291bnQuAD0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6Q29pbl0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvblhleHRlbnNpb24gW0FzQ29pbmFnZV0uANBUaGUgY2FsbCBpcyBmcmVlIGFuZCBhZ2VzIHRoZSByZXN1bHRpbmcgY29pbiBieSBvbmUuAFhWYWxpZGl0eSByZXF1aXJlbWVudHM6PQEoYW4gaW52YWxpZCB0cmFuc2FjdGlvbiB3b24ndCBiZSBpbmNsdWRlZCBpbiBhIGJsb2NrLCB0aGUgY29pbiBpcyBub3QgY29uc3VtZWQp3CogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgbXVzdCBub3QgYWxyZWFkeSBoYXZlIGEgY29pbi7gKiBUaGUgY29pbidzIGFnZSBtdXN0IGJlIGxlc3MgdGhhbiBbQ29uZmlnOjpNYXhpbXVtQWdlXS5cbG9hZF9yZWN5Y2xlcl93aXRoX2NvaW4IAShtZW1iZXJfa2V5CAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBtBAE4U2lnbmF0dXJlT2Y8VD4AAkRoTG9hZCBjb2luIGludG8gYSByZWN5Y2xlci4APQFUaGUgb3JpZ2luIG11c3QgYmUgYSBbT3JpZ2luOjpDb2luXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4ARFRoZSBjYWxsIGlzIGZyZWUuAFkBVGhlIGBtZW1iZXJfa2V5YCBwYXJhbWV0ZXIgaXMgdGhlIG1lbWJlciBrZXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlY3ljbGVyLCBhbmQgd2hvc2WoYWxpYXMgaXMgdXNlZCB0byB1bmxvYWQgZnJvbSB0aGUgcmVjeWNsZXIuAFhWYWxpZGl0eSByZXF1aXJlbWVudHM6PQEoYW4gaW52YWxpZCB0cmFuc2FjdGlvbiB3b24ndCBiZSBpbmNsdWRlZCBpbiBhIGJsb2NrLCB0aGUgY29pbiBpcyBub3QgY29uc3VtZWQpAQEqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBub3QgYWxyZWFkeSBiZSB1c2VkIGluIGFub3RoZXIgcmVjeWNsZXIu0CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIChpLmUuIHdlbGwgZm9ybWVkKS5RASogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgYSB2YWxpZCBzaWduYXR1cmUgb2YgdGhlIGNvaW4ncyBhY2NvdW50IGlkIGJ5IHRoZTwgIGBtZW1iZXJfa2V5YC4FASogVGhlIHJlY3ljbGVyIGNvbGxlY3Rpb24gZm9yIHRoZSBjb2luJ3MgdmFsdWUgbXVzdCBhbHJlYWR5IGV4aXN0hGxvYWRfcmVjeWNsZXJfd2l0aF9leHRlcm5hbF9hc3NldBABMHByZXNlcnZhdGlvbhkFAURDb2RlY1ByZXNlcnZhdGlvbgABFHZhbHVldQMBJENvaW5WYWx1ZQABKG1lbWJlcl9rZXkIASxNZW1iZXJPZjxUPgABSHByb29mX29mX293bmVyc2hpcG0EAThTaWduYXR1cmVPZjxUPgADcJBMb2FkIGV4dGVybmFsIGFzc2V0IGludG8gYSByZWN5Y2xlci4AjFRoZSBvcmlnaW4gbXVzdCBiZSBhIHNpZ25lZCBvcmlnaW4uAIBUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHJlZnVuZGVkLgBFAVRoZSBgcHJlc2VydmF0aW9uYCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyB0aGUgYXNzZXQgdHJhbnNmZXIgc2hvdWxkIHByZXNlcnZlIHRoZURzaWduZXIncyBhY2NvdW50LgA5AVRoZSBgdmFsdWVgIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGNvaW4gdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIHJlY3ljbGVyLj0BVGhlIGVxdWl2YWxlbnQgYW1vdW50IG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIHNpZ25lciB0b0x0aGUgcGFsbGV0IGFjY291bnQuAFkBVGhlIGBtZW1iZXJfa2V5YCBwYXJhbWV0ZXIgaXMgdGhlIG1lbWJlciBrZXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlY3ljbGVyLCBhbmQgd2hvc2WoYWxpYXMgaXMgdXNlZCB0byB1bmxvYWQgZnJvbSB0aGUgcmVjeWNsZXIuAFUBVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIHBhcmFtZXRlciBpcyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBzaWduZXIncyBhY2NvdW50IGlkIGJ5IHRoZTRgbWVtYmVyX2tleWAuADRSZXF1aXJlbWVudHM6AQEqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBub3QgYWxyZWFkeSBiZSB1c2VkIGluIGFub3RoZXIgcmVjeWNsZXIu0CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIChpLmUuIHdlbGwgZm9ybWVkKS5BASogVGhlIGB2YWx1ZWAgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBkZWZpbmVkIGJ5IFtDb25maWc6Ok1pbmltdW1FeHBvbmVudF0gYW5kcCAgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS5VASogVGhlIHNpZ25lciBtdXN0IGhhdmUgZW5vdWdoIGJhbGFuY2Ugb2YgdGhlIHVuZGVybHlpbmcgYXNzZXQgdG8gY292ZXIgdGhlIGVxdWl2YWxlbnSIICBhbW91bnQgZm9yIHRoZSBnaXZlbiBjb2luIHZhbHVlLlkBKiBUaGUgYHByb29mX29mX293bmVyc2hpcGAgbXVzdCBiZSBhIHZhbGlkIHNpZ25hdHVyZSBvZiB0aGUgc2lnbmVyJ3MgYWNjb3VudCBpZCBieSB0aGU0YG1lbWJlcl9rZXlgLqBsb2FkX3JlY3ljbGVyX3dpdGhfZXh0ZXJuYWxfYXNzZXRfdW5wYWlkEAEwcHJlc2VydmF0aW9uGQUBRENvZGVjUHJlc2VydmF0aW9uAAEUdmFsdWV1AwEkQ29pblZhbHVlAAEobWVtYmVyX2tleQgBLE1lbWJlck9mPFQ+AAFIcHJvb2Zfb2Zfb3duZXJzaGlwbQQBOFNpZ25hdHVyZU9mPFQ+AA9ELQFMb2FkIGV4dGVybmFsIGFzc2V0IGludG8gYSByZWN5Y2xlciAoaW5mYWxsaWJsZSwgdmFsaWRhdGVkIHVucGFpZCB2YXJpYW50KS4ATQFUaGUgb3JpZ2luIG11c3QgYmUgW09yaWdpbjo6SW5mYWxsaWJsZVVucGFpZFNpZ25lZF0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZQkBdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIHZhcmlhbnQgW0FzQ29pbmFnZTo6SW5mYWxsaWJsZVVucGFpZFNpZ25lZF0uANxUaGUgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIHZhbGlkYXRpb24gcGhhc2UgbXVzdCBlbnN1cmU6FQEtIFRoZSBgbWVtYmVyX2tleWAgaXMgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQgaW4gYW5vdGhlciByZWN5Y2xlci5FAS0gVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIGlzIGEgdmFsaWQgc2lnbmF0dXJlIG9mIHRoZSBzaWduZXIncyBhY2NvdW50IGlkIGJ5IHRoZTwgIGBtZW1iZXJfa2V5YC4tAS0gVGhlIGB2YWx1ZWAgaXMgd2l0aGluIHRoZSBib3VuZHMgZGVmaW5lZCBieSBbQ29uZmlnOjpNaW5pbXVtRXhwb25lbnRdIGFuZEEBICBbQ29uZmlnOjpNYXhpbXVtRXhwb25lbnRdLCBhbmQgY2FuIGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvIGFuIGFzc2V0IGFtb3VudC5ZAS0gVGhlIHNpZ25lciBoYXMgZW5vdWdoIGJhbGFuY2Ugb2YgdGhlIHVuZGVybHlpbmcgYXNzZXQgdG8gY292ZXIgdGhlIGVxdWl2YWxlbnQgYW1vdW503CAgZm9yIHRoZSBnaXZlbiBjb2luIHZhbHVlIChyZXNwZWN0aW5nIGBwcmVzZXJ2YXRpb25gKS6sLSBUaGUgbm9uY2UgaXMgdmFsaWQgZm9yIHJlcGxheSBwcm90ZWN0aW9uLtQtIFRoZSByZWN5Y2xlciBjb2xsZWN0aW9uIGZvciBgdmFsdWVgIGFscmVhZHkgZXhpc3RzLgBEVGhlIGNhbGwgaXMgZnJlZS64bG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0X3VucGFpZF9iYXRjaAQBFGl0ZW1zHQUB1EJvdW5kZWRWZWM8VW5wYWlkTG9hZElucHV0PFQ+LCBUOjpNYXhCYXRjaFVucGFpZExvYWQ+ABA0GQFCYXRjaGVkIHZhcmlhbnQgb2YgW2BTZWxmOjpsb2FkX3JlY3ljbGVyX3dpdGhfZXh0ZXJuYWxfYXNzZXRfdW5wYWlkYF0uAE0BVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OkluZmFsbGlibGVVbnBhaWRTaWduZWRdLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGVBAXRyYW5zYWN0aW9uIGV4dGVuc2lvbiB2YXJpYW50IFtBc0NvaW5hZ2U6OkluZmFsbGlibGVVbnBhaWRTaWduZWRdLiBUaGUgZXh0ZW5zaW9uUQF2YWxpZGF0ZXMgZWFjaCBpbm5lciBpdGVtIGFuZCBhZGRpdGlvbmFsbHkgY2hlY2tzIHdpdGhpbi1iYXRjaCBtZW1iZXIta2V5IHVuaXF1ZW5lc3MhAWFuZCB0aGF0IHRoZSBzaWduZXIncyBiYWxhbmNlIGNvdmVycyB0aGUgc3VtIG9mIGFsbCBpbm5lciBhc3NldCBhbW91bnRzLgBBAVRoaXMgY2FsbCBkaXNwYXRjaGVzIGVhY2ggaW5uZXIgbG9hZCBieSByZS1ydW5uaW5nIHRoZSBzYW1lIGNoZWNrcyB0aGUgZXh0ZW5zaW9uUQFqdXN0IHBlcmZvcm1lZCAoc2VlIFtgUmVjeWNsZXJNYW5hZ2VyOjpsb2FkYF0pLiBUaGUgcmVkdW5kYW5jeSBtYXRjaGVzIHRoZSBkZWZlbnNpdmVNAXBhdHRlcm4gdXNlZCBieSBbYFNlbGY6OmxvYWRfcmVjeWNsZXJfd2l0aF9leHRlcm5hbF9hc3NldF91bnBhaWRgXTogYSBkaXNwYXRjaCBwYXRoRQF0aGF0IGZhaWxzIGFueSBvZiB0aGVzZSBjaGVja3MgaXMgYSBsb2dpYyBidWcgaW4gdGhlIGV4dGVuc2lvbiwgbm90IGEgdXNlciBlcnJvci4ARFRoZSBjYWxsIGlzIGZyZWUuZHVubG9hZF9yZWN5Y2xlcl9pbnRvX2NvaW4UARxhbGlhc2VzKQUBmEJvdW5kZWRWZWM8QWxpYXMsIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEUdmFsdWV1AwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAQh0bwQBMFQ6OkFjY291bnRJZAAEZJRVbmxvYWQgYSByZWN5Y2xlciB0byBtaW50IGEgbmV3IGNvaW4uAF0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6VW5sb2FkVG9rZW5dIHdpdGggYGZlZTogVW5sb2FkRmVlOjpQcmVwYWlkYCwgd2hpY2ggY2FuIGJlQQFvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gW0FzQ29pbmFnZV0gdXNpbmcgYEFzVW5sb2FkVG9rZW5QZW9wbGVgLOxgQXNVbmxvYWRUb2tlbkxpdGVQZW9wbGVgLCBvciBgQXNVbmxvYWRUb2tlblBhaWRgIHZhcmlhbnRzLgBJAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdXNlciB0byBwcm92ZSB0aGV5IG93biBvbmUgb3IgbW9yZSBjb2lucyBpbiBhIHJlY3ljbGVyIHJpbmddAXdpdGhvdXQgcmV2ZWFsaW5nIHdoaWNoIHNwZWNpZmljIGNvaW5zIHRoZXkgb3duLiBJdCBjb25zb2xpZGF0ZXMgb25lIG9yIG11bHRpcGxlIGlucHV0c2hpbnRvIGEgc2luZ2xlIG91dHB1dCBjb2luLgAsUGFyYW1ldGVyczpFASogYGFsaWFzZXNgOiB0aGUgbGlzdCBvZiBhbGlhc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBrZXlzIGluY2x1ZGVkIGluIHRoZRUBICByZWN5Y2xlci4gVGhlIHByb29mcyBmb3IgdGhlc2UgYWxpYXNlcyBhcmUgY29udGFpbmVkIGluIHRoZSBvcmlnaW4u+CogYHZhbHVlYCBhbmQgYGluZGV4YDogaWRlbnRpZmllcyB0aGUgcmVjeWNsZXIgYmVpbmcgdW5sb2FkZWQu/CogYF9yZXZpc2lvbmA6IHRoZSByZWN5Y2xlciByZXZpc2lvbiB1c2VkIGZvciB0aGUgYWxpYXNfcHJvb2ZzLsQqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgbmV3IGNvaW4uADRSZXF1aXJlbWVudHM6KQEqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0gd2l0aCBgZmVlOiBVbmxvYWRGZWU6OlByZXBhaWRgLvAqIFRoZSByZWN5Y2xlciBpZGVudGlmaWVkIGJ5IGB2YWx1ZWAgYW5kIGBpbmRleGAgbXVzdCBleGlzdC5RASogVGhlIGFsaWFzIHByb29mcyBwcm92aWRlZCBpbiB0aGUgb3JpZ2luIG11c3QgYmUgdmFsaWQgZm9yIHRoZSByZWN5Y2xlcidzIHJldmlzaW9uLiEBKiBUaGUgYGFsaWFzZXNgIHByb3ZpZGVkIG11c3QgbWF0Y2ggdGhlIGFsaWFzZXMgZGVyaXZlZCBmcm9tIHRoZSBwcm9vZnMuFQEqIFRoZSBhbGlhc2VzIG11c3Qgbm90IGhhdmUgYmVlbiBhbHJlYWR5IHVubG9hZGVkIGZyb20gdGhpcyByZWN5Y2xlci68KiBUaGUgbnVtYmVyIG9mIGFsaWFzZXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by41ASogVGhlIHJlc3VsdGluZyBjb25zb2xpZGF0ZWQgdmFsdWUgbXVzdCBub3QgZXhjZWVkIFtDb25maWc6Ok1heGltdW1FeHBvbmVudF0ujHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0FAEcYWxpYXNlcykFAZhCb3VuZGVkVmVjPEFsaWFzLCBUOjpNYXhDb25zb2xpZGF0aW9uPgABFHZhbHVldQMBJENvaW5WYWx1ZQABFGluZGV4OAEkUmluZ0luZGV4AAEgcmV2aXNpb244ATRSZXZpc2lvbkluZGV4AAEIdG8EATBUOjpBY2NvdW50SWQABWDwVW5sb2FkIGEgcmVjeWNsZXIgdG8gd2l0aGRyYXcgdGhlIHVuZGVybHlpbmcgZXh0ZXJuYWwgYXNzZXQuAFEBVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4AXQFXaGVuIGBmZWVgIGlzIFtVbmxvYWRGZWU6OlByZXBhaWRdICh2aWEgZnJlZSBvciBwYWlkIHVubG9hZCB0b2tlbiksIG5vIGZlZSBpcyBkZWR1Y3RlZC5RAVdoZW4gYGZlZWAgaXMgW1VubG9hZEZlZTo6RnJvbU91dHB1dF0sIHRoZSBmZWUgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgdW5sb2FkZWQgYXNzZXRzLgAxAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdXNlciB0byB3aXRoZHJhdyB0aGVpciBjb2lucyBiYWNrIGludG8gdGhlIHVuZGVybHlpbmdkYXNzZXQgKGUuZy4sIHN0YWJsZWNvaW4pLgAsUGFyYW1ldGVyczpFASogYGFsaWFzZXNgOiB0aGUgbGlzdCBvZiBhbGlhc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBrZXlzIGluY2x1ZGVkIGluIHRoZRUBICByZWN5Y2xlci4gVGhlIHByb29mcyBmb3IgdGhlc2UgYWxpYXNlcyBhcmUgY29udGFpbmVkIGluIHRoZSBvcmlnaW4u+CogYHZhbHVlYCBhbmQgYGluZGV4YDogaWRlbnRpZmllcyB0aGUgcmVjeWNsZXIgYmVpbmcgdW5sb2FkZWQu/CogYF9yZXZpc2lvbmA6IHRoZSByZWN5Y2xlciByZXZpc2lvbiB1c2VkIGZvciB0aGUgYWxpYXNfcHJvb2ZzLuQqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgdW5kZXJseWluZyBhc3NldC4ANFJlcXVpcmVtZW50czqsKiBUaGUgb3JpZ2luIG11c3QgYmUgW09yaWdpbjo6VW5sb2FkVG9rZW5dLvAqIFRoZSByZWN5Y2xlciBpZGVudGlmaWVkIGJ5IGB2YWx1ZWAgYW5kIGBpbmRleGAgbXVzdCBleGlzdC5RASogVGhlIGFsaWFzIHByb29mcyBwcm92aWRlZCBpbiB0aGUgb3JpZ2luIG11c3QgYmUgdmFsaWQgZm9yIHRoZSByZWN5Y2xlcidzIHJldmlzaW9uLlkBKiBUaGUgYWxpYXNlcyBtdXN0IG5vdCBoYXZlIGJlZW4gYWxyZWFkeSB1bmxvYWRlZCAoZXhjZXB0IGZvciB0aGUgZmlyc3Qgb25lIHdoZW4gYGZlZWAVASAgaXMgW1VubG9hZEZlZTo6RnJvbU91dHB1dF0sIHdoaWNoIHdhcyBwcmUtbWFya2VkIGluIHRoZSBleHRlbnNpb24pLqxwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9jb2luCAEobWVtYmVyX2tleQgBLE1lbWJlck9mPFQ+AAFIcHJvb2Zfb2Zfb3duZXJzaGlwbQQBuDxDcnlwdG9PZjxUPiBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUABlQpAVBheSB0aGUgZmVlIHRvIHJlZ2lzdGVyIGEgbWVtYmVyIGtleSBmb3IgYSBwYWlkIHVubG9hZCB0b2tlbiB1c2luZyBhIGNvaW4uAD0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6Q29pbl0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvblhleHRlbnNpb24gW0FzQ29pbmFnZV0uAEkBVGhlIGNvaW4gaXMgY29uc3VtZWQuIFRoZSBmZWUgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgY29pbidzIHZhbHVlIGFuZCB0cmFuc2ZlcnJlZCB0bx0BW0NvbmZpZzo6RmVlRGVzdGluYXRpb25dLiBUaGUgcmVtYWluaW5nIHZhbHVlIG9mIHRoZSBjb2luIGlzIGRlc3Ryb3llZC4A1ElmIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3JpZ2luIGNvaW4gaXMgc3RpbGwgY29uc3VtZWQuAF0BVG8gcHJvdGVjdCB0aGUgdXNlciBhZ2FpbnN0IHZhcnlpbmcgZmVlcywgaWYgdGhlIGNvaW4ncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGZlZSwgdGhl6GNhbGwgaXMgaW52YWxpZCAoYW4gaW52YWxpZCBjYWxsIG5ldmVyIGdvZXMgaW50byBhIGJsb2NrKS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrgKiBUaGUgY29pbidzIGFnZSBtdXN0IGJlIGxlc3MgdGhhbiBbQ29uZmlnOjpNYXhpbXVtQWdlXS7UKiBUaGUgY29pbiB2YWx1ZSBtdXN0IGJlIHN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIGZlZS7YKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQutHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX25hdGl2ZQgBKG1lbWJlcl9rZXkIASxNZW1iZXJPZjxUPgABSHByb29mX29mX293bmVyc2hpcG0EAbg8Q3J5cHRvT2Y8VD4gYXMgR2VuZXJhdGVWZXJpZmlhYmxlPjo6U2lnbmF0dXJlAAc8XQFQYXkgdGhlIGZlZSB0byByZWdpc3RlciBhIG1lbWJlciBrZXkgZm9yIGEgcGFpZCB1bmxvYWQgdG9rZW4gdXNpbmcgdGhlIG5hdGl2ZSBjdXJyZW5jeS4AaFRoZSBvcmlnaW4gbXVzdCBiZSBTaWduZWQuAEUBVGhpcyBhZGRzIHRoZSBgbWVtYmVyX2tleWAgdG8gYSAicGFpZCB1bmxvYWQgdG9rZW4gcmluZyIuIEJlaW5nIHBhcnQgb2YgdGhpcyByaW5nSQFhbGxvd3MgdGhlIHVzZXIgdG8gbGF0ZXIgZ2VuZXJhdGUgYW4gYW5vbnltb3VzIGBVbmxvYWRUb2tlbmAgdG8gdW5sb2FkIGEgcmVjeWNsZXIuAA0BVGhlIGZlZSBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBjYWxsZXIgdG8gW0NvbmZpZzo6RmVlRGVzdGluYXRpb25dLgBdAVRoZSBgcHJvb2Zfb2Zfb3duZXJzaGlwYCBpcyBhIHNpZ25hdHVyZSBvZiB0aGUgY2FsbGVyJ3MgYWNjb3VudCBJRCBieSB0aGUgYG1lbWJlcl9rZXlgLiUBVGhpcyBlbnN1cmVzIHRoZSBjYWxsZXIgY29udHJvbHMgdGhlIG1lbWJlciBrZXkgdG8gcHJldmVudCBmcm9udC1ydW5uaW5nLgA0UmVxdWlyZW1lbnRzOtgqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBiZSB2YWxpZCBhbmQgbm90IGFscmVhZHkgdXNlZC6kKiBUaGUgYHByb29mX29mX293bmVyc2hpcGAgbXVzdCBiZSB2YWxpZC60cGF5X2Zvcl9yZWN5Y2xlcl91bmxvYWRfZmVlX3Rva2VuX3dpdGhfc3RhYmxlCAEobWVtYmVyX2tleQgBLE1lbWJlck9mPFQ+AAFIcHJvb2Zfb2Zfb3duZXJzaGlwbQQBuDxDcnlwdG9PZjxUPiBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUACEBdAVBheSB0aGUgZmVlIHRvIHJlZ2lzdGVyIGEgbWVtYmVyIGtleSBmb3IgYSBwYWlkIHVubG9hZCB0b2tlbiB1c2luZyB0aGUgdW5kZXJseWluZyBhc3NldFBpLmUuIHRoZSBzdGFibGVjb2luLgBoVGhlIG9yaWdpbiBtdXN0IGJlIFNpZ25lZC4ARQFUaGlzIGFkZHMgdGhlIGBtZW1iZXJfa2V5YCB0byBhICJwYWlkIHVubG9hZCB0b2tlbiByaW5nIi4gQmVpbmcgcGFydCBvZiB0aGlzIHJpbmdJAWFsbG93cyB0aGUgdXNlciB0byBsYXRlciBnZW5lcmF0ZSBhbiBhbm9ueW1vdXMgYFVubG9hZFRva2VuYCB0byB1bmxvYWQgYSByZWN5Y2xlci4ADQFUaGUgZmVlIGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIGNhbGxlciB0byBbQ29uZmlnOjpGZWVEZXN0aW5hdGlvbl0uAF0BVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIGlzIGEgc2lnbmF0dXJlIG9mIHRoZSBjYWxsZXIncyBhY2NvdW50IElEIGJ5IHRoZSBgbWVtYmVyX2tleWAuJQFUaGlzIGVuc3VyZXMgdGhlIGNhbGxlciBjb250cm9scyB0aGUgbWVtYmVyIGtleSB0byBwcmV2ZW50IGZyb250LXJ1bm5pbmcuADRSZXF1aXJlbWVudHM62CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIGFuZCBub3QgYWxyZWFkeSB1c2VkLqQqIFRoZSBgcHJvb2Zfb2Zfb3duZXJzaGlwYCBtdXN0IGJlIHZhbGlkLsB1bmxvYWRfcmVjeWNsZXJfaW50b19leHRlcm5hbF9hc3NldF9hbmRfdm91Y2hlcnMcARxhbGlhc2VzKQUBmEJvdW5kZWRWZWM8QWxpYXMsIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEUdmFsdWV1AwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAQh0bwQBMFQ6OkFjY291bnRJZAABVGV4dGVybmFsX2Fzc2V0X2Ftb3VudMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgABMG5ld192b3VjaGVycy0FAeBCb3VuZGVkVmVjPChDb2luVmFsdWUsIE1lbWJlck9mPFQ+KSwgVDo6TWF4U3BsaXRPdXRwdXRzPgAJjAkBVW5sb2FkIGEgcmVjeWNsZXIgaW50byBhIG1peCBvZiBleHRlcm5hbCBhc3NldCBhbmQgZnJlc2ggdm91Y2hlcnMuAFEBVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4AWQFUaGlzIGZ1bmN0aW9uIGFsbG93cyBhIHVzZXIgdG8gb2ZmYm9hcmQgcGFydCBvZiB0aGUgdW5sb2FkZWQgdmFsdWUgaW50byB0aGUgdW5kZXJseWluZ+hhc3NldCB3aGlsZSByZW1pbnRpbmcgdGhlIHJlc3QgYXMgZnJlc2ggcmVjeWNsZXIgdm91Y2hlcnMuAEUBV2hlbiBgZmVlYCBpcyBbVW5sb2FkRmVlOjpQcmVwYWlkXSwgYGV4dGVybmFsX2Fzc2V0X2Ftb3VudGAgaXMgdHJhbnNmZXJyZWQgYXMtaXMuNQFXaGVuIGBmZWVgIGlzIFtVbmxvYWRGZWU6OkZyb21PdXRwdXRdLCB0aGUgZmVlIGlzIGRlZHVjdGVkIGZyb20gdGhlIHNwZWNpZmllZAUBYGV4dGVybmFsX2Fzc2V0X2Ftb3VudGAsIHNvIHRoZSByZWNpcGllbnQgcmVjZWl2ZXMgdGhlIHJlbWFpbmRlci4ALFBhcmFtZXRlcnM6RQEqIGBhbGlhc2VzYDogdGhlIGxpc3Qgb2YgYWxpYXNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZW1iZXIga2V5cyBpbmNsdWRlZCBpbiB0aGUVASAgcmVjeWNsZXIuIFRoZSBwcm9vZnMgZm9yIHRoZXNlIGFsaWFzZXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luLvgqIGB2YWx1ZWAgYW5kIGBpbmRleGA6IGlkZW50aWZpZXMgdGhlIHJlY3ljbGVyIGJlaW5nIHVubG9hZGVkLvgqIGByZXZpc2lvbmA6IHRoZSByZWN5Y2xlciByZXZpc2lvbiB1c2VkIGZvciB0aGUgYWxpYXMgcHJvb2ZzLvwqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgZXh0ZXJuYWwgYXNzZXQgcG9ydGlvbi5dASogYGV4dGVybmFsX2Fzc2V0X2Ftb3VudGA6IHRoZSBncm9zcyBhc3NldCBwb3J0aW9uIHRvIG9mZmJvYXJkIGZyb20gdGhlIHVubG9hZGVkIHZhbHVlLmEBKiBgbmV3X3ZvdWNoZXJzYDogdGhlIGZyZXNoIHJlY3ljbGVyIHZvdWNoZXJzIHRvIG1pbnQgZnJvbSB0aGUgcmVtYWluaW5nIHVubG9hZGVkIHZhbHVlLgBZAVRoZSB0b3RhbCB1bmxvYWRlZCB2YWx1ZSBtdXN0IGFsd2F5cyBlcXVhbCB0aGUgYXNzZXQgcG9ydGlvbiBwbHVzIHRoZSB2b3VjaGVyIHBvcnRpb24uVQFJbiBgRnJvbU91dHB1dGAgbW9kZSwgdGhlIGFzc2V0IHBvcnRpb24gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY292ZXIgdGhlIHVubG9hZCBmZWUuADRSZXF1aXJlbWVudHM6rCogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXS7wKiBUaGUgcmVjeWNsZXIgaWRlbnRpZmllZCBieSBgdmFsdWVgIGFuZCBgaW5kZXhgIG11c3QgZXhpc3QuUQEqIFRoZSBhbGlhcyBwcm9vZnMgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbiBtdXN0IGJlIHZhbGlkIGZvciB0aGUgcmVjeWNsZXIncyByZXZpc2lvbi5ZASogVGhlIGFsaWFzZXMgbXVzdCBub3QgaGF2ZSBiZWVuIGFscmVhZHkgdW5sb2FkZWQgKGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9uZSB3aGVuIGBmZWVgFQEgIGlzIFtVbmxvYWRGZWU6OkZyb21PdXRwdXRdLCB3aGljaCB3YXMgcHJlLW1hcmtlZCBpbiB0aGUgZXh0ZW5zaW9uKS5FASogYG5ld192b3VjaGVyc2AgbXVzdCBub3QgYmUgZW1wdHksIGFuZCBhbGwgdm91Y2hlciBtZW1iZXIga2V5cyBtdXN0IGJlIHZhbGlkIGFuZCQgIHVudXNlZC5hASogVGhlIHRvdGFsIHVubG9hZGVkIHZhbHVlIG11c3QgZXF1YWwgYGV4dGVybmFsX2Fzc2V0X2Ftb3VudGAgcGx1cyB0aGUgdG90YWwgYXNzZXQgdmFsdWVQICBvZiBgbmV3X3ZvdWNoZXJzYC5FASogV2hlbiB1c2luZyBbVW5sb2FkRmVlOjpGcm9tT3V0cHV0XSwgYGV4dGVybmFsX2Fzc2V0X2Ftb3VudGAgbXVzdCBjb3ZlciB0aGUgZmVlLsR1bmxvYWRfcmVjeWNsZXJfaW50b19leHRlcm5hbF9hc3NldF9ub25fYW5vbnltb3VzEAEUaW5wdXQ5BQGgVW5sb2FkUmVjeWNsZXJJbnB1dDxUOjpNYXhDb25zb2xpZGF0aW9uPgABMGFsaWFzX3Byb29mc3kDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEIdG8EATBUOjpBY2NvdW50SWQAATBmZWVfY3VycmVuY3k9BQEsRmVlQ3VycmVuY3kACxgxAVVubG9hZCBhIHJlY3ljbGVyIHRvIHdpdGhkcmF3IHRoZSB1bmRlcmx5aW5nIGV4dGVybmFsIGFzc2V0IChub24tYW5vbnltb3VzKS4AVQFDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBbU2VsZjo6dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X25vbl9hbm9ueW1vdXNddGZvciB0aGUgc2luZ2xlLXJlY3ljbGVyIGNhc2UuAFkBU2VlIFtTZWxmOjp1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91c10gZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi7IdW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X25vbl9hbm9ueW1vdXMQARhpbnB1dHNBBQG0VmVjPFVubG9hZFJlY3ljbGVySW5wdXQ8VDo6TWF4Q29uc29saWRhdGlvbj4+AAEwYWxpYXNfcHJvb2ZzeQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAQh0bwQBMFQ6OkFjY291bnRJZAABMGZlZV9jdXJyZW5jeT0FASxGZWVDdXJyZW5jeQAMWFEBVW5sb2FkIG11bHRpcGxlIHJlY3ljbGVycyB0byB3aXRoZHJhdyB0aGUgdW5kZXJseWluZyBleHRlcm5hbCBhc3NldCAobm9uLWFub255bW91cykuAD0BVGhpcyBpcyBhIG5vbi1hbm9ueW1vdXMgdmVyc2lvbiBvZiBbU2VsZjo6dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0XUEBd2hlcmUgdGhlIGZlZSBpcyBwYWlkIGV4cGxpY2l0bHkgYnkgdGhlIHNpZ25lciByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBhbm9ueW1vdXO4dW5sb2FkIHRva2VuIHJpbmcsIGFuZCBmb3IgbXVsdGlwbGUgcmVjeWNsZXJzLgAxAVRoZSBmZWUgY2hhcmdlZCBpcyBvbmUgdW5sb2FkIHRva2VuIGZlZSBwZXIgcmVjeWNsZXIgKGkuZS4sIGBpbnB1dHMubGVuKClgKS4ALFBhcmFtZXRlcnM6MQEqIGBpbnB1dHNgOiBBIGxpc3Qgb2YgaW5wdXRzLCBzcGVjaWZ5aW5nIHRoZSByZWN5Y2xlciBhbmQgYWxpYXNlcyB0byB1bmxvYWQuVQEqIGBhbGlhc19wcm9vZnNgOiB0aGUgcHJvb2ZzIGZvciBhbGwgYWxpYXNlcyBhY3Jvc3MgYWxsIGlucHV0cywgc2lnbmVkIG92ZXIgYSBtZXNzYWdlVQEgIHRoYXQgaW5jbHVkZXMgdGhlIHNpZ25lci4gVGhlIHByb29mcyBtdXN0IGNvcnJlc3BvbmQgc2VxdWVudGlhbGx5IHRvIHRoZSBhbGlhc2VzIGluLCAgYGlucHV0c2AuuCogYHRvYDogdGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBhc3NldC4xASogYGZlZV9jdXJyZW5jeWA6IHdoZXRoZXIgdG8gcGF5IHRoZSBmZWUgaW4gbmF0aXZlIGN1cnJlbmN5IG9yIHN0YWJsZSBhc3NldC4ANFJlcXVpcmVtZW50czpwKiBUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkLpQqIEFsbCBzcGVjaWZpZWQgcmVjeWNsZXJzIG11c3QgZXhpc3QuLQEqIFRoZSBhbGlhcyBwcm9vZnMgbXVzdCBjb3JyZXNwb25kIHNlcXVlbnRpYWxseSB0byB0aGUgYWxpYXNlcyBpbiBgaW5wdXRzYC45ASogYGlucHV0c2AgbXVzdCBub3QgYmUgZW1wdHkgYW5kIGVhY2ggZWxlbWVudCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGFsaWFzLkEBKiBUaGUgc2lnbmVyIG11c3QgaGF2ZSBzdWZmaWNpZW50IGJhbGFuY2UgdG8gcGF5IHRoZSBmZWUgKG9uZSBmZWUgcGVyIHJlY3ljbGVyKS5odW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbnMYARxhbGlhc2VzKQUBmEJvdW5kZWRWZWM8QWxpYXMsIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEUdmFsdWV1AwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAShzcGxpdF9pbnRvCQUBaQFCb3VuZGVkVmVjPChDb2luVmFsdWUsIEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBUOjpNYXhTcGxpdE91dHB1dHM+KSwKVDo6TWF4U3BsaXRPdXRwdXRzLD4AARxtYXhfZmVlxAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AA201FVubG9hZCBhIHJlY3ljbGVyIHRvIG1pbnQgbXVsdGlwbGUgbmV3IGNvaW5zIChzcGxpdCkuACkBVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6VW5sb2FkVG9rZW5dIHdpdGggYGZlZTogVW5sb2FkRmVlOjpQcmVwYWlkYC4ARQFUaGlzIGZ1bmN0aW9uIGNvbWJpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFtTZWxmOjp1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luXSBhbmRFAVtTZWxmOjpzcGxpdF0gaW4gYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvbi4gVGhlIHJlc3VsdGluZyBjb2lucycgYWdlIGlzIDEgYmVjYXVzZUUBdGhlIGFjdGlvbiBvZiBzcGxpdHRpbmcgYWdlIGNvaW5zLiBUaGlzIGlzIGFsc28gaW1wb3J0YW50IGJlY2F1c2UgcmVzdWx0aW5nIGNvaW5z6GFyZSBub3QgZW50aXJlbHkgZnJlc2gsIHRoZXkgY2FuIGJlIGxpbmtlZCB0byBvdGhlciBjb2lucy4AWQFVbmxpa2UgW1NlbGY6OnVubG9hZF9yZWN5Y2xlcl9pbnRvX2NvaW5dLCB0aGlzIGNhbGwgZG9lcyAqKm5vdCoqIHJlcXVpcmUgdGhlIG51bWJlciBvZnRhbGlhc2VzIHRvIGJlIGEgcG93ZXIgb2YgdHdvLgAsUGFyYW1ldGVyczpFASogYGFsaWFzZXNgOiB0aGUgbGlzdCBvZiBhbGlhc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBrZXlzIGluY2x1ZGVkIGluIHRoZRUBICByZWN5Y2xlci4gVGhlIHByb29mcyBmb3IgdGhlc2UgYWxpYXNlcyBhcmUgY29udGFpbmVkIGluIHRoZSBvcmlnaW4u+CogYHZhbHVlYCBhbmQgYGluZGV4YDogaWRlbnRpZmllcyB0aGUgcmVjeWNsZXIgYmVpbmcgdW5sb2FkZWQu+CogYHJldmlzaW9uYDogdGhlIHJlY3ljbGVyIHJldmlzaW9uIHVzZWQgZm9yIHRoZSBhbGlhc19wcm9vZnMuSQEqIGBzcGxpdF9pbnRvYDogYSB2ZWN0b3Igb2YgcGFpcnMsIGVhY2ggcGFpciBjb250YWluaW5nIGEgY29pbiB2YWx1ZSBhbmQgYSBsaXN0IG9maCAgZGVzdGluYXRpb24gYWNjb3VudCBpZHMuWQEqIGBtYXhfZmVlYDogdGhlIG1heGltdW0gZmVlIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byBwYXksIGV4cHJlc3NlZCBpbiB0aGUgdW5kZXJseWluZ0kBICBhc3NldCBiYWxhbmNlLiBJdCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRvdGFsIHZhbHVlIG9mIHRoZTkBICB1bmxvYWRlZCBjb2lucyBhbmQgdGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgZGVmaW5lZCBpbiBgc3BsaXRfaW50b2AuAMggIFdoZW4gdXNpbmcgW1VubG9hZEZlZTo6UHJlcGFpZF0sIHRoaXMgbXVzdCBiZSAwLkUBICBXaGVuIHVzaW5nIFtVbmxvYWRGZWU6OkZyb21PdXRwdXRdLCB0aGlzIGFtb3VudCBpcyBkZWR1Y3RlZCBmcm9tIHRoZSBpbnB1dDogdGhlVQEgIG5ldHdvcmsgZmVlIGlzIHRyYW5zZmVycmVkIHRvIFtDb25maWc6OkZlZURlc3RpbmF0aW9uXSBhbmQgYW55IHJlbWFpbmRlciBpcyBidXJuZWQuQQEgIFRoZSBjYWxsZXIgY2FuIHF1ZXJ5IGBnZXRfcGFpZF91bmxvYWRfdG9rZW5fZmVlX2luX2Fzc2V0YCB0byBlc3RpbWF0ZSB0aGUgZmVlLgBhASAgVGhpcyBwYXJhbWV0ZXIgc2VydmVzIGFzIGEgc2FmZWd1YXJkOiB0aGUgdHJhbnNhY3Rpb24gaXMgcmVqZWN0ZWQgYXQgdmFsaWRhdGlvbiBpZiB0aGVBASAgYWN0dWFsIG5ldHdvcmsgZmVlIGV4Y2VlZHMgYG1heF9mZWVgLCBwcm90ZWN0aW5nIHRoZSBjYWxsZXIgZnJvbSBleGNlc3NpdmUgZmVlXQEgIGluY3JlYXNlcyB0aGF0IHdvdWxkIHJlbmRlciB0aGUgYXJndW1lbnQgYHNwbGl0X2ludG9gIGludmFsaWQgKHVubG9hZGVkIGZ1bmRzIG11c3QgYmWYICBoaWdoZXIgdGhhbiB0aGUgc3BsaXQgcGx1cyB0aGUgZmVlKS4ANFJlcXVpcmVtZW50czqsKiBUaGUgb3JpZ2luIG11c3QgYmUgW09yaWdpbjo6VW5sb2FkVG9rZW5dLvAqIFRoZSByZWN5Y2xlciBpZGVudGlmaWVkIGJ5IGB2YWx1ZWAgYW5kIGBpbmRleGAgbXVzdCBleGlzdC5RASogVGhlIGFsaWFzIHByb29mcyBwcm92aWRlZCBpbiB0aGUgb3JpZ2luIG11c3QgYmUgdmFsaWQgZm9yIHRoZSByZWN5Y2xlcidzIHJldmlzaW9uLiEBKiBUaGUgYGFsaWFzZXNgIHByb3ZpZGVkIG11c3QgbWF0Y2ggdGhlIGFsaWFzZXMgZGVyaXZlZCBmcm9tIHRoZSBwcm9vZnMuYQEqIFRoZSB0b3RhbCB2YWx1ZSBvZiB0aGUgbmV3IGNvaW5zIGRlZmluZWQgaW4gYHNwbGl0X2ludG9gIHBsdXMgYG1heF9mZWVgIG11c3QgZXF1YWwgdGhlkCAgdG90YWwgdmFsdWUgb2YgdGhlIHVubG9hZGVkIGNvaW5zLlUBKiBgbWF4X2ZlZWAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtaW5pbXVtIGNvaW4uIChUaGlzIGlzIGltcGxpZWQgYnkgdGhlIGNvbmRpdGlvbiQgIGFib3ZlKS7gKiBFYWNoIGRlc3RpbmF0aW9uIGFjY291bnQgbXVzdCBub3QgYWxyZWFkeSBoYXZlIGEgY29pbi7cKiBXaGVuIHVzaW5nIFtVbmxvYWRGZWU6OlByZXBhaWRdLCBgbWF4X2ZlZWAgbXVzdCBiZSAwLi0BKiBXaGVuIHVzaW5nIFtVbmxvYWRGZWU6OkZyb21PdXRwdXRdLCBgbWF4X2ZlZWAgbXVzdCBjb3ZlciB0aGUgbmV0d29yayBmZWUuoGRpcmVjdF9vZmZib2FyZF9jb2luX2ludG9fZXh0ZXJuYWxfYXNzZXQEAQh0bwQBMFQ6OkFjY291bnRJZAAOOCUBRGlyZWN0bHkgb2ZmYm9hcmQgYSBmcmVzaCwgMC1hZ2UgY29pbiBpbnRvIHRoZSB1bmRlcmx5aW5nIGV4dGVybmFsIGFzc2V0LgBFAVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OkNvaW5dLCBvYnRhaW5lZCB0aHJvdWdoIFtBc0NvaW5hZ2VdIHVzaW5nIGBBc0NvaW5gLgANAUJlY2F1c2UgdGhlIGNvaW4gbXVzdCBiZSBmcmVzaCAoYGFnZSA9PSAwYCksIHRoaXMgY2FsbCBieXBhc3NlcyB0aGVJAXJlY3ljbGVyL3VubG9hZC10b2tlbiBvZmZib2FyZGluZyBmbG93IGFuZCByZWxlYXNlcyB0aGUgdW5kZXJseWluZyBhc3NldCBkaXJlY3RseS4ALFBhcmFtZXRlcnM6PQEqIGB0b2A6IGRlc3RpbmF0aW9uIGFjY291bnQgdGhhdCByZWNlaXZlcyB0aGUgcmVsZWFzZWQgdW5kZXJseWluZyBhc3NldCBhbW91bnQuADRSZXF1aXJlbWVudHM6kCogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OkNvaW5dLqgqIFRoZSBjb2luIG11c3QgYmUgZnJlc2g6IGBjb2luLmFnZSA9PSAwYC4JASogVGhlIGNvaW4gdmFsdWUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIHVuZGVybHlpbmctYXNzZXQgYW1vdW50LjhjbGVhbl9yZWN5Y2xlcgQBFHZhbHVldQMBJENvaW5WYWx1ZQBlHHRDbGVhbiB1cCBhbiBleHBpcmVkIHJlY3ljbGVyLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UuAA0BVGhpcyByZW1vdmVzIGFuIG9sZCByZWN5Y2xlciB0aGF0IGhhcyBleGNlZWRlZCBpdHMgZXhwaXJhdGlvbiB0aW1lLkkBQW55IHJlbWFpbmluZyAobm90IHVubG9hZGVkKSB2YWx1ZSBpbiB0aGUgcmVjeWNsZXIgaXMgY29uc2lkZXJlZCBsb3N0IGFuZCBhZGRlZCB0b3RbVG90YWxWYWx1ZU9mRGVzdHJveWVkQ29pbnNdLmRjbGVhbl9jb25zdW1lZF9mcmVlX3Rva2VuBAEYcGVyaW9kOAEYUGVyaW9kAGYM/ENsZWFudXAgc3RvcmFnZSBmb3IgY29uc3VtZWQgZnJlZSB1bmxvYWQgdG9rZW5zIG9mIG9sZCBwZXJpb2RzLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UucGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcIARhwZXJpb2Q4ARhQZXJpb2QAAShyaW5nX2luZGV4OAEkUmluZ0luZGV4AGgYCQFDbGVhbiB1cCBhIHNpbmdsZSByaW5nIGluIGFuIGV4cGlyZWQgcGFpZCB1bmxvYWQgdG9rZW4gY29sbGVjdGlvbi4AQQFUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gVGhlIG9yaWdpbiBtdXN0IGJlIGF1dGhvcml6ZWQgYW5kIGZyb20gbG9jYWwgc291cmNlLikBUmluZ3MgbXVzdCBiZSBjbGVhbmVkIHNlcXVlbnRpYWxseSAocmluZyAwIGZpcnN0LCB0aGVuIDEsIGV0Yy4pIGJlZm9yZSB0aGV0Y29sbGVjdGlvbiBjYW4gYmUgZGVsZXRlZCB2aWGNAVtgZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbmBdKFNlbGY6OmRlbGV0ZV9leHBpcmVkX3BhaWRfdW5sb2FkX3Rva2VuX2NvbGxlY3Rpb24pLkxjbGVhbl9yZWN5Y2xlcl9kdXN0AGkUcENsZWFuIHVwIGR1c3QgZm9yIHJlY3ljbGVycy4AQQFUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gVGhlIG9yaWdpbiBtdXN0IGJlIGF1dGhvcml6ZWQgYW5kIGZyb20gbG9jYWwgc291cmNlLkkBUmVtb3ZlcyB1cCB0byBEVVNUX0NMRUFOVVBfQkFUQ0hfU0laRSB1bmxvYWRlZCBhbGlhcyBlbnRyaWVzIHBlciBjYWxsIHRvIGJvdW5kIHRoZShvcGVyYXRpb24ucGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAagyUQ2xlYW4gdXAgZHVzdCBmb3IgcGFpZCB1bmxvYWQgdG9rZW5zLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UurGRlbGV0ZV9leHBpcmVkX3BhaWRfdW5sb2FkX3Rva2VuX2NvbGxlY3Rpb24EARhwZXJpb2Q4ARhQZXJpb2QAaxhFAURlbGV0ZSBhbiBleHBpcmVkIHBhaWQgdW5sb2FkIHRva2VuIGNvbGxlY3Rpb24gYWZ0ZXIgYWxsIHJpbmdzIGhhdmUgYmVlbiBjbGVhbmVkLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UukEFsbCByaW5ncyBtdXN0IGhhdmUgYmVlbiBjbGVhbmVkIHZpYUEBW2BjbGVhbl9wYWlkX3VubG9hZF90b2tlbl9yaW5nYF0oU2VsZjo6Y2xlYW5fcGFpZF91bmxvYWRfdG9rZW5fcmluZykgYmVmb3JlIHRoaXM4Y2FuIGJlIGNhbGxlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuCQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENBQRTAAAEABUFARhWZWM8VD4AAA0FAAAECHUDEQUAEQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEEBFMAAAQAzAEYVmVjPFQ+AAAVBQAAAg0FABkFDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXREQ29kZWNQcmVzZXJ2YXRpb24AAQwoRXhwZW5kYWJsZQAAABxQcm90ZWN0AAEAIFByZXNlcnZlAAIAAB0FDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBIQUEUwAABAAlBQEYVmVjPFQ+AAAhBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0PFVucGFpZExvYWRJbnB1dAQEVAAAEAEwcHJlc2VydmF0aW9uGQUBRENvZGVjUHJlc2VydmF0aW9uAAEUdmFsdWV1AwEkQ29pblZhbHVlAAEobWVtYmVyX2tleQgBLE1lbWJlck9mPFQ+AAFIcHJvb2Zfb2Zfb3duZXJzaGlwbQQBOFNpZ25hdHVyZU9mPFQ+AAAlBQAAAiEFACkFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEAFUEARhWZWM8VD4AAC0FDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBMQUEUwAABAA1BQEYVmVjPFQ+AAAxBQAABAh1AwgANQUAAAIxBQA5BQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0TFVubG9hZFJlY3ljbGVySW5wdXQEMEFsaWFzZXNCb3VuZAAAEAEUdmFsdWV1AwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAARxhbGlhc2VzKQUBfEJvdW5kZWRWZWM8QWxpYXMsIEFsaWFzZXNCb3VuZD4AAD0FDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQsRmVlQ3VycmVuY3kAAQgYTmF0aXZlAAAAGFN0YWJsZQABAABBBQAAAjkFAEUFDHRpbmRpdl9wYWxsZXRfbWVtYmVyc19ub3RpZmllchhwYWxsZXQQQ2FsbAQEVAABHCRzdWJzY3JpYmUMAVxzdWJzY3JpYmVyX3BhcmFjaGFpbl9pZJwBGFBhcmFJZAABTG1lbWJlcnNfY29sbGVjdGlvbnNJBQEdAUJvdW5kZWRWZWM8KElkZW50aWZpZXIsIFJpbmdFeHBvbmVudCksIFQ6Ok1heENvbGxlY3Rpb25zUGVyU3Vic2NyaWJlciw+AAEwcGFsbGV0X2luZGV4DAEIdTgAACygUmVnaXN0ZXJzIHRoZSBwYXJhY2hhaW4gYXMgYSBzdWJzY3JpYmVyLtBUaGUgaW5pdGlhbCBzdGF0ZSB3aWxsIGJlIHNlbnQgb3ZlciBzaG9ydGx5IHZpYSBYQ00uACQjIyBPcmlnaW6oUmVxdWlyZXMgYE1hbmFnZU9yaWdpbmAgKGdvdmVybmFuY2Uvcm9vdCkuADQjIyBQYXJhbWV0ZXJzFQEtIGBzdWJzY3JpYmVyX3BhcmFjaGFpbl9pZGA6IFRoZSBQYXJhSWQgb2YgdGhlIHN1YnNjcmliaW5nIHBhcmFjaGFpbi5FAS0gYG1lbWJlcnNfY29sbGVjdGlvbnNgOiBMaXN0IG9mIGNvbGxlY3Rpb24gaWRlbnRpZmllcnMgdG8gc3Vic2NyaWJlIHRvIGFuZCB0aGVpcnAgIHJlc3BlY3RpdmUgcmluZyBleHBvbmVudHMuNQEtIGBwYWxsZXRfaW5kZXhgOiBQYWxsZXQgaW5kZXggb2YgbWVtYmVycy1zdWJzY3JpYmVyIG9uIHRoZSBzdWJzY3JpYmVyIGNoYWluLix1bnN1YnNjcmliZQQBXHN1YnNjcmliZXJfcGFyYWNoYWluX2lkVQUBOE9wdGlvbjxQYXJhSWQ+AAEkZFVuc3Vic2NyaWJlcyBhIHBhcmFjaGFpbi4AJCMjIE9yaWdpbj0BLSAqKlNlbGYtdW5zdWJzY3JpYmUqKjogU3Vic2NyaWJlciBwYXJhY2hhaW4gdmlhIFhDTSAoYEVuc3VyZVN1YnNjcmliZXJPcmlnaW5gKdQtICoqR292ZXJuYW5jZSB1bnN1YnNjcmliZSoqOiBSZXF1aXJlcyBgTWFuYWdlT3JpZ2luYAA0IyMgUGFyYW1ldGVyc2EBLSBgc3Vic2NyaWJlcl9wYXJhY2hhaW5faWRgOiBUaGUgUGFyYUlkIHRvIHVuc3Vic2NyaWJlLiBSZXF1aXJlZCBmb3IgZ292ZXJuYW5jZSwgaWdub3JlZMQgIGZvciBzZWxmLXVuc3Vic2NyaWJlIChkZXJpdmVkIGZyb20gWENNIG9yaWdpbikuOHJlcXVlc3RfcmVwbGF5DAFcc3Vic2NyaWJlcl9wYXJhY2hhaW5faWScARhQYXJhSWQAAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABRHJpbmdfcm9vdF9pbmRpY2VzWQUBsEJvdW5kZWRWZWM8UmluZ0luZGV4LCBUOjpNYXhVcGRhdGVzUGVyQmF0Y2g+AAIknFJlcXVlc3RzIHJlcGxheSBvZiBzcGVjaWZpYyByaW5nIHJvb3RzLgA1AVBlcm1pc3Npb25sZXNzIOKAlCBhbnkgc2lnbmVkIG9yaWdpbiBjYW4gcmVxdWVzdCBhIHJlcGxheSBmb3IgYW55IHN1YnNjcmliZXIuSQFUaGUgc3Vic2NyaWJlciBwYXJhY2hhaW4gaXMgaWRlbnRpZmllZCBieSB0aGUgYHN1YnNjcmliZXJfcGFyYWNoYWluX2lkYCBwYXJhbWV0ZXIuACxQYXJhbWV0ZXJzOugtIGBzdWJzY3JpYmVyX3BhcmFjaGFpbl9pZGA6IFRoZSBQYXJhSWQgb2YgdGhlIHN1YnNjcmliZXIumC0gYGlkZW50aWZpZXJgOiBDb2xsZWN0aW9uIGlkZW50aWZpZXIuWQEtIGByaW5nX3Jvb3RfaW5kaWNlc2A6IExpc3Qgb2YgcmluZyByb290IGluZGljZXMsIG11c3QgYmUgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLjxlbnF1ZXVlX3VwZGF0ZXMEASRzZW5kX3BhZ2UtAwEMdTE2AAMM+EVucXVldWVzIHBlbmRpbmcgdXBkYXRlcyBpbnRvIGEgc2VhbGVkIGJhdGNoIGZvciBkaXN0cmlidXRpb24uAMRBdXRob3JpemVkIGNhbGwgc3VibWl0dGVkIGJ5IHRoZSBvZmZjaGFpbiB3b3JrZXIuKHNlbmRfYmF0Y2gIARxwYXJhX2lknAEYUGFyYUlkAAEgc2VxdWVuY2UoAThTZXF1ZW5jZU51bWJlcgAEDMRTZW5kcyB0aGUgY3VycmVudCBiYXRjaCB0byBhIHNwZWNpZmljIHN1YnNjcmliZXIuAPRBdXRob3JpemVkIG1haW50ZW5hbmNlIGNhbGwgc3VibWl0dGVkIGJ5IHRoZSBvZmZjaGFpbiB3b3JrZXIuOHNlbmRfaW5pdF9wYWdlDAEccGFyYV9pZJwBGFBhcmFJZAABYGN1cnJlbnRfY29sbGVjdGlvbl9pbmRleDgBDHUzMgABQGFmdGVyX3JpbmdfaW5kZXgJAwFET3B0aW9uPFJpbmdJbmRleD4ABQzYU2VuZHMgb25lIHBhZ2Ugb2YgaW5pdGlhbGl6YXRpb24gZGF0YSB0byBhIHN1YnNjcmliZXIuAPRBdXRob3JpemVkIG1haW50ZW5hbmNlIGNhbGwgc3VibWl0dGVkIGJ5IHRoZSBvZmZjaGFpbiB3b3JrZXIuTGFiYW5kb25fc3R1Y2tfYmF0Y2gABhTkQWJhbmRvbnMgYSBzdHVjayBiYXRjaCB0aGF0IGV4Y2VlZGVkIGBTdHVja0JhdGNoVGltZW91dGAuMQFTdWJzY3JpYmVycyB0aGF0IGRpZCBub3QgcmVjZWl2ZSB0aGUgYmF0Y2ggY2FuIHJlY292ZXIgdmlhIGByZXF1ZXN0X3JlcGxheWAuADUBQXV0aG9yaXplZCBtYWludGVuYW5jZSBjYWxsIHN1Ym1pdHRlZCBieSB0aGUgb2ZmY2hhaW4gd29ya2VyIHdoZW4gYSBiYXRjaCBoYXOwYmVlbiBhY3RpdmUgbG9uZ2VyIHRoYW4gYFN0dWNrQmF0Y2hUaW1lb3V0YC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuSQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFNBQRTAAAEAFEFARhWZWM8VD4AAE0FAAAECAj9BABRBQAAAk0FAFUFBBhPcHRpb24EBFQBnAEIEE5vbmUAAAAQU29tZQQAnAAAAQAAWQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAZQQBGFZlYzxUPgAAXQUMjGluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uGHBhbGxldBBDYWxsBARUAAEEeHNldF9haXJkcm9wX3NjaGVkdWxpbmdfZW5hYmxlZAQBHGVuYWJsZWTIARBib29sAAAQAQFFbmFibGUgb3IgZGlzYWJsZSBvbl9wb2xsIGFpcmRyb3Agc2NoZWR1bGluZy4gV2hpbGUgZGlzYWJsZWQgdGhlCQFgT3BlbmluZ0FpcmRyb3BQb29sc2Agc3RhdGUgcmVtYWlucyBhY3RpdmUgYnV0IG9wZW5zIG5vIG5ldyBwb29scy4pAVJlLWVuYWJsaW5nIGRvZXMgbm90IGJhY2stZmlsbCBza2lwcGVkIHBlcmlvZHM6IGF0IG1vc3Qgb25lIHBvb2wgaXMgb3BlbmVksHBlciBwZXJpb2QsIGFuZCBvbmx5IGZvciB0aGUgY3VycmVudCBwZXJpb2QuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmEFDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQQQ2FsbAQEVAABDDxvcGVuX3ByaXplX3Bvb2wcARh0YXJnZXRlBQEsUHJpemVUYXJnZXQAAShkaXNwYXRjaGVyBAEwVDo6QWNjb3VudElkAAEgdmFsaWRpdHk4AQx1MzIAAShudW1fcHJpemVzOAEMdTMyAAEscHJpemVfdmFsdWXEAURBc3NldEJhbGFuY2VPZjxUPgABIGFzc2V0X2lk4AEwQXNzZXRJZE9mPFQ+AAEwd2lubmVyX3JhdGlvaQUBHFBlcm1pbGwAABRBAU9wZW4gYSBuZXcgcHJpemUgcG9vbCBmcm9tIHdoaWNoIGBudW1fcHJpemVzYCBhbGlhc2VzIGluIHRoZSBgdGFyZ2V0YCBwb3B1bGF0aW9ugG1heSBjbGFpbSBhIGZpeGVkIGBwcml6ZV92YWx1ZWAuAOBPcmlnaW4gbXVzdCBiZSBgVDo6TWFuYWdlck9yaWdpbmAuIE90aGVyIHBhbGxldHMgY2FuIHVzZQkBW2BBaXJkcm9wQXBpOjpvcGVuX3ByaXplX3Bvb2xgXSAoZ2F0ZWQgYnkgYFQ6OlRyYWl0Q2FsbGVyT3JpZ2luYCkuLGNsYWltX3ByaXplGAEccG9vbF9pZDgBLFByaXplUG9vbElkAAEocmluZ19pbmRleDgBJFJpbmdJbmRleAABIHJldmlzaW9uOAE0UmV2aXNpb25JbmRleAABFHByb29mfQMBKFByb29mT2Y8VD4AARRhbGlhcwgBFEFsaWFzAAEsYmVuZWZpY2lhcnkEATBUOjpBY2NvdW50SWQAAUwVAUNsYWltIGEgcHJpemUgZnJvbSBhIGBQcml6ZVRhcmdldDo6UGVvcGxlYCBwb29sIGJ5IHN1Ym1pdHRpbmcgYSByaW5nLWhtZW1iZXJzaGlwIHByb29mIGRpcmVjdGx5LgAxAVRoaXMgaXMgYW4gYXV0aG9yaXplZCBleHRyaW5zaWM6IHRoZSBwcm9vZiBpdHNlbGYgaXMgdGhlIGF1dGhlbnRpY2F0aW9uLiBUaGVFAXBlci1wb29sIFtgUHJpemVQb29sQ2xhaW1zYF0gc3RvcmFnZSBpcyB0aGUgcmVwbGF5IGd1YXJkIOKAlCBlYWNoIGFsaWFzIG1heSBjbGFpbTkBb25jZSBwZXIgcG9vbC4gVGhlIHByb29mIGlzIGJvdW5kIHRvIGBiZW5lZmljaWFyeWAgKHNvIGEgY2FwdHVyZWQgcHJvb2YgY2Fubm90PQFyZWRpcmVjdCB0aGUgcHJpemUpIGFuZCB0byB0aGUgcG9vbCdzIGNvbnRleHQgKHNvIGEgcHJvb2YgY2Fubm90IGJlIHJlcGxheWVkIG9uSGEgZGlmZmVyZW50IHBvb2wpLgAlAWBhbGlhc2AgaXMgdGhlIHZhbHVlIHRoZSBwcm9vZiB2ZXJpZmllcyB0bzsgdGhlIGF1dGhvcml6ZSBjbG9zdXJlIHJlamVjdHMhAWBBbGlhc01pc21hdGNoYCBpZiBpdCBkaXNhZ3JlZXMgd2l0aCB0aGUgcHJvb2YuIFRoZSBkaXNwYXRjaCBib2R5IHRydXN0czUBYGFsaWFzYCBhbmQgc2tpcHMgYSBzZWNvbmQgdmVyaWZpY2F0aW9uIOKAlCB0aGlzIGlzIHNvdW5kIGJlY2F1c2UgdGhlIGNhbGwgaXM5AW9ubHkgcmVhY2hhYmxlIHRocm91Z2ggYGVuc3VyZV9hdXRob3JpemVkYCwgd2hpY2ggcHJvdmVzIHRoZSBhdXRob3JpemUgY2xvc3VyZSRhY2NlcHRlZC4AMQFUaGUgcHJvb2YncyBjb250ZXh0IGlzIGBjb250ZXh0X2Zvcl9wb29sX2lkKHBvb2xfaWQpYDsgdGhlIHByb29mIGlzIHZlcmlmaWVkNQFhZ2FpbnN0IGBQRU9QTEVfSURFTlRJRklFUmAgKGxpdGUtcGVvcGxlIGFyZSBub3QgZWxpZ2libGUpLiBUaGUgcG9vbCdzIHRhcmdldC0BbXVzdCBiZSBgUHJpemVUYXJnZXQ6OlBlb3BsZWA7IGBHYW1lUGFydGljaXBhbnRzYCBwb29scyBhcmUgY2xhaW1lZCB2aWEgdGhlAQFnYW1lIHBhbGxldCwgd2hpY2ggZm9yd2FyZHMgdG8gW2BBaXJkcm9wQXBpOjpjbGFpbV9nYW1lX3ByaXplYF0uQGNsb3NlX3ByaXplX3Bvb2wEARxwb29sX2lkOAEsUHJpemVQb29sSWQAAhgtAUNsb3NlIGEgcHJpemUgcG9vbCBlYXJseS4gT3JpZ2luIG11c3QgYmUgdGhlIHBvb2wncyBgZGlzcGF0Y2hlcmAgb3Igc2F0aXNmeUEBYFQ6Ok1hbmFnZXJPcmlnaW5gLiBSZWxlYXNlcyBgcHJpemVfdmFsdWUgKiBwcml6ZXNfcmVtYWluaW5nYCBvZiBoZWxkIGZ1bmRzIGJhY2s1AXRvIHRoZSBhaXJkcm9wIHBvdCBhbmQgbWFya3MgdGhlIHBvb2wgZXhwaXJlZC1ub3cgc28gdGhlIG9uLXBvbGwgY2xlYW51cCBsb29wPQFkcmFpbnMgYFByaXplUG9vbENsYWltc2Agb3ZlciBtdWx0aXBsZSB0aWNrcy4gVGhpcyBrZWVwcyB0aGUgZXh0cmluc2ljJ3Mgd2VpZ2h0HQFib3VuZGVkIGJ5IGBQcml6ZVBvb2xDbGVhckxpbWl0YCByZWdhcmRsZXNzIG9mIGhvdyBtYW55IGNsYWltcyB0aGUgcG9vbDBhY2N1bXVsYXRlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuZQUMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldCxQcml6ZVRhcmdldAABCBhQZW9wbGUAAABAR2FtZVBhcnRpY2lwYW50cwQAOAEMdTMyAAEAAGkFDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVybWlsbAAABAA4AQx1MzIAAG0FDERwYWxsZXRfbWlncmF0aW9ucxhwYWxsZXQQQ2FsbAQEVAABEEBmb3JjZV9zZXRfY3Vyc29yBAEYY3Vyc29ycQUBTE9wdGlvbjxDdXJzb3JPZjxUPj4AABRdAUFsbG93cyByb290IHRvIHNldCBhIGN1cnNvciB0byBmb3JjZWZ1bGx5IHN0YXJ0LCBzdG9wIG9yIGZvcndhcmQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLgBJAVNob3VsZCBub3JtYWxseSBub3QgYmUgbmVlZGVkIGFuZCBpcyBvbmx5IGluIHBsYWNlIGFzIGVtZXJnZW5jeSBtZWFzdXJlLiBOb3RlIHRoYXQFAXJlc3RhcnRpbmcgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIGluIHRoaXMgbWFubmVyIHdpbGwgbm90IGNhbGwgdGhlLQFbYE1pZ3JhdGlvblN0YXR1c0hhbmRsZXI6OnN0YXJ0ZWRgXSBob29rIG9yIGVtaXQgYW4gYFVwZ3JhZGVTdGFydGVkYCBldmVudC5cZm9yY2Vfc2V0X2FjdGl2ZV9jdXJzb3IMARRpbmRleDgBDHUzMgABMGlubmVyX2N1cnNvcoEFAVhPcHRpb248UmF3Q3Vyc29yT2Y8VD4+AAEoc3RhcnRlZF9hdAkDAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAEYWQFBbGxvd3Mgcm9vdCB0byBzZXQgYW4gYWN0aXZlIGN1cnNvciB0byBmb3JjZWZ1bGx5IHN0YXJ0L2ZvcndhcmQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLgBFAVRoaXMgaXMgYW4gZWRnZS1jYXNlIHZlcnNpb24gb2YgW2BTZWxmOjpmb3JjZV9zZXRfY3Vyc29yYF0gdGhhdCBhbGxvd3MgdG8gc2V0IHRoZWEBYHN0YXJ0ZWRfYXRgIHZhbHVlIHRvIHRoZSBuZXh0IGJsb2NrIG51bWJlci4gT3RoZXJ3aXNlIHRoaXMgd291bGQgbm90IGJlIHBvc3NpYmxlLCBzaW5jZUUBYGZvcmNlX3NldF9jdXJzb3JgIHRha2VzIGFuIGFic29sdXRlIGJsb2NrIG51bWJlci4gU2V0dGluZyBgc3RhcnRlZF9hdGAgdG8gYE5vbmVgAQFpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBibG9jayBudW1iZXIgcGx1cyBvbmUgc2hvdWxkIGJlIHVzZWQuSGZvcmNlX29uYm9hcmRfbWJtcwACEKBGb3JjZXMgdGhlIG9uYm9hcmRpbmcgb2YgdGhlIG1pZ3JhdGlvbnMuAF0BVGhpcyBwcm9jZXNzIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiBhIHJ1bnRpbWUgdXBncmFkZS4gSXQgaXMgaW4gcGxhY2UgYXMgYW4gZW1lcmdlbmN5/G1lYXN1cmVtZW50LiBUaGUgY3Vyc29yIG5lZWRzIHRvIGJlIGBOb25lYCBmb3IgdGhpcyB0byBzdWNjZWVkLjhjbGVhcl9oaXN0b3JpYwQBIHNlbGVjdG9yhQUBoEhpc3RvcmljQ2xlYW51cFNlbGVjdG9yPElkZW50aWZpZXJPZjxUPj4AAxRoQ2xlYXJzIHRoZSBgSGlzdG9yaWNgIHNldC4ADQFgbWFwX2N1cnNvcmAgbXVzdCBiZSBzZXQgdG8gdGhlIGxhc3QgdmFsdWUgdGhhdCB3YXMgcmV0dXJuZWQgYnkgdGhlXQFgSGlzdG9yaWNDbGVhcmVkYCBldmVudC4gVGhlIGZpcnN0IHRpbWUgYE5vbmVgIGNhbiBiZSB1c2VkLiBgbGltaXRgIG11c3QgYmUgY2hvc2VuIGluIGGod2F5IHRoYXQgd2lsbCByZXN1bHQgaW4gYSBzZW5zaWJsZSB3ZWlnaHQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLnEFBBhPcHRpb24EBFQBdQUBCBBOb25lAAAAEFNvbWUEAHUFAAABAAB1BQhEcGFsbGV0X21pZ3JhdGlvbnM8TWlncmF0aW9uQ3Vyc29yCBhDdXJzb3IBeQUsQmxvY2tOdW1iZXIBOAEIGEFjdGl2ZQQAfQUBhEFjdGl2ZUN1cnNvcjxDdXJzb3IsIEJsb2NrTnVtYmVyPgAAABRTdHVjawABAAB5BQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQwEUwAABAAYARhWZWM8VD4AAH0FCERwYWxsZXRfbWlncmF0aW9uczBBY3RpdmVDdXJzb3IIGEN1cnNvcgF5BSxCbG9ja051bWJlcgE4AAwBFGluZGV4OAEMdTMyAAEwaW5uZXJfY3Vyc29ygQUBOE9wdGlvbjxDdXJzb3I+AAEoc3RhcnRlZF9hdDgBLEJsb2NrTnVtYmVyAACBBQQYT3B0aW9uBARUAXkFAQgQTm9uZQAAABBTb21lBAB5BQAAAQAAhQUIRHBhbGxldF9taWdyYXRpb25zXEhpc3RvcmljQ2xlYW51cFNlbGVjdG9yBAhJZAGJBQEIIFNwZWNpZmljBACNBQEcVmVjPElkPgAAACBXaWxkY2FyZAgBFGxpbWl0CQMBLE9wdGlvbjx1MzI+AAE8cHJldmlvdXNfY3Vyc29ykQUBPE9wdGlvbjxWZWM8dTg+PgABAACJBQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQwEUwAABAAYARhWZWM8VD4AAI0FAAACiQUAkQUEGE9wdGlvbgQEVAEYAQgQTm9uZQAAABBTb21lBAAYAAABAACVBQxccGFsbGV0X3ZlcmlmeV9zaWduYXR1cmUkZXh0ZW5zaW9uPFZlcmlmeVNpZ25hdHVyZQQEVAABCCBEaXNhYmxlZAAAABhTaWduZWQIASRzaWduYXR1cmU1BAEwVDo6U2lnbmF0dXJlAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABAACZBQxMaW5kaXZfcGFsbGV0X3Blb3BsZSRleHRlbnNpb24gQXNQZXJzb24EBFQAAAQAnQUBXE9wdGlvbjxBc1BlcnNvbkluZm88VD4+AACdBQQYT3B0aW9uBARUAaEFAQgQTm9uZQAAABBTb21lBAChBQAAAQAAoQUMTGluZGl2X3BhbGxldF9wZW9wbGUkZXh0ZW5zaW9uMEFzUGVyc29uSW5mbwQEVAABFGhBc1BlcnNvbmFsQWxpYXNXaXRoQWNjb3VudAQAOAEgVDo6Tm9uY2UAAABgQXNQZXJzb25hbEFsaWFzV2l0aFByb29mDAB9AwEoUHJvb2ZPZjxUPgAAOAEkUmluZ0luZGV4AAAIARxDb250ZXh0AAEAbEFzUGVyc29uYWxJZGVudGl0eVdpdGhQcm9vZggAbQQBOFNpZ25hdHVyZU9mPFQ+AAAoAShQZXJzb25hbElkAAIAdEFzUGVyc29uYWxJZGVudGl0eVdpdGhBY2NvdW50BAA4ASBUOjpOb25jZQADAIRBc1BlcnNvbmFsQWxpYXNXaXRoQWNjb3VudFJldmlzZWQQADgBIFQ6Ok5vbmNlAAB9AwEoUHJvb2ZPZjxUPgAAOAEkUmluZ0luZGV4AAAIARxDb250ZXh0AAQAAKUFDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rJGV4dGVuc2lvblxBc1Byb29mT2ZJbmtQYXJ0aWNpcGFudAQEVAAABACpBQGYT3B0aW9uPEFzUHJvb2ZPZklua1BhcnRpY2lwYW50SW5mbzxUPj4AAKkFBBhPcHRpb24EBFQBrQUBCBBOb25lAAAAEFNvbWUEAK0FAAABAACtBQxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luayRleHRlbnNpb25sQXNQcm9vZk9mSW5rUGFydGljaXBhbnRJbmZvBARUAAEMOEFzQXBwbHlXaXRoU2lnBAA4ASBUOjpOb25jZQAAAChBc1JlZmVycmVkBAA4ASBUOjpOb25jZQABACRBc0ludml0ZWQEADgBIFQ6Ok5vbmNlAAIAALEFDEhpbmRpdl9wYWxsZXRfc2NvcmUkZXh0ZW5zaW9uSFNjb3JlQXNQYXJ0aWNpcGFudAQEVAAABAC1BQGgT3B0aW9uPFNjb3JlQXNQYXJ0aWNpcGFudERhdGE8VDo6Tm9uY2U+PgAAtQUEGE9wdGlvbgQEVAG5BQEIEE5vbmUAAAAQU29tZQQAuQUAAAEAALkFDEhpbmRpdl9wYWxsZXRfc2NvcmUkZXh0ZW5zaW9uWFNjb3JlQXNQYXJ0aWNpcGFudERhdGEEFE5vbmNlATgABAEUbm9uY2U4ARROb25jZQAAvQUMRGluZGl2X3BhbGxldF9nYW1lJGV4dGVuc2lvbjRHYW1lQXNJbnZpdGVkBARUAAAEAMEFAXBPcHRpb248R2FtZUFzSW52aXRlZERhdGE8VD4+AADBBQQYT3B0aW9uBARUAcUFAQgQTm9uZQAAABBTb21lBADFBQAAAQAAxQUMRGluZGl2X3BhbGxldF9nYW1lJGV4dGVuc2lvbkRHYW1lQXNJbnZpdGVkRGF0YQQEVAAAEAEUbm9uY2U4ASBUOjpOb25jZQABHGludml0ZXIEATBUOjpBY2NvdW50SWQAARh0aWNrZXQEASxUaWNrZXRPZjxUPgABJHNpZ25hdHVyZTUEAUhUOjpUaWNrZXRTaWduYXR1cmUAAMkFDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUkZXh0ZW5zaW9uOFBlb3BsZUxpdGVBdXRoBARUAAAEAM0FAXxPcHRpb248UGVvcGxlTGl0ZUF1dGhEYXRhT2Y8VD4+AADNBQQYT3B0aW9uBARUAdEFAQgQTm9uZQAAABBTb21lBADRBQAAAQAA0QUMYGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZSRleHRlbnNpb25IUGVvcGxlTGl0ZUF1dGhEYXRhCBROb25jZQE4FFByb29mAX0DARAwQXNMaXRlUGVyc29uBAA4ARROb25jZQAAAFhBc0xpdGVBbGlhc1dpdGhBY2NvdW50BAA4ARROb25jZQABAFBBc0xpdGVBbGlhc1dpdGhQcm9vZgwAfQMBFFByb29mAAA4ASRSaW5nSW5kZXgAAAgBHENvbnRleHQAAgB0QXNMaXRlQWxpYXNXaXRoQWNjb3VudFJldmlzZWQQADgBFE5vbmNlAAB9AwEUUHJvb2YAADgBJFJpbmdJbmRleAAACAEcQ29udGV4dAADAADVBQxQaW5kaXZfcGFsbGV0X21lbWJlcnMkZXh0ZW5zaW9uIEFzTWVtYmVyBARUAAAEANkFAVxPcHRpb248QXNNZW1iZXJJbmZvPFQ+PgAA2QUEGE9wdGlvbgQEVAHdBQEIEE5vbmUAAAAQU29tZQQA3QUAAAEAAN0FDFBpbmRpdl9wYWxsZXRfbWVtYmVycyRleHRlbnNpb24wQXNNZW1iZXJJbmZvBARUAAEELFNlbGZJbmNsdWRlBABtBAE4U2lnbmF0dXJlT2Y8VD4AAAAA4QUMUGluZGl2X3BhbGxldF9jb2luYWdlJGV4dGVuc2lvbiRBc0NvaW5hZ2UEBFQAAAQA5QUBYE9wdGlvbjxBc0NvaW5hZ2VJbmZvPFQ+PgAA5QUEGE9wdGlvbgQEVAHpBQEIEE5vbmUAAAAQU29tZQQA6QUAAAEAAOkFDFBpbmRpdl9wYWxsZXRfY29pbmFnZSRleHRlbnNpb240QXNDb2luYWdlSW5mbwQEVAABGBhBc0NvaW4AAABMQXNVbmxvYWRUb2tlblBlb3BsZRABFHByb29m7QUBoDxUOjpQZW9wbGVQcm9vZiBhcyBWYWxpZGF0ZVByb29mPjo6UHJvb2YAARhwZXJpb2Q4ARhQZXJpb2QAARxjb3VudGVyOAEMdTMyAAEwYWxpYXNfcHJvb2ZzeQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAQBcQXNVbmxvYWRUb2tlbkxpdGVQZW9wbGUQARRwcm9vZvEFAbA8VDo6TGl0ZVBlb3BsZVByb29mIGFzIFZhbGlkYXRlUHJvb2Y+OjpQcm9vZgABGHBlcmlvZDgBGFBlcmlvZAABHGNvdW50ZXI4AQx1MzIAATBhbGlhc19wcm9vZnN5AwGsQm91bmRlZFZlYzxQcm9vZk9mPFQ+LCBUOjpNYXhDb25zb2xpZGF0aW9uPgACAERBc1VubG9hZFRva2VuUGFpZBQBFHByb29mfQMBKFByb29mT2Y8VD4AARhwZXJpb2Q4ARhQZXJpb2QAAVRwYWlkX3Rva2VuX3JpbmdfaW5kZXg4AQx1MzIAAWBwYWlkX3Rva2VuX3JpbmdfcmV2aXNpb244AQx1MzIAATBhbGlhc19wcm9vZnN5AwGsQm91bmRlZFZlYzxQcm9vZk9mPFQ+LCBUOjpNYXhDb25zb2xpZGF0aW9uPgADAFxBc1VubG9hZFRva2VuRnJvbU91dHB1dBABSGZlZV9yZWN5Y2xlcl92YWx1ZXUDASRDb2luVmFsdWUAAUhmZWVfcmVjeWNsZXJfaW5kZXg4ASRSaW5nSW5kZXgAAVRmZWVfcmVjeWNsZXJfcmV2aXNpb244ATRSZXZpc2lvbkluZGV4AAEwYWxpYXNfcHJvb2ZzeQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4ABABYSW5mYWxsaWJsZVVucGFpZFNpZ25lZAQBFG5vbmNlOAEgVDo6Tm9uY2UABQAA7QUMZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUYcGVvcGxlLFBlb3BsZVByb29mAAAIARRwcm9vZn0DAeA8QmFuZGVyc25hdGNoVnJmVmVyaWZpYWJsZSBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpQcm9vZgABEHJpbmc4ASRSaW5nSW5kZXgAAPEFDGRuZXh0X3Blb3BsZV9wYXNlb19ydW50aW1lGHBlb3BsZTxMaXRlUGVvcGxlUHJvb2YAAAgBFHByb29mfQMB4DxCYW5kZXJzbmF0Y2hWcmZWZXJpZmlhYmxlIGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlByb29mAAEQcmluZzgBJFJpbmdJbmRleAAA9QUMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMkZXh0ZW5zaW9uLEFzUmVzb3VyY2VzBARUAAAEAPkFAWhPcHRpb248QXNSZXNvdXJjZXNJbmZvPFQ+PgAA+QUEGE9wdGlvbgQEVAH9BQEIEE5vbmUAAAAQU29tZQQA/QUAAAEAAP0FDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzJGV4dGVuc2lvbjxBc1Jlc291cmNlc0luZm8EBFQAARB4UmVnaXN0ZXJGcmllbmRSZXF1ZXN0V2l0aFByb29mCAB9AwEoUHJvb2ZPZjxUPgAAOAEkUmluZ0luZGV4AAAAiFJlZ2lzdGVyRnJpZW5kUmVxdWVzdEZvckNvbGxlY3Rpb24MAH0DAShQcm9vZk9mPFQ+AAA4ASRSaW5nSW5kZXgAAGEDAVBNZW1iZXJzaGlwQ29sbGVjdGlvbgABAHxSZWdpc3RlclN0YXRlbWVudFN0b3JlQWxsb3dhbmNlDAB9AwEoUHJvb2ZPZjxUPgAAOAEkUmluZ0luZGV4AABhAwFQTWVtYmVyc2hpcENvbGxlY3Rpb24AAgBQQ2xhaW1Mb25nVGVybVN0b3JhZ2UQAH0DAShQcm9vZk9mPFQ+AAA4ASRSaW5nSW5kZXgAADgBNFJldmlzaW9uSW5kZXgAAGEDAVBNZW1iZXJzaGlwQ29sbGVjdGlvbgADAAABBhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM4YXV0aG9yaXplX2NhbGw0QXV0aG9yaXplQ2FsbAQEVAAAAAAFBgh8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbjhSZXN0cmljdE9yaWdpbgQEVAAABADIARBib29sAAAJBhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNUY2hlY2tfbm9uX3plcm9fc2VuZGVySENoZWNrTm9uWmVyb1NlbmRlcgQEVAAAAAANBhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNIY2hlY2tfc3BlY192ZXJzaW9uQENoZWNrU3BlY1ZlcnNpb24EBFQAAAAAEQYQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zQGNoZWNrX3R4X3ZlcnNpb244Q2hlY2tUeFZlcnNpb24EBFQAAAAAFQYQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zNGNoZWNrX2dlbmVzaXMwQ2hlY2tHZW5lc2lzBARUAAAAABkGEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczxjaGVja19tb3J0YWxpdHk4Q2hlY2tNb3J0YWxpdHkEBFQAAAQAHQYBDEVyYQAAHQYQKHNwX3J1bnRpbWUcZ2VuZXJpYwxlcmEMRXJhAAEBBCBJbW1vcnRhbAAAABxNb3J0YWwxBAAMAAABABxNb3J0YWwyBAAMAAACABxNb3J0YWwzBAAMAAADABxNb3J0YWw0BAAMAAAEABxNb3J0YWw1BAAMAAAFABxNb3J0YWw2BAAMAAAGABxNb3J0YWw3BAAMAAAHABxNb3J0YWw4BAAMAAAIABxNb3J0YWw5BAAMAAAJACBNb3J0YWwxMAQADAAACgAgTW9ydGFsMTEEAAwAAAsAIE1vcnRhbDEyBAAMAAAMACBNb3J0YWwxMwQADAAADQAgTW9ydGFsMTQEAAwAAA4AIE1vcnRhbDE1BAAMAAAPACBNb3J0YWwxNgQADAAAEAAgTW9ydGFsMTcEAAwAABEAIE1vcnRhbDE4BAAMAAASACBNb3J0YWwxOQQADAAAEwAgTW9ydGFsMjAEAAwAABQAIE1vcnRhbDIxBAAMAAAVACBNb3J0YWwyMgQADAAAFgAgTW9ydGFsMjMEAAwAABcAIE1vcnRhbDI0BAAMAAAYACBNb3J0YWwyNQQADAAAGQAgTW9ydGFsMjYEAAwAABoAIE1vcnRhbDI3BAAMAAAbACBNb3J0YWwyOAQADAAAHAAgTW9ydGFsMjkEAAwAAB0AIE1vcnRhbDMwBAAMAAAeACBNb3J0YWwzMQQADAAAHwAgTW9ydGFsMzIEAAwAACAAIE1vcnRhbDMzBAAMAAAhACBNb3J0YWwzNAQADAAAIgAgTW9ydGFsMzUEAAwAACMAIE1vcnRhbDM2BAAMAAAkACBNb3J0YWwzNwQADAAAJQAgTW9ydGFsMzgEAAwAACYAIE1vcnRhbDM5BAAMAAAnACBNb3J0YWw0MAQADAAAKAAgTW9ydGFsNDEEAAwAACkAIE1vcnRhbDQyBAAMAAAqACBNb3J0YWw0MwQADAAAKwAgTW9ydGFsNDQEAAwAACwAIE1vcnRhbDQ1BAAMAAAtACBNb3J0YWw0NgQADAAALgAgTW9ydGFsNDcEAAwAAC8AIE1vcnRhbDQ4BAAMAAAwACBNb3J0YWw0OQQADAAAMQAgTW9ydGFsNTAEAAwAADIAIE1vcnRhbDUxBAAMAAAzACBNb3J0YWw1MgQADAAANAAgTW9ydGFsNTMEAAwAADUAIE1vcnRhbDU0BAAMAAA2ACBNb3J0YWw1NQQADAAANwAgTW9ydGFsNTYEAAwAADgAIE1vcnRhbDU3BAAMAAA5ACBNb3J0YWw1OAQADAAAOgAgTW9ydGFsNTkEAAwAADsAIE1vcnRhbDYwBAAMAAA8ACBNb3J0YWw2MQQADAAAPQAgTW9ydGFsNjIEAAwAAD4AIE1vcnRhbDYzBAAMAAA/ACBNb3J0YWw2NAQADAAAQAAgTW9ydGFsNjUEAAwAAEEAIE1vcnRhbDY2BAAMAABCACBNb3J0YWw2NwQADAAAQwAgTW9ydGFsNjgEAAwAAEQAIE1vcnRhbDY5BAAMAABFACBNb3J0YWw3MAQADAAARgAgTW9ydGFsNzEEAAwAAEcAIE1vcnRhbDcyBAAMAABIACBNb3J0YWw3MwQADAAASQAgTW9ydGFsNzQEAAwAAEoAIE1vcnRhbDc1BAAMAABLACBNb3J0YWw3NgQADAAATAAgTW9ydGFsNzcEAAwAAE0AIE1vcnRhbDc4BAAMAABOACBNb3J0YWw3OQQADAAATwAgTW9ydGFsODAEAAwAAFAAIE1vcnRhbDgxBAAMAABRACBNb3J0YWw4MgQADAAAUgAgTW9ydGFsODMEAAwAAFMAIE1vcnRhbDg0BAAMAABUACBNb3J0YWw4NQQADAAAVQAgTW9ydGFsODYEAAwAAFYAIE1vcnRhbDg3BAAMAABXACBNb3J0YWw4OAQADAAAWAAgTW9ydGFsODkEAAwAAFkAIE1vcnRhbDkwBAAMAABaACBNb3J0YWw5MQQADAAAWwAgTW9ydGFsOTIEAAwAAFwAIE1vcnRhbDkzBAAMAABdACBNb3J0YWw5NAQADAAAXgAgTW9ydGFsOTUEAAwAAF8AIE1vcnRhbDk2BAAMAABgACBNb3J0YWw5NwQADAAAYQAgTW9ydGFsOTgEAAwAAGIAIE1vcnRhbDk5BAAMAABjACRNb3J0YWwxMDAEAAwAAGQAJE1vcnRhbDEwMQQADAAAZQAkTW9ydGFsMTAyBAAMAABmACRNb3J0YWwxMDMEAAwAAGcAJE1vcnRhbDEwNAQADAAAaAAkTW9ydGFsMTA1BAAMAABpACRNb3J0YWwxMDYEAAwAAGoAJE1vcnRhbDEwNwQADAAAawAkTW9ydGFsMTA4BAAMAABsACRNb3J0YWwxMDkEAAwAAG0AJE1vcnRhbDExMAQADAAAbgAkTW9ydGFsMTExBAAMAABvACRNb3J0YWwxMTIEAAwAAHAAJE1vcnRhbDExMwQADAAAcQAkTW9ydGFsMTE0BAAMAAByACRNb3J0YWwxMTUEAAwAAHMAJE1vcnRhbDExNgQADAAAdAAkTW9ydGFsMTE3BAAMAAB1ACRNb3J0YWwxMTgEAAwAAHYAJE1vcnRhbDExOQQADAAAdwAkTW9ydGFsMTIwBAAMAAB4ACRNb3J0YWwxMjEEAAwAAHkAJE1vcnRhbDEyMgQADAAAegAkTW9ydGFsMTIzBAAMAAB7ACRNb3J0YWwxMjQEAAwAAHwAJE1vcnRhbDEyNQQADAAAfQAkTW9ydGFsMTI2BAAMAAB+ACRNb3J0YWwxMjcEAAwAAH8AJE1vcnRhbDEyOAQADAAAgAAkTW9ydGFsMTI5BAAMAACBACRNb3J0YWwxMzAEAAwAAIIAJE1vcnRhbDEzMQQADAAAgwAkTW9ydGFsMTMyBAAMAACEACRNb3J0YWwxMzMEAAwAAIUAJE1vcnRhbDEzNAQADAAAhgAkTW9ydGFsMTM1BAAMAACHACRNb3J0YWwxMzYEAAwAAIgAJE1vcnRhbDEzNwQADAAAiQAkTW9ydGFsMTM4BAAMAACKACRNb3J0YWwxMzkEAAwAAIsAJE1vcnRhbDE0MAQADAAAjAAkTW9ydGFsMTQxBAAMAACNACRNb3J0YWwxNDIEAAwAAI4AJE1vcnRhbDE0MwQADAAAjwAkTW9ydGFsMTQ0BAAMAACQACRNb3J0YWwxNDUEAAwAAJEAJE1vcnRhbDE0NgQADAAAkgAkTW9ydGFsMTQ3BAAMAACTACRNb3J0YWwxNDgEAAwAAJQAJE1vcnRhbDE0OQQADAAAlQAkTW9ydGFsMTUwBAAMAACWACRNb3J0YWwxNTEEAAwAAJcAJE1vcnRhbDE1MgQADAAAmAAkTW9ydGFsMTUzBAAMAACZACRNb3J0YWwxNTQEAAwAAJoAJE1vcnRhbDE1NQQADAAAmwAkTW9ydGFsMTU2BAAMAACcACRNb3J0YWwxNTcEAAwAAJ0AJE1vcnRhbDE1OAQADAAAngAkTW9ydGFsMTU5BAAMAACfACRNb3J0YWwxNjAEAAwAAKAAJE1vcnRhbDE2MQQADAAAoQAkTW9ydGFsMTYyBAAMAACiACRNb3J0YWwxNjMEAAwAAKMAJE1vcnRhbDE2NAQADAAApAAkTW9ydGFsMTY1BAAMAAClACRNb3J0YWwxNjYEAAwAAKYAJE1vcnRhbDE2NwQADAAApwAkTW9ydGFsMTY4BAAMAACoACRNb3J0YWwxNjkEAAwAAKkAJE1vcnRhbDE3MAQADAAAqgAkTW9ydGFsMTcxBAAMAACrACRNb3J0YWwxNzIEAAwAAKwAJE1vcnRhbDE3MwQADAAArQAkTW9ydGFsMTc0BAAMAACuACRNb3J0YWwxNzUEAAwAAK8AJE1vcnRhbDE3NgQADAAAsAAkTW9ydGFsMTc3BAAMAACxACRNb3J0YWwxNzgEAAwAALIAJE1vcnRhbDE3OQQADAAAswAkTW9ydGFsMTgwBAAMAAC0ACRNb3J0YWwxODEEAAwAALUAJE1vcnRhbDE4MgQADAAAtgAkTW9ydGFsMTgzBAAMAAC3ACRNb3J0YWwxODQEAAwAALgAJE1vcnRhbDE4NQQADAAAuQAkTW9ydGFsMTg2BAAMAAC6ACRNb3J0YWwxODcEAAwAALsAJE1vcnRhbDE4OAQADAAAvAAkTW9ydGFsMTg5BAAMAAC9ACRNb3J0YWwxOTAEAAwAAL4AJE1vcnRhbDE5MQQADAAAvwAkTW9ydGFsMTkyBAAMAADAACRNb3J0YWwxOTMEAAwAAMEAJE1vcnRhbDE5NAQADAAAwgAkTW9ydGFsMTk1BAAMAADDACRNb3J0YWwxOTYEAAwAAMQAJE1vcnRhbDE5NwQADAAAxQAkTW9ydGFsMTk4BAAMAADGACRNb3J0YWwxOTkEAAwAAMcAJE1vcnRhbDIwMAQADAAAyAAkTW9ydGFsMjAxBAAMAADJACRNb3J0YWwyMDIEAAwAAMoAJE1vcnRhbDIwMwQADAAAywAkTW9ydGFsMjA0BAAMAADMACRNb3J0YWwyMDUEAAwAAM0AJE1vcnRhbDIwNgQADAAAzgAkTW9ydGFsMjA3BAAMAADPACRNb3J0YWwyMDgEAAwAANAAJE1vcnRhbDIwOQQADAAA0QAkTW9ydGFsMjEwBAAMAADSACRNb3J0YWwyMTEEAAwAANMAJE1vcnRhbDIxMgQADAAA1AAkTW9ydGFsMjEzBAAMAADVACRNb3J0YWwyMTQEAAwAANYAJE1vcnRhbDIxNQQADAAA1wAkTW9ydGFsMjE2BAAMAADYACRNb3J0YWwyMTcEAAwAANkAJE1vcnRhbDIxOAQADAAA2gAkTW9ydGFsMjE5BAAMAADbACRNb3J0YWwyMjAEAAwAANwAJE1vcnRhbDIyMQQADAAA3QAkTW9ydGFsMjIyBAAMAADeACRNb3J0YWwyMjMEAAwAAN8AJE1vcnRhbDIyNAQADAAA4AAkTW9ydGFsMjI1BAAMAADhACRNb3J0YWwyMjYEAAwAAOIAJE1vcnRhbDIyNwQADAAA4wAkTW9ydGFsMjI4BAAMAADkACRNb3J0YWwyMjkEAAwAAOUAJE1vcnRhbDIzMAQADAAA5gAkTW9ydGFsMjMxBAAMAADnACRNb3J0YWwyMzIEAAwAAOgAJE1vcnRhbDIzMwQADAAA6QAkTW9ydGFsMjM0BAAMAADqACRNb3J0YWwyMzUEAAwAAOsAJE1vcnRhbDIzNgQADAAA7AAkTW9ydGFsMjM3BAAMAADtACRNb3J0YWwyMzgEAAwAAO4AJE1vcnRhbDIzOQQADAAA7wAkTW9ydGFsMjQwBAAMAADwACRNb3J0YWwyNDEEAAwAAPEAJE1vcnRhbDI0MgQADAAA8gAkTW9ydGFsMjQzBAAMAADzACRNb3J0YWwyNDQEAAwAAPQAJE1vcnRhbDI0NQQADAAA9QAkTW9ydGFsMjQ2BAAMAAD2ACRNb3J0YWwyNDcEAAwAAPcAJE1vcnRhbDI0OAQADAAA+AAkTW9ydGFsMjQ5BAAMAAD5ACRNb3J0YWwyNTAEAAwAAPoAJE1vcnRhbDI1MQQADAAA+wAkTW9ydGFsMjUyBAAMAAD8ACRNb3J0YWwyNTMEAAwAAP0AJE1vcnRhbDI1NAQADAAA/gAkTW9ydGFsMjU1BAAMAAD/AAAhBhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMsY2hlY2tfbm9uY2UoQ2hlY2tOb25jZQQEVAAABABgASBUOjpOb25jZQAAJQYQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zMGNoZWNrX3dlaWdodCxDaGVja1dlaWdodAQEVAAAAAApBghccGFsbGV0X2Fzc2V0X3R4X3BheW1lbnRQQ2hhcmdlQXNzZXRUeFBheW1lbnQEBFQAAAgBDHRpcMABMEJhbGFuY2VPZjxUPgABIGFzc2V0X2lkoQIBaE9wdGlvbjxDaGFyZ2VBc3NldElkT2Y8VD4+AAAtBggwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQE4LEFjY291bnREYXRhATEGABQBFG5vbmNlOAEUTm9uY2UAASRjb25zdW1lcnM4ASBSZWZDb3VudAABJHByb3ZpZGVyczgBIFJlZkNvdW50AAEsc3VmZmljaWVudHM4ASBSZWZDb3VudAABEGRhdGExBgEsQWNjb3VudERhdGEAADEGDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBxAAQARBmcmVlxAEcQmFsYW5jZQABIHJlc2VydmVkxAEcQmFsYW5jZQABGGZyb3plbsQBHEJhbGFuY2UAARRmbGFnczUGAShFeHRyYUZsYWdzAAA1Bgw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzKEV4dHJhRmxhZ3MAAAQAxAEQdTEyOAAAOQYMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAHVAQAMARhub3JtYWzVAQEEVAABLG9wZXJhdGlvbmFs1QEBBFQAASRtYW5kYXRvcnnVAQEEVAAAPQYAAAJBBgBBBggwZnJhbWVfc3lzdGVtLEV2ZW50UmVjb3JkCARFAUUGBFQBPAAMARRwaGFzZVEHARRQaGFzZQABFGV2ZW50RQYBBEUAARh0b3BpY3NVBwEYVmVjPFQ+AABFBghkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZTBSdW50aW1lRXZlbnQAAZQYU3lzdGVtBABJBgFwZnJhbWVfc3lzdGVtOjpFdmVudDxSdW50aW1lPgAAADxQYXJhY2hhaW5TeXN0ZW0EAHEGAbxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtOjpFdmVudDxSdW50aW1lPgABACBCYWxhbmNlcwQAeQYBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ACgBIVHJhbnNhY3Rpb25QYXltZW50BACpBgGocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQ6OkV2ZW50PFJ1bnRpbWU+AAsASFNraXBGZWVsZXNzUGF5bWVudAQArQYBrHBhbGxldF9za2lwX2ZlZWxlc3NfcGF5bWVudDo6RXZlbnQ8UnVudGltZT4ADABET3JpZ2luUmVzdHJpY3Rpb24EALEGAbxpbmRpdl9wYWxsZXRfb3JpZ2luX3Jlc3RyaWN0aW9uOjpFdmVudDxSdW50aW1lPgANABhBc3NldHMEALUGAXRwYWxsZXRfYXNzZXRzOjpFdmVudDxSdW50aW1lPgAOADBBc3NldHNIb2xkZXIEALkGAZBwYWxsZXRfYXNzZXRzX2hvbGRlcjo6RXZlbnQ8UnVudGltZT4ADwAkQXNzZXRSYXRlBAC9BgGEcGFsbGV0X2Fzc2V0X3JhdGU6OkV2ZW50PFJ1bnRpbWU+ABAAOEFzc2V0VHhQYXltZW50BADBBgGccGFsbGV0X2Fzc2V0X3R4X3BheW1lbnQ6OkV2ZW50PFJ1bnRpbWU+ABEARENvbGxhdG9yU2VsZWN0aW9uBADFBgGkcGFsbGV0X2NvbGxhdG9yX3NlbGVjdGlvbjo6RXZlbnQ8UnVudGltZT4AFQAcU2Vzc2lvbgQAyQYBeHBhbGxldF9zZXNzaW9uOjpFdmVudDxSdW50aW1lPgAWACRYY21wUXVldWUEAM0GAaRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlOjpFdmVudDxSdW50aW1lPgAeACxQb2xrYWRvdFhjbQQA0QYBaHBhbGxldF94Y206OkV2ZW50PFJ1bnRpbWU+AB8AKEN1bXVsdXNYY20EAOEGAYhjdW11bHVzX3BhbGxldF94Y206OkV2ZW50PFJ1bnRpbWU+ACAAME1lc3NhZ2VRdWV1ZQQA5QYBkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFdmVudDxSdW50aW1lPgAiABxVdGlsaXR5BADtBgFUcGFsbGV0X3V0aWxpdHk6OkV2ZW50ACgAIE11bHRpc2lnBAD1BgF8cGFsbGV0X211bHRpc2lnOjpFdmVudDxSdW50aW1lPgApABBTdWRvBAD5BgFscGFsbGV0X3N1ZG86OkV2ZW50PFJ1bnRpbWU+ACoAFFByb3h5BAABBwFwcGFsbGV0X3Byb3h5OjpFdmVudDxSdW50aW1lPgAsACBJZGVudGl0eQQACQcBlGluZGl2X3BhbGxldF9pZGVudGl0eTo6RXZlbnQ8UnVudGltZT4AMgAYUGVvcGxlBAANBwGMaW5kaXZfcGFsbGV0X3Blb3BsZTo6RXZlbnQ8UnVudGltZT4AMwAcTW9iUnVsZQQAEQcBlGluZGl2X3BhbGxldF9tb2JfcnVsZTo6RXZlbnQ8UnVudGltZT4ANAAoUHJvb2ZPZkluawQAFQcBpGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbms6OkV2ZW50PFJ1bnRpbWU+ADUAEEdhbWUEABkHAYRpbmRpdl9wYWxsZXRfZ2FtZTo6RXZlbnQ8UnVudGltZT4ANwAUU2NvcmUEACEHAYhpbmRpdl9wYWxsZXRfc2NvcmU6OkV2ZW50PFJ1bnRpbWU+ADgAIER1bW15RGltBAAlBwGYaW5kaXZfcGFsbGV0X2R1bW15X2RpbTo6RXZlbnQ8UnVudGltZT4AOwAoUGVvcGxlTGl0ZQQAKQcBoGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZTo6RXZlbnQ8UnVudGltZT4APgAkUmVzb3VyY2VzBAAtBwGYaW5kaXZfcGFsbGV0X3Jlc291cmNlczo6RXZlbnQ8UnVudGltZT4APwA0Q2h1bmtzTWFuYWdlcgQAMQcBrGluZGl2X3BhbGxldF9jaHVua3NfbWFuYWdlcjo6RXZlbnQ8UnVudGltZT4AQAAcTWVtYmVycwQANQcBkGluZGl2X3BhbGxldF9tZW1iZXJzOjpFdmVudDxSdW50aW1lPgBDABxDb2luYWdlBAA5BwGQaW5kaXZfcGFsbGV0X2NvaW5hZ2U6OkV2ZW50PFJ1bnRpbWU+AEQAPE1lbWJlcnNOb3RpZmllcgQAPQcBtGluZGl2X3BhbGxldF9tZW1iZXJzX25vdGlmaWVyOjpFdmVudDxSdW50aW1lPgBFAFRTdG9yYWdlSW5pdGlhbGl6YXRpb24EAEEHAcxpbmRpdl9wYWxsZXRfc3RvcmFnZV9pbml0aWFsaXphdGlvbjo6RXZlbnQ8UnVudGltZT4APABkU3RvcmFnZUluaXRpYWxpemF0aW9uTGl0ZQQARQcB4GluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGU6OkV2ZW50PFJ1bnRpbWU+AEEAHEFpcmRyb3AEAEkHAZBpbmRpdl9wYWxsZXRfYWlyZHJvcDo6RXZlbnQ8UnVudGltZT4APQBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEAE0HAYRwYWxsZXRfbWlncmF0aW9uczo6RXZlbnQ8UnVudGltZT4AYgAASQYMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXZlbnQEBFQAASBARXh0cmluc2ljU3VjY2VzcwQBNGRpc3BhdGNoX2luZm9NBgFERGlzcGF0Y2hFdmVudEluZm8AAASQQW4gZXh0cmluc2ljIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuPEV4dHJpbnNpY0ZhaWxlZAgBOGRpc3BhdGNoX2Vycm9yWQYBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZvTQYBRERpc3BhdGNoRXZlbnRJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkBAEQaGFzaDwBHFQ6Okhhc2gAAgTQYDpjb2RlYCB3YXMgdXBkYXRlZCB0byB0aGUgY29kZSB3aXRoIHRoZSBnaXZlbiBoYXNoLihOZXdBY2NvdW50BAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAADBGhBIG5ldyBhY2NvdW50IHdhcyBjcmVhdGVkLjRLaWxsZWRBY2NvdW50BAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBFhBbiBhY2NvdW50IHdhcyByZWFwZWQuIFJlbWFya2VkCAEYc2VuZGVyBAEwVDo6QWNjb3VudElkAAEQaGFzaDwBHFQ6Okhhc2gABQRwT24gb24tY2hhaW4gcmVtYXJrIGhhcHBlbmVkLkRVcGdyYWRlQXV0aG9yaXplZAgBJGNvZGVfaGFzaDwBHFQ6Okhhc2gAATRjaGVja192ZXJzaW9uyAEQYm9vbAAGBGhBbiB1cGdyYWRlIHdhcyBhdXRob3JpemVkLoBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQgBJGNvZGVfaGFzaDwBHFQ6Okhhc2gAARRlcnJvclkGATREaXNwYXRjaEVycm9yAAcEEQFBbiBpbnZhbGlkIGF1dGhvcml6ZWQgdXBncmFkZSB3YXMgcmVqZWN0ZWQgd2hpbGUgdHJ5aW5nIHRvIGFwcGx5IGl0LgRwRXZlbnQgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0Lk0GCDBmcmFtZV9zeXN0ZW1ERGlzcGF0Y2hFdmVudEluZm8AAAwBGHdlaWdodNUBARhXZWlnaHQAARRjbGFzc1EGATREaXNwYXRjaENsYXNzAAEgcGF5c19mZWVVBgEQUGF5cwAAUQYMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2g0RGlzcGF0Y2hDbGFzcwABDBhOb3JtYWwAAAAsT3BlcmF0aW9uYWwAAQAkTWFuZGF0b3J5AAIAAFUGDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoEFBheXMAAQgMWWVzAAAACE5vAAEAAFkGCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATwUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAF0GASxNb2R1bGVFcnJvcgADAERDb25zdW1lclJlbWFpbmluZwAEACxOb1Byb3ZpZGVycwAFAEBUb29NYW55Q29uc3VtZXJzAAYAFFRva2VuBABhBgEoVG9rZW5FcnJvcgAHAChBcml0aG1ldGljBABlBgE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAGkGAUhUcmFuc2FjdGlvbmFsRXJyb3IACQAkRXhoYXVzdGVkAAoAKENvcnJ1cHRpb24ACwAsVW5hdmFpbGFibGUADAA4Um9vdE5vdEFsbG93ZWQADQAQVHJpZQQAbQYBJFRyaWVFcnJvcgAOAABdBggoc3BfcnVudGltZSxNb2R1bGVFcnJvcgAACAEUaW5kZXgMAQh1OAABFGVycm9ycAGMW3U4OyBNQVhfTU9EVUxFX0VSUk9SX0VOQ09ERURfU0laRV0AAGEGCChzcF9ydW50aW1lKFRva2VuRXJyb3IAAShARnVuZHNVbmF2YWlsYWJsZQAAADBPbmx5UHJvdmlkZXIAAQAwQmVsb3dNaW5pbXVtAAIAMENhbm5vdENyZWF0ZQADADBVbmtub3duQXNzZXQABAAYRnJvemVuAAUALFVuc3VwcG9ydGVkAAYAQENhbm5vdENyZWF0ZUhvbGQABwA0Tm90RXhwZW5kYWJsZQAIABxCbG9ja2VkAAkAAGUGCDRzcF9hcml0aG1ldGljPEFyaXRobWV0aWNFcnJvcgABDCRVbmRlcmZsb3cAAAAgT3ZlcmZsb3cAAQA4RGl2aXNpb25CeVplcm8AAgAAaQYIKHNwX3J1bnRpbWVIVHJhbnNhY3Rpb25hbEVycm9yAAEIMExpbWl0UmVhY2hlZAAAABxOb0xheWVyAAEAAG0GDChzcF9ydW50aW1lMHByb3ZpbmdfdHJpZSRUcmllRXJyb3IAAThASW52YWxpZFN0YXRlUm9vdAAAAEhJbmNvbXBsZXRlRGF0YWJhc2UAAQBQVmFsdWVBdEluY29tcGxldGVLZXkAAgAwRGVjb2RlckVycm9yAAMALEludmFsaWRIYXNoAAQAMER1cGxpY2F0ZUtleQAFADhFeHRyYW5lb3VzTm9kZQAGADxFeHRyYW5lb3VzVmFsdWUABwBcRXh0cmFuZW91c0hhc2hSZWZlcmVuY2UACABUSW52YWxpZENoaWxkUmVmZXJlbmNlAAkANFZhbHVlTWlzbWF0Y2gACgA8SW5jb21wbGV0ZVByb29mAAsAMFJvb3RNaXNtYXRjaAAMACxEZWNvZGVFcnJvcgANAABxBgx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbRhwYWxsZXQURXZlbnQEBFQAARhgVmFsaWRhdGlvbkZ1bmN0aW9uU3RvcmVkAAAE0FRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGhhcyBiZWVuIHNjaGVkdWxlZCB0byBhcHBseS5kVmFsaWRhdGlvbkZ1bmN0aW9uQXBwbGllZAQBVHJlbGF5X2NoYWluX2Jsb2NrX251bTgBVFJlbGF5Q2hhaW5CbG9ja051bWJlcgABBEUBVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gd2FzIGFwcGxpZWQgYXMgb2YgdGhlIGNvbnRhaW5lZCByZWxheSBjaGFpbiBibG9jayBudW1iZXIubFZhbGlkYXRpb25GdW5jdGlvbkRpc2NhcmRlZAACBLBUaGUgcmVsYXktY2hhaW4gYWJvcnRlZCB0aGUgdXBncmFkZSBwcm9jZXNzLmBEb3dud2FyZE1lc3NhZ2VzUmVjZWl2ZWQEARRjb3VudDgBDHUzMgADBAEBU29tZSBkb3dud2FyZCBtZXNzYWdlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgYW5kIHdpbGwgYmUgcHJvY2Vzc2VkLmREb3dud2FyZE1lc3NhZ2VzUHJvY2Vzc2VkCAEsd2VpZ2h0X3VzZWTVAQEYV2VpZ2h0AAEgZG1xX2hlYWQ8AURyZWxheV9jaGFpbjo6SGFzaAAEBOBEb3dud2FyZCBtZXNzYWdlcyB3ZXJlIHByb2Nlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gd2VpZ2h0LkRVcHdhcmRNZXNzYWdlU2VudAQBMG1lc3NhZ2VfaGFzaHUGATxPcHRpb248WGNtSGFzaD4ABQS4QW4gdXB3YXJkIG1lc3NhZ2Ugd2FzIHNlbnQgdG8gdGhlIHJlbGF5IGNoYWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldHUGBBhPcHRpb24EBFQBCAEIEE5vbmUAAAAQU29tZQQACAAAAQAAeQYMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXZlbnQIBFQABEkAAXgcRW5kb3dlZAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAATBmcmVlX2JhbGFuY2XEAShUOjpCYWxhbmNlAAAEuEFuIGFjY291bnQgd2FzIGNyZWF0ZWQgd2l0aCBzb21lIGZyZWUgYmFsYW5jZS4gRHVzdExvc3QIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQABCD0BQW4gYWNjb3VudCB3YXMgcmVtb3ZlZCB3aG9zZSBiYWxhbmNlIHdhcyBub24temVybyBidXQgYmVsb3cgRXhpc3RlbnRpYWxEZXBvc2l0LHhyZXN1bHRpbmcgaW4gYW4gb3V0cmlnaHQgbG9zcy4gVHJhbnNmZXIMARBmcm9tBAEwVDo6QWNjb3VudElkAAEIdG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAIETFRyYW5zZmVyIHN1Y2NlZWRlZC4oQmFsYW5jZVNldAgBDHdobwQBMFQ6OkFjY291bnRJZAABEGZyZWXEAShUOjpCYWxhbmNlAAMEaEEgYmFsYW5jZSB3YXMgc2V0IGJ5IHJvb3QuIFJlc2VydmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAEBOBTb21lIGJhbGFuY2Ugd2FzIHJlc2VydmVkIChtb3ZlZCBmcm9tIGZyZWUgdG8gcmVzZXJ2ZWQpLihVbnJlc2VydmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAFBOhTb21lIGJhbGFuY2Ugd2FzIHVucmVzZXJ2ZWQgKG1vdmVkIGZyb20gcmVzZXJ2ZWQgdG8gZnJlZSkuSFJlc2VydmVSZXBhdHJpYXRlZBABEGZyb20EATBUOjpBY2NvdW50SWQAAQh0bwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAUhkZXN0aW5hdGlvbl9zdGF0dXN9BgEYU3RhdHVzAAYITQFTb21lIGJhbGFuY2Ugd2FzIG1vdmVkIGZyb20gdGhlIHJlc2VydmUgb2YgdGhlIGZpcnN0IGFjY291bnQgdG8gdGhlIHNlY29uZCBhY2NvdW50LthGaW5hbCBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlIGRlc3RpbmF0aW9uIGJhbGFuY2UgdHlwZS4cRGVwb3NpdAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UABwTYU29tZSBhbW91bnQgd2FzIGRlcG9zaXRlZCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuIFdpdGhkcmF3CAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAIBB0BU29tZSBhbW91bnQgd2FzIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4cU2xhc2hlZAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UACQQBAVNvbWUgYW1vdW50IHdhcyByZW1vdmVkIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIG1pc2JlaGF2aW9yKS4YTWludGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAKBJxTb21lIGFtb3VudCB3YXMgbWludGVkIGludG8gYW4gYWNjb3VudC4wTWludGVkQ3JlZGl0BAEYYW1vdW50xAEoVDo6QmFsYW5jZQALBOBTb21lIGNyZWRpdCB3YXMgYmFsYW5jZWQgYW5kIGFkZGVkIHRvIHRoZSBUb3RhbElzc3VhbmNlLhhCdXJuZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAwEnFNvbWUgYW1vdW50IHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LihCdXJuZWREZWJ0BAEYYW1vdW50xAEoVDo6QmFsYW5jZQANBMxTb21lIGRlYnQgaGFzIGJlZW4gZHJvcHBlZCBmcm9tIHRoZSBUb3RhbCBJc3N1YW5jZS4kU3VzcGVuZGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAOBBUBU29tZSBhbW91bnQgd2FzIHN1c3BlbmRlZCBmcm9tIGFuIGFjY291bnQgKGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlcikuIFJlc3RvcmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAPBKRTb21lIGFtb3VudCB3YXMgcmVzdG9yZWQgaW50byBhbiBhY2NvdW50LiBVcGdyYWRlZAQBDHdobwQBMFQ6OkFjY291bnRJZAAQBGBBbiBhY2NvdW50IHdhcyB1cGdyYWRlZC4YSXNzdWVkBAEYYW1vdW50xAEoVDo6QmFsYW5jZQARBC0BVG90YWwgaXNzdWFuY2Ugd2FzIGluY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBjcmVkaXQgdG8gYmUgYmFsYW5jZWQuJFJlc2NpbmRlZAQBGGFtb3VudMQBKFQ6OkJhbGFuY2UAEgQlAVRvdGFsIGlzc3VhbmNlIHdhcyBkZWNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgZGVidCB0byBiZSBiYWxhbmNlZC4YTG9ja2VkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQATBGBTb21lIGJhbGFuY2Ugd2FzIGxvY2tlZC4gVW5sb2NrZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABQEaFNvbWUgYmFsYW5jZSB3YXMgdW5sb2NrZWQuGEZyb3plbggBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAFQRgU29tZSBiYWxhbmNlIHdhcyBmcm96ZW4uGFRoYXdlZAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAFgRgU29tZSBiYWxhbmNlIHdhcyB0aGF3ZWQuTFRvdGFsSXNzdWFuY2VGb3JjZWQIAQxvbGTEAShUOjpCYWxhbmNlAAEMbmV3xAEoVDo6QmFsYW5jZQAXBKxUaGUgYFRvdGFsSXNzdWFuY2VgIHdhcyBmb3JjZWZ1bGx5IGNoYW5nZWQuEEhlbGQMARhyZWFzb26BBgFQVDo6UnVudGltZUhvbGRSZWFzb24AAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABgEgFNvbWUgYmFsYW5jZSB3YXMgcGxhY2VkIG9uIGhvbGQuKEJ1cm5lZEhlbGQMARhyZWFzb26BBgFQVDo6UnVudGltZUhvbGRSZWFzb24AAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABkEoEhlbGQgYmFsYW5jZSB3YXMgYnVybmVkIGZyb20gYW4gYWNjb3VudC44VHJhbnNmZXJPbkhvbGQQARhyZWFzb26BBgFQVDo6UnVudGltZUhvbGRSZWFzb24AARhzb3VyY2UEATBUOjpBY2NvdW50SWQAARBkZXN0BAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAaBBUBQSB0cmFuc2ZlciBvZiBgYW1vdW50YCBvbiBob2xkIGZyb20gYHNvdXJjZWAgdG8gYGRlc3RgIHdhcyBpbml0aWF0ZWQuPFRyYW5zZmVyQW5kSG9sZBABGHJlYXNvboEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGHNvdXJjZQQBMFQ6OkFjY291bnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAASx0cmFuc2ZlcnJlZMQBKFQ6OkJhbGFuY2UAGwQJAVRoZSBgdHJhbnNmZXJyZWRgIGJhbGFuY2UgaXMgcGxhY2VkIG9uIGhvbGQgYXQgdGhlIGBkZXN0YCBhY2NvdW50LiBSZWxlYXNlZAwBGHJlYXNvboEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAHASQU29tZSBiYWxhbmNlIHdhcyByZWxlYXNlZCBmcm9tIGhvbGQuKFVuZXhwZWN0ZWQEAKUGAThVbmV4cGVjdGVkS2luZAAdBLBBbiB1bmV4cGVjdGVkL2RlZmVuc2l2ZSBldmVudCB3YXMgdHJpZ2dlcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldH0GFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYzRCYWxhbmNlU3RhdHVzAAEIEEZyZWUAAAAgUmVzZXJ2ZWQAAQAAgQYIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWVEUnVudGltZUhvbGRSZWFzb24AASAcU2Vzc2lvbgQAhQYBaHBhbGxldF9zZXNzaW9uOjpIb2xkUmVhc29uABYALFBvbGthZG90WGNtBACJBgFYcGFsbGV0X3hjbTo6SG9sZFJlYXNvbgAfABxNb2JSdWxlBACNBgGEaW5kaXZfcGFsbGV0X21vYl9ydWxlOjpIb2xkUmVhc29uADQAKFByb29mT2ZJbmsEAJEGAZRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rOjpIb2xkUmVhc29uADUAEEdhbWUEAJUGAXRpbmRpdl9wYWxsZXRfZ2FtZTo6SG9sZFJlYXNvbgA3ABRTY29yZQQAmQYBeGluZGl2X3BhbGxldF9zY29yZTo6SG9sZFJlYXNvbgA4ABxDb2luYWdlBACdBgGAaW5kaXZfcGFsbGV0X2NvaW5hZ2U6OkhvbGRSZWFzb24ARAAcQWlyZHJvcAQAoQYBgGluZGl2X3BhbGxldF9haXJkcm9wOjpIb2xkUmVhc29uAD0AAIUGDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQoSG9sZFJlYXNvbgABBBBLZXlzAAAAAIkGDChwYWxsZXRfeGNtGHBhbGxldChIb2xkUmVhc29uAAEEOEF1dGhvcml6ZUFsaWFzAAAAAI0GDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0KEhvbGRSZWFzb24AAQgYUGF5b3V0AAAAGENyZWRpdAABAACRBgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQoSG9sZFJlYXNvbgABBChQcm9vZk9mSW5rAAAAAJUGDERpbmRpdl9wYWxsZXRfZ2FtZRhwYWxsZXQoSG9sZFJlYXNvbgABBCBQbGF5R2FtZQAAAACZBgxIaW5kaXZfcGFsbGV0X3Njb3JlGHBhbGxldChIb2xkUmVhc29uAAEIGFBheW91dAAAABhDcmVkaXQAAQAAnQYMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldChIb2xkUmVhc29uAAEEHFdyYXBwZWQAAAAAoQYMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldChIb2xkUmVhc29uAAEEHEFpcmRyb3AAAAAApQYMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQ4VW5leHBlY3RlZEtpbmQAAQg4QmFsYW5jZVVwZGF0ZWQAAABURmFpbGVkVG9NdXRhdGVBY2NvdW50AAEAAKkGDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQRIVHJhbnNhY3Rpb25GZWVQYWlkDAEMd2hvBAEwVDo6QWNjb3VudElkAAEoYWN0dWFsX2ZlZcQBMEJhbGFuY2VPZjxUPgABDHRpcMQBMEJhbGFuY2VPZjxUPgAACFkBQSB0cmFuc2FjdGlvbiBmZWUgYGFjdHVhbF9mZWVgLCBvZiB3aGljaCBgdGlwYCB3YXMgYWRkZWQgdG8gdGhlIG1pbmltdW0gaW5jbHVzaW9uIGZlZSxcaGFzIGJlZW4gcGFpZCBieSBgd2hvYC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXStBgxscGFsbGV0X3NraXBfZmVlbGVzc19wYXltZW50GHBhbGxldBRFdmVudAQEVAABBChGZWVTa2lwcGVkBAEYb3JpZ2luMQMBwDxUOjpSdW50aW1lT3JpZ2luIGFzIE9yaWdpblRyYWl0Pjo6UGFsbGV0c09yaWdpbgAABHhBIHRyYW5zYWN0aW9uIGZlZSB3YXMgc2tpcHBlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSxBgx8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbhhwYWxsZXQURXZlbnQEBFQAAQQwVXNhZ2VDbGVhbmVkBAEYZW50aXR52AFMVDo6UmVzdHJpY3RlZEVudGl0eQAABHxVc2FnZSBmb3IgYW4gZW50aXR5IGlzIGNsZWFuZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0tQYMNHBhbGxldF9hc3NldHMYcGFsbGV0FEV2ZW50CARUAARJAAGAHENyZWF0ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARxjcmVhdG9yBAEwVDo6QWNjb3VudElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQAAAR0U29tZSBhc3NldCBjbGFzcyB3YXMgY3JlYXRlZC4YSXNzdWVkDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAEEYFNvbWUgYXNzZXRzIHdlcmUgaXNzdWVkLixUcmFuc2ZlcnJlZBABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABEGZyb20EATBUOjpBY2NvdW50SWQAAQh0bwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAgR0U29tZSBhc3NldHMgd2VyZSB0cmFuc2ZlcnJlZC4YQnVybmVkDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQAARxiYWxhbmNlxAEoVDo6QmFsYW5jZQADBGxTb21lIGFzc2V0cyB3ZXJlIGRlc3Ryb3llZC4sVGVhbUNoYW5nZWQQASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhpc3N1ZXIEATBUOjpBY2NvdW50SWQAARRhZG1pbgQBMFQ6OkFjY291bnRJZAABHGZyZWV6ZXIEATBUOjpBY2NvdW50SWQABARwVGhlIG1hbmFnZW1lbnQgdGVhbSBjaGFuZ2VkLjBPd25lckNoYW5nZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAAFBEhUaGUgb3duZXIgY2hhbmdlZC4YRnJvemVuCAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAYEeFNvbWUgYWNjb3VudCBgd2hvYCB3YXMgZnJvemVuLhhUaGF3ZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQABwR4U29tZSBhY2NvdW50IGB3aG9gIHdhcyB0aGF3ZWQuLEFzc2V0RnJvemVuBAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAgEhFNvbWUgYXNzZXQgYGFzc2V0X2lkYCB3YXMgZnJvemVuLixBc3NldFRoYXdlZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAAJBIRTb21lIGFzc2V0IGBhc3NldF9pZGAgd2FzIHRoYXdlZC5EQWNjb3VudHNEZXN0cm95ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAUhhY2NvdW50c19kZXN0cm95ZWQ4AQx1MzIAAUhhY2NvdW50c19yZW1haW5pbmc4AQx1MzIACgSgQWNjb3VudHMgd2VyZSBkZXN0cm95ZWQgZm9yIGdpdmVuIGFzc2V0LkhBcHByb3ZhbHNEZXN0cm95ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAUxhcHByb3ZhbHNfZGVzdHJveWVkOAEMdTMyAAFMYXBwcm92YWxzX3JlbWFpbmluZzgBDHUzMgALBKRBcHByb3ZhbHMgd2VyZSBkZXN0cm95ZWQgZm9yIGdpdmVuIGFzc2V0LkhEZXN0cnVjdGlvblN0YXJ0ZWQEASBhc3NldF9pZOABKFQ6OkFzc2V0SWQADATQQW4gYXNzZXQgY2xhc3MgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkLiREZXN0cm95ZWQEASBhc3NldF9pZOABKFQ6OkFzc2V0SWQADQR0QW4gYXNzZXQgY2xhc3Mgd2FzIGRlc3Ryb3llZC4wRm9yY2VDcmVhdGVkCAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQADgSMU29tZSBhc3NldCBjbGFzcyB3YXMgZm9yY2UtY3JlYXRlZC4sTWV0YWRhdGFTZXQUASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARBuYW1lGAEcVmVjPHU4PgABGHN5bWJvbBgBHFZlYzx1OD4AASBkZWNpbWFscwwBCHU4AAEkaXNfZnJvemVuyAEQYm9vbAAPBJxOZXcgbWV0YWRhdGEgaGFzIGJlZW4gc2V0IGZvciBhbiBhc3NldC48TWV0YWRhdGFDbGVhcmVkBAEgYXNzZXRfaWTgAShUOjpBc3NldElkABAEnE1ldGFkYXRhIGhhcyBiZWVuIGNsZWFyZWQgZm9yIGFuIGFzc2V0LkBBcHByb3ZlZFRyYW5zZmVyEAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEYc291cmNlBAEwVDo6QWNjb3VudElkAAEgZGVsZWdhdGUEATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABEEMQEoQWRkaXRpb25hbCkgZnVuZHMgaGF2ZSBiZWVuIGFwcHJvdmVkIGZvciB0cmFuc2ZlciB0byBhIGRlc3RpbmF0aW9uIGFjY291bnQuREFwcHJvdmFsQ2FuY2VsbGVkDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQAASBkZWxlZ2F0ZQQBMFQ6OkFjY291bnRJZAASBPBBbiBhcHByb3ZhbCBmb3IgYWNjb3VudCBgZGVsZWdhdGVgIHdhcyBjYW5jZWxsZWQgYnkgYG93bmVyYC5MVHJhbnNmZXJyZWRBcHByb3ZlZBQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABFG93bmVyBAEwVDo6QWNjb3VudElkAAEgZGVsZWdhdGUEATBUOjpBY2NvdW50SWQAASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAEwgxAUFuIGBhbW91bnRgIHdhcyB0cmFuc2ZlcnJlZCBpbiBpdHMgZW50aXJldHkgZnJvbSBgb3duZXJgIHRvIGBkZXN0aW5hdGlvbmAgYnlgdGhlIGFwcHJvdmVkIGBkZWxlZ2F0ZWAuSEFzc2V0U3RhdHVzQ2hhbmdlZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAAUBPhBbiBhc3NldCBoYXMgaGFkIGl0cyBhdHRyaWJ1dGVzIGNoYW5nZWQgYnkgdGhlIGBGb3JjZWAgb3JpZ2luLlhBc3NldE1pbkJhbGFuY2VDaGFuZ2VkCAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAE8bmV3X21pbl9iYWxhbmNlxAEoVDo6QmFsYW5jZQAVBAEBVGhlIG1pbl9iYWxhbmNlIG9mIGFuIGFzc2V0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGFzc2V0IG93bmVyLhxUb3VjaGVkDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAEkZGVwb3NpdG9yBAEwVDo6QWNjb3VudElkABYE/FNvbWUgYWNjb3VudCBgd2hvYCB3YXMgY3JlYXRlZCB3aXRoIGEgZGVwb3NpdCBmcm9tIGBkZXBvc2l0b3JgLhxCbG9ja2VkCAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEMd2hvBAEwVDo6QWNjb3VudElkABcEfFNvbWUgYWNjb3VudCBgd2hvYCB3YXMgYmxvY2tlZC4kRGVwb3NpdGVkDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAYBNxTb21lIGFzc2V0cyB3ZXJlIGRlcG9zaXRlZCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuJFdpdGhkcmF3bgwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAGQQhAVNvbWUgYXNzZXRzIHdlcmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLjxSZXNlcnZlc1VwZGF0ZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAASByZXNlcnZlcyUBAUxWZWM8VDo6UmVzZXJ2ZURhdGE+ABoE2FJlc2VydmUgaW5mb3JtYXRpb24gd2FzIHNldCBvciB1cGRhdGVkIGZvciBgYXNzZXRfaWRgLjxSZXNlcnZlc1JlbW92ZWQEASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAGwS8UmVzZXJ2ZSBpbmZvcm1hdGlvbiB3YXMgcmVtb3ZlZCBmb3IgYGFzc2V0X2lkYC4wSXNzdWVkQ3JlZGl0CAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAcBMRTb21lIGFzc2V0cyB3ZXJlIGlzc3VlZCBhcyBDcmVkaXQgKG5vIG93bmVyIHlldCkuMEJ1cm5lZENyZWRpdAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAHQSEU29tZSBhc3NldHMgQ3JlZGl0IHdhcyBkZXN0cm95ZWQuKElzc3VlZERlYnQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAB4EvFNvbWUgYXNzZXRzIHdlcmUgYnVybmVkIGFuZCBhIERlYnQgd2FzIGNyZWF0ZWQuKEJ1cm5lZERlYnQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAB8EzFNvbWUgYXNzZXRzIERlYnQgd2FzIGRlc3Ryb3llZCAoYW5kIGFzc2V0cyBpc3N1ZWQpLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLkGDFBwYWxsZXRfYXNzZXRzX2hvbGRlchhwYWxsZXQURXZlbnQIBFQABEkAAQwQSGVsZBABDHdobwQBMFQ6OkFjY291bnRJZAABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGHJlYXNvboEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAATEYHdob2BzIGJhbGFuY2Ugb24gaG9sZCB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLiBSZWxlYXNlZBABDHdobwQBMFQ6OkFjY291bnRJZAABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGHJlYXNvboEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAQTEYHdob2BzIGJhbGFuY2Ugb24gaG9sZCB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLhhCdXJuZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhyZWFzb26BBgFQVDo6UnVudGltZUhvbGRSZWFzb24AARhhbW91bnTEAShUOjpCYWxhbmNlAAIEuGB3aG9gcyBiYWxhbmNlIG9uIGhvbGQgd2FzIGJ1cm5lZCBieSBgYW1vdW50YC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXS9BgxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k4AEwVDo6QXNzZXRLaW5kAAEQcmF0ZS0BASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTgATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTgATBUOjpBc3NldEtpbmQAAQxvbGQtAQEkRml4ZWRVMTI4AAEMbmV3LQEBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMEGDFxwYWxsZXRfYXNzZXRfdHhfcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQQ4QXNzZXRUeEZlZVBhaWQQAQx3aG8EATBUOjpBY2NvdW50SWQAAShhY3R1YWxfZmVlxAFEQXNzZXRCYWxhbmNlT2Y8VD4AAQx0aXDEAURBc3NldEJhbGFuY2VPZjxUPgABIGFzc2V0X2lkoQIBaE9wdGlvbjxDaGFyZ2VBc3NldElkT2Y8VD4+AAAIWQFBIHRyYW5zYWN0aW9uIGZlZSBgYWN0dWFsX2ZlZWAsIG9mIHdoaWNoIGB0aXBgIHdhcyBhZGRlZCB0byB0aGUgbWluaW11bSBpbmNsdXNpb24gZmVlLLhoYXMgYmVlbiBwYWlkIGJ5IGB3aG9gIGluIGFuIGFzc2V0IGBhc3NldF9pZGAuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0xQYMZHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb24YcGFsbGV0FEV2ZW50BARUAAEoQE5ld0ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVzzAFEVmVjPFQ6OkFjY291bnRJZD4AAARsTmV3IEludnVsbmVyYWJsZXMgd2VyZSBzZXQuREludnVsbmVyYWJsZUFkZGVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABBHRBIG5ldyBJbnZ1bG5lcmFibGUgd2FzIGFkZGVkLkxJbnZ1bG5lcmFibGVSZW1vdmVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAACBHBBbiBJbnZ1bG5lcmFibGUgd2FzIHJlbW92ZWQuUE5ld0Rlc2lyZWRDYW5kaWRhdGVzBAFIZGVzaXJlZF9jYW5kaWRhdGVzOAEMdTMyAAMEpFRoZSBudW1iZXIgb2YgZGVzaXJlZCBjYW5kaWRhdGVzIHdhcyBzZXQuQE5ld0NhbmRpZGFjeUJvbmQEASxib25kX2Ftb3VudMQBMEJhbGFuY2VPZjxUPgAEBGxUaGUgY2FuZGlkYWN5IGJvbmQgd2FzIHNldC44Q2FuZGlkYXRlQWRkZWQIAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAFBFxBIG5ldyBjYW5kaWRhdGUgam9pbmVkLlBDYW5kaWRhdGVCb25kVXBkYXRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAYEcEJvbmQgb2YgYSBjYW5kaWRhdGUgdXBkYXRlZC5AQ2FuZGlkYXRlUmVtb3ZlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQABwRgQSBjYW5kaWRhdGUgd2FzIHJlbW92ZWQuRENhbmRpZGF0ZVJlcGxhY2VkDAEMb2xkBAEwVDo6QWNjb3VudElkAAEMbmV3BAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAIBPRBbiBhY2NvdW50IHdhcyByZXBsYWNlZCBpbiB0aGUgY2FuZGlkYXRlIGxpc3QgYnkgYW5vdGhlciBvbmUuaEludmFsaWRJbnZ1bG5lcmFibGVTa2lwcGVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAAJCFUBQW4gYWNjb3VudCB3YXMgdW5hYmxlIHRvIGJlIGFkZGVkIHRvIHRoZSBJbnZ1bG5lcmFibGVzIGJlY2F1c2UgdGhleSBkaWQgbm90IGhhdmUga2V5c8hyZWdpc3RlcmVkLiBPdGhlciBJbnZ1bG5lcmFibGVzIG1heSBoYXZlIGJlZW4gc2V0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkGDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXZlbnQEBFQAARAoTmV3U2Vzc2lvbgQBNHNlc3Npb25faW5kZXg4ATBTZXNzaW9uSW5kZXgAAAg5AU5ldyBzZXNzaW9uIGhhcyBoYXBwZW5lZC4gTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBpcyB0aGUgc2Vzc2lvbiBpbmRleCwgbm90IHRoZZxibG9jayBudW1iZXIgYXMgdGhlIHR5cGUgbWlnaHQgc3VnZ2VzdC4kTmV3UXVldWVkAAEISQFUaGUgYE5ld1Nlc3Npb25gIGV2ZW50IGluIHRoZSBjdXJyZW50IGJsb2NrIGFsc28gaW1wbGllcyBhIG5ldyB2YWxpZGF0b3Igc2V0IHRvIGJlHHF1ZXVlZC5EVmFsaWRhdG9yRGlzYWJsZWQEASR2YWxpZGF0b3IEAThUOjpWYWxpZGF0b3JJZAACBHBWYWxpZGF0b3IgaGFzIGJlZW4gZGlzYWJsZWQuSFZhbGlkYXRvclJlZW5hYmxlZAQBJHZhbGlkYXRvcgQBOFQ6OlZhbGlkYXRvcklkAAMEeFZhbGlkYXRvciBoYXMgYmVlbiByZS1lbmFibGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldM0GDGRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABBDxYY21wTWVzc2FnZVNlbnQEATBtZXNzYWdlX2hhc2gIARxYY21IYXNoAAAEwEFuIEhSTVAgbWVzc2FnZSB3YXMgc2VudCB0byBhIHNpYmxpbmcgcGFyYWNoYWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNEGDChwYWxsZXRfeGNtGHBhbGxldBRFdmVudAQEVAABdCRBdHRlbXB0ZWQEARxvdXRjb21l1QYBUHhjbTo6bGF0ZXN0OjpPdXRjb21lAAAEqEV4ZWN1dGlvbiBvZiBhbiBYQ00gbWVzc2FnZSB3YXMgYXR0ZW1wdGVkLhBTZW50EAEYb3JpZ2lu4AEgTG9jYXRpb24AASxkZXN0aW5hdGlvbuABIExvY2F0aW9uAAEcbWVzc2FnZV0CARxYY208KCk+AAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAAQRgQW4gWENNIG1lc3NhZ2Ugd2FzIHNlbnQuKFNlbmRGYWlsZWQQARhvcmlnaW7gASBMb2NhdGlvbgABLGRlc3RpbmF0aW9u4AEgTG9jYXRpb24AARRlcnJvct0GASRTZW5kRXJyb3IAAShtZXNzYWdlX2lkCAEcWGNtSGFzaAACBHhBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gc2VuZC48UHJvY2Vzc1hjbUVycm9yDAEYb3JpZ2lu4AEgTG9jYXRpb24AARRlcnJvco0CASBYY21FcnJvcgABKG1lc3NhZ2VfaWQIARxYY21IYXNoAAMEhEFuIFhDTSBtZXNzYWdlIGZhaWxlZCB0byBwcm9jZXNzLkhVbmV4cGVjdGVkUmVzcG9uc2UIARhvcmlnaW7gASBMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAAEDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQoARxRdWVyeUlkAAEgcmVzcG9uc2WBAgEgUmVzcG9uc2UABQhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAYIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAE0YWN0dWFsX3dlaWdodNUBARhXZWlnaHQAAUxtYXhfYnVkZ2V0ZWRfd2VpZ2h01QEBGFdlaWdodAAHDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZCgBHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgMAQh1OAABKGNhbGxfaW5kZXgMAQh1OAAICFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAkMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkAAFEZXhwZWN0ZWRfbG9jYXRpb26hAgFAT3B0aW9uPExvY2F0aW9uPgAKDFkBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBvcmlnaW4gbG9jYXRpb24gb2YgdGhlIHJlc3BvbnNlIGRvZXNVAW5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uXEludmFsaWRSZXNwb25kZXJWZXJzaW9uCAEYb3JpZ2lu4AEgTG9jYXRpb24AASBxdWVyeV9pZCgBHFF1ZXJ5SWQACxxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkKAEcUXVlcnlJZAAMBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDwBEEgyNTYAARhvcmlnaW7gASBMb2NhdGlvbgABGGFzc2V0c9kCATxWZXJzaW9uZWRBc3NldHMADQS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbuABIExvY2F0aW9uAAEYcmVzdWx0OAEoWGNtVmVyc2lvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gADgwlAUFuIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgc2VudC4A4FRoZSBjb3N0IG9mIHNlbmRpbmcgaXQgKGJvcm5lIGJ5IHRoZSBjaGFpbikgaXMgaW5jbHVkZWQuXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkCAEgbG9jYXRpb27gASBMb2NhdGlvbgABHHZlcnNpb244AShYY21WZXJzaW9uAA8IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb27gASBMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAABFGVycm9yjQIBIFhjbUVycm9yABAIWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAARCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkABIcVQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIGV4cGVjdGVkIHF1ZXJpZXIgbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjhJbnZhbGlkUXVlcmllchABGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcuABIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXKhAgFAT3B0aW9uPExvY2F0aW9uPgATDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFAhZAUEgcmVtb3RlIGhhcyByZXF1ZXN0ZWQgWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHVzIGFuZCB3ZSBoYXZlIGhvbm9yZWQgaXQuHQFBIHZlcnNpb24gaW5mb3JtYXRpb24gbWVzc2FnZSBpcyBzZW50IHRvIHRoZW0gYW5kIGl0cyBjb3N0IGlzIGluY2x1ZGVkLlhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFQQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFgglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbmfgASBMb2NhdGlvbgABEGZlZXNpAgEYQXNzZXRzABcEMQFGZWVzIHdlcmUgcGFpZCBmcm9tIGEgbG9jYXRpb24gZm9yIGFuIG9wZXJhdGlvbiAob2Z0ZW4gZm9yIHVzaW5nIGBTZW5kWGNtYCkuNEFzc2V0c0NsYWltZWQMARBoYXNoPAEQSDI1NgABGG9yaWdpbuABIExvY2F0aW9uAAEYYXNzZXRz2QIBPFZlcnNpb25lZEFzc2V0cwAYBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbjgBKFhjbVZlcnNpb24AGQSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuPEFsaWFzQXV0aG9yaXplZAwBHGFsaWFzZXLgASBMb2NhdGlvbgABGHRhcmdldOABIExvY2F0aW9uAAEYZXhwaXJ5FQMBLE9wdGlvbjx1NjQ+ABoIXQFBbiBgYWxpYXNlcmAgbG9jYXRpb24gd2FzIGF1dGhvcml6ZWQgYnkgYHRhcmdldGAgdG8gYWxpYXMgaXQsIGF1dGhvcml6YXRpb24gdmFsaWQgdW50aWxYYGV4cGlyeWAgYmxvY2sgbnVtYmVyLmRBbGlhc0F1dGhvcml6YXRpb25SZW1vdmVkCAEcYWxpYXNlcuABIExvY2F0aW9uAAEYdGFyZ2V04AEgTG9jYXRpb24AGwTMYHRhcmdldGAgcmVtb3ZlZCBhbGlhcyBhdXRob3JpemF0aW9uIGZvciBgYWxpYXNlcmAucEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQEARh0YXJnZXTgASBMb2NhdGlvbgAcBKhgdGFyZ2V0YCByZW1vdmVkIGFsbCBhbGlhcyBhdXRob3JpemF0aW9ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTVBhAsc3RhZ2luZ194Y20IdjUYdHJhaXRzHE91dGNvbWUAAQwgQ29tcGxldGUEARB1c2Vk1QEBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZNUBARhXZWlnaHQAARRlcnJvctkGAUBJbnN0cnVjdGlvbkVycm9yAAEAFEVycm9yBADZBgFASW5zdHJ1Y3Rpb25FcnJvcgACAADZBhAsc3RhZ2luZ194Y20IdjUYdHJhaXRzQEluc3RydWN0aW9uRXJyb3IAAAgBFGluZGV4DAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yjQIBFEVycm9yAADdBhAMeGNtCHYzGHRyYWl0cyRTZW5kRXJyb3IAARw0Tm90QXBwbGljYWJsZQAAACRUcmFuc3BvcnQAAQAoVW5yb3V0YWJsZQACAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAMAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAEADxNaXNzaW5nQXJndW1lbnQABQAQRmVlcwAGAADhBgxIY3VtdWx1c19wYWxsZXRfeGNtGHBhbGxldBRFdmVudAQEVAABDDRJbnZhbGlkRm9ybWF0BAAIASBbdTg7IDMyXQAACIBEb3dud2FyZCBtZXNzYWdlIGlzIGludmFsaWQgWENNLiBcWyBpZCBcXUhVbnN1cHBvcnRlZFZlcnNpb24EAAgBIFt1ODsgMzJdAAEIvERvd253YXJkIG1lc3NhZ2UgaXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBYQ00uIFxbIGlkIFxdQEV4ZWN1dGVkRG93bndhcmQIAAgBIFt1ODsgMzJdAADVBgEcT3V0Y29tZQACCMREb3dud2FyZCBtZXNzYWdlIGV4ZWN1dGVkIHdpdGggdGhlIGdpdmVuIG91dGNvbWUuRFxbIGlkLCBvdXRjb21lIFxdBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV05QYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ8ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcukGAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ8ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZNUBARhXZWlnaHQEwEhvdyBtdWNoIHdlaWdodCB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgEcc3VjY2Vzc8gBEGJvb2wYiFdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZC4ASQFOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHVuZGVybHlpbmcgYE1lc3NhZ2VQcm9jZXNzb3JgIHdhcyBpbnRlcm5hbGx5NQFzdWNjZXNzZnVsLiBJdCAqc29sZWx5KiBtZWFucyB0aGF0IHRoZSBNUSBwYWxsZXQgd2lsbCB0cmVhdCB0aGlzIGFzIGEgc3VjY2Vzc00BY29uZGl0aW9uIGFuZCBkaXNjYXJkIHRoZSBtZXNzYWdlLiBBbnkgaW50ZXJuYWwgZXJyb3IgbmVlZHMgdG8gYmUgZW1pdHRlZCBhcyBldmVudHNoYnkgdGhlIGBNZXNzYWdlUHJvY2Vzc29yYC4BBFRNZXNzYWdlIGlzIHByb2Nlc3NlZC5IT3ZlcndlaWdodEVucXVldWVkEAEIaWQIASBbdTg7IDMyXQSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEocGFnZV9pbmRleDgBJFBhZ2VJbmRleARgVGhlIHBhZ2Ugb2YgdGhlIG1lc3NhZ2UuATRtZXNzYWdlX2luZGV4OAEcVDo6U2l6ZQSkVGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgcGFnZS4CBIxNZXNzYWdlIHBsYWNlZCBpbiBvdmVyd2VpZ2h0IHF1ZXVlLihQYWdlUmVhcGVkCAEYb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgRYVGhlIHF1ZXVlIG9mIHRoZSBwYWdlLgEUaW5kZXg4ASRQYWdlSW5kZXgEWFRoZSBpbmRleCBvZiB0aGUgcGFnZS4DBFRUaGlzIHBhZ2Ugd2FzIHJlYXBlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTpBhA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgbWVzc2FnZXNMUHJvY2Vzc01lc3NhZ2VFcnJvcgABGCRCYWRGb3JtYXQAAAAcQ29ycnVwdAABACxVbnN1cHBvcnRlZAACAChPdmVyd2VpZ2h0BADVAQEYV2VpZ2h0AAMAFFlpZWxkAAQARFN0YWNrTGltaXRSZWFjaGVkAAUAAO0GDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXZlbnQAASBAQmF0Y2hJbnRlcnJ1cHRlZAgBFGluZGV4OAEMdTMyAAEUZXJyb3JZBgE0RGlzcGF0Y2hFcnJvcgAACFUBQmF0Y2ggb2YgZGlzcGF0Y2hlcyBkaWQgbm90IGNvbXBsZXRlIGZ1bGx5LiBJbmRleCBvZiBmaXJzdCBmYWlsaW5nIGRpc3BhdGNoIGdpdmVuLCBhc0h3ZWxsIGFzIHRoZSBlcnJvci44QmF0Y2hDb21wbGV0ZWQAAQTIQmF0Y2ggb2YgZGlzcGF0Y2hlcyBjb21wbGV0ZWQgZnVsbHkgd2l0aCBubyBlcnJvci5gQmF0Y2hDb21wbGV0ZWRXaXRoRXJyb3JzAAIEtEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGJ1dCBoYXMgZXJyb3JzLjRJdGVtQ29tcGxldGVkAAMEHQFBIHNpbmdsZSBpdGVtIHdpdGhpbiBhIEJhdGNoIG9mIGRpc3BhdGNoZXMgaGFzIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9yLihJdGVtRmFpbGVkBAEUZXJyb3JZBgE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx08QYBOERpc3BhdGNoUmVzdWx0AAUEWEEgY2FsbCB3YXMgZGlzcGF0Y2hlZC5ESWZFbHNlTWFpblN1Y2Nlc3MABgRkTWFpbiBjYWxsIHdhcyBkaXNwYXRjaGVkLlBJZkVsc2VGYWxsYmFja0NhbGxlZAQBKG1haW5fZXJyb3JZBgE0RGlzcGF0Y2hFcnJvcgAHBIRUaGUgZmFsbGJhY2sgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTxBgQYUmVzdWx0CARUARAERQFZBgEICE9rBAAQAAAAAAxFcnIEAFkGAAABAAD1Bgw8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFdmVudAQEVAABFCxOZXdNdWx0aXNpZwwBJGFwcHJvdmluZwQBMFQ6OkFjY291bnRJZAABIG11bHRpc2lnBAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoCAEgQ2FsbEhhc2gAAASMQSBuZXcgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWd1bi5ATXVsdGlzaWdBcHByb3ZhbBABJGFwcHJvdmluZwQBMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludJEDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcEATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gIASBDYWxsSGFzaAABBMhBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZCBieSBzb21lb25lLkBNdWx0aXNpZ0V4ZWN1dGVkFAEkYXBwcm92aW5nBAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50kQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwQBMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAgBIENhbGxIYXNoAAEYcmVzdWx08QYBOERpc3BhdGNoUmVzdWx0AAIEnEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLkRNdWx0aXNpZ0NhbmNlbGxlZBABKGNhbmNlbGxpbmcEATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnSRAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnBAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoCAEgQ2FsbEhhc2gAAwSgQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLjBEZXBvc2l0UG9rZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gIASBDYWxsSGFzaAABLG9sZF9kZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXTEATBCYWxhbmNlT2Y8VD4ABATwVGhlIGRlcG9zaXQgZm9yIGEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQvcG9rZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0+QYMLHBhbGxldF9zdWRvGHBhbGxldBRFdmVudAQEVAABEBRTdWRpZAQBLHN1ZG9fcmVzdWx08QYBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4ABHBBIHN1ZG8gY2FsbCBqdXN0IHRvb2sgcGxhY2UuKEtleUNoYW5nZWQIAQxvbGT9BgFQT3B0aW9uPFQ6OkFjY291bnRJZD4EtFRoZSBvbGQgc3VkbyBrZXkgKGlmIG9uZSB3YXMgcHJldmlvdXNseSBzZXQpLgEMbmV3BAEwVDo6QWNjb3VudElkBIhUaGUgbmV3IHN1ZG8ga2V5IChpZiBvbmUgd2FzIHNldCkuAQR4VGhlIHN1ZG8ga2V5IGhhcyBiZWVuIHVwZGF0ZWQuKEtleVJlbW92ZWQAAgSAVGhlIGtleSB3YXMgcGVybWFuZW50bHkgcmVtb3ZlZC4oU3Vkb0FzRG9uZQQBLHN1ZG9fcmVzdWx08QYBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4DBMhBIFtzdWRvX2FzXShQYWxsZXQ6OnN1ZG9fYXMpIGNhbGwganVzdCB0b29rIHBsYWNlLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldP0GBBhPcHRpb24EBFQBBAEIEE5vbmUAAAAQU29tZQQABAAAAQAAAQcMMHBhbGxldF9wcm94eRhwYWxsZXQURXZlbnQEBFQAARw0UHJveHlFeGVjdXRlZAQBGHJlc3VsdPEGAThEaXNwYXRjaFJlc3VsdAAABLxBIHByb3h5IHdhcyBleGVjdXRlZCBjb3JyZWN0bHksIHdpdGggdGhlIGdpdmVuLixQdXJlQ3JlYXRlZBgBEHB1cmUEATBUOjpBY2NvdW50SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBloQMBMFQ6OlByb3h5VHlwZQABUGRpc2FtYmlndWF0aW9uX2luZGV4LQMBDHUxNgABCGF0OAFEQmxvY2tOdW1iZXJGb3I8VD4AATxleHRyaW5zaWNfaW5kZXg4AQx1MzIAAQjcQSBwdXJlIGFjY291bnQgaGFzIGJlZW4gY3JlYXRlZCBieSBuZXcgcHJveHkgd2l0aCBnaXZlbpBkaXNhbWJpZ3VhdGlvbiBpbmRleCBhbmQgcHJveHkgdHlwZS4oUHVyZUtpbGxlZBABEHB1cmUEATBUOjpBY2NvdW50SWQAARxzcGF3bmVyBAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZaEDATBUOjpQcm94eVR5cGUAAVBkaXNhbWJpZ3VhdGlvbl9pbmRleC0DAQx1MTYAAgScQSBwdXJlIHByb3h5IHdhcyBraWxsZWQgYnkgaXRzIHNwYXduZXIuJEFubm91bmNlZAwBEHJlYWwEATBUOjpBY2NvdW50SWQAARRwcm94eQQBMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaDwBNENhbGxIYXNoT2Y8VD4AAwTgQW4gYW5ub3VuY2VtZW50IHdhcyBwbGFjZWQgdG8gbWFrZSBhIGNhbGwgaW4gdGhlIGZ1dHVyZS4oUHJveHlBZGRlZBABJGRlbGVnYXRvcgQBMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQQBMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGWhAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgAEBEhBIHByb3h5IHdhcyBhZGRlZC4wUHJveHlSZW1vdmVkEAEkZGVsZWdhdG9yBAEwVDo6QWNjb3VudElkAAEkZGVsZWdhdGVlBAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZaEDATBUOjpQcm94eVR5cGUAARRkZWxheTgBREJsb2NrTnVtYmVyRm9yPFQ+AAUEUEEgcHJveHkgd2FzIHJlbW92ZWQuMERlcG9zaXRQb2tlZBABDHdobwQBMFQ6OkFjY291bnRJZAABEGtpbmQFBwEsRGVwb3NpdEtpbmQAASxvbGRfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgABLG5ld19kZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAYECQFBIGRlcG9zaXQgc3RvcmVkIGZvciBwcm94aWVzIG9yIGFubm91bmNlbWVudHMgd2FzIHBva2VkIC8gdXBkYXRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQFBwgwcGFsbGV0X3Byb3h5LERlcG9zaXRLaW5kAAEIHFByb3hpZXMAAAA0QW5ub3VuY2VtZW50cwABAAAJBwxUaW5kaXZfcGFsbGV0X2lkZW50aXR5GHBhbGxldBRFdmVudAQEVAABgCxJZGVudGl0eVNldAQBDHdobwQBMFQ6OkFjY291bnRJZAAABOxBIG5hbWUgd2FzIHNldCBvciByZXNldCAod2hpY2ggd2lsbCByZW1vdmUgYWxsIGp1ZGdlbWVudHMpLjxJZGVudGl0eUNsZWFyZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAEEzEEgbmFtZSB3YXMgY2xlYXJlZCwgYW5kIHRoZSBnaXZlbiBiYWxhbmNlIHJldHVybmVkLjhJZGVudGl0eUtpbGxlZAgBDHdobwQBMFQ6OkFjY291bnRJZAABHGRlcG9zaXTEATBCYWxhbmNlT2Y8VD4AAgTEQSBuYW1lIHdhcyByZW1vdmVkIGFuZCB0aGUgZ2l2ZW4gYmFsYW5jZSBzbGFzaGVkLkhKdWRnZW1lbnRSZXF1ZXN0ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAATxyZWdpc3RyYXJfaW5kZXg4AThSZWdpc3RyYXJJbmRleAADBJxBIGp1ZGdlbWVudCB3YXMgYXNrZWQgZnJvbSBhIHJlZ2lzdHJhci5QSnVkZ2VtZW50VW5yZXF1ZXN0ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAATxyZWdpc3RyYXJfaW5kZXg4AThSZWdpc3RyYXJJbmRleAAEBIhBIGp1ZGdlbWVudCByZXF1ZXN0IHdhcyByZXRyYWN0ZWQuOEp1ZGdlbWVudEdpdmVuCAEYdGFyZ2V0BAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4OAE4UmVnaXN0cmFySW5kZXgABQSUQSBqdWRnZW1lbnQgd2FzIGdpdmVuIGJ5IGEgcmVnaXN0cmFyLjhSZWdpc3RyYXJBZGRlZAQBPHJlZ2lzdHJhcl9pbmRleDgBOFJlZ2lzdHJhckluZGV4AAYEWEEgcmVnaXN0cmFyIHdhcyBhZGRlZC5AU3ViSWRlbnRpdHlBZGRlZAwBDHN1YgQBMFQ6OkFjY291bnRJZAABEG1haW4EATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAcE9EEgc3ViLWlkZW50aXR5IHdhcyBhZGRlZCB0byBhbiBpZGVudGl0eSBhbmQgdGhlIGRlcG9zaXQgcGFpZC5AU3ViSWRlbnRpdGllc1NldAwBEG1haW4EATBUOjpBY2NvdW50SWQAAThudW1iZXJfb2Zfc3ViczgBDHUzMgABLG5ld19kZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAgEvEFuIGFjY291bnQncyBzdWItaWRlbnRpdGllcyB3ZXJlIHNldCAoaW4gYnVsaykuSFN1YklkZW50aXR5UmVuYW1lZAgBDHN1YgQBMFQ6OkFjY291bnRJZAABEG1haW4EATBUOjpBY2NvdW50SWQACQQhAUEgZ2l2ZW4gc3ViLWFjY291bnQncyBhc3NvY2lhdGVkIG5hbWUgd2FzIGNoYW5nZWQgYnkgaXRzIHN1cGVyLWlkZW50aXR5LkhTdWJJZGVudGl0eVJlbW92ZWQMAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAKBAkBQSBzdWItaWRlbnRpdHkgd2FzIHJlbW92ZWQgZnJvbSBhbiBpZGVudGl0eSBhbmQgdGhlIGRlcG9zaXQgZnJlZWQuSFN1YklkZW50aXR5UmV2b2tlZAwBDHN1YgQBMFQ6OkFjY291bnRJZAABEG1haW4EATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAsIGQFBIHN1Yi1pZGVudGl0eSB3YXMgY2xlYXJlZCwgYW5kIHRoZSBnaXZlbiBkZXBvc2l0IHJlcGF0cmlhdGVkIGZyb20gdGhlyG1haW4gaWRlbnRpdHkgYWNjb3VudCB0byB0aGUgc3ViLWlkZW50aXR5IGFjY291bnQuOEF1dGhvcml0eUFkZGVkBAEkYXV0aG9yaXR5BAEwVDo6QWNjb3VudElkAAwEfEEgdXNlcm5hbWUgYXV0aG9yaXR5IHdhcyBhZGRlZC5AQXV0aG9yaXR5UmVtb3ZlZAQBJGF1dGhvcml0eQQBMFQ6OkFjY291bnRJZAANBIRBIHVzZXJuYW1lIGF1dGhvcml0eSB3YXMgcmVtb3ZlZC4sVXNlcm5hbWVTZXQIAQx3aG8EATBUOjpBY2NvdW50SWQAASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgAOBHRBIHVzZXJuYW1lIHdhcyBzZXQgZm9yIGB3aG9gLjhVc2VybmFtZVF1ZXVlZAwBDHdobwQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lQQQBLFVzZXJuYW1lPFQ+AAEoZXhwaXJhdGlvbjgBREJsb2NrTnVtYmVyRm9yPFQ+AA8EGQFBIHVzZXJuYW1lIHdhcyBxdWV1ZWQsIGJ1dCBgd2hvYCBtdXN0IGFjY2VwdCBpdCBwcmlvciB0byBgZXhwaXJhdGlvbmAuSFByZWFwcHJvdmFsRXhwaXJlZAQBFHdob3NlBAEwVDo6QWNjb3VudElkABAEOQFBIHF1ZXVlZCB1c2VybmFtZSBwYXNzZWQgaXRzIGV4cGlyYXRpb24gd2l0aG91dCBiZWluZyBjbGFpbWVkIGFuZCB3YXMgcmVtb3ZlZC5IUHJpbWFyeVVzZXJuYW1lU2V0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AEQQBAUEgdXNlcm5hbWUgd2FzIHNldCBhcyBhIHByaW1hcnkgYW5kIGNhbiBiZSBsb29rZWQgdXAgZnJvbSBgd2hvYC5cRGFuZ2xpbmdVc2VybmFtZVJlbW92ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgASCF0BQSBkYW5nbGluZyB1c2VybmFtZSAoYXMgaW4sIGEgdXNlcm5hbWUgY29ycmVzcG9uZGluZyB0byBhbiBhY2NvdW50IHRoYXQgaGFzIHJlbW92ZWQgaXRzbGlkZW50aXR5KSBoYXMgYmVlbiByZW1vdmVkLjxVc2VybmFtZVVuYm91bmQEASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgATBHBBIHVzZXJuYW1lIGhhcyBiZWVuIHVuYm91bmQuPFVzZXJuYW1lUmVtb3ZlZAQBIHVzZXJuYW1lQQQBLFVzZXJuYW1lPFQ+ABQEcEEgdXNlcm5hbWUgaGFzIGJlZW4gcmVtb3ZlZC44VXNlcm5hbWVLaWxsZWQEASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgAVBGxBIHVzZXJuYW1lIGhhcyBiZWVuIGtpbGxlZC5AVXNlcm5hbWVSZXBvcnRlZAgBIHJlcG9ydGVyBAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AFgR0QSB1c2VybmFtZSBoYXMgYmVlbiByZXBvcnRlZC5MUGVyc29uYWxJZGVudGl0eVNldAwBFGFsaWFzCAEUQWxpYXMAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWVBBAEsVXNlcm5hbWU8VD4AFwSYQW4gaWRlbnRpdHkgZm9yIGEgcGVyc29uIGhhcyBiZWVuIHNldC5ERXZpZGVuY2VTdWJtaXR0ZWQEARRhbGlhcwgBFEFsaWFzABgE5EV2aWRlbmNlIGZvciBhIGNyZWRlbnRpYWwgaGFzIGJlZWQgc3VibWl0dGVkIGJ5IGEgcGVyc29uLkhDcmVkZW50aWFsQWNjZXB0ZWQEARRhbGlhcwgBFEFsaWFzABkEnEEgY3JlZGVudGlhbCB3YXMgYWNjZXB0ZWQgZm9yIGEgcGVyc29uLkhDcmVkZW50aWFsUmVqZWN0ZWQEARRhbGlhcwgBFEFsaWFzABoEnEEgY3JlZGVudGlhbCB3YXMgcmVqZWN0ZWQgZm9yIGEgcGVyc29uLjBQZXJzb25CYW5uZWQEARRhbGlhcwgBFEFsaWFzABsE0FBlcnNvbiB3YXMgYmFubmVkIGZvciBzZW5kaW5nIGNvbnRlbXB0dW91cyBldmlkZW5jZS5cUGVyc29uYWxJZGVudGl0eUNsZWFyZWQEARRhbGlhcwgBFEFsaWFzABwEgEEgcGVyc29uYWwgaWRlbnRpdHkgd2FzIGNsZWFyZWQubFJlcG9ydGVkVXNlcm5hbWVKdWRnZWRWYWxpZAQBIHVzZXJuYW1lQQQBLFVzZXJuYW1lPFQ+AB0ElEEgcmVwb3J0ZWQgdXNlcm5hbWUgd2FzIGp1ZGdlZCB2YWxpZC50UmVwb3J0ZWRVc2VybmFtZUp1ZGdlZEludmFsaWQEASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgAeBJxBIHJlcG9ydGVkIHVzZXJuYW1lIHdhcyBqdWRnZWQgaW52YWxpZC6YUmVwb3J0ZWRVc2VybmFtZVdlYWtPclVuY2xlYXJKdWRnZW1lbnQIASB1c2VybmFtZUEEASxVc2VybmFtZTxUPgABJGp1ZGdlbWVudEkEATxPcmFjbGVKdWRnZW1lbnQAHwQRAVRoZSBqdWRnbWVudCByZWdhcmRpbmcgYSByZXBvcnRlZCB1c2VybmFtZSB3YXMgdW5jbGVhciBvciB1bmNlcnRhaW4uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0DQcMTGluZGl2X3BhbGxldF9wZW9wbGUYcGFsbGV0FEV2ZW50BARUAAEoUFBlcnNvbmhvb2RSZWNvZ25pemVkCAEMd2hvKAEoUGVyc29uYWxJZAABDGtleQgBLE1lbWJlck9mPFQ+AAAE+EFuIGluZGl2aWR1YWwgaGFzIGhhZCB0aGVpciBwZXJzb25ob29kIHJlY29nbmlzZWQgYW5kIGluZGV4ZWQuQFBlcnNvbk9uYm9hcmRpbmcIAQx3aG8oAShQZXJzb25hbElkAAEMa2V5CAEsTWVtYmVyT2Y8VD4AAQQRAUFuIGluZGl2aWR1YWwgaGFzIGhhZCB0aGVpciBwZXJzb25ob29kIHJlY29nbmlzZWQgYWdhaW4gYW5kIGluZGV4ZWQuPEFsaWFzRGlzcGF0Y2hlZAgBFGFsaWFzSQMBPENvbnRleHR1YWxBbGlhcwABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAgSUQSBjYWxsIHdhcyBkaXNwYXRjaGVkIHVuZGVyIGFuIGFsaWFzLjxBbGlhc0FjY291bnRTZXQIARRhbGlhc0kDATxDb250ZXh0dWFsQWxpYXMAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEvEFuIGFsaWFzLXRvLWFjY291bnQgbWFwcGluZyB3YXMgc2V0IG9yIHVwZGF0ZWQuREFsaWFzQWNjb3VudFVuc2V0CAEUYWxpYXNJAwE8Q29udGV4dHVhbEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBKBBbiBhbGlhcy10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuUFBlcnNvbmFsSWRBY2NvdW50U2V0CAEMd2hvKAEoUGVyc29uYWxJZAABHGFjY291bnQEATBUOjpBY2NvdW50SWQABQTQQSBwZXJzb25hbCBJRC10by1hY2NvdW50IG1hcHBpbmcgd2FzIHNldCBvciB1cGRhdGVkLlhQZXJzb25hbElkQWNjb3VudFVuc2V0CAEMd2hvKAEoUGVyc29uYWxJZAABHGFjY291bnQEATBUOjpBY2NvdW50SWQABgS0QSBwZXJzb25hbCBJRC10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuRENvbGxlY3Rpb25DcmVhdGVkAAcEiFRoZSBwZW9wbGUgY29sbGVjdGlvbiB3YXMgY3JlYXRlZC5kRm9yY2VQZXJzb25ob29kUmVjb2duaXplZAQBGHBlb3BsZVUEAUBWZWM8TWVtYmVyT2Y8VD4+AAgEtFBlcnNvbmhvb2Qgd2FzIGZvcmNlZnVsbHkgcmVjb2duaXplZCBieSByb290LjhBbGlhc0NsZWFuZWRVcAgBFGFsaWFzSQMBPENvbnRleHR1YWxBbGlhcwABHGFjY291bnQEATBUOjpBY2NvdW50SWQACQSsQW4gYWxpYXMtdG8tYWNjb3VudCBtYXBwaW5nIHdhcyBjbGVhbmVkIHVwLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldBEHDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0FEV2ZW50BARUAAFELENhc2VDcmVhdGVkBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleASAVGhlIGNhc2UgaW5kZXggdGhhdCB3YXMgY3JlYXRlZC4ABGBBIGNhc2UgaGFzIGJlZW4gY3JlYXRlZC4gQ2FsbGJhY2sEARhyZXN1bHTxBgE4RGlzcGF0Y2hSZXN1bHQEbFRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrLgEEnEEgY2FsbGJhY2sgd2FzIHRyaWdnZXJlZCBmcm9tIG1vYi1ydWxlLjRDYWxsYmFja0Vycm9yAAIE8FRoZXJlIHdhcyBhIGNvZGVjIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLihDYXNlQ2xvc2VkCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAR8VGhlIGNhc2UgaW5kZXggdGhhdCB3YXMgY2xvc2VkLgEcdmVyZGljdEkEASRKdWRnZW1lbnQEfFRoZSB2ZXJkaWN0IG9mIHRoZSBjbG9zZWQgY2FzZS4DBMxUaGUgY2FzZSBoYXMgYmVlbiBjbG9zZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlc3VsdC4UVm90ZWQMAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4BEhUaGUgY2FzZSB2b3RlZCBvbi4BFHZvdGVyCAEUQWxpYXMEVFRoZSBhbGlhcyB0aGF0IHZvdGVkLgEcb3BpbmlvbkkEASRKdWRnZW1lbnQEZFRoZSBvcGluaW9uIG9mIHRoZSB2b3Rlci4EBIRBIHZvdGUgaGFzIGJlZW4gcGxhY2VkIG9uIGEgY2FzZS4sVm90ZUNsZWFuZWQIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4BEhUaGUgY2FzZSB2b3RlZCBvbi4BFHZvdGVyCAEUQWxpYXMEVFRoZSBhbGlhcyB0aGF0IHZvdGVkLgUEYEEgdm90ZSBoYXMgYmVlbiBjbGVhbmVkLixDYXNlUmVtb3ZlZAQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgESFRoZSBjYXNlIHZvdGVkIG9uLgYEYEEgY2FzZSBoYXMgYmVlbiByZW1vdmVkLjhDYXNlSW50ZXJ2ZW5lZAgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgEiFRoZSBjYXNlIHRoYXQgaGFzIGJlZW4gaW50ZXJ2ZW5lZC4BHHZlcmRpY3RJBAEkSnVkZ2VtZW50BIBUaGUgdmVyZGljdCBhcHBsaWVkIHRvIHRoZSBjYXNlLgcEbEEgY2FzZSBoYXMgYmVlbiBpbnRlcnZlbmVkLjBWb3Rlc0NsYWltZWQIARR2b3RlcggBFEFsaWFzBFRUaGUgYWxpYXMgdGhhdCB2b3RlZC4BMGNhc2VfaW5kaWNlc2UEAThWZWM8Q2FzZUluZGV4PgSIVGhlIGNhc2UgdGhhdCBoYXMgYmVlbiBpbnRlcnZlbmVkLggEkENyZWRpdHMgZm9yIHZvdGVzIGhhdmUgYmVlbiBjbGFpbWVkLjBSZXdhcmRQYXlvdXQMARR2b3RlcggBFEFsaWFzBHxUaGUgYWxpYXMgdGhhdCBlYXJuZWQgYSByZXdhcmQuASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAScVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBwYXlvdXQuARhhbW91bnTEATBCYWxhbmNlT2Y8VD4EnFRoZSBwYXlvdXQgYW1vdW50IHRoYXQgd2FzIHRyYW5zZmVycmVkLgkEgEEgcmV3YXJkIHRoYXQgaGFzIGJlZW4gcGFpZCBvdXQuSFBheW91dFJvdW5kU3RhcnRlZAwBFHJvdW5kOAEoUm91bmRJbmRleASIVGhlIGluZGV4IG9mIHRoZSBuZXcgcGF5b3V0IHJvdW5kLgE8aW5pdGlhbF9iYWxhbmNlxAEwQmFsYW5jZU9mPFQ+BLBUaGUgaW5pdGlhbCBiYWxhbmNlIGFsbG9jYXRlZCBmb3IgdGhlIHJvdW5kLgEwdG90YWxfcG9pbnRzKAEkVm90ZUNvdW50BMRUb3RhbCBhY2N1bXVsYXRlZCBwb2ludHMgY2xhaW1hYmxlIGluIHRoaXMgcm91bmQuCgSQQSBuZXcgcGF5b3V0IHJvdW5kIGhhcyBiZWVuIHN0YXJ0ZWQuVFBheW91dFJvdW5kc1NjaGVkdWxlZAwBGGFtb3VudMQBMEJhbGFuY2VPZjxUPgR4VGhlIGFtb3VudCBvZiBmdW5kcyBwZXIgcm91bmQuARRjb3VudDgBDHUzMgR8VGhlIG51bWJlciBvZiByb3VuZHMgc2NoZWR1bGVkLgEYcGVyaW9kOAFEQmxvY2tOdW1iZXJGb3I8VD4EuFRoZSBtaW5pbXVtIHBlcmlvZCAoaW4gYmxvY2tzKSBiZXR3ZWVuIHJvdW5kcy4LBIhQYXlvdXQgcm91bmRzIGhhdmUgYmVlbiBzY2hlZHVsZWQuVFBheW91dFNjaGVkdWxlUmVtb3ZlZAQBFGluZGV4OAEMdTMyBIhUaGUgaW5kZXggb2YgdGhlIHJlbW92ZWQgc2NoZWR1bGUuDASMQSBwYXlvdXQgc2NoZWR1bGUgaGFzIGJlZW4gcmVtb3ZlZC40Q3JlZGl0Q2xhaW1lZAgBFHZvdGVyCAEUQWxpYXMEjFRoZSBhbGlhcyBvZiB0aGUgdm90ZXIgd2hvIGNsYWltZWQuARhhbW91bnTEATBCYWxhbmNlT2Y8VD4EdFRoZSBhbW91bnQgb2YgY3JlZGl0IGNsYWltZWQuDQTUQ3JlZGl0IGhhcyBiZWVuIGNsYWltZWQgZnJvbSB0aGUgcGF5b3V0IGRpc3RyaWJ1dGlvbi40UG9pbnRzQ2xlYW5lZAgBFHJvdW5kOAEoUm91bmRJbmRleAS8VGhlIHJvdW5kIGluZGV4IGZyb20gd2hpY2ggcG9pbnRzIHdlcmUgcmVtb3ZlZC4BFHZvdGVyCAEUQWxpYXMEkFRoZSBhbGlhcyB3aG9zZSBwb2ludHMgd2VyZSByZW1vdmVkLg4EmFN0YWxlIHZvdGluZyBwb2ludHMgaGF2ZSBiZWVuIGNsZWFuZWQuLENhc2VUb3VjaGVkCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleARoVGhlIGNhc2UgdGhhdCB3YXMgdG91Y2hlZC4BHHJpcGVuZWTIARBib29sBKRXaGV0aGVyIHRoZSBjYXNlIHdhcyByaXBlbmVkIGFzIGEgcmVzdWx0Lg8EnEEgY2FzZSBoYXMgYmVlbiB0b3VjaGVkIChyZS1ldmFsdWF0ZWQpLlBWb3RpbmdQZW5hbHR5Q2xlYXJlZAQBDHdobwgBFEFsaWFzBJBUaGUgYWxpYXMgd2hvc2UgcGVuYWx0eSB3YXMgY2xlYXJlZC4QBIhBIHZvdGluZyBwZW5hbHR5IGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQcMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0FEV2ZW50BARUAAFcQENhbmRpZGF0ZUFwcGxpZWQEAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAAEjENhbmRpZGF0ZSBhcHBsaWVkIGZvciB2ZXJpZmljYXRpb24uSEp1ZGdlbWVudFJlcXVlc3RlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAAQQFAUNhbmRpZGF0ZSBvcGVuZWQgYSBqdWRpY2lhbCBjYXNlIGZvciB0aGVpciB2ZXJpZmljYXRpb24gZXZpZGVuY2UuREp1ZGdlbWVudFByb3ZpZGVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABJGp1ZGdlbWVudEkEASRKdWRnZW1lbnQAAgTYT3JhY2xlIGhhcyBwcm92aWRlZCB0aGUganVkZ2VtZW50IGZvciBhIGp1ZGljaWFsIGNhc2UuMFJldHJ5R3JhbnRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAASBmYWlsdXJlczgBDHUzMgADCEUBQSBjYW5kaWRhdGUgaGFzIGJlZW4gZ3JhbnRlZCBhIGZyZWUgcmV0cnkgYXR0ZW1wdCBhZnRlciBhIGZhaWx1cmUgdG8gdmVyaWZ5IHRoZWlyJGV2aWRlbmNlLkBQZXJzb25SZWdpc3RlcmVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABLHBlcnNvbmFsX2lkKAEoUGVyc29uYWxJZAAEBIBSZWdpc3RlciBhbiBhY2NvdW50IGFzIGEgcGVyc29uLkRDYW5kaWRhdGVSZWZlcnJlZAgBIHJlZmVycmVyKAEoUGVyc29uYWxJZAABIHJlZmVycmVkBAEwVDo6QWNjb3VudElkAAUEbFBlcnNvbiByZWZlcnJlZCBhbiBhY2NvdW50LiBSZXJvbGxlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQABgS0RW50cm9weSBmb3IgYSBjYW5kaWRhdGUgY2hhbmdlZCBhZnRlciBleHBpcnkuPERlc2lnbkNvbW1pdHRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAASxyZXNlcnZlZF9pZCgBKFBlcnNvbmFsSWQABwSUQ2FuZGlkYXRlIGNvbW1pdHRlZCB0byBhbiBpbmsgZGVzaWduLjhGdWxseUFsbG9jYXRlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQACAS8U3RvcmFnZSBmdWxseSBhbGxvY2F0ZWQgZm9yIGEgY29tbWl0dGVkIGRlc2lnbi4gVGltZWRPdXQEAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAkEgENhbmRpZGF0ZSByZW1vdmVkIGFmdGVyIHRpbWVvdXQuJEZsYWtlZE91dAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQACgR4VW5jb21taXR0ZWQgY2FuZGlkYXRlIHJlbW92ZWQuOFRpY2tldFJlZmVycmVkCAEgcmVmZXJyZXIoAShQZXJzb25hbElkAAEYdGlja2V0BAEkVDo6VGlja2V0AAsE7FJlZmVycmFsIHRpY2tldCBjcmVhdGVkIGJ5IHN0b3JpbmcgdGhlIHB1YmxpYyBrZXkgb24gY2hhaW4uPFRpY2tldENhbmNlbGxlZAgBIHJlZmVycmVyKAEoUGVyc29uYWxJZAABGHRpY2tldAQBJFQ6OlRpY2tldAAMBBkBUmVmZXJyYWwgdGlja2V0IHJlbW92ZWQgYnkgcmVtb3ZpbmcgdGhlIHB1YmxpYyBrZXkgZnJvbSBjaGFpbiBzdG9yYWdlLjRUaWNrZXRBcHBsaWVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABIHJlZmVycmVyKAEoUGVyc29uYWxJZAANBKhDYW5kaWRhdGUgYXBwbGllZCB1c2luZyBhIHJlZmVycmFsIHRpY2tldC4sRmFtaWx5QWRkZWQMARRpbmRleC0DASxGYW1pbHlJbmRleAABEGtpbmR1BAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQADgRQRGVzaWduIGZhbWlseSBhZGRlZC5EQWxsSW52aXRlc1JlbW92ZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAA8EuEFsbCBpbnZpdGVzIGhhdmUgYmVlbiByZW1vdmVkIGZvciB0aGUgaW52aXRlci5IU29tZUludml0ZXNSZW1vdmVkBAEcaW52aXRlcgQBMFQ6OkFjY291bnRJZAAQBA0BU29tZSBpbnZpdGVzIGhhdmUgYmVlbiByZW1vdmVkIGZvciB0aGUgaW52aXRlciwgc29tZSBhcmUgcmVtYWluaW5nLlxJbnZpdGVkQ2FuZGlkYXRlQXBwbGllZAgBDHdobwQBMFQ6OkFjY291bnRJZAABHGludml0ZXIEATBUOjpBY2NvdW50SWQAEQSYQ2FuZGlkYXRlIGFwcGxpZWQgdXNpbmcgYW4gaW52aXRhdGlvbi5kUmVmZXJyYWxWb3VjaGVyUmVnaXN0ZXJlZAQBIHJlZmVycmVyKAEoUGVyc29uYWxJZAASBMBBIHJlZmVycmVyJ3MgcmV3YXJkIHZvdWNoZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZC44SW52aXRlc0dyYW50ZWQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEUY291bnQ4AQx1MzIAEwSgSW52aXRlcyBoYXZlIGJlZW4gZ3JhbnRlZCB0byBhbiBhY2NvdW50LjxJbnZpdGVUaWNrZXRTZXQIARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEkVDo6VGlja2V0ABQEeEFuIGludml0ZSB0aWNrZXQgaGFzIGJlZW4gc2V0LlRJbnZpdGVUaWNrZXRDYW5jZWxsZWQIARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEkVDo6VGlja2V0ABUEkEFuIGludml0ZSB0aWNrZXQgaGFzIGJlZW4gY2FuY2VsbGVkLkBDb25maWd1cmF0aW9uU2V0BAEYY29uZmlneQQBfENvbmZpZ1JlY29yZDxCbG9ja051bWJlckZvcjxUPj4AFgSoVGhlIHBhbGxldCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0GQcMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldBRFdmVudAQEVAABSBxOZXdHYW1lDAFEcmVnaXN0cmF0aW9uX2VuZHM4AQx1MzIAASRnYW1lX2RhdGU4AQx1MzIAASxyZXBvcnRfZW5kczgBDHUzMgAABFxBIG5ldyBnYW1lIGlzIHN0YXJ0aW5nLiRHYW1lRW5kZWQEARRpbmRleDgBDHUzMgABBKBUaGUgZ2FtZSBhbmQgaXRzIHBvc3QtcHJvY2VzcyBoYXMgZW5kZWQuIFNpZ25lZFVwBAEMd2hvHQcBdEFjY291bnRPclBlcnNvbjxUOjpBY2NvdW50SWQ+AAIEgEEgcGxheWVyIHNpZ25lZCB1cCBmb3IgdGhlIGdhbWUuPFJlcG9ydFN1Ym1pdHRlZAgBDHdobx0HAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgABKGdhbWVfaW5kZXg4AQx1MzIAAwSAQSBwbGF5ZXIgc3VibWl0dGVkIHRoZWlyIHJlcG9ydC4oT2ZmYm9hcmRlZAQBDHdobx0HAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgAEBIhBIHBsYXllciBvZmZib2FyZGVkIGZyb20gdGhlIGdhbWUuJEtpY2tlZE91dAQBGHBsYXllch0HAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgAFBIhBbiBhcmNoaXZlZCBwbGF5ZXIgd2FzIGtpY2tlZCBvdXQuOEludml0ZXNHcmFudGVkCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAAYEjEludml0ZXMgd2VyZSBncmFudGVkIHRvIGFuIGFjY291bnQuPEludml0ZVRpY2tldFNldAQBHGludml0ZXIEATBUOjpBY2NvdW50SWQABwRkQW4gaW52aXRlIHRpY2tldCB3YXMgc2V0LlRJbnZpdGVUaWNrZXRDYW5jZWxsZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAgEfEFuIGludml0ZSB0aWNrZXQgd2FzIGNhbmNlbGxlZC44R2FtZXNTY2hlZHVsZWQEARRjb3VudDgBDHUzMgAJBFRHYW1lcyB3ZXJlIHNjaGVkdWxlZC5QU2NoZWR1bGVkR2FtZVJlbW92ZWQEAThnYW1lX3BsYXlfdGltZTgBDHUzMgAKBHRBIHNjaGVkdWxlZCBnYW1lIHdhcyByZW1vdmVkLkBTdG10VXNhZ2VSZW1vdmVkBAEMd2hvCAEgW3U4OyAzMl0ACwS4U3RhdGVtZW50IHN0b3JlIHVzYWdlIHJlbW92ZWQgZm9yIHRoZSBhY2NvdW50LkRBbGxJbnZpdGVzUmVtb3ZlZAQBHGludml0ZXIEATBUOjpBY2NvdW50SWQADAS4QWxsIGludml0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZm9yIHRoZSBpbnZpdGVyLkhTb21lSW52aXRlc1JlbW92ZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAA0EDQFTb21lIGludml0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZm9yIHRoZSBpbnZpdGVyLCBzb21lIGFyZSByZW1haW5pbmcuWFNjcmF0Y2hSZXdhcmRBdmFpbGFibGUEAShnYW1lX2luZGV4OAEMdTMyAA4E6FNjcmF0Y2ggY2FyZCByZXdhcmRzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBjb25jbHVkZWQgZ2FtZS5QU2NyYXRjaFJld2FyZENsYWltZWQIASxiZW5lZmljaWFyeQQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBTFNjcmF0Y2hCYWxhbmNlT2Y8VD4ADwTQQSBwbGF5ZXIgc3VjY2Vzc2Z1bGx5IGNsYWltZWQgYSBzY3JhdGNoIGNhcmQgcmV3YXJkLkxHYW1lUHJpemVQb29sT3BlbmVkCAEoZ2FtZV9pbmRleDgBDHUzMgABHHBvb2xfaWQ4AYRpbmRpdl9wYWxsZXRfYWlyZHJvcDo6UHJpemVQb29sSWQAEAT8QSBuZXcgZ2FtZSBvcGVuZWQgYSByZWN1cnJpbmctcHJpemUgcG9vbCBpbiB0aGUgYWlyZHJvcCBwYWxsZXQuXEdhbWVQcml6ZVBvb2xPcGVuRmFpbGVkCAEoZ2FtZV9pbmRleDgBDHUzMgABFGVycm9yWQYBNERpc3BhdGNoRXJyb3IAEQQpAWBuZXdfZ2FtZWAgY291bGQgbm90IG9wZW4gaXRzIGNvbXBhbmlvbiBwcml6ZSBwb29sLiBUaGUgZ2FtZSBzdGlsbCBzdGFydHMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0HQcMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlczxBY2NvdW50T3JQZXJzb24EJEFjY291bnRJZAEEAQgcQWNjb3VudAQABAEkQWNjb3VudElkAAAAGFBlcnNvbgQACAEUQWxpYXMAAQAAIQcMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQURXZlbnQEBFQAARw0Q3JlZGl0Q2xhaW1lZAwBDHdobx0HAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgR4VGhlIHBlcnNvbiB3aG8gY2xhaW1lZCBjcmVkaXQuASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAS8RGVzdGluYXRpb24gYWNjb3VudCB0aGF0IHJlY2VpdmVkIHRoZSB0cmFuc2Zlci4BGGFtb3VudMQBMEJhbGFuY2VPZjxUPgRMQW1vdW50IHRyYW5zZmVycmVkLgAEcEEgcGVyc29uIGhhcyBjbGFpbWVkIGNyZWRpdC5QUGVyc29uaG9vZFJlY29nbml6ZWQIAQx3aG8dBwF0QWNjb3VudE9yUGVyc29uPFQ6OkFjY291bnRJZD4EsFRoZSBhY2NvdW50IHdob3NlIHBlcnNvbmhvb2Qgd2FzIHJlY29nbml6ZWQuARxyZXN1bWVkyAEQYm9vbAQRAVdoZXRoZXIgdGhpcyB3YXMgcmVzdW1pbmcgZnJvbSBzdXNwZW5zaW9uIG9yIGZpcnN0LXRpbWUgcmVjb2duaXRpb24uAQSkUGVyc29uaG9vZCB3YXMgcmVjb2duaXplZCBmb3IgYW4gYWNjb3VudC5UUGF5b3V0Um91bmRzU2NoZWR1bGVkDAEYYW1vdW50xAEwQmFsYW5jZU9mPFQ+BFRUaGUgYW1vdW50IHBlciByb3VuZC4BFGNvdW50OAEMdTMyBFRUaGUgbnVtYmVyIG9mIHJvdW5kcy4BIGR1cmF0aW9uOAFEQmxvY2tOdW1iZXJGb3I8VD4EhFRoZSBkdXJhdGlvbiBwZXIgcm91bmQgaW4gYmxvY2tzLgIEiFBheW91dCByb3VuZHMgaGF2ZSBiZWVuIHNjaGVkdWxlZC5UUGF5b3V0U2NoZWR1bGVSZW1vdmVkBAEUaW5kZXg4AQx1MzIEiFRoZSBpbmRleCBvZiB0aGUgcmVtb3ZlZCBzY2hlZHVsZS4DBIxBIHBheW91dCBzY2hlZHVsZSBoYXMgYmVlbiByZW1vdmVkLkRSb3VuZFRyYW5zaXRpb25lZAQBLHJvdW5kX2luZGV4OAEoUm91bmRJbmRleASYVGhlIHJvdW5kIGluZGV4IHRoYXQgd2FzIHRyYW5zaXRpb25lZC4EBHhBIHJvdW5kIGhhcyBiZWVuIHRyYW5zaXRpb25lZC5MUGF5b3V0Um91bmRPcGVyYXRlZAQBLHJvdW5kX2luZGV4OAEoUm91bmRJbmRleASIVGhlIHJvdW5kIGluZGV4IHRoYXQgd2FzIG9wZXJhdGVkLgUEGQFBIHBheW91dCByb3VuZCBoYXMgYmVlbiBvcGVyYXRlZCAoY3JlZGl0IGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cykuJENhc2hlZE91dAQBDHdobx0HAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgR8VGhlIHBhcnRpY2lwYW50IHdobyBjYXNoZWQgb3V0LgYEuEEgcGFydGljaXBhbnQgaGFzIGNhc2hlZCBvdXQgc2NvcmUgZm9yIHBvaW50cy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQlBwxYaW5kaXZfcGFsbGV0X2R1bW15X2RpbRhwYWxsZXQURXZlbnQEBFQAASAsSWRzUmVzZXJ2ZWQEARRjb3VudDgBDHUzMgAABHRBIG51bWJlciBvZiBJRHMgd2FzIHJlc2VydmVkLiRJZFJlbmV3ZWQEAQhpZCgBKFBlcnNvbmFsSWQAAQRIQW4gSUQgd2FzIHJlbmV3ZWQuMElkVW5yZXNlcnZlZAQBCGlkKAEoUGVyc29uYWxJZAACBGhBIHJlc2VydmVkIElEIHdhcyByZW1vdmVkLkBQZW9wbGVSZWdpc3RlcmVkBAEUY291bnQ4AQx1MzIAAwRkUmVnaXN0ZXIgbXVsdGlwbGUgcGVvcGxlLjxQZW9wbGVTdXNwZW5kZWQEARRjb3VudDgBDHUzMgAEBGxTdXNwZW5kIGEgbnVtYmVyIG9mIHBlb3BsZS5EUGVyc29uaG9vZFJlc3VtZWQEAQhpZCgBKFBlcnNvbmFsSWQABQSEU29tZW9uZSdzIHBlcnNvbmhvb2Qgd2FzIHJlc3VtZWQuSFN1c3BlbnNpb25zU3RhcnRlZAAGBHxUaGUgcGFsbGV0IGVuYWJsZWQgc3VzcGVuc2lvbnMuQFN1c3BlbnNpb25zRW5kZWQABwSAVGhlIHBhbGxldCBkaXNhYmxlZCBzdXNwZW5zaW9ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQpBwxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBRFdmVudAQEVAABGHhBbGxBdHRlc3RhdGlvbkFsbG93YW5jZUNsZWFyZWQEASB2ZXJpZmllcgQBMFQ6OkFjY291bnRJZAAABPBBbGwgYXR0ZXN0YXRpb24gYWxsb3dhbmNlIGhhcyBiZWVuIHJlbW92ZWQgZm9yIHRoZSB2ZXJpZmllci50QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEUY291bnQ4AQx1MzIAAQQtAUF0dGVzdGF0aW9uIGFsbG93YW5jZSB3YXMgaW5jcmVhc2VkIGZvciBhbiBhY2NvdW50IGJ5IGBjb3VudGAgYXR0ZXN0YXRpb25zLjhQZXJzb25BdHRlc3RlZAgBJGNhbmRpZGF0ZQQBMFQ6OkFjY291bnRJZAABIHZlcmlmaWVyBAEwVDo6QWNjb3VudElkAAIE1EEgbmV3IGxpdGUgcGVyc29uIHdhcyByZWdpc3RlcmVkIHRocm91Z2ggYXR0ZXN0YXRpb24uSENvbnN1bWVyUmVnaXN0ZXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQAAwSsQSBsaXRlIHBlcnNvbiB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNvbnN1bWVyLjxBbGlhc0FjY291bnRTZXQIARRhbGlhc0kDATxDb250ZXh0dWFsQWxpYXMAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAQEvEFuIGFsaWFzLXRvLWFjY291bnQgbWFwcGluZyB3YXMgc2V0IG9yIHVwZGF0ZWQuREFsaWFzQWNjb3VudFVuc2V0CAEUYWxpYXNJAwE8Q29udGV4dHVhbEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAFBKBBbiBhbGlhcy10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0LQcMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMYcGFsbGV0FEV2ZW50BARUAAE4QFBlcnNvblJlZ2lzdGVyZWQIARRhbGlhcwgBFEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAABJhBIHBlcnNvbiBoYXMgcmVnaXN0ZXJlZCBhcyBhIGNvbnN1bWVyLlBMaXRlUGVyc29uUmVnaXN0ZXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQAAQSsQSBsaXRlIHBlcnNvbiBoYXMgcmVnaXN0ZXJlZCBhcyBhIGNvbnN1bWVyLmRGcmllbmRSZXF1ZXN0U3RtdFVzYWdlU2V0EAEUYWxpYXMIARRBbGlhcwABGHBlcmlvZDgBDHUzMgABDHNlcQwBCHU4AAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAACBAEBRnJpZW5kIHJlcXVlc3Qgc3RhdGVtZW50IHVzYWdlIGhhcyBiZWVuIGFzc2lnbmVkIGZvciBhIHNlcXVlbmNlLnRGcmllbmRSZXF1ZXN0U3RtdFVzYWdlUmVtb3ZlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQAAwTARnJpZW5kIHJlcXVlc3Qgc3RhdGVtZW50IHVzYWdlIGhhcyBiZWVuIHJlbW92ZWQuaFBlcnNvbkF1dGhvcml6YXRpb25Ub3VjaGVkBAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBJRBIHBlcnNvbidzIGF1dGhvcml6YXRpb24gd2FzIHRvdWNoZWQuhEV4cGlyZWRVc2VybmFtZVJlc2VydmF0aW9uUmVtb3ZlZAgBIHVzZXJuYW1lQQQBIFVzZXJuYW1lAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAFBLBBbiBleHBpcmVkIHVzZXJuYW1lIHJlc2VydmF0aW9uIHdhcyByZW1vdmVkLlBJZGVudGlmaWVyS2V5VXBkYXRlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQABgSgQSBjb25zdW1lcidzIGlkZW50aWZpZXIga2V5IHdhcyB1cGRhdGVkLnhVc2VybmFtZVJlc2VydmF0aW9uRHVyYXRpb25TZXQEASBkdXJhdGlvbigBDHU2NAAHBKhUaGUgdXNlcm5hbWUgcmVzZXJ2YXRpb24gZHVyYXRpb24gd2FzIHNldC5UU3RtdFN0b3JlQWxsb3dhbmNlU2V0EAEUYWxpYXMIARRBbGlhcwABGHBlcmlvZDgBDHUzMgABDHNlcTgBDHUzMgABHGFjY291bnQEATBUOjpBY2NvdW50SWQACATMQW4gYW5vbnltb3VzIHN0YXRlbWVudCBzdG9yZSBhbGxvd2FuY2Ugd2FzIGdyYW50ZWQuaFN0bXRTdG9yZUFsbG93YW5jZXNDbGVhcmVkDAEYcGVyaW9kOAEMdTMyAAEkZmlyc3Rfa2V5CAEUQWxpYXMAARRjb3VudDgBDHUzMgAJBMxFeHBpcmVkIHN0YXRlbWVudCBzdG9yZSBhbGxvd2FuY2VzIHdlcmUgY2xlYW5lZCB1cC40UGVyc29uRGVtb3RlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQACgTcQSBmdWxsIHBlcnNvbiB3YXMgZGVtb3RlZCBkdWUgdG8gZXhwaXJlZCBhdXRob3JpemF0aW9uLlhMb25nVGVybVN0b3JhZ2VDbGFpbWVkFAEUYWxpYXMIARRBbGlhcwABGHBlcmlvZDgBDHUzMgABHGNvdW50ZXIMAQh1OAABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAShjb2xsZWN0aW9uYQMBUE1lbWJlcnNoaXBDb2xsZWN0aW9uAAsEyExvbmctdGVybSBzdG9yYWdlIGhhcyBiZWVuIGNsYWltZWQgZm9yIGFuIGFjY291bnQufExvbmdUZXJtU3RvcmFnZUFsbG9jYXRpb25GYWlsZWQUARRhbGlhcwgBFEFsaWFzAAEYcGVyaW9kOAEMdTMyAAEcY291bnRlcgwBCHU4AAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABKGNvbGxlY3Rpb25hAwFQTWVtYmVyc2hpcENvbGxlY3Rpb24ADAhZAUEgbG9uZy10ZXJtIHN0b3JhZ2UgY2xhaW0gd2FzIGFjY2VwdGVkIGJ1dCB0aGUgZG93bnN0cmVhbSBhbGxvY2F0aW9uIGZhaWxlZC4gVGhlIGFsaWFzlGlzIHN0aWxsIG1hcmtlZCBzcGVudCBmb3IgdGhlIHBlcmlvZC50TG9uZ1Rlcm1TdG9yYWdlQWxpYXNlc0NsZWFyZWQIARhwZXJpb2Q4AQx1MzIAARRjb3VudDgBDHUzMgANBAUBRXhwaXJlZCBsb25nLXRlcm0gc3RvcmFnZSBhbGlhc2VzIGhhdmUgYmVlbiBjbGVhcmVkIGZvciBhIHBlcmlvZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQxBwxsaW5kaXZfcGFsbGV0X2NodW5rc19tYW5hZ2VyGHBhbGxldBRFdmVudAQEVAABCGhDaHVua1BhZ2VIYXNoZXNJbml0aWFsaXplZAgBNHJpbmdfZXhwb25lbnT9BAEwUmluZ0V4cG9uZW50AAEsdG90YWxfcGFnZXM4AQx1MzIAAAQZAUEgbmV3IGNodW5rIHBhZ2UgaGFzaCBzZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKGUuZy4sIGR1cmluZyBnZW5lc2lzKS4sQ2h1bmtzQWRkZWQMATRyaW5nX2V4cG9uZW50/QQBMFJpbmdFeHBvbmVudAABLHN0YXJ0X2luZGV4OAEMdTMyAAEUY291bnQ4AQx1MzIAAQQhAU5ldyBjaHVua3MgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byBhbiBleGlzdGluZyBvciBuZXcgY2h1bmsgc2V0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldDUHDFBpbmRpdl9wYWxsZXRfbWVtYmVycxhwYWxsZXQURXZlbnQEBFQAASgsTWVtYmVyQWRkZWQEAQxrZXkIASxNZW1iZXJPZjxUPgAABOhBbiBlbnRpdHkgaGFzIGhhZCB0aGVpciBtZW1iZXJzaGlwIHJlY29nbmlzZWQgYW5kIGluZGV4ZWQuNE1lbWJlclJlbW92ZWQEAQxrZXkIASxNZW1iZXJPZjxUPgABBKxBbiBlbnRpdHkgaGFzIGhhZCB0aGVpciBtZW1iZXJzaGlwIHJldm9rZWQubENvbGxlY3Rpb25NYXJrZWRGb3JEZWxldGlvbgQBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAIEqEEgY29sbGVjdGlvbiBoYXMgYmVlbiBtYXJrZWQgZm9yIGRlbGV0aW9uLkRDb2xsZWN0aW9uRGVsZXRlZAQBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAMEkEEgY29sbGVjdGlvbiBoYXMgYmVlbiBmdWxseSBkZWxldGVkLiRSaW5nQnVpbHQIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgABARYQSByaW5nIHJvb3Qgd2FzIGJ1aWx0LkBNZW1iZXJzT25ib2FyZGVkBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIABQRcTWVtYmVycyB3ZXJlIG9uYm9hcmRlZC4sUmluZ3NNZXJnZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABPGJhc2VfcmluZ19pbmRleDgBJFJpbmdJbmRleAABRHRhcmdldF9yaW5nX2luZGV4OAEkUmluZ0luZGV4AAYEWFR3byByaW5ncyB3ZXJlIG1lcmdlZC5ET25ib2FyZGluZ1NpemVTZXQIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABPG9uYm9hcmRpbmdfc2l6ZTgBDHUzMgAHBLRUaGUgb25ib2FyZGluZyBzaXplIHdhcyBzZXQgZm9yIGEgY29sbGVjdGlvbi5ITWVtYmVyU2VsZkluY2x1ZGVkCAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAQxrZXkIASxNZW1iZXJPZjxUPgAIBIxBIG1lbWJlciBzZWxmLWluY2x1ZGVkIGludG8gYSByaW5nLkBPbGRSb290Q2xlYW5lZFVwDAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAShyaW5nX2luZGV4OAEkUmluZ0luZGV4AAEgcmV2aXNpb244AQx1MzIACQSkQW4gb2xkIHJvb3QgcmV2aXNpb24gaGFzIGJlZW4gY2xlYW5lZCB1cC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQ5BwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0FEV2ZW50BARUAAFcJENvaW5TcGxpdAQBMG91dHB1dF9jb3VudDgBDHUzMgAAADxDb2luVHJhbnNmZXJyZWQMAQh0bwQBMFQ6OkFjY291bnRJZAABFHZhbHVldQMBJENvaW5WYWx1ZQABHG5ld19hZ2UtAwEMdTE2AAEAWFJlY3ljbGVyTG9hZGVkV2l0aENvaW4EARR2YWx1ZXUDASRDb2luVmFsdWUAAgB8UmVjeWNsZXJMb2FkZWRXaXRoRXh0ZXJuYWxBc3NldAwBDHdobwQBMFQ6OkFjY291bnRJZAABFHZhbHVldQMBJENvaW5WYWx1ZQABGGFtb3VudMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgADAGBSZWN5Y2xlclVubG9hZGVkSW50b0NvaW4QAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X3ZhbHVldQMBJENvaW5WYWx1ZQABMG91dHB1dF92YWx1ZXUDASRDb2luVmFsdWUAASxpbnB1dF9jb3VudDgBDHUzMgAEAIRSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXQQAQh0bwQBMFQ6OkFjY291bnRJZAABFHZhbHVldQMBJENvaW5WYWx1ZQABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAUAsFJlY3ljbGVyVW5sb2FkZWRJbnRvRXh0ZXJuYWxBc3NldEFuZFZvdWNoZXJzFAEIdG8EATBUOjpBY2NvdW50SWQAARR2YWx1ZXUDASRDb2luVmFsdWUAASxpbnB1dF9jb3VudDgBDHUzMgABVGV4dGVybmFsX2Fzc2V0X2Ftb3VudMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgABNHZvdWNoZXJfY291bnQ4AQx1MzIABgCEUGFpZFVubG9hZFRva2VuUmVnaXN0ZXJlZFdpdGhDb2luCAEMZmVlxAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAEkZGVzdHJveWVkxAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAcAjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoTmF0aXZlCAEMd2hvBAEwVDo6QWNjb3VudElkAAEMZmVlxAFITmF0aXZlQmFsYW5jZU9mPFQ+AAgAjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoU3RhYmxlCAEMd2hvBAEwVDo6QWNjb3VudElkAAEMZmVlxAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAkAdFBlb3BsZUZyZWVVbmxvYWRUb2tlbkNvbnN1bWVkBAEYcGVyaW9kOAEYUGVyaW9kAAoAhExpdGVQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAQBGHBlcmlvZDgBGFBlcmlvZAALAGRSZWN5Y2xlcnNVbmxvYWRlZEludG9Db2luDAEIdG8EATBUOjpBY2NvdW50SWQAATBvdXRwdXRfdmFsdWV1AwEkQ29pblZhbHVlAAEsaW5wdXRfY291bnQ4AQx1MzIADACIUmVjeWNsZXJzVW5sb2FkZWRJbnRvRXh0ZXJuYWxBc3NldAwBCHRvBAEwVDo6QWNjb3VudElkAAEsaW5wdXRfY291bnQ4AQx1MzIAARhhbW91bnTEAVRGdW5naWJsZXNCYWxhbmNlT2Y8VD4ADQC4UmVjeWNsZXJzVW5sb2FkZWRJbnRvRXh0ZXJuYWxBc3NldE5vbkFub255bW91cxQBDHdobwQBMFQ6OkFjY291bnRJZAABCHRvBAEwVDo6QWNjb3VudElkAAEsaW5wdXRfY291bnQ4AQx1MzIAARhhbW91bnTEAVRGdW5naWJsZXNCYWxhbmNlT2Y8VD4AATBmZWVfY3VycmVuY3k9BQEsRmVlQ3VycmVuY3kADgBkUmVjeWNsZXJVbmxvYWRlZEludG9Db2lucwQBMG91dHB1dF9jb3VudDgBDHUzMgAPAHxDb2luT2ZmYm9hcmRlZEludG9FeHRlcm5hbEFzc2V0DAEIdG8EATBUOjpBY2NvdW50SWQAARR2YWx1ZXUDASRDb2luVmFsdWUAARhhbW91bnTEAVRGdW5naWJsZXNCYWxhbmNlT2Y8VD4AEAA8UmVjeWNsZXJDbGVhbmVkDAEUdmFsdWV1AwEkQ29pblZhbHVlAAE8cmVtYWluaW5nX2NvaW5zOAEMdTMyAAFAZGVzdHJveWVkX2Ftb3VudMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgARAGRDb25zdW1lZEZyZWVUb2tlbnNDbGVhbmVkBAEYcGVyaW9kOAEYUGVyaW9kABIAaFBhaWRVbmxvYWRUb2tlblJpbmdDbGVhbmVkCAEYcGVyaW9kOAEYUGVyaW9kAAEocmluZ19pbmRleDgBJFJpbmdJbmRleAATAExSZWN5Y2xlckR1c3RDbGVhbmVkABQAaFBhaWRVbmxvYWRUb2tlbkR1c3RDbGVhbmVkABUAnEV4cGlyZWRQYWlkVW5sb2FkVG9rZW5Db2xsZWN0aW9uRGVsZXRlZAQBGHBlcmlvZDgBGFBlcmlvZAAWAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldD0HDHRpbmRpdl9wYWxsZXRfbWVtYmVyc19ub3RpZmllchhwYWxsZXQURXZlbnQEBFQAARgoU3Vic2NyaWJlZAQBHHBhcmFfaWScARhQYXJhSWQAAARcQSBwYXJhY2hhaW4gc3Vic2NyaWJlZC4wVW5zdWJzY3JpYmVkBAEccGFyYV9pZJwBGFBhcmFJZAABBGRBIHBhcmFjaGFpbiB1bnN1YnNjcmliZWQuLFVwZGF0ZXNTZW50CAEccGFyYV9pZJwBGFBhcmFJZAABMHVwZGF0ZV9jb3VudDgBDHUzMgACBIBVcGRhdGUgYmF0Y2ggc2VudCB0byBzdWJzY3JpYmVyLkBVcGRhdGVTZW5kRmFpbGVkBAEccGFyYV9pZJwBGFBhcmFJZAADBMRTZW5kaW5nIHJpbmcgcm9vdCB1cGRhdGVzIHRvIGEgc3Vic2NyaWJlciBmYWlsZWQuPFJlcGxheVJlcXVlc3RlZAwBHHBhcmFfaWScARhQYXJhSWQAAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABNGluZGljZXNfY291bnQ4AQx1MzIABAS8UmVwbGF5IG9mIHJpbmcgcm9vdHMgcmVxdWVzdGVkIGJ5IGEgc3Vic2NyaWJlci44QmF0Y2hBYmFuZG9uZWQEASBzZXF1ZW5jZSgBOFNlcXVlbmNlTnVtYmVyAAUEzEEgc3R1Y2sgYmF0Y2ggd2FzIGFiYW5kb25lZCBieSB0aGUgb2ZmY2hhaW4gd29ya2VyLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldEEHDIxpbmRpdl9wYWxsZXRfc3RvcmFnZV9pbml0aWFsaXphdGlvbhhwYWxsZXQURXZlbnQEBFQAAUgwQXNzZXRDcmVhdGVkAAAE0FRoZSBmb3JlaWduIGFzc2V0IHdhcyBjcmVhdGVkIGFuZCByZXNlcnZlcyB3ZXJlIHNldC5QWGNtRnVuZHNUcmFuc2ZlclNlbnQAAQSwQW4gWENNIGZ1bmRzIHRyYW5zZmVyIHdhcyBzZW50IHRvIEFzc2V0IEh1Yi5gWGNtRnVuZHNUcmFuc2ZlclRpbWVkT3V0AAIEvFRoZSBYQ00gdHJhbnNmZXIgdGltZWQgb3V0IGFuZCB3aWxsIGJlIHJldHJpZWQuNEZ1bmRzVmVyaWZpZWQAAwSUVHJhbnNmZXJyZWQgZnVuZHMgaGF2ZSBiZWVuIHZlcmlmaWVkLihQb3RzRnVuZGVkAAQEaEFsbCBwb3RzIGhhdmUgYmVlbiBmdW5kZWQuXE1vYlJ1bGVQYXlvdXRzU2NoZWR1bGVkAAUEmE1vYiBSdWxlIHBheW91dCBzY2hlZHVsZSBoYXMgYmVlbiBzZXQuVFNjb3JlUGF5b3V0c1NjaGVkdWxlZAAGBIxTY29yZSBwYXlvdXQgc2NoZWR1bGUgaGFzIGJlZW4gc2V0LkRBaXJkcm9wUG9vbE9wZW5lZAQBHHBvb2xfaWQ4AYRpbmRpdl9wYWxsZXRfYWlyZHJvcDo6UHJpemVQb29sSWQABwT8QW4gYWlyZHJvcCBwcml6ZSBwb29sIGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgb25fcG9sbCBzY2hlZHVsZXIufEFpcmRyb3BTY2hlZHVsaW5nRW5hYmxlZENoYW5nZWQEARxlbmFibGVkyAEQYm9vbAAIBEEBQWlyZHJvcCBzY2hlZHVsaW5nIHdhcyBlbmFibGVkIG9yIGRpc2FibGVkIHZpYSBgc2V0X2FpcmRyb3Bfc2NoZWR1bGluZ19lbmFibGVkYC50T25Qb2xsSW5pdGlhbGl6YXRpb25Db21wbGV0ZWQACQwpAVRoZSBvbmUtdGltZSBvbl9wb2xsIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQuIFJlY3VycmluZyBhaXJkcm9wIHByaXpl/HBvb2wgb3BlbmluZyBjb250aW51ZXMgYWZ0ZXJ3YXJkIGluIGBPcGVuaW5nQWlyZHJvcFBvb2xzYCB3aGlsZZRgQWlyZHJvcFNjaGVkdWxpbmdFbmFibGVkYCBpcyBgdHJ1ZWAuZE1pZ3JhdGlvblBlb3BsZVJlY29nbml6ZWQACgS8TWlncmF0aW9uOiBpbml0aWFsIHBlb3BsZSBoYXZlIGJlZW4gcmVjb2duaXplZC5oTWlncmF0aW9uT25ib2FyZGluZ1NpemVTZXQACwSgTWlncmF0aW9uOiBvbmJvYXJkaW5nIHNpemUgaGFzIGJlZW4gc2V0LnhNaWdyYXRpb25Qcm9vZk9mSW5rSW5pdGlhbGl6ZWQADATQTWlncmF0aW9uOiBQcm9vZi1vZi1JbmsgcGFsbGV0IGhhcyBiZWVuIGluaXRpYWxpemVkLlxNaWdyYXRpb25HYW1lc1NjaGVkdWxlZAANBJRNaWdyYXRpb246IGdhbWVzIGhhdmUgYmVlbiBzY2hlZHVsZWQuXE1pZ3JhdGlvbkludml0ZXNHcmFudGVkAA4ElE1pZ3JhdGlvbjogaW52aXRlcyBoYXZlIGJlZW4gZ3JhbnRlZC58TWlncmF0aW9uUmVpbWJ1cnNlbWVudFZhbHVlc1NldAAPBOxNaWdyYXRpb246IFByb29mLW9mLUluayByZWltYnVyc2VtZW50IHZhbHVlcyBoYXZlIGJlZW4gc2V0LoRNaWdyYXRpb25BdHRlc3RhdGlvbkFsbG93YW5jZXNTZXQAEATwTWlncmF0aW9uOiBQZW9wbGUgTGl0ZSBhdHRlc3RhdGlvbiBhbGxvd2FuY2VzIGhhdmUgYmVlbiBzZXQuSE1pZ3JhdGlvbkNvbXBsZXRlZAARBBkBTWlncmF0aW9uIGhhcyBjb21wbGV0ZWQgYW5kIG9uX3BvbGwgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldEUHDKBpbmRpdl9wYWxsZXRfc3RvcmFnZV9pbml0aWFsaXphdGlvbl9saXRlGHBhbGxldBRFdmVudAQEVAABBFxJbml0aWFsaXphdGlvbkNvbXBsZXRlZAAABBEBQXR0ZXN0YXRpb24gYWxsb3dhbmNlcyBoYXZlIGJlZW4gc2V0IGFuZCBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRJBwxQaW5kaXZfcGFsbGV0X2FpcmRyb3AYcGFsbGV0FEV2ZW50BARUAAEYPFByaXplUG9vbE9wZW5lZBwBCGlkOAEsUHJpemVQb29sSWQAAShkaXNwYXRjaGVyBAEwVDo6QWNjb3VudElkAAEYdGFyZ2V0ZQUBLFByaXplVGFyZ2V0AAEgYXNzZXRfaWTgATBBc3NldElkT2Y8VD4AAShudW1fcHJpemVzOAEMdTMyAAEscHJpemVfdmFsdWXEAURBc3NldEJhbGFuY2VPZjxUPgABKGV4cGlyZXNfYXQoAQx1NjQAAARgQSBwcml6ZSBwb29sIHdhcyBvcGVuZWQuMFByaXplQ2xhaW1lZBQBHHBvb2xfaWQ4ASxQcml6ZVBvb2xJZAABIGNsYWltYW50HQcBdEFjY291bnRPclBlcnNvbjxUOjpBY2NvdW50SWQ+AAEsYmVuZWZpY2lhcnkEATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABMEFzc2V0SWRPZjxUPgABGGFtb3VudMQBREFzc2V0QmFsYW5jZU9mPFQ+AAEUGQFBIHByaXplIHdhcyBjbGFpbWVkIGZyb20gYSBwcml6ZSBwb29sLiBgY2xhaW1hbnRgIGlzIHRoZSBpZGVudGl0eSB0aGF0BQFzYXRpc2ZpZWQgdGhlIHBvb2wncyBlbGlnaWJpbGl0eSBwcmVkaWNhdGUg4oCUIGEgUGVyc29uIGFsaWFzIGZvcuxbYENhbGw6OmNsYWltX3ByaXplYF0gKHZlcmlmaWVkLXBlb3BsZSBwb29scyksIGFuZCB3aGF0ZXZlcg0BYEFjY291bnRPclBlcnNvbmAgdGhlIGdhbWUgcGFsbGV0IHN1cHBsaWVkIGZvciBnYW1lLXBvb2wgY2xhaW1zIHZpYYRbYEFpcmRyb3BBcGk6OmNsYWltX2dhbWVfcHJpemVgXS5AQWxsUHJpemVzQ2xhaW1lZAgBCGlkOAEsUHJpemVQb29sSWQAASBhc3NldF9pZOABMEFzc2V0SWRPZjxUPgACDBkBQSBwcml6ZSBwb29sIGRlbGl2ZXJlZCBpdHMgbGFzdCBwcml6ZS4gVGhlIHBvb2wgc3RheXMgaW4gc3RvcmFnZSB1bnRpbCEBYGV4cGlyZXNfYXRgIHNvIGBQcml6ZVBvb2xDbGFpbXNgIGtlZXBzIHRoZSByZXBsYXkgd2luZG93OyBmdXJ0aGVyIGNsYWltsGF0dGVtcHRzIHJldHVybiBgRXJyb3I6OlByaXplUG9vbEV4aGF1c3RlZGAuQFByaXplUG9vbEV4cGlyZWQMAQhpZDgBLFByaXplUG9vbElkAAEgYXNzZXRfaWTgATBBc3NldElkT2Y8VD4AASByZWZ1bmRlZMQBREFzc2V0QmFsYW5jZU9mPFQ+AAMIPQFBIHByaXplIHBvb2wgcmVhY2hlZCBgZXhwaXJlc19hdGAgYW5kIHdhcyBjbGVhbmVkIHVwOyByZW1haW5pbmcgaGVsZCBmdW5kcyB3ZXJlJHJlbGVhc2VkLjxQcml6ZVBvb2xDbG9zZWQMAQhpZDgBLFByaXplUG9vbElkAAEgYXNzZXRfaWTgATBBc3NldElkT2Y8VD4AASByZWZ1bmRlZMQBREFzc2V0QmFsYW5jZU9mPFQ+AAQIUQFBIHByaXplIHBvb2wgd2FzIGNsb3NlZCBlYXJseSBieSBpdHMgZGlzcGF0Y2hlciAob3IgYE1hbmFnZXJPcmlnaW5gKTsgcmVtYWluaW5nIGhlbGRQZnVuZHMgd2VyZSByZWxlYXNlZC5MUHJpemVUcmFuc2ZlckZhaWxlZBABHHBvb2xfaWQ4ASxQcml6ZVBvb2xJZAABLGJlbmVmaWNpYXJ5BAEwVDo6QWNjb3VudElkAAEgYXNzZXRfaWTgATBBc3NldElkT2Y8VD4AARhhbW91bnTEAURBc3NldEJhbGFuY2VPZjxUPgAFFCkBVGhlIHNsb3Qgd2FzIGF3YXJkZWQgYnV0IHRoZSBpbW1lZGlhdGUgcGF5b3V0IHRyYW5zZmVyIGZhaWxlZCAoZS5nLiBkdXN0ZWQtAWJlbmVmaWNpYXJ5KS4gVGhlIHJlbGVhc2UrdHJhbnNmZXIgd2FzIHJvbGxlZCBiYWNrIHNvIHRoZSBmdW5kcyByZW1haW4gaGVsZCkBb24gdGhlIHBvdCwgYnV0IGBQcml6ZVBvb2xDbGFpbXNgIGFuZCBgcHJpemVzX3JlbWFpbmluZ2Agc3RpbGwgcmVmbGVjdCB0aGUtAWNsYWltIOKAlCB0aGUgc2xvdCBpcyBjb25zdW1lZCB3aXRob3V0IGEgcmVjb3ZlcnkgcGF0aC4gRW1pdHRlZCBpbiBhZGRpdGlvbkh0byBgUHJpemVDbGFpbWVkYC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRNBwxEcGFsbGV0X21pZ3JhdGlvbnMYcGFsbGV0FEV2ZW50BARUAAEgOFVwZ3JhZGVTdGFydGVkBAEobWlncmF0aW9uczgBDHUzMhDQVGhlIG51bWJlciBvZiBtaWdyYXRpb25zIHRoYXQgdGhpcyB1cGdyYWRlIGNvbnRhaW5zLgBBAVRoaXMgY2FuIGJlIHVzZWQgdG8gZGVzaWduIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yIGluIGNvbWJpbmF0aW9uIHdpdGggY291bnRpbmcgdGhlzGBNaWdyYXRpb25Db21wbGV0ZWRgIGFuZCBgTWlncmF0aW9uU2tpcHBlZGAgZXZlbnRzLgAMaEEgUnVudGltZSB1cGdyYWRlIHN0YXJ0ZWQuAPhJdHMgZW5kIGlzIGluZGljYXRlZCBieSBgVXBncmFkZUNvbXBsZXRlZGAgb3IgYFVwZ3JhZGVGYWlsZWRgLkBVcGdyYWRlQ29tcGxldGVkAAEMmFRoZSBjdXJyZW50IHJ1bnRpbWUgdXBncmFkZSBjb21wbGV0ZWQuAB0BVGhpcyBpbXBsaWVzIHRoYXQgYWxsIG9mIGl0cyBtaWdyYXRpb25zIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYXMgd2VsbC40VXBncmFkZUZhaWxlZAACDFxSdW50aW1lIHVwZ3JhZGUgZmFpbGVkLgDoVGhpcyBpcyB2ZXJ5IGJhZCBhbmQgd2lsbCByZXF1aXJlIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uLkBNaWdyYXRpb25Ta2lwcGVkBAEUaW5kZXg4AQx1MzIEKQFUaGUgaW5kZXggb2YgdGhlIHNraXBwZWQgbWlncmF0aW9uIHdpdGhpbiB0aGUgW2BDb25maWc6Ok1pZ3JhdGlvbnNgXSBsaXN0LgMECQFBIG1pZ3JhdGlvbiB3YXMgc2tpcHBlZCBzaW5jZSBpdCB3YXMgYWxyZWFkeSBleGVjdXRlZCBpbiB0aGUgcGFzdC5ETWlncmF0aW9uQWR2YW5jZWQIARRpbmRleDgBDHUzMgQJAVRoZSBpbmRleCBvZiB0aGUgbWlncmF0aW9uIHdpdGhpbiB0aGUgW2BDb25maWc6Ok1pZ3JhdGlvbnNgXSBsaXN0LgEQdG9vazgBREJsb2NrTnVtYmVyRm9yPFQ+BNRUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHRoaXMgbWlncmF0aW9uIHRvb2sgc28gZmFyLgQEXEEgbWlncmF0aW9uIHByb2dyZXNzZWQuSE1pZ3JhdGlvbkNvbXBsZXRlZAgBFGluZGV4OAEMdTMyBAkBVGhlIGluZGV4IG9mIHRoZSBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuARB0b29rOAFEQmxvY2tOdW1iZXJGb3I8VD4E1FRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgdGhpcyBtaWdyYXRpb24gdG9vayBzbyBmYXIuBQRYQSBNaWdyYXRpb24gY29tcGxldGVkLjxNaWdyYXRpb25GYWlsZWQIARRpbmRleDgBDHUzMgQJAVRoZSBpbmRleCBvZiB0aGUgbWlncmF0aW9uIHdpdGhpbiB0aGUgW2BDb25maWc6Ok1pZ3JhdGlvbnNgXSBsaXN0LgEQdG9vazgBREJsb2NrTnVtYmVyRm9yPFQ+BNRUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHRoaXMgbWlncmF0aW9uIHRvb2sgc28gZmFyLgYMTEEgTWlncmF0aW9uIGZhaWxlZC4ATQFUaGlzIGltcGxpZXMgdGhhdCB0aGUgd2hvbGUgdXBncmFkZSBmYWlsZWQgYW5kIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHJlcXVpcmVkLjxIaXN0b3JpY0NsZWFyZWQEASxuZXh0X2N1cnNvcpEFATxPcHRpb248VmVjPHU4Pj4E6FNob3VsZCBiZSBwYXNzZWQgdG8gYGNsZWFyX2hpc3RvcmljYCBpbiBhIHN1Y2Nlc3NpdmUgY2FsbC4HBMhUaGUgc2V0IG9mIGhpc3RvcmljYWwgbWlncmF0aW9ucyBoYXMgYmVlbiBjbGVhcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFEHCDBmcmFtZV9zeXN0ZW0UUGhhc2UAAQw4QXBwbHlFeHRyaW5zaWMEADgBDHUzMgAAADBGaW5hbGl6YXRpb24AAQA4SW5pdGlhbGl6YXRpb24AAgAAVQcAAAI8AFkHAAACXQcAXQcAAAQIODgAYQcIMGZyYW1lX3N5c3RlbVhMYXN0UnVudGltZVVwZ3JhZGVJbmZvAAAIATBzcGVjX3ZlcnNpb25gAUxjb2RlYzo6Q29tcGFjdDx1MzI+AAEkc3BlY19uYW1lZQcBRENvdzwnc3RhdGljLCBzdHI+AABlBwQMQ293BARUAWkHAAQAaQcAAABpBwAABQIAbQcIMGZyYW1lX3N5c3RlbWBDb2RlVXBncmFkZUF1dGhvcml6YXRpb24EBFQAAAgBJGNvZGVfaGFzaDwBHFQ6Okhhc2gAATRjaGVja192ZXJzaW9uyAEQYm9vbAAAcQcMMGZyYW1lX3N5c3RlbRhsaW1pdHMwQmxvY2tXZWlnaHRzAAAMAShiYXNlX2Jsb2Nr1QEBGFdlaWdodAABJG1heF9ibG9ja9UBARhXZWlnaHQAASRwZXJfY2xhc3N1BwGEUGVyRGlzcGF0Y2hDbGFzczxXZWlnaHRzUGVyQ2xhc3M+AAB1Bww0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUAXkHAAwBGG5vcm1hbHkHAQRUAAEsb3BlcmF0aW9uYWx5BwEEVAABJG1hbmRhdG9yeXkHAQRUAAB5BwwwZnJhbWVfc3lzdGVtGGxpbWl0czxXZWlnaHRzUGVyQ2xhc3MAABABOGJhc2VfZXh0cmluc2lj1QEBGFdlaWdodAABNG1heF9leHRyaW5zaWOlAgE4T3B0aW9uPFdlaWdodD4AASRtYXhfdG90YWylAgE4T3B0aW9uPFdlaWdodD4AASByZXNlcnZlZKUCAThPcHRpb248V2VpZ2h0PgAAfQcMMGZyYW1lX3N5c3RlbRhsaW1pdHMsQmxvY2tMZW5ndGgAAAgBDG1heIEHAVRQZXJEaXNwYXRjaENsYXNzPHUzMj4AATxtYXhfaGVhZGVyX3NpemUJAwEsT3B0aW9uPHUzMj4AAIEHDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQBOAAMARhub3JtYWw4AQRUAAEsb3BlcmF0aW9uYWw4AQRUAAEkbWFuZGF0b3J5OAEEVAAAhQcIKHNwX3dlaWdodHM8UnVudGltZURiV2VpZ2h0AAAIARByZWFkKAEMdTY0AAEUd3JpdGUoAQx1NjQAAIkHCChzcF92ZXJzaW9uOFJ1bnRpbWVWZXJzaW9uAAAgASRzcGVjX25hbWVlBwFEQ293PCdzdGF0aWMsIHN0cj4AASRpbXBsX25hbWVlBwFEQ293PCdzdGF0aWMsIHN0cj4AAURhdXRob3JpbmdfdmVyc2lvbjgBDHUzMgABMHNwZWNfdmVyc2lvbjgBDHUzMgABMGltcGxfdmVyc2lvbjgBDHUzMgABEGFwaXONBwEcQXBpc1ZlYwABTHRyYW5zYWN0aW9uX3ZlcnNpb244AQx1MzIAAThzeXN0ZW1fdmVyc2lvbgwBCHU4AACNBwQMQ293BARUAZEHAAQAkQcAAACRBwAAApUHAJUHAAAECL0BOACZBwwwZnJhbWVfc3lzdGVtGHBhbGxldBRFcnJvcgQEVAABJDxJbnZhbGlkU3BlY05hbWUAAAgRAVRoZSBuYW1lIG9mIHNwZWNpZmljYXRpb24gZG9lcyBub3QgbWF0Y2ggYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUuaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAAEIQQFUaGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGlzIG5vdCBhbGxvd2VkIHRvIGRlY3JlYXNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLnRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgACDOxGYWlsZWQgdG8gZXh0cmFjdCB0aGUgcnVudGltZSB2ZXJzaW9uIGZyb20gdGhlIG5ldyBydW50aW1lLgAJAUVpdGhlciBjYWxsaW5nIGBDb3JlX3ZlcnNpb25gIG9yIGRlY29kaW5nIGBSdW50aW1lVmVyc2lvbmAgZmFpbGVkLkxOb25EZWZhdWx0Q29tcG9zaXRlAAME/FN1aWNpZGUgY2FsbGVkIHdoZW4gdGhlIGFjY291bnQgaGFzIG5vbi1kZWZhdWx0IGNvbXBvc2l0ZSBkYXRhLjxOb25aZXJvUmVmQ291bnQABAQ1AVRoZXJlIGlzIGEgbm9uLXplcm8gcmVmZXJlbmNlIGNvdW50IHByZXZlbnRpbmcgdGhlIGFjY291bnQgZnJvbSBiZWluZyBwdXJnZWQuMENhbGxGaWx0ZXJlZAAFBNBUaGUgb3JpZ2luIGZpbHRlciBwcmV2ZW50IHRoZSBjYWxsIHRvIGJlIGRpc3BhdGNoZWQubE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwAGBFUBQSBtdWx0aS1ibG9jayBtaWdyYXRpb24gaXMgb25nb2luZyBhbmQgcHJldmVudHMgdGhlIGN1cnJlbnQgY29kZSBmcm9tIGJlaW5nIHJlcGxhY2VkLkROb3RoaW5nQXV0aG9yaXplZAAHBFhObyB1cGdyYWRlIGF1dGhvcml6ZWQuMFVuYXV0aG9yaXplZAAIBJRUaGUgc3VibWl0dGVkIGNvZGUgaXMgbm90IGF1dGhvcml6ZWQuBGxFcnJvciBmb3IgdGhlIFN5c3RlbSBwYWxsZXSdBwwoc3BfcnVudGltZRh0cmFpdHMsQmxha2VUd28yNTYAAAAAoQcQKHNwX3J1bnRpbWUcZ2VuZXJpYxRibG9jaxRCbG9jawgYSGVhZGVyAVwkRXh0cmluc2ljAaUHAAgBGGhlYWRlclwBGEhlYWRlcgABKGV4dHJpbnNpY3O1BwE4VmVjPEV4dHJpbnNpYz4AAKUHEChzcF9ydW50aW1lHGdlbmVyaWNMdW5jaGVja2VkX2V4dHJpbnNpY0hVbmNoZWNrZWRFeHRyaW5zaWMQHEFkZHJlc3MBABBDYWxsASAkU2lnbmF0dXJlATUEFEV4dHJhAakHAAQAGAAAAKkHCHRjdW11bHVzX3BhbGxldF93ZWlnaHRfcmVjbGFpbVBTdG9yYWdlV2VpZ2h0UmVjbGFpbQgEVAAEUwGtBwAEAK0HAQRTAACtBwAABCixBwUGCQYNBhEGFQYZBiEGJQYpBgCxBwAABCiVBZkFpQWxBb0FyQXVBeEF9QUBBgC1BwAAAqUHALkHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtMGJsb2NrX3dlaWdodDxCbG9ja1dlaWdodE1vZGUEBFQAAQwgRnVsbENvcmUEARxjb250ZXh0OAFEQmxvY2tOdW1iZXJGb3I8VD4AAABEUG90ZW50aWFsRnVsbENvcmUMARxjb250ZXh0OAFEQmxvY2tOdW1iZXJGb3I8VD4AAVxmaXJzdF90cmFuc2FjdGlvbl9pbmRleAkDASxPcHRpb248dTMyPgABNHRhcmdldF93ZWlnaHTVAQEYV2VpZ2h0AAEAOEZyYWN0aW9uT2ZDb3JlCAEcY29udGV4dDgBREJsb2NrTnVtYmVyRm9yPFQ+AAFcZmlyc3RfdHJhbnNhY3Rpb25faW5kZXgJAwEsT3B0aW9uPHUzMj4AAgAAvQcAAAYtAwDBBwAAAsUHAMUHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHVuaW5jbHVkZWRfc2VnbWVudCBBbmNlc3RvcgQESAE8AAwBOHVzZWRfYmFuZHdpZHRoyQcBNFVzZWRCYW5kd2lkdGgAAThwYXJhX2hlYWRfaGFzaN0HASRPcHRpb248SD4AAWBjb25zdW1lZF9nb19haGVhZF9zaWduYWzhBwGMT3B0aW9uPHJlbGF5X2NoYWluOjpVcGdyYWRlR29BaGVhZD4AAMkHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHVuaW5jbHVkZWRfc2VnbWVudDRVc2VkQmFuZHdpZHRoAAAMATR1bXBfbXNnX2NvdW50OAEMdTMyAAE8dW1wX3RvdGFsX2J5dGVzOAEMdTMyAAE0aHJtcF9vdXRnb2luZ80HAYxCVHJlZU1hcDxQYXJhSWQsIEhybXBDaGFubmVsVXBkYXRlPgAAzQcEIEJUcmVlTWFwCARLAZwEVgHRBwAEANUHAAAA0QcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IdW5pbmNsdWRlZF9zZWdtZW50REhybXBDaGFubmVsVXBkYXRlAAAIASRtc2dfY291bnQ4AQx1MzIAASx0b3RhbF9ieXRlczgBDHUzMgAA1QcAAALZBwDZBwAABAic0QcA3QcEGE9wdGlvbgQEVAE8AQgQTm9uZQAAABBTb21lBAA8AAABAADhBwQYT3B0aW9uBARUAeUHAQgQTm9uZQAAABBTb21lBADlBwAAAQAA5QcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjk4VXBncmFkZUdvQWhlYWQAAQgUQWJvcnQAAAAcR29BaGVhZAABAADpBwx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUh1bmluY2x1ZGVkX3NlZ21lbnQ4U2VnbWVudFRyYWNrZXIEBEgBPAAMATh1c2VkX2JhbmR3aWR0aMkHATRVc2VkQmFuZHdpZHRoAAE4aHJtcF93YXRlcm1hcmsJAwGAT3B0aW9uPHJlbGF5X2NoYWluOjpCbG9ja051bWJlcj4AAWBjb25zdW1lZF9nb19haGVhZF9zaWduYWzhBwGMT3B0aW9uPHJlbGF5X2NoYWluOjpVcGdyYWRlR29BaGVhZD4AAO0HBBhPcHRpb24EBFQB8QcBCBBOb25lAAAAEFNvbWUEAPEHAAABAADxBwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OUhVcGdyYWRlUmVzdHJpY3Rpb24AAQQcUHJlc2VudAAAAAD1Bwx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbVByZWxheV9zdGF0ZV9zbmFwc2hvdFhNZXNzYWdpbmdTdGF0ZVNuYXBzaG90AAAQATBkbXFfbXFjX2hlYWQ8AURyZWxheV9jaGFpbjo6SGFzaAABnHJlbGF5X2Rpc3BhdGNoX3F1ZXVlX3JlbWFpbmluZ19jYXBhY2l0efkHAYxSZWxheURpc3BhdGNoUXVldWVSZW1haW5pbmdDYXBhY2l0eQABQGluZ3Jlc3NfY2hhbm5lbHP9BwGIVmVjPChQYXJhSWQsIEFicmlkZ2VkSHJtcENoYW5uZWwpPgABPGVncmVzc19jaGFubmVsc/0HAYhWZWM8KFBhcmFJZCwgQWJyaWRnZWRIcm1wQ2hhbm5lbCk+AAD5Bwx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbVByZWxheV9zdGF0ZV9zbmFwc2hvdIxSZWxheURpc3BhdGNoUXVldWVSZW1haW5pbmdDYXBhY2l0eQAACAE8cmVtYWluaW5nX2NvdW50OAEMdTMyAAE4cmVtYWluaW5nX3NpemU4AQx1MzIAAP0HAAACAQgAAQgAAAQInAUIAAUIDExwb2xrYWRvdF9wcmltaXRpdmVzCHY5TEFicmlkZ2VkSHJtcENoYW5uZWwAABgBMG1heF9jYXBhY2l0eTgBDHUzMgABOG1heF90b3RhbF9zaXplOAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZTgBDHUzMgABJG1zZ19jb3VudDgBDHUzMgABKHRvdGFsX3NpemU4AQx1MzIAASBtcWNfaGVhZN0HATBPcHRpb248SGFzaD4AAAkIDExwb2xrYWRvdF9wcmltaXRpdmVzCHY5ZEFicmlkZ2VkSG9zdENvbmZpZ3VyYXRpb24AACgBNG1heF9jb2RlX3NpemU4AQx1MzIAAUhtYXhfaGVhZF9kYXRhX3NpemU4AQx1MzIAAVhtYXhfdXB3YXJkX3F1ZXVlX2NvdW50OAEMdTMyAAFUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplOAEMdTMyAAFcbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemU4AQx1MzIAAZBtYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGU4AQx1MzIAAYhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlOAEMdTMyAAFsdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duOAEsQmxvY2tOdW1iZXIAAWB2YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXk4ASxCbG9ja051bWJlcgABUGFzeW5jX2JhY2tpbmdfcGFyYW1zDQgBSEFzeW5jQmFja2luZ1BhcmFtcwAADQgQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjk0YXN5bmNfYmFja2luZ0hBc3luY0JhY2tpbmdQYXJhbXMAAAgBTG1heF9jYW5kaWRhdGVfZGVwdGg4AQx1MzIAAVBhbGxvd2VkX2FuY2VzdHJ5X2xlbjgBDHUzMgAAEQgIlGN1bXVsdXNfcHJpbWl0aXZlc19wYXJhY2hhaW5faW5oZXJlbnRETWVzc2FnZVF1ZXVlQ2hhaW4AAAQAPAEkUmVsYXlIYXNoAAAVCAQgQlRyZWVNYXAIBEsBnARWAREIAAQAGQgAAAAZCAAAAh0IAB0IAAAECJwRCAAhCAx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUhwYXJhY2hhaW5faW5oZXJlbnRASW5ib3VuZE1lc3NhZ2VJZAAACAEcc2VudF9hdDgBLEJsb2NrTnVtYmVyAAEscmV2ZXJzZV9pZHg4AQx1MzIAACUIAAACKQgAKQgIYHBvbGthZG90X2NvcmVfcHJpbWl0aXZlc0xPdXRib3VuZEhybXBNZXNzYWdlBAhJZAGcAAgBJHJlY2lwaWVudJwBCElkAAEQZGF0YRgBTGFsbG9jOjp2ZWM6OlZlYzx1OD4AAC0ICHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtLFBvVk1lc3NhZ2VzAAAYAWhyZWxheV9zdG9yYWdlX3Jvb3Rfb3JfaGFzaDwBRHJlbGF5X2NoYWluOjpIYXNoAAE0Y29yZV9zZWxlY3RvcgwBCHU4AAEwYnVuZGxlX2luZGV4DAEIdTgAATR1bXBfbXNnX2NvdW50OAEMdTMyAAFMaHJtcF9vdXRib3VuZF9jb3VudDgBDHUzMgABYGhybXBfb3V0Ym91bmRfcmVjaXBpZW50czEIASxWZWM8UGFyYUlkPgAAMQgAAAKcADUIDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtGHBhbGxldBRFcnJvcgQEVAABGExPdmVybGFwcGluZ1VwZ3JhZGVzAAAEGQFBdHRlbXB0IHRvIHVwZ3JhZGUgdmFsaWRhdGlvbiBmdW5jdGlvbiB3aGlsZSBleGlzdGluZyB1cGdyYWRlIHBlbmRpbmcuUFByb2hpYml0ZWRCeVBvbGthZG90AAEETQFQb2xrYWRvdCBjdXJyZW50bHkgcHJvaGliaXRzIHRoaXMgcGFyYWNoYWluIGZyb20gdXBncmFkaW5nIGl0cyB2YWxpZGF0aW9uIGZ1bmN0aW9uLhhUb29CaWcAAghFAVRoZSBzdXBwbGllZCB2YWxpZGF0aW9uIGZ1bmN0aW9uIGhhcyBjb21waWxlZCBpbnRvIGEgYmxvYiBsYXJnZXIgdGhhbiBQb2xrYWRvdCBpczx3aWxsaW5nIHRvIHJ1bi5oVmFsaWRhdGlvbkRhdGFOb3RBdmFpbGFibGUAAwQdAVRoZSBpbmhlcmVudCB3aGljaCBzdXBwbGllcyB0aGUgdmFsaWRhdGlvbiBkYXRhIGRpZCBub3QgcnVuIHRoaXMgYmxvY2sudEhvc3RDb25maWd1cmF0aW9uTm90QXZhaWxhYmxlAAQEKQFUaGUgaW5oZXJlbnQgd2hpY2ggc3VwcGxpZXMgdGhlIGhvc3QgY29uZmlndXJhdGlvbiBkaWQgbm90IHJ1biB0aGlzIGJsb2NrLjBOb3RTY2hlZHVsZWQABQTYTm8gdmFsaWRhdGlvbiBmdW5jdGlvbiB1cGdyYWRlIGlzIGN1cnJlbnRseSBzY2hlZHVsZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjkIDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBPQgEUwAABABFCAEYVmVjPFQ+AAA9CAw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLEJhbGFuY2VMb2NrBBxCYWxhbmNlAcQADAEIaWS9AQE4TG9ja0lkZW50aWZpZXIAARhhbW91bnTEARxCYWxhbmNlAAEccmVhc29uc0EIARxSZWFzb25zAABBCAw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzHFJlYXNvbnMAAQwMRmVlAAAAEE1pc2MAAQAMQWxsAAIAAEUIAAACPQgASQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFNCARTAAAEAFEIARhWZWM8VD4AAE0IDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsUmVzZXJ2ZURhdGEIRFJlc2VydmVJZGVudGlmaWVyAb0BHEJhbGFuY2UBxAAIAQhpZL0BAURSZXNlcnZlSWRlbnRpZmllcgABGGFtb3VudMQBHEJhbGFuY2UAAFEIAAACTQgAVQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFZCARTAAAEAF0IARhWZWM8VD4AAFkIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQBgQYcQmFsYW5jZQHEAAgBCGlkgQYBCElkAAEYYW1vdW50xAEcQmFsYW5jZQAAXQgAAAJZCABhCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAWUIBFMAAAQAaQgBGFZlYzxUPgAAZQgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAEQHEJhbGFuY2UBxAAIAQhpZBABCElkAAEYYW1vdW50xAEcQmFsYW5jZQAAaQgAAAJlCABtCAw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFcnJvcggEVAAESQABMDhWZXN0aW5nQmFsYW5jZQAABJxWZXN0aW5nIGJhbGFuY2UgdG9vIGhpZ2ggdG8gc2VuZCB2YWx1ZS5UTGlxdWlkaXR5UmVzdHJpY3Rpb25zAAEEyEFjY291bnQgbGlxdWlkaXR5IHJlc3RyaWN0aW9ucyBwcmV2ZW50IHdpdGhkcmF3YWwuTEluc3VmZmljaWVudEJhbGFuY2UAAgR4QmFsYW5jZSB0b28gbG93IHRvIHNlbmQgdmFsdWUuSEV4aXN0ZW50aWFsRGVwb3NpdAADBOxWYWx1ZSB0b28gbG93IHRvIGNyZWF0ZSBhY2NvdW50IGR1ZSB0byBleGlzdGVudGlhbCBkZXBvc2l0LjRFeHBlbmRhYmlsaXR5AAQEkFRyYW5zZmVyL3BheW1lbnQgd291bGQga2lsbCBhY2NvdW50LlxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQAFBMxBIHZlc3Rpbmcgc2NoZWR1bGUgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgYWNjb3VudC4sRGVhZEFjY291bnQABgSMQmVuZWZpY2lhcnkgYWNjb3VudCBtdXN0IHByZS1leGlzdC48VG9vTWFueVJlc2VydmVzAAcEuE51bWJlciBvZiBuYW1lZCByZXNlcnZlcyBleGNlZWQgYE1heFJlc2VydmVzYC4wVG9vTWFueUhvbGRzAAgE+E51bWJlciBvZiBob2xkcyBleGNlZWQgYFZhcmlhbnRDb3VudE9mPFQ6OlJ1bnRpbWVIb2xkUmVhc29uPmAuOFRvb01hbnlGcmVlemVzAAkEmE51bWJlciBvZiBmcmVlemVzIGV4Y2VlZCBgTWF4RnJlZXplc2AuTElzc3VhbmNlRGVhY3RpdmF0ZWQACgQBAVRoZSBpc3N1YW5jZSBjYW5ub3QgYmUgbW9kaWZpZWQgc2luY2UgaXQgaXMgYWxyZWFkeSBkZWFjdGl2YXRlZC4kRGVsdGFaZXJvAAsEZFRoZSBkZWx0YSBjYW5ub3QgYmUgemVyby4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQucQgIaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50IFJlbGVhc2VzAAEIJFYxQW5jaWVudAAAAAhWMgABAAB1CBA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMcc3RvcmFnZRhOb0Ryb3AEBFQBeQgABAB5CAEEVAAAeQgYNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZSRpbWJhbGFuY2UkSW1iYWxhbmNlDARCAcQYT25Ecm9wADhPcHBvc2l0ZU9uRHJvcAAABAEYYW1vdW50xAEEQgAAfQgMfGluZGl2X3BhbGxldF9vcmlnaW5fcmVzdHJpY3Rpb24YcGFsbGV0FFVzYWdlCBxCYWxhbmNlAcQsQmxvY2tOdW1iZXIBOAAIARB1c2VkxAEcQmFsYW5jZQABIGF0X2Jsb2NrOAEsQmxvY2tOdW1iZXIAAIEIDHxpbmRpdl9wYWxsZXRfb3JpZ2luX3Jlc3RyaWN0aW9uGHBhbGxldBRFcnJvcgQEVAABCBxOb1VzYWdlAAAEgFRoZSBvcmlnaW4gaGFzIG5vIHVzYWdlIHRyYWNrZWQuHE5vdFplcm8AAQRYVGhlIHVzYWdlIGlzIG5vdCB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6FCAw0cGFsbGV0X2Fzc2V0cxR0eXBlczBBc3NldERldGFpbHMMHEJhbGFuY2UBxCRBY2NvdW50SWQBBDhEZXBvc2l0QmFsYW5jZQHEADABFG93bmVyBAEkQWNjb3VudElkAAEYaXNzdWVyBAEkQWNjb3VudElkAAEUYWRtaW4EASRBY2NvdW50SWQAARxmcmVlemVyBAEkQWNjb3VudElkAAEYc3VwcGx5xAEcQmFsYW5jZQABHGRlcG9zaXTEAThEZXBvc2l0QmFsYW5jZQABLG1pbl9iYWxhbmNlxAEcQmFsYW5jZQABNGlzX3N1ZmZpY2llbnTIARBib29sAAEgYWNjb3VudHM4AQx1MzIAASxzdWZmaWNpZW50czgBDHUzMgABJGFwcHJvdmFsczgBDHUzMgABGHN0YXR1c4kIASxBc3NldFN0YXR1cwAAiQgMNHBhbGxldF9hc3NldHMUdHlwZXMsQXNzZXRTdGF0dXMAAQwQTGl2ZQAAABhGcm96ZW4AAQAoRGVzdHJveWluZwACAACNCAAABAjgBACRCAw0cGFsbGV0X2Fzc2V0cxR0eXBlczBBc3NldEFjY291bnQQHEJhbGFuY2UBxDhEZXBvc2l0QmFsYW5jZQHEFEV4dHJhARAkQWNjb3VudElkAQQAEAEcYmFsYW5jZcQBHEJhbGFuY2UAARhzdGF0dXOVCAE0QWNjb3VudFN0YXR1cwABGHJlYXNvbpkIAahFeGlzdGVuY2VSZWFzb248RGVwb3NpdEJhbGFuY2UsIEFjY291bnRJZD4AARRleHRyYRABFEV4dHJhAACVCAw0cGFsbGV0X2Fzc2V0cxR0eXBlczRBY2NvdW50U3RhdHVzAAEMGExpcXVpZAAAABhGcm96ZW4AAQAcQmxvY2tlZAACAACZCAw0cGFsbGV0X2Fzc2V0cxR0eXBlczxFeGlzdGVuY2VSZWFzb24IHEJhbGFuY2UBxCRBY2NvdW50SWQBBAEUIENvbnN1bWVyAAAAKFN1ZmZpY2llbnQAAQAsRGVwb3NpdEhlbGQEAMQBHEJhbGFuY2UAAgA8RGVwb3NpdFJlZnVuZGVkAAMALERlcG9zaXRGcm9tCAAEASRBY2NvdW50SWQAAMQBHEJhbGFuY2UABAAAnQgAAAQM4AQEAKEIDDRwYWxsZXRfYXNzZXRzFHR5cGVzIEFwcHJvdmFsCBxCYWxhbmNlAcQ4RGVwb3NpdEJhbGFuY2UBxAAIARhhbW91bnTEARxCYWxhbmNlAAEcZGVwb3NpdMQBOERlcG9zaXRCYWxhbmNlAAClCAw0cGFsbGV0X2Fzc2V0cxR0eXBlczRBc3NldE1ldGFkYXRhCDhEZXBvc2l0QmFsYW5jZQHENEJvdW5kZWRTdHJpbmcBqQgAFAEcZGVwb3NpdMQBOERlcG9zaXRCYWxhbmNlAAEQbmFtZakIATRCb3VuZGVkU3RyaW5nAAEYc3ltYm9sqQgBNEJvdW5kZWRTdHJpbmcAASBkZWNpbWFscwwBCHU4AAEkaXNfZnJvemVuyAEQYm9vbAAAqQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AACtCAw0cGFsbGV0X2Fzc2V0cxhwYWxsZXQURXJyb3IIBFQABEkAAWAoQmFsYW5jZUxvdwAABBUBQWNjb3VudCBiYWxhbmNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0cmFuc2ZlciBhbW91bnQuJE5vQWNjb3VudAABBJBUaGUgYWNjb3VudCB0byBhbHRlciBkb2VzIG5vdCBleGlzdC4wTm9QZXJtaXNzaW9uAAIE6FRoZSBzaWduaW5nIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gZG8gdGhlIG9wZXJhdGlvbi4cVW5rbm93bgADBHhUaGUgZ2l2ZW4gYXNzZXQgSUQgaXMgdW5rbm93bi4YRnJvemVuAAQEdFRoZSBvcmlnaW4gYWNjb3VudCBpcyBmcm96ZW4uFEluVXNlAAUEeFRoZSBhc3NldCBJRCBpcyBhbHJlYWR5IHRha2VuLihCYWRXaXRuZXNzAAYEbEludmFsaWQgd2l0bmVzcyBkYXRhIGdpdmVuLjhNaW5CYWxhbmNlWmVybwAHBIxNaW5pbXVtIGJhbGFuY2Ugc2hvdWxkIGJlIG5vbi16ZXJvLkxVbmF2YWlsYWJsZUNvbnN1bWVyAAgMWQFVbmFibGUgdG8gaW5jcmVtZW50IHRoZSBjb25zdW1lciByZWZlcmVuY2UgY291bnRlcnMgb24gdGhlIGFjY291bnQuIEVpdGhlciBubyBwcm92aWRlck0BcmVmZXJlbmNlIGV4aXN0cyB0byBhbGxvdyBhIG5vbi16ZXJvIGJhbGFuY2Ugb2YgYSBub24tc2VsZi1zdWZmaWNpZW50IGFzc2V0LCBvciBvbmXwZmV3ZXIgdGhlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uc3VtZXJzIGhhcyBiZWVuIHJlYWNoZWQuLEJhZE1ldGFkYXRhAAkEXEludmFsaWQgbWV0YWRhdGEgZ2l2ZW4uKFVuYXBwcm92ZWQACgTETm8gYXBwcm92YWwgZXhpc3RzIHRoYXQgd291bGQgYWxsb3cgdGhlIHRyYW5zZmVyLiBXb3VsZERpZQALBDUBVGhlIHNvdXJjZSBhY2NvdW50IHdvdWxkIG5vdCBzdXJ2aXZlIHRoZSB0cmFuc2ZlciBhbmQgaXQgbmVlZHMgdG8gc3RheSBhbGl2ZS40QWxyZWFkeUV4aXN0cwAMBIRUaGUgYXNzZXQtYWNjb3VudCBhbHJlYWR5IGV4aXN0cy4kTm9EZXBvc2l0AA0E1FRoZSBhc3NldC1hY2NvdW50IGRvZXNuJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGRlcG9zaXQuJFdvdWxkQnVybgAOBMRUaGUgb3BlcmF0aW9uIHdvdWxkIHJlc3VsdCBpbiBmdW5kcyBiZWluZyBidXJuZWQuJExpdmVBc3NldAAPCFkBVGhlIGFzc2V0IGlzIGEgbGl2ZSBhc3NldCBhbmQgaXMgYWN0aXZlbHkgYmVpbmcgdXNlZC4gVXN1YWxseSBlbWl0IGZvciBvcGVyYXRpb25zIHN1Y2gdAWFzIGBzdGFydF9kZXN0cm95YCB3aGljaCByZXF1aXJlIHRoZSBhc3NldCB0byBiZSBpbiBhIGRlc3Ryb3lpbmcgc3RhdGUuMEFzc2V0Tm90TGl2ZQAQBMhUaGUgYXNzZXQgaXMgbm90IGxpdmUsIGFuZCBsaWtlbHkgYmVpbmcgZGVzdHJveWVkLjxJbmNvcnJlY3RTdGF0dXMAEQSwVGhlIGFzc2V0IHN0YXR1cyBpcyBub3QgdGhlIGV4cGVjdGVkIHN0YXR1cy4kTm90RnJvemVuABIE2FRoZSBhc3NldCBzaG91bGQgYmUgZnJvemVuIGJlZm9yZSB0aGUgZ2l2ZW4gb3BlcmF0aW9uLjhDYWxsYmFja0ZhaWxlZAATBIRDYWxsYmFjayBhY3Rpb24gcmVzdWx0ZWQgaW4gZXJyb3IoQmFkQXNzZXRJZAAUBMhUaGUgYXNzZXQgSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgW2BOZXh0QXNzZXRJZGBdLjxDb250YWluc0ZyZWV6ZXMAFQRNAVRoZSBhc3NldCBjYW5ub3QgYmUgZGVzdHJveWVkIGJlY2F1c2Ugc29tZSBhY2NvdW50cyBmb3IgdGhpcyBhc3NldCBjb250YWluIGZyZWV6ZXMuNENvbnRhaW5zSG9sZHMAFgRFAVRoZSBhc3NldCBjYW5ub3QgYmUgZGVzdHJveWVkIGJlY2F1c2Ugc29tZSBhY2NvdW50cyBmb3IgdGhpcyBhc3NldCBjb250YWluIGhvbGRzLjxUb29NYW55UmVzZXJ2ZXMAFwSAVHJpZWQgc2V0dGluZyB0b28gbWFueSByZXNlcnZlcy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQusQgEGE9wdGlvbgQEVAGFCAEIEE5vbmUAAAAQU29tZQQAhQgAAAEAALUIBBhPcHRpb24EBFQBxAEIEE5vbmUAAAAQU29tZQQAxAAAAQAAuQgEGE9wdGlvbgQEVAGlCAEIEE5vbmUAAAAQU29tZQQApQgAAAEAAL0IDFBwYWxsZXRfYXNzZXRzX2hvbGRlchhwYWxsZXQURXJyb3IIBFQABEkAAQQwVG9vTWFueUhvbGRzAAAEMQFOdW1iZXIgb2YgaG9sZHMgb24gYW4gYWNjb3VudCB3b3VsZCBleGNlZWQgdGhlIGNvdW50IG9mIGBSdW50aW1lSG9sZFJlYXNvbmAuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LsEIDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQURXJyb3IEBFQAAQxAVW5rbm93bkFzc2V0S2luZAAABHhUaGUgZ2l2ZW4gYXNzZXQgSUQgaXMgdW5rbm93bi40QWxyZWFkeUV4aXN0cwABBFEBVGhlIGdpdmVuIGFzc2V0IElEIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGNvbnZlcnNpb24gcmF0ZSBhbmQgY2Fubm90IGJlIHJlLWNyZWF0ZWQuIE92ZXJmbG93AAIEzE92ZXJmbG93IG9jdXJyZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgaW52ZXJzZSByYXRlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7FCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQQEUwAABADMARhWZWM8VD4AAMkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBzQgEUwAABADRCAEYVmVjPFQ+AADNCAxkcGFsbGV0X2NvbGxhdG9yX3NlbGVjdGlvbhhwYWxsZXQ0Q2FuZGlkYXRlSW5mbwgkQWNjb3VudElkAQQcQmFsYW5jZQHEAAgBDHdobwQBJEFjY291bnRJZAABHGRlcG9zaXTEARxCYWxhbmNlAADRCAAAAs0IANUICDRmcmFtZV9zdXBwb3J0IFBhbGxldElkAAAEAL0BARxbdTg7IDhdAADZCAxkcGFsbGV0X2NvbGxhdG9yX3NlbGVjdGlvbhhwYWxsZXQURXJyb3IEBFQAAUREVG9vTWFueUNhbmRpZGF0ZXMAAASMVGhlIHBhbGxldCBoYXMgdG9vIG1hbnkgY2FuZGlkYXRlcy5cVG9vRmV3RWxpZ2libGVDb2xsYXRvcnMAAQSsTGVhdmluZyB3b3VsZCByZXN1bHQgaW4gdG9vIGZldyBjYW5kaWRhdGVzLkBBbHJlYWR5Q2FuZGlkYXRlAAIEfEFjY291bnQgaXMgYWxyZWFkeSBhIGNhbmRpZGF0ZS4wTm90Q2FuZGlkYXRlAAMEbEFjY291bnQgaXMgbm90IGEgY2FuZGlkYXRlLlBUb29NYW55SW52dWxuZXJhYmxlcwAEBIRUaGVyZSBhcmUgdG9vIG1hbnkgSW52dWxuZXJhYmxlcy5MQWxyZWFkeUludnVsbmVyYWJsZQAFBIxBY2NvdW50IGlzIGFscmVhZHkgYW4gSW52dWxuZXJhYmxlLjxOb3RJbnZ1bG5lcmFibGUABgR8QWNjb3VudCBpcyBub3QgYW4gSW52dWxuZXJhYmxlLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAAHBJxBY2NvdW50IGhhcyBubyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRC5YVmFsaWRhdG9yTm90UmVnaXN0ZXJlZAAIBIxWYWxpZGF0b3IgSUQgaXMgbm90IHlldCByZWdpc3RlcmVkLmxJbnNlcnRUb0NhbmRpZGF0ZUxpc3RGYWlsZWQACQScQ291bGQgbm90IGluc2VydCBpbiB0aGUgY2FuZGlkYXRlIGxpc3QudFJlbW92ZUZyb21DYW5kaWRhdGVMaXN0RmFpbGVkAAoEpENvdWxkIG5vdCByZW1vdmUgZnJvbSB0aGUgY2FuZGlkYXRlIGxpc3QuNERlcG9zaXRUb29Mb3cACwT0TmV3IGRlcG9zaXQgYW1vdW50IHdvdWxkIGJlIGJlbG93IHRoZSBtaW5pbXVtIGNhbmRpZGFjeSBib25kLmRVcGRhdGVDYW5kaWRhdGVMaXN0RmFpbGVkAAwEkENvdWxkIG5vdCB1cGRhdGUgdGhlIGNhbmRpZGF0ZSBsaXN0LkBJbnN1ZmZpY2llbnRCb25kAA0EKQFEZXBvc2l0IGFtb3VudCBpcyB0b28gbG93IHRvIHRha2UgdGhlIHRhcmdldCdzIHNsb3QgaW4gdGhlIGNhbmRpZGF0ZSBsaXN0LlBUYXJnZXRJc05vdENhbmRpZGF0ZQAOBC0BVGhlIHRhcmdldCBhY2NvdW50IHRvIGJlIHJlcGxhY2VkIGluIHRoZSBjYW5kaWRhdGUgbGlzdCBpcyBub3QgYSBjYW5kaWRhdGUuQElkZW50aWNhbERlcG9zaXQADwQNAVRoZSB1cGRhdGVkIGRlcG9zaXQgYW1vdW50IGlzIGVxdWFsIHRvIHRoZSBhbW91bnQgYWxyZWFkeSByZXNlcnZlZC5ASW52YWxpZFVucmVzZXJ2ZQAQBD0BQ2Fubm90IGxvd2VyIGNhbmRpZGFjeSBib25kIHdoaWxlIG9jY3VweWluZyBhIGZ1dHVyZSBjb2xsYXRvciBzbG90IGluIHRoZSBsaXN0LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7dCAAAAuEIAOEIAAAECAQ5AQDlCAAAAukIAOkIAAAECDjtCADtCAwoc3Bfc3Rha2luZxxvZmZlbmNlPE9mZmVuY2VTZXZlcml0eQAABADxCAEcUGVyYmlsbAAA8QgMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJiaWxsAAAEADgBDHUzMgAA9QgAAAQI+QgYAPkIDBxzcF9jb3JlGGNyeXB0byRLZXlUeXBlSWQAAAQAcAEcW3U4OyA0XQAA/QgMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFcnJvcgQEVAABFDBJbnZhbGlkUHJvb2YAAARgSW52YWxpZCBvd25lcnNoaXAgcHJvb2YuXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAEEnE5vIGFzc29jaWF0ZWQgdmFsaWRhdG9yIElEIGZvciBhY2NvdW50LjREdXBsaWNhdGVkS2V5AAIEZFJlZ2lzdGVyZWQgZHVwbGljYXRlIGtleS4YTm9LZXlzAAMEpE5vIGtleXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjY291bnQuJE5vQWNjb3VudAAEBBkBS2V5IHNldHRpbmcgYWNjb3VudCBpcyBub3QgbGl2ZSwgc28gaXQncyBpbXBvc3NpYmxlIHRvIGFzc29jaWF0ZSBrZXlzLgR0RXJyb3IgZm9yIHRoZSBzZXNzaW9uIHBhbGxldC4BCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAT0BBFMAAAQABQkBGFZlYzxUPgAABQkAAAI9AQAJCQhIc3BfY29uc2Vuc3VzX3Nsb3RzEFNsb3QAAAQAKAEMdTY0AAANCQAABAgJCTgAEQkMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9zZXQ8Qm91bmRlZEJUcmVlU2V0CARUAZwEUwAABAAVCQEsQlRyZWVTZXQ8VD4AABUJBCBCVHJlZVNldAQEVAGcAAQAMQgAAAAZCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAR0JBFMAAAQAKQkBGFZlYzxUPgAAHQkIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWVYT3V0Ym91bmRDaGFubmVsRGV0YWlscwAAGAEkcmVjaXBpZW50nAEYUGFyYUlkAAEUc3RhdGUhCQE0T3V0Ym91bmRTdGF0ZQABNHNpZ25hbHNfZXhpc3TIARBib29sAAEsZmlyc3RfaW5kZXgtAwEMdTE2AAEobGFzdF9pbmRleC0DAQx1MTYAARRmbGFncyUJAVBPdXRib3VuZENoYW5uZWxGbGFncwAAIQkIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWU0T3V0Ym91bmRTdGF0ZQABCAhPawAAACRTdXNwZW5kZWQAAQAAJQkIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWVQT3V0Ym91bmRDaGFubmVsRmxhZ3MAAAQBEGJpdHM4AQx1MzIAACkJAAACHQkALQkAAAQInC0DADEJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAANQkIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWU8UXVldWVDb25maWdEYXRhAAAMAURzdXNwZW5kX3RocmVzaG9sZDgBDHUzMgABOGRyb3BfdGhyZXNob2xkOAEMdTMyAAFAcmVzdW1lX3RocmVzaG9sZDgBDHUzMgAAOQkMZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWUYcGFsbGV0FEVycm9yBARUAAEUOEJhZFF1ZXVlQ29uZmlnAAAEEQFTZXR0aW5nIHRoZSBxdWV1ZSBjb25maWcgZmFpbGVkIHNpbmNlIG9uZSBvZiBpdHMgdmFsdWVzIHdhcyBpbnZhbGlkLkBBbHJlYWR5U3VzcGVuZGVkAAEEjFRoZSBleGVjdXRpb24gaXMgYWxyZWFkeSBzdXNwZW5kZWQuOEFscmVhZHlSZXN1bWVkAAIEhFRoZSBleGVjdXRpb24gaXMgYWxyZWFkeSByZXN1bWVkLnRUb29NYW55QWN0aXZlT3V0Ym91bmRDaGFubmVscwADBLBUaGVyZSBhcmUgdG9vIG1hbnkgYWN0aXZlIG91dGJvdW5kIGNoYW5uZWxzLhhUb29CaWcABARcVGhlIG1lc3NhZ2UgaXMgdG9vIGJpZy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuPQkMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgE4AQwcUGVuZGluZxABJHJlc3BvbmRlckkBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXJBCQFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmeUUJAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dDgBLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZcgBEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZU0JAURWZXJzaW9uZWRSZXNwb25zZQABCGF0OAEsQmxvY2tOdW1iZXIAAgAAQQkEGE9wdGlvbgQEVAFJAQEIEE5vbmUAAAAQU29tZQQASQEAAAEAAEUJBBhPcHRpb24EBFQBSQkBCBBOb25lAAAAEFNvbWUEAEkJAAABAABJCQAABAgMDABNCQgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYzBADFAQEwdjM6OlJlc3BvbnNlAAMACFY0BAA1AgEwdjQ6OlJlc3BvbnNlAAQACFY1BACBAgEwdjU6OlJlc3BvbnNlAAUAAFEJAAAECDhJAQBVCQAABAwo1QE4AFkJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBXQkEUwAABABhCQEYVmVjPFQ+AABdCQAABAhJATgAYQkAAAJdCQBlCQwocGFsbGV0X3hjbRhwYWxsZXRUVmVyc2lvbk1pZ3JhdGlvblN0YWdlAAEQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAAAXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEAUE5vdGlmeUN1cnJlbnRUYXJnZXRzBACRBQE8T3B0aW9uPFZlYzx1OD4+AAIAaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAMAAGkJAAAEDDgEEQMAbQkMKHBhbGxldF94Y20YcGFsbGV0aFJlbW90ZUxvY2tlZEZ1bmdpYmxlUmVjb3JkCEhDb25zdW1lcklkZW50aWZpZXIBEDBNYXhDb25zdW1lcnMAABABGGFtb3VudMQBEHUxMjgAARRvd25lckkBAURWZXJzaW9uZWRMb2NhdGlvbgABGGxvY2tlckkBAURWZXJzaW9uZWRMb2NhdGlvbgABJGNvbnN1bWVyc3EJAdBCb3VuZGVkVmVjPChDb25zdW1lcklkZW50aWZpZXIsIHUxMjgpLCBNYXhDb25zdW1lcnM+AABxCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUJBFMAAAQAeQkBGFZlYzxUPgAAdQkAAAQIEMQAeQkAAAJ1CQB9CQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAYEJBFMAAAQAhQkBGFZlYzxUPgAAgQkAAAQIxEkBAIUJAAACgQkAiQkIKHBhbGxldF94Y21YQXV0aG9yaXplZEFsaWFzZXNFbnRyeQgYVGlja2V0AY0JDE1BWAGRCQAIASBhbGlhc2Vyc5UJAXhCb3VuZGVkVmVjPE9yaWdpbkFsaWFzZXIsIE1BWD4AARh0aWNrZXSNCQEYVGlja2V0AACNCRA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMcc3RvcmFnZSBEaXNhYmxlZAAAAACRCQwocGFsbGV0X3hjbRhwYWxsZXRQTWF4QXV0aG9yaXplZEFsaWFzZXMAAAAAlQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGZCQRTAAAEAJ0JARhWZWM8VD4AAJkJDEB4Y21fcnVudGltZV9hcGlzSGF1dGhvcml6ZWRfYWxpYXNlczRPcmlnaW5BbGlhc2VyAAAIASBsb2NhdGlvbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABGGV4cGlyeRUDASxPcHRpb248dTY0PgAAnQkAAAKZCQChCQwocGFsbGV0X3hjbRhwYWxsZXQURXJyb3IEBFQAAXAsVW5yZWFjaGFibGUAAAhdAVRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIHdhcyB1bnJlYWNoYWJsZSwgZ2VuZXJhbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBubyB3YXkgb2Ygcm91dGluZxh0byBpdC4sU2VuZEZhaWx1cmUAAQhBAVRoZXJlIHdhcyBzb21lIG90aGVyIGlzc3VlIChpLmUuIG5vdCB0byBkbyB3aXRoIHJvdXRpbmcpIGluIHNlbmRpbmcgdGhlIG1lc3NhZ2UuyFBlcmhhcHMgYSBsYWNrIG9mIHNwYWNlIGZvciBidWZmZXJpbmcgdGhlIG1lc3NhZ2UuIEZpbHRlcmVkAAIEnFRoZSBtZXNzYWdlIGV4ZWN1dGlvbiBmYWlscyB0aGUgZmlsdGVyLkhVbndlaWdoYWJsZU1lc3NhZ2UAAwS0VGhlIG1lc3NhZ2UncyB3ZWlnaHQgY291bGQgbm90IGJlIGRldGVybWluZWQuYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQAEBNxUaGUgZGVzdGluYXRpb24gYExvY2F0aW9uYCBwcm92aWRlZCBjYW5ub3QgYmUgaW52ZXJ0ZWQuFEVtcHR5AAUEgFRoZSBhc3NldHMgdG8gYmUgc2VudCBhcmUgZW1wdHkuOENhbm5vdFJlYW5jaG9yAAYENQFDb3VsZCBub3QgcmUtYW5jaG9yIHRoZSBhc3NldHMgdG8gZGVjbGFyZSB0aGUgZmVlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIGNoYWluLjRUb29NYW55QXNzZXRzAAcExFRvbyBtYW55IGFzc2V0cyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci40SW52YWxpZE9yaWdpbgAIBHhPcmlnaW4gaXMgaW52YWxpZCBmb3Igc2VuZGluZy4oQmFkVmVyc2lvbgAJBCEBVGhlIHZlcnNpb24gb2YgdGhlIGBWZXJzaW9uZWRgIHZhbHVlIHVzZWQgaXMgbm90IGFibGUgdG8gYmUgaW50ZXJwcmV0ZWQuLEJhZExvY2F0aW9uAAoIQQFUaGUgZ2l2ZW4gbG9jYXRpb24gY291bGQgbm90IGJlIHVzZWQgKGUuZy4gYmVjYXVzZSBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIHRoZWBkZXNpcmVkIHZlcnNpb24gb2YgWENNKS44Tm9TdWJzY3JpcHRpb24ACwS8VGhlIHJlZmVyZW5jZWQgc3Vic2NyaXB0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC5EQWxyZWFkeVN1YnNjcmliZWQADAQRAVRoZSBsb2NhdGlvbiBpcyBpbnZhbGlkIHNpbmNlIGl0IGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uIGZyb20gdXMuWENhbm5vdENoZWNrT3V0VGVsZXBvcnQADQQpAUNvdWxkIG5vdCBjaGVjay1vdXQgdGhlIGFzc2V0cyBmb3IgdGVsZXBvcnRhdGlvbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4uKExvd0JhbGFuY2UADgRBAVRoZSBvd25lciBkb2VzIG5vdCBvd24gKGFsbCkgb2YgdGhlIGFzc2V0IHRoYXQgdGhleSB3aXNoIHRvIGRvIHRoZSBvcGVyYXRpb24gb24uMFRvb01hbnlMb2NrcwAPBMBUaGUgYXNzZXQgb3duZXIgaGFzIHRvbyBtYW55IGxvY2tzIG9uIHRoZSBhc3NldC5MQWNjb3VudE5vdFNvdmVyZWlnbgAQBDEBVGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGFuIGlkZW50aWZpYWJsZSBzb3ZlcmVpZ24gYWNjb3VudCBmb3IgYW55IGxvY2F0aW9uLihGZWVzTm90TWV0ABEEKQFUaGUgb3BlcmF0aW9uIHJlcXVpcmVkIGZlZXMgdG8gYmUgcGFpZCB3aGljaCB0aGUgaW5pdGlhdG9yIGNvdWxkIG5vdCBtZWV0LjBMb2NrTm90Rm91bmQAEgT0QSByZW1vdGUgbG9jayB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgY291bGQgbm90IGJlIGZvdW5kLhRJblVzZQATBEkBVGhlIHVubG9jayBvcGVyYXRpb24gY2Fubm90IHN1Y2NlZWQgYmVjYXVzZSB0aGVyZSBhcmUgc3RpbGwgY29uc3VtZXJzIG9mIHRoZSBsb2NrLmhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQAVBPBJbnZhbGlkIGFzc2V0LCByZXNlcnZlIGNoYWluIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGZvciBpdC54SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlABYERQFJbnZhbGlkIGFzc2V0LCBkbyBub3Qgc3VwcG9ydCByZW1vdGUgYXNzZXQgcmVzZXJ2ZXMgd2l0aCBkaWZmZXJlbnQgZmVlcyByZXNlcnZlcy48VG9vTWFueVJlc2VydmVzABcESQFUb28gbWFueSBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmVzZXJ2ZSBsb2NhdGlvbnMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQAYBHxMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUuYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwAZBLhUb28gbWFueSBsb2NhdGlvbnMgYXV0aG9yaXplZCB0byBhbGlhcyBvcmlnaW4uNEV4cGlyZXNJblBhc3QAGgSMRXhwaXJ5IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC40QWxpYXNOb3RGb3VuZAAbBNBUaGUgYWxpYXMgdG8gcmVtb3ZlIGF1dGhvcml6YXRpb24gZm9yIHdhcyBub3QgZm91bmQuhExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZVdpdGhFcnJvcggBFGluZGV4DAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9ypQkBOEV4ZWN1dGlvbkVycm9yABwINQFMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUgd2l0aCB0aGUgYWN0dWFsIFhDTSBlcnJvciBhbmQgdGhlIGluZGV4IG9mIHRoZYhpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqUJDChwYWxsZXRfeGNtGGVycm9yczhFeGVjdXRpb25FcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIANFRvb01hbnlBc3NldHMAIwBMVW5oYW5kbGVkWGNtVmVyc2lvbgAkAEhXZWlnaHRMaW1pdFJlYWNoZWQAJQAcQmFycmllcgAmAExXZWlnaHROb3RDb21wdXRhYmxlACcAREV4Y2VlZHNTdGFja0xpbWl0ACgAAKkJCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZSRCb29rU3RhdGUENE1lc3NhZ2VPcmlnaW4BIQMAGAEUYmVnaW44ASRQYWdlSW5kZXgAAQxlbmQ4ASRQYWdlSW5kZXgAARRjb3VudDgBJFBhZ2VJbmRleAABQHJlYWR5X25laWdoYm91cnOtCQGET3B0aW9uPE5laWdoYm91cnM8TWVzc2FnZU9yaWdpbj4+AAE0bWVzc2FnZV9jb3VudCgBDHU2NAABEHNpemUoAQx1NjQAAK0JBBhPcHRpb24EBFQBsQkBCBBOb25lAAAAEFNvbWUEALEJAAABAACxCQhQcGFsbGV0X21lc3NhZ2VfcXVldWUoTmVpZ2hib3VycwQ0TWVzc2FnZU9yaWdpbgEhAwAIARBwcmV2IQMBNE1lc3NhZ2VPcmlnaW4AARBuZXh0IQMBNE1lc3NhZ2VPcmlnaW4AALUJAAAECCEDOAC5CQhQcGFsbGV0X21lc3NhZ2VfcXVldWUQUGFnZQgQU2l6ZQE4IEhlYXBTaXplAAAYASRyZW1haW5pbmc4ARBTaXplAAE4cmVtYWluaW5nX3NpemU4ARBTaXplAAEsZmlyc3RfaW5kZXg4ARBTaXplAAEUZmlyc3Q4ARBTaXplAAEQbGFzdDgBEFNpemUAARBoZWFwvQkBnEJvdW5kZWRWZWM8dTgsIEludG9VMzI8SGVhcFNpemUsIFNpemU+PgAAvQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADBCQxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0FEVycm9yBARUAAEkLE5vdFJlYXBhYmxlAAAISQFQYWdlIGlzIG5vdCByZWFwYWJsZSBiZWNhdXNlIGl0IGhhcyBpdGVtcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIGFuZCBpcyBub3Qgb2xkHGVub3VnaC4YTm9QYWdlAAEEhFBhZ2UgdG8gYmUgcmVhcGVkIGRvZXMgbm90IGV4aXN0LiROb01lc3NhZ2UAAgSoVGhlIHJlZmVyZW5jZWQgbWVzc2FnZSBjb3VsZCBub3QgYmUgZm91bmQuQEFscmVhZHlQcm9jZXNzZWQAAwQBAVRoZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZCBhZ2Fpbi4YUXVldWVkAAQErFRoZSBtZXNzYWdlIGlzIHF1ZXVlZCBmb3IgZnV0dXJlIGV4ZWN1dGlvbi5ISW5zdWZmaWNpZW50V2VpZ2h0AAUEGQFUaGVyZSBpcyB0ZW1wb3JhcmlseSBub3QgZW5vdWdoIHdlaWdodCB0byBjb250aW51ZSBzZXJ2aWNpbmcgbWVzc2FnZXMuYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQAGEKhUaGlzIG1lc3NhZ2UgaXMgdGVtcG9yYXJpbHkgdW5wcm9jZXNzYWJsZS4AWQFTdWNoIGVycm9ycyBhcmUgZXhwZWN0ZWQsIGJ1dCBub3QgZ3VhcmFudGVlZCwgdG8gcmVzb2x2ZSB0aGVtc2VsdmVzIGV2ZW50dWFsbHkgdGhyb3VnaCRyZXRyeWluZy4sUXVldWVQYXVzZWQABwzsVGhlIHF1ZXVlIGlzIHBhdXNlZCBhbmQgbm8gbWVzc2FnZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBpdC4AHQFUaGlzIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIG1heSByZXNvbHZlIGluIHRoZSBmdXR1cmUgYnkgcmUtdHJ5aW5nLkxSZWN1cnNpdmVEaXNhbGxvd2VkAAgEMQFBbm90aGVyIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgYW5kIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhpcyBjYWxsIGNhbiBoYXBwZW4uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LsUJDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXJyb3IEBFQAAQQwVG9vTWFueUNhbGxzAAAEXFRvbyBtYW55IGNhbGxzIGJhdGNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LskJAAAECAQIAM0JCDxwYWxsZXRfbXVsdGlzaWcgTXVsdGlzaWcQLEJsb2NrTnVtYmVyATgcQmFsYW5jZQHEJEFjY291bnRJZAEEME1heEFwcHJvdmFscwAAEAEQd2hlbpEDAVhUaW1lcG9pbnQ8QmxvY2tOdW1iZXI+AAEcZGVwb3NpdMQBHEJhbGFuY2UAASRkZXBvc2l0b3IEASRBY2NvdW50SWQAASRhcHByb3ZhbHPRCQGMQm91bmRlZFZlYzxBY2NvdW50SWQsIE1heEFwcHJvdmFscz4AANEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAMwBGFZlYzxUPgAA1QkMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXJyb3IEBFQAAThATWluaW11bVRocmVzaG9sZAAABHxUaHJlc2hvbGQgbXVzdCBiZSAyIG9yIGdyZWF0ZXIuPEFscmVhZHlBcHByb3ZlZAABBKxDYWxsIGlzIGFscmVhZHkgYXBwcm92ZWQgYnkgdGhpcyBzaWduYXRvcnkuRE5vQXBwcm92YWxzTmVlZGVkAAIEnENhbGwgZG9lc24ndCBuZWVkIGFueSAobW9yZSkgYXBwcm92YWxzLkRUb29GZXdTaWduYXRvcmllcwADBKhUaGVyZSBhcmUgdG9vIGZldyBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5IVG9vTWFueVNpZ25hdG9yaWVzAAQErFRoZXJlIGFyZSB0b28gbWFueSBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5UU2lnbmF0b3JpZXNPdXRPZk9yZGVyAAUEDQFUaGUgc2lnbmF0b3JpZXMgd2VyZSBwcm92aWRlZCBvdXQgb2Ygb3JkZXI7IHRoZXkgc2hvdWxkIGJlIG9yZGVyZWQuTFNlbmRlckluU2lnbmF0b3JpZXMABgQNAVRoZSBzZW5kZXIgd2FzIGNvbnRhaW5lZCBpbiB0aGUgb3RoZXIgc2lnbmF0b3JpZXM7IGl0IHNob3VsZG4ndCBiZS4gTm90Rm91bmQABwSgTXVsdGlzaWcgb3BlcmF0aW9uIG5vdCBmb3VuZCBpbiBzdG9yYWdlLiBOb3RPd25lcgAICFEBT25seSB0aGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGUgbXVsdGlzaWcgaXMgYWJsZSB0byBjYW5jZWwgaXQgb3IgdXBkYXRlNGl0cyBkZXBvc2l0cy4sTm9UaW1lcG9pbnQACQQdAU5vIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIGlzIGFscmVhZHkgdW5kZXJ3YXkuOFdyb25nVGltZXBvaW50AAoELQFBIGRpZmZlcmVudCB0aW1lcG9pbnQgd2FzIGdpdmVuIHRvIHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gdGhhdCBpcyB1bmRlcndheS5MVW5leHBlY3RlZFRpbWVwb2ludAALBPRBIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCBubyBtdWx0aXNpZyBvcGVyYXRpb24gaXMgdW5kZXJ3YXkuPE1heFdlaWdodFRvb0xvdwAMBNBUaGUgbWF4aW11bSB3ZWlnaHQgaW5mb3JtYXRpb24gcHJvdmlkZWQgd2FzIHRvbyBsb3cuNEFscmVhZHlTdG9yZWQADQSgVGhlIGRhdGEgdG8gYmUgc3RvcmVkIGlzIGFscmVhZHkgc3RvcmVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7ZCQwscGFsbGV0X3N1ZG8YcGFsbGV0FEVycm9yBARUAAEELFJlcXVpcmVTdWRvAAAEgFNlbmRlciBtdXN0IGJlIHRoZSBTdWRvIGFjY291bnQuBGhFcnJvciBmb3IgdGhlIFN1ZG8gcGFsbGV0Lt0JAAAECOEJxADhCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeUJBFMAAAQA6QkBGFZlYzxUPgAA5QkIMHBhbGxldF9wcm94eTxQcm94eURlZmluaXRpb24MJEFjY291bnRJZAEEJFByb3h5VHlwZQGhAyxCbG9ja051bWJlcgE4AAwBIGRlbGVnYXRlBAEkQWNjb3VudElkAAEocHJveHlfdHlwZaEDASRQcm94eVR5cGUAARRkZWxheTgBLEJsb2NrTnVtYmVyAADpCQAAAuUJAO0JAAAECPEJxADxCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAfUJBFMAAAQA+QkBGFZlYzxUPgAA9QkIMHBhbGxldF9wcm94eTBBbm5vdW5jZW1lbnQMJEFjY291bnRJZAEEEEhhc2gBPCxCbG9ja051bWJlcgE4AAwBEHJlYWwEASRBY2NvdW50SWQAASRjYWxsX2hhc2g8ARBIYXNoAAEYaGVpZ2h0OAEsQmxvY2tOdW1iZXIAAPkJAAAC9QkA/QkMMHBhbGxldF9wcm94eRhwYWxsZXQURXJyb3IEBFQAASAcVG9vTWFueQAABCEBVGhlcmUgYXJlIHRvbyBtYW55IHByb3hpZXMgcmVnaXN0ZXJlZCBvciB0b28gbWFueSBhbm5vdW5jZW1lbnRzIHBlbmRpbmcuIE5vdEZvdW5kAAEEdFByb3h5IHJlZ2lzdHJhdGlvbiBub3QgZm91bmQuIE5vdFByb3h5AAIEzFNlbmRlciBpcyBub3QgYSBwcm94eSBvZiB0aGUgYWNjb3VudCB0byBiZSBwcm94aWVkLixVbnByb3h5YWJsZQADBCEBQSBjYWxsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm94eSB0eXBlJ3MgZmlsdGVyIHdhcyBhdHRlbXB0ZWQuJER1cGxpY2F0ZQAEBGxBY2NvdW50IGlzIGFscmVhZHkgYSBwcm94eS4wTm9QZXJtaXNzaW9uAAUEFQFDYWxsIG1heSBub3QgYmUgbWFkZSBieSBwcm94eSBiZWNhdXNlIGl0IG1heSBlc2NhbGF0ZSBpdHMgcHJpdmlsZWdlcy4sVW5hbm5vdW5jZWQABgTQQW5ub3VuY2VtZW50LCBpZiBtYWRlIGF0IGFsbCwgd2FzIG1hZGUgdG9vIHJlY2VudGx5LixOb1NlbGZQcm94eQAHBGRDYW5ub3QgYWRkIHNlbGYgYXMgcHJveHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgEKDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXMwUmVnaXN0cmF0aW9uDBxCYWxhbmNlAcQ0TWF4SnVkZ2VtZW50cwAwSWRlbnRpdHlJbmZvAakDAAwBKGp1ZGdlbWVudHMFCgH8Qm91bmRlZFZlYzwoUmVnaXN0cmFySW5kZXgsIEp1ZGdlbWVudDxCYWxhbmNlPiksIE1heEp1ZGdlbWVudHM+AAEcZGVwb3NpdMQBHEJhbGFuY2UAARBpbmZvqQMBMElkZW50aXR5SW5mbwAABQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEJCgRTAAAEAA0KARhWZWM8VD4AAAkKAAAECDgtBAANCgAAAgkKABEKAAAECMTRCQAVCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARkKBFMAAAQAIQoBGFZlYzxUPgAAGQoEGE9wdGlvbgQEVAEdCgEIEE5vbmUAAAAQU29tZQQAHQoAAAEAAB0KDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXM0UmVnaXN0cmFySW5mbwwcQmFsYW5jZQHEJEFjY291bnRJZAEEHElkRmllbGQBKAAMARxhY2NvdW50BAEkQWNjb3VudElkAAEMZmVlxAEcQmFsYW5jZQABGGZpZWxkcygBHElkRmllbGQAACEKAAACGQoAJQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AAApCgxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzTEF1dGhvcml0eVByb3BlcnRpZXMEHEFjY291bnQBBAAIAShhY2NvdW50X2lkBAEcQWNjb3VudAABKGFsbG9jYXRpb244AShBbGxvY2F0aW9uAAAtCgxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzTFVzZXJuYW1lSW5mb3JtYXRpb24IHEFjY291bnQBBBxCYWxhbmNlAcQACAEUb3duZXIEARxBY2NvdW50AAEgcHJvdmlkZXIxCgFEUHJvdmlkZXI8QmFsYW5jZT4AADEKDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXMgUHJvdmlkZXIEHEJhbGFuY2UBxAEMKEFsbG9jYXRpb24AAABAQXV0aG9yaXR5RGVwb3NpdAQAxAEcQmFsYW5jZQABABhTeXN0ZW0AAgAANQoAAAQMBDgxCgA5CgxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzQFBlcnNvbmFsSWRlbnRpdHkQJEFjY291bnRJZAEELEp1ZGdlbWVudElkATg0TWF4SnVkZ2VtZW50cwAsQmxvY2tOdW1iZXIBOAAQARxhY2NvdW50BAEkQWNjb3VudElkAAFIcGVuZGluZ19qdWRnZW1lbnRzPQoBwEJvdW5kZWRWZWM8KFNvY2lhbCwgSnVkZ2VtZW50SWQpLCBNYXhKdWRnZW1lbnRzPgABGGJhbm5lZMgBEGJvb2wAAWR1c2VybmFtZV9sYXN0X3JlcG9ydGVkX2F0CQMBTE9wdGlvbjxCbG9ja051bWJlcj4AAD0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBQQoEUwAABABFCgEYVmVjPFQ+AABBCgAABAhFBDgARQoAAAJBCgBJCgxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzOFVzZXJuYW1lUmVwb3J0DCRBY2NvdW50SWQBBCBVc2VybmFtZQFBBBhUaWNrZXQBOAAMASByZXBvcnRlcgQBJEFjY291bnRJZAABIHVzZXJuYW1lQQQBIFVzZXJuYW1lAAEcY2FzZV9pZDgBGFRpY2tldAAATQoMVGluZGl2X3BhbGxldF9pZGVudGl0eRhwYWxsZXQURXJyb3IEBFQAAaRIVG9vTWFueVN1YkFjY291bnRzAAAEXFRvbyBtYW55IHN1YnMtYWNjb3VudHMuHE5vQWxpYXMAAQR4Tm8gYWxpYXMgZm91bmQgZm9yIGFuIGFjY291bnQuIE5vdEZvdW5kAAIEUEFjY291bnQgaXNuJ3QgZm91bmQuIE5vdE5hbWVkAAMEUEFjY291bnQgaXNuJ3QgbmFtZWQuKEVtcHR5SW5kZXgABAQwRW1wdHkgaW5kZXguKEZlZUNoYW5nZWQABQQ8RmVlIGlzIGNoYW5nZWQuKE5vSWRlbnRpdHkABgRITm8gaWRlbnRpdHkgZm91bmQuPFN0aWNreUp1ZGdlbWVudAAHBERTdGlja3kganVkZ2VtZW50LjhKdWRnZW1lbnRHaXZlbgAIBEBKdWRnZW1lbnQgZ2l2ZW4uQEludmFsaWRKdWRnZW1lbnQACQRISW52YWxpZCBqdWRnZW1lbnQuMEludmFsaWRJbmRleAAKBFRUaGUgaW5kZXggaXMgaW52YWxpZC40SW52YWxpZFRhcmdldAALBFhUaGUgdGFyZ2V0IGlzIGludmFsaWQuRFRvb01hbnlSZWdpc3RyYXJzAAwE6E1heGltdW0gYW1vdW50IG9mIHJlZ2lzdHJhcnMgcmVhY2hlZC4gQ2Fubm90IGFkZCBhbnkgbW9yZS44QWxyZWFkeUNsYWltZWQADQRwQWNjb3VudCBJRCBpcyBhbHJlYWR5IG5hbWVkLjxBbHJlYWR5UmVwb3J0ZWQADgSMVXNlcm5hbWUgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4YTm90U3ViAA8EcFNlbmRlciBpcyBub3QgYSBzdWItYWNjb3VudC4gTm90T3duZWQAEASIU3ViLWFjY291bnQgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyLnRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQARBNBUaGUgcHJvdmlkZWQganVkZ2VtZW50IHdhcyBmb3IgYSBkaWZmZXJlbnQgaWRlbnRpdHkuWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAEgT4RXJyb3IgdGhhdCBvY2N1cnMgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSBwYXlpbmcgZm9yIGp1ZGdlbWVudC40SW52YWxpZFN1ZmZpeAATBIBUaGUgcHJvdmlkZWQgc3VmZml4IGlzIHRvbyBsb25nLlBOb3RVc2VybmFtZUF1dGhvcml0eQAUBOBUaGUgc2VuZGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpc3N1ZSBhIHVzZXJuYW1lLjBOb0FsbG9jYXRpb24AFQTEVGhlIGF1dGhvcml0eSBjYW5ub3QgYWxsb2NhdGUgYW55IG1vcmUgdXNlcm5hbWVzLkBJbnZhbGlkU2lnbmF0dXJlABYEqFRoZSBzaWduYXR1cmUgb24gYSB1c2VybmFtZSB3YXMgbm90IHZhbGlkLkRSZXF1aXJlc1NpZ25hdHVyZQAXBAkBU2V0dGluZyB0aGlzIHVzZXJuYW1lIHJlcXVpcmVzIGEgc2lnbmF0dXJlLCBidXQgbm9uZSB3YXMgcHJvdmlkZWQuPEludmFsaWRVc2VybmFtZQAYBLBUaGUgdXNlcm5hbWUgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzLjRVc2VybmFtZVRha2VuABkEeFRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLihOb1VzZXJuYW1lABoEmFRoZSByZXF1ZXN0ZWQgdXNlcm5hbWUgZG9lcyBub3QgZXhpc3QuZE5vdFN5c3RlbVByb3ZpZGVkVXNlcm5hbWUAGwTUVGhlIHJlcG9ydGVkIHVzZXJuYW1lIHdhcyBub3QgcHJvdmlkZWQgYnkgdGhlIHN5c3RlbS4oTm90RXhwaXJlZAAcBC0BVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSBmb3JjZWZ1bGx5IHJlbW92ZWQgYmVjYXVzZSBpdCBjYW4gc3RpbGwgYmUgYWNjZXB0ZWQuIFRvb0Vhcmx5AB0EGQFUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCdzIHN0aWxsIGluIHRoZSBncmFjZSBwZXJpb2QuME5vdFVuYmluZGluZwAeBOxUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCBpcyBub3QgdW5iaW5kaW5nLkBBbHJlYWR5VW5iaW5kaW5nAB8E/FRoZSB1c2VybmFtZSBjYW5ub3QgYmUgdW5ib3VuZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgdW5iaW5kaW5nLlhJbnN1ZmZpY2llbnRQcml2aWxlZ2VzACAIRQFUaGUgYWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlcyAoZS5nLiBhdXRob3JpdHnQdHJ5aW5nIHRvIHVuYmluZCBhIHVzZXJuYW1lIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0pLihCYWRDb250ZXh0ACEE5FRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBhbGlhcyB3YXMgdXNlZCBpcyBub3Qgc3VwcG9ydGVkLkxVbmV4cGVjdGVkSnVkZ2VtZW50ACIExE5vIGFzc29jaWF0ZWQgcmVxdWVzdCBmb3IgdGhlIGp1ZGdlbWVudCByZWNlaXZlZC4wTm90U3VwcG9ydGVkACMEXQFUaGUgc29jaWFsIGNyZWRlbnRpYWwgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29uZmlndXJlZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBwcm92aWRlci4YQmFubmVkACQE2FRoZSBwZXJzb24gaXMgYmFubmVkIGFuZCBjYW5ub3QgcGVyZm9ybSB0aGUgb3BlcmF0aW9uLkRBbHJlYWR5UmVnaXN0ZXJlZAAlBB0BVGhlIHBlcnNvbiBhbHJlYWR5IGhhcyBhIHBlcnNvbmFsIGlkZW50aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGVpciBhbGlhcy5ESnVkZ2VtZW50TGlzdEZ1bGwAJgT4VGhlIGxpc3Qgb2YganVkZ2VtZW50cyBvbmdvaW5nIG9uIGEgcGVyc29uYWwgaWRlbnRpdHkgaXMgZnVsbC5sTGFzdFVzZXJuYW1lUmVwb3J0VG9vUmVjZW50ACcEsFRoZSB1c2VybmFtZSBoYXMgYmVlbiByZXBvcnRlZCB0b28gcmVjZW50bHkuYFVzZXJuYW1lSnVkZ2VtZW50T25nb2luZwAoBBEBVGhlIHVzZXJuYW1lIGhhcyBiZWVuIHJlcG9ydGVkIGFuZCBpcyB1bmRlcmdvaW5nIHZhbGlkaXR5IGp1ZGdlbWVudC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuUQoMTGluZGl2X3BhbGxldF9wZW9wbGUUdHlwZXMwUGVyc29uUmVjb3JkCBhNZW1iZXIBCCRBY2NvdW50SWQBBAAIAQxrZXkIARhNZW1iZXIAARxhY2NvdW50/QYBRE9wdGlvbjxBY2NvdW50SWQ+AABVCgxMaW5kaXZfcGFsbGV0X3Blb3BsZRhwYWxsZXQURXJyb3IEBFQAAZQkTm90UGVyc29uAAAE0FRoZSBzdXBwbGllZCBpZGVudGlmaWVyIGRvZXMgbm90IHJlcHJlc2VudCBhIHBlcnNvbi4UTm9LZXkAAQScVGhlIGdpdmVuIHBlcnNvbiBoYXMgbm8gYXNzb2NpYXRlZCBrZXkuOEludmFsaWRDb250ZXh0AAIEKQFUaGUgY29udGV4dCBpcyBub3QgYSBtZW1iZXIgb2YgdGhvc2UgYWxsb3dlZCB0byBoYXZlIGFjY291bnQgYWxpYXNlcyBoZWxkLjhJbnZhbGlkQWNjb3VudAADBGRUaGUgYWNjb3VudCBpcyBub3Qga25vd24uMEFjY291bnRJblVzZQAEBMhUaGUgYWNjb3VudCBpcyBhbHJlYWR5IGluIHVzZSB1bmRlciBhbm90aGVyIGFsaWFzLjBJbnZhbGlkUHJvb2YABQRUVGhlIHByb29mIGlzIGludmFsaWQuQEludmFsaWRTaWduYXR1cmUABgRkVGhlIHNpZ25hdHVyZSBpcyBpbnZhbGlkLiROb01lbWJlcnMABwTQVGhlcmUgYXJlIG5vdCB5ZXQgYW55IG1lbWJlcnMgb2Ygb3VyIHBlcnNvbmhvb2Qgc2V0LihJbmNvbXBsZXRlAAgEBQFUaGUgcm9vdCBjYW5ub3QgYmUgZmluYWxpemVkIGFzIHRoZXJlIGFyZSBzdGlsbCB1bnB1c2hlZCBtZW1iZXJzLihTdGlsbEZyZXNoAAkEYFRoZSByb290IGlzIHN0aWxsIGZyZXNoLjhUb29NYW55TWVtYmVycwAKBIhUb28gbWFueSBtZW1iZXJzIGhhdmUgYmVlbiBwdXNoZWQuPEtleUFscmVhZHlJblVzZQALBJRLZXkgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwZXJzb24uLEtleU5vdEZvdW5kAAwEoFRoZSBvbGQga2V5IHdhcyBub3QgZm91bmQgd2hlbiBleHBlY3RlZC4wQ291bGROb3RQdXNoAA0EkENvdWxkIG5vdCBwdXNoIG1lbWJlciBpbnRvIHRoZSByaW5nLhxTYW1lS2V5AA4ElFRoZSByZWNvcmQgaXMgYWxyZWFkeSB1c2luZyB0aGlzIGtleS5UUGVyc29uYWxJZE5vdFJlc2VydmVkAA8EdFBlcnNvbmFsIElkIHdhcyBub3QgcmVzZXJ2ZWQugFBlcnNvbmFsSWRSZXNlcnZhdGlvbkNhbm5vdFJlbmV3ABAEkFBlcnNvbmFsIElkIGhhcyBuZXZlciBiZWVuIHJlc2VydmVkLpBQZXJzb25hbElkTm90UmVzZXJ2ZWRPck5vdFJlY29nbml6ZWQAEQTcUGVyc29uYWwgSWQgd2FzIG5vdCByZXNlcnZlZCBvciBub3QgYWxyZWFkeSByZWNvZ25pemVkLixJbnZhbGlkUmluZwASBKxSaW5nIGNhbm5vdCBiZSBtZXJnZWQgaWYgaXQncyB0aGUgdG9wIHJpbmcuSFN1c3BlbnNpb25zUGVuZGluZwATBORSaW5nIGNhbm5vdCBiZSBidWlsdCB3aGlsZSB0aGVyZSBhcmUgc3VzcGVuc2lvbnMgcGVuZGluZy5cUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQAFATUUmluZyBjYW5ub3QgYmUgbWVyZ2VkIGlmIGl0J3Mgbm90IGJlbG93IDEvMiBjYXBhY2l0eS5ISW52YWxpZFN1c3BlbnNpb25zABUEoFN1c3BlbnNpb24gaW5kaWNlcyBwcm92aWRlZCBhcmUgaW52YWxpZC5ETm9NdXRhdGlvblNlc3Npb24AFgQ1AUFuIG11dGF0aW5nIGFjdGlvbiB3YXMgcXVldWVkIHdoZW4gdGhlcmUgd2FzIG5vIG11dGF0aW9uIHNlc3Npb24gaW4gcHJvZ3Jlc3MucENvdWxkTm90U3RhcnRNdXRhdGlvblNlc3Npb24AFwSkQW4gbXV0YXRpbmcgc2Vzc2lvbiBjb3VsZCBub3QgYmUgc3RhcnRlZC5sU3VzcGVuc2lvblNlc3Npb25JblByb2dyZXNzABgE9ENhbm5vdCBtZXJnZSByaW5ncyB3aGlsZSBhIHN1c3BlbnNpb24gc2Vzc2lvbiBpcyBpbiBwcm9ncmVzcy40QWxpYXNOb3RTdGFsZQAZBHxUaGUgYWxpYXMgbWFwcGluZyBpcyBub3Qgc3RhbGUuOFRpbWVPdXRPZlJhbmdlABoEeENhbGwgaXMgdG9vIGxhdGUgb3IgdG9vIGVhcmx5LlhBbGlhc0FjY291bnRBbHJlYWR5U2V0ABsEwEFsaWFzIDwtPiBBY2NvdW50IGlzIGFscmVhZHkgc2V0IGFuZCB1cCB0byBkYXRlLjBOb3RTdXNwZW5kZWQAHATQUGVyc29uaG9vZCBjYW5ub3QgYmUgcmVzdW1lZCBpZiBpdCBpcyBub3Qgc3VzcGVuZGVkLiRTdXNwZW5kZWQAHQRgUGVyc29uaG9vZCBpcyBzdXNwZW5kZWQuTEludmFsaWRLZXlNaWdyYXRpb24AHgSoSW52YWxpZCBzdGF0ZSBmb3IgYXR0ZW1wdGVkIGtleSBtaWdyYXRpb24uTEtleUFscmVhZHlTdXNwZW5kZWQAHwhVAUludmFsaWQgc3VzcGVuc2lvbiBvZiBhIGtleSBiZWxvbmdpbmcgdG8gYSBwZXJzb24gd2hvc2UgaW5kZXggaW4gdGhlIHJpbmcgaGFzIGFscmVhZHm4YmVlbiBpbmNsdWRlZCBpbiB0aGUgcGVuZGluZyBzdXNwZW5zaW9ucyBsaXN0LlRJbnZhbGlkT25ib2FyZGluZ1NpemUAIAToVGhlIG9uYm9hcmRpbmcgc2l6ZSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gcmluZyBzaXplLkBJbnZhbGlkTWVtYmVyS2V5ACEErFRoZSBtZW1iZXIga2V5IGlzIG5vdCB2YWxpZCBmb3IgdGhlIGNyeXB0by50UGVvcGxlQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAIgS8VGhlIHBlb3BsZSBjb2xsZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC40QWxpYXNNaXNtYXRjaAAjBBkBVGhlIHByb3ZpZGVkIGFsaWFzIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50J3MgY3VycmVudCBhbGlhcyBtYXBwaW5nLjhOb1N0YWxlQWxpYXNlcwAkBKBOb25lIG9mIHRoZSBzdXBwbGllZCBhbGlhc2VzIHdlcmUgc3RhbGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlkKDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0JE1vYkNyZWRpdAQcQmFsYW5jZQHEABABFHZvdGVkOAEMdTMyAAEcY2xlYW5lZDgBDHUzMgABHGNvcnJlY3Q4AQx1MzIAARhjcmVkaXTEARxCYWxhbmNlAABdCgAABAg4CABhCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBPcGVuQ2FzZQQsUnVudGltZUNhbGwBIAAMARRzaW5jZSgBQFNlY3NTaW5jZUdlbmVzaXMAARxkZXRhaWxzZQoBYENhc2VEZXRhaWxzPFJ1bnRpbWVDYWxsPgABFHRhbGx5dQoBJFZvdGVUYWxseQAAZQoMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQsQ2FzZURldGFpbHMELFJ1bnRpbWVDYWxsASAADAEkc3RhdGVtZW50aQoBJFN0YXRlbWVudAABHGNvbnRleHR4AUBKdWRnZW1lbnRDb250ZXh0AAEgY2FsbGJhY2txCgH8Q2FsbGJhY2s8KENhc2VJbmRleCwgSnVkZ2VtZW50Q29udGV4dCwgSnVkZ2VtZW50KSwgUnVudGltZUNhbGw+AABpChA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSRTdGF0ZW1lbnQAAQwoUHJvb2ZPZkluawwBGGRlc2lnbm0KAVRwcm9vZl9vZl9pbms6Oklua1NwZWMAASBldmlkZW5jZQgBMEV2aWRlbmNlSGFzaAABTHByb2JhYmxlX2FjY2VwdGFibGXIARBib29sAAAASElkZW50aXR5Q3JlZGVudGlhbAgBIHBsYXRmb3JtRQQBQGlkZW50aXR5OjpTb2NpYWwAASBldmlkZW5jZUEEAThpZGVudGl0eTo6RGF0YQABADRVc2VybmFtZVZhbGlkBAEgdXNlcm5hbWVBBAE4aWRlbnRpdHk6OkRhdGEAAgAAbQoUNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkwcHJvb2Zfb2ZfaW5rHElua1NwZWMAARBARGVzaWduZWRFbGVjdGl2ZQgALQMBLEZhbWlseUluZGV4AAAtAwEsRGVzaWduSW5kZXgAAABEUHJvY2VkdXJhbEFjY291bnQIAC0DASxGYW1pbHlJbmRleAAACAEkQWNjb3VudElkAAEASFByb2NlZHVyYWxQZXJzb25hbAgALQMBLEZhbWlseUluZGV4AAAoAShQZXJzb25hbElkAAIAKFByb2NlZHVyYWwIAC0DASxGYW1pbHlJbmRleAAAcAE4UHJvY2VkdXJhbFNlZWQAAwAAcQoQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkgQ2FsbGJhY2sIGFBhcmFtcwAsUnVudGltZUNhbGwAAAgBMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAB1CgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCRWb3RlVGFsbHkAAAwBDGF5ZTgBDHUzMgABDG5heTgBDHUzMgABIGNvbnRlbXB0OAEMdTMyAAB5CgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBSaXBlQ2FzZQQsUnVudGltZUNhbGwBIAAIARxkZXRhaWxzZQoBYENhc2VEZXRhaWxzPFJ1bnRpbWVDYWxsPgABHHZlcmRpY3RJBAEkSnVkZ2VtZW50AAB9CgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBEb25lQ2FzZQAACAEUc2luY2UoAUBTZWNzU2luY2VHZW5lc2lzAAEcdmVyZGljdEkEASRKdWRnZW1lbnQAAIEKDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0SENyZWRpdERpc3RyaWJ1dGlvbggcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgAFAEUcm91bmQ4AShSb3VuZEluZGV4AAE8aW5pdGlhbF9iYWxhbmNlxAEcQmFsYW5jZQABRHJlbWFpbmluZ19iYWxhbmNlxAEcQmFsYW5jZQABMHRvdGFsX3BvaW50cygBJFZvdGVDb3VudAABFHN0YXJ0OAEsQmxvY2tOdW1iZXIAAIUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBiQoEUwAABACNCgEYVmVjPFQ+AACJCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldDhQYXlvdXRTY2hlZHVsZQgcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgADAEkcmVtYWluaW5nOAEoUm91bmRJbmRleAABQGFtb3VudF9wZXJfcm91bmTEARxCYWxhbmNlAAEYcGVyaW9kOAEsQmxvY2tOdW1iZXIAAI0KAAACiQoAkQoMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAwBCHU4AACVCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldBRFcnJvcgQEVAABUChOb1N1Y2hDYXNlAAAEYFRoZSBjYXNlIGRvZXMgbm90IGV4aXN0LihOb1N1Y2hWb3RlAAEEYFRoZSB2b3RlIGRvZXMgbm90IGV4aXN0LhxOb3RPcGVuAAIEVFRoZSBjYXNlIGlzIG5vdCBvcGVuLhxOb3RSaXBlAAMEVFRoZSBjYXNlIGlzIG5vdCByaXBlLhxOb3REb25lAAQEZFRoZSBjYXNlIGlzIG5vdCB5ZXQgZG9uZS4oQ29kZWNFcnJvcgAFBFUBVGhlIGRlY29kZSBvZiB0aGUgY2FsbCBmYWlsZWQuIE1heWJlIHRoZXJlIHdhcyBhIGJyZWFraW5nIHJ1bnRpbWUgdXBncmFkZSBpbiBiZXR3ZWVuPzREaXNwYXRjaEVycm9yAAYETQFUaGUgY2FsbCBmYWlsZWQgdG8gZGlzcGF0Y2guIE1heWJlIHRoZXJlIHdhcyBhIGJyZWFraW5nIHJ1bnRpbWUgdXBncmFkZSBpbiBiZXR3ZWVuPxhSZWNlbnQABwSQVGhlIGNhc2UgaXMgdG9vIHJlY2VudCB0byBiZSByZWFwZWQuIE5vQ3JlZGl0AAgEoE5vdCBlbm91Z2ggY3JlZGl0IHRvIHBheW91dCB0aGUgcmV3YXJkcy4gTm9SZXdhcmQACQTUTm8gbW9iIGNyZWRpdCBkaXN0cmlidXRpb24gaW4gcGxhY2UgdG8gcmV3YXJkIHZvdGVycy4gTm9Qb2ludHMACgSgTm8gcG9pbnRzIHRvIGJlIGNvbnZlcnRlZCB0byBtb2IgY3JlZGl0LjRUb29NYW55Q2xhaW1zAAsEVFRvbyBtYW55IHZvdGUgY2xhaW1zLiBOb1BheW91dAAMBFhObyBwYXlvdXQgaW4gcHJvZ3Jlc3MuSEFyaXRobWV0aWNPdmVyZmxvdwANBLRUaGUgcG9pbnQgYW5kL29yIGNyZWRpdCBhcml0aG1ldGljIG92ZXJmbG93cy5AVG9vTWFueVNjaGVkdWxlcwAOBIBUb28gbWFueSBwYXlvdXQgcm91bmQgc2NoZWR1bGVzLihOb1NjaGVkdWxlAA8EfE5vIHBheW91dCByb3VuZCBzY2hlZHVsZSBmb3VuZC4kTm9QZW5hbHR5ABAEWE5vIHZvdGUgcGVuYWx0eSBmb3VuZC4URWFybHkAEQSUVGhlIHZvdGUgcGVuYWx0eSBoYXMgbm90IGV4cGlyZWQgeWV0LjBVbmRlclBlbmFsdHkAEgToVGhlIHZvdGUgY2Fubm90IGJlIGNhc3QgZHVlIHRvIGEgdm90aW5nIHBlbmFsdHkgaW4gZWZmZWN0LlhDYXNlRXhwaXJhdGlvbkRpc2FibGVkABMEHQFUaGUgb3BlbiBjYXNlIGV4cGlyYXRpb24gaXMgZGlzYWJsZWQgZHVlIHRvIGluc3VmZmljaWVudCBhY3RpdmUgdm90ZXJzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6ZCgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQkQ2FuZGlkYXRlECxKdWRnZW1lbnRJZAE4HERlcG9zaXQBnQosQmxvY2tOdW1iZXIBOCRBY2NvdW50SWQBBAEMHEFwcGxpZWQMARBjcmVkoQoBrENyZWRpYmlsaXR5PERlcG9zaXQsIFBlcnNvbmFsSWQsIEFjY291bnRJZD4AARxlbnRyb3B5CAEcRW50cm9weQABNGVudHJvcHlfc2luY2U4ASxCbG9ja051bWJlcgAAACBTZWxlY3RlZCABFHNpbmNlOAEsQmxvY2tOdW1iZXIAARBjcmVkoQoBrENyZWRpYmlsaXR5PERlcG9zaXQsIFBlcnNvbmFsSWQsIEFjY291bnRJZD4AASByZXNlcnZlZCgBKFBlcnNvbmFsSWQAARxlbnRyb3B5CAEcRW50cm9weQABGGRlc2lnbm0KARxJbmtTcGVjAAEoYWxsb2NhdGlvbqUKAShBbGxvY2F0aW9uAAEcanVkZ2luZwkDAUxPcHRpb248SnVkZ2VtZW50SWQ+AAEYZmFpbGVkOAEcQ291bnRlcgABABhQcm92ZW4QARhkZXNpZ25tCgEcSW5rU3BlYwABIHJlc2VydmVkKAEoUGVyc29uYWxJZAABMHdhc19yZWZlcnJlZMgBEGJvb2wAASx3YXNfaW52aXRlZMgBEGJvb2wAAgAAnQoUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAxAEoRjo6QmFsYW5jZQAAoQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0LENyZWRpYmlsaXR5DBxEZXBvc2l0AZ0KKFBlcnNvbmFsSWQBKCRBY2NvdW50SWQBBAEMIFJlZmVycmVkBAAoAShQZXJzb25hbElkAAAAHERlcG9zaXQEAJ0KARxEZXBvc2l0AAEAHEludml0ZWQEAAQBJEFjY291bnRJZAACAAClCgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQoQWxsb2NhdGlvbgABDBxJbml0aWFsAAAAIEluaXREb25lAAEAEEZ1bGwAAgAAqQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0GFBlcnNvbgQ8Qm91bmRlZEFjY291bnRzAa0KACQBGGRlc2lnbrEKATxPcHRpb248SW5rU3BlYz4AAUBhY3RpdmVfcmVmZXJyYWxzrQoBPEJvdW5kZWRBY2NvdW50cwABYGFsbG93ZWRfcmVmZXJyYWxfdGlja2V0czgBHENvdW50ZXIAATRiYWRfcmVmZXJyYWxzOAEcQ291bnRlcgABUHN1Y2Nlc3NmdWxfcmVmZXJyYWxzOAEcQ291bnRlcgABJHJlZmVycmFsczgBHENvdW50ZXIAASxkZXJpdmF0aXZlczgBHENvdW50ZXIAARhiYW5uZWTIARBib29sAAFgcGVuZGluZ19yZWZlcnJhbF9yZXdhcmRzOAEcQ291bnRlcgAArQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEEBFMAAAQAzAEYVmVjPFQ+AACxCgQYT3B0aW9uBARUAW0KAQgQTm9uZQAAABBTb21lBABtCgAAAQAAtQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG5CgRTAAAEAL0KARhWZWM8VD4AALkKDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldDhSZWZlcnJhbFRpY2tldAQYVGlja2V0AQQABAEYdGlja2V0BAEYVGlja2V0AAC9CgAAArkKAMEKDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldBhGYW1pbHkAAAgBEGtpbmR1BAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQAAMUKAAAECC0DLQMAyQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0MERlc2lnblN0YXR1cwABCCBSZXNlcnZlZAAAACRDb21taXR0ZWQAAQAAzQoAAAQIBAQA0QoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0FEVycm9yBARUAAGgKEluUHJvZ3Jlc3MAAATMQWNjb3VudCBpcyBhbHJlYWR5IGFwcGx5aW5nIHRvIG1ha2UgYSBwcm9vZi1vZi1pbmsuKE5vUmVmZXJyYWwAAQR4QWNjb3VudCBoYXMgbm90IGJlZW4gcmVmZXJyZWQuKEJhZENvbnRleHQAAgToVGhlIGNhbGxiYWNrIGNvbnRleHQgaXMgaW52YWxpZDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLkxVbmV4cGVjdGVkSnVkZ2VtZW50AAMEIQFUaGUgaW5jb21pbmcganVkZ2VtZW50IElEIGlzIG5vdCB3aGF0IHdlIHdlcmUgZXhwZWN0aW5nIGZvciB0aGUgYWNjb3VudC4YTm9BcmdzAAQEuE5vIGFyZ3VtZW50cyB3ZXJlIHN1cHBsaWVkIHdpdGggdGhlIGp1ZGdlbWVudC4oTm90QXBwbGllZAAFBMxUaGUgYWNjb3VudCBoYXMgbm90IGFwcGxpZWQgdG8gbWFrZSBhIHByb29mLW9mLWluay4sTm90U2VsZWN0ZWQABgSwVGhlIGNhbmRpZGF0ZSBoYXMgbm90IGNvbW1pdHRlZCB0byBhIGRlc2lnbi4kTm90UHJvdmVuAAcErFRoZSBjYW5kaWRhdGUgZGlkIG5vdCBwcm92ZSB0aGVtc2VsdmVzIHlldC44QWxyZWFkeVN0YXJ0ZWQACATIVGhlIGNhbmRpZGF0ZSBoYXMgYWxyZWFkeSBzdGFydGVkIHRoZWlyIGp1ZGdlbWVudC4oT3V0T2ZSYW5nZQAJBIBUaGUgcGVyc29uYWwgSUQgaXMgbm90IGluIHJhbmdlLjBBbHJlYWR5VGFrZW4ACgScVGhlIHBlcnNvbmFsIElEIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uPE5vTW9yZVJlZmVycmFscwALBLhUaGUgcGVyc29uIGhhcyBubyBtb3JlIHJlZmVycmFscyBsZWZ0IHRvIGdpdmUuIFRvb0Vhcmx5AAwEYFRoZSByZXJvbGwgaXMgdG9vIGVhcmx5LjREZXNpZ25JbnZhbGlkAA0EoFRoZSByZWZlcnJlcidzIGRlc2lnbiBpcyBub3QgcHJvY2VkdXJhbC4sRGVzaWduVGFrZW4ADgScVGhlIHJlZmVycmVyJ3MgZGVzaWduIGlzIGFscmVhZHkgdGFrZW4uJEJhZFBhcmVudAAPBBUBVGhlIHJlZmVycmVyIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgcGVyc29uLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uJEJhZEZhbWlseQAQBIBUaGUgZGVzaWduIGZhbWlseSBkb2Vzbid0IGV4aXN0LixXcm9uZ0ZhbWlseQARBLRUaGUgZGVzaWduIGZhbWlseSBpcyBpbnZhbGlkIGZvciB0aGlzIGNob2ljZS4sSW5kZXhUb29CaWcAEgRBAVRoZSBpbmRleCBvZiB0aGUgZGVzaWduIG9yIHZhcmlhbnQgaXMgYmV5b25kIHRoZSBhbGxvd2VkIG1heGltdW0gZm9yIHRoZSBmYW1pbHkuEEJ1c3kAEwT4VGhlIHN5c3RlbSBpcyBidXN5IHdpdGggdG9vIG1hbnkgY29tbWl0bWVudHM7IHRyeSBhZ2FpbiBsYXRlci4YQmFubmVkABQEqFRoZSBwZXJzb24gaGFzIGJlZW4gYmFubmVkIGZyb20gcmVmZXJyaW5nLihJbXByb2JhYmxlABUEJQFUaGUgY2FuZGlkYXRlIGhhcyBub3QgZGVtb25zdHJhdGVkIHByb2JhYmx5IHRocm91Z2ggdGhlIGluaXRpYWwgZXZpZGVuY2UuKElkUmVzZXJ2ZWQAFgTAVGhlIHBlcnNvbmFsIGlkZW50aXR5IGhhcyBhbHJlYWR5IGJlZW4gcmVzZXJ2ZWQuGElkVXNlZAAXBOhUaGUgcGVyc29uYWwgaWRlbnRpdHkgaXMgYWxyZWFkeSB0YWtlbiBieSBhIHByb3ZlbiBwZXJzb24uNEludmFsaWRUaWNrZXQAGAR8VGhlIHRpY2tldCBwcm92aWRlZCBpcyBpbnZhbGlkLiBOb1RpY2tldAAZBPBUaGUgY2FsbGVyIGhhcyBub3QgcHJvdmlkZWQgYSByZWZlcnJhbCBvciBpbnZpdGF0aW9uIHRpY2tldC40Tm90QXV0aG9yaXplZAAaBKRUaGUgYWNjb3VudCBpcyBub3QgYXV0aG9yaXplZCB0byBkbyB0aGlzLiROb3RQZXJzb24AGwSQVGhlIHBlcnNvbmFsIGlkZW50aXR5IGRvZXNuJ3QgZXhpc3QuRFJlZmVycmVkQ2FuZGlkYXRlABwEXQFUaGUgY2FuZGlkYXRlIGlzIHJlZmVycmVkLiBCdXQgdGhlIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2FuZGlkYXRlIHRvIG5vdCBiZSByZWZlcnJlZC5QTm90UmVmZXJyZWRDYW5kaWRhdGUAHQRdAVRoZSBjYW5kaWRhdGUgaXMgbm90IHJlZmVycmVkLiBCdXQgdGhlIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2FuZGlkYXRlIHRvIGJlIHJlZmVycmVkLkhOb1Jld2FyZFRvUmVnaXN0ZXIAHgSgVGhlcmUgaXMgbm8gcmVmZXJyYWwgcmV3YXJkIHRvIHJlZ2lzdGVyLkBSZXdhcmRUb1JlZ2lzdGVyAB8EBQFUaGVyZSBpcyBhIHBlbmRpbmcgcmVmZXJyYWwgcmV3YXJkIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkIGZpcnN0LiROb0ludml0ZXIAIARETm8gaW52aXRlciBmb3VuZC5ASW52YWxpZFNpZ25hdHVyZQAhBEhJbnZhbGlkIHNpZ25hdHVyZS4kTm9JbnZpdGVzACIEUE5vIGludml0ZSBhdmFpbGFibGUuOEFscmVhZHlJbnZpdGVkACMEWEludml0ZSBpcyBhbHJlYWR5IHNldC4oTm9SZWZlcnJlcgAkBHRUaGUgcmVmZXJyZXIgaXMgbm90IGEgcGVyc29uLjBOb3RQb2lQZXJzb24AJQToVGhlIGluZGl2aWR1YWwgaXMgbm90IGEgcGVyc29uIHJlY29nbml6ZWQgYnkgcHJvb2Ygb2YgaW5rLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAAmBIhUaGUgcHJvb2Ygb2Ygb3duZXJzaGlwIGlzIGludmFsaWQuaEludmFsaWRSZWltYnVyc2VtZW50VmFsdWVzACcElFRoZSByZWltYnVyc2VtZW50IHZhbHVlcyBhcmUgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu1QoAAAQIHQcIANkKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlczhBcmNoaXZlZFBsYXllcgQsQmxvY2tOdW1iZXIBOAEIIEtpY2thYmxlCAEoZmlyc3RfZ2FtZTgBDHUzMgABOGFyY2hpdmVkX3NpbmNlOAEsQmxvY2tOdW1iZXIAAAAoVW5raWNrYWJsZQQBKGZpcnN0X2dhbWU4AQx1MzIAAQAA3QoMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzGFBsYXllcgQsUGxheURlcG9zaXQB4QoAJAEoZmlyc3RfZ2FtZTgBDHUzMgABKHJlZ2lzdGVyZWTIARBib29sAAEsc2VudF9yZXBvcnTIARBib29sAAFoZWFybHlfYXR0ZW5kYW5jZV9lbmFjdG1lbnTlCgGAT3B0aW9uPEVhcmx5QXR0ZW5kYW5jZUVuYWN0bWVudD4AASh5ZXNfcGVyc29uDAEIdTgAATRub19ub3RfcGVyc29uDAEIdTgAAWBleHBlY3RlZF9tYXhfdm90ZV93ZWlnaHQtAwEMdTE2AAEsdm90ZV93ZWlnaHQMAQh1OAABLGNyZWRpYmlsaXR57QoBeFBsYXllckNyZWRpYmlsaXR5PFBsYXlEZXBvc2l0PgAA4QoUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAxAEoRjo6QmFsYW5jZQAA5QoEGE9wdGlvbgQEVAHpCgEIEE5vbmUAAAAQU29tZQQA6QoAAAEAAOkKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlc2BFYXJseUF0dGVuZGFuY2VFbmFjdG1lbnQAAAwBKGF0dGVuZGFuY2XIARBib29sAAFUZXh0ZXJuYWxseV9yZWNvZ25pemVkyAEQYm9vbAABKHplcm9fc2NvcmXIARBib29sAADtCgxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXNEUGxheWVyQ3JlZGliaWxpdHkELFBsYXlEZXBvc2l0AeEKAQwcSW52aXRlZAAAAChSZWNvZ25pemVkAAEAHERlcG9zaXQEAOEKASxQbGF5RGVwb3NpdAACAADxCgxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXMgR2FtZUluZm8EJEFjY291bnRJZAEEACQBFGluZGV4OAEMdTMyAAFEcmVnaXN0cmF0aW9uX2VuZHM4AQx1MzIAAUBzaHVmZmxlX2RlYWRsaW5lOAEMdTMyAAEkZ2FtZV9kYXRlOAEMdTMyAAEscmVwb3J0X2VuZHM4AQx1MzIAARRzdGF0ZfUKAVBHYW1lU3RhdGU8QWNjb3VudElkPgABOG1heF9ncm91cF9zaXplOAEMdTMyAAEYcm91bmRzDAEIdTgAAUhwZW5kaW5nX2F0dGVuZGFuY2U4AQx1MzIAAPUKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlcyRHYW1lU3RhdGUEJEFjY291bnRJZAEEARQwUmVnaXN0cmF0aW9uBAFEbmV4dF9wbGF5ZXJfaW5kZXg4AQx1MzIAAAAcU2h1ZmZsZQQBEHN0ZXD5CgFYU2h1ZmZsZVN0ZXA8QWNjb3VudElkPgABACRSZXBvcnRpbmcEATBwbGF5ZXJfY291bnQ4AQx1MzIAAgA0UGxheWVyUHJvY2VzcwgBOGxhc3RfaXRlcmF0aW9u/QoBiE9wdGlvbjxBY2NvdW50T3JQZXJzb248QWNjb3VudElkPj4AATBwbGF5ZXJfY291bnQ4AQx1MzIAAwAoQ2FuY2VsbGluZwQBOGxhc3RfaXRlcmF0aW9u/QoBiE9wdGlvbjxBY2NvdW50T3JQZXJzb248QWNjb3VudElkPj4ABAAA+QoMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzLFNodWZmbGVTdGVwBCRBY2NvdW50SWQBBAEQLFN0ZXAxSW5zZXJ0BAE4bGFzdF9pdGVyYXRpb279CgGIT3B0aW9uPEFjY291bnRPclBlcnNvbjxBY2NvdW50SWQ+PgAAADRTdGVwMlJldHJpZXZlCAFEbmV4dF9wbGF5ZXJfaW5kZXg4AQx1MzIAAUxyZWNvZ25pemVkX2ZpbmlzaGVkyAEQYm9vbAABAExTdGVwM0NvbXB1dGVXZWlnaHRzCAE4bGFzdF9pdGVyYXRpb279CgGIT3B0aW9uPEFjY291bnRPclBlcnNvbjxBY2NvdW50SWQ+PgABMHBsYXllcl9jb3VudDgBDHUzMgACAERTdGVwNEF3YWl0U2Vzc2lvbgQBMHBsYXllcl9jb3VudDgBDHUzMgADAAD9CgQYT3B0aW9uBARUAR0HAQgQTm9uZQAAABBTb21lBAAdBwAAAQAAAQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAZQQBGFZlYzxUPgAABQsAAAQIDDgACQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAZQQBGFZlYzxUPgAADQsAAAQIDAgAEQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGlBARTAAAEAKEEARhWZWM8VD4AABULDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlc0RTY3JhdGNoUmV3YXJkSW5mbwAACAEoZ2FtZV9pbmRleDgBDHUzMgABKHJhbmRvbW5lc3MIASBbdTg7IDMyXQAAGQsMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzSFNjcmF0Y2hFbGlnaWJpbGl0eQABCCBFbGlnaWJsZQQAOAEMdTMyAAAAHENsYWltZWQAAQAAHQsMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldBRFcnJvcgQEVAABiCxHYW1lT25nb2luZwAABDRHYW1lIG9uZ29pbmcuOE5vUmVnaXN0cmF0aW9uAAEEeE5vIHJlZ2lzdHJhdGlvbiBwaGFzZSBvbmdvaW5nLkRPdXRkYXRlZEdhbWVTZXR1cAACBFhUaGUgc2V0dXAgaXMgb3V0ZGF0ZWQuQEludmFsaWRHYW1lU2V0dXAAAwQ4SW52YWxpZCBzZXR1cC40SW52YWxpZFJlcG9ydAAEBDxJbnZhbGlkIHJlcG9ydC4YTm9HYW1lAAUEQE5vIGdhbWUgb25nb2luZy4sTm9SZXBvcnRpbmcABgRgTm8gcmVwb3J0IHBoYXNlIG9uZ29pbmcuNE5vdFJlZ2lzdGVyZWQABwQ8Tm90IHJlZ2lzdGVyZWQuREFscmVhZHlSZWdpc3RlcmVkAAgEaFBsYXllciBhbHJlYWR5IHJlZ2lzdGVyZWQuRFJlcG9ydEFscmVhZHlTZW50AAkEUFJlcG9ydCBhbHJlYWR5IHNlbnQuFEVhcmx5AAoEbE9wZXJhdGlvbiBpcyBub3QgdmFsaWQgeWV0LkROb3RLaWNrYWJsZVBsYXllcgALBJhUaGUgb3BlcmF0aW9uIGV4cGVjdCBhIHBsYXllciBhY2NvdW50LkBOb0FyY2hpdmVkUGxheWVyAAwEZE5vIGFyY2hpdmVkIHBsYXllciBmb3VuZC4gTm9UaWNrZXQADQRATm8gdGlja2V0IGZvdW5kLiROb0ludml0ZXMADgRQTm8gaW52aXRlIGF2YWlsYWJsZS44QWxyZWFkeUludml0ZWQADwRYSW52aXRlIGlzIGFscmVhZHkgc2V0LkBOb3RBY2NvdW50UGxheWVyABAE+E5vdCBhbiBhY2NvdW50IGJhc2VkIHBsYXllciwgZXhwZWN0ZWQgYW4gYWNjb3VudCBiYXNlZCBwbGF5ZXIuaFVzZUludml0ZUJ1dEFscmVhZHlQbGF5aW5nABEEyFRoZSBwbGF5ZXIgY2FuJ3QgdXNlIGFuIGludml0ZSBpZiBhbHJlYWR5IHBsYXlpbmcuUFRvb01hbnlHYW1lU2NoZWR1bGVzABIEQQFUaGUgbnVtYmVyIG9mIGV4aXN0aW5nIHNjaGVkdWxlcyBhbmQgbmV3IHNjaGVkdWxlcyBleGNlZWRzIHRoZSBjb25maWd1cmVkIGxpbWl0LkxOb1N1Y2hHYW1lU2NoZWR1bGVkABMEKQFUaGUgZ2FtZSB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZSByZW1vdmVkIHdhcyBub3QgZm91bmQgaW4gc2NoZWR1bGVkIGdhbWVzLoBJbnZhbGlkU3RhdGVtZW50QWNjb3VudFNpZ25hdHVyZQAUBKxUaGUgc3RhdGVtZW50IGFjY291bnQgc2lnbmF0dXJlIGlzIGludmFsaWQucFN0YXRlbWVudEFjY291bnRBbHJlYWR5SW5Vc2UAFQTsVGhlIHN0YXRlbWVudCBhY2NvdW50IGlzIGFscmVhZHkgaW4gdXNlZCBieSBhbm90aGVyIHBsYXllci5kSW50ZXJuYWxFcnJvckludmFsaWRTdGF0ZQAWBHRJbnRlcm5hbCBlcnJvciBpbnZhbGlkIHN0YXRlLkBJbnZhbGlkR2FtZVN0YXRlABcE8FRoZSBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBpbiB0aGUgY3VycmVudCBnYW1lIHN0YXRlLiBOb1BsYXllcgAYBEBObyBwbGF5ZXIgZm91bmQukENhbm5vdE9mZmJvYXJkV2hpbGVSZWdpc3RlcmVkRm9yR2FtZQAZBNxUaGUgcGxheWVyIGNhbm5vdCBvZmZib2FyZCB3aGlsZSByZWdpc3RlcmVkIGZvciBhIGdhbWUuMEludmFsaWRTdGF0ZQAaBDRJbnZhbGlkIHN0YXRlPE5vU2NyYXRjaFJld2FyZAAbBNhObyBjb25jbHVkZWQgZ2FtZSB3aXRoIGF2YWlsYWJsZSBzY3JhdGNoIGNhcmQgcmV3YXJkcy4sTm90RWxpZ2libGUAHAT8VGhlIHBsYXllciBpcyBub3QgZWxpZ2libGUgZm9yIHRoZSBjdXJyZW50IHNjcmF0Y2ggY2FyZCByZXdhcmQuJERpZE5vdFdpbgAdBNhUaGUgcGVyc29uIGRpZCBub3Qgd2luIHRoZSBzY3JhdGNoIGNhcmQgZm9yIHRoaXMgZ2FtZS44QWxyZWFkeUNsYWltZWQAHgTQVGhlIGFsaWFzIGhhcyBhbHJlYWR5IGNsYWltZWQgYSBzY3JhdGNoIGNhcmQgcmV3YXJkLjxTY3JhdGNoUG90RW1wdHkAHwSUVGhlIHNjcmF0Y2ggY2FyZCBwb3QgYmFsYW5jZSBpcyB6ZXJvLjhQb29sTm90Rm9yR2FtZQAgCBUBYGNsYWltX2dhbWVfcHJpemVgOiBgcG9vbF9pZGAgaXMgbm90IGEgYEdhbWVQYXJ0aWNpcGFudHNgIHBvb2wgKG9yIG5vSHN1Y2ggcG9vbCBleGlzdHMpLjhOb3RQYXJ0aWNpcGFudAAhCAEBYGNsYWltX2dhbWVfcHJpemVgOiB0aGUgcmVzb2x2ZWQgb3JpZ2luIGlkZW50aXR5IGhhcyBubyByZWNvcmRlZHxhdHRlbmRhbmNlIGZvciB0aGUgcG9vbCdzIGdhbWUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiELDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXMsUGFydGljaXBhbnQEHEJhbGFuY2UBxAAgARRzY29yZTgBDHUzMgABGHN0cmVhayULARhTdHJlYWsAAUhhdHRlbmRhbmNlX2hpc3RvcnkpCwFEQXR0ZW5kYW5jZUhpc3RvcnkAARhjcmVkaXTEARxCYWxhbmNlAAEoY2FzaGVkX291dMgBEGJvb2wAAUhyZWFjaGVkX3BlcnNvbmhvb2TIARBib29sAAFsaGFzX2V2ZXJfcmVhY2hlZF9wZXJzb25ob29kyAEQYm9vbAABLHJlY29nbml0aW9uLQsBLFJlY29nbml0aW9uAAAlCwxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzGFN0cmVhawABCCBBdHRlbmRlZAQAOAEMdTMyAAAAGEFic2VudAQAOAEMdTMyAAEAACkLDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXNEQXR0ZW5kYW5jZUhpc3RvcnkAAAQADAEIdTgAAC0LDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXMsUmVjb2duaXRpb24AARBQRXh0ZXJuYWxseVJlY29nbml6ZWQAAAA0Tm90UmVjb2duaXplZAABACRTdXNwZW5kZWQEACgBKFBlcnNvbmFsSWQAAgAoUmVjb2duaXplZAQAKAEoUGVyc29uYWxJZAADAAAxCwAABAg4HQcANQsMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlcyxSb3VuZFBheW91dAQcQmFsYW5jZQHEABABRHJlbWFpbmluZ19iYWxhbmNlxAEcQmFsYW5jZQABLHBvaW50X3ByaWNlxAEcQmFsYW5jZQABJHJlbWFpbmRlcsQBHEJhbGFuY2UAATB0b3RhbF9wb2ludHM4AQx1MzIAADkLDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXMkUm91bmRJbmZvCCxCbG9ja051bWJlcgE4HEJhbGFuY2UBxAAIASRmaW5pc2hfYXQ4ASxCbG9ja051bWJlcgABGGNyZWRpdMQBHEJhbGFuY2UAAD0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBQQsEUwAABABFCwEYVmVjPFQ+AABBCwxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzOFBheW91dFNjaGVkdWxlCBxCYWxhbmNlAcQsQmxvY2tOdW1iZXIBOAAMASRyZW1haW5pbmc4AQx1MzIAAUBhbW91bnRfcGVyX3JvdW5kxAEcQmFsYW5jZQABIGR1cmF0aW9uOAEsQmxvY2tOdW1iZXIAAEULAAACQQsASQsMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQURXJyb3IEBFQAAVQkTm90UGVyc29uAAAEjFRoZSBjYWxsaW5nIG9yaWdpbiBpcyBub3QgYSBwZXJzb24uXEhhc05vdFJlYWNoZWRQZXJzb25ob29kAAEEjFRoZSBwZXJzb24gZGlkbid0IHJlYWNoIHBlcnNvbmhvb2QuIE5vUmV3YXJkAAIEUE5vIHJld2FyZCBhdmFpbGFibGUuHE5vU2NvcmUAAwSMVGhlIHBlcnNvbiBoYXMgbm8gYXNzb2NpYXRlZCBzY29yZS4oTm9TY2hlZHVsZQAEBHRObyBwYXlvdXQgc2NoZWR1bGUgYXZhaWxhYmxlLkBUb29NYW55U2NoZWR1bGVzAAUEtFRvbyBtYW55IHBheW91dCBzY2hlZHVsZXMgYWxyZWFkeSByZWdpc3RlcmVkLihSZWNvZ25pemVkAAYEBQFUaGUgcGFydGljaXBhbnQgaXMgcmVjb2duaXplZCBvciBoYXMgYmVlbiByZWNvZ25pemVkIGFzIGEgcGVyc29uLjxDYXNoT3V0Q29vbGRvd24ABwTMVGhlIHBhcnRpY2lwYW50IGhhcyBhbHJlYWR5IGNhc2hlZCBvdXQgaW4gdGhpcyBlcmEuYFJvdW5kT25Hb2luZ09yTm9TY2hlZHVsZQAIBJRUaGUgcm91bmQgaXMgb24gZ29pbmcgb3Igbm8gc2NoZWR1bGUuHE5vUm91bmQACQSEVGhlIHBheW91dCByb3VuZCBoYXMgbm90IHN0YXJ0ZWQubEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZAAKBNBUaGUgb3JpZ2luIGlzIG5laXRoZXIgYSBwZXJzb24gbm9yIGEgc2lnbmVkIGFjY291bnQuwEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZE5vdEFjY291bnRQYXJ0aWNpcGFudAALBD0BVGhlIG9yaWdpbiBpcyBuZWl0aGVyIGEgcGVyc29uIG5vciBhIHNpZ25lZCBhY2NvdW50IG5vciBhbiBhY2NvdW50IHBhcnRpY2lwYW50LpxCYWRPcmlnaW5Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQADAQJAVRoZSBvcmlnaW4gaXMgbmVpdGhlciBhIHNpZ25lZCBhY2NvdW50IG5vciBhbiBhY2NvdW50IHBhcnRpY2lwYW50LlBBbHJlYWR5UGFydGljaXBhdGluZwANBKRUaGUgcGFydGljaXBhbnQgaXMgYWxyZWFkeSBwYXJ0aWNpcGF0aW5nLkRLZXlNdXN0QmVQcm92aWRlZAAOBGRUaGUga2V5IG11c3QgYmUgcHJvdmlkZWQuUEtleU11c3ROb3RCZVByb3ZpZGVkAA8EdFRoZSBrZXkgbXVzdCBub3QgYmUgcHJvdmlkZWQuUEhhc1JlYWNoZWRQZXJzb25ob29kABAEjEhhcyByZWFjaGVkIHBlcnNvbmhvb2QgaW4gdGhlIHBhc3QuXEludmFsaWRQcm9vZk9mT3duZXJzaGlwABEEiFRoZSBwcm9vZiBvZiBvd25lcnNoaXAgaXMgaW52YWxpZC44V2luZG93VG9vTGFyZ2UAEgQ9AUFuIGFic2VuY2UgZ3JhY2UgdGllciBoYXMgYSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBtYXhpbXVtIHRyYWNrYWJsZSBoaXN0b3J5ICg4KS5UQWxsb3dlZE1pc3Nlc1Rvb0xhcmdlABMEIQFUaGUgYWxsb3dlZCBtaXNzZXMgbXVzdCBiZSBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIHdpbmRvdyAob3IgYm90aCB6ZXJvKS5EU2NoZWR1bGVOb3RTb3J0ZWQAFAT4VGllcnMgbXVzdCBiZSBzb3J0ZWQgYnkgYXNjZW5kaW5nIGBwb3B1bGF0aW9uX3NpemVfdGhyZXNob2xkYC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuTQsMWGluZGl2X3BhbGxldF9kdW1teV9kaW0YcGFsbGV0GFJlY29yZAQMS2V5AQgACAEMa2V5CAEMS2V5AAEkc3VzcGVuZGVkyAEQYm9vbAAAUQsMWGluZGl2X3BhbGxldF9kdW1teV9kaW0YcGFsbGV0FEVycm9yBARUAAEQJE5vdFBlcnNvbgAABNxUaGUgcGVyc29uYWwgSUQgZG9lcyBub3QgYmVsb25nIHRvIGEgcmVjb2duaXplZCBwZXJzb24uME5vdFN1c3BlbmRlZAABBNhUaGUgcGVyc29uYWwgSUQgZG9lcyBub3QgYmVsb25nIHRvIGEgc3VzcGVuZGVkIHBlcnNvbi4sTm90UmVzZXJ2ZWQAAgTkVGhlIHBlcnNvbmFsIElEIGlzIG5vdCByZXNlcnZlZCBhbmQgYXdhaXRpbmcgcmVjb2duaXRpb24uNFRvb01hbnlQZW9wbGUAAwTAVGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWFueSBwZW9wbGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlULDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXM4TGl0ZVBlcnNvbkluZm8IGE1lbWJlcgEIGE1ldGhvZAFZCwAIATByaW5nX3ZyZl9rZXkIARhNZW1iZXIAARhtZXRob2RZCwEYTWV0aG9kAABZCwxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlFHR5cGVzRFJlY29nbml0aW9uTWV0aG9kBBxBY2NvdW50AQQBBDBVbmlxdWVEZXZpY2UEAAQBHEFjY291bnQAAAAAXQsMYGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZRhwYWxsZXQURXJyb3IEBFQAASxYTm9BdHRlc3RhdGlvbkFsbG93YW5jZQAABGRObyBhdHRlc3RhdGlvbiBhbGxvd2FuY2UubEludmFsaWRBdHRlc3RhdGlvblNpZ25hdHVyZQABBPBUaGUgc2lnbmF0dXJlIGNyZWF0ZWQgYnkgdGhlIGNhbmRpZGF0ZSdzIGFjY291bnQgaXMgaW52YWxpZC5cSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAgQFAVRoZSBzaWduYXR1cmUgY3JlYXRlZCBieSB0aGUgY2FuZGlkYXRlJ3MgcmluZyB2cmYga2V5IGlzIGludmFsaWQuREFscmVhZHlSZWdpc3RlcmVkAAMEkFRoZSBjYW5kaWRhdGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLjxLZXlBbHJlYWR5SW5Vc2UABATwVGhlIHJpbmcgVlJGIGtleSBpcyBhbHJlYWR5IGVucm9sbGVkIGJ5IGFub3RoZXIgbGl0ZSBwZXJzb24uMEFjY291bnRJblVzZQAFBHhUaGUgYWNjb3VudCBpcyBhbHJlYWR5IGluIHVzZS5YQWxpYXNBY2NvdW50QWxyZWFkeVNldAAGBORUaGUgYWxpYXMgPC0+IGFjY291bnQgbWFwcGluZyBpcyBhbHJlYWR5IHNldCBhbmQgY3VycmVudC5IQWxpYXNBY2NvdW50Tm90U2V0AAcEpFRoZSBhbGlhcyA8LT4gYWNjb3VudCBtYXBwaW5nIGlzIG5vdCBzZXQuTENhbGxCbG9ja091dE9mUmFuZ2UACAQhAVRoZSByZXF1ZXN0ZWQgYWxpYXMgc2V0dXAgYmxvY2sgd2luZG93IGlzIGludmFsaWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLkxJbnZhbGlkQWxpYXNDb250ZXh0AAkEdFRoZSBhbGlhcyBjb250ZXh0IGlzIGludmFsaWQueExpdGVQZW9wbGVDb2xsZWN0aW9uTm90Q3JlYXRlZAAKBPxUaGUgbGl0ZSBwZW9wbGUgbWVtYmVyIGNvbGxlY3Rpb24gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuYQsMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXMwQ29uc3VtZXJJbmZvAAAQAThpZGVudGlmaWVyX2tleT0EAVxDb21tdW5pY2F0aW9uSWRlbnRpZmllcgABNGZ1bGxfdXNlcm5hbWXpBAFAT3B0aW9uPFVzZXJuYW1lPgABNGxpdGVfdXNlcm5hbWVBBAEgVXNlcm5hbWUAASxjcmVkaWJpbGl0eWULASxDcmVkaWJpbGl0eQAAZQsMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXMsQ3JlZGliaWxpdHkAAQgQTGl0ZQAAABhQZXJzb24MARRhbGlhcwgBFEFsaWFzAAEsbGFzdF91cGRhdGUoAQx1NjQAARxkZW1vdGVkyAEQYm9vbAABAABpCwAABAhtCwgAbQsMNGluZGl2X3N1cHBvcnQUdXRpbHMwQmlnRW5kaWFuVTMyAAMEAAAADAQZAUEgdTMyIGVuY29kZWQgaW4gYmlnLWVuZGlhbiBmb3JtYXQgZm9yIGNvcnJlY3QgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZy5xCwxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlc1xTdG10U3RvcmVBbGxvd2FuY2VFbnRyeQQEVAAADAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABDHNlcTgBDHUzMgABFHNpbmNlKAEMdTY0AAB1CwAABAgEeQsAeQsAAAQMbQs4CAB9CwxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlc2RGcmllbmRSZXF1ZXN0UmVnaXN0cmF0aW9uBBxBY2NvdW50AQQACAEoYWNjb3VudF9pZAQBHEFjY291bnQAASRyZWZlcmVuY2X1BAFYRnJpZW5kUmVxdWVzdFJlZmVyZW5jZQAAgQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGFCwRTAAAEAIkLARhWZWM8VD4AAIULDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzFHR5cGVzVFJlc2VydmF0aW9uUXVldWVFbnRyeQQcQWNjb3VudAEEAAgBHGFjY291bnQEARxBY2NvdW50AAEkam9pbmVkX2F0KAEMdTY0AACJCwAAAoULAI0LCEhzcF9zdGF0ZW1lbnRfc3RvcmVIU3RhdGVtZW50QWxsb3dhbmNlAAAIASRtYXhfY291bnQ4AQx1MzIAASBtYXhfc2l6ZTgBDHUzMgAAkQsMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMYcGFsbGV0FEVycm9yBARUAAFgPEludmFsaWRVc2VybmFtZQAABJxVc2VybmFtZSBkb2VzIG5vdCBmaXQgdGhlIHJlcXVpcmVtZW50cy40VXNlcm5hbWVUYWtlbgABBGhVc2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLkRBbHJlYWR5UmVnaXN0ZXJlZAACBHxDb25zdW1lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAMEnFByb3ZpZGVkIHByb29mIG9mIG93bmVyc2hpcCBpcyBpbnZhbGlkLjROb3RSZWdpc3RlcmVkAAQEnFBlcnNvbiBpcyBub3QgcmVnaXN0ZXJlZCBhcyBhIGNvbnN1bWVyLjROb3RGdWxsUGVyc29uAAUEeENvbnN1bWVyIGlzIG5vdCBhIGZ1bGwgcGVyc29uLjRUb3VjaE5vdFJlYWR5AAYEzEF0dGVtcHRlZCB0byB1cGRhdGUgcGVyc29uIGF1dGhvcml6YXRpb24gdG9vIGVhcmx5LjROb1Jlc2VydmF0aW9uAAcEaFJlc2VydmF0aW9uIGlzIG5vdCBhY3RpdmUuUE5vdFJlc2VydmF0aW9uSG9sZGVyAAgEFQFUaGUgbGlua2VkIGxpdGUgaWRlbnRpdHkgaXMgbm90IHRoZSBhY3RpdmUgaG9sZGVyIG9mIHRoZSByZXNlcnZhdGlvbi5gVXNlcm5hbWVSZXNlcnZhdGlvblRha2VuAAkE5FRoZSB1c2VybmFtZSBpbiB0aGUgcmVzZXJ2YXRpb24gcmVxdWVzdCBpcyBhbHJlYWR5IHRha2VuLkBSZXNlcnZhdGlvbkZyZXNoAAoEgFRoZSByZXNlcnZhdGlvbiBoYXMgbm90IGV4cGlyZWQuQE5vTGlua2VkSWRlbnRpdHkACwScVGhlcmUgaXMgbm8gbGl0ZSBjb25zdW1lciB0byBiZSBsaW5rZWQuNEFscmVhZHlMaW5rZWQADAT4VGhlIGxpdGUgY29uc3VtZXIgaXMgYWxyZWFkeSBsaW5rZWQgdG8gYSBmdWxsIHBlcnNvbiBjb25zdW1lci5QUGVyc29uQXV0aE5vdEV4cGlyZWQADQS8VGhlIHBlcnNvbidzIGF1dGhvcml6YXRpb24gaGFzIG5vdCBleHBpcmVkIHlldC44QWxyZWFkeURlbW90ZWQADgSQVGhlIHBlcnNvbiBoYXMgYWxyZWFkeSBiZWVuIGRlbW90ZWQuJFF1ZXVlRnVsbAAPBIBRdWV1ZSBmb3IgdGhpcyB1c2VybmFtZSBpcyBmdWxsLihOb3RJblF1ZXVlABAEuEFjY291bnQgaXMgbm90IGluIHRoZSBxdWV1ZSBmb3IgdGhpcyB1c2VybmFtZS5UQWxyZWFkeUhhc1Jlc2VydmF0aW9uABEE3EFjY291bnQgYWxyZWFkeSBoYXMgYSByZXNlcnZhdGlvbiBmb3IgYW5vdGhlciB1c2VybmFtZS5wSW52YWxpZEZyaWVuZFJlcXVlc3RTZXF1ZW5jZQASBNBGcmllbmQgcmVxdWVzdCBzZXF1ZW5jZSBpcyBpbnZhbGlkIGZvciB0aGUgY29uc3VtZXIuaEludmFsaWRGcmllbmRSZXF1ZXN0UGVyaW9kABMEwEZyaWVuZCByZXF1ZXN0IHBlcmlvZCBpcyBub3QgdGhlIGN1cnJlbnQgcGVyaW9kLoxGcmllbmRSZXF1ZXN0UmVnaXN0cmF0aW9uTm90RXhwaXJlZAAUBLxGcmllbmQgcmVxdWVzdCByZWdpc3RyYXRpb24gaXMgbm90IGV4cGlyZWQgeWV0LphGcmllbmRSZXF1ZXN0UmVnaXN0cmF0aW9uQWxyZWFkeUV4aXN0cwAVBAUBRnJpZW5kIHJlcXVlc3QgcmVnaXN0cmF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgYWxpYXMvY29udGV4dC5wU3RtdFN0b3JlUmVwbGFjZW1lbnRUb29FYXJseQAWBBkBVGhlIHJlcGxhY2VtZW50IGNvb2xkb3duIGhhcyBub3QgZWxhcHNlZCBzaW5jZSB0aGUgZW50cnkgd2FzIGxhc3Qgc2V0LoxMb25nVGVybVN0b3JhZ2VDbGVhbnVwTGltaXRFeGNlZWRlZAAXBOxUaGUgcHJvdmlkZWQgYGxpbWl0YCBleGNlZWRzIGBMb25nVGVybVN0b3JhZ2VDbGVhbnVwTGltaXRgLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6VCwAABAj9BDgAmQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGdCwRTAAAEAKELARhWZWM8VD4AAJ0LDCh2ZXJpZmlhYmxlEHJpbmcsU3RhdGljQ2h1bmsAA2AAAAAMAKELAAACnQsApQsMbGluZGl2X3BhbGxldF9jaHVua3NfbWFuYWdlchhwYWxsZXQURXJyb3IEBFQAAQw0Q2h1bmtOb3RGb3VuZAAABKBUaGUgcmVxdWVzdGVkIGNodW5rIGluZGV4IGRvZXNuJ3QgZXhpc3QuNEludmFsaWRDaHVua3MAAQSwVGhlIHByb3ZpZGVkIGNodW5rIGRhdGEgY291bGRuJ3QgYmUgZGVjb2RlZC5ESW52YWxpZENodW5rUmFuZ2UAAgTcVGhlIHN0YXJ0IGluZGV4IGlzbid0IHN0cmljdGx5IGxlc3MgdGhhbiB0aGUgZW5kIGluZGV4LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6pCwxQaW5kaXZfcGFsbGV0X21lbWJlcnMUdHlwZXM4Q29sbGVjdGlvbkluZm8IHEFjY291bnQBBCBMb2NhdGlvbgHgABABFG93bmVyrQsBiENvbGxlY3Rpb25Pd25lcjxBY2NvdW50LCBMb2NhdGlvbj4AARBtb2RlsQsBIFJpbmdNb2RlAAEkcmluZ19zaXpl/QQBMFJpbmdFeHBvbmVudAABUHNlbGZfaW5jbHVzaW9uX2RlbGF5FQMBLE9wdGlvbjx1NjQ+AACtCwxQaW5kaXZfcGFsbGV0X21lbWJlcnMUdHlwZXM8Q29sbGVjdGlvbk93bmVyCBxBY2NvdW50AQQgTG9jYXRpb24B4AEIIEV4dGVybmFsBADgASBMb2NhdGlvbgAAABRMb2NhbAQABAEcQWNjb3VudAABAACxCxA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSBSaW5nTW9kZQABCChBcHBlbmRPbmx5AAAAIEZsZXhpYmxlAAEAALULDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEAFUEARhWZWM8VD4AALkLAAAECAg4AL0LDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlcyBSaW5nUm9vdAQEVAAADAEQcm9vdMELATBNZW1iZXJzT2Y8VD4AASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAATBpbnRlcm1lZGlhdGXFCwFESW50ZXJtZWRpYXRlT2Y8VD4AAMELDCh2ZXJpZmlhYmxlEHJpbmdETWVtYmVyc0NvbW1pdG1lbnQAAwADAAAMAMULDCh2ZXJpZmlhYmxlEHJpbmcoTWVtYmVyc1NldAADUAMAAAwAyQsAAAQMCDhtCwDNCwxQaW5kaXZfcGFsbGV0X21lbWJlcnMUdHlwZXMcT2xkUm9vdAQEVAAACAEQcm9vdMELATBNZW1iZXJzT2Y8VD4AASxhcmNoaXZlZF9hdCgBDHU2NAAA0QsAAAQMCDg4ANULDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEAFUEARhWZWM8VD4AANkLEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5KFJpbmdTdGF0dXMAAAwBFHRvdGFsOAEMdTMyAAEgaW5jbHVkZWQ4AQx1MzIAATxpbW11dGFibGVfc2luY2UVAwEsT3B0aW9uPHU2ND4AAN0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAGUEARhWZWM8VD4AAOELAAAECAgIAOULEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5MFJpbmdQb3NpdGlvbgABDChPbmJvYXJkaW5nCAEocXVldWVfcGFnZTgBJFBhZ2VJbmRleAABJHF1ZXVlZF9hdCgBDHU2NAAAACBJbmNsdWRlZAwBKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAASRyaW5nX3BhZ2U4ASRQYWdlSW5kZXgAATRyaW5nX3Bvc2l0aW9uOAEMdTMyAAEAJFN1c3BlbmRlZAACAADpCxA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eUBSaW5nTWVtYmVyc1N0YXRlAAAEARBtb2Rl7QsBQFJpbmdNdXRhdGlvbk1vZGUAAO0LEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5QFJpbmdNdXRhdGlvbk1vZGUAAQgoQXBwZW5kT25seQAAACBNdXRhdGluZwQADAEIdTgAAQAA8QsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAVQQBGFZlYzxUPgAA9QsMUGluZGl2X3BhbGxldF9tZW1iZXJzGHBhbGxldBRFcnJvcgQEVAABcCROb3RNZW1iZXIAAATQVGhlIHN1cHBsaWVkIGlkZW50aWZpZXIgZG9lcyBub3QgcmVwcmVzZW50IGEgbWVtYmVyLhhOb1Jvb3QAAQREUmluZyBoYXMgbm8gcm9vdC4wSW52YWxpZFByb29mAAIEVFRoZSBwcm9vZiBpcyBpbnZhbGlkLihJbmNvbXBsZXRlAAMEBQFUaGUgcm9vdCBjYW5ub3QgYmUgZmluYWxpemVkIGFzIHRoZXJlIGFyZSBzdGlsbCB1bnB1c2hlZCBtZW1iZXJzLjhUb29NYW55TWVtYmVycwAEBIhUb28gbWFueSBtZW1iZXJzIGhhdmUgYmVlbiBwdXNoZWQuPEtleUFscmVhZHlJblVzZQAFBJRLZXkgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBtZW1iZXIuLEtleU5vdEZvdW5kAAYEoFRoZSBvbGQga2V5IHdhcyBub3QgZm91bmQgd2hlbiBleHBlY3RlZC4wQ291bGROb3RQdXNoAAcEkENvdWxkIG5vdCBwdXNoIG1lbWJlciBpbnRvIHRoZSByaW5nLixJbnZhbGlkUmluZwAIBKxSaW5nIGNhbm5vdCBiZSBtZXJnZWQgaWYgaXQncyB0aGUgdG9wIHJpbmcuSFN1c3BlbnNpb25zUGVuZGluZwAJBORSaW5nIGNhbm5vdCBiZSBidWlsdCB3aGlsZSB0aGVyZSBhcmUgc3VzcGVuc2lvbnMgcGVuZGluZy5cUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQACgTUUmluZyBjYW5ub3QgYmUgbWVyZ2VkIGlmIGl0J3Mgbm90IGJlbG93IDEvMiBjYXBhY2l0eS5ISW52YWxpZFN1c3BlbnNpb25zAAsEoFN1c3BlbnNpb24gaW5kaWNlcyBwcm92aWRlZCBhcmUgaW52YWxpZC5ATm9SZW1vdmFsU2Vzc2lvbgAMBC0BQSBtdXRhdGluZyBhY3Rpb24gd2FzIHF1ZXVlZCB3aGVuIHRoZXJlIHdhcyBubyByZW1vdmFsIHNlc3Npb24gaW4gcHJvZ3Jlc3MubENvdWxkTm90U3RhcnRSZW1vdmFsU2Vzc2lvbgANBJxBIHJlbW92YWwgc2Vzc2lvbiBjb3VsZCBub3QgYmUgc3RhcnRlZC5gUmVtb3ZhbFNlc3Npb25JblByb2dyZXNzAA4E6ENhbm5vdCBtZXJnZSByaW5ncyB3aGlsZSBhIHJlbW92YWwgc2Vzc2lvbiBpcyBpbiBwcm9ncmVzcy5MS2V5QWxyZWFkeVN1c3BlbmRlZAAPCFUBSW52YWxpZCBzdXNwZW5zaW9uIG9mIGEga2V5IGJlbG9uZ2luZyB0byBhIG1lbWJlciB3aG9zZSBpbmRleCBpbiB0aGUgcmluZyBoYXMgYWxyZWFkebhiZWVuIGluY2x1ZGVkIGluIHRoZSBwZW5kaW5nIHN1c3BlbnNpb25zIGxpc3QuVEludmFsaWRPbmJvYXJkaW5nU2l6ZQAQBOhUaGUgb25ib2FyZGluZyBzaXplIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSByaW5nIHNpemUuQEludmFsaWRNZW1iZXJLZXkAEQSsVGhlIG1lbWJlciBrZXkgaXMgbm90IHZhbGlkIGZvciB0aGUgY3J5cHRvLkhDb2xsZWN0aW9uTm90Rm91bmQAEgR4VGhlIGNvbGxlY3Rpb24gZG9lcyBub3QgZXhpc3QuXENvbGxlY3Rpb25BbHJlYWR5RXhpc3RzABMEeFRoZSBjb2xsZWN0aW9uIGFscmVhZHkgZXhpc3RzLkhUb29NYW55Q29sbGVjdGlvbnMAFASQVG9vIG1hbnkgY29sbGVjdGlvbnMgZm9yIHRoaXMgb3duZXIuaEludmFsaWRSaW5nU2l6ZUZvckZsZXhpYmxlABUEEQFGbGV4aWJsZSBjb2xsZWN0aW9ucyBtdXN0IHVzZSB0aGUgTWF4RmxleGlibGVSaW5nRXhwb25lbnQgcmluZyBzaXplLkxJbnZhbGlkUmluZ0V4cG9uZW50ABYEjFRoZSByaW5nIGV4cG9uZW50IGlzIG5vdCBzdXBwb3J0ZWQuTFByZW1hdHVyZU9uYm9hcmRpbmcAFwS0SW5zdWZmaWNpZW50IG1lbWJlcnMgaW4gdGhlIHF1ZXVlIHRvIG9uYm9hcmQubENvbGxlY3Rpb25NYXJrZWRGb3JEZWxldGlvbgAYBPRUaGUgY29sbGVjdGlvbiBpcyBtYXJrZWQgZm9yIGRlbGV0aW9uIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQuSE5vdENvbGxlY3Rpb25Pd25lcgAZBLhUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhlIGNvbGxlY3Rpb24uNE5vdE9uYm9hcmRpbmcAGgSoVGhlIG1lbWJlciBpcyBub3QgaW4gdGhlIG9uYm9hcmRpbmcgcXVldWUuOE5vdGhpbmdUb0J1aWxkABsEfFRoZXJlIGlzIG5vIHJpbmcgcm9vdCB0byBidWlsZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu+QsMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldChMb2NrZWRDb2luAAAIARhyZWFzb279CwEoTG9ja1JlYXNvbgABFHVudGlsKAEMdTY0AAD9CwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0KExvY2tSZWFzb24AAQQ4RmFpbGVkRGlzcGF0Y2gEARxyZXRyaWVzDAEIdTgAAAAAAQwAAAQMdQM4CAAFDAAABAh1AzgACQwMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldBRFcnJvcgQEVAABeFBNZW1iZXJLZXlBbHJlYWR5VXNlZAAAAEBJbnZhbGlkTWVtYmVyS2V5AAEANEludGVybmFsRXJyb3IAAgBcUmVjeWNsZXJBbHJlYWR5VW5sb2FkZWQAAwBQSW52YWxpZENvbnNvbGlkYXRpb24ABABMQ29uc29saWRhdGlvblRvb0JpZwAFADxDb2luVmFsdWVUb29CaWcABgBEQ29pblZhbHVlVG9vU21hbGwABwBYQ29pblZhbHVlSXNMZXNzVGhhbkZlZQAIAExDb2luVmFsdWVPdXRPZkJvdW5kAAkAYExvc3N5Q29pblZhbHVlQ29udmVyc2lvbgAKCCEBVGhlIGNvaW4gdmFsdWUgY2Fubm90IGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvIGFuIGFzc2V0IGFtb3VudCBiZWNhdXNl9GBVbmRlcmx5aW5nQXNzZXRVbml0YCBpcyBub3QgZXZlbmx5IGRpdmlzaWJsZSBieSBgMl58dmFsdWV8YC5ESW52YWxpZEFsaWFzUHJvb2YACwBMTm9VbmxvYWRpbmdSZWN5Y2xlcgAMAFRQcm9vZkFuZEFsaWFzTWlzbWF0Y2gADQA4Tm90aGluZ1RvQnVpbGQADgAwVG9vTWFueVJpbmdzAA8AVEFkZHJlc3NBbHJlYWR5SGFzQ29pbgAQAFxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAARACxFbXB0eUlucHV0cwASAEBSZWN5Y2xlck1pc21hdGNoABMECQFUaGUgZmVlIHJlY3ljbGVyIGluIHRoZSBvcmlnaW4gZG9lcyBub3QgbWF0Y2ggdGhlIGNhbGwncyByZWN5Y2xlci5gSW5zdWZmaWNpZW50VW5sb2FkRm9yRmVlABQEvFRoZSB0b3RhbCB1bmxvYWRlZCBhbW91bnQgaXMgbGVzcyB0aGFuIHRoZSBmZWUuREFsaWFzTm90UHJlbWFya2VkABUEOQFUaGUgZmlyc3QgYWxpYXMgd2FzIG5vdCBwcmUtbWFya2VkIGJ5IGV4dGVuc2lvbiAocmVxdWlyZWQgZm9yIEZyb21PdXRwdXQgZmVlKS5cSW52YWxpZFJlY3ljbGVyUmV2aXNpb24AFgRJAVRoZSByZWN5Y2xlciByZXZpc2lvbiBkb2VzIG5vdCBtYXRjaCAocmVjeWNsZXIgbWF5IG5vdCBleGlzdCBvciBoYXMgYmVlbiByZWJ1aWx0KS4wSW52YWxpZFNwbGl0ABcAREZyZXNoQ29pblJlcXVpcmVkABgEyFRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIGEgZnJlc2ggY29pbiAoYGFnZSA9PSAwYCkuaENhbm5vdENvbnZlcnROYXRpdmVUb0Fzc2V0ABkAaE1heEZlZU5vdEFsbG93ZWRGb3JQcmVwYWlkABoEvFdoZW4gdXNpbmcgUHJlcGFpZCBmZWUgbW9kZSwgbWF4X2ZlZSBtdXN0IGJlIDAuSE1heEZlZUV4Y2VlZHNJbnB1dAAbBKhUaGUgbWF4X2ZlZSBleGNlZWRzIHRoZSB0b3RhbCBpbnB1dCB2YWx1ZS40SW52YWxpZE1heEZlZQAcBNhUaGUgbWF4IGZlZSBhcmd1bWVudCBkb2Vzbid0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cy54Q2Fubm90Q3JlYXRlUmVjeWNsZXJDb2xsZWN0aW9uAB0EKQFUaGUgcmVjeWNsZXIgY29sbGVjdGlvbiBkb2VzIG5vdCBleGlzdCBhbmQgY291bGQgbm90IGJlIGNyZWF0ZWQgb24tZGVtYW5kLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4NDAAABAgJAwkDABEMBBhPcHRpb24EBFQB2QsBCBBOb25lAAAAEFNvbWUEANkLAAABAAAVDAQYT3B0aW9uBARUAXEDAQgQTm9uZQAAABBTb21lBABxAwAAAQAAGQwEGE9wdGlvbgQEVAF1AwEIEE5vbmUAAAAQU29tZQQAdQMAAAEAAB0MDHRpbmRpdl9wYWxsZXRfbWVtYmVyc19ub3RpZmllchR0eXBlczhTdWJzY3JpYmVySW5mbwQEVAAADAEsY29sbGVjdGlvbnNJBQEZAUJvdW5kZWRWZWM8KElkZW50aWZpZXIsIFJpbmdFeHBvbmVudCksIFQ6Ok1heENvbGxlY3Rpb25zUGVyU3Vic2NyaWJlcj4AAUhsYXN0X2luaXRfc2VxdWVuY2UoAThTZXF1ZW5jZU51bWJlcgABMHBhbGxldF9pbmRleAwBCHU4AAAhDAx0aW5kaXZfcGFsbGV0X21lbWJlcnNfbm90aWZpZXIUdHlwZXMsUGFnaW5nU3RhdGUELEJsb2NrTnVtYmVyATgADAEod3JpdGVfcGFnZS0DAQx1MTYAASRzZW5kX3BhZ2UtAwEMdTE2AAFEbGFzdF91cGRhdGVfYmxvY2s4ASxCbG9ja051bWJlcgAAJQwAAAQMLQMIOAApDAx0aW5kaXZfcGFsbGV0X21lbWJlcnNfbm90aWZpZXIUdHlwZXNAUGVuZGluZ0luaXRTdGF0ZQQEVAAAGAEsY29sbGVjdGlvbnNJBQEZAUJvdW5kZWRWZWM8KElkZW50aWZpZXIsIFJpbmdFeHBvbmVudCksIFQ6Ok1heENvbGxlY3Rpb25zUGVyU3Vic2NyaWJlcj4AAWBjdXJyZW50X2NvbGxlY3Rpb25faW5kZXg4AQx1MzIAAUBhZnRlcl9yaW5nX2luZGV4CQMBRE9wdGlvbjxSaW5nSW5kZXg+AAEgc2VxdWVuY2UoAThTZXF1ZW5jZU51bWJlcgABLHNvdXJjZV90aW1lKAEMdTY0AAEwcGFsbGV0X2luZGV4DAEIdTgAAC0MDHRpbmRpdl9wYWxsZXRfbWVtYmVyc19ub3RpZmllchR0eXBlc1hCYXRjaERpc3RyaWJ1dGlvblN0YXRlBCxCbG9ja051bWJlcgE4ABABIHNlcXVlbmNlKAE4U2VxdWVuY2VOdW1iZXIAASxzb3VyY2VfdGltZSgBDHU2NAABJHNlYWxlZF9hdDgBLEJsb2NrTnVtYmVyAAFUcmVtYWluaW5nX3N1YnNjcmliZXJzOAEMdTMyAAAxDAAABAicCAA1DAx0aW5kaXZfcGFsbGV0X21lbWJlcnNfbm90aWZpZXIYcGFsbGV0FEVycm9yBARUAAE0SFN1YnNjcmliZXJOb3RGb3VuZAAABFRTdWJzY3JpYmVyIG5vdCBmb3VuZC5EQWxyZWFkeVN1YnNjcmliZWQAAQRoU3Vic2NyaWJlciBhbHJlYWR5IGV4aXN0cy5IVG9vTWFueVN1YnNjcmliZXJzAAIEcE1heGltdW0gc3Vic2NyaWJlcnMgcmVhY2hlZC5YSW52YWxpZENvbGxlY3Rpb25zTGlzdAADBD0BQ29sbGVjdGlvbnMgbGlzdCBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIgd2l0aCBubyBkdXBsaWNhdGVzLjhUb29NYW55VXBkYXRlcwAEBNBUb28gbWFueSByaW5nIHJvb3QgdXBkYXRlcyB0byBmaXQgaW4gYSBzaW5nbGUgYmF0Y2guNFhjbVNlbmRGYWlsZWQABQRAWENNIHNlbmQgZmFpbGVkLmROb3RTdWJzY3JpYmVkVG9Db2xsZWN0aW9uAAYE5FN1YnNjcmliZXIgaXMgbm90IHN1YnNjcmliZWQgdG8gdGhlIHJlcXVlc3RlZCBjb2xsZWN0aW9uLkBJbnZhbGlkUmluZ0luZGV4AAcEgFJpbmcgcm9vdCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuWEV4Y2VlZHNDaGFubmVsQ2FwYWNpdHkACAQBAVJlcXVlc3RlZCB1cGRhdGVzIGV4Y2VlZCB0aGUgc3Vic2NyaWJlcidzIEhSTVAgY2hhbm5lbCBjYXBhY2l0eS40Tm9CYXRjaEFjdGl2ZQAJBFxObyBhY3RpdmUgYmF0Y2ggZXhpc3RzLjROb1BlbmRpbmdJbml0AAoEuE5vIHBlbmRpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHRoaXMgc3Vic2NyaWJlci5QUmVwbGF5Q29vbGRvd25BY3RpdmUACwQNAVJlcGxheSBjb29sZG93biBoYXMgbm90IGVsYXBzZWQgZm9yIHRoaXMgc3Vic2NyaWJlciBhbmQgY29sbGVjdGlvbi5ARW1wdHlSaW5nSW5kaWNlcwAMBORSZXBsYXkgcmVxdWVzdGVkIHdpdGggYW4gZW1wdHkgbGlzdCBvZiByaW5nIHJvb3QgaW5kaWNlcy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuOQwMjGluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uGHBhbGxldCxPblBvbGxTdGF0ZQABICBJbmFjdGl2ZQAAADRDcmVhdGluZ0Fzc2V0AAEAQFhjbUZ1bmRzVHJhbnNmZXIAAgA4VmVyaWZ5aW5nRnVuZHMAAwAsRnVuZGluZ1BvdHMABABgU2NoZWR1bGluZ01vYlJ1bGVQYXlvdXRzAAUAWFNjaGVkdWxpbmdTY29yZVBheW91dHMABgBMT3BlbmluZ0FpcmRyb3BQb29scwAHAAA9DAygaW5kaXZfcGFsbGV0X3N0b3JhZ2VfaW5pdGlhbGl6YXRpb25fbGl0ZRhwYWxsZXQsT25Qb2xsU3RhdGUAAQggSW5hY3RpdmUAAAAkQ29tcGxldGVkAAEAAEEMDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQkUHJpemVQb29sDCRBY2NvdW50SWQBBBxBc3NldElkAeAwQXNzZXRCYWxhbmNlAcQAIAEIaWQ4ASxQcml6ZVBvb2xJZAABGHRhcmdldGUFASxQcml6ZVRhcmdldAABKGRpc3BhdGNoZXIEASRBY2NvdW50SWQAAShleHBpcmVzX2F0KAEMdTY0AAFAcHJpemVzX3JlbWFpbmluZzgBDHUzMgABLHByaXplX3ZhbHVlxAEwQXNzZXRCYWxhbmNlAAEgYXNzZXRfaWTgARxBc3NldElkAAFAdGFyZ2V0X3RocmVzaG9sZEUMARBVMjU2AABFDAg8cHJpbWl0aXZlX3R5cGVzEFUyNTYAAAQASQwBIFt1NjQ7IDRdAABJDAAAAwQAAAAoAE0MDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQURXJyb3IEBFQAATyIUHJpemVNdXN0QmVNb3JlT3JFcXVhbFRvTWluQmFsYW5jZQAABNxUaGUgcHJpemUgbXVzdCBiZSBhdCBsZWFzdCB0aGUgYXNzZXQncyBtaW5pbXVtIGJhbGFuY2UuPFZhbGlkaXR5VG9vTG9uZwABBJhWYWxpZGl0eSBleGNlZWRzIGBNYXhWYWxpZGl0eVNlY29uZHNgLkBWYWxpZGl0eVRvb1Nob3J0AAIEnFZhbGlkaXR5IGlzIGJlbG93IGBNaW5WYWxpZGl0eVNlY29uZHNgLiBOb1ByaXplcwADBJxgbnVtX3ByaXplc2AgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5ESW5zdWZmaWNpZW50RnVuZHMABAToRnVuZGluZyBhY2NvdW50IGRvZXMgbm90IGNvdmVyIGBwcml6ZV92YWx1ZSAqIG51bV9wcml6ZXNgLmxUb29NYW55Q29uY3VycmVudFByaXplUG9vbHMABQSUYE1BWF9DT05DVVJSRU5UX1BSSVpFX1BPT0xTYCBpcyBmdWxsLjxOb1N1Y2hQcml6ZVBvb2wABgSEYHBvb2xfaWRgIGlzIG5vdCBpbiBgUHJpemVQb29sc2AuQFByaXplUG9vbEV4cGlyZWQABwS0UHJpemUgcG9vbCBoYXMgZXhwaXJlZCAoYG5vdyA+PSBleHBpcmVzX2F0YCkuSFByaXplUG9vbEV4aGF1c3RlZAAIBIxQcml6ZSBwb29sIGhhcyBubyByZW1haW5pbmcgcHJpemVzLjhBbHJlYWR5Q2xhaW1lZAAJBNRDYWxsZXIncyBpZGVudGl0eSBoYXMgYWxyZWFkeSBjbGFpbWVkIGZyb20gdGhpcyBwb29sLkRQb29sVmFsdWVPdmVyZmxvdwAKBPBBcml0aG1ldGljIG92ZXJmbG93IHdoZW4gY29tcHV0aW5nIHRoZSBwZXItcG9vbCBob2xkIGFtb3VudC4sV3JvbmdUYXJnZXQACwglAVtgQWlyZHJvcEFwaTo6Y2xhaW1fZ2FtZV9wcml6ZWBdIHdhcyBjYWxsZWQgb24gYSBwb29sIHdob3NlIHRhcmdldCBpcyBub3T0YEdhbWVQYXJ0aWNpcGFudHNgICh0aGUgdHJhaXQgbWV0aG9kIGlzIGZvciBnYW1lIHBvb2xzIG9ubHkpLiREaWROb3RXaW4ADATkQ2xhaW1hbnQncyB3aW5uZXItaGFzaCBpcyBub3QgYmVsb3cgdGhlIHBvb2wncyB0aHJlc2hvbGQuMEludmFsaWRQcm9vZgANBCEBUmluZy1tZW1iZXJzaGlwIHByb29mIGZhaWxlZCB0byB2ZXJpZnkgYWdhaW5zdCBgUEVPUExFX0xJVEVfSURFTlRJRklFUmAuNEFsaWFzTWlzbWF0Y2gADgQBAVN1cHBsaWVkIGBhbGlhc2AgZG9lcyBub3QgbWF0Y2ggdGhlIGFsaWFzIHRoZSBwcm9vZiB2ZXJpZmllcyB0by4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuUQwMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBRFcnJvcgQEVAABBBxPbmdvaW5nAAAE6FRoZSBvcGVyYXRpb24gY2Fubm90IGNvbXBsZXRlIHNpbmNlIHNvbWUgTUJNcyBhcmUgb25nb2luZy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuVQwIRHBhbGxldF9taWdyYXRpb25zME1ibUlzT25nb2luZwABDAxZZXMAAAAITm8AAQAUU3R1Y2sAAgAAWQwEGE9wdGlvbgQEVAFdDAEIEE5vbmUAAAAQU29tZQQAXQwAAAEAAF0MCERwYWxsZXRfbWlncmF0aW9ucyxNYm1Qcm9ncmVzcwAAEAFEY3VycmVudF9taWdyYXRpb244AQx1MzIAAUB0b3RhbF9taWdyYXRpb25zOAEMdTMyAAFcY3VycmVudF9taWdyYXRpb25fc3RlcHM4AQx1MzIAAWxjdXJyZW50X21pZ3JhdGlvbl9tYXhfc3RlcHMJAwEsT3B0aW9uPHUzMj4AAGEMCERwYWxsZXRfbWlncmF0aW9ucyRNYm1TdGF0dXMAAAwBHG9uZ29pbmdVDAEwTWJtSXNPbmdvaW5nAAEgcHJvZ3Jlc3NZDAFMT3B0aW9uPE1ibVByb2dyZXNzPgABIHByZWZpeGVzNAEwVmVjPFZlYzx1OD4+AABlDAhIc3BfY29uc2Vuc3VzX3Nsb3RzMFNsb3REdXJhdGlvbgAABAAoAQx1NjQAAGkMEChzcF9ydW50aW1lHGdlbmVyaWMUYmxvY2skTGF6eUJsb2NrCBhIZWFkZXIBXCRFeHRyaW5zaWMBpQcACAEYaGVhZGVyXAEYSGVhZGVyAAEoZXh0cmluc2ljc20MAVBWZWM8T3BhcXVlRXh0cmluc2ljPgAAbQwAAAJxDABxDAgoc3BfcnVudGltZTxPcGFxdWVFeHRyaW5zaWMAAAQAGAEcVmVjPHU4PgAAdQwIKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAAeQwIHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAGAEcVmVjPHU4PgAAfQwEGE9wdGlvbgQEVAF5DAEIEE5vbmUAAAAQU29tZQQAeQwAAAEAAIEMDDRmcmFtZV9zdXBwb3J0OHZpZXdfZnVuY3Rpb25zOFZpZXdGdW5jdGlvbklkAAAIARhwcmVmaXjBAQEgW3U4OyAxNl0AARhzdWZmaXjBAQEgW3U4OyAxNl0AAIUMBBhSZXN1bHQIBFQBGARFAYkMAQgIT2sEABgAAAAADEVycgQAiQwAAAEAAIkMDDRmcmFtZV9zdXBwb3J0OHZpZXdfZnVuY3Rpb25zZFZpZXdGdW5jdGlvbkRpc3BhdGNoRXJyb3IAAQw4Tm90SW1wbGVtZW50ZWQAAAAgTm90Rm91bmQEAIEMAThWaWV3RnVuY3Rpb25JZAABABRDb2RlYwACAACNDAQYUmVzdWx0CARUAfEGBEUBkQwBCAhPawQA8QYAAAAADEVycgQAkQwAAAEAAJEMDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5YFRyYW5zYWN0aW9uVmFsaWRpdHlFcnJvcgABCBxJbnZhbGlkBACVDAFISW52YWxpZFRyYW5zYWN0aW9uAAAAHFVua25vd24EAJkMAUhVbmtub3duVHJhbnNhY3Rpb24AAQAAlQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlISW52YWxpZFRyYW5zYWN0aW9uAAE0EENhbGwAAAAcUGF5bWVudAABABhGdXR1cmUAAgAUU3RhbGUAAwAgQmFkUHJvb2YABABEQW5jaWVudEJpcnRoQmxvY2sABQBERXhoYXVzdHNSZXNvdXJjZXMABgAYQ3VzdG9tBAAMAQh1OAAHADBCYWRNYW5kYXRvcnkACABMTWFuZGF0b3J5VmFsaWRhdGlvbgAJACRCYWRTaWduZXIACgBUSW5kZXRlcm1pbmF0ZUltcGxpY2l0AAsANFVua25vd25PcmlnaW4ADAAAmQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlIVW5rbm93blRyYW5zYWN0aW9uAAEMMENhbm5vdExvb2t1cAAAAExOb1Vuc2lnbmVkVmFsaWRhdG9yAAEAGEN1c3RvbQQADAEIdTgAAgAAnQwIMHNwX2luaGVyZW50czBJbmhlcmVudERhdGEAAAQBEGRhdGGhDAGUQlRyZWVNYXA8SW5oZXJlbnRJZGVudGlmaWVyLCBWZWM8dTg+PgAAoQwEIEJUcmVlTWFwCARLAb0BBFYBGAAEAKUMAAAApQwAAAKpDACpDAAABAi9ARgArQwIMHNwX2luaGVyZW50c1BDaGVja0luaGVyZW50c1Jlc3VsdAAADAEQb2thecgBEGJvb2wAASxmYXRhbF9lcnJvcsgBEGJvb2wAARhlcnJvcnOdDAEwSW5oZXJlbnREYXRhAACxDAwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eURUcmFuc2FjdGlvblNvdXJjZQABDBxJbkJsb2NrAAAAFExvY2FsAAEAIEV4dGVybmFsAAIAALUMBBhSZXN1bHQIBFQBuQwERQGRDAEICE9rBAC5DAAAAAAMRXJyBACRDAAAAQAAuQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlAVmFsaWRUcmFuc2FjdGlvbgAAFAEgcHJpb3JpdHkoAUxUcmFuc2FjdGlvblByaW9yaXR5AAEgcmVxdWlyZXM0AUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXM0AUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEkbG9uZ2V2aXR5KAFQVHJhbnNhY3Rpb25Mb25nZXZpdHkAASRwcm9wYWdhdGXIARBib29sAAC9DAwoc3Bfc2Vzc2lvbixydW50aW1lX2FwaWhPcGFxdWVHZW5lcmF0ZWRTZXNzaW9uS2V5cwAACAEQa2V5cxgBHFZlYzx1OD4AARRwcm9vZhgBHFZlYzx1OD4AAMEMBBhPcHRpb24EBFQBxQwBCBBOb25lAAAAEFNvbWUEAMUMAAABAADFDAAAAskMAMkMAAAECBj5CADNDAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXNMUnVudGltZURpc3BhdGNoSW5mbwgcQmFsYW5jZQHEGFdlaWdodAHVAQAMARh3ZWlnaHTVAQEYV2VpZ2h0AAEUY2xhc3NRBgE0RGlzcGF0Y2hDbGFzcwABLHBhcnRpYWxfZmVlxAEcQmFsYW5jZQAA0QwMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzKEZlZURldGFpbHMEHEJhbGFuY2UBxAAIATRpbmNsdXNpb25fZmVl1QwBdE9wdGlvbjxJbmNsdXNpb25GZWU8QmFsYW5jZT4+AAEMdGlwxAEcQmFsYW5jZQAA1QwEGE9wdGlvbgQEVAHZDAEIEE5vbmUAAAAQU29tZQQA2QwAAAEAANkMDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlczBJbmNsdXNpb25GZWUEHEJhbGFuY2UBxAAMASBiYXNlX2ZlZcQBHEJhbGFuY2UAARxsZW5fZmVlxAEcQmFsYW5jZQABTGFkanVzdGVkX3dlaWdodF9mZWXEARxCYWxhbmNlAADdDAQYUmVzdWx0CARUAeEMBEUB5QwBCAhPawQA4QwAAAAADEVycgQA5QwAAAEAAOEMAAACEQMA5QwMQHhjbV9ydW50aW1lX2FwaXMQZmVlcxRFcnJvcgABGDRVbmltcGxlbWVudGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQBMV2VpZ2h0Tm90Q29tcHV0YWJsZQACAExVbmhhbmRsZWRYY21WZXJzaW9uAAMANEFzc2V0Tm90Rm91bmQABAAoVW5yb3V0YWJsZQAFAADpDAQYUmVzdWx0CARUAdUBBEUB5QwBCAhPawQA1QEAAAAADEVycgQA5QwAAAEAAO0MBBhSZXN1bHQIBFQBxARFAeUMAQgIT2sEAMQAAAAADEVycgQA5QwAAAEAAPEMBBhSZXN1bHQIBFQB2QIERQHlDAEICE9rBADZAgAAAAAMRXJyBADlDAAAAQAA9QwEGFJlc3VsdAgEVAH5DARFAR0NAQgIT2sEAPkMAAAAAAxFcnIEAB0NAAABAAD5DAxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFFBgAQAUBleGVjdXRpb25fcmVzdWx0/QwBaERpc3BhdGNoUmVzdWx0V2l0aFBvc3RJbmZvAAE4ZW1pdHRlZF9ldmVudHMJDQEoVmVjPEV2ZW50PgABJGxvY2FsX3hjbQ0NAWBPcHRpb248VmVyc2lvbmVkWGNtPCgpPj4AAThmb3J3YXJkZWRfeGNtcxENAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAA/QwEGFJlc3VsdAgEVAEBDQRFAQUNAQgIT2sEAAENAAAAAAxFcnIEAAUNAAABAAABDQw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQb3N0RGlzcGF0Y2hJbmZvAAAIATRhY3R1YWxfd2VpZ2h0pQIBOE9wdGlvbjxXZWlnaHQ+AAEgcGF5c19mZWVVBgEQUGF5cwAABQ0IKHNwX3J1bnRpbWVkRGlzcGF0Y2hFcnJvcldpdGhQb3N0SW5mbwQQSW5mbwEBDQAIASRwb3N0X2luZm8BDQEQSW5mbwABFGVycm9yWQYBNERpc3BhdGNoRXJyb3IAAAkNAAACRQYADQ0EGE9wdGlvbgQEVAGVAQEIEE5vbmUAAAAQU29tZQQAlQEAAAEAABENAAACFQ0AFQ0AAAQISQEZDQAZDQAAApUBAB0NDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAACENBBhSZXN1bHQIBFQBJQ0ERQEdDQEICE9rBAAlDQAAAAAMRXJyBAAdDQAAAQAAJQ0MQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFFBgAMAUBleGVjdXRpb25fcmVzdWx01QYBHE91dGNvbWUAAThlbWl0dGVkX2V2ZW50cwkNAShWZWM8RXZlbnQ+AAE4Zm9yd2FyZGVkX3hjbXMRDQG8VmVjPChWZXJzaW9uZWRMb2NhdGlvbiwgVmVjPFZlcnNpb25lZFhjbTwoKT4+KT4AACkNBBhSZXN1bHQIBFQBBARFAS0NAQgIT2sEAAQAAAAADEVycgQALQ0AAAEAAC0NDEB4Y21fcnVudGltZV9hcGlzLGNvbnZlcnNpb25zFEVycm9yAAEILFVuc3VwcG9ydGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQAAMQ0IXGN1bXVsdXNfcHJpbWl0aXZlc19jb3JlNENvbGxhdGlvbkluZm8AABgBPHVwd2FyZF9tZXNzYWdlczQBSFZlYzxVcHdhcmRNZXNzYWdlPgABTGhvcml6b250YWxfbWVzc2FnZXMlCAFgVmVjPE91dGJvdW5kSHJtcE1lc3NhZ2U+AAFMbmV3X3ZhbGlkYXRpb25fY29kZTUNAYxPcHRpb248cmVsYXlfY2hhaW46OlZhbGlkYXRpb25Db2RlPgABbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlczgBDHUzMgABOGhybXBfd2F0ZXJtYXJrOAFgcmVsYXlfY2hhaW46OkJsb2NrTnVtYmVyAAEkaGVhZF9kYXRhTAEgSGVhZERhdGEAADUNBBhPcHRpb24EBFQBOQ0BCBBOb25lAAAAEFNvbWUEADkNAAABAAA5DQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAAYARxWZWM8dTg+AAA9DQQYUmVzdWx0CARUARAERQFpBwEICE9rBAAQAAAAAAxFcnIEAGkHAAABAABBDQQYT3B0aW9uBARUAWkHAQgQTm9uZQAAABBTb21lBABpBwAAAQAARQ0AAAJpBwBJDQhkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZTBSdW50aW1lRXJyb3IAAXwYU3lzdGVtBACZBwFwZnJhbWVfc3lzdGVtOjpFcnJvcjxSdW50aW1lPgAAADxQYXJhY2hhaW5TeXN0ZW0EADUIAbxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtOjpFcnJvcjxSdW50aW1lPgABACBCYWxhbmNlcwQAbQgBfHBhbGxldF9iYWxhbmNlczo6RXJyb3I8UnVudGltZT4ACgBET3JpZ2luUmVzdHJpY3Rpb24EAIEIAbxpbmRpdl9wYWxsZXRfb3JpZ2luX3Jlc3RyaWN0aW9uOjpFcnJvcjxSdW50aW1lPgANABhBc3NldHMEAK0IAXRwYWxsZXRfYXNzZXRzOjpFcnJvcjxSdW50aW1lPgAOADBBc3NldHNIb2xkZXIEAL0IAZBwYWxsZXRfYXNzZXRzX2hvbGRlcjo6RXJyb3I8UnVudGltZT4ADwAkQXNzZXRSYXRlBADBCAGEcGFsbGV0X2Fzc2V0X3JhdGU6OkVycm9yPFJ1bnRpbWU+ABAARENvbGxhdG9yU2VsZWN0aW9uBADZCAGkcGFsbGV0X2NvbGxhdG9yX3NlbGVjdGlvbjo6RXJyb3I8UnVudGltZT4AFQAcU2Vzc2lvbgQA/QgBeHBhbGxldF9zZXNzaW9uOjpFcnJvcjxSdW50aW1lPgAWACRYY21wUXVldWUEADkJAaRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlOjpFcnJvcjxSdW50aW1lPgAeACxQb2xrYWRvdFhjbQQAoQkBaHBhbGxldF94Y206OkVycm9yPFJ1bnRpbWU+AB8AME1lc3NhZ2VRdWV1ZQQAwQkBkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFcnJvcjxSdW50aW1lPgAiABxVdGlsaXR5BADFCQF4cGFsbGV0X3V0aWxpdHk6OkVycm9yPFJ1bnRpbWU+ACgAIE11bHRpc2lnBADVCQF8cGFsbGV0X211bHRpc2lnOjpFcnJvcjxSdW50aW1lPgApABBTdWRvBADZCQFscGFsbGV0X3N1ZG86OkVycm9yPFJ1bnRpbWU+ACoAFFByb3h5BAD9CQFwcGFsbGV0X3Byb3h5OjpFcnJvcjxSdW50aW1lPgAsACBJZGVudGl0eQQATQoBlGluZGl2X3BhbGxldF9pZGVudGl0eTo6RXJyb3I8UnVudGltZT4AMgAYUGVvcGxlBABVCgGMaW5kaXZfcGFsbGV0X3Blb3BsZTo6RXJyb3I8UnVudGltZT4AMwAcTW9iUnVsZQQAlQoBlGluZGl2X3BhbGxldF9tb2JfcnVsZTo6RXJyb3I8UnVudGltZT4ANAAoUHJvb2ZPZkluawQA0QoBpGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbms6OkVycm9yPFJ1bnRpbWU+ADUAEEdhbWUEAB0LAYRpbmRpdl9wYWxsZXRfZ2FtZTo6RXJyb3I8UnVudGltZT4ANwAUU2NvcmUEAEkLAYhpbmRpdl9wYWxsZXRfc2NvcmU6OkVycm9yPFJ1bnRpbWU+ADgAIER1bW15RGltBABRCwGYaW5kaXZfcGFsbGV0X2R1bW15X2RpbTo6RXJyb3I8UnVudGltZT4AOwAoUGVvcGxlTGl0ZQQAXQsBoGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZTo6RXJyb3I8UnVudGltZT4APgAkUmVzb3VyY2VzBACRCwGYaW5kaXZfcGFsbGV0X3Jlc291cmNlczo6RXJyb3I8UnVudGltZT4APwA0Q2h1bmtzTWFuYWdlcgQApQsBrGluZGl2X3BhbGxldF9jaHVua3NfbWFuYWdlcjo6RXJyb3I8UnVudGltZT4AQAAcTWVtYmVycwQA9QsBkGluZGl2X3BhbGxldF9tZW1iZXJzOjpFcnJvcjxSdW50aW1lPgBDABxDb2luYWdlBAAJDAGQaW5kaXZfcGFsbGV0X2NvaW5hZ2U6OkVycm9yPFJ1bnRpbWU+AEQAPE1lbWJlcnNOb3RpZmllcgQANQwBtGluZGl2X3BhbGxldF9tZW1iZXJzX25vdGlmaWVyOjpFcnJvcjxSdW50aW1lPgBFABxBaXJkcm9wBABNDAGQaW5kaXZfcGFsbGV0X2FpcmRyb3A6OkVycm9yPFJ1bnRpbWU+AD0AUE11bHRpQmxvY2tNaWdyYXRpb25zBABRDAGEcGFsbGV0X21pZ3JhdGlvbnM6OkVycm9yPFJ1bnRpbWU+AGIAALAYU3lzdGVtARhTeXN0ZW1QHEFjY291bnQBAQQCBC0GQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELgA4RXh0cmluc2ljQ291bnQAADgEAAS4IFRvdGFsIGV4dHJpbnNpY3MgY291bnQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgBASW5oZXJlbnRzQXBwbGllZAEAyAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLgAsQmxvY2tXZWlnaHQBADkGGAAAAAAAAASIIFRoZSBjdXJyZW50IHdlaWdodCBmb3IgdGhlIGJsb2NrLgAkQmxvY2tTaXplAAA4BAAMsCBUb3RhbCBzaXplIChpbiBieXRlcykgb2YgdGhlIGN1cnJlbnQgYmxvY2suAMggVHJhY2tzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgYW5kIGFsbCBleHRyaW5zaWNzLgAkQmxvY2tIYXNoAQEEBTg8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJggTWFwIG9mIGJsb2NrIG51bWJlcnMgdG8gYmxvY2sgaGFzaGVzLgA0RXh0cmluc2ljRGF0YQEBBAU4GAQABD0BIEV4dHJpbnNpY3MgZGF0YSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKG1hcHMgYW4gZXh0cmluc2ljJ3MgaW5kZXggdG8gaXRzIGRhdGEpLgAYTnVtYmVyAQA4EAAAAAAECQEgVGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyIGJlaW5nIHByb2Nlc3NlZC4gU2V0IGJ5IGBleGVjdXRlX2Jsb2NrYC4AKFBhcmVudEhhc2gBADyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcCBIYXNoIG9mIHRoZSBwcmV2aW91cyBibG9jay4AGERpZ2VzdAEAZAQABPAgRGlnZXN0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBhbHNvIHBhcnQgb2YgdGhlIGJsb2NrIGhlYWRlci4AGEV2ZW50cwEAPQYEABygIEV2ZW50cyBkZXBvc2l0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAdASBOT1RFOiBUaGUgaXRlbSBpcyB1bmJvdW5kIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5ldmVyIGJlIHJlYWQgb24gY2hhaW4u0CBJdCBjb3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgUG9WIHNpemUgb2YgYSBibG9jay4ALQEgRXZlbnRzIGhhdmUgYSBsYXJnZSBpbi1tZW1vcnkgc2l6ZS4gQm94IHRoZSBldmVudHMgdG8gbm90IGdvIG91dC1vZi1tZW1vcnn8IGp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIHJlYWRzIHRoZW0gZnJvbSB3aXRoaW4gdGhlIHJ1bnRpbWUuAChFdmVudENvdW50AQA4EAAAAAAEuCBUaGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYEV2ZW50czxUPmAgbGlzdC4ALEV2ZW50VG9waWNzAQEEAjxZBwQAKCUBIE1hcHBpbmcgYmV0d2VlbiBhIHRvcGljIChyZXByZXNlbnRlZCBieSBUOjpIYXNoKSBhbmQgYSB2ZWN0b3Igb2YgaW5kZXhlc5Qgb2YgZXZlbnRzIGluIHRoZSBgPEV2ZW50czxUPj5gIGxpc3QuAFEBIEFsbCB0b3BpYyB2ZWN0b3JzIGhhdmUgZGV0ZXJtaW5pc3RpYyBzdG9yYWdlIGxvY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHRvcGljLiBUaGlzRQEgYWxsb3dzIGxpZ2h0LWNsaWVudHMgdG8gbGV2ZXJhZ2UgdGhlIGNoYW5nZXMgdHJpZSBzdG9yYWdlIHRyYWNraW5nIG1lY2hhbmlzbSBhbmTkIGluIGNhc2Ugb2YgY2hhbmdlcyBmZXRjaCB0aGUgbGlzdCBvZiBldmVudHMgb2YgaW50ZXJlc3QuAFkBIFRoZSB2YWx1ZSBoYXMgdGhlIHR5cGUgYChCbG9ja051bWJlckZvcjxUPiwgRXZlbnRJbmRleClgIGJlY2F1c2UgaWYgd2UgdXNlZCBvbmx5IGp1c3RNASB0aGUgYEV2ZW50SW5kZXhgIHRoZW4gaW4gY2FzZSBpZiB0aGUgdG9waWMgaGFzIHRoZSBzYW1lIGNvbnRlbnRzIG9uIHRoZSBuZXh0IGJsb2NrAQEgbm8gbm90aWZpY2F0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHRodXMgdGhlIGV2ZW50IG1pZ2h0IGJlIGxvc3QuAEhMYXN0UnVudGltZVVwZ3JhZGUAAGEHBAAEVQEgU3RvcmVzIHRoZSBgc3BlY192ZXJzaW9uYCBhbmQgYHNwZWNfbmFtZWAgb2Ygd2hlbiB0aGUgbGFzdCBydW50aW1lIHVwZ3JhZGUgaGFwcGVuZWQuAERCbG9ja3NUaWxsVXBncmFkZQAADAQABOwgTnVtYmVyIG9mIGJsb2NrcyB0aWxsIHRoZSBwZW5kaW5nIGNvZGUgdXBncmFkZSBpcyBhcHBsaWVkLgBUVXBncmFkZWRUb1UzMlJlZkNvdW50AQDIBAAETQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgYHR5cGUgUmVmQ291bnRgIGlzIGB1MzJgLiBGYWxzZSAoZGVmYXVsdCkgaWYgbm90LgBgVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQDIBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuADhFeGVjdXRpb25QaGFzZQAAUQcEAASIIFRoZSBleGVjdXRpb24gcGhhc2Ugb2YgdGhlIGJsb2NrLgBEQXV0aG9yaXplZFVwZ3JhZGUAAG0HBAAEuCBgU29tZWAgaWYgYSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gYXV0aG9yaXplZC4AYEV4dHJpbnNpY1dlaWdodFJlY2xhaW1lZAEA1QEIAAAcoCBUaGUgd2VpZ2h0IHJlY2xhaW1lZCBmb3IgdGhlIGV4dHJpbnNpYy4AIQEgVGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdW50aWwgdGhlIGVuZCBvZiB0aGUgZXh0cmluc2ljIGV4ZWN1dGlvbi4hASBNb3JlIHByZWNpc2VseSB0aGlzIGluZm9ybWF0aW9uIGlzIHJlbW92ZWQgaW4gYG5vdGVfYXBwbGllZF9leHRyaW5zaWNgLgBxASBMb2dpYyBkb2luZyBzb21lIHBvc3QgZGlzcGF0Y2ggd2VpZ2h0IHJlZHVjdGlvbiBtdXN0IHVwZGF0ZSB0aGlzIHN0b3JhZ2UgdG8gYXZvaWQgZHVwbGljYXRlLCByZWR1Y3Rpb24uAAEkAAFJBgAYMEJsb2NrV2VpZ2h0c3EHiQEHAPIFKgEACwAgSqnRAQIAgAICZc0dAAELwFYN70UBAgDAAQELAJj3Pl0BAgDgAQEAAAJlzR0AAQvA3l9ZugECAGACAQsAIEqp0QECAIACAQcAiFJqdAIAoAACZc0dAAAAAATQIEJsb2NrICYgZXh0cmluc2ljcyB3ZWlnaHRzOiBiYXNlIHZhbHVlcyBhbmQgbGltaXRzLgAsQmxvY2tMZW5ndGh9BzQAADwAAABQAAAAUAAABKggVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgYmxvY2sgKGluIGJ5dGVzKS4AOEJsb2NrSGFzaENvdW50OBAAEAAABFUBIE1heGltdW0gbnVtYmVyIG9mIGJsb2NrIG51bWJlciB0byBibG9jayBoYXNoIG1hcHBpbmdzIHRvIGtlZXAgKG9sZGVzdCBwcnVuZWQgZmlyc3QpLgAgRGJXZWlnaHSFB0BAeH0BAAAAAADh9QUAAAAABAkBIFRoZSB3ZWlnaHQgb2YgcnVudGltZSBkYXRhYmFzZSBvcGVyYXRpb25zIHRoZSBydW50aW1lIGNhbiBpbnZva2UuABxWZXJzaW9uiQfJBERuZXh0LXBlb3BsZS1wYXNlb0RuZXh0LXBlb3BsZS1wYXNlbwEAAABJQg8AAAAAAFTdcY1cxTJi1AEAAAAE5wUhoNPS+AEAAADXvdiicsoNZQIAAADfastomQdgmwUAAAA345f8fJH15AIAAADM2d5jlsiZygEAAABA/jrUAfiVmgYAAADSvJiX7tCPFQMAAAD3iyeL5T9FTAIAAACrPAVyKR/riwIAAAC8nYmQT1uSPwEAAAA3yLsTUKmiqAQAAADz/xTVq1JwWQMAAABv9S7oWObFvQIAAACRscixYyjrkgIAAACf+1BapzjWnAEAAADQuse+SmsJIAEAAACSh/sOAhvIVAEAAACEO2+M7ICYxwEAAADqk+Pxbz1pYgMAAAD7xXe510fv1gEAAAABAAAAAQSEIEdldCB0aGUgY2hhaW4ncyBpbi1jb2RlIHZlcnNpb24uAChTUzU4UHJlZml4LQMIKgAUqCBUaGUgZGVzaWduYXRlZCBTUzU4IHByZWZpeCBvZiB0aGlzIGNoYWluLgA5ASBUaGlzIHJlcGxhY2VzIHRoZSAic3M1OEZvcm1hdCIgcHJvcGVydHkgZGVjbGFyZWQgaW4gdGhlIGNoYWluIHNwZWMuIFJlYXNvbiBpczEBIHRoYXQgdGhlIHJ1bnRpbWUgc2hvdWxkIGtub3cgYWJvdXQgdGhlIHByZWZpeCBpbiBvcmRlciB0byBtYWtlIHVzZSBvZiBpdCBhc3AgYW4gaWRlbnRpZmllciBvZiB0aGUgY2hhaW4uAAGZBwAcLFJ1bnRpbWVDYWxsIASMIFRoZSBhZ2dyZWdhdGVkIGBSdW50aW1lQ2FsbGAgdHlwZS4UTm9uY2U4BEkBIFRoaXMgc3RvcmVzIHRoZSBudW1iZXIgb2YgcHJldmlvdXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHNlbmRlciBhY2NvdW50LhBIYXNoPASYIFRoZSBvdXRwdXQgb2YgdGhlIGBIYXNoaW5nYCBmdW5jdGlvbi4cSGFzaGluZ50HBCEBIFRoZSBoYXNoaW5nIHN5c3RlbSAoYWxnb3JpdGhtKSBiZWluZyB1c2VkIGluIHRoZSBydW50aW1lIChlLmcuIEJsYWtlMikuJEFjY291bnRJZAQEyCBUaGUgdXNlciBhY2NvdW50IGlkZW50aWZpZXIgdHlwZSBmb3IgdGhlIHJ1bnRpbWUuFEJsb2NroQcIYQEgVGhlIEJsb2NrIHR5cGUgdXNlZCBieSB0aGUgcnVudGltZS4gVGhpcyBpcyB1c2VkIGJ5IGBjb25zdHJ1Y3RfcnVudGltZWAgdG8gcmV0cmlldmUgdGhlzCBleHRyaW5zaWNzIG9yIG90aGVyIGJsb2NrIHNwZWNpZmljIGRhdGEgYXMgbmVlZGVkLixBY2NvdW50RGF0YTEGCGEBIERhdGEgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgKG90aGVyIHRoYW4gbm9uY2UvdHJhbnNhY3Rpb24gY291bnRlciwgd2hpY2ggdGhpc2QgcGFsbGV0IGRvZXMgcmVnYXJkbGVzcykuAAAAADxQYXJhY2hhaW5TeXN0ZW0BPFBhcmFjaGFpblN5c3RlbXw8QmxvY2tXZWlnaHRNb2RlAAC5BwQAGHwgVGhlIGN1cnJlbnQgYmxvY2sgd2VpZ2h0IG1vZGUuAHUBIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBpcyB0aGUgbWF4aW11bSBhbGxvd2VkIGJsb2NrIHdlaWdodCwgZm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlSCBbYGJsb2NrX3dlaWdodGBdLgAlASBLaWxsZWQgaW4gW2BTZWxmOjpvbl9pbml0aWFsaXplYF0gYW5kIHNldCBieSB0aGUgW2BibG9ja193ZWlnaHRgXSBsb2dpYy4ARFByZXZpb3VzQ29yZUNvdW50AAC9BwQADAUBIFRoZSBjb3JlIGNvdW50IGF2YWlsYWJsZSB0byB0aGUgcGFyYWNoYWluIGluIHRoZSBwcmV2aW91cyBibG9jay4AdQEgVGhpcyBpcyBtYWlubHkgdXNlZCBmb3Igb2ZmY2hhaW4gZnVuY3Rpb25hbGl0eSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdGFyZ2V0IGJsb2NrIHdlaWdodC4ARFVuaW5jbHVkZWRTZWdtZW50AQDBBwQAGEkBIExhdGVzdCBpbmNsdWRlZCBibG9jayBkZXNjZW5kYW50cyB0aGUgcnVudGltZSBhY2NlcHRlZC4gSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFyZWEBIGFuY2VzdG9ycyBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBibG9jayB3aGljaCBoYXZlIG5vdCBiZWVuIGluY2x1ZGVkIGluIHRoZSBvYnNlcnZlZEwgcmVsYXktY2hhaW4gc3RhdGUuAHUBIFRoZSBzZWdtZW50IGxlbmd0aCBpcyBsaW1pdGVkIGJ5IHRoZSBjYXBhY2l0eSByZXR1cm5lZCBmcm9tIHRoZSBbYENvbnNlbnN1c0hvb2tgXSBjb25maWd1cmVkPCBpbiB0aGUgcGFsbGV0LgBsQWdncmVnYXRlZFVuaW5jbHVkZWRTZWdtZW50AADpBwQADGkBIFN0b3JhZ2UgZmllbGQgdGhhdCBrZWVwcyB0cmFjayBvZiBiYW5kd2lkdGggdXNlZCBieSB0aGUgdW5pbmNsdWRlZCBzZWdtZW50IGFsb25nIHdpdGggdGhlLQEgbGF0ZXN0IEhSTVAgd2F0ZXJtYXJrLiBVc2VkIGZvciBsaW1pdGluZyB0aGUgYWNjZXB0YW5jZSBvZiBuZXcgYmxvY2tzIHdpdGiQIHJlc3BlY3QgdG8gcmVsYXkgY2hhaW4gY29uc3RyYWludHMuAFRQZW5kaW5nVmFsaWRhdGlvbkNvZGUBABgEABhZASBJbiBjYXNlIG9mIGEgc2NoZWR1bGVkIHVwZ3JhZGUsIHRoaXMgc3RvcmFnZSBmaWVsZCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBjb2RlIHRvIGJlJCBhcHBsaWVkLgA9ASBBcyBzb29uIGFzIHRoZSByZWxheSBjaGFpbiBnaXZlcyB1cyB0aGUgZ28tYWhlYWQgc2lnbmFsLCB3ZSB3aWxsIG92ZXJ3cml0ZSB0aGVlASBbYDpwZW5kaW5nX2NvZGVgXVtzcF9jb3JlOjpzdG9yYWdlOjp3ZWxsX2tub3duX2tleXM6OlBFTkRJTkdfQ09ERV0gd2hpY2ggd2lsbCByZXN1bHQgdGhldQEgbmV4dCBibG9jayB0byBiZSBwcm9jZXNzZWQgd2l0aCB0aGUgbmV3IHZhbGlkYXRpb24gY29kZS4gVGhpcyBjb25jbHVkZXMgdGhlIHVwZ3JhZGUgcHJvY2Vzcy4ARE5ld1ZhbGlkYXRpb25Db2RlAAAYBAAUXQEgVmFsaWRhdGlvbiBjb2RlIHRoYXQgaXMgc2V0IGJ5IHRoZSBwYXJhY2hhaW4gYW5kIGlzIHRvIGJlIGNvbW11bmljYXRlZCB0byBjb2xsYXRvciBhbmR4IGNvbnNlcXVlbnRseSB0aGUgcmVsYXktY2hhaW4uAGUBIFRoaXMgd2lsbCBiZSBjbGVhcmVkIGluIGBvbl9pbml0aWFsaXplYCBvZiBlYWNoIG5ldyBibG9jayBpZiBubyBvdGhlciBwYWxsZXQgYWxyZWFkeSBzZXQsIHRoZSB2YWx1ZS4AOFZhbGlkYXRpb25EYXRhAABIBAAM0CBUaGUgW2BQZXJzaXN0ZWRWYWxpZGF0aW9uRGF0YWBdIHNldCBmb3IgdGhpcyBibG9jay4AcQEgVGhpcyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBzZXQgb25seSBvbmNlIGJ5IHRoZSBbYFBhbGxldDo6c2V0X3ZhbGlkYXRpb25fZGF0YWBdIGluaGVyZW50LgBQRGlkU2V0VmFsaWRhdGlvbkNvZGUBAMgEAATgIFdlcmUgdGhlIHZhbGlkYXRpb24gZGF0YSBzZXQgdG8gbm90aWZ5IHRoZSByZWxheSBjaGFpbj8AZExhc3RSZWxheUNoYWluQmxvY2tOdW1iZXIBADgQAAAAAAwdASBUaGUgcmVsYXkgY2hhaW4gYmxvY2sgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFzdCBwYXJhY2hhaW4gYmxvY2suAIggVGhpcyBpcyB1cGRhdGVkIGluIGBvbl9maW5hbGl6ZWAuAGBVcGdyYWRlUmVzdHJpY3Rpb25TaWduYWwBAO0HBAAcdQEgQW4gb3B0aW9uIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgcmVsYXktY2hhaW4gcmVzdHJpY3RzIHNpZ25hbGxpbmcgYSB2YWxpZGF0aW9uIGNvZGUgdXBncmFkZS5hASBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBpcyBgU29tZWAgYW5kIFtgTmV3VmFsaWRhdGlvbkNvZGVgXSBpcyBgU29tZWAgdGhlbiB0aGUgcHJvZHVjZWRsIGNhbmRpZGF0ZSB3aWxsIGJlIGludmFsaWQuAHEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIGEgbWlycm9yIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZvciB0aGUgY3VycmVudCBwYXJhY2hhaW4gZnJvbSB0aGVtASByZWxheS1jaGFpbi4gVGhpcyB2YWx1ZSBpcyBlcGhlbWVyYWwgd2hpY2ggbWVhbnMgaXQgZG9lc24ndCBoaXQgdGhlIHN0b3JhZ2UuIFRoaXMgdmFsdWUgaXNgIHNldCBhZnRlciB0aGUgaW5oZXJlbnQuADhVcGdyYWRlR29BaGVhZAEA4QcEABTcIE9wdGlvbmFsIHVwZ3JhZGUgZ28tYWhlYWQgc2lnbmFsIGZyb20gdGhlIHJlbGF5LWNoYWluLgBxASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBhIG1pcnJvciBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGZyb20gdGhlbQEgcmVsYXktY2hhaW4uIFRoaXMgdmFsdWUgaXMgZXBoZW1lcmFsIHdoaWNoIG1lYW5zIGl0IGRvZXNuJ3QgaGl0IHRoZSBzdG9yYWdlLiBUaGlzIHZhbHVlIGlzYCBzZXQgYWZ0ZXIgdGhlIGluaGVyZW50LgA8UmVsYXlTdGF0ZVByb29mAABQBAAYxCBUaGUgc3RhdGUgcHJvb2YgZm9yIHRoZSBsYXN0IHJlbGF5IHBhcmVudCBibG9jay4AbQEgVGhpcyBmaWVsZCBpcyBtZWFudCB0byBiZSB1cGRhdGVkIGVhY2ggYmxvY2sgd2l0aCB0aGUgdmFsaWRhdGlvbiBkYXRhIGluaGVyZW50LiBUaGVyZWZvcmUsTQEgYmVmb3JlIHByb2Nlc3Npbmcgb2YgdGhlIGluaGVyZW50LCBlLmcuIGluIGBvbl9pbml0aWFsaXplYCB0aGlzIGRhdGEgbWF5IGJlIHN0YWxlLgCsIFRoaXMgZGF0YSBpcyBhbHNvIGFic2VudCBmcm9tIHRoZSBnZW5lc2lzLgBYUmVsZXZhbnRNZXNzYWdpbmdTdGF0ZQAA9QcEABxlASBUaGUgc25hcHNob3Qgb2Ygc29tZSBzdGF0ZSByZWxhdGVkIHRvIG1lc3NhZ2luZyByZWxldmFudCB0byB0aGUgY3VycmVudCBwYXJhY2hhaW4gYXMgcGVySCB0aGUgcmVsYXkgcGFyZW50LgBtASBUaGlzIGZpZWxkIGlzIG1lYW50IHRvIGJlIHVwZGF0ZWQgZWFjaCBibG9jayB3aXRoIHRoZSB2YWxpZGF0aW9uIGRhdGEgaW5oZXJlbnQuIFRoZXJlZm9yZSxNASBiZWZvcmUgcHJvY2Vzc2luZyBvZiB0aGUgaW5oZXJlbnQsIGUuZy4gaW4gYG9uX2luaXRpYWxpemVgIHRoaXMgZGF0YSBtYXkgYmUgc3RhbGUuAKwgVGhpcyBkYXRhIGlzIGFsc28gYWJzZW50IGZyb20gdGhlIGdlbmVzaXMuAERIb3N0Q29uZmlndXJhdGlvbgAACQgEABgpASBUaGUgcGFyYWNoYWluIGhvc3QgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBvYnRhaW5lZCBmcm9tIHRoZSByZWxheSBwYXJlbnQuAG0BIFRoaXMgZmllbGQgaXMgbWVhbnQgdG8gYmUgdXBkYXRlZCBlYWNoIGJsb2NrIHdpdGggdGhlIHZhbGlkYXRpb24gZGF0YSBpbmhlcmVudC4gVGhlcmVmb3JlLE0BIGJlZm9yZSBwcm9jZXNzaW5nIG9mIHRoZSBpbmhlcmVudCwgZS5nLiBpbiBgb25faW5pdGlhbGl6ZWAgdGhpcyBkYXRhIG1heSBiZSBzdGFsZS4ArCBUaGlzIGRhdGEgaXMgYWxzbyBhYnNlbnQgZnJvbSB0aGUgZ2VuZXNpcy4AOExhc3REbXFNcWNIZWFkAQARCIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD0IFRoZSBsYXN0IGRvd253YXJkIG1lc3NhZ2UgcXVldWUgY2hhaW4gaGVhZCB3ZSBoYXZlIG9ic2VydmVkLgBlASBUaGlzIHZhbHVlIGlzIGxvYWRlZCBiZWZvcmUgYW5kIHNhdmVkIGFmdGVyIHByb2Nlc3NpbmcgaW5ib3VuZCBkb3dud2FyZCBtZXNzYWdlcyBjYXJyaWVkYCBieSB0aGUgc3lzdGVtIGluaGVyZW50LgBATGFzdEhybXBNcWNIZWFkcwEAFQgEABBJASBUaGUgbWVzc2FnZSBxdWV1ZSBjaGFpbiBoZWFkcyB3ZSBoYXZlIG9ic2VydmVkIHBlciBlYWNoIGNoYW5uZWwgaW5jb21pbmcgY2hhbm5lbC4AZQEgVGhpcyB2YWx1ZSBpcyBsb2FkZWQgYmVmb3JlIGFuZCBzYXZlZCBhZnRlciBwcm9jZXNzaW5nIGluYm91bmQgZG93bndhcmQgbWVzc2FnZXMgY2FycmllZGAgYnkgdGhlIHN5c3RlbSBpbmhlcmVudC4AZFByb2Nlc3NlZERvd253YXJkTWVzc2FnZXMBADgQAAAAAAzIIE51bWJlciBvZiBkb3dud2FyZCBtZXNzYWdlcyBwcm9jZXNzZWQgaW4gYSBibG9jay4A7CBUaGlzIHdpbGwgYmUgY2xlYXJlZCBpbiBgb25faW5pdGlhbGl6ZWAgb2YgZWFjaCBuZXcgYmxvY2suAHBMYXN0UHJvY2Vzc2VkRG93bndhcmRNZXNzYWdlAAAhCAQADJQgVGhlIGxhc3QgcHJvY2Vzc2VkIGRvd253YXJkIG1lc3NhZ2UuAF0BIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIHRvIGZpbHRlciB0aGUgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWQuADRIcm1wV2F0ZXJtYXJrAQA4EAAAAAAEoCBIUk1QIHdhdGVybWFyayB0aGF0IHdhcyBzZXQgaW4gYSBibG9jay4AYExhc3RQcm9jZXNzZWRIcm1wTWVzc2FnZQAAIQgEAAyEIFRoZSBsYXN0IHByb2Nlc3NlZCBIUk1QIG1lc3NhZ2UuAF0BIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIHRvIGZpbHRlciB0aGUgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWQuAFBIcm1wT3V0Ym91bmRNZXNzYWdlcwEAJQgEAAykIEhSTVAgbWVzc2FnZXMgdGhhdCB3ZXJlIHNlbnQgaW4gYSBibG9jay4A7CBUaGlzIHdpbGwgYmUgY2xlYXJlZCBpbiBgb25faW5pdGlhbGl6ZWAgb2YgZWFjaCBuZXcgYmxvY2suADhVcHdhcmRNZXNzYWdlcwEANAQADKwgVXB3YXJkIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50IGluIGEgYmxvY2suAPAgVGhpcyB3aWxsIGJlIGNsZWFyZWQgaW4gYG9uX2luaXRpYWxpemVgIGZvciBlYWNoIG5ldyBibG9jay4AVFBlbmRpbmdVcHdhcmRNZXNzYWdlcwEANAQABDEBIFVwd2FyZCBtZXNzYWdlcyB0aGF0IGFyZSBzdGlsbCBwZW5kaW5nIGFuZCBub3QgeWV0IHNlbnQgdG8gdGhlIHJlbGF5IGNoYWluLgBQUGVuZGluZ1Vwd2FyZFNpZ25hbHMBADQEAAwtASBVcHdhcmQgc2lnbmFscyB0aGF0IGFyZSBzdGlsbCBwZW5kaW5nIGFuZCBub3QgeWV0IHNlbnQgdG8gdGhlIHJlbGF5IGNoYWluLgDYIFRoaXMgd2lsbCBiZSBjbGVhcmVkIGluIGBvbl9maW5hbGl6ZWAgZm9yIGVhY2ggYmxvY2suAExQZW5kaW5nQXBwcm92ZWRQZWVyAAB4BAAEOQEgVGhlIGFwcHJvdmVkIHBlZXIgaWQgdG8gYmUgc2VudCBhcyBhIFVNUCBzaWduYWwgb24gdGhlIGxhc3QgYmxvY2sgb2YgdGhlIFBvVi4AXFVwd2FyZERlbGl2ZXJ5RmVlRmFjdG9yAQAtAUAAAGSns7bgDQAAAAAAAAAABOQgVGhlIGZhY3RvciB0byBtdWx0aXBseSB0aGUgYmFzZSBkZWxpdmVyeSBmZWUgYnkgZm9yIFVNUC4AhEFubm91bmNlZEhybXBNZXNzYWdlc1BlckNhbmRpZGF0ZQEAOBAAAAAACGUBIFRoZSBudW1iZXIgb2YgSFJNUCBtZXNzYWdlcyB3ZSBvYnNlcnZlZCBpbiBgb25faW5pdGlhbGl6ZWAgYW5kIHRodXMgdXNlZCB0aGF0IG51bWJlciBmb3LwIGFubm91bmNpbmcgdGhlIHdlaWdodCBvZiBgb25faW5pdGlhbGl6ZWAgYW5kIGBvbl9maW5hbGl6ZWAuAGhSZXNlcnZlZFhjbXBXZWlnaHRPdmVycmlkZQAA1QEEAAhdASBUaGUgd2VpZ2h0IHdlIHJlc2VydmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2sgZm9yIHByb2Nlc3NpbmcgWENNUCBtZXNzYWdlcy4gVGhpc7ggb3ZlcnJpZGVzIHRoZSBhbW91bnQgc2V0IGluIHRoZSBDb25maWcgdHJhaXQuAGRSZXNlcnZlZERtcFdlaWdodE92ZXJyaWRlAADVAQQACFkBIFRoZSB3ZWlnaHQgd2UgcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jayBmb3IgcHJvY2Vzc2luZyBETVAgbWVzc2FnZXMuIFRoaXO4IG92ZXJyaWRlcyB0aGUgYW1vdW50IHNldCBpbiB0aGUgQ29uZmlnIHRyYWl0LgBgQ3VzdG9tVmFsaWRhdGlvbkhlYWREYXRhAAAYBAAMKQEgQSBjdXN0b20gaGVhZCBkYXRhIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGFzIHJlc3VsdCBvZiBgdmFsaWRhdGVfYmxvY2tgLgARASBTZWUgYFBhbGxldDo6c2V0X2N1c3RvbV92YWxpZGF0aW9uX2hlYWRfZGF0YWAgZm9yIG1vcmUgaW5mb3JtYXRpb24uAEhQb1ZNZXNzYWdlc1RyYWNrZXIAAC0IBAAMVQEgVHJhY2tzIGN1bXVsYXRpdmUgYFVNUGAgYW5kIGBIUk1QYCBtZXNzYWdlcyBzZW50IGFjcm9zcyBibG9ja3MgaW4gdGhlIGN1cnJlbnQgYFBvVmAuAHUBIEFjcm9zcyBkaWZmZXJlbnQgY2FuZGlkYXRlcy9Qb1ZzIHRoZSBidWRnZXRzIGFyZSB0cmFja2VkIGJ5IFtgQWdncmVnYXRlZFVuaW5jbHVkZWRTZWdtZW50YF0uAAFAAAFxBgAEKFNlbGZQYXJhSWScEBQUAAAEuCBSZXR1cm5zIHRoZSBwYXJhY2hhaW4gSUQgd2UgYXJlIHJ1bm5pbmcgd2l0aC4AATUIAAAAAQAAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBACggAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4AJERpZFVwZGF0ZQEAyAQAENggV2hldGhlciB0aGUgdGltZXN0YW1wIGhhcyBiZWVuIHVwZGF0ZWQgaW4gdGhpcyBibG9jay4AVQEgVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHRvIGB0cnVlYCB1cG9uIHN1Y2Nlc3NmdWwgc3VibWlzc2lvbiBvZiBhIHRpbWVzdGFtcCBieSBhIG5vZGUuRQEgSXQgaXMgdGhlbiBjaGVja2VkIGF0IHRoZSBlbmQgb2YgZWFjaCBibG9jayBleGVjdXRpb24gaW4gdGhlIGBvbl9maW5hbGl6ZWAgaG9vay4AAbAAAAQ0TWluaW11bVBlcmlvZCggAAAAAAAAAAAYjCBUaGUgbWluaW11bSBwZXJpb2QgYmV0d2VlbiBibG9ja3MuAE0BIEJlIGF3YXJlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlICpleHBlY3RlZCogcGVyaW9kIHRoYXQgdGhlIGJsb2NrIHByb2R1Y3Rpb25JASBhcHBhcmF0dXMgcHJvdmlkZXMuIFlvdXIgY2hvc2VuIGNvbnNlbnN1cyBzeXN0ZW0gd2lsbCBnZW5lcmFsbHkgd29yayB3aXRoIHRoaXMgdG9hASBkZXRlcm1pbmUgYSBzZW5zaWJsZSBibG9jayB0aW1lLiBGb3IgZXhhbXBsZSwgaW4gdGhlIEF1cmEgcGFsbGV0IGl0IHdpbGwgYmUgZG91YmxlIHRoaXNwIHBlcmlvZCBvbiBkZWZhdWx0IHNldHRpbmdzLgAABBhNb21lbnQoBJggVHlwZSB1c2VkIGZvciBleHByZXNzaW5nIGEgdGltZXN0YW1wLgACAAA0UGFyYWNoYWluSW5mbwE0UGFyYWNoYWluSW5mbwQsUGFyYWNoYWluSWQBAJwQZAAAAAAAAbgAAAAAAAADAAA0V2VpZ2h0UmVjbGFpbQAAAAAAAAAECIEBIFBhbGxldCB0byB1c2UgYWxvbmdzaWRlIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gW2BTdG9yYWdlV2VpZ2h0UmVjbGFpbWBdLCB0aGUgcGFsbGV0IHByb3ZpZGVzjCB3ZWlnaHQgaW5mb3JtYXRpb24gYW5kIGJlbmNobWFya3MuACBCYWxhbmNlcwEgQmFsYW5jZXMcNFRvdGFsSXNzdWFuY2UBAMRAAAAAAAAAAAAAAAAAAAAAAASYIFRoZSB0b3RhbCB1bml0cyBpc3N1ZWQgaW4gdGhlIHN5c3RlbS4AQEluYWN0aXZlSXNzdWFuY2UBAMRAAAAAAAAAAAAAAAAAAAAAAAQJASBUaGUgdG90YWwgdW5pdHMgb2Ygb3V0c3RhbmRpbmcgZGVhY3RpdmF0ZWQgYmFsYW5jZSBpbiB0aGUgc3lzdGVtLgAcQWNjb3VudAEBBAIEMQYBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBgCQEgVGhlIEJhbGFuY2VzIHBhbGxldCBleGFtcGxlIG9mIHN0b3JpbmcgdGhlIGJhbGFuY2Ugb2YgYW4gYWNjb3VudC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHsZAiAgICB0eXBlIEFjY291bnRTdG9yZSA9IFN0b3JhZ2VNYXBTaGltPFNlbGY6OkFjY291bnQ8UnVudGltZT4sIGZyYW1lX3N5c3RlbTo6UHJvdmlkZXI8UnVudGltZT4sIEFjY291bnRJZCwgU2VsZjo6QWNjb3VudERhdGE8QmFsYW5jZT4+DCAgfRAgYGBgABUBIFlvdSBjYW4gYWxzbyBzdG9yZSB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50IGluIHRoZSBgU3lzdGVtYCBwYWxsZXQuACggIyBFeGFtcGxlADQgYGBgbm9jb21waWxlsCAgaW1wbCBwYWxsZXRfYmFsYW5jZXM6OkNvbmZpZyBmb3IgUnVudGltZSB7dCAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3lzdGVtDCAgfRAgYGBgAFEBIEJ1dCB0aGlzIGNvbWVzIHdpdGggdHJhZGVvZmZzLCBzdG9yaW5nIGFjY291bnQgYmFsYW5jZXMgaW4gdGhlIHN5c3RlbSBwYWxsZXQgc3RvcmVzbQEgYGZyYW1lX3N5c3RlbWAgZGF0YSBhbG9uZ3NpZGUgdGhlIGFjY291bnQgZGF0YSBjb250cmFyeSB0byBzdG9yaW5nIGFjY291bnQgYmFsYW5jZXMgaW4gdGhlKQEgYEJhbGFuY2VzYCBwYWxsZXQsIHdoaWNoIHVzZXMgYSBgU3RvcmFnZU1hcGAgdG8gc3RvcmUgYmFsYW5jZXMgZGF0YSBvbmx5LkEBIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBjYXNlIHRoYXQgdGhpcyBwYWxsZXQgaXMgdXNlZCB0byBzdG9yZSBiYWxhbmNlcy4AFExvY2tzAQEEAgQ5CAQAELggQW55IGxpcXVpZGl0eSBsb2NrcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuJQEgTk9URTogU2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgd2hlbiBzZXR0aW5nLCBjaGFuZ2luZyBhbmQgZnJlZWluZyBhIGxvY2suAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AAIFJlc2VydmVzAQEEAgRJCAQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYAAUSG9sZHMBAQQCBFUIBAAEbCBIb2xkcyBvbiBhY2NvdW50IGJhbGFuY2VzLgAcRnJlZXplcwEBBAIEYQgEAASIIEZyZWV6ZSBsb2NrcyBvbiBhY2NvdW50IGJhbGFuY2VzLgABvAABeQYAEEhFeGlzdGVudGlhbERlcG9zaXTEQADKmjsAAAAAAAAAAAAAAAAgQQEgVGhlIG1pbmltdW0gYW1vdW50IHJlcXVpcmVkIHRvIGtlZXAgYW4gYWNjb3VudCBvcGVuLiBNVVNUIEJFIEdSRUFURVIgVEhBTiBaRVJPIQBZASBJZiB5b3UgKnJlYWxseSogbmVlZCBpdCB0byBiZSB6ZXJvLCB5b3UgY2FuIGVuYWJsZSB0aGUgZmVhdHVyZSBgaW5zZWN1cmVfemVyb19lZGAgZm9yYQEgdGhpcyBwYWxsZXQuIEhvd2V2ZXIsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrOiB0aGlzIHdpbGwgb3BlbiB1cCBhIG1ham9yIERvUyB2ZWN0b3IuWQEgSW4gY2FzZSB5b3UgaGF2ZSBtdWx0aXBsZSBzb3VyY2VzIG9mIHByb3ZpZGVyIHJlZmVyZW5jZXMsIHlvdSBtYXkgYWxzbyBnZXQgdW5leHBlY3RlZIwgYmVoYXZpb3VyIGlmIHlvdSBzZXQgdGhpcyB0byB6ZXJvLgDwIEJvdHRvbSBsaW5lOiBEbyB5b3Vyc2VsZiBhIGZhdm91ciBhbmQgbWFrZSBpdCBhdCBsZWFzdCBvbmUhACBNYXhMb2NrczgQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AALE1heFJlc2VydmVzOBAyAAAADA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW1lZCByZXNlcnZlcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50LgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYAAoTWF4RnJlZXplczgQAAAAAARhASBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBmcmVlemUgbG9ja3MgdGhhdCBjYW4gZXhpc3Qgb24gYW4gYWNjb3VudCBhdCBhbnkgdGltZS4AAW0IABBEUnVudGltZUhvbGRSZWFzb26BBgR0IFRoZSBvdmVyYXJjaGluZyBob2xkIHJlYXNvbi4cQmFsYW5jZcQEbCBUaGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LkRSZXNlcnZlSWRlbnRpZmllcr0BDGggVGhlIElEIHR5cGUgZm9yIHJlc2VydmVzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYEBGcmVlemVJZGVudGlmaWVyEARkIFRoZSBJRCB0eXBlIGZvciBmcmVlemVzLgAKAABIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQMRE5leHRGZWVNdWx0aXBsaWVyAQAtAUAAAGSns7bgDQAAAAAAAAAAAAA4U3RvcmFnZVZlcnNpb24BAHEIBAAAADxUeFBheW1lbnRDcmVkaXQAAHUIBAAM8CBUaGUgYE9uQ2hhcmdlVHJhbnNhY3Rpb25gIHN0b3JlcyB0aGUgd2l0aGRyYXduIHR4IGZlZSBoZXJlLgA1ASBVc2UgYHdpdGhkcmF3X3R4ZmVlYCBhbmQgYHJlbWFpbmluZ190eGZlZWAgdG8gYWNjZXNzIGZyb20gb3V0c2lkZSB0aGUgY3JhdGUuAAABqQYABGBPcGVyYXRpb25hbEZlZU11bHRpcGxpZXIMBAVUWQEgQSBmZWUgbXVsdGlwbGllciBmb3IgYE9wZXJhdGlvbmFsYCBleHRyaW5zaWNzIHRvIGNvbXB1dGUgInZpcnR1YWwgdGlwIiB0byBib29zdCB0aGVpciwgYHByaW9yaXR5YABRASBUaGlzIHZhbHVlIGlzIG11bHRpcGxpZWQgYnkgdGhlIGBmaW5hbF9mZWVgIHRvIG9idGFpbiBhICJ2aXJ0dWFsIHRpcCIgdGhhdCBpcyBsYXRlcvQgYWRkZWQgdG8gYSB0aXAgY29tcG9uZW50IGluIHJlZ3VsYXIgYHByaW9yaXR5YCBjYWxjdWxhdGlvbnMuTQEgSXQgbWVhbnMgdGhhdCBhIGBOb3JtYWxgIHRyYW5zYWN0aW9uIGNhbiBmcm9udC1ydW4gYSBzaW1pbGFybHktc2l6ZWQgYE9wZXJhdGlvbmFsYEEBIGV4dHJpbnNpYyAod2l0aCBubyB0aXApLCBieSBpbmNsdWRpbmcgYSB0aXAgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSB2aXJ0dWFsIHRpcC4APCBgYGBydXN0LGlnbm9yZUAgLy8gRm9yIGBOb3JtYWxgjCBsZXQgcHJpb3JpdHkgPSBwcmlvcml0eV9jYWxjKHRpcCk7AFQgLy8gRm9yIGBPcGVyYXRpb25hbGARASBsZXQgdmlydHVhbF90aXAgPSAoaW5jbHVzaW9uX2ZlZSArIHRpcCkgKiBPcGVyYXRpb25hbEZlZU11bHRpcGxpZXI7xCBsZXQgcHJpb3JpdHkgPSBwcmlvcml0eV9jYWxjKHRpcCArIHZpcnR1YWxfdGlwKTsQIGBgYABRASBOb3RlIHRoYXQgc2luY2Ugd2UgdXNlIGBmaW5hbF9mZWVgIHRoZSBtdWx0aXBsaWVyIGFwcGxpZXMgYWxzbyB0byB0aGUgcmVndWxhciBgdGlwYF0BIHNlbnQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIFNvLCBub3Qgb25seSBkb2VzIHRoZSB0cmFuc2FjdGlvbiBnZXQgYSBwcmlvcml0eSBidW1wIGJhc2VkYQEgb24gdGhlIGBpbmNsdXNpb25fZmVlYCwgYnV0IHdlIGFsc28gYW1wbGlmeSB0aGUgaW1wYWN0IG9mIHRpcHMgYXBwbGllZCB0byBgT3BlcmF0aW9uYWxgOCB0cmFuc2FjdGlvbnMuAAAAAAsAAEhTa2lwRmVlbGVzc1BheW1lbnQAAAGtBgAAAAAADAAARE9yaWdpblJlc3RyaWN0aW9uAURPcmlnaW5SZXN0cmljdGlvbgQYVXNhZ2VzAAEEAth9CAQABIwgVGhlIGN1cnJlbnQgdXNhZ2UgZm9yIGVhY2ggZW50aXR5LgAB1AABsQYAAAGBCAAEQFJlc3RyaWN0ZWRFbnRpdHnYJFEBIFRoZSB0eXBlIHRoYXQgcmVwcmVzZW50IHRoZSBlbnRpdGllcyB0cmFja2VkLCBpdHMgYWxsb3dhbmNlIGFuZCB0aGUgY29udmVyc2lvbiBmcm9tmCBvcmlnaW4gaXMgYm91bmRlZCBpbiBbYFJlc3RyaWN0aW9uYF0uAB0BIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBvcmlnaW4gZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB1c2FnZSB0cmFja2luZy6MIEVhY2ggZW50aXR5IGlzIHRyYWNrZWQgc2VwYXJhdGVseS4ASQEgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBvcmlnaW4gYXMgYSBtdWx0aXBsZSBvcmlnaW4gY2FuIHJlcHJlc2VudCBhIHNpbmdsZSBlbnRpdHkuYQEgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBEQU8gb3JpZ2luIHdpdGggYSBwZXJjZW50YWdlIG9mIHZvdGVycywgd2Ugd2FudCB0byB0cmFjayB0aGUgREFPrCBlbnRpdHkgcmVnYXJkbGVzcyBvZiB0aGUgdm90ZXIgcGVyY2VudGFnZS4ADQAAGEFzc2V0cwEYQXNzZXRzGBRBc3NldAABBALghQgEAARUIERldGFpbHMgb2YgYW4gYXNzZXQuABxBY2NvdW50AAEIAgKNCJEIBAAE5CBUaGUgaG9sZGluZ3Mgb2YgYSBzcGVjaWZpYyBhY2NvdW50IGZvciBhIHNwZWNpZmljIGFzc2V0LgAkQXBwcm92YWxzAAEMAgICnQihCAQADFkBIEFwcHJvdmVkIGJhbGFuY2UgdHJhbnNmZXJzLiBGaXJzdCBiYWxhbmNlIGlzIHRoZSBhbW91bnQgYXBwcm92ZWQgZm9yIHRyYW5zZmVyLiBTZWNvbmToIGlzIHRoZSBhbW91bnQgb2YgYFQ6OkN1cnJlbmN5YCByZXNlcnZlZCBmb3Igc3RvcmluZyB0aGlzLkkBIEZpcnN0IGtleSBpcyB0aGUgYXNzZXQgSUQsIHNlY29uZCBrZXkgaXMgdGhlIG93bmVyIGFuZCB0aGlyZCBrZXkgaXMgdGhlIGRlbGVnYXRlLgAgTWV0YWRhdGEBAQQC4KUIUAAAAAAAAAAAAAAAAAAAAAAAAAAABFggTWV0YWRhdGEgb2YgYW4gYXNzZXQuACBSZXNlcnZlcwEBBALgHQEEAAT8IE1hcHMgYW4gYXNzZXQgdG8gYSBsaXN0IG9mIGl0cyBjb25maWd1cmVkIHJlc2VydmUgaW5mb3JtYXRpb24uACxOZXh0QXNzZXRJZAAA4AQAJG0BIFRoZSBhc3NldCBJRCBlbmZvcmNlZCBmb3IgdGhlIG5leHQgYXNzZXQgY3JlYXRpb24sIGlmIGFueSBwcmVzZW50LiBPdGhlcndpc2UsIHRoaXMgc3RvcmFnZVAgaXRlbSBoYXMgbm8gZWZmZWN0LgBlASBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHNldHRpbmcgdXAgY29uc3RyYWludHMgZm9yIElEcyBvZiB0aGUgbmV3IGFzc2V0cy4gRm9yIGV4YW1wbGUsIGJ5aQEgcHJvdmlkaW5nIGFuIGluaXRpYWwgW2BOZXh0QXNzZXRJZGBdIGFuZCB1c2luZyB0aGUgW2BjcmF0ZTo6QXV0b0luY0Fzc2V0SWRgXSBjYWxsYmFjaywgYW7oIGF1dG8taW5jcmVtZW50IG1vZGVsIGNhbiBiZSBhcHBsaWVkIHRvIGFsbCBuZXcgYXNzZXQgSURzLgAhASBUaGUgaW5pdGlhbCBuZXh0IGFzc2V0IElEIGNhbiBiZSBzZXQgdXNpbmcgdGhlIFtgR2VuZXNpc0NvbmZpZ2BdIG9yIHRoZSEBIFtTZXROZXh0QXNzZXRJZF0oYG1pZ3JhdGlvbjo6bmV4dF9hc3NldF9pZDo6U2V0TmV4dEFzc2V0SWRgKSBtaWdyYXRpb24uAAHcAAG1BgAcQFJlbW92ZUl0ZW1zTGltaXQ4EOgDAAAMUQEgTWF4IG51bWJlciBvZiBpdGVtcyB0byBkZXN0cm95IHBlciBgZGVzdHJveV9hY2NvdW50c2AgYW5kIGBkZXN0cm95X2FwcHJvdmFsc2AgY2FsbC4AOQEgTXVzdCBiZSBjb25maWd1cmVkIHRvIHJlc3VsdCBpbiBhIHdlaWdodCB0aGF0IG1ha2VzIGVhY2ggY2FsbCBmaXQgaW4gYSBibG9jay4AMEFzc2V0RGVwb3NpdMRAAMqaOwAAAAAAAAAAAAAAAAT4IFRoZSBiYXNpYyBhbW91bnQgb2YgZnVuZHMgdGhhdCBtdXN0IGJlIHJlc2VydmVkIGZvciBhbiBhc3NldC4ATEFzc2V0QWNjb3VudERlcG9zaXTEQAD0abMCAAAAAAAAAAAAAAAIRQEgVGhlIGFtb3VudCBvZiBmdW5kcyB0aGF0IG11c3QgYmUgcmVzZXJ2ZWQgZm9yIGEgbm9uLXByb3ZpZGVyIGFzc2V0IGFjY291bnQgdG8gYmUwIG1haW50YWluZWQuAExNZXRhZGF0YURlcG9zaXRCYXNlxEAAqFvpAwAAAAAAAAAAAAAABFEBIFRoZSBiYXNpYyBhbW91bnQgb2YgZnVuZHMgdGhhdCBtdXN0IGJlIHJlc2VydmVkIHdoZW4gYWRkaW5nIG1ldGFkYXRhIHRvIHlvdXIgYXNzZXQuAFhNZXRhZGF0YURlcG9zaXRQZXJCeXRlxEAA4fUFAAAAAAAAAAAAAAAACFUBIFRoZSBhZGRpdGlvbmFsIGZ1bmRzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCBmb3IgdGhlIG51bWJlciBvZiBieXRlcyB5b3Ugc3RvcmUgaW4geW91ciggbWV0YWRhdGEuADxBcHByb3ZhbERlcG9zaXTEQADKmjsAAAAAAAAAAAAAAAAEIQEgVGhlIGFtb3VudCBvZiBmdW5kcyB0aGF0IG11c3QgYmUgcmVzZXJ2ZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBhcHByb3ZhbC4ALFN0cmluZ0xpbWl0OBAyAAAABOAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbmFtZSBvciBzeW1ib2wgc3RvcmVkIG9uLWNoYWluLgABrQgAFBxCYWxhbmNlxAScIFRoZSB1bml0cyBpbiB3aGljaCB3ZSByZWNvcmQgYmFsYW5jZXMuHEFzc2V0SWTgBIwgSWRlbnRpZmllciBmb3IgdGhlIGNsYXNzIG9mIGFzc2V0LkBBc3NldElkUGFyYW1ldGVy4BxZASBXcmFwcGVyIGFyb3VuZCBgU2VsZjo6QXNzZXRJZGAgdG8gdXNlIGluIGRpc3BhdGNoYWJsZSBjYWxsIHNpZ25hdHVyZXMuIEFsbG93cyB0aGUgdXNlUQEgb2YgY29tcGFjdCBlbmNvZGluZyBpbiBpbnN0YW5jZXMgb2YgdGhlIHBhbGxldCwgd2hpY2ggd2lsbCBwcmV2ZW50IGJyZWFraW5nIGNoYW5nZXMFASByZXN1bHRpbmcgZnJvbSB0aGUgcmVtb3ZhbCBvZiBgSGFzQ29tcGFjdGAgZnJvbSBgU2VsZjo6QXNzZXRJZGAuAFkBIFRoaXMgdHlwZSBpbmNsdWRlcyB0aGUgYEZyb208U2VsZjo6QXNzZXRJZD5gIGJvdW5kLCBzaW5jZSB0aWdodGx5IGNvdXBsZWQgcGFsbGV0cyBtYXlFASB3YW50IHRvIGNvbnZlcnQgYW4gYEFzc2V0SWRgIGludG8gYSBwYXJhbWV0ZXIgZm9yIGNhbGxpbmcgZGlzcGF0Y2hhYmxlIGZ1bmN0aW9ucyggZGlyZWN0bHkuLFJlc2VydmVEYXRhIQEE6CBJbmZvcm1hdGlvbiBhYm91dCByZXNlcnZlIGxvY2F0aW9ucyBmb3IgYSBjbGFzcyBvZiBhc3NldC4URXh0cmEQBPggQWRkaXRpb25hbCBkYXRhIHRvIGJlIHN0b3JlZCB3aXRoIGFuIGFjY291bnQncyBhc3NldCBiYWxhbmNlLhBoKlnVGrnkioyMxBj/lwjSpwKXrQtL3T2kt0YpplpuXDRhc3NldF9kZXRhaWxzBAhpZOCxCASoIFByb3ZpZGUgdGhlIGFzc2V0IGRldGFpbHMgZm9yIGFzc2V0IGBpZGAuAGgqWdUaueSKjIzEGP+XCNJTGsfiG3axIedh5HNBmhsCKGJhbGFuY2Vfb2YIDHdobwQIaWTgtQgEtCBQcm92aWRlIHRoZSBiYWxhbmNlIG9mIGB3aG9gIGZvciBhc3NldCBgaWRgLgBoKlnVGrnkioyMxBj/lwjSLodmpA0badYVG9gB5XVQXjBnZXRfbWV0YWRhdGEECGlk4LkIBMAgUHJvdmlkZSB0aGUgY29uZmlndXJlZCBtZXRhZGF0YSBmb3IgYXNzZXQgYGlkYC4AaCpZ1Rq55IqMjMQY/5cI0mT2Pykj45goJDFjga4eaYZEZ2V0X3Jlc2VydmVzX2RhdGEECGlk4CUBBNQgUHJvdmlkZSB0aGUgY29uZmlndXJlZCByZXNlcnZlcyBkYXRhIGZvciBhc3NldCBgaWRgLgAOAAAwQXNzZXRzSG9sZGVyATBBc3NldHNIb2xkZXIIFEhvbGRzAQEIAgKNCFUIBAAEDQEgQSBtYXAgdGhhdCBzdG9yZXMgaG9sZHMgYXBwbGllZCBvbiBhbiBhY2NvdW50IGZvciBhIGdpdmVuIEFzc2V0SWQuADhCYWxhbmNlc09uSG9sZAABCAICjQjEBAAEaQEgQSBtYXAgdGhhdCBzdG9yZXMgdGhlIGN1cnJlbnQgdG90YWwgYmFsYW5jZSBvbiBob2xkIGZvciBldmVyeSBhY2NvdW50IG9uIGEgZ2l2ZW4gQXNzZXRJZC4AAAG5BgAAAb0IAAREUnVudGltZUhvbGRSZWFzb26BBgR8IFRoZSBvdmVyYXJjaGluZyBmcmVlemUgcmVhc29uLgAPAAAkQXNzZXRSYXRlASRBc3NldFJhdGUEWENvbnZlcnNpb25SYXRlVG9OYXRpdmUAAQQC4C0BBAAMHQEgTWFwcyBhbiBhc3NldCB0byBpdHMgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24gaW4gdGhlIG5hdGl2ZSBiYWxhbmNlLgBNASBFLmcuIGBuYXRpdmVfYW1vdW50ID0gYXNzZXRfYW1vdW50ICogQ29udmVyc2lvblJhdGVUb05hdGl2ZTo6PFQ+OjpnZXQoYXNzZXRfa2luZClgAAEpAQABvQYAAAHBCAAEJEFzc2V0S2luZOAERQEgVGhlIHR5cGUgZm9yIGFzc2V0IGtpbmRzIGZvciB3aGljaCB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGlzIHNldC4AEAAAOEFzc2V0VHhQYXltZW50AAABwQYAAAAAABEAAChBdXRob3JzaGlwAShBdXRob3JzaGlwBBhBdXRob3IAAAQEAARkIEF1dGhvciBvZiBjdXJyZW50IGJsb2NrLgAAAAAAAAAUAABEQ29sbGF0b3JTZWxlY3Rpb24BRENvbGxhdG9yU2VsZWN0aW9uFDRJbnZ1bG5lcmFibGVzAQDFCAQABBEBIFRoZSBpbnZ1bG5lcmFibGUsIHBlcm1pc3Npb25lZCBjb2xsYXRvcnMuIFRoaXMgbGlzdCBtdXN0IGJlIHNvcnRlZC4ANENhbmRpZGF0ZUxpc3QBAMkIBAAUaQEgVGhlIChjb21tdW5pdHksIGxpbWl0ZWQpIGNvbGxhdGlvbiBjYW5kaWRhdGVzLiBgQ2FuZGlkYXRlc2AgYW5kIGBJbnZ1bG5lcmFibGVzYCBzaG91bGQgYmVQIG11dHVhbGx5IGV4Y2x1c2l2ZS4AdQEgVGhpcyBsaXN0IGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgZGVwb3NpdCBhbmQgd2hlbiB0aGUgZGVwb3NpdHMgYXJlIGVxdWFsLCB0aGUgbGVhc3SgIHJlY2VudGx5IHVwZGF0ZWQgaXMgY29uc2lkZXJlZCBncmVhdGVyLgBETGFzdEF1dGhvcmVkQmxvY2sBAQQFBDgQAAAAAASEIExhc3QgYmxvY2sgYXV0aG9yZWQgYnkgY29sbGF0b3IuAEREZXNpcmVkQ2FuZGlkYXRlcwEAOBAAAAAADHggRGVzaXJlZCBudW1iZXIgb2YgY2FuZGlkYXRlcy4AdQEgVGhpcyBzaG91bGQgaWRlYWxseSBhbHdheXMgYmUgbGVzcyB0aGFuIFtgQ29uZmlnOjpNYXhDYW5kaWRhdGVzYF0gZm9yIHdlaWdodHMgdG8gYmUgY29ycmVjdC4ANENhbmRpZGFjeUJvbmQBAMRAAAAAAAAAAAAAAAAAAAAAAAy4IEZpeGVkIGFtb3VudCB0byBkZXBvc2l0IHRvIGJlY29tZSBhIGNvbGxhdG9yLgBBASBXaGVuIGEgY29sbGF0b3IgY2FsbHMgYGxlYXZlX2ludGVudGAgdGhleSBpbW1lZGlhdGVseSByZWNlaXZlIHRoZSBkZXBvc2l0IGJhY2suAAExAQABxQYAGBRQb3RJZNUIIFBvdFN0YWtlBPQgQWNjb3VudCBJZGVudGlmaWVyIGZyb20gd2hpY2ggdGhlIGludGVybmFsIFBvdCBpcyBnZW5lcmF0ZWQuADRNYXhDYW5kaWRhdGVzOBBkAAAADMggTWF4aW11bSBudW1iZXIgb2YgY2FuZGlkYXRlcyB0aGF0IHdlIHNob3VsZCBoYXZlLgDMIFRoaXMgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGludnVsbmVyYWJsZXMuAFBNaW5FbGlnaWJsZUNvbGxhdG9yczgQBAAAAAxVASBNaW5pbXVtIG51bWJlciBlbGlnaWJsZSBjb2xsYXRvcnMuIFNob3VsZCBhbHdheXMgYmUgZ3JlYXRlciB0aGFuIHplcm8uIFRoaXMgaW5jbHVkZXNRASBJbnZ1bG5lcmFibGUgY29sbGF0b3JzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGVyZSB3aWxsIGFsd2F5cyBiZSBvbmUgY29sbGF0b3Igd2hvIGNhbkQgcHJvZHVjZSBhIGJsb2NrLgBATWF4SW52dWxuZXJhYmxlczgQFAAAAASEIE1heGltdW0gbnVtYmVyIG9mIGludnVsbmVyYWJsZXMuADRLaWNrVGhyZXNob2xkOBAwKgAAAAAscG90X2FjY291bnQEgG1vZGxQb3RTdGFrZQAAAAAAAAAAAAAAAAAAAAAAAAAABKAgR2V0cyB0aGlzIHBhbGxldCdzIGRlcml2ZWQgcG90IGFjY291bnQuAAHZCAAELFZhbGlkYXRvcklkBAR0IEEgc3RhYmxlIElEIGZvciBhIHZhbGlkYXRvci4AFQAAHFNlc3Npb24BHFNlc3Npb24gKFZhbGlkYXRvcnMBAMwEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLgAwQ3VycmVudEluZGV4AQA4EAAAAAAEeCBDdXJyZW50IGluZGV4IG9mIHRoZSBzZXNzaW9uLgA0UXVldWVkQ2hhbmdlZAEAyAQACDkBIFRydWUgaWYgdGhlIHVuZGVybHlpbmcgZWNvbm9taWMgaWRlbnRpdGllcyBvciB3ZWlnaHRpbmcgYmVoaW5kIHRoZSB2YWxpZGF0b3JzpCBoYXMgY2hhbmdlZCBpbiB0aGUgcXVldWVkIHZhbGlkYXRvciBzZXQuAChRdWV1ZWRLZXlzAQDdCAQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLgBIRGlzYWJsZWRWYWxpZGF0b3JzAQDlCAQAFIAgSW5kaWNlcyBvZiBkaXNhYmxlZCB2YWxpZGF0b3JzLgA9ASBUaGUgdmVjIGlzIGFsd2F5cyBrZXB0IHNvcnRlZCBzbyB0aGF0IHdlIGNhbiBmaW5kIHdoZXRoZXIgYSBnaXZlbiB2YWxpZGF0b3IgaXM9ASBkaXNhYmxlZCB1c2luZyBiaW5hcnkgc2VhcmNoLiBJdCBnZXRzIGNsZWFyZWQgd2hlbiBgb25fc2Vzc2lvbl9lbmRpbmdgIHJldHVybnNkIGEgbmV3IHNldCBvZiBpZGVudGl0aWVzLgAgTmV4dEtleXMAAQQFBDkBBAAEnCBUaGUgbmV4dCBzZXNzaW9uIGtleXMgZm9yIGEgdmFsaWRhdG9yLgAgS2V5T3duZXIAAQQF9QgEBAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4AREV4dGVybmFsbHlTZXRLZXlzAAEEBQQQBAAQMQEgQWNjb3VudHMgd2hvc2Uga2V5cyB3ZXJlIHNldCB2aWEgYFNlc3Npb25JbnRlcmZhY2VgIChleHRlcm5hbCBwYXRoKSB3aXRob3V0OQEgaW5jcmVtZW50aW5nIHRoZSBjb25zdW1lciByZWZlcmVuY2Ugb3IgcGxhY2luZyBhIGtleSBkZXBvc2l0LiBgZG9fcHVyZ2Vfa2V5c2A5ASBvbmx5IGRlY3JlbWVudHMgY29uc3VtZXJzIGZvciBhY2NvdW50cyB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB0aHJvdWdoIHRoZSBsb2NhbEAgc2Vzc2lvbiBwYWxsZXQuAAE1AQAByQYABChLZXlEZXBvc2l0xEAAAAAAAAAAAAAAAAAAAAAABKQgVGhlIGFtb3VudCB0byBiZSBoZWxkIHdoZW4gc2V0dGluZyBrZXlzLgAB/QgACCxWYWxpZGF0b3JJZAQEdCBBIHN0YWJsZSBJRCBmb3IgYSB2YWxpZGF0b3IuEEtleXM5AQQoIFRoZSBrZXlzLgAWAAAQQXVyYQEQQXVyYQgsQXV0aG9yaXRpZXMBAAEJBAAEbCBUaGUgY3VycmVudCBhdXRob3JpdHkgc2V0LgAsQ3VycmVudFNsb3QBAAkJIAAAAAAAAAAADIAgVGhlIGN1cnJlbnQgc2xvdCBvZiB0aGlzIGJsb2NrLgCUIFRoaXMgd2lsbCBiZSBzZXQgaW4gYG9uX2luaXRpYWxpemVgLgAAAAQwU2xvdER1cmF0aW9uKCDgLgAAAAAAABQNASBUaGUgc2xvdCBkdXJhdGlvbiBBdXJhIHNob3VsZCBydW4gd2l0aCwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcy4AIQEgVGhlIGVmZmVjdGl2ZSB2YWx1ZSBvZiB0aGlzIHR5cGUgY2FuIGJlIGNoYW5nZWQgd2l0aCBhIHJ1bnRpbWUgdXBncmFkZS4ANQEgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGVpdGhlciB1c2UgW2BNaW5pbXVtUGVyaW9kVGltZXNUd29gXSBvciBhIGNvbnN0LgAABCxBdXRob3JpdHlJZD0BBJggVGhlIGlkZW50aWZpZXIgdHlwZSBmb3IgYW4gYXV0aG9yaXR5LgAXAAAcQXVyYUV4dAEcQXVyYUV4dAgsQXV0aG9yaXRpZXMBAAEJBAAUlCBTZXJ2ZXMgYXMgY2FjaGUgZm9yIHRoZSBhdXRob3JpdGllcy4AcQEgVGhlIGF1dGhvcml0aWVzIGluIEF1UmEgYXJlIG92ZXJ3cml0dGVuIGluIGBvbl9pbml0aWFsaXplYCB3aGVuIHdlIHN3aXRjaCB0byBhIG5ldyBzZXNzaW9uLF0BIGJ1dCB3ZSByZXF1aXJlIHRoZSBvbGQgYXV0aG9yaXRpZXMgdG8gdmVyaWZ5IHRoZSBzZWFsIHdoZW4gdmFsaWRhdGluZyBhIFBvVi4gVGhpcyB3aWxsDQEgYWx3YXlzIGJlIHVwZGF0ZWQgdG8gdGhlIGxhdGVzdCBBdVJhIGF1dGhvcml0aWVzIGluIGBvbl9maW5hbGl6ZWAuADRSZWxheVNsb3RJbmZvAAANCQQAEAkBIEN1cnJlbnQgcmVsYXkgY2hhaW4gc2xvdCBwYWlyZWQgd2l0aCBhIG51bWJlciBvZiBhdXRob3JlZCBibG9ja3MuAGUBIFRoaXMgaXMgdXBkYXRlZCBpbiBbYEZpeGVkVmVsb2NpdHlDb25zZW5zdXNIb29rOjpvbl9zdGF0ZV9wcm9vZmBdIHdpdGggdGhlIGN1cnJlbnQgcmVsYXncIGNoYWluIHNsb3QgYXMgcHJvdmlkZWQgYnkgdGhlIHJlbGF5IGNoYWluIHN0YXRlIHByb29mLgAAAAAAAAAYAAAkWGNtcFF1ZXVlASRYY21wUXVldWUcUEluYm91bmRYY21wU3VzcGVuZGVkAQARCQQAIA0BIFRoZSBzdXNwZW5kZWQgaW5ib3VuZCBYQ01QIGNoYW5uZWxzLiBBbGwgb3RoZXJzIGFyZSBub3Qgc3VzcGVuZGVkLgBxASBUaGlzIGlzIGEgYFN0b3JhZ2VWYWx1ZWAgaW5zdGVhZCBvZiBhIGBTdG9yYWdlTWFwYCBzaW5jZSB3ZSBleHBlY3QgbXVsdGlwbGUgcmVhZHMgcGVyIGJsb2NraQEgdG8gZGlmZmVyZW50IGtleXMgd2l0aCBhIG9uZSBieXRlIHBheWxvYWQuIFRoZSBhY2Nlc3MgdG8gYEJvdW5kZWRCVHJlZVNldGAgd2lsbCBiZSBjYWNoZWQVASB3aXRoaW4gdGhlIGJsb2NrIGFuZCB0aGVyZWZvcmUgb25seSBpbmNsdWRlZCBvbmNlIGluIHRoZSBwcm9vZiBzaXplLgBlASBOT1RFOiBUaGUgUG9WIGJlbmNobWFya2luZyBjYW5ub3Qga25vdyB0aGlzIGFuZCB3aWxsIG92ZXItZXN0aW1hdGUsIGJ1dCB0aGUgYWN0dWFsIHByb29mRCB3aWxsIGJlIHNtYWxsZXIuAEhPdXRib3VuZFhjbXBTdGF0dXMBABkJBAAYXQEgVGhlIG5vbi1lbXB0eSBYQ01QIGNoYW5uZWxzIGluIG9yZGVyIG9mIGJlY29taW5nIG5vbi1lbXB0eSwgYW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RRASBhbmQgbGFzdCBvdXRib3VuZCBtZXNzYWdlLiBJZiB0aGUgdHdvIGluZGljZXMgYXJlIGVxdWFsLCB0aGVuIGl0IGluZGljYXRlcyBhbiBlbXB0eVkBIHF1ZXVlIGFuZCB0aGVyZSBtdXN0IGJlIGEgbm9uLWBPa2AgYE91dGJvdW5kU3RhdHVzYC4gV2UgYXNzdW1lIHF1ZXVlcyBncm93IG5vIGdyZWF0ZXJZASB0aGFuIDY1NTM1IGl0ZW1zLiBRdWV1ZSBpbmRpY2VzIGZvciBub3JtYWwgbWVzc2FnZXMgYmVnaW4gYXQgb25lOyB6ZXJvIGlzIHJlc2VydmVkIGluEQEgY2FzZSBvZiB0aGUgbmVlZCB0byBzZW5kIGEgaGlnaC1wcmlvcml0eSBzaWduYWwgbWVzc2FnZSB0aGlzIGJsb2NrLgkBIFRoZSBib29sIGlzIHRydWUgaWYgdGhlcmUgaXMgYSBzaWduYWwgbWVzc2FnZSB3YWl0aW5nIHRvIGJlIHNlbnQuAFBPdXRib3VuZFhjbXBNZXNzYWdlcwEBCAIFLQkxCQQABLwgVGhlIG1lc3NhZ2VzIG91dGJvdW5kIGluIGEgZ2l2ZW4gWENNUCBjaGFubmVsLgA4U2lnbmFsTWVzc2FnZXMBAQQCnDEJBAAEoCBBbnkgc2lnbmFsIG1lc3NhZ2VzIHdhaXRpbmcgdG8gYmUgc2VudC4ALFF1ZXVlQ29uZmlnAQA1CTAgAAAAMAAAAAgAAAAEFQEgVGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggY29udHJvbHMgdGhlIGR5bmFtaWNzIG9mIHRoZSBvdXRib3VuZCBxdWV1ZS4AOFF1ZXVlU3VzcGVuZGVkAQDIBAAEQQEgV2hldGhlciBvciBub3QgdGhlIFhDTVAgcXVldWUgaXMgc3VzcGVuZGVkIGZyb20gZXhlY3V0aW5nIGluY29taW5nIFhDTXMgb3Igbm90LgBERGVsaXZlcnlGZWVGYWN0b3IBAQQFnC0BQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAUEBAAHNBgAMTE1heEluYm91bmRTdXNwZW5kZWQ4EOgDAAAUSQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluYm91bmQgWENNUCBjaGFubmVscyB0aGF0IGNhbiBiZSBzdXNwZW5kZWQgc2ltdWx0YW5lb3VzbHkuAF0BIEFueSBmdXJ0aGVyIGNoYW5uZWwgc3VzcGVuc2lvbnMgd2lsbCBmYWlsIGFuZCBtZXNzYWdlcyBtYXkgZ2V0IGRyb3BwZWQgd2l0aG91dCBmdXJ0aGVyRQEgbm90aWNlLiBDaG9vc2luZyBhIGhpZ2ggdmFsdWUgKDEwMDApIGlzIG9rYXk7IHRoZSB0cmFkZS1vZmYgdGhhdCBpcyBkZXNjcmliZWQgaW7YIFtgSW5ib3VuZFhjbXBTdXNwZW5kZWRgXSBzdGlsbCBhcHBsaWVzIGF0IHRoYXQgc2NhbGUuAGRNYXhBY3RpdmVPdXRib3VuZENoYW5uZWxzOBCAAAAAIGUBIE1heGltYWwgbnVtYmVyIG9mIG91dGJvdW5kIFhDTVAgY2hhbm5lbHMgdGhhdCBjYW4gaGF2ZSBtZXNzYWdlcyBxdWV1ZWQgYXQgdGhlIHNhbWUgdGltZS4AVQEgSWYgdGhpcyBpcyByZWFjaGVkLCB0aGVuIG5vIGZ1cnRoZXIgbWVzc2FnZXMgY2FuIGJlIHNlbnQgdG8gY2hhbm5lbHMgdGhhdCBkbyBub3QgeWV0XQEgaGF2ZSBhIG1lc3NhZ2UgcXVldWVkLiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdGhlIGV4cGVjdGVkIG1heGltdW0gb2Ygb3V0Ym91bmQgY2hhbm5lbHNhASB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IFtgU2VsZjo6Q2hhbm5lbEluZm9gXS4gSXQgaXMgaW1wb3J0YW50IHRvIHNldCB0aGlzIGxhcmdlIGVub3VnaCxdASBzaW5jZSBvdGhlcndpc2UgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBwcm90b2NvbCB3aWxsIG5vdCB3b3JrIGFzIGludGVuZGVkIGFuZCBtZXNzYWdlc1EBIG1heSBiZSBkcm9wcGVkLiBUaGlzIHZhbHVlIGluY3JlYXNlcyB0aGUgUG9WIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5vdCBiZSBwaWNrZWQgdG9vTQEgaGlnaC4gR292ZXJuYW5jZSBuZWVkcyB0byBwYXkgYXR0ZW50aW9uIHRvIG5vdCBvcGVuIG1vcmUgY2hhbm5lbHMgdGhhbiB0aGlzIHZhbHVlLgAsTWF4UGFnZVNpemU4EACcAQAUuCBUaGUgbWF4aW1hbCBwYWdlIHNpemUgZm9yIEhSTVAgbWVzc2FnZSBwYWdlcy4AYQEgQSBsb3dlciBsaW1pdCBjYW4gYmUgc2V0IGR5bmFtaWNhbGx5LCBidXQgdGhpcyBpcyB0aGUgaGFyZC1saW1pdCBmb3IgdGhlIFBvViB3b3JzdCBjYXNlVQEgYmVuY2htYXJraW5nLiBUaGUgbGltaXQgZm9yIHRoZSBzaXplIG9mIGEgbWVzc2FnZSBpcyBzbGlnaHRseSBiZWxvdyB0aGlzLCBzaW5jZSBzb21luCBvdmVyaGVhZCBpcyBpbmN1cnJlZCBmb3IgZW5jb2RpbmcgdGhlIGZvcm1hdC4AATkJAAAAHgAALFBvbGthZG90WGNtASxQb2xrYWRvdFhjbTwwUXVlcnlDb3VudGVyAQAoIAAAAAAAAAAABIggVGhlIGxhdGVzdCBhdmFpbGFibGUgcXVlcnkgaW5kZXguABxRdWVyaWVzAAEEAig9CQQABFQgVGhlIG9uZ29pbmcgcXVlcmllcy4AKEFzc2V0VHJhcHMBAQQGPDgQAAAAABBoIFRoZSBleGlzdGluZyBhc3NldCB0cmFwcy4AYQEgS2V5IGlzIHRoZSBibGFrZTIgMjU2IGhhc2ggb2YgKG9yaWdpbiwgdmVyc2lvbmVkIGBBc3NldHNgKSBwYWlyLiBWYWx1ZSBpcyB0aGUgbnVtYmVyIG9mHQEgdGltZXMgdGhpcyBwYWlyIGhhcyBiZWVuIHRyYXBwZWQgKHVzdWFsbHkganVzdCAxIGlmIGl0IGV4aXN0cyBhdCBhbGwpLgA4U2FmZVhjbVZlcnNpb24AADgEAAhhASBEZWZhdWx0IHZlcnNpb24gdG8gZW5jb2RlIFhDTSB3aGVuIGxhdGVzdCB2ZXJzaW9uIG9mIGRlc3RpbmF0aW9uIGlzIHVua25vd24uIElmIGBOb25lYCw9ASB0aGVuIHRoZSBkZXN0aW5hdGlvbnMgd2hvc2UgWENNIHZlcnNpb24gaXMgdW5rbm93biBhcmUgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS4AQFN1cHBvcnRlZFZlcnNpb24AAQgFAlEJOAQABPAgVGhlIExhdGVzdCB2ZXJzaW9ucyB0aGF0IHdlIGtub3cgdmFyaW91cyBsb2NhdGlvbnMgc3VwcG9ydC4AQFZlcnNpb25Ob3RpZmllcnMAAQgFAlEJKAQABAUBIEFsbCBsb2NhdGlvbnMgdGhhdCB3ZSBoYXZlIHJlcXVlc3RlZCB2ZXJzaW9uIG5vdGlmaWNhdGlvbnMgZnJvbS4AUFZlcnNpb25Ob3RpZnlUYXJnZXRzAAEIBQJRCVUJBAAIcQEgVGhlIHRhcmdldCBsb2NhdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byBvdXIgdmVyc2lvbiBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBtb3N0IHJlY2VudJQgb2Ygb3VyIHZlcnNpb25zIHdlIGluZm9ybWVkIHRoZW0gb2YuAFRWZXJzaW9uRGlzY292ZXJ5UXVldWUBAFkJBAAMZQEgRGVzdGluYXRpb25zIHdob3NlIGxhdGVzdCBYQ00gdmVyc2lvbiB3ZSB3b3VsZCBsaWtlIHRvIGtub3cuIER1cGxpY2F0ZXMgbm90IGFsbG93ZWQsIGFuZHEBIHRoZSBgdTMyYCBjb3VudGVyIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBhIHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uIGhhcyBiZWVuIGF0dGVtcHRlZCyMIHdoaWNoIGlzIHVzZWQgYXMgYSBwcmlvcml0aXphdGlvbi4AQEN1cnJlbnRNaWdyYXRpb24AAGUJBAAEnCBUaGUgY3VycmVudCBtaWdyYXRpb24ncyBzdGFnZSwgaWYgYW55LgBUUmVtb3RlTG9ja2VkRnVuZ2libGVzAAEMBQICaQltCQQABPAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiBhIHJlbW90ZSBjaGFpbi4APExvY2tlZEZ1bmdpYmxlcwABBAIEfQkEAATgIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gdGhpcyBjaGFpbi4AVFhjbUV4ZWN1dGlvblN1c3BlbmRlZAEAyAQABLQgR2xvYmFsIHN1c3BlbnNpb24gc3RhdGUgb2YgdGhlIFhDTSBleGVjdXRvci4APFNob3VsZFJlY29yZFhjbQEAyAQAHFkBIFdoZXRoZXIgb3Igbm90IGluY29taW5nIFhDTXMgKGJvdGggZXhlY3V0ZWQgbG9jYWxseSBhbmQgcmVjZWl2ZWQpIHNob3VsZCBiZSByZWNvcmRlZC7EIE9ubHkgb25lIFhDTSBwcm9ncmFtIHdpbGwgYmUgcmVjb3JkZWQgYXQgYSB0aW1lLikBIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBydW50aW1lIEFQSXMsIGFuZCBpdCdzIGFkdmlzZWQgaXQgc3RheXMgZmFsc2UNASBmb3IgYWxsIG90aGVyIHVzZSBjYXNlcywgc28gYXMgdG8gbm90IGRlZ3JhZGUgcmVndWxhciBwZXJmb3JtYW5jZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLgAsUmVjb3JkZWRYY20AAF0CBAAYSQEgSWYgW2BTaG91bGRSZWNvcmRYY21gXSBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgbGFzdCBYQ00gcHJvZ3JhbSBleGVjdXRlZCBsb2NhbGx5VCB3aWxsIGJlIHN0b3JlZCBoZXJlLikBIFJ1bnRpbWUgQVBJcyBjYW4gZmV0Y2ggdGhlIFhDTSB0aGF0IHdhcyBleGVjdXRlZCBieSBhY2Nlc3NpbmcgdGhpcyB2YWx1ZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLgBEQXV0aG9yaXplZEFsaWFzZXMAAQQCSQGJCQQADGUBIE1hcCBvZiBhdXRob3JpemVkIGFsaWFzZXJzIG9mIGxvY2FsIG9yaWdpbnMuIEVhY2ggbG9jYWwgbG9jYXRpb24gY2FuIGF1dGhvcml6ZSBhIGxpc3Qgb2ZZASBvdGhlciBsb2NhdGlvbnMgdG8gYWxpYXMgaW50byBpdC4gRWFjaCBhbGlhc2VyIGlzIG9ubHkgdmFsaWQgdW50aWwgaXRzIGlubmVyIGBleHBpcnlgOCBibG9jayBudW1iZXIuAAFFAQgBArkBVGhpcyBleHRyaW5zaWMgdXNlcyBgV2VpZ2h0TGltaXQ6OlVubGltaXRlZGAsIHBsZWFzZSBtaWdyYXRlIHRvIGBsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0c2Agb3IgYHRyYW5zZmVyX2Fzc2V0c2AAAgLZAVRoaXMgZXh0cmluc2ljIHVzZXMgYFdlaWdodExpbWl0OjpVbmxpbWl0ZWRgLCBwbGVhc2UgbWlncmF0ZSB0byBgbGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0c2Agb3IgYHRyYW5zZmVyX2Fzc2V0c2AAAdEGABBEVW5pdmVyc2FsTG9jYXRpb27kGAIJAgBRUASEIFRoaXMgY2hhaW4ncyBVbml2ZXJzYWwgTG9jYXRpb24uAFBBZHZlcnRpc2VkWGNtVmVyc2lvbjgQBQAAAAglASBUaGUgbGF0ZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIHRoYXQgd2UgYWR2ZXJ0aXNlLiBHZW5lcmFsbHkganVzdCBzZXQgaXQgdG+EIGBwYWxsZXRfeGNtOjpDdXJyZW50WGNtVmVyc2lvbmAuAChNYXhMb2NrZXJzOBAIAAAABBkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCBYQ00gbG9ja3MgdGhhdCBhIHNpbmdsZSBhY2NvdW50IG1heSBoYXZlLgBYTWF4UmVtb3RlTG9ja0NvbnN1bWVyczgQAAAAAAT8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdW1lcnMgYSBzaW5nbGUgcmVtb3RlIGxvY2sgbWF5IGhhdmUuAAGhCQQYArxVc2UgYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZVdpdGhFcnJvcmAgaW5zdGVhZAEYMjAuMC4wCCxSdW50aW1lQ2FsbCAEZCBUaGUgcnVudGltZSBgQ2FsbGAgdHlwZS5wUmVtb3RlTG9ja0NvbnN1bWVySWRlbnRpZmllchAExCBUaGUgSUQgdHlwZSBmb3IgbG9jYWwgY29uc3VtZXJzIG9mIHJlbW90ZSBsb2Nrcy4AHwAAKEN1bXVsdXNYY20AARkDAAHhBgAAAAAAIAAAME1lc3NhZ2VRdWV1ZQEwTWVzc2FnZVF1ZXVlDDBCb29rU3RhdGVGb3IBAQQFIQOpCXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATMIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgKG5vbi1lbXB0eSkgcGFnZXMuACxTZXJ2aWNlSGVhZAAAIQMEAAS8IFRoZSBvcmlnaW4gYXQgd2hpY2ggd2Ugc2hvdWxkIGJlZ2luIHNlcnZpY2luZy4AFFBhZ2VzAAEIBQW1CbkJBAAEiCBUaGUgbWFwIG9mIHBhZ2UgaW5kaWNlcyB0byBwYWdlcy4AAR0DAAHlBgAQIEhlYXBTaXplOBAAnAEAFD0BIFRoZSBzaXplIG9mIHRoZSBwYWdlOyB0aGlzIGltcGxpZXMgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplIHdoaWNoIGNhbiBiZSBzZW50LgBZASBBIGdvb2QgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZXhwZWN0ZWQgbWVzc2FnZSBzaXplcywgdGhlaXIgd2VpZ2h0cywgdGhlIHdlaWdodCB0aGF0IGlzXQEgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nIHRoZW0gYW5kIHRoZSBtYXhpbWFsIG5lZWRlZCBtZXNzYWdlIHNpemUuIFRoZSBtYXhpbWFsIG1lc3NhZ2URASBzaXplIGlzIHNsaWdodGx5IGxvd2VyIHRoYW4gdGhpcyBhcyBkZWZpbmVkIGJ5IFtgTWF4TWVzc2FnZUxlbk9mYF0uACBNYXhTdGFsZTgQCAAAAAxdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhbGUgcGFnZXMgKGkuZS4gb2Ygb3ZlcndlaWdodCBtZXNzYWdlcykgYWxsb3dlZCBiZWZvcmUgY3VsbGluZ1EBIGNhbiBoYXBwZW4uIE9uY2UgdGhlcmUgYXJlIG1vcmUgc3RhbGUgcGFnZXMgdGhhbiB0aGlzLCB0aGVuIGhpc3RvcmljYWwgcGFnZXMgbWF5IGJl/CBkcm9wcGVkLCBldmVuIGlmIHRoZXkgY29udGFpbiB1bnByb2Nlc3NlZCBvdmVyd2VpZ2h0IG1lc3NhZ2VzLgA0U2VydmljZVdlaWdodKUCLAEHAFhA+6ICAOAAGEEBIFRoZSBhbW91bnQgb2Ygd2VpZ2h0IChpZiBhbnkpIHdoaWNoIHNob3VsZCBiZSBwcm92aWRlZCB0byB0aGUgbWVzc2FnZSBxdWV1ZSBmb3KoIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faW5pdGlhbGl6ZWAuAPwgVGhpcyBtYXkgYmUgbGVnaXRpbWF0ZWx5IGBOb25lYCBpbiB0aGUgY2FzZSB0aGF0IHlvdSB3aWxsIGNhbGxdASBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIG1hbnVhbGx5IG9yIHNldCBbYFNlbGY6OklkbGVNYXhTZXJ2aWNlV2VpZ2h0YF0gdG8gaGF2ZVQgaXQgcnVuIGluIGBvbl9pZGxlYC4AUElkbGVNYXhTZXJ2aWNlV2VpZ2h0pQIsAQcAWED7ogIA4AAUXQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB0byBiZSB1c2VkIGZyb20gcmVtYWluaW5nIHdlaWdodCBgb25faWRsZWAgd2hpY2hBASBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faWRsZWAuPQEgVXNlZnVsIGZvciBwYXJhY2hhaW5zIHRvIHByb2Nlc3MgbWVzc2FnZXMgYXQgdGhlIHNhbWUgYmxvY2sgdGhleSBhcmUgcmVjZWl2ZWQuACkBIElmIGBOb25lYCwgaXQgd2lsbCBub3QgY2FsbCBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIGluIGBvbl9pZGxlYC4AAcEJAAQQU2l6ZTgEVCBQYWdlL2hlYXAgc2l6ZSB0eXBlLgAiAAAcVXRpbGl0eQABJQMAAe0GAARMYmF0Y2hlZF9jYWxsc19saW1pdDgQqioAAASoIFRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJhdGNoZWQgY2FsbHMuAAHFCQAILFJ1bnRpbWVDYWxsIARsIFRoZSBvdmVyYXJjaGluZyBjYWxsIHR5cGUuNFBhbGxldHNPcmlnaW4xAwTwIFRoZSBjYWxsZXIgb3JpZ2luLCBvdmVyYXJjaGluZyB0eXBlIG9mIGFsbCBwYWxsZXRzIG9yaWdpbnMuACgAACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCyQnNCQQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAAGJAwAB9QYADCxEZXBvc2l0QmFzZcRAADyRYAQAAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy4ANERlcG9zaXRGYWN0b3LEQAAgvL4AAAAAAAAAAAAAAAAMVQEgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIHVuaXQgdGhyZXNob2xkIHdoZW4gY3JlYXRpbmcgYSBtdWx0aXNpZyBleGVjdXRpb24uACUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIG1vcmUgaW50byBhIHByZS1leGlzdGluZyBzdG9yYWdlIHZhbHVlLgA4TWF4U2lnbmF0b3JpZXM4EGQAAAAE7CBUaGUgbWF4aW11bSBhbW91bnQgb2Ygc2lnbmF0b3JpZXMgYWxsb3dlZCBpbiB0aGUgbXVsdGlzaWcuAAHVCQAELFJ1bnRpbWVDYWxsIARsIFRoZSBvdmVyYXJjaGluZyBjYWxsIHR5cGUuACkAABBTdWRvARBTdWRvBAxLZXkAAAQEAASEIFRoZSBgQWNjb3VudElkYCBvZiB0aGUgc3VkbyBrZXkuAAGVAwAB+QYAAAHZCQAELFJ1bnRpbWVDYWxsIARIIEEgc3Vkby1hYmxlIGNhbGwuACoAADxWZXJpZnlTaWduYXR1cmUAAAAAAAQkU2lnbmF0dXJlNQQE9CBTaWduYXR1cmUgdHlwZSB0aGF0IHRoZSBleHRlbnNpb24gb2YgdGhpcyBwYWxsZXQgY2FuIHZlcmlmeS4AKwAAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUE3QlEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LgA0QW5ub3VuY2VtZW50cwEBBAUE7QlEAAAAAAAAAAAAAAAAAAAAAAAErCBUaGUgYW5ub3VuY2VtZW50cyBtYWRlIGJ5IHRoZSBwcm94eSAoa2V5KS4AAZkDAAEBBwAYQFByb3h5RGVwb3NpdEJhc2XEQAAMd0IDAAAAAAAAAAAAAAAQEQEgVGhlIGJhc2UgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCB0byByZXNlcnZlIGZvciBjcmVhdGluZyBhIHByb3h5LgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMlASBgc2l6ZW9mKEJhbGFuY2UpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXMgYHNpemVvZihBY2NvdW50SWQpYCBieXRlcy4ASFByb3h5RGVwb3NpdEZhY3RvcsRAAAGyxAAAAAAAAAAAAAAAABS8IFRoZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHBlciBwcm94eSBhZGRlZC4ANQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgcGx1cyBhbiBpbnN0YW5jZSBvZiBgUHJveHlUeXBlYCBtb3JlIGludG8gYWEBIHByZS1leGlzdGluZyBzdG9yYWdlIHZhbHVlLiBUaHVzLCB3aGVuIGNvbmZpZ3VyaW5nIGBQcm94eURlcG9zaXRGYWN0b3JgIG9uZSBzaG91bGQgdGFrZfQgaW50byBhY2NvdW50IGAzMiArIHByb3h5X3R5cGUuZW5jb2RlKCkubGVuKClgIGJ5dGVzIG9mIGRhdGEuAChNYXhQcm94aWVzOBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4AKE1heFBlbmRpbmc4ECAAAAAERQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUtZGVsYXllZCBhbm5vdW5jZW1lbnRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGVuZGluZy4AXEFubm91bmNlbWVudERlcG9zaXRCYXNlxEAAFCZyAwAAAAAAAAAAAAAAEDEBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYW4gYW5ub3VuY2VtZW50LgBJASBUaGlzIGlzIGhlbGQgd2hlbiBhIG5ldyBzdG9yYWdlIGl0ZW0gaG9sZGluZyBhIGBCYWxhbmNlYCBpcyBjcmVhdGVkICh0eXBpY2FsbHkgMTYgIGJ5dGVzKS4AZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3LEQAACZIkBAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4AAf0JAAgsUnVudGltZUNhbGwgBGwgVGhlIG92ZXJhcmNoaW5nIGNhbGwgdHlwZS4kUHJveHlUeXBloQMQVQEgQSBraW5kIG9mIHByb3h5OyBzcGVjaWZpZWQgd2l0aCB0aGUgcHJveHkgYW5kIHBhc3NlZCBpbiB0byB0aGUgYElzUHJveHlhYmxlYCBmaWx0ZXIuUQEgVGhlIGluc3RhbmNlIGZpbHRlciBkZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBjYWxsIG1heSBiZSBwcm94aWVkIHVuZGVyIHRoaXMgdHlwZS4ATQEgSU1QT1JUQU5UOiBgRGVmYXVsdGAgbXVzdCBiZSBwcm92aWRlZCBhbmQgTVVTVCBCRSB0aGUgdGhlICptb3N0IHBlcm1pc3NpdmUqIHZhbHVlLggYCdeDRnJ6DvWMD6A7r6Mjy8UUiNkqGqcTewO/tQ78F0RjaGVja19wZXJtaXNzaW9ucwgQY2FsbCAocHJveHlfdHlwZaEDyAT0IENoZWNrIGlmIGEgYFJ1bnRpbWVDYWxsYCBpcyBhbGxvd2VkIGZvciBhIGdpdmVuIGBQcm94eVR5cGVgLgAYCdeDRnJ6DvWMD6A7r6MjFxSwYH1irwo7OwrSxdVcWCxpc19zdXBlcnNldAggdG9fY2hlY2uhAxxhZ2FpbnN0oQPIBPQgQ2hlY2sgaWYgb25lIGBQcm94eVR5cGVgIGlzIGEgc3Vic2V0IG9mIGFub3RoZXIgYFByb3h5VHlwZWAuACwAACBJZGVudGl0eQEgSWRlbnRpdHkwKElkZW50aXR5T2YAAQQFBAEKBAAQaQEgSW5mb3JtYXRpb24gdGhhdCBpcyBwZXJ0aW5lbnQgdG8gaWRlbnRpZnkgdGhlIGVudGl0eSBiZWhpbmQgYW4gYWNjb3VudC4gRmlyc3QgaXRlbSBpcyB0aGXgIHJlZ2lzdHJhdGlvbiwgc2Vjb25kIGlzIHRoZSBhY2NvdW50J3MgcHJpbWFyeSB1c2VybmFtZS4AwCBUV09YLU5PVEU6IE9LIOKAlSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLgAoVXNlcm5hbWVPZgABBAUEQQQEAAS8IElkZW50aWZpZXMgdGhlIHByaW1hcnkgdXNlcm5hbWUgb2YgYW4gYWNjb3VudC4AHFN1cGVyT2YAAQQCBCkEBAAIYQEgVGhlIHN1cGVyLWlkZW50aXR5IG9mIGFuIGFsdGVybmF0aXZlICJzdWIiIGlkZW50aXR5IHRvZ2V0aGVyIHdpdGggaXRzIG5hbWUsIHdpdGhpbiB0aGF0UQEgY29udGV4dC4gSWYgdGhlIGFjY291bnQgaXMgbm90IHNvbWUgb3RoZXIgYWNjb3VudCdzIHN1Yi1pZGVudGl0eSwgdGhlbiBqdXN0IGBOb25lYC4AGFN1YnNPZgEBBAUEEQpEAAAAAAAAAAAAAAAAAAAAAAAUuCBBbHRlcm5hdGl2ZSAic3ViIiBpZGVudGl0aWVzIG9mIHRoaXMgYWNjb3VudC4AHQEgVGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGRlcG9zaXQsIHRoZSBzZWNvbmQgaXMgYSB2ZWN0b3Igb2YgdGhlIGFjY291bnRzLgDAIFRXT1gtTk9URTogT0sg4oCVIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guAChSZWdpc3RyYXJzAQAVCgQAEE0BIFRoZSBzZXQgb2YgcmVnaXN0cmFycy4gTm90IGV4cGVjdGVkIHRvIGdldCB2ZXJ5IGJpZyBhcyBjYW4gb25seSBiZSBhZGRlZCB0aHJvdWdoIGGoIHNwZWNpYWwgb3JpZ2luIChsaWtlbHkgYSBjb3VuY2lsIG1vdGlvbikuACkBIFRoZSBpbmRleCBpbnRvIHRoaXMgY2FuIGJlIGNhc3QgdG8gYFJlZ2lzdHJhckluZGV4YCB0byBnZXQgYSB2YWxpZCB2YWx1ZS4ALEF1dGhvcml0eU9mAAEEBSUKKQoEAAT0IEEgbWFwIG9mIHRoZSBhY2NvdW50cyB3aG8gYXJlIGF1dGhvcml6ZWQgdG8gZ3JhbnQgdXNlcm5hbWVzLgA4VXNlcm5hbWVJbmZvT2YAAQQCQQQtCgQAGHUBIFJldmVyc2UgbG9va3VwIGZyb20gYHVzZXJuYW1lYCB0byB0aGUgYEFjY291bnRJZGAgdGhhdCBoYXMgcmVnaXN0ZXJlZCBpdCBhbmQgdGhlIHByb3ZpZGVyIG9mbQEgdGhlIHVzZXJuYW1lLiBUaGUgYG93bmVyYCB2YWx1ZSBzaG91bGQgYmUgYSBrZXkgaW4gdGhlIGBVc2VybmFtZU9mYCBtYXAsIGJ1dCBpdCBtYXkgbm90IGlm8CB0aGUgdXNlciBoYXMgY2xlYXJlZCB0aGVpciB1c2VybmFtZSBvciBpdCBoYXMgYmVlbiByZW1vdmVkLgBpASBNdWx0aXBsZSB1c2VybmFtZXMgbWF5IG1hcCB0byB0aGUgc2FtZSBgQWNjb3VudElkYCwgYnV0IGBVc2VybmFtZU9mYCB3aWxsIG9ubHkgbWFwIHRvIG9uZUggcHJpbWFyeSB1c2VybmFtZS4AQFBlbmRpbmdVc2VybmFtZXMAAQQCQQQ1CgQAIG0BIFVzZXJuYW1lcyB0aGF0IGFuIGF1dGhvcml0eSBoYXMgZ3JhbnRlZCwgYnV0IHRoYXQgdGhlIGFjY291bnQgY29udHJvbGxlciBoYXMgbm90IGNvbmZpcm1lZEwgdGhhdCB0aGV5IHdhbnQgaXQuACUBIFVzZWQgcHJpbWFyaWx5IGluIGNhc2VzIHdoZXJlIHRoZSBgQWNjb3VudElkYCBjYW5ub3QgcHJvdmlkZSBhIHNpZ25hdHVyZV0BIGJlY2F1c2UgdGhleSBhcmUgYSBwdXJlIHByb3h5LCBtdWx0aXNpZywgZXRjLiBJbiBvcmRlciB0byBjb25maXJtIGl0LCB0aGV5IHNob3VsZCBjYWxssCBbYWNjZXB0X3VzZXJuYW1lXShgQ2FsbDo6YWNjZXB0X3VzZXJuYW1lYCkuAB0BIEZpcnN0IHR1cGxlIGl0ZW0gaXMgdGhlIGFjY291bnQgYW5kIHNlY29uZCBpcyB0aGUgYWNjZXB0YW5jZSBkZWFkbGluZS4ASFVuYmluZGluZ1VzZXJuYW1lcwABBAJBBDgEABBdASBVc2VybmFtZXMgZm9yIHdoaWNoIHRoZSBhdXRob3JpdHkgdGhhdCBncmFudGVkIHRoZW0gaGFzIHN0YXJ0ZWQgdGhlIHJlbW92YWwgcHJvY2VzcyBieXEBIHVuYmluZGluZyB0aGVtLiBFYWNoIHVuYmluZGluZyB1c2VybmFtZSBtYXBzIHRvIGl0cyBncmFjZSBwZXJpb2QgZXhwaXJ5LCB3aGljaCBpcyB0aGUgZmlyc3TcIGJsb2NrIGluIHdoaWNoIHRoZSB1c2VybmFtZSBjb3VsZCBiZSBkZWxldGVkIHRocm91Z2ggYcQgW3JlbW92ZV91c2VybmFtZV0oYENhbGw6OnJlbW92ZV91c2VybmFtZWApIGNhbGwuAEBQZXJzb25JZGVudGl0aWVzAAEEAgg5CgQACGUBIFRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwZXJzb24gdGhyb3VnaCB0aGVpciBjb250ZXh0dWFsIGFsaWFzIGZvciB0aGUgcHVycG9zZXMgb2aIIHJlZ2lzdGVyaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLgA4QWNjb3VudFRvQWxpYXMAAQQCBAgEAAhlASBSZXZlcnNlIGxvb2t1cCBvZiBhY2NvdW50cyBjb250cm9sbGVkIGJ5IGEgcGVyc29uIHRocm91Z2ggYSBjb250ZXh0dWFsIGFsaWFzLiBBbGwgcGVvcGxlLQEgdGhhdCByZWdpc3RlcmVkIGFuIGlkZW50aXR5IG11c3QgYWxzbyBhc3NvY2lhdGUgYW4gb24tY2hhaW4gYWNjb3VudCB0byBpdC4AWFBlbmRpbmdVc2VybmFtZVJlcG9ydHMAAQQCCEkKBAAElCBTdG9yZXMgcGVuZGluZyByZXBvcnRzIG9mIHVzZXJuYW1lcy4AAaUDAAEJBwBAMEJhc2ljRGVwb3NpdMRAANVfuQIAAAAAAAAAAAAAAATYIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuACxCeXRlRGVwb3NpdMRAAOH1BQAAAAAAAAAAAAAAAAQdASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBwZXIgZW5jb2RlZCBieXRlIGZvciBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuADxVc2VybmFtZURlcG9zaXTEQAAgvL4AAAAAAAAAAAAAAAAIVQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIHJlZ2lzdGVyZWQgdXNlcm5hbWUuIFRoaXMgdmFsdWUgc2hvdWxkIGNoYW5nZSBvbmx5IGlu9CBydW50aW1lIHVwZ3JhZGVzIHdpdGggcHJvcGVyIG1pZ3JhdGlvbiBvZiBleGlzdGluZyBkZXBvc2l0cy4ARFN1YkFjY291bnREZXBvc2l0xEAAefOPAwAAAAAAAAAAAAAADGUBIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBhIHJlZ2lzdGVyZWQgc3ViYWNjb3VudC4gVGhpcyBzaG91bGQgYWNjb3VudCBmb3IgdGhlIGZhY3RlASB0aGF0IG9uZSBzdG9yYWdlIGl0ZW0ncyB2YWx1ZSB3aWxsIGluY3JlYXNlIGJ5IHRoZSBzaXplIG9mIGFuIGFjY291bnQgSUQsIGFuZCB0aGVyZSB3aWxsNQEgYmUgYW5vdGhlciB0cmllIGl0ZW0gd2hvc2UgdmFsdWUgaXMgdGhlIHNpemUgb2YgYW4gYWNjb3VudCBJRCBwbHVzIDMyIGJ5dGVzLgBUVXNlcm5hbWVSZXBvcnREZXBvc2l0xEAAKGvuAAAAAAAAAAAAAAAABMggVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIHJlcG9ydGVkIHVzZXJuYW1lLgA4TWF4U3ViQWNjb3VudHM4EGQAAAAEDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Yi1hY2NvdW50cyBhbGxvd2VkIHBlciBpZGVudGlmaWVkIGFjY291bnQuAFRVc2VybmFtZVJlcG9ydFRpbWVvdXQ4EIDGEwAMSQEgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBoYXZlIHRvIHBhc3MgYmV0d2VlbiB0aGUgbGFzdCB0aW1lIGEgZ2l2ZW4gdXNlcm5hbWUgd2FzXQEgcmVwb3J0ZWQgYW5kIG5vdyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlcG9ydCBpdCBhZ2Fpbi4gSW4gb3RoZXIgd29yZHMsIGl0IHJlcHJlc2VudHOUIHRoZSB1c2VybmFtZSB2YWxpZGl0eSBzYWZldHkgcGVyaW9kLgA0TWF4UmVnaXN0cmFyczgQFAAAAAhNASBNYXhpbXVtIG51bWJlciBvZiByZWdpc3RyYXJzIGFsbG93ZWQgaW4gdGhlIHN5c3RlbS4gTmVlZGVkIHRvIGJvdW5kIHRoZSBjb21wbGV4aXR5fCBvZiwgZS5nLiwgdXBkYXRpbmcganVkZ2VtZW50cy4ANE1heEp1ZGdlbWVudHM4EAMAAAAEKQEgTWF4aW11bSBudW1iZXIgb2YganVkZ2VtZW50cyBwZXIgcGVyc29uYWwgaWRlbnRpdHkgYWxsb3dlZCBpbiB0aGUgc3lzdGVtLgBkUGVuZGluZ1VzZXJuYW1lRXhwaXJhdGlvbjgQQJ0EAAQVASBUaGUgbnVtYmVyIG9mIGJsb2NrcyB3aXRoaW4gd2hpY2ggYSB1c2VybmFtZSBncmFudCBtdXN0IGJlIGFjY2VwdGVkLgBMVXNlcm5hbWVHcmFjZVBlcmlvZDgQQPoBAAhZASBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IG11c3QgcGFzcyB0byBlbmFibGUgdGhlIHBlcm1hbmVudCBkZWxldGlvbiBvZiBhIHVzZXJuYW1lIGJ5aCBpdHMgcmVzcGVjdGl2ZSBhdXRob3JpdHkuADxNYXhTdWZmaXhMZW5ndGg4EAcAAAAEgCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBzdWZmaXguAERNYXhVc2VybmFtZUxlbmd0aDgQIAAAAARhASBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSB1c2VybmFtZSwgaW5jbHVkaW5nIGl0cyBzdWZmaXggYW5kIGFueSBzeXN0ZW0tYWRkZWQgZGVsaW1pdGVycy4ARE1pblVzZXJuYW1lTGVuZ3RoOBACAAAABLAgVGhlIG1pbmltdW0gbGVuZ3RoIG9mIGEgdXNlcm5hbWUgb3Igc3VmZml4LgBgQ3JlZGVudGlhbFJlbW92YWxQZW5hbHR5xEAA8gUqAQAAAAAAAAAAAAAACFUBIFRoZSBmZWUgdGhhdCBhIHBlcnNvbiBtdXN0IHBheSB0aHJvdWdoIHRoZWlyIGFzc29jaWF0ZWQgb24tY2hhaW4gYWNjb3VudCBpbiBvcmRlciB0b1wgcmVtb3ZlIHRoZWlyIGlkZW50aXR5LgBAaWRlbnRpdHlfY29udGV4dAiAcG9wOnBvbGthZG90Lm5ldHdvcmsvaWRlbnRpdHkgICAIQQEgVGhlIGNvbnRleHQgdXNlZCBmb3IgdGhlIHByb29mcyByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUgYXMgYSBwZXJzb25hbCBhbGlhcyBpbiggaWRlbnRpdHkuAAFNCgAERE9mZmNoYWluU2lnbmF0dXJlNQQM4CBTaWduYXR1cmUgdHlwZSBmb3IgcHJlLWF1dGhvcml6aW5nIHVzZXJuYW1lcyBvZmYtY2hhaW4uABEBIENhbiB2ZXJpZnkgd2hldGhlciBhbiBgU2VsZjo6U2lnbmluZ1B1YmxpY0tleWAgY3JlYXRlZCBhIHNpZ25hdHVyZS4AMgAAGFBlb3BsZQEYUGVvcGxlJBBLZXlzAAEEAggoBAAUSQEgVGhlIGN1cnJlbnQgaW5kaXZpZHVhbHMgd2UgcmVjb2duaXNlLCBidXQgbm90IG5lY2Vzc2FyaWx5IHlldCBpbmNsdWRlZCBpbiBhIHJpbmcuAHUBIExvb2stdXAgZnJvbSB0aGUgY3J5cHRvIChwdWJsaWMpIGtleSB0byB0aGUgaW1tdXRhYmxlIElEIG9mIHRoZSBpbmRpdmlkdWFsIChgUGVyc29uYWxJZGApLiBBXQEgcGVyc29uIGNhbiBoYXZlIHR3byBkaWZmZXJlbnQgZW50cmllcyBpbiB0aGlzIG1hcCBpZiB0aGV5IHF1ZXVlZCBhIGtleSBtaWdyYXRpb24gd2hpY2hkIGhhc24ndCBiZWVuIGVuYWN0ZWQgeWV0LgA4Q291bnRlckZvcktleXMBADgQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcAAYUGVvcGxlAAEEAihRCgQADEkBIFRoZSBjdXJyZW50IGluZGl2aWR1YWxzIHdlIHJlY29nbmlzZSwgYnV0IG5vdCBuZWNlc3NhcmlseSB5ZXQgaW5jbHVkZWQgaW4gYSByaW5nLgBlASBJbW11dGFibGUgSUQgb2YgdGhlIGluZGl2aWR1YWwgKGBQZXJzb25hbElkYCkgdG8gaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIga2V5IGFuZCBzdGF0dXMuADhBbGlhc1RvQWNjb3VudAABBAJJAwQEAATMIENvbnZlcnNpb24gb2YgYSBjb250ZXh0dWFsIGFsaWFzIHRvIGFuIGFjY291bnQgSUQuADhBY2NvdW50VG9BbGlhcwABBAIERQMEAATMIENvbnZlcnNpb24gb2YgYW4gYWNjb3VudCBJRCB0byBhIGNvbnRleHR1YWwgYWxpYXMuAExBY2NvdW50VG9QZXJzb25hbElkAAEEAgQoBAAQvCBBc3NvY2lhdGlvbiBvZiBhbiBhY2NvdW50IElEIHRvIGEgcGVyc29uYWwgSUQuACEBIE1hbmFnZWQgd2l0aCBgc2V0X3BlcnNvbmFsX2lkX2FjY291bnRgIGFuZCBgdW5zZXRfcGVyc29uYWxfaWRfYWNjb3VudGAu+CBSZXZlcnNlIGxvb2t1cCBpcyBpbnNpZGUgYFBlb3BsZWAgc3RvcmFnZSwgaW5zaWRlIHRoZSByZWNvcmQuADhOZXh0UGVyc29uYWxJZAEAKCAAAAAAAAAAAAS4IFRoZSBuZXh0IGZyZWUgYW5kIG5ldmVyIHJlc2VydmVkIHBlcnNvbmFsIElELgBcUGVvcGxlQ29sbGVjdGlvbkNyZWF0ZWQBAMgEAATAIFdoZXRoZXIgdGhlIHBlb3BsZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGNyZWF0ZWQuAEhSZXNlcnZlZFBlcnNvbmFsSWQAAQQFKBAEAATAIENhbmRpZGF0ZXMnIHJlc2VydmVkIGlkZW50aXRpZXMgd2hpY2ggd2UgdHJhY2suAAFRBAABDQcAEDBSaW5nRXhwb25lbnT9BAQJBE0BIFRoZSByaW5nIGV4cG9uZW50IHVzZWQgdG8gb3BlcmF0ZSB0aGUgcGVvcGxlIG1lbWJlciBjb2xsZWN0aW9uIGluIGBNZW1iZXJTZXJ2aWNlYC4AXE9uYm9hcmRpbmdRdWV1ZVBhZ2VTaXplOBAeAAAACEkBIE1heGltdW0gbnVtYmVyIG9mIHBlb3BsZSBpbmNsdWRlZCBpbiBhbiBvbmJvYXJkaW5nIHF1ZXVlIHBhZ2UgYmVmb3JlIGEgbmV3IG9uZSBpcyQgY3JlYXRlZC4AZFN0YWxlQWxpYXNDbGVhbnVwSW50ZXJ2YWw4EJYAAAAEMQEgSW50ZXJ2YWwgKGluIGJsb2NrcykgYXQgd2hpY2ggdGhlIG9mZmNoYWluIHdvcmtlciBydW5zIHN0YWxlIGFsaWFzIGNsZWFudXAuAHBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlOBBYAgAAFD0BIFRoZSBhbW91bnQgb2YgYmxvY2sgbnVtYmVyIHRvbGVyYW5jZSB3ZSBhbGxvdyBmb3IgYSBzZXR1cCBhY2NvdW50IHRyYW5zYWN0aW9uLgAFASBgc2V0X2FsaWFzX2FjY291bnRgIGFuZCBgc2V0X3BlcnNvbmFsX2lkX2FjY291bnRgIGNhbGxzIGNvbnRhaW5zUQEgYGNhbGxfdmFsaWRfYXRgIGFzIGEgcGFyYW1ldGVyLCB0aG9zZSBjYWxscyBhcmUgdmFsaWQgaWYgdGhlIGJsb2NrIG51bWJlciBpcyB3aXRoaW5YIHRoZSB0b2xlcmFuY2UgcGVyaW9kLgABVQoAAAAzAAAcTW9iUnVsZQEcTW9iUnVsZTAcQ3JlZGl0cwEBBAIIWQpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASMIFRoZSB2b3RpbmcgcmVjb3JkcyBvZiBhbGwgYWxpYXNlcy4APFZvdGluZ1BlbmFsdGllcwABBAIIOAQACHEBIFRoZSB2b3RlIHBlbmFsdGllcyBvZiB1c2VycyBhbmQgdGhlaXIgc3RhcnRpbmcgbW9tZW50LiBWb3RlcnMgd2l0aCBwZW5hbHRpZXMgY2Fubm90IHZvdGUgaW7MIGNvbnRlbXB0IHVudGlsIHRoZSBwZW5hbHR5IGV4cGlyZXMgYW5kIGlzIHJlbW92ZWQuADBWb3RpbmdQb2ludHMBAQgGAl0KOBAAAAAACGUBIFRoZSBhY2N1bXVsYXRlZCBwb2ludHMgb2YgYWxsIGFsaWFzZXMsIGR1cmluZyBlYWNoIGZ1bmRpbmcgcm91bmQuIFRoZSBwb2ludHMgYWNjdW11bGF0ZWQhASBkdXJpbmcgcm91bmQgYE5gIGNhbiBiZSByZWRlZW1lZCBmb3IgcmV3YXJkcyBvbmx5IGR1cmluZyByb3VuZCBgTiArIDFgLgAUVm90ZXMAAQgCAl0KSQQEAAS4IEFsbCB2b3RlcyBjYXN0LCBzZWdyZWdhdGVkIGJ5IGNhc2UgYW5kIHZvdGVyLgAkQ2FzZUNvdW50AQA4EAAAAAAEEQEgVGhlIG51bWJlciBvZiBjYXNlcywgb3BlbiBvciByZWNlbnRseSBjbG9zZWQsIHN0b3JlZCBpbiB0aGUgcGFsbGV0LgAkT3BlbkNhc2VzAAEEAjhhCgQABCkBIFRoZSBvcGVuIGNhc2VzIHJlY29yZGVkIGluIHRoZSBwYWxsZXQuIFRoZXNlIGNhc2VzIGNhbiBzdGlsbCBiZSB2b3RlZCBvbi4AJFJpcGVDYXNlcwABBAI4eQoEAAx1ASBUaGUgcmlwZSBjYXNlcyByZWNvcmRlZCBpbiB0aGUgcGFsbGV0LiBUaGUgdm90aW5nIGhhcyBjb25jbHVkZWQgb24gdGhlc2UgY2FzZXMgYW5kIGEgdmVyZGljdGUBIGhhcyBiZWVuIHJlYWNoZWQsIGJ1dCB0aGV5IGNhbm5vdCBiZSByZW1vdmVkIHlldCBpbiBvcmRlciB0byBhbGxvdyBwZW9wbGUgdG8gY2xhaW0gdGhlaXIcIHZvdGVzLgAkRG9uZUNhc2VzAAEEAjh9CgQACGEBIFRoZSBkb25lIGNhc2VzIHJlY29yZGVkIGluIHRoZSBwYWxsZXQuIFRoZXNlIGNhc2VzIGFyZSBvYnNvbGV0ZSBhbmQgY2FuIGJlIHJlbW92ZWQgZnJvbSQgc3RvcmFnZS4AREFjY3VtdWxhdGVkUG9pbnRzAQAoIAAAAAAAAAAACHUBIFRoZSBudW1iZXIgb2YgcG9pbnRzIGFjY3VtdWxhdGVkIHRocm91Z2ggY29ycmVjdCB2b3RlcyBkdXJpbmcgdGhlIGN1cnJlbnQgcGF5b3V0IHJvdW5kLiBUaGlzdQEgYW1vdW50IGlzIGdvaW5nIHRvIGRldGVybWluZSB0aGUgcG9pbnQvcmV3YXJkIGV4Y2hhbmdlIHJhdGUgb2YgdGhlIG5leHQgcmV3YXJkIHBheW91dCByb3VuZC4ASFBheW91dERpc3RyaWJ1dGlvbgAAgQoEAATYIERlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBwYXlvdXQgcm91bmQuADhSb3VuZFNjaGVkdWxlcwEAhQoEAAS4IERlc2NyaWJlcyB0aGUgc2NoZWR1bGVzIG9mIHRoZSBwYXlvdXQgcm91bmRzLgAsQWN0aXZlU2luY2UAACgEAAhtASBUaGUgdGltZXN0YW1wLCBpbiBzZWNvbmRzLCBvZiB0aGUgbW9tZW50IGVub3VnaCBhY3RpdmUgdm90ZXJzIHdlcmUgZGV0ZWN0ZWQgYW5kIHZvdGluZyB3YXMxASBlbmFibGVkLiBUaGlzIHZhbHVlIHdpbGwgbm90IGJlIHByZXNlbnQgaWYgdGhlcmUgYXJlIHRvbyBmZXcgYWN0aXZlIHZvdGVycy4AAWEEAAERBwA4UEN1cnJlbmN5TG9jYXRpb25JbmZv4DABAwChDwQyBXbI6wsE9CBUaGUgbG9jYXRpb24gb2YgdGhlIHVzZWQgY3VycmVuY3kuIEl0IGlzIGluZm9ybWF0aW9uYWwgb25seS4AUE1heFZvdGVDbGFpbUR1cmF0aW9uKCCAUQEAAAAAAAQFASBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIGEgY2FzZSB0aW1lcyBvdXQgYW5kIGNhbiBiZSByZWFwZWQuADxNaW5DYXNlRHVyYXRpb244EFgCAAAEQQEgVGhlIG51bWJlciBvZiBzZWNvbmRzIGEgY2FzZSBtdXN0IHN0YXkgb3BlbiBmb3Igdm90aW5nIGJlZm9yZSBpdCBjYW4gYmUgY2xvc2VkLgBETWF4Vm90aW5nRHVyYXRpb244ELAEAAAELQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgZm9yIHdoaWNoIGEgY2FzZSBjb3VsZCBzdGF5IG9wZW4gZm9yIHZvdGluZy4ARE1pblR1cm5vdXROb21pbmFsOBABAAAABEUBIFRoZSBtaW5pbXVtIG51bWJlciBvZiB2b3RlcyBhIGNhc2UgbXVzdCByZWNlaXZlIGJlZm9yZSBhIHZlcmRpY3QgY2FuIGJlIHJlYWNoZWQuAFBNaW5UdXJub3V0UGVyY2VudGFnZZEKBAoIZQEgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVzIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgdm90ZXIgY291bnQgYSBjYXNlIG11c3QgcmVjZWl2ZYQgYmVmb3JlIGEgdmVyZGljdCBjYW4gYmUgcmVhY2hlZC4AVFZvdGluZ1BlbmFsdHlEdXJhdGlvbjgQwKgAAATQIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgYSBwZW5hbHR5IGlzIGFwcGxpZWQgZm9yLgBETWF4Vm90ZXNDbGFpbWFibGU4EAoAAAAE9CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgY2xhaW1hYmxlIGluIGEgc2luZ2xlIGV4dHJpbnNpYy4AUE9mZmNoYWluV29ya0ludGVydmFsOBCWAAAABLAgVGhlIGludGVydmFsIGF0IHdoaWNoIG9mZmNoYWluIHdvcmtlciBydW5zLgBMQ2xlYW5Wb3Rlc0JhdGNoU2l6ZTgQ6AMAAAQlASBNYXhpbXVtIG51bWJlciBvZiB2b3RlcyB0aGF0IHdpbGwgYmUgY2xlYW5lZCBkdXJpbmcgb2ZmY2hhaW4gd29ya2VyIHJ1bi4AaFZvdGVzT3BlbkZvckNsYWltc0R1cmF0aW9uOBBYAgAACBUBIFRoZSB0aW1lIGluIHNlY29uZHMgZHVyaW5nIHdoaWNoIHZvdGVzIGNhbiBiZSBjbGFpbWVkIG9uIGRvbmUgY2FzZXMuwCBNZWFzdXJlZCBmcm9tIHRoZSB0aW1lIHRoZSBjYXNlIGJlY29tZXMgJ0RvbmUnLgBUTWluaW11bVZvdGVyVGhyZXNob2xkOBADAAAACGUBIFRoZSBtaW5pbXVtIG51bWJlciBvZiBhY3RpdmUgdm90ZXJzIHJlcXVpcmVkIHRvIGFsbG93IHZvdGluZy4gV2hlbiB0aGlzIHRocmVzaG9sZCBpcyBub3SEIG1ldCwgb3BlbiBjYXNlcyBjYW5ub3QgdGltZSBvdXQuADxtb2JfcnVsZV9wb3RfaWQEgG1vZGxNb2JSd3JkcwAAAAAAAAAAAAAAAAAAAAAAAAAABOAgR2V0IGEgdW5pcXVlLCBpbmFjY2Vzc2libGUgYWNjb3VudCBJRCBmcm9tIHRoZSBgUG90SWRgLgBAbW9iX3J1bGVfY29udGV4dAiAcG9wOnBvbGthZG90Lm5ldHdvcmsvbW9iLXJ1bGUgICAIUQEgVGhlIGNvbnRleHQgdXNlZCBmb3IgdGhlIHByb29mcyByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUgYXMgYSBwZXJzb25hbCBhbGlhcyBpbiBtb2IYIHJ1bGUuAAGVCgAAADQAAChQcm9vZk9mSW5rAShQcm9vZk9mSW5rLChDYW5kaWRhdGVzAAEEAgSZCgQABEkBIFRoZSBjdXJyZW50IHBlcnNvbmFsIGlkZW50aXRpZXMgd2hpY2ggYXJlIGdvaW5nIHRocm91Z2ggdGhlIHByb29mLW9mLWluayBwcm9jZXNzLgAYUGVvcGxlAAEEBSipCgQACHEBIFRoZSBwZXJzb25hbCBpZGVudGl0aWVzIHdoaWNoIHdlIHRyYWNrOyBhbGwgd2hpY2ggaGF2ZSBiZWVuIHJlY29nbml6ZWQgdGhyb3VnaCBwcm9vZi1vZi1pbms0IGFyZSBpbiBoZXJlLgA8UmVmZXJyYWxUaWNrZXRzAAEEBSi1CgQABAkBIFRoZSB0aWNrZXRzIHN0b3JlZCBvbi1jaGFpbiByZWFkeSB0byBiZSB1c2VkIHRvIHJlZmVyIGNhbmRpZGF0ZXMuADhEZXNpZ25GYW1pbGllcwABBAItA8EKBAAEqCBUaGUgY3VycmVudCBkZXNpZ24gZmFtaWxpZXMgd2UgcmVjb2duaXNlLgBAQ29tbWl0dGVkRGVzaWducwABCAICxQrJCgQABNQgVGhlIGNvbW1pdHRlZCBkZXNpZ25zIHdoaWNoIGFyZSBubyBsb25nZXIgYXZhaWxhYmxlLgA8QWxsb2NhdGlvbkNvdW50AQA4EAAAAAAEsCBUaGUgbnVtYmVyIG9mIGp1ZGdlbWVudHMgY3VycmVudGx5IG9uZ29pbmcuADRDb25maWd1cmF0aW9uAQB5BKBAnQQABAAAAOgDAAAAAAAEAAAAACAAAAAAACAAAAAAAAgAAABAnQQABEwgVGhlIGNvbmZpZ3VyYXRpb24uAEBBdmFpbGFibGVJbnZpdGVzAQEEAgQ4EAAAAAAE+CBOdW1iZXIgb2YgaW52aXRhdGlvbnMgYXZhaWxhYmxlIHRvIGRpc3RyaWJ1dGUgZm9yIGFuIGFjY291bnQuADhQZW5kaW5nSW52aXRlcwABCAICzQoQBAAMHQEgUGVuZGluZyBpbnZpdGF0aW9ucyBmb3IgZWFjaCBpbnZpdGVyIChhbiBhY2NvdW50IHRoYXQgaW52aXRlcyBvdGhlcnMpLgBZASBJZiB0aGUga2V5IGAoaW52aXRlciwgdGlja2V0KWAgZXhpc3RzLCB0aGVuIHRoZSB0aWNrZXQgaXMgY3VycmVudGx5IGEgcGVuZGluZyBpbnZpdGUuAGxSZWZlcnJlclJlaW1idXJzZW1lbnRWYWx1ZXMAAH0EBAAUYQEgVGhlIHZhbHVlcyBvZiB0aGUgcmVpbWJ1cnNlbWVudCBhd2FyZGVkIHRvIHJlZmVycmVycywgYWxvbmcgd2l0aCBob3cgbWFueSBvZiBlYWNoIHZhbHVlbQEgc2hvdWxkIGJlIGF3YXJkZWQuIFRoZXNlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIgb2YgdGhlaXIgcHJpb3JpdHksIHNvIHRoZSBsYXN0QQEgdmFsdWUgaW4gdGhlIGxpc3Qgd2lsbCBiZSB0aGUgZmlyc3Qgb25lIHRvIGJlIHVzZWQgYnkgdGhlIHJlaW1idXJzZW1lbnQgc3lzdGVtLgBFASBTdG9yYWdlIGl0ZW0gbmFtZSBrZWVwcyB0aGUgbGVnYWN5IHByZWZpeCBmb3Igc3RvcmFnZSByZWFkYWJpbGl0eSBjb21wYXRpYmlsaXR5LgBsUmVmZXJyZWRSZWltYnVyc2VtZW50VmFsdWVzAAB9BAQAFGEBIFRoZSB2YWx1ZXMgb2YgdGhlIHJlaW1idXJzZW1lbnQgYXdhcmRlZCB0byByZWZlcnJlZCBwZW9wbGUsIGFsb25nIHdpdGggaG93IG1hbnkgb2YgZWFjaHEBIHZhbHVlIHNob3VsZCBiZSBhd2FyZGVkLiBUaGVzZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyIG9mIHRoZWlyIHByaW9yaXR5LCBzbyB0aGVVASBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IG9uZSB0byBiZSB1c2VkIGJ5IHRoZSByZWltYnVyc2VtZW50IHN5c3RlbS4ARQEgU3RvcmFnZSBpdGVtIG5hbWUga2VlcHMgdGhlIGxlZ2FjeSBwcmVmaXggZm9yIHN0b3JhZ2UgcmVhZGFiaWxpdHkgY29tcGF0aWJpbGl0eS4AAWkEAAEVBwAMSE1heEFjdGl2ZVJlZmVycmFsczgQCgAAAAj0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgcmVmZXJyYWxzIGEgdXNlciBjYW4gaGF2ZSBvcGVuLlggSXQgY2Fubm90IGV4Y2VlZCAyMDAuABRQb3RJZNUIIFBvSVBvdF9fIOwgQWNjb3VudCBJZGVudGlmaWVyIGZyb20gd2hpY2ggdGhlIHJld2FyZCBwb3QgaXMgZ2VuZXJhdGVkLgApASBUaGUgYWNjb3VudCBtdXN0IGJlIGZ1bmRlZCBzbyByZXdhcmRzIGNhbiBiZSBwYWlkIGR1cmluZyByZWdpc3RyYXRpb24gYW5kYCByZWZlcnJhbCByZXdhcmQgY2xhaW1zLgARASBUaGUgYFBhbGxldElkYCBtdXN0IGJlIGEgY29uc3RhbnQgYXMgaXQgaXMgZXhwb3NlZCBpbiB0aGUgbWV0YWRhdGEuZQEgQ2hhbmdpbmcgdGhpcyB2YWx1ZSB3aXRoIGEgcnVudGltZSB1cGdyYWRlIGNhbiBiZSBkb25lIGF0IGFueSB0aW1lLCB0aGUgbmV3IGFjY291bnQgd2lsbJAgdGhlbiBuZWVkIHRvIGJlIGZ1bmRlZCBhY2NvcmRpbmdseS4ATHByb29mX29mX2lua19wb3RfaWQEgG1vZGxQb0lQb3RfXwAAAAAAAAAAAAAAAAAAAAAAAAAABNQgVGhlIGFjY291bnQgSUQgb2YgdGhlIHBvdCB1c2VkIGZvciByZXdhcmQgdHJhbnNmZXJzLgAB0QoACDxUaWNrZXRTaWduYXR1cmU1BAyIIFNpZ25hdHVyZSB1c2VkIHRvIHZlcmlmeSB0aWNrZXRzLgABASBDYW4gdmVyaWZ5IHdoZXRoZXIgYW4gYFNlbGY6OlRpY2tldFB1YmxpY2AgY3JlYXRlZCBhIHNpZ25hdHVyZS4YVGlja2V0BASYIFRpY2tldCB0eXBlIHVzZWQgdG8gcmVmZXIgY2FuZGlkYXRlcy4ANQAAEEdhbWUBEEdhbWVcbFRlc3RuZXRTdG9yZWRQaGFzZUR1cmF0aW9ucwAAqQQEAAS8IFRoZSBvdmVycmlkZW4gcGhhc2UgZHVyYXRpb25zIGZvciB0aGUgdGVzdG5ldC4AEE5mdHMAAQgCAtUKOAQAJCkBIEFsbCBtaW50ZWQgTkZUcywga2V5ZWQgYnkgb3duZXIgYW5kIE5GVCBoYXNoLiBUaGUgdmFsdWUgaXMgYSBVbml4LXNlY29uZHM1ASB0aW1lc3RhbXAgc2V0IHdoZW5ldmVyIHRoZSBlbnRyeSBpcyB3cml0dGVuOiBieSB0aGUgYHJlcG9ydGAgZXh0cmluc2ljIGZvciBhNQEgZnJlc2ggYFBlcnNvbmAgdm90ZSwgYnkgYG1pbnRfYXR0ZW5kYW5jZV9uZnRzYCB3aGVuIGFuIGF0dGVuZGVlJ3MgYXR0ZW5kYW5jZTEBIGlzIGZpbmFsaXNlZCwgb3IgYnkgYHByb21vdGVfbmZ0X2NhbmRpZGF0ZXNgIHdoZW4gYSBoZWxkIGBOb3RQZXJzb25gIE5GVCBpczUBIHJlc29sdmVkLiBCYWNrZmlsbCB3cml0ZXMgb3ZlcndyaXRlIGFuIGVhcmxpZXIgdGltZXN0YW1wIG9uIHRoZSBzYW1lIGtleSDigJQxASB0aGUgdmFsdWUgaXMgdGhlcmVmb3JlIHRoZSAqbW9zdCByZWNlbnQqIG1pbnQgdGltZSwgbm90IHRoZSBmaXJzdC4gV2l0aGluIGE5ASBzaW5nbGUgZ2FtZSB0aGVzZSB0aW1lc3RhbXBzIGFyZSBib3VuZGVkIHRvZ2V0aGVyICh0eXBpY2FsbHkgdGhlIHNhbWUgYmxvY2spLDUBIHNvIGNsaWVudHMgY2FuIHVzZSB0aGVtIGFzIGEgcGVyLWdhbWUgdmVyc2lvbiBtYXJrZXIgKGUuZy4gbWFwcGluZyBvbGQgbWludHPUIHRvIG9uZSBpbWFnZSBjb2xsZWN0aW9uIGFuZCBuZXdlciBtaW50cyB0byBhbm90aGVyKS4ANE5mdENhbmRpZGF0ZXMAAQgCAtUKEAQAJCkBIENhbmRpZGF0ZSBORlRzIHN0YWdlZCBmcm9tIGBOb3RQZXJzb25gIHJlcG9ydHMsIGhlbGQgdW50aWwgdGhlIGF0dGVzdGVlJ3NcIGF0dGVuZGFuY2UgaXMgZGVjaWRlZC4AOQEgRHVyaW5nIHRoZSByZXBvcnRpbmcgcGhhc2UgYSBgTm90UGVyc29uYCB2b3RlIHN0YWdlcyB0aGUgTkZUIGhlcmUgcmF0aGVyIHRoYW49ASBtaW50aW5nIGRpcmVjdGx5IGludG8gW2BOZnRzYF06IHRoZSBhdHRlc3RlZSBvbmx5IGVhcm5zIHRoZSBORlQgaWYgdGhleSBlbmQgdXAhASBjbGFzc2VkIGFzIGhhdmluZyBhdHRlbmRlZC4gVGhlIGZpcnN0IGtleSBpcyB0aGUgcHJvc3BlY3RpdmUgb3duZXIgKHRoZSEBIGF0dGVzdGVlKSwgdGhlIHNlY29uZCBpcyB0aGUgTkZUIGhhc2ggKHNhbWUgZGVyaXZhdGlvbiBhcyBpbiBbYE5mdHNgXSkuIQEgUmVzb2x2ZWQgZW50cmllcyBhcmUgZWl0aGVyIHByb21vdGVkIGludG8gW2BOZnRzYF0gb3IgZGlzY2FyZGVkIOKAlCBzZWXUIGBwcm9tb3RlX25mdF9jYW5kaWRhdGVzYCAvIGBkaXNjYXJkX25mdF9jYW5kaWRhdGVzYC4APEFyY2hpdmVkUGxheWVycwABBAIdB9kKBAAEKQEgQWxsIHRoZSBwbGF5ZXIgd2l0aCB6ZXJvIHNjb3JlIGJ1dCBzdGlsbCBvbmJvYXJkZWQgaW4gaW5kaXZfcGFsbGV0X3Njb3JlLgAcUGxheWVycwABBAIdB90KBAAQcCBBbGwgdGhlIHBsYXllciBpbiB0aGUgZ2FtZS4AIQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgYWNjb3VudHMgaW4gdGhpcyBzdG9yYWdlIGFuZCBzdGF0ZW1lbnQgYWNjb3VudHMgaW6kIFtgU3RtdEFjY291bnRUb0FsaWFzYF0gbXVzdCBub3Qgb3ZlcmxhcC4AJEdhbWVJbmRleAEAOBAAAAAABGAgVGhlIGN1cnJlbnQgZ2FtZSBpbmRleC4AEEdhbWUAAPEKBAAEzCBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXh0IGdhbWUgb3Igb25nb2luZyBnYW1lLgAsR2FtZUhpc3RvcnkAAQQFODgEAAhhASBUaGUgbWFwcGluZyBmcm9tIHBhc3QgZ2FtZXMsIGlkZW50aWZpZWQgYnkgdGhlaXIgZ2FtZSBpbmRleCwgdG8gdGhlIHN0YXJ0IHRpbWVzdGFtcCwgaW54IHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2guAFxQbGF5ZXJBdHRlbmRhbmNlSGlzdG9yeQEBBAIdBwELBAAQMQEgRW50cmllcyBvZiBwcmV2aW91c2x5IGF0dGVuZGVkIGdhbWVzIG9mIGVhY2ggcGxheWVyLiBSZXRhaW5lZCBvbiBgb2ZmYm9hcmRgKQEgYW5kIGBraWNrb3V0YCBzbyBhbiBhdHRlbmRlZCBpZGVudGl0eSBrZWVwcyBwYXNzaW5nIHRoZSBwYXJ0aWNpcGFudCBjaGVjazEBIGluIGBjbGFpbV9nYW1lX3ByaXplYCBhdCBjbGFpbSB0aW1lLiBCb3VuZGVkIGJ5IGBNYXhBdHRlbmRhbmNlSGlzdG9yeURlcHRoYDAgcGVyIHBsYXllci4AUEdhbWVQYXJ0aWNpcGFudENvdW50AQEEBTg4EAAAAAAc8CBDb3VudCBvZiBjb25maXJtZWQgYXR0ZW5kZWVzIHBlciBnYW1lIGluZGV4LiBJbmNyZW1lbnRlZCBieRkBIFtgUGFsbGV0Ojpub3RlX2F0dGVuZGFuY2VgXSBmb3IgZXZlcnkgYXR0ZW5kYW5jZSBlbnRyeSwgcmVnYXJkbGVzcyBvZvwgd2hldGhlciB0aGUgcGxheWVyIGlzIHJlY29yZGVkIGFzIGBBY2NvdW50T3JQZXJzb246OlBlcnNvbmAgb3IxASBgQWNjb3VudE9yUGVyc29uOjpBY2NvdW50YCDigJQgYm90aCBhcmUgZWxpZ2libGUgdG8gY2xhaW0gZnJvbSB0aGUgcGVyLWdhbWUNASBwcml6ZSBwb29sIHZpYSBbYFBhbGxldDo6Y2xhaW1fZ2FtZV9wcml6ZWBdLiBFeHBvc2VkIGZvciBvZmYtY2hhaW4pASBjb25zdW1lcnMgKGUuZy4gY2xpZW50cyBjb21wdXRpbmcgdGhlIGFpcmRyb3AgYHdpbm5lcl9yYXRpb2AgZm9yIHRoZSBuZXh0vCBwZXItZ2FtZSBwb29sKTsgbm90IHJlYWQgYnkgYW55IG9uLWNoYWluIGNvZGUuADRJbmRleFRvUGxheWVyAAEEBQULHQcEAATkIFRoZSBtYXBwaW5nIGZyb20gcm91bmQgaW5kZXggYW5kIHBsYXllciBpbmRleCB0byBwbGF5ZXIuADRQbGF5ZXJUb0luZGV4AAEEAh0HCQsEAATgIFRoZSBtYXBwaW5nIGZyb20gcGxheWVyIHRvIHRoZWlyIGluZGljZXMgaW4gZWFjaCByb3VuZC4ARFNodWZmbGVSZWNvZ25pemVkAAEIBQYNCx0HBAAEAQEgU3RvcmFnZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHNodWZmbGUgb3JkZXIgb2YgcmVjb2duaXplZCBwZW9wbGUuAFBTaHVmZmxlTm90UmVjb2duaXplZAABCAUGDQsdBwQABFUBIFN0b3JhZ2UgdXNlZCB0byBjb21wdXRlIHRoZSBzaHVmZmxlIG9yZGVyIG9mIG5vdCByZWNvZ25pemVkIHBlb3BsZSwgaS5lLiBjYW5kaWRhdGVzLgA0R2FtZVNjaGVkdWxlcwEAEQsEAAAAQEF2YWlsYWJsZUludml0ZXMBAQQCBDgQAAAAAAToIE51bWJlciBvZiBpbnZpdGVzIGF2YWlsYWJsZSB0byBkaXN0cmlidXRlIGZvciBhbiBhY2NvdW50LgA4UGVuZGluZ0ludml0ZXMAAQgCAs0KEAQAEIggUGVuZGluZyBpbnZpdGVzIGZvciBlYWNoIGludml0ZXIuAGkBIElmIHRoZSBrZXkgYChpbnZpdGVyLCB0aWNrZXQpYCBleGlzdHMgdGhlbiB0aGUgdGlja2V0IGlzIGN1cnJlbnRseSBhIHBlbmRpbmcgaW52aXRlLCBmcm9tNCB0aGUgaW52aXRlci4ASEFsaWFzVG9TdG10QWNjb3VudAABBAIIBAQAHFkBIE1hcHBpbmcgZnJvbSBhbGlhcyB0byB0aGUgYWNjb3VudCBpZCB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHN0YXRlbWVudCBzdG9yZS4AQQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgc2ltcGx5IHVzZSB0aGVpciBhY2NvdW50IGFuZCBhcmUgbm90IHBhcnQgb2YgdGhpcyBtYXBwaW5nLgEBIFJldmVyc2UgbWFwcGluZyBpcyBhdmFpbGFibGUgaW4gc3RvcmFnZSBbYFN0bXRBY2NvdW50VG9BbGlhc2BdLgDsIFRoaXMgaXMgcmVtb3ZlZCB3aGVuIHRoZSBhbGlhcy1iYXNlZCBwbGF5ZXIgZ2V0cyBhcmNoaXZlZC5VASBUaGlzIGlzIHVwZGF0ZWQgd2hlbiB0aGUgYWxpYXMtYmFzZWQgcGxheWVyIHNpZ25zIHVwIHdpdGggYW5vdGhlciBzdGF0ZW1lbnQgYWNjb3VudC4ASFN0bXRBY2NvdW50VG9BbGlhcwABBAIECAQAJFkBIE1hcHBpbmcgZnJvbSB0aGUgYWNjb3VudCBpZCB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggc3RhdGVtZW50IHN0b3JlIHRvIHRoZSBhbGlhcy4AQQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgc2ltcGx5IHVzZSB0aGVpciBhY2NvdW50IGFuZCBhcmUgbm90IHBhcnQgb2YgdGhpcyBtYXBwaW5nLgEBIFJldmVyc2UgbWFwcGluZyBpcyBhdmFpbGFibGUgaW4gc3RvcmFnZSBbYEFsaWFzVG9TdG10QWNjb3VudGBdLuwgVGhpcyBpcyByZW1vdmVkIHdoZW4gdGhlIGFsaWFzLWJhc2VkIHBsYXllciBnZXRzIGFyY2hpdmVkLlUBIFRoaXMgaXMgdXBkYXRlZCB3aGVuIHRoZSBhbGlhcy1iYXNlZCBwbGF5ZXIgc2lnbnMgdXAgd2l0aCBhbm90aGVyIHN0YXRlbWVudCBhY2NvdW50LgBlASBTdGF0ZW1lbnQgYWNjb3VudHMgaW4gdGhpcyBzdG9yYWdlIGFuZCBhY2NvdW50LWJhc2VkIHBsYXllciBhY2NvdW50cyBpbiBbYFBsYXllcnNgXSBtdXN0NCBub3Qgb3ZlcmxhcC4AYENvbW11bmljYXRpb25JZGVudGlmaWVycwABBAIEPQQEAAxpASBUaGUgY29tbXVuaWNhdGlvbiBpZGVudGlmaWVycyB1c2VkIGJ5IHBsYXllcnMgdG8gZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBQMlAgY29ubmVjdGlvbiBpbm0BIG9yZGVyIHRvIHBsYXkgdGhlIGdhbWUuIFRoZSBhY2NvdW50IHVuZGVyIHdoaWNoIHRoZSBjb21tdW5pY2F0aW9uIGlkZW50aWZpZXIgaXMgcmVnaXN0ZXJlZBkBIHNob3VsZCBiZSB0aGUgc2FtZSBhY2NvdW50IHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGVtZW50IHN0b3JlLgA0U2NyYXRjaFJld2FyZAAAFQsEAAwpASBTY3JhdGNoIGNhcmQgcmV3YXJkIGluZm8gZm9yIHRoZSBjdXJyZW50IG9yIG1vc3QgcmVjZW50bHkgY29uY2x1ZGVkIGdhbWUuHQEgT3ZlcndyaXR0ZW4gYnkgYGZpbmFsaXplX3NjcmF0Y2hfcmV3YXJkc2AgYXQgZ2FtZSBlbmQuIENsZWFyZWQgb24gZ2FtZTggY2FuY2VsbGF0aW9uLgBUU2NyYXRjaEVsaWdpYmlsaXR5TWFwAAEEAh0HGQsEAASsIFBlci1wbGF5ZXIgc2NyYXRjaCBjYXJkIGVsaWdpYmlsaXR5IHN0YXRlLgBMU2NyYXRjaENsYWltZWRDb3VudAEAOBAAAAAABAUBIFRvdGFsIG51bWJlciBvZiBzY3JhdGNoIGNhcmQgc3VjY2Vzc2Z1bCBjbGFpbXMgYWNyb3NzIGFsbCBnYW1lcy4AAYkEAAEZBwAkJE1heFJvdW5kczgQAwAAAAygIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3VuZHMgaW4gYSBnYW1lLgDoIE5vdGU6IHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJvdW5kcyBpcyBjb25maWd1cmVkIHBlciBnYW1lLgAwTWF4R3JvdXBTaXplOBAGAAAADKggVGhlIG1heGltdW0gbnVtYmVyIG9mIHBsYXllcnMgaW4gYSBncm91cC4AGQEgTm90ZTogdGhlIGFjdHVhbCBudW1iZXIgb2YgcGxheWVycyBpbiBhIGdyb3VwIGlzIGNvbmZpZ3VyZWQgcGVyIGdhbWUuADBNaW5Hcm91cFNpemU4EAAAAAAgqCBUaGUgbWluaW11bSBudW1iZXIgb2YgcGxheWVycyBpbiBhIGdyb3VwLgBlASBXaGVuIHNjaGVkdWxpbmcgYSBnYW1lIHRoZSB2YWx1ZSBmb3IgYG1heF9ncm91cF9zaXplYCBtdXN0IGJlIGF0IGxlYXN0IHRoaXMgbWluaW11bSArIDEuACUBIEluIG9yZGVyIHRvIGhhdmUgbm8gc2luZ2xlLXBsYXllciBncm91cHMsIHRoaXMgdmFsdWUgbXVzdCBiZSBhdCBsZWFzdCAyLgBRASBOb3RlOiB0aGUgYWN0dWFsIG1pbmltdW0gbnVtYmVyIG9mIHBsYXllcnMgaW4gYSBncm91cCBpcyBjb25maWd1cmVkIHBlciBnYW1lLCBpdCBpc1ggYG1heF9ncm91cF9zaXplIC0gMWAuAFROb25QbGF5aW5nS2lja291dFRpbWU4EIBTOwAMFQEgVGhlIHRpbWUgYWZ0ZXIgd2hpY2ggYSBwbGF5ZXIgdGhhdCBpcyBub3QgcGxheWluZyBjYW4gYmUga2lja2VkIG91dC4AvCBUaGlzIGlzIG9ubHkgZm9yIGFjY291bnQgcGxheWVycywgbm90IHBlcnNvbnMuADhQaGFzZUR1cmF0aW9uc6kEUCwBAAA8AAAAHgAAAFgCAAA8AAAABLggVGhlIGR1cmF0aW9ucyBvZiBlYWNoIGdhbWUgcGhhc2UsIGluIHNlY29uZHMuAEBNYXhHYW1lU2NoZWR1bGVzOBAMAAAABOwgVGhlIE1heGltdW0gbnVtYmVyIG9mIGdhbWUgc2NoZWR1bGVzIHRoZSBwYWxsZXQgY2FuIHN0b3JlLgBkTWF4QXR0ZW5kYW5jZUhpc3RvcnlEZXB0aDgQDAAAAAhdASBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFzdCBnYW1lcyBmb3Igd2hpY2ggcGxheWVyIGF0dGVuZGFuY2UgaXMgc3RvcmVkLiBBbnkgYXR0ZW5kYW5jZQEBIGVudHJpZXMgb2xkZXIgdGhhbiB0aGlzIHdpbGwgYmUgaW1taW5lbnRseSBwdXJnZWQgZnJvbSBzdG9yYWdlLgA8UmV3YXJkUGVyV2lubmVyxEAAQOWcMBIAAAAAAAAAAAAACAkBIEZpeGVkIHJld2FyZCBhbW91bnQgcGVyIHNjcmF0Y2ggY2FyZCB3aW5uZXIuIFRoZSBhY3R1YWwgcGF5b3V0IGlzlCBgbWluKHBvdF9iYWxhbmNlLCBSZXdhcmRQZXJXaW5uZXIpYC4AbHByb29mX29mX293bmVyc2hpcF9tc2dfYmFzZQiAcG9wOmdhbWU6c3RtdF9hY2NvdW50X2Zvcl9hbGlhczoQGQEgVGhlIGJhc2UgbWVzc2FnZSBvZiB0aGUgcHJvb2Ygb2Ygb3duZXJzaGlwIG9mIGFuIGFjY291bnQgYnkgYW4gYWxpYXMuADUBIFRoZSBmdWxsIG1lc3NhZ2UgaXMgdGhpcyBiYXNlIGNvbmNhdGVuYXRlZCB0byB0aGUgYWxpYXMgYW5kIHRoZW4gaGFzaGVkIHdpdGisIGBibGFrZTJfMjU2YCAoYmxha2UyIHdpdGggMjU2IGJpdCBvdXRwdXQpLgABHQsACDxUaWNrZXRTaWduYXR1cmU1BASIIFNpZ25hdHVyZSB1c2VkIHRvIHZlcmlmeSB0aWNrZXRzLkBBY2NvdW50U2lnbmF0dXJlNQQEYCBTaWduYXR1cmUgZm9yIGFjY291bnRzLgA3AAAUU2NvcmUBFFNjb3JlKDBQYXJ0aWNpcGFudHMAAQQCHQchCwQABHwgVGhlIHBhcnRpY2lwYW50cyBpbmZvcm1hdGlvbnMuAExQZXJzb25ob29kVGhyZXNob2xkAQA4EAAAAAAEyCBUaGUgc2NvcmUgdGhyZXNob2xkIHJlcXVpcmVkIHRvIHJlYWNoIHBlcnNvbmhvb2QuAFBBYnNlbmNlR3JhY2VTY2hlZHVsZQAAuQQEABgpASBSdW50aW1lLWNvbmZpZ3VyYWJsZSBzY2hlZHVsZSBvZiBhYnNlbmNlLWdyYWNlIHRpZXJzLCBzb3J0ZWQgYnkgYXNjZW5kaW5nDQEgcG9wdWxhdGlvbiBzaXplIHRocmVzaG9sZC4gRWFjaCB0aWVyIHNwZWNpZmllcyBob3cgbWFueSBtaXNzZXMgYXJlDQEgdG9sZXJhdGVkIHdpdGhpbiByZWNlbnQgZ2FtZXMgYmVmb3JlIGEgcGFydGljaXBhbnQncyBwZXJzb25ob29kIGlzLCBzdXNwZW5kZWQuAOwgV2hlbiBlbXB0eSBvciB1bnNldCwgYSBoYXJkY29kZWQgZGVmYXVsdCBzY2hlZHVsZSBpcyB1c2VkLgBEQWJzZW5jZUdyYWNlUmF0aW8BAEkJCAAAGBUBIFRoZSBjdXJyZW50bHkgYWN0aXZlIGFic2VuY2UtZ3JhY2UgcmF0aW8gYChhbGxvd2VkX21pc3Nlcywgd2luZG93KWAsJQEgZGVyaXZlZCBmcm9tIGBBYnNlbmNlR3JhY2VTY2hlZHVsZWAgYW5kIHRoZSBjdXJyZW50IGFjdGl2ZS1wZXJzb24gY291bnQuABEBIFVwZGF0ZWQgZWFjaCB0aW1lIGB1cGRhdGVfdGhyZXNob2xkcygpYCBydW5zIChhdCB0aGUgc3RhcnQgb2YgZXZlcnkdASBhdHRlbmRhbmNlIHJlcG9ydCBzZXNzaW9uKS4gUmVhZCBieSBgc2V0X2F0dGVuZGFuY2VgIHRvIGRlY2lkZSB3aGV0aGVyjCBhIHBhcnRpY2lwYW50IHNob3VsZCBiZSBzdXNwZW5kZWQuAEhDdXJyZW50Um91bmRQb2ludHMBADgQAAAAAAS0IFRoZSBhY2N1bXVsYXRlZCBwb2ludHMgaW4gdGhlIGN1cnJlbnQgcm91bmQuAERDdXJyZW50Um91bmRJbmRleAEAOBAAAAAAHIAgVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHJvdW5kLgBdASBUaGlzIG11c3QgYmUgdGhlIHN1bSBvZiBhbGwgcG9pbnRzIGFjY3VtdWxhdGVkIGluIGBSb3VuZHNQb2ludHNGb3JQYXJ0aWNpcGFudGAgZm9yIHRoZTwgY3VycmVudCByb3VuZC4AUQEgKipXQVJOSU5HKio6IFRoaXMgc3RvcmFnZSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBgUm91bmRzUG9pbnRzRm9yUGFydGljaXBhbnRgLCB1c2W0IGBmbiBhZGRfcG9pbnRzX3RvX3BhcnRpY2lwYW50YCB0byB1cGRhdGUgaXQuAGhSb3VuZHNQb2ludHNGb3JQYXJ0aWNpcGFudAEBCAICMQs4EAAAAAAY0CBUaGUgcG9pbnRzIGFjY3VtdWxhdGVkIGJ5IGEgcGFydGljaXBhbnQgaW4gYSByb3VuZC4AUQEgRm9yIHRoZSBjdXJyZW50IHJvdW5kLCB0aGlzIHN0b3JhZ2UgbXVzdCBiZSB1cGRhdGVkIGFsb25nc2lkZSBgQ3VycmVudFJvdW5kUG9pbnRzYC4AMQEgKipXQVJOSU5HKio6IFRoaXMgc3RvcmFnZSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBgQ3VycmVudFJvdW5kUG9pbnRzYCwgdXNltCBgZm4gYWRkX3BvaW50c190b19wYXJ0aWNpcGFudGAgdG8gdXBkYXRlIGl0LgAwUm91bmRQYXlvdXRzAAEEAjg1CwQAEKggVGhlIHJvdW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgcGF5aW5nIG91dC4AEQEgUm91bmRzIGFyZSBwYXlpbmcgb3V0IGFmdGVyIHRoZXkgaGF2ZSBmaW5pc2hlZCBhY2N1bXVsYXRpbmcgcG9pbnRzLiUBIFdoZW4gYWxsIHRoZWlyIHBvaW50cyBoYXZlIGJlZW4gcGFpZCBvdXQsIHRoZXkgYXJlIHJlbW92ZWQgZnJvbSBzdG9yYWdlLgA0Um91bmRQbGFubmluZwAAOQsEAAz8IFRoZSBwbGFubmluZyBvZiB0aGUgY3VycmVudCByb3VuZCB0aGF0IGlzIGFjY3VtdWxhdGluZyBwb2ludHMuAD0BIElmIG5vbmUgdGhlIGN1cnJlbnQgcm91bmQgaXMgb25nb2luZyBhbmQgd2lsbCBiZSBwbGFubmVkIG9uIHRoZSBuZXh0IHNjaGVkdWxlLgA4Um91bmRTY2hlZHVsZXMBAD0LBAAEuCBEZXNjcmliZXMgdGhlIHNjaGVkdWxlcyBvZiB0aGUgcGF5b3V0IHJvdW5kcy4AAa0EAAEhBwAUUEN1cnJlbmN5TG9jYXRpb25JbmZv4DABAwChDwQyBXbI6wsE9CBUaGUgbG9jYXRpb24gb2YgdGhlIHVzZWQgY3VycmVuY3kuIEl0IGlzIGluZm9ybWF0aW9uYWwgb25seS4AUE9mZmNoYWluV29ya0ludGVydmFsOBACAAAABLAgVGhlIGludGVydmFsIGF0IHdoaWNoIG9mZmNoYWluIHdvcmtlciBydW5zLgAwc2NvcmVfcG90X2lkBIBtb2Rsc2NvcmVwb3QAAAAAAAAAAAAAAAAAAAAAAAAAAATgIEdldCBhIHVuaXF1ZSwgaW5hY2Nlc3NpYmxlIGFjY291bnQgSUQgZnJvbSB0aGUgYFBvdElkYC4ANHNjb3JlX2NvbnRleHQIgHBvcDpwb2xrYWRvdC5uZXR3b3JrL3Njb3JlICAgICAgCFkBIFRoZSBjb250ZXh0IHVzZWQgZm9yIHRoZSBwcm9vZnMgcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIGFzIGEgcGVyc29uYWwgYWxpYXMgaW4gc2NvcmUgIHBhbGxldC4AKHViaV9wb2ludHM4EAYAAAAEFQEgVGhlIG51bWJlciBvZiBwb2ludHMgcmVjZWl2ZWQgd2hlbiBhdHRlbmRpbmcgYXMgYSByZWNvZ25pemVkIHBlcnNvbi4AAUkLAAAAOAAAIER1bW15RGltASBEdW1teURpbQgsUmVzZXJ2ZWRJZHMAAQQCKBAEAATcIFRoZSBwZXJzb25hbCBJRHMgdGhhdCBhcmUgcmVzZXJ2ZWQgYnkgdW5wcm92ZW4gcGVvcGxlLgAYUGVvcGxlAAEEBShNCwQABLggVGhlIHBlb3BsZSB3ZSB0cmFjayBhbG9uZyB3aXRoIHRoZWlyIHJlY29yZHMuAAHFBAABJQcAAAFRCwAAADsAAChQZW9wbGVMaXRlAShQZW9wbGVMaXRlFChMaXRlUGVvcGxlAAEEAgRVCwQAAAA4QWxpYXNUb0FjY291bnQAAQQCSQMEBAAE4CBDb252ZXJzaW9uIG9mIGEgbGl0ZSBjb250ZXh0dWFsIGFsaWFzIHRvIGFuIGFjY291bnQgSUQuADhBY2NvdW50VG9BbGlhcwABBAIERQMEAATgIENvbnZlcnNpb24gb2YgYW4gYWNjb3VudCBJRCB0byBhIGxpdGUgY29udGV4dHVhbCBhbGlhcy4AbExpdGVQZW9wbGVDb2xsZWN0aW9uQ3JlYXRlZAEAyAQABPAgV2hldGhlciB0aGUgbGl0ZSBwZW9wbGUgbWVtYmVyIGNvbGxlY3Rpb24gaGFzIGJlZW4gY3JlYXRlZC4AUEF0dGVzdGF0aW9uQWxsb3dhbmNlAQEEAgQ4EAAAAAAEKQEgTnVtYmVyIG9mIGF0dGVzdGF0aW9ucyBhdmFpbGFibGUgdG8gZGlzdHJpYnV0ZSBmb3IgYSB2ZXJpZmllciBhY2NvdW50IGlkLgAB3QQAASkHAAxATGl0ZVJpbmdFeHBvbmVudP0EBAkEzCBSaW5nIGV4cG9uZW50IHVzZWQgZm9yIHRoZSBsaXRlIHBlb3BsZSBjb2xsZWN0aW9uLgBITGl0ZU9uYm9hcmRpbmdTaXplOBADAAAABPwgT25ib2FyZGluZyBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgbGl0ZSBwZW9wbGUgY29sbGVjdGlvbi4AdGFjY291bnRfc2V0dXBfYmxvY2tfdG9sZXJhbmNlOBBYAgAABC0BIFRoZSBudW1iZXIgb2YgYmxvY2tzIG9mIHRvbGVyYW5jZSB3ZSBhbGxvdyBmb3IgYW4gYWxpYXMgc2V0dXAgdHJhbnNhY3Rpb24uAAFdCwAEUEF0dGVzdGF0aW9uU2lnbmF0dXJlNQQIYQEgU2lnbmF0dXJlIGdlbmVyYXRlZCBieSBsaXRlIHBlb3BsZSBhbmQgdXNlZCBieSB2ZXJpZmllcnMgdG8gY2xhaW0gYXR0ZXN0YXRpb25zIG9uIHRoZWlyICBiZWhhbGYuAD4AACRSZXNvdXJjZXMBJFJlc291cmNlcywkQ29uc3VtZXJzAAEEAgRhCwQABCkBIEFjY291bnRzIHVzZWQgdG8gaWRlbnRpZnkgY29uc3VtZXJzIG1hcHBlZCB0byB0aGVpciBjb25zdW1lciBpbmZvcm1hdGlvbi4AYFN0YXRlbWVudFN0b3JlQWxsb3dhbmNlcwABCAYCaQtxCwQAFHEBIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhIHN0YXRlbWVudCBzdG9yZSBzbG90IHRocm91Z2ggYW4gYW5vbnltb3VzIGFsbG93YW5jZSwgcGVyIHBlcmlvZC4AYQEgVGhlIHBlcmlvZCBrZXkgaXMgYSBiaWctZW5kaWFuIGVuY29kZWQgZGF5IG51bWJlciAoc2Vjb25kcyBzaW5jZSBVbml4IGVwb2NoIC8gODY0MDApIHNvcQEgdGhhdCBgSWRlbnRpdHlgLWhhc2hlZCBpdGVyYXRpb24geWllbGRzIGVudHJpZXMgaW4gY2hyb25vbG9naWNhbCBvcmRlciB0byBiZSByZW1vdmVkIGJ5IHRoZUQgb2ZmY2hhaW4gd29ya2VyLgBsU3RtdFN0b3JlQWxsb3dhbmNlQnlBY2NvdW50AAEIAgJ1CxAEABRBASBSZXZlcnNlIGxvb2t1cCBmcm9tIGEgc3RhdGVtZW50IGFjY291bnQgdG8gYWxsIGl0cyBhY3RpdmUgYW5vbnltb3VzIGFsbG93YW5jZXMuAEUBIEtleWVkIGJ5IGAoQWNjb3VudElkLCAoQmlnRW5kaWFuVTMyIHBlcmlvZCwgdTMyIHNlcSwgQWxpYXMpKWAg4oaSIGAoKWAuIE11bHRpcGxlSQEgZW50cmllcyBwZXIgYWNjb3VudCBhcmUgcG9zc2libGUgd2hlbiB0aGUgc2FtZSBzdGF0ZW1lbnQgYWNjb3VudCBpcyBhdXRob3JpemVkIGJ5zCBkaWZmZXJlbnQgYWxpYXNlcyBvciBhY3Jvc3MgZ3JhY2Utd2luZG93IG92ZXJsYXBzLgCARnJpZW5kUmVxdWVzdFJlZ2lzdHJhdGlvbkJ5QWxpYXMAAQQCCH0LBAAEKQEgRnJpZW5kIHJlcXVlc3QgcmVnaXN0cmF0aW9uIGJ5IGFub255bW91cyBhbGlhcyBpbiBmcmllbmQgcmVxdWVzdCBjb250ZXh0LgBsRnJpZW5kUmVxdWVzdEFsaWFzQnlBY2NvdW50AAEEAgQIBAAEJQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBmcmllbmQgcmVxdWVzdCBzdGF0ZW1lbnQgYWNjb3VudCB0byBhbm9ueW1vdXMgYWxpYXMuAGxTcGVudExvbmdUZXJtU3RvcmFnZUFsaWFzZXMAAQgGAmkLEAQAIEkBIEFsaWFzZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIHRvIGNsYWltIGxvbmctdGVybSBzdG9yYWdlIGluIGEgZ2l2ZW4gcGVyaW9kLgBZASBLZXllZCBieSBgKHBlcmlvZCwgYWxpYXMpYC4gRWFjaCBjb3VudGVyIHZhbHVlIGluIHRoZSBwcm9vZiBjb250ZXh0IHByb2R1Y2VzIGEgdW5pcXVlXQEgYWxpYXMsIHNvIGEgcGVyc29uIGNhbiBoYXZlIHVwIHRvIGBMb25nVGVybVN0b3JhZ2VDbGFpbXNQZXJQZXJpb2RgIGVudHJpZXMgcGVyIHBlcmlvZC41ASBPbGQgcGVyaW9kcyBjYW4gYmUgY2xlYW5lZCB1cCB2aWEgYGNsZWFyX2V4cGlyZWRfbG9uZ190ZXJtX3N0b3JhZ2VfYWxpYXNlc2AuAEEBIFRoZSBwZXJpb2Qga2V5IGlzIGBCaWdFbmRpYW5VMzJgIHdpdGggYElkZW50aXR5YCBzbyBpdGVyYXRpb24geWllbGRzIGVudHJpZXMgaW7oIGNocm9ub2xvZ2ljYWwgb3JkZXIsIG1hdGNoaW5nIGBTdGF0ZW1lbnRTdG9yZUFsbG93YW5jZXNgLgA8VXNlcm5hbWVPd25lck9mAAEEAkEEBAQAGHEBIFJldmVyc2UgbG9va3VwIGZyb20gYHVzZXJuYW1lYCB0byB0aGUgYEFjY291bnRJZGAgdGhhdCBoYXMgcmVnaXN0ZXJlZCBpdC4gVGhlIGBvd25lcmAgdmFsdWVlASBzaG91bGQgYmUgYSBrZXkgaW4gdGhlIGBDb25zdW1lcnNgIG1hcC4gVGhlcmUgY2FuIGJlIGF0IG1vc3QgMiB1c2VybmFtZXMgcG9pbnRpbmcgdG8gdGhlOCBzYW1lIGBvd25lcmA6cQEgLSB1c2VybmFtZSBhc3NvY2lhdGVkIHdpdGggYSBjb25zdW1lcidzIGxpdGUgcGVyc29uIGlkZW50aXR5IC0gdGhpcyB3aWxsIGFsd2F5cyBiZSBwcmVzZW50O1kBIC0gb3B0aW9uYWxseSBhbm90aGVyIHVzZXJuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uc3VtZXIncyBmdWxsIHBlcnNvbiBpZGVudGl0eSwgaWY4ICAgYXBwbGljYWJsZS4AOEFjY291bnRPZkFsaWFzAAEEAggEBAAEaQEgUmV2ZXJzZSBsb29rdXAgZnJvbSByZWdpc3RlcmVkIGFsaWFzZXMgdG8gdGhlIGBBY2NvdW50SWRgIHVzZWQgdG8gcmVnaXN0ZXIgYXMgYSBjb25zdW1lci4AbFVzZXJuYW1lUmVzZXJ2YXRpb25EdXJhdGlvbgEAKCAAAAAAAAAAAAhVASBUaGUgYW1vdW50IG9mIHRpbWUgZm9yIHdoaWNoIGEgdXNlcm5hbWUgcmVzZXJ2YXRpb24gaXMgdmFsaWQsIGluIHNlY29uZHMuIEFmdGVyIHRoaXPQIHRpbWUgcGVyaW9kIGVsYXBzZXMsIHRoZSByZXNlcnZhdGlvbiBjYW4gYmUgdm9pZGVkLgBgVXNlcm5hbWVSZXNlcnZhdGlvblF1ZXVlAAEEAkEEgQsEAAhxASBNYXAgZnJvbSBhIHJlc2VydmVkIGB1c2VybmFtZWAgdG8gYSBxdWV1ZSBvZiBgUmVzZXJ2YXRpb25RdWV1ZUVudHJ5YCBpdGVtcywgZWFjaCBob2xkaW5nIGFuYQEgYWNjb3VudCBhbmQgdGhlIHRpbWVzdGFtcCB3aGVuIGl0IGpvaW5lZC4gT2xkIHJlc2VydmF0aW9ucyBjYW4gYmUgcmVtb3ZlZCBmcm9tIHN0b3JhZ2UuADRSZXNlcnZhdGlvbk9mAAEEAgRBBAQACGUBIFJldmVyc2UgbG9va3VwIGZyb20gYW4gYWNjb3VudCB0byB0aGUgdXNlcm5hbWUgaXQgaGFzIHJlc2VydmVkLiBFYWNoIGFjY291bnQgY2FuIGhhdmUgYXScIG1vc3Qgb25lIGFjdGl2ZSByZXNlcnZhdGlvbiBhdCBhIHRpbWUuAAHtBAABLQcAVERNYXhVc2VybmFtZUxlbmd0aDgQIAAAAAQtASBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSB1c2VybmFtZSwgaW5jbHVkaW5nIGFueSBwb3RlbnRpYWwgdHJhaWxpbmcgZGlnaXRzLgBETWluVXNlcm5hbWVMZW5ndGg4EAYAAAAEiCBUaGUgbWluaW11bSBsZW5ndGggb2YgYSB1c2VybmFtZS4ASFBlcnNvbkF1dGhEdXJhdGlvbjgQAKMCAAxVASBUaGUgZHVyYXRpb24gb2YgdGltZSwgaW4gc2Vjb25kcywgZm9yIHdoaWNoIGEgcGVyc29uJ3MgYXV0aG9yaXphdGlvbiBpcyB2YWxpZC4gQWZ0ZXJRASB0aGlzIHBlcmlvZCBlbGFwc2VzLCBwZW9wbGUgd2lsbCBubyBsb25nZXIgYmUgY29uc2lkZXJlZCBhY3RpdmUsIGJ1dCB0aGVpciByZXNvdXJjZQ0BIGFsbG93YW5jZXMgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIHNhbWUgdmFsdWVzIHVzZWQgZm9yIGxpdGUgcGVvcGxlLgBsTWluUGVyc29uQXV0aFVwZGF0ZUludGVydmFsOBCAUQEACFUBIFRoZSBtaW5pbXVtIGludGVydmFsIG9mIHRpbWUsIGluIHNlY29uZHMsIHdoaWNoIG11c3QgcGFzcyBiZWZvcmUgdXBkYXRpbmcgYSBwZXJzb24nczwgYXV0aG9yaXphdGlvbi4AZE1heFJlc2VydmF0aW9uUXVldWVMZW5ndGg4EAoAAAAEKQEgTWF4aW11bSBudW1iZXIgb2YgYWNjb3VudHMgdGhhdCBjYW4gcXVldWUgZm9yIGEgc2luZ2xlIHJlc2VydmVkIHVzZXJuYW1lLgBQQWNjb3VudHNBcGlBbGxvd2FuY2WNCyACAAAAAMgAAATQIFRoZSBTdGF0ZW1lbnQgU3RvcmUgYWxsb3dhbmNlIGZvciB0aGUgYWNjb3VudHMgQVBJLgBcU3RtdFN0b3JlU2xvdHNQZXJQZXJpb2Q4EAgAAAAEOQEgTWF4aW11bSBudW1iZXIgb2Ygc3RhdGVtZW50IHN0b3JlIHNsb3RzIGEgcGVyc29uIGNhbiBjbGFpbSB3aXRoaW4gb25lIHBlcmlvZC4AbExpdGVTdG10U3RvcmVTbG90c1BlclBlcmlvZDgQBAAAABBNASBNYXhpbXVtIG51bWJlciBvZiBzdGF0ZW1lbnQgc3RvcmUgc2xvdHMgYSBsaXRlIHBlcnNvbiBjYW4gY2xhaW0gd2l0aGluIG9uZSBwZXJpb2QuAE0BIFNhbWUgc2VtYW50aWNzIGFzIGBTdG10U3RvcmVTbG90c1BlclBlcmlvZGAgYnV0IGFwcGxpZWQgd2hlbiB0aGUgcHJvb2YgdGFyZ2V0cyB0aGX8IGxpdGUtcGVvcGxlIGNvbGxlY3Rpb24gdmlhIGBNZW1iZXJzaGlwQ29sbGVjdGlvbjo6TGl0ZVBlb3BsZWAuAFRTdG10U3RvcmVDbGVhbnVwTGltaXQ4EDIAAAAEWQEgTWF4aW11bSBudW1iZXIgb2Ygc3RhbGUgc3RhdGVtZW50IHN0b3JlIGFsbG93YW5jZSBlbnRyaWVzIHRvIHJlbW92ZSBwZXIgY2xlYW51cCBjYWxsLgBwU3RtdFN0b3JlUmVwbGFjZW1lbnRDb29sZG93bjgQCAcAAAg1ASBNaW5pbXVtIHRpbWUsIGluIHNlY29uZHMsIHRoYXQgbXVzdCBwYXNzIGJlZm9yZSBhbiBhbGlhcyBjYW4gcmVwbGFjZSBpdHMgb3du4CBzdGF0ZW1lbnQgc3RvcmUgYWxsb3dhbmNlIGVudHJ5IHdpdGhpbiB0aGUgc2FtZSBwZXJpb2QuAFhGcmllbmRSZXF1ZXN0QWxsb3dhbmNljQsgAQAAAAAoAAAEJQEgVGhlIFN0YXRlbWVudCBTdG9yZSBhbGxvd2FuY2UgZm9yIGZyaWVuZCByZXF1ZXN0IHN0YXRlbWVudCByZWdpc3RyYXRpb24uAGxGcmllbmRSZXF1ZXN0U2xvdHNQZXJQZXJpb2QMBBAUSQEgTWF4aW11bSBudW1iZXIgb2YgZnJpZW5kIHJlcXVlc3RzIGEgcGVyc29uIGNhbiBzZW5kIHdpdGhpbiBvbmUgcmF0ZS1saW1pdCBwZXJpb2QuAFUBIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGA4YCwgZWFjaCBwZXJzb24gY2FuIHNlbmQgdXAgdG8gOCBmcmllbmQgcmVxdWVzdHMgZHVyaW5nIHRoZVkBIHBlcmlvZCBzZWxlY3RlZCBieSBgRnJpZW5kUmVxdWVzdFBlcmlvZER1cmF0aW9uYC4gV2hlbiB0aGUgcGVyaW9kIGFkdmFuY2VzLCB0aGUgc2xvdHMcIHJlc2V0LgB8TGl0ZUZyaWVuZFJlcXVlc3RTbG90c1BlclBlcmlvZAwECBBdASBNYXhpbXVtIG51bWJlciBvZiBmcmllbmQgcmVxdWVzdHMgYSBsaXRlIHBlcnNvbiBjYW4gc2VuZCB3aXRoaW4gb25lIHJhdGUtbGltaXQgcGVyaW9kLgBdASBTYW1lIHNlbWFudGljcyBhcyBgRnJpZW5kUmVxdWVzdFNsb3RzUGVyUGVyaW9kYCBidXQgYXBwbGllZCB3aGVuIHRoZSBwcm9vZiB0YXJnZXRzIHRoZfwgbGl0ZS1wZW9wbGUgY29sbGVjdGlvbiB2aWEgYE1lbWJlcnNoaXBDb2xsZWN0aW9uOjpMaXRlUGVvcGxlYC4AbEZyaWVuZFJlcXVlc3RQZXJpb2REdXJhdGlvbjgQgFEBACQNASBSb2xsaW5nIHRpbWUgd2luZG93IGZvciByYXRlLWxpbWl0aW5nIGZyaWVuZCByZXF1ZXN0cywgaW4gc2Vjb25kcy4ANQEgVGltZSBpcyBkaXZpZGVkIGludG8gZml4ZWQtZHVyYXRpb24gcGVyaW9kcy4gVGhlIHBlcmlvZCBpbmRleCBpcyBjb21wdXRlZCBhc6ggYG5vd19zZWNzIC8gRnJpZW5kUmVxdWVzdFBlcmlvZER1cmF0aW9uYC4AYQEgRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgYDg2XzQwMGAgKDI0IGhvdXJzKSwgcGVyaW9kIGAwYCBpcyB0aGUgZmlyc3QgMjQgaG91cnMgc2luY2UgdGhlGQEgVW5peCBlcG9jaCwgcGVyaW9kIGAxYCBpcyB0aGUgbmV4dCAyNCBob3VycywgYW5kIHNvIG9uLiBDb21iaW5lZCB3aXRoZQEgYEZyaWVuZFJlcXVlc3RTbG90c1BlclBlcmlvZGAsIHRoaXMgZGVmaW5lcyBob3cgbWFueSBmcmllbmQgcmVxdWVzdHMgY2FuIGJlIHNlbnQgaW4gZWFjaCAgcGVyaW9kLgBgRnJpZW5kUmVxdWVzdEdyYWNlV2luZG93OBAQDgAAFEUBIEV4dHJhIHRpbWUsIGluIHNlY29uZHMsIGR1cmluZyB3aGljaCB0aGUgcHJldmlvdXMgZnJpZW5kIHJlcXVlc3QgcGVyaW9kIGlzIHN0aWxsbCBhY2NlcHRlZCBhZnRlciBhIHJvbGxvdmVyLgBlASBUaGlzIGFsbG93cyB0cmFuc2FjdGlvbnMgY3JlYXRlZCBjbG9zZSB0byBhIHBlcmlvZCBib3VuZGFyeSB0byBzdGlsbCBiZSBpbmNsdWRlZCBldmVuIGlm1CB0aGV5IGFyZSBleGVjdXRlZCBqdXN0IGFmdGVyIHRoZSBuZXh0IHBlcmlvZCBiZWdpbnMuAHhGcmllbmRSZXF1ZXN0UmV0ZW50aW9uRHVyYXRpb24oIIA6CQAAAAAAFGEBIER1cmF0aW9uIGZvciB3aGljaCBmcmllbmQgcmVxdWVzdCByZWdpc3RyYXRpb25zIHdpbGwgYmUgcmV0YWluZWQuIFNwZWNpZmllZCBpbiBzZWNvbmRzLgAhASBBIHJlZ2lzdHJhdGlvbiBpcyBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHBlcmlvZC4gT25jZSB0aGlzIHBlcmlvZCBlbmRzLCEBIHRoZSByZWdpc3RyYXRpb24gcmVtYWlucyB2YWxpZCBmb3IgdGhlIGNvbmZpZ3VyZWQgZHVyYXRpb24sIGFmdGVyIHdoaWNo8CBpdCBjYW4gYmUgY2xlYW5lZCB1cC4gU2VlIGBmcmllbmRfcmVxdWVzdF9leHBpcmF0aW9uX3RpbWVgLgBYT2ZmY2hhaW5Xb3JrZXJJbnRlcnZhbDgQAQAAAATsIE51bWJlciBvZiBibG9ja3MgYmV0d2VlbiBvZmZjaGFpbi13b3JrZXIgbWFpbnRlbmFuY2UgcnVucy4AdExvbmdUZXJtU3RvcmFnZVBlcmlvZER1cmF0aW9uOBAAdRIAFAUBIFRoZSBkdXJhdGlvbiBvZiBhIGxvbmctdGVybSBzdG9yYWdlIGNsYWltaW5nIHBlcmlvZCwgaW4gc2Vjb25kcy4ANQEgVGltZSBpcyBkaXZpZGVkIGludG8gZml4ZWQtZHVyYXRpb24gcGVyaW9kcy4gVGhlIHBlcmlvZCBpbmRleCBpcyBjb21wdXRlZCBhcyUBIGBub3dfc2VjcyAvIExvbmdUZXJtU3RvcmFnZVBlcmlvZER1cmF0aW9uYC4gRWFjaCBwZXJzb24gY2FuIHN1Ym1pdCB1cCB0b9AgYExvbmdUZXJtU3RvcmFnZUNsYWltc1BlclBlcmlvZGAgY2xhaW1zIHBlciBwZXJpb2QuAHhMb25nVGVybVN0b3JhZ2VDbGFpbXNQZXJQZXJpb2QMBAoQCQEgTWF4aW11bSBudW1iZXIgb2YgbG9uZy10ZXJtIHN0b3JhZ2UgY2xhaW1zIHBlciBwZXJzb24gcGVyIHBlcmlvZC4ASQEgRWFjaCBjbGFpbSB1c2VzIGEgZGlmZmVyZW50IGNvdW50ZXIgdmFsdWUgKDAuLmNsYWltc19wZXJfcGVyaW9kKSB3aGljaCBwcm9kdWNlcyBhKQEgZGlzdGluY3QgYWxpYXMgaW4gdGhlIHByb29mIGNvbnRleHQsIGVuc3VyaW5nIG9uZSBjbGFpbSBwZXIgY291bnRlciBzbG90LgBoTG9uZ1Rlcm1TdG9yYWdlR3JhY2VXaW5kb3c4EBAOAAAQUQEgRXh0cmEgdGltZSwgaW4gc2Vjb25kcywgZHVyaW5nIHdoaWNoIHRoZSBwcmV2aW91cyBsb25nLXRlcm0gc3RvcmFnZSBwZXJpb2QgaXMgc3RpbGxsIGFjY2VwdGVkIGFmdGVyIGEgcm9sbG92ZXIuAFkBIFNhbWUgc2VtYW50aWNzIGFzIGBGcmllbmRSZXF1ZXN0R3JhY2VXaW5kb3dgIGJ1dCBhcHBsaWVkIHRvIGxvbmctdGVybSBzdG9yYWdlIGNsYWltcy4AbExvbmdUZXJtU3RvcmFnZUNsZWFudXBMaW1pdDgQFAAAABRJASBNYXhpbXVtIG51bWJlciBvZiBzcGVudCBsb25nLXRlcm0gc3RvcmFnZSBhbGlhc2VzIHRoYXQgY2FuIGJlIGNsZWFyZWQgaW4gYSBzaW5nbGXAIGBjbGVhcl9leHBpcmVkX2xvbmdfdGVybV9zdG9yYWdlX2FsaWFzZXNgIGNhbGwuAE0BIEJvdW5kcyB0aGUgd29yc3QtY2FzZSB3ZWlnaHQgb2YgdGhlIGNsZWFudXAgZXh0cmluc2ljOyBjYWxsZXJzIG11c3QgcGFzcyBhIGBsaW1pdGBwIG5vIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlLgABkQsABERPZmZjaGFpblNpZ25hdHVyZTUECFEBIFNpZ25hdHVyZSB0eXBlIGZvciBlbnN1cmluZyBvd25lcnNoaXAgb2YgcHJvdmlkZWQgYWNjb3VudHMgaW4gY2FzZSBvZiByZWdpc3RyYXRpb25zPCB0aHJvdWdoIGFsaWFzLgwhEeDfGd6VY7WDAeX34AdDNy0+pos6SqoYqViorNcaQ2RjdXJyZW50X3N0bXRfc3RvcmVfcGVyaW9kADgEUQEgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZW1lbnQgc3RvcmUgYWxsb3dhbmNlIHBlcmlvZCAoZGF5IG51bWJlciBzaW5jZSBVbml4IGVwb2NoKS4AIRHg3xnelWO1gwHl9+AHQ6zIJchDXr2dNbwNtep2DpZsc3RtdF9zdG9yZV9zbG90X2NvbnRleHRfZm9yCBhwZXJpb2Q4DHNlcTgIECEBIFJldHVybnMgdGhlIHByb29mIGNvbnRleHQgZm9yIGEgc3RhdGVtZW50IHN0b3JlIHNsb3QgY2xhaW0gYXQgdGhlIGdpdmVuUCBgcGVyaW9kYCBhbmQgYHNlcWAuAD0BIExheW91dDogYFNTU19TTE9UOjxwZXJpb2QgKDQgYnl0ZXMgQkUpPjxzZXEgKDQgYnl0ZXMgQkUpPmAgcGFkZGVkIHRvIDMyIGJ5dGVzLgAhEeDfGd6VY7WDAeX34AdDPYPcixulipt5B3FsGali92hmcmllbmRfcmVxdWVzdF9jb250ZXh0X2ZvcggYcGVyaW9kOAxzZXEMCAglASBSZXR1cm5zIHRoZSBwcm9vZiBjb250ZXh0IGZvciBhIGZyaWVuZCByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBhdCB0aGUgZ2l2ZW5QIGBwZXJpb2RgIGFuZCBgc2VxYC4APwAANENodW5rc01hbmFnZXIBNENodW5rc01hbmFnZXIIGENodW5rcwABCAUFlQuZCwQABBkBIFBhZ2luYXRlZCBjb2xsZWN0aW9uIG9mIGNodW5rcyAoUmluZ0V4cG9uZW50IC0+IFBhZ2VJbmRleCAtPiBDaHVua3MpLgA8Q2h1bmtQYWdlSGFzaGVzAAEIBQWVCwgEAASIIFRoZSBoYXNoIGZvciBlYWNoIHBhZ2Ugb2YgY2h1bmtzLgAB+QQAATEHAAQgUGFnZVNpemU4EP8AAAAEzCBOdW1iZXIgb2YgY2h1bmtzIHBlciBwYWdlLiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgABpQsABBRDaHVua50LBHAgVGhlIHR5cGUgb2YgYSBzaW5nbGUgY2h1bmsuAEAAABxNZW1iZXJzARxNZW1iZXJzRCxDb2xsZWN0aW9ucwABBAYIqQsEAATgIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggY29sbGVjdGlvbiwga2V5ZWQgYnkgaWRlbnRpZmllci4AUFN1c3BlbmRlZENvbGxlY3Rpb25zAAEEBgipCwQACCEBIENvbGxlY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgZGVsZXRpb24gYW5kIGFyZSBiZWluZyBwcm9jZXNzZWQuWQEgT25jZSBhIGNvbGxlY3Rpb24gaXMgbW92ZWQgaGVyZSwgbm9ybWFsIG9wZXJhdGlvbnMgd2lsbCBmYWlsIHdpdGggQ29sbGVjdGlvbk5vdEZvdW5kLgA0SWRlbnRpZmllcnNPZgABBAKtC7ULBAAEzCBUaGUgaWRlbnRpZmllcnMgb2YgY29sbGVjdGlvbnMgb3duZWQgYnkgYW4gZW50aXR5LgAQUm9vdAABCAYCuQu9CwQABIggVGhlIGN1cnJlbnQgbWVtYmVycyB3ZSByZWNvZ25pc2UuACBPbGRSb290cwABDAYGBskLzQsEACRBASBPbGQgcmluZyByb290cyBhcmUgcmV0YWluZWQgZm9yIGEgZ3JhY2UgcGVyaW9kIHNvIHRoYXQgcHJvb2ZzIGdlbmVyYXRlZCBhZ2FpbnN0ZQEgcHJldmlvdXMgcmV2aXNpb25zIHJlbWFpbiB2YWxpZC4gRWFjaCByb290IGluIHRoZSBtYXAgaXMgaWRlbnRpZmllZCBieSB0aGUgY29tcG9zaXRlIGtleS0BIGAoY29sbGVjdGlvbiwgcmluZyBpbmRleCwgcmluZyByZXZpc2lvbilgLiBFbnRyaWVzIGNhbiBiZSBjbGVhbmVkIHVwIGFmdGVyJQEgYE9sZFJvb3RSZXRlbnRpb25EdXJhdGlvbmAgaGFzIHBhc3NlZCBzaW5jZSB0aGUgYGFyY2hpdmVkX2F0YCB0aW1lc3RhbXAuADkBIFRoaXMgc3RvcmFnZSBjYW4gY29udGFpbiBzb21lIHJvb3RzIGZvciBkZWxldGVkIGNvbGxlY3Rpb25zIG9yIHJlbW92ZWQgcmluZ3MuXQEgVGhlIGNhbGwgYHZlcmlmeV9tZW1iZXJzaGlwX2F0X3JldmAgYW5kIG90aGVyIG9wZXJhdGlvbiB1c2luZyBvbGQgcm9vdHMgbXVzdCBjaGVjayB0aGVBASBleGlzdGVuY2Ugb2YgdGhlIGNvbGxlY3Rpb24gYW5kIHRoZSByb290IGluIG9yZGVyIHRvIG5vdCB2YWxpZGF0ZSBhZ2FpbnN0IGR1c3Qu8CBUaGUgb2xkIHJvb3RzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGUgcmV0ZW50aW9uIGR1cmF0aW9uLgBAQ3VycmVudFJpbmdJbmRleAEBBAYIOBAAAAAABOQgS2VlcHMgdHJhY2sgb2YgdGhlIHJpbmcgaW5kZXggY3VycmVudGx5IGJlaW5nIHBvcHVsYXRlZC4AOE9uYm9hcmRpbmdTaXplAQEEBgg4EAAAAAAE+CBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHF1ZXVlZCBiZWZvcmUgb25ib2FyZGluZyB0byBhIHJpbmcuACBSaW5nS2V5cwEBDAYCBdEL1QsEABBhASBCb3RoIHRoZSBrZXlzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGJ1aWx0IHJpbmdzIGFuZCB0aGUga2V5cyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmdXR1cmVZASByaW5ncy4gUGFnaW5hdGVkIGJ5IChJZGVudGlmaWVyLCBSaW5nSW5kZXgsIFBhZ2VJbmRleCkgd2hlcmUgZWFjaCBwYWdlIGNvbnRhaW5zIHVwIHRvdQEgYFJpbmdDYXBhY2l0eUZyb21FeHBvbmVudGAga2V5cy4gVGhlIHBhZ2Ugc2l6ZSBlcXVhbHMgdGhlIGZsZXhpYmxlIHJpbmcgZXhwb25lbnQncyBjYXBhY2l0eSz0IGVuc3VyaW5nIEZsZXhpYmxlIGNvbGxlY3Rpb25zIG5ldmVyIG5lZWQgbW9yZSB0aGFuIG9uZSBwYWdlLgA4UmluZ0tleXNTdGF0dXMBAQgGArkL2QskAAAAAAAAAAAACGEBIFN0b3JlcyB0aGUgbWV0YSBpbmZvcm1hdGlvbiBmb3IgZWFjaCByaW5nLCB0aGUgbnVtYmVyIG9mIGtleXMgYW5kIGhvdyBtYW55IGFyZSBhY3R1YWxseVggaW5jbHVkZWQgaW4gdGhlIHJvb3QuAEhQZW5kaW5nU3VzcGVuc2lvbnMBAQgGBbkL3QsEAAxpASBBIG1hcCBvZiBhbGwgcmluZ3Mgd2hpY2ggY3VycmVudGx5IGhhdmUgcGVuZGluZyBzdXNwZW5zaW9ucyBhbmQgbmVlZCBjbGVhbmluZywgYWxvbmcgd2l0aBEBIHRoZWlyIHJlc3BlY3RpdmUgbnVtYmVyIG9mIHN1c3BlbmRlZCBrZXlzIHdoaWNoIG5lZWQgdG8gYmUgcmVtb3ZlZC5tASBOb3RlOiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBzaW5nbGUtcGFnZSByaW5ncywgc28gYm91bmRlZCBieSBgUmluZ0NhcGFjaXR5RnJvbUV4cG9uZW50YC4ANEFjdGl2ZU1lbWJlcnMBAQQGCDgQAAAAAATQIFRoZSBudW1iZXIgb2YgbWVtYmVycyBjdXJyZW50bHkgaW5jbHVkZWQgaW4gYSByaW5nLgAcTWVtYmVycwABCAYC4QvlCwQAGF0BIFRoZSBjdXJyZW50IG1lbWJlcnMgaW4gZWFjaCBjb2xsZWN0aW9uIChlaXRoZXIgaW5jbHVkZWQgaW4gcmluZ3MsIHN1c3BlbmRlZCBhbmQgcXVldWVkIQEgZm9yIHJlbW92YWwgZnJvbSBhIHJpbmcsIHN1c3BlbmRlZCBhbmQgbm90IGluIGFueSByaW5nLCBvciBvbmJvYXJkaW5nKS4ADQEgQ29sbGVjdGlvbiBpZGVudGlmaWVyIHRvIG1lbWJlciBwdWJsaWMga2V5IHRvIHRoZSBtZW1iZXIncyBzdGF0dXMuAKggQSBrZXkgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBjb2xsZWN0aW9ucy4AKFJpbmdzU3RhdGUBAQQGCOkLBAAE/CBUaGUgY3VycmVudCBzdGF0ZSBvZiBhbGwgcmluZ3MgbWFuYWdlZCBmb3IgYSBnaXZlbiBpZGVudGlmaWVyLgAoU3RhbGVSaW5ncwABCAYFuQsQBAAEzCBTZXQgb2YgcmluZ3Mgd2hpY2ggYXJlIHN0YWxlIGFuZCByZXF1aXJlIGJ1aWxkaW5nLgBAUXVldWVQYWdlSW5kaWNlcwEBBAYIXQcgAAAAAAAAAAAEOQEgS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgaW5kaWNlcyBvZiB0aGUgaGVhZCBhbmQgdGFpbCBvZiB0aGUgb25ib2FyZGluZyBxdWV1ZS4APE9uYm9hcmRpbmdRdWV1ZQEBCAYFuQvxCwQABC0BIFBhZ2luYXRlZCBjb2xsZWN0aW9uIG9mIG1lbWJlciBwdWJsaWMga2V5cyByZWFkeSB0byBiZSBpbmNsdWRlZCBpbiBhIHJpbmcuAERSaW5nRGVsZXRpb25RdWV1ZQABDAYFBdELEAQAFJggUXVldWUgb2YgcmluZyBwYWdlcyBwZW5kaW5nIGRlbGV0aW9uLgAVASBUaGlzIGlzIHVzZWQgYm90aCBieSBgcmVtb3ZlX3JpbmdgIChpbmRpdmlkdWFsIHJpbmcgZGVsZXRpb24pIGFuZCBieRkBIGNvbGxlY3Rpb24gZGVsZXRpb24uIFJpbmcgcGFnZXMgYXJlIHByb2Nlc3NlZCBmcm9tIHRoaXMgcXVldWUgdmlhIE9DV6wgcmVnYXJkbGVzcyBvZiB3aGljaCBvcGVyYXRpb24gcXVldWVkIHRoZW0uAAEBBQABNQcAGDhNYXhDb2xsZWN0aW9uczgQZAAAAATEIE1heGltdW0gbnVtYmVyIG9mIGNvbGxlY3Rpb25zIGFuIG93bmVyIGNhbiBoYXZlLgBcT25ib2FyZGluZ1F1ZXVlUGFnZVNpemU4EP8AAAAITQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyBpbmNsdWRlZCBpbiBhbiBvbmJvYXJkaW5nIHF1ZXVlIHBhZ2UgYmVmb3JlIGEgbmV3IG9uZSBpcyQgY3JlYXRlZC4AXE1heEZsZXhpYmxlUmluZ0V4cG9uZW50/QQECQxdASBUaGUgbWF4aW11bSByaW5nIGV4cG9uZW50IHVzZWQgZm9yIEZsZXhpYmxlIGNvbGxlY3Rpb25zLiBUaGlzIGFsc28gZGV0ZXJtaW5lcyB0aGUgcGFnZVUBIHNpemUgZm9yIHBhZ2luYXRlZCByaW5nIGtleSBzdG9yYWdlLiBGbGV4aWJsZSBjb2xsZWN0aW9ucyBjYW4gb25seSB1c2UgcmluZyBzaXplcyB1cDwgdG8gdGhpcyB2YWx1ZS4AXFJpbmdCdWlsZGluZ01lbWJlckxpbWl0OBBkAAAACGEBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSByaW5nIHRocm91Z2ggYSBzaW5nbGUgcm9vdCBidWlsZGluZxggY2FsbC4AYE9sZFJvb3RSZXRlbnRpb25EdXJhdGlvbiggWAIAAAAAAAAIUQEgRHVyYXRpb24gaW4gc2Vjb25kcyB0aGF0IG9sZCByaW5nIHJvb3RzIGFyZSByZXRhaW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgY2xlYW5lZCB1cC5JASBUaGlzIGFsbG93cyBwcm9vZnMgZ2VuZXJhdGVkIHdpdGggb2xkZXIgcm9vdHMgdG8gcmVtYWluIHZhbGlkIGZvciBhIGdyYWNlIHBlcmlvZC4AWE9mZmNoYWluV29ya2VySW50ZXJ2YWw4EAEAAAAE5CBUaGUgbnVtYmVyIG9mIGJsb2NrcyBiZXR3ZWVuIG9mZmNoYWluIHdvcmtlciBleGVjdXRpb25zLgAB9QsABCBMb2NhdGlvbuAEOQEgTG9jYXRpb24gdHlwZSBmb3IgaWRlbnRpZnlpbmcgY29sbGVjdGlvbiBvd25lcnMgZnJvbSBvdGhlciBjaGFpbnMvcGFyYWNoYWlucy4AQwAAHENvaW5hZ2UBHENvaW5hZ2U8MENvaW5zQnlPd25lcgABBAUEcQMEABBAIENvaW5zIGJ5IG93bmVyLgBdASBUaGlzIHN0b3JhZ2UgbWFwIGNvbnRhaW5zIGFsbCB0aGUgY29pbnMgY3VycmVudGx5IGNpcmN1bGF0aW5nLiBUaGUgY29pbiBpcyBtaW50ZWQgd2hlbiUBIHVubG9hZGVkIGZyb20gdGhlIHJlY3ljbGVyLCBhbmQgZGVzdHJveWVkIHdoZW4gbG9hZGVkIGludG8gdGhlIHJlY3ljbGVyLgAsTG9ja2VkQ29pbnMAAQQFBPkLBAAQBQEgVGVtcG9yYXJ5IGxvY2sgZXhwaXJ5IGZvciBjb2lucyB0aGF0IHByZXZpb3VzbHkgZmFpbGVkIGRpc3BhdGNoLgBlASBBIGNvaW4gb3duZXIgZW50cnkgaXMgbG9ja2VkIHVudGlsIHRoZSBzdG9yZWQgVW5peCB0aW1lc3RhbXAsIHByZXZlbnRpbmcgcmVwZWF0ZWQgZmFpbGVklCBkaXNwYXRjaCBhdHRlbXB0cyBpbiBhIHNob3J0IHBlcmlvZC4AaFRvdGFsVmFsdWVPZkRlc3Ryb3llZENvaW5zAQDEQAAAAAAAAAAAAAAAAAAAAAAUqCBUaGUgdG90YWwgdmFsdWUgb2YgY29pbnMgdGhhdCB3ZXJlIGJ1cm50LgBpASBUaGlzIHRyYWNrcyB2YWx1ZSB0aGF0IGlzIGludGVudGlvbmFsbHkgZGVzdHJveWVkIGFzIHBhcnQgb2YgcHJvdG9jb2wgZmxvd3MgKGZvciBleGFtcGxlOmUBIHJlY3ljbGVyIGV4cGlyYXRpb24gY2xlYW51cCBhbmQgb3V0cHV0LXRva2VuIHNwYW0gcGVuYWx0eSBwYXRoKS4gVGhpcyBzdG9yYWdlIGl0ZW0ga2VlcHPIIHRyYWNrIG9mIHRoZSB0b3RhbCB2YWx1ZSBvZiBzdWNoIGRlc3Ryb3llZCBjb2lucy4AYENvbnN1bWVkRnJlZVVubG9hZFRva2VucwABCAUFXQoQBAAYxCBDb25zdW1lZCBmcmVlIHVubG9hZCB0b2tlbnMgYnkgcGVyaW9kIGFuZCBhbGlhcy4AVQEgVGhpcyBzdG9yYWdlIGtlZXBzIHRyYWNrIG9mIHRoZSBmcmVlIHVubG9hZCB0b2tlbnMgdGhhdCBoYXZlIGJlZW4gY29uc3VtZWQgYnkgcGVvcGxlrCBhbmQgbGl0ZSBwZW9wbGUsIHRvIGF2b2lkIGRvdWJsZSBzcGVuZGluZy4AcCBJdCBpcyBjbGVhcmVkIHBlcmlvZGljYWxseS4AZFJlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWQAAQQFdQMQBABAEQEgVHJhY2tzIHdoZXRoZXIgYSByZWN5Y2xlciBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBjb2luIHZhbHVlLgBdASBBbGwgcmVjeWNsZXIgY29sbGVjdGlvbnMgYXJlIGNyZWF0ZWQgZWFnZXJseSBkdXJpbmcgb25lLXRpbWUgYG9uX3BvbGxgIGluaXRpYWxpemF0aW9uLi0BIFtgUmVjeWNsZXJNYW5hZ2VyOjplbnN1cmVfY29sbGVjdGlvbl9leGlzdHNgXSBzZXJ2ZXMgYXMgYSBzYWZldHkgZmFsbGJhY2suAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgB0UmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXgAAQQFdQM4BABAxCBMYXN0IHJlbW92ZWQgcmluZyBpbmRleCBwZXIgcmVjeWNsZXIgY29pbiB2YWx1ZS4ARQEgUmluZ3MgYXJlIHJlbW92ZWQgc2VxdWVudGlhbGx5IHN0YXJ0aW5nIGZyb20gaW5kZXggMC4gVGhlIG5leHQgcmluZyB0byBjaGVjayBmb3ItASBleHBpcmF0aW9uIGlzIGBsYXN0X3JlbW92ZWQgKyAxYCAob3IgYDBgIGlmIG5vdGhpbmcgaGFzIGJlZW4gcmVtb3ZlZCB5ZXQpLgBVASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFJlY3ljbGVyTWFuYWdlcmBdIHR5cGUgaW5zdGVhZC4AVQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgbWFuYWdlZCBieSBbYFJlY3ljbGVyTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ6QQEgKiBbUmVjeWNsZXJDb2xsZWN0aW9uQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBjb2luIHZhbHVlLlUBICogW1JlY3ljbGVyc0xhc3RSZW1vdmVkUmluZ0luZGV4XSAtIHRoZSBsYXN0IHJlbW92ZWQgcmluZyBpbmRleCBmb3IgZWFjaCBjb2luIHZhbHVlLlkBICogW1JlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyXSAtIHRoZSBtYXBwaW5nIGZyb20gbWVtYmVyIGtleSB0byB0aGUgY29pbiB2YWx1ZSBpdCBpcyBpbi5hASAqIFtSZWN5Y2xlcnNVbmxvYWRlZF0gLSB0aGUgcmVjeWNsZXJzJyB1bmxvYWRlZCBhbGlhc2VzLCBpbmRleGVkIGJ5IGNvaW4gdmFsdWUgYW5kIHJpbmckICAgaW5kZXguKQEgKiBbUmVjeWNsZXJzRHVzdGluZ10gLSBtYXJrcyByaW5ncyB3aXRoIHVubG9hZGVkIGFsaWFzZXMgcGVuZGluZyByZW1vdmFsLgBhASBSaW5nIG1lbWJlcnMsIHBlbmRpbmcgbWVtYmVycywgYW5kIHJpbmcgc3RhdGUgYXJlIG1hbmFnZWQgYnkgW2BDb25maWc6Ok1lbWJlclNlcnZpY2VgXS4AXFJlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyAAEEBQh1AwQAQBEBIE1hcHBpbmcgZnJvbSBhIHJlY3ljbGVyIG1lbWJlciBrZXkgdG8gdGhlIGNvaW4gdmFsdWUgaXQgYmVsb25ncyB0by4ATQEgV2hlbiBhIGNvaW4gaXMgbG9hZGVkIGludG8gYSByZWN5Y2xlciwgdGhlIG1lbWJlciBrZXkgaXMgcmVjb3JkZWQgaGVyZSBzbyB0aGF0IHRoZQ0BIHBhbGxldCBjYW4gbG9vayB1cCB3aGljaCBjb2luIHZhbHVlIHRoZSBtZW1iZXIga2V5IGNvcnJlc3BvbmRzIHRvLgBVASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFJlY3ljbGVyTWFuYWdlcmBdIHR5cGUgaW5zdGVhZC4AVQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgbWFuYWdlZCBieSBbYFJlY3ljbGVyTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ6QQEgKiBbUmVjeWNsZXJDb2xsZWN0aW9uQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBjb2luIHZhbHVlLlUBICogW1JlY3ljbGVyc0xhc3RSZW1vdmVkUmluZ0luZGV4XSAtIHRoZSBsYXN0IHJlbW92ZWQgcmluZyBpbmRleCBmb3IgZWFjaCBjb2luIHZhbHVlLlkBICogW1JlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyXSAtIHRoZSBtYXBwaW5nIGZyb20gbWVtYmVyIGtleSB0byB0aGUgY29pbiB2YWx1ZSBpdCBpcyBpbi5hASAqIFtSZWN5Y2xlcnNVbmxvYWRlZF0gLSB0aGUgcmVjeWNsZXJzJyB1bmxvYWRlZCBhbGlhc2VzLCBpbmRleGVkIGJ5IGNvaW4gdmFsdWUgYW5kIHJpbmckICAgaW5kZXguKQEgKiBbUmVjeWNsZXJzRHVzdGluZ10gLSBtYXJrcyByaW5ncyB3aXRoIHVubG9hZGVkIGFsaWFzZXMgcGVuZGluZyByZW1vdmFsLgBhASBSaW5nIG1lbWJlcnMsIHBlbmRpbmcgbWVtYmVycywgYW5kIHJpbmcgc3RhdGUgYXJlIG1hbmFnZWQgYnkgW2BDb25maWc6Ok1lbWJlclNlcnZpY2VgXS4ARFJlY3ljbGVyc1VubG9hZGVkAAEMBQUFAQwQBABANQEgVGhlIHJlY3ljbGVycycgdW5sb2FkZWQgYWxpYXNlcywgaW5kZXhlZCBieSAoY29pbiB2YWx1ZSwgcmluZyBpbmRleCwgYWxpYXMpLgBVASBXaGVuIGEgY29pbiBpcyB1bmxvYWRlZCBmcm9tIGEgcmVjeWNsZXIsIHRoZSBhbGlhcyBwcm9kdWNlZCBieSB0aGUgcmluZy1WUkYgcHJvb2YgaXMZASBzdG9yZWQgaGVyZSB0byBwcmV2ZW50IGRvdWJsZS1zcGVuZGluZyB3aXRoaW4gdGhlIHNhbWUgcmVjeWNsZXIgcmluZy4AVQEgKipXQVJOSU5HKio6IERvIG5vdCB1c2UgdGhpcyBzdG9yYWdlIGRpcmVjdGx5LCB1c2UgW2BSZWN5Y2xlck1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFUBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BSZWN5Y2xlck1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OkEBICogW1JlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgY29pbiB2YWx1ZS5VASAqIFtSZWN5Y2xlcnNMYXN0UmVtb3ZlZFJpbmdJbmRleF0gLSB0aGUgbGFzdCByZW1vdmVkIHJpbmcgaW5kZXggZm9yIGVhY2ggY29pbiB2YWx1ZS5ZASAqIFtSZWN5Y2xlcnNDb2luVG9SZWN5Y2xlcl0gLSB0aGUgbWFwcGluZyBmcm9tIG1lbWJlciBrZXkgdG8gdGhlIGNvaW4gdmFsdWUgaXQgaXMgaW4uYQEgKiBbUmVjeWNsZXJzVW5sb2FkZWRdIC0gdGhlIHJlY3ljbGVycycgdW5sb2FkZWQgYWxpYXNlcywgaW5kZXhlZCBieSBjb2luIHZhbHVlIGFuZCByaW5nJCAgIGluZGV4LikBICogW1JlY3ljbGVyc0R1c3RpbmddIC0gbWFya3MgcmluZ3Mgd2l0aCB1bmxvYWRlZCBhbGlhc2VzIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAEBSZWN5Y2xlcnNEdXN0aW5nAAEEBQUMEAQASAUBIE1hcmtzIHJlY3ljbGVyIHJpbmdzIHRoYXQgaGF2ZSB1bmxvYWRlZCBhbGlhc2VzIHBlbmRpbmcgcmVtb3ZhbC4AIQEgV2hlbiBhIHJlY3ljbGVyIHJpbmcgaXMgcmVtb3ZlZCwgdGhlIGNsZWFudXAgb2YgaXRzIHVubG9hZGVkIGFsaWFzZXMgaW5RASBbUmVjeWNsZXJzVW5sb2FkZWRdIGlzIHBlcmZvcm1lZCBncmFkdWFsbHkgdGhyb3VnaCB0aGlzIHN0b3JhZ2UgaXRlbS4gQW4gZW50cnkgaGVyZVEBIGluZGljYXRlcyB0aGF0IHVubG9hZGVkIGFsaWFzZXMgZm9yIHRoZSBnaXZlbiBjb2luIHZhbHVlIGFuZCByaW5nIGluZGV4IHN0aWxsIGV4aXN0WCBhbmQgc2hvdWxkIGJlIGR1c3RlZC4AVQEgKipXQVJOSU5HKio6IERvIG5vdCB1c2UgdGhpcyBzdG9yYWdlIGRpcmVjdGx5LCB1c2UgW2BSZWN5Y2xlck1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFUBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BSZWN5Y2xlck1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OkEBICogW1JlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgY29pbiB2YWx1ZS5VASAqIFtSZWN5Y2xlcnNMYXN0UmVtb3ZlZFJpbmdJbmRleF0gLSB0aGUgbGFzdCByZW1vdmVkIHJpbmcgaW5kZXggZm9yIGVhY2ggY29pbiB2YWx1ZS5ZASAqIFtSZWN5Y2xlcnNDb2luVG9SZWN5Y2xlcl0gLSB0aGUgbWFwcGluZyBmcm9tIG1lbWJlciBrZXkgdG8gdGhlIGNvaW4gdmFsdWUgaXQgaXMgaW4uYQEgKiBbUmVjeWNsZXJzVW5sb2FkZWRdIC0gdGhlIHJlY3ljbGVycycgdW5sb2FkZWQgYWxpYXNlcywgaW5kZXhlZCBieSBjb2luIHZhbHVlIGFuZCByaW5nJCAgIGluZGV4LikBICogW1JlY3ljbGVyc0R1c3RpbmddIC0gbWFya3MgcmluZ3Mgd2l0aCB1bmxvYWRlZCBhbGlhc2VzIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAFhQYWlkVW5sb2FkVG9rZW5NZW1iZXJzAAEEBQgQBAA4CQEgTWFwcGluZyBmcm9tIGEgcGFpZCB0b2tlbiBtZW1iZXIga2V5IHRvIHRoZSBwZXJpb2QgaXQgYmVsb25ncyB0by4ARQEgV2hlbiBhIHVzZXIgcGF5cyBmb3IgYSByZWN5Y2xlciB1bmxvYWQgdG9rZW4sIHRoZSBtZW1iZXIga2V5IGlzIHJlY29yZGVkIGhlcmUgc28hASB0aGF0IHRoZSBwYWxsZXQgY2FuIGxvb2sgdXAgd2hpY2ggcGVyaW9kIHRoZSBtZW1iZXIga2V5IGNvcnJlc3BvbmRzIHRvLgBRASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFBhaWRUa25NYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBRASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUGFpZFRrbk1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OvAgKiBbUGFpZFVubG9hZFRva2VuTWVtYmVyc10gLSB0cmFja3MgcmVnaXN0ZXJlZCBtZW1iZXIga2V5cy4ZASAqIFtQYWlkVW5sb2FkVG9rZW5Db25zdW1lZF0gLSB0aGUgY29uc3VtZWQgcGFpZCB1bmxvYWQgdG9rZW4gYWxpYXNlcy45ASAqIFtQYWlkVG9rZW5Db2xsZWN0aW9uc0NyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgcGVyaW9kLkUBICogW1BhaWRVbmxvYWRUb2tlbkR1c3RpbmddIC0gbWFya3MgcGVyaW9kcyB3aXRoIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBcUGFpZFVubG9hZFRva2VuQ29uc3VtZWQAAQwGBQV5CxAEADj0IENvbnN1bWVkIHBhaWQgdW5sb2FkIHRva2VucyBieSBwZXJpb2QsIHJpbmcgaW5kZXggYW5kIGFsaWFzLgBJASBXaGVuIGEgcGFpZCB1bmxvYWQgdG9rZW4gaXMgY29uc3VtZWQsIHRoZSBhbGlhcyBwcm9kdWNlZCBieSB0aGUgcmluZy1WUkYgcHJvb2YgaXP0IHN0b3JlZCBoZXJlIHRvIHByZXZlbnQgZG91YmxlLXNwZW5kaW5nIHdpdGhpbiB0aGUgc2FtZSByaW5nLgBRASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFBhaWRUa25NYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBRASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUGFpZFRrbk1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OvAgKiBbUGFpZFVubG9hZFRva2VuTWVtYmVyc10gLSB0cmFja3MgcmVnaXN0ZXJlZCBtZW1iZXIga2V5cy4ZASAqIFtQYWlkVW5sb2FkVG9rZW5Db25zdW1lZF0gLSB0aGUgY29uc3VtZWQgcGFpZCB1bmxvYWQgdG9rZW4gYWxpYXNlcy45ASAqIFtQYWlkVG9rZW5Db2xsZWN0aW9uc0NyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgcGVyaW9kLkUBICogW1BhaWRVbmxvYWRUb2tlbkR1c3RpbmddIC0gbWFya3MgcGVyaW9kcyB3aXRoIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBsUGFpZFRva2VuQ29sbGVjdGlvbnNDcmVhdGVkAAEEBm0LEAQAOAkBIFRyYWNrcyB3aGV0aGVyIGEgcGFpZCB0b2tlbiBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBwZXJpb2QuAFUBIFVzZXMgYElkZW50aXR5YCBoYXNoZXIgc28gdGhhdCBpdGVyYXRpb24geWllbGRzIHBlcmlvZHMgaW4gb3JkZXIsIGVuYWJsaW5nIGVmZmljaWVudHAgY2xlYW51cCBvZiBleHBpcmVkIHBlcmlvZHMuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAFhQYWlkVW5sb2FkVG9rZW5EdXN0aW5nAAEEBm0LEAQAQC0BIE1hcmtzIHBhaWQgdW5sb2FkIHRva2VuIHBlcmlvZHMgdGhhdCBoYXZlIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAFkBIFdoZW4gYSBwYWlkIHVubG9hZCB0b2tlbiBjb2xsZWN0aW9uIGlzIHJlbW92ZWQsIHRoZSBjbGVhbnVwIG9mIGl0cyBjb25zdW1lZCB0b2tlbnMgaW5VASBbUGFpZFVubG9hZFRva2VuQ29uc3VtZWRdIGlzIHBlcmZvcm1lZCBncmFkdWFsbHkgdGhyb3VnaCB0aGlzIHN0b3JhZ2UgaXRlbS4gQW4gZW50cnlNASBoZXJlIGluZGljYXRlcyB0aGF0IGNvbnN1bWVkIHRva2VucyBmb3IgdGhlIGdpdmVuIHBlcmlvZCBzdGlsbCBleGlzdCBhbmQgc2hvdWxkIGJlICBkdXN0ZWQuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAHhQYWlkVW5sb2FkVG9rZW5OZXh0UmluZ1RvQ2xlYW4AAQQGbQs4BABg9CBUcmFja3MgdGhlIG5leHQgcmluZyBpbmRleCB0byBjbGVhbiBmb3IgZWFjaCBleHBpcmVkIHBlcmlvZC4ANQEgVXNlZCBieSB0aGUgT0NXIHRvIGRldGVybWluZSBjbGVhbnVwIHByb2dyZXNzIGFuZCBieSB0aGUgY29sbGVjdGlvbiBkZWxldGlvbsQgZXh0cmluc2ljIHRvIHZlcmlmeSBhbGwgcmluZ3MgaGF2ZSBiZWVuIGNsZWFuZWQuAD0BIFJpbmdzIGFyZSBjbGVhbmVkIHNlcXVlbnRpYWxseSAob25lIHBlciBPQ1cgaW50ZXJ2YWwpIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLj0BIFRoaXMgaXMgaW50ZW50aW9uYWw6IGEgc2luZ2xlIHN0b3JhZ2UgY3Vyc29yIGVuYWJsZXMgTygxKSBjb21wbGV0aW9uIGNoZWNrcyBpbswgYm90aCBbYFBhaWRUa25NYW5hZ2VyOjplbnN1cmVfY2FuX2NsZWFuX3JpbmdgXSBhbmRFASBbYFBhaWRUa25NYW5hZ2VyOjplbnN1cmVfY2FuX2RlbGV0ZV9jb2xsZWN0aW9uYF0uIFRoZSBhbHRlcm5hdGl2ZSDigJQgc3VibWl0dGluZ1UBIGFsbCByaW5nIGNsZWFucyBpbiBwYXJhbGxlbCDigJQgd291bGQgcmVxdWlyZSBmZXRjaGluZyByaW5nIG1lbWJlcnMgdG8gY2hlY2sgd2hldGhlck0BIGVhY2ggcmluZyB3YXMgYWxyZWFkeSBjbGVhbmVkIChzaW5jZSBgcmluZ19zdGF0dXNgIHN0aWxsIHJlcG9ydHMgYHRvdGFsID4gMGAgYWZ0ZXJVASBjbGVhbnVwIGJlY2F1c2UgcmluZ3MgYXJlIG5vdCByZW1vdmVkIHVudGlsIGNvbGxlY3Rpb24gZGVsZXRpb24pLiBDbGVhbnVwIG9mIGV4cGlyZWRNASBjb2xsZWN0aW9ucyBpcyBub3QgdGltZS1jcml0aWNhbCwgc28gdGhlIHNpbXBsZXIgc2VxdWVudGlhbCBhcHByb2FjaCBpcyBwcmVmZXJyZWQuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4dASAqIFtQYWlkVW5sb2FkVG9rZW5OZXh0UmluZ1RvQ2xlYW5dIC0gc2VxdWVudGlhbCByaW5nIGNsZWFudXAgcHJvZ3Jlc3MuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBcSW5pdGlhbGl6ZVBhbGxldEFjY291bnQAABAEABDEIFdoZXRoZXIgdGhlIHBhbGxldCBhY2NvdW50IGhhcyBiZWVuIGluaXRpYWxpemVkLgBZASBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIHBhbGxldCBhY2NvdW50IHdpdGggbWluaW11bSBiYWxhbmNlIHNvIHRoYXQgaXQgY2FuIGhvbGQgYW557CBhbW91bnQgb2YgdW5kZXJseWluZyBhc3NldCBldmVuIGxlc3MgdGhhbiBtaW5pbXVtIGJhbGFuY2UuAAEFBQABOQcARFBSZWN5Y2xlclJpbmdFeHBvbmVudP0EBAoEsCBUaGUgcmluZyBleHBvbmVudCBmb3IgcmVjeWNsZXIgY29sbGVjdGlvbnMuAGxQYWlkVW5sb2FkVG9rZW5SaW5nRXhwb25lbnT9BAQKBNQgVGhlIHJpbmcgZXhwb25lbnQgZm9yIHBhaWQgdW5sb2FkIHRva2VuIGNvbGxlY3Rpb25zLgBEVW5kZXJseWluZ0Fzc2V0SWTgMAEDAKEPBDIFdsjrCwTMIFRoZSBhc3NldCBpZCBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBvZiB0aGUgY29pbnMuAExVbmRlcmx5aW5nQXNzZXRVbml0xEAQJwAAAAAAAAAAAAAAAAAABLwgVGhlIHVuaXQgb2YgdGhlIHVuZGVybHlpbmcgYXNzZXQgb2YgdGhlIGNvaW5zLgA8TWluaW11bUV4cG9uZW50dQMEAASkIFRoZSBtaW5pbXVtIGV4cG9uZW50IGZvciB0aGUgY29pbiB2YWx1ZS4APE1heGltdW1FeHBvbmVudHUDBA4EpCBUaGUgbWF4aW11bSBleHBvbmVudCBmb3IgdGhlIGNvaW4gdmFsdWUuAIRNaW5pbXVtRXhwb25lbnRGb3JPdXRwdXRVbmxvYWRGZWV1AwQAIF0BIFRoZSBtaW5pbXVtIGNvaW4gZXhwb25lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwYXRjaCBhIGNhbGwgYHVubG9hZF9yZWN5Y2xlcl8qYCB3aXRo1CB0aGUgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIGBBc1VubG9hZFRva2VuRnJvbU91dHB1dGAuAGEBIFRoaXMgZW5zdXJlcyB0aGUgZmVlIGNvaW4gaXMgbGFyZ2UgZW5vdWdoIHRvIHBlbmFsaXplIGZhaWxpbmcgdHJhbnNhY3Rpb25zLCBidXQgaXQgZG9lc7ggbm90IG5lZWQgdG8gY292ZXIgdGhlIHdob2xlIHVubG9hZCB0b2tlbiBmZWUuAFEBIFRoZSBoZWxwZXIgZnVuY3Rpb24gYHdlaWdodF9mb3JfdW5sb2FkX3JlY3ljbGVyX3BheWluZ191c2luZ19vdXRwdXRgIGNhbiBiZSB1c2VkIHRvzCBldmFsdWF0ZSB0aGUgd29yc3QtY2FzZSB3ZWlnaHQgZm9yIHRoaXMgb3BlcmF0aW9uLgA8TWF4U3BsaXRPdXRwdXRzOBAgAAAABKwgVGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHB1dHMgZm9yIGEgc3BsaXQuAEBNYXhDb25zb2xpZGF0aW9uOBBAAAAABNwgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFsaWFzIHByb29mcyBpbiBhIGNvbnNvbGlkYXRpb24uAEhNYXhCYXRjaFVucGFpZExvYWQ4EAoAAAAIuCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5uZXIgY2FsbHMgaW4gYSBzaW5nbGUNASBbYENhbGw6OmxvYWRfcmVjeWNsZXJfd2l0aF9leHRlcm5hbF9hc3NldF91bnBhaWRfYmF0Y2hgXSBkaXNwYXRjaC4AlFVubG9hZFRva2VuVGltZVBlcmlvZFBlb3BsZUxpdGVQZW9wbGU4EIBRAQAE4CBUaGUgdGltZSBwZXJpb2QgZHVyYXRpb24gZm9yIHVubG9hZCB0b2tlbnMsIGluIHNlY29uZHMuAKhVbmxvYWRUb2tlbkFsbG93YW5jZVBlclRpbWVQZXJpb2RGb3JQZW9wbGXEQICEHgAAAAAAAAAAAAAAAAAUXQEgVGhlIGFsbG93YW5jZSBvZiB1bmxvYWQgdG9rZW5zIHRoYXQgYSBwZXJzb24gY2FuIHVzZSBwZXIgdGltZSBwZXJpb2QsIGV4cHJlc3NlZCBpbiB0aGVIIHVuZGVybHlpbmcgYXNzZXQuAFUBIFVzZSBwYWxsZXQgdmlldyB0byBmZXRjaCB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgdW5sb2FkIHRva2VucyBnaXZlbiB0aGUgY3VycmVudGQgcHJpY2UgZm9yIHVubG9hZCB0b2tlbnMuALhVbmxvYWRUb2tlbkFsbG93YW5jZVBlclRpbWVQZXJpb2RGb3JMaXRlUGVvcGxlxEAgoQcAAAAAAAAAAAAAAAAAFGEBIFRoZSBhbGxvd2FuY2Ugb2YgdW5sb2FkIHRva2VucyB0aGF0IGEgbGl0ZSBwZXJzb24gY2FuIHVzZSBwZXIgdGltZSBwZXJpb2QsIGV4cHJlc3NlZCBpblggdGhlIHVuZGVybHlpbmcgYXNzZXQuAFkBIFVzZSBwYWxsZXQncyBnZXRfZnJlZV91bmxvYWRfdG9rZW5faW5mbygpIHRvIGZldGNoIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiB1bmxvYWTIIHRva2VucyBnaXZlbiB0aGUgY3VycmVudCBwcmljZSBmb3IgdW5sb2FkIHRva2Vucy4AgE1heEZyZWVVbmxvYWRUb2tlbnNQZXJUaW1lUGVyaW9kOBAKAAAAEBkBIEhhcmQgdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBmcmVlIHVubG9hZCB0b2tlbnMgcGVyIHRpbWUgcGVyaW9kLgCMIFRoZSBlZmZlY3RpdmUgZnJlZSB0b2tlbiBsaW1pdCBpczoJASBgbWluKGFsbG93YW5jZSAvIGN1cnJlbnRfZmVlLCBNYXhGcmVlVW5sb2FkVG9rZW5zUGVyVGltZVBlcmlvZClgLgBYT2ZmY2hhaW5Xb3JrZXJJbnRlcnZhbDgQBAAAAATkIFRoZSBudW1iZXIgb2YgYmxvY2tzIGJldHdlZW4gb2ZmY2hhaW4gd29ya2VyIGV4ZWN1dGlvbnMuAFRDb2luRmFpbHVyZUxvY2tQZXJpb2QoIDwAAAAAAAAAEFEBIFRoZSBiYXNlIG51bWJlciBvZiBzZWNvbmRzIHRvIGxvY2sgYSBjb2luIGFmdGVyIGEgZmFpbGVkIGRpc3BhdGNoIGluIGBBc0NvaW5gIGZsb3cuAD0BIFRoZSBhY3R1YWwgbG9jayBkdXJhdGlvbiBpcyBleHBvbmVudGlhbDogYDJecmV0cmllcyAqIGJhc2VgIHdoZXJlIGByZXRyaWVzYCBpc5AgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcy4AOHBhbGxldF9hY2NvdW50BIBtb2RsY29pbmFnZSAAAAAAAAAAAAAAAAAAAAAAAAAAAAR4IFRoZSBhY2NvdW50IGlkIG9mIHRoZSBwYWxsZXQuAAEJDAAARHrCcSyKdqUqw7oQopAh7Jn5LyTubT1XSX6PPFJhXGFhaGdldF9mcmVlX3VubG9hZF90b2tlbl9pbmZvAA0MJE0BIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgZnJlZSB1bmxvYWQgdG9rZW5zIGRpc3RyaWJ1dGVkIHRvIHBlb3BsZSBhbmQgbGl0ZSBwZW9wbGWsIGdpdmVuIHRoZSBjdXJyZW50IHByaWNlIGZvciB1bmxvYWQgdG9rZW5zLgBdASBJZiBhbiBlbGVtZW50IGlzIGBOb25lYCwgbm8gcHJpY2UgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBhbmQgY29udmVyc2lvbiBiZXR3ZWVuIG5hdGl2ZcQgYW5kIHRoZSB1bmRlcmx5aW5nIGFzc2V0IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQuALggUmV0dXJuczogYChsaW1pdF9wZW9wbGUsIGxpbWl0X2xpdGVfcGVvcGxlKWAuAOggRWFjaCBlbGVtZW50IGlzIGBOb25lYCB3aGVuIGl0cyBsaW1pdCBjYW5ub3QgYmUgY29tcHV0ZWQuAHrCcSyKdqUqw7oQopAh7Jlz3RmCn2nEk576y2aKrIOrYGdldF9yZWN5Y2xlcl9yaW5nX3N0YXR1cwgUdmFsdWV1AxRpbmRleDgRDAToIEdldCB0aGUgcmluZyBzdGF0dXMgZm9yIGEgcmVjeWNsZXIgYXQgYSBnaXZlbiByaW5nIGluZGV4LgB6wnEsinalKsO6EKKQIeyZSNpY7ahV6pVQvr0qolt98mhnZXRfcmVjeWNsZXJfcmluZ19yZXZpc2lvbggUdmFsdWV1AxRpbmRleDgJAwTwIEdldCB0aGUgcmluZyByZXZpc2lvbiBmb3IgYSByZWN5Y2xlciBhdCBhIGdpdmVuIHJpbmcgaW5kZXguAHrCcSyKdqUqw7oQopAh7Jm178aAmmvzawOuV/TGbASJaGdldF9wYWlkX3Rva2VuX3Jpbmdfc3RhdHVzCBhwZXJpb2Q4FGluZGV4OBEMBB0BIEdldCB0aGUgcmluZyBzdGF0dXMgZm9yIGEgcGFpZCB0b2tlbiBhdCBhIGdpdmVuIHBlcmlvZCBhbmQgcmluZyBpbmRleC4AesJxLIp2pSrDuhCikCHsmaD2wxD2qCqffHbvIH/9njVwZ2V0X3BhaWRfdG9rZW5fcmluZ19yZXZpc2lvbggYcGVyaW9kOBRpbmRleDgJAwQlASBHZXQgdGhlIHJpbmcgcmV2aXNpb24gZm9yIGEgcGFpZCB0b2tlbiBhdCBhIGdpdmVuIHBlcmlvZCBhbmQgcmluZyBpbmRleC4AesJxLIp2pSrDuhCikCHsmW68Vemc1+I+cyXj7PzZm2aIZ2V0X3BhaWRfdW5sb2FkX3Rva2VuX2ZlZV9pbl9hc3NldAC1CBARASBHZXQgdGhlIGN1cnJlbnQgZmVlIGluIHRoZSB1bmRlcmx5aW5nIGFzc2V0IGZvciBwYWlkIHVubG9hZCB0b2tlbnMuAF0BIElmIG5vbmUgaXMgcmV0dXJuZWQgaXQgbWVhbnMgdGhhdCBubyBwcmljZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLCBhbmQgc29tZSBjb252ZXJzaW9uAQEgYmV0d2VlbiBuYXRpdmUgYW5kIHRoZSB1bmRlcmx5aW5nIGFzc2V0IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQuAHrCcSyKdqUqw7oQopAh7JnOvUSgz1HVuplPbA/gLOnqjGdldF9wYWlkX3VubG9hZF90b2tlbl9mZWVfaW5fbmF0aXZlAMQEDQEgR2V0IHRoZSBjdXJyZW50IGZlZSBpbiB0aGUgbmF0aXZlIGN1cnJlbmN5IGZvciBwYWlkIHVubG9hZCB0b2tlbnMuAHrCcSyKdqUqw7oQopAh7JmeXpBeWapAn7GAa3iZpheFRGdldF9jb2luX2J5X293bmVyBBRvd25lcgQVDASEIEdldCBjb2luIGRldGFpbHMgZm9yIGFuIGFjY291bnQuAHrCcSyKdqUqw7oQopAh7JnanBbpJIKl96OX8Z/8pH8aTGdldF9jb2luX2xvY2tfdW50aWwEFG93bmVyBBUDDFUBIEdldCB0aGUgVW5peCB0aW1lc3RhbXAgdW50aWwgd2hpY2ggYSBjb2luIGlzIGN1cnJlbnRseSBsb2NrZWQgYWZ0ZXIgZmFpbGVkIGRpc3BhdGNoLgBJASBSZXR1cm5zIGBOb25lYCB3aGVuIHRoZXJlIGlzIG5vIGxvY2sgb3Igd2hlbiB0aGUgc3RvcmVkIGxvY2sgaGFzIGFscmVhZHkgZXhwaXJlZC4AesJxLIp2pSrDuhCikCHsmWRjKKh5eAr8EuFCWWARYFBgZ2V0X3JlY3ljbGVyX21lbWJlcl9pbmZvBBhtZW1iZXIIGQwE3CBHZXQgdGhlIGNvaW4gdmFsdWUgZm9yIGEgc3BlY2lmaWMgcmVjeWNsZXIgbWVtYmVyIGtleS4AesJxLIp2pSrDuhCikCHsmU8iBwpDfNFUQuU+iaAqaHRQaXNfcGFpZF90b2tlbl9tZW1iZXIEGG1lbWJlcgjIBNQgQ2hlY2sgd2hldGhlciBhIHBhaWQgdG9rZW4gbWVtYmVyIGtleSBpcyByZWdpc3RlcmVkLgB6wnEsinalKsO6EKKQIeyZLPZHZCEzYZ1/Hjy8Xbh7OFBnZXRfcmVjeWNsZXJfbWVtYmVycwgUdmFsdWV1AxRpbmRleDhVBAjgIEdldCB0aGUgbWVtYmVycyBvZiBhIHJlY3ljbGVyIHJpbmcgKHRoZSBhbm9ueW1pdHkgc2V0KS4NASBSZXF1aXJlZCB0byBidWlsZCB0aGUgcmluZyBjb21taXRtZW50IChhY2N1bXVsYXRvcikgZm9yIHRoZSBwcm9vZi4AesJxLIp2pSrDuhCikCHsmfE4/CBo8j4A9lUO7c5iT2FsZ2V0X3BhaWRfdG9rZW5fcmluZ19tZW1iZXJzCBhwZXJpb2Q4FGluZGV4OFUECOggR2V0IHRoZSBtZW1iZXJzIG9mIGEgcGFpZCB0b2tlbiByaW5nICh0aGUgYW5vbnltaXR5IHNldCkuDQEgUmVxdWlyZWQgdG8gYnVpbGQgdGhlIHJpbmcgY29tbWl0bWVudCAoYWNjdW11bGF0b3IpIGZvciB0aGUgcHJvb2YuAHrCcSyKdqUqw7oQopAh7JkF2qg6IjGFaW4l7IHksnyGaGlzX3JlY3ljbGVyX2FsaWFzX3VubG9hZGVkDBR2YWx1ZXUDFGluZGV4OBRhbGlhcwjIDPQgQ2hlY2sgaWYgYSByZWN5Y2xlciBhbGlhcyBoYXMgYWxyZWFkeSBiZWVuIHVubG9hZGVkIChzcGVudCkuAPAgSWYgdGhlIHJlY3ljbGVyIGlzIG5vdCBsaXZlLCB0aGUgcmVzdWx0IGlzIG5vdCBzaWduaWZpY2FudC4AesJxLIp2pSrDuhCikCHsmS6NiyqbxAjIWuSgBYhX0I9waXNfcGFpZF90b2tlbl9hbGlhc19jb25zdW1lZAwYcGVyaW9kOBRpbmRleDgUYWxpYXMIyAzAIENoZWNrIGlmIGEgcGFpZCB1bmxvYWQgdG9rZW4gaGFzIGJlZW4gY29uc3VtZWQuAPQgSWYgdGhlIHBlcmlvZCBpcyBub3QgY3VycmVudCwgdGhlIHJlc3VsdCBpcyBub3Qgc2lnbmlmaWNhbnQuAHrCcSyKdqUqw7oQopAh7Jm/EtB6iDYdDvU17ItcGeXTcGlzX2ZyZWVfdG9rZW5fYWxpYXNfY29uc3VtZWQIGHBlcmlvZDgUYWxpYXMIyAzAIENoZWNrIGlmIGEgZnJlZSB1bmxvYWQgdG9rZW4gaGFzIGJlZW4gY29uc3VtZWQuAPQgSWYgdGhlIHBlcmlvZCBpcyBub3QgY3VycmVudCwgdGhlIHJlc3VsdCBpcyBub3Qgc2lnbmlmaWNhbnQuAHrCcSyKdqUqw7oQopAh7JmRsy8uvB8r+d6VykJZ3bjFuHdlaWdodF9mb3JfdW5sb2FkX3JlY3ljbGVyX3BheWluZ191c2luZ19vdXRwdXQA1QEUMQEgR2V0IHRoZSB3b3JzdC1jYXNlIHdlaWdodCBmb3IgYSB0cmFuc2FjdGlvbiB1c2luZyBvdXRwdXQtYmFzZWQgZmVlIHBheW1lbnQuACkBIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSB3ZWlnaHQgZm9yIHRyYW5zYWN0aW9ucyBkaXNwYXRjaGVkIHdpdGhVASBgQXNVbmxvYWRUb2tlbkZyb21PdXRwdXRgLCB1c2VmdWwgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbiB0byBmaW5kIGEgZ29vZCB2YWx1ZSBmb3KUIGBNaW5pbXVtRXhwb25lbnRGb3JPdXRwdXRVbmxvYWRGZWVgLgBEAAA8TWVtYmVyc05vdGlmaWVyATxNZW1iZXJzTm90aWZpZXIwLFN1YnNjcmliZXJzAAEEBpwdDAQABEEBIFN1YnNjcmliZXIgcmVnaXN0cnkgd2l0aCB0aGVpciBzdWJzY3JpYmVkIGNvbGxlY3Rpb25zIGFuZCBpbml0aWFsaXphdGlvbiBzdGF0ZS4AVENvdW50ZXJGb3JTdWJzY3JpYmVycwEAOBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwAExTZWFsZWRCYXRjaFNlcXVlbmNlAQAoIAAAAAAAAAAADIggU2VxdWVuY2UgbnVtYmVyIGZvciBzZWFsZWQgYmF0Y2gu9CBJbmNyZW1lbnRlZCB3aGVuIGEgYmF0Y2ggaXMgc2VhbGVkIC0gcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbi7wIFNlcnZlcyBhcyB0aGUgYmF0Y2ggaWRlbnRpZmllciBmb3IgcmVwbGF5IGFuZCBkaXN0cmlidXRpb24uACRQYWdlU3RhdGUBACEMIAAAAAAAAAAABPAgUGFnaW5nIHN0YXRlOiB3cml0ZSBwYWdlLCBzZW5kIHBhZ2UsIGFuZCBsYXN0IHVwZGF0ZSBibG9jay4AOFBlbmRpbmdVcGRhdGVzAAEMBgYGJQwQBAAMfCBDaGFuZ2VkIHJpbmcgcm9vdCBrZXlzLCBwYWdlZC4xASBLZXk6IChwYWdlX2luZGV4LCBpZGVudGlmaWVyLCByaW5nX2luZGV4KS4gUG9wdWxhdGVkIGJ5IGBPblJpbmdSb290Q2hhbmdlYCw5ASBjb25zdW1lZCBieSBgZW5xdWV1ZV91cGRhdGVzYCBvbmUgcGFnZSBhdCBhIHRpbWUgZnJvbSBgUGFnZVN0YXRlOjpzZW5kX3BhZ2VgLgBAUGFnZVVwZGF0ZXNDb3VudAEBBAYtAzgQAAAAAAS0IFBlci1wYWdlIGNvdW50IG9mIGVudHJpZXMgaW4gUGVuZGluZ1VwZGF0ZXMuACxQZW5kaW5nSW5pdAABBAacKQwEAAS8IFN0YXRlIGZvciBwYWdpbmF0ZWQgc3Vic2NyaWJlciBpbml0aWFsaXphdGlvbi4AVENvdW50ZXJGb3JQZW5kaW5nSW5pdAEAOBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwAEhTZWFsZWRCYXRjaEluZGljZXMAAQQGCFkFBAAE3CBJbmRpY2VzIHBlciBjb2xsZWN0aW9uIGZvciB0aGUgc2VhbGVkIChjdXJyZW50KSBiYXRjaC4AMEN1cnJlbnRCYXRjaAAALQwEAASIIEN1cnJlbnQgYmF0Y2ggZGlzdHJpYnV0aW9uIHN0YXRlLgBsU3Vic2NyaWJlcnNXaXRoQ3VycmVudEJhdGNoAAEEBpwQBAAE6CBUcmFja3Mgd2hpY2ggc3Vic2NyaWJlcnMgaGF2ZSByZWNlaXZlZCB0aGUgY3VycmVudCBiYXRjaC4AOExhc3RSZXBsYXlUaW1lAAEIBgYxDCgEAAjQIExhc3QgcmVwbGF5IHRpbWUgcGVyIChzdWJzY3JpYmVyLCBjb2xsZWN0aW9uKSBwYWlyLtAgVXNlZCB0byBlbmZvcmNlIGEgY29vbGRvd24gYmV0d2VlbiByZXBsYXkgcmVxdWVzdHMuAAFFBQABPQcAKDhNYXhTdWJzY3JpYmVyczgQCgAAAAScIE1heGltdW0gbnVtYmVyIG9mIHN1YnNjcmliZXJzIGFsbG93ZWQuAEhNYXhVcGRhdGVzUGVyQmF0Y2g4EAoAAAAEbCBNYXhpbXVtIHVwZGF0ZXMgcGVyIGJhdGNoLgBsTWF4Q29sbGVjdGlvbnNQZXJTdWJzY3JpYmVyOBADAAAABMwgTWF4aW11bSBjb2xsZWN0aW9ucyBhIHN1YnNjcmliZXIgY2FuIHN1YnNjcmliZSB0by4AOE1heENvbGxlY3Rpb25zOBBkAAAABJAgTWF4aW11bSBudW1iZXIgb2YgcmluZyBjb2xsZWN0aW9ucy4ATFVwZGF0ZVRyaWdnZXJCbG9ja3M4EAEAAAAExCBNaW5pbXVtIG51bWJlciBvZiBibG9ja3MgYmV0d2VlbiB1cGRhdGUgYmF0Y2hlcy4AWFVwZGF0ZVRyaWdnZXJUaHJlc2hvbGQ4EAEAAAAE7CBNaW5pbXVtIG51bWJlciBvZiB1cGRhdGVzIHRvIHRyaWdnZXIgaW1tZWRpYXRlIGJhdGNoIHNlbmQuAGRSZXF1ZXN0UmVwbGF5UmVtb3RlV2VpZ2h01QEMQZwABCUBIFBlci1pbmRleCB3ZWlnaHQgc3VyY2hhcmdlIGZvciByZW1vdGUgZXhlY3V0aW9uIG9uIHRoZSBzdWJzY3JpYmVyIGNoYWluLgBYT2ZmY2hhaW5Xb3JrZXJJbnRlcnZhbDgQAQAAAATcIE1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyBiZXR3ZWVuIG9mZmNoYWluIHdvcmtlciBydW5zLgBEU3R1Y2tCYXRjaFRpbWVvdXQ4EGQAAAAE5CBOdW1iZXIgb2YgYmxvY2tzIGFmdGVyIHdoaWNoIGEgc3R1Y2sgYmF0Y2ggaXMgYWJhbmRvbmVkLgBUUmVwbGF5Q29vbGRvd25TZWNvbmRzKCA8AAAAAAAAAARZASBDb29sZG93biwgaW4gc2Vjb25kcywgYmV0d2VlbiByZXBsYXkgcmVxdWVzdHMgZm9yIHRoZSBzYW1lIHN1YnNjcmliZXIgYW5kIGNvbGxlY3Rpb24uAAE1DAAAAEUAAFRTdG9yYWdlSW5pdGlhbGl6YXRpb24BVFN0b3JhZ2VJbml0aWFsaXphdGlvbhAwT25Qb2xsU3RhdHVzAQA5DAQABPQgQ3VycmVudCBzdGF0ZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBpbiBvbl9wb2xsIGhvb2suAFhYY21UcmFuc2ZlckluaXRpYXRlZEF0AAA4BAAIuCBCbG9jayBudW1iZXIgd2hlbiBYQ00gdHJhbnNmZXIgd2FzIGluaXRpYXRlZC6AIFVzZWQgdG8gdHJhY2sgdHJhbnNmZXIgdGltZW91dC4AVExhc3RBaXJkcm9wUG9vbFBlcmlvZAEAOBAAAAAAGD0BIFBlcmlvZCBpbmRleCBvZiB0aGUgbW9zdCByZWNlbnRseSBvcGVuZWQgcmVjdXJyaW5nIGFpcmRyb3AgcHJpemUgcG9vbCwgd2hlcmUgYUEBICJwZXJpb2QiIGlzIGEgd2luZG93IG9mIGBBaXJkcm9wUG9vbFBlcmlvZGAgc2Vjb25kcyBhbmNob3JlZCBhdCAxMjowMCBVVEMgZGFpbHlBASAoc2VlIFtgUE9PTF9QRVJJT0RfT0ZGU0VUYF0pLiBPbiBlYWNoIGBvbl9wb2xsYCB0aWNrIHRoZSBzY2hlZHVsZXIgY29tcHV0ZXMgdGhlQQEgY3VycmVudCBwZXJpb2Q7IGlmIGl0IGV4Y2VlZHMgdGhpcyB2YWx1ZSwgb25lIHBvb2wgaXMgb3BlbmVkIGFuZCB0aGlzIGlzIGJ1bXBlZEUBIHRvIHRoZSBjdXJyZW50IHBlcmlvZC4gQSBjaGFpbiBwYXVzZSBzcGFubmluZyBtdWx0aXBsZSBwZXJpb2RzIG9wZW5zIGF0IG1vc3Qgb25l3CBwb29sIG9uIHJlc3VtZSDigJQgbWlzc2VkIHBlcmlvZHMgYXJlIG5vdCBiYWNrLWZpbGxlZC4AYEFpcmRyb3BTY2hlZHVsaW5nRW5hYmxlZAEAyAQADEEBIFdoZXRoZXIgb25fcG9sbCBhaXJkcm9wIHNjaGVkdWxpbmcgaXMgY3VycmVudGx5IGVuYWJsZWQuIFNldCB0byBgdHJ1ZWAgd2hlbiB0aGU9ASBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSB0cmFuc2l0aW9ucyBpbnRvIFtgT25Qb2xsU3RhdGU6Ok9wZW5pbmdBaXJkcm9wUG9vbHNgXTsVASB0b2dnbGFibGUgdGhlcmVhZnRlciB2aWEgW2BQYWxsZXQ6OnNldF9haXJkcm9wX3NjaGVkdWxpbmdfZW5hYmxlZGBdLgABXQUAAUEHAAAAAAA8AABkU3RvcmFnZUluaXRpYWxpemF0aW9uTGl0ZQFkU3RvcmFnZUluaXRpYWxpemF0aW9uTGl0ZQQwT25Qb2xsU3RhdHVzAQA9DAQABPQgQ3VycmVudCBzdGF0ZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBpbiBvbl9wb2xsIGhvb2suAAABRQcAAAAAAEEAABxBaXJkcm9wARxBaXJkcm9wEDxOZXh0UHJpemVQb29sSWQBADgQAAAAAAQJASBDb3VudGVyIHRoYXQgc3VwcGxpZXMgW2BQcml6ZVBvb2w6OmlkYF0gZm9yIHRoZSBuZXh0IHBvb2wgb3BlbmVkLgAoUHJpemVQb29scwABBAU4QQwEAAwZASBDdXJyZW50bHktb3BlbiBwcml6ZSBwb29scywga2V5ZWQgYnkgaWQuIFRoZSBhc3NvY2lhdGVkIGNvdW50ZXIgKGZyb21JASBbYENvdW50ZWRTdG9yYWdlTWFwYF0pIGRyaXZlcyB0aGUgYE1BWF9DT05DVVJSRU5UX1BSSVpFX1BPT0xTYCBjYXAgYW5kIHJlcGxhY2VzIGF4IHNlcGFyYXRlICJhY3RpdmUgaWRzIiBtaXJyb3IuAFBDb3VudGVyRm9yUHJpemVQb29scwEAOBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwADxQcml6ZVBvb2xDbGFpbXMAAQgFBTELEAQAEAkBIFBlci1wb29sIHJlY29yZCBvZiB3aGljaCBjbGFpbWFudHMgaGF2ZSBhbHJlYWR5IGNsYWltZWQuIEtleWVkIG9uJQEgW2BBY2NvdW50T3JQZXJzb25gXSBzbyB0aGUgUGVyc29uIGFuZCBBY2NvdW50IGNsYWltIHBhdGhzIHNoYXJlIGEgc2luZ2xlJQEgcmVwbGF5LWd1YXJkOiBlYWNoIGlkZW50aXR5ICh3aGljaGV2ZXIgaXQgaXMpIGNhbiBjbGFpbSBhdCBtb3N0IG9uY2UgcGVyGCBwb29sLgABYQUAAUkHABBITWluVmFsaWRpdHlTZWNvbmRzOBA8AAAAEEEBIExvd2VyIGJvdW5kIG9uIGEgcHJpemUgcG9vbCdzIGB2YWxpZGl0eWAgKGluIHNlY29uZHMpLiBBIHBvb2wgd2hvc2UgdmFsaWRpdHkgaXNBASBiZWxvdyB0aGlzIGlzIHJlamVjdGVkIHdpdGggW2BFcnJvcjo6VmFsaWRpdHlUb29TaG9ydGBdIOKAlCB0aGUgZmxvb3IgZXhpc3RzIHNvMQEgY2xhaW1hbnRzIGhhdmUgYXQgbGVhc3QgYSBtaW5pbXVtIHdpbmRvdyBpbiB3aGljaCB0byBzdWJtaXQgYmVmb3JlIHRoZSBwb29sQCBhdXRvLWNsZWFucy11cC4ASE1heFZhbGlkaXR5U2Vjb25kczgQgDoJAAw5ASBVcHBlciBib3VuZCBvbiBhIHByaXplIHBvb2wncyBgdmFsaWRpdHlgIChpbiBzZWNvbmRzKS4gQm91bmRzIHRoZSBsaWZldGltZSBvZjEBIGBQcml6ZVBvb2xDbGFpbXNgIGVudHJpZXMgZm9yIGEgc2luZ2xlIHBvb2wuIERlZmF1bHQgY2hvc2VuIGJ5IHRoZSBydW50aW1lO6ggdGhlIHNwZWMgcmVjb21tZW5kcyBvbmUgd2VlayAoYDYwNF84MDBgKS4ATFByaXplUG9vbENsZWFyTGltaXQ4EPQBAAAIMQEgTWF4aW11bSBudW1iZXIgb2YgYFByaXplUG9vbENsYWltc2AgZW50cmllcyB0byBkcm9wIHBlciBgb25fcG9sbGAgdGljayB3aGVujCBjbGVhbmluZyB1cCBhbiBleHBpcmVkIHByaXplIHBvb2wuADhhaXJkcm9wX3BvdF9pZASAbW9kbHBvcDphZHJwAAAAAAAAAAAAAAAAAAAAAAAAAAAEkCBUaGUgYWNjb3VudCBpZCBmb3IgdGhlIGFpcmRyb3AgcG90LgABTQwAAAA9AABQTXVsdGlCbG9ja01pZ3JhdGlvbnMBUE11bHRpQmxvY2tNaWdyYXRpb25zCBhDdXJzb3IAAHUFBAAM2CBUaGUgY3VycmVudGx5IGFjdGl2ZSBtaWdyYXRpb24gdG8gcnVuIGFuZCBpdHMgY3Vyc29yLgC8IGBOb25lYCBpbmRpY2F0ZXMgdGhhdCBubyBtaWdyYXRpb24gaXMgcnVubmluZy4AIEhpc3RvcmljAAEEBYkFEAQAELQgU2V0IG9mIGFsbCBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgbWlncmF0aW9ucy4AcQEgVGhpcyBpcyB1c2VkIGFzIGJsYWNrbGlzdCwgdG8gbm90IHJlLWV4ZWN1dGUgbWlncmF0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZTEBIGNvZGViYXNlIHlldC4gR292ZXJuYW5jZSBjYW4gcmVndWxhcmx5IGNsZWFyIHRoaXMgb3V0IHZpYSBgY2xlYXJfaGlzdG9yaWNgLgABbQUAAU0HAAgwQ3Vyc29yTWF4TGVuOBAAAAEAEKQgVGhlIG1heGltYWwgbGVuZ3RoIG9mIGFuIGVuY29kZWQgY3Vyc29yLgBlASBBIGdvb2QgZGVmYXVsdCBuZWVkcyB0byBzZWxlY3RlZCBzdWNoIHRoYXQgbm8gbWlncmF0aW9uIHdpbGwgZXZlciBoYXZlIGEgY3Vyc29yIHdpdGggTUVMCQEgYWJvdmUgdGhpcyBsaW1pdC4gVGhpcyBpcyBzdGF0aWNhbGx5IGNoZWNrZWQgaW4gYGludGVncml0eV90ZXN0YC4AQElkZW50aWZpZXJNYXhMZW44EAABAAAQtCBUaGUgbWF4aW1hbCBsZW5ndGggb2YgYW4gZW5jb2RlZCBpZGVudGlmaWVyLgBVASBBIGdvb2QgZGVmYXVsdCBuZWVkcyB0byBzZWxlY3RlZCBzdWNoIHRoYXQgbm8gbWlncmF0aW9uIHdpbGwgZXZlciBoYXZlIGFuIGlkZW50aWZpZXItASB3aXRoIE1FTCBhYm92ZSB0aGlzIGxpbWl0LiBUaGlzIGlzIHN0YXRpY2FsbHkgY2hlY2tlZCBpbiBgaW50ZWdyaXR5X3Rlc3RgLgABUQwAABALIBmazjVk0JZOLE1Km6RplE28/2ps4aTQsnxvzALSTDhvbmdvaW5nX3N0YXR1cwBVDASoIFJldHVybnMgdGhlIG9uZ29pbmcgc3RhdHVzIG9mIG1pZ3JhdGlvbnMuAAsgGZrONWTQlk4sTUqbpGlevXdssV2bkS4njU0tYsWhIHByb2dyZXNzAFkMEAkBIFJldHVybnMgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWlncmF0aW9uLCBpZiBhbnkuAFEBIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWlncmF0aW9uJ3MgcHJvZ3Jlc3MsHQEgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2Ygc3RlcHMgY29tcGxldGVkIGFuZCB0aGUgbWF4aW11bSBhbGxvd2VkIHN0ZXBzLgALIBmazjVk0JZOLE1Km6RpRq9LzsbzWnu77p2fwQlb4URhZmZlY3RlZF9wcmVmaXhlcwA0DAEBIFJldHVybnMgdGhlIHN0b3JhZ2UgcHJlZml4ZXMgYWZmZWN0ZWQgYnkgdGhlIGN1cnJlbnQgbWlncmF0aW9uLgAZASBDYW4gYmUgZW1wdHkgaWYgdGhlIG1pZ3JhdGlvbiBkb2VzIG5vdCBrbm93IG9yIHRoZXJlIGFyZSBubyBwcmVmaXhlcy4ACyAZms41ZNCWTixNSpukaapMKKBvGYhFvRuynsYgXd0Yc3RhdHVzAGEMBPAgUmV0dXJucyB0aGUgY29tcHJlaGVuc2l2ZSBzdGF0dXMgb2YgbXVsdGktYmxvY2sgbWlncmF0aW9ucy4AYgAACAQFACA1BAQAUAAECAwQFBgcICQoLDA0ODxAREhMUFBWZXJpZnlNdWx0aVNpZ25hdHVyZZUFECBBc1BlcnNvbpkFEFxBc1Byb29mT2ZJbmtQYXJ0aWNpcGFudKUFEEhTY29yZUFzUGFydGljaXBhbnSxBRA0R2FtZUFzSW52aXRlZL0FEDhQZW9wbGVMaXRlQXV0aMkFECBBc01lbWJlctUFECRBc0NvaW5hZ2XhBRAsQXNSZXNvdXJjZXP1BRA0QXV0aG9yaXplQ2FsbAEGEDxSZXN0cmljdE9yaWdpbnMFBhBIQ2hlY2tOb25aZXJvU2VuZGVyCQYQQENoZWNrU3BlY1ZlcnNpb24NBjg4Q2hlY2tUeFZlcnNpb24RBjgwQ2hlY2tHZW5lc2lzFQY8OENoZWNrTW9ydGFsaXR5GQY8KENoZWNrTm9uY2UhBhAsQ2hlY2tXZWlnaHQlBhBQQ2hhcmdlQXNzZXRUeFBheW1lbnQpBhBQU3RvcmFnZVdlaWdodFJlY2xhaW0QEFQcQXVyYUFwaQg0c2xvdF9kdXJhdGlvbgBlDAyQIFJldHVybnMgdGhlIHNsb3QgZHVyYXRpb24gZm9yIEF1cmEuACUBIEN1cnJlbnRseSwgb25seSB0aGUgdmFsdWUgcHJvdmlkZWQgYnkgdGhpcyB0eXBlIGF0IGdlbmVzaXMgd2lsbCBiZSB1c2VkLgAsYXV0aG9yaXRpZXMABQkEnCBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0IG9mIGF1dGhvcml0aWVzLgAEuCBBUEkgbmVjZXNzYXJ5IGZvciBibG9jayBhdXRob3JzaGlwIHdpdGggYXVyYS4EAFBSZWxheVBhcmVudE9mZnNldEFwaQRMcmVsYXlfcGFyZW50X29mZnNldAA4BPQgRmV0Y2ggdGhlIHNsb3Qgb2Zmc2V0IHRoYXQgaXMgZXhwZWN0ZWQgZnJvbSB0aGUgcmVsYXkgY2hhaW4uABAFASBBUEkgdG8gdGVsbCB0aGUgbm9kZSBzaWRlIGhvdyB0aGUgcmVsYXkgcGFyZW50IHNob3VsZCBiZSBjaG9zZW4uAGkBIEEgbGFyZ2VyIG9mZnNldCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVsYXkgcGFyZW50IHNob3VsZCBub3QgYmUgdGhlIHRpcCBvZiB0aGUgcmVsYXkgY2hhaW4sMQEgYnV0IGBOYCBibG9ja3MgYmVoaW5kIHRoZSB0aXAuIFRoaXMgb2Zmc2V0IGlzIHRoZW4gZW5mb3JjZWQgYnkgdGhlIHJ1bnRpbWUuBABgQXVyYVVuaW5jbHVkZWRTZWdtZW50QXBpBDhjYW5fYnVpbGRfdXBvbgg0aW5jbHVkZWRfaGFzaDwQc2xvdAkJyCg5ASBXaGV0aGVyIGl0IGlzIGxlZ2FsIHRvIGV4dGVuZCB0aGUgY2hhaW4sIGFzc3VtaW5nIHRoZSBnaXZlbiBibG9jayBpcyB0aGUgbW9zdDUBIHJlY2VudGx5IGluY2x1ZGVkIG9uZSBhcy1vZiB0aGUgcmVsYXkgcGFyZW50IHRoYXQgd2lsbCBiZSBidWlsdCBhZ2FpbnN0LCBhbmRwIHRoZSBnaXZlbiByZWxheSBjaGFpbiBzbG90LgBRASBUaGlzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGxvZ2ljIHRoZSBydW50aW1lIHVzZXMgd2hlbiB2YWxpZGF0aW5nIGJsb2NrcyB0bzggYXZvaWQgaXNzdWVzLgBhASBXaGVuIHRoZSB1bmluY2x1ZGVkIHNlZ21lbnQgaXMgZW1wdHksIGkuZS4gYGluY2x1ZGVkX2hhc2ggPT0gYXRgLCB3aGVyZSBhdCBpcyB0aGUgYmxvY2thASB3aG9zZSBzdGF0ZSB3ZSBhcmUgcXVlcnlpbmcgYWdhaW5zdCwgdGhpcyBtdXN0IGFsd2F5cyByZXR1cm4gYHRydWVgIGFzIGxvbmcgYXMgdGhlIHNsb3S8IGlzIG1vcmUgcmVjZW50IHRoYW4gdGhlIGluY2x1ZGVkIGJsb2NrIGl0c2VsZi4ANDUBIFRoaXMgcnVudGltZSBBUEkgaXMgdXNlZCB0byBpbmZvcm0gcG90ZW50aWFsIGJsb2NrIGF1dGhvcnMgd2hldGhlciB0aGV5IHdpbGwlASBoYXZlIHRoZSByaWdodCB0byBhdXRob3IgYXQgYSBzbG90LCBhc3N1bWluZyB0aGV5IGhhdmUgY2xhaW1lZCB0aGUgc2xvdC4AdQEgSW4gcGFydGljdWxhciwgdGhpcyBBUEkgYWxsb3dzIEF1cmEtYmFzZWQgcGFyYWNoYWlucyB0byByZWd1bGF0ZSB0aGVpciAidW5pbmNsdWRlZCBzZWdtZW50IixtASB3aGljaCBpcyB0aGUgc2VjdGlvbiBvZiB0aGUgaGVhZCBvZiB0aGUgY2hhaW4gd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGF2YWlsYWJsZSBpbiB0aGU0IHJlbGF5IGNoYWluLgBhASBXaGVuIHRoZSB1bmluY2x1ZGVkIHNlZ21lbnQgaXMgc2hvcnQsIEF1cmEgY2hhaW5zIHdpbGwgYWxsb3cgYXV0aG9ycyB0byBjcmVhdGUgbXVsdGlwbGVdASBibG9ja3MgcGVyIHNsb3QgaW4gb3JkZXIgdG8gYnVpbGQgYSBiYWNrbG9nLiBXaGVuIGl0IGlzIHNhdHVyYXRlZCwgdGhpcyBBUEkgd2lsbCBsaW1pdKggdGhlIGFtb3VudCBvZiBibG9ja3MgdGhhdCBjYW4gYmUgY3JlYXRlZC4AJCBDaGFuZ2VzOpEBIC0gVmVyc2lvbiAyOiBVcGRhdGUgdG8gYGNhbl9idWlsZF91cG9uYCB0byB0YWtlIGEgcmVsYXkgY2hhaW4gYFNsb3RgIGluc3RlYWQgb2YgYSBwYXJhY2hhaW4gYFNsb3RgLggAEENvcmUMHHZlcnNpb24AiQcEkCBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lLgA0ZXhlY3V0ZV9ibG9jawQUYmxvY2tpDBAEZCBFeGVjdXRlIHRoZSBnaXZlbiBibG9jay4AQGluaXRpYWxpemVfYmxvY2sEGGhlYWRlclx1DARBASBJbml0aWFsaXplIGEgYmxvY2sgd2l0aCB0aGUgZ2l2ZW4gaGVhZGVyIGFuZCByZXR1cm4gdGhlIHJ1bnRpbWUgZXhlY3V0aXZlIG1vZGUuAAQhASBUaGUgYENvcmVgIHJ1bnRpbWUgYXBpIHRoYXQgZXZlcnkgU3Vic3RyYXRlIHJ1bnRpbWUgbmVlZHMgdG8gaW1wbGVtZW50LhQAIE1ldGFkYXRhDCBtZXRhZGF0YQB5DASMIFJldHVybnMgdGhlIG1ldGFkYXRhIG9mIGEgcnVudGltZS4ATG1ldGFkYXRhX2F0X3ZlcnNpb24EHHZlcnNpb244fQwQpCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBhdCBhIGdpdmVuIHZlcnNpb24uAAUBIElmIHRoZSBnaXZlbiBgdmVyc2lvbmAgaXNuJ3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgcmV0dXJuIGBOb25lYC51ASBVc2UgW2BTZWxmOjptZXRhZGF0YV92ZXJzaW9uc2BdIHRvIGZpbmQgb3V0IGFib3V0IHN1cHBvcnRlZCBtZXRhZGF0YSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lLgBEbWV0YWRhdGFfdmVyc2lvbnMAZQQMpCBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbnMuAMAgVGhpcyBjYW4gYmUgdXNlZCB0byBjYWxsIGBtZXRhZGF0YV9hdF92ZXJzaW9uYC4ABAEBIFRoZSBgTWV0YWRhdGFgIGFwaSB0cmFpdCB0aGF0IHJldHVybnMgbWV0YWRhdGEgZm9yIHRoZSBydW50aW1lLggATFJ1bnRpbWVWaWV3RnVuY3Rpb24EVGV4ZWN1dGVfdmlld19mdW5jdGlvbgggcXVlcnlfaWSBDBRpbnB1dBiFDAR8IEV4ZWN1dGUgYSB2aWV3IGZ1bmN0aW9uIHF1ZXJ5LgAEpCBSdW50aW1lIEFQSSBmb3IgZXhlY3V0aW5nIHZpZXcgZnVuY3Rpb25zBAAwQmxvY2tCdWlsZGVyEDxhcHBseV9leHRyaW5zaWMEJGV4dHJpbnNpY6UHjQwQbCBBcHBseSB0aGUgZ2l2ZW4gZXh0cmluc2ljLgA5ASBSZXR1cm5zIGFuIGluY2x1c2lvbiBvdXRjb21lIHdoaWNoIHNwZWNpZmllcyBpZiB0aGlzIGV4dHJpbnNpYyBpcyBpbmNsdWRlZCBpbkwgdGhpcyBibG9jayBvciBub3QuADhmaW5hbGl6ZV9ibG9jawBcBGggRmluaXNoIHRoZSBjdXJyZW50IGJsb2NrLgBMaW5oZXJlbnRfZXh0cmluc2ljcwQgaW5oZXJlbnSdDLUHBD0BIEdlbmVyYXRlIGluaGVyZW50IGV4dHJpbnNpY3MuIFRoZSBpbmhlcmVudCBkYXRhIHdpbGwgdmFyeSBmcm9tIGNoYWluIHRvIGNoYWluLgA8Y2hlY2tfaW5oZXJlbnRzCBRibG9ja2kMEGRhdGGdDK0MBFUBIENoZWNrIHRoYXQgdGhlIGluaGVyZW50cyBhcmUgdmFsaWQuIFRoZSBpbmhlcmVudCBkYXRhIHdpbGwgdmFyeSBmcm9tIGNoYWluIHRvIGNoYWluLgAEcQEgVGhlIGBCbG9ja0J1aWxkZXJgIGFwaSB0cmFpdCB0aGF0IHByb3ZpZGVzIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGZvciBidWlsZGluZyBhIGJsb2NrLhgAWFRhZ2dlZFRyYW5zYWN0aW9uUXVldWUEUHZhbGlkYXRlX3RyYW5zYWN0aW9uDBhzb3VyY2WxDAh0eKUHKGJsb2NrX2hhc2g8tQwkaCBWYWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24uAGUBIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIHRyYW5zYWN0aW9uIHBvb2wgdG8gbGVhcm4gZGV0YWlscyBhYm91dCBnaXZlbiB0cmFuc2FjdGlvbi5FASBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugc3VyZSB0byB2ZXJpZnkgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB0cmFuc2FjdGlvbk0BIGFnYWluc3QgY3VycmVudCBzdGF0ZS4gVGhlIGdpdmVuIGBibG9ja19oYXNoYCBjb3JyZXNwb25kcyB0byB0aGUgaGFzaCBvZiB0aGUgYmxvY2t8IHRoYXQgaXMgdXNlZCBhcyBjdXJyZW50IHN0YXRlLgBFASBOb3RlIHRoYXQgdGhpcyBjYWxsIG1heSBiZSBwZXJmb3JtZWQgYnkgdGhlIHBvb2wgbXVsdGlwbGUgdGltZXMgYW5kIHRyYW5zYWN0aW9uc6QgbWlnaHQgYmUgdmVyaWZpZWQgaW4gYW55IHBvc3NpYmxlIG9yZGVyLgAETQEgVGhlIGBUYWdnZWRUcmFuc2FjdGlvblF1ZXVlYCBhcGkgdHJhaXQgZm9yIGludGVyZmVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIHF1ZXVlLgwARE9mZmNoYWluV29ya2VyQXBpBDxvZmZjaGFpbl93b3JrZXIEGGhlYWRlclwQBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgAEZCBUaGUgb2ZmY2hhaW4gd29ya2VyIGFwaS4IACxTZXNzaW9uS2V5cwhUZ2VuZXJhdGVfc2Vzc2lvbl9rZXlzCBRvd25lchgQc2VlZJEFvQwcFQEgR2VuZXJhdGUgYSBzZXQgb2Ygc2Vzc2lvbiBrZXlzIHdpdGggb3B0aW9uYWxseSB1c2luZyB0aGUgZ2l2ZW4gc2VlZC4JASBUaGUga2V5cyBzaG91bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUga2V5c3RvcmUgZXhwb3NlZCB2aWEgcnVudGltZTwgZXh0ZXJuYWxpdGllcy4AsCBUaGUgc2VlZCBuZWVkcyB0byBiZSBhIHZhbGlkIGB1dGY4YCBzdHJpbmcuANAgUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIFNDQUxFIGVuY29kZWQgcHVibGljIGtleXMuAExkZWNvZGVfc2Vzc2lvbl9rZXlzBBxlbmNvZGVkGMEMDJggRGVjb2RlIHRoZSBnaXZlbiBwdWJsaWMgc2Vzc2lvbiBrZXlzLgDcIFJldHVybnMgdGhlIGxpc3Qgb2YgcHVibGljIHJhdyBwdWJsaWMga2V5cyArIGtleSB0eXBlLgAEaCBTZXNzaW9uIGtleXMgcnVudGltZSBhcGkuCAA8QWNjb3VudE5vbmNlQXBpBDRhY2NvdW50X25vbmNlBBxhY2NvdW50BDgEwCBHZXQgY3VycmVudCBhY2NvdW50IG5vbmNlIG9mIGdpdmVuIGBBY2NvdW50SWRgLgAEgCBUaGUgQVBJIHRvIHF1ZXJ5IGFjY291bnQgbm9uY2UuBABUVHJhbnNhY3Rpb25QYXltZW50QXBpEChxdWVyeV9pbmZvCAx1eHSlBwxsZW44zQwAAERxdWVyeV9mZWVfZGV0YWlscwgMdXh0pQcMbGVuONEMAABMcXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h01QHEAABMcXVlcnlfbGVuZ3RoX3RvX2ZlZQQYbGVuZ3RoOMQAAAAQAGRUcmFuc2FjdGlvblBheW1lbnRDYWxsQXBpEDxxdWVyeV9jYWxsX2luZm8IEGNhbGwgDGxlbjjNDARJASBRdWVyeSBpbmZvcm1hdGlvbiBvZiBhIGRpc3BhdGNoIGNsYXNzLCB3ZWlnaHQsIGFuZCBmZWUgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC4AWHF1ZXJ5X2NhbGxfZmVlX2RldGFpbHMIEGNhbGwgDGxlbjjRDAS0IFF1ZXJ5IGZlZSBkZXRhaWxzIG9mIGEgZ2l2ZW4gZW5jb2RlZCBgQ2FsbGAuAExxdWVyeV93ZWlnaHRfdG9fZmVlBBh3ZWlnaHTVAcQEAQEgUXVlcnkgdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBgV2VpZ2h0VG9GZWVgIGdpdmVuIHNvbWUgaW5wdXQuAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGg4xAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBMZW5ndGhUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4AAAwANFhjbVBheW1lbnRBcGkQfHF1ZXJ5X2FjY2VwdGFibGVfcGF5bWVudF9hc3NldHMELHhjbV92ZXJzaW9uON0MFLQgUmV0dXJucyBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBwYXltZW50IGFzc2V0cy4AMCAjIEFyZ3VtZW50cwBoICogYHhjbV92ZXJzaW9uYDogVmVyc2lvbi4AQHF1ZXJ5X3hjbV93ZWlnaHQEHG1lc3NhZ2WVAekMFKggUmV0dXJucyBhIHdlaWdodCBuZWVkZWQgdG8gZXhlY3V0ZSBhIFhDTS4AMCAjIEFyZ3VtZW50cwB0ICogYG1lc3NhZ2VgOiBgVmVyc2lvbmVkWGNtYC4AZHF1ZXJ5X3dlaWdodF90b19hc3NldF9mZWUIGHdlaWdodNUBFGFzc2V0EQPtDBjoIENvbnZlcnRzIGEgd2VpZ2h0IGludG8gYSBmZWUgZm9yIHRoZSBzcGVjaWZpZWQgYEFzc2V0SWRgLgAwICMgQXJndW1lbnRzAIggKiBgd2VpZ2h0YDogY29udmVydGlibGUgYFdlaWdodGAufCAqIGBhc3NldGA6IGBWZXJzaW9uZWRBc3NldElkYC4ATHF1ZXJ5X2RlbGl2ZXJ5X2ZlZXMMLGRlc3RpbmF0aW9uSQEcbWVzc2FnZZUBIGFzc2V0X2lkEQPxDChgIFF1ZXJ5IGRlbGl2ZXJ5IGZlZXMgVjIuAB0BIEdldCBkZWxpdmVyeSBmZWVzIGZvciBzZW5kaW5nIGEgc3BlY2lmaWMgYG1lc3NhZ2VgIHRvIGEgYGRlc3RpbmF0aW9uYC70IFRoZXNlIGFsd2F5cyBjb21lIGluIGEgc3BlY2lmaWMgYXNzZXQsIGRlZmluZWQgYnkgdGhlIGNoYWluLgAwICMgQXJndW1lbnRzgQEgKiBgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRoYXQnbGwgYmUgc2VudCwgbmVjZXNzYXJ5IGJlY2F1c2UgbW9zdCBkZWxpdmVyeSBmZWVzIGFyZSBiYXNlZCBvbiB0aGVcICAgc2l6ZSBvZiB0aGUgbWVzc2FnZS5hASAqIGBkZXN0aW5hdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBEaWZmZXJlbnQgZGVzdGluYXRpb25zIG1heSB1c2XAICAgZGlmZmVyZW50IHNlbmRlcnMgdGhhdCBjaGFyZ2UgZGlmZmVyZW50IGZlZXMuACxwIEEgdHJhaXQgb2YgWENNIHBheW1lbnQgQVBJLgCoIEFQSSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBvYnRhaW5pbmc6AMQgKiB0aGUgd2VpZ2h0IHJlcXVpcmVkIHRvIGV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UsBQEgKiBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBgQXNzZXRJZGBzIGZvciBtZXNzYWdlIGV4ZWN1dGlvbiBwYXltZW50LAEBICogdGhlIGNvc3Qgb2YgdGhlIHdlaWdodCBpbiB0aGUgc3BlY2lmaWVkIGFjY2VwdGFibGUgYEFzc2V0SWRgLqAgKiB0aGUgZmVlcyBmb3IgYW4gWENNIG1lc3NhZ2UgZGVsaXZlcnkuAPAgVG8gZGV0ZXJtaW5lIHRoZSBleGVjdXRpb24gd2VpZ2h0IG9mIHRoZSBjYWxscyByZXF1aXJlZCBmb3J1ASBbYHhjbTo6bGF0ZXN0OjpJbnN0cnVjdGlvbjo6VHJhbnNhY3RgXSBpbnN0cnVjdGlvbiwgYFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGlgIGNhbiBiZSB1c2VkLggAJERyeVJ1bkFwaQgwZHJ5X3J1bl9jYWxsDBhvcmlnaW4xAxBjYWxsIExyZXN1bHRfeGNtc192ZXJzaW9uOPUMBEQgRHJ5IHJ1biBjYWxsIFYyLgAsZHJ5X3J1bl94Y20IPG9yaWdpbl9sb2NhdGlvbkkBDHhjbd0CIQ0EUCBEcnkgcnVuIFhDTSBwcm9ncmFtACSxASBBUEkgZm9yIGRyeS1ydW5uaW5nIGV4dHJpbnNpY3MgYW5kIFhDTSBwcm9ncmFtcyB0byBnZXQgdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGZlZXMgQVBJLgCBASBBbGwgY2FsbHMgcmV0dXJuIGEgdmVjdG9yIG9mIHR1cGxlcyAobG9jYXRpb24sIHhjbSkgd2hlcmUgZWFjaCAieGNtIiBpcyBleGVjdXRlZCBpbiAibG9jYXRpb24iLuQgSWYgdGhlcmUncyBsb2NhbCBleGVjdXRpb24sIHRoZSBsb2NhdGlvbiB3aWxsIGJlICJIZXJlIi4dASBUaGlzIHZlY3RvciBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYm90aCBleGVjdXRpb24gYW5kIGRlbGl2ZXJ5IGZlZXMuAJkBIENhbGxzIG9yIFhDTXMgbWlnaHQgZmFpbCB3aGVuIGV4ZWN1dGVkLCB0aGlzIGRvZXNuJ3QgbWVhbiB0aGUgcmVzdWx0IG9mIHRoZXNlIGNhbGxzIHdpbGwgYmUgYW4gYEVycmAuZQEgSW4gdGhvc2UgY2FzZXMsIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgdmFsaWQgcmVzdWx0LCB3aXRoIHRoZSBleGVjdXRpb24gZXJyb3IgaW5zaWRlIGl0LmUBIFRoZSBvbmx5IHJlYXNvbnMgd2h5IHRoZXNlIGNhbGxzIG1pZ2h0IHJldHVybiBhbiBlcnJvciBhcmUgbGlzdGVkIGluIHRoZSBbYEVycm9yYF0gZW51bS4IAFBMb2NhdGlvblRvQWNjb3VudEFwaQRAY29udmVydF9sb2NhdGlvbgQgbG9jYXRpb25JASkNBJAgQ29udmVydHMgYExvY2F0aW9uYCB0byBgQWNjb3VudElkYC4ABA0BIEFQSSBmb3IgdXNlZnVsIGNvbnZlcnNpb25zIGJldHdlZW4gWENNIGBMb2NhdGlvbmAgYW5kIGBBY2NvdW50SWRgLgQAKE1vYlJ1bGVBcGkEIHZvdGVkX29uCBR2b3RlcggkZG9uZV9vbmx5yGUEDFkBIFJldHVybnMgYSBsaXN0IG9mIGNhc2VzIHdoZXJlIHRoZSB1c2VyIGhhcyBhIHZvdGUgc3RvcmVkIG9uIGNoYWluLiBJZiB0aGUgYGRvbmVfb25seWBVASBmbGFnIGlzIHNldCwgb25seSBjYXNlcyB0aGF0IGFyZSBkb25lIGFuZCByZWFkeSB0byBiZSBjbGFpbWVkIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMFASBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdm90ZSBpbnRvIGFjY291bnQuAAS0IFRoZSBBUEkgdG8gcXVlcnkgdGhlIHJld2FyZHMgZm9yIG1vYiBjcmVkaXQuBAA0UHJvb2ZPZklua0FwaQREY2FuZGlkYWN5X2RlcG9zaXQAxATUIFJldHVybnMgdGhlIGRlcG9zaXQgbmVjZXNzYXJ5IHRvIGJlY29tZSBhIGNhbmRpZGF0ZS4ABOwgVGhlIEFQSSB0byBxdWVyeSB0aGUgZGVwb3NpdCBmb3IgYSBwcm9vZiBvZiBpbmsgY2FuZGlkYWN5LgQANFBhbGxldEdhbWVBcGkEMHBsYXlfZGVwb3NpdADEBLggUmV0dXJucyB0aGUgZGVwb3NpdCBuZWNlc3NhcnkgdG8gcGxheSBhIGdhbWUuAASsIFRoZSBBUEkgdG8gcXVlcnkgdGhlIGRlcG9zaXQgZm9yIGdhbWVwbGF5LgQAUENvbGxlY3RDb2xsYXRpb25JbmZvBFhjb2xsZWN0X2NvbGxhdGlvbl9pbmZvBBhoZWFkZXJcMQ0QnCBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGEgY29sbGF0aW9uLgD0IFRoZSBnaXZlbiBgaGVhZGVyYCBpcyB0aGUgaGVhZGVyIG9mIHRoZSBidWlsdCBibG9jayBmb3IgdGhhdKggd2UgYXJlIGNvbGxlY3RpbmcgdGhlIGNvbGxhdGlvbiBpbmZvIGZvci4AFNggUnVudGltZSBhcGkgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbGxhdGlvbi4ARCBWZXJzaW9uIGhpc3Rvcnk6AQEgLSBWZXJzaW9uIDI6IENoYW5nZWQgW2BTZWxmOjpjb2xsZWN0X2NvbGxhdGlvbl9pbmZvYF0gc2lnbmF0dXJlNQEgLSBWZXJzaW9uIDM6IFNpZ25hbHMgdG8gdGhlIG5vZGUgdG8gdXNlIHZlcnNpb24gMSBvZiBbYFBhcmFjaGFpbkJsb2NrRGF0YWBdLgwAOEdlbmVzaXNCdWlsZGVyDCxidWlsZF9zdGF0ZQQQanNvbhg9DShlASBCdWlsZCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gYSBKU09OIGJsb2Igbm90IHVzaW5nIGFueSBkZWZhdWx0cyBhbmQgc3RvcmUgaXQgaW4gdGhlJCBzdG9yYWdlLgApASBJbiB0aGUgY2FzZSBvZiBhIEZSQU1FLWJhc2VkIHJ1bnRpbWUsIHRoaXMgZnVuY3Rpb24gZGVzZXJpYWxpemVzIHRoZSBmdWxsVQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmcm9tIHRoZSBnaXZlbiBKU09OIGJsb2IgYW5kIHB1dHMgaXQgaW50byB0aGUgc3RvcmFnZS4gSWYgdGhlVQEgcHJvdmlkZWQgSlNPTiBibG9iIGlzIGluY29ycmVjdCBvciBpbmNvbXBsZXRlIG9yIHRoZSBkZXNlcmlhbGl6YXRpb24gZmFpbHMsIGFuIGVycm9yNCBpcyByZXR1cm5lZC4AXQEgUGxlYXNlIG5vdGUgdGhhdCBwcm92aWRlZCBKU09OIGJsb2IgbXVzdCBjb250YWluIGFsbCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZpZWxkcywgbm9cIGRlZmF1bHRzIHdpbGwgYmUgdXNlZC4AKGdldF9wcmVzZXQECGlkQQ2RBThhASBSZXR1cm5zIGEgSlNPTiBibG9iIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsdC1pbiBgUnVudGltZUdlbmVzaXNDb25maWdgIGlkZW50aWZpZWQgYnkYIGBpZGAuAFUBIElmIGBpZGAgaXMgYE5vbmVgIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVmYXVsdEkBIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2Agc3RydWN0IG9mIHRoZSBydW50aW1lLiBJbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgZGVmYXVsdGAgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYC4AIQEgT3RoZXJ3aXNlIGZ1bmN0aW9uIHJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsdC1pbiwgbmFtZWRRASBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldCBpZGVudGlmaWVkIGJ5IGBpZGAsIG9yIGBOb25lYCBpZiBzdWNoIHByZXNldCBkb2VzIG5vdGEBIGV4aXN0LiBSZXR1cm5lZCBgVmVjPHU4PmAgY29udGFpbnMgYnl0ZXMgb2YgSlNPTiBibG9iIChwYXRjaCkgd2hpY2ggY29tcHJpc2VzIGEgbGlzdCBvZk0BIChwb3RlbnRpYWxseSBuZXN0ZWQpIGtleS12YWx1ZSBwYWlycyB0aGF0IGFyZSBpbnRlbmRlZCBmb3IgY3VzdG9taXppbmcgdGhlIGRlZmF1bHRlASBydW50aW1lIGdlbmVzaXMgY29uZmlnLiBUaGUgcGF0Y2ggc2hhbGwgYmUgbWVyZ2VkIChyZmM3Mzg2KSB3aXRoIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uYQEgb2YgdGhlIGRlZmF1bHQgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCB0byBjcmVhdGUgYSBjb21wcmVoZW5zaXZlIGdlbmVzaXMgY29uZmlnIHRoYXQgY2FuhCBiZSB1c2VkIGluIGBidWlsZF9zdGF0ZWAgbWV0aG9kLgAwcHJlc2V0X25hbWVzAEUNEFEBIFJldHVybnMgYSBsaXN0IG9mIGlkZW50aWZpZXJzIGZvciBhdmFpbGFibGUgYnVpbHRpbiBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldHMuAGEBIFRoZSBwcmVzZXRzIGZyb20gdGhlIGxpc3QgY2FuIGJlIHF1ZXJpZWQgd2l0aCBbYEdlbmVzaXNCdWlsZGVyOjpnZXRfcHJlc2V0YF0gbWV0aG9kLiBJZgEBIG5vIG5hbWVkIHByZXNldHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lIHRoZSBsaXN0IGlzIGVtcHR5LgAE8CBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZvciB0aGUgcnVudGltZQQAIEUGSQ0A"; + +export { binMeta as default }; diff --git a/packages/host-papp/.papi/descriptors/dist/people_lite_metadata-DRlJN3X6.js b/packages/host-papp/.papi/descriptors/dist/people_lite_metadata-DRlJN3X6.js deleted file mode 100644 index 1750a3ee..00000000 --- a/packages/host-papp/.papi/descriptors/dist/people_lite_metadata-DRlJN3X6.js +++ /dev/null @@ -1,3 +0,0 @@ -const binMeta = "bWV0YRClDAAMKHNwX3J1bnRpbWUwbXVsdGlhZGRyZXNzME11bHRpQWRkcmVzcwgkQWNjb3VudElkAQQwQWNjb3VudEluZGV4ARABFAhJZAQABAEkQWNjb3VudElkAAAAFEluZGV4BAAUATBBY2NvdW50SW5kZXgAAQAMUmF3BAAYARxWZWM8dTg+AAIAJEFkZHJlc3MzMgQACAEgW3U4OyAzMl0AAwAkQWRkcmVzczIwBAAcASBbdTg7IDIwXQAEAAAEDBxzcF9jb3JlGGNyeXB0byxBY2NvdW50SWQzMgAABAAIASBbdTg7IDMyXQAACAAAAyAAAAAMAAwAAAUDABAAAAQAABQAAAYQABgAAAIMABwAAAMUAAAADAAgCGRuZXh0X3Blb3BsZV9wYXNlb19ydW50aW1lLFJ1bnRpbWVDYWxsAAGAGFN5c3RlbQQAJAGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAPFBhcmFjaGFpblN5c3RlbQQAQAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhY2hhaW5TeXN0ZW0sIFJ1bnRpbWU+AAEAJFRpbWVzdGFtcAQAsAG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUaW1lc3RhbXAsIFJ1bnRpbWU+AAIANFBhcmFjaGFpbkluZm8EALgByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYWNoYWluSW5mbywgUnVudGltZT4AAwAgQmFsYW5jZXMEALwBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAoARE9yaWdpblJlc3RyaWN0aW9uBADUAdkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE9yaWdpblJlc3RyaWN0aW9uLCBSdW50aW1lPgANABhBc3NldHMEANwBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRzLCBSdW50aW1lPgAOACRBc3NldFJhdGUEACkBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AEABEQ29sbGF0b3JTZWxlY3Rpb24EADEBAdkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbGxhdG9yU2VsZWN0aW9uLCBSdW50aW1lPgAVABxTZXNzaW9uBAA1AQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTZXNzaW9uLCBSdW50aW1lPgAWACRYY21wUXVldWUEAEEBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbXBRdWV1ZSwgUnVudGltZT4AHgAsUG9sa2Fkb3RYY20EAEUBAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBvbGthZG90WGNtLCBSdW50aW1lPgAfAChDdW11bHVzWGNtBAAZAwG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDdW11bHVzWGNtLCBSdW50aW1lPgAgADBNZXNzYWdlUXVldWUEAB0DAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1lc3NhZ2VRdWV1ZSwgUnVudGltZT4AIgAcVXRpbGl0eQQAJQMBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AKAAgTXVsdGlzaWcEAIEDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE11bHRpc2lnLCBSdW50aW1lPgApABBTdWRvBACNAwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgAqABRQcm94eQQAkQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+ACwAIElkZW50aXR5BACdAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eSwgUnVudGltZT4AMgAYUGVvcGxlBABJBAGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQZW9wbGUsIFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAFUEAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1vYlJ1bGUsIFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEAF0EAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb29mT2ZJbmssIFJ1bnRpbWU+ADUAEEdhbWUEAH0EAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdhbWUsIFJ1bnRpbWU+ADcAFFNjb3JlBAChBAGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTY29yZSwgUnVudGltZT4AOAAgRHVtbXlEaW0EALkEAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPER1bW15RGltLCBSdW50aW1lPgA7AChQZW9wbGVMaXRlBADRBAG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQZW9wbGVMaXRlLCBSdW50aW1lPgA+ACRSZXNvdXJjZXMEAOEEAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlc291cmNlcywgUnVudGltZT4APwA0Q2h1bmtzTWFuYWdlcgQA7QQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2h1bmtzTWFuYWdlciwgUnVudGltZT4AQAAcTWVtYmVycwQA+QQBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVtYmVycywgUnVudGltZT4AQwAcQ29pbmFnZQQA/QQBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29pbmFnZSwgUnVudGltZT4ARAAcQWlyZHJvcAQAGQUBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QWlyZHJvcCwgUnVudGltZT4APQBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEACUFAeUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE11bHRpQmxvY2tNaWdyYXRpb25zLCBSdW50aW1lPgBiAAAkDDBmcmFtZV9zeXN0ZW0YcGFsbGV0EENhbGwEBFQAASwYcmVtYXJrBAEYcmVtYXJrGAEcVmVjPHU4PgAADGhNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrLgCIQ2FuIGJlIGV4ZWN1dGVkIGJ5IGV2ZXJ5IGBvcmlnaW5gLjhzZXRfaGVhcF9wYWdlcwQBFHBhZ2VzKAEMdTY0AAEE+FNldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBXZWJBc3NlbWJseSBlbnZpcm9ubWVudCdzIGhlYXAuIHNldF9jb2RlBAEQY29kZRgBHFZlYzx1OD4AAgRkU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlLlxzZXRfY29kZV93aXRob3V0X2NoZWNrcwQBEGNvZGUYARxWZWM8dTg+AAMQGQFTZXQgdGhlIG5ldyBydW50aW1lIGNvZGUgd2l0aG91dCBkb2luZyBhbnkgY2hlY2tzIG9mIHRoZSBnaXZlbiBgY29kZWAuAFEBTm90ZSB0aGF0IHJ1bnRpbWUgdXBncmFkZXMgd2lsbCBub3QgcnVuIGlmIHRoaXMgaXMgY2FsbGVkIHdpdGggYSBub3QtaW5jcmVhc2luZyBzcGVjIHZlcnNpb24hLHNldF9zdG9yYWdlBAEUaXRlbXMsATRWZWM8S2V5VmFsdWU+AAQEaFNldCBzb21lIGl0ZW1zIG9mIHN0b3JhZ2UuMGtpbGxfc3RvcmFnZQQBEGtleXM0ASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeBgBDEtleQABHHN1YmtleXM4AQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrGAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDwBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoPAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlGAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLigAAAUGACwAAAIwADAAAAQIGBgANAAAAhgAOAAABQUAPAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQACAEgW3U4OyAzMl0AAEAMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW0YcGFsbGV0EENhbGwEBFQAAQhMc2V0X3ZhbGlkYXRpb25fZGF0YQgBEGRhdGFEAWhCYXNpY1BhcmFjaGFpbkluaGVyZW50RGF0YQABVGluYm91bmRfbWVzc2FnZXNfZGF0YXwBTEluYm91bmRNZXNzYWdlc0RhdGEAACSAU2V0IHRoZSBjdXJyZW50IHZhbGlkYXRpb24gZGF0YS4AQQFUaGlzIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSBwZXIgYmxvY2suIEl0IHdpbGwgcGFuaWMgYXQgdGhlIGZpbmFsaXphdGlvbohwaGFzZSBpZiB0aGUgY2FsbCB3YXMgbm90IGludm9rZWQuANBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgSW5oZXJlbnRgACEBQXMgYSBzaWRlIGVmZmVjdCwgdGhpcyBmdW5jdGlvbiB1cGdyYWRlcyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGZ1bmN0aW9uhGlmIHRoZSBhcHByb3ByaWF0ZSB0aW1lIGhhcyBjb21lLmBzdWRvX3NlbmRfdXB3YXJkX21lc3NhZ2UEARxtZXNzYWdlGAE0VXB3YXJkTWVzc2FnZQABAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5EDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudGhCYXNpY1BhcmFjaGFpbkluaGVyZW50RGF0YQAAEAE8dmFsaWRhdGlvbl9kYXRhSAFcUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGEAAURyZWxheV9jaGFpbl9zdGF0ZVABVHNwX3RyaWU6OlN0b3JhZ2VQcm9vZgABYHJlbGF5X3BhcmVudF9kZXNjZW5kYW50c1gBQFZlYzxSZWxheUhlYWRlcj4AAUBjb2xsYXRvcl9wZWVyX2lkdAFYT3B0aW9uPEFwcHJvdmVkUGVlcklkPgAASAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OVxQZXJzaXN0ZWRWYWxpZGF0aW9uRGF0YQgESAE8BE4BOAAQASxwYXJlbnRfaGVhZEwBIEhlYWREYXRhAAFMcmVsYXlfcGFyZW50X251bWJlcjgBBE4AAWRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290PAEESAABMG1heF9wb3Zfc2l6ZTgBDHUzMgAATAx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcyBIZWFkRGF0YQAABAAYARxWZWM8dTg+AABQDBxzcF90cmllNHN0b3JhZ2VfcHJvb2YwU3RvcmFnZVByb29mAAAEASh0cmllX25vZGVzVAFEQlRyZWVTZXQ8VmVjPHU4Pj4AAFQEIEJUcmVlU2V0BARUARgABAA0AAAAWAAAAlwAXBAoc3BfcnVudGltZRxnZW5lcmljGGhlYWRlchhIZWFkZXIIGE51bWJlcgE4EEhhc2gAABQBLHBhcmVudF9oYXNoPAEwSGFzaDo6T3V0cHV0AAEYbnVtYmVyYAEYTnVtYmVyAAEoc3RhdGVfcm9vdDwBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDwBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdGQBGERpZ2VzdAAAYAAABjgAZBAoc3BfcnVudGltZRxnZW5lcmljGGRpZ2VzdBhEaWdlc3QAAAQBEGxvZ3NoATxWZWM8RGlnZXN0SXRlbT4AAGgAAAJsAGwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QoRGlnZXN0SXRlbQABFChQcmVSdW50aW1lCABwAURDb25zZW5zdXNFbmdpbmVJZAAAGAEcVmVjPHU4PgAGACRDb25zZW5zdXMIAHABRENvbnNlbnN1c0VuZ2luZUlkAAAYARxWZWM8dTg+AAQAEFNlYWwIAHABRENvbnNlbnN1c0VuZ2luZUlkAAAYARxWZWM8dTg+AAUAFE90aGVyBAAYARxWZWM8dTg+AAAAZFJ1bnRpbWVFbnZpcm9ubWVudFVwZGF0ZWQACAAAcAAAAwQAAAAMAHQEGE9wdGlvbgQEVAF4AQgQTm9uZQAAABBTb21lBAB4AAABAAB4DExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAAfAx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUhwYXJhY2hhaW5faW5oZXJlbnRMSW5ib3VuZE1lc3NhZ2VzRGF0YQAACAFEZG93bndhcmRfbWVzc2FnZXOAAXxBYnJpZGdlZEluYm91bmREb3dud2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc5QBbEFicmlkZ2VkSW5ib3VuZEhybXBNZXNzYWdlcwAAgAx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUhwYXJhY2hhaW5faW5oZXJlbnSEQWJyaWRnZWRJbmJvdW5kTWVzc2FnZXNDb2xsZWN0aW9uBBxNZXNzYWdlAYQACAE0ZnVsbF9tZXNzYWdlc4gBMFZlYzxNZXNzYWdlPgABPGhhc2hlZF9tZXNzYWdlc4wBfFZlYzxNZXNzYWdlOjpDb21wcmVzc2VkTWVzc2FnZT4AAIQIYHBvbGthZG90X2NvcmVfcHJpbWl0aXZlc1hJbmJvdW5kRG93bndhcmRNZXNzYWdlBCxCbG9ja051bWJlcgE4AAgBHHNlbnRfYXQ4ASxCbG9ja051bWJlcgABDG1zZxgBPERvd253YXJkTWVzc2FnZQAAiAAAAoQAjAAAApAAkAiUY3VtdWx1c19wcmltaXRpdmVzX3BhcmFjaGFpbl9pbmhlcmVudDRIYXNoZWRNZXNzYWdlAAAIARxzZW50X2F0OAFUUmVsYXlDaGFpbkJsb2NrTnVtYmVyAAEgbXNnX2hhc2g8ATRzcF9jb3JlOjpIMjU2AACUDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudIRBYnJpZGdlZEluYm91bmRNZXNzYWdlc0NvbGxlY3Rpb24EHE1lc3NhZ2UBmAAIATRmdWxsX21lc3NhZ2VzpAEwVmVjPE1lc3NhZ2U+AAE8aGFzaGVkX21lc3NhZ2VzqAF8VmVjPE1lc3NhZ2U6OkNvbXByZXNzZWRNZXNzYWdlPgAAmAAABAicoACcDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzCElkAAAEADgBDHUzMgAAoAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzSEluYm91bmRIcm1wTWVzc2FnZQQsQmxvY2tOdW1iZXIBOAAIARxzZW50X2F0OAEsQmxvY2tOdW1iZXIAARBkYXRhGAFMYWxsb2M6OnZlYzo6VmVjPHU4PgAApAAAApgAqAAAAqwArAAABAickACwDEBwYWxsZXRfdGltZXN0YW1wGHBhbGxldBBDYWxsBARUAAEEDHNldAQBDG5vd7QBJFQ6Ok1vbWVudAAATFRTZXQgdGhlIGN1cnJlbnQgdGltZS4AVQFUaGlzIGNhbGwgc2hvdWxkIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIHBlciBibG9jay4gSXQgd2lsbCBwYW5pYyBhdCB0aGUgZmluYWxpemF0aW9u1HBoYXNlLCBpZiB0aGlzIGNhbGwgaGFzbid0IGJlZW4gaW52b2tlZCBieSB0aGF0IHRpbWUuAEEBVGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91cyBvbmUgYnkgdGhlIGFtb3VudCBzcGVjaWZpZWQgYnloW2BDb25maWc6Ok1pbmltdW1QZXJpb2RgXS4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Ob25lXy4AUQFUaGlzIGRpc3BhdGNoIGNsYXNzIGlzIF9NYW5kYXRvcnlfIHRvIGVuc3VyZSBpdCBnZXRzIGV4ZWN1dGVkIGluIHRoZSBibG9jay4gQmUgYXdhcmVRAXRoYXQgY2hhbmdpbmcgdGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBjYWxsIGNvdWxkIHJlc3VsdCBleGhhdXN0aW5nIHRoZSByZXNvdXJjZXMgaW4gYYRibG9jayB0byBleGVjdXRlIGFueSBvdGhlciBjYWxscy4ANCMjIENvbXBsZXhpdHkxAS0gYE8oMSlgIChOb3RlIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mIGBPblRpbWVzdGFtcFNldGAgbXVzdCBhbHNvIGJlIGBPKDEpYClVAS0gMSBzdG9yYWdlIHJlYWQgYW5kIDEgc3RvcmFnZSBtdXRhdGlvbiAoY29kZWMgYE8oMSlgIGJlY2F1c2Ugb2YgYERpZFVwZGF0ZTo6dGFrZWAgaW5AICBgb25fZmluYWxpemVgKdQtIDEgZXZlbnQgaGFuZGxlciBgb25fdGltZXN0YW1wX3NldGAuIE11c3QgYmUgYE8oMSlgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy60AAAGKAC4DFhzdGFnaW5nX3BhcmFjaGFpbl9pbmZvGHBhbGxldBBDYWxsBARUAAEABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrwMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQQQ2FsbAgEVAAESQABJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAgBEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVlwAEoVDo6QmFsYW5jZQAAHNRUcmFuc2ZlciBzb21lIGxpcXVpZCBmcmVlIGJhbGFuY2UgdG8gYW5vdGhlciBhY2NvdW50LgA1AWB0cmFuc2Zlcl9hbGxvd19kZWF0aGAgd2lsbCBzZXQgdGhlIGBGcmVlQmFsYW5jZWAgb2YgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuEQFJZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCBpcyBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdLBvZiB0aGUgdHJhbnNmZXIsIHRoZSBhY2NvdW50IHdpbGwgYmUgcmVhcGVkLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBTaWduZWRgIGJ5IHRoZSB0cmFuc2FjdG9yLjhmb3JjZV90cmFuc2ZlcgwBGHNvdXJjZQABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQZGVzdAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXAAShUOjpCYWxhbmNlAAIIYQFFeGFjdGx5IGFzIGB0cmFuc2Zlcl9hbGxvd19kZWF0aGAsIGV4Y2VwdCB0aGUgb3JpZ2luIG11c3QgYmUgcm9vdCBhbmQgdGhlIHNvdXJjZSBhY2NvdW50RG1heSBiZSBzcGVjaWZpZWQuTHRyYW5zZmVyX2tlZXBfYWxpdmUIARBkZXN0AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZcABKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKGtlZXBfYWxpdmXIARBib29sAAQ8BQFUcmFuc2ZlciB0aGUgZW50aXJlIHRyYW5zZmVyYWJsZSBiYWxhbmNlIGZyb20gdGhlIGNhbGxlciBhY2NvdW50LgBZAU5PVEU6IFRoaXMgZnVuY3Rpb24gb25seSBhdHRlbXB0cyB0byB0cmFuc2ZlciBfdHJhbnNmZXJhYmxlXyBiYWxhbmNlcy4gVGhpcyBtZWFucyB0aGF0YQFhbnkgbG9ja2VkLCByZXNlcnZlZCwgb3IgZXhpc3RlbnRpYWwgZGVwb3NpdHMgKHdoZW4gYGtlZXBfYWxpdmVgIGlzIGB0cnVlYCksIHdpbGwgbm90IGJlXQF0cmFuc2ZlcnJlZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJlc3VsdHMgaW4gYSBraWxsZWQgYWNjb3VudCxFAXlvdSBtaWdodCBuZWVkIHRvIHByZXBhcmUgdGhlIGFjY291bnQgYnkgcmVtb3ZpbmcgYW55IHJlZmVyZW5jZSBjb3VudGVycywgc3RvcmFnZUBkZXBvc2l0cywgZXRjLi4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFNpZ25lZC4AoC0gYGRlc3RgOiBUaGUgcmVjaXBpZW50IG9mIHRoZSB0cmFuc2Zlci5ZAS0gYGtlZXBfYWxpdmVgOiBBIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBgdHJhbnNmZXJfYWxsYCBvcGVyYXRpb24gc2hvdWxkIHNlbmQgYWxsTQEgIG9mIHRoZSBmdW5kcyB0aGUgYWNjb3VudCBoYXMsIGNhdXNpbmcgdGhlIHNlbmRlciBhY2NvdW50IHRvIGJlIGtpbGxlZCAoZmFsc2UpLCBvclkBICB0cmFuc2ZlciBldmVyeXRoaW5nIGV4Y2VwdCBhdCBsZWFzdCB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCwgd2hpY2ggd2lsbCBndWFyYW50ZWUgdG+cICBrZWVwIHRoZSBzZW5kZXIgYWNjb3VudCBhbGl2ZSAodHJ1ZSkuPGZvcmNlX3VucmVzZXJ2ZQgBDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50xAEoVDo6QmFsYW5jZQAFDLBVbnJlc2VydmUgc29tZSBiYWxhbmNlIGZyb20gYSB1c2VyIGJ5IGZvcmNlLgBsQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJPT1QuQHVwZ3JhZGVfYWNjb3VudHMEAQx3aG/MAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBuZXdfZnJlZcABKFQ6OkJhbGFuY2UACAysU2V0IHRoZSByZWd1bGFyIGJhbGFuY2Ugb2YgYSBnaXZlbiBhY2NvdW50LgCwVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIGlzIGByb290YC5sZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlCAEkZGlyZWN0aW9u0AFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRhwAEoVDo6QmFsYW5jZQAJFLhBZGp1c3QgdGhlIHRvdGFsIGlzc3VhbmNlIGluIGEgc2F0dXJhdGluZyB3YXkuAPxDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbmQgYWx3YXlzIG5lZWRzIGEgcG9zaXRpdmUgYGRlbHRhYC4AJCMgRXhhbXBsZRBidXJuCAEUdmFsdWXAAShUOjpCYWxhbmNlAAEoa2VlcF9hbGl2ZcgBEGJvb2wAChz8QnVybiB0aGUgc3BlY2lmaWVkIGxpcXVpZCBmcmVlIGJhbGFuY2UgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQuACUBSWYgdGhlIG9yaWdpbidzIGFjY291bnQgZW5kcyB1cCBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdAkBb2YgdGhlIGJ1cm4gYW5kIGBrZWVwX2FsaXZlYCBpcyBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuAFEBVW5saWtlIHNlbmRpbmcgZnVuZHMgdG8gYSBfYnVybl8gYWRkcmVzcywgd2hpY2ggbWVyZWx5IG1ha2VzIHRoZSBmdW5kcyBpbmFjY2Vzc2libGUsIQF0aGlzIGBidXJuYCBvcGVyYXRpb24gd2lsbCByZWR1Y2UgdG90YWwgaXNzdWFuY2UgYnkgdGhlIGFtb3VudCBfYnVybmVkXy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuwAAABsQAxAAABQcAyAAABQAAzAAAAgQA0Aw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzTEFkanVzdG1lbnREaXJlY3Rpb24AAQggSW5jcmVhc2UAAAAgRGVjcmVhc2UAAQAA1Ax8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbhhwYWxsZXQQQ2FsbAQEVAABBCxjbGVhbl91c2FnZQQBGGVudGl0edgBTFQ6OlJlc3RyaWN0ZWRFbnRpdHkAAQhJAUFsbG93IHRvIGNsZWFuIHVzYWdlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgd2hlbiBpdCBpcyB6ZXJvIG9yIHdoZW4gdGhlcmUgaXMgbm+QbG9uZ2VyIGFueSBhbGxvd2FuY2UgZm9yIHRoZSBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtgIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWVAUmVzdHJpY3RlZEVudGl0eQABGDRQZXJzb25hbEFsaWFzBAAIARRBbGlhcwAAAEBQZXJzb25hbElkZW50aXR5BAAoAQx1NjQAAQBEUmVmZXJyZWRDYW5kaWRhdGUEAAQBJEFjY291bnRJZAACAEhBY2NvdW50UGFydGljaXBhbnQEAAQBJEFjY291bnRJZAADAEBJbnZpdGVkQ2FuZGlkYXRlBAAEASRBY2NvdW50SWQABAAoTGl0ZVBlcnNvbgQABAEkQWNjb3VudElkAAUAANwMNHBhbGxldF9hc3NldHMYcGFsbGV0EENhbGwIBFQABEkAAYgYY3JlYXRlDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEUYWRtaW4AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLG1pbl9iYWxhbmNlxAEoVDo6QmFsYW5jZQAATOhJc3N1ZSBhIG5ldyBjbGFzcyBvZiBmdW5naWJsZSBhc3NldHMgZnJvbSBhIHB1YmxpYyBvcmlnaW4uACUBVGhpcyBuZXcgYXNzZXQgY2xhc3MgaGFzIG5vIGFzc2V0cyBpbml0aWFsbHkgYW5kIGl0cyBvd25lciBpcyB0aGUgb3JpZ2luLgBhAVRoZSBvcmlnaW4gbXVzdCBjb25mb3JtIHRvIHRoZSBjb25maWd1cmVkIGBDcmVhdGVPcmlnaW5gIGFuZCBoYXZlIHN1ZmZpY2llbnQgZnVuZHMgZnJlZS4AvEZ1bmRzIG9mIHNlbmRlciBhcmUgcmVzZXJ2ZWQgYnkgYEFzc2V0RGVwb3NpdGAuACxQYXJhbWV0ZXJzOlkBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbmV3IGFzc2V0LiBUaGlzIG11c3Qgbm90IGJlIGN1cnJlbnRseSBpbiB1c2UgdG8gaWRlbnRpZnkxAWFuIGV4aXN0aW5nIGFzc2V0LiBJZiBbYE5leHRBc3NldElkYF0gaXMgc2V0LCB0aGVuIHRoaXMgbXVzdCBiZSBlcXVhbCB0byBpdC5ZAS0gYGFkbWluYDogVGhlIGFkbWluIG9mIHRoaXMgY2xhc3Mgb2YgYXNzZXRzLiBUaGUgYWRtaW4gaXMgdGhlIGluaXRpYWwgYWRkcmVzcyBvZiBlYWNonG1lbWJlciBvZiB0aGUgYXNzZXQgY2xhc3MncyBhZG1pbiB0ZWFtLk0BLSBgbWluX2JhbGFuY2VgOiBUaGUgbWluaW11bSBiYWxhbmNlIG9mIHRoaXMgbmV3IGFzc2V0IHRoYXQgYW55IHNpbmdsZSBhY2NvdW50IG11c3Q9AWhhdmUuIElmIGFuIGFjY291bnQncyBiYWxhbmNlIGlzIHJlZHVjZWQgYmVsb3cgdGhpcywgdGhlbiBpdCBjb2xsYXBzZXMgdG8gemVyby4AmEVtaXRzIGBDcmVhdGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuADhXZWlnaHQ6IGBPKDEpYDBmb3JjZV9jcmVhdGUQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARRvd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAE0aXNfc3VmZmljaWVudMgBEGJvb2wAASxtaW5fYmFsYW5jZcABKFQ6OkJhbGFuY2UAAUz4SXNzdWUgYSBuZXcgY2xhc3Mgb2YgZnVuZ2libGUgYXNzZXRzIGZyb20gYSBwcml2aWxlZ2VkIG9yaWdpbi4AtFRoaXMgbmV3IGFzc2V0IGNsYXNzIGhhcyBubyBhc3NldHMgaW5pdGlhbGx5LgCkVGhlIG9yaWdpbiBtdXN0IGNvbmZvcm0gdG8gYEZvcmNlT3JpZ2luYC4AnFVubGlrZSBgY3JlYXRlYCwgbm8gZnVuZHMgYXJlIHJlc2VydmVkLgBZAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIG5ldyBhc3NldC4gVGhpcyBtdXN0IG5vdCBiZSBjdXJyZW50bHkgaW4gdXNlIHRvIGlkZW50aWZ5MQFhbiBleGlzdGluZyBhc3NldC4gSWYgW2BOZXh0QXNzZXRJZGBdIGlzIHNldCwgdGhlbiB0aGlzIG11c3QgYmUgZXF1YWwgdG8gaXQuWQEtIGBvd25lcmA6IFRoZSBvd25lciBvZiB0aGlzIGNsYXNzIG9mIGFzc2V0cy4gVGhlIG93bmVyIGhhcyBmdWxsIHN1cGVydXNlciBwZXJtaXNzaW9ucyUBb3ZlciB0aGlzIGFzc2V0LCBidXQgbWF5IGxhdGVyIGNoYW5nZSBhbmQgY29uZmlndXJlIHRoZSBwZXJtaXNzaW9ucyB1c2luZ5BgdHJhbnNmZXJfb3duZXJzaGlwYCBhbmQgYHNldF90ZWFtYC5NAS0gYG1pbl9iYWxhbmNlYDogVGhlIG1pbmltdW0gYmFsYW5jZSBvZiB0aGlzIG5ldyBhc3NldCB0aGF0IGFueSBzaW5nbGUgYWNjb3VudCBtdXN0PQFoYXZlLiBJZiBhbiBhY2NvdW50J3MgYmFsYW5jZSBpcyByZWR1Y2VkIGJlbG93IHRoaXMsIHRoZW4gaXQgY29sbGFwc2VzIHRvIHplcm8uAKxFbWl0cyBgRm9yY2VDcmVhdGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuADhXZWlnaHQ6IGBPKDEpYDRzdGFydF9kZXN0cm95BAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAIw3FN0YXJ0IHRoZSBwcm9jZXNzIG9mIGRlc3Ryb3lpbmcgYSBmdW5naWJsZSBhc3NldCBjbGFzcy4AWQFgc3RhcnRfZGVzdHJveWAgaXMgdGhlIGZpcnN0IGluIGEgc2VyaWVzIG9mIGV4dHJpbnNpY3MgdGhhdCBzaG91bGQgYmUgY2FsbGVkLCB0byBhbGxvd3hkZXN0cnVjdGlvbiBvZiBhbiBhc3NldCBjbGFzcy4AUQFUaGUgb3JpZ2luIG11c3QgY29uZm9ybSB0byBgRm9yY2VPcmlnaW5gIG9yIG11c3QgYmUgYFNpZ25lZGAgYnkgdGhlIGFzc2V0J3MgYG93bmVyYC4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgBJAUl0IHdpbGwgZmFpbCB3aXRoIGVpdGhlciBbYEVycm9yOjpDb250YWluc0hvbGRzYF0gb3IgW2BFcnJvcjo6Q29udGFpbnNGcmVlemVzYF0gaWa4YW4gYWNjb3VudCBjb250YWlucyBob2xkcyBvciBmcmVlemVzIGluIHBsYWNlLkBkZXN0cm95X2FjY291bnRzBAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAMwzERlc3Ryb3kgYWxsIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFzc2V0LgBdAWBkZXN0cm95X2FjY291bnRzYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYHN0YXJ0X2Rlc3Ryb3lgIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHRoZYRhc3NldCBpcyBpbiBhIGBEZXN0cm95aW5nYCBzdGF0ZS4AXQFEdWUgdG8gd2VpZ2h0IHJlc3RyaWN0aW9ucywgdGhpcyBmdW5jdGlvbiBtYXkgbmVlZCB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gZnVsbHkxAWRlc3Ryb3kgYWxsIGFjY291bnRzLiBJdCB3aWxsIGRlc3Ryb3kgYFJlbW92ZUl0ZW1zTGltaXRgIGFjY291bnRzIGF0IGEgdGltZS4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgDURWFjaCBjYWxsIGVtaXRzIHRoZSBgRXZlbnQ6OkRlc3Ryb3llZEFjY291bnRzYCBldmVudC5EZGVzdHJveV9hcHByb3ZhbHMEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIABDBhAURlc3Ryb3kgYWxsIGFwcHJvdmFscyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhc3NldCB1cCB0byB0aGUgbWF4IChUOjpSZW1vdmVJdGVtc0xpbWl0KS4AYQFgZGVzdHJveV9hcHByb3ZhbHNgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBgc3RhcnRfZGVzdHJveWAgaGFzIGJlZW4gY2FsbGVkLCBhbmQgdGhlhGFzc2V0IGlzIGluIGEgYERlc3Ryb3lpbmdgIHN0YXRlLgBdAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBmdWxseTkBZGVzdHJveSBhbGwgYXBwcm92YWxzLiBJdCB3aWxsIGRlc3Ryb3kgYFJlbW92ZUl0ZW1zTGltaXRgIGFwcHJvdmFscyBhdCBhIHRpbWUuAE0BLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgZGVzdHJveWVkLiBUaGlzIG11c3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgICBhc3NldC4A2EVhY2ggY2FsbCBlbWl0cyB0aGUgYEV2ZW50OjpEZXN0cm95ZWRBcHByb3ZhbHNgIGV2ZW50LjhmaW5pc2hfZGVzdHJveQQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgAFKMRDb21wbGV0ZSBkZXN0cm95aW5nIGFzc2V0IGFuZCB1bnJlc2VydmUgY3VycmVuY3kuAFUBYGZpbmlzaF9kZXN0cm95YCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYHN0YXJ0X2Rlc3Ryb3lgIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHRoZVkBYXNzZXQgaXMgaW4gYSBgRGVzdHJveWluZ2Agc3RhdGUuIEFsbCBhY2NvdW50cyBvciBhcHByb3ZhbHMgc2hvdWxkIGJlIGRlc3Ryb3llZCBiZWZvcmUUaGFuZC4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgDgRWFjaCBzdWNjZXNzZnVsIGNhbGwgZW1pdHMgdGhlIGBFdmVudDo6RGVzdHJveWVkYCBldmVudC4QbWludAwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABLGJlbmVmaWNpYXJ5AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlAAYwiE1pbnQgYXNzZXRzIG9mIGEgcGFydGljdWxhciBjbGFzcy4AOQFUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIElzc3VlciBvZiB0aGUgYXNzZXQgYGlkYC4A/C0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGhhdmUgc29tZSBhbW91bnQgbWludGVkLg0BLSBgYmVuZWZpY2lhcnlgOiBUaGUgYWNjb3VudCB0byBiZSBjcmVkaXRlZCB3aXRoIHRoZSBtaW50ZWQgYXNzZXRzLsQtIGBhbW91bnRgOiBUaGUgYW1vdW50IG9mIHRoZSBhc3NldCB0byBiZSBtaW50ZWQuAJRFbWl0cyBgSXNzdWVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuADhXZWlnaHQ6IGBPKDEpYFUBTW9kZXM6IFByZS1leGlzdGluZyBiYWxhbmNlIG9mIGBiZW5lZmljaWFyeWA7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZiBgYmVuZWZpY2lhcnlgLhBidXJuDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlAAc8RQFSZWR1Y2UgdGhlIGJhbGFuY2Ugb2YgYHdob2AgYnkgYXMgbXVjaCBhcyBwb3NzaWJsZSB1cCB0byBgYW1vdW50YCBhc3NldHMgb2YgYGlkYC4ANQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBNYW5hZ2VyIG9mIHRoZSBhc3NldCBgaWRgLgDQQmFpbHMgd2l0aCBgTm9BY2NvdW50YCBpZiB0aGUgYHdob2AgaXMgYWxyZWFkeSBkZWFkLgD8LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCBidXJuZWQuoC0gYHdob2A6IFRoZSBhY2NvdW50IHRvIGJlIGRlYml0ZWQgZnJvbS4pAS0gYGFtb3VudGA6IFRoZSBtYXhpbXVtIGFtb3VudCBieSB3aGljaCBgd2hvYCdzIGJhbGFuY2Ugc2hvdWxkIGJlIHJlZHVjZWQuAFEBRW1pdHMgYEJ1cm5lZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCBidXJuZWQuIElmIHRoaXMgdGFrZXMgdGhlIGJhbGFuY2UgdG8gYmVsb3cgdGhlOQFtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCBidXJuZWQgaXMgaW5jcmVhc2VkIHRvIHRha2UgaXQgdG8gemVyby4AOFdlaWdodDogYE8oMSlgCQFNb2RlczogUG9zdC1leGlzdGVuY2Ugb2YgYHdob2A7IFByZSAmIHBvc3QgWm9tYmllLXN0YXR1cyBvZiBgd2hvYC4gdHJhbnNmZXIMAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UACEjQTW92ZSBzb21lIGFzc2V0cyBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudCB0byBhbm90aGVyLgBYT3JpZ2luIG11c3QgYmUgU2lnbmVkLgARAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGhhdmUgc29tZSBhbW91bnQgdHJhbnNmZXJyZWQunC0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRvIGJlIGNyZWRpdGVkLlEBLSBgYW1vdW50YDogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VuZGVyJ3MgYmFsYW5jZSBvZiBhc3NldHMgc2hvdWxkIGJlIHJlZHVjZWQgYW5kYQFgdGFyZ2V0YCdzIGJhbGFuY2UgaW5jcmVhc2VkLiBUaGUgYW1vdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkIG1heSBiZSBzbGlnaHRseSBncmVhdGVyIGluXQF0aGUgY2FzZSB0aGF0IHRoZSB0cmFuc2ZlciB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgc2VuZGVyIGJhbGFuY2UgYWJvdmUgemVybyBidXQgYmVsb3e8dGhlIG1pbmltdW0gYmFsYW5jZS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4AYQFFbWl0cyBgVHJhbnNmZXJyZWRgIHdpdGggdGhlIGFjdHVhbCBhbW91bnQgdHJhbnNmZXJyZWQuIElmIHRoaXMgdGFrZXMgdGhlIHNvdXJjZSBiYWxhbmNlXQF0byBiZWxvdyB0aGUgbWluaW11bSBmb3IgdGhlIGFzc2V0LCB0aGVuIHRoZSBhbW91bnQgdHJhbnNmZXJyZWQgaXMgaW5jcmVhc2VkIHRvIHRha2UgaXQgdG8gemVyby4AOFdlaWdodDogYE8oMSlgUQFNb2RlczogUHJlLWV4aXN0ZW5jZSBvZiBgdGFyZ2V0YDsgUG9zdC1leGlzdGVuY2Ugb2Ygc2VuZGVyOyBBY2NvdW50IHByZS1leGlzdGVuY2Ugb2YkYHRhcmdldGAuTHRyYW5zZmVyX2tlZXBfYWxpdmUMAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UACUhZAU1vdmUgc29tZSBhc3NldHMgZnJvbSB0aGUgc2VuZGVyIGFjY291bnQgdG8gYW5vdGhlciwga2VlcGluZyB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUuAFhPcmlnaW4gbXVzdCBiZSBTaWduZWQuABEBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCB0cmFuc2ZlcnJlZC6cLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gYmUgY3JlZGl0ZWQuUQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzZW5kZXIncyBiYWxhbmNlIG9mIGFzc2V0cyBzaG91bGQgYmUgcmVkdWNlZCBhbmRhAWB0YXJnZXRgJ3MgYmFsYW5jZSBpbmNyZWFzZWQuIFRoZSBhbW91bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgbWF5IGJlIHNsaWdodGx5IGdyZWF0ZXIgaW5dAXRoZSBjYXNlIHRoYXQgdGhlIHRyYW5zZmVyIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBzZW5kZXIgYmFsYW5jZSBhYm92ZSB6ZXJvIGJ1dCBiZWxvd7x0aGUgbWluaW11bSBiYWxhbmNlLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgBhAUVtaXRzIGBUcmFuc2ZlcnJlZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCB0cmFuc2ZlcnJlZC4gSWYgdGhpcyB0YWtlcyB0aGUgc291cmNlIGJhbGFuY2VdAXRvIGJlbG93IHRoZSBtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBpcyBpbmNyZWFzZWQgdG8gdGFrZSBpdCB0byB6ZXJvLgA4V2VpZ2h0OiBgTygxKWBRAU1vZGVzOiBQcmUtZXhpc3RlbmNlIG9mIGB0YXJnZXRgOyBQb3N0LWV4aXN0ZW5jZSBvZiBzZW5kZXI7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZiRgdGFyZ2V0YC44Zm9yY2VfdHJhbnNmZXIQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARhzb3VyY2UAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UACky0TW92ZSBzb21lIGFzc2V0cyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXIuAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgQWRtaW4gb2YgdGhlIGFzc2V0IGBpZGAuABEBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCB0cmFuc2ZlcnJlZC6YLSBgc291cmNlYDogVGhlIGFjY291bnQgdG8gYmUgZGViaXRlZC6ULSBgZGVzdGA6IFRoZSBhY2NvdW50IHRvIGJlIGNyZWRpdGVkLlkBLSBgYW1vdW50YDogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgYHNvdXJjZWAncyBiYWxhbmNlIG9mIGFzc2V0cyBzaG91bGQgYmUgcmVkdWNlZCBhbmRZAWBkZXN0YCdzIGJhbGFuY2UgaW5jcmVhc2VkLiBUaGUgYW1vdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkIG1heSBiZSBzbGlnaHRseSBncmVhdGVyIGluTQF0aGUgY2FzZSB0aGF0IHRoZSB0cmFuc2ZlciB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgYHNvdXJjZWAgYmFsYW5jZSBhYm92ZSB6ZXJvIGJ1dNRiZWxvdyB0aGUgbWluaW11bSBiYWxhbmNlLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgBhAUVtaXRzIGBUcmFuc2ZlcnJlZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCB0cmFuc2ZlcnJlZC4gSWYgdGhpcyB0YWtlcyB0aGUgc291cmNlIGJhbGFuY2VdAXRvIGJlbG93IHRoZSBtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBpcyBpbmNyZWFzZWQgdG8gdGFrZSBpdCB0byB6ZXJvLgA4V2VpZ2h0OiBgTygxKWBRAU1vZGVzOiBQcmUtZXhpc3RlbmNlIG9mIGBkZXN0YDsgUG9zdC1leGlzdGVuY2Ugb2YgYHNvdXJjZWA7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZhxgZGVzdGAuGGZyZWV6ZQgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAswVQFEaXNhbGxvdyBmdXJ0aGVyIHVucHJpdmlsZWdlZCB0cmFuc2ZlcnMgb2YgYW4gYXNzZXQgYGlkYCBmcm9tIGFuIGFjY291bnQgYHdob2AuIGB3aG9gTQFtdXN0IGFscmVhZHkgZXhpc3QgYXMgYW4gZW50cnkgaW4gYEFjY291bnRgcyBvZiB0aGUgYXNzZXQuIElmIHlvdSB3YW50IHRvIGZyZWV6ZSBhbvRhY2NvdW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBlbnRyeSwgdXNlIGB0b3VjaF9vdGhlcmAgZmlyc3QuADUBT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgRnJlZXplciBvZiB0aGUgYXNzZXQgYGlkYC4AxC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGZyb3plbi6ILSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgZnJvemVuLgA8RW1pdHMgYEZyb3plbmAuADhXZWlnaHQ6IGBPKDEpYBB0aGF3CAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4ADCjoQWxsb3cgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyB0byBhbmQgZnJvbSBhbiBhY2NvdW50IGFnYWluLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEFkbWluIG9mIHRoZSBhc3NldCBgaWRgLgDELSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgZnJvemVuLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1bmZyb3plbi4APEVtaXRzIGBUaGF3ZWRgLgA4V2VpZ2h0OiBgTygxKWAwZnJlZXplX2Fzc2V0BAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAA0k8ERpc2FsbG93IGZ1cnRoZXIgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyBmb3IgdGhlIGFzc2V0IGNsYXNzLgA1AU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEZyZWV6ZXIgb2YgdGhlIGFzc2V0IGBpZGAuAMQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBmcm96ZW4uADxFbWl0cyBgRnJvemVuYC4AOFdlaWdodDogYE8oMSlgKHRoYXdfYXNzZXQEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIADiTEQWxsb3cgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyBmb3IgdGhlIGFzc2V0IGFnYWluLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEFkbWluIG9mIHRoZSBhc3NldCBgaWRgLgDELSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgdGhhd2VkLgA8RW1pdHMgYFRoYXdlZGAuADhXZWlnaHQ6IGBPKDEpYEh0cmFuc2Zlcl9vd25lcnNoaXAIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARRvd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AA8odENoYW5nZSB0aGUgT3duZXIgb2YgYW4gYXNzZXQuAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgT3duZXIgb2YgdGhlIGFzc2V0IGBpZGAuAJAtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldC6cLSBgb3duZXJgOiBUaGUgbmV3IE93bmVyIG9mIHRoaXMgYXNzZXQuAFRFbWl0cyBgT3duZXJDaGFuZ2VkYC4AOFdlaWdodDogYE8oMSlgIHNldF90ZWFtEAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEYaXNzdWVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRhZG1pbgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcZnJlZXplcgABUEFjY291bnRJZExvb2t1cE9mPFQ+ABAwxENoYW5nZSB0aGUgSXNzdWVyLCBBZG1pbiBhbmQgRnJlZXplciBvZiBhbiBhc3NldC4ALQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4AxC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGZyb3plbi6kLSBgaXNzdWVyYDogVGhlIG5ldyBJc3N1ZXIgb2YgdGhpcyBhc3NldC6cLSBgYWRtaW5gOiBUaGUgbmV3IEFkbWluIG9mIHRoaXMgYXNzZXQurC0gYGZyZWV6ZXJgOiBUaGUgbmV3IEZyZWV6ZXIgb2YgdGhpcyBhc3NldC4AUEVtaXRzIGBUZWFtQ2hhbmdlZGAuADhXZWlnaHQ6IGBPKDEpYDBzZXRfbWV0YWRhdGEQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARBuYW1lGAEcVmVjPHU4PgABGHN5bWJvbBgBHFZlYzx1OD4AASBkZWNpbWFscwwBCHU4ABFAeFNldCB0aGUgbWV0YWRhdGEgZm9yIGFuIGFzc2V0LgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIE93bmVyIG9mIHRoZSBhc3NldCBgaWRgLgDYRnVuZHMgb2Ygc2VuZGVyIGFyZSByZXNlcnZlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6UQFgTWV0YWRhdGFEZXBvc2l0QmFzZSArIE1ldGFkYXRhRGVwb3NpdFBlckJ5dGUgKiAobmFtZS5sZW4gKyBzeW1ib2wubGVuKWAgdGFraW5nIGludG+MYWNjb3VudCBhbnkgYWxyZWFkeSByZXNlcnZlZCBmdW5kcy4AuC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIHVwZGF0ZS5NAS0gYG5hbWVgOiBUaGUgdXNlciBmcmllbmRseSBuYW1lIG9mIHRoaXMgYXNzZXQuIExpbWl0ZWQgaW4gbGVuZ3RoIGJ5IGBTdHJpbmdMaW1pdGAuTQEtIGBzeW1ib2xgOiBUaGUgZXhjaGFuZ2Ugc3ltYm9sIGZvciB0aGlzIGFzc2V0LiBMaW1pdGVkIGluIGxlbmd0aCBieSBgU3RyaW5nTGltaXRgLi0BLSBgZGVjaW1hbHNgOiBUaGUgbnVtYmVyIG9mIGRlY2ltYWxzIHRoaXMgYXNzZXQgdXNlcyB0byByZXByZXNlbnQgb25lIHVuaXQuAFBFbWl0cyBgTWV0YWRhdGFTZXRgLgA4V2VpZ2h0OiBgTygxKWA4Y2xlYXJfbWV0YWRhdGEEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAEiyAQ2xlYXIgdGhlIG1ldGFkYXRhIGZvciBhbiBhc3NldC4ALQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4ApEFueSBkZXBvc2l0IGlzIGZyZWVkIGZvciB0aGUgYXNzZXQgb3duZXIuALQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBjbGVhci4AYEVtaXRzIGBNZXRhZGF0YUNsZWFyZWRgLgA4V2VpZ2h0OiBgTygxKWBIZm9yY2Vfc2V0X21ldGFkYXRhFAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEQbmFtZRgBHFZlYzx1OD4AARhzeW1ib2wYARxWZWM8dTg+AAEgZGVjaW1hbHMMAQh1OAABJGlzX2Zyb3plbsgBEGJvb2wAEzi4Rm9yY2UgdGhlIG1ldGFkYXRhIGZvciBhbiBhc3NldCB0byBzb21lIHZhbHVlLgBsT3JpZ2luIG11c3QgYmUgRm9yY2VPcmlnaW4uAGhBbnkgZGVwb3NpdCBpcyBsZWZ0IGFsb25lLgC4LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gdXBkYXRlLk0BLSBgbmFtZWA6IFRoZSB1c2VyIGZyaWVuZGx5IG5hbWUgb2YgdGhpcyBhc3NldC4gTGltaXRlZCBpbiBsZW5ndGggYnkgYFN0cmluZ0xpbWl0YC5NAS0gYHN5bWJvbGA6IFRoZSBleGNoYW5nZSBzeW1ib2wgZm9yIHRoaXMgYXNzZXQuIExpbWl0ZWQgaW4gbGVuZ3RoIGJ5IGBTdHJpbmdMaW1pdGAuLQEtIGBkZWNpbWFsc2A6IFRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdGhpcyBhc3NldCB1c2VzIHRvIHJlcHJlc2VudCBvbmUgdW5pdC4AUEVtaXRzIGBNZXRhZGF0YVNldGAuAFEBV2VpZ2h0OiBgTyhOICsgUylgIHdoZXJlIE4gYW5kIFMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHN5bWJvbCByZXNwZWN0aXZlbHkuUGZvcmNlX2NsZWFyX21ldGFkYXRhBAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyABQsgENsZWFyIHRoZSBtZXRhZGF0YSBmb3IgYW4gYXNzZXQuAGxPcmlnaW4gbXVzdCBiZSBGb3JjZU9yaWdpbi4AYEFueSBkZXBvc2l0IGlzIHJldHVybmVkLgC0LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gY2xlYXIuAGBFbWl0cyBgTWV0YWRhdGFDbGVhcmVkYC4AOFdlaWdodDogYE8oMSlgSGZvcmNlX2Fzc2V0X3N0YXR1cyABCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABFG93bmVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhpc3N1ZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGFkbWluAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxmcmVlemVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASxtaW5fYmFsYW5jZcABKFQ6OkJhbGFuY2UAATRpc19zdWZmaWNpZW50yAEQYm9vbAABJGlzX2Zyb3plbsgBEGJvb2wAFViYQWx0ZXIgdGhlIGF0dHJpYnV0ZXMgb2YgYSBnaXZlbiBhc3NldC4AdE9yaWdpbiBtdXN0IGJlIGBGb3JjZU9yaWdpbmAuAJAtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldC6cLSBgb3duZXJgOiBUaGUgbmV3IE93bmVyIG9mIHRoaXMgYXNzZXQupC0gYGlzc3VlcmA6IFRoZSBuZXcgSXNzdWVyIG9mIHRoaXMgYXNzZXQunC0gYGFkbWluYDogVGhlIG5ldyBBZG1pbiBvZiB0aGlzIGFzc2V0LqwtIGBmcmVlemVyYDogVGhlIG5ldyBGcmVlemVyIG9mIHRoaXMgYXNzZXQuTQEtIGBtaW5fYmFsYW5jZWA6IFRoZSBtaW5pbXVtIGJhbGFuY2Ugb2YgdGhpcyBuZXcgYXNzZXQgdGhhdCBhbnkgc2luZ2xlIGFjY291bnQgbXVzdD0BaGF2ZS4gSWYgYW4gYWNjb3VudCdzIGJhbGFuY2UgaXMgcmVkdWNlZCBiZWxvdyB0aGlzLCB0aGVuIGl0IGNvbGxhcHNlcyB0byB6ZXJvLlEBLSBgaXNfc3VmZmljaWVudGA6IFdoZXRoZXIgYSBub24temVybyBiYWxhbmNlIG9mIHRoaXMgYXNzZXQgaXMgZGVwb3NpdCBvZiBzdWZmaWNpZW50TQF2YWx1ZSB0byBhY2NvdW50IGZvciB0aGUgc3RhdGUgYmxvYXQgYXNzb2NpYXRlZCB3aXRoIGl0cyBiYWxhbmNlIHN0b3JhZ2UuIElmIHNldCB0b1UBYHRydWVgLCB0aGVuIG5vbi16ZXJvIGJhbGFuY2VzIG1heSBiZSBzdG9yZWQgd2l0aG91dCBhIGBjb25zdW1lcmAgcmVmZXJlbmNlIChhbmQgdGh1c00BYW4gRUQgaW4gdGhlIEJhbGFuY2VzIHBhbGxldCBvciB3aGF0ZXZlciBlbHNlIGlzIHVzZWQgdG8gY29udHJvbCB1c2VyLWFjY291bnQgc3RhdGUgZ3Jvd3RoKS49AS0gYGlzX2Zyb3plbmA6IFdoZXRoZXIgdGhpcyBhc3NldCBjbGFzcyBpcyBmcm96ZW4gZXhjZXB0IGZvciBwZXJtaXNzaW9uZWQvYWRtaW40aW5zdHJ1Y3Rpb25zLgDoRW1pdHMgYEFzc2V0U3RhdHVzQ2hhbmdlZGAgd2l0aCB0aGUgaWRlbnRpdHkgb2YgdGhlIGFzc2V0LgA4V2VpZ2h0OiBgTygxKWBAYXBwcm92ZV90cmFuc2ZlcgwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlABZQLQFBcHByb3ZlIGFuIGFtb3VudCBvZiBhc3NldCBmb3IgdHJhbnNmZXIgYnkgYSBkZWxlZ2F0ZWQgdGhpcmQtcGFydHkgYWNjb3VudC4AWE9yaWdpbiBtdXN0IGJlIFNpZ25lZC4ATQFFbnN1cmVzIHRoYXQgYEFwcHJvdmFsRGVwb3NpdGAgd29ydGggb2YgYEN1cnJlbmN5YCBpcyByZXNlcnZlZCBmcm9tIHNpZ25pbmcgYWNjb3VudFUBZm9yIHRoZSBwdXJwb3NlIG9mIGhvbGRpbmcgdGhlIGFwcHJvdmFsLiBJZiBzb21lIG5vbi16ZXJvIGFtb3VudCBvZiBhc3NldHMgaXMgYWxyZWFkeUkBYXBwcm92ZWQgZnJvbSBzaWduaW5nIGFjY291bnQgdG8gYGRlbGVnYXRlYCwgdGhlbiBpdCBpcyB0b3BwZWQgdXAgb3IgdW5yZXNlcnZlZCB0b1RtZWV0IHRoZSByaWdodCB2YWx1ZS4ARQFOT1RFOiBUaGUgc2lnbmluZyBhY2NvdW50IGRvZXMgbm90IG5lZWQgdG8gb3duIGBhbW91bnRgIG9mIGFzc2V0cyBhdCB0aGUgcG9pbnQgb2ZEbWFraW5nIHRoaXMgY2FsbC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0Lg0BLSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0byBkZWxlZ2F0ZSBwZXJtaXNzaW9uIHRvIHRyYW5zZmVyIGFzc2V0LkkBLSBgYW1vdW50YDogVGhlIGFtb3VudCBvZiBhc3NldCB0aGF0IG1heSBiZSB0cmFuc2ZlcnJlZCBieSBgZGVsZWdhdGVgLiBJZiB0aGVyZSBpc+BhbHJlYWR5IGFuIGFwcHJvdmFsIGluIHBsYWNlLCB0aGVuIHRoaXMgYWN0cyBhZGRpdGl2ZWx5LgCQRW1pdHMgYEFwcHJvdmVkVHJhbnNmZXJgIG9uIHN1Y2Nlc3MuADhXZWlnaHQ6IGBPKDEpYDxjYW5jZWxfYXBwcm92YWwIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABc0SQFDYW5jZWwgYWxsIG9mIHNvbWUgYXNzZXQgYXBwcm92ZWQgZm9yIGRlbGVnYXRlZCB0cmFuc2ZlciBieSBhIHRoaXJkLXBhcnR5IGFjY291bnQuAD0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGVyZSBtdXN0IGJlIGFuIGFwcHJvdmFsIGluIHBsYWNlIGJldHdlZW4gc2lnbmVyIGFuZCxgZGVsZWdhdGVgLgBJAVVucmVzZXJ2ZXMgYW55IGRlcG9zaXQgcHJldmlvdXNseSByZXNlcnZlZCBieSBgYXBwcm92ZV90cmFuc2ZlcmAgZm9yIHRoZSBhcHByb3ZhbC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LgUBLSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCBkZWxlZ2F0ZWQgcGVybWlzc2lvbiB0byB0cmFuc2ZlciBhc3NldC4AlEVtaXRzIGBBcHByb3ZhbENhbmNlbGxlZGAgb24gc3VjY2Vzcy4AOFdlaWdodDogYE8oMSlgVGZvcmNlX2NhbmNlbF9hcHByb3ZhbAwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABFG93bmVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABg0SQFDYW5jZWwgYWxsIG9mIHNvbWUgYXNzZXQgYXBwcm92ZWQgZm9yIGRlbGVnYXRlZCB0cmFuc2ZlciBieSBhIHRoaXJkLXBhcnR5IGFjY291bnQuAEkBT3JpZ2luIG11c3QgYmUgZWl0aGVyIEZvcmNlT3JpZ2luIG9yIFNpZ25lZCBvcmlnaW4gd2l0aCB0aGUgc2lnbmVyIGJlaW5nIHRoZSBBZG1pbmhhY2NvdW50IG9mIHRoZSBhc3NldCBgaWRgLgBJAVVucmVzZXJ2ZXMgYW55IGRlcG9zaXQgcHJldmlvdXNseSByZXNlcnZlZCBieSBgYXBwcm92ZV90cmFuc2ZlcmAgZm9yIHRoZSBhcHByb3ZhbC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LgUBLSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCBkZWxlZ2F0ZWQgcGVybWlzc2lvbiB0byB0cmFuc2ZlciBhc3NldC4AlEVtaXRzIGBBcHByb3ZhbENhbmNlbGxlZGAgb24gc3VjY2Vzcy4AOFdlaWdodDogYE8oMSlgRHRyYW5zZmVyX2FwcHJvdmVkEAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEUb3duZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLGRlc3RpbmF0aW9uAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlABlITQFUcmFuc2ZlciBzb21lIGFzc2V0IGJhbGFuY2UgZnJvbSBhIHByZXZpb3VzbHkgZGVsZWdhdGVkIGFjY291bnQgdG8gc29tZSB0aGlyZC1wYXJ0eSBhY2NvdW50LgBJAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlcmUgbXVzdCBiZSBhbiBhcHByb3ZhbCBpbiBwbGFjZSBieSB0aGUgYG93bmVyYCB0byB0aGUcc2lnbmVyLgBZAUlmIHRoZSBlbnRpcmUgYW1vdW50IGFwcHJvdmVkIGZvciB0cmFuc2ZlciBpcyB0cmFuc2ZlcnJlZCwgdGhlbiBhbnkgZGVwb3NpdCBwcmV2aW91c2x5tHJlc2VydmVkIGJ5IGBhcHByb3ZlX3RyYW5zZmVyYCBpcyB1bnJlc2VydmVkLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQuYQEtIGBvd25lcmA6IFRoZSBhY2NvdW50IHdoaWNoIHByZXZpb3VzbHkgYXBwcm92ZWQgZm9yIGEgdHJhbnNmZXIgb2YgYXQgbGVhc3QgYGFtb3VudGAgYW5kvGZyb20gd2hpY2ggdGhlIGFzc2V0IGJhbGFuY2Ugd2lsbCBiZSB3aXRoZHJhd24uYQEtIGBkZXN0aW5hdGlvbmA6IFRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBhc3NldCBiYWxhbmNlIG9mIGBhbW91bnRgIHdpbGwgYmUgdHJhbnNmZXJyZWQutC0gYGFtb3VudGA6IFRoZSBhbW91bnQgb2YgYXNzZXRzIHRvIHRyYW5zZmVyLgCcRW1pdHMgYFRyYW5zZmVycmVkQXBwcm92ZWRgIG9uIHN1Y2Nlc3MuADhXZWlnaHQ6IGBPKDEpYBR0b3VjaAQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgAaJMBDcmVhdGUgYW4gYXNzZXQgYWNjb3VudCBmb3Igbm9uLXByb3ZpZGVyIGFzc2V0cy4AwEEgZGVwb3NpdCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHNpZ25lciBhY2NvdW50LgBdAS0gYG9yaWdpbmA6IE11c3QgYmUgU2lnbmVkOyB0aGUgc2lnbmVyIGFjY291bnQgbXVzdCBoYXZlIHN1ZmZpY2llbnQgZnVuZHMgZm9yIGEgZGVwb3NpdDggIHRvIGJlIHRha2VuLgkBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgZm9yIHRoZSBhY2NvdW50IHRvIGJlIGNyZWF0ZWQuAJhFbWl0cyBgVG91Y2hlZGAgZXZlbnQgd2hlbiBzdWNjZXNzZnVsLhhyZWZ1bmQIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAShhbGxvd19idXJuyAEQYm9vbAAbNFkBUmV0dXJuIHRoZSBkZXBvc2l0IChpZiBhbnkpIG9mIGFuIGFzc2V0IGFjY291bnQgb3IgYSBjb25zdW1lciByZWZlcmVuY2UgKGlmIGFueSkgb2YgYW4gYWNjb3VudC4AaFRoZSBvcmlnaW4gbXVzdCBiZSBTaWduZWQuAD0BLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgZm9yIHdoaWNoIHRoZSBjYWxsZXIgd291bGQgbGlrZSB0aGUgZGVwb3NpdCwgIHJlZnVuZGVkLl0BLSBgYWxsb3dfYnVybmA6IElmIGB0cnVlYCB0aGVuIGFzc2V0cyBtYXkgYmUgZGVzdHJveWVkIGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSByZWZ1bmQuAEkBSXQgd2lsbCBmYWlsIHdpdGggZWl0aGVyIFtgRXJyb3I6OkNvbnRhaW5zSG9sZHNgXSBvciBbYEVycm9yOjpDb250YWluc0ZyZWV6ZXNgXSBpZtR0aGUgYXNzZXQgYWNjb3VudCBjb250YWlucyBob2xkcyBvciBmcmVlemVzIGluIHBsYWNlLgCcRW1pdHMgYFJlZnVuZGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuPHNldF9taW5fYmFsYW5jZQgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABLG1pbl9iYWxhbmNlxAEoVDo6QmFsYW5jZQAcMJRTZXRzIHRoZSBtaW5pbXVtIGJhbGFuY2Ugb2YgYW4gYXNzZXQuACEBT25seSB3b3JrcyBpZiB0aGVyZSBhcmVuJ3QgYW55IGFjY291bnRzIHRoYXQgYXJlIGhvbGRpbmcgdGhlIGFzc2V0IG9yIGlm4HRoZSBuZXcgdmFsdWUgb2YgYG1pbl9iYWxhbmNlYCBpcyBsZXNzIHRoYW4gdGhlIG9sZCBvbmUuAPxPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgaGFzIHRvIGJlIHRoZSBPd25lciBvZiB0aGUsYXNzZXQgYGlkYC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LsAtIGBtaW5fYmFsYW5jZWA6IFRoZSBuZXcgdmFsdWUgb2YgYG1pbl9iYWxhbmNlYC4A1EVtaXRzIGBBc3NldE1pbkJhbGFuY2VDaGFuZ2VkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuLHRvdWNoX290aGVyCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AHSyIQ3JlYXRlIGFuIGFzc2V0IGFjY291bnQgZm9yIGB3aG9gLgDAQSBkZXBvc2l0IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgc2lnbmVyIGFjY291bnQuAF0BLSBgb3JpZ2luYDogTXVzdCBiZSBTaWduZWQ7IHRoZSBzaWduZXIgYWNjb3VudCBtdXN0IGhhdmUgc3VmZmljaWVudCBmdW5kcyBmb3IgYSBkZXBvc2l0OCAgdG8gYmUgdGFrZW4uYQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBmb3IgdGhlIGFjY291bnQgdG8gYmUgY3JlYXRlZCwgdGhlIGFzc2V0IHN0YXR1cyBtdXN0KCAgYmUgbGl2ZS6MLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgY3JlYXRlZC4AmEVtaXRzIGBUb3VjaGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuMHJlZnVuZF9vdGhlcggBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AB40XQFSZXR1cm4gdGhlIGRlcG9zaXQgKGlmIGFueSkgb2YgYSB0YXJnZXQgYXNzZXQgYWNjb3VudC4gVXNlZnVsIGlmIHlvdSBhcmUgdGhlIGRlcG9zaXRvci4AXQFUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCBlaXRoZXIgdGhlIGFjY291bnQgb3duZXIsIGRlcG9zaXRvciwgb3IgYXNzZXQgYEFkbWluYC4gSW5hAW9yZGVyIHRvIGJ1cm4gYSBub24temVybyBiYWxhbmNlIG9mIHRoZSBhc3NldCwgdGhlIGNhbGxlciBtdXN0IGJlIHRoZSBhY2NvdW50IGFuZCBzaG91bGQ0dXNlIGByZWZ1bmRgLgAZAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IGZvciB0aGUgYWNjb3VudCBob2xkaW5nIGEgZGVwb3NpdC58LSBgd2hvYDogVGhlIGFjY291bnQgdG8gcmVmdW5kLgBJAUl0IHdpbGwgZmFpbCB3aXRoIGVpdGhlciBbYEVycm9yOjpDb250YWluc0hvbGRzYF0gb3IgW2BFcnJvcjo6Q29udGFpbnNGcmVlemVzYF0gaWbUdGhlIGFzc2V0IGFjY291bnQgY29udGFpbnMgaG9sZHMgb3IgZnJlZXplcyBpbiBwbGFjZS4AnEVtaXRzIGBSZWZ1bmRlZGAgZXZlbnQgd2hlbiBzdWNjZXNzZnVsLhRibG9jawgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AB8oWQFEaXNhbGxvdyBmdXJ0aGVyIHVucHJpdmlsZWdlZCB0cmFuc2ZlcnMgb2YgYW4gYXNzZXQgYGlkYCB0byBhbmQgZnJvbSBhbiBhY2NvdW50IGB3aG9gLgA1AU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEZyZWV6ZXIgb2YgdGhlIGFzc2V0IGBpZGAuALgtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhY2NvdW50J3MgYXNzZXQulC0gYHdob2A6IFRoZSBhY2NvdW50IHRvIGJlIHVuYmxvY2tlZC4AQEVtaXRzIGBCbG9ja2VkYC4AOFdlaWdodDogYE8oMSlgMHRyYW5zZmVyX2FsbAwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKGtlZXBfYWxpdmXIARBib29sACBAHQFUcmFuc2ZlciB0aGUgZW50aXJlIHRyYW5zZmVyYWJsZSBiYWxhbmNlIGZyb20gdGhlIGNhbGxlciBhc3NldCBhY2NvdW50LgBZAU5PVEU6IFRoaXMgZnVuY3Rpb24gb25seSBhdHRlbXB0cyB0byB0cmFuc2ZlciBfdHJhbnNmZXJhYmxlXyBiYWxhbmNlcy4gVGhpcyBtZWFucyB0aGF0PQFhbnkgaGVsZCwgZnJvemVuLCBvciBtaW5pbXVtIGJhbGFuY2UgKHdoZW4gYGtlZXBfYWxpdmVgIGlzIGB0cnVlYCksIHdpbGwgbm90IGJlXQF0cmFuc2ZlcnJlZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJlc3VsdHMgaW4gYSBraWxsZWQgYWNjb3VudCxFAXlvdSBtaWdodCBuZWVkIHRvIHByZXBhcmUgdGhlIGFjY291bnQgYnkgcmVtb3ZpbmcgYW55IHJlZmVyZW5jZSBjb3VudGVycywgc3RvcmFnZUBkZXBvc2l0cywgZXRjLi4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFNpZ25lZC4AGQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBmb3IgdGhlIGFjY291bnQgaG9sZGluZyBhIGRlcG9zaXQuoC0gYGRlc3RgOiBUaGUgcmVjaXBpZW50IG9mIHRoZSB0cmFuc2Zlci5ZAS0gYGtlZXBfYWxpdmVgOiBBIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBgdHJhbnNmZXJfYWxsYCBvcGVyYXRpb24gc2hvdWxkIHNlbmQgYWxsTQEgIG9mIHRoZSBmdW5kcyB0aGUgYXNzZXQgYWNjb3VudCBoYXMsIGNhdXNpbmcgdGhlIHNlbmRlciBhc3NldCBhY2NvdW50IHRvIGJlIGtpbGxlZEUBICAoZmFsc2UpLCBvciB0cmFuc2ZlciBldmVyeXRoaW5nIGV4Y2VwdCBhdCBsZWFzdCB0aGUgbWluaW11bSBiYWxhbmNlLCB3aGljaCB3aWxs6CAgZ3VhcmFudGVlIHRvIGtlZXAgdGhlIHNlbmRlciBhc3NldCBhY2NvdW50IGFsaXZlICh0cnVlKS4wc2V0X3Jlc2VydmVzCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEgcmVzZXJ2ZXMdAQHIQm91bmRlZFZlYzxUOjpSZXNlcnZlRGF0YSwgQ29uc3RVMzI8TUFYX1JFU0VSVkVTPj4AISTEU2V0cyB0aGUgdHJ1c3RlZCByZXNlcnZlIGluZm9ybWF0aW9uIG9mIGFuIGFzc2V0LgBVAU9yaWdpbiBtdXN0IGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4gVGhlIG9yaWdpbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGNvbmZpZ3VyZWQlAWBDcmVhdGVPcmlnaW5gIG9yIGJlIHRoZSBzaWduZWQgYG93bmVyYCBjb25maWd1cmVkIGR1cmluZyBhc3NldCBjcmVhdGlvbi4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LvAtIGByZXNlcnZlc2A6IFRoZSBmdWxsIGxpc3Qgb2YgdHJ1c3RlZCByZXNlcnZlcyBpbmZvcm1hdGlvbi4A1EVtaXRzIGBBc3NldE1pbkJhbGFuY2VDaGFuZ2VkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuAQLHN0YWdpbmdfeGNtCHY1IGxvY2F0aW9uIExvY2F0aW9uAAAIARxwYXJlbnRzDAEIdTgAASBpbnRlcmlvcuQBJEp1bmN0aW9ucwAA5BAsc3RhZ2luZ194Y20IdjUkanVuY3Rpb25zJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBADoAUhBcmM8W0p1bmN0aW9uOyAxXT4AAQAIWDIEAAEBAUhBcmM8W0p1bmN0aW9uOyAyXT4AAgAIWDMEAAUBAUhBcmM8W0p1bmN0aW9uOyAzXT4AAwAIWDQEAAkBAUhBcmM8W0p1bmN0aW9uOyA0XT4ABAAIWDUEAA0BAUhBcmM8W0p1bmN0aW9uOyA1XT4ABQAIWDYEABEBAUhBcmM8W0p1bmN0aW9uOyA2XT4ABgAIWDcEABUBAUhBcmM8W0p1bmN0aW9uOyA3XT4ABwAIWDgEABkBAUhBcmM8W0p1bmN0aW9uOyA4XT4ACAAA6AAAAwEAAADsAOwQLHN0YWdpbmdfeGNtCHY1IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQAYAEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQIASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmvwAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4tAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmvwAURPcHRpb248TmV0d29ya0lkPgABDGtleRwBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAMAQh1OAAEADBHZW5lcmFsSW5kZXgEAMABEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAwBCHU4AAEQZGF0YQgBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZPgBGEJvZHlJZAABEHBhcnT8ASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEAPQBJE5ldHdvcmtJZAAJAADwBBhPcHRpb24EBFQB9AEIEE5vbmUAAAAQU29tZQQA9AAAAQAA9BAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24kTmV0d29ya0lkAAEgJEJ5R2VuZXNpcwQACAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyKAEMdTY0AAEoYmxvY2tfaGFzaAgBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADACBFdGhlcmV1bQQBIGNoYWluX2lktAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAA+BAMeGNtCHYzIGp1bmN0aW9uGEJvZHlJZAABKBBVbml0AAAAHE1vbmlrZXIEAHABHFt1ODsgNF0AAQAUSW5kZXgEAGABDHUzMgACACRFeGVjdXRpdmUAAwAkVGVjaG5pY2FsAAQALExlZ2lzbGF0aXZlAAUAIEp1ZGljaWFsAAYAHERlZmVuc2UABwA4QWRtaW5pc3RyYXRpb24ACAAgVHJlYXN1cnkACQAA/BAMeGNtCHYzIGp1bmN0aW9uIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudGABDHUzMgABACBGcmFjdGlvbggBDG5vbWABDHUzMgABFGRlbm9tYAEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9tYAEMdTMyAAEUZGVub21gAQx1MzIAAwBITW9yZVRoYW5Qcm9wb3J0aW9uCAEMbm9tYAEMdTMyAAEUZGVub21gAQx1MzIABAAAAQEAAAMCAAAA7AAFAQAAAwMAAADsAAkBAAADBAAAAOwADQEAAAMFAAAA7AARAQAAAwYAAADsABUBAAADBwAAAOwAGQEAAAMIAAAA7AAdAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEBBFMAAAQAJQEBGFZlYzxUPgAAIQEMNGFzc2V0c19jb21tb25gbG9jYWxfYW5kX2ZvcmVpZ25fYXNzZXRzXEZvcmVpZ25Bc3NldFJlc2VydmVEYXRhAAAIARxyZXNlcnZl4AEgTG9jYXRpb24AATB0ZWxlcG9ydGFibGXIARBib29sAAAlAQAAAiEBACkBDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQQQ2FsbAQEVAABDBhjcmVhdGUIAShhc3NldF9raW5k4AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRlLQEBJEZpeGVkVTEyOAAAEA0BSW5pdGlhbGl6ZSBhIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkYdXBkYXRlCAEoYXNzZXRfa2luZOABREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZS0BASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5k4AFEQm94PFQ6OkFzc2V0S2luZD4AAhAlAVJlbW92ZSBhbiBleGlzdGluZyBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLi0BDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50JEZpeGVkVTEyOAAABADEARB1MTI4AAAxAQxkcGFsbGV0X2NvbGxhdG9yX3NlbGVjdGlvbhhwYWxsZXQQQ2FsbAQEVAABJERzZXRfaW52dWxuZXJhYmxlcwQBDG5ld8wBRFZlYzxUOjpBY2NvdW50SWQ+AAA0MQFTZXQgdGhlIGxpc3Qgb2YgaW52dWxuZXJhYmxlIChmaXhlZCkgY29sbGF0b3JzLiBUaGVzZSBjb2xsYXRvcnMgbXVzdCBkbyBzb21l0HByZXBhcmF0aW9uLCBuYW1lbHkgdG8gaGF2ZSByZWdpc3RlcmVkIHNlc3Npb24ga2V5cy4AWQFUaGUgY2FsbCB3aWxsIHJlbW92ZSBhbnkgYWNjb3VudHMgdGhhdCBoYXZlIG5vdCByZWdpc3RlcmVkIGtleXMgZnJvbSB0aGUgc2V0LiBUaGF0IGlzLF0BaXQgaXMgbm9uLWF0b21pYzsgdGhlIGNhbGxlciBhY2NlcHRzIGFsbCBgQWNjb3VudElkYHMgcGFzc2VkIGluIGBuZXdgIF9pbmRpdmlkdWFsbHlfIGFzMQFhY2NlcHRhYmxlIEludnVsbmVyYWJsZXMsIGFuZCBpcyBub3QgcHJvcG9zaW5nIGEgX3NldF8gb2YgbmV3IEludnVsbmVyYWJsZXMuAFkBVGhpcyBjYWxsIGRvZXMgbm90IG1haW50YWluIG11dHVhbCBleGNsdXNpdml0eSBvZiBgSW52dWxuZXJhYmxlc2AgYW5kIGBDYW5kaWRhdGVzYC4gSXRhAWlzIHJlY29tbWVuZGVkIHRvIHVzZSBhIGJhdGNoIG9mIGBhZGRfaW52dWxuZXJhYmxlYCBhbmQgYHJlbW92ZV9pbnZ1bG5lcmFibGVgIGluc3RlYWQuIEFRAWBiYXRjaF9hbGxgIGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5mb3JjZSBhdG9taWNpdHkuIElmIGFueSBjYW5kaWRhdGVzIGFyZSBpbmNsdWRlZCBpbk0BYG5ld2AsIHRoZXkgc2hvdWxkIGJlIHJlbW92ZWQgd2l0aCBgcmVtb3ZlX2ludnVsbmVyYWJsZV9jYW5kaWRhdGVgIGFmdGVyIGV4ZWN1dGlvbi4AlE11c3QgYmUgY2FsbGVkIGJ5IHRoZSBgVXBkYXRlT3JpZ2luYC5Yc2V0X2Rlc2lyZWRfY2FuZGlkYXRlcwQBDG1heDgBDHUzMgABFFUBU2V0IHRoZSBpZGVhbCBudW1iZXIgb2Ygbm9uLWludnVsbmVyYWJsZSBjb2xsYXRvcnMuIElmIGxvd2VyaW5nIHRoaXMgbnVtYmVyLCB0aGVuIHRoZWEBbnVtYmVyIG9mIHJ1bm5pbmcgY29sbGF0b3JzIGNvdWxkIGJlIGhpZ2hlciB0aGFuIHRoaXMgZmlndXJlLiBBc2lkZSBmcm9tIHRoYXQgZWRnZSBjYXNlLDUBdGhlcmUgc2hvdWxkIGJlIG5vIG90aGVyIHdheSB0byBoYXZlIG1vcmUgY2FuZGlkYXRlcyB0aGFuIHRoZSBkZXNpcmVkIG51bWJlci4A0FRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBgVXBkYXRlT3JpZ2luYC5Ic2V0X2NhbmRpZGFjeV9ib25kBAEQYm9uZMQBMEJhbGFuY2VPZjxUPgACHHhTZXQgdGhlIGNhbmRpZGFjeSBib25kIGFtb3VudC4AUQFJZiB0aGUgY2FuZGlkYWN5IGJvbmQgaXMgaW5jcmVhc2VkIGJ5IHRoaXMgY2FsbCwgYWxsIGN1cnJlbnQgY2FuZGlkYXRlcyB3aGljaCBoYXZlIGFNAWRlcG9zaXQgbG93ZXIgdGhhbiB0aGUgbmV3IGJvbmQgd2lsbCBiZSBraWNrZWQgZnJvbSB0aGUgbGlzdCBhbmQgZ2V0IHRoZWlyIGRlcG9zaXRzFGJhY2suANBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgYFVwZGF0ZU9yaWdpbmAuVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQADEEEBUmVnaXN0ZXIgdGhpcyBhY2NvdW50IGFzIGEgY29sbGF0b3IgY2FuZGlkYXRlLiBUaGUgYWNjb3VudCBtdXN0IChhKSBhbHJlYWR5IGhhdmUdAXJlZ2lzdGVyZWQgc2Vzc2lvbiBrZXlzIGFuZCAoYikgYmUgYWJsZSB0byByZXNlcnZlIHRoZSBgQ2FuZGlkYWN5Qm9uZGAuANxUaGlzIGNhbGwgaXMgbm90IGF2YWlsYWJsZSB0byBgSW52dWxuZXJhYmxlYCBjb2xsYXRvcnMuMGxlYXZlX2ludGVudAAEFFUBRGVyZWdpc3RlciBgb3JpZ2luYCBhcyBhIGNvbGxhdG9yIGNhbmRpZGF0ZS4gTm90ZSB0aGF0IHRoZSBjb2xsYXRvciBjYW4gb25seSBsZWF2ZSBvbg0Bc2Vzc2lvbiBjaGFuZ2UuIFRoZSBgQ2FuZGlkYWN5Qm9uZGAgd2lsbCBiZSB1bnJlc2VydmVkIGltbWVkaWF0ZWx5LgAZAVRoaXMgY2FsbCB3aWxsIGZhaWwgaWYgdGhlIHRvdGFsIG51bWJlciBvZiBjYW5kaWRhdGVzIHdvdWxkIGRyb3AgYmVsb3dcYE1pbkVsaWdpYmxlQ29sbGF0b3JzYC5AYWRkX2ludnVsbmVyYWJsZQQBDHdobwQBMFQ6OkFjY291bnRJZAAFEEUBQWRkIGEgbmV3IGFjY291bnQgYHdob2AgdG8gdGhlIGxpc3Qgb2YgYEludnVsbmVyYWJsZXNgIGNvbGxhdG9ycy4gYHdob2AgbXVzdCBoYXZlHQFyZWdpc3RlcmVkIHNlc3Npb24ga2V5cy4gSWYgYHdob2AgaXMgYSBjYW5kaWRhdGUsIHRoZXkgd2lsbCBiZSByZW1vdmVkLgDQVGhlIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGBVcGRhdGVPcmlnaW5gLkxyZW1vdmVfaW52dWxuZXJhYmxlBAEMd2hvBAEwVDo6QWNjb3VudElkAAYQYQFSZW1vdmUgYW4gYWNjb3VudCBgd2hvYCBmcm9tIHRoZSBsaXN0IG9mIGBJbnZ1bG5lcmFibGVzYCBjb2xsYXRvcnMuIGBJbnZ1bG5lcmFibGVzYCBtdXN0KGJlIHNvcnRlZC4A0FRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBgVXBkYXRlT3JpZ2luYC4sdXBkYXRlX2JvbmQEASxuZXdfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAHHF0BVXBkYXRlIHRoZSBjYW5kaWRhY3kgYm9uZCBvZiBjb2xsYXRvciBjYW5kaWRhdGUgYG9yaWdpbmAgdG8gYSBuZXcgYW1vdW50IGBuZXdfZGVwb3NpdGAuAEEBU2V0dGluZyBhIGBuZXdfZGVwb3NpdGAgdGhhdCBpcyBsb3dlciB0aGFuIHRoZSBjdXJyZW50IGRlcG9zaXQgd2hpbGUgYG9yaWdpbmAgaXPgb2NjdXB5aW5nIGEgdG9wLWBEZXNpcmVkQ2FuZGlkYXRlc2Agc2xvdCBpcyBub3QgYWxsb3dlZC4AWQFUaGlzIGNhbGwgd2lsbCBmYWlsIGlmIGBvcmlnaW5gIGlzIG5vdCBhIGNvbGxhdG9yIGNhbmRpZGF0ZSwgdGhlIHVwZGF0ZWQgYm9uZCBpcyBsb3dlchkBdGhhbiB0aGUgbWluaW11bSBjYW5kaWRhY3kgYm9uZCwgYW5kL29yIHRoZSBhbW91bnQgY2Fubm90IGJlIHJlc2VydmVkLkx0YWtlX2NhbmRpZGF0ZV9zbG90CAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgABGHRhcmdldAQBMFQ6OkFjY291bnRJZAAIHE0BVGhlIGNhbGxlciBgb3JpZ2luYCByZXBsYWNlcyBhIGNhbmRpZGF0ZSBgdGFyZ2V0YCBpbiB0aGUgY29sbGF0b3IgY2FuZGlkYXRlIGxpc3QgYnlVAXJlc2VydmluZyBgZGVwb3NpdGAuIFRoZSBhbW91bnQgYGRlcG9zaXRgIHJlc2VydmVkIGJ5IHRoZSBjYWxsZXIgbXVzdCBiZSBncmVhdGVyIHRoYW7gdGhlIGV4aXN0aW5nIGJvbmQgb2YgdGhlIHRhcmdldCBpdCBpcyB0cnlpbmcgdG8gcmVwbGFjZS4AWQFUaGlzIGNhbGwgd2lsbCBmYWlsIGlmIHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBhIGNvbGxhdG9yIGNhbmRpZGF0ZSBvciBpbnZ1bG5lcmFibGUsIHRoZVUBY2FsbGVyIGRvZXMgbm90IGhhdmUgcmVnaXN0ZXJlZCBzZXNzaW9uIGtleXMsIHRoZSB0YXJnZXQgaXMgbm90IGEgY29sbGF0b3IgY2FuZGlkYXRlLLxhbmQvb3IgdGhlIGBkZXBvc2l0YCBhbW91bnQgY2Fubm90IGJlIHJlc2VydmVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy41AQw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0EENhbGwEBFQAAQggc2V0X2tleXMIARBrZXlzOQEBHFQ6OktleXMAARRwcm9vZhgBHFZlYzx1OD4AACTkU2V0cyB0aGUgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlciB0byBga2V5c2AuHQFBbGxvd3MgYW4gYWNjb3VudCB0byBzZXQgaXRzIHNlc3Npb24ga2V5IHByaW9yIHRvIGJlY29taW5nIGEgdmFsaWRhdG9yLsBUaGlzIGRvZXNuJ3QgdGFrZSBlZmZlY3QgdW50aWwgdGhlIG5leHQgc2Vzc2lvbi4A0FRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIHNpZ25lZC4ANCMjIENvbXBsZXhpdHlZAS0gYE8oMSlgLiBBY3R1YWwgY29zdCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgbGVuZ3RoIG9mIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzICAgZml4ZWQuKHB1cmdlX2tleXMAATDIUmVtb3ZlcyBhbnkgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlci4AwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSBlaXRoZXIgYmVdAWNvbnZlcnRpYmxlIHRvIGEgdmFsaWRhdG9yIElEIHVzaW5nIHRoZSBjaGFpbidzIHR5cGljYWwgYWRkcmVzc2luZyBzeXN0ZW0gKHRoaXMgdXN1YWxseVEBbWVhbnMgYmVpbmcgYSBjb250cm9sbGVyIGFjY291bnQpIG9yIGRpcmVjdGx5IGNvbnZlcnRpYmxlIGludG8gYSB2YWxpZGF0b3IgSUQgKHdoaWNolHVzdWFsbHkgbWVhbnMgYmVpbmcgYSBzdGFzaCBhY2NvdW50KS4ANCMjIENvbXBsZXhpdHk9AS0gYE8oMSlgIGluIG51bWJlciBvZiBrZXkgdHlwZXMuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2aYICBgVDo6S2V5czo6a2V5X2lkcygpYCB3aGljaCBpcyBmaXhlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuOQEIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUsU2Vzc2lvbktleXMAAAQBEGF1cmE9AQHEPEF1cmEgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwAAPQEQRHNwX2NvbnNlbnN1c19hdXJhHHNyMjU1MTksYXBwX3NyMjU1MTkYUHVibGljAAAEAAgBPHNyMjU1MTk6OlB1YmxpYwAAQQEMZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWUYcGFsbGV0EENhbGwEBFQAARRUc3VzcGVuZF94Y21fZXhlY3V0aW9uAAEMSQFTdXNwZW5kcyBhbGwgWENNIGV4ZWN1dGlvbnMgZm9yIHRoZSBYQ01QIHF1ZXVlLCByZWdhcmRsZXNzIG9mIHRoZSBzZW5kZXIncyBvcmlnaW4uAKQtIGBvcmlnaW5gOiBNdXN0IHBhc3MgYENvbnRyb2xsZXJPcmlnaW5gLlByZXN1bWVfeGNtX2V4ZWN1dGlvbgACFLhSZXN1bWVzIGFsbCBYQ00gZXhlY3V0aW9ucyBmb3IgdGhlIFhDTVAgcXVldWUuAD0BTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGFuZ2UgdGhlIHN0YXR1cyBvZiB0aGUgaW4vb3V0IGJvdW5kIGNoYW5uZWxzLgCkLSBgb3JpZ2luYDogTXVzdCBwYXNzIGBDb250cm9sbGVyT3JpZ2luYC5gdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkBAEMbmV3OAEMdTMyAAMUSQFPdmVyd3JpdGVzIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggbXVzdCBiZSBpbiB0aGUgcXVldWUgZm9yIHRoZSBvdGhlciBzaWRlIHRvIGJleHRvbGQgdG8gc3VzcGVuZCB0aGVpciBzZW5kaW5nLgB0LSBgb3JpZ2luYDogTXVzdCBwYXNzIGBSb290YC7oLSBgbmV3YDogRGVzaXJlZCB2YWx1ZSBmb3IgYFF1ZXVlQ29uZmlnRGF0YS5zdXNwZW5kX3ZhbHVlYFR1cGRhdGVfZHJvcF90aHJlc2hvbGQEAQxuZXc4AQx1MzIABBRFAU92ZXJ3cml0ZXMgdGhlIG51bWJlciBvZiBwYWdlcyB3aGljaCBtdXN0IGJlIGluIHRoZSBxdWV1ZSBhZnRlciB3aGljaCB3ZSBkcm9wIGFueYhmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gdGhlIGNoYW5uZWwuAHQtIGBvcmlnaW5gOiBNdXN0IHBhc3MgYFJvb3RgLuwtIGBuZXdgOiBEZXNpcmVkIHZhbHVlIGZvciBgUXVldWVDb25maWdEYXRhLmRyb3BfdGhyZXNob2xkYFx1cGRhdGVfcmVzdW1lX3RocmVzaG9sZAQBDG5ldzgBDHUzMgAFFE0BT3ZlcndyaXRlcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIHRoZSBxdWV1ZSBtdXN0IGJlIHJlZHVjZWQgdG8gYmVmb3JlIGl0IHNpZ25hbHMBAXRoYXQgbWVzc2FnZSBzZW5kaW5nIG1heSByZWNvbW1lbmNlIGFmdGVyIGl0IGhhcyBiZWVuIHN1c3BlbmRlZC4AdC0gYG9yaWdpbmA6IE11c3QgcGFzcyBgUm9vdGAu9C0gYG5ld2A6IERlc2lyZWQgdmFsdWUgZm9yIGBRdWV1ZUNvbmZpZ0RhdGEucmVzdW1lX3RocmVzaG9sZGAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQEMKHBhbGxldF94Y20YcGFsbGV0EENhbGwEBFQAAUQQc2VuZAgBEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABHG1lc3NhZ2WVAQFUQm94PFZlcnNpb25lZFhjbTwoKT4+AAAAPHRlbGVwb3J0X2Fzc2V0cxABEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbTgBDHUzMgABSBEBVGVsZXBvcnQgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gc29tZSBkZXN0aW5hdGlvbiBjaGFpbi4AHQEqKlRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDogVXNlIGBsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0c2AgaW5zdGVhZC4qKgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYC4gVGhlIHdlaWdodCBsaW1pdCBmb3IgZmVlcyBpcyBub3QgcHJvdmlkZWQgYW5kIHRodXMgaXMgdW5saW1pdGVkLLR3aXRoIGFsbCBmZWVzIHRha2VuIGFzIG5lZWRlZCBmcm9tIHRoZSBhc3NldC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzEAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAJ4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4APQEqKlRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDogVXNlIGBsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy4cZXhlY3V0ZQgBHG1lc3NhZ2XdAgG0Qm94PFZlcnNpb25lZFhjbTw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4+AAEobWF4X3dlaWdodNUBARhXZWlnaHQAAyDQRXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSBmcm9tIGEgbG9jYWwsIHNpZ25lZCwgb3JpZ2luLgBNAUFuIGV2ZW50IGlzIGRlcG9zaXRlZCBpbmRpY2F0aW5nIHdoZXRoZXIgYG1zZ2AgY291bGQgYmUgZXhlY3V0ZWQgY29tcGxldGVseSBvciBvbmx5KHBhcnRpYWxseS4AXQFObyBtb3JlIHRoYW4gYG1heF93ZWlnaHRgIHdpbGwgYmUgdXNlZCBpbiBpdHMgYXR0ZW1wdGVkIGV4ZWN1dGlvbi4gSWYgdGhpcyBpcyBsZXNzIHRoYW5BAXRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgdGhhdCB0aGUgbWVzc2FnZSBjb3VsZCB0YWtlIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIG5vfGV4ZWN1dGlvbiBhdHRlbXB0IHdpbGwgYmUgbWFkZS5EZm9yY2VfeGNtX3ZlcnNpb24IASBsb2NhdGlvbuABNEJveDxMb2NhdGlvbj4AARx2ZXJzaW9uOAEoWGNtVmVyc2lvbgAEGEkBRXh0b2xsIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIGNhbiBiZSBjb21tdW5pY2F0ZWQgd2l0aCB0aHJvdWdoIGEgcGFydGljdWxhcjx2ZXJzaW9uIG9mIFhDTS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7YLSBgbG9jYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdGhhdCBpcyBiZWluZyBkZXNjcmliZWQuEQEtIGB4Y21fdmVyc2lvbmA6IFRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYQ00gdGhhdCBgbG9jYXRpb25gIHN1cHBvcnRzLmRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uBAFEbWF5YmVfeGNtX3ZlcnNpb24JAwFIT3B0aW9uPFhjbVZlcnNpb24+AAUUWQFTZXQgYSBzYWZlIFhDTSB2ZXJzaW9uICh0aGUgdmVyc2lvbiB0aGF0IFhDTSBzaG91bGQgYmUgZW5jb2RlZCB3aXRoIGlmIHRoZSBtb3N0IHJlY2VudLR2ZXJzaW9uIGEgZGVzdGluYXRpb24gY2FuIGFjY2VwdCBpcyB1bmtub3duKS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi45AS0gYG1heWJlX3hjbV92ZXJzaW9uYDogVGhlIGRlZmF1bHQgWENNIGVuY29kaW5nIHZlcnNpb24sIG9yIGBOb25lYCB0byBkaXNhYmxlLnhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAYQOQFBc2sgYSBsb2NhdGlvbiB0byBub3RpZnkgdXMgcmVnYXJkaW5nIHRoZWlyIFhDTSB2ZXJzaW9uIGFuZCBhbnkgY2hhbmdlcyB0byBpdC4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi5ZAS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIHNob3VsZCBzdWJzY3JpYmUgZm9yIFhDTSB2ZXJzaW9uIG5vdGlmaWNhdGlvbnMugGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb25JAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAHGEkBUmVxdWlyZSB0aGF0IGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG5vdGlmeSB1cyByZWdhcmRpbmcgYW55IFhDTUB2ZXJzaW9uIGNoYW5nZXMuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uPQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBhcmUgY3VycmVudGx5IHN1YnNjcmliZWQgZm9yIFhDTSB2ZXJzaW9uqCAgbm90aWZpY2F0aW9ucyB3aGljaCB3ZSBubyBsb25nZXIgZGVzaXJlLnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzFAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0AAh4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzFAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0AAlIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5AZm9yY2Vfc3VzcGVuc2lvbgQBJHN1c3BlbmRlZMgBEGJvb2wAChD0U2V0IG9yIHVuc2V0IHRoZSBnbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtAtIGBzdXNwZW5kZWRgOiBgdHJ1ZWAgdG8gc3VzcGVuZCwgYGZhbHNlYCB0byByZXN1bWUuPHRyYW5zZmVyX2Fzc2V0cxQBEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbTgBDHUzMgABMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAALhF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWws0GRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLCBvciB0aHJvdWdoIHRlbGVwb3J0cy4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2Y1AWluZGV4IGBmZWVfYXNzZXRfaXRlbWAgKGhlbmNlIHJlZmVycmVkIHRvIGFzIGBmZWVzYCksIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yQQFgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0IGlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZdxvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAGEBYGFzc2V0c2AgKGV4Y2x1ZGluZyBgZmVlc2ApIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3Igb3RoZXJ3aXNlIGJlIHRlbGVwb3J0YWJsZbB0byBgZGVzdGAsIG5vIGxpbWl0YXRpb25zIGltcG9zZWQgb24gYGZlZXNgLk0BIC0gZm9yIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbiBjaGFpbiBhbmRNASAgIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvRCAgIGBiZW5lZmljaWFyeWAuYQEgLSBmb3IgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG8gYGRlc3RgIGNoYWluWQEgICB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5kIGRlcG9zaXQgdGhlbVAgICB0byBgYmVuZWZpY2lhcnlgLl0BIC0gZm9yIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlIHJlc2VydmVzXQEgICBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3RgIHRvIG1pbnTUICAgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5RASAtIGZvciB0ZWxlcG9ydHM6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG8gbWludC90ZWxlcG9ydLAgICBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uLQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFgyKFBhcmVudCxVASAgUGFyYWNoYWluKC4uKSlgIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgWDEoUGFyYWNoYWluKC4uKSlgIHRvIHNlbmRoICBmcm9tIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4wY2xhaW1fYXNzZXRzCAEYYXNzZXRz2QIBUEJveDxWZXJzaW9uZWRBc3NldHM+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAMGFUBQ2xhaW1zIGFzc2V0cyB0cmFwcGVkIG9uIHRoaXMgcGFsbGV0IGJlY2F1c2Ugb2YgbGVmdG92ZXIgYXNzZXRzIGR1cmluZyBYQ00gZXhlY3V0aW9uLgCsLSBgb3JpZ2luYDogQW55b25lIGNhbiBjYWxsIHRoaXMgZXh0cmluc2ljLl0BLSBgYXNzZXRzYDogVGhlIGV4YWN0IGFzc2V0cyB0aGF0IHdlcmUgdHJhcHBlZC4gVXNlIHRoZSB2ZXJzaW9uIHRvIHNwZWNpZnkgd2hhdCB2ZXJzaW9umHdhcyB0aGUgbGF0ZXN0IHdoZW4gdGhleSB3ZXJlIHRyYXBwZWQuRQEtIGBiZW5lZmljaWFyeWA6IFRoZSBsb2NhdGlvbi9hY2NvdW50IHdoZXJlIHRoZSBjbGFpbWVkIGFzc2V0cyB3aWxsIGJlIGRlcG9zaXRlZC6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4cARBkZXN0SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAVBhc3NldHNfdHJhbnNmZXJfdHlwZQ0DAURCb3g8VHJhbnNmZXJUeXBlPgABOHJlbW90ZV9mZWVzX2lkEQMBVEJveDxWZXJzaW9uZWRBc3NldElkPgABSGZlZXNfdHJhbnNmZXJfdHlwZQ0DAURCb3g8VHJhbnNmZXJUeXBlPgABSGN1c3RvbV94Y21fb25fZGVzdJUBAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQADcBVAVRyYW5zZmVyIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdXNpbmcgZXhwbGljaXQgdHJhbnNmZXJodHlwZXMgZm9yIGFzc2V0cyBhbmQgZmVlcy4AWQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG1heSBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLiBDYWxsZXIgbXVzdOxwcm92aWRlIHRoZSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgIHRvIGJlIHVzZWQgZm9yIGBhc3NldHNgOlEBIC0gYFRyYW5zZmVyVHlwZTo6TG9jYWxSZXNlcnZlYDogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OkRlc3RpbmF0aW9uUmVzZXJ2ZWA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OlJlbW90ZVJlc2VydmUocmVzZXJ2ZSlgOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gYHJlc2VydmVgYQEgICBjaGFpbiB0byBtb3ZlIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyVQEgICBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4gVHlwaWNhbGx5lCAgIHRoZSByZW1vdGUgYHJlc2VydmVgIGlzIEFzc2V0IEh1Yi5FASAtIGBUcmFuc2ZlclR5cGU6OlRlbGVwb3J0YDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0b+ggICBtaW50L3RlbGVwb3J0IGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuAFUBT24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLCBhcyB3ZWxsIGFzIGFueSBpbnRlcm1lZGlhcnkgaG9wcywgYEJ1eUV4ZWN1dGlvbmAgaXMgdXNlZCB0byEBYnV5IGV4ZWN1dGlvbiB1c2luZyB0cmFuc2ZlcnJlZCBgYXNzZXRzYCBpZGVudGlmaWVkIGJ5IGByZW1vdGVfZmVlc19pZGAuWQFNYWtlIHN1cmUgZW5vdWdoIG9mIHRoZSBzcGVjaWZpZWQgYHJlbW90ZV9mZWVzX2lkYCBhc3NldCBpcyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbGlzdGEBb2YgYGFzc2V0c2AuIGByZW1vdGVfZmVlc19pZGAgc2hvdWxkIGJlIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgLiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4ARQFgcmVtb3RlX2ZlZXNfaWRgIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zZmVyIHR5cGUgdGhhbiByZXN0IG9mIGBhc3NldHNgIGFuZCBjYW4gYmWcc3BlY2lmaWVkIHRocm91Z2ggYGZlZXNfdHJhbnNmZXJfdHlwZWAuAGEBVGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiB0byB0aGUgdHJhbnNmZXJyZWQgYXNzZXRzIG9uY2UgdGhleSByZWFjaEEBdGhlIGBkZXN0YCBjaGFpbi4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjdXN0b21feGNtX29uX2Rlc3RgIHBhcmFtZXRlciwgd2hpY2j8Y29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0byBleGVjdXRlIG9uIGBkZXN0YCBhcyBhIGZpbmFsIHN0ZXAufCAgVGhpcyBpcyB1c3VhbGx5IGFzIHNpbXBsZSBhczpRASAgYFhjbSh2ZWMhW0RlcG9zaXRBc3NldCB7IGFzc2V0czogV2lsZChBbGxDb3VudGVkKGFzc2V0cy5sZW4oKSkpLCBiZW5lZmljaWFyeSB9XSlgLDEBICBidXQgY291bGQgYmUgc29tZXRoaW5nIG1vcmUgZXhvdGljIGxpa2Ugc2VuZGluZyB0aGUgYGFzc2V0c2AgZXZlbiBmdXJ0aGVyLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tPQEgIHJlbGF5IHRvIHBhcmFjaGFpbiwgb3IgYChwYXJlbnRzOiAyLCAoR2xvYmFsQ29uc2Vuc3VzKC4uKSwgLi4pKWAgdG8gc2VuZCBmcm9t9CAgcGFyYWNoYWluIGFjcm9zcyBhIGJyaWRnZSB0byBhbm90aGVyIGVjb3N5c3RlbSBkZXN0aW5hdGlvbi5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuPQEtIGBhc3NldHNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGFzc2V0c2AuIQEtIGByZW1vdGVfZmVlc19pZGA6IE9uZSBvZiB0aGUgaW5jbHVkZWQgYGFzc2V0c2AgdG8gYmUgdXNlZCB0byBwYXkgZmVlcy5JAS0gYGZlZXNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGZlZXNgIGFzc2V0cy5ZAS0gYGN1c3RvbV94Y21fb25fZGVzdGA6IFRoZSBYQ00gdG8gYmUgZXhlY3V0ZWQgb24gYGRlc3RgIGNoYWluIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlWQEgIHRyYW5zZmVyLCB3aGljaCBhbHNvIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIHRoZSBhc3NldHMgb24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuUGFkZF9hdXRob3JpemVkX2FsaWFzCAEcYWxpYXNlckkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcZXhwaXJlcxUDASxPcHRpb248dTY0PgAOLF0BQXV0aG9yaXplIGFub3RoZXIgYGFsaWFzZXJgIGxvY2F0aW9uIHRvIGFsaWFzIGludG8gdGhlIGxvY2FsIGBvcmlnaW5gIG1ha2luZyB0aGlzIGNhbGwuKQFUaGUgYGFsaWFzZXJgIGlzIG9ubHkgYXV0aG9yaXplZCB1bnRpbCB0aGUgcHJvdmlkZWQgYGV4cGlyeWAgYmxvY2sgbnVtYmVyLkkBVGhlIGNhbGwgY2FuIGFsc28gYmUgdXNlZCBmb3IgYSBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYWxpYXMgaW4gb3JkZXIgdG8gdXBkYXRlIGl0c1hgZXhwaXJ5YCBibG9jayBudW1iZXIuAFEBVXN1YWxseSB1c2VmdWwgdG8gYWxsb3cgeW91ciBsb2NhbCBhY2NvdW50IHRvIGJlIGFsaWFzZWQgaW50byBmcm9tIGEgcmVtb3RlIGxvY2F0aW9u9GFsc28gdW5kZXIgeW91ciBjb250cm9sIChsaWtlIHlvdXIgYWNjb3VudCBvbiBhbm90aGVyIGNoYWluKS4AUQFXQVJOSU5HOiBtYWtlIHN1cmUgdGhlIGNhbGxlciBgb3JpZ2luYCAoeW91KSB0cnVzdHMgdGhlIGBhbGlhc2VyYCBsb2NhdGlvbiB0byBhY3QgaW5ZAXRoZWlyL3lvdXIgbmFtZS4gT25jZSBhdXRob3JpemVkIHVzaW5nIHRoaXMgY2FsbCwgdGhlIGBhbGlhc2VyYCBjYW4gZnJlZWx5IGltcGVyc29uYXRl1GBvcmlnaW5gIGluIFhDTSBwcm9ncmFtcyBleGVjdXRlZCBvbiB0aGUgbG9jYWwgY2hhaW4uXHJlbW92ZV9hdXRob3JpemVkX2FsaWFzBAEcYWxpYXNlckkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AA8IXQFSZW1vdmUgYSBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYGFsaWFzZXJgIGZyb20gdGhlIGxpc3Qgb2YgbG9jYXRpb25zIHRoYXQgY2FuIGFsaWFzIGludG+QdGhlIGxvY2FsIGBvcmlnaW5gIG1ha2luZyB0aGlzIGNhbGwudHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzABAISQFSZW1vdmUgYWxsIHByZXZpb3VzbHkgYXV0aG9yaXplZCBgYWxpYXNlcmBzIHRoYXQgY2FuIGFsaWFzIGludG8gdGhlIGxvY2FsIGBvcmlnaW5gRG1ha2luZyB0aGlzIGNhbGwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkBCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjMEAE0BAUR2Mzo6TXVsdGlMb2NhdGlvbgADAAhWNAQAYQEBMHY0OjpMb2NhdGlvbgAEAAhWNQQA4AEwdjU6OkxvY2F0aW9uAAUAAE0BECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9yUQEBJEp1bmN0aW9ucwAAUQEQDHhjbQh2MyRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEAFUBASBKdW5jdGlvbgABAAhYMggAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAgAIWDMMAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAwAIWDQQAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAEAAhYNRQAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ABQAIWDYYAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ABgAIWDccAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAHAAhYOCAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ACAAAVQEQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAGABDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmtZAQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAgBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya1kBAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4tAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmtZAQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXkcASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQADAEIdTgABAAwR2VuZXJhbEluZGV4BADAARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgMAQh1OAABEGRhdGEIASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWT4ARhCb2R5SWQAARBwYXJ0/AEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBABdAQEkTmV0d29ya0lkAAkAAFkBBBhPcHRpb24EBFQBXQEBCBBOb25lAAAAEFNvbWUEAF0BAAABAABdARAMeGNtCHYzIGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAgBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcigBDHU2NAABKGJsb2NrX2hhc2gIASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAABhARAsc3RhZ2luZ194Y20IdjQgbG9jYXRpb24gTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9yZQEBJEp1bmN0aW9ucwAAZQEQLHN0YWdpbmdfeGNtCHY0JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAaQEBSEFyYzxbSnVuY3Rpb247IDFdPgABAAhYMgQAeQEBSEFyYzxbSnVuY3Rpb247IDJdPgACAAhYMwQAfQEBSEFyYzxbSnVuY3Rpb247IDNdPgADAAhYNAQAgQEBSEFyYzxbSnVuY3Rpb247IDRdPgAEAAhYNQQAhQEBSEFyYzxbSnVuY3Rpb247IDVdPgAFAAhYNgQAiQEBSEFyYzxbSnVuY3Rpb247IDZdPgAGAAhYNwQAjQEBSEFyYzxbSnVuY3Rpb247IDddPgAHAAhYOAQAkQEBSEFyYzxbSnVuY3Rpb247IDhdPgAIAABpAQAAAwEAAABtAQBtARAsc3RhZ2luZ194Y20IdjQganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBABgAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrcQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQIASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmtxAQFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleLQBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrcQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V5HAEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAwBCHU4AAQAMEdlbmVyYWxJbmRleAQAwAEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoDAEIdTgAARBkYXRhCAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk+AEYQm9keUlkAAEQcGFydPwBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAdQEBJE5ldHdvcmtJZAAJAABxAQQYT3B0aW9uBARUAXUBAQgQTm9uZQAAABBTb21lBAB1AQAAAQAAdQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAgBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcigBDHU2NAABKGJsb2NrX2hhc2gIASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAB5AQAAAwIAAABtAQB9AQAAAwMAAABtAQCBAQAAAwQAAABtAQCFAQAAAwUAAABtAQCJAQAAAwYAAABtAQCNAQAAAwcAAABtAQCRAQAAAwgAAABtAQCVAQgMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAJkBAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAEQIBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BABdAgFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAAmQEMDHhjbQh2MwxYY20EEENhbGwAAAQAnQEBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAJ0BAAACoQEAoQEMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAClAQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAClAQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQApQEBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZLQBHFF1ZXJ5SWQAASByZXNwb25zZcUBASBSZXNwb25zZQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAEccXVlcmllcvEBAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5TQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHOlAQEsTXVsdGlBc3NldHMAARBkZXN0TQEBNE11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5k9QEBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N01QEBGFdlaWdodAABEGNhbGz5AQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBABRAQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAD9AQFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeU0BATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlAQIBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW50pQEBLE11bHRpQXNzZXRzAAEcbWF4aW1hbMgBEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZv/QEBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc60BAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACZAQEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACZAQEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABGHRpY2tldE0BATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQApQEBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAClAQEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADxAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/9AQFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAD9AQFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAFUBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya10BASROZXR3b3JrSWQAASxkZXN0aW5hdGlvblEBAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldK0BAShNdWx0aUFzc2V0AAEgdW5sb2NrZXJNAQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARh0YXJnZXRNAQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARRvd25lck0BATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldK0BAShNdWx0aUFzc2V0AAEYbG9ja2VyTQEBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBABNAQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7xAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAKUBEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACpAQE8VmVjPE11bHRpQXNzZXQ+AACpAQAAAq0BAK0BEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZLEBARxBc3NldElkAAEMZnVutQEBLEZ1bmdpYmlsaXR5AACxARAMeGNtCHYzKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQATQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEAAgBIFt1ODsgMzJdAAEAALUBEAx4Y20IdjMobXVsdGlhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQAwAEQdTEyOAAAACxOb25GdW5naWJsZQQAuQEBNEFzc2V0SW5zdGFuY2UAAQAAuQEQDHhjbQh2MyhtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADAARB1MTI4AAEAGEFycmF5NAQAcAEcW3U4OyA0XQACABhBcnJheTgEAL0BARxbdTg7IDhdAAMAHEFycmF5MTYEAMEBASBbdTg7IDE2XQAEABxBcnJheTMyBAAIASBbdTg7IDMyXQAFAAC9AQAAAwgAAAAMAMEBAAADEAAAAAwAxQEMDHhjbQh2MyBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQApQEBLE11bHRpQXNzZXRzAAEAPEV4ZWN1dGlvblJlc3VsdAQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AAIAHFZlcnNpb24EADgBOHN1cGVyOjpWZXJzaW9uAAMALFBhbGxldHNJbmZvBADZAQGYQm91bmRlZFZlYzxQYWxsZXRJbmZvLCBNYXhQYWxsZXRzSW5mbz4ABAA4RGlzcGF0Y2hSZXN1bHQEAOkBAThNYXliZUVycm9yQ29kZQAFAADJAQQYT3B0aW9uBARUAc0BAQgQTm9uZQAAABBTb21lBADNAQAAAQAAzQEAAAQIONEBANEBEAx4Y20IdjMYdHJhaXRzFEVycm9yAAGgIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwAwTG9jYXRpb25GdWxsAAQAVExvY2F0aW9uTm90SW52ZXJ0aWJsZQAFACRCYWRPcmlnaW4ABgA8SW52YWxpZExvY2F0aW9uAAcANEFzc2V0Tm90Rm91bmQACABURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAkAPE5vdFdpdGhkcmF3YWJsZQAKAEhMb2NhdGlvbkNhbm5vdEhvbGQACwBURXhjZWVkc01heE1lc3NhZ2VTaXplAAwAWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQADQAkVHJhbnNwb3J0AA4AKFVucm91dGFibGUADwAwVW5rbm93bkNsYWltABAAOEZhaWxlZFRvRGVjb2RlABEAQE1heFdlaWdodEludmFsaWQAEgA4Tm90SG9sZGluZ0ZlZXMAEwAwVG9vRXhwZW5zaXZlABQAEFRyYXAEACgBDHU2NAAVAEBFeHBlY3RhdGlvbkZhbHNlABYAOFBhbGxldE5vdEZvdW5kABcAME5hbWVNaXNtYXRjaAAYAExWZXJzaW9uSW5jb21wYXRpYmxlABkAUEhvbGRpbmdXb3VsZE92ZXJmbG93ABoALEV4cG9ydEVycm9yABsAOFJlYW5jaG9yRmFpbGVkABwAGE5vRGVhbAAdAChGZWVzTm90TWV0AB4AJExvY2tFcnJvcgAfADBOb1Blcm1pc3Npb24AIAAoVW5hbmNob3JlZAAhADhOb3REZXBvc2l0YWJsZQAiAExVbmhhbmRsZWRYY21WZXJzaW9uACMASFdlaWdodExpbWl0UmVhY2hlZAQA1QEBGFdlaWdodAAkABxCYXJyaWVyACUATFdlaWdodE5vdENvbXB1dGFibGUAJgBERXhjZWVkc1N0YWNrTGltaXQAJwAA1QEMKHNwX3dlaWdodHMkd2VpZ2h0X3YyGFdlaWdodAAACAEgcmVmX3RpbWW0AQx1NjQAAShwcm9vZl9zaXpltAEMdTY0AADZAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAd0BBFMAAAQA5QEBGFZlYzxUPgAA3QEMDHhjbQh2MyhQYWxsZXRJbmZvAAAYARRpbmRleGABDHUzMgABEG5hbWXhAQGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZeEBAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yYAEMdTMyAAEUbWlub3JgAQx1MzIAARRwYXRjaGABDHUzMgAA4QEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADlAQAAAt0BAOkBDAx4Y20IdjM4TWF5YmVFcnJvckNvZGUAAQwcU3VjY2VzcwAAABRFcnJvcgQA7QEBjEJvdW5kZWRWZWM8dTgsIE1heERpc3BhdGNoRXJyb3JMZW4+AAEAOFRydW5jYXRlZEVycm9yBADtAQGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAgAA7QEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADxAQQYT3B0aW9uBARUAU0BAQgQTm9uZQAAABBTb21lBABNAQAAAQAA9QEMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAA+QEMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkGAEcVmVjPHU4PgAA/QEMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb25NAQE0TXVsdGlMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAABAhAMeGNtCHYzKG11bHRpYXNzZXRATXVsdGlBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQApQEBLE11bHRpQXNzZXRzAAAAEFdpbGQEAAUCAThXaWxkTXVsdGlBc3NldAABAAAFAhAMeGNtCHYzKG11bHRpYXNzZXQ4V2lsZE11bHRpQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWSxAQEcQXNzZXRJZAABDGZ1bgkCATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQAYAEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlksQEBHEFzc2V0SWQAAQxmdW4JAgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnRgAQx1MzIAAwAACQIQDHhjbQh2MyhtdWx0aWFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAAANAgwMeGNtCHYzLFdlaWdodExpbWl0AAEIJFVubGltaXRlZAAAABxMaW1pdGVkBADVAQEYV2VpZ2h0AAEAABECDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAFQIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AABUCAAACGQIAGQIMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAB0CARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAAdAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAB0CARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlNQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVySQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cx0CARhBc3NldHMAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cx0CARhBc3NldHMAARBkZXN0YQEBIExvY2F0aW9uAAEMeGNtEQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdNUBARhXZWlnaHQAARBjYWxs+QEBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAZQEBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAE0CAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNRAgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlUQIBLEFzc2V0RmlsdGVyAAEQd2FudB0CARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c1ECASxBc3NldEZpbHRlcgABHHJlc2VydmVhAQEgTG9jYXRpb24AAQx4Y20RAgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMlAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEABECASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEABECASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzHQIBGEFzc2V0cwABGHRpY2tldGEBASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAB0CARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAB0CARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBABJAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQATQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBABtAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmt1AQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb25lAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbRECARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0JQIBFEFzc2V0AAEgdW5sb2NrZXJhAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldCUCARRBc3NldAABGHRhcmdldGEBASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0JQIBFEFzc2V0AAEUb3duZXJhAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0JQIBFEFzc2V0AAEYbG9ja2VyYQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3yAEQYm9vbAArACBTZXRUb3BpYwQACAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQAYQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbkkCAUBPcHRpb248TG9jYXRpb24+AC8AAB0CECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAIQIBKFZlYzxBc3NldD4AACECAAACJQIAJQIQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZCkCARxBc3NldElkAAEMZnVuLQIBLEZ1bmdpYmlsaXR5AAApAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABABhAQEgTG9jYXRpb24AAC0CECxzdGFnaW5nX3hjbQh2NBRhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQAwAEQdTEyOAAAACxOb25GdW5naWJsZQQAMQIBNEFzc2V0SW5zdGFuY2UAAQAAMQIQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADAARB1MTI4AAEAGEFycmF5NAQAcAEcW3U4OyA0XQACABhBcnJheTgEAL0BARxbdTg7IDhdAAMAHEFycmF5MTYEAMEBASBbdTg7IDE2XQAEABxBcnJheTMyBAAIASBbdTg7IDMyXQAFAAA1Agwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAB0CARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAOAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EADkCAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQA6QEBOE1heWJlRXJyb3JDb2RlAAUAADkCDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBPQIEUwAABABFAgEYVmVjPFQ+AAA9Agwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXhgAQx1MzIAARBuYW1lQQIBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVBAgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcmABDHUzMgABFG1pbm9yYAEMdTMyAAEUcGF0Y2hgAQx1MzIAAEECDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAARQIAAAI9AgBJAgQYT3B0aW9uBARUAWEBAQgQTm9uZQAAABBTb21lBABhAQAAAQAATQIMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbmEBASBMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AABRAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAB0CARhBc3NldHMAAAAQV2lsZAQAVQIBJFdpbGRBc3NldAABAABVAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkKQIBHEFzc2V0SWQAAQxmdW5ZAgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAGABDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZCkCARxBc3NldElkAAEMZnVuWQIBPFdpbGRGdW5naWJpbGl0eQABFGNvdW50YAEMdTMyAAMAAFkCECxzdGFnaW5nX3hjbQh2NBRhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAXQIMLHN0YWdpbmdfeGNtCHY1DFhjbQQQQ2FsbAAABABhAgFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAYQIAAAJlAgBlAgwsc3RhZ2luZ194Y20IdjUsSW5zdHJ1Y3Rpb24EEENhbGwAAdA0V2l0aGRyYXdBc3NldAQAaQIBGEFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAGkCARhBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAaQIBGEFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWS0ARxRdWVyeUlkAAEgcmVzcG9uc2WBAgEgUmVzcG9uc2UAAShtYXhfd2VpZ2h01QEBGFdlaWdodAABHHF1ZXJpZXKhAgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzaQIBGEFzc2V0cwABLGJlbmVmaWNpYXJ54AEgTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHNpAgEYQXNzZXRzAAEQZGVzdOABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodKUCAThPcHRpb248V2VpZ2h0PgABEGNhbGz5AQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBACpAgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnngASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEQZGVzdOABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWtAgEsQXNzZXRGaWx0ZXIAARB3YW50aQIBGEFzc2V0cwABHG1heGltYWzIARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZeABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXNxAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAF0CASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAF0CASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzaQIBGEFzc2V0cwABGHRpY2tldOABIExvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAaQIBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQAaQIBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAKECAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBACFAgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm+pAgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBACpAgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAOwBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3Jr9AEkTmV0d29ya0lkAAEsZGVzdGluYXRpb27kAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRxAgEUQXNzZXQAASB1bmxvY2tlcuABIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXRxAgEUQXNzZXQAARh0YXJnZXTgASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0cQIBFEFzc2V0AAEUb3duZXLgASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRxAgEUQXNzZXQAARhsb2NrZXLgASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhd8gBEGJvb2wAKwAgU2V0VG9waWMEAAgBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAOABIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbqECAUBPcHRpb248TG9jYXRpb24+AC8AHFBheUZlZXMEARRhc3NldHECARRBc3NldAAwAEBJbml0aWF0ZVRyYW5zZmVyFAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzuQIBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbsgBEGJvb2wAARhhc3NldHPBAgHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtXQIBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbskCAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y21dAgEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHPNAgGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAAGkCECxzdGFnaW5nX3hjbQh2NRRhc3NldBhBc3NldHMAAAQAbQIBKFZlYzxBc3NldD4AAG0CAAACcQIAcQIQLHN0YWdpbmdfeGNtCHY1FGFzc2V0FEFzc2V0AAAIAQhpZHUCARxBc3NldElkAAEMZnVueQIBLEZ1bmdpYmlsaXR5AAB1AhAsc3RhZ2luZ194Y20IdjUUYXNzZXQcQXNzZXRJZAAABADgASBMb2NhdGlvbgAAeQIQLHN0YWdpbmdfeGNtCHY1FGFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBADAARB1MTI4AAAALE5vbkZ1bmdpYmxlBAB9AgE0QXNzZXRJbnN0YW5jZQABAAB9AhAsc3RhZ2luZ194Y20IdjUUYXNzZXQ0QXNzZXRJbnN0YW5jZQABGCRVbmRlZmluZWQAAAAUSW5kZXgEAMABEHUxMjgAAQAYQXJyYXk0BABwARxbdTg7IDRdAAIAGEFycmF5OAQAvQEBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwQEBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAgBIFt1ODsgMzJdAAUAAIECDCxzdGFnaW5nX3hjbQh2NSBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQAaQIBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEAIUCAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAA4AThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAkQIBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BADpAQE4TWF5YmVFcnJvckNvZGUABQAAhQIEGE9wdGlvbgQEVAGJAgEIEE5vbmUAAAAQU29tZQQAiQIAAAEAAIkCAAAECDiNAgCNAhAMeGNtCHY1GHRyYWl0cxRFcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAoAQx1NjQAFQBARXhwZWN0YXRpb25GYWxzZQAWADhQYWxsZXROb3RGb3VuZAAXADBOYW1lTWlzbWF0Y2gAGABMVmVyc2lvbkluY29tcGF0aWJsZQAZAFBIb2xkaW5nV291bGRPdmVyZmxvdwAaACxFeHBvcnRFcnJvcgAbADhSZWFuY2hvckZhaWxlZAAcABhOb0RlYWwAHQAoRmVlc05vdE1ldAAeACRMb2NrRXJyb3IAHwAwTm9QZXJtaXNzaW9uACAAKFVuYW5jaG9yZWQAIQA4Tm90RGVwb3NpdGFibGUAIgA0VG9vTWFueUFzc2V0cwAjAExVbmhhbmRsZWRYY21WZXJzaW9uACQASFdlaWdodExpbWl0UmVhY2hlZAQA1QEBGFdlaWdodAAlABxCYXJyaWVyACYATFdlaWdodE5vdENvbXB1dGFibGUAJwBERXhjZWVkc1N0YWNrTGltaXQAKAAAkQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGVAgRTAAAEAJ0CARhWZWM8VD4AAJUCDCxzdGFnaW5nX3hjbQh2NShQYWxsZXRJbmZvAAAYARRpbmRleGABDHUzMgABEG5hbWWZAgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZZkCAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yYAEMdTMyAAEUbWlub3JgAQx1MzIAARRwYXRjaGABDHUzMgAAmQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AACdAgAAApUCAKECBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAApQIEGE9wdGlvbgQEVAHVAQEIEE5vbmUAAAAQU29tZQQA1QEAAAEAAKkCDCxzdGFnaW5nX3hjbQh2NURRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AACtAhAsc3RhZ2luZ194Y20IdjUUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAGkCARhBc3NldHMAAAAQV2lsZAQAsQIBJFdpbGRBc3NldAABAACxAhAsc3RhZ2luZ194Y20IdjUUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkdQIBHEFzc2V0SWQAAQxmdW61AgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAGABDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZHUCARxBc3NldElkAAEMZnVutQIBPFdpbGRGdW5naWJpbGl0eQABFGNvdW50YAEMdTMyAAMAALUCECxzdGFnaW5nX3hjbQh2NRRhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAuQIEGE9wdGlvbgQEVAG9AgEIEE5vbmUAAAAQU29tZQQAvQIAAAEAAL0CECxzdGFnaW5nX3hjbQh2NRRhc3NldExBc3NldFRyYW5zZmVyRmlsdGVyAAEMIFRlbGVwb3J0BACtAgEsQXNzZXRGaWx0ZXIAAAA4UmVzZXJ2ZURlcG9zaXQEAK0CASxBc3NldEZpbHRlcgABADxSZXNlcnZlV2l0aGRyYXcEAK0CASxBc3NldEZpbHRlcgACAADBAgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAb0CBFMAAAQAxQIBGFZlYzxUPgAAxQIAAAK9AgDJAgQYT3B0aW9uBARUAeQBCBBOb25lAAAAEFNvbWUEAOQAAAEAAM0CDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB0QIEUwAABADVAgEYVmVjPFQ+AADRAgwsc3RhZ2luZ194Y20IdjUQSGludAABBDBBc3NldENsYWltZXIEASBsb2NhdGlvbuABIExvY2F0aW9uAAAAANUCAAAC0QIA2QIIDHhjbTxWZXJzaW9uZWRBc3NldHMAAQwIVjMEAKUBATx2Mzo6TXVsdGlBc3NldHMAAwAIVjQEAB0CASh2NDo6QXNzZXRzAAQACFY1BABpAgEodjU6OkFzc2V0cwAFAADdAggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAOECAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQA8QIBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BAD9AgFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAA4QIMDHhjbQh2MwxYY20EEENhbGwAAAQA5QIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAOUCAAAC6QIA6QIMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAClAQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAClAQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQApQEBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZLQBHFF1ZXJ5SWQAASByZXNwb25zZcUBASBSZXNwb25zZQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAEccXVlcmllcvEBAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5TQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHOlAQEsTXVsdGlBc3NldHMAARBkZXN0TQEBNE11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5k9QEBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N01QEBGFdlaWdodAABEGNhbGztAgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBABRAQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAD9AQFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeU0BATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlAQIBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW50pQEBLE11bHRpQXNzZXRzAAEcbWF4aW1hbMgBEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZv/QEBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc60BAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADhAgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BADhAgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABGHRpY2tldE0BATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQApQEBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAClAQEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADxAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/9AQFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAD9AQFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAFUBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya10BASROZXR3b3JrSWQAASxkZXN0aW5hdGlvblEBAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldK0BAShNdWx0aUFzc2V0AAEgdW5sb2NrZXJNAQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARh0YXJnZXRNAQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARRvd25lck0BATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldK0BAShNdWx0aUFzc2V0AAEYbG9ja2VyTQEBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBABNAQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7xAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAO0CDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZBgBHFZlYzx1OD4AAPECDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQA9QIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAPUCAAAC+QIA+QIMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAB0CARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAAdAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAB0CARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlNQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVySQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cx0CARhBc3NldHMAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cx0CARhBc3NldHMAARBkZXN0YQEBIExvY2F0aW9uAAEMeGNtEQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdNUBARhXZWlnaHQAARBjYWxs7QIBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAZQEBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAE0CAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNRAgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlUQIBLEFzc2V0RmlsdGVyAAEQd2FudB0CARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c1ECASxBc3NldEZpbHRlcgABHHJlc2VydmVhAQEgTG9jYXRpb24AAQx4Y20RAgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMlAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAPECASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAPECASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzHQIBGEFzc2V0cwABGHRpY2tldGEBASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAB0CARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAB0CARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBABJAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQATQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBABtAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmt1AQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb25lAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbRECARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0JQIBFEFzc2V0AAEgdW5sb2NrZXJhAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldCUCARRBc3NldAABGHRhcmdldGEBASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0JQIBFEFzc2V0AAEUb3duZXJhAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0JQIBFEFzc2V0AAEYbG9ja2VyYQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3yAEQYm9vbAArACBTZXRUb3BpYwQACAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQAYQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbkkCAUBPcHRpb248TG9jYXRpb24+AC8AAP0CDCxzdGFnaW5nX3hjbQh2NQxYY20EEENhbGwAAAQAAQMBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAAEDAAACBQMABQMMLHN0YWdpbmdfeGNtCHY1LEluc3RydWN0aW9uBBBDYWxsAAHQNFdpdGhkcmF3QXNzZXQEAGkCARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABpAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAGkCARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlgQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVyoQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c2kCARhBc3NldHMAASxiZW5lZmljaWFyeeABIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzaQIBGEFzc2V0cwABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmT1AQEoT3JpZ2luS2luZAABTGZhbGxiYWNrX21heF93ZWlnaHSlAgE4T3B0aW9uPFdlaWdodD4AARBjYWxs7QIBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQA5AFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c60CASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlrQIBLEFzc2V0RmlsdGVyAAEQd2FudGkCARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABHHJlc2VydmXgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHOtAgEsQXNzZXRGaWx0ZXIAARBkZXN04AEgTG9jYXRpb24AAQx4Y21dAgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb6kCAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c60CASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzcQIBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBAD9AgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BAD9AgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c2kCARhBc3NldHMAARh0aWNrZXTgASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAGkCARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAGkCARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAChAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAhQIBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBADsASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya/QBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9u5AFASW50ZXJpb3JMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0cQIBFEFzc2V0AAEgdW5sb2NrZXLgASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0cQIBFEFzc2V0AAEYdGFyZ2V04AEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldHECARRBc3NldAABFG93bmVy4AEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0cQIBFEFzc2V0AAEYbG9ja2Vy4AEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBADgASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW6hAgFAT3B0aW9uPExvY2F0aW9uPgAvABxQYXlGZWVzBAEUYXNzZXRxAgEUQXNzZXQAMABASW5pdGlhdGVUcmFuc2ZlchQBLGRlc3RpbmF0aW9u4AEgTG9jYXRpb24AASxyZW1vdGVfZmVlc7kCAWxPcHRpb248QXNzZXRUcmFuc2ZlckZpbHRlcj4AATxwcmVzZXJ2ZV9vcmlnaW7IARBib29sAAEYYXNzZXRzwQIB4EJvdW5kZWRWZWM8QXNzZXRUcmFuc2ZlckZpbHRlciwgTWF4QXNzZXRUcmFuc2ZlckZpbHRlcnM+AAEocmVtb3RlX3hjbV0CARxYY208KCk+ADEAREV4ZWN1dGVXaXRoT3JpZ2luCAFEZGVzY2VuZGFudF9vcmlnaW7JAgFgT3B0aW9uPEludGVyaW9yTG9jYXRpb24+AAEMeGNt/QIBJFhjbTxDYWxsPgAyACBTZXRIaW50cwQBFGhpbnRzzQIBhEJvdW5kZWRWZWM8SGludCwgSGludE51bVZhcmlhbnRzPgAzAAAJAwQYT3B0aW9uBARUATgBCBBOb25lAAAAEFNvbWUEADgAAAEAAA0DEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQASQEBRFZlcnNpb25lZExvY2F0aW9uAAMAABEDCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABDAhWMwQAsQEBLHYzOjpBc3NldElkAAMACFY0BAApAgEsdjQ6OkFzc2V0SWQABAAIVjUEAHUCASx2NTo6QXNzZXRJZAAFAAAVAwQYT3B0aW9uBARUASgBCBBOb25lAAAAEFNvbWUEACgAAAEAABkDDEhjdW11bHVzX3BhbGxldF94Y20YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQMMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXg4ASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZTgBJFBhZ2VJbmRleAABFGluZGV4OAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdNUBARhXZWlnaHQAATR4RXhlY3V0ZSBhbiBvdmVyd2VpZ2h0IG1lc3NhZ2UuAE0BVGVtcG9yYXJ5IHByb2Nlc3NpbmcgZXJyb3JzIHdpbGwgYmUgcHJvcGFnYXRlZCB3aGVyZWFzIHBlcm1hbmVudCBlcnJvcnMgYXJlIHRyZWF0ZWRUYXMgc3VjY2VzcyBjb25kaXRpb24uAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLjUBLSBgbWVzc2FnZV9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgYXJyaXZlZC49AS0gYHBhZ2VgOiBUaGUgcGFnZSBpbiB0aGUgcXVldWUgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgaXMgc2l0dGluZy4JAS0gYGluZGV4YDogVGhlIGluZGV4IGludG8gdGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkLlkBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCBhbGxvd2VkIHRvIGJlIGNvbnN1bWVkIGluIHRoZSBleGVjdXRpb25EICBvZiB0aGUgbWVzc2FnZS4A9EJlbmNobWFyayBjb21wbGV4aXR5IGNvbnNpZGVyYXRpb25zOiBPKGluZGV4ICsgd2VpZ2h0X2xpbWl0KS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQMIXGN1bXVsdXNfcHJpbWl0aXZlc19jb3JlWEFnZ3JlZ2F0ZU1lc3NhZ2VPcmlnaW4AAQwQSGVyZQAAABhQYXJlbnQAAQAcU2libGluZwQAnAEYUGFyYUlkAAIAACUDDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABIBRiYXRjaAQBFGNhbGxzKQMBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4LQMBDHUxNgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAE03FNlbmQgYSBjYWxsIHRocm91Z2ggYW4gaW5kZXhlZCBwc2V1ZG9ueW0gb2YgdGhlIHNlbmRlci4AVQFGaWx0ZXIgZnJvbSBvcmlnaW4gYXJlIHBhc3NlZCBhbG9uZy4gVGhlIGNhbGwgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYW4gb3JpZ2luIHdoaWNovHVzZSB0aGUgc2FtZSBmaWx0ZXIgYXMgdGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwuAEUBTk9URTogSWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYW55IGFjY291bnQtYmFzZWQgZmlsdGVyaW5nIGlzIG5vdCBob25vcmVkIChpLmUuYQFiZWNhdXNlIHlvdSBleHBlY3QgYHByb3h5YCB0byBoYXZlIGJlZW4gdXNlZCBwcmlvciBpbiB0aGUgY2FsbCBzdGFjayBhbmQgeW91IGRvIG5vdCB3YW50UQF0aGUgY2FsbCByZXN0cmljdGlvbnMgdG8gYXBwbHkgdG8gYW55IHN1Yi1hY2NvdW50cyksIHRoZW4gdXNlIGBhc19tdWx0aV90aHJlc2hvbGRfMWB8aW4gdGhlIE11bHRpc2lnIHBhbGxldCBpbnN0ZWFkLgD0Tk9URTogUHJpb3IgdG8gdmVyc2lvbiAqMTIsIHRoaXMgd2FzIGNhbGxlZCBgYXNfbGltaXRlZF9zdWJgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uJGJhdGNoX2FsbAQBFGNhbGxzKQMBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAjTsU2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzIGFuZCBhdG9taWNhbGx5IGV4ZWN1dGUgdGhlbS4hAVRoZSB3aG9sZSB0cmFuc2FjdGlvbiB3aWxsIHJvbGxiYWNrIGFuZCBmYWlsIGlmIGFueSBvZiB0aGUgY2FsbHMgZmFpbGVkLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLixkaXNwYXRjaF9hcwgBJGFzX29yaWdpbjEDAVRCb3g8VDo6UGFsbGV0c09yaWdpbj4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADGMhEaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgcHJvdmlkZWQgb3JpZ2luLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuLGZvcmNlX2JhdGNoBAEUY2FsbHMpAwF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAENHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMu1FVubGlrZSBgYmF0Y2hgLCBpdCBhbGxvd3MgZXJyb3JzIGFuZCB3b24ndCBpbnRlcnJ1cHQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAE0BSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLix3aXRoX3dlaWdodAgBEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h01QEBGFdlaWdodAAFGMREaXNwYXRjaCBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHNwZWNpZmllZCB3ZWlnaHQuAC0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhluFJvb3Qgb3JpZ2luIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4caWZfZWxzZQgBEG1haW4gAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEgZmFsbGJhY2sgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAZcFQFEaXNwYXRjaCBhIGZhbGxiYWNrIGNhbGwgaW4gdGhlIGV2ZW50IHRoZSBtYWluIGNhbGwgZmFpbHMgdG8gZXhlY3V0ZS6wTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4A5FRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGhlIGBtYWluYCBjYWxsLtRJZiB0aGUgYG1haW5gIGNhbGwgZmFpbHMsIHRoZSBgZmFsbGJhY2tgIGlzIGF0dGVtdGVkLhUBaWYgdGhlIGZhbGxiYWNrIGlzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLCB0aGUgd2VpZ2h0cyBvZiBib3RoIGNhbGxzJQFhcmUgYWNjdW11bGF0ZWQgYW5kIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1haW4gY2FsbCBlcnJvciBpcyBkZXBvc2l0ZWQuANxJbiB0aGUgZXZlbnQgb2YgYSBmYWxsYmFjayBmYWlsdXJlIHRoZSB3aG9sZSBjYWxsIGZhaWxzaHdpdGggdGhlIHdlaWdodHMgcmV0dXJuZWQuAEEBLSBgbWFpbmA6IFRoZSBtYWluIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC4gVGhpcyBpcyB0aGUgcHJpbWFyeSBhY3Rpb24gdG8gZXhlY3V0ZS49AS0gYGZhbGxiYWNrYDogVGhlIGZhbGxiYWNrIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZCBpbiBjYXNlIHRoZSBgbWFpbmAgY2FsbCBmYWlscy4ARCMjIERpc3BhdGNoIExvZ2ljQQEtIElmIHRoZSBvcmlnaW4gaXMgYHJvb3RgLCBib3RoIHRoZSBtYWluIGFuZCBmYWxsYmFjayBjYWxscyBhcmUgZXhlY3V0ZWQgd2l0aG91dHggIGFwcGx5aW5nIGFueSBvcmlnaW4gZmlsdGVycy5JAS0gSWYgdGhlIG9yaWdpbiBpcyBub3QgYHJvb3RgLCB0aGUgb3JpZ2luIGZpbHRlciBpcyBhcHBsaWVkIHRvIGJvdGggdGhlIGBtYWluYCBhbmRMICBgZmFsbGJhY2tgIGNhbGxzLgAsIyMgVXNlIENhc2VZAS0gU29tZSB1c2UgY2FzZXMgbWlnaHQgaW52b2x2ZSBzdWJtaXR0aW5nIGEgYGJhdGNoYCB0eXBlIGNhbGwgaW4gZWl0aGVyIG1haW4sIGZhbGxiYWNrKCAgb3IgYm90aC5QZGlzcGF0Y2hfYXNfZmFsbGlibGUIASRhc19vcmlnaW4xAwFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABxTIRGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHByb3ZpZGVkIG9yaWdpbi4AUQFBbG1vc3QgdGhlIHNhbWUgYXMgW2BQYWxsZXQ6OmRpc3BhdGNoX2FzYF0gYnV0IGZvcndhcmRzIGFueSBlcnJvciBvZiB0aGUgaW5uZXIgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQMAAAIgAC0DAAAFBAAxAwhkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZTBPcmlnaW5DYWxsZXIAASgYc3lzdGVtBAA1AwF0ZnJhbWVfc3lzdGVtOjpPcmlnaW48UnVudGltZT4AAAAsUG9sa2Fkb3RYY20EADkDAUhwYWxsZXRfeGNtOjpPcmlnaW4AHwAoQ3VtdWx1c1hjbQQAPQMBaGN1bXVsdXNfcGFsbGV0X3hjbTo6T3JpZ2luACAAGFBlb3BsZQQAQQMBbGluZGl2X3BhbGxldF9wZW9wbGU6Ok9yaWdpbgAzAChQcm9vZk9mSW5rBABNAwGoaW5kaXZfcGFsbGV0X3Byb29mX29mX2luazo6T3JpZ2luPFJ1bnRpbWU+ADUAEEdhbWUEAFEDAYhpbmRpdl9wYWxsZXRfZ2FtZTo6T3JpZ2luPFJ1bnRpbWU+ADcAFFNjb3JlBABVAwGMaW5kaXZfcGFsbGV0X3Njb3JlOjpPcmlnaW48UnVudGltZT4AOAAoUGVvcGxlTGl0ZQQAWQMBpGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZTo6T3JpZ2luPFJ1bnRpbWU+AD4AHE1lbWJlcnMEAF0DAXBpbmRpdl9wYWxsZXRfbWVtYmVyczo6T3JpZ2luAEMAHENvaW5hZ2UEAGEDAZRpbmRpdl9wYWxsZXRfY29pbmFnZTo6T3JpZ2luPFJ1bnRpbWU+AEQAADUDDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoJFJhd09yaWdpbgQkQWNjb3VudElkAQQBEBBSb290AAAAGFNpZ25lZAQABAEkQWNjb3VudElkAAEAEE5vbmUAAgAoQXV0aG9yaXplZAADAAA5AwwocGFsbGV0X3hjbRhwYWxsZXQYT3JpZ2luAAEIDFhjbQQA4AEgTG9jYXRpb24AAAAgUmVzcG9uc2UEAOABIExvY2F0aW9uAAEAAD0DDEhjdW11bHVzX3BhbGxldF94Y20YcGFsbGV0GE9yaWdpbgABCBRSZWxheQAAAEBTaWJsaW5nUGFyYWNoYWluBACcARhQYXJhSWQAAQAAQQMMTGluZGl2X3BhbGxldF9wZW9wbGUYcGFsbGV0GE9yaWdpbgABCEBQZXJzb25hbElkZW50aXR5BAAoAShQZXJzb25hbElkAAAANFBlcnNvbmFsQWxpYXMEAEUDAVhSZXZpc2VkQ29udGV4dHVhbEFsaWFzAAEAAEUDEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5WFJldmlzZWRDb250ZXh0dWFsQWxpYXMAAAwBIHJldmlzaW9uOAE0UmV2aXNpb25JbmRleAABEHJpbmc4ASRSaW5nSW5kZXgAAQhjYUkDATxDb250ZXh0dWFsQWxpYXMAAEkDEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5PENvbnRleHR1YWxBbGlhcwAACAEUYWxpYXMIARRBbGlhcwABHGNvbnRleHQIARxDb250ZXh0AABNAwxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQYT3JpZ2luBARUAAEMWEF1dGhvcml6ZWRBcHBseVdpdGhTaWcEAAQBMFQ6OkFjY291bnRJZAAAAERSZWZlcnJlZENhbmRpZGF0ZQQABAEwVDo6QWNjb3VudElkAAEAQEludml0ZWRDYW5kaWRhdGUEAAQBMFQ6OkFjY291bnRJZAACAABRAwxEaW5kaXZfcGFsbGV0X2dhbWUYcGFsbGV0GE9yaWdpbgQEVAABBBxJbnZpdGVkBAAEATBUOjpBY2NvdW50SWQAAAAAVQMMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQYT3JpZ2luBARUAAEESEFjY291bnRQYXJ0aWNpcGFudAQABAEwVDo6QWNjb3VudElkAAAAAFkDDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUYcGFsbGV0GE9yaWdpbgQEVAABBChMaXRlUGVyc29uBAAEATBUOjpBY2NvdW50SWQAAAAAXQMMUGluZGl2X3BhbGxldF9tZW1iZXJzGHBhbGxldBhPcmlnaW4AAQQsTWVtYmVyQWxpYXMIAAgBKElkZW50aWZpZXIAAEUDAVhSZXZpc2VkQ29udGV4dHVhbEFsaWFzAAAAAGEDDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQYT3JpZ2luBARUAWUDAQgQQ29pbggBHGNvaW5faWQEATBUOjpBY2NvdW50SWQAARBjb2luaQMBEENvaW4AAAAsVW5sb2FkVG9rZW4MATBhbGlhc19wcm9vZnNxAwGsQm91bmRlZFZlYzxQcm9vZk9mPFQ+LCBUOjpNYXhDb25zb2xpZGF0aW9uPgABKHByb3Zlbl9tc2cIASBbdTg7IDMyXQABDGZlZX0DASRVbmxvYWRGZWUAAQAAZQMIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUcUnVudGltZQAAAABpAwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0EENvaW4AAAgBFHZhbHVlbQMBJENvaW5WYWx1ZQABDGFnZS0DAQx1MTYAAG0DAAAFCQBxAwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUDBFMAAAQAeQMBGFZlYzxUPgAAdQMAAAMUAwAADAB5AwAAAnUDAH0DDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQkVW5sb2FkRmVlAAEIHFByZXBhaWQAAAAoRnJvbU91dHB1dAgBSGZlZV9yZWN5Y2xlcl92YWx1ZW0DASRDb2luVmFsdWUAAUhmZWVfcmVjeWNsZXJfaW5kZXg4ASRSaW5nSW5kZXgAAQAAgQMMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQQQ2FsbAQEVAABFFBhc19tdWx0aV90aHJlc2hvbGRfMQgBRG90aGVyX3NpZ25hdG9yaWVzzAFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAMFEBSW1tZWRpYXRlbHkgZGlzcGF0Y2ggYSBtdWx0aS1zaWduYXR1cmUgY2FsbCB1c2luZyBhIHNpbmdsZSBhcHByb3ZhbCBmcm9tIHRoZSBjYWxsZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4APQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gYXJlIHBhcnQgb2YgdGhlAQFtdWx0aS1zaWduYXR1cmUsIGJ1dCBkbyBub3QgcGFydGljaXBhdGUgaW4gdGhlIGFwcHJvdmFsIHByb2Nlc3MuiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4AuFJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkaXNwYXRjaGVkIHJlc3VsdC4ANCMjIENvbXBsZXhpdHkZAU8oWiArIEMpIHdoZXJlIFogaXMgdGhlIGxlbmd0aCBvZiB0aGUgY2FsbCBhbmQgQyBpdHMgZXhlY3V0aW9uIHdlaWdodC4gYXNfbXVsdGkUASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludIUDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAGcVQFSZWdpc3RlciBhcHByb3ZhbCBmb3IgYSBkaXNwYXRjaCB0byBiZSBtYWRlIGZyb20gYSBkZXRlcm1pbmlzdGljIGNvbXBvc2l0ZSBhY2NvdW50IGlm+GFwcHJvdmVkIGJ5IGEgdG90YWwgb2YgYHRocmVzaG9sZCAtIDFgIG9mIGBvdGhlcl9zaWduYXRvcmllc2AuALBJZiB0aGVyZSBhcmUgZW5vdWdoLCB0aGVuIGRpc3BhdGNoIHRoZSBjYWxsLgAtAVBheW1lbnQ6IGBEZXBvc2l0QmFzZWAgd2lsbCBiZSByZXNlcnZlZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgcGx1cz0BYHRocmVzaG9sZGAgdGltZXMgYERlcG9zaXRGYWN0b3JgLiBJdCBpcyByZXR1cm5lZCBvbmNlIHRoaXMgZGlzcGF0Y2ggaGFwcGVucyBvcjRpcyBjYW5jZWxsZWQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AVQEtIGB0aHJlc2hvbGRgOiBUaGUgdG90YWwgbnVtYmVyIG9mIGFwcHJvdmFscyBmb3IgdGhpcyBkaXNwYXRjaCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuQQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gY2FuIGFwcHJvdmUgdGhpc2xkaXNwYXRjaC4gTWF5IG5vdCBiZSBlbXB0eS5ZAS0gYG1heWJlX3RpbWVwb2ludGA6IElmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIHRoaXMgbXVzdCBiZSBgTm9uZWAuIElmIGl0IGlzUQFub3QgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIGl0IG11c3QgYmUgYFNvbWVgLCB3aXRoIHRoZSB0aW1lcG9pbnQgKGJsb2NrIG51bWJlciBhbmTUdHJhbnNhY3Rpb24gaW5kZXgpIG9mIHRoZSBmaXJzdCBhcHByb3ZhbCB0cmFuc2FjdGlvbi6ILSBgY2FsbGA6IFRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgAdAU5PVEU6IFVubGVzcyB0aGlzIGlzIHRoZSBmaW5hbCBhcHByb3ZhbCwgeW91IHdpbGwgZ2VuZXJhbGx5IHdhbnQgdG8gdXNlGQFgYXBwcm92ZV9hc19tdWx0aWAgaW5zdGVhZCwgc2luY2UgaXQgb25seSByZXF1aXJlcyBhIGhhc2ggb2YgdGhlIGNhbGwuAFkBUmVzdWx0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRpc3BhdGNoZWQgcmVzdWx0IGlmIGB0aHJlc2hvbGRgIGlzIGV4YWN0bHkgYDFgLiBPdGhlcndpc2VVAW9uIHN1Y2Nlc3MsIHJlc3VsdCBpcyBgT2tgIGFuZCB0aGUgcmVzdWx0IGZyb20gdGhlIGludGVyaW9yIGNhbGwsIGlmIGl0IHdhcyBleGVjdXRlZCzcbWF5IGJlIGZvdW5kIGluIHRoZSBkZXBvc2l0ZWQgYE11bHRpc2lnRXhlY3V0ZWRgIGV2ZW50LgA0IyMgQ29tcGxleGl0eVAtIGBPKFMgKyBaICsgQ2FsbClgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLiEBLSBPbmUgY2FsbCBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oWilgIHdoZXJlIGBaYCBpcyB0eC1sZW4uvC0gT25lIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhTKWAu1C0gVXAgdG8gb25lIGJpbmFyeSBzZWFyY2ggYW5kIGluc2VydCAoYE8obG9nUyArIFMpYCku+C0gSS9POiAxIHJlYWQgYE8oUylgLCB1cCB0byAxIG11dGF0ZSBgTyhTKWAuIFVwIHRvIG9uZSByZW1vdmUuMC0gT25lIGV2ZW50LmwtIFRoZSB3ZWlnaHQgb2YgdGhlIGBjYWxsYC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuQGFwcHJvdmVfYXNfbXVsdGkUASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludIUDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gIASBbdTg7IDMyXQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAJ4VQFSZWdpc3RlciBhcHByb3ZhbCBmb3IgYSBkaXNwYXRjaCB0byBiZSBtYWRlIGZyb20gYSBkZXRlcm1pbmlzdGljIGNvbXBvc2l0ZSBhY2NvdW50IGlm+GFwcHJvdmVkIGJ5IGEgdG90YWwgb2YgYHRocmVzaG9sZCAtIDFgIG9mIGBvdGhlcl9zaWduYXRvcmllc2AuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLswtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBleGVjdXRlZC4ANQFOT1RFOiBJZiB0aGlzIGlzIHRoZSBmaW5hbCBhcHByb3ZhbCwgeW91IHdpbGwgd2FudCB0byB1c2UgYGFzX211bHRpYCBpbnN0ZWFkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQuTQEtIFN0b3JhZ2U6IGluc2VydHMgb25lIGl0ZW0sIHZhbHVlIHNpemUgYm91bmRlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIGEgZGVwb3NpdBkBICB0YWtlbiBmb3IgaXRzIGxpZmV0aW1lIG9mIGBEZXBvc2l0QmFzZSArIHRocmVzaG9sZCAqIERlcG9zaXRGYWN0b3JgLjxjYW5jZWxfYXNfbXVsdGkQASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludIkDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoCAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uMHBva2VfZGVwb3NpdAwBJHRocmVzaG9sZC0DAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc8wBRFZlYzxUOjpBY2NvdW50SWQ+AAEkY2FsbF9oYXNoCAEgW3U4OyAzMl0ABDT0UG9rZSB0aGUgZGVwb3NpdCByZXNlcnZlZCBmb3IgYW4gZXhpc3RpbmcgbXVsdGlzaWcgb3BlcmF0aW9uLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3Igb2ZcdGhlIG11bHRpc2lnIG9wZXJhdGlvbi4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuABkBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgbmVlZGVkIGZvciB0aGlzIG11bHRpc2lnLj0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZSwgIG11bHRpc2lnLgUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdGhpcyBkZXBvc2l0IGlzIHJlc2VydmVkIGZvci4AjEVtaXRzIGBEZXBvc2l0UG9rZWRgIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoUDBBhPcHRpb24EBFQBiQMBCBBOb25lAAAAEFNvbWUEAIkDAAABAACJAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBOAAIARhoZWlnaHQ4ASxCbG9ja051bWJlcgABFGluZGV4OAEMdTMyAACNAwwscGFsbGV0X3N1ZG8YcGFsbGV0EENhbGwEBFQAARQQc3VkbwQBEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAENQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLlRzdWRvX3VuY2hlY2tlZF93ZWlnaHQIARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABGHdlaWdodNUBARhXZWlnaHQAARQ1AUF1dGhlbnRpY2F0ZXMgdGhlIHN1ZG8ga2V5IGFuZCBkaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGBSb290YCBvcmlnaW4uLQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGWwU3VkbyB1c2VyIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLhxzZXRfa2V5BAEMbmV3AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AAghdAUF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgc3VkbyBrZXkgYW5kIHNldHMgdGhlIGdpdmVuIEFjY291bnRJZCAoYG5ld2ApIGFzIHRoZSBuZXcgc3VkbxBrZXkuHHN1ZG9fYXMIAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMQTQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgU2lnbmVkYCBvcmlnaW4gZnJvbUBhIGdpdmVuIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ocmVtb3ZlX2tleQAEDIRQZXJtYW5lbnRseSByZW1vdmVzIHRoZSBzdWRvIGtleS4AbCoqVGhpcyBjYW5ub3QgYmUgdW4tZG9uZS4qKgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6RAwwwcGFsbGV0X3Byb3h5GHBhbGxldBBDYWxsBARUAAEsFHByb3h5DAEQcmVhbAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZZUDAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAkTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXNlZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoNAS0gYHJlYWxgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBwcm94eSB3aWxsIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZi5hAS0gYGZvcmNlX3Byb3h5X3R5cGVgOiBTcGVjaWZ5IHRoZSBleGFjdCBwcm94eSB0eXBlIHRvIGJlIHVzZWQgYW5kIGNoZWNrZWQgZm9yIHRoaXMgY2FsbC7QLSBgY2FsbGA6IFRoZSBjYWxsIHRvIGJlIG1hZGUgYnkgdGhlIGByZWFsYCBhY2NvdW50LiRhZGRfcHJveHkMASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZZkDATBUOjpQcm94eVR5cGUAARRkZWxheTgBREJsb2NrTnVtYmVyRm9yPFQ+AAEkRQFSZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIgdGhhdCBpcyBhYmxlIHRvIG1ha2UgY2FsbHMgb24gaXRzIGJlaGFsZi4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoRAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byBtYWtlIGEgcHJveHku/C0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgYWxsb3dlZCBmb3IgdGhpcyBwcm94eSBhY2NvdW50Lk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4wcmVtb3ZlX3Byb3h5DAEgZGVsZWdhdGUAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAF0BV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYGNyZWF0ZV9wdXJlYCwgaG93ZXZlciBpZiBkb25lLCB0aGVuWQF0aGUgdW5yZXNlcnZlZCBmZWVzIHdpbGwgYmUgaW5hY2Nlc3NpYmxlLiAqKkFsbCBhY2Nlc3MgdG8gdGhpcyBhY2NvdW50IHdpbGwgYmUgbG9zdC4qKixjcmVhdGVfcHVyZQwBKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgABFGluZGV4LQMBDHUxNgAESDkBU3Bhd24gYSBmcmVzaCBuZXcgYWNjb3VudCB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb3RoZXJ3aXNlIGluYWNjZXNzaWJsZSwgYW5k/GluaXRpYWxpemUgaXQgd2l0aCBhIHByb3h5IG9mIGBwcm94eV90eXBlYCBmb3IgYG9yaWdpbmAgc2VuZGVyLgBsUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4uAFEBLSBgcHJveHlfdHlwZWA6IFRoZSB0eXBlIG9mIHRoZSBwcm94eSB0aGF0IHRoZSBzZW5kZXIgd2lsbCBiZSByZWdpc3RlcmVkIGFzIG92ZXIgdGhlTQFuZXcgYWNjb3VudC4gVGhpcyB3aWxsIGFsbW9zdCBhbHdheXMgYmUgdGhlIG1vc3QgcGVybWlzc2l2ZSBgUHJveHlUeXBlYCBwb3NzaWJsZSB0b3hhbGxvdyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eS5RAS0gYGluZGV4YDogQSBkaXNhbWJpZ3VhdGlvbiBpbmRleCwgaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZV0BdHJhbnNhY3Rpb24gKGUuZy4gd2l0aCBgdXRpbGl0eTo6YmF0Y2hgKS4gVW5sZXNzIHlvdSdyZSB1c2luZyBgYmF0Y2hgIHlvdSBwcm9iYWJseSBqdXN0QHdhbnQgdG8gdXNlIGAwYC5NAS0gYGRlbGF5YDogVGhlIGFubm91bmNlbWVudCBwZXJpb2QgcmVxdWlyZWQgb2YgdGhlIGluaXRpYWwgcHJveHkuIFdpbGwgZ2VuZXJhbGx5IGJlFHplcm8uAFEBRmFpbHMgd2l0aCBgRHVwbGljYXRlYCBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIGZyb20gdGhlmHNhbWUgc2VuZGVyLCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuAORGYWlscyBpZiB0aGVyZSBhcmUgaW5zdWZmaWNpZW50IGZ1bmRzIHRvIHBheSBmb3IgZGVwb3NpdC4ka2lsbF9wdXJlFAEcc3Bhd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZZkDATBUOjpQcm94eVR5cGUAARRpbmRleC0DAQx1MTYAARhoZWlnaHRgAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleGABDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+wYGNyZWF0ZV9wdXJlYCB3aXRoIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4AVQEtIGBzcGF3bmVyYDogVGhlIGFjY291bnQgdGhhdCBvcmlnaW5hbGx5IGNhbGxlZCBgY3JlYXRlX3B1cmVgIHRvIGNyZWF0ZSB0aGlzIGFjY291bnQuVQEtIGBpbmRleGA6IFRoZSBkaXNhbWJpZ3VhdGlvbiBpbmRleCBvcmlnaW5hbGx5IHBhc3NlZCB0byBgY3JlYXRlX3B1cmVgLiBQcm9iYWJseSBgMGAuCQEtIGBwcm94eV90eXBlYDogVGhlIHByb3h5IHR5cGUgb3JpZ2luYWxseSBwYXNzZWQgdG8gYGNyZWF0ZV9wdXJlYC5FAS0gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIGNoYWluIHdoZW4gdGhlIGNhbGwgdG8gYGNyZWF0ZV9wdXJlYCB3YXMgcHJvY2Vzc2VkLlEBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgY3JlYXRlX3B1cmVgIHdhcyBwcm9jZXNzZWQuADUBRmFpbHMgd2l0aCBgTm9QZXJtaXNzaW9uYCBpbiBjYXNlIHRoZSBjYWxsZXIgaXMgbm90IGEgcHJldmlvdXNseSBjcmVhdGVkIHB1cmX4YWNjb3VudCB3aG9zZSBgY3JlYXRlX3B1cmVgIGNhbGwgaGFzIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4gYW5ub3VuY2UIARByZWFsAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAY8BQFQdWJsaXNoIHRoZSBoYXNoIG9mIGEgcHJveHktY2FsbCB0aGF0IHdpbGwgYmUgbWFkZSBpbiB0aGUgZnV0dXJlLgBdAVRoaXMgbXVzdCBiZSBjYWxsZWQgc29tZSBudW1iZXIgb2YgYmxvY2tzIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBgcHJveHlgIGlzIGF0dGVtcHRlZCUBaWYgdGhlIGRlbGF5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJveHkgcmVsYXRpb25zaGlwIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgARAU5vIG1vcmUgdGhhbiBgTWF4UGVuZGluZ2AgYW5ub3VuY2VtZW50cyBtYXkgYmUgbWFkZSBhdCBhbnkgb25lIHRpbWUuAAkBVGhpcyB3aWxsIHRha2UgYSBkZXBvc2l0IG9mIGBBbm5vdW5jZW1lbnREZXBvc2l0RmFjdG9yYCBhcyB3ZWxsIGFzGQFgQW5ub3VuY2VtZW50RGVwb3NpdEJhc2VgIGlmIHRoZXJlIGFyZSBubyBvdGhlciBwZW5kaW5nIGFubm91bmNlbWVudHMuACUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgcHJveHkgb2YgYHJlYWxgLgAsUGFyYW1ldGVyczoNAS0gYHJlYWxgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBwcm94eSB3aWxsIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZi4VAS0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIG1hZGUgYnkgdGhlIGByZWFsYCBhY2NvdW50LkxyZW1vdmVfYW5ub3VuY2VtZW50CAEQcmVhbAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoPAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAgosFJlbW92ZSB0aGUgZ2l2ZW4gYW5ub3VuY2VtZW50IG9mIGEgZGVsZWdhdGUuAGEBTWF5IGJlIGNhbGxlZCBieSBhIHRhcmdldCAocHJveGllZCkgYWNjb3VudCB0byByZW1vdmUgYSBjYWxsIHRoYXQgb25lIG9mIHRoZWlyIGRlbGVnYXRlcyUBKGBkZWxlZ2F0ZWApIGhhcyBhbm5vdW5jZWQgdGhleSB3YW50IHRvIGV4ZWN1dGUuIFRoZSBkZXBvc2l0IGlzIHJldHVybmVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOvQtIGBkZWxlZ2F0ZWA6IFRoZSBhY2NvdW50IHRoYXQgcHJldmlvdXNseSBhbm5vdW5jZWQgdGhlIGNhbGwuvC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIG1hZGUuPHByb3h5X2Fubm91bmNlZBABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARByZWFsAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBllQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ACSxNAURpc3BhdGNoIHRoZSBnaXZlbiBgY2FsbGAgZnJvbSBhbiBhY2NvdW50IHRoYXQgdGhlIHNlbmRlciBpcyBhdXRob3JpemVkIGZvciB0aHJvdWdoMGBhZGRfcHJveHlgLgCoUmVtb3ZlcyBhbnkgY29ycmVzcG9uZGluZyBhbm5vdW5jZW1lbnQocykuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4wcG9rZV9kZXBvc2l0AAogSQFQb2tlIC8gQWRqdXN0IGRlcG9zaXRzIG1hZGUgZm9yIHByb3hpZXMgYW5kIGFubm91bmNlbWVudHMgYmFzZWQgb24gY3VycmVudCB2YWx1ZXMuDQFUaGlzIGNhbiBiZSB1c2VkIGJ5IGFjY291bnRzIHRvIHBvc3NpYmx5IGxvd2VyIHRoZWlyIGxvY2tlZCBhbW91bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuAIxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6VAwQYT3B0aW9uBARUAZkDAQgQTm9uZQAAABBTb21lBACZAwAAAQAAmQMIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUkUHJveHlUeXBlAAEYDEFueQAAACxOb25UcmFuc2ZlcgABACxDYW5jZWxQcm94eQACACBJZGVudGl0eQADAERJZGVudGl0eUp1ZGdlbWVudAAEACBDb2xsYXRvcgAFAACdAwxUaW5kaXZfcGFsbGV0X2lkZW50aXR5GHBhbGxldBBDYWxsBARUAAF4NGFkZF9yZWdpc3RyYXIEARxhY2NvdW50AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AABx4QWRkIGEgcmVnaXN0cmFyIHRvIHRoZSBzeXN0ZW0uAPxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgVDo6UmVnaXN0cmFyT3JpZ2luYC4AqC0gYGFjY291bnRgOiB0aGUgYWNjb3VudCBvZiB0aGUgcmVnaXN0cmFyLgCURW1pdHMgYFJlZ2lzdHJhckFkZGVkYCBpZiBzdWNjZXNzZnVsLjBzZXRfaWRlbnRpdHkEARBpbmZvoQMBbEJveDxUOjpJZGVudGl0eUluZm9ybWF0aW9uPgABKCkBU2V0IGFuIGFjY291bnQncyBpZGVudGl0eSBpbmZvcm1hdGlvbiBhbmQgcmVzZXJ2ZSB0aGUgYXBwcm9wcmlhdGUgZGVwb3NpdC4AVQFJZiB0aGUgYWNjb3VudCBhbHJlYWR5IGhhcyBpZGVudGl0eSBpbmZvcm1hdGlvbiwgdGhlIGRlcG9zaXQgaXMgdGFrZW4gYXMgcGFydCBwYXltZW50UGZvciB0aGUgbmV3IGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AjC0gYGluZm9gOiBUaGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uAIhFbWl0cyBgSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwuIHNldF9zdWJzBAEQc3Vicx0EAWRWZWM8KFQ6OkFjY291bnRJZCwgRGF0YSk+AAIkjFNldCB0aGUgc3ViLWFjY291bnRzIG9mIHRoZSBzZW5kZXIuAFUBUGF5bWVudDogQW55IGFnZ3JlZ2F0ZSBiYWxhbmNlIHJlc2VydmVkIGJ5IHByZXZpb3VzIGBzZXRfc3Vic2AgY2FsbHMgd2lsbCBiZSByZXR1cm5lZC0BYW5kIGFuIGFtb3VudCBgU3ViQWNjb3VudERlcG9zaXRgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGVhY2ggaXRlbSBpbiBgc3Vic2AuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AsC0gYHN1YnNgOiBUaGUgaWRlbnRpdHkncyAobmV3KSBzdWItYWNjb3VudHMuOGNsZWFyX2lkZW50aXR5AAMgOQFDbGVhciBhbiBhY2NvdW50J3MgaWRlbnRpdHkgaW5mbyBhbmQgYWxsIHN1Yi1hY2NvdW50cyBhbmQgcmV0dXJuIGFsbCBkZXBvc2l0cy4A7FBheW1lbnQ6IEFsbCByZXNlcnZlZCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudCBhcmUgcmV0dXJuZWQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AmEVtaXRzIGBJZGVudGl0eUNsZWFyZWRgIGlmIHN1Y2Nlc3NmdWwuRHJlcXVlc3RfanVkZ2VtZW50CAEkcmVnX2luZGV4YAE4UmVnaXN0cmFySW5kZXgAARxtYXhfZmVlwAEwQmFsYW5jZU9mPFQ+AARAlFJlcXVlc3QgYSBqdWRnZW1lbnQgZnJvbSBhIHJlZ2lzdHJhci4AVQFQYXltZW50OiBBdCBtb3N0IGBtYXhfZmVlYCB3aWxsIGJlIHJlc2VydmVkIGZvciBwYXltZW50IHRvIHRoZSByZWdpc3RyYXIgaWYganVkZ2VtZW50GGdpdmVuLgA1AVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhUHJlZ2lzdGVyZWQgaWRlbnRpdHkuAB0BLSBgcmVnX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UganVkZ2VtZW50IGlzIHJlcXVlc3RlZC5VAS0gYG1heF9mZWVgOiBUaGUgbWF4aW11bSBmZWUgdGhhdCBtYXkgYmUgcGFpZC4gVGhpcyBzaG91bGQganVzdCBiZSBhdXRvLXBvcHVsYXRlZCBhczoAMGBgYG5vY29tcGlsZbhTZWxmOjpyZWdpc3RyYXJzKCkuZ2V0KHJlZ19pbmRleCkudW53cmFwKCkuZmVlDGBgYACkRW1pdHMgYEp1ZGdlbWVudFJlcXVlc3RlZGAgaWYgc3VjY2Vzc2Z1bC44Y2FuY2VsX3JlcXVlc3QEASRyZWdfaW5kZXg4AThSZWdpc3RyYXJJbmRleAAFKGhDYW5jZWwgYSBwcmV2aW91cyByZXF1ZXN0LgD4UGF5bWVudDogQSBwcmV2aW91c2x5IHJlc2VydmVkIGRlcG9zaXQgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4ANQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYVByZWdpc3RlcmVkIGlkZW50aXR5LgBFAS0gYHJlZ19pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBubyBsb25nZXIgcmVxdWVzdGVkLgCsRW1pdHMgYEp1ZGdlbWVudFVucmVxdWVzdGVkYCBpZiBzdWNjZXNzZnVsLhxzZXRfZmVlCAEUaW5kZXhgAThSZWdpc3RyYXJJbmRleAABDGZlZcABMEJhbGFuY2VPZjxUPgAGHBkBU2V0IHRoZSBmZWUgcmVxdWlyZWQgZm9yIGEganVkZ2VtZW50IHRvIGJlIHJlcXVlc3RlZCBmcm9tIGEgcmVnaXN0cmFyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIGFjY291bnSgb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBpbmRleCBpcyBgaW5kZXhgLgD0LSBgaW5kZXhgOiB0aGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBmZWUgaXMgdG8gYmUgc2V0LlQtIGBmZWVgOiB0aGUgbmV3IGZlZS44c2V0X2FjY291bnRfaWQIARRpbmRleGABOFJlZ2lzdHJhckluZGV4AAEMbmV3AAFQQWNjb3VudElkTG9va3VwT2Y8VD4ABxy8Q2hhbmdlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdHJhci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50oG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYGluZGV4YC4A9C0gYGluZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgZmVlIGlzIHRvIGJlIHNldC5wLSBgbmV3YDogdGhlIG5ldyBhY2NvdW50IElELihzZXRfZmllbGRzCAEUaW5kZXhgAThSZWdpc3RyYXJJbmRleAABGGZpZWxkcygBKQE8VDo6SWRlbnRpdHlJbmZvcm1hdGlvbiBhcyBJZGVudGl0eUluZm9ybWF0aW9uUHJvdmlkZXI+OjoKRmllbGRzSWRlbnRpZmllcgAIHKhTZXQgdGhlIGZpZWxkIGluZm9ybWF0aW9uIGZvciBhIHJlZ2lzdHJhci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50oG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYGluZGV4YC4A9C0gYGluZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgZmVlIGlzIHRvIGJlIHNldC4NAS0gYGZpZWxkc2A6IHRoZSBmaWVsZHMgdGhhdCB0aGUgcmVnaXN0cmFyIGNvbmNlcm5zIHRoZW1zZWx2ZXMgd2l0aC5EcHJvdmlkZV9qdWRnZW1lbnQQASRyZWdfaW5kZXhgAThSZWdpc3RyYXJJbmRleAABGHRhcmdldAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkanVkZ2VtZW50JQQBXEp1ZGdlbWVudDxCYWxhbmNlT2Y8VD4+AAEgaWRlbnRpdHk8ARxUOjpIYXNoAAk8uFByb3ZpZGUgYSBqdWRnZW1lbnQgZm9yIGFuIGFjY291bnQncyBpZGVudGl0eS4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50sG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYHJlZ19pbmRleGAuACEBLSBgcmVnX2luZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UganVkZ2VtZW50IGlzIGJlaW5nIG1hZGUuVQEtIGB0YXJnZXRgOiB0aGUgYWNjb3VudCB3aG9zZSBpZGVudGl0eSB0aGUganVkZ2VtZW50IGlzIHVwb24uIFRoaXMgbXVzdCBiZSBhbiBhY2NvdW50dCAgd2l0aCBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuSQEtIGBqdWRnZW1lbnRgOiB0aGUganVkZ2VtZW50IG9mIHRoZSByZWdpc3RyYXIgb2YgaW5kZXggYHJlZ19pbmRleGAgYWJvdXQgYHRhcmdldGAuXQEtIGBpZGVudGl0eWA6IFRoZSBoYXNoIG9mIHRoZSBbYElkZW50aXR5SW5mb3JtYXRpb25Qcm92aWRlcmBdIGZvciB0aGF0IHRoZSBqdWRnZW1lbnQgaXMsICBwcm92aWRlZC4AsE5vdGU6IEp1ZGdlbWVudHMgZG8gbm90IGFwcGx5IHRvIGEgdXNlcm5hbWUuAJRFbWl0cyBgSnVkZ2VtZW50R2l2ZW5gIGlmIHN1Y2Nlc3NmdWwuNGtpbGxfaWRlbnRpdHkEARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgAKMEEBUmVtb3ZlIGFuIGFjY291bnQncyBpZGVudGl0eSBhbmQgc3ViLWFjY291bnQgaW5mb3JtYXRpb24gYW5kIHNsYXNoIHRoZSBkZXBvc2l0cy4AYQFQYXltZW50OiBSZXNlcnZlZCBiYWxhbmNlcyBmcm9tIGBzZXRfc3Vic2AgYW5kIGBzZXRfaWRlbnRpdHlgIGFyZSBzbGFzaGVkIGFuZCBoYW5kbGVkIGJ5RQFgU2xhc2hgLiBWZXJpZmljYXRpb24gcmVxdWVzdCBkZXBvc2l0cyBhcmUgbm90IHJldHVybmVkOyB0aGV5IHNob3VsZCBiZSBjYW5jZWxsZWSAbWFudWFsbHkgdXNpbmcgYGNhbmNlbF9yZXF1ZXN0YC4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuAFUBLSBgdGFyZ2V0YDogdGhlIGFjY291bnQgd2hvc2UgaWRlbnRpdHkgdGhlIGp1ZGdlbWVudCBpcyB1cG9uLiBUaGlzIG11c3QgYmUgYW4gYWNjb3VudHQgIHdpdGggYSByZWdpc3RlcmVkIGlkZW50aXR5LgCURW1pdHMgYElkZW50aXR5S2lsbGVkYCBpZiBzdWNjZXNzZnVsLhxhZGRfc3ViCAEMc3ViAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhpQMBEERhdGEACxysQWRkIHRoZSBnaXZlbiBhY2NvdW50IHRvIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW5hbWVfc3ViCAEMc3ViAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhpQMBEERhdGEADBDMQWx0ZXIgdGhlIGFzc29jaWF0ZWQgbmFtZSBvZiB0aGUgZ2l2ZW4gc3ViLWFjY291bnQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZFhzdWIgaWRlbnRpdHkgb2YgYHN1YmAuKHJlbW92ZV9zdWIEAQxzdWIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgANHMBSZW1vdmUgdGhlIGdpdmVuIGFjY291bnQgZnJvbSB0aGUgc2VuZGVyJ3Mgc3Vicy4AXQFQYXltZW50OiBCYWxhbmNlIHJlc2VydmVkIGJ5IGEgcHJldmlvdXMgYHNldF9zdWJzYCBjYWxsIGZvciBvbmUgc3ViIHdpbGwgYmUgcmVwYXRyaWF0ZWQ4dG8gdGhlIHNlbmRlci4AYQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYSByZWdpc3RlcmVkWHN1YiBpZGVudGl0eSBvZiBgc3ViYC4gcXVpdF9zdWIADiiMUmVtb3ZlIHRoZSBzZW5kZXIgYXMgYSBzdWItYWNjb3VudC4AXQFQYXltZW50OiBCYWxhbmNlIHJlc2VydmVkIGJ5IGEgcHJldmlvdXMgYHNldF9zdWJzYCBjYWxsIGZvciBvbmUgc3ViIHdpbGwgYmUgcmVwYXRyaWF0ZWS0dG8gdGhlIHNlbmRlciAoKm5vdCogdGhlIG9yaWdpbmFsIGRlcG9zaXRvcikuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZDxzdXBlci1pZGVudGl0eS4ARQFOT1RFOiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgdXNlZCwgYnV0IGlzIHByb3ZpZGVkIGluIHRoZSBjYXNlIHRoYXQgdGhlIG5vbi0RAWNvbnRyb2xsZXIgb2YgYW4gYWNjb3VudCBpcyBtYWxpY2lvdXNseSByZWdpc3RlcmVkIGFzIGEgc3ViLWFjY291bnQuWGFkZF91c2VybmFtZV9hdXRob3JpdHkMASRhdXRob3JpdHkAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHN1ZmZpeBgBHFZlYzx1OD4AAShhbGxvY2F0aW9uOAEMdTMyAA8UVQFBZGQgYW4gYEFjY291bnRJZGAgd2l0aCBwZXJtaXNzaW9uIHRvIGdyYW50IHVzZXJuYW1lcyB3aXRoIGEgZ2l2ZW4gYHN1ZmZpeGAgYXBwZW5kZWQuAEUBVGhlIGF1dGhvcml0eSBjYW4gZ3JhbnQgdXAgdG8gYGFsbG9jYXRpb25gIHVzZXJuYW1lcy4gVG8gdG9wIHVwIHRoZSBhbGxvY2F0aW9uIG9ySQFjaGFuZ2UgdGhlIGFjY291bnQgdXNlZCB0byBncmFudCB1c2VybmFtZXMsIHRoaXMgY2FsbCBjYW4gYmUgdXNlZCB3aXRoIHRoZSB1cGRhdGVkzHBhcmFtZXRlcnMgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLmRyZW1vdmVfdXNlcm5hbWVfYXV0aG9yaXR5CAEYc3VmZml4GAEcVmVjPHU4PgABJGF1dGhvcml0eQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABAExFJlbW92ZSBgYXV0aG9yaXR5YCBmcm9tIHRoZSB1c2VybmFtZSBhdXRob3JpdGllcy5Ac2V0X3VzZXJuYW1lX2ZvchABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgdXNlcm5hbWUYARxWZWM8dTg+AAEkc2lnbmF0dXJlKQQBcE9wdGlvbjxUOjpPZmZjaGFpblNpZ25hdHVyZT4AATh1c2VfYWxsb2NhdGlvbsgBEGJvb2wAETQNAVNldCB0aGUgdXNlcm5hbWUgZm9yIGB3aG9gLiBNdXN0IGJlIGNhbGxlZCBieSBhIHVzZXJuYW1lIGF1dGhvcml0eS4AWQFJZiBgdXNlX2FsbG9jYXRpb25gIGlzIHNldCwgdGhlIGF1dGhvcml0eSBtdXN0IGhhdmUgYSB1c2VybmFtZSBhbGxvY2F0aW9uIGF2YWlsYWJsZSB0b0UBc3BlbmQuIE90aGVyd2lzZSwgdGhlIGF1dGhvcml0eSB3aWxsIG5lZWQgdG8gcHV0IHVwIGEgZGVwb3NpdCBmb3IgcmVnaXN0ZXJpbmcgdGhlJHVzZXJuYW1lLgCwVXNlcnMgY2FuIGVpdGhlciBwcmUtc2lnbiB0aGVpciB1c2VybmFtZXMgb3JIYWNjZXB0IHRoZW0gbGF0ZXIuADxVc2VybmFtZXMgbXVzdDrYICAtIE9ubHkgY29udGFpbiBsb3dlcmNhc2UgQVNDSUkgY2hhcmFjdGVycyBvciBkaWdpdHMuNQEgIC0gV2hlbiBjb21iaW5lZCB3aXRoIHRoZSBzdWZmaXggb2YgdGhlIGlzc3VpbmcgYXV0aG9yaXR5IGJlIF9sZXNzIHRoYW5fIHRoZWAgICAgYE1heFVzZXJuYW1lTGVuZ3RoYC48YWNjZXB0X3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEgxNAUFjY2VwdCBhIGdpdmVuIHVzZXJuYW1lIHRoYXQgYW4gYGF1dGhvcml0eWAgZ3JhbnRlZC4gVGhlIGNhbGwgbXVzdCBpbmNsdWRlIHRoZSBmdWxsVQF1c2VybmFtZSwgYXMgaW4gYHVzZXJuYW1lLnN1ZmZpeGAuIEF1dGhvcml0aWVzIGNhbm5vdCBncmFudCB1c2VybmFtZXMgdG8gcGVvcGxlLCBvbmx5UHRvIHJlZ3VsYXIgYWNjb3VudHMuXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEwxhAVJlbW92ZSBhbiBleHBpcmVkIHVzZXJuYW1lIGFwcHJvdmFsLiBUaGUgdXNlcm5hbWUgd2FzIGFwcHJvdmVkIGJ5IGFuIGF1dGhvcml0eSBidXQgbmV2ZXJVAWFjY2VwdGVkIGJ5IHRoZSB1c2VyIGFuZCBtdXN0IG5vdyBiZSBiZXlvbmQgaXRzIGV4cGlyYXRpb24uIFRoZSBjYWxsIG11c3QgaW5jbHVkZSB0aGWcZnVsbCB1c2VybmFtZSwgYXMgaW4gYHVzZXJuYW1lLnN1ZmZpeGAuUHNldF9wcmltYXJ5X3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AFAxFAVNldCBhIGdpdmVuIHVzZXJuYW1lIGFzIHRoZSBwcmltYXJ5LiBUaGUgdXNlcm5hbWUgc2hvdWxkIGluY2x1ZGUgdGhlIHN1ZmZpeC4gT25seVkBcmVndWxhciBhY2NvdW50cyBjYW4gc2V0IHRoZWlyIHByaW1hcnkgdXNlcm5hbWUsIGFzIHBlb3BsZSBjYW4gb25seSBoYXZlIG9uZSB1c2VybmFtZSyQZ3JhbnRlZCB0aHJvdWdoIGEgc3lzdGVtIGFsbG9jYXRpb24uPHVuYmluZF91c2VybmFtZQQBIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABUMWQFTdGFydCB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBhIHVzZXJuYW1lIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIHVuYmluZGluZyB1c2VybmFtZXMgbWFwLiEBT25jZSB0aGUgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQsIHRoZSB1c2VybmFtZSBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nwFtyZW1vdmVfdXNlcm5hbWVdKGNyYXRlOjpDYWxsOjpyZW1vdmVfdXNlcm5hbWUpLjxyZW1vdmVfdXNlcm5hbWUEASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAWCGEBUGVybWFuZW50bHkgZGVsZXRlIGEgdXNlcm5hbWUgd2hpY2ggaGFzIGJlZW4gdW5iaW5kaW5nIGZvciBsb25nZXIgdGhhbiB0aGUgZ3JhY2UgcGVyaW9kLkkBQ2FsbGVyIGlzIHJlZnVuZGVkIHRoZSBmZWUgaWYgdGhlIHVzZXJuYW1lIGV4cGlyZWQgYW5kIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLjRraWxsX3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AFwhdAUNhbGwgd2l0aCBbRm9yY2VPcmlnaW5dKGNyYXRlOjpDb25maWc6OkZvcmNlT3JpZ2luKSBwcml2aWxlZ2VzIHdoaWNoIGRlbGV0ZXMgYSB1c2VybmFtZaxhbmQgc2xhc2hlcyBhbnkgZGVwb3NpdCBhc3NvY2lhdGVkIHdpdGggaXQuVHNldF9wZXJzb25hbF9pZGVudGl0eQwBHGFjY291bnQEATBUOjpBY2NvdW50SWQAASRzaWduYXR1cmUtBAFQVDo6T2ZmY2hhaW5TaWduYXR1cmUAASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAYLF0BU2V0cyB0aGUgdXNlcm5hbWUgYW5kIG9uLWNoYWluIGFjY291bnQgZm9yIGEgcGVyc29uLCBhbG9uZyB3aXRoIGFuIGVtcHR5IGlkZW50aXR5IHdoaWNoYQFjYW4gb25seSBiZSBwb3B1bGF0ZWQgdXNpbmcgYW4gb3JhY2xlIHRocm91Z2ggdGhlIHNvY2lhbCBjcmVkZW50aWFsIHZlcmlmaWNhdGlvbiBzeXN0ZW0unFRoZSBjaG9zZW4gdXNlcm5hbWUgbXVzdCBiZSBkb21haW5sZXNzLgBJAVRoZSBzZW5kZXIgbXVzdCBzaWduIHRoZSBhbGlhcyB1c2luZyB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgb24tY2hhaW5sYWNjb3VudCB0byBwcm92ZSBvd25lcnNoaXAuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGNvbnRleHR1YWwgYWxpYXMgb2YgdGhlIHBlcnNvbiBhbmQgdGhlEQFzZW5kZXIgbXVzdCBub3QgaGF2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlaXIgaWRlbnRpdHkgYW5kIHVzZXJuYW1lLgCoRW1pdHMgYFBlcnNvbmFsSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwujHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlBAEoY3JlZGVudGlhbD0EARhTb2NpYWwAGRgNAU9wZW4gYSBjYXNlIGZvciBhbiBvcmFjbGUgdG8ganVkZ2UgYSBzb2NpYWwgY3JlZGVudGlhbCBvZiBhIHBlcnNvbi4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY29udGV4dHVhbCBhbGlhcyBvZiB0aGUgcGVyc29uIGFuZCB0aGWcc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuAKBFbWl0cyBgRXZpZGVuY2VTdWJtaXR0ZWRgIGlmIHN1Y2Nlc3NmdWwuaHBlcnNvbmFsX2NyZWRlbnRpYWxfanVkZ2VkDAEYdGlja2V0OAFET3JhY2xlVGlja2V0T2Y8VD4AARxjb250ZXh0eAFASnVkZ2VtZW50Q29udGV4dAABJGp1ZGdlbWVudEEEATxPcmFjbGVKdWRnZW1lbnQAGghZAUNhbGxiYWNrIHRvIGVuZm9yY2UgdGhlIGp1ZGdlbWVudCBvZiBhIHNvY2lhbCBjcmVkZW50aWFsLiBUaGlzIGlzIHRvIGJlIGNhbGxlZCBvbmx5IGJ5gHRoZSBvcmFjbGUgdGhhdCBqdWRnZWQgdGhlIGNhc2UuXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5ABscUQFDbGVhciBhIHBlcnNvbidzIGlkZW50aXR5IGluZm8uIFRoZSBzZW5kZXIgbXVzdCBwYXkgYSBwZW5hbHR5IHRocm91Z2ggdGhlIGFzc29jaWF0ZWSgYWxpYXMgYWNjb3VudCBmb3IgcmVtb3ZpbmcgdGhlIGlkZW50aXR5LgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjb250ZXh0dWFsIGFsaWFzIG9mIHRoZSBwZXJzb24gYW5kIHRoZZxzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCBpZGVudGl0eS4AuEVtaXRzIGBJZGVudGl0eVBlcnNvbmFsQ2xlYXJlZGAgaWYgc3VjY2Vzc2Z1bC48cmVwb3J0X3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AHBTsUmVwb3J0IGEgdXNlcm5hbWUgYXMgaW52YWxpZC9vZmZlbnNpdmUvd3JvbmcvYW55dGhpbmcgZWxzZS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGEgc2lnbmVkIGV4dHJpbnNpYy4AqC0gYHVzZXJuYW1lYDogVGhlIHVzZXJuYW1lIHRvIGJlIHJlcG9ydGVkLmByZXBvcnRlZF91c2VybmFtZV9qdWRnZWQMARh0aWNrZXQ4AWBjcmF0ZTo6T3JhY2xlVGlja2V0T2Y8VD4AARxjb250ZXh0eAFASnVkZ2VtZW50Q29udGV4dAABJGp1ZGdlbWVudEEEATxPcmFjbGVKdWRnZW1lbnQAHSTkR2l2ZW4ganVkZ2VtZW50IG9uIGEgcHJldmlvdXNseSByZXBvcnRlZCB1c2VybmFtZSBlaXRoZXI6kDEuIEluIGNhc2UgdXNlcm5hbWUgd2FzIGZvdW5kIHZhbGlkOrwtIHNsYXNoZXMgdGhlIGFtb3VudCBkZXBvc2l0ZWQgYnkgdGhlIHJlcG9ydGVyLPAtIGRvZXMgbm90aGluZyB0byB0aGUgaWRlbnRpdHkgYmVoaW5kIHRoZSByZXBvcnRlZCB1c2VybmFtZSyYMi4gSW4gY2FzZSB1c2VybmFtZSB3YXMgZm91bmQgaW52YWxpZDq4LSByZXR1cm5zIHRoZSBkZXBvc2l0ZWQgZnVuZHMgdG8gdGhlIHJlcG9ydGVyLMQtIGJhbnMgdGhlIGlkZW50aXR5IGJlaGluZCB0aGUgcmVwb3J0ZWQgdXNlcm5hbWUu/FNlcnZlcyBhcyBhIGNhbGxiYWNrIHVzZWQgdXBvbiBqdWRnZW1lbnQgcmVxdWVzdCB0byB0aGUgb3JhY2xlLqhNdXN0IG9ubHkgYmUgdXNlZCBieSB0aGUgc3RhdGVtZW50IG9yYWNsZS4EcElkZW50aXR5IHBhbGxldCBkZWNsYXJhdGlvbi6hAwxkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZRhwZW9wbGUwSWRlbnRpdHlJbmZvAAAoARxkaXNwbGF5pQMBEERhdGEAARRsZWdhbKUDARBEYXRhAAEMd2VipQMBEERhdGEAARhtYXRyaXilAwEQRGF0YQABFGVtYWlspQMBEERhdGEAATxwZ3BfZmluZ2VycHJpbnQZBAFAT3B0aW9uPFt1ODsgMjBdPgABFGltYWdlpQMBEERhdGEAARx0d2l0dGVypQMBEERhdGEAARhnaXRodWKlAwEQRGF0YQABHGRpc2NvcmSlAwEQRGF0YQAApQMMVGluZGl2X3BhbGxldF9pZGVudGl0eRR0eXBlcxBEYXRhAAGYEE5vbmUAAAAQUmF3MAQAqQMAAAEAEFJhdzEEAK0DAAACABBSYXcyBACxAwAAAwAQUmF3MwQAtQMAAAQAEFJhdzQEAHAAAAUAEFJhdzUEALkDAAAGABBSYXc2BAC9AwAABwAQUmF3NwQAwQMAAAgAEFJhdzgEAL0BAAAJABBSYXc5BADFAwAACgAUUmF3MTAEAMkDAAALABRSYXcxMQQAzQMAAAwAFFJhdzEyBADRAwAADQAUUmF3MTMEANUDAAAOABRSYXcxNAQA2QMAAA8AFFJhdzE1BADdAwAAEAAUUmF3MTYEAMEBAAARABRSYXcxNwQA4QMAABIAFFJhdzE4BADlAwAAEwAUUmF3MTkEAOkDAAAUABRSYXcyMAQAHAAAFQAUUmF3MjEEAO0DAAAWABRSYXcyMgQA8QMAABcAFFJhdzIzBAD1AwAAGAAUUmF3MjQEAPkDAAAZABRSYXcyNQQA/QMAABoAFFJhdzI2BAABBAAAGwAUUmF3MjcEAAUEAAAcABRSYXcyOAQACQQAAB0AFFJhdzI5BAANBAAAHgAUUmF3MzAEABEEAAAfABRSYXczMQQAFQQAACAAFFJhdzMyBAAIAAAhACxCbGFrZVR3bzI1NgQACAAAIgAYU2hhMjU2BAAIAAAjACRLZWNjYWsyNTYEAAgAACQALFNoYVRocmVlMjU2BAAIAAAlAACpAwAAAwAAAAAMAK0DAAADAQAAAAwAsQMAAAMCAAAADAC1AwAAAwMAAAAMALkDAAADBQAAAAwAvQMAAAMGAAAADADBAwAAAwcAAAAMAMUDAAADCQAAAAwAyQMAAAMKAAAADADNAwAAAwsAAAAMANEDAAADDAAAAAwA1QMAAAMNAAAADADZAwAAAw4AAAAMAN0DAAADDwAAAAwA4QMAAAMRAAAADADlAwAAAxIAAAAMAOkDAAADEwAAAAwA7QMAAAMVAAAADADxAwAAAxYAAAAMAPUDAAADFwAAAAwA+QMAAAMYAAAADAD9AwAAAxkAAAAMAAEEAAADGgAAAAwABQQAAAMbAAAADAAJBAAAAxwAAAAMAA0EAAADHQAAAAwAEQQAAAMeAAAADAAVBAAAAx8AAAAMABkEBBhPcHRpb24EBFQBHAEIEE5vbmUAAAAQU29tZQQAHAAAAQAAHQQAAAIhBAAhBAAABAgEpQMAJQQMVGluZGl2X3BhbGxldF9pZGVudGl0eRR0eXBlcyRKdWRnZW1lbnQEHEJhbGFuY2UBxAEgHFVua25vd24AAAAcRmVlUGFpZAQAxAEcQmFsYW5jZQABAChSZWFzb25hYmxlAAIAJEtub3duR29vZAADACRPdXRPZkRhdGUABAAoTG93UXVhbGl0eQAFACRFcnJvbmVvdXMABgAgRXh0ZXJuYWwABwAAKQQEGE9wdGlvbgQEVAEtBAEIEE5vbmUAAAAQU29tZQQALQQAAAEAAC0ECChzcF9ydW50aW1lOE11bHRpU2lnbmF0dXJlAAEQHEVkMjU1MTkEADEEAUhlZDI1NTE5OjpTaWduYXR1cmUAAAAcU3IyNTUxOQQAMQQBSHNyMjU1MTk6OlNpZ25hdHVyZQABABRFY2RzYQQANQQBQGVjZHNhOjpTaWduYXR1cmUAAgAMRXRoBAA1BAFYZWNkc2E6OktlY2Nha1NpZ25hdHVyZQADAAAxBAAAA0AAAAAMADUEAAADQQAAAAwAOQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AAA9BBQ0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSBpZGVudGl0eRhTb2NpYWwAAQwcVHdpdHRlcgQBIHVzZXJuYW1lOQQBEERhdGEAAAAYR2l0aHViBAEgdXNlcm5hbWU5BAEQRGF0YQABABxEaXNjb3JkBAE8ZGlzcGxheV9hbmRfdGFnOQQBEERhdGEAAgAAQQQQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkkSnVkZ2VtZW50AAEIFFRydXRoBABFBAEUVHJ1dGgAAAAgQ29udGVtcHQAAQAARQQQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkUVHJ1dGgAAQgQVHJ1ZQAAABRGYWxzZQABAABJBAxMaW5kaXZfcGFsbGV0X3Blb3BsZRhwYWxsZXQQQ2FsbAQEVAABHCx1bmRlcl9hbGlhcwQBEGNhbGwgAbRCb3g8PFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpSdW50aW1lQ2FsbD4AABAVAURpc3BhdGNoIGEgY2FsbCB1bmRlciBhbiBhbGlhcyB1c2luZyB0aGUgYGFjY291bnQgPC0+IGFsaWFzYCBtYXBwaW5nLgBFAVRoaXMgaXMgYSBjYWxsIHZlcnNpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBgQXNQZXJzb25hbEFsaWFzV2l0aEFjY291bnRgLiUBSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gaW5zdGVhZCB3aGVuIHN1aXRhYmxlLkRzZXRfYWxpYXNfYWNjb3VudAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAATRjYWxsX3ZhbGlkX2F0OAFEQmxvY2tOdW1iZXJGb3I8VD4AASQtAVRoaXMgdHJhbnNhY3Rpb24gaXMgcmVmdW5kZWQgaWYgc3VjY2Vzc2Z1bCBhbmQgbm8gYWxpYXMgd2FzIHByZXZpb3VzbHkgc2V0LgCwVGhlIGNhbGwgaXMgdmFsaWQgZnJvbSBgY2FsbF92YWxpZF9hdGAgdW50aWy8YGNhbGxfdmFsaWRfYXQgKyBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYC4dAWBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYCBpcyBhIGNvbnN0YW50IGF2YWlsYWJsZSBpbiB0aGUgbWV0YWRhdGEuACxQYXJhbWV0ZXJzOrgtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gc2V0IHRoZSBhbGlhcyBmb3IuAQEtIGBjYWxsX3ZhbGlkX2F0YDogVGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZSBjYWxsIGJlY29tZXMgdmFsaWQuTHVuc2V0X2FsaWFzX2FjY291bnQAAgQVAVJlbW92ZSB0aGUgbWFwcGluZyBmcm9tIGEgcGFydGljdWxhciBhbGlhcyB0byBpdHMgcmVnaXN0ZXJlZCBhY2NvdW50Lmhmb3JjZV9yZWNvZ25pemVfcGVyc29uaG9vZAQBGHBlb3BsZU0EAUBWZWM8TWVtYmVyT2Y8VD4+AAMY4FJlY29nbml6ZSBhIHNldCBvZiBwZW9wbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBjaGVja3MuAFEBVGhlIHBlb3BsZSBhcmUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgbGlzdCBvZiBrZXlzIGFuZCB3aWxsIGVhY2ggYmUgYXNzaWduZWQsIGlumG9yZGVyLCB0aGUgbmV4dCBhdmFpbGFibGUgcGVyc29uYWwgSUQuAMxUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcy5cc2V0X3BlcnNvbmFsX2lkX2FjY291bnQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAE0Y2FsbF92YWxpZF9hdDgBREJsb2NrTnVtYmVyRm9yPFQ+AAQ8aFNldCBhIHBlcnNvbmFsIGlkIGFjY291bnQuAE0BVGhlIGFjY291bnQgY2FuIHRoZW4gYmUgdXNlZCB0byBzaWduIHRyYW5zYWN0aW9ucyBvbiBiZWhhbGYgb2YgdGhlIHBlcnNvbmFsIGlkLCBhbmSkcHJvdmlkZSByZXBsYXkgcHJvdGVjdGlvbiB3aXRoIHRoZSBub25jZS4AUQFUaGlzIHRyYW5zYWN0aW9uIGlzIHJlZnVuZGVkIGlmIHN1Y2Nlc3NmdWwgYW5kIG5vIGFjY291bnQgd2FzIHByZXZpb3VzbHkgc2V0IGZvciB0aGUwcGVyc29uYWwgaWQuALBUaGUgY2FsbCBpcyB2YWxpZCBmcm9tIGBjYWxsX3ZhbGlkX2F0YCB1bnRpbLxgY2FsbF92YWxpZF9hdCArIGFjY291bnRfc2V0dXBfdGltZV90b2xlcmFuY2VgLh0BYGFjY291bnRfc2V0dXBfdGltZV90b2xlcmFuY2VgIGlzIGEgY29uc3RhbnQgYXZhaWxhYmxlIGluIHRoZSBtZXRhZGF0YS4ALFBhcmFtZXRlcnM6uC0gYGFjY291bnRgOiBUaGUgYWNjb3VudCB0byBzZXQgdGhlIGFsaWFzIGZvci4BAS0gYGNhbGxfdmFsaWRfYXRgOiBUaGUgYmxvY2sgbnVtYmVyIHdoZW4gdGhlIGNhbGwgYmVjb21lcyB2YWxpZC5kdW5zZXRfcGVyc29uYWxfaWRfYWNjb3VudAAFBHhVbnNldCB0aGUgcGVyc29uYWwgaWQgYWNjb3VudC5gY3JlYXRlX3Blb3BsZV9jb2xsZWN0aW9uAAYodENyZWF0ZSB0aGUgcGVvcGxlIGNvbGxlY3Rpb24uACkBVGhpcyBjYWxsIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGNvbGxlY3Rpb24gZG9lc24ndCBleGlzdCB5ZXQuIE9uY2UgY3JlYXRlZCyMdGhpcyBjYWxsIGNhbm5vdCBiZSBleGVjdXRlZCBhZ2Fpbi4A1FRoZSBjb2xsZWN0aW9uIGlzIGNyZWF0ZWQgd2l0aCBhIGZpeGVkIGNvbmZpZ3VyYXRpb246uC0gT3duZXI6IENvbmZpZ3VyZWQgdmlhIGBDb2xsZWN0aW9uT3duZXJgIHR5cGXALSBPbmJvYXJkaW5nIHNpemU6IGBQRU9QTEVfT05CT0FSRElOR19TSVpFYCAoMTApSC0gTW9kZTogYEZsZXhpYmxlYEwtIFJpbmcgc2l6ZTogYFIyZTlgBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLk0EAAACUQQAUQQMKHZlcmlmaWFibGU0cmluZ192cmZfaW1wbEBFbmNvZGVkUHVibGljS2V5AAAEAAgBVFt1ODsgUFVCTElDX0tFWV9TSVpFXQAAVQQMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQQQ2FsbAQEVAABRBB2b3RlCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAABHG9waW5pb25BBAEkSnVkZ2VtZW50AAAE4EZlZWxlc3Mgb24gc3VjY2VzcyAoZGV0ZXJtaW5lZCBvbmx5IGJ5IHRvcCB0aHJlZSBsaW5lcykuKGNsb3NlX2Nhc2UEAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEAKGNsZWFuX3ZvdGUIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEUdm90ZXIIARRBbGlhcwACDCUBT3JpZ2luIG11c3QgYmUgYE5vbmVgLiBUaGUgdHJhbnNhY3Rpb24gaXMgdmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYGEBd2hlbiB0aGUgc291cmNlIGlzIGxvY2FsIChlLmcuIGZyb20gdGhlIG9mZmNoYWluIHdvcmtlcikuIEZvciBleHRlcm5hbCB0cmFuc2FjdGlvbnMsIHVzZVBgY2xlYW5fdm90ZV9zaWduZWRgLiRyZWFwX2Nhc2UEAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAMAJGludGVydmVuZQgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgAARx2ZXJkaWN0QQQBJEp1ZGdlbWVudAAEAChjbGFpbV92b3RlBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAAFCCEBQSBwZXJzb24gY2xhaW1zIHRoZSBtb2IgY3JlZGl0IGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlY3Qgdm90ZSBvbiBhIGNhc2UuYFRoZSBjYXNlIG11c3QgYmUgYERvbmVgLjhwYXlvdXRfcmV3YXJkcwQBLGRlc3RpbmF0aW9uBAEwVDo6QWNjb3VudElkAAYECQFBIHBlcnNvbiBjb252ZXJ0cyB0aGVpciBjbGFpbWVkIG1vYiBjcmVkaXQgaW50byBhIGRpcmVjdCB0cmFuc2Zlci4sY2xhaW1fdm90ZXMEATBjYXNlX2luZGljZXNZBAE4VmVjPENhc2VJbmRleD4ABwg1AUEgcGVyc29uIGNsYWltcyBtdWx0aXBsZSBtb2IgY3JlZGl0cyBhc3NvY2lhdGVkIGEgY29ycmVjdCB2b3RlIG9uIGEgY2FzZS4gVGhlUGNhc2UgbXVzdCBiZSBgRG9uZWAuSHN0YXJ0X3BheW91dF9yb3VuZAAIAFhzY2hlZHVsZV9wYXlvdXRfcm91bmRzDAEYYW1vdW50xAEwQmFsYW5jZU9mPFQ+AAEUY291bnQ4AQx1MzIAARhwZXJpb2Q4AURCbG9ja051bWJlckZvcjxUPgAJAFhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlBAEUaW5kZXg4AQx1MzIACgAwY2xhaW1fY3JlZGl0AAsAMGNsZWFuX3BvaW50cwgBFHJvdW5kOAEoUm91bmRJbmRleAABFHZvdGVyCAEUQWxpYXMADABAZm9yY2VfcmlwZW5fY2FzZQQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgADQAodG91Y2hfY2FzZQQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgADgBQY2xlYXJfdm90aW5nX3BlbmFsdHkADwBEY2xlYW5fdm90ZV9zaWduZWQIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEUdm90ZXIIARRBbGlhcwAQBFhPcmlnaW4gbXVzdCBiZSBzaWduZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLlkEAAACOABdBAxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQQQ2FsbAQEVAABWBRhcHBseQAADJAtIERlY2xhcmUgaW50ZW50aW9uIHRvIGdldCBhIHRhdHRvby5MLSBEZXBvc2l0IGlzIHRha2VuLrgtIGBJbmtUeXBlYCBtYXkgbm90IGJlIGBQcm9jZWR1cmFsRGVyaXZhdGl2ZWAuPHN1Ym1pdF9ldmlkZW5jZQQBIGV2aWRlbmNlCAEwRXZpZGVuY2VIYXNoAAEQvC0gT3BlbiBhIGp1ZGljaWFsIGNhc2UgdG8ganVkZ2UgdGhlIGBldmlkZW5jZWAu1C0gQ2FsbHMgSnVkaWNpYWwvYEp1ZGdlU3RhdGVtZW50KFBPSV9IQVNILCBldmlkZW5jZSlgUQEtIE5lZWRzIGBTaWduZWRFeHRlbnNpb25gIHRvIGF2b2lkIHVwZnJvbnQgcmVxdWlyZW1lbnQgZm9yIGZlZSBpZiBganVkZ2VtZW50cyA9PSAwYC45AS0gSWYgYGp1ZGdlbWVudHMgPiAwYCwgdGhlbiBhbiBhZGRpdGlvbmFsIGZlZSBzaG91bGQgYmUgY2hhcmdlZCBpbnRvIFRyZWFzdXJ5LhhqdWRnZWQMARh0aWNrZXQ4AURPcmFjbGVUaWNrZXRPZjxUPgABHGNvbnRleHR4AUBKdWRnZW1lbnRDb250ZXh0AAEkanVkZ2VtZW50QQQBJEp1ZGdlbWVudAACBOhJcyBjYWxsZWQgYnkgdGhlIE9yYWNsZSB3aGVuIHRoZSBldmlkZW5jZSBoYXMgYmVlbiBqdWRnZWQuRHJlZ2lzdGVyX3JlZmVycmVkDAEMa2V5UQQBLE1lbWJlck9mPFQ+AAEsZGVzdGluYXRpb24EATBUOjpBY2NvdW50SWQAAUhwcm9vZl9vZl9vd25lcnNoaXBhBAGwPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUAAyRQLSBHZXRzIGEgbmV3IGBpbmRleGB4LSBQdXRzIGFuIGVudHJ5IGludG8gYFBlb3BsZWAumC0gQ2FsbHMgUGVvcGxlL2BuZXdQZXJzb24oaW5kZXgsIGtleSlgACwjIEFyZ3VtZW50c7AqIGBrZXlgIC0gVGhlIHBlcnNvbmFsIGlkZW50aXR5IHRvIHJlZ2lzdGVyLiEBKiBgZGVzdGluYXRpb25gIC0gVGhlIGFjY291bnQgcmVjZWl2aW5nIHRoZSBjYW5kaWRhdGUncyByZWZlcnJhbCByZXdhcmQuSQEqIGBwcm9vZl9vZl9vd25lcmhzaXBgIC0gVGhlIHNpZ25hdHVyZSBvZiBwcmVkZWZpbmVkIHByZWZpeCBgInBvcCByZWdpc3RlciB1c2luZyJgqCAgY29uY2F0ZW5hdGVkIHdpdGggdGhlIHNlbmRlciBhY2NvdW50IGlkLlRyZWdpc3Rlcl9ub25fcmVmZXJyZWQMAQxrZXlRBAEsTWVtYmVyT2Y8VD4AASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAABSHByb29mX29mX293bmVyc2hpcGEEAbA8VDo6Q3J5cHRvIGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAEOFAtIEdldHMgYSBuZXcgYGluZGV4YHgtIFB1dHMgYW4gZW50cnkgaW50byBgUGVvcGxlYC6YLSBDYWxscyBQZW9wbGUvYG5ld1BlcnNvbihpbmRleCwga2V5KWAALCMgQXJndW1lbnRzsCogYGtleWAgLSBUaGUgcGVyc29uYWwgaWRlbnRpdHkgdG8gcmVnaXN0ZXIuwCogYGRlc3RpbmF0aW9uYCAtIFRoZSBhY2NvdW50IHJlY2VpdmluZyByZXdhcmRzLkkBKiBgcHJvb2Zfb2Zfb3duZXJoc2lwYCAtIFRoZSBzaWduYXR1cmUgb2YgcHJlZGVmaW5lZCBwcmVmaXggYCJwb3AgcmVnaXN0ZXIgdXNpbmciYKggIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBzZW5kZXIgYWNjb3VudCBpZC4AKCMgV2FybmluZzoAOQFUaGlzIGNhbGwgY2FuIHBheSB0d28gcmV3YXJkcyB0byB0aGUgc2FtZSBhY2NvdW50IGZvciBub24tcmVmZXJyZWQgY2FuZGlkYXRlcy4pAVRoZSBhcHAgaXMgcmVzcG9uc2libGUgZm9yIGFueSBhZGRpdGlvbmFsIHByaXZhY3kgaGFuZGxpbmcgYWZ0ZXIgdHJhbnNmZXIuGHJlcm9sbAAFABhjb21taXQIARhjaG9pY2VlBAEkSW5rQ2hvaWNlAAEocmVxdWlyZV9pZBUDAUhPcHRpb248UGVyc29uYWxJZD4ABhRJAUNvbW1pdCB0byBhIGRlc2lnbiBhbmQgYXV0aG9yaXplIHRoZSBzdG9yYWdlIGZvciAocG9zc2libHkganVzdCBpbml0aWFsKSBldmlkZW5jZS4AVQFJZiBhIHNwZWNpZmljIHBlcnNvbmFsIGlkZW50aXR5IGlzIHJlcXVpcmVkLCB0aGVuIHRoaXMgY2FuIGJlIHBsYWNlZCBpbiBgcmVxdWlyZV9pZGAuQQFUaGlzIGNhbiBiZSBhbnkgdW51c2VkL3VucmVzZXJ2ZWQgcGVyc29uYWwgaWRlbnRpdHkgbm8gZ3JlYXRlciB0aGFuIHRoZSBgTmV4dElkYCBjb3VudGVyLjRhbGxvY2F0ZV9mdWxsAAcAHHRpbWVvdXQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAgMOQFPbmNlIGEgdGltZW91dCBwYXNzZXMsIHJlbW92ZXMgYSBjYW5kaWRhdGUgd2hvIGlzIHNlbGVjdGVkIGJ1dCBub3QgeWV0IHByb3Zlbi5ZAUlmIHRoZSBjYW5kaWRhdGUgd2FzIHJlZmVycmVkIHRoZW4gcmVmZXJyYWwgaXMgYmFkLCBpZiBjYW5kaWRhdGUgYXBwbGllZCB3aXRoIGRlcG9zaXQsTGRlcG9zaXQgaXMgc2xhc2hlZC4gZmxha2VvdXQACQS0UmVtb3ZlIGEgY2FuZGlkYXRlIHdobyBoYXMgbm90IHlldCBjb21taXR0ZWQuUGFwcGx5X3dpdGhfc2lnbmF0dXJlDAEgcmVmZXJyZXIoAShQZXJzb25hbElkAAEkc2lnbmF0dXJlLQQBSFQ6OlRpY2tldFNpZ25hdHVyZQABGHRpY2tldAQBJFQ6OlRpY2tldAAKEHRVdGlsaXplIGEgcmVmZXJyYWwgc2lnbmF0dXJlLgBdAVRoZSBwYXlsb2FkIHRvIGJlIHNpZ25lZCBieSB0aGUgcmVmZXJyZXIgdXNpbmcgdGhlaXIgcmVnaXN0ZXJlZCBrZXkgcGFpciBpcyB0aGUgZW5jb2RlZKRieXRlcyBvZiB0aGUgYWNjb3VudCBJRCBvZiB0aGUgY2FuZGlkYXRlLlRhcHBseV93aXRoX2ludml0YXRpb24MARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEsVGlja2V0T2Y8VD4AASRzaWduYXR1cmUtBAFIVDo6VGlja2V0U2lnbmF0dXJlABMQ1EFwcGx5IHRvIHRoZSBQcm9vZi1vZi1JbmsgcHJvY2VzcyB3aXRoIGFuIGludml0YXRpb24uAFkBVGhlIHBheWxvYWQgdG8gYmUgc2lnbmVkIGJ5IHRoZSBpbnZpdGVyIHVzaW5nIHRoZWlyIHJlZ2lzdGVyZWQga2V5IHBhaXIgaXMgdGhlIGVuY29kZWSkYnl0ZXMgb2YgdGhlIGFjY291bnQgSUQgb2YgdGhlIGNhbmRpZGF0ZS5EYWRkX2Rlc2lnbl9mYW1pbHkMARRpbmRleC0DASxGYW1pbHlJbmRleAABEGtpbmRpBAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQACwTwQWRkIGEgZGVzaWduIGZhbWlseS4gTXVzdCBoYXZlIHByaXZpbGVnZWQgYWNjZXNzIHRvIGRvIHRoaXMuTHNldF9yZWZlcnJhbF90aWNrZXQEARh0aWNrZXQEASRUOjpUaWNrZXQADBi8QWRkIGEgcmVmZXJyYWwgdGlja2V0IGFzc29jaWF0ZWQgd2l0aCBhIHBlcnNvbi4AVQFPbmx5IG9uZSByZWZlcnJhbCB0aWNrZXQgbWF5IGJlIGFjdGl2ZSBhdCBhbnkgZ2l2ZW4gdGltZSBmb3Igb25lIHBlcnNvbi4gQ2FsbGluZyB0aGlzJQFleHRyaW5zaWMgd2hpbGUgYSB2YWxpZCB0aWNrZXQgaXMgc2V0IHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyB0aWNrZXQuADkBSWYgYW55IHBlbmRpbmcgcmVmZXJyYWwgcmV3YXJkcyBhcmUgcHJlc2VudCwgdGhleSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgZmlyc3QuWGNhbmNlbF9yZWZlcnJhbF90aWNrZXQEARh0aWNrZXQEASRUOjpUaWNrZXQADQTIQ2FuY2VsIGEgcmVmZXJyYWwgdGlja2V0IGFzc29jaWF0ZWQgd2l0aCBhIHBlcnNvbi6McmVnaXN0ZXJfc3VjY2Vzc2Z1bF9yZWZlcnJhbF9yZXdhcmQEASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAAOADRncmFudF9pbnZpdGVzCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAA8Y5EdyYW50cyBpbnZpdGVzIHRvIGFuIGFjY291bnQgc28gdGhleSBjYW4gZGlzdHJpYnV0ZSB0aGVtLgCYVGhlIG9yaWdpbiBtdXN0IGJlIGBJbnZpdGF0aW9uc09yaWdpbi4AsC0gYGFjY291bnRgOiBUaGUgYWNjb3VudCB0byBnaXZlIGludml0ZXMgdG8upC0gYGNvdW50YDogVGhlIG51bWJlciBvZiBpbnZpdGVzIHRvIGdpdmUukHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRsaW1pdDgBDHUzMgAQGJxSZW1vdmUgYWxsIGludml0ZXMgZ2l2ZW4gdG8gYW4gYWNjb3VudC4AnFRoZSBvcmlnaW4gbXVzdCBiZSBgSW52aXRhdGlvbnNPcmlnaW5gLgDQLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgaW52aXRlcyBmcm9tLuwtIGBsaW1pdGA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIGludml0ZXMgdG8gcmVtb3ZlLkRzZXRfaW52aXRlX3RpY2tldAQBGHRpY2tldAQBLFRpY2tldE9mPFQ+ABEUSEludml0ZSBhbiBhY2NvdW50LgANAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgaGF2ZSBzb21lIGludml0ZXMgbGVmdC4AlC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIHNldC5QY2FuY2VsX2ludml0ZV90aWNrZXQEARh0aWNrZXQEASxUaWNrZXRPZjxUPgASFFRDYW5jZWwgYW4gaW52aXRhdGlvbi4AIQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IHRoZSBhY2NvdW50IHRoYXQgb3ducyB0aGUgdGlja2V0IHRvIGNhbmNlbC4AoC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIGNhbmNlbC5Ec2V0X2NvbmZpZ3VyYXRpb24EARhjb25maWdtBAF8Q29uZmlnUmVjb3JkPEJsb2NrTnVtYmVyRm9yPFQ+PgAyBBUBU2V0IHRoZSBjb25maWd1cmF0aW9uIHJlY29yZC4gTXVzdCBoYXZlIHByaXZpbGVnZWQgYWNjZXNzIHRvIGRvIHRoaXMuYHNldF9yZWltYnVyc2VtZW50X3ZhbHVlcwgBPHJlZmVycmVkX3ZhbHVlc3EEAehCb3VuZGVkVmVjPChCYWxhbmNlT2Y8VD4sIHUzMiksIFQ6Ok1heFJlaW1idXJzZW1lbnRWYWx1ZXM+AAE8cmVmZXJyZXJfdmFsdWVzcQQB6EJvdW5kZWRWZWM8KEJhbGFuY2VPZjxUPiwgdTMyKSwgVDo6TWF4UmVpbWJ1cnNlbWVudFZhbHVlcz4AMyhNAVNldCB0aGUgdmFsdWVzIG9mIHRoZSByZWltYnVyc2VtZW50IGF3YXJkZWQgdG8gcmVmZXJyZWQgY2FuZGlkYXRlcyBhcyB3ZWxsIGFzIHRoZWlyTQFyZWZlcnJlcnMsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiByZWltYnVyc2VtZW50cyBmb3IgZWFjaCB2YWx1ZS4gVGhlc2UgdmFsdWVzIGFyZSRzdG9yZWQgaW5RAXJldmVyc2Ugb3JkZXIgb2YgdGhlaXIgcHJpb3JpdHksIHNvIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IG9uZUkBdG8gYmUgdXNlZCBieSB0aGUgcmVpbWJ1cnNlbWVudCBzeXN0ZW0uIFRoZSBsZW5ndGggb2YgdGhlIHR3byBsaXN0cyBtdXN0IGJlIGVxdWFsLgAgV0FSTklORyEATQFBZnRlciB0aGUgbnVtYmVyIG9mIHJlaW1idXJzZW1lbnRzIGlzIGV4aGF1c3RlZCBmb3IgYSB2YWx1ZSBpbiB0aGUgbGlzdCwgdGhlIHBhbGxldPRzdGFydHMgdXNpbmcgdGhlIG5leHQgdmFsdWUgaW1tZWRpYXRlbHkgZm9yIGZ1dHVyZSB0cmFuc2ZlcnMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmEEAAADYAAAAAwAZQQMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0JElua0Nob2ljZQABFEBEZXNpZ25lZEVsZWN0aXZlCAAtAwEsRmFtaWx5SW5kZXgAAC0DASxEZXNpZ25JbmRleAAAAERQcm9jZWR1cmFsQWNjb3VudAQALQMBLEZhbWlseUluZGV4AAEASFByb2NlZHVyYWxQZXJzb25hbAQALQMBLEZhbWlseUluZGV4AAIAKFByb2NlZHVyYWwIAC0DASxGYW1pbHlJbmRleAAADAEwVmFyaWFudEluZGV4AAMAUFByb2NlZHVyYWxEZXJpdmF0aXZlCAAoAShQZXJzb25hbElkAAAVAwFIT3B0aW9uPFBlcnNvbmFsSWQ+AAQAAGkEDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldChGYW1pbHlLaW5kAAEQIERlc2lnbmVkBAEUY291bnQtAwEsRGVzaWduSW5kZXgAAABEUHJvY2VkdXJhbEFjY291bnQAAQBIUHJvY2VkdXJhbFBlcnNvbmFsAAIAKFByb2NlZHVyYWwEARRyYW5nZQwBMFZhcmlhbnRJbmRleAADAABtBAxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQwQ29uZmlnUmVjb3JkBCxCbG9ja051bWJlcgE4ACABOHJlcm9sbF90aW1lb3V0OAEsQmxvY2tOdW1iZXIAATxmYXN0dHJhY2tfY291bnQ4AQx1MzIAARxtYXhpbXVtOAEMdTMyAAE4ZnVsbF9hbGxvY19sZW4oAQx1NjQAAUBmdWxsX2FsbG9jX2NvdW50OAEMdTMyAAE4aW5pdF9hbGxvY19sZW4oAQx1NjQAAUBpbml0X2FsbG9jX2NvdW50OAEMdTMyAAEcdGltZW91dDgBLEJsb2NrTnVtYmVyAABxBAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUEBFMAAAQAeQQBGFZlYzxUPgAAdQQAAAQIxDgAeQQAAAJ1BAB9BAxEaW5kaXZfcGFsbGV0X2dhbWUYcGFsbGV0EENhbGwEBFQAAUBMc2lnbl91cF93aXRoX2ludml0ZQQBOGlkZW50aWZpZXJfa2V5NQQBXENvbW11bmljYXRpb25JZGVudGlmaWVyAAAg0FNpZ24gdXAgZm9yIHRoZSBnYW1lIHVzaW5nIGFuIGFjY291bnQgYW5kIGFuIGludml0ZS4AFQFUaGlzIGlzIGZvciBuZXcgcGxheWVycyBvciBhcmNoaXZlZCBwbGF5ZXJzLCBvdGhlciBwbGF5ZXJzIHNob3VsZCB1c2WoW2BQYWxsZXQ6OnNpZ25fdXBfd2l0aF9hY2NvdW50YF0gZm9yIGZyZWUuANRBIGdhbWUgbXVzdCBiZSBvbmdvaW5nIGFuZCBpbiBpdHMgcmVnaXN0cmF0aW9uIHBoYXNlLgBBAVRoZSBvcmlnaW4gbXVzdCBiZSBhIHNpZ25lZCBieSBhbiBhY2NvdW50IGFuZCB1c2UgdGhlIGBHYW1lQXNJbnZpdGVkYCBleHRlbnNpb24uUHNpZ25fdXBfd2l0aF9hY2NvdW50BAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAASSYU2lnbiB1cCBmb3IgdGhlIGdhbWUgdXNpbmcgYW4gYWNjb3VudC4APQFJZiB0aGUgcGxheWVyIGlzIG5ldyBvciBhcmNoaXZlZCwgdGhlbiBhIGRlcG9zaXQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBzaWduZXIubE90aGVyd2lzZSB0aGUgY2FsbCBpcyBmcmVlLgDUQSBnYW1lIG11c3QgYmUgb25nb2luZyBhbmQgaW4gaXRzIHJlZ2lzdHJhdGlvbiBwaGFzZS4AMQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IGFuIGFjY291bnQsIG9yLCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgdXNlfGBTY29yZUFzUGFydGljaXBhbnRgIGV4dGVuc2lvbi5Ic2lnbl91cF93aXRoX2FsaWFzDAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAAURzdGF0ZW1lbnRfYWNjb3VudAQBMFQ6OkFjY291bnRJZAABDHNpZy0EAUxUOjpBY2NvdW50U2lnbmF0dXJlAAJIVFNpZ24gdXAgZm9yIHRoZSBnYW1lLgBVAUlmIGEgcGxheWVyIGlzIGFscmVhZHkgcmVjb2duaXplZCBieSBhbm90aGVyIERJTSwgdGhleSBjYW4gc2lnbiB1c2luZyB0aGVpciBhbGlhcyBhbmQRAWRvbid0IG5lZWQgYW55IGRlcG9zaXQgb3IgaW52aXRlIHRvIHByb3ZlIHRoZWlyIGluaXRpYWwgY3JlZGliaWxpdHkuYQFPbiB0b3Agb2YgdGhpcyB0aGVpciBzY29yZSBpcyBuZXZlciBnb2luZyBiZWxvdyBwZXJzb25ob29kIHRocmVzaG9sZCBhbmQgdGhlIHBsYXllciB3aWxsTG5ldmVyIGdldCBhcmNoaXZlZC4A1EEgZ2FtZSBtdXN0IGJlIG9uZ29pbmcgYW5kIGluIGl0cyByZWdpc3RyYXRpb24gcGhhc2UuAJBUaGUgb3JpZ2luIG11c3QgYmUgYSBwZXJzb25hbCBhbGlhcy4ALFBhcmFtZXRlcnM6YQEtIGBzdGF0ZW1lbnRfYWNjb3VudGA6IHRoZSBhY2NvdW50IGlkIHRvIHVzZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBzdGF0ZW1lbnQgc3RvcmUgZHVyaW5nLCAgdGhlIGdhbWUuVQEtIGBzaWdgOiB0aGUgcHJvb2Ygb2Ygb3duZXJzaGlwIG9mIHRoZSBhY2NvdW50IGBzdGF0ZW1lbnRfYWNjb3VudGAgYnkgYW4gYWxpYXMsIGl0IGlzXQEgIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UgYCJwb3A6Z2FtZTpzdG10X2FjY291bnRfZm9yX2FsaWFzOiJgIGNvbmNhdGVuYXRlZCB0byB0aGVJASAgYWxpYXMsIGFuZCB0aGVuIGhhc2hlZCB3aXRoIGBibGFrZTJfMjU2YCAoYmxha2UyIDI1NmJpdCBvdXRwdXQpLiBUaGUgYmFzZSBvZiB0aGUZASAgbWVzc2FnZSBjYW4gYmUgZm91bmQgaW4gdGhlIGNvbnN0YW50OiBgcHJvb2Zfb2Zfb3duZXJzaGlwX21zZ19iYXNlYC4YcmVwb3J0BAEsZnVsbF9yZXBvcnSBBAE0RnVsbFJlcG9ydDxUPgADGJRBZnRlciB0aGUgZ2FtZSwgc2VuZCB0aGUgZnVsbCByZXBvcnQuANBUaGUgZ2FtZSBtdXN0IGJlIG9uZ29pbmcgYW5kIGluIGl0cyByZXBvcnRpbmcgcGhhc2UuAFUBVGhlIG9yaWdpbiBtdXN0IGJlIGFuIGFsaWFzLCBvciBzaWduZWQgYnkgYW4gYWNjb3VudCwgb3Igc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIHVzZXxgU2NvcmVBc1BhcnRpY2lwYW50YCBleHRlbnNpb24uIG9mZmJvYXJkAAQcgE9mZmJvYXJkIGEgcGxheWVyIGZyb20gdGhlIGdhbWUuAFUBVGhlIG9yaWdpbiBtdXN0IGJlIGFuIGFsaWFzLCBvciBzaWduZWQgYnkgYW4gYWNjb3VudCwgb3Igc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIHVzZXxgU2NvcmVBc1BhcnRpY2lwYW50YCBleHRlbnNpb24uAF0BVGhlcmUgbXVzdCBiZSBubyBnYW1lIG9yIHRoZSBleGlzdGluZyBnYW1lIG11c3QgYmUgaW4gcmVnaXN0cmF0aW9uIHBoYXNlIGFuZCB0aGUgcGxheWVylG11c3QgaGF2ZSBub3Qgc2lnbmVkIHVwIGZvciB0aGUgZ2FtZS4ca2lja291dAQBGHBsYXllcgQBMFQ6OkFjY291bnRJZAAFGDEBS2lja291dCBhIGtpY2thYmxlIHBsYXllciB0aGF0IGlzIG5vdCBwbGF5aW5nIGFmdGVyIGBOb25QbGF5aW5nS2lja291dFRpbWVgLgCgVGhlIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSBhbiBhY2NvdW50LgAhAS0gYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8ga2lja291dC4gSXQgbXVzdCBiZSBhcmNoaXZlZCBhbmQga2lja2FibGUgd2l0aNggIGBhcmNoaXZlZF9zaW5jZWAgb2xkZXIgdGhhbiBgTm9uUGxheWluZ0tpY2tvdXRUaW1lYC40Z3JhbnRfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRjb3VudDgBDHUzMgAGGPRHcmFudCBzb21lIGludml0ZXMgdG8gYW4gYWNjb3VudCBzbyB0aGV5IGNhbiBkaXN0cmlidXRlIHRoZW0uAIhUaGUgb3JpZ2luIG11c3QgYmUgYEludml0ZUlzc3VlcmAuALQtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gZ3JhbnQgaW52aXRlcyB0by6oLSBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGludml0ZXMgdG8gZ3JhbnQukHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRsaW1pdDgBDHUzMgAHGJhDbGVhciBhbGwgaW52aXRlcyBnaXZlbiB0byBhbiBhY2NvdW50LgCIVGhlIG9yaWdpbiBtdXN0IGJlIGBJbnZpdGVJc3N1ZXJgLgDQLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgaW52aXRlcyBmcm9tLuwtIGBsaW1pdGA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIGludml0ZXMgdG8gcmVtb3ZlLkRzZXRfaW52aXRlX3RpY2tldAQBGHRpY2tldAQBLFRpY2tldE9mPFQ+AAgUSEludml0ZSBhbiBhY2NvdW50LgANAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgaGF2ZSBzb21lIGludml0ZXMgbGVmdC4AlC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIHNldC5QY2FuY2VsX2ludml0ZV90aWNrZXQEARh0aWNrZXQEASxUaWNrZXRPZjxUPgAJFERDYW5jZWwgYW4gaW52aXRlLgAhAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgdGhlIGFjY291bnQgdGhhdCBvd25zIHRoZSB0aWNrZXQgdG8gY2FuY2VsLgCgLSBgdGlja2V0YDogVGhlIGludml0ZSB0aWNrZXQgdG8gY2FuY2VsLjhzY2hlZHVsZV9nYW1lcwQBPGdhbWVzX3NjaGVkdWxlc5UEAURWZWM8R2FtZVNjaGVkdWxlPgAKCNBTY2hlZHVsZXMgbmV3IGdhbWVzIGFjY29yZGluZyB0byBwcm92aWRlZCBzY2hlZHVsZXMuXQFTY2hlZHVsZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgYWZ0ZXIgdGhlIG9uZ29pbmcgZ2FtZSAoaWYgdGhlcmUgaXMgYW55KS5UcmVtb3ZlX3NjaGVkdWxlZF9nYW1lBAE4Z2FtZV9wbGF5X3RpbWU4AQx1MzIACwBsdGVzdG5ldF9mb3JjZV9zdGFydF9zaHVmZmxlAGUM1EZvcmNlIHN0YXJ0IHRoZSBzaHVmZmxlIGJlZm9yZSBpdHMgbm9ybWFsIHN0YXJ0IHRpbWUuAE0BVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IHRoZSByb290IG9yaWdpbiBhbmQgaXMgb25seSBtZWFudCBmb3IgdGVzdGluZy5sdGVzdG5ldF9mb3JjZV9lbmRfcmVwb3J0aW5nAGYc+EZvcmNlIGVuZCBhIGdhbWUncyByZXBvcnRpbmcgcGhhc2UgYmVmb3JlIGl0cyBub3JtYWwgZW5kIHRpbWUuAE0BVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IHRoZSByb290IG9yaWdpbiBhbmQgaXMgb25seSBtZWFudCBmb3IgdGVzdGluZy4AWQFUaGUgcmVwb3J0aW5nIHBoYXNlIG9ubHkgc3RhcnQgd2hlbiB0aGUgbXV0YXRpb24gc2Vzc2lvbiBjYW4gYmUgc3RhcnRlZC4gVGhlIGNhbGwgd2lsbFkBZmFpbCBpZiB0aGUgbXV0YXRpb24gc2Vzc2lvbiBjYW5ub3QgYmUgc3RhcnRlZC4gSXQgY2FuIGJlIHJldHJpZWQgZmV3IGJsb2NrcyBsYXRlciB0aGXQdGltZSBmb3IgdGhlIHBlb3BsZSBtdXRhdGlvbiBzZXNzaW9ucyB0byBiZSBwcm9jZWVkLlx0ZXN0bmV0X3NldF9nYW1lX3BoYXNlcwQBGHBoYXNlc50EAUxQaGFzZUR1cmF0aW9uVmFsdWVzAGcMhEZvcmNlIHNldCB0aGUgZ2FtZSBwaGFzZSBwZXJpb2RzLgBNAVRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSB0aGUgcm9vdCBvcmlnaW4gYW5kIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuZHRlc3RuZXRfa2lsbF9jdXJyZW50X2dhbWUAaATMS2lsbCB0aGUgY3VycmVudCBnYW1lLiBXaGF0ZXZlciB0aGUgcGhhc2UgaXQgaXMgaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBhQQEUwAABACRBAEYVmVjPFQ+AACFBAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAYkEBFMAAAQAjQQBGFZlYzxUPgAAiQQMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzGFJlcG9ydAABCBhQZXJzb24AAAAkTm90UGVyc29uAAEAAI0EAAACiQQAkQQAAAKFBACVBAAAApkEAJkEDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlczBHYW1lU2NoZWR1bGUAAAwBOGdhbWVfcGxheV90aW1lOAEMdTMyAAEYcm91bmRzDAEIdTgAAThtYXhfZ3JvdXBfc2l6ZTgBDHUzMgAAnQQMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzTFBoYXNlRHVyYXRpb25WYWx1ZXMAABQBMHJlZ2lzdHJhdGlvbjgBDHUzMgABHHNodWZmbGU4AQx1MzIAAUxwb3N0X3NodWZmbGVfbWFyZ2luOAEMdTMyAAEkcmVwb3J0aW5nOAEMdTMyAAE4cGxheWVyX3Byb2Nlc3M4AQx1MzIAAKEEDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0EENhbGwEBFQAASBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwwBGGFtb3VudMQBMEJhbGFuY2VPZjxUPgABFGNvdW50OAEMdTMyAAEgZHVyYXRpb244AURCbG9ja051bWJlckZvcjxUPgABDFxTY2hlZHVsZSBwYXlvdXQgcm91bmRzLgCUQ2FsbGVkIGZyb20gYFNjaGVkdWxlT3JpZ2luYCBvciByb290LlhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlBAEUaW5kZXg4AQx1MzIAAgyAUmVtb3ZlIGEgc2NoZWR1bGVkIHBheW91dCByb3VuZC4AlENhbGxlZCBmcm9tIGBTY2hlZHVsZU9yaWdpbmAgb3Igcm9vdC5AdHJhbnNpdGlvbl9yb3VuZAQBLHJvdW5kX2luZGV4OAEMdTMyAAMYSFN0YXJ0IGEgbmV3IHJvdW5kLgBRAVRoaXMgaXMgdmFsaWQgaWYgdGhlIGN1cnJlbnQgcm91bmQgaXMgZmluaXNoZWQsIG9yIGlmIHRoZSBjdXJyZW50IHJvdW5kIGRvZXNuJ3QgaGF2ZahwbGFubmluZyBhbmQgYSBzY2hlZHVsZSBleGlzdHMgdG8gcGxhbiBpdC4AvFRoaXMgaXMgYSB0YXNrLCBhbmQgY2FuIGJlIGNhbGxlZCBmcm9tIGFueWJvZHkuUG9wZXJhdGVfcGF5b3V0X3JvdW5kCAEscm91bmRfaW5kZXg4AShSb3VuZEluZGV4AAEUbGltaXQ4AQx1MzIABDx4T3BlcmF0ZSBzb21lIHJvdW5kIHBheWluZyBvdXQuAFEBRHJhaW5zIHJvdW5kJ3MgcGFydGljaXBhbnRzLCB1cCB0byBhIGxpbWl0LiBGb3IgZWFjaCBwYXJ0aWNpcGFudCwgYWRkIHRoZSBjYWxjdWxhdGVkFQFyZXdhcmQgKGBiYXNlX3Jld2FyZCArIHJlbWFpbmRlcl9wb3J0aW9uYCkgdG8gdGhlaXIgYGNyZWRpdGAgYmFsYW5jZS4AYQFUaGVuLCBtb3ZlcyBmdW5kcyBvbiB0aGUgcG90IGFjY291bnQgZnJvbSBQYXlvdXQgdG8gQ3JlZGl0LCBzbyB0aGV5IGFyZSBvd2VkIHRvIHNwZWNpZmljoHBhcnRpY2lwYW50cyByYXRoZXIgdGhhbiB0aGUgcm91bmQgcG9vbC4ARQFGaW5hbGx5LCByZWxlYXNlIHRoZSBsZWZ0b3ZlciBmcm9tIHRoZSBQYXlvdXQgaG9sZCBiYWNrIHRvIHRoZSBwb3QncyBmcmVlIGJhbGFuY2VUKGZ1bmRzIGFyZSByZWN5Y2xlZCkuALxUaGlzIGlzIGEgdGFzaywgYW5kIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnlib2R5LgDEKiByb3VuZF9pbmRleDogVGhlIGluZGV4IG9mIHRoZSByb3VuZCB0byBvcGVyYXRlLhEBKiBsaW1pdDogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0byBvcGVyYXRlIGluIHRoaXMgY2FsbC4gY2FzaF9vdXQABSRZAUNhc2ggb3V0IGhhbGYgb2YgdGhlIHNjb3JlLCByb3VuZGVkIHVwLiBDb252ZXJ0cyB0aGUgc2NvcmUgaW50byBwb2ludHMgZm9yIHRoZSBjdXJyZW50JQFwYXlvdXQgcm91bmQuIENhbGxlciBtdXN0IGhhdmUgbmV2ZXIgcmVhY2hlZCBwZXJzb25ob29kIHNpbmNlIG9uYm9hcmRpbmcuALRJdCBjYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGdhbWUgc2Vzc2lvbiAoZXJhKS4APQFPcmlnaW4gbXVzdCBiZSBzaWduZWQgb3IgcGFydGljaXBhbnQgKHNpZ25lZCBleHRyaW5zaWMgdXNpbmcgU2NvcmVBc1BhcnRpY2lwYW50WHRyYW5zYWN0aW9uIGV4dGVuc2lvbikAzEFsaWFzIG9yaWdpbiBpcyBub3QgYWxsb3dlZCBhcyB0aGV5IGNhbid0IGNhc2ggb3V0LjRyZWRlZW1fY3JlZGl0BAEsZGVzdGluYXRpb24EATBUOjpBY2NvdW50SWQABhhRAVJlZGVlbSBmdWxsIGFjY3VtdWxhdGVkIGNyZWRpdCwgdHJhbnNmZXJyaW5nIGl0IHRvIHRoZSBwcm92aWRlZCBkZXN0aW5hdGlvbiBhY2NvdW50LgDkQ3JlZGl0IGlzIGNvbnZlcnRlZCBmcm9tIHBvaW50cyBkdXJpbmcgcGF5b3V0IHByb2Nlc3NpbmcuAEkBT3JpZ2luIG11c3QgYmUgYSBwZXJzb24gYWxpYXMsIGEgc2lnbmVkIGFjY291bnQgb3IgYSBwYXJ0aWNpcGFudCAoc2lnbmVkIGV4dHJpbnNpY8B1c2luZyBTY29yZUFzUGFydGljaXBhbnQgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uKS4gcmVnaXN0ZXIEAQxrZXmlBAENAU9wdGlvbjwoTWVtYmVyT2Y8VD4sPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUpCj4ABzTwUmVnaXN0ZXIgYXMgYSBwZXJzb24sIG9yIHJlc3VtZSBwZXJzb25ob29kIGFmdGVyIHN1c3BlbnNpb24uACUBUmVxdWlyZXMgc2NvcmUgPj0gcGVyc29uaG9vZCB0aHJlc2hvbGQgKG9yIGhhdmluZyBwcmV2aW91c2x5IHJlYWNoZWQgaXQpLgBhAUlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgcHJldmlvdXNseSByZWNvZ25pc2VkIGFuZCBpcyBub3cgc3VzcGVuZGVkLCB0aGV5IG11c3Qgbm90IHByb3ZpZGWIYSBrZXkuIFRoZSBleGlzdGluZyBrZXkgaXMgcmV1c2VkLgA9AUlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgbmV2ZXIgcmVjb2duaXNlZCwgdGhleSBtdXN0IHByb3ZpZGUgYSBrZXkgYW5kIGEgcHJvb2Ygb2YZAW93bmVyc2hpcCAoYGtleWAgcGFyYW1ldGVyKTogYSBzaWduYXR1cmUgb3ZlciBgInBvcCByZWdpc3RlciB1c2luZyIgfHxMc2VuZGVyX2FjY291bnRfaWRgLgBFAU9yaWdpbiBtdXN0IGJlIHNpZ25lZCBvciBhIHBhcnRpY2lwYW50IChzaWduZWQgZXh0cmluc2ljIHVzaW5nIFNjb3JlQXNQYXJ0aWNpcGFudFx0cmFuc2FjdGlvbiBleHRlbnNpb24pLmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQQBIHNjaGVkdWxlrQQBREFic2VuY2VHcmFjZVRpZXJzAAg4fFNldCB0aGUgYWJzZW5jZSBncmFjZSBzY2hlZHVsZS4AKQFFdmVyeSB0aWVyIG11c3Qgc2F0aXNmeTogYDAgPD0gd2luZG93IDw9IDhgIGFuZCBgYWxsb3dlZF9taXNzZXMgPCB3aW5kb3dgLhUBYGFsbG93ZWRfbWlzc2VzID0gMGAgZGlzYWJsZXMgZ3JhY2UgZW50aXJlbHkgKGFueSBhYnNlbmNlIGltbWVkaWF0ZWx5KHN1c3BlbmRzKS4AJQFUaWVycyBtdXN0IGJlIHByb3ZpZGVkIGluIGFzY2VuZGluZyBvcmRlciBvZiBgcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZGAuAPxBbiBlbXB0eSBzY2hlZHVsZSBkaXNhYmxlcyB0aGUgZ3JhY2UgcGVyaW9kIGVudGlyZWx5IChpbW1lZGlhdGUdAXN1c3BlbnNpb24gb24gYW55IG1pc3NlZCBnYW1lKS4gVGhlIG5ldyByYXRpbyB0YWtlcyBlZmZlY3QgYXQgdGhlIHN0YXJ0CQFvZiB0aGUgbmV4dCByZXBvcnQgc2Vzc2lvbiB3aGVuIGB1cGRhdGVfdGhyZXNob2xkcygpYCByZWNhbGN1bGF0ZXNQYEFic2VuY2VHcmFjZVJhdGlvYC4AlENhbGxlZCBmcm9tIGBTY2hlZHVsZU9yaWdpbmAgb3Igcm9vdC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMupQQEGE9wdGlvbgQEVAGpBAEIEE5vbmUAAAAQU29tZQQAqQQAAAEAAKkEAAAECFEEYQQArQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGxBARTAAAEALUEARhWZWM8VD4AALEEDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXNAQWJzZW5jZUdyYWNlVGllcgAADAFkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZDgBDHUzMgABGHdpbmRvdwwBCHU4AAE4YWxsb3dlZF9taXNzZXMMAQh1OAAAtQQAAAKxBAC5BAxYaW5kaXZfcGFsbGV0X2R1bW15X2RpbRhwYWxsZXQQQ2FsbAQEVAABICxyZXNlcnZlX2lkcwQBFGNvdW50OAEMdTMyAAAEhFJlc2VydmUgYSBudW1iZXIgb2YgcGVyc29uYWwgSURzLlByZW5ld19pZF9yZXNlcnZhdGlvbgQBCGlkKAEoUGVyc29uYWxJZAABBLxSZW5ldyBhIHBlcnNvbmFsIElELiBUaGUgSUQgbXVzdCBub3QgYmUgaW4gdXNlLlRjYW5jZWxfaWRfcmVzZXJ2YXRpb24EAQhpZCgBKFBlcnNvbmFsSWQAAgSEQ2FuY2VsIGEgcGVyc29uYWwgSUQgcmVzZXJ2YXRpb24uUHJlY29nbml6ZV9wZXJzb25ob29kBAEwaWRzX2FuZF9rZXlzvQQB8EJvdW5kZWRWZWM8KFBlcnNvbmFsSWQsIE1lbWJlck9mPFQ+KSwgVDo6TWF4UGVyc29uQmF0Y2hTaXplPgADBCkBR3JhbnQgcGVyc29uaG9vZCBmb3IgYSBsaXN0IG9mIGNhbmRpZGF0ZXMgdGhhdCBoYXZlIHJlc2VydmVkIHBlcnNvbmFsIElEcy5Ic3VzcGVuZF9wZXJzb25ob29kBAEMaWRzyQQBtEJvdW5kZWRWZWM8UGVyc29uYWxJZCwgVDo6TWF4UGVyc29uQmF0Y2hTaXplPgAECF0BU3VzcGVuZCB0aGUgcGVyc29uaG9vZCBvZiBhIGxpc3Qgb2YgcmVjb2duaXplZCBwZW9wbGUuIFRoZSBwZW9wbGUgbXVzdCBub3QgY3VycmVudGx5IGJlKHN1c3BlbmRlZC5EcmVzdW1lX3BlcnNvbmhvb2QEAQhpZCgBKFBlcnNvbmFsSWQABQQRAVJlc3VtZSBzb21lb25lJ3MgcGVyc29uaG9vZC4gVGhlIHBlcnNvbiBtdXN0IGN1cnJlbnRseSBiZSBzdXNwZW5kZWQuWHN0YXJ0X211dGF0aW9uX3Nlc3Npb24ABghdAVN0YXJ0IGEgbXV0YXRpb24gc2Vzc2lvbiBpbiB0aGUgdW5kZXJseWluZyBgUGVvcGxlYCBpbnRlcmZhY2UuIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGVjayUBd2hldGhlciBhIG11dGF0aW9uIHNlc3Npb24gaXMgYWxyZWFkeSBvbmdvaW5nIGFuZCBjYW4gc3RhcnQgbmV3IHNlc3Npb25zLlBlbmRfbXV0YXRpb25fc2Vzc2lvbgAHEF0BRW5kIGEgbXV0YXRpb24gc2Vzc2lvbiBpbiB0aGUgdW5kZXJseWluZyBgUGVvcGxlYCBpbnRlcmZhY2UuIFRoaXMgY2FsbCBjYW4gZW5kIG11bHRpcGxl4G11dGF0aW9uIHNlc3Npb25zLCBldmVuIG9uZXMgbm90IHN0YXJ0ZWQgYnkgdGhpcyBwYWxsZXQuANhUaGlzIGNhbGwgd2lsbCBmYWlsIGlmIG5vIG11dGF0aW9uIHNlc3Npb24gaXMgb25nb2luZy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuvQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHBBARTAAAEAMUEARhWZWM8VD4AAMEEAAAECChRBADFBAAAAsEEAMkEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKARTAAAEAM0EARhWZWM8VD4AAM0EAAACKADRBAxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBBDYWxsBARUAAEQeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRjb3VudDgBDHUzMgAAGCUBR3JhbnQgc29tZSBhdHRlc3RhdGlvbiBhbGxvd2FuY2UgdG8gYW4gYWNjb3VudCBzbyB0aGV5IGNhbiBhdHRlc3QgcGVvcGxlLgDEVGhlIG9yaWdpbiBtdXN0IGJlIGBBdHRlc3RhdGlvbkFsbG93YW5jZU1hbmFnZXJgLgDILSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIGdyYW50IGF0dGVzdGF0aW9ucyB0by68LSBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGF0dGVzdGF0aW9ucyB0byBncmFudC5sY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlBAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFLxDbGVhciBhbGwgYXR0ZXN0YXRpb24gYWxsb3dhbmNlIGZvciBhbiBhY2NvdW50LgDEVGhlIG9yaWdpbiBtdXN0IGJlIGBBdHRlc3RhdGlvbkFsbG93YW5jZU1hbmFnZXJgLgDkLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgYXR0ZXN0YXRpb25zIGZyb20uGGF0dGVzdBQBJGNhbmRpZGF0ZQQBMFQ6OkFjY291bnRJZAABTGNhbmRpZGF0ZV9zaWduYXR1cmUtBAFcVDo6QXR0ZXN0YXRpb25TaWduYXR1cmUAATByaW5nX3ZyZl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAGwPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUAAVRjb25zdW1lcl9yZWdpc3RyYXRpb27VBAGsT3B0aW9uPExpdGVDb25zdW1lclJlZ2lzdHJhdGlvblBhcmFtc09mPFQ+PgACbEhBdHRlc3QgYW4gYWNjb3VudC4ARQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIGhhdmUgc29tZSBhdHRlc3RhdGlvbiBhbGxvd2FuY2UgbGVmdC4A8FRoZSBhdXRob3JpdHkgd2lsbCBoYXZlIHRvIGdldCB0d28gc2lnbmF0dXJlcyBmcm9tIHRoZSB1c2VyOk0BLSBvbmUgY3JlYXRlZCB1c2luZyB0aGVpciBhY2NvdW50IGtleSBhdHRlc3RpbmcgdG8gdGhlIG93bmVyc2hpcCBvZiB0aGUgYGNhbmRpZGF0ZWAoICBhY2NvdW50O10BLSBvbmUgY3JlYXRlZCB1c2luZyB0aGVpciByaW5nLXZyZiBrZXkgYXR0ZXN0aW5nIHRvIHRoZSBvd25lcnNoaXAgb2YgdGhlIGByaW5nX3ZyZl9rZXlgGCAga2V5LgBhAVRoZSBtZXNzYWdlIHRvIGJlIHNpZ25lZCBieSBib3RoIGtleXMgZnJvbSB3aGljaCB0aGUgc2lnbmF0dXJlcyBhcmUgZ2VuZXJhdGVkIGlzIGNyZWF0ZWRVAWJ5IGNvbmNhdGVuYXRpbmcgdGhlIGJ5dGVzICJwb3A6cGVvcGxlLWxpdGU6cmVnaXN0ZXIgdXNpbmciIHdpdGggdGhlIGVuY29kZWQgYnl0ZXMgb2YtAXRoZSB1c2VyJ3MgYWNjb3VudCAoYGNhbmRpZGF0ZWApLCBhbmQgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhlIHJpbmcgVlJGIGtleUQoYHJpbmdfdnJmX2tleWApLgD8LSBgY2FuZGlkYXRlYDogVGhlIGNhbmRpZGF0ZSB0byBiZSByZWNvZ25pemVkIGFzIGEgbGl0ZSBwZXJzb24uYQEtIGBjYW5kaWRhdGVfc2lnbmF0dXJlYDogVGhlIHNpZ25hdHVyZSwgcHJvdmlkZWQgYnkgdGhlIGNhbmRpZGF0ZSwgdG8gYWxsb3cgdGhlIGF0dGVzdGVy3CAgdG8gY29tcGxldGUgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzIG9uIHRoZWlyIGJlaGFsZi4lAS0gYHJpbmdfdnJmX2tleWA6IFRoZSByaW5nIFZSRiBrZXkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaXRlIHBlcnNvbi5dAS0gYHJpbmdfdnJmX2tleV9zaWduYXR1cmVgOiBUaGUgcmluZyBWUkYgc2lnbmF0dXJlLCBwcm92aWRlZCBieSB0aGUgY2FuZGlkYXRlLCB0byBhbGxvd1UBICB0aGUgYXR0ZXN0ZXIgdG8gY29tcGxldGUgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBUaGlzIGFsc28gcHJvdmUgdGhlIG93bmVyc2hpcCBvZpAgIHRoZSByaW5nIFZSRiBrZXkgYnkgdGhlIGNhbmRpZGF0ZS5dAS0gY29uc3VtZXJfcmVnaXN0cmF0aW9uOiBPcHRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggY2FuIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbl0BICB0byBmb3J3YXJkIGEgY29uc3VtZXIgcmVnaXN0cmF0aW9uIHJlcXVlc3QgdG8gdGhlIGBMaXRlQ29uc3VtZXJSZWdpc3RyYXJgIHNlcnZpY2UuIElmUQEgIHByZXNlbnQsIGl0IGFsc28gY29udGFpbnMgYSBzaWduYXR1cmUgY3JlYXRlZCBieSB0aGUgdXNlciBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGUlASAgaW50ZW50LiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzaWduaW5nIHBheWxvYWQgZ2VuZXJhdGlvbiBhdmFpbGFibGUgaW7sICBbdHlwZXM6OkxpdGVDb25zdW1lclJlZ2lzdHJhdGlvblBhcmFtczo6c2lnbmluZ19wYXlsb2FkXS5IZGlzcGF0Y2hfYXNfc2lnbmVyBAEQY2FsbCABTEJveDxUOjpSdW50aW1lQ2FsbD4ABQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu1QQEGE9wdGlvbgQEVAHZBAEIEE5vbmUAAAAQU29tZQQA2QQAAAEAANkEDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXN4TGl0ZUNvbnN1bWVyUmVnaXN0cmF0aW9uUGFyYW1zCCRBY2NvdW50SWQBBCRTaWduYXR1cmUBLQQAFAEkc2lnbmF0dXJlLQQBJFNpZ25hdHVyZQABHGFjY291bnQEASRBY2NvdW50SWQAAThpZGVudGlmaWVyX2tleTUEAVxDb21tdW5pY2F0aW9uSWRlbnRpZmllcgABIHVzZXJuYW1lOQQBIFVzZXJuYW1lAAFEcmVzZXJ2ZWRfdXNlcm5hbWXdBAFAT3B0aW9uPFVzZXJuYW1lPgAA3QQEGE9wdGlvbgQEVAE5BAEIEE5vbmUAAAAQU29tZQQAOQQAAAEAAOEEDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzGHBhbGxldBBDYWxsBARUAAEgUHJlZ2lzdGVyX2xpdGVfcGVyc29uDAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAASB1c2VybmFtZTkEASBVc2VybmFtZQABRHJlc2VydmVkX3VzZXJuYW1l3QQBQE9wdGlvbjxVc2VybmFtZT4AAASUUmVnaXN0ZXIgYSBsaXRlIHBlcnNvbiBhcyBhIGNvbnN1bWVyLjxyZWdpc3Rlcl9wZXJzb24MAVBsaW5rZWRfbGl0ZV9pZGVudGl0eQQBMFQ6OkFjY291bnRJZAABTGxpdGVfaWRlbnRpdHlfcHJvb2YtBAFQVDo6T2ZmY2hhaW5TaWduYXR1cmUAATx1c2VybmFtZV9jaG9pY2XlBAFYUGVyc29uYWxVc2VybmFtZUNob2ljZQABJJxSZWdpc3RlciBhIHByb3ZlbiBwZXJzb24gYXMgYSBjb25zdW1lci4AXQFUaGUgcGVyc29uIG11c3QgbGluayBhIHByZXZpb3VzbHkgcmVjb2duaXplZCBsaXRlIGlkZW50aXR5LCB3aGljaCB3aWxsIGJlIHVwZ3JhZGVkIHRvIGFZAWZ1bGwgcGVyc29uIGNvbnN1bWVyLiBJbiBvcmRlciB0byBwcm92ZSB0aGV5IGhvbGQgdGhlIGxpdGUgaWRlbnRpdHkgdGhleSB3YW50IHRvIGxpbmssYQF1c2VycyBtdXN0IHByb3ZpZGUgYSBgbGl0ZV9pZGVudGl0eV9wcm9vZmAgc2lnbmF0dXJlLCBjcmVhdGVkIGJ5IHNpZ25pbmcgdGhlIGFsaWFzIGJ5dGVziHVzaW5nIHRoZWlyIGxpdGUgY29uc3VtZXIgYWNjb3VudC4AOQFUaGUgY29uc3VtZXIgY2FuIGNob29zZSBpZiB0aGV5IHdhbnQgdG8gaGF2ZSBhIG5ldyB1c2VybmFtZSBvciB1c2UgYW4gZXhpc3RpbmcVAXJlc2VydmF0aW9uIG1hZGUgaW4gdGhlIG5hbWUgb2YgdGhlIGxpdGUgY29uc3VtZXIgd2hvIHdpbGwgYmUgbGlua2VkLmh0b3VjaF9wZXJzb25fYXV0aG9yaXphdGlvbgACEEkBVXBkYXRlIGEgcGVyc29uJ3MgYXV0aG9yaXphdGlvbiBieSBlbnN1cmluZyB0aGV5IGNhbiBzdGlsbCBhdXRoZW50aWNhdGUgYXMgcGVvcGxlLgBRAVRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBhdCBsZWFzdCBgTWluUGVyc29uQXV0aFVwZGF0ZUludGVydmFsYCBzZWNvbmRzIGFmdGVyIHRoZZRsYXN0IHVwZGF0ZSBpbiBvcmRlciB0byBwcmV2ZW50IHNwYW0ujHJlbW92ZV9leHBpcmVkX3VzZXJuYW1lX3Jlc2VydmF0aW9uCAEgdXNlcm5hbWU5BAEgVXNlcm5hbWUAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMgOQFSZW1vdmUgYW4gZXhwaXJlZCBlbnRyeSBmcm9tIGEgdXNlcm5hbWUgcmVzZXJ2YXRpb24gcXVldWUuIFRoZSB0YXJnZXQgZW50cnkgaXMBAWlkZW50aWZpZWQgYnkgYGFjY291bnRgIGFuZCBjYW4gYmUgYXQgYW55IHBvc2l0aW9uIGluIHRoZSBxdWV1ZS4dAUVhY2ggY2FsbCByZW1vdmVzIGV4YWN0bHkgb25lIGVudHJ5LCBzbyBpdCBtdXN0IGJlIGNhbGxlZCByZXBlYXRlZGx5IHRvkGNsZWFyIG11bHRpcGxlIGV4cGlyZWQgcmVzZXJ2YXRpb25zLgAtAVRoaXMgaXMgYSBwZXJtaXNzaW9ubGVzcyBjYWxsOyB0aGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZC4gVGhlIGBhY2NvdW50YDEBcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBmb3IgdHJhbnNhY3Rpb24gcG9vbCBkZWR1cGxpY2F0aW9uLCBhbGxvd2luZyBwYXJhbGxlbBEBc3VibWlzc2lvbnMgdGhhdCB0YXJnZXQgZGlmZmVyZW50IGV4cGlyZWQgZW50cmllcyBpbiB0aGUgc2FtZSBxdWV1ZS5UdXBkYXRlX2lkZW50aWZpZXJfa2V5BAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIABBDYVXBkYXRlIHRoZSBjb21tdW5pY2F0aW9uIGlkZW50aWZpZXIga2V5IG9mIGEgY29uc3VtZXIuAEEBVGhlIG9yaWdpbiBtdXN0IGJlIHRoZSBhY2NvdW50IHJlZ2lzdGVyZWQgZm9yIHRoYXQgY29uc3VtZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIwY3JlZGliaWxpdHkuhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgQBIGR1cmF0aW9uKAEMdTY0AAUMHQFTZXQgdGhlIGR1cmF0aW9uIGZvciB3aGljaCBhIHVzZXJuYW1lIHJlc2VydmF0aW9uIGlzIHZhbGlkLCBpbiBzZWNvbmRzLgBgVGhlIG9yaWdpbiBtdXN0IGJlIHJvb3QusHNldF9zdG10X3N0b3JlX2Fzc29jaWF0ZWRfYWNjb3VudF9pZF9hdF9zbG90CAEsc2xvdF9udW1iZXIMAQh1OAABLHNldF9hY2NvdW506QQBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAYsNQFBc3NvY2lhdGUgYW4gYWNjb3VudCB3aXRoIGEgc2xvdCBmb3Igc3RhdGVtZW50IHN0b3JlIGFjY2Vzcywgb3IgcmVzZXQgYSBzbG90LgARAVRoZSBhc3NvY2lhdGVkIGFjY291bnQgY2FuIHN1Ym1pdCBzdGF0ZW1lbnRzIHRvIHRoZSBzdGF0ZW1lbnQgc3RvcmUuhFRoZSBvcmlnaW4gbXVzdCBiZSBhIGxpdGUgcGVyc29uLkEBUmVmdW5kZWQgd2hlbiBhc3NpZ25pbmcgYW4gYWNjb3VudCB0byBhIGZyZWUgc2xvdCwgb3Igd2hlbiByZXBsYWNpbmcvY2xlYXJpbmcgYW4pAW9jY3VwaWVkIHNsb3Qgd2hvc2UgbGFzdCB1cGRhdGUgaXMgb2xkZXIgdGhhbiBgQWNjb3VudHNBcGlSZWZ1bmRDb29sZG93bmAuACxQYXJhbWV0ZXJzOkUBKiBgc2xvdF9udW1iZXJgOiBtdXN0IGJlIGluIGAwLi5BY2NvdW50c0FwaVNsb3RDb3VudGAuIChgQWNjb3VudHNBcGlTbG90Q291bnRgIGlzlCAgYXZhaWxhYmxlIGluIHRoZSBjb25zdGFudCBtZXRhZGF0YSk9ASogYHNldF9hY2NvdW50YDogYFNvbWVgIHRvIHNldCBhIG5ldyBhY2NvdW50LCBvciBgTm9uZWAgdG8gcmVzZXQgdG8gbm8gYWNjb3VudC5MZGVtb3RlX2F1dGhfZXhwaXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQABwwxAURlbW90ZSBhIGZ1bGwgcGVyc29uIHRvIGEgbGl0ZSBwZXJzb24gYWZ0ZXIgdGhlaXIgYXV0aG9yaXphdGlvbiBoYXMgZXhwaXJlZC4A9FRoaXMgaXMgYSBwZXJtaXNzaW9ubGVzcyBjYWxsOyB0aGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu5QQMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXNYUGVyc29uYWxVc2VybmFtZUNob2ljZQABCChTdGFuZGFsb25lBAA5BAEgVXNlcm5hbWUAAAAsUmVzZXJ2YXRpb24EADkEASBVc2VybmFtZQABAADpBAQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAAO0EDGxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXIYcGFsbGV0EENhbGwEBFQAAQgoYWRkX2NodW5rcwwBNHJpbmdfZXhwb25lbnTxBAEwUmluZ0V4cG9uZW50AAEocGFnZV9pbmRleDgBJFBhZ2VJbmRleAABOGVuY29kZWRfY2h1bmtzGAEcVmVjPHU4PgAAEGhBZGRzIGEgbmV3IHBhZ2Ugb2YgY2h1bmtzLgBBAVRoZSBoYXNoIG9mIHRoZSBjaHVua3MgbXVzdCBtYXRjaCB0aGUgaGFzaCBzdG9yZWQgb24tY2hhaW4gaW4gYENodW5rUGFnZUhhc2hlc2Au3FRoZSBjYWxsIHdpbGwgZmFpbCBpZiB0aGUgcGFnZSBhbHJlYWR5IGV4aXN0cyBvbi1jaGFpbi5Uc2V0X2NodW5rX3BhZ2VfaGFzaGVzCAE0cmluZ19leHBvbmVudPEEATBSaW5nRXhwb25lbnQAASxwYWdlX2hhc2hlc/UEAUhWZWM8Q2h1bmtQYWdlSGFzaD4AARgNAVNldHMgdGhlIGV4cGVjdGVkIGhhc2hlcyBmb3IgY2h1bmsgcGFnZXMgZm9yIGEgZ2l2ZW4gcmluZyBleHBvbmVudC4AMQFUaGlzIGlzIGEgcm9vdC1vbmx5IGNhbGwgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGUgZXhwZWN0ZWQgaGFzaGVzIHRoYXQgY2h1bmtznG11c3QgbWF0Y2ggd2hlbiBhZGRlZCB2aWEgYGFkZF9jaHVua3NgLgCIQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3Qgb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7xBBA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eTBSaW5nRXhwb25lbnQAAQwQUjJlOQAJABRSMmUxMAAKABRSMmUxNAAOAAD1BAAAAggA+QQMUGluZGl2X3BhbGxldF9tZW1iZXJzGHBhbGxldBBDYWxsBARUAAEQRGJ1aWxkX3JpbmdfbWFudWFsDAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAShyaW5nX2luZGV4OAEkUmluZ0luZGV4AAEUbGltaXQJAwEsT3B0aW9uPHUzMj4AZBTIQnVpbGQgYSByaW5nIHJvb3QgYnkgaW5jbHVkaW5nIHJlZ2lzdGVyZWQgbWVtYmVycy4AWQFUaGlzIHRhc2sgaXMgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhbGxldCB0aHJvdWdoIHRoZSBgb25faWRsZWAgaG9vayB3aGVuZXZlckUBdGhlcmUgaXMgbGVmdG92ZXIgd2VpZ2h0IGluIGEgYmxvY2suIFRoaXMgY2FsbCBpcyBtZWFudCB0byBiZSBhIGJhY2t1cCBpbiBjYXNlIG9m9GV4dHJlbWUgY29uZ2VzdGlvbiBhbmQgc2hvdWxkIGJlIHN1Ym1pdHRlZCBieSBzaWduZWQgb3JpZ2lucy5Yb25ib2FyZF9tZW1iZXJzX21hbnVhbAQBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAGUcOQFPbmJvYXJkIG1lbWJlcnMgaW50byBhIHJpbmcgYnkgdGFraW5nIHRoZWlyIGtleXMgZnJvbSB0aGUgb25ib2FyZGluZyBxdWV1ZSBhbmRJAXJlZ2lzdGVyaW5nIHRoZW0gaW50byB0aGUgcmluZy4gVGhpcyBkb2VzIG5vdCBjb21wdXRlIHRoZSByb290LCB0aGF0IGlzIGRvbmUgdXNpbmc0YGJ1aWxkX3JpbmdgLgBZAVRoaXMgdGFzayBpcyBwZXJmb3JtZWQgYXV0b21hdGljYWxseSBieSB0aGUgcGFsbGV0IHRocm91Z2ggdGhlIGBvbl9pZGxlYCBob29rIHdoZW5ldmVyRQF0aGVyZSBpcyBsZWZ0b3ZlciB3ZWlnaHQgaW4gYSBibG9jay4gVGhpcyBjYWxsIGlzIG1lYW50IHRvIGJlIGEgYmFja3VwIGluIGNhc2Ugb2b0ZXh0cmVtZSBjb25nZXN0aW9uIGFuZCBzaG91bGQgYmUgc3VibWl0dGVkIGJ5IHNpZ25lZCBvcmlnaW5zLixtZXJnZV9yaW5ncwwBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAE8YmFzZV9yaW5nX2luZGV4OAEkUmluZ0luZGV4AAFEdGFyZ2V0X3JpbmdfaW5kZXg4ASRSaW5nSW5kZXgAZgxRAU1lcmdlIHRoZSBtZW1iZXJzIGluIHR3byByaW5ncyBpbnRvIGEgc2luZ2xlLCBuZXcgcmluZy4gSW4gb3JkZXIgZm9yIHRoZSByaW5ncyB0byBiZTUBZWxpZ2libGUgZm9yIG1lcmdpbmcsIHRoZXkgbXVzdCBiZSBiZWxvdyAxLzIgb2YgbWF4IGNhcGFjaXR5LCBoYXZlIG5vIHBlbmRpbmfgc3VzcGVuc2lvbnMgYW5kIG5vdCBiZSB0aGUgdG9wIHJpbmcgdXNlZCBmb3Igb25ib2FyZGluZy5Mc2V0X29uYm9hcmRpbmdfc2l6ZQgBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAE8b25ib2FyZGluZ19zaXplOAEMdTMyAAgETQFGb3JjZSBzZXQgdGhlIG9uYm9hcmRpbmcgc2l6ZSBmb3IgYSBjb2xsZWN0aW9uLiBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2VzLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79BAxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0EENhbGwEBFQAAVQUc3BsaXQEAShzcGxpdF9pbnRvAQUBjFZlYzwoQ29pblZhbHVlLCBWZWM8VDo6QWNjb3VudElkPik+AABMhFNwbGl0IGEgY29pbiBpbnRvIG11bHRpcGxlIGNvaW5zLgA9AVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OkNvaW5dLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgdHJhbnNhY3Rpb25YZXh0ZW5zaW9uIFtBc0NvaW5hZ2VdLgDUVGhlIGNhbGwgaXMgZnJlZSBhbmQgYWdlcyB0aGUgcmVzdWx0aW5nIGNvaW5zIGJ5IG9uZS4ASQFUaGUgYHNwbGl0X2ludG9gIHBhcmFtZXRlciBjb250YWlucyBhIHZlY3RvciBvZiBwYWlycywgZWFjaCBwYWlyIGNvbnRhaW5pbmcgYSBjb2luVQF2YWx1ZSBhbmQgYSBsaXN0IG9mIGRlc3RpbmF0aW9uIGFjY291bnQgaWRzLiBGb3IgZWFjaCBwYWlyLCBhIG5ldyBjb2luIHdpdGggdGhlIGdpdmVuxHZhbHVlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZGVzdGluYXRpb24gYWNjb3VudCBpZC4AWFZhbGlkaXR5IHJlcXVpcmVtZW50czrgKiBUaGUgY29pbidzIGFnZSBtdXN0IGJlIGxlc3MgdGhhbiBbQ29uZmlnOjpNYXhpbXVtQWdlXS5NASogVGhlIGNvaW4gdmFsdWUgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBkZWZpbmVkIGJ5IFtDb25maWc6Ok1pbmltdW1FeHBvbmVudF0gYW5kcCAgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS4tASogVGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgbXVzdCBlcXVhbCB0aGUgdmFsdWUgb2YgdGhlIG9yaWdpbiBjb2luLgkBKiBUaGUgbnVtYmVyIG9mIG91dHB1dHMgbXVzdCBub3QgZXhjZWVkIFtDb25maWc6Ok1heFNwbGl0T3V0cHV0c10uJQEqIFRoZSBhZ2Ugb2YgdGhlIG5ldyBjb2lucyBpcyBzZXQgdG8gdGhlIGFnZSBvZiB0aGUgb3JpZ2luIGNvaW4gcGx1cyBvbmUu4CogRWFjaCBkZXN0aW5hdGlvbiBhY2NvdW50IG11c3Qgbm90IGFscmVhZHkgaGF2ZSBhIGNvaW4uIHRyYW5zZmVyBAEIdG8EATBUOjpBY2NvdW50SWQAASiMVHJhbnNmZXIgYSBjb2luIHRvIGFub3RoZXIgYWNjb3VudC4APQFUaGUgb3JpZ2luIG11c3QgYmUgYSBbT3JpZ2luOjpDb2luXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4A0FRoZSBjYWxsIGlzIGZyZWUgYW5kIGFnZXMgdGhlIHJlc3VsdGluZyBjb2luIGJ5IG9uZS4AWFZhbGlkaXR5IHJlcXVpcmVtZW50czrcKiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBtdXN0IG5vdCBhbHJlYWR5IGhhdmUgYSBjb2luLuAqIFRoZSBjb2luJ3MgYWdlIG11c3QgYmUgbGVzcyB0aGFuIFtDb25maWc6Ok1heGltdW1BZ2VdLlxsb2FkX3JlY3ljbGVyX3dpdGhfY29pbggBKG1lbWJlcl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAE4U2lnbmF0dXJlT2Y8VD4AAjxoTG9hZCBjb2luIGludG8gYSByZWN5Y2xlci4APQFUaGUgb3JpZ2luIG11c3QgYmUgYSBbT3JpZ2luOjpDb2luXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4ARFRoZSBjYWxsIGlzIGZyZWUuAFkBVGhlIGBtZW1iZXJfa2V5YCBwYXJhbWV0ZXIgaXMgdGhlIG1lbWJlciBrZXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlY3ljbGVyLCBhbmQgd2hvc2WoYWxpYXMgaXMgdXNlZCB0byB1bmxvYWQgZnJvbSB0aGUgcmVjeWNsZXIuAFhWYWxpZGl0eSByZXF1aXJlbWVudHM6AQEqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBub3QgYWxyZWFkeSBiZSB1c2VkIGluIGFub3RoZXIgcmVjeWNsZXIu0CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIChpLmUuIHdlbGwgZm9ybWVkKS5RASogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgYSB2YWxpZCBzaWduYXR1cmUgb2YgdGhlIGNvaW4ncyBhY2NvdW50IGlkIGJ5IHRoZTwgIGBtZW1iZXJfa2V5YC6EbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0EAEwcHJlc2VydmF0aW9uCQUBRENvZGVjUHJlc2VydmF0aW9uAAEUdmFsdWVtAwEkQ29pblZhbHVlAAEobWVtYmVyX2tleVEEASxNZW1iZXJPZjxUPgABSHByb29mX29mX293bmVyc2hpcGEEAThTaWduYXR1cmVPZjxUPgADcJBMb2FkIGV4dGVybmFsIGFzc2V0IGludG8gYSByZWN5Y2xlci4AjFRoZSBvcmlnaW4gbXVzdCBiZSBhIHNpZ25lZCBvcmlnaW4uAIBUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHJlZnVuZGVkLgBFAVRoZSBgcHJlc2VydmF0aW9uYCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyB0aGUgYXNzZXQgdHJhbnNmZXIgc2hvdWxkIHByZXNlcnZlIHRoZURzaWduZXIncyBhY2NvdW50LgA5AVRoZSBgdmFsdWVgIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGNvaW4gdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIHJlY3ljbGVyLj0BVGhlIGVxdWl2YWxlbnQgYW1vdW50IG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIHNpZ25lciB0b0x0aGUgcGFsbGV0IGFjY291bnQuAFkBVGhlIGBtZW1iZXJfa2V5YCBwYXJhbWV0ZXIgaXMgdGhlIG1lbWJlciBrZXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlY3ljbGVyLCBhbmQgd2hvc2WoYWxpYXMgaXMgdXNlZCB0byB1bmxvYWQgZnJvbSB0aGUgcmVjeWNsZXIuAFUBVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIHBhcmFtZXRlciBpcyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBzaWduZXIncyBhY2NvdW50IGlkIGJ5IHRoZTRgbWVtYmVyX2tleWAuADRSZXF1aXJlbWVudHM6AQEqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBub3QgYWxyZWFkeSBiZSB1c2VkIGluIGFub3RoZXIgcmVjeWNsZXIu0CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIChpLmUuIHdlbGwgZm9ybWVkKS5BASogVGhlIGB2YWx1ZWAgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBkZWZpbmVkIGJ5IFtDb25maWc6Ok1pbmltdW1FeHBvbmVudF0gYW5kcCAgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS5VASogVGhlIHNpZ25lciBtdXN0IGhhdmUgZW5vdWdoIGJhbGFuY2Ugb2YgdGhlIHVuZGVybHlpbmcgYXNzZXQgdG8gY292ZXIgdGhlIGVxdWl2YWxlbnSIICBhbW91bnQgZm9yIHRoZSBnaXZlbiBjb2luIHZhbHVlLlkBKiBUaGUgYHByb29mX29mX293bmVyc2hpcGAgbXVzdCBiZSBhIHZhbGlkIHNpZ25hdHVyZSBvZiB0aGUgc2lnbmVyJ3MgYWNjb3VudCBpZCBieSB0aGU0YG1lbWJlcl9rZXlgLmR1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luFAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAEUdmFsdWVtAwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAQh0bwQBMFQ6OkFjY291bnRJZAAEZJRVbmxvYWQgYSByZWN5Y2xlciB0byBtaW50IGEgbmV3IGNvaW4uAF0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6VW5sb2FkVG9rZW5dIHdpdGggYGZlZTogVW5sb2FkRmVlOjpQcmVwYWlkYCwgd2hpY2ggY2FuIGJlQQFvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gW0FzQ29pbmFnZV0gdXNpbmcgYEFzVW5sb2FkVG9rZW5QZW9wbGVgLOxgQXNVbmxvYWRUb2tlbkxpdGVQZW9wbGVgLCBvciBgQXNVbmxvYWRUb2tlblBhaWRgIHZhcmlhbnRzLgBJAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdXNlciB0byBwcm92ZSB0aGV5IG93biBvbmUgb3IgbW9yZSBjb2lucyBpbiBhIHJlY3ljbGVyIHJpbmddAXdpdGhvdXQgcmV2ZWFsaW5nIHdoaWNoIHNwZWNpZmljIGNvaW5zIHRoZXkgb3duLiBJdCBjb25zb2xpZGF0ZXMgb25lIG9yIG11bHRpcGxlIGlucHV0c2hpbnRvIGEgc2luZ2xlIG91dHB1dCBjb2luLgAsUGFyYW1ldGVyczpFASogYGFsaWFzZXNgOiB0aGUgbGlzdCBvZiBhbGlhc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBrZXlzIGluY2x1ZGVkIGluIHRoZRUBICByZWN5Y2xlci4gVGhlIHByb29mcyBmb3IgdGhlc2UgYWxpYXNlcyBhcmUgY29udGFpbmVkIGluIHRoZSBvcmlnaW4u+CogYHZhbHVlYCBhbmQgYGluZGV4YDogaWRlbnRpZmllcyB0aGUgcmVjeWNsZXIgYmVpbmcgdW5sb2FkZWQu/CogYF9yZXZpc2lvbmA6IHRoZSByZWN5Y2xlciByZXZpc2lvbiB1c2VkIGZvciB0aGUgYWxpYXNfcHJvb2ZzLsQqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgbmV3IGNvaW4uADRSZXF1aXJlbWVudHM6KQEqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0gd2l0aCBgZmVlOiBVbmxvYWRGZWU6OlByZXBhaWRgLvAqIFRoZSByZWN5Y2xlciBpZGVudGlmaWVkIGJ5IGB2YWx1ZWAgYW5kIGBpbmRleGAgbXVzdCBleGlzdC5RASogVGhlIGFsaWFzIHByb29mcyBwcm92aWRlZCBpbiB0aGUgb3JpZ2luIG11c3QgYmUgdmFsaWQgZm9yIHRoZSByZWN5Y2xlcidzIHJldmlzaW9uLiEBKiBUaGUgYGFsaWFzZXNgIHByb3ZpZGVkIG11c3QgbWF0Y2ggdGhlIGFsaWFzZXMgZGVyaXZlZCBmcm9tIHRoZSBwcm9vZnMuFQEqIFRoZSBhbGlhc2VzIG11c3Qgbm90IGhhdmUgYmVlbiBhbHJlYWR5IHVubG9hZGVkIGZyb20gdGhpcyByZWN5Y2xlci68KiBUaGUgbnVtYmVyIG9mIGFsaWFzZXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by41ASogVGhlIHJlc3VsdGluZyBjb25zb2xpZGF0ZWQgdmFsdWUgbXVzdCBub3QgZXhjZWVkIFtDb25maWc6Ok1heGltdW1FeHBvbmVudF0ujHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0FAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAEUdmFsdWVtAwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAQh0bwQBMFQ6OkFjY291bnRJZAAFYPBVbmxvYWQgYSByZWN5Y2xlciB0byB3aXRoZHJhdyB0aGUgdW5kZXJseWluZyBleHRlcm5hbCBhc3NldC4AUQFUaGUgb3JpZ2luIG11c3QgYmUgW09yaWdpbjo6VW5sb2FkVG9rZW5dLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgdHJhbnNhY3Rpb25YZXh0ZW5zaW9uIFtBc0NvaW5hZ2VdLgBdAVdoZW4gYGZlZWAgaXMgW1VubG9hZEZlZTo6UHJlcGFpZF0gKHZpYSBmcmVlIG9yIHBhaWQgdW5sb2FkIHRva2VuKSwgbm8gZmVlIGlzIGRlZHVjdGVkLlEBV2hlbiBgZmVlYCBpcyBbVW5sb2FkRmVlOjpGcm9tT3V0cHV0XSwgdGhlIGZlZSBpcyBkZWR1Y3RlZCBmcm9tIHRoZSB1bmxvYWRlZCBhc3NldHMuADEBVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSB1c2VyIHRvIHdpdGhkcmF3IHRoZWlyIGNvaW5zIGJhY2sgaW50byB0aGUgdW5kZXJseWluZ2Rhc3NldCAoZS5nLiwgc3RhYmxlY29pbikuACxQYXJhbWV0ZXJzOkUBKiBgYWxpYXNlc2A6IHRoZSBsaXN0IG9mIGFsaWFzZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbWVtYmVyIGtleXMgaW5jbHVkZWQgaW4gdGhlFQEgIHJlY3ljbGVyLiBUaGUgcHJvb2ZzIGZvciB0aGVzZSBhbGlhc2VzIGFyZSBjb250YWluZWQgaW4gdGhlIG9yaWdpbi74KiBgdmFsdWVgIGFuZCBgaW5kZXhgOiBpZGVudGlmaWVzIHRoZSByZWN5Y2xlciBiZWluZyB1bmxvYWRlZC78KiBgX3JldmlzaW9uYDogdGhlIHJlY3ljbGVyIHJldmlzaW9uIHVzZWQgZm9yIHRoZSBhbGlhc19wcm9vZnMu5CogYHRvYDogdGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSB1bmRlcmx5aW5nIGFzc2V0LgA0UmVxdWlyZW1lbnRzOqwqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0u8CogVGhlIHJlY3ljbGVyIGlkZW50aWZpZWQgYnkgYHZhbHVlYCBhbmQgYGluZGV4YCBtdXN0IGV4aXN0LlEBKiBUaGUgYWxpYXMgcHJvb2ZzIHByb3ZpZGVkIGluIHRoZSBvcmlnaW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIHJlY3ljbGVyJ3MgcmV2aXNpb24uWQEqIFRoZSBhbGlhc2VzIG11c3Qgbm90IGhhdmUgYmVlbiBhbHJlYWR5IHVubG9hZGVkIChleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUgd2hlbiBgZmVlYBUBICBpcyBbVW5sb2FkRmVlOjpGcm9tT3V0cHV0XSwgd2hpY2ggd2FzIHByZS1tYXJrZWQgaW4gdGhlIGV4dGVuc2lvbikurHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX2NvaW4IAShtZW1iZXJfa2V5UQQBLE1lbWJlck9mPFQ+AAFIcHJvb2Zfb2Zfb3duZXJzaGlwYQQBuDxDcnlwdG9PZjxUPiBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUABlQpAVBheSB0aGUgZmVlIHRvIHJlZ2lzdGVyIGEgbWVtYmVyIGtleSBmb3IgYSBwYWlkIHVubG9hZCB0b2tlbiB1c2luZyBhIGNvaW4uAD0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6Q29pbl0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvblhleHRlbnNpb24gW0FzQ29pbmFnZV0uAEkBVGhlIGNvaW4gaXMgY29uc3VtZWQuIFRoZSBmZWUgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgY29pbidzIHZhbHVlIGFuZCB0cmFuc2ZlcnJlZCB0bx0BW0NvbmZpZzo6RmVlRGVzdGluYXRpb25dLiBUaGUgcmVtYWluaW5nIHZhbHVlIG9mIHRoZSBjb2luIGlzIGRlc3Ryb3llZC4A1ElmIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3JpZ2luIGNvaW4gaXMgc3RpbGwgY29uc3VtZWQuAF0BVG8gcHJvdGVjdCB0aGUgdXNlciBhZ2FpbnN0IHZhcnlpbmcgZmVlcywgaWYgdGhlIGNvaW4ncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGZlZSwgdGhl6GNhbGwgaXMgaW52YWxpZCAoYW4gaW52YWxpZCBjYWxsIG5ldmVyIGdvZXMgaW50byBhIGJsb2NrKS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrgKiBUaGUgY29pbidzIGFnZSBtdXN0IGJlIGxlc3MgdGhhbiBbQ29uZmlnOjpNYXhpbXVtQWdlXS7UKiBUaGUgY29pbiB2YWx1ZSBtdXN0IGJlIHN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIGZlZS7YKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQutHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX25hdGl2ZQgBKG1lbWJlcl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAG4PENyeXB0b09mPFQ+IGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAHPF0BUGF5IHRoZSBmZWUgdG8gcmVnaXN0ZXIgYSBtZW1iZXIga2V5IGZvciBhIHBhaWQgdW5sb2FkIHRva2VuIHVzaW5nIHRoZSBuYXRpdmUgY3VycmVuY3kuAGhUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkLgBFAVRoaXMgYWRkcyB0aGUgYG1lbWJlcl9rZXlgIHRvIGEgInBhaWQgdW5sb2FkIHRva2VuIHJpbmciLiBCZWluZyBwYXJ0IG9mIHRoaXMgcmluZ0kBYWxsb3dzIHRoZSB1c2VyIHRvIGxhdGVyIGdlbmVyYXRlIGFuIGFub255bW91cyBgVW5sb2FkVG9rZW5gIHRvIHVubG9hZCBhIHJlY3ljbGVyLgANAVRoZSBmZWUgaXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgY2FsbGVyIHRvIFtDb25maWc6OkZlZURlc3RpbmF0aW9uXS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrYKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQutHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX3N0YWJsZQgBKG1lbWJlcl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAG4PENyeXB0b09mPFQ+IGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAIQF0BUGF5IHRoZSBmZWUgdG8gcmVnaXN0ZXIgYSBtZW1iZXIga2V5IGZvciBhIHBhaWQgdW5sb2FkIHRva2VuIHVzaW5nIHRoZSB1bmRlcmx5aW5nIGFzc2V0UGkuZS4gdGhlIHN0YWJsZWNvaW4uAGhUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkLgBFAVRoaXMgYWRkcyB0aGUgYG1lbWJlcl9rZXlgIHRvIGEgInBhaWQgdW5sb2FkIHRva2VuIHJpbmciLiBCZWluZyBwYXJ0IG9mIHRoaXMgcmluZ0kBYWxsb3dzIHRoZSB1c2VyIHRvIGxhdGVyIGdlbmVyYXRlIGFuIGFub255bW91cyBgVW5sb2FkVG9rZW5gIHRvIHVubG9hZCBhIHJlY3ljbGVyLgANAVRoZSBmZWUgaXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgY2FsbGVyIHRvIFtDb25maWc6OkZlZURlc3RpbmF0aW9uXS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrYKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQujHVubG9hZF9yZWN5Y2xlcnNfaW50b19jb2luX3Vuc3RhYmxlCAEYaW5wdXRzDQUBYFZlYzxVbmxvYWRSZWN5Y2xlcklucHV0PgABCHRvBAEwVDo6QWNjb3VudElkAAloKQFXQVJOSU5HOiBUaGlzIGNhbGwgaXMgdW5zdGFibGUgYW5kIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgYmVjYXVzZTEBcHJvb2ZzIGZvciBtdWx0aXBsZSByZWN5Y2xlcnMgbWF5IG5vdCBiZSBiYXRjaGFibGUgZm9yIHRoZSB2MSByZWxlYXNlLiBBbHNvLFUBdGhpcyBjYWxsIG1heSBsZWFrIHRvbyBtdWNoIGluZm9ybWF0aW9uIGJlY2F1c2UgdGhlIHJlc3VsdGluZyBjb2luIGluaGVyaXRzIHRoZSB3b3JzdERyZWN5Y2xlciBwcml2YWN5LgDoVW5sb2FkIG11bHRpcGxlIHJlY3ljbGVycyB0byBtaW50IGEgbmV3IGNvbnNvbGlkYXRlZCBjb2luLgBdAVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OlVubG9hZFRva2VuXSB3aXRoIGBmZWU6IFVubG9hZEZlZTo6UHJlcGFpZGAsIHdoaWNoIGNhbiBiZUEBb2J0YWluZWQgZnJvbSB0aGUgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIFtBc0NvaW5hZ2VdIHVzaW5nIGBBc1VubG9hZFRva2VuUGVvcGxlYCzsYEFzVW5sb2FkVG9rZW5MaXRlUGVvcGxlYCwgb3IgYEFzVW5sb2FkVG9rZW5QYWlkYCB2YXJpYW50cy4AWQFUaGlzIGZ1bmN0aW9uIGFsbG93cyBhIHVzZXIgdG8gY29uc29saWRhdGUgY29pbnMgZnJvbSBkaWZmZXJlbnQgcmVjeWNsZXJzIChwb3RlbnRpYWxsecR3aXRoIGRpZmZlcmVudCB2YWx1ZXMpIGludG8gYSBzaW5nbGUgb3V0cHV0IGNvaW4uACxQYXJhbWV0ZXJzOjEBKiBgaW5wdXRzYDogQSBsaXN0IG9mIGlucHV0cywgc3BlY2lmeWluZyB0aGUgcmVjeWNsZXIgYW5kIGFsaWFzZXMgdG8gdW5sb2FkLsQqIGB0b2A6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgbmV3IGNvaW4uADRSZXF1aXJlbWVudHM6KQEqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0gd2l0aCBgZmVlOiBVbmxvYWRGZWU6OlByZXBhaWRgLpQqIEFsbCBzcGVjaWZpZWQgcmVjeWNsZXJzIG11c3QgZXhpc3QuPQEqIFRoZSBhbGlhcyBwcm9vZnMgaW4gdGhlIG9yaWdpbiBtdXN0IGNvcnJlc3BvbmQgc2VxdWVudGlhbGx5IHRvIHRoZSBhbGlhc2VzIGluLCAgYGlucHV0c2Au7CogVGhlIHRvdGFsIHZhbHVlIG9mIHVubG9hZGVkIGNvaW5zIG11c3QgYmUgYSBwb3dlciBvZiB0d28uFQEqIFRoZSByZXN1bHRpbmcgY29pbiB2YWx1ZSBtdXN0IG5vdCBleGNlZWQgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS49ASogYGlucHV0c2AgbXVzdCBub3QgYmUgZW1wdHksIGFuZCBlYWNoIGVsZW1lbnQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhbGlhcy60dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X3Vuc3RhYmxlCAEYaW5wdXRzDQUBYFZlYzxVbmxvYWRSZWN5Y2xlcklucHV0PgABCHRvBAEwVDo6QWNjb3VudElkAApoKQFXQVJOSU5HOiBUaGlzIGNhbGwgaXMgdW5zdGFibGUgYW5kIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgYmVjYXVzZRkBcHJvb2ZzIGZvciBtdWx0aXBsZSByZWN5Y2xlcnMgbWF5IG5vdCBiZSBiYXRjaGFibGUgZm9yIHRoZSB2MSByZWxlYXNlLgARAVVubG9hZCBtdWx0aXBsZSByZWN5Y2xlcnMgdG8gd2l0aGRyYXcgdGhlIHVuZGVybHlpbmcgZXh0ZXJuYWwgYXNzZXQuAFEBVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4AXQFXaGVuIGBmZWVgIGlzIFtVbmxvYWRGZWU6OlByZXBhaWRdICh2aWEgZnJlZSBvciBwYWlkIHVubG9hZCB0b2tlbiksIG5vIGZlZSBpcyBkZWR1Y3RlZC5RAVdoZW4gYGZlZWAgaXMgW1VubG9hZEZlZTo6RnJvbU91dHB1dF0sIHRoZSBmZWUgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgdW5sb2FkZWQgYXNzZXRzLgBZAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdXNlciB0byBjb25zb2xpZGF0ZSBjb2lucyBmcm9tIGRpZmZlcmVudCByZWN5Y2xlcnMgKHBvdGVudGlhbGx5MQF3aXRoIGRpZmZlcmVudCB2YWx1ZXMpIGFuZCB3aXRoZHJhdyB0aGUgdG90YWwgdmFsdWUgYXMgdGhlIHVuZGVybHlpbmcgYXNzZXQuACxQYXJhbWV0ZXJzOjEBKiBgaW5wdXRzYDogQSBsaXN0IG9mIGlucHV0cywgc3BlY2lmeWluZyB0aGUgcmVjeWNsZXIgYW5kIGFsaWFzZXMgdG8gdW5sb2FkLrgqIGB0b2A6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgYXNzZXQuADRSZXF1aXJlbWVudHM6rCogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXS6UKiBBbGwgc3BlY2lmaWVkIHJlY3ljbGVycyBtdXN0IGV4aXN0Lj0BKiBUaGUgYWxpYXMgcHJvb2ZzIGluIHRoZSBvcmlnaW4gbXVzdCBjb3JyZXNwb25kIHNlcXVlbnRpYWxseSB0byB0aGUgYWxpYXNlcyBpbiwgIGBpbnB1dHNgLj0BKiBgaW5wdXRzYCBtdXN0IG5vdCBiZSBlbXB0eSwgYW5kIGVhY2ggZWxlbWVudCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGFsaWFzLl0BKiBGb3IgW1VubG9hZEZlZTo6RnJvbU91dHB1dF0sIHRoZSBmaXJzdCBhbGlhcyBvZiB0aGUgZmlyc3QgaW5wdXQgd2FzIHByZS1tYXJrZWQgaW4gdGhlMCAgZXh0ZW5zaW9uLsR1bmxvYWRfcmVjeWNsZXJfaW50b19leHRlcm5hbF9hc3NldF9ub25fYW5vbnltb3VzEAEUaW5wdXQRBQFMVW5sb2FkUmVjeWNsZXJJbnB1dAABMGFsaWFzX3Byb29mc3EDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEIdG8EATBUOjpBY2NvdW50SWQAATBmZWVfY3VycmVuY3kVBQEsRmVlQ3VycmVuY3kACxgxAVVubG9hZCBhIHJlY3ljbGVyIHRvIHdpdGhkcmF3IHRoZSB1bmRlcmx5aW5nIGV4dGVybmFsIGFzc2V0IChub24tYW5vbnltb3VzKS4AVQFDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBbU2VsZjo6dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X25vbl9hbm9ueW1vdXNddGZvciB0aGUgc2luZ2xlLXJlY3ljbGVyIGNhc2UuAFkBU2VlIFtTZWxmOjp1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91c10gZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi7IdW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X25vbl9hbm9ueW1vdXMQARhpbnB1dHMNBQFgVmVjPFVubG9hZFJlY3ljbGVySW5wdXQ+AAEwYWxpYXNfcHJvb2ZzcQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAQh0bwQBMFQ6OkFjY291bnRJZAABMGZlZV9jdXJyZW5jeRUFASxGZWVDdXJyZW5jeQAMUFEBVW5sb2FkIG11bHRpcGxlIHJlY3ljbGVycyB0byB3aXRoZHJhdyB0aGUgdW5kZXJseWluZyBleHRlcm5hbCBhc3NldCAobm9uLWFub255bW91cykuAGEBVGhpcyBpcyBhIG5vbi1hbm9ueW1vdXMgdmVyc2lvbiBvZiBbU2VsZjo6dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X3Vuc3RhYmxlXUEBd2hlcmUgdGhlIGZlZSBpcyBwYWlkIGV4cGxpY2l0bHkgYnkgdGhlIHNpZ25lciByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBhbm9ueW1vdXNIdW5sb2FkIHRva2VuIHJpbmcuACxQYXJhbWV0ZXJzOjEBKiBgaW5wdXRzYDogQSBsaXN0IG9mIGlucHV0cywgc3BlY2lmeWluZyB0aGUgcmVjeWNsZXIgYW5kIGFsaWFzZXMgdG8gdW5sb2FkLlUBKiBgYWxpYXNfcHJvb2ZzYDogdGhlIHByb29mcyBmb3IgYWxsIGFsaWFzZXMgYWNyb3NzIGFsbCBpbnB1dHMsIHNpZ25lZCBvdmVyIGEgbWVzc2FnZVUBICB0aGF0IGluY2x1ZGVzIHRoZSBzaWduZXIuIFRoZSBwcm9vZnMgbXVzdCBjb3JyZXNwb25kIHNlcXVlbnRpYWxseSB0byB0aGUgYWxpYXNlcyBpbiwgIGBpbnB1dHNgLrgqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgYXNzZXQuMQEqIGBmZWVfY3VycmVuY3lgOiB3aGV0aGVyIHRvIHBheSB0aGUgZmVlIGluIG5hdGl2ZSBjdXJyZW5jeSBvciBzdGFibGUgYXNzZXQuADRSZXF1aXJlbWVudHM6cCogVGhlIG9yaWdpbiBtdXN0IGJlIFNpZ25lZC6UKiBBbGwgc3BlY2lmaWVkIHJlY3ljbGVycyBtdXN0IGV4aXN0Li0BKiBUaGUgYWxpYXMgcHJvb2ZzIG11c3QgY29ycmVzcG9uZCBzZXF1ZW50aWFsbHkgdG8gdGhlIGFsaWFzZXMgaW4gYGlucHV0c2AuOQEqIGBpbnB1dHNgIG11c3Qgbm90IGJlIGVtcHR5IGFuZCBlYWNoIGVsZW1lbnQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhbGlhcy7kKiBUaGUgc2lnbmVyIG11c3QgaGF2ZSBzdWZmaWNpZW50IGJhbGFuY2UgdG8gcGF5IHRoZSBmZWUuaHVubG9hZF9yZWN5Y2xlcl9pbnRvX2NvaW5zFAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAEUdmFsdWVtAwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAShzcGxpdF9pbnRvAQUBjFZlYzwoQ29pblZhbHVlLCBWZWM8VDo6QWNjb3VudElkPik+AA101FVubG9hZCBhIHJlY3ljbGVyIHRvIG1pbnQgbXVsdGlwbGUgbmV3IGNvaW5zIChzcGxpdCkuACkBVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6VW5sb2FkVG9rZW5dIHdpdGggYGZlZTogVW5sb2FkRmVlOjpQcmVwYWlkYC4ARQFUaGlzIGZ1bmN0aW9uIGNvbWJpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFtTZWxmOjp1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luXSBhbmRFAVtTZWxmOjpzcGxpdF0gaW4gYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvbi4gVGhlIHJlc3VsdGluZyBjb2lucycgYWdlIGlzIDEgYmVjYXVzZUUBdGhlIGFjdGlvbiBvZiBzcGxpdHRpbmcgYWdlIGNvaW5zLiBUaGlzIGlzIGFsc28gaW1wb3J0YW50IGJlY2F1c2UgcmVzdWx0aW5nIGNvaW5z6GFyZSBub3QgZW50aXJlbHkgZnJlc2gsIHRoZXkgY2FuIGJlIGxpbmtlZCB0byBvdGhlciBjb2lucy4AWQFVbmxpa2UgW1NlbGY6OnVubG9hZF9yZWN5Y2xlcl9pbnRvX2NvaW5dLCB0aGlzIGNhbGwgZG9lcyAqKm5vdCoqIHJlcXVpcmUgdGhlIG51bWJlciBvZkUBYWxpYXNlcyB0byBiZSBhIHBvd2VyIG9mIHR3by4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgdG90YWwgdmFsdWUgb2YgdGhlUQF1bmxvYWRlZCBhbGlhc2VzIG1hdGNoZXMgdGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgc3BlY2lmaWVkIGluIGBzcGxpdF9pbnRvYC4ALFBhcmFtZXRlcnM6RQEqIGBhbGlhc2VzYDogdGhlIGxpc3Qgb2YgYWxpYXNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZW1iZXIga2V5cyBpbmNsdWRlZCBpbiB0aGUVASAgcmVjeWNsZXIuIFRoZSBwcm9vZnMgZm9yIHRoZXNlIGFsaWFzZXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luLvgqIGB2YWx1ZWAgYW5kIGBpbmRleGA6IGlkZW50aWZpZXMgdGhlIHJlY3ljbGVyIGJlaW5nIHVubG9hZGVkLvwqIGBfcmV2aXNpb25gOiB0aGUgcmVjeWNsZXIgcmV2aXNpb24gdXNlZCBmb3IgdGhlIGFsaWFzX3Byb29mcy5JASogYHNwbGl0X2ludG9gOiBhIHZlY3RvciBvZiBwYWlycywgZWFjaCBwYWlyIGNvbnRhaW5pbmcgYSBjb2luIHZhbHVlIGFuZCBhIGxpc3Qgb2ZoICBkZXN0aW5hdGlvbiBhY2NvdW50IGlkcy4ANFJlcXVpcmVtZW50czopASogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXSB3aXRoIGBmZWU6IFVubG9hZEZlZTo6UHJlcGFpZGAu8CogVGhlIHJlY3ljbGVyIGlkZW50aWZpZWQgYnkgYHZhbHVlYCBhbmQgYGluZGV4YCBtdXN0IGV4aXN0LlEBKiBUaGUgYWxpYXMgcHJvb2ZzIHByb3ZpZGVkIGluIHRoZSBvcmlnaW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIHJlY3ljbGVyJ3MgcmV2aXNpb24uIQEqIFRoZSBgYWxpYXNlc2AgcHJvdmlkZWQgbXVzdCBtYXRjaCB0aGUgYWxpYXNlcyBkZXJpdmVkIGZyb20gdGhlIHByb29mcy5hASogVGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgZGVmaW5lZCBpbiBgc3BsaXRfaW50b2AgbXVzdCBlcXVhbCB0aGUgdG90YWwgdmFsdWUgb2ZUICB0aGUgdW5sb2FkZWQgY29pbnMu4CogRWFjaCBkZXN0aW5hdGlvbiBhY2NvdW50IG11c3Qgbm90IGFscmVhZHkgaGF2ZSBhIGNvaW4uoGRpcmVjdF9vZmZib2FyZF9jb2luX2ludG9fZXh0ZXJuYWxfYXNzZXQEAQh0bwQBMFQ6OkFjY291bnRJZAAOOCUBRGlyZWN0bHkgb2ZmYm9hcmQgYSBmcmVzaCwgMC1hZ2UgY29pbiBpbnRvIHRoZSB1bmRlcmx5aW5nIGV4dGVybmFsIGFzc2V0LgBFAVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OkNvaW5dLCBvYnRhaW5lZCB0aHJvdWdoIFtBc0NvaW5hZ2VdIHVzaW5nIGBBc0NvaW5gLgANAUJlY2F1c2UgdGhlIGNvaW4gbXVzdCBiZSBmcmVzaCAoYGFnZSA9PSAwYCksIHRoaXMgY2FsbCBieXBhc3NlcyB0aGVJAXJlY3ljbGVyL3VubG9hZC10b2tlbiBvZmZib2FyZGluZyBmbG93IGFuZCByZWxlYXNlcyB0aGUgdW5kZXJseWluZyBhc3NldCBkaXJlY3RseS4ALFBhcmFtZXRlcnM6PQEqIGB0b2A6IGRlc3RpbmF0aW9uIGFjY291bnQgdGhhdCByZWNlaXZlcyB0aGUgcmVsZWFzZWQgdW5kZXJseWluZyBhc3NldCBhbW91bnQuADRSZXF1aXJlbWVudHM6kCogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OkNvaW5dLqgqIFRoZSBjb2luIG11c3QgYmUgZnJlc2g6IGBjb2luLmFnZSA9PSAwYC4JASogVGhlIGNvaW4gdmFsdWUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIHVuZGVybHlpbmctYXNzZXQgYW1vdW50LjhjbGVhbl9yZWN5Y2xlcgQBFHZhbHVlbQMBJENvaW5WYWx1ZQBlHHRDbGVhbiB1cCBhbiBleHBpcmVkIHJlY3ljbGVyLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UuAA0BVGhpcyByZW1vdmVzIGFuIG9sZCByZWN5Y2xlciB0aGF0IGhhcyBleGNlZWRlZCBpdHMgZXhwaXJhdGlvbiB0aW1lLkkBQW55IHJlbWFpbmluZyAobm90IHVubG9hZGVkKSB2YWx1ZSBpbiB0aGUgcmVjeWNsZXIgaXMgY29uc2lkZXJlZCBsb3N0IGFuZCBhZGRlZCB0b3RbVG90YWxWYWx1ZU9mRGVzdHJveWVkQ29pbnNdLmRjbGVhbl9jb25zdW1lZF9mcmVlX3Rva2VuBAEYcGVyaW9kOAEYUGVyaW9kAGYM/ENsZWFudXAgc3RvcmFnZSBmb3IgY29uc3VtZWQgZnJlZSB1bmxvYWQgdG9rZW5zIG9mIG9sZCBwZXJpb2RzLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UucGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcIARhwZXJpb2Q4ARhQZXJpb2QAAShyaW5nX2luZGV4OAEkUmluZ0luZGV4AGgYCQFDbGVhbiB1cCBhIHNpbmdsZSByaW5nIGluIGFuIGV4cGlyZWQgcGFpZCB1bmxvYWQgdG9rZW4gY29sbGVjdGlvbi4AQQFUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gVGhlIG9yaWdpbiBtdXN0IGJlIGF1dGhvcml6ZWQgYW5kIGZyb20gbG9jYWwgc291cmNlLikBUmluZ3MgbXVzdCBiZSBjbGVhbmVkIHNlcXVlbnRpYWxseSAocmluZyAwIGZpcnN0LCB0aGVuIDEsIGV0Yy4pIGJlZm9yZSB0aGV0Y29sbGVjdGlvbiBjYW4gYmUgZGVsZXRlZCB2aWGNAVtgZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbmBdKFNlbGY6OmRlbGV0ZV9leHBpcmVkX3BhaWRfdW5sb2FkX3Rva2VuX2NvbGxlY3Rpb24pLkxjbGVhbl9yZWN5Y2xlcl9kdXN0AGkUcENsZWFuIHVwIGR1c3QgZm9yIHJlY3ljbGVycy4AQQFUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gVGhlIG9yaWdpbiBtdXN0IGJlIGF1dGhvcml6ZWQgYW5kIGZyb20gbG9jYWwgc291cmNlLkkBUmVtb3ZlcyB1cCB0byBEVVNUX0NMRUFOVVBfQkFUQ0hfU0laRSB1bmxvYWRlZCBhbGlhcyBlbnRyaWVzIHBlciBjYWxsIHRvIGJvdW5kIHRoZShvcGVyYXRpb24ucGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAagyUQ2xlYW4gdXAgZHVzdCBmb3IgcGFpZCB1bmxvYWQgdG9rZW5zLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UurGRlbGV0ZV9leHBpcmVkX3BhaWRfdW5sb2FkX3Rva2VuX2NvbGxlY3Rpb24EARhwZXJpb2Q4ARhQZXJpb2QAaxhFAURlbGV0ZSBhbiBleHBpcmVkIHBhaWQgdW5sb2FkIHRva2VuIGNvbGxlY3Rpb24gYWZ0ZXIgYWxsIHJpbmdzIGhhdmUgYmVlbiBjbGVhbmVkLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UukEFsbCByaW5ncyBtdXN0IGhhdmUgYmVlbiBjbGVhbmVkIHZpYUEBW2BjbGVhbl9wYWlkX3VubG9hZF90b2tlbl9yaW5nYF0oU2VsZjo6Y2xlYW5fcGFpZF91bmxvYWRfdG9rZW5fcmluZykgYmVmb3JlIHRoaXM4Y2FuIGJlIGNhbGxlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuAQUAAAIFBQAFBQAABAhtA8wACQUMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldERDb2RlY1ByZXNlcnZhdGlvbgABDChFeHBlbmRhYmxlAAAAHFByb3RlY3QAAQAgUHJlc2VydmUAAgAADQUAAAIRBQARBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0TFVubG9hZFJlY3ljbGVySW5wdXQAABABFHZhbHVlbQMBJENvaW5WYWx1ZQABFGluZGV4OAEkUmluZ0luZGV4AAEgcmV2aXNpb244ATRSZXZpc2lvbkluZGV4AAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAAVBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0LEZlZUN1cnJlbmN5AAEIGE5hdGl2ZQAAABhTdGFibGUAAQAAGQUMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldBBDYWxsBARUAAEQOHNjaGVkdWxlX2V2ZW50BAEoZXZlbnRfaW5mbx0FAThFdmVudEluZm9PZjxUPgAAGGRTY2hlZHVsZSBhIGFpcmRyb3AgZXZlbnQuAJBUaGUgb3JpZ2luIG11c3QgYmUgYFNjaGVkdWxlT3JpZ2luYC4ATQFUaGUgdG90YWwgYW1vdW50IHRvIGJlIGRpc3RyaWJ1dGVkIGluIHByaXplcyB3aWxsIGJlIHB1dCBvbiBob2xkLiBUaGUgZXZlbnQgd2lsbCBiZbxhZGRlZCB0byB0aGUgc2NoZWR1bGUgYW5kIGJlIGdpdmVuIGFuIGV2ZW50IGlkLlhyZW1vdmVfc2NoZWR1bGVkX2V2ZW50BAEgZXZlbnRfaWQ4ARxFdmVudElkAAEghFJlbW92ZSBhIHNjaGVkdWxlZCBhaXJkcm9wIGV2ZW50LgCQVGhlIG9yaWdpbiBtdXN0IGJlIGBTY2hlZHVsZU9yaWdpbmAuALRUaGUgZXZlbnQgaWQgbXVzdCByZWZlciB0byBhIHNjaGVkdWxlZCBldmVudC4AIQFUaGUgdG90YWwgYW1vdW50IHRvIGJlIGRpc3RyaWJ1dGVkIGluIHByaXplcyB3aWxsIGJlIHJlbGVhc2VkIGZyb20gaG9sZC6wVGhlIGV2ZW50IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzY2hlZHVsZS5IcmVnaXN0ZXJfZm9yX2V2ZW50CAEgZXZlbnRfaWQ4ARxFdmVudElkAAEQZGVzdAQBMFQ6OkFjY291bnRJZAADPIBSZWdpc3RlciBmb3IgYSBwYXJ0aWN1bGFyIGV2ZW50LgA1AVRoZSBvcmlnaW4gbXVzdCBiZSB0aGUgYWxpYXMgb2YgYSBwZXJzb24gaW4gdGhlIGNvbnRleHQ6IGFpcmRyb3AgY29udGV4dCBiYXNlKQFjb25jYXRlbmF0ZWQgdG8gdGhlIGFpcmRyb3AgZXZlbnQgaWQgaW4gbGl0dGxlLWVuZGlhbiBlbmNvZGluZyBpbiA0IGJ5dGVzLthUaGUgYWlyZHJvcCBjb250ZXh0IGJhc2UgY2FuIGJlIGZvdW5kIGluIHRoZSBtZXRhZGF0YS4AEQFUaGUgZXZlbnQgaWQgbXVzdCByZWZlciB0byBhbiBhY3RpdmUgZXZlbnQgaW4gdGhlIHJlZ2lzdGVyaW5nIHBoYXNlLqRUaGUgYWxpYXMgbXVzdCBub3QgYmUgYWxyZWFkeSByZWdpc3RlcmVkLgBVAWBkZXN0YCBjYW4gYmUgYW55IGFjY291bnQsIGl0IGlzIHRoZSBkZXN0aW5hdGlvbiByZWNlaXZpbmcgdGhlIHByaXplIHdoZW4gd2lubmluZyB0aGVJAWFpcmRyb3AuIEl0IGlzIGJldHRlciB0byBzZXQgYSBkaWZmZXJlbnQgYWNjb3VudCBmb3IgZWFjaCBhaXJkcm9wIHRvIGF2b2lkIGxpbmtpbmdoaW5mb3JtYXRpb24gYWJvdXQgd2lubmVycy4AVQFXaGVuIHJlZ2lzdGVyaW5nIHRoZSBjYWxsZXIgaXMgYXNzaWduZWQgYW4gaW5kZXguIFRoaXMgaW5kZXggd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5MHRoZSB3aW5uZXJzLmxjbGFpbV9mYWlsZWRfdHJhbnNmZXJfcHJpemUEASBldmVudF9pZDgBHEV2ZW50SWQABCCUQ2xhaW0gdGhlIHByaXplIG9mIGEgZmFpbGVkIHRyYW5zZmVyLgBRAVByaXplIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zZmVyZWQsIGJ1dCBpZiB1bmV4cGVjdGVkIGV2ZW50IGhhcHBlbnMgdGhlIHRyYW5zZmVyIGNhbsRmYWlsLCB0aGlzIHRyYW5zYWN0aW9uIGFsbG93cyB0byBjbGFpbSB0aGUgcHJpemUuANxUaGUgb3JpZ2luIG11c3Qgc2lnbmVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJpemUuABEBVGhlIHNpZ25lciBtdXN0IGhhdmUgYSBmYWlsZWQgdHJhbnNmZXIgcHJpemUgZm9yIHRoZSBnaXZlbiBldmVudCBpZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQUMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldCRFdmVudEluZm8IHEFzc2V0SWQB4DBBc3NldEJhbGFuY2UBxAAMARRwcml6ZSEFAYxBaXJkcm9wUHJpemU8QXNzZXRJZCwgQXNzZXRCYWxhbmNlPgABTHJlZ2lzdHJhdGlvbl9zdGFydHM4AQx1MzIAAVRyZWdpc3RyYXRpb25fZHVyYXRpb244AQx1MzIAACEFDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQwQWlyZHJvcFByaXplCBxBc3NldElkAeAwQXNzZXRCYWxhbmNlAcQBBCBQcml6ZVNldAwBIGFzc2V0X2lk4AEcQXNzZXRJZAABMGFzc2V0X2Ftb3VudMQBMEFzc2V0QmFsYW5jZQABHHdpbm5lcnM4AQx1MzIAAAAAJQUMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBBDYWxsBARUAAEQQGZvcmNlX3NldF9jdXJzb3IEARhjdXJzb3IpBQFMT3B0aW9uPEN1cnNvck9mPFQ+PgAAFF0BQWxsb3dzIHJvb3QgdG8gc2V0IGEgY3Vyc29yIHRvIGZvcmNlZnVsbHkgc3RhcnQsIHN0b3Agb3IgZm9yd2FyZCB0aGUgbWlncmF0aW9uIHByb2Nlc3MuAEkBU2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgYW5kIGlzIG9ubHkgaW4gcGxhY2UgYXMgZW1lcmdlbmN5IG1lYXN1cmUuIE5vdGUgdGhhdAUBcmVzdGFydGluZyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaW4gdGhpcyBtYW5uZXIgd2lsbCBub3QgY2FsbCB0aGUtAVtgTWlncmF0aW9uU3RhdHVzSGFuZGxlcjo6c3RhcnRlZGBdIGhvb2sgb3IgZW1pdCBhbiBgVXBncmFkZVN0YXJ0ZWRgIGV2ZW50Llxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgwBFGluZGV4OAEMdTMyAAEwaW5uZXJfY3Vyc29yOQUBWE9wdGlvbjxSYXdDdXJzb3JPZjxUPj4AAShzdGFydGVkX2F0CQMBZE9wdGlvbjxCbG9ja051bWJlckZvcjxUPj4AARhZAUFsbG93cyByb290IHRvIHNldCBhbiBhY3RpdmUgY3Vyc29yIHRvIGZvcmNlZnVsbHkgc3RhcnQvZm9yd2FyZCB0aGUgbWlncmF0aW9uIHByb2Nlc3MuAEUBVGhpcyBpcyBhbiBlZGdlLWNhc2UgdmVyc2lvbiBvZiBbYFNlbGY6OmZvcmNlX3NldF9jdXJzb3JgXSB0aGF0IGFsbG93cyB0byBzZXQgdGhlYQFgc3RhcnRlZF9hdGAgdmFsdWUgdG8gdGhlIG5leHQgYmxvY2sgbnVtYmVyLiBPdGhlcndpc2UgdGhpcyB3b3VsZCBub3QgYmUgcG9zc2libGUsIHNpbmNlRQFgZm9yY2Vfc2V0X2N1cnNvcmAgdGFrZXMgYW4gYWJzb2x1dGUgYmxvY2sgbnVtYmVyLiBTZXR0aW5nIGBzdGFydGVkX2F0YCB0byBgTm9uZWABAWluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBwbHVzIG9uZSBzaG91bGQgYmUgdXNlZC5IZm9yY2Vfb25ib2FyZF9tYm1zAAIQoEZvcmNlcyB0aGUgb25ib2FyZGluZyBvZiB0aGUgbWlncmF0aW9ucy4AXQFUaGlzIHByb2Nlc3MgaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIGEgcnVudGltZSB1cGdyYWRlLiBJdCBpcyBpbiBwbGFjZSBhcyBhbiBlbWVyZ2VuY3n8bWVhc3VyZW1lbnQuIFRoZSBjdXJzb3IgbmVlZHMgdG8gYmUgYE5vbmVgIGZvciB0aGlzIHRvIHN1Y2NlZWQuOGNsZWFyX2hpc3RvcmljBAEgc2VsZWN0b3I9BQGgSGlzdG9yaWNDbGVhbnVwU2VsZWN0b3I8SWRlbnRpZmllck9mPFQ+PgADFGhDbGVhcnMgdGhlIGBIaXN0b3JpY2Agc2V0LgANAWBtYXBfY3Vyc29yYCBtdXN0IGJlIHNldCB0byB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyByZXR1cm5lZCBieSB0aGVdAWBIaXN0b3JpY0NsZWFyZWRgIGV2ZW50LiBUaGUgZmlyc3QgdGltZSBgTm9uZWAgY2FuIGJlIHVzZWQuIGBsaW1pdGAgbXVzdCBiZSBjaG9zZW4gaW4gYah3YXkgdGhhdCB3aWxsIHJlc3VsdCBpbiBhIHNlbnNpYmxlIHdlaWdodC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQUEGE9wdGlvbgQEVAEtBQEIEE5vbmUAAAAQU29tZQQALQUAAAEAAC0FCERwYWxsZXRfbWlncmF0aW9uczxNaWdyYXRpb25DdXJzb3IIGEN1cnNvcgExBSxCbG9ja051bWJlcgE4AQgYQWN0aXZlBAA1BQGEQWN0aXZlQ3Vyc29yPEN1cnNvciwgQmxvY2tOdW1iZXI+AAAAFFN0dWNrAAEAADEFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAANQUIRHBhbGxldF9taWdyYXRpb25zMEFjdGl2ZUN1cnNvcggYQ3Vyc29yATEFLEJsb2NrTnVtYmVyATgADAEUaW5kZXg4AQx1MzIAATBpbm5lcl9jdXJzb3I5BQE4T3B0aW9uPEN1cnNvcj4AAShzdGFydGVkX2F0OAEsQmxvY2tOdW1iZXIAADkFBBhPcHRpb24EBFQBMQUBCBBOb25lAAAAEFNvbWUEADEFAAABAAA9BQhEcGFsbGV0X21pZ3JhdGlvbnNcSGlzdG9yaWNDbGVhbnVwU2VsZWN0b3IECElkAUEFAQggU3BlY2lmaWMEAEUFARxWZWM8SWQ+AAAAIFdpbGRjYXJkCAEUbGltaXQJAwEsT3B0aW9uPHUzMj4AATxwcmV2aW91c19jdXJzb3JJBQE8T3B0aW9uPFZlYzx1OD4+AAEAAEEFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAARQUAAAJBBQBJBQQYT3B0aW9uBARUARgBCBBOb25lAAAAEFNvbWUEABgAAAEAAE0FDFxwYWxsZXRfdmVyaWZ5X3NpZ25hdHVyZSRleHRlbnNpb248VmVyaWZ5U2lnbmF0dXJlBARUAAEIGFNpZ25lZAgBJHNpZ25hdHVyZS0EATBUOjpTaWduYXR1cmUAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAAAIERpc2FibGVkAAEAAFEFDExpbmRpdl9wYWxsZXRfcGVvcGxlJGV4dGVuc2lvbiBBc1BlcnNvbgQEVAAABABVBQFcT3B0aW9uPEFzUGVyc29uSW5mbzxUPj4AAFUFBBhPcHRpb24EBFQBWQUBCBBOb25lAAAAEFNvbWUEAFkFAAABAABZBQxMaW5kaXZfcGFsbGV0X3Blb3BsZSRleHRlbnNpb24wQXNQZXJzb25JbmZvBARUAAEUaEFzUGVyc29uYWxBbGlhc1dpdGhBY2NvdW50BAA4ASBUOjpOb25jZQAAAGBBc1BlcnNvbmFsQWxpYXNXaXRoUHJvb2YMAHUDAShQcm9vZk9mPFQ+AAA4ASRSaW5nSW5kZXgAAAgBHENvbnRleHQAAQBsQXNQZXJzb25hbElkZW50aXR5V2l0aFByb29mCABhBAE4U2lnbmF0dXJlT2Y8VD4AACgBKFBlcnNvbmFsSWQAAgB0QXNQZXJzb25hbElkZW50aXR5V2l0aEFjY291bnQEADgBIFQ6Ok5vbmNlAAMAhEFzUGVyc29uYWxBbGlhc1dpdGhBY2NvdW50UmV2aXNlZBAAOAEgVDo6Tm9uY2UAAHUDAShQcm9vZk9mPFQ+AAA4ASRSaW5nSW5kZXgAAAgBHENvbnRleHQABAAAXQUMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmskZXh0ZW5zaW9uXEFzUHJvb2ZPZklua1BhcnRpY2lwYW50BARUAAAEAGEFAZhPcHRpb248QXNQcm9vZk9mSW5rUGFydGljaXBhbnRJbmZvPFQ+PgAAYQUEGE9wdGlvbgQEVAFlBQEIEE5vbmUAAAAQU29tZQQAZQUAAAEAAGUFDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rJGV4dGVuc2lvbmxBc1Byb29mT2ZJbmtQYXJ0aWNpcGFudEluZm8EBFQAAQw4QXNBcHBseVdpdGhTaWcEADgBIFQ6Ok5vbmNlAAAAKEFzUmVmZXJyZWQEADgBIFQ6Ok5vbmNlAAEAJEFzSW52aXRlZAQAOAEgVDo6Tm9uY2UAAgAAaQUMSGluZGl2X3BhbGxldF9zY29yZSRleHRlbnNpb25IU2NvcmVBc1BhcnRpY2lwYW50BARUAAAEAG0FAaBPcHRpb248U2NvcmVBc1BhcnRpY2lwYW50RGF0YTxUOjpOb25jZT4+AABtBQQYT3B0aW9uBARUAXEFAQgQTm9uZQAAABBTb21lBABxBQAAAQAAcQUMSGluZGl2X3BhbGxldF9zY29yZSRleHRlbnNpb25YU2NvcmVBc1BhcnRpY2lwYW50RGF0YQQUTm9uY2UBOAAEARRub25jZTgBFE5vbmNlAAB1BQxEaW5kaXZfcGFsbGV0X2dhbWUkZXh0ZW5zaW9uNEdhbWVBc0ludml0ZWQEBFQAAAQAeQUBcE9wdGlvbjxHYW1lQXNJbnZpdGVkRGF0YTxUPj4AAHkFBBhPcHRpb24EBFQBfQUBCBBOb25lAAAAEFNvbWUEAH0FAAABAAB9BQxEaW5kaXZfcGFsbGV0X2dhbWUkZXh0ZW5zaW9uREdhbWVBc0ludml0ZWREYXRhBARUAAAQARRub25jZTgBIFQ6Ok5vbmNlAAEcaW52aXRlcgQBMFQ6OkFjY291bnRJZAABGHRpY2tldAQBLFRpY2tldE9mPFQ+AAEkc2lnbmF0dXJlLQQBSFQ6OlRpY2tldFNpZ25hdHVyZQAAgQUMYGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZSRleHRlbnNpb244UGVvcGxlTGl0ZUF1dGgEBFQAAAQAhQUBfE9wdGlvbjxQZW9wbGVMaXRlQXV0aERhdGFPZjxUPj4AAIUFBBhPcHRpb24EBFQBiQUBCBBOb25lAAAAEFNvbWUEAIkFAAABAACJBQxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlJGV4dGVuc2lvbkhQZW9wbGVMaXRlQXV0aERhdGEEFE5vbmNlATgBBDBBc0xpdGVQZXJzb24EARRub25jZTgBFE5vbmNlAAAAAI0FDFBpbmRpdl9wYWxsZXRfY29pbmFnZSRleHRlbnNpb24kQXNDb2luYWdlBARUAAAEAJEFAWBPcHRpb248QXNDb2luYWdlSW5mbzxUPj4AAJEFBBhPcHRpb24EBFQBlQUBCBBOb25lAAAAEFNvbWUEAJUFAAABAACVBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UkZXh0ZW5zaW9uNEFzQ29pbmFnZUluZm8EBFQAARQYQXNDb2luAAAATEFzVW5sb2FkVG9rZW5QZW9wbGUQARRwcm9vZpkFAaA8VDo6UGVvcGxlUHJvb2YgYXMgVmFsaWRhdGVQcm9vZj46OlByb29mAAEYcGVyaW9kOAEYUGVyaW9kAAEcY291bnRlcjgBDHUzMgABMGFsaWFzX3Byb29mc3EDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEAXEFzVW5sb2FkVG9rZW5MaXRlUGVvcGxlEAEUcHJvb2adBQGwPFQ6OkxpdGVQZW9wbGVQcm9vZiBhcyBWYWxpZGF0ZVByb29mPjo6UHJvb2YAARhwZXJpb2Q4ARhQZXJpb2QAARxjb3VudGVyOAEMdTMyAAEwYWxpYXNfcHJvb2ZzcQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAgBEQXNVbmxvYWRUb2tlblBhaWQUARRwcm9vZnUDAShQcm9vZk9mPFQ+AAEYcGVyaW9kOAEYUGVyaW9kAAFUcGFpZF90b2tlbl9yaW5nX2luZGV4OAEMdTMyAAFgcGFpZF90b2tlbl9yaW5nX3JldmlzaW9uOAEMdTMyAAEwYWxpYXNfcHJvb2ZzcQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAwBcQXNVbmxvYWRUb2tlbkZyb21PdXRwdXQQAUhmZWVfcmVjeWNsZXJfdmFsdWVtAwEkQ29pblZhbHVlAAFIZmVlX3JlY3ljbGVyX2luZGV4OAEkUmluZ0luZGV4AAFUZmVlX3JlY3ljbGVyX3JldmlzaW9uOAE0UmV2aXNpb25JbmRleAABMGFsaWFzX3Byb29mc3EDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAQAAJkFDGRuZXh0X3Blb3BsZV9wYXNlb19ydW50aW1lGHBlb3BsZSxQZW9wbGVQcm9vZgAACAEUcHJvb2Z1AwHgPEJhbmRlcnNuYXRjaFZyZlZlcmlmaWFibGUgYXMgR2VuZXJhdGVWZXJpZmlhYmxlPjo6UHJvb2YAARByaW5nOAEkUmluZ0luZGV4AACdBQxkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZRhwZW9wbGVYTGl0ZVBlb3BsZVByb29mTm90QW5vbgAACAEkc2lnbmF0dXJlLQQBOE11bHRpU2lnbmF0dXJlAAEcYWNjb3VudAQBJEFjY291bnRJZAAAoQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zOGF1dGhvcml6ZV9jYWxsNEF1dGhvcml6ZUNhbGwEBFQAAAAApQUIfGluZGl2X3BhbGxldF9vcmlnaW5fcmVzdHJpY3Rpb244UmVzdHJpY3RPcmlnaW4EBFQAAAQAyAEQYm9vbAAAqQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zVGNoZWNrX25vbl96ZXJvX3NlbmRlckhDaGVja05vblplcm9TZW5kZXIEBFQAAAAArQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zSGNoZWNrX3NwZWNfdmVyc2lvbkBDaGVja1NwZWNWZXJzaW9uBARUAAAAALEFEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0BjaGVja190eF92ZXJzaW9uOENoZWNrVHhWZXJzaW9uBARUAAAAALUFEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczRjaGVja19nZW5lc2lzMENoZWNrR2VuZXNpcwQEVAAAAAC5BRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM8Y2hlY2tfbW9ydGFsaXR5OENoZWNrTW9ydGFsaXR5BARUAAAEAL0FAQxFcmEAAL0FEChzcF9ydW50aW1lHGdlbmVyaWMMZXJhDEVyYQABAQQgSW1tb3J0YWwAAAAcTW9ydGFsMQQADAAAAQAcTW9ydGFsMgQADAAAAgAcTW9ydGFsMwQADAAAAwAcTW9ydGFsNAQADAAABAAcTW9ydGFsNQQADAAABQAcTW9ydGFsNgQADAAABgAcTW9ydGFsNwQADAAABwAcTW9ydGFsOAQADAAACAAcTW9ydGFsOQQADAAACQAgTW9ydGFsMTAEAAwAAAoAIE1vcnRhbDExBAAMAAALACBNb3J0YWwxMgQADAAADAAgTW9ydGFsMTMEAAwAAA0AIE1vcnRhbDE0BAAMAAAOACBNb3J0YWwxNQQADAAADwAgTW9ydGFsMTYEAAwAABAAIE1vcnRhbDE3BAAMAAARACBNb3J0YWwxOAQADAAAEgAgTW9ydGFsMTkEAAwAABMAIE1vcnRhbDIwBAAMAAAUACBNb3J0YWwyMQQADAAAFQAgTW9ydGFsMjIEAAwAABYAIE1vcnRhbDIzBAAMAAAXACBNb3J0YWwyNAQADAAAGAAgTW9ydGFsMjUEAAwAABkAIE1vcnRhbDI2BAAMAAAaACBNb3J0YWwyNwQADAAAGwAgTW9ydGFsMjgEAAwAABwAIE1vcnRhbDI5BAAMAAAdACBNb3J0YWwzMAQADAAAHgAgTW9ydGFsMzEEAAwAAB8AIE1vcnRhbDMyBAAMAAAgACBNb3J0YWwzMwQADAAAIQAgTW9ydGFsMzQEAAwAACIAIE1vcnRhbDM1BAAMAAAjACBNb3J0YWwzNgQADAAAJAAgTW9ydGFsMzcEAAwAACUAIE1vcnRhbDM4BAAMAAAmACBNb3J0YWwzOQQADAAAJwAgTW9ydGFsNDAEAAwAACgAIE1vcnRhbDQxBAAMAAApACBNb3J0YWw0MgQADAAAKgAgTW9ydGFsNDMEAAwAACsAIE1vcnRhbDQ0BAAMAAAsACBNb3J0YWw0NQQADAAALQAgTW9ydGFsNDYEAAwAAC4AIE1vcnRhbDQ3BAAMAAAvACBNb3J0YWw0OAQADAAAMAAgTW9ydGFsNDkEAAwAADEAIE1vcnRhbDUwBAAMAAAyACBNb3J0YWw1MQQADAAAMwAgTW9ydGFsNTIEAAwAADQAIE1vcnRhbDUzBAAMAAA1ACBNb3J0YWw1NAQADAAANgAgTW9ydGFsNTUEAAwAADcAIE1vcnRhbDU2BAAMAAA4ACBNb3J0YWw1NwQADAAAOQAgTW9ydGFsNTgEAAwAADoAIE1vcnRhbDU5BAAMAAA7ACBNb3J0YWw2MAQADAAAPAAgTW9ydGFsNjEEAAwAAD0AIE1vcnRhbDYyBAAMAAA+ACBNb3J0YWw2MwQADAAAPwAgTW9ydGFsNjQEAAwAAEAAIE1vcnRhbDY1BAAMAABBACBNb3J0YWw2NgQADAAAQgAgTW9ydGFsNjcEAAwAAEMAIE1vcnRhbDY4BAAMAABEACBNb3J0YWw2OQQADAAARQAgTW9ydGFsNzAEAAwAAEYAIE1vcnRhbDcxBAAMAABHACBNb3J0YWw3MgQADAAASAAgTW9ydGFsNzMEAAwAAEkAIE1vcnRhbDc0BAAMAABKACBNb3J0YWw3NQQADAAASwAgTW9ydGFsNzYEAAwAAEwAIE1vcnRhbDc3BAAMAABNACBNb3J0YWw3OAQADAAATgAgTW9ydGFsNzkEAAwAAE8AIE1vcnRhbDgwBAAMAABQACBNb3J0YWw4MQQADAAAUQAgTW9ydGFsODIEAAwAAFIAIE1vcnRhbDgzBAAMAABTACBNb3J0YWw4NAQADAAAVAAgTW9ydGFsODUEAAwAAFUAIE1vcnRhbDg2BAAMAABWACBNb3J0YWw4NwQADAAAVwAgTW9ydGFsODgEAAwAAFgAIE1vcnRhbDg5BAAMAABZACBNb3J0YWw5MAQADAAAWgAgTW9ydGFsOTEEAAwAAFsAIE1vcnRhbDkyBAAMAABcACBNb3J0YWw5MwQADAAAXQAgTW9ydGFsOTQEAAwAAF4AIE1vcnRhbDk1BAAMAABfACBNb3J0YWw5NgQADAAAYAAgTW9ydGFsOTcEAAwAAGEAIE1vcnRhbDk4BAAMAABiACBNb3J0YWw5OQQADAAAYwAkTW9ydGFsMTAwBAAMAABkACRNb3J0YWwxMDEEAAwAAGUAJE1vcnRhbDEwMgQADAAAZgAkTW9ydGFsMTAzBAAMAABnACRNb3J0YWwxMDQEAAwAAGgAJE1vcnRhbDEwNQQADAAAaQAkTW9ydGFsMTA2BAAMAABqACRNb3J0YWwxMDcEAAwAAGsAJE1vcnRhbDEwOAQADAAAbAAkTW9ydGFsMTA5BAAMAABtACRNb3J0YWwxMTAEAAwAAG4AJE1vcnRhbDExMQQADAAAbwAkTW9ydGFsMTEyBAAMAABwACRNb3J0YWwxMTMEAAwAAHEAJE1vcnRhbDExNAQADAAAcgAkTW9ydGFsMTE1BAAMAABzACRNb3J0YWwxMTYEAAwAAHQAJE1vcnRhbDExNwQADAAAdQAkTW9ydGFsMTE4BAAMAAB2ACRNb3J0YWwxMTkEAAwAAHcAJE1vcnRhbDEyMAQADAAAeAAkTW9ydGFsMTIxBAAMAAB5ACRNb3J0YWwxMjIEAAwAAHoAJE1vcnRhbDEyMwQADAAAewAkTW9ydGFsMTI0BAAMAAB8ACRNb3J0YWwxMjUEAAwAAH0AJE1vcnRhbDEyNgQADAAAfgAkTW9ydGFsMTI3BAAMAAB/ACRNb3J0YWwxMjgEAAwAAIAAJE1vcnRhbDEyOQQADAAAgQAkTW9ydGFsMTMwBAAMAACCACRNb3J0YWwxMzEEAAwAAIMAJE1vcnRhbDEzMgQADAAAhAAkTW9ydGFsMTMzBAAMAACFACRNb3J0YWwxMzQEAAwAAIYAJE1vcnRhbDEzNQQADAAAhwAkTW9ydGFsMTM2BAAMAACIACRNb3J0YWwxMzcEAAwAAIkAJE1vcnRhbDEzOAQADAAAigAkTW9ydGFsMTM5BAAMAACLACRNb3J0YWwxNDAEAAwAAIwAJE1vcnRhbDE0MQQADAAAjQAkTW9ydGFsMTQyBAAMAACOACRNb3J0YWwxNDMEAAwAAI8AJE1vcnRhbDE0NAQADAAAkAAkTW9ydGFsMTQ1BAAMAACRACRNb3J0YWwxNDYEAAwAAJIAJE1vcnRhbDE0NwQADAAAkwAkTW9ydGFsMTQ4BAAMAACUACRNb3J0YWwxNDkEAAwAAJUAJE1vcnRhbDE1MAQADAAAlgAkTW9ydGFsMTUxBAAMAACXACRNb3J0YWwxNTIEAAwAAJgAJE1vcnRhbDE1MwQADAAAmQAkTW9ydGFsMTU0BAAMAACaACRNb3J0YWwxNTUEAAwAAJsAJE1vcnRhbDE1NgQADAAAnAAkTW9ydGFsMTU3BAAMAACdACRNb3J0YWwxNTgEAAwAAJ4AJE1vcnRhbDE1OQQADAAAnwAkTW9ydGFsMTYwBAAMAACgACRNb3J0YWwxNjEEAAwAAKEAJE1vcnRhbDE2MgQADAAAogAkTW9ydGFsMTYzBAAMAACjACRNb3J0YWwxNjQEAAwAAKQAJE1vcnRhbDE2NQQADAAApQAkTW9ydGFsMTY2BAAMAACmACRNb3J0YWwxNjcEAAwAAKcAJE1vcnRhbDE2OAQADAAAqAAkTW9ydGFsMTY5BAAMAACpACRNb3J0YWwxNzAEAAwAAKoAJE1vcnRhbDE3MQQADAAAqwAkTW9ydGFsMTcyBAAMAACsACRNb3J0YWwxNzMEAAwAAK0AJE1vcnRhbDE3NAQADAAArgAkTW9ydGFsMTc1BAAMAACvACRNb3J0YWwxNzYEAAwAALAAJE1vcnRhbDE3NwQADAAAsQAkTW9ydGFsMTc4BAAMAACyACRNb3J0YWwxNzkEAAwAALMAJE1vcnRhbDE4MAQADAAAtAAkTW9ydGFsMTgxBAAMAAC1ACRNb3J0YWwxODIEAAwAALYAJE1vcnRhbDE4MwQADAAAtwAkTW9ydGFsMTg0BAAMAAC4ACRNb3J0YWwxODUEAAwAALkAJE1vcnRhbDE4NgQADAAAugAkTW9ydGFsMTg3BAAMAAC7ACRNb3J0YWwxODgEAAwAALwAJE1vcnRhbDE4OQQADAAAvQAkTW9ydGFsMTkwBAAMAAC+ACRNb3J0YWwxOTEEAAwAAL8AJE1vcnRhbDE5MgQADAAAwAAkTW9ydGFsMTkzBAAMAADBACRNb3J0YWwxOTQEAAwAAMIAJE1vcnRhbDE5NQQADAAAwwAkTW9ydGFsMTk2BAAMAADEACRNb3J0YWwxOTcEAAwAAMUAJE1vcnRhbDE5OAQADAAAxgAkTW9ydGFsMTk5BAAMAADHACRNb3J0YWwyMDAEAAwAAMgAJE1vcnRhbDIwMQQADAAAyQAkTW9ydGFsMjAyBAAMAADKACRNb3J0YWwyMDMEAAwAAMsAJE1vcnRhbDIwNAQADAAAzAAkTW9ydGFsMjA1BAAMAADNACRNb3J0YWwyMDYEAAwAAM4AJE1vcnRhbDIwNwQADAAAzwAkTW9ydGFsMjA4BAAMAADQACRNb3J0YWwyMDkEAAwAANEAJE1vcnRhbDIxMAQADAAA0gAkTW9ydGFsMjExBAAMAADTACRNb3J0YWwyMTIEAAwAANQAJE1vcnRhbDIxMwQADAAA1QAkTW9ydGFsMjE0BAAMAADWACRNb3J0YWwyMTUEAAwAANcAJE1vcnRhbDIxNgQADAAA2AAkTW9ydGFsMjE3BAAMAADZACRNb3J0YWwyMTgEAAwAANoAJE1vcnRhbDIxOQQADAAA2wAkTW9ydGFsMjIwBAAMAADcACRNb3J0YWwyMjEEAAwAAN0AJE1vcnRhbDIyMgQADAAA3gAkTW9ydGFsMjIzBAAMAADfACRNb3J0YWwyMjQEAAwAAOAAJE1vcnRhbDIyNQQADAAA4QAkTW9ydGFsMjI2BAAMAADiACRNb3J0YWwyMjcEAAwAAOMAJE1vcnRhbDIyOAQADAAA5AAkTW9ydGFsMjI5BAAMAADlACRNb3J0YWwyMzAEAAwAAOYAJE1vcnRhbDIzMQQADAAA5wAkTW9ydGFsMjMyBAAMAADoACRNb3J0YWwyMzMEAAwAAOkAJE1vcnRhbDIzNAQADAAA6gAkTW9ydGFsMjM1BAAMAADrACRNb3J0YWwyMzYEAAwAAOwAJE1vcnRhbDIzNwQADAAA7QAkTW9ydGFsMjM4BAAMAADuACRNb3J0YWwyMzkEAAwAAO8AJE1vcnRhbDI0MAQADAAA8AAkTW9ydGFsMjQxBAAMAADxACRNb3J0YWwyNDIEAAwAAPIAJE1vcnRhbDI0MwQADAAA8wAkTW9ydGFsMjQ0BAAMAAD0ACRNb3J0YWwyNDUEAAwAAPUAJE1vcnRhbDI0NgQADAAA9gAkTW9ydGFsMjQ3BAAMAAD3ACRNb3J0YWwyNDgEAAwAAPgAJE1vcnRhbDI0OQQADAAA+QAkTW9ydGFsMjUwBAAMAAD6ACRNb3J0YWwyNTEEAAwAAPsAJE1vcnRhbDI1MgQADAAA/AAkTW9ydGFsMjUzBAAMAAD9ACRNb3J0YWwyNTQEAAwAAP4AJE1vcnRhbDI1NQQADAAA/wAAwQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zLGNoZWNrX25vbmNlKENoZWNrTm9uY2UEBFQAAAQAYAEgVDo6Tm9uY2UAAMUFEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczBjaGVja193ZWlnaHQsQ2hlY2tXZWlnaHQEBFQAAAAAyQUIXHBhbGxldF9hc3NldF90eF9wYXltZW50UENoYXJnZUFzc2V0VHhQYXltZW50BARUAAAIAQx0aXDAATBCYWxhbmNlT2Y8VD4AASBhc3NldF9pZKECAWhPcHRpb248Q2hhcmdlQXNzZXRJZE9mPFQ+PgAAzQUIMGZyYW1lX3N5c3RlbSxBY2NvdW50SW5mbwgUTm9uY2UBOCxBY2NvdW50RGF0YQHRBQAUARRub25jZTgBFE5vbmNlAAEkY29uc3VtZXJzOAEgUmVmQ291bnQAASRwcm92aWRlcnM4ASBSZWZDb3VudAABLHN1ZmZpY2llbnRzOAEgUmVmQ291bnQAARBkYXRh0QUBLEFjY291bnREYXRhAADRBQw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLEFjY291bnREYXRhBBxCYWxhbmNlAcQAEAEQZnJlZcQBHEJhbGFuY2UAASByZXNlcnZlZMQBHEJhbGFuY2UAARhmcm96ZW7EARxCYWxhbmNlAAEUZmxhZ3PVBQEoRXh0cmFGbGFncwAA1QUMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEAMQBEHUxMjgAANkFDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQB1QEADAEYbm9ybWFs1QEBBFQAASxvcGVyYXRpb25hbNUBAQRUAAEkbWFuZGF0b3J51QEBBFQAAN0FAAAC4QUA4QUIMGZyYW1lX3N5c3RlbSxFdmVudFJlY29yZAgERQHlBQRUATwADAEUcGhhc2XpBgEUUGhhc2UAARRldmVudOUFAQRFAAEYdG9waWNz7QYBGFZlYzxUPgAA5QUIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUwUnVudGltZUV2ZW50AAGQGFN5c3RlbQQA6QUBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAA8UGFyYWNoYWluU3lzdGVtBAARBgG8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAQAgQmFsYW5jZXMEABkGAXxwYWxsZXRfYmFsYW5jZXM6OkV2ZW50PFJ1bnRpbWU+AAoASFRyYW5zYWN0aW9uUGF5bWVudAQASQYBqHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50OjpFdmVudDxSdW50aW1lPgALAEhTa2lwRmVlbGVzc1BheW1lbnQEAE0GAaxwYWxsZXRfc2tpcF9mZWVsZXNzX3BheW1lbnQ6OkV2ZW50PFJ1bnRpbWU+AAwARE9yaWdpblJlc3RyaWN0aW9uBABRBgG8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbjo6RXZlbnQ8UnVudGltZT4ADQAYQXNzZXRzBABVBgF0cGFsbGV0X2Fzc2V0czo6RXZlbnQ8UnVudGltZT4ADgAwQXNzZXRzSG9sZGVyBABZBgGQcGFsbGV0X2Fzc2V0c19ob2xkZXI6OkV2ZW50PFJ1bnRpbWU+AA8AJEFzc2V0UmF0ZQQAXQYBhHBhbGxldF9hc3NldF9yYXRlOjpFdmVudDxSdW50aW1lPgAQADhBc3NldFR4UGF5bWVudAQAYQYBnHBhbGxldF9hc3NldF90eF9wYXltZW50OjpFdmVudDxSdW50aW1lPgARAERDb2xsYXRvclNlbGVjdGlvbgQAZQYBpHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb246OkV2ZW50PFJ1bnRpbWU+ABUAHFNlc3Npb24EAGkGAXhwYWxsZXRfc2Vzc2lvbjo6RXZlbnQ8UnVudGltZT4AFgAkWGNtcFF1ZXVlBABtBgGkY3VtdWx1c19wYWxsZXRfeGNtcF9xdWV1ZTo6RXZlbnQ8UnVudGltZT4AHgAsUG9sa2Fkb3RYY20EAHEGAWhwYWxsZXRfeGNtOjpFdmVudDxSdW50aW1lPgAfAChDdW11bHVzWGNtBACBBgGIY3VtdWx1c19wYWxsZXRfeGNtOjpFdmVudDxSdW50aW1lPgAgADBNZXNzYWdlUXVldWUEAIUGAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXZlbnQ8UnVudGltZT4AIgAcVXRpbGl0eQQAjQYBVHBhbGxldF91dGlsaXR5OjpFdmVudAAoACBNdWx0aXNpZwQAlQYBfHBhbGxldF9tdWx0aXNpZzo6RXZlbnQ8UnVudGltZT4AKQAQU3VkbwQAmQYBbHBhbGxldF9zdWRvOjpFdmVudDxSdW50aW1lPgAqABRQcm94eQQAnQYBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4ALAAgSWRlbnRpdHkEAKUGAZRpbmRpdl9wYWxsZXRfaWRlbnRpdHk6OkV2ZW50PFJ1bnRpbWU+ADIAGFBlb3BsZQQAqQYBjGluZGl2X3BhbGxldF9wZW9wbGU6OkV2ZW50PFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAK0GAZRpbmRpdl9wYWxsZXRfbW9iX3J1bGU6OkV2ZW50PFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEALEGAaRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rOjpFdmVudDxSdW50aW1lPgA1ABBHYW1lBAC1BgGEaW5kaXZfcGFsbGV0X2dhbWU6OkV2ZW50PFJ1bnRpbWU+ADcAFFNjb3JlBAC9BgGIaW5kaXZfcGFsbGV0X3Njb3JlOjpFdmVudDxSdW50aW1lPgA4ACBEdW1teURpbQQAwQYBmGluZGl2X3BhbGxldF9kdW1teV9kaW06OkV2ZW50PFJ1bnRpbWU+ADsAKFBlb3BsZUxpdGUEAMUGAaBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGU6OkV2ZW50PFJ1bnRpbWU+AD4AJFJlc291cmNlcwQAyQYBmGluZGl2X3BhbGxldF9yZXNvdXJjZXM6OkV2ZW50PFJ1bnRpbWU+AD8ANENodW5rc01hbmFnZXIEAM0GAaxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXI6OkV2ZW50PFJ1bnRpbWU+AEAAHE1lbWJlcnMEANEGAZBpbmRpdl9wYWxsZXRfbWVtYmVyczo6RXZlbnQ8UnVudGltZT4AQwAcQ29pbmFnZQQA1QYBkGluZGl2X3BhbGxldF9jb2luYWdlOjpFdmVudDxSdW50aW1lPgBEAFRTdG9yYWdlSW5pdGlhbGl6YXRpb24EANkGAcxpbmRpdl9wYWxsZXRfc3RvcmFnZV9pbml0aWFsaXphdGlvbjo6RXZlbnQ8UnVudGltZT4APABkU3RvcmFnZUluaXRpYWxpemF0aW9uTGl0ZQQA3QYB4GluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGU6OkV2ZW50PFJ1bnRpbWU+AEEAHEFpcmRyb3AEAOEGAZBpbmRpdl9wYWxsZXRfYWlyZHJvcDo6RXZlbnQ8UnVudGltZT4APQBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEAOUGAYRwYWxsZXRfbWlncmF0aW9uczo6RXZlbnQ8UnVudGltZT4AYgAA6QUMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXZlbnQEBFQAASBARXh0cmluc2ljU3VjY2VzcwQBNGRpc3BhdGNoX2luZm/tBQFERGlzcGF0Y2hFdmVudEluZm8AAASQQW4gZXh0cmluc2ljIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuPEV4dHJpbnNpY0ZhaWxlZAgBOGRpc3BhdGNoX2Vycm9y+QUBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZv7QUBRERpc3BhdGNoRXZlbnRJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIEATBUOjpBY2NvdW50SWQAARBoYXNoPAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoPAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb27IARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQugFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlCAEkY29kZV9oYXNoPAEcVDo6SGFzaAABFGVycm9y+QUBNERpc3BhdGNoRXJyb3IABwQRAUFuIGludmFsaWQgYXV0aG9yaXplZCB1cGdyYWRlIHdhcyByZWplY3RlZCB3aGlsZSB0cnlpbmcgdG8gYXBwbHkgaXQuBHBFdmVudCBmb3IgdGhlIFN5c3RlbSBwYWxsZXQu7QUIMGZyYW1lX3N5c3RlbUREaXNwYXRjaEV2ZW50SW5mbwAADAEYd2VpZ2h01QEBGFdlaWdodAABFGNsYXNz8QUBNERpc3BhdGNoQ2xhc3MAASBwYXlzX2ZlZfUFARBQYXlzAADxBQw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAA9QUMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gQUGF5cwABCAxZZXMAAAAITm8AAQAA+QUIKHNwX3J1bnRpbWU0RGlzcGF0Y2hFcnJvcgABPBRPdGhlcgAAADBDYW5ub3RMb29rdXAAAQAkQmFkT3JpZ2luAAIAGE1vZHVsZQQA/QUBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAAEGAShUb2tlbkVycm9yAAcAKEFyaXRobWV0aWMEAAUGATxBcml0aG1ldGljRXJyb3IACAA0VHJhbnNhY3Rpb25hbAQACQYBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANABBUcmllBAANBgEkVHJpZUVycm9yAA4AAP0FCChzcF9ydW50aW1lLE1vZHVsZUVycm9yAAAIARRpbmRleAwBCHU4AAEUZXJyb3JwAYxbdTg7IE1BWF9NT0RVTEVfRVJST1JfRU5DT0RFRF9TSVpFXQAAAQYIKHNwX3J1bnRpbWUoVG9rZW5FcnJvcgABKEBGdW5kc1VuYXZhaWxhYmxlAAAAME9ubHlQcm92aWRlcgABADBCZWxvd01pbmltdW0AAgAwQ2Fubm90Q3JlYXRlAAMAMFVua25vd25Bc3NldAAEABhGcm96ZW4ABQAsVW5zdXBwb3J0ZWQABgBAQ2Fubm90Q3JlYXRlSG9sZAAHADROb3RFeHBlbmRhYmxlAAgAHEJsb2NrZWQACQAABQYINHNwX2FyaXRobWV0aWM8QXJpdGhtZXRpY0Vycm9yAAEMJFVuZGVyZmxvdwAAACBPdmVyZmxvdwABADhEaXZpc2lvbkJ5WmVybwACAAAJBggoc3BfcnVudGltZUhUcmFuc2FjdGlvbmFsRXJyb3IAAQgwTGltaXRSZWFjaGVkAAAAHE5vTGF5ZXIAAQAADQYMKHNwX3J1bnRpbWUwcHJvdmluZ190cmllJFRyaWVFcnJvcgABOEBJbnZhbGlkU3RhdGVSb290AAAASEluY29tcGxldGVEYXRhYmFzZQABAFBWYWx1ZUF0SW5jb21wbGV0ZUtleQACADBEZWNvZGVyRXJyb3IAAwAsSW52YWxpZEhhc2gABAAwRHVwbGljYXRlS2V5AAUAOEV4dHJhbmVvdXNOb2RlAAYAPEV4dHJhbmVvdXNWYWx1ZQAHAFxFeHRyYW5lb3VzSGFzaFJlZmVyZW5jZQAIAFRJbnZhbGlkQ2hpbGRSZWZlcmVuY2UACQA0VmFsdWVNaXNtYXRjaAAKADxJbmNvbXBsZXRlUHJvb2YACwAwUm9vdE1pc21hdGNoAAwALERlY29kZUVycm9yAA0AABEGDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtGHBhbGxldBRFdmVudAQEVAABGGBWYWxpZGF0aW9uRnVuY3Rpb25TdG9yZWQAAATQVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gaGFzIGJlZW4gc2NoZWR1bGVkIHRvIGFwcGx5LmRWYWxpZGF0aW9uRnVuY3Rpb25BcHBsaWVkBAFUcmVsYXlfY2hhaW5fYmxvY2tfbnVtOAFUUmVsYXlDaGFpbkJsb2NrTnVtYmVyAAEERQFUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiB3YXMgYXBwbGllZCBhcyBvZiB0aGUgY29udGFpbmVkIHJlbGF5IGNoYWluIGJsb2NrIG51bWJlci5sVmFsaWRhdGlvbkZ1bmN0aW9uRGlzY2FyZGVkAAIEsFRoZSByZWxheS1jaGFpbiBhYm9ydGVkIHRoZSB1cGdyYWRlIHByb2Nlc3MuYERvd253YXJkTWVzc2FnZXNSZWNlaXZlZAQBFGNvdW50OAEMdTMyAAMEAQFTb21lIGRvd253YXJkIG1lc3NhZ2VzIGhhdmUgYmVlbiByZWNlaXZlZCBhbmQgd2lsbCBiZSBwcm9jZXNzZWQuZERvd253YXJkTWVzc2FnZXNQcm9jZXNzZWQIASx3ZWlnaHRfdXNlZNUBARhXZWlnaHQAASBkbXFfaGVhZDwBRHJlbGF5X2NoYWluOjpIYXNoAAQE4ERvd253YXJkIG1lc3NhZ2VzIHdlcmUgcHJvY2Vzc2VkIHVzaW5nIHRoZSBnaXZlbiB3ZWlnaHQuRFVwd2FyZE1lc3NhZ2VTZW50BAEwbWVzc2FnZV9oYXNoFQYBPE9wdGlvbjxYY21IYXNoPgAFBLhBbiB1cHdhcmQgbWVzc2FnZSB3YXMgc2VudCB0byB0aGUgcmVsYXkgY2hhaW4uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQYEGE9wdGlvbgQEVAEIAQgQTm9uZQAAABBTb21lBAAIAAABAAAZBgw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABeBxFbmRvd2VkCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZcQBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20EATBUOjpBY2NvdW50SWQAAQh0bwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEQZnJlZcQBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQQBMFQ6OkFjY291bnRJZAABCHRvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1cx0GARhTdGF0dXMABghNAVNvbWUgYmFsYW5jZSB3YXMgbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZSBvZiB0aGUgZmlyc3QgYWNjb3VudCB0byB0aGUgc2Vjb25kIGFjY291bnQu2EZpbmFsIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gYmFsYW5jZSB0eXBlLhxEZXBvc2l0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAHBNhTb21lIGFtb3VudCB3YXMgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4gV2l0aGRyYXcIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAgEHQFTb21lIGFtb3VudCB3YXMgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLhxTbGFzaGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAJBAEBU29tZSBhbW91bnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgbWlzYmVoYXZpb3IpLhhNaW50ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAoEnFNvbWUgYW1vdW50IHdhcyBtaW50ZWQgaW50byBhbiBhY2NvdW50LjBNaW50ZWRDcmVkaXQEARhhbW91bnTEAShUOjpCYWxhbmNlAAsE4FNvbWUgY3JlZGl0IHdhcyBiYWxhbmNlZCBhbmQgYWRkZWQgdG8gdGhlIFRvdGFsSXNzdWFuY2UuGEJ1cm5lZAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UADAScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuKEJ1cm5lZERlYnQEARhhbW91bnTEAShUOjpCYWxhbmNlAA0EzFNvbWUgZGVidCBoYXMgYmVlbiBkcm9wcGVkIGZyb20gdGhlIFRvdGFsIElzc3VhbmNlLiRTdXNwZW5kZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAA4EFQFTb21lIGFtb3VudCB3YXMgc3VzcGVuZGVkIGZyb20gYW4gYWNjb3VudCAoaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyKS4gUmVzdG9yZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAA8EpFNvbWUgYW1vdW50IHdhcyByZXN0b3JlZCBpbnRvIGFuIGFjY291bnQuIFVwZ3JhZGVkBAEMd2hvBAEwVDo6QWNjb3VudElkABAEYEFuIGFjY291bnQgd2FzIHVwZ3JhZGVkLhhJc3N1ZWQEARhhbW91bnTEAShUOjpCYWxhbmNlABEELQFUb3RhbCBpc3N1YW5jZSB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGNyZWRpdCB0byBiZSBiYWxhbmNlZC4kUmVzY2luZGVkBAEYYW1vdW50xAEoVDo6QmFsYW5jZQASBCUBVG90YWwgaXNzdWFuY2Ugd2FzIGRlY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBkZWJ0IHRvIGJlIGJhbGFuY2VkLhhMb2NrZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgbG9ja2VkLiBVbmxvY2tlZAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAFARoU29tZSBiYWxhbmNlIHdhcyB1bmxvY2tlZC4YRnJvemVuCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAVBGBTb21lIGJhbGFuY2Ugd2FzIGZyb3plbi4YVGhhd2VkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAWBGBTb21lIGJhbGFuY2Ugd2FzIHRoYXdlZC5MVG90YWxJc3N1YW5jZUZvcmNlZAgBDG9sZMQBKFQ6OkJhbGFuY2UAAQxuZXfEAShUOjpCYWxhbmNlABcErFRoZSBgVG90YWxJc3N1YW5jZWAgd2FzIGZvcmNlZnVsbHkgY2hhbmdlZC4QSGVsZAwBGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAGASAU29tZSBiYWxhbmNlIHdhcyBwbGFjZWQgb24gaG9sZC4oQnVybmVkSGVsZAwBGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAGQSgSGVsZCBiYWxhbmNlIHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LjhUcmFuc2Zlck9uSG9sZBABGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGHNvdXJjZQQBMFQ6OkFjY291bnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABoEFQFBIHRyYW5zZmVyIG9mIGBhbW91bnRgIG9uIGhvbGQgZnJvbSBgc291cmNlYCB0byBgZGVzdGAgd2FzIGluaXRpYXRlZC48VHJhbnNmZXJBbmRIb2xkEAEYcmVhc29uIQYBUFQ6OlJ1bnRpbWVIb2xkUmVhc29uAAEYc291cmNlBAEwVDo6QWNjb3VudElkAAEQZGVzdAQBMFQ6OkFjY291bnRJZAABLHRyYW5zZmVycmVkxAEoVDo6QmFsYW5jZQAbBAkBVGhlIGB0cmFuc2ZlcnJlZGAgYmFsYW5jZSBpcyBwbGFjZWQgb24gaG9sZCBhdCB0aGUgYGRlc3RgIGFjY291bnQuIFJlbGVhc2VkDAEYcmVhc29uIQYBUFQ6OlJ1bnRpbWVIb2xkUmVhc29uAAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAcBJBTb21lIGJhbGFuY2Ugd2FzIHJlbGVhc2VkIGZyb20gaG9sZC4oVW5leHBlY3RlZAQARQYBOFVuZXhwZWN0ZWRLaW5kAB0EsEFuIHVuZXhwZWN0ZWQvZGVmZW5zaXZlIGV2ZW50IHdhcyB0cmlnZ2VyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0HQYUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjNEJhbGFuY2VTdGF0dXMAAQgQRnJlZQAAACBSZXNlcnZlZAABAAAhBghkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABIBxTZXNzaW9uBAAlBgFocGFsbGV0X3Nlc3Npb246OkhvbGRSZWFzb24AFgAsUG9sa2Fkb3RYY20EACkGAVhwYWxsZXRfeGNtOjpIb2xkUmVhc29uAB8AHE1vYlJ1bGUEAC0GAYRpbmRpdl9wYWxsZXRfbW9iX3J1bGU6OkhvbGRSZWFzb24ANAAoUHJvb2ZPZkluawQAMQYBlGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbms6OkhvbGRSZWFzb24ANQAQR2FtZQQANQYBdGluZGl2X3BhbGxldF9nYW1lOjpIb2xkUmVhc29uADcAFFNjb3JlBAA5BgF4aW5kaXZfcGFsbGV0X3Njb3JlOjpIb2xkUmVhc29uADgAHENvaW5hZ2UEAD0GAYBpbmRpdl9wYWxsZXRfY29pbmFnZTo6SG9sZFJlYXNvbgBEABxBaXJkcm9wBABBBgGAaW5kaXZfcGFsbGV0X2FpcmRyb3A6OkhvbGRSZWFzb24APQAAJQYMOHBhbGxldF9zZXNzaW9uGHBhbGxldChIb2xkUmVhc29uAAEEEEtleXMAAAAAKQYMKHBhbGxldF94Y20YcGFsbGV0KEhvbGRSZWFzb24AAQQ4QXV0aG9yaXplQWxpYXMAAAAALQYMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQoSG9sZFJlYXNvbgABCBhQYXlvdXQAAAAYQ3JlZGl0AAEAADEGDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldChIb2xkUmVhc29uAAEEKFByb29mT2ZJbmsAAAAANQYMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldChIb2xkUmVhc29uAAEEIFBsYXlHYW1lAAAAADkGDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0KEhvbGRSZWFzb24AAQgYUGF5b3V0AAAAGENyZWRpdAABAAA9BgxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0KEhvbGRSZWFzb24AAQQcV3JhcHBlZAAAAABBBgxQaW5kaXZfcGFsbGV0X2FpcmRyb3AYcGFsbGV0KEhvbGRSZWFzb24AAQQcQWlyZHJvcAAAAABFBgw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldDhVbmV4cGVjdGVkS2luZAABCDhCYWxhbmNlVXBkYXRlZAAAAFRGYWlsZWRUb011dGF0ZUFjY291bnQAAQAASQYMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50GHBhbGxldBRFdmVudAQEVAABBEhUcmFuc2FjdGlvbkZlZVBhaWQMAQx3aG8EATBUOjpBY2NvdW50SWQAAShhY3R1YWxfZmVlxAEwQmFsYW5jZU9mPFQ+AAEMdGlwxAEwQmFsYW5jZU9mPFQ+AAAIWQFBIHRyYW5zYWN0aW9uIGZlZSBgYWN0dWFsX2ZlZWAsIG9mIHdoaWNoIGB0aXBgIHdhcyBhZGRlZCB0byB0aGUgbWluaW11bSBpbmNsdXNpb24gZmVlLFxoYXMgYmVlbiBwYWlkIGJ5IGB3aG9gLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0GDGxwYWxsZXRfc2tpcF9mZWVsZXNzX3BheW1lbnQYcGFsbGV0FEV2ZW50BARUAAEEKEZlZVNraXBwZWQEARhvcmlnaW4xAwHAPFQ6OlJ1bnRpbWVPcmlnaW4gYXMgT3JpZ2luVHJhaXQ+OjpQYWxsZXRzT3JpZ2luAAAEeEEgdHJhbnNhY3Rpb24gZmVlIHdhcyBza2lwcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFEGDHxpbmRpdl9wYWxsZXRfb3JpZ2luX3Jlc3RyaWN0aW9uGHBhbGxldBRFdmVudAQEVAABBDBVc2FnZUNsZWFuZWQEARhlbnRpdHnYAUxUOjpSZXN0cmljdGVkRW50aXR5AAAEfFVzYWdlIGZvciBhbiBlbnRpdHkgaXMgY2xlYW5lZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRVBgw0cGFsbGV0X2Fzc2V0cxhwYWxsZXQURXZlbnQIBFQABEkAAXAcQ3JlYXRlZAwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABHGNyZWF0b3IEATBUOjpBY2NvdW50SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAAABHRTb21lIGFzc2V0IGNsYXNzIHdhcyBjcmVhdGVkLhhJc3N1ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAQRgU29tZSBhc3NldHMgd2VyZSBpc3N1ZWQuLFRyYW5zZmVycmVkEAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEQZnJvbQQBMFQ6OkFjY291bnRJZAABCHRvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQACBHRTb21lIGFzc2V0cyB3ZXJlIHRyYW5zZmVycmVkLhhCdXJuZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAABHGJhbGFuY2XEAShUOjpCYWxhbmNlAAMEbFNvbWUgYXNzZXRzIHdlcmUgZGVzdHJveWVkLixUZWFtQ2hhbmdlZBABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGGlzc3VlcgQBMFQ6OkFjY291bnRJZAABFGFkbWluBAEwVDo6QWNjb3VudElkAAEcZnJlZXplcgQBMFQ6OkFjY291bnRJZAAEBHBUaGUgbWFuYWdlbWVudCB0ZWFtIGNoYW5nZWQuME93bmVyQ2hhbmdlZAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABFG93bmVyBAEwVDo6QWNjb3VudElkAAUESFRoZSBvd25lciBjaGFuZ2VkLhhGcm96ZW4IASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQABgR4U29tZSBhY2NvdW50IGB3aG9gIHdhcyBmcm96ZW4uGFRoYXdlZAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABDHdobwQBMFQ6OkFjY291bnRJZAAHBHhTb21lIGFjY291bnQgYHdob2Agd2FzIHRoYXdlZC4sQXNzZXRGcm96ZW4EASBhc3NldF9pZOABKFQ6OkFzc2V0SWQACASEU29tZSBhc3NldCBgYXNzZXRfaWRgIHdhcyBmcm96ZW4uLEFzc2V0VGhhd2VkBAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAkEhFNvbWUgYXNzZXQgYGFzc2V0X2lkYCB3YXMgdGhhd2VkLkRBY2NvdW50c0Rlc3Ryb3llZAwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABSGFjY291bnRzX2Rlc3Ryb3llZDgBDHUzMgABSGFjY291bnRzX3JlbWFpbmluZzgBDHUzMgAKBKBBY2NvdW50cyB3ZXJlIGRlc3Ryb3llZCBmb3IgZ2l2ZW4gYXNzZXQuSEFwcHJvdmFsc0Rlc3Ryb3llZAwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABTGFwcHJvdmFsc19kZXN0cm95ZWQ4AQx1MzIAAUxhcHByb3ZhbHNfcmVtYWluaW5nOAEMdTMyAAsEpEFwcHJvdmFscyB3ZXJlIGRlc3Ryb3llZCBmb3IgZ2l2ZW4gYXNzZXQuSERlc3RydWN0aW9uU3RhcnRlZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAAMBNBBbiBhc3NldCBjbGFzcyBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQuJERlc3Ryb3llZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAANBHRBbiBhc3NldCBjbGFzcyB3YXMgZGVzdHJveWVkLjBGb3JjZUNyZWF0ZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAAOBIxTb21lIGFzc2V0IGNsYXNzIHdhcyBmb3JjZS1jcmVhdGVkLixNZXRhZGF0YVNldBQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABEG5hbWUYARxWZWM8dTg+AAEYc3ltYm9sGAEcVmVjPHU4PgABIGRlY2ltYWxzDAEIdTgAASRpc19mcm96ZW7IARBib29sAA8EnE5ldyBtZXRhZGF0YSBoYXMgYmVlbiBzZXQgZm9yIGFuIGFzc2V0LjxNZXRhZGF0YUNsZWFyZWQEASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAEAScTWV0YWRhdGEgaGFzIGJlZW4gY2xlYXJlZCBmb3IgYW4gYXNzZXQuQEFwcHJvdmVkVHJhbnNmZXIQASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhzb3VyY2UEATBUOjpBY2NvdW50SWQAASBkZWxlZ2F0ZQQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAEQQxAShBZGRpdGlvbmFsKSBmdW5kcyBoYXZlIGJlZW4gYXBwcm92ZWQgZm9yIHRyYW5zZmVyIHRvIGEgZGVzdGluYXRpb24gYWNjb3VudC5EQXBwcm92YWxDYW5jZWxsZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAABIGRlbGVnYXRlBAEwVDo6QWNjb3VudElkABIE8EFuIGFwcHJvdmFsIGZvciBhY2NvdW50IGBkZWxlZ2F0ZWAgd2FzIGNhbmNlbGxlZCBieSBgb3duZXJgLkxUcmFuc2ZlcnJlZEFwcHJvdmVkFAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQAASBkZWxlZ2F0ZQQBMFQ6OkFjY291bnRJZAABLGRlc3RpbmF0aW9uBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQATCDEBQW4gYGFtb3VudGAgd2FzIHRyYW5zZmVycmVkIGluIGl0cyBlbnRpcmV0eSBmcm9tIGBvd25lcmAgdG8gYGRlc3RpbmF0aW9uYCBieWB0aGUgYXBwcm92ZWQgYGRlbGVnYXRlYC5IQXNzZXRTdGF0dXNDaGFuZ2VkBAEgYXNzZXRfaWTgAShUOjpBc3NldElkABQE+EFuIGFzc2V0IGhhcyBoYWQgaXRzIGF0dHJpYnV0ZXMgY2hhbmdlZCBieSB0aGUgYEZvcmNlYCBvcmlnaW4uWEFzc2V0TWluQmFsYW5jZUNoYW5nZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAATxuZXdfbWluX2JhbGFuY2XEAShUOjpCYWxhbmNlABUEAQFUaGUgbWluX2JhbGFuY2Ugb2YgYW4gYXNzZXQgaGFzIGJlZW4gdXBkYXRlZCBieSB0aGUgYXNzZXQgb3duZXIuHFRvdWNoZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAASRkZXBvc2l0b3IEATBUOjpBY2NvdW50SWQAFgT8U29tZSBhY2NvdW50IGB3aG9gIHdhcyBjcmVhdGVkIHdpdGggYSBkZXBvc2l0IGZyb20gYGRlcG9zaXRvcmAuHEJsb2NrZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAFwR8U29tZSBhY2NvdW50IGB3aG9gIHdhcyBibG9ja2VkLiREZXBvc2l0ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABgE3FNvbWUgYXNzZXRzIHdlcmUgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4kV2l0aGRyYXduDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAZBCEBU29tZSBhc3NldHMgd2VyZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuPFJlc2VydmVzVXBkYXRlZAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABIHJlc2VydmVzJQEBTFZlYzxUOjpSZXNlcnZlRGF0YT4AGgTYUmVzZXJ2ZSBpbmZvcm1hdGlvbiB3YXMgc2V0IG9yIHVwZGF0ZWQgZm9yIGBhc3NldF9pZGAuPFJlc2VydmVzUmVtb3ZlZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAAbBLxSZXNlcnZlIGluZm9ybWF0aW9uIHdhcyByZW1vdmVkIGZvciBgYXNzZXRfaWRgLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFkGDFBwYWxsZXRfYXNzZXRzX2hvbGRlchhwYWxsZXQURXZlbnQIBFQABEkAAQwQSGVsZBABDHdobwQBMFQ6OkFjY291bnRJZAABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAATEYHdob2BzIGJhbGFuY2Ugb24gaG9sZCB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLiBSZWxlYXNlZBABDHdobwQBMFQ6OkFjY291bnRJZAABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAQTEYHdob2BzIGJhbGFuY2Ugb24gaG9sZCB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLhhCdXJuZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhyZWFzb24hBgFQVDo6UnVudGltZUhvbGRSZWFzb24AARhhbW91bnTEAShUOjpCYWxhbmNlAAIEuGB3aG9gcyBiYWxhbmNlIG9uIGhvbGQgd2FzIGJ1cm5lZCBieSBgYW1vdW50YC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRdBgxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k4AEwVDo6QXNzZXRLaW5kAAEQcmF0ZS0BASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTgATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTgATBUOjpBc3NldEtpbmQAAQxvbGQtAQEkRml4ZWRVMTI4AAEMbmV3LQEBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldGEGDFxwYWxsZXRfYXNzZXRfdHhfcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQQ4QXNzZXRUeEZlZVBhaWQQAQx3aG8EATBUOjpBY2NvdW50SWQAAShhY3R1YWxfZmVlxAFEQXNzZXRCYWxhbmNlT2Y8VD4AAQx0aXDEAURBc3NldEJhbGFuY2VPZjxUPgABIGFzc2V0X2lkoQIBaE9wdGlvbjxDaGFyZ2VBc3NldElkT2Y8VD4+AAAIWQFBIHRyYW5zYWN0aW9uIGZlZSBgYWN0dWFsX2ZlZWAsIG9mIHdoaWNoIGB0aXBgIHdhcyBhZGRlZCB0byB0aGUgbWluaW11bSBpbmNsdXNpb24gZmVlLLhoYXMgYmVlbiBwYWlkIGJ5IGB3aG9gIGluIGFuIGFzc2V0IGBhc3NldF9pZGAuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0ZQYMZHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb24YcGFsbGV0FEV2ZW50BARUAAEoQE5ld0ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVzzAFEVmVjPFQ6OkFjY291bnRJZD4AAARsTmV3IEludnVsbmVyYWJsZXMgd2VyZSBzZXQuREludnVsbmVyYWJsZUFkZGVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABBHRBIG5ldyBJbnZ1bG5lcmFibGUgd2FzIGFkZGVkLkxJbnZ1bG5lcmFibGVSZW1vdmVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAACBHBBbiBJbnZ1bG5lcmFibGUgd2FzIHJlbW92ZWQuUE5ld0Rlc2lyZWRDYW5kaWRhdGVzBAFIZGVzaXJlZF9jYW5kaWRhdGVzOAEMdTMyAAMEpFRoZSBudW1iZXIgb2YgZGVzaXJlZCBjYW5kaWRhdGVzIHdhcyBzZXQuQE5ld0NhbmRpZGFjeUJvbmQEASxib25kX2Ftb3VudMQBMEJhbGFuY2VPZjxUPgAEBGxUaGUgY2FuZGlkYWN5IGJvbmQgd2FzIHNldC44Q2FuZGlkYXRlQWRkZWQIAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAFBFxBIG5ldyBjYW5kaWRhdGUgam9pbmVkLlBDYW5kaWRhdGVCb25kVXBkYXRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAYEcEJvbmQgb2YgYSBjYW5kaWRhdGUgdXBkYXRlZC5AQ2FuZGlkYXRlUmVtb3ZlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQABwRgQSBjYW5kaWRhdGUgd2FzIHJlbW92ZWQuRENhbmRpZGF0ZVJlcGxhY2VkDAEMb2xkBAEwVDo6QWNjb3VudElkAAEMbmV3BAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAIBPRBbiBhY2NvdW50IHdhcyByZXBsYWNlZCBpbiB0aGUgY2FuZGlkYXRlIGxpc3QgYnkgYW5vdGhlciBvbmUuaEludmFsaWRJbnZ1bG5lcmFibGVTa2lwcGVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAAJCFUBQW4gYWNjb3VudCB3YXMgdW5hYmxlIHRvIGJlIGFkZGVkIHRvIHRoZSBJbnZ1bG5lcmFibGVzIGJlY2F1c2UgdGhleSBkaWQgbm90IGhhdmUga2V5c8hyZWdpc3RlcmVkLiBPdGhlciBJbnZ1bG5lcmFibGVzIG1heSBoYXZlIGJlZW4gc2V0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldGkGDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXZlbnQEBFQAARAoTmV3U2Vzc2lvbgQBNHNlc3Npb25faW5kZXg4ATBTZXNzaW9uSW5kZXgAAAg5AU5ldyBzZXNzaW9uIGhhcyBoYXBwZW5lZC4gTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBpcyB0aGUgc2Vzc2lvbiBpbmRleCwgbm90IHRoZZxibG9jayBudW1iZXIgYXMgdGhlIHR5cGUgbWlnaHQgc3VnZ2VzdC4kTmV3UXVldWVkAAEISQFUaGUgYE5ld1Nlc3Npb25gIGV2ZW50IGluIHRoZSBjdXJyZW50IGJsb2NrIGFsc28gaW1wbGllcyBhIG5ldyB2YWxpZGF0b3Igc2V0IHRvIGJlHHF1ZXVlZC5EVmFsaWRhdG9yRGlzYWJsZWQEASR2YWxpZGF0b3IEAThUOjpWYWxpZGF0b3JJZAACBHBWYWxpZGF0b3IgaGFzIGJlZW4gZGlzYWJsZWQuSFZhbGlkYXRvclJlZW5hYmxlZAQBJHZhbGlkYXRvcgQBOFQ6OlZhbGlkYXRvcklkAAMEeFZhbGlkYXRvciBoYXMgYmVlbiByZS1lbmFibGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldG0GDGRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABBDxYY21wTWVzc2FnZVNlbnQEATBtZXNzYWdlX2hhc2gIARxYY21IYXNoAAAEwEFuIEhSTVAgbWVzc2FnZSB3YXMgc2VudCB0byBhIHNpYmxpbmcgcGFyYWNoYWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldHEGDChwYWxsZXRfeGNtGHBhbGxldBRFdmVudAQEVAABdCRBdHRlbXB0ZWQEARxvdXRjb21ldQYBUHhjbTo6bGF0ZXN0OjpPdXRjb21lAAAEqEV4ZWN1dGlvbiBvZiBhbiBYQ00gbWVzc2FnZSB3YXMgYXR0ZW1wdGVkLhBTZW50EAEYb3JpZ2lu4AEgTG9jYXRpb24AASxkZXN0aW5hdGlvbuABIExvY2F0aW9uAAEcbWVzc2FnZV0CARxYY208KCk+AAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAAQRgQW4gWENNIG1lc3NhZ2Ugd2FzIHNlbnQuKFNlbmRGYWlsZWQQARhvcmlnaW7gASBMb2NhdGlvbgABLGRlc3RpbmF0aW9u4AEgTG9jYXRpb24AARRlcnJvcn0GASRTZW5kRXJyb3IAAShtZXNzYWdlX2lkCAEcWGNtSGFzaAACBHhBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gc2VuZC48UHJvY2Vzc1hjbUVycm9yDAEYb3JpZ2lu4AEgTG9jYXRpb24AARRlcnJvco0CASBYY21FcnJvcgABKG1lc3NhZ2VfaWQIARxYY21IYXNoAAMEhEFuIFhDTSBtZXNzYWdlIGZhaWxlZCB0byBwcm9jZXNzLkhVbmV4cGVjdGVkUmVzcG9uc2UIARhvcmlnaW7gASBMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAAEDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQoARxRdWVyeUlkAAEgcmVzcG9uc2WBAgEgUmVzcG9uc2UABQhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAYIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAE0YWN0dWFsX3dlaWdodNUBARhXZWlnaHQAAUxtYXhfYnVkZ2V0ZWRfd2VpZ2h01QEBGFdlaWdodAAHDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZCgBHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgMAQh1OAABKGNhbGxfaW5kZXgMAQh1OAAICFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAkMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkAAFEZXhwZWN0ZWRfbG9jYXRpb26hAgFAT3B0aW9uPExvY2F0aW9uPgAKDFkBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBvcmlnaW4gbG9jYXRpb24gb2YgdGhlIHJlc3BvbnNlIGRvZXNVAW5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uXEludmFsaWRSZXNwb25kZXJWZXJzaW9uCAEYb3JpZ2lu4AEgTG9jYXRpb24AASBxdWVyeV9pZCgBHFF1ZXJ5SWQACxxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkKAEcUXVlcnlJZAAMBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDwBEEgyNTYAARhvcmlnaW7gASBMb2NhdGlvbgABGGFzc2V0c9kCATxWZXJzaW9uZWRBc3NldHMADQS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbuABIExvY2F0aW9uAAEYcmVzdWx0OAEoWGNtVmVyc2lvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gADgwlAUFuIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgc2VudC4A4FRoZSBjb3N0IG9mIHNlbmRpbmcgaXQgKGJvcm5lIGJ5IHRoZSBjaGFpbikgaXMgaW5jbHVkZWQuXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkCAEgbG9jYXRpb27gASBMb2NhdGlvbgABHHZlcnNpb244AShYY21WZXJzaW9uAA8IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb27gASBMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAABFGVycm9yjQIBIFhjbUVycm9yABAIWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAARCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkABIcVQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIGV4cGVjdGVkIHF1ZXJpZXIgbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjhJbnZhbGlkUXVlcmllchABGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcuABIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXKhAgFAT3B0aW9uPExvY2F0aW9uPgATDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFAhZAUEgcmVtb3RlIGhhcyByZXF1ZXN0ZWQgWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHVzIGFuZCB3ZSBoYXZlIGhvbm9yZWQgaXQuHQFBIHZlcnNpb24gaW5mb3JtYXRpb24gbWVzc2FnZSBpcyBzZW50IHRvIHRoZW0gYW5kIGl0cyBjb3N0IGlzIGluY2x1ZGVkLlhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFQQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFgglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbmfgASBMb2NhdGlvbgABEGZlZXNpAgEYQXNzZXRzABcEMQFGZWVzIHdlcmUgcGFpZCBmcm9tIGEgbG9jYXRpb24gZm9yIGFuIG9wZXJhdGlvbiAob2Z0ZW4gZm9yIHVzaW5nIGBTZW5kWGNtYCkuNEFzc2V0c0NsYWltZWQMARBoYXNoPAEQSDI1NgABGG9yaWdpbuABIExvY2F0aW9uAAEYYXNzZXRz2QIBPFZlcnNpb25lZEFzc2V0cwAYBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbjgBKFhjbVZlcnNpb24AGQSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuPEFsaWFzQXV0aG9yaXplZAwBHGFsaWFzZXLgASBMb2NhdGlvbgABGHRhcmdldOABIExvY2F0aW9uAAEYZXhwaXJ5FQMBLE9wdGlvbjx1NjQ+ABoIXQFBbiBgYWxpYXNlcmAgbG9jYXRpb24gd2FzIGF1dGhvcml6ZWQgYnkgYHRhcmdldGAgdG8gYWxpYXMgaXQsIGF1dGhvcml6YXRpb24gdmFsaWQgdW50aWxYYGV4cGlyeWAgYmxvY2sgbnVtYmVyLmRBbGlhc0F1dGhvcml6YXRpb25SZW1vdmVkCAEcYWxpYXNlcuABIExvY2F0aW9uAAEYdGFyZ2V04AEgTG9jYXRpb24AGwTMYHRhcmdldGAgcmVtb3ZlZCBhbGlhcyBhdXRob3JpemF0aW9uIGZvciBgYWxpYXNlcmAucEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQEARh0YXJnZXTgASBMb2NhdGlvbgAcBKhgdGFyZ2V0YCByZW1vdmVkIGFsbCBhbGlhcyBhdXRob3JpemF0aW9ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXR1BhAsc3RhZ2luZ194Y20IdjUYdHJhaXRzHE91dGNvbWUAAQwgQ29tcGxldGUEARB1c2Vk1QEBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZNUBARhXZWlnaHQAARRlcnJvcnkGAUBJbnN0cnVjdGlvbkVycm9yAAEAFEVycm9yBAB5BgFASW5zdHJ1Y3Rpb25FcnJvcgACAAB5BhAsc3RhZ2luZ194Y20IdjUYdHJhaXRzQEluc3RydWN0aW9uRXJyb3IAAAgBFGluZGV4DAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yjQIBFEVycm9yAAB9BhAMeGNtCHYzGHRyYWl0cyRTZW5kRXJyb3IAARw0Tm90QXBwbGljYWJsZQAAACRUcmFuc3BvcnQAAQAoVW5yb3V0YWJsZQACAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAMAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAEADxNaXNzaW5nQXJndW1lbnQABQAQRmVlcwAGAACBBgxIY3VtdWx1c19wYWxsZXRfeGNtGHBhbGxldBRFdmVudAQEVAABDDRJbnZhbGlkRm9ybWF0BAAIASBbdTg7IDMyXQAACIBEb3dud2FyZCBtZXNzYWdlIGlzIGludmFsaWQgWENNLiBcWyBpZCBcXUhVbnN1cHBvcnRlZFZlcnNpb24EAAgBIFt1ODsgMzJdAAEIvERvd253YXJkIG1lc3NhZ2UgaXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBYQ00uIFxbIGlkIFxdQEV4ZWN1dGVkRG93bndhcmQIAAgBIFt1ODsgMzJdAAB1BgEcT3V0Y29tZQACCMREb3dud2FyZCBtZXNzYWdlIGV4ZWN1dGVkIHdpdGggdGhlIGdpdmVuIG91dGNvbWUuRFxbIGlkLCBvdXRjb21lIFxdBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0hQYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ8ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcokGAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ8ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZNUBARhXZWlnaHQEwEhvdyBtdWNoIHdlaWdodCB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgEcc3VjY2Vzc8gBEGJvb2wYiFdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZC4ASQFOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHVuZGVybHlpbmcgYE1lc3NhZ2VQcm9jZXNzb3JgIHdhcyBpbnRlcm5hbGx5NQFzdWNjZXNzZnVsLiBJdCAqc29sZWx5KiBtZWFucyB0aGF0IHRoZSBNUSBwYWxsZXQgd2lsbCB0cmVhdCB0aGlzIGFzIGEgc3VjY2Vzc00BY29uZGl0aW9uIGFuZCBkaXNjYXJkIHRoZSBtZXNzYWdlLiBBbnkgaW50ZXJuYWwgZXJyb3IgbmVlZHMgdG8gYmUgZW1pdHRlZCBhcyBldmVudHNoYnkgdGhlIGBNZXNzYWdlUHJvY2Vzc29yYC4BBFRNZXNzYWdlIGlzIHByb2Nlc3NlZC5IT3ZlcndlaWdodEVucXVldWVkEAEIaWQIASBbdTg7IDMyXQSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEocGFnZV9pbmRleDgBJFBhZ2VJbmRleARgVGhlIHBhZ2Ugb2YgdGhlIG1lc3NhZ2UuATRtZXNzYWdlX2luZGV4OAEcVDo6U2l6ZQSkVGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgcGFnZS4CBIxNZXNzYWdlIHBsYWNlZCBpbiBvdmVyd2VpZ2h0IHF1ZXVlLihQYWdlUmVhcGVkCAEYb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgRYVGhlIHF1ZXVlIG9mIHRoZSBwYWdlLgEUaW5kZXg4ASRQYWdlSW5kZXgEWFRoZSBpbmRleCBvZiB0aGUgcGFnZS4DBFRUaGlzIHBhZ2Ugd2FzIHJlYXBlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSJBhA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgbWVzc2FnZXNMUHJvY2Vzc01lc3NhZ2VFcnJvcgABGCRCYWRGb3JtYXQAAAAcQ29ycnVwdAABACxVbnN1cHBvcnRlZAACAChPdmVyd2VpZ2h0BADVAQEYV2VpZ2h0AAMAFFlpZWxkAAQARFN0YWNrTGltaXRSZWFjaGVkAAUAAI0GDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXZlbnQAASBAQmF0Y2hJbnRlcnJ1cHRlZAgBFGluZGV4OAEMdTMyAAEUZXJyb3L5BQE0RGlzcGF0Y2hFcnJvcgAACFUBQmF0Y2ggb2YgZGlzcGF0Y2hlcyBkaWQgbm90IGNvbXBsZXRlIGZ1bGx5LiBJbmRleCBvZiBmaXJzdCBmYWlsaW5nIGRpc3BhdGNoIGdpdmVuLCBhc0h3ZWxsIGFzIHRoZSBlcnJvci44QmF0Y2hDb21wbGV0ZWQAAQTIQmF0Y2ggb2YgZGlzcGF0Y2hlcyBjb21wbGV0ZWQgZnVsbHkgd2l0aCBubyBlcnJvci5gQmF0Y2hDb21wbGV0ZWRXaXRoRXJyb3JzAAIEtEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGJ1dCBoYXMgZXJyb3JzLjRJdGVtQ29tcGxldGVkAAMEHQFBIHNpbmdsZSBpdGVtIHdpdGhpbiBhIEJhdGNoIG9mIGRpc3BhdGNoZXMgaGFzIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9yLihJdGVtRmFpbGVkBAEUZXJyb3L5BQE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0AAUEWEEgY2FsbCB3YXMgZGlzcGF0Y2hlZC5ESWZFbHNlTWFpblN1Y2Nlc3MABgRkTWFpbiBjYWxsIHdhcyBkaXNwYXRjaGVkLlBJZkVsc2VGYWxsYmFja0NhbGxlZAQBKG1haW5fZXJyb3L5BQE0RGlzcGF0Y2hFcnJvcgAHBIRUaGUgZmFsbGJhY2sgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSRBgQYUmVzdWx0CARUARAERQH5BQEICE9rBAAQAAAAAAxFcnIEAPkFAAABAACVBgw8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFdmVudAQEVAABFCxOZXdNdWx0aXNpZwwBJGFwcHJvdmluZwQBMFQ6OkFjY291bnRJZAABIG11bHRpc2lnBAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoCAEgQ2FsbEhhc2gAAASMQSBuZXcgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWd1bi5ATXVsdGlzaWdBcHByb3ZhbBABJGFwcHJvdmluZwQBMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludIkDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcEATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gIASBDYWxsSGFzaAABBMhBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZCBieSBzb21lb25lLkBNdWx0aXNpZ0V4ZWN1dGVkFAEkYXBwcm92aW5nBAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50iQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwQBMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAgBIENhbGxIYXNoAAEYcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0AAIEnEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLkRNdWx0aXNpZ0NhbmNlbGxlZBABKGNhbmNlbGxpbmcEATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnSJAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnBAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoCAEgQ2FsbEhhc2gAAwSgQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLjBEZXBvc2l0UG9rZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gIASBDYWxsSGFzaAABLG9sZF9kZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXTEATBCYWxhbmNlT2Y8VD4ABATwVGhlIGRlcG9zaXQgZm9yIGEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQvcG9rZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0mQYMLHBhbGxldF9zdWRvGHBhbGxldBRFdmVudAQEVAABEBRTdWRpZAQBLHN1ZG9fcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4ABHBBIHN1ZG8gY2FsbCBqdXN0IHRvb2sgcGxhY2UuKEtleUNoYW5nZWQIAQxvbGTpBAFQT3B0aW9uPFQ6OkFjY291bnRJZD4EtFRoZSBvbGQgc3VkbyBrZXkgKGlmIG9uZSB3YXMgcHJldmlvdXNseSBzZXQpLgEMbmV3BAEwVDo6QWNjb3VudElkBIhUaGUgbmV3IHN1ZG8ga2V5IChpZiBvbmUgd2FzIHNldCkuAQR4VGhlIHN1ZG8ga2V5IGhhcyBiZWVuIHVwZGF0ZWQuKEtleVJlbW92ZWQAAgSAVGhlIGtleSB3YXMgcGVybWFuZW50bHkgcmVtb3ZlZC4oU3Vkb0FzRG9uZQQBLHN1ZG9fcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4DBMhBIFtzdWRvX2FzXShQYWxsZXQ6OnN1ZG9fYXMpIGNhbGwganVzdCB0b29rIHBsYWNlLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJ0GDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEcNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSRBgE4RGlzcGF0Y2hSZXN1bHQAAAS8QSBwcm94eSB3YXMgZXhlY3V0ZWQgY29ycmVjdGx5LCB3aXRoIHRoZSBnaXZlbi4sUHVyZUNyZWF0ZWQYARBwdXJlBAEwVDo6QWNjb3VudElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZZkDATBUOjpQcm94eVR5cGUAAVBkaXNhbWJpZ3VhdGlvbl9pbmRleC0DAQx1MTYAAQhhdDgBREJsb2NrTnVtYmVyRm9yPFQ+AAE8ZXh0cmluc2ljX2luZGV4OAEMdTMyAAEI3EEgcHVyZSBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnkgbmV3IHByb3h5IHdpdGggZ2l2ZW6QZGlzYW1iaWd1YXRpb24gaW5kZXggYW5kIHByb3h5IHR5cGUuKFB1cmVLaWxsZWQQARBwdXJlBAEwVDo6QWNjb3VudElkAAEcc3Bhd25lcgQBMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAFQZGlzYW1iaWd1YXRpb25faW5kZXgtAwEMdTE2AAIEnEEgcHVyZSBwcm94eSB3YXMga2lsbGVkIGJ5IGl0cyBzcGF3bmVyLiRBbm5vdW5jZWQMARByZWFsBAEwVDo6QWNjb3VudElkAAEUcHJveHkEATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAME4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IEATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUEATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlmQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5OAFEQmxvY2tOdW1iZXJGb3I8VD4ABARIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgQBMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQQBMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgAFBFBBIHByb3h5IHdhcyByZW1vdmVkLjBEZXBvc2l0UG9rZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAARBraW5koQYBLERlcG9zaXRLaW5kAAEsb2xkX2RlcG9zaXTEATBCYWxhbmNlT2Y8VD4AASxuZXdfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAGBAkBQSBkZXBvc2l0IHN0b3JlZCBmb3IgcHJveGllcyBvciBhbm5vdW5jZW1lbnRzIHdhcyBwb2tlZCAvIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0oQYIMHBhbGxldF9wcm94eSxEZXBvc2l0S2luZAABCBxQcm94aWVzAAAANEFubm91bmNlbWVudHMAAQAApQYMVGluZGl2X3BhbGxldF9pZGVudGl0eRhwYWxsZXQURXZlbnQEBFQAAYAsSWRlbnRpdHlTZXQEAQx3aG8EATBUOjpBY2NvdW50SWQAAATsQSBuYW1lIHdhcyBzZXQgb3IgcmVzZXQgKHdoaWNoIHdpbGwgcmVtb3ZlIGFsbCBqdWRnZW1lbnRzKS48SWRlbnRpdHlDbGVhcmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgABBMxBIG5hbWUgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gYmFsYW5jZSByZXR1cm5lZC44SWRlbnRpdHlLaWxsZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAIExEEgbmFtZSB3YXMgcmVtb3ZlZCBhbmQgdGhlIGdpdmVuIGJhbGFuY2Ugc2xhc2hlZC5ISnVkZ2VtZW50UmVxdWVzdGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4OAE4UmVnaXN0cmFySW5kZXgAAwScQSBqdWRnZW1lbnQgd2FzIGFza2VkIGZyb20gYSByZWdpc3RyYXIuUEp1ZGdlbWVudFVucmVxdWVzdGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4OAE4UmVnaXN0cmFySW5kZXgABASIQSBqdWRnZW1lbnQgcmVxdWVzdCB3YXMgcmV0cmFjdGVkLjhKdWRnZW1lbnRHaXZlbggBGHRhcmdldAQBMFQ6OkFjY291bnRJZAABPHJlZ2lzdHJhcl9pbmRleDgBOFJlZ2lzdHJhckluZGV4AAUElEEganVkZ2VtZW50IHdhcyBnaXZlbiBieSBhIHJlZ2lzdHJhci44UmVnaXN0cmFyQWRkZWQEATxyZWdpc3RyYXJfaW5kZXg4AThSZWdpc3RyYXJJbmRleAAGBFhBIHJlZ2lzdHJhciB3YXMgYWRkZWQuQFN1YklkZW50aXR5QWRkZWQMAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAHBPRBIHN1Yi1pZGVudGl0eSB3YXMgYWRkZWQgdG8gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IHBhaWQuQFN1YklkZW50aXRpZXNTZXQMARBtYWluBAEwVDo6QWNjb3VudElkAAE4bnVtYmVyX29mX3N1YnM4AQx1MzIAASxuZXdfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAIBLxBbiBhY2NvdW50J3Mgc3ViLWlkZW50aXRpZXMgd2VyZSBzZXQgKGluIGJ1bGspLkhTdWJJZGVudGl0eVJlbmFtZWQIAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAkEIQFBIGdpdmVuIHN1Yi1hY2NvdW50J3MgYXNzb2NpYXRlZCBuYW1lIHdhcyBjaGFuZ2VkIGJ5IGl0cyBzdXBlci1pZGVudGl0eS5IU3ViSWRlbnRpdHlSZW1vdmVkDAEMc3ViBAEwVDo6QWNjb3VudElkAAEQbWFpbgQBMFQ6OkFjY291bnRJZAABHGRlcG9zaXTEATBCYWxhbmNlT2Y8VD4ACgQJAUEgc3ViLWlkZW50aXR5IHdhcyByZW1vdmVkIGZyb20gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IGZyZWVkLkhTdWJJZGVudGl0eVJldm9rZWQMAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgALCBkBQSBzdWItaWRlbnRpdHkgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gZGVwb3NpdCByZXBhdHJpYXRlZCBmcm9tIHRoZchtYWluIGlkZW50aXR5IGFjY291bnQgdG8gdGhlIHN1Yi1pZGVudGl0eSBhY2NvdW50LjhBdXRob3JpdHlBZGRlZAQBJGF1dGhvcml0eQQBMFQ6OkFjY291bnRJZAAMBHxBIHVzZXJuYW1lIGF1dGhvcml0eSB3YXMgYWRkZWQuQEF1dGhvcml0eVJlbW92ZWQEASRhdXRob3JpdHkEATBUOjpBY2NvdW50SWQADQSEQSB1c2VybmFtZSBhdXRob3JpdHkgd2FzIHJlbW92ZWQuLFVzZXJuYW1lU2V0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4ADgR0QSB1c2VybmFtZSB3YXMgc2V0IGZvciBgd2hvYC44VXNlcm5hbWVRdWV1ZWQMAQx3aG8EATBUOjpBY2NvdW50SWQAASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgABKGV4cGlyYXRpb244AURCbG9ja051bWJlckZvcjxUPgAPBBkBQSB1c2VybmFtZSB3YXMgcXVldWVkLCBidXQgYHdob2AgbXVzdCBhY2NlcHQgaXQgcHJpb3IgdG8gYGV4cGlyYXRpb25gLkhQcmVhcHByb3ZhbEV4cGlyZWQEARR3aG9zZQQBMFQ6OkFjY291bnRJZAAQBDkBQSBxdWV1ZWQgdXNlcm5hbWUgcGFzc2VkIGl0cyBleHBpcmF0aW9uIHdpdGhvdXQgYmVpbmcgY2xhaW1lZCBhbmQgd2FzIHJlbW92ZWQuSFByaW1hcnlVc2VybmFtZVNldAgBDHdobwQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABEEAQFBIHVzZXJuYW1lIHdhcyBzZXQgYXMgYSBwcmltYXJ5IGFuZCBjYW4gYmUgbG9va2VkIHVwIGZyb20gYHdob2AuXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEghdAUEgZGFuZ2xpbmcgdXNlcm5hbWUgKGFzIGluLCBhIHVzZXJuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gYWNjb3VudCB0aGF0IGhhcyByZW1vdmVkIGl0c2xpZGVudGl0eSkgaGFzIGJlZW4gcmVtb3ZlZC48VXNlcm5hbWVVbmJvdW5kBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEwRwQSB1c2VybmFtZSBoYXMgYmVlbiB1bmJvdW5kLjxVc2VybmFtZVJlbW92ZWQEASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAUBHBBIHVzZXJuYW1lIGhhcyBiZWVuIHJlbW92ZWQuOFVzZXJuYW1lS2lsbGVkBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AFQRsQSB1c2VybmFtZSBoYXMgYmVlbiBraWxsZWQuQFVzZXJuYW1lUmVwb3J0ZWQIASByZXBvcnRlcgQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABYEdEEgdXNlcm5hbWUgaGFzIGJlZW4gcmVwb3J0ZWQuTFBlcnNvbmFsSWRlbnRpdHlTZXQMARRhbGlhcwgBFEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABcEmEFuIGlkZW50aXR5IGZvciBhIHBlcnNvbiBoYXMgYmVlbiBzZXQuREV2aWRlbmNlU3VibWl0dGVkBAEUYWxpYXMIARRBbGlhcwAYBORFdmlkZW5jZSBmb3IgYSBjcmVkZW50aWFsIGhhcyBiZWVkIHN1Ym1pdHRlZCBieSBhIHBlcnNvbi5IQ3JlZGVudGlhbEFjY2VwdGVkBAEUYWxpYXMIARRBbGlhcwAZBJxBIGNyZWRlbnRpYWwgd2FzIGFjY2VwdGVkIGZvciBhIHBlcnNvbi5IQ3JlZGVudGlhbFJlamVjdGVkBAEUYWxpYXMIARRBbGlhcwAaBJxBIGNyZWRlbnRpYWwgd2FzIHJlamVjdGVkIGZvciBhIHBlcnNvbi4wUGVyc29uQmFubmVkBAEUYWxpYXMIARRBbGlhcwAbBNBQZXJzb24gd2FzIGJhbm5lZCBmb3Igc2VuZGluZyBjb250ZW1wdHVvdXMgZXZpZGVuY2UuXFBlcnNvbmFsSWRlbnRpdHlDbGVhcmVkBAEUYWxpYXMIARRBbGlhcwAcBIBBIHBlcnNvbmFsIGlkZW50aXR5IHdhcyBjbGVhcmVkLmxSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkVmFsaWQEASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAdBJRBIHJlcG9ydGVkIHVzZXJuYW1lIHdhcyBqdWRnZWQgdmFsaWQudFJlcG9ydGVkVXNlcm5hbWVKdWRnZWRJbnZhbGlkBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AHgScQSByZXBvcnRlZCB1c2VybmFtZSB3YXMganVkZ2VkIGludmFsaWQumFJlcG9ydGVkVXNlcm5hbWVXZWFrT3JVbmNsZWFySnVkZ2VtZW50CAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AASRqdWRnZW1lbnRBBAE8T3JhY2xlSnVkZ2VtZW50AB8EEQFUaGUganVkZ21lbnQgcmVnYXJkaW5nIGEgcmVwb3J0ZWQgdXNlcm5hbWUgd2FzIHVuY2xlYXIgb3IgdW5jZXJ0YWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldKkGDExpbmRpdl9wYWxsZXRfcGVvcGxlGHBhbGxldBRFdmVudAQEVAABJFBQZXJzb25ob29kUmVjb2duaXplZAgBDHdobygBKFBlcnNvbmFsSWQAAQxrZXlRBAEsTWVtYmVyT2Y8VD4AAAT4QW4gaW5kaXZpZHVhbCBoYXMgaGFkIHRoZWlyIHBlcnNvbmhvb2QgcmVjb2duaXNlZCBhbmQgaW5kZXhlZC5AUGVyc29uT25ib2FyZGluZwgBDHdobygBKFBlcnNvbmFsSWQAAQxrZXlRBAEsTWVtYmVyT2Y8VD4AAQQRAUFuIGluZGl2aWR1YWwgaGFzIGhhZCB0aGVpciBwZXJzb25ob29kIHJlY29nbmlzZWQgYWdhaW4gYW5kIGluZGV4ZWQuPEFsaWFzRGlzcGF0Y2hlZAgBFGFsaWFzSQMBPENvbnRleHR1YWxBbGlhcwABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAgSUQSBjYWxsIHdhcyBkaXNwYXRjaGVkIHVuZGVyIGFuIGFsaWFzLjxBbGlhc0FjY291bnRTZXQIARRhbGlhc0kDATxDb250ZXh0dWFsQWxpYXMAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEvEFuIGFsaWFzLXRvLWFjY291bnQgbWFwcGluZyB3YXMgc2V0IG9yIHVwZGF0ZWQuREFsaWFzQWNjb3VudFVuc2V0CAEUYWxpYXNJAwE8Q29udGV4dHVhbEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBKBBbiBhbGlhcy10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuUFBlcnNvbmFsSWRBY2NvdW50U2V0CAEMd2hvKAEoUGVyc29uYWxJZAABHGFjY291bnQEATBUOjpBY2NvdW50SWQABQTQQSBwZXJzb25hbCBJRC10by1hY2NvdW50IG1hcHBpbmcgd2FzIHNldCBvciB1cGRhdGVkLlhQZXJzb25hbElkQWNjb3VudFVuc2V0CAEMd2hvKAEoUGVyc29uYWxJZAABHGFjY291bnQEATBUOjpBY2NvdW50SWQABgS0QSBwZXJzb25hbCBJRC10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuRENvbGxlY3Rpb25DcmVhdGVkAAcEiFRoZSBwZW9wbGUgY29sbGVjdGlvbiB3YXMgY3JlYXRlZC5kRm9yY2VQZXJzb25ob29kUmVjb2duaXplZAQBGHBlb3BsZU0EAUBWZWM8TWVtYmVyT2Y8VD4+AAgEtFBlcnNvbmhvb2Qgd2FzIGZvcmNlZnVsbHkgcmVjb2duaXplZCBieSByb290LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldK0GDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0FEV2ZW50BARUAAFELENhc2VDcmVhdGVkBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleASAVGhlIGNhc2UgaW5kZXggdGhhdCB3YXMgY3JlYXRlZC4ABGBBIGNhc2UgaGFzIGJlZW4gY3JlYXRlZC4gQ2FsbGJhY2sEARhyZXN1bHSRBgE4RGlzcGF0Y2hSZXN1bHQEbFRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrLgEEnEEgY2FsbGJhY2sgd2FzIHRyaWdnZXJlZCBmcm9tIG1vYi1ydWxlLjRDYWxsYmFja0Vycm9yAAIE8FRoZXJlIHdhcyBhIGNvZGVjIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLihDYXNlQ2xvc2VkCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAR8VGhlIGNhc2UgaW5kZXggdGhhdCB3YXMgY2xvc2VkLgEcdmVyZGljdEEEASRKdWRnZW1lbnQEfFRoZSB2ZXJkaWN0IG9mIHRoZSBjbG9zZWQgY2FzZS4DBMxUaGUgY2FzZSBoYXMgYmVlbiBjbG9zZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlc3VsdC4UVm90ZWQMAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4BEhUaGUgY2FzZSB2b3RlZCBvbi4BFHZvdGVyCAEUQWxpYXMEVFRoZSBhbGlhcyB0aGF0IHZvdGVkLgEcb3BpbmlvbkEEASRKdWRnZW1lbnQEZFRoZSBvcGluaW9uIG9mIHRoZSB2b3Rlci4EBIRBIHZvdGUgaGFzIGJlZW4gcGxhY2VkIG9uIGEgY2FzZS4sVm90ZUNsZWFuZWQIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4BEhUaGUgY2FzZSB2b3RlZCBvbi4BFHZvdGVyCAEUQWxpYXMEVFRoZSBhbGlhcyB0aGF0IHZvdGVkLgUEYEEgdm90ZSBoYXMgYmVlbiBjbGVhbmVkLixDYXNlUmVtb3ZlZAQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgESFRoZSBjYXNlIHZvdGVkIG9uLgYEYEEgY2FzZSBoYXMgYmVlbiByZW1vdmVkLjhDYXNlSW50ZXJ2ZW5lZAgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgEiFRoZSBjYXNlIHRoYXQgaGFzIGJlZW4gaW50ZXJ2ZW5lZC4BHHZlcmRpY3RBBAEkSnVkZ2VtZW50BIBUaGUgdmVyZGljdCBhcHBsaWVkIHRvIHRoZSBjYXNlLgcEbEEgY2FzZSBoYXMgYmVlbiBpbnRlcnZlbmVkLjBWb3Rlc0NsYWltZWQIARR2b3RlcggBFEFsaWFzBFRUaGUgYWxpYXMgdGhhdCB2b3RlZC4BMGNhc2VfaW5kaWNlc1kEAThWZWM8Q2FzZUluZGV4PgSIVGhlIGNhc2UgdGhhdCBoYXMgYmVlbiBpbnRlcnZlbmVkLggEkENyZWRpdHMgZm9yIHZvdGVzIGhhdmUgYmVlbiBjbGFpbWVkLjBSZXdhcmRQYXlvdXQMARR2b3RlcggBFEFsaWFzBHxUaGUgYWxpYXMgdGhhdCBlYXJuZWQgYSByZXdhcmQuASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAScVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBwYXlvdXQuARhhbW91bnTEATBCYWxhbmNlT2Y8VD4EnFRoZSBwYXlvdXQgYW1vdW50IHRoYXQgd2FzIHRyYW5zZmVycmVkLgkEgEEgcmV3YXJkIHRoYXQgaGFzIGJlZW4gcGFpZCBvdXQuSFBheW91dFJvdW5kU3RhcnRlZAwBFHJvdW5kOAEoUm91bmRJbmRleASIVGhlIGluZGV4IG9mIHRoZSBuZXcgcGF5b3V0IHJvdW5kLgE8aW5pdGlhbF9iYWxhbmNlxAEwQmFsYW5jZU9mPFQ+BLBUaGUgaW5pdGlhbCBiYWxhbmNlIGFsbG9jYXRlZCBmb3IgdGhlIHJvdW5kLgEwdG90YWxfcG9pbnRzKAEkVm90ZUNvdW50BMRUb3RhbCBhY2N1bXVsYXRlZCBwb2ludHMgY2xhaW1hYmxlIGluIHRoaXMgcm91bmQuCgSQQSBuZXcgcGF5b3V0IHJvdW5kIGhhcyBiZWVuIHN0YXJ0ZWQuVFBheW91dFJvdW5kc1NjaGVkdWxlZAwBGGFtb3VudMQBMEJhbGFuY2VPZjxUPgR4VGhlIGFtb3VudCBvZiBmdW5kcyBwZXIgcm91bmQuARRjb3VudDgBDHUzMgR8VGhlIG51bWJlciBvZiByb3VuZHMgc2NoZWR1bGVkLgEYcGVyaW9kOAFEQmxvY2tOdW1iZXJGb3I8VD4EuFRoZSBtaW5pbXVtIHBlcmlvZCAoaW4gYmxvY2tzKSBiZXR3ZWVuIHJvdW5kcy4LBIhQYXlvdXQgcm91bmRzIGhhdmUgYmVlbiBzY2hlZHVsZWQuVFBheW91dFNjaGVkdWxlUmVtb3ZlZAQBFGluZGV4OAEMdTMyBIhUaGUgaW5kZXggb2YgdGhlIHJlbW92ZWQgc2NoZWR1bGUuDASMQSBwYXlvdXQgc2NoZWR1bGUgaGFzIGJlZW4gcmVtb3ZlZC40Q3JlZGl0Q2xhaW1lZAgBFHZvdGVyCAEUQWxpYXMEjFRoZSBhbGlhcyBvZiB0aGUgdm90ZXIgd2hvIGNsYWltZWQuARhhbW91bnTEATBCYWxhbmNlT2Y8VD4EdFRoZSBhbW91bnQgb2YgY3JlZGl0IGNsYWltZWQuDQTUQ3JlZGl0IGhhcyBiZWVuIGNsYWltZWQgZnJvbSB0aGUgcGF5b3V0IGRpc3RyaWJ1dGlvbi40UG9pbnRzQ2xlYW5lZAgBFHJvdW5kOAEoUm91bmRJbmRleAS8VGhlIHJvdW5kIGluZGV4IGZyb20gd2hpY2ggcG9pbnRzIHdlcmUgcmVtb3ZlZC4BFHZvdGVyCAEUQWxpYXMEkFRoZSBhbGlhcyB3aG9zZSBwb2ludHMgd2VyZSByZW1vdmVkLg4EmFN0YWxlIHZvdGluZyBwb2ludHMgaGF2ZSBiZWVuIGNsZWFuZWQuLENhc2VUb3VjaGVkCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleARoVGhlIGNhc2UgdGhhdCB3YXMgdG91Y2hlZC4BHHJpcGVuZWTIARBib29sBKRXaGV0aGVyIHRoZSBjYXNlIHdhcyByaXBlbmVkIGFzIGEgcmVzdWx0Lg8EnEEgY2FzZSBoYXMgYmVlbiB0b3VjaGVkIChyZS1ldmFsdWF0ZWQpLlBWb3RpbmdQZW5hbHR5Q2xlYXJlZAQBDHdobwgBFEFsaWFzBJBUaGUgYWxpYXMgd2hvc2UgcGVuYWx0eSB3YXMgY2xlYXJlZC4QBIhBIHZvdGluZyBwZW5hbHR5IGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0sQYMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0FEV2ZW50BARUAAFcQENhbmRpZGF0ZUFwcGxpZWQEAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAAEjENhbmRpZGF0ZSBhcHBsaWVkIGZvciB2ZXJpZmljYXRpb24uSEp1ZGdlbWVudFJlcXVlc3RlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAAQQFAUNhbmRpZGF0ZSBvcGVuZWQgYSBqdWRpY2lhbCBjYXNlIGZvciB0aGVpciB2ZXJpZmljYXRpb24gZXZpZGVuY2UuREp1ZGdlbWVudFByb3ZpZGVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABJGp1ZGdlbWVudEEEASRKdWRnZW1lbnQAAgTYT3JhY2xlIGhhcyBwcm92aWRlZCB0aGUganVkZ2VtZW50IGZvciBhIGp1ZGljaWFsIGNhc2UuMFJldHJ5R3JhbnRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAASBmYWlsdXJlczgBDHUzMgADCEUBQSBjYW5kaWRhdGUgaGFzIGJlZW4gZ3JhbnRlZCBhIGZyZWUgcmV0cnkgYXR0ZW1wdCBhZnRlciBhIGZhaWx1cmUgdG8gdmVyaWZ5IHRoZWlyJGV2aWRlbmNlLkBQZXJzb25SZWdpc3RlcmVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABLHBlcnNvbmFsX2lkKAEoUGVyc29uYWxJZAAEBIBSZWdpc3RlciBhbiBhY2NvdW50IGFzIGEgcGVyc29uLkRDYW5kaWRhdGVSZWZlcnJlZAgBIHJlZmVycmVyKAEoUGVyc29uYWxJZAABIHJlZmVycmVkBAEwVDo6QWNjb3VudElkAAUEbFBlcnNvbiByZWZlcnJlZCBhbiBhY2NvdW50LiBSZXJvbGxlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQABgS0RW50cm9weSBmb3IgYSBjYW5kaWRhdGUgY2hhbmdlZCBhZnRlciBleHBpcnkuPERlc2lnbkNvbW1pdHRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAASxyZXNlcnZlZF9pZCgBKFBlcnNvbmFsSWQABwSUQ2FuZGlkYXRlIGNvbW1pdHRlZCB0byBhbiBpbmsgZGVzaWduLjhGdWxseUFsbG9jYXRlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQACAS8U3RvcmFnZSBmdWxseSBhbGxvY2F0ZWQgZm9yIGEgY29tbWl0dGVkIGRlc2lnbi4gVGltZWRPdXQEAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAkEgENhbmRpZGF0ZSByZW1vdmVkIGFmdGVyIHRpbWVvdXQuJEZsYWtlZE91dAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQACgR4VW5jb21taXR0ZWQgY2FuZGlkYXRlIHJlbW92ZWQuOFRpY2tldFJlZmVycmVkCAEgcmVmZXJyZXIoAShQZXJzb25hbElkAAEYdGlja2V0BAEkVDo6VGlja2V0AAsE7FJlZmVycmFsIHRpY2tldCBjcmVhdGVkIGJ5IHN0b3JpbmcgdGhlIHB1YmxpYyBrZXkgb24gY2hhaW4uPFRpY2tldENhbmNlbGxlZAgBIHJlZmVycmVyKAEoUGVyc29uYWxJZAABGHRpY2tldAQBJFQ6OlRpY2tldAAMBBkBUmVmZXJyYWwgdGlja2V0IHJlbW92ZWQgYnkgcmVtb3ZpbmcgdGhlIHB1YmxpYyBrZXkgZnJvbSBjaGFpbiBzdG9yYWdlLjRUaWNrZXRBcHBsaWVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABIHJlZmVycmVyKAEoUGVyc29uYWxJZAANBKhDYW5kaWRhdGUgYXBwbGllZCB1c2luZyBhIHJlZmVycmFsIHRpY2tldC4sRmFtaWx5QWRkZWQMARRpbmRleC0DASxGYW1pbHlJbmRleAABEGtpbmRpBAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQADgRQRGVzaWduIGZhbWlseSBhZGRlZC5EQWxsSW52aXRlc1JlbW92ZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAA8EuEFsbCBpbnZpdGVzIGhhdmUgYmVlbiByZW1vdmVkIGZvciB0aGUgaW52aXRlci5IU29tZUludml0ZXNSZW1vdmVkBAEcaW52aXRlcgQBMFQ6OkFjY291bnRJZAAQBA0BU29tZSBpbnZpdGVzIGhhdmUgYmVlbiByZW1vdmVkIGZvciB0aGUgaW52aXRlciwgc29tZSBhcmUgcmVtYWluaW5nLlxJbnZpdGVkQ2FuZGlkYXRlQXBwbGllZAgBDHdobwQBMFQ6OkFjY291bnRJZAABHGludml0ZXIEATBUOjpBY2NvdW50SWQAEQSYQ2FuZGlkYXRlIGFwcGxpZWQgdXNpbmcgYW4gaW52aXRhdGlvbi5kUmVmZXJyYWxWb3VjaGVyUmVnaXN0ZXJlZAQBIHJlZmVycmVyKAEoUGVyc29uYWxJZAASBMBBIHJlZmVycmVyJ3MgcmV3YXJkIHZvdWNoZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZC44SW52aXRlc0dyYW50ZWQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEUY291bnQ4AQx1MzIAEwSgSW52aXRlcyBoYXZlIGJlZW4gZ3JhbnRlZCB0byBhbiBhY2NvdW50LjxJbnZpdGVUaWNrZXRTZXQIARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEkVDo6VGlja2V0ABQEeEFuIGludml0ZSB0aWNrZXQgaGFzIGJlZW4gc2V0LlRJbnZpdGVUaWNrZXRDYW5jZWxsZWQIARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEkVDo6VGlja2V0ABUEkEFuIGludml0ZSB0aWNrZXQgaGFzIGJlZW4gY2FuY2VsbGVkLkBDb25maWd1cmF0aW9uU2V0BAEYY29uZmlnbQQBfENvbmZpZ1JlY29yZDxCbG9ja051bWJlckZvcjxUPj4AFgSoVGhlIHBhbGxldCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0tQYMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldBRFdmVudAQEVAABOBxOZXdHYW1lDAFEcmVnaXN0cmF0aW9uX2VuZHM4AQx1MzIAASRnYW1lX2RhdGU4AQx1MzIAASxyZXBvcnRfZW5kczgBDHUzMgAABFxBIG5ldyBnYW1lIGlzIHN0YXJ0aW5nLiRHYW1lRW5kZWQEARRpbmRleDgBDHUzMgABBKBUaGUgZ2FtZSBhbmQgaXRzIHBvc3QtcHJvY2VzcyBoYXMgZW5kZWQuIFNpZ25lZFVwBAEMd2hvuQYBdEFjY291bnRPclBlcnNvbjxUOjpBY2NvdW50SWQ+AAIEgEEgcGxheWVyIHNpZ25lZCB1cCBmb3IgdGhlIGdhbWUuPFJlcG9ydFN1Ym1pdHRlZAgBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgABKGdhbWVfaW5kZXg4AQx1MzIAAwSAQSBwbGF5ZXIgc3VibWl0dGVkIHRoZWlyIHJlcG9ydC4oT2ZmYm9hcmRlZAQBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgAEBIhBIHBsYXllciBvZmZib2FyZGVkIGZyb20gdGhlIGdhbWUuJEtpY2tlZE91dAQBGHBsYXllcrkGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgAFBIhBbiBhcmNoaXZlZCBwbGF5ZXIgd2FzIGtpY2tlZCBvdXQuOEludml0ZXNHcmFudGVkCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAAYEjEludml0ZXMgd2VyZSBncmFudGVkIHRvIGFuIGFjY291bnQuPEludml0ZVRpY2tldFNldAQBHGludml0ZXIEATBUOjpBY2NvdW50SWQABwRkQW4gaW52aXRlIHRpY2tldCB3YXMgc2V0LlRJbnZpdGVUaWNrZXRDYW5jZWxsZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAgEfEFuIGludml0ZSB0aWNrZXQgd2FzIGNhbmNlbGxlZC44R2FtZXNTY2hlZHVsZWQEARRjb3VudDgBDHUzMgAJBFRHYW1lcyB3ZXJlIHNjaGVkdWxlZC5QU2NoZWR1bGVkR2FtZVJlbW92ZWQEAThnYW1lX3BsYXlfdGltZTgBDHUzMgAKBHRBIHNjaGVkdWxlZCBnYW1lIHdhcyByZW1vdmVkLkBTdG10VXNhZ2VSZW1vdmVkBAEMd2hvCAEgW3U4OyAzMl0ACwS4U3RhdGVtZW50IHN0b3JlIHVzYWdlIHJlbW92ZWQgZm9yIHRoZSBhY2NvdW50LkRBbGxJbnZpdGVzUmVtb3ZlZAQBHGludml0ZXIEATBUOjpBY2NvdW50SWQADAS4QWxsIGludml0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZm9yIHRoZSBpbnZpdGVyLkhTb21lSW52aXRlc1JlbW92ZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAA0EDQFTb21lIGludml0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZm9yIHRoZSBpbnZpdGVyLCBzb21lIGFyZSByZW1haW5pbmcuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0uQYMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlczxBY2NvdW50T3JQZXJzb24EJEFjY291bnRJZAEEAQgcQWNjb3VudAQABAEkQWNjb3VudElkAAAAGFBlcnNvbgQACAEUQWxpYXMAAQAAvQYMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQURXZlbnQEBFQAARw0Q3JlZGl0Q2xhaW1lZAwBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgR4VGhlIHBlcnNvbiB3aG8gY2xhaW1lZCBjcmVkaXQuASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAS8RGVzdGluYXRpb24gYWNjb3VudCB0aGF0IHJlY2VpdmVkIHRoZSB0cmFuc2Zlci4BGGFtb3VudMQBMEJhbGFuY2VPZjxUPgRMQW1vdW50IHRyYW5zZmVycmVkLgAEcEEgcGVyc29uIGhhcyBjbGFpbWVkIGNyZWRpdC5QUGVyc29uaG9vZFJlY29nbml6ZWQIAQx3aG+5BgF0QWNjb3VudE9yUGVyc29uPFQ6OkFjY291bnRJZD4EsFRoZSBhY2NvdW50IHdob3NlIHBlcnNvbmhvb2Qgd2FzIHJlY29nbml6ZWQuARxyZXN1bWVkyAEQYm9vbAQRAVdoZXRoZXIgdGhpcyB3YXMgcmVzdW1pbmcgZnJvbSBzdXNwZW5zaW9uIG9yIGZpcnN0LXRpbWUgcmVjb2duaXRpb24uAQSkUGVyc29uaG9vZCB3YXMgcmVjb2duaXplZCBmb3IgYW4gYWNjb3VudC5UUGF5b3V0Um91bmRzU2NoZWR1bGVkDAEYYW1vdW50xAEwQmFsYW5jZU9mPFQ+BFRUaGUgYW1vdW50IHBlciByb3VuZC4BFGNvdW50OAEMdTMyBFRUaGUgbnVtYmVyIG9mIHJvdW5kcy4BIGR1cmF0aW9uOAFEQmxvY2tOdW1iZXJGb3I8VD4EhFRoZSBkdXJhdGlvbiBwZXIgcm91bmQgaW4gYmxvY2tzLgIEiFBheW91dCByb3VuZHMgaGF2ZSBiZWVuIHNjaGVkdWxlZC5UUGF5b3V0U2NoZWR1bGVSZW1vdmVkBAEUaW5kZXg4AQx1MzIEiFRoZSBpbmRleCBvZiB0aGUgcmVtb3ZlZCBzY2hlZHVsZS4DBIxBIHBheW91dCBzY2hlZHVsZSBoYXMgYmVlbiByZW1vdmVkLkRSb3VuZFRyYW5zaXRpb25lZAQBLHJvdW5kX2luZGV4OAEoUm91bmRJbmRleASYVGhlIHJvdW5kIGluZGV4IHRoYXQgd2FzIHRyYW5zaXRpb25lZC4EBHhBIHJvdW5kIGhhcyBiZWVuIHRyYW5zaXRpb25lZC5MUGF5b3V0Um91bmRPcGVyYXRlZAQBLHJvdW5kX2luZGV4OAEoUm91bmRJbmRleASIVGhlIHJvdW5kIGluZGV4IHRoYXQgd2FzIG9wZXJhdGVkLgUEGQFBIHBheW91dCByb3VuZCBoYXMgYmVlbiBvcGVyYXRlZCAoY3JlZGl0IGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cykuJENhc2hlZE91dAQBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgR8VGhlIHBhcnRpY2lwYW50IHdobyBjYXNoZWQgb3V0LgYEuEEgcGFydGljaXBhbnQgaGFzIGNhc2hlZCBvdXQgc2NvcmUgZm9yIHBvaW50cy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTBBgxYaW5kaXZfcGFsbGV0X2R1bW15X2RpbRhwYWxsZXQURXZlbnQEBFQAASAsSWRzUmVzZXJ2ZWQEARRjb3VudDgBDHUzMgAABHRBIG51bWJlciBvZiBJRHMgd2FzIHJlc2VydmVkLiRJZFJlbmV3ZWQEAQhpZCgBKFBlcnNvbmFsSWQAAQRIQW4gSUQgd2FzIHJlbmV3ZWQuMElkVW5yZXNlcnZlZAQBCGlkKAEoUGVyc29uYWxJZAACBGhBIHJlc2VydmVkIElEIHdhcyByZW1vdmVkLkBQZW9wbGVSZWdpc3RlcmVkBAEUY291bnQ4AQx1MzIAAwRkUmVnaXN0ZXIgbXVsdGlwbGUgcGVvcGxlLjxQZW9wbGVTdXNwZW5kZWQEARRjb3VudDgBDHUzMgAEBGxTdXNwZW5kIGEgbnVtYmVyIG9mIHBlb3BsZS5EUGVyc29uaG9vZFJlc3VtZWQEAQhpZCgBKFBlcnNvbmFsSWQABQSEU29tZW9uZSdzIHBlcnNvbmhvb2Qgd2FzIHJlc3VtZWQuSFN1c3BlbnNpb25zU3RhcnRlZAAGBHxUaGUgcGFsbGV0IGVuYWJsZWQgc3VzcGVuc2lvbnMuQFN1c3BlbnNpb25zRW5kZWQABwSAVGhlIHBhbGxldCBkaXNhYmxlZCBzdXNwZW5zaW9ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTFBgxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBRFdmVudAQEVAABEHhBbGxBdHRlc3RhdGlvbkFsbG93YW5jZUNsZWFyZWQEASB2ZXJpZmllcgQBMFQ6OkFjY291bnRJZAAABPBBbGwgYXR0ZXN0YXRpb24gYWxsb3dhbmNlIGhhcyBiZWVuIHJlbW92ZWQgZm9yIHRoZSB2ZXJpZmllci50QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEUY291bnQ4AQx1MzIAAQQtAUF0dGVzdGF0aW9uIGFsbG93YW5jZSB3YXMgaW5jcmVhc2VkIGZvciBhbiBhY2NvdW50IGJ5IGBjb3VudGAgYXR0ZXN0YXRpb25zLjhQZXJzb25BdHRlc3RlZAgBJGNhbmRpZGF0ZQQBMFQ6OkFjY291bnRJZAABIHZlcmlmaWVyBAEwVDo6QWNjb3VudElkAAIE1EEgbmV3IGxpdGUgcGVyc29uIHdhcyByZWdpc3RlcmVkIHRocm91Z2ggYXR0ZXN0YXRpb24uSENvbnN1bWVyUmVnaXN0ZXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQAAwSsQSBsaXRlIHBlcnNvbiB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNvbnN1bWVyLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkGDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzGHBhbGxldBRFdmVudAQEVAABIEBQZXJzb25SZWdpc3RlcmVkCAEUYWxpYXMIARRBbGlhcwABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAASYQSBwZXJzb24gaGFzIHJlZ2lzdGVyZWQgYXMgYSBjb25zdW1lci5QTGl0ZVBlcnNvblJlZ2lzdGVyZWQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEErEEgbGl0ZSBwZXJzb24gaGFzIHJlZ2lzdGVyZWQgYXMgYSBjb25zdW1lci5oUGVyc29uQXV0aG9yaXphdGlvblRvdWNoZWQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAIElEEgcGVyc29uJ3MgYXV0aG9yaXphdGlvbiB3YXMgdG91Y2hlZC6ERXhwaXJlZFVzZXJuYW1lUmVzZXJ2YXRpb25SZW1vdmVkCAEgdXNlcm5hbWU5BAEgVXNlcm5hbWUAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEsEFuIGV4cGlyZWQgdXNlcm5hbWUgcmVzZXJ2YXRpb24gd2FzIHJlbW92ZWQuUElkZW50aWZpZXJLZXlVcGRhdGVkBAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBKBBIGNvbnN1bWVyJ3MgaWRlbnRpZmllciBrZXkgd2FzIHVwZGF0ZWQueFVzZXJuYW1lUmVzZXJ2YXRpb25EdXJhdGlvblNldAQBIGR1cmF0aW9uKAEMdTY0AAUEqFRoZSB1c2VybmFtZSByZXNlcnZhdGlvbiBkdXJhdGlvbiB3YXMgc2V0LlBTdG10U3RvcmVTbG90VXBkYXRlZAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAASxzbG90X251bWJlcgwBCHU4AAYEjEEgc3RhdGVtZW50IHN0b3JlIHNsb3Qgd2FzIHVwZGF0ZWQuNFBlcnNvbkRlbW90ZWQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAcE3EEgZnVsbCBwZXJzb24gd2FzIGRlbW90ZWQgZHVlIHRvIGV4cGlyZWQgYXV0aG9yaXphdGlvbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTNBgxsaW5kaXZfcGFsbGV0X2NodW5rc19tYW5hZ2VyGHBhbGxldBRFdmVudAQEVAABCGhDaHVua1BhZ2VIYXNoZXNJbml0aWFsaXplZAgBNHJpbmdfZXhwb25lbnTxBAEwUmluZ0V4cG9uZW50AAEsdG90YWxfcGFnZXM4AQx1MzIAAAQZAUEgbmV3IGNodW5rIHBhZ2UgaGFzaCBzZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKGUuZy4sIGR1cmluZyBnZW5lc2lzKS4sQ2h1bmtzQWRkZWQMATRyaW5nX2V4cG9uZW508QQBMFJpbmdFeHBvbmVudAABLHN0YXJ0X2luZGV4OAEMdTMyAAEUY291bnQ4AQx1MzIAAQQhAU5ldyBjaHVua3MgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byBhbiBleGlzdGluZyBvciBuZXcgY2h1bmsgc2V0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNEGDFBpbmRpdl9wYWxsZXRfbWVtYmVycxhwYWxsZXQURXZlbnQEBFQAASAsTWVtYmVyQWRkZWQEAQxrZXlRBAEsTWVtYmVyT2Y8VD4AAAToQW4gZW50aXR5IGhhcyBoYWQgdGhlaXIgbWVtYmVyc2hpcCByZWNvZ25pc2VkIGFuZCBpbmRleGVkLjRNZW1iZXJSZW1vdmVkBAEMa2V5UQQBLE1lbWJlck9mPFQ+AAEErEFuIGVudGl0eSBoYXMgaGFkIHRoZWlyIG1lbWJlcnNoaXAgcmV2b2tlZC5sQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAgSoQSBjb2xsZWN0aW9uIGhhcyBiZWVuIG1hcmtlZCBmb3IgZGVsZXRpb24uRENvbGxlY3Rpb25EZWxldGVkBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAwSQQSBjb2xsZWN0aW9uIGhhcyBiZWVuIGZ1bGx5IGRlbGV0ZWQuJFJpbmdCdWlsdAgBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAEocmluZ19pbmRleDgBJFJpbmdJbmRleAAEBGhBIHJpbmcgd2FzIGJ1aWx0IG1hbnVhbGx5LkBNZW1iZXJzT25ib2FyZGVkBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIABQSATWVtYmVycyB3ZXJlIG9uYm9hcmRlZCBtYW51YWxseS4sUmluZ3NNZXJnZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABPGJhc2VfcmluZ19pbmRleDgBJFJpbmdJbmRleAABRHRhcmdldF9yaW5nX2luZGV4OAEkUmluZ0luZGV4AAYEWFR3byByaW5ncyB3ZXJlIG1lcmdlZC5ET25ib2FyZGluZ1NpemVTZXQIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABPG9uYm9hcmRpbmdfc2l6ZTgBDHUzMgAHBLRUaGUgb25ib2FyZGluZyBzaXplIHdhcyBzZXQgZm9yIGEgY29sbGVjdGlvbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTVBgxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0FEV2ZW50BARUAAFYJENvaW5TcGxpdAQBMG91dHB1dF9jb3VudDgBDHUzMgAAADxDb2luVHJhbnNmZXJyZWQMAQh0bwQBMFQ6OkFjY291bnRJZAABFHZhbHVlbQMBJENvaW5WYWx1ZQABHG5ld19hZ2UtAwEMdTE2AAEAWFJlY3ljbGVyTG9hZGVkV2l0aENvaW4EARR2YWx1ZW0DASRDb2luVmFsdWUAAgB8UmVjeWNsZXJMb2FkZWRXaXRoRXh0ZXJuYWxBc3NldAwBDHdobwQBMFQ6OkFjY291bnRJZAABFHZhbHVlbQMBJENvaW5WYWx1ZQABGGFtb3VudMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgADAGBSZWN5Y2xlclVubG9hZGVkSW50b0NvaW4QAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X3ZhbHVlbQMBJENvaW5WYWx1ZQABMG91dHB1dF92YWx1ZW0DASRDb2luVmFsdWUAASxpbnB1dF9jb3VudDgBDHUzMgAEAIRSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXQQAQh0bwQBMFQ6OkFjY291bnRJZAABFHZhbHVlbQMBJENvaW5WYWx1ZQABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAUAhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbggBDGZlZcQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgABJGRlc3Ryb3llZMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgAGAIxQYWlkVW5sb2FkVG9rZW5SZWdpc3RlcmVkV2l0aE5hdGl2ZQgBDHdobwQBMFQ6OkFjY291bnRJZAABDGZlZcQBSE5hdGl2ZUJhbGFuY2VPZjxUPgAHAIxQYWlkVW5sb2FkVG9rZW5SZWdpc3RlcmVkV2l0aFN0YWJsZQgBDHdobwQBMFQ6OkFjY291bnRJZAABDGZlZcQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgAIAHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAQBGHBlcmlvZDgBGFBlcmlvZAAJAIRMaXRlUGVvcGxlRnJlZVVubG9hZFRva2VuQ29uc3VtZWQEARhwZXJpb2Q4ARhQZXJpb2QACgBkUmVjeWNsZXJzVW5sb2FkZWRJbnRvQ29pbgwBCHRvBAEwVDo6QWNjb3VudElkAAEwb3V0cHV0X3ZhbHVlbQMBJENvaW5WYWx1ZQABLGlucHV0X2NvdW50OAEMdTMyAAsAiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQMAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAwAuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMUAQx3aG8EATBUOjpBY2NvdW50SWQAAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAEwZmVlX2N1cnJlbmN5FQUBLEZlZUN1cnJlbmN5AA0AZFJlY3ljbGVyVW5sb2FkZWRJbnRvQ29pbnMEATBvdXRwdXRfY291bnQ4AQx1MzIADgB8Q29pbk9mZmJvYXJkZWRJbnRvRXh0ZXJuYWxBc3NldAwBCHRvBAEwVDo6QWNjb3VudElkAAEUdmFsdWVtAwEkQ29pblZhbHVlAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AA8APFJlY3ljbGVyQ2xlYW5lZAwBFHZhbHVlbQMBJENvaW5WYWx1ZQABPHJlbWFpbmluZ19jb2luczgBDHUzMgABQGRlc3Ryb3llZF9hbW91bnTEAVRGdW5naWJsZXNCYWxhbmNlT2Y8VD4AEABkQ29uc3VtZWRGcmVlVG9rZW5zQ2xlYW5lZAQBGHBlcmlvZDgBGFBlcmlvZAARAGhQYWlkVW5sb2FkVG9rZW5SaW5nQ2xlYW5lZAgBGHBlcmlvZDgBGFBlcmlvZAABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAEgBMUmVjeWNsZXJEdXN0Q2xlYW5lZAATAGhQYWlkVW5sb2FkVG9rZW5EdXN0Q2xlYW5lZAAUAJxFeHBpcmVkUGFpZFVubG9hZFRva2VuQ29sbGVjdGlvbkRlbGV0ZWQEARhwZXJpb2Q4ARhQZXJpb2QAFQAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTZBgyMaW5kaXZfcGFsbGV0X3N0b3JhZ2VfaW5pdGlhbGl6YXRpb24YcGFsbGV0FEV2ZW50BARUAAFAMEFzc2V0Q3JlYXRlZAAABNBUaGUgZm9yZWlnbiBhc3NldCB3YXMgY3JlYXRlZCBhbmQgcmVzZXJ2ZXMgd2VyZSBzZXQuUFhjbUZ1bmRzVHJhbnNmZXJTZW50AAEEsEFuIFhDTSBmdW5kcyB0cmFuc2ZlciB3YXMgc2VudCB0byBBc3NldCBIdWIuYFhjbUZ1bmRzVHJhbnNmZXJUaW1lZE91dAACBLxUaGUgWENNIHRyYW5zZmVyIHRpbWVkIG91dCBhbmQgd2lsbCBiZSByZXRyaWVkLjRGdW5kc1ZlcmlmaWVkAAMElFRyYW5zZmVycmVkIGZ1bmRzIGhhdmUgYmVlbiB2ZXJpZmllZC4oUG90c0Z1bmRlZAAEBGhBbGwgcG90cyBoYXZlIGJlZW4gZnVuZGVkLlxNb2JSdWxlUGF5b3V0c1NjaGVkdWxlZAAFBJhNb2IgUnVsZSBwYXlvdXQgc2NoZWR1bGUgaGFzIGJlZW4gc2V0LlRTY29yZVBheW91dHNTY2hlZHVsZWQABgSMU2NvcmUgcGF5b3V0IHNjaGVkdWxlIGhhcyBiZWVuIHNldC50T25Qb2xsSW5pdGlhbGl6YXRpb25Db21wbGV0ZWQABwSkVGhlIG9uX3BvbGwgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5kTWlncmF0aW9uUGVvcGxlUmVjb2duaXplZAAIBLxNaWdyYXRpb246IGluaXRpYWwgcGVvcGxlIGhhdmUgYmVlbiByZWNvZ25pemVkLmhNaWdyYXRpb25PbmJvYXJkaW5nU2l6ZVNldAAJBKBNaWdyYXRpb246IG9uYm9hcmRpbmcgc2l6ZSBoYXMgYmVlbiBzZXQueE1pZ3JhdGlvblByb29mT2ZJbmtJbml0aWFsaXplZAAKBNBNaWdyYXRpb246IFByb29mLW9mLUluayBwYWxsZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXE1pZ3JhdGlvbkdhbWVzU2NoZWR1bGVkAAsElE1pZ3JhdGlvbjogZ2FtZXMgaGF2ZSBiZWVuIHNjaGVkdWxlZC5cTWlncmF0aW9uSW52aXRlc0dyYW50ZWQADASUTWlncmF0aW9uOiBpbnZpdGVzIGhhdmUgYmVlbiBncmFudGVkLnxNaWdyYXRpb25SZWltYnVyc2VtZW50VmFsdWVzU2V0AA0E7E1pZ3JhdGlvbjogUHJvb2Ytb2YtSW5rIHJlaW1idXJzZW1lbnQgdmFsdWVzIGhhdmUgYmVlbiBzZXQuhE1pZ3JhdGlvbkF0dGVzdGF0aW9uQWxsb3dhbmNlc1NldAAOBPBNaWdyYXRpb246IFBlb3BsZSBMaXRlIGF0dGVzdGF0aW9uIGFsbG93YW5jZXMgaGF2ZSBiZWVuIHNldC5ITWlncmF0aW9uQ29tcGxldGVkAA8EGQFNaWdyYXRpb24gaGFzIGNvbXBsZXRlZCBhbmQgb25fcG9sbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV03QYMoGluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGUYcGFsbGV0FEV2ZW50BARUAAEEXEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAAEEQFBdHRlc3RhdGlvbiBhbGxvd2FuY2VzIGhhdmUgYmVlbiBzZXQgYW5kIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldOEGDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQURXZlbnQEBFQAATRUUGFydGljaXBhbnRSZWdpc3RlcmVkDAEgZXZlbnRfaWQ4ARxFdmVudElkAAE4cGFydGljaXBhbnRfaWQ4ATRQYXJ0aWNpcGFudElkAAEUYWxpYXMIARRBbGlhcwAABJhBIHBhcnRpY2lwYW50IHJlZ2lzdGVyZWQgZm9yIGFuIGV2ZW50LjBFdmVudFN0YXJ0ZWQIAQhpZDgBHEV2ZW50SWQAARRldmVudCEFAURBaXJkcm9wUHJpemVPZjxUPgABBFRUaGUgZXZlbnQgaXMgc3RhcnRlZC4wRXZlbnRTa2lwcGVkCAEIaWQ4ARxFdmVudElkAAEUZXZlbnQhBQFEQWlyZHJvcFByaXplT2Y8VD4AAgR8VGhlIHNjaGVkdWxlZCBldmVudCBpcyBza2lwcGVkLjhFdmVudFNjaGVkdWxlZAQBIGV2ZW50X2lkOAEcRXZlbnRJZAADBFxBbiBldmVudCB3YXMgc2NoZWR1bGVkLlRTY2hlZHVsZWRFdmVudFJlbW92ZWQEASBldmVudF9pZDgBHEV2ZW50SWQABAR4QSBzY2hlZHVsZWQgZXZlbnQgd2FzIHJlbW92ZWQuaEZhaWxlZFRyYW5zZmVyUHJpemVDbGFpbWVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEgZXZlbnRfaWQ4ARxFdmVudElkAAUEkEEgZmFpbGVkIHRyYW5zZmVyIHByaXplIHdhcyBjbGFpbWVkLmBXYWl0aW5nRm9yRW50cm9weVRvQnVpbGQEASBldmVudF9pZDgBHEV2ZW50SWQABgTcVGhlIGV2ZW50IHRyYW5zaXRpb25lZCB0byB3YWl0aW5nIGZvciBlbnRyb3B5IHRvIGJ1aWxkLjhEcmF3aW5nV2lubmVycwQBIGV2ZW50X2lkOAEcRXZlbnRJZAAHBKhUaGUgZXZlbnQgdHJhbnNpdGlvbmVkIHRvIGRyYXdpbmcgd2lubmVycy4wRGlzdHJpYnV0aW5nBAEgZXZlbnRfaWQ4ARxFdmVudElkAAgEuFRoZSBldmVudCB0cmFuc2l0aW9uZWQgdG8gZGlzdHJpYnV0aW5nIHByaXplcy5AUHJpemVEaXN0cmlidXRlZBABIGV2ZW50X2lkOAEcRXZlbnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABMEFzc2V0SWRPZjxUPgABMGFzc2V0X2Ftb3VudMQBREFzc2V0QmFsYW5jZU9mPFQ+AAkEkEEgcHJpemUgd2FzIGRpc3RyaWJ1dGVkIHRvIGEgd2lubmVyLlxQcml6ZURpc3RyaWJ1dGlvbkZhaWxlZBABIGV2ZW50X2lkOAEcRXZlbnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABMEFzc2V0SWRPZjxUPgABMGFzc2V0X2Ftb3VudMQBREFzc2V0QmFsYW5jZU9mPFQ+AAoEsEEgcHJpemUgdHJhbnNmZXIgZmFpbGVkIGR1cmluZyBkaXN0cmlidXRpb24uPENsZWFyaW5nU3RvcmFnZQQBIGV2ZW50X2lkOAEcRXZlbnRJZAALBKxUaGUgZXZlbnQgdHJhbnNpdGlvbmVkIHRvIGNsZWFyaW5nIHN0b3JhZ2UuOEV2ZW50Q29tcGxldGVkBAEgZXZlbnRfaWQ4ARxFdmVudElkAAwEpFRoZSBldmVudCBoYXMgY29tcGxldGVkIGFuZCBiZWVuIHJlbW92ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV05QYMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBRFdmVudAQEVAABIDhVcGdyYWRlU3RhcnRlZAQBKG1pZ3JhdGlvbnM4AQx1MzIQ0FRoZSBudW1iZXIgb2YgbWlncmF0aW9ucyB0aGF0IHRoaXMgdXBncmFkZSBjb250YWlucy4AQQFUaGlzIGNhbiBiZSB1c2VkIHRvIGRlc2lnbiBhIHByb2dyZXNzIGluZGljYXRvciBpbiBjb21iaW5hdGlvbiB3aXRoIGNvdW50aW5nIHRoZcxgTWlncmF0aW9uQ29tcGxldGVkYCBhbmQgYE1pZ3JhdGlvblNraXBwZWRgIGV2ZW50cy4ADGhBIFJ1bnRpbWUgdXBncmFkZSBzdGFydGVkLgD4SXRzIGVuZCBpcyBpbmRpY2F0ZWQgYnkgYFVwZ3JhZGVDb21wbGV0ZWRgIG9yIGBVcGdyYWRlRmFpbGVkYC5AVXBncmFkZUNvbXBsZXRlZAABDJhUaGUgY3VycmVudCBydW50aW1lIHVwZ3JhZGUgY29tcGxldGVkLgAdAVRoaXMgaW1wbGllcyB0aGF0IGFsbCBvZiBpdHMgbWlncmF0aW9ucyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFzIHdlbGwuNFVwZ3JhZGVGYWlsZWQAAgxcUnVudGltZSB1cGdyYWRlIGZhaWxlZC4A6FRoaXMgaXMgdmVyeSBiYWQgYW5kIHdpbGwgcmVxdWlyZSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi5ATWlncmF0aW9uU2tpcHBlZAQBFGluZGV4OAEMdTMyBCkBVGhlIGluZGV4IG9mIHRoZSBza2lwcGVkIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4DBAkBQSBtaWdyYXRpb24gd2FzIHNraXBwZWQgc2luY2UgaXQgd2FzIGFscmVhZHkgZXhlY3V0ZWQgaW4gdGhlIHBhc3QuRE1pZ3JhdGlvbkFkdmFuY2VkCAEUaW5kZXg4AQx1MzIECQFUaGUgaW5kZXggb2YgdGhlIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4BEHRvb2s4AURCbG9ja051bWJlckZvcjxUPgTUVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB0aGlzIG1pZ3JhdGlvbiB0b29rIHNvIGZhci4EBFxBIG1pZ3JhdGlvbiBwcm9ncmVzc2VkLkhNaWdyYXRpb25Db21wbGV0ZWQIARRpbmRleDgBDHUzMgQJAVRoZSBpbmRleCBvZiB0aGUgbWlncmF0aW9uIHdpdGhpbiB0aGUgW2BDb25maWc6Ok1pZ3JhdGlvbnNgXSBsaXN0LgEQdG9vazgBREJsb2NrTnVtYmVyRm9yPFQ+BNRUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHRoaXMgbWlncmF0aW9uIHRvb2sgc28gZmFyLgUEWEEgTWlncmF0aW9uIGNvbXBsZXRlZC48TWlncmF0aW9uRmFpbGVkCAEUaW5kZXg4AQx1MzIECQFUaGUgaW5kZXggb2YgdGhlIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4BEHRvb2s4AURCbG9ja051bWJlckZvcjxUPgTUVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB0aGlzIG1pZ3JhdGlvbiB0b29rIHNvIGZhci4GDExBIE1pZ3JhdGlvbiBmYWlsZWQuAE0BVGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdob2xlIHVwZ3JhZGUgZmFpbGVkIGFuZCBnb3Zlcm5hbmNlIGludGVydmVudGlvbiBpcyByZXF1aXJlZC48SGlzdG9yaWNDbGVhcmVkBAEsbmV4dF9jdXJzb3JJBQE8T3B0aW9uPFZlYzx1OD4+BOhTaG91bGQgYmUgcGFzc2VkIHRvIGBjbGVhcl9oaXN0b3JpY2AgaW4gYSBzdWNjZXNzaXZlIGNhbGwuBwTIVGhlIHNldCBvZiBoaXN0b3JpY2FsIG1pZ3JhdGlvbnMgaGFzIGJlZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTpBggwZnJhbWVfc3lzdGVtFFBoYXNlAAEMOEFwcGx5RXh0cmluc2ljBAA4AQx1MzIAAAAwRmluYWxpemF0aW9uAAEAOEluaXRpYWxpemF0aW9uAAIAAO0GAAACPADxBgAAAvUGAPUGAAAECDg4APkGCDBmcmFtZV9zeXN0ZW1YTGFzdFJ1bnRpbWVVcGdyYWRlSW5mbwAACAEwc3BlY192ZXJzaW9uYAFMY29kZWM6OkNvbXBhY3Q8dTMyPgABJHNwZWNfbmFtZf0GAURDb3c8J3N0YXRpYywgc3RyPgAA/QYEDENvdwQEVAEBBwAEAAEHAAAAAQcAAAUCAAUHCDBmcmFtZV9zeXN0ZW1gQ29kZVVwZ3JhZGVBdXRob3JpemF0aW9uBARUAAAIASRjb2RlX2hhc2g8ARxUOjpIYXNoAAE0Y2hlY2tfdmVyc2lvbsgBEGJvb2wAAAkHDDBmcmFtZV9zeXN0ZW0YbGltaXRzMEJsb2NrV2VpZ2h0cwAADAEoYmFzZV9ibG9ja9UBARhXZWlnaHQAASRtYXhfYmxvY2vVAQEYV2VpZ2h0AAEkcGVyX2NsYXNzDQcBhFBlckRpc3BhdGNoQ2xhc3M8V2VpZ2h0c1BlckNsYXNzPgAADQcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAERBwAMARhub3JtYWwRBwEEVAABLG9wZXJhdGlvbmFsEQcBBFQAASRtYW5kYXRvcnkRBwEEVAAAEQcMMGZyYW1lX3N5c3RlbRhsaW1pdHM8V2VpZ2h0c1BlckNsYXNzAAAQAThiYXNlX2V4dHJpbnNpY9UBARhXZWlnaHQAATRtYXhfZXh0cmluc2ljpQIBOE9wdGlvbjxXZWlnaHQ+AAEkbWF4X3RvdGFspQIBOE9wdGlvbjxXZWlnaHQ+AAEgcmVzZXJ2ZWSlAgE4T3B0aW9uPFdlaWdodD4AABUHDDBmcmFtZV9zeXN0ZW0YbGltaXRzLEJsb2NrTGVuZ3RoAAAEAQxtYXgZBwFUUGVyRGlzcGF0Y2hDbGFzczx1MzI+AAAZBww0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUATgADAEYbm9ybWFsOAEEVAABLG9wZXJhdGlvbmFsOAEEVAABJG1hbmRhdG9yeTgBBFQAAB0HCChzcF93ZWlnaHRzPFJ1bnRpbWVEYldlaWdodAAACAEQcmVhZCgBDHU2NAABFHdyaXRlKAEMdTY0AAAhBwgoc3BfdmVyc2lvbjhSdW50aW1lVmVyc2lvbgAAIAEkc3BlY19uYW1l/QYBRENvdzwnc3RhdGljLCBzdHI+AAEkaW1wbF9uYW1l/QYBRENvdzwnc3RhdGljLCBzdHI+AAFEYXV0aG9yaW5nX3ZlcnNpb244AQx1MzIAATBzcGVjX3ZlcnNpb244AQx1MzIAATBpbXBsX3ZlcnNpb244AQx1MzIAARBhcGlzJQcBHEFwaXNWZWMAAUx0cmFuc2FjdGlvbl92ZXJzaW9uOAEMdTMyAAE4c3lzdGVtX3ZlcnNpb24MAQh1OAAAJQcEDENvdwQEVAEpBwAEACkHAAAAKQcAAAItBwAtBwAABAi9ATgAMQcMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXJyb3IEBFQAASQ8SW52YWxpZFNwZWNOYW1lAAAIEQFUaGUgbmFtZSBvZiBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLmhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQABCEEBVGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpcyBub3QgYWxsb3dlZCB0byBkZWNyZWFzZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS50RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAgzsRmFpbGVkIHRvIGV4dHJhY3QgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIHRoZSBuZXcgcnVudGltZS4ACQFFaXRoZXIgY2FsbGluZyBgQ29yZV92ZXJzaW9uYCBvciBkZWNvZGluZyBgUnVudGltZVZlcnNpb25gIGZhaWxlZC5MTm9uRGVmYXVsdENvbXBvc2l0ZQADBPxTdWljaWRlIGNhbGxlZCB3aGVuIHRoZSBhY2NvdW50IGhhcyBub24tZGVmYXVsdCBjb21wb3NpdGUgZGF0YS48Tm9uWmVyb1JlZkNvdW50AAQENQFUaGVyZSBpcyBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCBwcmV2ZW50aW5nIHRoZSBhY2NvdW50IGZyb20gYmVpbmcgcHVyZ2VkLjBDYWxsRmlsdGVyZWQABQTQVGhlIG9yaWdpbiBmaWx0ZXIgcHJldmVudCB0aGUgY2FsbCB0byBiZSBkaXNwYXRjaGVkLmxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcABgRVAUEgbXVsdGktYmxvY2sgbWlncmF0aW9uIGlzIG9uZ29pbmcgYW5kIHByZXZlbnRzIHRoZSBjdXJyZW50IGNvZGUgZnJvbSBiZWluZyByZXBsYWNlZC5ETm90aGluZ0F1dGhvcml6ZWQABwRYTm8gdXBncmFkZSBhdXRob3JpemVkLjBVbmF1dGhvcml6ZWQACASUVGhlIHN1Ym1pdHRlZCBjb2RlIGlzIG5vdCBhdXRob3JpemVkLgRsRXJyb3IgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0NQcMKHNwX3J1bnRpbWUYdHJhaXRzLEJsYWtlVHdvMjU2AAAAADkHEChzcF9ydW50aW1lHGdlbmVyaWMUYmxvY2sUQmxvY2sIGEhlYWRlcgFcJEV4dHJpbnNpYwE9BwAIARhoZWFkZXJcARhIZWFkZXIAAShleHRyaW5zaWNzTQcBOFZlYzxFeHRyaW5zaWM+AAA9BxAoc3BfcnVudGltZRxnZW5lcmljTHVuY2hlY2tlZF9leHRyaW5zaWNIVW5jaGVja2VkRXh0cmluc2ljEBxBZGRyZXNzAQAQQ2FsbAEgJFNpZ25hdHVyZQEtBBRFeHRyYQFBBwAEABgAAABBBwh0Y3VtdWx1c19wYWxsZXRfd2VpZ2h0X3JlY2xhaW1QU3RvcmFnZVdlaWdodFJlY2xhaW0IBFQABFMBRQcABABFBwEEUwAARQcAAAQoSQelBakFrQWxBbUFuQXBBcUFyQUASQcAAAQgTQVRBV0FaQV1BYEFjQWhBQBNBwAAAj0HAFEHAAACVQcAVQcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IdW5pbmNsdWRlZF9zZWdtZW50IEFuY2VzdG9yBARIATwADAE4dXNlZF9iYW5kd2lkdGhZBwE0VXNlZEJhbmR3aWR0aAABOHBhcmFfaGVhZF9oYXNobQcBJE9wdGlvbjxIPgABYGNvbnN1bWVkX2dvX2FoZWFkX3NpZ25hbHEHAYxPcHRpb248cmVsYXlfY2hhaW46OlVwZ3JhZGVHb0FoZWFkPgAAWQcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IdW5pbmNsdWRlZF9zZWdtZW50NFVzZWRCYW5kd2lkdGgAAAwBNHVtcF9tc2dfY291bnQ4AQx1MzIAATx1bXBfdG90YWxfYnl0ZXM4AQx1MzIAATRocm1wX291dGdvaW5nXQcBjEJUcmVlTWFwPFBhcmFJZCwgSHJtcENoYW5uZWxVcGRhdGU+AABdBwQgQlRyZWVNYXAIBEsBnARWAWEHAAQAZQcAAABhBwx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUh1bmluY2x1ZGVkX3NlZ21lbnRESHJtcENoYW5uZWxVcGRhdGUAAAgBJG1zZ19jb3VudDgBDHUzMgABLHRvdGFsX2J5dGVzOAEMdTMyAABlBwAAAmkHAGkHAAAECJxhBwBtBwQYT3B0aW9uBARUATwBCBBOb25lAAAAEFNvbWUEADwAAAEAAHEHBBhPcHRpb24EBFQBdQcBCBBOb25lAAAAEFNvbWUEAHUHAAABAAB1BwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OThVcGdyYWRlR29BaGVhZAABCBRBYm9ydAAAABxHb0FoZWFkAAEAAHkHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHVuaW5jbHVkZWRfc2VnbWVudDhTZWdtZW50VHJhY2tlcgQESAE8AAwBOHVzZWRfYmFuZHdpZHRoWQcBNFVzZWRCYW5kd2lkdGgAAThocm1wX3dhdGVybWFyawkDAYBPcHRpb248cmVsYXlfY2hhaW46OkJsb2NrTnVtYmVyPgABYGNvbnN1bWVkX2dvX2FoZWFkX3NpZ25hbHEHAYxPcHRpb248cmVsYXlfY2hhaW46OlVwZ3JhZGVHb0FoZWFkPgAAfQcEGE9wdGlvbgQEVAGBBwEIEE5vbmUAAAAQU29tZQQAgQcAAAEAAIEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY5SFVwZ3JhZGVSZXN0cmljdGlvbgABBBxQcmVzZW50AAAAAIUHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtUHJlbGF5X3N0YXRlX3NuYXBzaG90WE1lc3NhZ2luZ1N0YXRlU25hcHNob3QAABABMGRtcV9tcWNfaGVhZDwBRHJlbGF5X2NoYWluOjpIYXNoAAGccmVsYXlfZGlzcGF0Y2hfcXVldWVfcmVtYWluaW5nX2NhcGFjaXR5iQcBjFJlbGF5RGlzcGF0Y2hRdWV1ZVJlbWFpbmluZ0NhcGFjaXR5AAFAaW5ncmVzc19jaGFubmVsc40HAYhWZWM8KFBhcmFJZCwgQWJyaWRnZWRIcm1wQ2hhbm5lbCk+AAE8ZWdyZXNzX2NoYW5uZWxzjQcBiFZlYzwoUGFyYUlkLCBBYnJpZGdlZEhybXBDaGFubmVsKT4AAIkHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtUHJlbGF5X3N0YXRlX3NuYXBzaG90jFJlbGF5RGlzcGF0Y2hRdWV1ZVJlbWFpbmluZ0NhcGFjaXR5AAAIATxyZW1haW5pbmdfY291bnQ4AQx1MzIAAThyZW1haW5pbmdfc2l6ZTgBDHUzMgAAjQcAAAKRBwCRBwAABAiclQcAlQcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjlMQWJyaWRnZWRIcm1wQ2hhbm5lbAAAGAEwbWF4X2NhcGFjaXR5OAEMdTMyAAE4bWF4X3RvdGFsX3NpemU4AQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplOAEMdTMyAAEkbXNnX2NvdW50OAEMdTMyAAEodG90YWxfc2l6ZTgBDHUzMgABIG1xY19oZWFkbQcBME9wdGlvbjxIYXNoPgAAmQcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjlkQWJyaWRnZWRIb3N0Q29uZmlndXJhdGlvbgAAKAE0bWF4X2NvZGVfc2l6ZTgBDHUzMgABSG1heF9oZWFkX2RhdGFfc2l6ZTgBDHUzMgABWG1heF91cHdhcmRfcXVldWVfY291bnQ4AQx1MzIAAVRtYXhfdXB3YXJkX3F1ZXVlX3NpemU4AQx1MzIAAVxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZTgBDHUzMgABkG1heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZTgBDHUzMgABiGhybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGU4AQx1MzIAAWx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd244ASxCbG9ja051bWJlcgABYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheTgBLEJsb2NrTnVtYmVyAAFQYXN5bmNfYmFja2luZ19wYXJhbXOdBwFIQXN5bmNCYWNraW5nUGFyYW1zAACdBxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OTRhc3luY19iYWNraW5nSEFzeW5jQmFja2luZ1BhcmFtcwAACAFMbWF4X2NhbmRpZGF0ZV9kZXB0aDgBDHUzMgABUGFsbG93ZWRfYW5jZXN0cnlfbGVuOAEMdTMyAAChBwiUY3VtdWx1c19wcmltaXRpdmVzX3BhcmFjaGFpbl9pbmhlcmVudERNZXNzYWdlUXVldWVDaGFpbgAABAA8ASRSZWxheUhhc2gAAKUHBCBCVHJlZU1hcAgESwGcBFYBoQcABACpBwAAAKkHAAACrQcArQcAAAQInKEHALEHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudEBJbmJvdW5kTWVzc2FnZUlkAAAIARxzZW50X2F0OAEsQmxvY2tOdW1iZXIAASxyZXZlcnNlX2lkeDgBDHUzMgAAtQcAAAK5BwC5BwhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAZwACAEkcmVjaXBpZW50nAEISWQAARBkYXRhGAFMYWxsb2M6OnZlYzo6VmVjPHU4PgAAvQcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW0YcGFsbGV0FEVycm9yBARUAAEYTE92ZXJsYXBwaW5nVXBncmFkZXMAAAQZAUF0dGVtcHQgdG8gdXBncmFkZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHdoaWxlIGV4aXN0aW5nIHVwZ3JhZGUgcGVuZGluZy5QUHJvaGliaXRlZEJ5UG9sa2Fkb3QAAQRNAVBvbGthZG90IGN1cnJlbnRseSBwcm9oaWJpdHMgdGhpcyBwYXJhY2hhaW4gZnJvbSB1cGdyYWRpbmcgaXRzIHZhbGlkYXRpb24gZnVuY3Rpb24uGFRvb0JpZwACCEUBVGhlIHN1cHBsaWVkIHZhbGlkYXRpb24gZnVuY3Rpb24gaGFzIGNvbXBpbGVkIGludG8gYSBibG9iIGxhcmdlciB0aGFuIFBvbGthZG90IGlzPHdpbGxpbmcgdG8gcnVuLmhWYWxpZGF0aW9uRGF0YU5vdEF2YWlsYWJsZQADBB0BVGhlIGluaGVyZW50IHdoaWNoIHN1cHBsaWVzIHRoZSB2YWxpZGF0aW9uIGRhdGEgZGlkIG5vdCBydW4gdGhpcyBibG9jay50SG9zdENvbmZpZ3VyYXRpb25Ob3RBdmFpbGFibGUABAQpAVRoZSBpbmhlcmVudCB3aGljaCBzdXBwbGllcyB0aGUgaG9zdCBjb25maWd1cmF0aW9uIGRpZCBub3QgcnVuIHRoaXMgYmxvY2suME5vdFNjaGVkdWxlZAAFBNhObyB2YWxpZGF0aW9uIGZ1bmN0aW9uIHVwZ3JhZGUgaXMgY3VycmVudGx5IHNjaGVkdWxlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuwQcMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHFBwRTAAAEAM0HARhWZWM8VD4AAMUHDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQmFsYW5jZUxvY2sEHEJhbGFuY2UBxAAMAQhpZL0BAThMb2NrSWRlbnRpZmllcgABGGFtb3VudMQBHEJhbGFuY2UAARxyZWFzb25zyQcBHFJlYXNvbnMAAMkHDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMcUmVhc29ucwABDAxGZWUAAAAQTWlzYwABAAxBbGwAAgAAzQcAAALFBwDRBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAdUHBFMAAAQA2QcBGFZlYzxUPgAA1QcMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxSZXNlcnZlRGF0YQhEUmVzZXJ2ZUlkZW50aWZpZXIBvQEcQmFsYW5jZQHEAAgBCGlkvQEBRFJlc2VydmVJZGVudGlmaWVyAAEYYW1vdW50xAEcQmFsYW5jZQAA2QcAAALVBwDdBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeEHBFMAAAQA5QcBGFZlYzxUPgAA4QcUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAEhBhxCYWxhbmNlAcQACAEIaWQhBgEISWQAARhhbW91bnTEARxCYWxhbmNlAADlBwAAAuEHAOkHDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB7QcEUwAABADxBwEYVmVjPFQ+AADtBxQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkARAcQmFsYW5jZQHEAAgBCGlkEAEISWQAARhhbW91bnTEARxCYWxhbmNlAADxBwAAAu0HAPUHDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC75BwhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQgUmVsZWFzZXMAAQgkVjFBbmNpZW50AAAACFYyAAEAAP0HEDRmcmFtZV9zdXBwb3J0GHRyYWl0cxxzdG9yYWdlGE5vRHJvcAQEVAEBCAAEAAEIAQRUAAABCBg0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zIGZ1bmdpYmxlJGltYmFsYW5jZSRJbWJhbGFuY2UMBEIBxBhPbkRyb3AAOE9wcG9zaXRlT25Ecm9wAAAEARhhbW91bnTEAQRCAAAFCAx8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbhhwYWxsZXQUVXNhZ2UIHEJhbGFuY2UBxCxCbG9ja051bWJlcgE4AAgBEHVzZWTEARxCYWxhbmNlAAEgYXRfYmxvY2s4ASxCbG9ja051bWJlcgAACQgMfGluZGl2X3BhbGxldF9vcmlnaW5fcmVzdHJpY3Rpb24YcGFsbGV0FEVycm9yBARUAAEIHE5vVXNhZ2UAAASAVGhlIG9yaWdpbiBoYXMgbm8gdXNhZ2UgdHJhY2tlZC4cTm90WmVybwABBFhUaGUgdXNhZ2UgaXMgbm90IHplcm8uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lg0IDDRwYWxsZXRfYXNzZXRzFHR5cGVzMEFzc2V0RGV0YWlscwwcQmFsYW5jZQHEJEFjY291bnRJZAEEOERlcG9zaXRCYWxhbmNlAcQAMAEUb3duZXIEASRBY2NvdW50SWQAARhpc3N1ZXIEASRBY2NvdW50SWQAARRhZG1pbgQBJEFjY291bnRJZAABHGZyZWV6ZXIEASRBY2NvdW50SWQAARhzdXBwbHnEARxCYWxhbmNlAAEcZGVwb3NpdMQBOERlcG9zaXRCYWxhbmNlAAEsbWluX2JhbGFuY2XEARxCYWxhbmNlAAE0aXNfc3VmZmljaWVudMgBEGJvb2wAASBhY2NvdW50czgBDHUzMgABLHN1ZmZpY2llbnRzOAEMdTMyAAEkYXBwcm92YWxzOAEMdTMyAAEYc3RhdHVzEQgBLEFzc2V0U3RhdHVzAAARCAw0cGFsbGV0X2Fzc2V0cxR0eXBlcyxBc3NldFN0YXR1cwABDBBMaXZlAAAAGEZyb3plbgABAChEZXN0cm95aW5nAAIAABUIAAAECOAEABkIDDRwYWxsZXRfYXNzZXRzFHR5cGVzMEFzc2V0QWNjb3VudBAcQmFsYW5jZQHEOERlcG9zaXRCYWxhbmNlAcQURXh0cmEBECRBY2NvdW50SWQBBAAQARxiYWxhbmNlxAEcQmFsYW5jZQABGHN0YXR1cx0IATRBY2NvdW50U3RhdHVzAAEYcmVhc29uIQgBqEV4aXN0ZW5jZVJlYXNvbjxEZXBvc2l0QmFsYW5jZSwgQWNjb3VudElkPgABFGV4dHJhEAEURXh0cmEAAB0IDDRwYWxsZXRfYXNzZXRzFHR5cGVzNEFjY291bnRTdGF0dXMAAQwYTGlxdWlkAAAAGEZyb3plbgABABxCbG9ja2VkAAIAACEIDDRwYWxsZXRfYXNzZXRzFHR5cGVzPEV4aXN0ZW5jZVJlYXNvbggcQmFsYW5jZQHEJEFjY291bnRJZAEEARQgQ29uc3VtZXIAAAAoU3VmZmljaWVudAABACxEZXBvc2l0SGVsZAQAxAEcQmFsYW5jZQACADxEZXBvc2l0UmVmdW5kZWQAAwAsRGVwb3NpdEZyb20IAAQBJEFjY291bnRJZAAAxAEcQmFsYW5jZQAEAAAlCAAABAzgBAQAKQgMNHBhbGxldF9hc3NldHMUdHlwZXMgQXBwcm92YWwIHEJhbGFuY2UBxDhEZXBvc2l0QmFsYW5jZQHEAAgBGGFtb3VudMQBHEJhbGFuY2UAARxkZXBvc2l0xAE4RGVwb3NpdEJhbGFuY2UAAC0IDDRwYWxsZXRfYXNzZXRzFHR5cGVzNEFzc2V0TWV0YWRhdGEIOERlcG9zaXRCYWxhbmNlAcQ0Qm91bmRlZFN0cmluZwExCAAUARxkZXBvc2l0xAE4RGVwb3NpdEJhbGFuY2UAARBuYW1lMQgBNEJvdW5kZWRTdHJpbmcAARhzeW1ib2wxCAE0Qm91bmRlZFN0cmluZwABIGRlY2ltYWxzDAEIdTgAASRpc19mcm96ZW7IARBib29sAAAxCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQwEUwAABAAYARhWZWM8VD4AADUIDDRwYWxsZXRfYXNzZXRzGHBhbGxldBRFcnJvcggEVAAESQABYChCYWxhbmNlTG93AAAEFQFBY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRyYW5zZmVyIGFtb3VudC4kTm9BY2NvdW50AAEEkFRoZSBhY2NvdW50IHRvIGFsdGVyIGRvZXMgbm90IGV4aXN0LjBOb1Blcm1pc3Npb24AAgToVGhlIHNpZ25pbmcgYWNjb3VudCBoYXMgbm8gcGVybWlzc2lvbiB0byBkbyB0aGUgb3BlcmF0aW9uLhxVbmtub3duAAMEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLhhGcm96ZW4ABAR0VGhlIG9yaWdpbiBhY2NvdW50IGlzIGZyb3plbi4USW5Vc2UABQR4VGhlIGFzc2V0IElEIGlzIGFscmVhZHkgdGFrZW4uKEJhZFdpdG5lc3MABgRsSW52YWxpZCB3aXRuZXNzIGRhdGEgZ2l2ZW4uOE1pbkJhbGFuY2VaZXJvAAcEjE1pbmltdW0gYmFsYW5jZSBzaG91bGQgYmUgbm9uLXplcm8uTFVuYXZhaWxhYmxlQ29uc3VtZXIACAxZAVVuYWJsZSB0byBpbmNyZW1lbnQgdGhlIGNvbnN1bWVyIHJlZmVyZW5jZSBjb3VudGVycyBvbiB0aGUgYWNjb3VudC4gRWl0aGVyIG5vIHByb3ZpZGVyTQFyZWZlcmVuY2UgZXhpc3RzIHRvIGFsbG93IGEgbm9uLXplcm8gYmFsYW5jZSBvZiBhIG5vbi1zZWxmLXN1ZmZpY2llbnQgYXNzZXQsIG9yIG9uZfBmZXdlciB0aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdW1lcnMgaGFzIGJlZW4gcmVhY2hlZC4sQmFkTWV0YWRhdGEACQRcSW52YWxpZCBtZXRhZGF0YSBnaXZlbi4oVW5hcHByb3ZlZAAKBMRObyBhcHByb3ZhbCBleGlzdHMgdGhhdCB3b3VsZCBhbGxvdyB0aGUgdHJhbnNmZXIuIFdvdWxkRGllAAsENQFUaGUgc291cmNlIGFjY291bnQgd291bGQgbm90IHN1cnZpdmUgdGhlIHRyYW5zZmVyIGFuZCBpdCBuZWVkcyB0byBzdGF5IGFsaXZlLjRBbHJlYWR5RXhpc3RzAAwEhFRoZSBhc3NldC1hY2NvdW50IGFscmVhZHkgZXhpc3RzLiROb0RlcG9zaXQADQTUVGhlIGFzc2V0LWFjY291bnQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZGVwb3NpdC4kV291bGRCdXJuAA4ExFRoZSBvcGVyYXRpb24gd291bGQgcmVzdWx0IGluIGZ1bmRzIGJlaW5nIGJ1cm5lZC4kTGl2ZUFzc2V0AA8IWQFUaGUgYXNzZXQgaXMgYSBsaXZlIGFzc2V0IGFuZCBpcyBhY3RpdmVseSBiZWluZyB1c2VkLiBVc3VhbGx5IGVtaXQgZm9yIG9wZXJhdGlvbnMgc3VjaB0BYXMgYHN0YXJ0X2Rlc3Ryb3lgIHdoaWNoIHJlcXVpcmUgdGhlIGFzc2V0IHRvIGJlIGluIGEgZGVzdHJveWluZyBzdGF0ZS4wQXNzZXROb3RMaXZlABAEyFRoZSBhc3NldCBpcyBub3QgbGl2ZSwgYW5kIGxpa2VseSBiZWluZyBkZXN0cm95ZWQuPEluY29ycmVjdFN0YXR1cwARBLBUaGUgYXNzZXQgc3RhdHVzIGlzIG5vdCB0aGUgZXhwZWN0ZWQgc3RhdHVzLiROb3RGcm96ZW4AEgTYVGhlIGFzc2V0IHNob3VsZCBiZSBmcm96ZW4gYmVmb3JlIHRoZSBnaXZlbiBvcGVyYXRpb24uOENhbGxiYWNrRmFpbGVkABMEhENhbGxiYWNrIGFjdGlvbiByZXN1bHRlZCBpbiBlcnJvcihCYWRBc3NldElkABQEyFRoZSBhc3NldCBJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBbYE5leHRBc3NldElkYF0uPENvbnRhaW5zRnJlZXplcwAVBE0BVGhlIGFzc2V0IGNhbm5vdCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBzb21lIGFjY291bnRzIGZvciB0aGlzIGFzc2V0IGNvbnRhaW4gZnJlZXplcy40Q29udGFpbnNIb2xkcwAWBEUBVGhlIGFzc2V0IGNhbm5vdCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBzb21lIGFjY291bnRzIGZvciB0aGlzIGFzc2V0IGNvbnRhaW4gaG9sZHMuPFRvb01hbnlSZXNlcnZlcwAXBIBUcmllZCBzZXR0aW5nIHRvbyBtYW55IHJlc2VydmVzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC45CAQYT3B0aW9uBARUAQ0IAQgQTm9uZQAAABBTb21lBAANCAAAAQAAPQgEGE9wdGlvbgQEVAHEAQgQTm9uZQAAABBTb21lBADEAAABAABBCAQYT3B0aW9uBARUAS0IAQgQTm9uZQAAABBTb21lBAAtCAAAAQAARQgMUHBhbGxldF9hc3NldHNfaG9sZGVyGHBhbGxldBRFcnJvcggEVAAESQABBDBUb29NYW55SG9sZHMAAAQxAU51bWJlciBvZiBob2xkcyBvbiBhbiBhY2NvdW50IHdvdWxkIGV4Y2VlZCB0aGUgY291bnQgb2YgYFJ1bnRpbWVIb2xkUmVhc29uYC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuSQgMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFcnJvcgQEVAABDEBVbmtub3duQXNzZXRLaW5kAAAEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLjRBbHJlYWR5RXhpc3RzAAEEUQFUaGUgZ2l2ZW4gYXNzZXQgSUQgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY29udmVyc2lvbiByYXRlIGFuZCBjYW5ub3QgYmUgcmUtY3JlYXRlZC4gT3ZlcmZsb3cAAgTMT3ZlcmZsb3cgb2N1cnJlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIHJhdGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lk0IDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAMwBGFZlYzxUPgAAUQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFVCARTAAAEAFkIARhWZWM8VD4AAFUIDGRwYWxsZXRfY29sbGF0b3Jfc2VsZWN0aW9uGHBhbGxldDRDYW5kaWRhdGVJbmZvCCRBY2NvdW50SWQBBBxCYWxhbmNlAcQACAEMd2hvBAEkQWNjb3VudElkAAEcZGVwb3NpdMQBHEJhbGFuY2UAAFkIAAACVQgAXQgINGZyYW1lX3N1cHBvcnQgUGFsbGV0SWQAAAQAvQEBHFt1ODsgOF0AAGEIDGRwYWxsZXRfY29sbGF0b3Jfc2VsZWN0aW9uGHBhbGxldBRFcnJvcgQEVAABRERUb29NYW55Q2FuZGlkYXRlcwAABIxUaGUgcGFsbGV0IGhhcyB0b28gbWFueSBjYW5kaWRhdGVzLlxUb29GZXdFbGlnaWJsZUNvbGxhdG9ycwABBKxMZWF2aW5nIHdvdWxkIHJlc3VsdCBpbiB0b28gZmV3IGNhbmRpZGF0ZXMuQEFscmVhZHlDYW5kaWRhdGUAAgR8QWNjb3VudCBpcyBhbHJlYWR5IGEgY2FuZGlkYXRlLjBOb3RDYW5kaWRhdGUAAwRsQWNjb3VudCBpcyBub3QgYSBjYW5kaWRhdGUuUFRvb01hbnlJbnZ1bG5lcmFibGVzAAQEhFRoZXJlIGFyZSB0b28gbWFueSBJbnZ1bG5lcmFibGVzLkxBbHJlYWR5SW52dWxuZXJhYmxlAAUEjEFjY291bnQgaXMgYWxyZWFkeSBhbiBJbnZ1bG5lcmFibGUuPE5vdEludnVsbmVyYWJsZQAGBHxBY2NvdW50IGlzIG5vdCBhbiBJbnZ1bG5lcmFibGUuXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAcEnEFjY291bnQgaGFzIG5vIGFzc29jaWF0ZWQgdmFsaWRhdG9yIElELlhWYWxpZGF0b3JOb3RSZWdpc3RlcmVkAAgEjFZhbGlkYXRvciBJRCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQubEluc2VydFRvQ2FuZGlkYXRlTGlzdEZhaWxlZAAJBJxDb3VsZCBub3QgaW5zZXJ0IGluIHRoZSBjYW5kaWRhdGUgbGlzdC50UmVtb3ZlRnJvbUNhbmRpZGF0ZUxpc3RGYWlsZWQACgSkQ291bGQgbm90IHJlbW92ZSBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdC40RGVwb3NpdFRvb0xvdwALBPROZXcgZGVwb3NpdCBhbW91bnQgd291bGQgYmUgYmVsb3cgdGhlIG1pbmltdW0gY2FuZGlkYWN5IGJvbmQuZFVwZGF0ZUNhbmRpZGF0ZUxpc3RGYWlsZWQADASQQ291bGQgbm90IHVwZGF0ZSB0aGUgY2FuZGlkYXRlIGxpc3QuQEluc3VmZmljaWVudEJvbmQADQQpAURlcG9zaXQgYW1vdW50IGlzIHRvbyBsb3cgdG8gdGFrZSB0aGUgdGFyZ2V0J3Mgc2xvdCBpbiB0aGUgY2FuZGlkYXRlIGxpc3QuUFRhcmdldElzTm90Q2FuZGlkYXRlAA4ELQFUaGUgdGFyZ2V0IGFjY291bnQgdG8gYmUgcmVwbGFjZWQgaW4gdGhlIGNhbmRpZGF0ZSBsaXN0IGlzIG5vdCBhIGNhbmRpZGF0ZS5ASWRlbnRpY2FsRGVwb3NpdAAPBA0BVGhlIHVwZGF0ZWQgZGVwb3NpdCBhbW91bnQgaXMgZXF1YWwgdG8gdGhlIGFtb3VudCBhbHJlYWR5IHJlc2VydmVkLkBJbnZhbGlkVW5yZXNlcnZlABAEPQFDYW5ub3QgbG93ZXIgY2FuZGlkYWN5IGJvbmQgd2hpbGUgb2NjdXB5aW5nIGEgZnV0dXJlIGNvbGxhdG9yIHNsb3QgaW4gdGhlIGxpc3QuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LmUIAAACaQgAaQgAAAQIBDkBAG0IAAACcQgAcQgAAAQIOHUIAHUIDChzcF9zdGFraW5nHG9mZmVuY2U8T2ZmZW5jZVNldmVyaXR5AAAEAHkIARxQZXJiaWxsAAB5CAw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcmJpbGwAAAQAOAEMdTMyAAB9CAAABAiBCBgAgQgMHHNwX2NvcmUYY3J5cHRvJEtleVR5cGVJZAAABABwARxbdTg7IDRdAACFCAw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0FEVycm9yBARUAAEUMEludmFsaWRQcm9vZgAABGBJbnZhbGlkIG93bmVyc2hpcCBwcm9vZi5cTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQScTm8gYXNzb2NpYXRlZCB2YWxpZGF0b3IgSUQgZm9yIGFjY291bnQuNER1cGxpY2F0ZWRLZXkAAgRkUmVnaXN0ZXJlZCBkdXBsaWNhdGUga2V5LhhOb0tleXMAAwSkTm8ga2V5cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWNjb3VudC4kTm9BY2NvdW50AAQEGQFLZXkgc2V0dGluZyBhY2NvdW50IGlzIG5vdCBsaXZlLCBzbyBpdCdzIGltcG9zc2libGUgdG8gYXNzb2NpYXRlIGtleXMuBHRFcnJvciBmb3IgdGhlIHNlc3Npb24gcGFsbGV0LokIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBPQEEUwAABACNCAEYVmVjPFQ+AACNCAAAAj0BAJEICEhzcF9jb25zZW5zdXNfc2xvdHMQU2xvdAAABAAoAQx1NjQAAJUIAAAECJEIOACZCAxMYm91bmRlZF9jb2xsZWN0aW9uc0Rib3VuZGVkX2J0cmVlX3NldDxCb3VuZGVkQlRyZWVTZXQIBFQBnARTAAAEAJ0IASxCVHJlZVNldDxUPgAAnQgEIEJUcmVlU2V0BARUAZwABAChCAAAAKEIAAACnAClCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakIBFMAAAQAsQgBGFZlYzxUPgAAqQgIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWVYT3V0Ym91bmRDaGFubmVsRGV0YWlscwAAFAEkcmVjaXBpZW50nAEYUGFyYUlkAAEUc3RhdGWtCAE0T3V0Ym91bmRTdGF0ZQABNHNpZ25hbHNfZXhpc3TIARBib29sAAEsZmlyc3RfaW5kZXgtAwEMdTE2AAEobGFzdF9pbmRleC0DAQx1MTYAAK0ICGRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlNE91dGJvdW5kU3RhdGUAAQgIT2sAAAAkU3VzcGVuZGVkAAEAALEIAAACqQgAtQgAAAQInC0DALkIDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAAvQgIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWU8UXVldWVDb25maWdEYXRhAAAMAURzdXNwZW5kX3RocmVzaG9sZDgBDHUzMgABOGRyb3BfdGhyZXNob2xkOAEMdTMyAAFAcmVzdW1lX3RocmVzaG9sZDgBDHUzMgAAwQgMZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWUYcGFsbGV0FEVycm9yBARUAAEUOEJhZFF1ZXVlQ29uZmlnAAAEEQFTZXR0aW5nIHRoZSBxdWV1ZSBjb25maWcgZmFpbGVkIHNpbmNlIG9uZSBvZiBpdHMgdmFsdWVzIHdhcyBpbnZhbGlkLkBBbHJlYWR5U3VzcGVuZGVkAAEEjFRoZSBleGVjdXRpb24gaXMgYWxyZWFkeSBzdXNwZW5kZWQuOEFscmVhZHlSZXN1bWVkAAIEhFRoZSBleGVjdXRpb24gaXMgYWxyZWFkeSByZXN1bWVkLnRUb29NYW55QWN0aXZlT3V0Ym91bmRDaGFubmVscwADBLBUaGVyZSBhcmUgdG9vIG1hbnkgYWN0aXZlIG91dGJvdW5kIGNoYW5uZWxzLhhUb29CaWcABARcVGhlIG1lc3NhZ2UgaXMgdG9vIGJpZy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuxQgMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgE4AQwcUGVuZGluZxABJHJlc3BvbmRlckkBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXLJCAFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmec0IAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dDgBLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZcgBEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZdUIAURWZXJzaW9uZWRSZXNwb25zZQABCGF0OAEsQmxvY2tOdW1iZXIAAgAAyQgEGE9wdGlvbgQEVAFJAQEIEE5vbmUAAAAQU29tZQQASQEAAAEAAM0IBBhPcHRpb24EBFQB0QgBCBBOb25lAAAAEFNvbWUEANEIAAABAADRCAAABAgMDADVCAgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYzBADFAQEwdjM6OlJlc3BvbnNlAAMACFY0BAA1AgEwdjQ6OlJlc3BvbnNlAAQACFY1BACBAgEwdjU6OlJlc3BvbnNlAAUAANkIAAAECDhJAQDdCAAABAwo1QE4AOEIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB5QgEUwAABADpCAEYVmVjPFQ+AADlCAAABAhJATgA6QgAAALlCADtCAwocGFsbGV0X3hjbRhwYWxsZXRUVmVyc2lvbk1pZ3JhdGlvblN0YWdlAAEQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAAAXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEAUE5vdGlmeUN1cnJlbnRUYXJnZXRzBABJBQE8T3B0aW9uPFZlYzx1OD4+AAIAaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAMAAPEIAAAEDDgEEQMA9QgMKHBhbGxldF94Y20YcGFsbGV0aFJlbW90ZUxvY2tlZEZ1bmdpYmxlUmVjb3JkCEhDb25zdW1lcklkZW50aWZpZXIBEDBNYXhDb25zdW1lcnMAABABGGFtb3VudMQBEHUxMjgAARRvd25lckkBAURWZXJzaW9uZWRMb2NhdGlvbgABGGxvY2tlckkBAURWZXJzaW9uZWRMb2NhdGlvbgABJGNvbnN1bWVyc/kIAdBCb3VuZGVkVmVjPChDb25zdW1lcklkZW50aWZpZXIsIHUxMjgpLCBNYXhDb25zdW1lcnM+AAD5CAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAf0IBFMAAAQAAQkBGFZlYzxUPgAA/QgAAAQIEMQAAQkAAAL9CAAFCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQkJBFMAAAQADQkBGFZlYzxUPgAACQkAAAQIxEkBAA0JAAACCQkAEQkIKHBhbGxldF94Y21YQXV0aG9yaXplZEFsaWFzZXNFbnRyeQgYVGlja2V0ARUJDE1BWAEZCQAIASBhbGlhc2Vycx0JAXhCb3VuZGVkVmVjPE9yaWdpbkFsaWFzZXIsIE1BWD4AARh0aWNrZXQVCQEYVGlja2V0AAAVCRA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMcc3RvcmFnZSBEaXNhYmxlZAAAAAAZCQwocGFsbGV0X3hjbRhwYWxsZXRQTWF4QXV0aG9yaXplZEFsaWFzZXMAAAAAHQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEhCQRTAAAEACUJARhWZWM8VD4AACEJDEB4Y21fcnVudGltZV9hcGlzSGF1dGhvcml6ZWRfYWxpYXNlczRPcmlnaW5BbGlhc2VyAAAIASBsb2NhdGlvbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABGGV4cGlyeRUDASxPcHRpb248dTY0PgAAJQkAAAIhCQApCQwocGFsbGV0X3hjbRhwYWxsZXQURXJyb3IEBFQAAXAsVW5yZWFjaGFibGUAAAhdAVRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIHdhcyB1bnJlYWNoYWJsZSwgZ2VuZXJhbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBubyB3YXkgb2Ygcm91dGluZxh0byBpdC4sU2VuZEZhaWx1cmUAAQhBAVRoZXJlIHdhcyBzb21lIG90aGVyIGlzc3VlIChpLmUuIG5vdCB0byBkbyB3aXRoIHJvdXRpbmcpIGluIHNlbmRpbmcgdGhlIG1lc3NhZ2UuyFBlcmhhcHMgYSBsYWNrIG9mIHNwYWNlIGZvciBidWZmZXJpbmcgdGhlIG1lc3NhZ2UuIEZpbHRlcmVkAAIEnFRoZSBtZXNzYWdlIGV4ZWN1dGlvbiBmYWlscyB0aGUgZmlsdGVyLkhVbndlaWdoYWJsZU1lc3NhZ2UAAwS0VGhlIG1lc3NhZ2UncyB3ZWlnaHQgY291bGQgbm90IGJlIGRldGVybWluZWQuYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQAEBNxUaGUgZGVzdGluYXRpb24gYExvY2F0aW9uYCBwcm92aWRlZCBjYW5ub3QgYmUgaW52ZXJ0ZWQuFEVtcHR5AAUEgFRoZSBhc3NldHMgdG8gYmUgc2VudCBhcmUgZW1wdHkuOENhbm5vdFJlYW5jaG9yAAYENQFDb3VsZCBub3QgcmUtYW5jaG9yIHRoZSBhc3NldHMgdG8gZGVjbGFyZSB0aGUgZmVlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIGNoYWluLjRUb29NYW55QXNzZXRzAAcExFRvbyBtYW55IGFzc2V0cyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci40SW52YWxpZE9yaWdpbgAIBHhPcmlnaW4gaXMgaW52YWxpZCBmb3Igc2VuZGluZy4oQmFkVmVyc2lvbgAJBCEBVGhlIHZlcnNpb24gb2YgdGhlIGBWZXJzaW9uZWRgIHZhbHVlIHVzZWQgaXMgbm90IGFibGUgdG8gYmUgaW50ZXJwcmV0ZWQuLEJhZExvY2F0aW9uAAoIQQFUaGUgZ2l2ZW4gbG9jYXRpb24gY291bGQgbm90IGJlIHVzZWQgKGUuZy4gYmVjYXVzZSBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIHRoZWBkZXNpcmVkIHZlcnNpb24gb2YgWENNKS44Tm9TdWJzY3JpcHRpb24ACwS8VGhlIHJlZmVyZW5jZWQgc3Vic2NyaXB0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC5EQWxyZWFkeVN1YnNjcmliZWQADAQRAVRoZSBsb2NhdGlvbiBpcyBpbnZhbGlkIHNpbmNlIGl0IGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uIGZyb20gdXMuWENhbm5vdENoZWNrT3V0VGVsZXBvcnQADQQpAUNvdWxkIG5vdCBjaGVjay1vdXQgdGhlIGFzc2V0cyBmb3IgdGVsZXBvcnRhdGlvbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4uKExvd0JhbGFuY2UADgRBAVRoZSBvd25lciBkb2VzIG5vdCBvd24gKGFsbCkgb2YgdGhlIGFzc2V0IHRoYXQgdGhleSB3aXNoIHRvIGRvIHRoZSBvcGVyYXRpb24gb24uMFRvb01hbnlMb2NrcwAPBMBUaGUgYXNzZXQgb3duZXIgaGFzIHRvbyBtYW55IGxvY2tzIG9uIHRoZSBhc3NldC5MQWNjb3VudE5vdFNvdmVyZWlnbgAQBDEBVGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGFuIGlkZW50aWZpYWJsZSBzb3ZlcmVpZ24gYWNjb3VudCBmb3IgYW55IGxvY2F0aW9uLihGZWVzTm90TWV0ABEEKQFUaGUgb3BlcmF0aW9uIHJlcXVpcmVkIGZlZXMgdG8gYmUgcGFpZCB3aGljaCB0aGUgaW5pdGlhdG9yIGNvdWxkIG5vdCBtZWV0LjBMb2NrTm90Rm91bmQAEgT0QSByZW1vdGUgbG9jayB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgY291bGQgbm90IGJlIGZvdW5kLhRJblVzZQATBEkBVGhlIHVubG9jayBvcGVyYXRpb24gY2Fubm90IHN1Y2NlZWQgYmVjYXVzZSB0aGVyZSBhcmUgc3RpbGwgY29uc3VtZXJzIG9mIHRoZSBsb2NrLmhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQAVBPBJbnZhbGlkIGFzc2V0LCByZXNlcnZlIGNoYWluIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGZvciBpdC54SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlABYERQFJbnZhbGlkIGFzc2V0LCBkbyBub3Qgc3VwcG9ydCByZW1vdGUgYXNzZXQgcmVzZXJ2ZXMgd2l0aCBkaWZmZXJlbnQgZmVlcyByZXNlcnZlcy48VG9vTWFueVJlc2VydmVzABcESQFUb28gbWFueSBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmVzZXJ2ZSBsb2NhdGlvbnMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQAYBHxMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUuYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwAZBLhUb28gbWFueSBsb2NhdGlvbnMgYXV0aG9yaXplZCB0byBhbGlhcyBvcmlnaW4uNEV4cGlyZXNJblBhc3QAGgSMRXhwaXJ5IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC40QWxpYXNOb3RGb3VuZAAbBNBUaGUgYWxpYXMgdG8gcmVtb3ZlIGF1dGhvcml6YXRpb24gZm9yIHdhcyBub3QgZm91bmQuhExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZVdpdGhFcnJvcggBFGluZGV4DAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yLQkBOEV4ZWN1dGlvbkVycm9yABwINQFMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUgd2l0aCB0aGUgYWN0dWFsIFhDTSBlcnJvciBhbmQgdGhlIGluZGV4IG9mIHRoZYhpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Li0JDChwYWxsZXRfeGNtGGVycm9yczhFeGVjdXRpb25FcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIANFRvb01hbnlBc3NldHMAIwBMVW5oYW5kbGVkWGNtVmVyc2lvbgAkAEhXZWlnaHRMaW1pdFJlYWNoZWQAJQAcQmFycmllcgAmAExXZWlnaHROb3RDb21wdXRhYmxlACcAREV4Y2VlZHNTdGFja0xpbWl0ACgAADEJCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZSRCb29rU3RhdGUENE1lc3NhZ2VPcmlnaW4BIQMAGAEUYmVnaW44ASRQYWdlSW5kZXgAAQxlbmQ4ASRQYWdlSW5kZXgAARRjb3VudDgBJFBhZ2VJbmRleAABQHJlYWR5X25laWdoYm91cnM1CQGET3B0aW9uPE5laWdoYm91cnM8TWVzc2FnZU9yaWdpbj4+AAE0bWVzc2FnZV9jb3VudCgBDHU2NAABEHNpemUoAQx1NjQAADUJBBhPcHRpb24EBFQBOQkBCBBOb25lAAAAEFNvbWUEADkJAAABAAA5CQhQcGFsbGV0X21lc3NhZ2VfcXVldWUoTmVpZ2hib3VycwQ0TWVzc2FnZU9yaWdpbgEhAwAIARBwcmV2IQMBNE1lc3NhZ2VPcmlnaW4AARBuZXh0IQMBNE1lc3NhZ2VPcmlnaW4AAD0JAAAECCEDOABBCQhQcGFsbGV0X21lc3NhZ2VfcXVldWUQUGFnZQgQU2l6ZQE4IEhlYXBTaXplAAAYASRyZW1haW5pbmc4ARBTaXplAAE4cmVtYWluaW5nX3NpemU4ARBTaXplAAEsZmlyc3RfaW5kZXg4ARBTaXplAAEUZmlyc3Q4ARBTaXplAAEQbGFzdDgBEFNpemUAARBoZWFwRQkBnEJvdW5kZWRWZWM8dTgsIEludG9VMzI8SGVhcFNpemUsIFNpemU+PgAARQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AABJCQxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0FEVycm9yBARUAAEkLE5vdFJlYXBhYmxlAAAISQFQYWdlIGlzIG5vdCByZWFwYWJsZSBiZWNhdXNlIGl0IGhhcyBpdGVtcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIGFuZCBpcyBub3Qgb2xkHGVub3VnaC4YTm9QYWdlAAEEhFBhZ2UgdG8gYmUgcmVhcGVkIGRvZXMgbm90IGV4aXN0LiROb01lc3NhZ2UAAgSoVGhlIHJlZmVyZW5jZWQgbWVzc2FnZSBjb3VsZCBub3QgYmUgZm91bmQuQEFscmVhZHlQcm9jZXNzZWQAAwQBAVRoZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZCBhZ2Fpbi4YUXVldWVkAAQErFRoZSBtZXNzYWdlIGlzIHF1ZXVlZCBmb3IgZnV0dXJlIGV4ZWN1dGlvbi5ISW5zdWZmaWNpZW50V2VpZ2h0AAUEGQFUaGVyZSBpcyB0ZW1wb3JhcmlseSBub3QgZW5vdWdoIHdlaWdodCB0byBjb250aW51ZSBzZXJ2aWNpbmcgbWVzc2FnZXMuYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQAGEKhUaGlzIG1lc3NhZ2UgaXMgdGVtcG9yYXJpbHkgdW5wcm9jZXNzYWJsZS4AWQFTdWNoIGVycm9ycyBhcmUgZXhwZWN0ZWQsIGJ1dCBub3QgZ3VhcmFudGVlZCwgdG8gcmVzb2x2ZSB0aGVtc2VsdmVzIGV2ZW50dWFsbHkgdGhyb3VnaCRyZXRyeWluZy4sUXVldWVQYXVzZWQABwzsVGhlIHF1ZXVlIGlzIHBhdXNlZCBhbmQgbm8gbWVzc2FnZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBpdC4AHQFUaGlzIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIG1heSByZXNvbHZlIGluIHRoZSBmdXR1cmUgYnkgcmUtdHJ5aW5nLkxSZWN1cnNpdmVEaXNhbGxvd2VkAAgEMQFBbm90aGVyIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgYW5kIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhpcyBjYWxsIGNhbiBoYXBwZW4uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lk0JDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXJyb3IEBFQAAQQwVG9vTWFueUNhbGxzAAAEXFRvbyBtYW55IGNhbGxzIGJhdGNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlEJAAAECAQIAFUJCDxwYWxsZXRfbXVsdGlzaWcgTXVsdGlzaWcQLEJsb2NrTnVtYmVyATgcQmFsYW5jZQHEJEFjY291bnRJZAEEME1heEFwcHJvdmFscwAAEAEQd2hlbokDAVhUaW1lcG9pbnQ8QmxvY2tOdW1iZXI+AAEcZGVwb3NpdMQBHEJhbGFuY2UAASRkZXBvc2l0b3IEASRBY2NvdW50SWQAASRhcHByb3ZhbHNZCQGMQm91bmRlZFZlYzxBY2NvdW50SWQsIE1heEFwcHJvdmFscz4AAFkJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAMwBGFZlYzxUPgAAXQkMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXJyb3IEBFQAAThATWluaW11bVRocmVzaG9sZAAABHxUaHJlc2hvbGQgbXVzdCBiZSAyIG9yIGdyZWF0ZXIuPEFscmVhZHlBcHByb3ZlZAABBKxDYWxsIGlzIGFscmVhZHkgYXBwcm92ZWQgYnkgdGhpcyBzaWduYXRvcnkuRE5vQXBwcm92YWxzTmVlZGVkAAIEnENhbGwgZG9lc24ndCBuZWVkIGFueSAobW9yZSkgYXBwcm92YWxzLkRUb29GZXdTaWduYXRvcmllcwADBKhUaGVyZSBhcmUgdG9vIGZldyBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5IVG9vTWFueVNpZ25hdG9yaWVzAAQErFRoZXJlIGFyZSB0b28gbWFueSBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5UU2lnbmF0b3JpZXNPdXRPZk9yZGVyAAUEDQFUaGUgc2lnbmF0b3JpZXMgd2VyZSBwcm92aWRlZCBvdXQgb2Ygb3JkZXI7IHRoZXkgc2hvdWxkIGJlIG9yZGVyZWQuTFNlbmRlckluU2lnbmF0b3JpZXMABgQNAVRoZSBzZW5kZXIgd2FzIGNvbnRhaW5lZCBpbiB0aGUgb3RoZXIgc2lnbmF0b3JpZXM7IGl0IHNob3VsZG4ndCBiZS4gTm90Rm91bmQABwSgTXVsdGlzaWcgb3BlcmF0aW9uIG5vdCBmb3VuZCBpbiBzdG9yYWdlLiBOb3RPd25lcgAICFEBT25seSB0aGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGUgbXVsdGlzaWcgaXMgYWJsZSB0byBjYW5jZWwgaXQgb3IgdXBkYXRlNGl0cyBkZXBvc2l0cy4sTm9UaW1lcG9pbnQACQQdAU5vIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIGlzIGFscmVhZHkgdW5kZXJ3YXkuOFdyb25nVGltZXBvaW50AAoELQFBIGRpZmZlcmVudCB0aW1lcG9pbnQgd2FzIGdpdmVuIHRvIHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gdGhhdCBpcyB1bmRlcndheS5MVW5leHBlY3RlZFRpbWVwb2ludAALBPRBIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCBubyBtdWx0aXNpZyBvcGVyYXRpb24gaXMgdW5kZXJ3YXkuPE1heFdlaWdodFRvb0xvdwAMBNBUaGUgbWF4aW11bSB3ZWlnaHQgaW5mb3JtYXRpb24gcHJvdmlkZWQgd2FzIHRvbyBsb3cuNEFscmVhZHlTdG9yZWQADQSgVGhlIGRhdGEgdG8gYmUgc3RvcmVkIGlzIGFscmVhZHkgc3RvcmVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5hCQwscGFsbGV0X3N1ZG8YcGFsbGV0FEVycm9yBARUAAEELFJlcXVpcmVTdWRvAAAEgFNlbmRlciBtdXN0IGJlIHRoZSBTdWRvIGFjY291bnQuBGhFcnJvciBmb3IgdGhlIFN1ZG8gcGFsbGV0LmUJAAAECGkJxABpCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAW0JBFMAAAQAcQkBGFZlYzxUPgAAbQkIMHBhbGxldF9wcm94eTxQcm94eURlZmluaXRpb24MJEFjY291bnRJZAEEJFByb3h5VHlwZQGZAyxCbG9ja051bWJlcgE4AAwBIGRlbGVnYXRlBAEkQWNjb3VudElkAAEocHJveHlfdHlwZZkDASRQcm94eVR5cGUAARRkZWxheTgBLEJsb2NrTnVtYmVyAABxCQAAAm0JAHUJAAAECHkJxAB5CQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAX0JBFMAAAQAgQkBGFZlYzxUPgAAfQkIMHBhbGxldF9wcm94eTBBbm5vdW5jZW1lbnQMJEFjY291bnRJZAEEEEhhc2gBPCxCbG9ja051bWJlcgE4AAwBEHJlYWwEASRBY2NvdW50SWQAASRjYWxsX2hhc2g8ARBIYXNoAAEYaGVpZ2h0OAEsQmxvY2tOdW1iZXIAAIEJAAACfQkAhQkMMHBhbGxldF9wcm94eRhwYWxsZXQURXJyb3IEBFQAASAcVG9vTWFueQAABCEBVGhlcmUgYXJlIHRvbyBtYW55IHByb3hpZXMgcmVnaXN0ZXJlZCBvciB0b28gbWFueSBhbm5vdW5jZW1lbnRzIHBlbmRpbmcuIE5vdEZvdW5kAAEEdFByb3h5IHJlZ2lzdHJhdGlvbiBub3QgZm91bmQuIE5vdFByb3h5AAIEzFNlbmRlciBpcyBub3QgYSBwcm94eSBvZiB0aGUgYWNjb3VudCB0byBiZSBwcm94aWVkLixVbnByb3h5YWJsZQADBCEBQSBjYWxsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm94eSB0eXBlJ3MgZmlsdGVyIHdhcyBhdHRlbXB0ZWQuJER1cGxpY2F0ZQAEBGxBY2NvdW50IGlzIGFscmVhZHkgYSBwcm94eS4wTm9QZXJtaXNzaW9uAAUEFQFDYWxsIG1heSBub3QgYmUgbWFkZSBieSBwcm94eSBiZWNhdXNlIGl0IG1heSBlc2NhbGF0ZSBpdHMgcHJpdmlsZWdlcy4sVW5hbm5vdW5jZWQABgTQQW5ub3VuY2VtZW50LCBpZiBtYWRlIGF0IGFsbCwgd2FzIG1hZGUgdG9vIHJlY2VudGx5LixOb1NlbGZQcm94eQAHBGRDYW5ub3QgYWRkIHNlbGYgYXMgcHJveHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LokJDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXMwUmVnaXN0cmF0aW9uDBxCYWxhbmNlAcQ0TWF4SnVkZ2VtZW50cwAwSWRlbnRpdHlJbmZvAaEDAAwBKGp1ZGdlbWVudHONCQH8Qm91bmRlZFZlYzwoUmVnaXN0cmFySW5kZXgsIEp1ZGdlbWVudDxCYWxhbmNlPiksIE1heEp1ZGdlbWVudHM+AAEcZGVwb3NpdMQBHEJhbGFuY2UAARBpbmZvoQMBMElkZW50aXR5SW5mbwAAjQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGRCQRTAAAEAJUJARhWZWM8VD4AAJEJAAAECDglBACVCQAAApEJAJkJAAAECMRZCQCdCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAaEJBFMAAAQAqQkBGFZlYzxUPgAAoQkEGE9wdGlvbgQEVAGlCQEIEE5vbmUAAAAQU29tZQQApQkAAAEAAKUJDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXM0UmVnaXN0cmFySW5mbwwcQmFsYW5jZQHEJEFjY291bnRJZAEEHElkRmllbGQBKAAMARxhY2NvdW50BAEkQWNjb3VudElkAAEMZmVlxAEcQmFsYW5jZQABGGZpZWxkcygBHElkRmllbGQAAKkJAAACoQkArQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AACxCQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzTEF1dGhvcml0eVByb3BlcnRpZXMEHEFjY291bnQBBAAIAShhY2NvdW50X2lkBAEcQWNjb3VudAABKGFsbG9jYXRpb244AShBbGxvY2F0aW9uAAC1CQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzTFVzZXJuYW1lSW5mb3JtYXRpb24IHEFjY291bnQBBBxCYWxhbmNlAcQACAEUb3duZXIEARxBY2NvdW50AAEgcHJvdmlkZXK5CQFEUHJvdmlkZXI8QmFsYW5jZT4AALkJDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXMgUHJvdmlkZXIEHEJhbGFuY2UBxAEMKEFsbG9jYXRpb24AAABAQXV0aG9yaXR5RGVwb3NpdAQAxAEcQmFsYW5jZQABABhTeXN0ZW0AAgAAvQkAAAQMBDi5CQDBCQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzQFBlcnNvbmFsSWRlbnRpdHkQJEFjY291bnRJZAEELEp1ZGdlbWVudElkATg0TWF4SnVkZ2VtZW50cwAsQmxvY2tOdW1iZXIBOAAQARxhY2NvdW50BAEkQWNjb3VudElkAAFIcGVuZGluZ19qdWRnZW1lbnRzxQkBwEJvdW5kZWRWZWM8KFNvY2lhbCwgSnVkZ2VtZW50SWQpLCBNYXhKdWRnZW1lbnRzPgABGGJhbm5lZMgBEGJvb2wAAWR1c2VybmFtZV9sYXN0X3JlcG9ydGVkX2F0CQMBTE9wdGlvbjxCbG9ja051bWJlcj4AAMUJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQByQkEUwAABADNCQEYVmVjPFQ+AADJCQAABAg9BDgAzQkAAALJCQDRCQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzOFVzZXJuYW1lUmVwb3J0DCRBY2NvdW50SWQBBCBVc2VybmFtZQE5BBhUaWNrZXQBOAAMASByZXBvcnRlcgQBJEFjY291bnRJZAABIHVzZXJuYW1lOQQBIFVzZXJuYW1lAAEcY2FzZV9pZDgBGFRpY2tldAAA1QkMVGluZGl2X3BhbGxldF9pZGVudGl0eRhwYWxsZXQURXJyb3IEBFQAAaRIVG9vTWFueVN1YkFjY291bnRzAAAEXFRvbyBtYW55IHN1YnMtYWNjb3VudHMuHE5vQWxpYXMAAQR4Tm8gYWxpYXMgZm91bmQgZm9yIGFuIGFjY291bnQuIE5vdEZvdW5kAAIEUEFjY291bnQgaXNuJ3QgZm91bmQuIE5vdE5hbWVkAAMEUEFjY291bnQgaXNuJ3QgbmFtZWQuKEVtcHR5SW5kZXgABAQwRW1wdHkgaW5kZXguKEZlZUNoYW5nZWQABQQ8RmVlIGlzIGNoYW5nZWQuKE5vSWRlbnRpdHkABgRITm8gaWRlbnRpdHkgZm91bmQuPFN0aWNreUp1ZGdlbWVudAAHBERTdGlja3kganVkZ2VtZW50LjhKdWRnZW1lbnRHaXZlbgAIBEBKdWRnZW1lbnQgZ2l2ZW4uQEludmFsaWRKdWRnZW1lbnQACQRISW52YWxpZCBqdWRnZW1lbnQuMEludmFsaWRJbmRleAAKBFRUaGUgaW5kZXggaXMgaW52YWxpZC40SW52YWxpZFRhcmdldAALBFhUaGUgdGFyZ2V0IGlzIGludmFsaWQuRFRvb01hbnlSZWdpc3RyYXJzAAwE6E1heGltdW0gYW1vdW50IG9mIHJlZ2lzdHJhcnMgcmVhY2hlZC4gQ2Fubm90IGFkZCBhbnkgbW9yZS44QWxyZWFkeUNsYWltZWQADQRwQWNjb3VudCBJRCBpcyBhbHJlYWR5IG5hbWVkLjxBbHJlYWR5UmVwb3J0ZWQADgSMVXNlcm5hbWUgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4YTm90U3ViAA8EcFNlbmRlciBpcyBub3QgYSBzdWItYWNjb3VudC4gTm90T3duZWQAEASIU3ViLWFjY291bnQgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyLnRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQARBNBUaGUgcHJvdmlkZWQganVkZ2VtZW50IHdhcyBmb3IgYSBkaWZmZXJlbnQgaWRlbnRpdHkuWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAEgT4RXJyb3IgdGhhdCBvY2N1cnMgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSBwYXlpbmcgZm9yIGp1ZGdlbWVudC40SW52YWxpZFN1ZmZpeAATBIBUaGUgcHJvdmlkZWQgc3VmZml4IGlzIHRvbyBsb25nLlBOb3RVc2VybmFtZUF1dGhvcml0eQAUBOBUaGUgc2VuZGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpc3N1ZSBhIHVzZXJuYW1lLjBOb0FsbG9jYXRpb24AFQTEVGhlIGF1dGhvcml0eSBjYW5ub3QgYWxsb2NhdGUgYW55IG1vcmUgdXNlcm5hbWVzLkBJbnZhbGlkU2lnbmF0dXJlABYEqFRoZSBzaWduYXR1cmUgb24gYSB1c2VybmFtZSB3YXMgbm90IHZhbGlkLkRSZXF1aXJlc1NpZ25hdHVyZQAXBAkBU2V0dGluZyB0aGlzIHVzZXJuYW1lIHJlcXVpcmVzIGEgc2lnbmF0dXJlLCBidXQgbm9uZSB3YXMgcHJvdmlkZWQuPEludmFsaWRVc2VybmFtZQAYBLBUaGUgdXNlcm5hbWUgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzLjRVc2VybmFtZVRha2VuABkEeFRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLihOb1VzZXJuYW1lABoEmFRoZSByZXF1ZXN0ZWQgdXNlcm5hbWUgZG9lcyBub3QgZXhpc3QuZE5vdFN5c3RlbVByb3ZpZGVkVXNlcm5hbWUAGwTUVGhlIHJlcG9ydGVkIHVzZXJuYW1lIHdhcyBub3QgcHJvdmlkZWQgYnkgdGhlIHN5c3RlbS4oTm90RXhwaXJlZAAcBC0BVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSBmb3JjZWZ1bGx5IHJlbW92ZWQgYmVjYXVzZSBpdCBjYW4gc3RpbGwgYmUgYWNjZXB0ZWQuIFRvb0Vhcmx5AB0EGQFUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCdzIHN0aWxsIGluIHRoZSBncmFjZSBwZXJpb2QuME5vdFVuYmluZGluZwAeBOxUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCBpcyBub3QgdW5iaW5kaW5nLkBBbHJlYWR5VW5iaW5kaW5nAB8E/FRoZSB1c2VybmFtZSBjYW5ub3QgYmUgdW5ib3VuZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgdW5iaW5kaW5nLlhJbnN1ZmZpY2llbnRQcml2aWxlZ2VzACAIRQFUaGUgYWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlcyAoZS5nLiBhdXRob3JpdHnQdHJ5aW5nIHRvIHVuYmluZCBhIHVzZXJuYW1lIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0pLihCYWRDb250ZXh0ACEE5FRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBhbGlhcyB3YXMgdXNlZCBpcyBub3Qgc3VwcG9ydGVkLkxVbmV4cGVjdGVkSnVkZ2VtZW50ACIExE5vIGFzc29jaWF0ZWQgcmVxdWVzdCBmb3IgdGhlIGp1ZGdlbWVudCByZWNlaXZlZC4wTm90U3VwcG9ydGVkACMEXQFUaGUgc29jaWFsIGNyZWRlbnRpYWwgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29uZmlndXJlZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBwcm92aWRlci4YQmFubmVkACQE2FRoZSBwZXJzb24gaXMgYmFubmVkIGFuZCBjYW5ub3QgcGVyZm9ybSB0aGUgb3BlcmF0aW9uLkRBbHJlYWR5UmVnaXN0ZXJlZAAlBB0BVGhlIHBlcnNvbiBhbHJlYWR5IGhhcyBhIHBlcnNvbmFsIGlkZW50aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGVpciBhbGlhcy5ESnVkZ2VtZW50TGlzdEZ1bGwAJgT4VGhlIGxpc3Qgb2YganVkZ2VtZW50cyBvbmdvaW5nIG9uIGEgcGVyc29uYWwgaWRlbnRpdHkgaXMgZnVsbC5sTGFzdFVzZXJuYW1lUmVwb3J0VG9vUmVjZW50ACcEsFRoZSB1c2VybmFtZSBoYXMgYmVlbiByZXBvcnRlZCB0b28gcmVjZW50bHkuYFVzZXJuYW1lSnVkZ2VtZW50T25nb2luZwAoBBEBVGhlIHVzZXJuYW1lIGhhcyBiZWVuIHJlcG9ydGVkIGFuZCBpcyB1bmRlcmdvaW5nIHZhbGlkaXR5IGp1ZGdlbWVudC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu2QkMTGluZGl2X3BhbGxldF9wZW9wbGUUdHlwZXMwUGVyc29uUmVjb3JkCBhNZW1iZXIBUQQkQWNjb3VudElkAQQACAEMa2V5UQQBGE1lbWJlcgABHGFjY291bnTpBAFET3B0aW9uPEFjY291bnRJZD4AAN0JDExpbmRpdl9wYWxsZXRfcGVvcGxlGHBhbGxldBRFcnJvcgQEVAABiCROb3RQZXJzb24AAATQVGhlIHN1cHBsaWVkIGlkZW50aWZpZXIgZG9lcyBub3QgcmVwcmVzZW50IGEgcGVyc29uLhROb0tleQABBJxUaGUgZ2l2ZW4gcGVyc29uIGhhcyBubyBhc3NvY2lhdGVkIGtleS44SW52YWxpZENvbnRleHQAAgQpAVRoZSBjb250ZXh0IGlzIG5vdCBhIG1lbWJlciBvZiB0aG9zZSBhbGxvd2VkIHRvIGhhdmUgYWNjb3VudCBhbGlhc2VzIGhlbGQuOEludmFsaWRBY2NvdW50AAMEZFRoZSBhY2NvdW50IGlzIG5vdCBrbm93bi4wQWNjb3VudEluVXNlAAQEyFRoZSBhY2NvdW50IGlzIGFscmVhZHkgaW4gdXNlIHVuZGVyIGFub3RoZXIgYWxpYXMuMEludmFsaWRQcm9vZgAFBFRUaGUgcHJvb2YgaXMgaW52YWxpZC5ASW52YWxpZFNpZ25hdHVyZQAGBGRUaGUgc2lnbmF0dXJlIGlzIGludmFsaWQuJE5vTWVtYmVycwAHBNBUaGVyZSBhcmUgbm90IHlldCBhbnkgbWVtYmVycyBvZiBvdXIgcGVyc29uaG9vZCBzZXQuKEluY29tcGxldGUACAQFAVRoZSByb290IGNhbm5vdCBiZSBmaW5hbGl6ZWQgYXMgdGhlcmUgYXJlIHN0aWxsIHVucHVzaGVkIG1lbWJlcnMuKFN0aWxsRnJlc2gACQRgVGhlIHJvb3QgaXMgc3RpbGwgZnJlc2guOFRvb01hbnlNZW1iZXJzAAoEiFRvbyBtYW55IG1lbWJlcnMgaGF2ZSBiZWVuIHB1c2hlZC48S2V5QWxyZWFkeUluVXNlAAsElEtleSBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHBlcnNvbi4sS2V5Tm90Rm91bmQADASgVGhlIG9sZCBrZXkgd2FzIG5vdCBmb3VuZCB3aGVuIGV4cGVjdGVkLjBDb3VsZE5vdFB1c2gADQSQQ291bGQgbm90IHB1c2ggbWVtYmVyIGludG8gdGhlIHJpbmcuHFNhbWVLZXkADgSUVGhlIHJlY29yZCBpcyBhbHJlYWR5IHVzaW5nIHRoaXMga2V5LlRQZXJzb25hbElkTm90UmVzZXJ2ZWQADwR0UGVyc29uYWwgSWQgd2FzIG5vdCByZXNlcnZlZC6AUGVyc29uYWxJZFJlc2VydmF0aW9uQ2Fubm90UmVuZXcAEASQUGVyc29uYWwgSWQgaGFzIG5ldmVyIGJlZW4gcmVzZXJ2ZWQukFBlcnNvbmFsSWROb3RSZXNlcnZlZE9yTm90UmVjb2duaXplZAARBNxQZXJzb25hbCBJZCB3YXMgbm90IHJlc2VydmVkIG9yIG5vdCBhbHJlYWR5IHJlY29nbml6ZWQuLEludmFsaWRSaW5nABIErFJpbmcgY2Fubm90IGJlIG1lcmdlZCBpZiBpdCdzIHRoZSB0b3AgcmluZy5IU3VzcGVuc2lvbnNQZW5kaW5nABME5FJpbmcgY2Fubm90IGJlIGJ1aWx0IHdoaWxlIHRoZXJlIGFyZSBzdXNwZW5zaW9ucyBwZW5kaW5nLlxSaW5nQWJvdmVNZXJnZVRocmVzaG9sZAAUBNRSaW5nIGNhbm5vdCBiZSBtZXJnZWQgaWYgaXQncyBub3QgYmVsb3cgMS8yIGNhcGFjaXR5LkhJbnZhbGlkU3VzcGVuc2lvbnMAFQSgU3VzcGVuc2lvbiBpbmRpY2VzIHByb3ZpZGVkIGFyZSBpbnZhbGlkLkROb011dGF0aW9uU2Vzc2lvbgAWBDUBQW4gbXV0YXRpbmcgYWN0aW9uIHdhcyBxdWV1ZWQgd2hlbiB0aGVyZSB3YXMgbm8gbXV0YXRpb24gc2Vzc2lvbiBpbiBwcm9ncmVzcy5wQ291bGROb3RTdGFydE11dGF0aW9uU2Vzc2lvbgAXBKRBbiBtdXRhdGluZyBzZXNzaW9uIGNvdWxkIG5vdCBiZSBzdGFydGVkLmxTdXNwZW5zaW9uU2Vzc2lvbkluUHJvZ3Jlc3MAGAT0Q2Fubm90IG1lcmdlIHJpbmdzIHdoaWxlIGEgc3VzcGVuc2lvbiBzZXNzaW9uIGlzIGluIHByb2dyZXNzLjhUaW1lT3V0T2ZSYW5nZQAZBHhDYWxsIGlzIHRvbyBsYXRlIG9yIHRvbyBlYXJseS5YQWxpYXNBY2NvdW50QWxyZWFkeVNldAAaBMBBbGlhcyA8LT4gQWNjb3VudCBpcyBhbHJlYWR5IHNldCBhbmQgdXAgdG8gZGF0ZS4wTm90U3VzcGVuZGVkABsE0FBlcnNvbmhvb2QgY2Fubm90IGJlIHJlc3VtZWQgaWYgaXQgaXMgbm90IHN1c3BlbmRlZC4kU3VzcGVuZGVkABwEYFBlcnNvbmhvb2QgaXMgc3VzcGVuZGVkLkxJbnZhbGlkS2V5TWlncmF0aW9uAB0EqEludmFsaWQgc3RhdGUgZm9yIGF0dGVtcHRlZCBrZXkgbWlncmF0aW9uLkxLZXlBbHJlYWR5U3VzcGVuZGVkAB4IVQFJbnZhbGlkIHN1c3BlbnNpb24gb2YgYSBrZXkgYmVsb25naW5nIHRvIGEgcGVyc29uIHdob3NlIGluZGV4IGluIHRoZSByaW5nIGhhcyBhbHJlYWR5uGJlZW4gaW5jbHVkZWQgaW4gdGhlIHBlbmRpbmcgc3VzcGVuc2lvbnMgbGlzdC5USW52YWxpZE9uYm9hcmRpbmdTaXplAB8E6FRoZSBvbmJvYXJkaW5nIHNpemUgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHJpbmcgc2l6ZS5ASW52YWxpZE1lbWJlcktleQAgBKxUaGUgbWVtYmVyIGtleSBpcyBub3QgdmFsaWQgZm9yIHRoZSBjcnlwdG8udFBlb3BsZUNvbGxlY3Rpb25BbHJlYWR5RXhpc3RzACEEvFRoZSBwZW9wbGUgY29sbGVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LuEJDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0JE1vYkNyZWRpdAQcQmFsYW5jZQHEABABFHZvdGVkOAEMdTMyAAEcY2xlYW5lZDgBDHUzMgABHGNvcnJlY3Q4AQx1MzIAARhjcmVkaXTEARxCYWxhbmNlAADlCQAABAg4CADpCQxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBPcGVuQ2FzZQQsUnVudGltZUNhbGwBIAAMARRzaW5jZSgBQFNlY3NTaW5jZUdlbmVzaXMAARxkZXRhaWxz7QkBYENhc2VEZXRhaWxzPFJ1bnRpbWVDYWxsPgABFHRhbGx5/QkBJFZvdGVUYWxseQAA7QkMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQsQ2FzZURldGFpbHMELFJ1bnRpbWVDYWxsASAADAEkc3RhdGVtZW508QkBJFN0YXRlbWVudAABHGNvbnRleHR4AUBKdWRnZW1lbnRDb250ZXh0AAEgY2FsbGJhY2v5CQH8Q2FsbGJhY2s8KENhc2VJbmRleCwgSnVkZ2VtZW50Q29udGV4dCwgSnVkZ2VtZW50KSwgUnVudGltZUNhbGw+AADxCRA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSRTdGF0ZW1lbnQAAQwoUHJvb2ZPZkluawwBGGRlc2lnbvUJAVRwcm9vZl9vZl9pbms6Oklua1NwZWMAASBldmlkZW5jZQgBMEV2aWRlbmNlSGFzaAABTHByb2JhYmxlX2FjY2VwdGFibGXIARBib29sAAAASElkZW50aXR5Q3JlZGVudGlhbAgBIHBsYXRmb3JtPQQBQGlkZW50aXR5OjpTb2NpYWwAASBldmlkZW5jZTkEAThpZGVudGl0eTo6RGF0YQABADRVc2VybmFtZVZhbGlkBAEgdXNlcm5hbWU5BAE4aWRlbnRpdHk6OkRhdGEAAgAA9QkUNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkwcHJvb2Zfb2ZfaW5rHElua1NwZWMAARBARGVzaWduZWRFbGVjdGl2ZQgALQMBLEZhbWlseUluZGV4AAAtAwEsRGVzaWduSW5kZXgAAABEUHJvY2VkdXJhbEFjY291bnQIAC0DASxGYW1pbHlJbmRleAAACAEkQWNjb3VudElkAAEASFByb2NlZHVyYWxQZXJzb25hbAgALQMBLEZhbWlseUluZGV4AAAoAShQZXJzb25hbElkAAIAKFByb2NlZHVyYWwIAC0DASxGYW1pbHlJbmRleAAAcAE4UHJvY2VkdXJhbFNlZWQAAwAA+QkQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkgQ2FsbGJhY2sIGFBhcmFtcwAsUnVudGltZUNhbGwAAAgBMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAD9CQxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCRWb3RlVGFsbHkAAAwBDGF5ZTgBDHUzMgABDG5heTgBDHUzMgABIGNvbnRlbXB0OAEMdTMyAAABCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBSaXBlQ2FzZQQsUnVudGltZUNhbGwBIAAIARxkZXRhaWxz7QkBYENhc2VEZXRhaWxzPFJ1bnRpbWVDYWxsPgABHHZlcmRpY3RBBAEkSnVkZ2VtZW50AAAFCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBEb25lQ2FzZQAACAEUc2luY2UoAUBTZWNzU2luY2VHZW5lc2lzAAEcdmVyZGljdEEEASRKdWRnZW1lbnQAAAkKDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0SENyZWRpdERpc3RyaWJ1dGlvbggcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgAFAEUcm91bmQ4AShSb3VuZEluZGV4AAE8aW5pdGlhbF9iYWxhbmNlxAEcQmFsYW5jZQABRHJlbWFpbmluZ19iYWxhbmNlxAEcQmFsYW5jZQABMHRvdGFsX3BvaW50cygBJFZvdGVDb3VudAABFHN0YXJ0OAEsQmxvY2tOdW1iZXIAAA0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQoEUwAABAAVCgEYVmVjPFQ+AAARCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldDhQYXlvdXRTY2hlZHVsZQgcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgADAEkcmVtYWluaW5nOAEoUm91bmRJbmRleAABQGFtb3VudF9wZXJfcm91bmTEARxCYWxhbmNlAAEYcGVyaW9kOAEsQmxvY2tOdW1iZXIAABUKAAACEQoAGQoMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAwBCHU4AAAdCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldBRFcnJvcgQEVAABUChOb1N1Y2hDYXNlAAAEYFRoZSBjYXNlIGRvZXMgbm90IGV4aXN0LihOb1N1Y2hWb3RlAAEEYFRoZSB2b3RlIGRvZXMgbm90IGV4aXN0LhxOb3RPcGVuAAIEVFRoZSBjYXNlIGlzIG5vdCBvcGVuLhxOb3RSaXBlAAMEVFRoZSBjYXNlIGlzIG5vdCByaXBlLhxOb3REb25lAAQEZFRoZSBjYXNlIGlzIG5vdCB5ZXQgZG9uZS4oQ29kZWNFcnJvcgAFBFUBVGhlIGRlY29kZSBvZiB0aGUgY2FsbCBmYWlsZWQuIE1heWJlIHRoZXJlIHdhcyBhIGJyZWFraW5nIHJ1bnRpbWUgdXBncmFkZSBpbiBiZXR3ZWVuPzREaXNwYXRjaEVycm9yAAYETQFUaGUgY2FsbCBmYWlsZWQgdG8gZGlzcGF0Y2guIE1heWJlIHRoZXJlIHdhcyBhIGJyZWFraW5nIHJ1bnRpbWUgdXBncmFkZSBpbiBiZXR3ZWVuPxhSZWNlbnQABwSQVGhlIGNhc2UgaXMgdG9vIHJlY2VudCB0byBiZSByZWFwZWQuIE5vQ3JlZGl0AAgEoE5vdCBlbm91Z2ggY3JlZGl0IHRvIHBheW91dCB0aGUgcmV3YXJkcy4gTm9SZXdhcmQACQTUTm8gbW9iIGNyZWRpdCBkaXN0cmlidXRpb24gaW4gcGxhY2UgdG8gcmV3YXJkIHZvdGVycy4gTm9Qb2ludHMACgSgTm8gcG9pbnRzIHRvIGJlIGNvbnZlcnRlZCB0byBtb2IgY3JlZGl0LjRUb29NYW55Q2xhaW1zAAsEVFRvbyBtYW55IHZvdGUgY2xhaW1zLiBOb1BheW91dAAMBFhObyBwYXlvdXQgaW4gcHJvZ3Jlc3MuSEFyaXRobWV0aWNPdmVyZmxvdwANBLRUaGUgcG9pbnQgYW5kL29yIGNyZWRpdCBhcml0aG1ldGljIG92ZXJmbG93cy5AVG9vTWFueVNjaGVkdWxlcwAOBIBUb28gbWFueSBwYXlvdXQgcm91bmQgc2NoZWR1bGVzLihOb1NjaGVkdWxlAA8EfE5vIHBheW91dCByb3VuZCBzY2hlZHVsZSBmb3VuZC4kTm9QZW5hbHR5ABAEWE5vIHZvdGUgcGVuYWx0eSBmb3VuZC4URWFybHkAEQSUVGhlIHZvdGUgcGVuYWx0eSBoYXMgbm90IGV4cGlyZWQgeWV0LjBVbmRlclBlbmFsdHkAEgToVGhlIHZvdGUgY2Fubm90IGJlIGNhc3QgZHVlIHRvIGEgdm90aW5nIHBlbmFsdHkgaW4gZWZmZWN0LlhDYXNlRXhwaXJhdGlvbkRpc2FibGVkABMEHQFUaGUgb3BlbiBjYXNlIGV4cGlyYXRpb24gaXMgZGlzYWJsZWQgZHVlIHRvIGluc3VmZmljaWVudCBhY3RpdmUgdm90ZXJzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4hCgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQkQ2FuZGlkYXRlECxKdWRnZW1lbnRJZAE4HERlcG9zaXQBJQosQmxvY2tOdW1iZXIBOCRBY2NvdW50SWQBBAEMHEFwcGxpZWQMARBjcmVkKQoBrENyZWRpYmlsaXR5PERlcG9zaXQsIFBlcnNvbmFsSWQsIEFjY291bnRJZD4AARxlbnRyb3B5CAEcRW50cm9weQABNGVudHJvcHlfc2luY2U4ASxCbG9ja051bWJlcgAAACBTZWxlY3RlZCABFHNpbmNlOAEsQmxvY2tOdW1iZXIAARBjcmVkKQoBrENyZWRpYmlsaXR5PERlcG9zaXQsIFBlcnNvbmFsSWQsIEFjY291bnRJZD4AASByZXNlcnZlZCgBKFBlcnNvbmFsSWQAARxlbnRyb3B5CAEcRW50cm9weQABGGRlc2lnbvUJARxJbmtTcGVjAAEoYWxsb2NhdGlvbi0KAShBbGxvY2F0aW9uAAEcanVkZ2luZwkDAUxPcHRpb248SnVkZ2VtZW50SWQ+AAEYZmFpbGVkOAEcQ291bnRlcgABABhQcm92ZW4QARhkZXNpZ271CQEcSW5rU3BlYwABIHJlc2VydmVkKAEoUGVyc29uYWxJZAABMHdhc19yZWZlcnJlZMgBEGJvb2wAASx3YXNfaW52aXRlZMgBEGJvb2wAAgAAJQoUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAxAEoRjo6QmFsYW5jZQAAKQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0LENyZWRpYmlsaXR5DBxEZXBvc2l0ASUKKFBlcnNvbmFsSWQBKCRBY2NvdW50SWQBBAEMIFJlZmVycmVkBAAoAShQZXJzb25hbElkAAAAHERlcG9zaXQEACUKARxEZXBvc2l0AAEAHEludml0ZWQEAAQBJEFjY291bnRJZAACAAAtCgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQoQWxsb2NhdGlvbgABDBxJbml0aWFsAAAAIEluaXREb25lAAEAEEZ1bGwAAgAAMQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0GFBlcnNvbgQ8Qm91bmRlZEFjY291bnRzATUKACQBGGRlc2lnbjkKATxPcHRpb248SW5rU3BlYz4AAUBhY3RpdmVfcmVmZXJyYWxzNQoBPEJvdW5kZWRBY2NvdW50cwABYGFsbG93ZWRfcmVmZXJyYWxfdGlja2V0czgBHENvdW50ZXIAATRiYWRfcmVmZXJyYWxzOAEcQ291bnRlcgABUHN1Y2Nlc3NmdWxfcmVmZXJyYWxzOAEcQ291bnRlcgABJHJlZmVycmFsczgBHENvdW50ZXIAASxkZXJpdmF0aXZlczgBHENvdW50ZXIAARhiYW5uZWTIARBib29sAAFgcGVuZGluZ19yZWZlcnJhbF9yZXdhcmRzOAEcQ291bnRlcgAANQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEEBFMAAAQAzAEYVmVjPFQ+AAA5CgQYT3B0aW9uBARUAfUJAQgQTm9uZQAAABBTb21lBAD1CQAAAQAAPQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFBCgRTAAAEAEUKARhWZWM8VD4AAEEKDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldDhSZWZlcnJhbFRpY2tldAQYVGlja2V0AQQABAEYdGlja2V0BAEYVGlja2V0AABFCgAAAkEKAEkKDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldBhGYW1pbHkAAAgBEGtpbmRpBAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQAAE0KAAAECC0DLQMAUQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0MERlc2lnblN0YXR1cwABCCBSZXNlcnZlZAAAACRDb21taXR0ZWQAAQAAVQoAAAQIBAQAWQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0FEVycm9yBARUAAGgKEluUHJvZ3Jlc3MAAATMQWNjb3VudCBpcyBhbHJlYWR5IGFwcGx5aW5nIHRvIG1ha2UgYSBwcm9vZi1vZi1pbmsuKE5vUmVmZXJyYWwAAQR4QWNjb3VudCBoYXMgbm90IGJlZW4gcmVmZXJyZWQuKEJhZENvbnRleHQAAgToVGhlIGNhbGxiYWNrIGNvbnRleHQgaXMgaW52YWxpZDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLkxVbmV4cGVjdGVkSnVkZ2VtZW50AAMEIQFUaGUgaW5jb21pbmcganVkZ2VtZW50IElEIGlzIG5vdCB3aGF0IHdlIHdlcmUgZXhwZWN0aW5nIGZvciB0aGUgYWNjb3VudC4YTm9BcmdzAAQEuE5vIGFyZ3VtZW50cyB3ZXJlIHN1cHBsaWVkIHdpdGggdGhlIGp1ZGdlbWVudC4oTm90QXBwbGllZAAFBMxUaGUgYWNjb3VudCBoYXMgbm90IGFwcGxpZWQgdG8gbWFrZSBhIHByb29mLW9mLWluay4sTm90U2VsZWN0ZWQABgSwVGhlIGNhbmRpZGF0ZSBoYXMgbm90IGNvbW1pdHRlZCB0byBhIGRlc2lnbi4kTm90UHJvdmVuAAcErFRoZSBjYW5kaWRhdGUgZGlkIG5vdCBwcm92ZSB0aGVtc2VsdmVzIHlldC44QWxyZWFkeVN0YXJ0ZWQACATIVGhlIGNhbmRpZGF0ZSBoYXMgYWxyZWFkeSBzdGFydGVkIHRoZWlyIGp1ZGdlbWVudC4oT3V0T2ZSYW5nZQAJBIBUaGUgcGVyc29uYWwgSUQgaXMgbm90IGluIHJhbmdlLjBBbHJlYWR5VGFrZW4ACgScVGhlIHBlcnNvbmFsIElEIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uPE5vTW9yZVJlZmVycmFscwALBLhUaGUgcGVyc29uIGhhcyBubyBtb3JlIHJlZmVycmFscyBsZWZ0IHRvIGdpdmUuIFRvb0Vhcmx5AAwEYFRoZSByZXJvbGwgaXMgdG9vIGVhcmx5LjREZXNpZ25JbnZhbGlkAA0EoFRoZSByZWZlcnJlcidzIGRlc2lnbiBpcyBub3QgcHJvY2VkdXJhbC4sRGVzaWduVGFrZW4ADgScVGhlIHJlZmVycmVyJ3MgZGVzaWduIGlzIGFscmVhZHkgdGFrZW4uJEJhZFBhcmVudAAPBBUBVGhlIHJlZmVycmVyIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgcGVyc29uLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uJEJhZEZhbWlseQAQBIBUaGUgZGVzaWduIGZhbWlseSBkb2Vzbid0IGV4aXN0LixXcm9uZ0ZhbWlseQARBLRUaGUgZGVzaWduIGZhbWlseSBpcyBpbnZhbGlkIGZvciB0aGlzIGNob2ljZS4sSW5kZXhUb29CaWcAEgRBAVRoZSBpbmRleCBvZiB0aGUgZGVzaWduIG9yIHZhcmlhbnQgaXMgYmV5b25kIHRoZSBhbGxvd2VkIG1heGltdW0gZm9yIHRoZSBmYW1pbHkuEEJ1c3kAEwT4VGhlIHN5c3RlbSBpcyBidXN5IHdpdGggdG9vIG1hbnkgY29tbWl0bWVudHM7IHRyeSBhZ2FpbiBsYXRlci4YQmFubmVkABQEqFRoZSBwZXJzb24gaGFzIGJlZW4gYmFubmVkIGZyb20gcmVmZXJyaW5nLihJbXByb2JhYmxlABUEJQFUaGUgY2FuZGlkYXRlIGhhcyBub3QgZGVtb25zdHJhdGVkIHByb2JhYmx5IHRocm91Z2ggdGhlIGluaXRpYWwgZXZpZGVuY2UuKElkUmVzZXJ2ZWQAFgTAVGhlIHBlcnNvbmFsIGlkZW50aXR5IGhhcyBhbHJlYWR5IGJlZW4gcmVzZXJ2ZWQuGElkVXNlZAAXBOhUaGUgcGVyc29uYWwgaWRlbnRpdHkgaXMgYWxyZWFkeSB0YWtlbiBieSBhIHByb3ZlbiBwZXJzb24uNEludmFsaWRUaWNrZXQAGAR8VGhlIHRpY2tldCBwcm92aWRlZCBpcyBpbnZhbGlkLiBOb1RpY2tldAAZBPBUaGUgY2FsbGVyIGhhcyBub3QgcHJvdmlkZWQgYSByZWZlcnJhbCBvciBpbnZpdGF0aW9uIHRpY2tldC40Tm90QXV0aG9yaXplZAAaBKRUaGUgYWNjb3VudCBpcyBub3QgYXV0aG9yaXplZCB0byBkbyB0aGlzLiROb3RQZXJzb24AGwSQVGhlIHBlcnNvbmFsIGlkZW50aXR5IGRvZXNuJ3QgZXhpc3QuRFJlZmVycmVkQ2FuZGlkYXRlABwEXQFUaGUgY2FuZGlkYXRlIGlzIHJlZmVycmVkLiBCdXQgdGhlIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2FuZGlkYXRlIHRvIG5vdCBiZSByZWZlcnJlZC5QTm90UmVmZXJyZWRDYW5kaWRhdGUAHQRdAVRoZSBjYW5kaWRhdGUgaXMgbm90IHJlZmVycmVkLiBCdXQgdGhlIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2FuZGlkYXRlIHRvIGJlIHJlZmVycmVkLkhOb1Jld2FyZFRvUmVnaXN0ZXIAHgSgVGhlcmUgaXMgbm8gcmVmZXJyYWwgcmV3YXJkIHRvIHJlZ2lzdGVyLkBSZXdhcmRUb1JlZ2lzdGVyAB8EBQFUaGVyZSBpcyBhIHBlbmRpbmcgcmVmZXJyYWwgcmV3YXJkIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkIGZpcnN0LiROb0ludml0ZXIAIARETm8gaW52aXRlciBmb3VuZC5ASW52YWxpZFNpZ25hdHVyZQAhBEhJbnZhbGlkIHNpZ25hdHVyZS4kTm9JbnZpdGVzACIEUE5vIGludml0ZSBhdmFpbGFibGUuOEFscmVhZHlJbnZpdGVkACMEWEludml0ZSBpcyBhbHJlYWR5IHNldC4oTm9SZWZlcnJlcgAkBHRUaGUgcmVmZXJyZXIgaXMgbm90IGEgcGVyc29uLjBOb3RQb2lQZXJzb24AJQToVGhlIGluZGl2aWR1YWwgaXMgbm90IGEgcGVyc29uIHJlY29nbml6ZWQgYnkgcHJvb2Ygb2YgaW5rLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAAmBIhUaGUgcHJvb2Ygb2Ygb3duZXJzaGlwIGlzIGludmFsaWQuaEludmFsaWRSZWltYnVyc2VtZW50VmFsdWVzACcElFRoZSByZWltYnVyc2VtZW50IHZhbHVlcyBhcmUgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuXQoAAAQIuQYIAGEKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlczhBcmNoaXZlZFBsYXllcgQsQmxvY2tOdW1iZXIBOAEIIEtpY2thYmxlCAEoZmlyc3RfZ2FtZTgBDHUzMgABOGFyY2hpdmVkX3NpbmNlOAEsQmxvY2tOdW1iZXIAAAAoVW5raWNrYWJsZQQBKGZpcnN0X2dhbWU4AQx1MzIAAQAAZQoMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzGFBsYXllcgQsUGxheURlcG9zaXQBaQoAGAEoZmlyc3RfZ2FtZTgBDHUzMgABKHJlZ2lzdGVyZWTIARBib29sAAEsc2VudF9yZXBvcnTIARBib29sAAEoeWVzX3BlcnNvbgwBCHU4AAE0bm9fbm90X3BlcnNvbgwBCHU4AAEsY3JlZGliaWxpdHltCgF4UGxheWVyQ3JlZGliaWxpdHk8UGxheURlcG9zaXQ+AABpChQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zIGZ1bmdpYmxlREhvbGRDb25zaWRlcmF0aW9uFARBAARGAARSAAREAAhGcAAABADEAShGOjpCYWxhbmNlAABtCgxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXNEUGxheWVyQ3JlZGliaWxpdHkELFBsYXlEZXBvc2l0AWkKAQwcSW52aXRlZAAAAChSZWNvZ25pemVkAAEAHERlcG9zaXQEAGkKASxQbGF5RGVwb3NpdAACAABxCgxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXMgR2FtZUluZm8EJEFjY291bnRJZAEEACABFGluZGV4OAEMdTMyAAFEcmVnaXN0cmF0aW9uX2VuZHM4AQx1MzIAAUBzaHVmZmxlX2RlYWRsaW5lOAEMdTMyAAEkZ2FtZV9kYXRlOAEMdTMyAAEscmVwb3J0X2VuZHM4AQx1MzIAARRzdGF0ZXUKAVBHYW1lU3RhdGU8QWNjb3VudElkPgABOG1heF9ncm91cF9zaXplOAEMdTMyAAEYcm91bmRzDAEIdTgAAHUKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlcyRHYW1lU3RhdGUEJEFjY291bnRJZAEEARQwUmVnaXN0cmF0aW9uBAFEbmV4dF9wbGF5ZXJfaW5kZXg4AQx1MzIAAAAcU2h1ZmZsZQQBEHN0ZXB5CgFYU2h1ZmZsZVN0ZXA8QWNjb3VudElkPgABACRSZXBvcnRpbmcEATBwbGF5ZXJfY291bnQ4AQx1MzIAAgA0UGxheWVyUHJvY2VzcwQBOGxhc3RfaXRlcmF0aW9ufQoBiE9wdGlvbjxBY2NvdW50T3JQZXJzb248QWNjb3VudElkPj4AAwAoQ2FuY2VsbGluZwQBOGxhc3RfaXRlcmF0aW9ufQoBiE9wdGlvbjxBY2NvdW50T3JQZXJzb248QWNjb3VudElkPj4ABAAAeQoMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzLFNodWZmbGVTdGVwBCRBY2NvdW50SWQBBAEILFN0ZXAxSW5zZXJ0BAE4bGFzdF9pdGVyYXRpb259CgGIT3B0aW9uPEFjY291bnRPclBlcnNvbjxBY2NvdW50SWQ+PgAAADRTdGVwMlJldHJpZXZlCAFEbmV4dF9wbGF5ZXJfaW5kZXg4AQx1MzIAAUxyZWNvZ25pemVkX2ZpbmlzaGVkyAEQYm9vbAABAAB9CgQYT3B0aW9uBARUAbkGAQgQTm9uZQAAABBTb21lBAC5BgAAAQAAgQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAWQQBGFZlYzxUPgAAhQoAAAQIDDgAiQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAWQQBGFZlYzxUPgAAjQoAAAQIDAgAkQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGZBARTAAAEAJUEARhWZWM8VD4AAJUKDERpbmRpdl9wYWxsZXRfZ2FtZRhwYWxsZXQURXJyb3IEBFQAAWwsR2FtZU9uZ29pbmcAAAQ0R2FtZSBvbmdvaW5nLjhOb1JlZ2lzdHJhdGlvbgABBHhObyByZWdpc3RyYXRpb24gcGhhc2Ugb25nb2luZy5ET3V0ZGF0ZWRHYW1lU2V0dXAAAgRYVGhlIHNldHVwIGlzIG91dGRhdGVkLkBJbnZhbGlkR2FtZVNldHVwAAMEOEludmFsaWQgc2V0dXAuNEludmFsaWRSZXBvcnQABAQ8SW52YWxpZCByZXBvcnQuGE5vR2FtZQAFBEBObyBnYW1lIG9uZ29pbmcuLE5vUmVwb3J0aW5nAAYEYE5vIHJlcG9ydCBwaGFzZSBvbmdvaW5nLjROb3RSZWdpc3RlcmVkAAcEPE5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAAIBGhQbGF5ZXIgYWxyZWFkeSByZWdpc3RlcmVkLkRSZXBvcnRBbHJlYWR5U2VudAAJBFBSZXBvcnQgYWxyZWFkeSBzZW50LhRFYXJseQAKBGxPcGVyYXRpb24gaXMgbm90IHZhbGlkIHlldC5ETm90S2lja2FibGVQbGF5ZXIACwSYVGhlIG9wZXJhdGlvbiBleHBlY3QgYSBwbGF5ZXIgYWNjb3VudC5ATm9BcmNoaXZlZFBsYXllcgAMBGRObyBhcmNoaXZlZCBwbGF5ZXIgZm91bmQuIE5vVGlja2V0AA0EQE5vIHRpY2tldCBmb3VuZC4kTm9JbnZpdGVzAA4EUE5vIGludml0ZSBhdmFpbGFibGUuOEFscmVhZHlJbnZpdGVkAA8EWEludml0ZSBpcyBhbHJlYWR5IHNldC5ATm90QWNjb3VudFBsYXllcgAQBPhOb3QgYW4gYWNjb3VudCBiYXNlZCBwbGF5ZXIsIGV4cGVjdGVkIGFuIGFjY291bnQgYmFzZWQgcGxheWVyLmhVc2VJbnZpdGVCdXRBbHJlYWR5UGxheWluZwARBMhUaGUgcGxheWVyIGNhbid0IHVzZSBhbiBpbnZpdGUgaWYgYWxyZWFkeSBwbGF5aW5nLlBUb29NYW55R2FtZVNjaGVkdWxlcwASBEEBVGhlIG51bWJlciBvZiBleGlzdGluZyBzY2hlZHVsZXMgYW5kIG5ldyBzY2hlZHVsZXMgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBsaW1pdC5MTm9TdWNoR2FtZVNjaGVkdWxlZAATBCkBVGhlIGdhbWUgdGhhdCB3YXMgc3VwcG9zZWQgdG8gYmUgcmVtb3ZlZCB3YXMgbm90IGZvdW5kIGluIHNjaGVkdWxlZCBnYW1lcy6ASW52YWxpZFN0YXRlbWVudEFjY291bnRTaWduYXR1cmUAFASsVGhlIHN0YXRlbWVudCBhY2NvdW50IHNpZ25hdHVyZSBpcyBpbnZhbGlkLnBTdGF0ZW1lbnRBY2NvdW50QWxyZWFkeUluVXNlABUE7FRoZSBzdGF0ZW1lbnQgYWNjb3VudCBpcyBhbHJlYWR5IGluIHVzZWQgYnkgYW5vdGhlciBwbGF5ZXIuZEludGVybmFsRXJyb3JJbnZhbGlkU3RhdGUAFgR0SW50ZXJuYWwgZXJyb3IgaW52YWxpZCBzdGF0ZS5ASW52YWxpZEdhbWVTdGF0ZQAXBPBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgaW4gdGhlIGN1cnJlbnQgZ2FtZSBzdGF0ZS4gTm9QbGF5ZXIAGARATm8gcGxheWVyIGZvdW5kLpBDYW5ub3RPZmZib2FyZFdoaWxlUmVnaXN0ZXJlZEZvckdhbWUAGQTcVGhlIHBsYXllciBjYW5ub3Qgb2ZmYm9hcmQgd2hpbGUgcmVnaXN0ZXJlZCBmb3IgYSBnYW1lLjBJbnZhbGlkU3RhdGUAGgQ0SW52YWxpZCBzdGF0ZQSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6ZCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzLFBhcnRpY2lwYW50BBxCYWxhbmNlAcQAIAEUc2NvcmU4AQx1MzIAARhzdHJlYWudCgEYU3RyZWFrAAFIYXR0ZW5kYW5jZV9oaXN0b3J5oQoBREF0dGVuZGFuY2VIaXN0b3J5AAEYY3JlZGl0xAEcQmFsYW5jZQABKGNhc2hlZF9vdXTIARBib29sAAFIcmVhY2hlZF9wZXJzb25ob29kyAEQYm9vbAABbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZMgBEGJvb2wAASxyZWNvZ25pdGlvbqUKASxSZWNvZ25pdGlvbgAAnQoMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlcxhTdHJlYWsAAQggQXR0ZW5kZWQEADgBDHUzMgAAABhBYnNlbnQEADgBDHUzMgABAAChCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzREF0dGVuZGFuY2VIaXN0b3J5AAAEAAwBCHU4AAClCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzLFJlY29nbml0aW9uAAEQUEV4dGVybmFsbHlSZWNvZ25pemVkAAAANE5vdFJlY29nbml6ZWQAAQAkU3VzcGVuZGVkBAAoAShQZXJzb25hbElkAAIAKFJlY29nbml6ZWQEACgBKFBlcnNvbmFsSWQAAwAAqQoAAAQIOLkGAK0KDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXMsUm91bmRQYXlvdXQEHEJhbGFuY2UBxAAQAURyZW1haW5pbmdfYmFsYW5jZcQBHEJhbGFuY2UAASxwb2ludF9wcmljZcQBHEJhbGFuY2UAASRyZW1haW5kZXLEARxCYWxhbmNlAAEwdG90YWxfcG9pbnRzOAEMdTMyAACxCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzJFJvdW5kSW5mbwgsQmxvY2tOdW1iZXIBOBxCYWxhbmNlAcQACAEkZmluaXNoX2F0OAEsQmxvY2tOdW1iZXIAARhjcmVkaXTEARxCYWxhbmNlAAC1CgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbkKBFMAAAQAvQoBGFZlYzxUPgAAuQoMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlczhQYXlvdXRTY2hlZHVsZQgcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgADAEkcmVtYWluaW5nOAEMdTMyAAFAYW1vdW50X3Blcl9yb3VuZMQBHEJhbGFuY2UAASBkdXJhdGlvbjgBLEJsb2NrTnVtYmVyAAC9CgAAArkKAMEKDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0FEVycm9yBARUAAFUJE5vdFBlcnNvbgAABIxUaGUgY2FsbGluZyBvcmlnaW4gaXMgbm90IGEgcGVyc29uLlxIYXNOb3RSZWFjaGVkUGVyc29uaG9vZAABBIxUaGUgcGVyc29uIGRpZG4ndCByZWFjaCBwZXJzb25ob29kLiBOb1Jld2FyZAACBFBObyByZXdhcmQgYXZhaWxhYmxlLhxOb1Njb3JlAAMEjFRoZSBwZXJzb24gaGFzIG5vIGFzc29jaWF0ZWQgc2NvcmUuKE5vU2NoZWR1bGUABAR0Tm8gcGF5b3V0IHNjaGVkdWxlIGF2YWlsYWJsZS5AVG9vTWFueVNjaGVkdWxlcwAFBLRUb28gbWFueSBwYXlvdXQgc2NoZWR1bGVzIGFscmVhZHkgcmVnaXN0ZXJlZC4oUmVjb2duaXplZAAGBAUBVGhlIHBhcnRpY2lwYW50IGlzIHJlY29nbml6ZWQgb3IgaGFzIGJlZW4gcmVjb2duaXplZCBhcyBhIHBlcnNvbi48Q2FzaE91dENvb2xkb3duAAcEzFRoZSBwYXJ0aWNpcGFudCBoYXMgYWxyZWFkeSBjYXNoZWQgb3V0IGluIHRoaXMgZXJhLmBSb3VuZE9uR29pbmdPck5vU2NoZWR1bGUACASUVGhlIHJvdW5kIGlzIG9uIGdvaW5nIG9yIG5vIHNjaGVkdWxlLhxOb1JvdW5kAAkEhFRoZSBwYXlvdXQgcm91bmQgaGFzIG5vdCBzdGFydGVkLmxCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWQACgTQVGhlIG9yaWdpbiBpcyBuZWl0aGVyIGEgcGVyc29uIG5vciBhIHNpZ25lZCBhY2NvdW50LsBCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQACwQ9AVRoZSBvcmlnaW4gaXMgbmVpdGhlciBhIHBlcnNvbiBub3IgYSBzaWduZWQgYWNjb3VudCBub3IgYW4gYWNjb3VudCBwYXJ0aWNpcGFudC6cQmFkT3JpZ2luTm90U2lnbmVkTm90QWNjb3VudFBhcnRpY2lwYW50AAwECQFUaGUgb3JpZ2luIGlzIG5laXRoZXIgYSBzaWduZWQgYWNjb3VudCBub3IgYW4gYWNjb3VudCBwYXJ0aWNpcGFudC5QQWxyZWFkeVBhcnRpY2lwYXRpbmcADQSkVGhlIHBhcnRpY2lwYW50IGlzIGFscmVhZHkgcGFydGljaXBhdGluZy5ES2V5TXVzdEJlUHJvdmlkZWQADgRkVGhlIGtleSBtdXN0IGJlIHByb3ZpZGVkLlBLZXlNdXN0Tm90QmVQcm92aWRlZAAPBHRUaGUga2V5IG11c3Qgbm90IGJlIHByb3ZpZGVkLlBIYXNSZWFjaGVkUGVyc29uaG9vZAAQBIxIYXMgcmVhY2hlZCBwZXJzb25ob29kIGluIHRoZSBwYXN0LlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAARBIhUaGUgcHJvb2Ygb2Ygb3duZXJzaGlwIGlzIGludmFsaWQuOFdpbmRvd1Rvb0xhcmdlABIEPQFBbiBhYnNlbmNlIGdyYWNlIHRpZXIgaGFzIGEgd2luZG93IGV4Y2VlZGluZyB0aGUgbWF4aW11bSB0cmFja2FibGUgaGlzdG9yeSAoOCkuVEFsbG93ZWRNaXNzZXNUb29MYXJnZQATBCEBVGhlIGFsbG93ZWQgbWlzc2VzIG11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSB3aW5kb3cgKG9yIGJvdGggemVybykuRFNjaGVkdWxlTm90U29ydGVkABQE+FRpZXJzIG11c3QgYmUgc29ydGVkIGJ5IGFzY2VuZGluZyBgcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZGAuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LsUKDFhpbmRpdl9wYWxsZXRfZHVtbXlfZGltGHBhbGxldBhSZWNvcmQEDEtleQFRBAAIAQxrZXlRBAEMS2V5AAEkc3VzcGVuZGVkyAEQYm9vbAAAyQoMWGluZGl2X3BhbGxldF9kdW1teV9kaW0YcGFsbGV0FEVycm9yBARUAAEQJE5vdFBlcnNvbgAABNxUaGUgcGVyc29uYWwgSUQgZG9lcyBub3QgYmVsb25nIHRvIGEgcmVjb2duaXplZCBwZXJzb24uME5vdFN1c3BlbmRlZAABBNhUaGUgcGVyc29uYWwgSUQgZG9lcyBub3QgYmVsb25nIHRvIGEgc3VzcGVuZGVkIHBlcnNvbi4sTm90UmVzZXJ2ZWQAAgTkVGhlIHBlcnNvbmFsIElEIGlzIG5vdCByZXNlcnZlZCBhbmQgYXdhaXRpbmcgcmVjb2duaXRpb24uNFRvb01hbnlQZW9wbGUAAwTAVGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWFueSBwZW9wbGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ls0KDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXM4TGl0ZVBlcnNvbkluZm8IGE1lbWJlcgFRBBhNZXRob2QB0QoACAEwcmluZ192cmZfa2V5UQQBGE1lbWJlcgABGG1ldGhvZNEKARhNZXRob2QAANEKDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXNEUmVjb2duaXRpb25NZXRob2QEHEFjY291bnQBBAEEMFVuaXF1ZURldmljZQQABAEcQWNjb3VudAAAAADVCgxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBRFcnJvcgQEVAABEFhOb0F0dGVzdGF0aW9uQWxsb3dhbmNlAAAEZE5vIGF0dGVzdGF0aW9uIGFsbG93YW5jZS5sSW52YWxpZEF0dGVzdGF0aW9uU2lnbmF0dXJlAAEE8FRoZSBzaWduYXR1cmUgY3JlYXRlZCBieSB0aGUgY2FuZGlkYXRlJ3MgYWNjb3VudCBpcyBpbnZhbGlkLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAACBAUBVGhlIHNpZ25hdHVyZSBjcmVhdGVkIGJ5IHRoZSBjYW5kaWRhdGUncyByaW5nIHZyZiBrZXkgaXMgaW52YWxpZC5EQWxyZWFkeVJlZ2lzdGVyZWQAAwSQVGhlIGNhbmRpZGF0ZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LtkKDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzFHR5cGVzMENvbnN1bWVySW5mbwQEVAAAFAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAATRmdWxsX3VzZXJuYW1l3QQBQE9wdGlvbjxVc2VybmFtZT4AATRsaXRlX3VzZXJuYW1lOQQBIFVzZXJuYW1lAAEsY3JlZGliaWxpdHndCgEsQ3JlZGliaWxpdHkAAUBzdG10X3N0b3JlX3Nsb3Rz4QoBRFN0bXRTdG9yZVNsb3RzPFQ+AADdCgxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlcyxDcmVkaWJpbGl0eQABCBBMaXRlAAAAGFBlcnNvbgwBFGFsaWFzCAEUQWxpYXMAASxsYXN0X3VwZGF0ZSgBDHU2NAABHGRlbW90ZWTIARBib29sAAEAAOEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB5QoEUwAABADpCgEYVmVjPFQ+AADlCgxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlczRTdG10U3RvcmVTbG90BARUAAEIIE9jY3VwaWVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABFHNpbmNlKAEMdTY0AAAAEEZyZWUAAQAA6QoAAALlCgDtCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAfEKBFMAAAQA9QoBGFZlYzxUPgAA8QoMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXNUUmVzZXJ2YXRpb25RdWV1ZUVudHJ5BBxBY2NvdW50AQQACAEcYWNjb3VudAQBHEFjY291bnQAASRqb2luZWRfYXQoAQx1NjQAAPUKAAAC8QoA+QoMSHNwX3N0YXRlbWVudF9zdG9yZSxydW50aW1lX2FwaThWYWxpZFN0YXRlbWVudAAACAEkbWF4X2NvdW50OAEMdTMyAAEgbWF4X3NpemU4AQx1MzIAAP0KDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzGHBhbGxldBRFcnJvcgQEVAABUDxJbnZhbGlkVXNlcm5hbWUAAAScVXNlcm5hbWUgZG9lcyBub3QgZml0IHRoZSByZXF1aXJlbWVudHMuNFVzZXJuYW1lVGFrZW4AAQRoVXNlcm5hbWUgaXMgYWxyZWFkeSB0YWtlbi5EQWxyZWFkeVJlZ2lzdGVyZWQAAgR8Q29uc3VtZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAADBJxQcm92aWRlZCBwcm9vZiBvZiBvd25lcnNoaXAgaXMgaW52YWxpZC40Tm90UmVnaXN0ZXJlZAAEBJxQZXJzb24gaXMgbm90IHJlZ2lzdGVyZWQgYXMgYSBjb25zdW1lci40Tm90RnVsbFBlcnNvbgAFBHhDb25zdW1lciBpcyBub3QgYSBmdWxsIHBlcnNvbi40VG91Y2hOb3RSZWFkeQAGBMxBdHRlbXB0ZWQgdG8gdXBkYXRlIHBlcnNvbiBhdXRob3JpemF0aW9uIHRvbyBlYXJseS40Tm9SZXNlcnZhdGlvbgAHBGhSZXNlcnZhdGlvbiBpcyBub3QgYWN0aXZlLlBOb3RSZXNlcnZhdGlvbkhvbGRlcgAIBBUBVGhlIGxpbmtlZCBsaXRlIGlkZW50aXR5IGlzIG5vdCB0aGUgYWN0aXZlIGhvbGRlciBvZiB0aGUgcmVzZXJ2YXRpb24uYFVzZXJuYW1lUmVzZXJ2YXRpb25UYWtlbgAJBORUaGUgdXNlcm5hbWUgaW4gdGhlIHJlc2VydmF0aW9uIHJlcXVlc3QgaXMgYWxyZWFkeSB0YWtlbi5AUmVzZXJ2YXRpb25GcmVzaAAKBIBUaGUgcmVzZXJ2YXRpb24gaGFzIG5vdCBleHBpcmVkLkBOb0xpbmtlZElkZW50aXR5AAsEnFRoZXJlIGlzIG5vIGxpdGUgY29uc3VtZXIgdG8gYmUgbGlua2VkLjRBbHJlYWR5TGlua2VkAAwE+FRoZSBsaXRlIGNvbnN1bWVyIGlzIGFscmVhZHkgbGlua2VkIHRvIGEgZnVsbCBwZXJzb24gY29uc3VtZXIuLEludmFsaWRTbG90AA0EqFRoZSByZXF1ZXN0ZWQgc2xvdCBudW1iZXIgaXMgb3V0IG9mIHJhbmdlLmhBY2NvdW50QWxyZWFkeUhhc0FsbG93YW5jZQAOBMRUaGUgYWNjb3VudCBhbHJlYWR5IGhhcyBhbiBhbGxvd2FuY2UgaW4gdGhlIHNsb3QuUFBlcnNvbkF1dGhOb3RFeHBpcmVkAA8EvFRoZSBwZXJzb24ncyBhdXRob3JpemF0aW9uIGhhcyBub3QgZXhwaXJlZCB5ZXQuOEFscmVhZHlEZW1vdGVkABAEkFRoZSBwZXJzb24gaGFzIGFscmVhZHkgYmVlbiBkZW1vdGVkLiRRdWV1ZUZ1bGwAEQSAUXVldWUgZm9yIHRoaXMgdXNlcm5hbWUgaXMgZnVsbC4oTm90SW5RdWV1ZQASBLhBY2NvdW50IGlzIG5vdCBpbiB0aGUgcXVldWUgZm9yIHRoaXMgdXNlcm5hbWUuVEFscmVhZHlIYXNSZXNlcnZhdGlvbgATBNxBY2NvdW50IGFscmVhZHkgaGFzIGEgcmVzZXJ2YXRpb24gZm9yIGFub3RoZXIgdXNlcm5hbWUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgELAAAECPEEOAAFCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQkLBFMAAAQADQsBGFZlYzxUPgAACQsAAAMwAAAADAANCwAAAgkLABELDGxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXIYcGFsbGV0FEVycm9yBARUAAEMNENodW5rTm90Rm91bmQAAASgVGhlIHJlcXVlc3RlZCBjaHVuayBpbmRleCBkb2Vzbid0IGV4aXN0LjRJbnZhbGlkQ2h1bmtzAAEEsFRoZSBwcm92aWRlZCBjaHVuayBkYXRhIGNvdWxkbid0IGJlIGRlY29kZWQuREludmFsaWRDaHVua1JhbmdlAAIE3FRoZSBzdGFydCBpbmRleCBpc24ndCBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIGVuZCBpbmRleC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuFQsMUGluZGl2X3BhbGxldF9tZW1iZXJzFHR5cGVzOENvbGxlY3Rpb25JbmZvCBxBY2NvdW50AQQgTG9jYXRpb24B4AAMARRvd25lchkLAYhDb2xsZWN0aW9uT3duZXI8QWNjb3VudCwgTG9jYXRpb24+AAEQbW9kZR0LASBSaW5nTW9kZQABJHJpbmdfc2l6ZfEEATBSaW5nRXhwb25lbnQAABkLDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlczxDb2xsZWN0aW9uT3duZXIIHEFjY291bnQBBCBMb2NhdGlvbgHgAQggRXh0ZXJuYWwEAOABIExvY2F0aW9uAAAAFExvY2FsBAAEARxBY2NvdW50AAEAAB0LEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5IFJpbmdNb2RlAAEIKEFwcGVuZE9ubHkAAAAgRmxleGlibGUAAQAAIQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQA9QQBGFZlYzxUPgAAJQsAAAQICDgAKQsMUGluZGl2X3BhbGxldF9tZW1iZXJzFHR5cGVzIFJpbmdSb290BARUAAAMARByb290LQsBME1lbWJlcnNPZjxUPgABIHJldmlzaW9uOAE0UmV2aXNpb25JbmRleAABMGludGVybWVkaWF0ZTELAURJbnRlcm1lZGlhdGVPZjxUPgAALQsAAAOAAQAADAAxCwAAA7ABAAAMADULAAAEDAg4OAA5CwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAVEEBFMAAAQATQQBGFZlYzxUPgAAPQsQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkoUmluZ1N0YXR1cwAADAEUdG90YWw4AQx1MzIAASBpbmNsdWRlZDgBDHUzMgABPGltbXV0YWJsZV9zaW5jZRUDASxPcHRpb248dTY0PgAAQQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAWQQBGFZlYzxUPgAARQsMUGluZGl2X3BhbGxldF9tZW1iZXJzFHR5cGVzME1lbWJlclJlY29yZAAACAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAASBwb3NpdGlvbkkLATBSaW5nUG9zaXRpb24AAEkLEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5MFJpbmdQb3NpdGlvbgABDChPbmJvYXJkaW5nBAEocXVldWVfcGFnZTgBJFBhZ2VJbmRleAAAACBJbmNsdWRlZAwBKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAASRyaW5nX3BhZ2U4ASRQYWdlSW5kZXgAATRyaW5nX3Bvc2l0aW9uOAEMdTMyAAEAJFN1c3BlbmRlZAACAABNCxA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eUBSaW5nTWVtYmVyc1N0YXRlAAAEARBtb2RlUQsBQFJpbmdNdXRhdGlvbk1vZGUAAFELEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5QFJpbmdNdXRhdGlvbk1vZGUAAQgoQXBwZW5kT25seQAAACBNdXRhdGluZwQADAEIdTgAAQAAVQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFRBARTAAAEAE0EARhWZWM8VD4AAFkLDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlc0BEZWxldGlvblByb2dyZXNzAAAIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABFHN0YWdlXQsBNERlbGV0aW9uU3RhZ2UAAF0LDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlczREZWxldGlvblN0YWdlAAEMNERlbGV0aW5nUmluZ3MAAABcRGVsZXRpbmdPbmJvYXJkaW5nUXVldWUAAQAoRmluYWxpemluZwACAABhCwxQaW5kaXZfcGFsbGV0X21lbWJlcnMYcGFsbGV0FEVycm9yBARUAAFsJE5vdE1lbWJlcgAABNBUaGUgc3VwcGxpZWQgaWRlbnRpZmllciBkb2VzIG5vdCByZXByZXNlbnQgYSBtZW1iZXIuGE5vUm9vdAABBERSaW5nIGhhcyBubyByb290LjBJbnZhbGlkUHJvb2YAAgRUVGhlIHByb29mIGlzIGludmFsaWQuKEluY29tcGxldGUAAwQFAVRoZSByb290IGNhbm5vdCBiZSBmaW5hbGl6ZWQgYXMgdGhlcmUgYXJlIHN0aWxsIHVucHVzaGVkIG1lbWJlcnMuKFN0aWxsRnJlc2gABARgVGhlIHJvb3QgaXMgc3RpbGwgZnJlc2guOFRvb01hbnlNZW1iZXJzAAUEiFRvbyBtYW55IG1lbWJlcnMgaGF2ZSBiZWVuIHB1c2hlZC48S2V5QWxyZWFkeUluVXNlAAYElEtleSBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIG1lbWJlci4sS2V5Tm90Rm91bmQABwSgVGhlIG9sZCBrZXkgd2FzIG5vdCBmb3VuZCB3aGVuIGV4cGVjdGVkLjBDb3VsZE5vdFB1c2gACASQQ291bGQgbm90IHB1c2ggbWVtYmVyIGludG8gdGhlIHJpbmcuLEludmFsaWRSaW5nAAkErFJpbmcgY2Fubm90IGJlIG1lcmdlZCBpZiBpdCdzIHRoZSB0b3AgcmluZy5IU3VzcGVuc2lvbnNQZW5kaW5nAAoE5FJpbmcgY2Fubm90IGJlIGJ1aWx0IHdoaWxlIHRoZXJlIGFyZSBzdXNwZW5zaW9ucyBwZW5kaW5nLlxSaW5nQWJvdmVNZXJnZVRocmVzaG9sZAALBNRSaW5nIGNhbm5vdCBiZSBtZXJnZWQgaWYgaXQncyBub3QgYmVsb3cgMS8yIGNhcGFjaXR5LkhJbnZhbGlkU3VzcGVuc2lvbnMADASgU3VzcGVuc2lvbiBpbmRpY2VzIHByb3ZpZGVkIGFyZSBpbnZhbGlkLkBOb1JlbW92YWxTZXNzaW9uAA0ELQFBIG11dGF0aW5nIGFjdGlvbiB3YXMgcXVldWVkIHdoZW4gdGhlcmUgd2FzIG5vIHJlbW92YWwgc2Vzc2lvbiBpbiBwcm9ncmVzcy5sQ291bGROb3RTdGFydFJlbW92YWxTZXNzaW9uAA4EnEEgcmVtb3ZhbCBzZXNzaW9uIGNvdWxkIG5vdCBiZSBzdGFydGVkLmBSZW1vdmFsU2Vzc2lvbkluUHJvZ3Jlc3MADwToQ2Fubm90IG1lcmdlIHJpbmdzIHdoaWxlIGEgcmVtb3ZhbCBzZXNzaW9uIGlzIGluIHByb2dyZXNzLkxLZXlBbHJlYWR5U3VzcGVuZGVkABAIVQFJbnZhbGlkIHN1c3BlbnNpb24gb2YgYSBrZXkgYmVsb25naW5nIHRvIGEgbWVtYmVyIHdob3NlIGluZGV4IGluIHRoZSByaW5nIGhhcyBhbHJlYWR5uGJlZW4gaW5jbHVkZWQgaW4gdGhlIHBlbmRpbmcgc3VzcGVuc2lvbnMgbGlzdC5USW52YWxpZE9uYm9hcmRpbmdTaXplABEE6FRoZSBvbmJvYXJkaW5nIHNpemUgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHJpbmcgc2l6ZS5ASW52YWxpZE1lbWJlcktleQASBKxUaGUgbWVtYmVyIGtleSBpcyBub3QgdmFsaWQgZm9yIHRoZSBjcnlwdG8uSENvbGxlY3Rpb25Ob3RGb3VuZAATBHhUaGUgY29sbGVjdGlvbiBkb2VzIG5vdCBleGlzdC5cQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAFAR4VGhlIGNvbGxlY3Rpb24gYWxyZWFkeSBleGlzdHMuSFRvb01hbnlDb2xsZWN0aW9ucwAVBJBUb28gbWFueSBjb2xsZWN0aW9ucyBmb3IgdGhpcyBvd25lci5oSW52YWxpZFJpbmdTaXplRm9yRmxleGlibGUAFgQRAUZsZXhpYmxlIGNvbGxlY3Rpb25zIG11c3QgdXNlIHRoZSBNYXhGbGV4aWJsZVJpbmdFeHBvbmVudCByaW5nIHNpemUuTEludmFsaWRSaW5nRXhwb25lbnQAFwSMVGhlIHJpbmcgZXhwb25lbnQgaXMgbm90IHN1cHBvcnRlZC5MUHJlbWF0dXJlT25ib2FyZGluZwAYBLRJbnN1ZmZpY2llbnQgbWVtYmVycyBpbiB0aGUgcXVldWUgdG8gb25ib2FyZC5sQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uABkE9FRoZSBjb2xsZWN0aW9uIGlzIG1hcmtlZCBmb3IgZGVsZXRpb24gYW5kIGNhbm5vdCBiZSBtb2RpZmllZC5ITm90Q29sbGVjdGlvbk93bmVyABoEuFRoZSBjYWxsZXIgaXMgbm90IHRoZSBvd25lciBvZiB0aGUgY29sbGVjdGlvbi4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQsMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldChMb2NrZWRDb2luAAAIARhyZWFzb25pCwEoTG9ja1JlYXNvbgABFHVudGlsKAEMdTY0AABpCwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0KExvY2tSZWFzb24AAQQ4RmFpbGVkRGlzcGF0Y2gEARxyZXRyaWVzDAEIdTgAAAAAbQsAAAQMbQM4CABxCwAABAhtAzgAdQsAAAQMODgIAHkLDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQURXJyb3IEBFQAAWRQTWVtYmVyS2V5QWxyZWFkeVVzZWQAAABASW52YWxpZE1lbWJlcktleQABADRJbnRlcm5hbEVycm9yAAIAXFJlY3ljbGVyQWxyZWFkeVVubG9hZGVkAAMAUEludmFsaWRDb25zb2xpZGF0aW9uAAQATENvbnNvbGlkYXRpb25Ub29CaWcABQA8Q29pblZhbHVlVG9vQmlnAAYARENvaW5WYWx1ZVRvb1NtYWxsAAcAWENvaW5WYWx1ZUlzTGVzc1RoYW5GZWUACABMQ29pblZhbHVlT3V0T2ZCb3VuZAAJAERJbnZhbGlkQWxpYXNQcm9vZgAKAExOb1VubG9hZGluZ1JlY3ljbGVyAAsAVFByb29mQW5kQWxpYXNNaXNtYXRjaAAMADhOb3RoaW5nVG9CdWlsZAANADBUb29NYW55UmluZ3MADgBUQWRkcmVzc0FscmVhZHlIYXNDb2luAA8AXEludmFsaWRQcm9vZk9mT3duZXJzaGlwABAALEVtcHR5SW5wdXRzABEAQFJlY3ljbGVyTWlzbWF0Y2gAEgQJAVRoZSBmZWUgcmVjeWNsZXIgaW4gdGhlIG9yaWdpbiBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsbCdzIHJlY3ljbGVyLmBJbnN1ZmZpY2llbnRVbmxvYWRGb3JGZWUAEwS8VGhlIHRvdGFsIHVubG9hZGVkIGFtb3VudCBpcyBsZXNzIHRoYW4gdGhlIGZlZS5EQWxpYXNOb3RQcmVtYXJrZWQAFAQ5AVRoZSBmaXJzdCBhbGlhcyB3YXMgbm90IHByZS1tYXJrZWQgYnkgZXh0ZW5zaW9uIChyZXF1aXJlZCBmb3IgRnJvbU91dHB1dCBmZWUpLlxJbnZhbGlkUmVjeWNsZXJSZXZpc2lvbgAVBEkBVGhlIHJlY3ljbGVyIHJldmlzaW9uIGRvZXMgbm90IG1hdGNoIChyZWN5Y2xlciBtYXkgbm90IGV4aXN0IG9yIGhhcyBiZWVuIHJlYnVpbHQpLjBJbnZhbGlkU3BsaXQAFgBERnJlc2hDb2luUmVxdWlyZWQAFwTIVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgYSBmcmVzaCBjb2luIChgYWdlID09IDBgKS5oQ2Fubm90Q29udmVydE5hdGl2ZVRvQXNzZXQAGAAEgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQufQsAAAQICQMJAwCBCwQYT3B0aW9uBARUAT0LAQgQTm9uZQAAABBTb21lBAA9CwAAAQAAhQsEGE9wdGlvbgQEVAFpAwEIEE5vbmUAAAAQU29tZQQAaQMAAAEAAIkLBBhPcHRpb24EBFQBbQMBCBBOb25lAAAAEFNvbWUEAG0DAAABAACNCwyMaW5kaXZfcGFsbGV0X3N0b3JhZ2VfaW5pdGlhbGl6YXRpb24YcGFsbGV0LE9uUG9sbFN0YXRlAAEgIEluYWN0aXZlAAAANENyZWF0aW5nQXNzZXQAAQBAWGNtRnVuZHNUcmFuc2ZlcgACADhWZXJpZnlpbmdGdW5kcwADACxGdW5kaW5nUG90cwAEAGBTY2hlZHVsaW5nTW9iUnVsZVBheW91dHMABQBYU2NoZWR1bGluZ1Njb3JlUGF5b3V0cwAGACRDb21wbGV0ZWQABwAAkQsMoGluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGUYcGFsbGV0LE9uUG9sbFN0YXRlAAEIIEluYWN0aXZlAAAAJENvbXBsZXRlZAABAACVCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAZkLBFMAAAQAnQsBGFZlYzxUPgAAmQsMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldDhTY2hlZHVsZWRFdmVudAgcQXNzZXRJZAHgMEFzc2V0QmFsYW5jZQHEAAgBCGlkOAEcRXZlbnRJZAABEGluZm8dBQGARXZlbnRJbmZvPEFzc2V0SWQsIEFzc2V0QmFsYW5jZT4AAJ0LAAACmQsAoQsMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldEhBY3RpdmVBaXJkcm9wRXZlbnQMHEFzc2V0SWQB4DBBc3NldEJhbGFuY2UBxFRSZWxheUNoYWluQmxvY2tOdW1iZXIBOAAQAQhpZDgBDHUzMgABTG5leHRfcGFydGljaXBhbnRfaWQ4ATRQYXJ0aWNpcGFudElkAAEQaW5mbx0FAYBFdmVudEluZm88QXNzZXRJZCwgQXNzZXRCYWxhbmNlPgABGHN0YXR1c6ULAbxBY3RpdmVBaXJkcm9wRXZlbnRTdGF0dXM8UmVsYXlDaGFpbkJsb2NrTnVtYmVyPgAApQsMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldGBBY3RpdmVBaXJkcm9wRXZlbnRTdGF0dXMEVFJlbGF5Q2hhaW5CbG9ja051bWJlcgE4ARQsUmVnaXN0ZXJpbmcAAABgV2FpdGluZ0ZvckVudHJvcHlUb0J1aWxkBAFAc3RhcnRlZF9hdF9yY19ibjgBVFJlbGF5Q2hhaW5CbG9ja051bWJlcgABADhEcmF3aW5nV2lubmVycwQBHGVudHJvcHkIASBbdTg7IDMyXQACADBEaXN0cmlidXRpbmcAAwA8Q2xlYXJpbmdTdG9yYWdlAAQAAKkLDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAFkEARhWZWM8VD4AAK0LAAAECAgEALELDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAFkEARhWZWM8VD4AALULAAAECAQ4ALkLAAAECODEAL0LDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQ8UGFzdEFpcmRyb3BJbmZvCBxBc3NldElkAeAwQXNzZXRCYWxhbmNlAcQAFAEUcHJpemUhBQGMQWlyZHJvcFByaXplPEFzc2V0SWQsIEFzc2V0QmFsYW5jZT4AAUxyZWdpc3RyYXRpb25fc3RhcnRzOAEMdTMyAAFUcmVnaXN0cmF0aW9uX2R1cmF0aW9uOAEMdTMyAAFIdG90YWxfcGFydGljaXBhbnRzOAEMdTMyAAEcd2lubmVyc8ELAaBCb3VuZGVkVmVjPEFsaWFzLCBDb25zdFUzMjxNQVhfV0lOTkVSUz4+AADBCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAD1BAEYVmVjPFQ+AADFCwxQaW5kaXZfcGFsbGV0X2FpcmRyb3AYcGFsbGV0FEVycm9yBARUAAEkNE5vQWN0aXZlRXZlbnQAAARgTm8gYWN0aXZlIGFpcmRyb3AgZXZlbnQuKE5vdEFQZXJzb24AAQRsVGhlIG9yaWdpbiBpcyBub3QgYSBwZXJzb24uWEFsaWFzQWxyZWFkeVJlZ2lzdGVyZWQAAgSAVGhlIGFsaWFzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5wSW52YWxpZEV2ZW50UmVnaXN0cmF0aW9uVGltZQADBJxUaGUgZXZlbnQgcmVnaXN0cmF0aW9uIHRpbWUgaXMgaW52YWxpZC5UUGFydGljaXBhbnRJZE92ZXJmbG93AAQEYFBhcnRpY2lwYW50IElEIG92ZXJmbG93LlhOb1ByaXplVG9DbGFpbUZvckV2ZW50AAUE0FRoZSBwYXJ0aWNpcGFudCBoYXMgbm8gcHJpemUgdG8gY2xhaW0gZm9yIHRoZSBldmVudC4wTm9FdmVudEZvdW5kAAYEYFRoZSBldmVudCBkb2Vzbid0IGV4aXN0LjBTY2hlZHVsZUZ1bGwABwRUVGhlIHNjaGVkdWxlIGlzIGZ1bGwuiFByaXplTXVzdEJlTW9yZU9yRXF1YWxUb01pbkJhbGFuY2UACATcVGhlIHByaXplIG11c3QgYmUgbW9yZSBvciBlcXVhbCB0byB0aGUgbWluaW11bSBiYWxhbmNlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JCwxEcGFsbGV0X21pZ3JhdGlvbnMYcGFsbGV0FEVycm9yBARUAAEEHE9uZ29pbmcAAAToVGhlIG9wZXJhdGlvbiBjYW5ub3QgY29tcGxldGUgc2luY2Ugc29tZSBNQk1zIGFyZSBvbmdvaW5nLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7NCwhIc3BfY29uc2Vuc3VzX3Nsb3RzMFNsb3REdXJhdGlvbgAABAAoAQx1NjQAANELEChzcF9ydW50aW1lHGdlbmVyaWMUYmxvY2skTGF6eUJsb2NrCBhIZWFkZXIBXCRFeHRyaW5zaWMBPQcACAEYaGVhZGVyXAEYSGVhZGVyAAEoZXh0cmluc2ljc9ULAVBWZWM8T3BhcXVlRXh0cmluc2ljPgAA1QsAAALZCwDZCwgoc3BfcnVudGltZTxPcGFxdWVFeHRyaW5zaWMAAAQAGAEcVmVjPHU4PgAA3QsIKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAA4QsIHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAGAEcVmVjPHU4PgAA5QsEGE9wdGlvbgQEVAHhCwEIEE5vbmUAAAAQU29tZQQA4QsAAAEAAOkLDDRmcmFtZV9zdXBwb3J0OHZpZXdfZnVuY3Rpb25zOFZpZXdGdW5jdGlvbklkAAAIARhwcmVmaXjBAQEgW3U4OyAxNl0AARhzdWZmaXjBAQEgW3U4OyAxNl0AAO0LBBhSZXN1bHQIBFQBGARFAfELAQgIT2sEABgAAAAADEVycgQA8QsAAAEAAPELDDRmcmFtZV9zdXBwb3J0OHZpZXdfZnVuY3Rpb25zZFZpZXdGdW5jdGlvbkRpc3BhdGNoRXJyb3IAAQw4Tm90SW1wbGVtZW50ZWQAAAAgTm90Rm91bmQEAOkLAThWaWV3RnVuY3Rpb25JZAABABRDb2RlYwACAAD1CwQYUmVzdWx0CARUAZEGBEUB+QsBCAhPawQAkQYAAAAADEVycgQA+QsAAAEAAPkLDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5YFRyYW5zYWN0aW9uVmFsaWRpdHlFcnJvcgABCBxJbnZhbGlkBAD9CwFISW52YWxpZFRyYW5zYWN0aW9uAAAAHFVua25vd24EAAEMAUhVbmtub3duVHJhbnNhY3Rpb24AAQAA/QsMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlISW52YWxpZFRyYW5zYWN0aW9uAAE0EENhbGwAAAAcUGF5bWVudAABABhGdXR1cmUAAgAUU3RhbGUAAwAgQmFkUHJvb2YABABEQW5jaWVudEJpcnRoQmxvY2sABQBERXhoYXVzdHNSZXNvdXJjZXMABgAYQ3VzdG9tBAAMAQh1OAAHADBCYWRNYW5kYXRvcnkACABMTWFuZGF0b3J5VmFsaWRhdGlvbgAJACRCYWRTaWduZXIACgBUSW5kZXRlcm1pbmF0ZUltcGxpY2l0AAsANFVua25vd25PcmlnaW4ADAAAAQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlIVW5rbm93blRyYW5zYWN0aW9uAAEMMENhbm5vdExvb2t1cAAAAExOb1Vuc2lnbmVkVmFsaWRhdG9yAAEAGEN1c3RvbQQADAEIdTgAAgAABQwIMHNwX2luaGVyZW50czBJbmhlcmVudERhdGEAAAQBEGRhdGEJDAGUQlRyZWVNYXA8SW5oZXJlbnRJZGVudGlmaWVyLCBWZWM8dTg+PgAACQwEIEJUcmVlTWFwCARLAb0BBFYBGAAEAA0MAAAADQwAAAIRDAARDAAABAi9ARgAFQwIMHNwX2luaGVyZW50c1BDaGVja0luaGVyZW50c1Jlc3VsdAAADAEQb2thecgBEGJvb2wAASxmYXRhbF9lcnJvcsgBEGJvb2wAARhlcnJvcnMFDAEwSW5oZXJlbnREYXRhAAAZDAwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eURUcmFuc2FjdGlvblNvdXJjZQABDBxJbkJsb2NrAAAAFExvY2FsAAEAIEV4dGVybmFsAAIAAB0MBBhSZXN1bHQIBFQBIQwERQH5CwEICE9rBAAhDAAAAAAMRXJyBAD5CwAAAQAAIQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlAVmFsaWRUcmFuc2FjdGlvbgAAFAEgcHJpb3JpdHkoAUxUcmFuc2FjdGlvblByaW9yaXR5AAEgcmVxdWlyZXM0AUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXM0AUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEkbG9uZ2V2aXR5KAFQVHJhbnNhY3Rpb25Mb25nZXZpdHkAASRwcm9wYWdhdGXIARBib29sAAAlDAQYT3B0aW9uBARUASkMAQgQTm9uZQAAABBTb21lBAApDAAAAQAAKQwAAAItDAAtDAAABAgYgQgAMQwMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzTFJ1bnRpbWVEaXNwYXRjaEluZm8IHEJhbGFuY2UBxBhXZWlnaHQB1QEADAEYd2VpZ2h01QEBGFdlaWdodAABFGNsYXNz8QUBNERpc3BhdGNoQ2xhc3MAASxwYXJ0aWFsX2ZlZcQBHEJhbGFuY2UAADUMDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlcyhGZWVEZXRhaWxzBBxCYWxhbmNlAcQACAE0aW5jbHVzaW9uX2ZlZTkMAXRPcHRpb248SW5jbHVzaW9uRmVlPEJhbGFuY2U+PgABDHRpcMQBHEJhbGFuY2UAADkMBBhPcHRpb24EBFQBPQwBCBBOb25lAAAAEFNvbWUEAD0MAAABAAA9DAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMwSW5jbHVzaW9uRmVlBBxCYWxhbmNlAcQADAEgYmFzZV9mZWXEARxCYWxhbmNlAAEcbGVuX2ZlZcQBHEJhbGFuY2UAAUxhZGp1c3RlZF93ZWlnaHRfZmVlxAEcQmFsYW5jZQAAQQwEGFJlc3VsdAgEVAFFDARFAUkMAQgIT2sEAEUMAAAAAAxFcnIEAEkMAAABAABFDAAAAhEDAEkMDEB4Y21fcnVudGltZV9hcGlzEGZlZXMURXJyb3IAARg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEATFdlaWdodE5vdENvbXB1dGFibGUAAgBMVW5oYW5kbGVkWGNtVmVyc2lvbgADADRBc3NldE5vdEZvdW5kAAQAKFVucm91dGFibGUABQAATQwEGFJlc3VsdAgEVAHVAQRFAUkMAQgIT2sEANUBAAAAAAxFcnIEAEkMAAABAABRDAQYUmVzdWx0CARUAcQERQFJDAEICE9rBADEAAAAAAxFcnIEAEkMAAABAABVDAQYUmVzdWx0CARUAdkCBEUBSQwBCAhPawQA2QIAAAAADEVycgQASQwAAAEAAFkMBBhSZXN1bHQIBFQBBARFAV0MAQgIT2sEAAQAAAAADEVycgQAXQwAAAEAAF0MDEB4Y21fcnVudGltZV9hcGlzLGNvbnZlcnNpb25zFEVycm9yAAEILFVuc3VwcG9ydGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQAAYQwMSHNwX3N0YXRlbWVudF9zdG9yZSxydW50aW1lX2FwaTxTdGF0ZW1lbnRTb3VyY2UAAQwUQ2hhaW4AAAAcTmV0d29yawABABRMb2NhbAACAABlDAhIc3Bfc3RhdGVtZW50X3N0b3JlJFN0YXRlbWVudAAAHAEUcHJvb2ZpDAE0T3B0aW9uPFByb29mPgABOGRlY3J5cHRpb25fa2V5FQYBVE9wdGlvbjxEZWNyeXB0aW9uS2V5PgABHGNoYW5uZWwVBgE8T3B0aW9uPENoYW5uZWw+AAEgcHJpb3JpdHkJAwEsT3B0aW9uPHUzMj4AAShudW1fdG9waWNzDAEIdTgAARh0b3BpY3N1DAFMW1RvcGljOyBNQVhfVE9QSUNTXQABEGRhdGFJBQE8T3B0aW9uPFZlYzx1OD4+AABpDAQYT3B0aW9uBARUAW0MAQgQTm9uZQAAABBTb21lBABtDAAAAQAAbQwISHNwX3N0YXRlbWVudF9zdG9yZRRQcm9vZgABEBxTcjI1NTE5CAEkc2lnbmF0dXJlMQQBIFt1ODsgNjRdAAEYc2lnbmVyCAEgW3U4OyAzMl0AAAAcRWQyNTUxOQgBJHNpZ25hdHVyZTEEASBbdTg7IDY0XQABGHNpZ25lcggBIFt1ODsgMzJdAAEAOFNlY3AyNTZrMUVjZHNhCAEkc2lnbmF0dXJlNQQBIFt1ODsgNjVdAAEYc2lnbmVycQwBIFt1ODsgMzNdAAIAHE9uQ2hhaW4MAQx3aG8IASRBY2NvdW50SWQAAShibG9ja19oYXNoCAEkQmxvY2tIYXNoAAEsZXZlbnRfaW5kZXgoAQx1NjQAAwAAcQwAAAMhAAAADAB1DAAAAwQAAAAIAHkMBBhSZXN1bHQIBFQB+QoERQF9DAEICE9rBAD5CgAAAAAMRXJyBAB9DAAAAQAAfQwMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzWEludmFsaWRTdGF0ZW1lbnRSZWFzb24AARhATm9SZXBvcnRpbmdQaGFzZQAAAFBTdGF0ZW1lbnRJc05vdFNpZ25lZAABAEBJbnZhbGlkU2lnbmF0dXJlAAIANEludmFsaWRUb3BpYzAIASBleHBlY3RlZBUGAUBPcHRpb248W3U4OyAzMl0+AAEYYWN0dWFsFQYBQE9wdGlvbjxbdTg7IDMyXT4AAwBMQWNjb3VudElzTm90QVBsYXllcgAEAFRQbGF5ZXJJc05vdFJlZ2lzdGVyZWQABQAAgQwIXGN1bXVsdXNfcHJpbWl0aXZlc19jb3JlNENvbGxhdGlvbkluZm8AABgBPHVwd2FyZF9tZXNzYWdlczQBSFZlYzxVcHdhcmRNZXNzYWdlPgABTGhvcml6b250YWxfbWVzc2FnZXO1BwFgVmVjPE91dGJvdW5kSHJtcE1lc3NhZ2U+AAFMbmV3X3ZhbGlkYXRpb25fY29kZYUMAYxPcHRpb248cmVsYXlfY2hhaW46OlZhbGlkYXRpb25Db2RlPgABbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlczgBDHUzMgABOGhybXBfd2F0ZXJtYXJrOAFgcmVsYXlfY2hhaW46OkJsb2NrTnVtYmVyAAEkaGVhZF9kYXRhTAEgSGVhZERhdGEAAIUMBBhPcHRpb24EBFQBiQwBCBBOb25lAAAAEFNvbWUEAIkMAAABAACJDAx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAAYARxWZWM8dTg+AACNDAQYUmVzdWx0CARUARAERQEBBwEICE9rBAAQAAAAAAxFcnIEAAEHAAABAACRDAQYT3B0aW9uBARUAQEHAQgQTm9uZQAAABBTb21lBAABBwAAAQAAlQwAAAIBBwCZDAQYUmVzdWx0CARUAfkKBEUBnQwBCAhPawQA+QoAAAAADEVycgQAnQwAAAEAAJ0MDEhzcF9zdGF0ZW1lbnRfc3RvcmUscnVudGltZV9hcGlASW52YWxpZFN0YXRlbWVudAABDCBCYWRQcm9vZgAAABxOb1Byb29mAAEANEludGVybmFsRXJyb3IAAgAAoQwIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUwUnVudGltZUVycm9yAAF4GFN5c3RlbQQAMQcBcGZyYW1lX3N5c3RlbTo6RXJyb3I8UnVudGltZT4AAAA8UGFyYWNoYWluU3lzdGVtBAC9BwG8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbTo6RXJyb3I8UnVudGltZT4AAQAgQmFsYW5jZXMEAPUHAXxwYWxsZXRfYmFsYW5jZXM6OkVycm9yPFJ1bnRpbWU+AAoARE9yaWdpblJlc3RyaWN0aW9uBAAJCAG8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbjo6RXJyb3I8UnVudGltZT4ADQAYQXNzZXRzBAA1CAF0cGFsbGV0X2Fzc2V0czo6RXJyb3I8UnVudGltZT4ADgAwQXNzZXRzSG9sZGVyBABFCAGQcGFsbGV0X2Fzc2V0c19ob2xkZXI6OkVycm9yPFJ1bnRpbWU+AA8AJEFzc2V0UmF0ZQQASQgBhHBhbGxldF9hc3NldF9yYXRlOjpFcnJvcjxSdW50aW1lPgAQAERDb2xsYXRvclNlbGVjdGlvbgQAYQgBpHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb246OkVycm9yPFJ1bnRpbWU+ABUAHFNlc3Npb24EAIUIAXhwYWxsZXRfc2Vzc2lvbjo6RXJyb3I8UnVudGltZT4AFgAkWGNtcFF1ZXVlBADBCAGkY3VtdWx1c19wYWxsZXRfeGNtcF9xdWV1ZTo6RXJyb3I8UnVudGltZT4AHgAsUG9sa2Fkb3RYY20EACkJAWhwYWxsZXRfeGNtOjpFcnJvcjxSdW50aW1lPgAfADBNZXNzYWdlUXVldWUEAEkJAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXJyb3I8UnVudGltZT4AIgAcVXRpbGl0eQQATQkBeHBhbGxldF91dGlsaXR5OjpFcnJvcjxSdW50aW1lPgAoACBNdWx0aXNpZwQAXQkBfHBhbGxldF9tdWx0aXNpZzo6RXJyb3I8UnVudGltZT4AKQAQU3VkbwQAYQkBbHBhbGxldF9zdWRvOjpFcnJvcjxSdW50aW1lPgAqABRQcm94eQQAhQkBcHBhbGxldF9wcm94eTo6RXJyb3I8UnVudGltZT4ALAAgSWRlbnRpdHkEANUJAZRpbmRpdl9wYWxsZXRfaWRlbnRpdHk6OkVycm9yPFJ1bnRpbWU+ADIAGFBlb3BsZQQA3QkBjGluZGl2X3BhbGxldF9wZW9wbGU6OkVycm9yPFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAB0KAZRpbmRpdl9wYWxsZXRfbW9iX3J1bGU6OkVycm9yPFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEAFkKAaRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rOjpFcnJvcjxSdW50aW1lPgA1ABBHYW1lBACVCgGEaW5kaXZfcGFsbGV0X2dhbWU6OkVycm9yPFJ1bnRpbWU+ADcAFFNjb3JlBADBCgGIaW5kaXZfcGFsbGV0X3Njb3JlOjpFcnJvcjxSdW50aW1lPgA4ACBEdW1teURpbQQAyQoBmGluZGl2X3BhbGxldF9kdW1teV9kaW06OkVycm9yPFJ1bnRpbWU+ADsAKFBlb3BsZUxpdGUEANUKAaBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGU6OkVycm9yPFJ1bnRpbWU+AD4AJFJlc291cmNlcwQA/QoBmGluZGl2X3BhbGxldF9yZXNvdXJjZXM6OkVycm9yPFJ1bnRpbWU+AD8ANENodW5rc01hbmFnZXIEABELAaxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXI6OkVycm9yPFJ1bnRpbWU+AEAAHE1lbWJlcnMEAGELAZBpbmRpdl9wYWxsZXRfbWVtYmVyczo6RXJyb3I8UnVudGltZT4AQwAcQ29pbmFnZQQAeQsBkGluZGl2X3BhbGxldF9jb2luYWdlOjpFcnJvcjxSdW50aW1lPgBEABxBaXJkcm9wBADFCwGQaW5kaXZfcGFsbGV0X2FpcmRyb3A6OkVycm9yPFJ1bnRpbWU+AD0AUE11bHRpQmxvY2tNaWdyYXRpb25zBADJCwGEcGFsbGV0X21pZ3JhdGlvbnM6OkVycm9yPFJ1bnRpbWU+AGIAAKwYU3lzdGVtARhTeXN0ZW1MHEFjY291bnQBAQQCBM0FQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELgA4RXh0cmluc2ljQ291bnQAADgEAAS4IFRvdGFsIGV4dHJpbnNpY3MgY291bnQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgBASW5oZXJlbnRzQXBwbGllZAEAyAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLgAsQmxvY2tXZWlnaHQBANkFGAAAAAAAAASIIFRoZSBjdXJyZW50IHdlaWdodCBmb3IgdGhlIGJsb2NrLgBAQWxsRXh0cmluc2ljc0xlbgAAOAQABEEBIFRvdGFsIGxlbmd0aCAoaW4gYnl0ZXMpIGZvciBhbGwgZXh0cmluc2ljcyBwdXQgdG9nZXRoZXIsIGZvciB0aGUgY3VycmVudCBibG9jay4AJEJsb2NrSGFzaAEBBAU4PIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASYIE1hcCBvZiBibG9jayBudW1iZXJzIHRvIGJsb2NrIGhhc2hlcy4ANEV4dHJpbnNpY0RhdGEBAQQFOBgEAAQ9ASBFeHRyaW5zaWNzIGRhdGEgZm9yIHRoZSBjdXJyZW50IGJsb2NrIChtYXBzIGFuIGV4dHJpbnNpYydzIGluZGV4IHRvIGl0cyBkYXRhKS4AGE51bWJlcgEAOBAAAAAABAkBIFRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBiZWluZyBwcm9jZXNzZWQuIFNldCBieSBgZXhlY3V0ZV9ibG9ja2AuAChQYXJlbnRIYXNoAQA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAgSGFzaCBvZiB0aGUgcHJldmlvdXMgYmxvY2suABhEaWdlc3QBAGQEAATwIERpZ2VzdCBvZiB0aGUgY3VycmVudCBibG9jaywgYWxzbyBwYXJ0IG9mIHRoZSBibG9jayBoZWFkZXIuABhFdmVudHMBAN0FBAAcoCBFdmVudHMgZGVwb3NpdGVkIGZvciB0aGUgY3VycmVudCBibG9jay4AHQEgTk9URTogVGhlIGl0ZW0gaXMgdW5ib3VuZCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBuZXZlciBiZSByZWFkIG9uIGNoYWluLtAgSXQgY291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIFBvViBzaXplIG9mIGEgYmxvY2suAC0BIEV2ZW50cyBoYXZlIGEgbGFyZ2UgaW4tbWVtb3J5IHNpemUuIEJveCB0aGUgZXZlbnRzIHRvIG5vdCBnbyBvdXQtb2YtbWVtb3J5/CBqdXN0IGluIGNhc2Ugc29tZW9uZSBzdGlsbCByZWFkcyB0aGVtIGZyb20gd2l0aGluIHRoZSBydW50aW1lLgAoRXZlbnRDb3VudAEAOBAAAAAABLggVGhlIG51bWJlciBvZiBldmVudHMgaW4gdGhlIGBFdmVudHM8VD5gIGxpc3QuACxFdmVudFRvcGljcwEBBAI88QYEACglASBNYXBwaW5nIGJldHdlZW4gYSB0b3BpYyAocmVwcmVzZW50ZWQgYnkgVDo6SGFzaCkgYW5kIGEgdmVjdG9yIG9mIGluZGV4ZXOUIG9mIGV2ZW50cyBpbiB0aGUgYDxFdmVudHM8VD4+YCBsaXN0LgBRASBBbGwgdG9waWMgdmVjdG9ycyBoYXZlIGRldGVybWluaXN0aWMgc3RvcmFnZSBsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0b3BpYy4gVGhpc0UBIGFsbG93cyBsaWdodC1jbGllbnRzIHRvIGxldmVyYWdlIHRoZSBjaGFuZ2VzIHRyaWUgc3RvcmFnZSB0cmFja2luZyBtZWNoYW5pc20gYW5k5CBpbiBjYXNlIG9mIGNoYW5nZXMgZmV0Y2ggdGhlIGxpc3Qgb2YgZXZlbnRzIG9mIGludGVyZXN0LgBZASBUaGUgdmFsdWUgaGFzIHRoZSB0eXBlIGAoQmxvY2tOdW1iZXJGb3I8VD4sIEV2ZW50SW5kZXgpYCBiZWNhdXNlIGlmIHdlIHVzZWQgb25seSBqdXN0TQEgdGhlIGBFdmVudEluZGV4YCB0aGVuIGluIGNhc2UgaWYgdGhlIHRvcGljIGhhcyB0aGUgc2FtZSBjb250ZW50cyBvbiB0aGUgbmV4dCBibG9jawEBIG5vIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCB0aHVzIHRoZSBldmVudCBtaWdodCBiZSBsb3N0LgBITGFzdFJ1bnRpbWVVcGdyYWRlAAD5BgQABFUBIFN0b3JlcyB0aGUgYHNwZWNfdmVyc2lvbmAgYW5kIGBzcGVjX25hbWVgIG9mIHdoZW4gdGhlIGxhc3QgcnVudGltZSB1cGdyYWRlIGhhcHBlbmVkLgBUVXBncmFkZWRUb1UzMlJlZkNvdW50AQDIBAAETQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgYHR5cGUgUmVmQ291bnRgIGlzIGB1MzJgLiBGYWxzZSAoZGVmYXVsdCkgaWYgbm90LgBgVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQDIBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuADhFeGVjdXRpb25QaGFzZQAA6QYEAASIIFRoZSBleGVjdXRpb24gcGhhc2Ugb2YgdGhlIGJsb2NrLgBEQXV0aG9yaXplZFVwZ3JhZGUAAAUHBAAEuCBgU29tZWAgaWYgYSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gYXV0aG9yaXplZC4AYEV4dHJpbnNpY1dlaWdodFJlY2xhaW1lZAEA1QEIAAAcoCBUaGUgd2VpZ2h0IHJlY2xhaW1lZCBmb3IgdGhlIGV4dHJpbnNpYy4AIQEgVGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdW50aWwgdGhlIGVuZCBvZiB0aGUgZXh0cmluc2ljIGV4ZWN1dGlvbi4hASBNb3JlIHByZWNpc2VseSB0aGlzIGluZm9ybWF0aW9uIGlzIHJlbW92ZWQgaW4gYG5vdGVfYXBwbGllZF9leHRyaW5zaWNgLgBxASBMb2dpYyBkb2luZyBzb21lIHBvc3QgZGlzcGF0Y2ggd2VpZ2h0IHJlZHVjdGlvbiBtdXN0IHVwZGF0ZSB0aGlzIHN0b3JhZ2UgdG8gYXZvaWQgZHVwbGljYXRlLCByZWR1Y3Rpb24uAAEkAAHpBQAYMEJsb2NrV2VpZ2h0cwkHiQEHAPIFKgEACwAgSqnRAQIAgAICZc0dAAELwFYN70UBAgDAAQELAJj3Pl0BAgDgAQEAAAJlzR0AAQvA3l9ZugECAGACAQsAIEqp0QECAIACAQcAiFJqdAIAoAACZc0dAAAAAATQIEJsb2NrICYgZXh0cmluc2ljcyB3ZWlnaHRzOiBiYXNlIHZhbHVlcyBhbmQgbGltaXRzLgAsQmxvY2tMZW5ndGgVBzAAADwAAABQAAAAUAAEqCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBibG9jayAoaW4gYnl0ZXMpLgA4QmxvY2tIYXNoQ291bnQ4EAAQAAAEVQEgTWF4aW11bSBudW1iZXIgb2YgYmxvY2sgbnVtYmVyIHRvIGJsb2NrIGhhc2ggbWFwcGluZ3MgdG8ga2VlcCAob2xkZXN0IHBydW5lZCBmaXJzdCkuACBEYldlaWdodB0HQEB4fQEAAAAAAOH1BQAAAAAECQEgVGhlIHdlaWdodCBvZiBydW50aW1lIGRhdGFiYXNlIG9wZXJhdGlvbnMgdGhlIHJ1bnRpbWUgY2FuIGludm9rZS4AHFZlcnNpb24hB8kERG5leHQtcGVvcGxlLXBhc2VvRG5leHQtcGVvcGxlLXBhc2VvAQAAAEJCDwAAAAAAVN1xjVzFMmLUAQAAAATnBSGg09L4AQAAANe92KJyyg1lAgAAAN9qy2iZB2CbBQAAADfjl/x8kfXkAgAAAMzZ3mOWyJnKAQAAAED+OtQB+JWaBgAAANK8mJfu0I8VAwAAAPeLJ4vlP0VMAgAAAKs8BXIpH+uLAQAAALydiZBPW5I/AQAAADfIuxNQqaKoBAAAAPP/FNWrUnBZAwAAAG/1LuhY5sW9AgAAAJ/7UFqnONacAQAAANC6x75KawkgAQAAAJKH+w4CG8hUAQAAAIQ7b4zsgJjHAQAAAOqT4/FvPWliAwAAAPvFd7nXR+/WAQAAAL6fsMkagEbPAQAAAAEAAAABBIQgR2V0IHRoZSBjaGFpbidzIGluLWNvZGUgdmVyc2lvbi4AKFNTNThQcmVmaXgtAwgqABSoIFRoZSBkZXNpZ25hdGVkIFNTNTggcHJlZml4IG9mIHRoaXMgY2hhaW4uADkBIFRoaXMgcmVwbGFjZXMgdGhlICJzczU4Rm9ybWF0IiBwcm9wZXJ0eSBkZWNsYXJlZCBpbiB0aGUgY2hhaW4gc3BlYy4gUmVhc29uIGlzMQEgdGhhdCB0aGUgcnVudGltZSBzaG91bGQga25vdyBhYm91dCB0aGUgcHJlZml4IGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIGl0IGFzcCBhbiBpZGVudGlmaWVyIG9mIHRoZSBjaGFpbi4AATEHABwsUnVudGltZUNhbGwgBIwgVGhlIGFnZ3JlZ2F0ZWQgYFJ1bnRpbWVDYWxsYCB0eXBlLhROb25jZTgESQEgVGhpcyBzdG9yZXMgdGhlIG51bWJlciBvZiBwcmV2aW91cyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc2VuZGVyIGFjY291bnQuEEhhc2g8BJggVGhlIG91dHB1dCBvZiB0aGUgYEhhc2hpbmdgIGZ1bmN0aW9uLhxIYXNoaW5nNQcEIQEgVGhlIGhhc2hpbmcgc3lzdGVtIChhbGdvcml0aG0pIGJlaW5nIHVzZWQgaW4gdGhlIHJ1bnRpbWUgKGUuZy4gQmxha2UyKS4kQWNjb3VudElkBATIIFRoZSB1c2VyIGFjY291bnQgaWRlbnRpZmllciB0eXBlIGZvciB0aGUgcnVudGltZS4UQmxvY2s5BwhhASBUaGUgQmxvY2sgdHlwZSB1c2VkIGJ5IHRoZSBydW50aW1lLiBUaGlzIGlzIHVzZWQgYnkgYGNvbnN0cnVjdF9ydW50aW1lYCB0byByZXRyaWV2ZSB0aGXMIGV4dHJpbnNpY3Mgb3Igb3RoZXIgYmxvY2sgc3BlY2lmaWMgZGF0YSBhcyBuZWVkZWQuLEFjY291bnREYXRh0QUIYQEgRGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudCAob3RoZXIgdGhhbiBub25jZS90cmFuc2FjdGlvbiBjb3VudGVyLCB3aGljaCB0aGlzZCBwYWxsZXQgZG9lcyByZWdhcmRsZXNzKS4AAAAAPFBhcmFjaGFpblN5c3RlbQE8UGFyYWNoYWluU3lzdGVtbERVbmluY2x1ZGVkU2VnbWVudAEAUQcEABhJASBMYXRlc3QgaW5jbHVkZWQgYmxvY2sgZGVzY2VuZGFudHMgdGhlIHJ1bnRpbWUgYWNjZXB0ZWQuIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhcmVhASBhbmNlc3RvcnMgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgYmxvY2sgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbmNsdWRlZCBpbiB0aGUgb2JzZXJ2ZWRMIHJlbGF5LWNoYWluIHN0YXRlLgB1ASBUaGUgc2VnbWVudCBsZW5ndGggaXMgbGltaXRlZCBieSB0aGUgY2FwYWNpdHkgcmV0dXJuZWQgZnJvbSB0aGUgW2BDb25zZW5zdXNIb29rYF0gY29uZmlndXJlZDwgaW4gdGhlIHBhbGxldC4AbEFnZ3JlZ2F0ZWRVbmluY2x1ZGVkU2VnbWVudAAAeQcEAAxpASBTdG9yYWdlIGZpZWxkIHRoYXQga2VlcHMgdHJhY2sgb2YgYmFuZHdpZHRoIHVzZWQgYnkgdGhlIHVuaW5jbHVkZWQgc2VnbWVudCBhbG9uZyB3aXRoIHRoZS0BIGxhdGVzdCBIUk1QIHdhdGVybWFyay4gVXNlZCBmb3IgbGltaXRpbmcgdGhlIGFjY2VwdGFuY2Ugb2YgbmV3IGJsb2NrcyB3aXRokCByZXNwZWN0IHRvIHJlbGF5IGNoYWluIGNvbnN0cmFpbnRzLgBUUGVuZGluZ1ZhbGlkYXRpb25Db2RlAQAYBAAYWQEgSW4gY2FzZSBvZiBhIHNjaGVkdWxlZCB1cGdyYWRlLCB0aGlzIHN0b3JhZ2UgZmllbGQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gY29kZSB0byBiZSQgYXBwbGllZC4APQEgQXMgc29vbiBhcyB0aGUgcmVsYXkgY2hhaW4gZ2l2ZXMgdXMgdGhlIGdvLWFoZWFkIHNpZ25hbCwgd2Ugd2lsbCBvdmVyd3JpdGUgdGhlcQEgW2A6Y29kZWBdW3NwX2NvcmU6OnN0b3JhZ2U6OndlbGxfa25vd25fa2V5czo6Q09ERV0gd2hpY2ggd2lsbCByZXN1bHQgdGhlIG5leHQgYmxvY2sgcHJvY2VzcwkBIHdpdGggdGhlIG5ldyB2YWxpZGF0aW9uIGNvZGUuIFRoaXMgY29uY2x1ZGVzIHRoZSB1cGdyYWRlIHByb2Nlc3MuAEROZXdWYWxpZGF0aW9uQ29kZQAAGAQAFF0BIFZhbGlkYXRpb24gY29kZSB0aGF0IGlzIHNldCBieSB0aGUgcGFyYWNoYWluIGFuZCBpcyB0byBiZSBjb21tdW5pY2F0ZWQgdG8gY29sbGF0b3IgYW5keCBjb25zZXF1ZW50bHkgdGhlIHJlbGF5LWNoYWluLgBlASBUaGlzIHdpbGwgYmUgY2xlYXJlZCBpbiBgb25faW5pdGlhbGl6ZWAgb2YgZWFjaCBuZXcgYmxvY2sgaWYgbm8gb3RoZXIgcGFsbGV0IGFscmVhZHkgc2V0LCB0aGUgdmFsdWUuADhWYWxpZGF0aW9uRGF0YQAASAQADNAgVGhlIFtgUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGFgXSBzZXQgZm9yIHRoaXMgYmxvY2suAHEBIFRoaXMgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0IG9ubHkgb25jZSBieSB0aGUgW2BQYWxsZXQ6OnNldF92YWxpZGF0aW9uX2RhdGFgXSBpbmhlcmVudC4AUERpZFNldFZhbGlkYXRpb25Db2RlAQDIBAAE4CBXZXJlIHRoZSB2YWxpZGF0aW9uIGRhdGEgc2V0IHRvIG5vdGlmeSB0aGUgcmVsYXkgY2hhaW4/AGRMYXN0UmVsYXlDaGFpbkJsb2NrTnVtYmVyAQA4EAAAAAAMHQEgVGhlIHJlbGF5IGNoYWluIGJsb2NrIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgcGFyYWNoYWluIGJsb2NrLgCIIFRoaXMgaXMgdXBkYXRlZCBpbiBgb25fZmluYWxpemVgLgBgVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAQB9BwQAHHUBIEFuIG9wdGlvbiB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIHJlbGF5LWNoYWluIHJlc3RyaWN0cyBzaWduYWxsaW5nIGEgdmFsaWRhdGlvbiBjb2RlIHVwZ3JhZGUuYQEgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgaXMgYFNvbWVgIGFuZCBbYE5ld1ZhbGlkYXRpb25Db2RlYF0gaXMgYFNvbWVgIHRoZW4gdGhlIHByb2R1Y2VkbCBjYW5kaWRhdGUgd2lsbCBiZSBpbnZhbGlkLgBxASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBhIG1pcnJvciBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGZyb20gdGhlbQEgcmVsYXktY2hhaW4uIFRoaXMgdmFsdWUgaXMgZXBoZW1lcmFsIHdoaWNoIG1lYW5zIGl0IGRvZXNuJ3QgaGl0IHRoZSBzdG9yYWdlLiBUaGlzIHZhbHVlIGlzYCBzZXQgYWZ0ZXIgdGhlIGluaGVyZW50LgA4VXBncmFkZUdvQWhlYWQBAHEHBAAU3CBPcHRpb25hbCB1cGdyYWRlIGdvLWFoZWFkIHNpZ25hbCBmcm9tIHRoZSByZWxheS1jaGFpbi4AcQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgYSBtaXJyb3Igb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHBhcmFjaGFpbiBmcm9tIHRoZW0BIHJlbGF5LWNoYWluLiBUaGlzIHZhbHVlIGlzIGVwaGVtZXJhbCB3aGljaCBtZWFucyBpdCBkb2Vzbid0IGhpdCB0aGUgc3RvcmFnZS4gVGhpcyB2YWx1ZSBpc2Agc2V0IGFmdGVyIHRoZSBpbmhlcmVudC4APFJlbGF5U3RhdGVQcm9vZgAAUAQAGMQgVGhlIHN0YXRlIHByb29mIGZvciB0aGUgbGFzdCByZWxheSBwYXJlbnQgYmxvY2suAG0BIFRoaXMgZmllbGQgaXMgbWVhbnQgdG8gYmUgdXBkYXRlZCBlYWNoIGJsb2NrIHdpdGggdGhlIHZhbGlkYXRpb24gZGF0YSBpbmhlcmVudC4gVGhlcmVmb3JlLE0BIGJlZm9yZSBwcm9jZXNzaW5nIG9mIHRoZSBpbmhlcmVudCwgZS5nLiBpbiBgb25faW5pdGlhbGl6ZWAgdGhpcyBkYXRhIG1heSBiZSBzdGFsZS4ArCBUaGlzIGRhdGEgaXMgYWxzbyBhYnNlbnQgZnJvbSB0aGUgZ2VuZXNpcy4AWFJlbGV2YW50TWVzc2FnaW5nU3RhdGUAAIUHBAAcZQEgVGhlIHNuYXBzaG90IG9mIHNvbWUgc3RhdGUgcmVsYXRlZCB0byBtZXNzYWdpbmcgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgcGFyYWNoYWluIGFzIHBlckggdGhlIHJlbGF5IHBhcmVudC4AbQEgVGhpcyBmaWVsZCBpcyBtZWFudCB0byBiZSB1cGRhdGVkIGVhY2ggYmxvY2sgd2l0aCB0aGUgdmFsaWRhdGlvbiBkYXRhIGluaGVyZW50LiBUaGVyZWZvcmUsTQEgYmVmb3JlIHByb2Nlc3Npbmcgb2YgdGhlIGluaGVyZW50LCBlLmcuIGluIGBvbl9pbml0aWFsaXplYCB0aGlzIGRhdGEgbWF5IGJlIHN0YWxlLgCsIFRoaXMgZGF0YSBpcyBhbHNvIGFic2VudCBmcm9tIHRoZSBnZW5lc2lzLgBESG9zdENvbmZpZ3VyYXRpb24AAJkHBAAYKQEgVGhlIHBhcmFjaGFpbiBob3N0IGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgb2J0YWluZWQgZnJvbSB0aGUgcmVsYXkgcGFyZW50LgBtASBUaGlzIGZpZWxkIGlzIG1lYW50IHRvIGJlIHVwZGF0ZWQgZWFjaCBibG9jayB3aXRoIHRoZSB2YWxpZGF0aW9uIGRhdGEgaW5oZXJlbnQuIFRoZXJlZm9yZSxNASBiZWZvcmUgcHJvY2Vzc2luZyBvZiB0aGUgaW5oZXJlbnQsIGUuZy4gaW4gYG9uX2luaXRpYWxpemVgIHRoaXMgZGF0YSBtYXkgYmUgc3RhbGUuAKwgVGhpcyBkYXRhIGlzIGFsc28gYWJzZW50IGZyb20gdGhlIGdlbmVzaXMuADhMYXN0RG1xTXFjSGVhZAEAoQeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ9CBUaGUgbGFzdCBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGNoYWluIGhlYWQgd2UgaGF2ZSBvYnNlcnZlZC4AZQEgVGhpcyB2YWx1ZSBpcyBsb2FkZWQgYmVmb3JlIGFuZCBzYXZlZCBhZnRlciBwcm9jZXNzaW5nIGluYm91bmQgZG93bndhcmQgbWVzc2FnZXMgY2FycmllZGAgYnkgdGhlIHN5c3RlbSBpbmhlcmVudC4AQExhc3RIcm1wTXFjSGVhZHMBAKUHBAAQSQEgVGhlIG1lc3NhZ2UgcXVldWUgY2hhaW4gaGVhZHMgd2UgaGF2ZSBvYnNlcnZlZCBwZXIgZWFjaCBjaGFubmVsIGluY29taW5nIGNoYW5uZWwuAGUBIFRoaXMgdmFsdWUgaXMgbG9hZGVkIGJlZm9yZSBhbmQgc2F2ZWQgYWZ0ZXIgcHJvY2Vzc2luZyBpbmJvdW5kIGRvd253YXJkIG1lc3NhZ2VzIGNhcnJpZWRgIGJ5IHRoZSBzeXN0ZW0gaW5oZXJlbnQuAGRQcm9jZXNzZWREb3dud2FyZE1lc3NhZ2VzAQA4EAAAAAAMyCBOdW1iZXIgb2YgZG93bndhcmQgbWVzc2FnZXMgcHJvY2Vzc2VkIGluIGEgYmxvY2suAOwgVGhpcyB3aWxsIGJlIGNsZWFyZWQgaW4gYG9uX2luaXRpYWxpemVgIG9mIGVhY2ggbmV3IGJsb2NrLgBwTGFzdFByb2Nlc3NlZERvd253YXJkTWVzc2FnZQAAsQcEAAyUIFRoZSBsYXN0IHByb2Nlc3NlZCBkb3dud2FyZCBtZXNzYWdlLgBdASBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkLgA0SHJtcFdhdGVybWFyawEAOBAAAAAABKAgSFJNUCB3YXRlcm1hcmsgdGhhdCB3YXMgc2V0IGluIGEgYmxvY2suAGBMYXN0UHJvY2Vzc2VkSHJtcE1lc3NhZ2UAALEHBAAMhCBUaGUgbGFzdCBwcm9jZXNzZWQgSFJNUCBtZXNzYWdlLgBdASBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkLgBQSHJtcE91dGJvdW5kTWVzc2FnZXMBALUHBAAMpCBIUk1QIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50IGluIGEgYmxvY2suAOwgVGhpcyB3aWxsIGJlIGNsZWFyZWQgaW4gYG9uX2luaXRpYWxpemVgIG9mIGVhY2ggbmV3IGJsb2NrLgA4VXB3YXJkTWVzc2FnZXMBADQEAAysIFVwd2FyZCBtZXNzYWdlcyB0aGF0IHdlcmUgc2VudCBpbiBhIGJsb2NrLgDwIFRoaXMgd2lsbCBiZSBjbGVhcmVkIGluIGBvbl9pbml0aWFsaXplYCBmb3IgZWFjaCBuZXcgYmxvY2suAFRQZW5kaW5nVXB3YXJkTWVzc2FnZXMBADQEAAQxASBVcHdhcmQgbWVzc2FnZXMgdGhhdCBhcmUgc3RpbGwgcGVuZGluZyBhbmQgbm90IHlldCBzZW50IHRvIHRoZSByZWxheSBjaGFpbi4AUFBlbmRpbmdVcHdhcmRTaWduYWxzAQA0BAAMLQEgVXB3YXJkIHNpZ25hbHMgdGhhdCBhcmUgc3RpbGwgcGVuZGluZyBhbmQgbm90IHlldCBzZW50IHRvIHRoZSByZWxheSBjaGFpbi4A2CBUaGlzIHdpbGwgYmUgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGZvciBlYWNoIGJsb2NrLgBcVXB3YXJkRGVsaXZlcnlGZWVGYWN0b3IBAC0BQAAAZKeztuANAAAAAAAAAAAE5CBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieSBmb3IgVU1QLgCEQW5ub3VuY2VkSHJtcE1lc3NhZ2VzUGVyQ2FuZGlkYXRlAQA4EAAAAAAIZQEgVGhlIG51bWJlciBvZiBIUk1QIG1lc3NhZ2VzIHdlIG9ic2VydmVkIGluIGBvbl9pbml0aWFsaXplYCBhbmQgdGh1cyB1c2VkIHRoYXQgbnVtYmVyIGZvcvAgYW5ub3VuY2luZyB0aGUgd2VpZ2h0IG9mIGBvbl9pbml0aWFsaXplYCBhbmQgYG9uX2ZpbmFsaXplYC4AaFJlc2VydmVkWGNtcFdlaWdodE92ZXJyaWRlAADVAQQACF0BIFRoZSB3ZWlnaHQgd2UgcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jayBmb3IgcHJvY2Vzc2luZyBYQ01QIG1lc3NhZ2VzLiBUaGlzuCBvdmVycmlkZXMgdGhlIGFtb3VudCBzZXQgaW4gdGhlIENvbmZpZyB0cmFpdC4AZFJlc2VydmVkRG1wV2VpZ2h0T3ZlcnJpZGUAANUBBAAIWQEgVGhlIHdlaWdodCB3ZSByZXNlcnZlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrIGZvciBwcm9jZXNzaW5nIERNUCBtZXNzYWdlcy4gVGhpc7ggb3ZlcnJpZGVzIHRoZSBhbW91bnQgc2V0IGluIHRoZSBDb25maWcgdHJhaXQuAGBDdXN0b21WYWxpZGF0aW9uSGVhZERhdGEAABgEAAwpASBBIGN1c3RvbSBoZWFkIGRhdGEgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYXMgcmVzdWx0IG9mIGB2YWxpZGF0ZV9ibG9ja2AuABEBIFNlZSBgUGFsbGV0OjpzZXRfY3VzdG9tX3ZhbGlkYXRpb25faGVhZF9kYXRhYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4AAUAAAREGAAQoU2VsZlBhcmFJZJwQFBQAAAS4IFJldHVybnMgdGhlIHBhcmFjaGFpbiBJRCB3ZSBhcmUgcnVubmluZyB3aXRoLgABvQcAAAABAAAkVGltZXN0YW1wASRUaW1lc3RhbXAIDE5vdwEAKCAAAAAAAAAAAASgIFRoZSBjdXJyZW50IHRpbWUgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAkRGlkVXBkYXRlAQDIBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgABsAAABDRNaW5pbXVtUGVyaW9kKCAAAAAAAAAAABiMIFRoZSBtaW5pbXVtIHBlcmlvZCBiZXR3ZWVuIGJsb2Nrcy4ATQEgQmUgYXdhcmUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byB0aGUgKmV4cGVjdGVkKiBwZXJpb2QgdGhhdCB0aGUgYmxvY2sgcHJvZHVjdGlvbkkBIGFwcGFyYXR1cyBwcm92aWRlcy4gWW91ciBjaG9zZW4gY29uc2Vuc3VzIHN5c3RlbSB3aWxsIGdlbmVyYWxseSB3b3JrIHdpdGggdGhpcyB0b2EBIGRldGVybWluZSBhIHNlbnNpYmxlIGJsb2NrIHRpbWUuIEZvciBleGFtcGxlLCBpbiB0aGUgQXVyYSBwYWxsZXQgaXQgd2lsbCBiZSBkb3VibGUgdGhpc3AgcGVyaW9kIG9uIGRlZmF1bHQgc2V0dGluZ3MuAAAEGE1vbWVudCgEmCBUeXBlIHVzZWQgZm9yIGV4cHJlc3NpbmcgYSB0aW1lc3RhbXAuAAIAADRQYXJhY2hhaW5JbmZvATRQYXJhY2hhaW5JbmZvBCxQYXJhY2hhaW5JZAEAnBBkAAAAAAABuAAAAAAAAAMAADRXZWlnaHRSZWNsYWltAAAAAAAAAAQIgQEgUGFsbGV0IHRvIHVzZSBhbG9uZ3NpZGUgdGhlIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBbYFN0b3JhZ2VXZWlnaHRSZWNsYWltYF0sIHRoZSBwYWxsZXQgcHJvdmlkZXOMIHdlaWdodCBpbmZvcm1hdGlvbiBhbmQgYmVuY2htYXJrcy4AIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAxEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLgBASW5hY3RpdmVJc3N1YW5jZQEAxEAAAAAAAAAAAAAAAAAAAAAABAkBIFRoZSB0b3RhbCB1bml0cyBvZiBvdXRzdGFuZGluZyBkZWFjdGl2YXRlZCBiYWxhbmNlIGluIHRoZSBzeXN0ZW0uABxBY2NvdW50AQEEAgTRBQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLgAUTG9ja3MBAQQCBMEHBAAQuCBBbnkgbGlxdWlkaXR5IGxvY2tzIG9uIHNvbWUgYWNjb3VudCBiYWxhbmNlcy4lASBOT1RFOiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB3aGVuIHNldHRpbmcsIGNoYW5naW5nIGFuZCBmcmVlaW5nIGEgbG9jay4ArQEgVXNlIG9mIGxvY2tzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGZyZWV6ZXMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYAAgUmVzZXJ2ZXMBAQQCBNEHBAAMpCBOYW1lZCByZXNlcnZlcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gABRIb2xkcwEBBAIE3QcEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuABxGcmVlemVzAQEEAgTpBwQABIggRnJlZXplIGxvY2tzIG9uIGFjY291bnQgYmFsYW5jZXMuAAG8AAEZBgAQSEV4aXN0ZW50aWFsRGVwb3NpdMRAAMqaOwAAAAAAAAAAAAAAACBBASBUaGUgbWluaW11bSBhbW91bnQgcmVxdWlyZWQgdG8ga2VlcCBhbiBhY2NvdW50IG9wZW4uIE1VU1QgQkUgR1JFQVRFUiBUSEFOIFpFUk8hAFkBIElmIHlvdSAqcmVhbGx5KiBuZWVkIGl0IHRvIGJlIHplcm8sIHlvdSBjYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGBpbnNlY3VyZV96ZXJvX2VkYCBmb3JhASB0aGlzIHBhbGxldC4gSG93ZXZlciwgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2s6IHRoaXMgd2lsbCBvcGVuIHVwIGEgbWFqb3IgRG9TIHZlY3Rvci5ZASBJbiBjYXNlIHlvdSBoYXZlIG11bHRpcGxlIHNvdXJjZXMgb2YgcHJvdmlkZXIgcmVmZXJlbmNlcywgeW91IG1heSBhbHNvIGdldCB1bmV4cGVjdGVkjCBiZWhhdmlvdXIgaWYgeW91IHNldCB0aGlzIHRvIHplcm8uAPAgQm90dG9tIGxpbmU6IERvIHlvdXJzZWxmIGEgZmF2b3VyIGFuZCBtYWtlIGl0IGF0IGxlYXN0IG9uZSEAIE1heExvY2tzOBAyAAAAEPQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2tzIHRoYXQgc2hvdWxkIGV4aXN0IG9uIGFuIGFjY291bnQu3CBOb3Qgc3RyaWN0bHkgZW5mb3JjZWQsIGJ1dCB1c2VkIGZvciB3ZWlnaHQgZXN0aW1hdGlvbi4ArQEgVXNlIG9mIGxvY2tzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGZyZWV6ZXMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYAAsTWF4UmVzZXJ2ZXM4EDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gAChNYXhGcmVlemVzOBAAAAAABGEBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGZyZWV6ZSBsb2NrcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50IGF0IGFueSB0aW1lLgAB9QcAEERSdW50aW1lSG9sZFJlYXNvbiEGBHQgVGhlIG92ZXJhcmNoaW5nIGhvbGQgcmVhc29uLhxCYWxhbmNlxARsIFRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQuRFJlc2VydmVJZGVudGlmaWVyvQEMaCBUaGUgSUQgdHlwZSBmb3IgcmVzZXJ2ZXMuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gQEZyZWV6ZUlkZW50aWZpZXIQBGQgVGhlIElEIHR5cGUgZm9yIGZyZWV6ZXMuAAoAAEhUcmFuc2FjdGlvblBheW1lbnQBSFRyYW5zYWN0aW9uUGF5bWVudAxETmV4dEZlZU11bHRpcGxpZXIBAC0BQAAAZKeztuANAAAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEA+QcEAAAAPFR4UGF5bWVudENyZWRpdAAA/QcEAAzwIFRoZSBgT25DaGFyZ2VUcmFuc2FjdGlvbmAgc3RvcmVzIHRoZSB3aXRoZHJhd24gdHggZmVlIGhlcmUuADUBIFVzZSBgd2l0aGRyYXdfdHhmZWVgIGFuZCBgcmVtYWluaW5nX3R4ZmVlYCB0byBhY2Nlc3MgZnJvbSBvdXRzaWRlIHRoZSBjcmF0ZS4AAAFJBgAEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcgwEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AAAAACwAASFNraXBGZWVsZXNzUGF5bWVudAAAAU0GAAAAAAAMAABET3JpZ2luUmVzdHJpY3Rpb24BRE9yaWdpblJlc3RyaWN0aW9uBBhVc2FnZXMAAQQC2AUIBAAEjCBUaGUgY3VycmVudCB1c2FnZSBmb3IgZWFjaCBlbnRpdHkuAAHUAAFRBgAAAQkIAARAUmVzdHJpY3RlZEVudGl0edgkUQEgVGhlIHR5cGUgdGhhdCByZXByZXNlbnQgdGhlIGVudGl0aWVzIHRyYWNrZWQsIGl0cyBhbGxvd2FuY2UgYW5kIHRoZSBjb252ZXJzaW9uIGZyb22YIG9yaWdpbiBpcyBib3VuZGVkIGluIFtgUmVzdHJpY3Rpb25gXS4AHQEgVGhpcyBpcyB0aGUgY2Fub25pY2FsIG9yaWdpbiBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHVzYWdlIHRyYWNraW5nLowgRWFjaCBlbnRpdHkgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5LgBJASBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIG9yaWdpbiBhcyBhIG11bHRpcGxlIG9yaWdpbiBjYW4gcmVwcmVzZW50IGEgc2luZ2xlIGVudGl0eS5hASBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIERBTyBvcmlnaW4gd2l0aCBhIHBlcmNlbnRhZ2Ugb2Ygdm90ZXJzLCB3ZSB3YW50IHRvIHRyYWNrIHRoZSBEQU+sIGVudGl0eSByZWdhcmRsZXNzIG9mIHRoZSB2b3RlciBwZXJjZW50YWdlLgANAAAYQXNzZXRzARhBc3NldHMYFEFzc2V0AAEEAuANCAQABFQgRGV0YWlscyBvZiBhbiBhc3NldC4AHEFjY291bnQAAQgCAhUIGQgEAATkIFRoZSBob2xkaW5ncyBvZiBhIHNwZWNpZmljIGFjY291bnQgZm9yIGEgc3BlY2lmaWMgYXNzZXQuACRBcHByb3ZhbHMAAQwCAgIlCCkIBAAMWQEgQXBwcm92ZWQgYmFsYW5jZSB0cmFuc2ZlcnMuIEZpcnN0IGJhbGFuY2UgaXMgdGhlIGFtb3VudCBhcHByb3ZlZCBmb3IgdHJhbnNmZXIuIFNlY29uZOggaXMgdGhlIGFtb3VudCBvZiBgVDo6Q3VycmVuY3lgIHJlc2VydmVkIGZvciBzdG9yaW5nIHRoaXMuSQEgRmlyc3Qga2V5IGlzIHRoZSBhc3NldCBJRCwgc2Vjb25kIGtleSBpcyB0aGUgb3duZXIgYW5kIHRoaXJkIGtleSBpcyB0aGUgZGVsZWdhdGUuACBNZXRhZGF0YQEBBALgLQhQAAAAAAAAAAAAAAAAAAAAAAAAAAAEWCBNZXRhZGF0YSBvZiBhbiBhc3NldC4AIFJlc2VydmVzAQEEAuAdAQQABPwgTWFwcyBhbiBhc3NldCB0byBhIGxpc3Qgb2YgaXRzIGNvbmZpZ3VyZWQgcmVzZXJ2ZSBpbmZvcm1hdGlvbi4ALE5leHRBc3NldElkAADgBAAkbQEgVGhlIGFzc2V0IElEIGVuZm9yY2VkIGZvciB0aGUgbmV4dCBhc3NldCBjcmVhdGlvbiwgaWYgYW55IHByZXNlbnQuIE90aGVyd2lzZSwgdGhpcyBzdG9yYWdlUCBpdGVtIGhhcyBubyBlZmZlY3QuAGUBIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igc2V0dGluZyB1cCBjb25zdHJhaW50cyBmb3IgSURzIG9mIHRoZSBuZXcgYXNzZXRzLiBGb3IgZXhhbXBsZSwgYnlpASBwcm92aWRpbmcgYW4gaW5pdGlhbCBbYE5leHRBc3NldElkYF0gYW5kIHVzaW5nIHRoZSBbYGNyYXRlOjpBdXRvSW5jQXNzZXRJZGBdIGNhbGxiYWNrLCBhbuggYXV0by1pbmNyZW1lbnQgbW9kZWwgY2FuIGJlIGFwcGxpZWQgdG8gYWxsIG5ldyBhc3NldCBJRHMuACEBIFRoZSBpbml0aWFsIG5leHQgYXNzZXQgSUQgY2FuIGJlIHNldCB1c2luZyB0aGUgW2BHZW5lc2lzQ29uZmlnYF0gb3IgdGhlIQEgW1NldE5leHRBc3NldElkXShgbWlncmF0aW9uOjpuZXh0X2Fzc2V0X2lkOjpTZXROZXh0QXNzZXRJZGApIG1pZ3JhdGlvbi4AAdwAAVUGABxAUmVtb3ZlSXRlbXNMaW1pdDgQ6AMAAAxRASBNYXggbnVtYmVyIG9mIGl0ZW1zIHRvIGRlc3Ryb3kgcGVyIGBkZXN0cm95X2FjY291bnRzYCBhbmQgYGRlc3Ryb3lfYXBwcm92YWxzYCBjYWxsLgA5ASBNdXN0IGJlIGNvbmZpZ3VyZWQgdG8gcmVzdWx0IGluIGEgd2VpZ2h0IHRoYXQgbWFrZXMgZWFjaCBjYWxsIGZpdCBpbiBhIGJsb2NrLgAwQXNzZXREZXBvc2l0xEAAypo7AAAAAAAAAAAAAAAABPggVGhlIGJhc2ljIGFtb3VudCBvZiBmdW5kcyB0aGF0IG11c3QgYmUgcmVzZXJ2ZWQgZm9yIGFuIGFzc2V0LgBMQXNzZXRBY2NvdW50RGVwb3NpdMRAAPRpswIAAAAAAAAAAAAAAAhFASBUaGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCBmb3IgYSBub24tcHJvdmlkZXIgYXNzZXQgYWNjb3VudCB0byBiZTAgbWFpbnRhaW5lZC4ATE1ldGFkYXRhRGVwb3NpdEJhc2XEQACoW+kDAAAAAAAAAAAAAAAEUQEgVGhlIGJhc2ljIGFtb3VudCBvZiBmdW5kcyB0aGF0IG11c3QgYmUgcmVzZXJ2ZWQgd2hlbiBhZGRpbmcgbWV0YWRhdGEgdG8geW91ciBhc3NldC4AWE1ldGFkYXRhRGVwb3NpdFBlckJ5dGXEQADh9QUAAAAAAAAAAAAAAAAIVQEgVGhlIGFkZGl0aW9uYWwgZnVuZHMgdGhhdCBtdXN0IGJlIHJlc2VydmVkIGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSBzdG9yZSBpbiB5b3VyKCBtZXRhZGF0YS4APEFwcHJvdmFsRGVwb3NpdMRAAMqaOwAAAAAAAAAAAAAAAAQhASBUaGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGFwcHJvdmFsLgAsU3RyaW5nTGltaXQ4EDIAAAAE4CBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBuYW1lIG9yIHN5bWJvbCBzdG9yZWQgb24tY2hhaW4uAAE1CAAUHEJhbGFuY2XEBJwgVGhlIHVuaXRzIGluIHdoaWNoIHdlIHJlY29yZCBiYWxhbmNlcy4cQXNzZXRJZOAEjCBJZGVudGlmaWVyIGZvciB0aGUgY2xhc3Mgb2YgYXNzZXQuQEFzc2V0SWRQYXJhbWV0ZXLgHFkBIFdyYXBwZXIgYXJvdW5kIGBTZWxmOjpBc3NldElkYCB0byB1c2UgaW4gZGlzcGF0Y2hhYmxlIGNhbGwgc2lnbmF0dXJlcy4gQWxsb3dzIHRoZSB1c2VRASBvZiBjb21wYWN0IGVuY29kaW5nIGluIGluc3RhbmNlcyBvZiB0aGUgcGFsbGV0LCB3aGljaCB3aWxsIHByZXZlbnQgYnJlYWtpbmcgY2hhbmdlcwUBIHJlc3VsdGluZyBmcm9tIHRoZSByZW1vdmFsIG9mIGBIYXNDb21wYWN0YCBmcm9tIGBTZWxmOjpBc3NldElkYC4AWQEgVGhpcyB0eXBlIGluY2x1ZGVzIHRoZSBgRnJvbTxTZWxmOjpBc3NldElkPmAgYm91bmQsIHNpbmNlIHRpZ2h0bHkgY291cGxlZCBwYWxsZXRzIG1heUUBIHdhbnQgdG8gY29udmVydCBhbiBgQXNzZXRJZGAgaW50byBhIHBhcmFtZXRlciBmb3IgY2FsbGluZyBkaXNwYXRjaGFibGUgZnVuY3Rpb25zKCBkaXJlY3RseS4sUmVzZXJ2ZURhdGEhAQToIEluZm9ybWF0aW9uIGFib3V0IHJlc2VydmUgbG9jYXRpb25zIGZvciBhIGNsYXNzIG9mIGFzc2V0LhRFeHRyYRAE+CBBZGRpdGlvbmFsIGRhdGEgdG8gYmUgc3RvcmVkIHdpdGggYW4gYWNjb3VudCdzIGFzc2V0IGJhbGFuY2UuEGgqWdUaueSKjIzEGP+XCNKnApetC0vdPaS3RimmWm5cNGFzc2V0X2RldGFpbHMECGlk4DkIBKggUHJvdmlkZSB0aGUgYXNzZXQgZGV0YWlscyBmb3IgYXNzZXQgYGlkYC4AaCpZ1Rq55IqMjMQY/5cI0lMax+IbdrEh52Hkc0GaGwIoYmFsYW5jZV9vZggMd2hvBAhpZOA9CAS0IFByb3ZpZGUgdGhlIGJhbGFuY2Ugb2YgYHdob2AgZm9yIGFzc2V0IGBpZGAuAGgqWdUaueSKjIzEGP+XCNIuh2akDRtp1hUb2AHldVBeMGdldF9tZXRhZGF0YQQIaWTgQQgEwCBQcm92aWRlIHRoZSBjb25maWd1cmVkIG1ldGFkYXRhIGZvciBhc3NldCBgaWRgLgBoKlnVGrnkioyMxBj/lwjSZPY/KSPjmCgkMWOBrh5phkRnZXRfcmVzZXJ2ZXNfZGF0YQQIaWTgJQEE1CBQcm92aWRlIHRoZSBjb25maWd1cmVkIHJlc2VydmVzIGRhdGEgZm9yIGFzc2V0IGBpZGAuAA4AADBBc3NldHNIb2xkZXIBMEFzc2V0c0hvbGRlcggUSG9sZHMBAQgCAhUI3QcEAAQNASBBIG1hcCB0aGF0IHN0b3JlcyBob2xkcyBhcHBsaWVkIG9uIGFuIGFjY291bnQgZm9yIGEgZ2l2ZW4gQXNzZXRJZC4AOEJhbGFuY2VzT25Ib2xkAAEIAgIVCMQEAARpASBBIG1hcCB0aGF0IHN0b3JlcyB0aGUgY3VycmVudCB0b3RhbCBiYWxhbmNlIG9uIGhvbGQgZm9yIGV2ZXJ5IGFjY291bnQgb24gYSBnaXZlbiBBc3NldElkLgAAAVkGAAABRQgABERSdW50aW1lSG9sZFJlYXNvbiEGBHwgVGhlIG92ZXJhcmNoaW5nIGZyZWV6ZSByZWFzb24uAA8AACRBc3NldFJhdGUBJEFzc2V0UmF0ZQRYQ29udmVyc2lvblJhdGVUb05hdGl2ZQABBALgLQEEAAwdASBNYXBzIGFuIGFzc2V0IHRvIGl0cyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGJhbGFuY2UuAE0BIEUuZy4gYG5hdGl2ZV9hbW91bnQgPSBhc3NldF9hbW91bnQgKiBDb252ZXJzaW9uUmF0ZVRvTmF0aXZlOjo8VD46OmdldChhc3NldF9raW5kKWAAASkBAAFdBgAAAUkIAAQkQXNzZXRLaW5k4ARFASBUaGUgdHlwZSBmb3IgYXNzZXQga2luZHMgZm9yIHdoaWNoIHRoZSBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgaXMgc2V0LgAQAAA4QXNzZXRUeFBheW1lbnQAAAFhBgAAAAAAEQAAKEF1dGhvcnNoaXABKEF1dGhvcnNoaXAEGEF1dGhvcgAABAQABGQgQXV0aG9yIG9mIGN1cnJlbnQgYmxvY2suAAAAAAAAABQAAERDb2xsYXRvclNlbGVjdGlvbgFEQ29sbGF0b3JTZWxlY3Rpb24UNEludnVsbmVyYWJsZXMBAE0IBAAEEQEgVGhlIGludnVsbmVyYWJsZSwgcGVybWlzc2lvbmVkIGNvbGxhdG9ycy4gVGhpcyBsaXN0IG11c3QgYmUgc29ydGVkLgA0Q2FuZGlkYXRlTGlzdAEAUQgEABRpASBUaGUgKGNvbW11bml0eSwgbGltaXRlZCkgY29sbGF0aW9uIGNhbmRpZGF0ZXMuIGBDYW5kaWRhdGVzYCBhbmQgYEludnVsbmVyYWJsZXNgIHNob3VsZCBiZVAgbXV0dWFsbHkgZXhjbHVzaXZlLgB1ASBUaGlzIGxpc3QgaXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSBkZXBvc2l0IGFuZCB3aGVuIHRoZSBkZXBvc2l0cyBhcmUgZXF1YWwsIHRoZSBsZWFzdKAgcmVjZW50bHkgdXBkYXRlZCBpcyBjb25zaWRlcmVkIGdyZWF0ZXIuAERMYXN0QXV0aG9yZWRCbG9jawEBBAUEOBAAAAAABIQgTGFzdCBibG9jayBhdXRob3JlZCBieSBjb2xsYXRvci4ARERlc2lyZWRDYW5kaWRhdGVzAQA4EAAAAAAMeCBEZXNpcmVkIG51bWJlciBvZiBjYW5kaWRhdGVzLgB1ASBUaGlzIHNob3VsZCBpZGVhbGx5IGFsd2F5cyBiZSBsZXNzIHRoYW4gW2BDb25maWc6Ok1heENhbmRpZGF0ZXNgXSBmb3Igd2VpZ2h0cyB0byBiZSBjb3JyZWN0LgA0Q2FuZGlkYWN5Qm9uZAEAxEAAAAAAAAAAAAAAAAAAAAAADLggRml4ZWQgYW1vdW50IHRvIGRlcG9zaXQgdG8gYmVjb21lIGEgY29sbGF0b3IuAEEBIFdoZW4gYSBjb2xsYXRvciBjYWxscyBgbGVhdmVfaW50ZW50YCB0aGV5IGltbWVkaWF0ZWx5IHJlY2VpdmUgdGhlIGRlcG9zaXQgYmFjay4AATEBAAFlBgAYFFBvdElkXQggUG90U3Rha2UE9CBBY2NvdW50IElkZW50aWZpZXIgZnJvbSB3aGljaCB0aGUgaW50ZXJuYWwgUG90IGlzIGdlbmVyYXRlZC4ANE1heENhbmRpZGF0ZXM4EGQAAAAMyCBNYXhpbXVtIG51bWJlciBvZiBjYW5kaWRhdGVzIHRoYXQgd2Ugc2hvdWxkIGhhdmUuAMwgVGhpcyBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgaW52dWxuZXJhYmxlcy4AUE1pbkVsaWdpYmxlQ29sbGF0b3JzOBAEAAAADFUBIE1pbmltdW0gbnVtYmVyIGVsaWdpYmxlIGNvbGxhdG9ycy4gU2hvdWxkIGFsd2F5cyBiZSBncmVhdGVyIHRoYW4gemVyby4gVGhpcyBpbmNsdWRlc1EBIEludnVsbmVyYWJsZSBjb2xsYXRvcnMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYWx3YXlzIGJlIG9uZSBjb2xsYXRvciB3aG8gY2FuRCBwcm9kdWNlIGEgYmxvY2suAEBNYXhJbnZ1bG5lcmFibGVzOBAUAAAABIQgTWF4aW11bSBudW1iZXIgb2YgaW52dWxuZXJhYmxlcy4ANEtpY2tUaHJlc2hvbGQ4EDAqAAAAACxwb3RfYWNjb3VudASAbW9kbFBvdFN0YWtlAAAAAAAAAAAAAAAAAAAAAAAAAAAEoCBHZXRzIHRoaXMgcGFsbGV0J3MgZGVyaXZlZCBwb3QgYWNjb3VudC4AAWEIAAQsVmFsaWRhdG9ySWQEBHQgQSBzdGFibGUgSUQgZm9yIGEgdmFsaWRhdG9yLgAVAAAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEAzAQABHwgVGhlIGN1cnJlbnQgc2V0IG9mIHZhbGlkYXRvcnMuADBDdXJyZW50SW5kZXgBADgQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uADRRdWV1ZWRDaGFuZ2VkAQDIBAAIOQEgVHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBlY29ub21pYyBpZGVudGl0aWVzIG9yIHdlaWdodGluZyBiZWhpbmQgdGhlIHZhbGlkYXRvcnOkIGhhcyBjaGFuZ2VkIGluIHRoZSBxdWV1ZWQgdmFsaWRhdG9yIHNldC4AKFF1ZXVlZEtleXMBAGUIBAAIPQEgVGhlIHF1ZXVlZCBrZXlzIGZvciB0aGUgbmV4dCBzZXNzaW9uLiBXaGVuIHRoZSBuZXh0IHNlc3Npb24gYmVnaW5zLCB0aGVzZSBrZXlz4CB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZGF0b3IncyBzZXNzaW9uIGtleXMuAEhEaXNhYmxlZFZhbGlkYXRvcnMBAG0IBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuACBOZXh0S2V5cwABBAUEOQEEAAScIFRoZSBuZXh0IHNlc3Npb24ga2V5cyBmb3IgYSB2YWxpZGF0b3IuACBLZXlPd25lcgABBAV9CAQEAAQJASBUaGUgb3duZXIgb2YgYSBrZXkuIFRoZSBrZXkgaXMgdGhlIGBLZXlUeXBlSWRgICsgdGhlIGVuY29kZWQga2V5LgABNQEAAWkGAAQoS2V5RGVwb3NpdMRAAAAAAAAAAAAAAAAAAAAAAASkIFRoZSBhbW91bnQgdG8gYmUgaGVsZCB3aGVuIHNldHRpbmcga2V5cy4AAYUIAAgsVmFsaWRhdG9ySWQEBHQgQSBzdGFibGUgSUQgZm9yIGEgdmFsaWRhdG9yLhBLZXlzOQEEKCBUaGUga2V5cy4AFgAAEEF1cmEBEEF1cmEILEF1dGhvcml0aWVzAQCJCAQABGwgVGhlIGN1cnJlbnQgYXV0aG9yaXR5IHNldC4ALEN1cnJlbnRTbG90AQCRCCAAAAAAAAAAAAyAIFRoZSBjdXJyZW50IHNsb3Qgb2YgdGhpcyBibG9jay4AlCBUaGlzIHdpbGwgYmUgc2V0IGluIGBvbl9pbml0aWFsaXplYC4AAAAEMFNsb3REdXJhdGlvbigg4C4AAAAAAAAQDQEgVGhlIHNsb3QgZHVyYXRpb24gQXVyYSBzaG91bGQgcnVuIHdpdGgsIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuPQEgVGhlIGVmZmVjdGl2ZSB2YWx1ZSBvZiB0aGlzIHR5cGUgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hpbGUgdGhlIGNoYWluIGlzIHJ1bm5pbmcuADUBIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBlaXRoZXIgdXNlIFtgTWluaW11bVBlcmlvZFRpbWVzVHdvYF0gb3IgYSBjb25zdC4AAAQsQXV0aG9yaXR5SWQ9AQSYIFRoZSBpZGVudGlmaWVyIHR5cGUgZm9yIGFuIGF1dGhvcml0eS4AFwAAHEF1cmFFeHQBHEF1cmFFeHQILEF1dGhvcml0aWVzAQCJCAQAFJQgU2VydmVzIGFzIGNhY2hlIGZvciB0aGUgYXV0aG9yaXRpZXMuAHEBIFRoZSBhdXRob3JpdGllcyBpbiBBdVJhIGFyZSBvdmVyd3JpdHRlbiBpbiBgb25faW5pdGlhbGl6ZWAgd2hlbiB3ZSBzd2l0Y2ggdG8gYSBuZXcgc2Vzc2lvbixdASBidXQgd2UgcmVxdWlyZSB0aGUgb2xkIGF1dGhvcml0aWVzIHRvIHZlcmlmeSB0aGUgc2VhbCB3aGVuIHZhbGlkYXRpbmcgYSBQb1YuIFRoaXMgd2lsbA0BIGFsd2F5cyBiZSB1cGRhdGVkIHRvIHRoZSBsYXRlc3QgQXVSYSBhdXRob3JpdGllcyBpbiBgb25fZmluYWxpemVgLgA0UmVsYXlTbG90SW5mbwAAlQgEABAJASBDdXJyZW50IHJlbGF5IGNoYWluIHNsb3QgcGFpcmVkIHdpdGggYSBudW1iZXIgb2YgYXV0aG9yZWQgYmxvY2tzLgBlASBUaGlzIGlzIHVwZGF0ZWQgaW4gW2BGaXhlZFZlbG9jaXR5Q29uc2Vuc3VzSG9vazo6b25fc3RhdGVfcHJvb2ZgXSB3aXRoIHRoZSBjdXJyZW50IHJlbGF53CBjaGFpbiBzbG90IGFzIHByb3ZpZGVkIGJ5IHRoZSByZWxheSBjaGFpbiBzdGF0ZSBwcm9vZi4AAAAAAAAAGAAAJFhjbXBRdWV1ZQEkWGNtcFF1ZXVlHFBJbmJvdW5kWGNtcFN1c3BlbmRlZAEAmQgEACANASBUaGUgc3VzcGVuZGVkIGluYm91bmQgWENNUCBjaGFubmVscy4gQWxsIG90aGVycyBhcmUgbm90IHN1c3BlbmRlZC4AcQEgVGhpcyBpcyBhIGBTdG9yYWdlVmFsdWVgIGluc3RlYWQgb2YgYSBgU3RvcmFnZU1hcGAgc2luY2Ugd2UgZXhwZWN0IG11bHRpcGxlIHJlYWRzIHBlciBibG9ja2kBIHRvIGRpZmZlcmVudCBrZXlzIHdpdGggYSBvbmUgYnl0ZSBwYXlsb2FkLiBUaGUgYWNjZXNzIHRvIGBCb3VuZGVkQlRyZWVTZXRgIHdpbGwgYmUgY2FjaGVkFQEgd2l0aGluIHRoZSBibG9jayBhbmQgdGhlcmVmb3JlIG9ubHkgaW5jbHVkZWQgb25jZSBpbiB0aGUgcHJvb2Ygc2l6ZS4AZQEgTk9URTogVGhlIFBvViBiZW5jaG1hcmtpbmcgY2Fubm90IGtub3cgdGhpcyBhbmQgd2lsbCBvdmVyLWVzdGltYXRlLCBidXQgdGhlIGFjdHVhbCBwcm9vZkQgd2lsbCBiZSBzbWFsbGVyLgBIT3V0Ym91bmRYY21wU3RhdHVzAQClCAQAGF0BIFRoZSBub24tZW1wdHkgWENNUCBjaGFubmVscyBpbiBvcmRlciBvZiBiZWNvbWluZyBub24tZW1wdHksIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0UQEgYW5kIGxhc3Qgb3V0Ym91bmQgbWVzc2FnZS4gSWYgdGhlIHR3byBpbmRpY2VzIGFyZSBlcXVhbCwgdGhlbiBpdCBpbmRpY2F0ZXMgYW4gZW1wdHlZASBxdWV1ZSBhbmQgdGhlcmUgbXVzdCBiZSBhIG5vbi1gT2tgIGBPdXRib3VuZFN0YXR1c2AuIFdlIGFzc3VtZSBxdWV1ZXMgZ3JvdyBubyBncmVhdGVyWQEgdGhhbiA2NTUzNSBpdGVtcy4gUXVldWUgaW5kaWNlcyBmb3Igbm9ybWFsIG1lc3NhZ2VzIGJlZ2luIGF0IG9uZTsgemVybyBpcyByZXNlcnZlZCBpbhEBIGNhc2Ugb2YgdGhlIG5lZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgc2lnbmFsIG1lc3NhZ2UgdGhpcyBibG9jay4JASBUaGUgYm9vbCBpcyB0cnVlIGlmIHRoZXJlIGlzIGEgc2lnbmFsIG1lc3NhZ2Ugd2FpdGluZyB0byBiZSBzZW50LgBQT3V0Ym91bmRYY21wTWVzc2FnZXMBAQgCBbUIuQgEAAS8IFRoZSBtZXNzYWdlcyBvdXRib3VuZCBpbiBhIGdpdmVuIFhDTVAgY2hhbm5lbC4AOFNpZ25hbE1lc3NhZ2VzAQEEApy5CAQABKAgQW55IHNpZ25hbCBtZXNzYWdlcyB3YWl0aW5nIHRvIGJlIHNlbnQuACxRdWV1ZUNvbmZpZwEAvQgwIAAAADAAAAAIAAAABBUBIFRoZSBjb25maWd1cmF0aW9uIHdoaWNoIGNvbnRyb2xzIHRoZSBkeW5hbWljcyBvZiB0aGUgb3V0Ym91bmQgcXVldWUuADhRdWV1ZVN1c3BlbmRlZAEAyAQABEEBIFdoZXRoZXIgb3Igbm90IHRoZSBYQ01QIHF1ZXVlIGlzIHN1c3BlbmRlZCBmcm9tIGV4ZWN1dGluZyBpbmNvbWluZyBYQ01zIG9yIG5vdC4ARERlbGl2ZXJ5RmVlRmFjdG9yAQEEBZwtAUAAAGSns7bgDQAAAAAAAAAABMQgVGhlIGZhY3RvciB0byBtdWx0aXBseSB0aGUgYmFzZSBkZWxpdmVyeSBmZWUgYnkuAAFBAQABbQYADExNYXhJbmJvdW5kU3VzcGVuZGVkOBDoAwAAFEkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmJvdW5kIFhDTVAgY2hhbm5lbHMgdGhhdCBjYW4gYmUgc3VzcGVuZGVkIHNpbXVsdGFuZW91c2x5LgBdASBBbnkgZnVydGhlciBjaGFubmVsIHN1c3BlbnNpb25zIHdpbGwgZmFpbCBhbmQgbWVzc2FnZXMgbWF5IGdldCBkcm9wcGVkIHdpdGhvdXQgZnVydGhlckUBIG5vdGljZS4gQ2hvb3NpbmcgYSBoaWdoIHZhbHVlICgxMDAwKSBpcyBva2F5OyB0aGUgdHJhZGUtb2ZmIHRoYXQgaXMgZGVzY3JpYmVkIGlu2CBbYEluYm91bmRYY21wU3VzcGVuZGVkYF0gc3RpbGwgYXBwbGllcyBhdCB0aGF0IHNjYWxlLgBkTWF4QWN0aXZlT3V0Ym91bmRDaGFubmVsczgQgAAAACBlASBNYXhpbWFsIG51bWJlciBvZiBvdXRib3VuZCBYQ01QIGNoYW5uZWxzIHRoYXQgY2FuIGhhdmUgbWVzc2FnZXMgcXVldWVkIGF0IHRoZSBzYW1lIHRpbWUuAFUBIElmIHRoaXMgaXMgcmVhY2hlZCwgdGhlbiBubyBmdXJ0aGVyIG1lc3NhZ2VzIGNhbiBiZSBzZW50IHRvIGNoYW5uZWxzIHRoYXQgZG8gbm90IHlldF0BIGhhdmUgYSBtZXNzYWdlIHF1ZXVlZC4gVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBleHBlY3RlZCBtYXhpbXVtIG9mIG91dGJvdW5kIGNoYW5uZWxzYQEgd2hpY2ggaXMgZGV0ZXJtaW5lZCBieSBbYFNlbGY6OkNoYW5uZWxJbmZvYF0uIEl0IGlzIGltcG9ydGFudCB0byBzZXQgdGhpcyBsYXJnZSBlbm91Z2gsXQEgc2luY2Ugb3RoZXJ3aXNlIHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgcHJvdG9jb2wgd2lsbCBub3Qgd29yayBhcyBpbnRlbmRlZCBhbmQgbWVzc2FnZXNRASBtYXkgYmUgZHJvcHBlZC4gVGhpcyB2YWx1ZSBpbmNyZWFzZXMgdGhlIFBvViBhbmQgc2hvdWxkIHRoZXJlZm9yZSBub3QgYmUgcGlja2VkIHRvb00BIGhpZ2guIEdvdmVybmFuY2UgbmVlZHMgdG8gcGF5IGF0dGVudGlvbiB0byBub3Qgb3BlbiBtb3JlIGNoYW5uZWxzIHRoYW4gdGhpcyB2YWx1ZS4ALE1heFBhZ2VTaXplOBAAnAEAFLggVGhlIG1heGltYWwgcGFnZSBzaXplIGZvciBIUk1QIG1lc3NhZ2UgcGFnZXMuAGEBIEEgbG93ZXIgbGltaXQgY2FuIGJlIHNldCBkeW5hbWljYWxseSwgYnV0IHRoaXMgaXMgdGhlIGhhcmQtbGltaXQgZm9yIHRoZSBQb1Ygd29yc3QgY2FzZVUBIGJlbmNobWFya2luZy4gVGhlIGxpbWl0IGZvciB0aGUgc2l6ZSBvZiBhIG1lc3NhZ2UgaXMgc2xpZ2h0bHkgYmVsb3cgdGhpcywgc2luY2Ugc29tZbggb3ZlcmhlYWQgaXMgaW5jdXJyZWQgZm9yIGVuY29kaW5nIHRoZSBmb3JtYXQuAAHBCAAAAB4AACxQb2xrYWRvdFhjbQEsUG9sa2Fkb3RYY208MFF1ZXJ5Q291bnRlcgEAKCAAAAAAAAAAAASIIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHF1ZXJ5IGluZGV4LgAcUXVlcmllcwABBAIoxQgEAARUIFRoZSBvbmdvaW5nIHF1ZXJpZXMuAChBc3NldFRyYXBzAQEEBjw4EAAAAAAQaCBUaGUgZXhpc3RpbmcgYXNzZXQgdHJhcHMuAGEBIEtleSBpcyB0aGUgYmxha2UyIDI1NiBoYXNoIG9mIChvcmlnaW4sIHZlcnNpb25lZCBgQXNzZXRzYCkgcGFpci4gVmFsdWUgaXMgdGhlIG51bWJlciBvZh0BIHRpbWVzIHRoaXMgcGFpciBoYXMgYmVlbiB0cmFwcGVkICh1c3VhbGx5IGp1c3QgMSBpZiBpdCBleGlzdHMgYXQgYWxsKS4AOFNhZmVYY21WZXJzaW9uAAA4BAAIYQEgRGVmYXVsdCB2ZXJzaW9uIHRvIGVuY29kZSBYQ00gd2hlbiBsYXRlc3QgdmVyc2lvbiBvZiBkZXN0aW5hdGlvbiBpcyB1bmtub3duLiBJZiBgTm9uZWAsPQEgdGhlbiB0aGUgZGVzdGluYXRpb25zIHdob3NlIFhDTSB2ZXJzaW9uIGlzIHVua25vd24gYXJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuAEBTdXBwb3J0ZWRWZXJzaW9uAAEIBQLZCDgEAATwIFRoZSBMYXRlc3QgdmVyc2lvbnMgdGhhdCB3ZSBrbm93IHZhcmlvdXMgbG9jYXRpb25zIHN1cHBvcnQuAEBWZXJzaW9uTm90aWZpZXJzAAEIBQLZCCgEAAQFASBBbGwgbG9jYXRpb25zIHRoYXQgd2UgaGF2ZSByZXF1ZXN0ZWQgdmVyc2lvbiBub3RpZmljYXRpb25zIGZyb20uAFBWZXJzaW9uTm90aWZ5VGFyZ2V0cwABCAUC2QjdCAQACHEBIFRoZSB0YXJnZXQgbG9jYXRpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gb3VyIHZlcnNpb24gY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgbW9zdCByZWNlbnSUIG9mIG91ciB2ZXJzaW9ucyB3ZSBpbmZvcm1lZCB0aGVtIG9mLgBUVmVyc2lvbkRpc2NvdmVyeVF1ZXVlAQDhCAQADGUBIERlc3RpbmF0aW9ucyB3aG9zZSBsYXRlc3QgWENNIHZlcnNpb24gd2Ugd291bGQgbGlrZSB0byBrbm93LiBEdXBsaWNhdGVzIG5vdCBhbGxvd2VkLCBhbmRxASB0aGUgYHUzMmAgY291bnRlciBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYSBzZW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBoYXMgYmVlbiBhdHRlbXB0ZWQsjCB3aGljaCBpcyB1c2VkIGFzIGEgcHJpb3JpdGl6YXRpb24uAEBDdXJyZW50TWlncmF0aW9uAADtCAQABJwgVGhlIGN1cnJlbnQgbWlncmF0aW9uJ3Mgc3RhZ2UsIGlmIGFueS4AVFJlbW90ZUxvY2tlZEZ1bmdpYmxlcwABDAUCAvEI9QgEAATwIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gYSByZW1vdGUgY2hhaW4uADxMb2NrZWRGdW5naWJsZXMAAQQCBAUJBAAE4CBGdW5naWJsZSBhc3NldHMgd2hpY2ggd2Uga25vdyBhcmUgbG9ja2VkIG9uIHRoaXMgY2hhaW4uAFRYY21FeGVjdXRpb25TdXNwZW5kZWQBAMgEAAS0IEdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuADxTaG91bGRSZWNvcmRYY20BAMgEABxZASBXaGV0aGVyIG9yIG5vdCBpbmNvbWluZyBYQ01zIChib3RoIGV4ZWN1dGVkIGxvY2FsbHkgYW5kIHJlY2VpdmVkKSBzaG91bGQgYmUgcmVjb3JkZWQuxCBPbmx5IG9uZSBYQ00gcHJvZ3JhbSB3aWxsIGJlIHJlY29yZGVkIGF0IGEgdGltZS4pASBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gcnVudGltZSBBUElzLCBhbmQgaXQncyBhZHZpc2VkIGl0IHN0YXlzIGZhbHNlDQEgZm9yIGFsbCBvdGhlciB1c2UgY2FzZXMsIHNvIGFzIHRvIG5vdCBkZWdyYWRlIHJlZ3VsYXIgcGVyZm9ybWFuY2UuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4ALFJlY29yZGVkWGNtAABdAgQAGEkBIElmIFtgU2hvdWxkUmVjb3JkWGNtYF0gaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhlIGxhc3QgWENNIHByb2dyYW0gZXhlY3V0ZWQgbG9jYWxseVQgd2lsbCBiZSBzdG9yZWQgaGVyZS4pASBSdW50aW1lIEFQSXMgY2FuIGZldGNoIHRoZSBYQ00gdGhhdCB3YXMgZXhlY3V0ZWQgYnkgYWNjZXNzaW5nIHRoaXMgdmFsdWUuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4AREF1dGhvcml6ZWRBbGlhc2VzAAEEAkkBEQkEAAxlASBNYXAgb2YgYXV0aG9yaXplZCBhbGlhc2VycyBvZiBsb2NhbCBvcmlnaW5zLiBFYWNoIGxvY2FsIGxvY2F0aW9uIGNhbiBhdXRob3JpemUgYSBsaXN0IG9mWQEgb3RoZXIgbG9jYXRpb25zIHRvIGFsaWFzIGludG8gaXQuIEVhY2ggYWxpYXNlciBpcyBvbmx5IHZhbGlkIHVudGlsIGl0cyBpbm5lciBgZXhwaXJ5YDggYmxvY2sgbnVtYmVyLgABRQEIAQK5AVRoaXMgZXh0cmluc2ljIHVzZXMgYFdlaWdodExpbWl0OjpVbmxpbWl0ZWRgLCBwbGVhc2UgbWlncmF0ZSB0byBgbGltaXRlZF90ZWxlcG9ydF9hc3NldHNgIG9yIGB0cmFuc2Zlcl9hc3NldHNgAAIC2QFUaGlzIGV4dHJpbnNpYyB1c2VzIGBXZWlnaHRMaW1pdDo6VW5saW1pdGVkYCwgcGxlYXNlIG1pZ3JhdGUgdG8gYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIG9yIGB0cmFuc2Zlcl9hc3NldHNgAAFxBgAQRFVuaXZlcnNhbExvY2F0aW9u5BgCCQIAUVAEhCBUaGlzIGNoYWluJ3MgVW5pdmVyc2FsIExvY2F0aW9uLgBQQWR2ZXJ0aXNlZFhjbVZlcnNpb244EAUAAAAIJQEgVGhlIGxhdGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiB0aGF0IHdlIGFkdmVydGlzZS4gR2VuZXJhbGx5IGp1c3Qgc2V0IGl0IHRvhCBgcGFsbGV0X3hjbTo6Q3VycmVudFhjbVZlcnNpb25gLgAoTWF4TG9ja2VyczgQCAAAAAQZASBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgWENNIGxvY2tzIHRoYXQgYSBzaW5nbGUgYWNjb3VudCBtYXkgaGF2ZS4AWE1heFJlbW90ZUxvY2tDb25zdW1lcnM4EAAAAAAE/CBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uc3VtZXJzIGEgc2luZ2xlIHJlbW90ZSBsb2NrIG1heSBoYXZlLgABKQkEGAK8VXNlIGBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGVXaXRoRXJyb3JgIGluc3RlYWQBGDIwLjAuMAgsUnVudGltZUNhbGwgBGQgVGhlIHJ1bnRpbWUgYENhbGxgIHR5cGUucFJlbW90ZUxvY2tDb25zdW1lcklkZW50aWZpZXIQBMQgVGhlIElEIHR5cGUgZm9yIGxvY2FsIGNvbnN1bWVycyBvZiByZW1vdGUgbG9ja3MuAB8AAChDdW11bHVzWGNtAAEZAwABgQYAAAAAACAAADBNZXNzYWdlUXVldWUBME1lc3NhZ2VRdWV1ZQwwQm9va1N0YXRlRm9yAQEEBSEDMQl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGFuZCBsYXN0IChub24tZW1wdHkpIHBhZ2VzLgAsU2VydmljZUhlYWQAACEDBAAEvCBUaGUgb3JpZ2luIGF0IHdoaWNoIHdlIHNob3VsZCBiZWdpbiBzZXJ2aWNpbmcuABRQYWdlcwABCAUFPQlBCQQABIggVGhlIG1hcCBvZiBwYWdlIGluZGljZXMgdG8gcGFnZXMuAAEdAwABhQYAECBIZWFwU2l6ZTgQAJwBABQ9ASBUaGUgc2l6ZSBvZiB0aGUgcGFnZTsgdGhpcyBpbXBsaWVzIHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB3aGljaCBjYW4gYmUgc2VudC4AWQEgQSBnb29kIHZhbHVlIGRlcGVuZHMgb24gdGhlIGV4cGVjdGVkIG1lc3NhZ2Ugc2l6ZXMsIHRoZWlyIHdlaWdodHMsIHRoZSB3ZWlnaHQgdGhhdCBpc10BIGF2YWlsYWJsZSBmb3IgcHJvY2Vzc2luZyB0aGVtIGFuZCB0aGUgbWF4aW1hbCBuZWVkZWQgbWVzc2FnZSBzaXplLiBUaGUgbWF4aW1hbCBtZXNzYWdlEQEgc2l6ZSBpcyBzbGlnaHRseSBsb3dlciB0aGFuIHRoaXMgYXMgZGVmaW5lZCBieSBbYE1heE1lc3NhZ2VMZW5PZmBdLgAgTWF4U3RhbGU4EAgAAAAMXQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIHBhZ2VzIChpLmUuIG9mIG92ZXJ3ZWlnaHQgbWVzc2FnZXMpIGFsbG93ZWQgYmVmb3JlIGN1bGxpbmdRASBjYW4gaGFwcGVuLiBPbmNlIHRoZXJlIGFyZSBtb3JlIHN0YWxlIHBhZ2VzIHRoYW4gdGhpcywgdGhlbiBoaXN0b3JpY2FsIHBhZ2VzIG1heSBiZfwgZHJvcHBlZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gdW5wcm9jZXNzZWQgb3ZlcndlaWdodCBtZXNzYWdlcy4ANFNlcnZpY2VXZWlnaHSlAiwBBwBYQPuiAgDgABhBASBUaGUgYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB3aGljaCBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yqCBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2luaXRpYWxpemVgLgD8IFRoaXMgbWF5IGJlIGxlZ2l0aW1hdGVseSBgTm9uZWAgaW4gdGhlIGNhc2UgdGhhdCB5b3Ugd2lsbCBjYWxsXQEgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBtYW51YWxseSBvciBzZXQgW2BTZWxmOjpJZGxlTWF4U2VydmljZVdlaWdodGBdIHRvIGhhdmVUIGl0IHJ1biBpbiBgb25faWRsZWAuAFBJZGxlTWF4U2VydmljZVdlaWdodKUCLAEHAFhA+6ICAOAAFF0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgdG8gYmUgdXNlZCBmcm9tIHJlbWFpbmluZyB3ZWlnaHQgYG9uX2lkbGVgIHdoaWNoQQEgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2lkbGVgLj0BIFVzZWZ1bCBmb3IgcGFyYWNoYWlucyB0byBwcm9jZXNzIG1lc3NhZ2VzIGF0IHRoZSBzYW1lIGJsb2NrIHRoZXkgYXJlIHJlY2VpdmVkLgApASBJZiBgTm9uZWAsIGl0IHdpbGwgbm90IGNhbGwgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBpbiBgb25faWRsZWAuAAFJCQAEEFNpemU4BFQgUGFnZS9oZWFwIHNpemUgdHlwZS4AIgAAHFV0aWxpdHkAASUDAAGNBgAETGJhdGNoZWRfY2FsbHNfbGltaXQ4EKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgABTQkACCxSdW50aW1lQ2FsbCAEbCBUaGUgb3ZlcmFyY2hpbmcgY2FsbCB0eXBlLjRQYWxsZXRzT3JpZ2luMQME8CBUaGUgY2FsbGVyIG9yaWdpbiwgb3ZlcmFyY2hpbmcgdHlwZSBvZiBhbGwgcGFsbGV0cyBvcmlnaW5zLgAoAAAgTXVsdGlzaWcBIE11bHRpc2lnBCRNdWx0aXNpZ3MAAQgFAlEJVQkEAASUIFRoZSBzZXQgb2Ygb3BlbiBtdWx0aXNpZyBvcGVyYXRpb25zLgABgQMAAZUGAAwsRGVwb3NpdEJhc2XEQAA8kWAEAAAAAAAAAAAAAAAYWQEgVGhlIGJhc2UgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCB0byByZXNlcnZlIGZvciBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbiBvciB0b4Qgc3RvcmUgYSBkaXNwYXRjaCBjYWxsIGZvciBsYXRlci4AAQEgVGhpcyBpcyBoZWxkIGZvciBhbiBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzMQEgYDQgKyBzaXplb2YoKEJsb2NrTnVtYmVyLCBCYWxhbmNlLCBBY2NvdW50SWQpKWAgYnl0ZXMgYW5kIHdob3NlIGtleSBzaXplIGlzgCBgMzIgKyBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMuADREZXBvc2l0RmFjdG9yxEAAILy+AAAAAAAAAAAAAAAADFUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHBlciB1bml0IHRocmVzaG9sZCB3aGVuIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uLgAlASBUaGlzIGlzIGhlbGQgZm9yIGFkZGluZyAzMiBieXRlcyBtb3JlIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4AOE1heFNpZ25hdG9yaWVzOBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgABXQkABCxSdW50aW1lQ2FsbCAEbCBUaGUgb3ZlcmFyY2hpbmcgY2FsbCB0eXBlLgApAAAQU3VkbwEQU3VkbwQMS2V5AAAEBAAEhCBUaGUgYEFjY291bnRJZGAgb2YgdGhlIHN1ZG8ga2V5LgABjQMAAZkGAAABYQkABCxSdW50aW1lQ2FsbCAESCBBIHN1ZG8tYWJsZSBjYWxsLgAqAAA8VmVyaWZ5U2lnbmF0dXJlAAAAAAAEJFNpZ25hdHVyZS0EBPQgU2lnbmF0dXJlIHR5cGUgdGhhdCB0aGUgZXh0ZW5zaW9uIG9mIHRoaXMgcGFsbGV0IGNhbiB2ZXJpZnkuACsAABRQcm94eQEUUHJveHkIHFByb3hpZXMBAQQFBGUJRAAAAAAAAAAAAAAAAAAAAAAACEUBIFRoZSBzZXQgb2YgYWNjb3VudCBwcm94aWVzLiBNYXBzIHRoZSBhY2NvdW50IHdoaWNoIGhhcyBkZWxlZ2F0ZWQgdG8gdGhlIGFjY291bnRzIQEgd2hpY2ggYXJlIGJlaW5nIGRlbGVnYXRlZCB0bywgdG9nZXRoZXIgd2l0aCB0aGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdC4ANEFubm91bmNlbWVudHMBAQQFBHUJRAAAAAAAAAAAAAAAAAAAAAAABKwgVGhlIGFubm91bmNlbWVudHMgbWFkZSBieSB0aGUgcHJveHkgKGtleSkuAAGRAwABnQYAGEBQcm94eURlcG9zaXRCYXNlxEAADHdCAwAAAAAAAAAAAAAAEBEBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYSBwcm94eS4AAQEgVGhpcyBpcyBoZWxkIGZvciBhbiBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzJQEgYHNpemVvZihCYWxhbmNlKWAgYnl0ZXMgYW5kIHdob3NlIGtleSBzaXplIGlzIGBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMuAEhQcm94eURlcG9zaXRGYWN0b3LEQAABssQAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLgAoTWF4UHJveGllczgQIAAAAATwIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBwcm94aWVzIGFsbG93ZWQgZm9yIGEgc2luZ2xlIGFjY291bnQuAChNYXhQZW5kaW5nOBAgAAAABEUBIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lLWRlbGF5ZWQgYW5ub3VuY2VtZW50cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHBlbmRpbmcuAFxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZcRAABQmcgMAAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuAGRBbm5vdW5jZW1lbnREZXBvc2l0RmFjdG9yxEAAAmSJAQAAAAAAAAAAAAAAENQgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIGFubm91bmNlbWVudCBtYWRlLgBZASBUaGlzIGlzIGhlbGQgZm9yIGFkZGluZyBhbiBgQWNjb3VudElkYCwgYEhhc2hgIGFuZCBgQmxvY2tOdW1iZXJgICh0eXBpY2FsbHkgNjggYnl0ZXMpjCBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuAAGFCQAILFJ1bnRpbWVDYWxsIARsIFRoZSBvdmVyYXJjaGluZyBjYWxsIHR5cGUuJFByb3h5VHlwZZkDEFUBIEEga2luZCBvZiBwcm94eTsgc3BlY2lmaWVkIHdpdGggdGhlIHByb3h5IGFuZCBwYXNzZWQgaW4gdG8gdGhlIGBJc1Byb3h5YWJsZWAgZmlsdGVyLlEBIFRoZSBpbnN0YW5jZSBmaWx0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gY2FsbCBtYXkgYmUgcHJveGllZCB1bmRlciB0aGlzIHR5cGUuAE0BIElNUE9SVEFOVDogYERlZmF1bHRgIG11c3QgYmUgcHJvdmlkZWQgYW5kIE1VU1QgQkUgdGhlIHRoZSAqbW9zdCBwZXJtaXNzaXZlKiB2YWx1ZS4IGAnXg0Zyeg71jA+gO6+jI8vFFIjZKhqnE3sDv7UO/BdEY2hlY2tfcGVybWlzc2lvbnMIEGNhbGwgKHByb3h5X3R5cGWZA8gE9CBDaGVjayBpZiBhIGBSdW50aW1lQ2FsbGAgaXMgYWxsb3dlZCBmb3IgYSBnaXZlbiBgUHJveHlUeXBlYC4AGAnXg0Zyeg71jA+gO6+jIxcUsGB9Yq8KOzsK0sXVXFgsaXNfc3VwZXJzZXQIIHRvX2NoZWNrmQMcYWdhaW5zdJkDyAT0IENoZWNrIGlmIG9uZSBgUHJveHlUeXBlYCBpcyBhIHN1YnNldCBvZiBhbm90aGVyIGBQcm94eVR5cGVgLgAsAAAgSWRlbnRpdHkBIElkZW50aXR5MChJZGVudGl0eU9mAAEEBQSJCQQAEGkBIEluZm9ybWF0aW9uIHRoYXQgaXMgcGVydGluZW50IHRvIGlkZW50aWZ5IHRoZSBlbnRpdHkgYmVoaW5kIGFuIGFjY291bnQuIEZpcnN0IGl0ZW0gaXMgdGhl4CByZWdpc3RyYXRpb24sIHNlY29uZCBpcyB0aGUgYWNjb3VudCdzIHByaW1hcnkgdXNlcm5hbWUuAMAgVFdPWC1OT1RFOiBPSyDigJUgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4AKFVzZXJuYW1lT2YAAQQFBDkEBAAEvCBJZGVudGlmaWVzIHRoZSBwcmltYXJ5IHVzZXJuYW1lIG9mIGFuIGFjY291bnQuABxTdXBlck9mAAEEAgQhBAQACGEBIFRoZSBzdXBlci1pZGVudGl0eSBvZiBhbiBhbHRlcm5hdGl2ZSAic3ViIiBpZGVudGl0eSB0b2dldGhlciB3aXRoIGl0cyBuYW1lLCB3aXRoaW4gdGhhdFEBIGNvbnRleHQuIElmIHRoZSBhY2NvdW50IGlzIG5vdCBzb21lIG90aGVyIGFjY291bnQncyBzdWItaWRlbnRpdHksIHRoZW4ganVzdCBgTm9uZWAuABhTdWJzT2YBAQQFBJkJRAAAAAAAAAAAAAAAAAAAAAAAFLggQWx0ZXJuYXRpdmUgInN1YiIgaWRlbnRpdGllcyBvZiB0aGlzIGFjY291bnQuAB0BIFRoZSBmaXJzdCBpdGVtIGlzIHRoZSBkZXBvc2l0LCB0aGUgc2Vjb25kIGlzIGEgdmVjdG9yIG9mIHRoZSBhY2NvdW50cy4AwCBUV09YLU5PVEU6IE9LIOKAlSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLgAoUmVnaXN0cmFycwEAnQkEABBNASBUaGUgc2V0IG9mIHJlZ2lzdHJhcnMuIE5vdCBleHBlY3RlZCB0byBnZXQgdmVyeSBiaWcgYXMgY2FuIG9ubHkgYmUgYWRkZWQgdGhyb3VnaCBhqCBzcGVjaWFsIG9yaWdpbiAobGlrZWx5IGEgY291bmNpbCBtb3Rpb24pLgApASBUaGUgaW5kZXggaW50byB0aGlzIGNhbiBiZSBjYXN0IHRvIGBSZWdpc3RyYXJJbmRleGAgdG8gZ2V0IGEgdmFsaWQgdmFsdWUuACxBdXRob3JpdHlPZgABBAWtCbEJBAAE9CBBIG1hcCBvZiB0aGUgYWNjb3VudHMgd2hvIGFyZSBhdXRob3JpemVkIHRvIGdyYW50IHVzZXJuYW1lcy4AOFVzZXJuYW1lSW5mb09mAAEEAjkEtQkEABh1ASBSZXZlcnNlIGxvb2t1cCBmcm9tIGB1c2VybmFtZWAgdG8gdGhlIGBBY2NvdW50SWRgIHRoYXQgaGFzIHJlZ2lzdGVyZWQgaXQgYW5kIHRoZSBwcm92aWRlciBvZm0BIHRoZSB1c2VybmFtZS4gVGhlIGBvd25lcmAgdmFsdWUgc2hvdWxkIGJlIGEga2V5IGluIHRoZSBgVXNlcm5hbWVPZmAgbWFwLCBidXQgaXQgbWF5IG5vdCBpZvAgdGhlIHVzZXIgaGFzIGNsZWFyZWQgdGhlaXIgdXNlcm5hbWUgb3IgaXQgaGFzIGJlZW4gcmVtb3ZlZC4AaQEgTXVsdGlwbGUgdXNlcm5hbWVzIG1heSBtYXAgdG8gdGhlIHNhbWUgYEFjY291bnRJZGAsIGJ1dCBgVXNlcm5hbWVPZmAgd2lsbCBvbmx5IG1hcCB0byBvbmVIIHByaW1hcnkgdXNlcm5hbWUuAEBQZW5kaW5nVXNlcm5hbWVzAAEEAjkEvQkEACBtASBVc2VybmFtZXMgdGhhdCBhbiBhdXRob3JpdHkgaGFzIGdyYW50ZWQsIGJ1dCB0aGF0IHRoZSBhY2NvdW50IGNvbnRyb2xsZXIgaGFzIG5vdCBjb25maXJtZWRMIHRoYXQgdGhleSB3YW50IGl0LgAlASBVc2VkIHByaW1hcmlseSBpbiBjYXNlcyB3aGVyZSB0aGUgYEFjY291bnRJZGAgY2Fubm90IHByb3ZpZGUgYSBzaWduYXR1cmVdASBiZWNhdXNlIHRoZXkgYXJlIGEgcHVyZSBwcm94eSwgbXVsdGlzaWcsIGV0Yy4gSW4gb3JkZXIgdG8gY29uZmlybSBpdCwgdGhleSBzaG91bGQgY2FsbLAgW2FjY2VwdF91c2VybmFtZV0oYENhbGw6OmFjY2VwdF91c2VybmFtZWApLgAdASBGaXJzdCB0dXBsZSBpdGVtIGlzIHRoZSBhY2NvdW50IGFuZCBzZWNvbmQgaXMgdGhlIGFjY2VwdGFuY2UgZGVhZGxpbmUuAEhVbmJpbmRpbmdVc2VybmFtZXMAAQQCOQQ4BAAQXQEgVXNlcm5hbWVzIGZvciB3aGljaCB0aGUgYXV0aG9yaXR5IHRoYXQgZ3JhbnRlZCB0aGVtIGhhcyBzdGFydGVkIHRoZSByZW1vdmFsIHByb2Nlc3MgYnlxASB1bmJpbmRpbmcgdGhlbS4gRWFjaCB1bmJpbmRpbmcgdXNlcm5hbWUgbWFwcyB0byBpdHMgZ3JhY2UgcGVyaW9kIGV4cGlyeSwgd2hpY2ggaXMgdGhlIGZpcnN03CBibG9jayBpbiB3aGljaCB0aGUgdXNlcm5hbWUgY291bGQgYmUgZGVsZXRlZCB0aHJvdWdoIGHEIFtyZW1vdmVfdXNlcm5hbWVdKGBDYWxsOjpyZW1vdmVfdXNlcm5hbWVgKSBjYWxsLgBAUGVyc29uSWRlbnRpdGllcwABBAIIwQkEAAhlASBUaGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGVyc29uIHRocm91Z2ggdGhlaXIgY29udGV4dHVhbCBhbGlhcyBmb3IgdGhlIHB1cnBvc2VzIG9miCByZWdpc3RlcmluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4AOEFjY291bnRUb0FsaWFzAAEEAgQIBAAIZQEgUmV2ZXJzZSBsb29rdXAgb2YgYWNjb3VudHMgY29udHJvbGxlZCBieSBhIHBlcnNvbiB0aHJvdWdoIGEgY29udGV4dHVhbCBhbGlhcy4gQWxsIHBlb3BsZS0BIHRoYXQgcmVnaXN0ZXJlZCBhbiBpZGVudGl0eSBtdXN0IGFsc28gYXNzb2NpYXRlIGFuIG9uLWNoYWluIGFjY291bnQgdG8gaXQuAFhQZW5kaW5nVXNlcm5hbWVSZXBvcnRzAAEEAgjRCQQABJQgU3RvcmVzIHBlbmRpbmcgcmVwb3J0cyBvZiB1c2VybmFtZXMuAAGdAwABpQYAQDBCYXNpY0RlcG9zaXTEQADVX7kCAAAAAAAAAAAAAAAE2CBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgYSByZWdpc3RlcmVkIGlkZW50aXR5LgAsQnl0ZURlcG9zaXTEQADh9QUAAAAAAAAAAAAAAAAEHQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIGVuY29kZWQgYnl0ZSBmb3IgYSByZWdpc3RlcmVkIGlkZW50aXR5LgA8VXNlcm5hbWVEZXBvc2l0xEAAILy+AAAAAAAAAAAAAAAACFUBIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IHBlciByZWdpc3RlcmVkIHVzZXJuYW1lLiBUaGlzIHZhbHVlIHNob3VsZCBjaGFuZ2Ugb25seSBpbvQgcnVudGltZSB1cGdyYWRlcyB3aXRoIHByb3BlciBtaWdyYXRpb24gb2YgZXhpc3RpbmcgZGVwb3NpdHMuAERTdWJBY2NvdW50RGVwb3NpdMRAAHnzjwMAAAAAAAAAAAAAAAxlASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgYSByZWdpc3RlcmVkIHN1YmFjY291bnQuIFRoaXMgc2hvdWxkIGFjY291bnQgZm9yIHRoZSBmYWN0ZQEgdGhhdCBvbmUgc3RvcmFnZSBpdGVtJ3MgdmFsdWUgd2lsbCBpbmNyZWFzZSBieSB0aGUgc2l6ZSBvZiBhbiBhY2NvdW50IElELCBhbmQgdGhlcmUgd2lsbDUBIGJlIGFub3RoZXIgdHJpZSBpdGVtIHdob3NlIHZhbHVlIGlzIHRoZSBzaXplIG9mIGFuIGFjY291bnQgSUQgcGx1cyAzMiBieXRlcy4AVFVzZXJuYW1lUmVwb3J0RGVwb3NpdMRAAChr7gAAAAAAAAAAAAAAAATIIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IHBlciByZXBvcnRlZCB1c2VybmFtZS4AOE1heFN1YkFjY291bnRzOBBkAAAABA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWItYWNjb3VudHMgYWxsb3dlZCBwZXIgaWRlbnRpZmllZCBhY2NvdW50LgBUVXNlcm5hbWVSZXBvcnRUaW1lb3V0OBCAxhMADEkBIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgaGF2ZSB0byBwYXNzIGJldHdlZW4gdGhlIGxhc3QgdGltZSBhIGdpdmVuIHVzZXJuYW1lIHdhc10BIHJlcG9ydGVkIGFuZCBub3cgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZXBvcnQgaXQgYWdhaW4uIEluIG90aGVyIHdvcmRzLCBpdCByZXByZXNlbnRzlCB0aGUgdXNlcm5hbWUgdmFsaWRpdHkgc2FmZXR5IHBlcmlvZC4ANE1heFJlZ2lzdHJhcnM4EBQAAAAITQEgTWF4aW11bSBudW1iZXIgb2YgcmVnaXN0cmFycyBhbGxvd2VkIGluIHRoZSBzeXN0ZW0uIE5lZWRlZCB0byBib3VuZCB0aGUgY29tcGxleGl0eXwgb2YsIGUuZy4sIHVwZGF0aW5nIGp1ZGdlbWVudHMuADRNYXhKdWRnZW1lbnRzOBADAAAABCkBIE1heGltdW0gbnVtYmVyIG9mIGp1ZGdlbWVudHMgcGVyIHBlcnNvbmFsIGlkZW50aXR5IGFsbG93ZWQgaW4gdGhlIHN5c3RlbS4AZFBlbmRpbmdVc2VybmFtZUV4cGlyYXRpb244EECdBAAEFQEgVGhlIG51bWJlciBvZiBibG9ja3Mgd2l0aGluIHdoaWNoIGEgdXNlcm5hbWUgZ3JhbnQgbXVzdCBiZSBhY2NlcHRlZC4ATFVzZXJuYW1lR3JhY2VQZXJpb2Q4EED6AQAIWQEgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHBhc3MgdG8gZW5hYmxlIHRoZSBwZXJtYW5lbnQgZGVsZXRpb24gb2YgYSB1c2VybmFtZSBieWggaXRzIHJlc3BlY3RpdmUgYXV0aG9yaXR5LgA8TWF4U3VmZml4TGVuZ3RoOBAHAAAABIAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3VmZml4LgBETWF4VXNlcm5hbWVMZW5ndGg4ECAAAAAEYQEgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgdXNlcm5hbWUsIGluY2x1ZGluZyBpdHMgc3VmZml4IGFuZCBhbnkgc3lzdGVtLWFkZGVkIGRlbGltaXRlcnMuAERNaW5Vc2VybmFtZUxlbmd0aDgQAgAAAASwIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lIG9yIHN1ZmZpeC4AYENyZWRlbnRpYWxSZW1vdmFsUGVuYWx0ecRAAPIFKgEAAAAAAAAAAAAAAAhVASBUaGUgZmVlIHRoYXQgYSBwZXJzb24gbXVzdCBwYXkgdGhyb3VnaCB0aGVpciBhc3NvY2lhdGVkIG9uLWNoYWluIGFjY291bnQgaW4gb3JkZXIgdG9cIHJlbW92ZSB0aGVpciBpZGVudGl0eS4AQGlkZW50aXR5X2NvbnRleHQIgHBvcDpwb2xrYWRvdC5uZXR3b3JrL2lkZW50aXR5ICAgCEEBIFRoZSBjb250ZXh0IHVzZWQgZm9yIHRoZSBwcm9vZnMgcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIGFzIGEgcGVyc29uYWwgYWxpYXMgaW4oIGlkZW50aXR5LgAB1QkABERPZmZjaGFpblNpZ25hdHVyZS0EDOAgU2lnbmF0dXJlIHR5cGUgZm9yIHByZS1hdXRob3JpemluZyB1c2VybmFtZXMgb2ZmLWNoYWluLgARASBDYW4gdmVyaWZ5IHdoZXRoZXIgYW4gYFNlbGY6OlNpZ25pbmdQdWJsaWNLZXlgIGNyZWF0ZWQgYSBzaWduYXR1cmUuADIAABhQZW9wbGUBGFBlb3BsZSQQS2V5cwABBAJRBCgEABRJASBUaGUgY3VycmVudCBpbmRpdmlkdWFscyB3ZSByZWNvZ25pc2UsIGJ1dCBub3QgbmVjZXNzYXJpbHkgeWV0IGluY2x1ZGVkIGluIGEgcmluZy4AdQEgTG9vay11cCBmcm9tIHRoZSBjcnlwdG8gKHB1YmxpYykga2V5IHRvIHRoZSBpbW11dGFibGUgSUQgb2YgdGhlIGluZGl2aWR1YWwgKGBQZXJzb25hbElkYCkuIEFdASBwZXJzb24gY2FuIGhhdmUgdHdvIGRpZmZlcmVudCBlbnRyaWVzIGluIHRoaXMgbWFwIGlmIHRoZXkgcXVldWVkIGEga2V5IG1pZ3JhdGlvbiB3aGljaGQgaGFzbid0IGJlZW4gZW5hY3RlZCB5ZXQuADhDb3VudGVyRm9yS2V5cwEAOBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwABhQZW9wbGUAAQQCKNkJBAAMSQEgVGhlIGN1cnJlbnQgaW5kaXZpZHVhbHMgd2UgcmVjb2duaXNlLCBidXQgbm90IG5lY2Vzc2FyaWx5IHlldCBpbmNsdWRlZCBpbiBhIHJpbmcuAGUBIEltbXV0YWJsZSBJRCBvZiB0aGUgaW5kaXZpZHVhbCAoYFBlcnNvbmFsSWRgKSB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBrZXkgYW5kIHN0YXR1cy4AOEFsaWFzVG9BY2NvdW50AAEEAkkDBAQABMwgQ29udmVyc2lvbiBvZiBhIGNvbnRleHR1YWwgYWxpYXMgdG8gYW4gYWNjb3VudCBJRC4AOEFjY291bnRUb0FsaWFzAAEEAgRFAwQABMwgQ29udmVyc2lvbiBvZiBhbiBhY2NvdW50IElEIHRvIGEgY29udGV4dHVhbCBhbGlhcy4ATEFjY291bnRUb1BlcnNvbmFsSWQAAQQCBCgEABC8IEFzc29jaWF0aW9uIG9mIGFuIGFjY291bnQgSUQgdG8gYSBwZXJzb25hbCBJRC4AIQEgTWFuYWdlZCB3aXRoIGBzZXRfcGVyc29uYWxfaWRfYWNjb3VudGAgYW5kIGB1bnNldF9wZXJzb25hbF9pZF9hY2NvdW50YC74IFJldmVyc2UgbG9va3VwIGlzIGluc2lkZSBgUGVvcGxlYCBzdG9yYWdlLCBpbnNpZGUgdGhlIHJlY29yZC4AOE5leHRQZXJzb25hbElkAQAoIAAAAAAAAAAABLggVGhlIG5leHQgZnJlZSBhbmQgbmV2ZXIgcmVzZXJ2ZWQgcGVyc29uYWwgSUQuAFxQZW9wbGVDb2xsZWN0aW9uQ3JlYXRlZAEAyAQABMAgV2hldGhlciB0aGUgcGVvcGxlIGNvbGxlY3Rpb24gaGFzIGJlZW4gY3JlYXRlZC4ASFJlc2VydmVkUGVyc29uYWxJZAABBAUoEAQABMAgQ2FuZGlkYXRlcycgcmVzZXJ2ZWQgaWRlbnRpdGllcyB3aGljaCB3ZSB0cmFjay4AAUkEAAGpBgAMMFJpbmdFeHBvbmVudPEEBAkETQEgVGhlIHJpbmcgZXhwb25lbnQgdXNlZCB0byBvcGVyYXRlIHRoZSBwZW9wbGUgbWVtYmVyIGNvbGxlY3Rpb24gaW4gYE1lbWJlclNlcnZpY2VgLgBcT25ib2FyZGluZ1F1ZXVlUGFnZVNpemU4EB4AAAAISQEgTWF4aW11bSBudW1iZXIgb2YgcGVvcGxlIGluY2x1ZGVkIGluIGFuIG9uYm9hcmRpbmcgcXVldWUgcGFnZSBiZWZvcmUgYSBuZXcgb25lIGlzJCBjcmVhdGVkLgBwYWNjb3VudF9zZXR1cF90aW1lX3RvbGVyYW5jZTgQWAIAABQ9ASBUaGUgYW1vdW50IG9mIGJsb2NrIG51bWJlciB0b2xlcmFuY2Ugd2UgYWxsb3cgZm9yIGEgc2V0dXAgYWNjb3VudCB0cmFuc2FjdGlvbi4ABQEgYHNldF9hbGlhc19hY2NvdW50YCBhbmQgYHNldF9wZXJzb25hbF9pZF9hY2NvdW50YCBjYWxscyBjb250YWluc1EBIGBjYWxsX3ZhbGlkX2F0YCBhcyBhIHBhcmFtZXRlciwgdGhvc2UgY2FsbHMgYXJlIHZhbGlkIGlmIHRoZSBibG9jayBudW1iZXIgaXMgd2l0aGluWCB0aGUgdG9sZXJhbmNlIHBlcmlvZC4AAd0JAAAAMwAAHE1vYlJ1bGUBHE1vYlJ1bGUwHENyZWRpdHMBAQQCCOEJcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEjCBUaGUgdm90aW5nIHJlY29yZHMgb2YgYWxsIGFsaWFzZXMuADxWb3RpbmdQZW5hbHRpZXMAAQQCCDgEAAhxASBUaGUgdm90ZSBwZW5hbHRpZXMgb2YgdXNlcnMgYW5kIHRoZWlyIHN0YXJ0aW5nIG1vbWVudC4gVm90ZXJzIHdpdGggcGVuYWx0aWVzIGNhbm5vdCB2b3RlIGluzCBjb250ZW1wdCB1bnRpbCB0aGUgcGVuYWx0eSBleHBpcmVzIGFuZCBpcyByZW1vdmVkLgAwVm90aW5nUG9pbnRzAQEIBgLlCTgQAAAAAAhlASBUaGUgYWNjdW11bGF0ZWQgcG9pbnRzIG9mIGFsbCBhbGlhc2VzLCBkdXJpbmcgZWFjaCBmdW5kaW5nIHJvdW5kLiBUaGUgcG9pbnRzIGFjY3VtdWxhdGVkIQEgZHVyaW5nIHJvdW5kIGBOYCBjYW4gYmUgcmVkZWVtZWQgZm9yIHJld2FyZHMgb25seSBkdXJpbmcgcm91bmQgYE4gKyAxYC4AFFZvdGVzAAEIAgLlCUEEBAAEuCBBbGwgdm90ZXMgY2FzdCwgc2VncmVnYXRlZCBieSBjYXNlIGFuZCB2b3Rlci4AJENhc2VDb3VudAEAOBAAAAAABBEBIFRoZSBudW1iZXIgb2YgY2FzZXMsIG9wZW4gb3IgcmVjZW50bHkgY2xvc2VkLCBzdG9yZWQgaW4gdGhlIHBhbGxldC4AJE9wZW5DYXNlcwABBAI46QkEAAQpASBUaGUgb3BlbiBjYXNlcyByZWNvcmRlZCBpbiB0aGUgcGFsbGV0LiBUaGVzZSBjYXNlcyBjYW4gc3RpbGwgYmUgdm90ZWQgb24uACRSaXBlQ2FzZXMAAQQCOAEKBAAMdQEgVGhlIHJpcGUgY2FzZXMgcmVjb3JkZWQgaW4gdGhlIHBhbGxldC4gVGhlIHZvdGluZyBoYXMgY29uY2x1ZGVkIG9uIHRoZXNlIGNhc2VzIGFuZCBhIHZlcmRpY3RlASBoYXMgYmVlbiByZWFjaGVkLCBidXQgdGhleSBjYW5ub3QgYmUgcmVtb3ZlZCB5ZXQgaW4gb3JkZXIgdG8gYWxsb3cgcGVvcGxlIHRvIGNsYWltIHRoZWlyHCB2b3Rlcy4AJERvbmVDYXNlcwABBAI4BQoEAAhhASBUaGUgZG9uZSBjYXNlcyByZWNvcmRlZCBpbiB0aGUgcGFsbGV0LiBUaGVzZSBjYXNlcyBhcmUgb2Jzb2xldGUgYW5kIGNhbiBiZSByZW1vdmVkIGZyb20kIHN0b3JhZ2UuAERBY2N1bXVsYXRlZFBvaW50cwEAKCAAAAAAAAAAAAh1ASBUaGUgbnVtYmVyIG9mIHBvaW50cyBhY2N1bXVsYXRlZCB0aHJvdWdoIGNvcnJlY3Qgdm90ZXMgZHVyaW5nIHRoZSBjdXJyZW50IHBheW91dCByb3VuZC4gVGhpc3UBIGFtb3VudCBpcyBnb2luZyB0byBkZXRlcm1pbmUgdGhlIHBvaW50L3Jld2FyZCBleGNoYW5nZSByYXRlIG9mIHRoZSBuZXh0IHJld2FyZCBwYXlvdXQgcm91bmQuAEhQYXlvdXREaXN0cmlidXRpb24AAAkKBAAE2CBEZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgcGF5b3V0IHJvdW5kLgA4Um91bmRTY2hlZHVsZXMBAA0KBAAEuCBEZXNjcmliZXMgdGhlIHNjaGVkdWxlcyBvZiB0aGUgcGF5b3V0IHJvdW5kcy4ALEFjdGl2ZVNpbmNlAAAoBAAIbQEgVGhlIHRpbWVzdGFtcCwgaW4gc2Vjb25kcywgb2YgdGhlIG1vbWVudCBlbm91Z2ggYWN0aXZlIHZvdGVycyB3ZXJlIGRldGVjdGVkIGFuZCB2b3Rpbmcgd2FzMQEgZW5hYmxlZC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcmVzZW50IGlmIHRoZXJlIGFyZSB0b28gZmV3IGFjdGl2ZSB2b3RlcnMuAAFVBAABrQYAOFBDdXJyZW5jeUxvY2F0aW9uSW5mb+AwAQMAoQ8EMgV2yOsLBPQgVGhlIGxvY2F0aW9uIG9mIHRoZSB1c2VkIGN1cnJlbmN5LiBJdCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuAFBNYXhWb3RlQ2xhaW1EdXJhdGlvbigggFEBAAAAAAAEBQEgVGhlIG51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSBhIGNhc2UgdGltZXMgb3V0IGFuZCBjYW4gYmUgcmVhcGVkLgA8TWluQ2FzZUR1cmF0aW9uOBBYAgAABEEBIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhIGNhc2UgbXVzdCBzdGF5IG9wZW4gZm9yIHZvdGluZyBiZWZvcmUgaXQgY2FuIGJlIGNsb3NlZC4ARE1heFZvdGluZ0R1cmF0aW9uOBCwBAAABC0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIGZvciB3aGljaCBhIGNhc2UgY291bGQgc3RheSBvcGVuIGZvciB2b3RpbmcuAERNaW5UdXJub3V0Tm9taW5hbDgQAQAAAARFASBUaGUgbWluaW11bSBudW1iZXIgb2Ygdm90ZXMgYSBjYXNlIG11c3QgcmVjZWl2ZSBiZWZvcmUgYSB2ZXJkaWN0IGNhbiBiZSByZWFjaGVkLgBQTWluVHVybm91dFBlcmNlbnRhZ2UZCgQKCGUBIFRoZSBtaW5pbXVtIG51bWJlciBvZiB2b3RlcyBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHZvdGVyIGNvdW50IGEgY2FzZSBtdXN0IHJlY2VpdmWEIGJlZm9yZSBhIHZlcmRpY3QgY2FuIGJlIHJlYWNoZWQuAFRWb3RpbmdQZW5hbHR5RHVyYXRpb244EMCoAAAE0CBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGEgcGVuYWx0eSBpcyBhcHBsaWVkIGZvci4ARE1heFZvdGVzQ2xhaW1hYmxlOBAKAAAABPQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGVzIGNsYWltYWJsZSBpbiBhIHNpbmdsZSBleHRyaW5zaWMuAFBPZmZjaGFpbldvcmtJbnRlcnZhbDgQlgAAAASwIFRoZSBpbnRlcnZhbCBhdCB3aGljaCBvZmZjaGFpbiB3b3JrZXIgcnVucy4ATENsZWFuVm90ZXNCYXRjaFNpemU4EOgDAAAEJQEgTWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgdGhhdCB3aWxsIGJlIGNsZWFuZWQgZHVyaW5nIG9mZmNoYWluIHdvcmtlciBydW4uAGhWb3Rlc09wZW5Gb3JDbGFpbXNEdXJhdGlvbjgQWAIAAAgVASBUaGUgdGltZSBpbiBzZWNvbmRzIGR1cmluZyB3aGljaCB2b3RlcyBjYW4gYmUgY2xhaW1lZCBvbiBkb25lIGNhc2VzLsAgTWVhc3VyZWQgZnJvbSB0aGUgdGltZSB0aGUgY2FzZSBiZWNvbWVzICdEb25lJy4AVE1pbmltdW1Wb3RlclRocmVzaG9sZDgQAwAAAAhlASBUaGUgbWluaW11bSBudW1iZXIgb2YgYWN0aXZlIHZvdGVycyByZXF1aXJlZCB0byBhbGxvdyB2b3RpbmcuIFdoZW4gdGhpcyB0aHJlc2hvbGQgaXMgbm90hCBtZXQsIG9wZW4gY2FzZXMgY2Fubm90IHRpbWUgb3V0LgA8bW9iX3J1bGVfcG90X2lkBIBtb2RsTW9iUndyZHMAAAAAAAAAAAAAAAAAAAAAAAAAAATgIEdldCBhIHVuaXF1ZSwgaW5hY2Nlc3NpYmxlIGFjY291bnQgSUQgZnJvbSB0aGUgYFBvdElkYC4AQG1vYl9ydWxlX2NvbnRleHQIgHBvcDpwb2xrYWRvdC5uZXR3b3JrL21vYi1ydWxlICAgCFEBIFRoZSBjb250ZXh0IHVzZWQgZm9yIHRoZSBwcm9vZnMgcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIGFzIGEgcGVyc29uYWwgYWxpYXMgaW4gbW9iGCBydWxlLgABHQoAAAA0AAAoUHJvb2ZPZkluawEoUHJvb2ZPZkluaywoQ2FuZGlkYXRlcwABBAIEIQoEAARJASBUaGUgY3VycmVudCBwZXJzb25hbCBpZGVudGl0aWVzIHdoaWNoIGFyZSBnb2luZyB0aHJvdWdoIHRoZSBwcm9vZi1vZi1pbmsgcHJvY2Vzcy4AGFBlb3BsZQABBAUoMQoEAAhxASBUaGUgcGVyc29uYWwgaWRlbnRpdGllcyB3aGljaCB3ZSB0cmFjazsgYWxsIHdoaWNoIGhhdmUgYmVlbiByZWNvZ25pemVkIHRocm91Z2ggcHJvb2Ytb2YtaW5rNCBhcmUgaW4gaGVyZS4APFJlZmVycmFsVGlja2V0cwABBAUoPQoEAAQJASBUaGUgdGlja2V0cyBzdG9yZWQgb24tY2hhaW4gcmVhZHkgdG8gYmUgdXNlZCB0byByZWZlciBjYW5kaWRhdGVzLgA4RGVzaWduRmFtaWxpZXMAAQQCLQNJCgQABKggVGhlIGN1cnJlbnQgZGVzaWduIGZhbWlsaWVzIHdlIHJlY29nbmlzZS4AQENvbW1pdHRlZERlc2lnbnMAAQgCAk0KUQoEAATUIFRoZSBjb21taXR0ZWQgZGVzaWducyB3aGljaCBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZS4APEFsbG9jYXRpb25Db3VudAEAOBAAAAAABLAgVGhlIG51bWJlciBvZiBqdWRnZW1lbnRzIGN1cnJlbnRseSBvbmdvaW5nLgA0Q29uZmlndXJhdGlvbgEAbQSgQJ0EAAQAAADoAwAAAAAABAAAAAAgAAAAAAAgAAAAAAAIAAAAQJ0EAARMIFRoZSBjb25maWd1cmF0aW9uLgBAQXZhaWxhYmxlSW52aXRlcwEBBAIEOBAAAAAABPggTnVtYmVyIG9mIGludml0YXRpb25zIGF2YWlsYWJsZSB0byBkaXN0cmlidXRlIGZvciBhbiBhY2NvdW50LgA4UGVuZGluZ0ludml0ZXMAAQgCAlUKEAQADB0BIFBlbmRpbmcgaW52aXRhdGlvbnMgZm9yIGVhY2ggaW52aXRlciAoYW4gYWNjb3VudCB0aGF0IGludml0ZXMgb3RoZXJzKS4AWQEgSWYgdGhlIGtleSBgKGludml0ZXIsIHRpY2tldClgIGV4aXN0cywgdGhlbiB0aGUgdGlja2V0IGlzIGN1cnJlbnRseSBhIHBlbmRpbmcgaW52aXRlLgBsUmVmZXJyZXJSZWltYnVyc2VtZW50VmFsdWVzAABxBAQAFGEBIFRoZSB2YWx1ZXMgb2YgdGhlIHJlaW1idXJzZW1lbnQgYXdhcmRlZCB0byByZWZlcnJlcnMsIGFsb25nIHdpdGggaG93IG1hbnkgb2YgZWFjaCB2YWx1ZW0BIHNob3VsZCBiZSBhd2FyZGVkLiBUaGVzZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyIG9mIHRoZWlyIHByaW9yaXR5LCBzbyB0aGUgbGFzdEEBIHZhbHVlIGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IG9uZSB0byBiZSB1c2VkIGJ5IHRoZSByZWltYnVyc2VtZW50IHN5c3RlbS4ARQEgU3RvcmFnZSBpdGVtIG5hbWUga2VlcHMgdGhlIGxlZ2FjeSBwcmVmaXggZm9yIHN0b3JhZ2UgcmVhZGFiaWxpdHkgY29tcGF0aWJpbGl0eS4AbFJlZmVycmVkUmVpbWJ1cnNlbWVudFZhbHVlcwAAcQQEABRhASBUaGUgdmFsdWVzIG9mIHRoZSByZWltYnVyc2VtZW50IGF3YXJkZWQgdG8gcmVmZXJyZWQgcGVvcGxlLCBhbG9uZyB3aXRoIGhvdyBtYW55IG9mIGVhY2hxASB2YWx1ZSBzaG91bGQgYmUgYXdhcmRlZC4gVGhlc2UgdmFsdWVzIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGVpciBwcmlvcml0eSwgc28gdGhlVQEgbGFzdCB2YWx1ZSBpbiB0aGUgbGlzdCB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgdG8gYmUgdXNlZCBieSB0aGUgcmVpbWJ1cnNlbWVudCBzeXN0ZW0uAEUBIFN0b3JhZ2UgaXRlbSBuYW1lIGtlZXBzIHRoZSBsZWdhY3kgcHJlZml4IGZvciBzdG9yYWdlIHJlYWRhYmlsaXR5IGNvbXBhdGliaWxpdHkuAAFdBAABsQYADEhNYXhBY3RpdmVSZWZlcnJhbHM4EAoAAAAI9CBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIHJlZmVycmFscyBhIHVzZXIgY2FuIGhhdmUgb3Blbi5YIEl0IGNhbm5vdCBleGNlZWQgMjAwLgAUUG90SWRdCCBQb0lQb3RfXyDsIEFjY291bnQgSWRlbnRpZmllciBmcm9tIHdoaWNoIHRoZSByZXdhcmQgcG90IGlzIGdlbmVyYXRlZC4AKQEgVGhlIGFjY291bnQgbXVzdCBiZSBmdW5kZWQgc28gcmV3YXJkcyBjYW4gYmUgcGFpZCBkdXJpbmcgcmVnaXN0cmF0aW9uIGFuZGAgcmVmZXJyYWwgcmV3YXJkIGNsYWltcy4AEQEgVGhlIGBQYWxsZXRJZGAgbXVzdCBiZSBhIGNvbnN0YW50IGFzIGl0IGlzIGV4cG9zZWQgaW4gdGhlIG1ldGFkYXRhLmUBIENoYW5naW5nIHRoaXMgdmFsdWUgd2l0aCBhIHJ1bnRpbWUgdXBncmFkZSBjYW4gYmUgZG9uZSBhdCBhbnkgdGltZSwgdGhlIG5ldyBhY2NvdW50IHdpbGyQIHRoZW4gbmVlZCB0byBiZSBmdW5kZWQgYWNjb3JkaW5nbHkuAExwcm9vZl9vZl9pbmtfcG90X2lkBIBtb2RsUG9JUG90X18AAAAAAAAAAAAAAAAAAAAAAAAAAATUIFRoZSBhY2NvdW50IElEIG9mIHRoZSBwb3QgdXNlZCBmb3IgcmV3YXJkIHRyYW5zZmVycy4AAVkKAAg8VGlja2V0U2lnbmF0dXJlLQQMiCBTaWduYXR1cmUgdXNlZCB0byB2ZXJpZnkgdGlja2V0cy4AAQEgQ2FuIHZlcmlmeSB3aGV0aGVyIGFuIGBTZWxmOjpUaWNrZXRQdWJsaWNgIGNyZWF0ZWQgYSBzaWduYXR1cmUuGFRpY2tldAQEmCBUaWNrZXQgdHlwZSB1c2VkIHRvIHJlZmVyIGNhbmRpZGF0ZXMuADUAABBHYW1lARBHYW1lSGxUZXN0bmV0U3RvcmVkUGhhc2VEdXJhdGlvbnMAAJ0EBAAEvCBUaGUgb3ZlcnJpZGVuIHBoYXNlIGR1cmF0aW9ucyBmb3IgdGhlIHRlc3RuZXQuABBOZnRzAAEIAgJdChAEAAAAPEFyY2hpdmVkUGxheWVycwABBAK5BmEKBAAEKQEgQWxsIHRoZSBwbGF5ZXIgd2l0aCB6ZXJvIHNjb3JlIGJ1dCBzdGlsbCBvbmJvYXJkZWQgaW4gaW5kaXZfcGFsbGV0X3Njb3JlLgAcUGxheWVycwABBAK5BmUKBAAQcCBBbGwgdGhlIHBsYXllciBpbiB0aGUgZ2FtZS4AIQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgYWNjb3VudHMgaW4gdGhpcyBzdG9yYWdlIGFuZCBzdGF0ZW1lbnQgYWNjb3VudHMgaW6kIFtgU3RtdEFjY291bnRUb0FsaWFzYF0gbXVzdCBub3Qgb3ZlcmxhcC4AJEdhbWVJbmRleAEAOBAAAAAABGAgVGhlIGN1cnJlbnQgZ2FtZSBpbmRleC4AEEdhbWUAAHEKBAAEzCBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXh0IGdhbWUgb3Igb25nb2luZyBnYW1lLgAsR2FtZUhpc3RvcnkAAQQFODgEAAhhASBUaGUgbWFwcGluZyBmcm9tIHBhc3QgZ2FtZXMsIGlkZW50aWZpZWQgYnkgdGhlaXIgZ2FtZSBpbmRleCwgdG8gdGhlIHN0YXJ0IHRpbWVzdGFtcCwgaW54IHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2guAFxQbGF5ZXJBdHRlbmRhbmNlSGlzdG9yeQEBBAK5BoEKBAAE1CBFbnRyaWVzIG9mIHByZXZpb3VzbHkgYXR0ZW5kZWQgZ2FtZXMgb2YgZWFjaCBwbGF5ZXIuADRJbmRleFRvUGxheWVyAAEEBYUKuQYEAATkIFRoZSBtYXBwaW5nIGZyb20gcm91bmQgaW5kZXggYW5kIHBsYXllciBpbmRleCB0byBwbGF5ZXIuADRQbGF5ZXJUb0luZGV4AAEEArkGiQoEAATgIFRoZSBtYXBwaW5nIGZyb20gcGxheWVyIHRvIHRoZWlyIGluZGljZXMgaW4gZWFjaCByb3VuZC4ARFNodWZmbGVSZWNvZ25pemVkAAEIBQaNCrkGBAAEAQEgU3RvcmFnZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHNodWZmbGUgb3JkZXIgb2YgcmVjb2duaXplZCBwZW9wbGUuAFBTaHVmZmxlTm90UmVjb2duaXplZAABCAUGjQq5BgQABFUBIFN0b3JhZ2UgdXNlZCB0byBjb21wdXRlIHRoZSBzaHVmZmxlIG9yZGVyIG9mIG5vdCByZWNvZ25pemVkIHBlb3BsZSwgaS5lLiBjYW5kaWRhdGVzLgA0R2FtZVNjaGVkdWxlcwEAkQoEAAAAQEF2YWlsYWJsZUludml0ZXMBAQQCBDgQAAAAAAToIE51bWJlciBvZiBpbnZpdGVzIGF2YWlsYWJsZSB0byBkaXN0cmlidXRlIGZvciBhbiBhY2NvdW50LgA4UGVuZGluZ0ludml0ZXMAAQgCAlUKEAQAEIggUGVuZGluZyBpbnZpdGVzIGZvciBlYWNoIGludml0ZXIuAGkBIElmIHRoZSBrZXkgYChpbnZpdGVyLCB0aWNrZXQpYCBleGlzdHMgdGhlbiB0aGUgdGlja2V0IGlzIGN1cnJlbnRseSBhIHBlbmRpbmcgaW52aXRlLCBmcm9tNCB0aGUgaW52aXRlci4ASEFsaWFzVG9TdG10QWNjb3VudAABBAIIBAQAHFkBIE1hcHBpbmcgZnJvbSBhbGlhcyB0byB0aGUgYWNjb3VudCBpZCB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHN0YXRlbWVudCBzdG9yZS4AQQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgc2ltcGx5IHVzZSB0aGVpciBhY2NvdW50IGFuZCBhcmUgbm90IHBhcnQgb2YgdGhpcyBtYXBwaW5nLgEBIFJldmVyc2UgbWFwcGluZyBpcyBhdmFpbGFibGUgaW4gc3RvcmFnZSBbYFN0bXRBY2NvdW50VG9BbGlhc2BdLgDsIFRoaXMgaXMgcmVtb3ZlZCB3aGVuIHRoZSBhbGlhcy1iYXNlZCBwbGF5ZXIgZ2V0cyBhcmNoaXZlZC5VASBUaGlzIGlzIHVwZGF0ZWQgd2hlbiB0aGUgYWxpYXMtYmFzZWQgcGxheWVyIHNpZ25zIHVwIHdpdGggYW5vdGhlciBzdGF0ZW1lbnQgYWNjb3VudC4ASFN0bXRBY2NvdW50VG9BbGlhcwABBAIECAQAJFkBIE1hcHBpbmcgZnJvbSB0aGUgYWNjb3VudCBpZCB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggc3RhdGVtZW50IHN0b3JlIHRvIHRoZSBhbGlhcy4AQQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgc2ltcGx5IHVzZSB0aGVpciBhY2NvdW50IGFuZCBhcmUgbm90IHBhcnQgb2YgdGhpcyBtYXBwaW5nLgEBIFJldmVyc2UgbWFwcGluZyBpcyBhdmFpbGFibGUgaW4gc3RvcmFnZSBbYEFsaWFzVG9TdG10QWNjb3VudGBdLuwgVGhpcyBpcyByZW1vdmVkIHdoZW4gdGhlIGFsaWFzLWJhc2VkIHBsYXllciBnZXRzIGFyY2hpdmVkLlUBIFRoaXMgaXMgdXBkYXRlZCB3aGVuIHRoZSBhbGlhcy1iYXNlZCBwbGF5ZXIgc2lnbnMgdXAgd2l0aCBhbm90aGVyIHN0YXRlbWVudCBhY2NvdW50LgBlASBTdGF0ZW1lbnQgYWNjb3VudHMgaW4gdGhpcyBzdG9yYWdlIGFuZCBhY2NvdW50LWJhc2VkIHBsYXllciBhY2NvdW50cyBpbiBbYFBsYXllcnNgXSBtdXN0NCBub3Qgb3ZlcmxhcC4AYENvbW11bmljYXRpb25JZGVudGlmaWVycwABBAIENQQEAAxpASBUaGUgY29tbXVuaWNhdGlvbiBpZGVudGlmaWVycyB1c2VkIGJ5IHBsYXllcnMgdG8gZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBQMlAgY29ubmVjdGlvbiBpbm0BIG9yZGVyIHRvIHBsYXkgdGhlIGdhbWUuIFRoZSBhY2NvdW50IHVuZGVyIHdoaWNoIHRoZSBjb21tdW5pY2F0aW9uIGlkZW50aWZpZXIgaXMgcmVnaXN0ZXJlZBkBIHNob3VsZCBiZSB0aGUgc2FtZSBhY2NvdW50IHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGVtZW50IHN0b3JlLgABfQQAAbUGACAkTWF4Um91bmRzOBADAAAADKAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvdW5kcyBpbiBhIGdhbWUuAOggTm90ZTogdGhlIGFjdHVhbCBudW1iZXIgb2Ygcm91bmRzIGlzIGNvbmZpZ3VyZWQgcGVyIGdhbWUuADBNYXhHcm91cFNpemU4EAYAAAAMqCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGxheWVycyBpbiBhIGdyb3VwLgAZASBOb3RlOiB0aGUgYWN0dWFsIG51bWJlciBvZiBwbGF5ZXJzIGluIGEgZ3JvdXAgaXMgY29uZmlndXJlZCBwZXIgZ2FtZS4AME1pbkdyb3VwU2l6ZTgQAAAAACCoIFRoZSBtaW5pbXVtIG51bWJlciBvZiBwbGF5ZXJzIGluIGEgZ3JvdXAuAGUBIFdoZW4gc2NoZWR1bGluZyBhIGdhbWUgdGhlIHZhbHVlIGZvciBgbWF4X2dyb3VwX3NpemVgIG11c3QgYmUgYXQgbGVhc3QgdGhpcyBtaW5pbXVtICsgMS4AJQEgSW4gb3JkZXIgdG8gaGF2ZSBubyBzaW5nbGUtcGxheWVyIGdyb3VwcywgdGhpcyB2YWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDIuAFEBIE5vdGU6IHRoZSBhY3R1YWwgbWluaW11bSBudW1iZXIgb2YgcGxheWVycyBpbiBhIGdyb3VwIGlzIGNvbmZpZ3VyZWQgcGVyIGdhbWUsIGl0IGlzWCBgbWF4X2dyb3VwX3NpemUgLSAxYC4AVE5vblBsYXlpbmdLaWNrb3V0VGltZTgQgFM7AAwVASBUaGUgdGltZSBhZnRlciB3aGljaCBhIHBsYXllciB0aGF0IGlzIG5vdCBwbGF5aW5nIGNhbiBiZSBraWNrZWQgb3V0LgC8IFRoaXMgaXMgb25seSBmb3IgYWNjb3VudCBwbGF5ZXJzLCBub3QgcGVyc29ucy4AOFBoYXNlRHVyYXRpb25znQRQLAEAADwAAAAeAAAAWAIAADwAAAAEuCBUaGUgZHVyYXRpb25zIG9mIGVhY2ggZ2FtZSBwaGFzZSwgaW4gc2Vjb25kcy4AQE1heEdhbWVTY2hlZHVsZXM4EAwAAAAE7CBUaGUgTWF4aW11bSBudW1iZXIgb2YgZ2FtZSBzY2hlZHVsZXMgdGhlIHBhbGxldCBjYW4gc3RvcmUuAGRNYXhBdHRlbmRhbmNlSGlzdG9yeURlcHRoOBAMAAAACF0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXN0IGdhbWVzIGZvciB3aGljaCBwbGF5ZXIgYXR0ZW5kYW5jZSBpcyBzdG9yZWQuIEFueSBhdHRlbmRhbmNlAQEgZW50cmllcyBvbGRlciB0aGFuIHRoaXMgd2lsbCBiZSBpbW1pbmVudGx5IHB1cmdlZCBmcm9tIHN0b3JhZ2UuAGxwcm9vZl9vZl9vd25lcnNoaXBfbXNnX2Jhc2UIgHBvcDpnYW1lOnN0bXRfYWNjb3VudF9mb3JfYWxpYXM6EBkBIFRoZSBiYXNlIG1lc3NhZ2Ugb2YgdGhlIHByb29mIG9mIG93bmVyc2hpcCBvZiBhbiBhY2NvdW50IGJ5IGFuIGFsaWFzLgA1ASBUaGUgZnVsbCBtZXNzYWdlIGlzIHRoaXMgYmFzZSBjb25jYXRlbmF0ZWQgdG8gdGhlIGFsaWFzIGFuZCB0aGVuIGhhc2hlZCB3aXRorCBgYmxha2UyXzI1NmAgKGJsYWtlMiB3aXRoIDI1NiBiaXQgb3V0cHV0KS4AAZUKAAg8VGlja2V0U2lnbmF0dXJlLQQEiCBTaWduYXR1cmUgdXNlZCB0byB2ZXJpZnkgdGlja2V0cy5AQWNjb3VudFNpZ25hdHVyZS0EBGAgU2lnbmF0dXJlIGZvciBhY2NvdW50cy4ANwAAFFNjb3JlARRTY29yZSgwUGFydGljaXBhbnRzAAEEArkGmQoEAAR8IFRoZSBwYXJ0aWNpcGFudHMgaW5mb3JtYXRpb25zLgBMUGVyc29uaG9vZFRocmVzaG9sZAEAOBAAAAAABMggVGhlIHNjb3JlIHRocmVzaG9sZCByZXF1aXJlZCB0byByZWFjaCBwZXJzb25ob29kLgBQQWJzZW5jZUdyYWNlU2NoZWR1bGUAAK0EBAAYKQEgUnVudGltZS1jb25maWd1cmFibGUgc2NoZWR1bGUgb2YgYWJzZW5jZS1ncmFjZSB0aWVycywgc29ydGVkIGJ5IGFzY2VuZGluZw0BIHBvcHVsYXRpb24gc2l6ZSB0aHJlc2hvbGQuIEVhY2ggdGllciBzcGVjaWZpZXMgaG93IG1hbnkgbWlzc2VzIGFyZQ0BIHRvbGVyYXRlZCB3aXRoaW4gcmVjZW50IGdhbWVzIGJlZm9yZSBhIHBhcnRpY2lwYW50J3MgcGVyc29uaG9vZCBpcywgc3VzcGVuZGVkLgDsIFdoZW4gZW1wdHkgb3IgdW5zZXQsIGEgaGFyZGNvZGVkIGRlZmF1bHQgc2NoZWR1bGUgaXMgdXNlZC4AREFic2VuY2VHcmFjZVJhdGlvAQDRCAgAABgVASBUaGUgY3VycmVudGx5IGFjdGl2ZSBhYnNlbmNlLWdyYWNlIHJhdGlvIGAoYWxsb3dlZF9taXNzZXMsIHdpbmRvdylgLCUBIGRlcml2ZWQgZnJvbSBgQWJzZW5jZUdyYWNlU2NoZWR1bGVgIGFuZCB0aGUgY3VycmVudCBhY3RpdmUtcGVyc29uIGNvdW50LgARASBVcGRhdGVkIGVhY2ggdGltZSBgdXBkYXRlX3RocmVzaG9sZHMoKWAgcnVucyAoYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5HQEgYXR0ZW5kYW5jZSByZXBvcnQgc2Vzc2lvbikuIFJlYWQgYnkgYHNldF9hdHRlbmRhbmNlYCB0byBkZWNpZGUgd2hldGhlcowgYSBwYXJ0aWNpcGFudCBzaG91bGQgYmUgc3VzcGVuZGVkLgBIQ3VycmVudFJvdW5kUG9pbnRzAQA4EAAAAAAEtCBUaGUgYWNjdW11bGF0ZWQgcG9pbnRzIGluIHRoZSBjdXJyZW50IHJvdW5kLgBEQ3VycmVudFJvdW5kSW5kZXgBADgQAAAAAByAIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCByb3VuZC4AXQEgVGhpcyBtdXN0IGJlIHRoZSBzdW0gb2YgYWxsIHBvaW50cyBhY2N1bXVsYXRlZCBpbiBgUm91bmRzUG9pbnRzRm9yUGFydGljaXBhbnRgIGZvciB0aGU8IGN1cnJlbnQgcm91bmQuAFEBICoqV0FSTklORyoqOiBUaGlzIHN0b3JhZ2UgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggYFJvdW5kc1BvaW50c0ZvclBhcnRpY2lwYW50YCwgdXNltCBgZm4gYWRkX3BvaW50c190b19wYXJ0aWNpcGFudGAgdG8gdXBkYXRlIGl0LgBoUm91bmRzUG9pbnRzRm9yUGFydGljaXBhbnQBAQgCAqkKOBAAAAAAGNAgVGhlIHBvaW50cyBhY2N1bXVsYXRlZCBieSBhIHBhcnRpY2lwYW50IGluIGEgcm91bmQuAFEBIEZvciB0aGUgY3VycmVudCByb3VuZCwgdGhpcyBzdG9yYWdlIG11c3QgYmUgdXBkYXRlZCBhbG9uZ3NpZGUgYEN1cnJlbnRSb3VuZFBvaW50c2AuADEBICoqV0FSTklORyoqOiBUaGlzIHN0b3JhZ2UgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggYEN1cnJlbnRSb3VuZFBvaW50c2AsIHVzZbQgYGZuIGFkZF9wb2ludHNfdG9fcGFydGljaXBhbnRgIHRvIHVwZGF0ZSBpdC4AMFJvdW5kUGF5b3V0cwABBAI4rQoEABCoIFRoZSByb3VuZHMgdGhhdCBhcmUgY3VycmVudGx5IHBheWluZyBvdXQuABEBIFJvdW5kcyBhcmUgcGF5aW5nIG91dCBhZnRlciB0aGV5IGhhdmUgZmluaXNoZWQgYWNjdW11bGF0aW5nIHBvaW50cy4lASBXaGVuIGFsbCB0aGVpciBwb2ludHMgaGF2ZSBiZWVuIHBhaWQgb3V0LCB0aGV5IGFyZSByZW1vdmVkIGZyb20gc3RvcmFnZS4ANFJvdW5kUGxhbm5pbmcAALEKBAAM/CBUaGUgcGxhbm5pbmcgb2YgdGhlIGN1cnJlbnQgcm91bmQgdGhhdCBpcyBhY2N1bXVsYXRpbmcgcG9pbnRzLgA9ASBJZiBub25lIHRoZSBjdXJyZW50IHJvdW5kIGlzIG9uZ29pbmcgYW5kIHdpbGwgYmUgcGxhbm5lZCBvbiB0aGUgbmV4dCBzY2hlZHVsZS4AOFJvdW5kU2NoZWR1bGVzAQC1CgQABLggRGVzY3JpYmVzIHRoZSBzY2hlZHVsZXMgb2YgdGhlIHBheW91dCByb3VuZHMuAAGhBAABvQYAFFBDdXJyZW5jeUxvY2F0aW9uSW5mb+AwAQMAoQ8EMgV2yOsLBPQgVGhlIGxvY2F0aW9uIG9mIHRoZSB1c2VkIGN1cnJlbmN5LiBJdCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuAFBPZmZjaGFpbldvcmtJbnRlcnZhbDgQAgAAAASwIFRoZSBpbnRlcnZhbCBhdCB3aGljaCBvZmZjaGFpbiB3b3JrZXIgcnVucy4AMHNjb3JlX3BvdF9pZASAbW9kbHNjb3JlcG90AAAAAAAAAAAAAAAAAAAAAAAAAAAE4CBHZXQgYSB1bmlxdWUsIGluYWNjZXNzaWJsZSBhY2NvdW50IElEIGZyb20gdGhlIGBQb3RJZGAuADRzY29yZV9jb250ZXh0CIBwb3A6cG9sa2Fkb3QubmV0d29yay9zY29yZSAgICAgIAhZASBUaGUgY29udGV4dCB1c2VkIGZvciB0aGUgcHJvb2ZzIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSBhcyBhIHBlcnNvbmFsIGFsaWFzIGluIHNjb3JlICBwYWxsZXQuACh1YmlfcG9pbnRzOBAGAAAABBUBIFRoZSBudW1iZXIgb2YgcG9pbnRzIHJlY2VpdmVkIHdoZW4gYXR0ZW5kaW5nIGFzIGEgcmVjb2duaXplZCBwZXJzb24uAAHBCgAAADgAACBEdW1teURpbQEgRHVtbXlEaW0ILFJlc2VydmVkSWRzAAEEAigQBAAE3CBUaGUgcGVyc29uYWwgSURzIHRoYXQgYXJlIHJlc2VydmVkIGJ5IHVucHJvdmVuIHBlb3BsZS4AGFBlb3BsZQABBAUoxQoEAAS4IFRoZSBwZW9wbGUgd2UgdHJhY2sgYWxvbmcgd2l0aCB0aGVpciByZWNvcmRzLgABuQQAAcEGAAAByQoAAAA7AAAoUGVvcGxlTGl0ZQEoUGVvcGxlTGl0ZQgoTGl0ZVBlb3BsZQABBAIEzQoEAAAAUEF0dGVzdGF0aW9uQWxsb3dhbmNlAQEEAgQ4EAAAAAAEKQEgTnVtYmVyIG9mIGF0dGVzdGF0aW9ucyBhdmFpbGFibGUgdG8gZGlzdHJpYnV0ZSBmb3IgYSB2ZXJpZmllciBhY2NvdW50IGlkLgAB0QQAAcUGAAAB1QoABFBBdHRlc3RhdGlvblNpZ25hdHVyZS0ECGEBIFNpZ25hdHVyZSBnZW5lcmF0ZWQgYnkgbGl0ZSBwZW9wbGUgYW5kIHVzZWQgYnkgdmVyaWZpZXJzIHRvIGNsYWltIGF0dGVzdGF0aW9ucyBvbiB0aGVpciAgYmVoYWxmLgA+AAAkUmVzb3VyY2VzASRSZXNvdXJjZXMcJENvbnN1bWVycwABBAIE2QoEAAQpASBBY2NvdW50cyB1c2VkIHRvIGlkZW50aWZ5IGNvbnN1bWVycyBtYXBwZWQgdG8gdGhlaXIgY29uc3VtZXIgaW5mb3JtYXRpb24uAGhTdG10U3RvcmVBc3NvY2lhdGVkQWNjb3VudAABBAIEBAQABMQgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGEgc3RhdGVtZW50IHN0b3JlIHNsb3QuADxVc2VybmFtZU93bmVyT2YAAQQCOQQEBAAYcQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBgdXNlcm5hbWVgIHRvIHRoZSBgQWNjb3VudElkYCB0aGF0IGhhcyByZWdpc3RlcmVkIGl0LiBUaGUgYG93bmVyYCB2YWx1ZWUBIHNob3VsZCBiZSBhIGtleSBpbiB0aGUgYENvbnN1bWVyc2AgbWFwLiBUaGVyZSBjYW4gYmUgYXQgbW9zdCAyIHVzZXJuYW1lcyBwb2ludGluZyB0byB0aGU4IHNhbWUgYG93bmVyYDpxASAtIHVzZXJuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnN1bWVyJ3MgbGl0ZSBwZXJzb24gaWRlbnRpdHkgLSB0aGlzIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQ7WQEgLSBvcHRpb25hbGx5IGFub3RoZXIgdXNlcm5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zdW1lcidzIGZ1bGwgcGVyc29uIGlkZW50aXR5LCBpZjggICBhcHBsaWNhYmxlLgA4QWNjb3VudE9mQWxpYXMAAQQCCAQEAARpASBSZXZlcnNlIGxvb2t1cCBmcm9tIHJlZ2lzdGVyZWQgYWxpYXNlcyB0byB0aGUgYEFjY291bnRJZGAgdXNlZCB0byByZWdpc3RlciBhcyBhIGNvbnN1bWVyLgBsVXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uAQAoIAAAAAAAAAAACFUBIFRoZSBhbW91bnQgb2YgdGltZSBmb3Igd2hpY2ggYSB1c2VybmFtZSByZXNlcnZhdGlvbiBpcyB2YWxpZCwgaW4gc2Vjb25kcy4gQWZ0ZXIgdGhpc9AgdGltZSBwZXJpb2QgZWxhcHNlcywgdGhlIHJlc2VydmF0aW9uIGNhbiBiZSB2b2lkZWQuAGBVc2VybmFtZVJlc2VydmF0aW9uUXVldWUAAQQCOQTtCgQACHEBIE1hcCBmcm9tIGEgcmVzZXJ2ZWQgYHVzZXJuYW1lYCB0byBhIHF1ZXVlIG9mIGBSZXNlcnZhdGlvblF1ZXVlRW50cnlgIGl0ZW1zLCBlYWNoIGhvbGRpbmcgYW5hASBhY2NvdW50IGFuZCB0aGUgdGltZXN0YW1wIHdoZW4gaXQgam9pbmVkLiBPbGQgcmVzZXJ2YXRpb25zIGNhbiBiZSByZW1vdmVkIGZyb20gc3RvcmFnZS4ANFJlc2VydmF0aW9uT2YAAQQCBDkEBAAIZQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBhbiBhY2NvdW50IHRvIHRoZSB1c2VybmFtZSBpdCBoYXMgcmVzZXJ2ZWQuIEVhY2ggYWNjb3VudCBjYW4gaGF2ZSBhdJwgbW9zdCBvbmUgYWN0aXZlIHJlc2VydmF0aW9uIGF0IGEgdGltZS4AAeEEAAHJBgAgRE1heFVzZXJuYW1lTGVuZ3RoOBAgAAAABC0BIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lLCBpbmNsdWRpbmcgYW55IHBvdGVudGlhbCB0cmFpbGluZyBkaWdpdHMuAERNaW5Vc2VybmFtZUxlbmd0aDgQBgAAAASIIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lLgBIUGVyc29uQXV0aER1cmF0aW9uOBAAowIADFUBIFRoZSBkdXJhdGlvbiBvZiB0aW1lLCBpbiBzZWNvbmRzLCBmb3Igd2hpY2ggYSBwZXJzb24ncyBhdXRob3JpemF0aW9uIGlzIHZhbGlkLiBBZnRlclEBIHRoaXMgcGVyaW9kIGVsYXBzZXMsIHBlb3BsZSB3aWxsIG5vIGxvbmdlciBiZSBjb25zaWRlcmVkIGFjdGl2ZSwgYnV0IHRoZWlyIHJlc291cmNlDQEgYWxsb3dhbmNlcyBzaG91bGQgZGVmYXVsdCB0byB0aGUgc2FtZSB2YWx1ZXMgdXNlZCBmb3IgbGl0ZSBwZW9wbGUuAGxNaW5QZXJzb25BdXRoVXBkYXRlSW50ZXJ2YWw4EIBRAQAIVQEgVGhlIG1pbmltdW0gaW50ZXJ2YWwgb2YgdGltZSwgaW4gc2Vjb25kcywgd2hpY2ggbXVzdCBwYXNzIGJlZm9yZSB1cGRhdGluZyBhIHBlcnNvbidzPCBhdXRob3JpemF0aW9uLgBkTWF4UmVzZXJ2YXRpb25RdWV1ZUxlbmd0aDgQCgAAAAQpASBNYXhpbXVtIG51bWJlciBvZiBhY2NvdW50cyB0aGF0IGNhbiBxdWV1ZSBmb3IgYSBzaW5nbGUgcmVzZXJ2ZWQgdXNlcm5hbWUuAFBBY2NvdW50c0FwaVNsb3RDb3VudDgQCAAAAAzgIFRoZSBudW1iZXIgb2Ygc2xvdHMgZm9yIHRoZSBhY2NvdW50cyBBUEkgYXV0aG9yaXphdGlvbi4A+CBJbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHJlcXVpcmUgYSBtaWdyYXRpb24uAGRBY2NvdW50c0FwaVJlZnVuZENvb2xkb3duOBCAUQEABNwgVGhlIHJlZnVuZCBjb29sZG93biwgaW4gc2Vjb25kcywgZm9yIHRoZSBhY2NvdW50cyBBUEkuAFBBY2NvdW50c0FwaUFsbG93YW5jZfkKIAIAAAAAyAAABNAgVGhlIFN0YXRlbWVudCBTdG9yZSBhbGxvd2FuY2UgZm9yIHRoZSBhY2NvdW50cyBBUEkuAAH9CgAERE9mZmNoYWluU2lnbmF0dXJlLQQIUQEgU2lnbmF0dXJlIHR5cGUgZm9yIGVuc3VyaW5nIG93bmVyc2hpcCBvZiBwcm92aWRlZCBhY2NvdW50cyBpbiBjYXNlIG9mIHJlZ2lzdHJhdGlvbnM8IHRocm91Z2ggYWxpYXMuAD8AADRDaHVua3NNYW5hZ2VyATRDaHVua3NNYW5hZ2VyCBhDaHVua3MAAQgFBQELBQsEAAQZASBQYWdpbmF0ZWQgY29sbGVjdGlvbiBvZiBjaHVua3MgKFJpbmdFeHBvbmVudCAtPiBQYWdlSW5kZXggLT4gQ2h1bmtzKS4APENodW5rUGFnZUhhc2hlcwABCAUFAQsIBAAEiCBUaGUgaGFzaCBmb3IgZWFjaCBwYWdlIG9mIGNodW5rcy4AAe0EAAHNBgAEIFBhZ2VTaXplOBD/AAAABMwgTnVtYmVyIG9mIGNodW5rcyBwZXIgcGFnZS4gTXVzdCBiZSBhIHBvd2VyIG9mIHR3by4AARELAAQUQ2h1bmsJCwRwIFRoZSB0eXBlIG9mIGEgc2luZ2xlIGNodW5rLgBAAAAcTWVtYmVycwEcTWVtYmVyc0QsQ29sbGVjdGlvbnMAAQQGCBULBAAE4CBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIGNvbGxlY3Rpb24sIGtleWVkIGJ5IGlkZW50aWZpZXIuAFBTdXNwZW5kZWRDb2xsZWN0aW9ucwABBAYIFQsEAAghASBDb2xsZWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZm9yIGRlbGV0aW9uIGFuZCBhcmUgYmVpbmcgcHJvY2Vzc2VkLlkBIE9uY2UgYSBjb2xsZWN0aW9uIGlzIG1vdmVkIGhlcmUsIG5vcm1hbCBvcGVyYXRpb25zIHdpbGwgZmFpbCB3aXRoIENvbGxlY3Rpb25Ob3RGb3VuZC4ANElkZW50aWZpZXJzT2YAAQQCGQshCwQABMwgVGhlIGlkZW50aWZpZXJzIG9mIGNvbGxlY3Rpb25zIG93bmVkIGJ5IGFuIGVudGl0eS4AEFJvb3QAAQgGAiULKQsEAASIIFRoZSBjdXJyZW50IG1lbWJlcnMgd2UgcmVjb2duaXNlLgBAQ3VycmVudFJpbmdJbmRleAEBBAYIOBAAAAAABOQgS2VlcHMgdHJhY2sgb2YgdGhlIHJpbmcgaW5kZXggY3VycmVudGx5IGJlaW5nIHBvcHVsYXRlZC4AOE9uYm9hcmRpbmdTaXplAQEEBgg4EAAAAAAE+CBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHF1ZXVlZCBiZWZvcmUgb25ib2FyZGluZyB0byBhIHJpbmcuACBSaW5nS2V5cwEBDAYCBTULOQsEABBhASBCb3RoIHRoZSBrZXlzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGJ1aWx0IHJpbmdzIGFuZCB0aGUga2V5cyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmdXR1cmVZASByaW5ncy4gUGFnaW5hdGVkIGJ5IChJZGVudGlmaWVyLCBSaW5nSW5kZXgsIFBhZ2VJbmRleCkgd2hlcmUgZWFjaCBwYWdlIGNvbnRhaW5zIHVwIHRvdQEgYFJpbmdDYXBhY2l0eUZyb21FeHBvbmVudGAga2V5cy4gVGhlIHBhZ2Ugc2l6ZSBlcXVhbHMgdGhlIGZsZXhpYmxlIHJpbmcgZXhwb25lbnQncyBjYXBhY2l0eSz0IGVuc3VyaW5nIEZsZXhpYmxlIGNvbGxlY3Rpb25zIG5ldmVyIG5lZWQgbW9yZSB0aGFuIG9uZSBwYWdlLgA4UmluZ0tleXNTdGF0dXMBAQgGAiULPQskAAAAAAAAAAAACGEBIFN0b3JlcyB0aGUgbWV0YSBpbmZvcm1hdGlvbiBmb3IgZWFjaCByaW5nLCB0aGUgbnVtYmVyIG9mIGtleXMgYW5kIGhvdyBtYW55IGFyZSBhY3R1YWxseVggaW5jbHVkZWQgaW4gdGhlIHJvb3QuAEhQZW5kaW5nU3VzcGVuc2lvbnMBAQgGBSULQQsEAAxpASBBIG1hcCBvZiBhbGwgcmluZ3Mgd2hpY2ggY3VycmVudGx5IGhhdmUgcGVuZGluZyBzdXNwZW5zaW9ucyBhbmQgbmVlZCBjbGVhbmluZywgYWxvbmcgd2l0aBEBIHRoZWlyIHJlc3BlY3RpdmUgbnVtYmVyIG9mIHN1c3BlbmRlZCBrZXlzIHdoaWNoIG5lZWQgdG8gYmUgcmVtb3ZlZC5tASBOb3RlOiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBzaW5nbGUtcGFnZSByaW5ncywgc28gYm91bmRlZCBieSBgUmluZ0NhcGFjaXR5RnJvbUV4cG9uZW50YC4ANEFjdGl2ZU1lbWJlcnMBAQQGCDgQAAAAAATQIFRoZSBudW1iZXIgb2YgbWVtYmVycyBjdXJyZW50bHkgaW5jbHVkZWQgaW4gYSByaW5nLgAcTWVtYmVycwABBAJRBEULBAAQcQEgVGhlIGN1cnJlbnQgbWVtYmVycyBwYXJ0IG9mIGFsbCBjb2xsZWN0aW9ucyAoZWl0aGVyIGluY2x1ZGVkIGluIHJpbmdzLCBzdXNwZW5kZWQgYW5kIHF1ZXVlZCEBIGZvciByZW1vdmFsIGZyb20gYSByaW5nLCBzdXNwZW5kZWQgYW5kIG5vdCBpbiBhbnkgcmluZywgb3Igb25ib2FyZGluZykuABEBIE1lbWJlciBwdWJsaWMga2V5IHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIG1lbWJlcnNoaXAgYW5kIHN0YXR1cy4AKFJpbmdzU3RhdGUBAQQGCE0LBAAE/CBUaGUgY3VycmVudCBzdGF0ZSBvZiBhbGwgcmluZ3MgbWFuYWdlZCBmb3IgYSBnaXZlbiBpZGVudGlmaWVyLgAoU3RhbGVSaW5ncwABCAYFJQsQBAAEzCBTZXQgb2YgcmluZ3Mgd2hpY2ggYXJlIHN0YWxlIGFuZCByZXF1aXJlIGJ1aWxkaW5nLgBAUXVldWVQYWdlSW5kaWNlcwEBBAYI9QYgAAAAAAAAAAAEOQEgS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgaW5kaWNlcyBvZiB0aGUgaGVhZCBhbmQgdGFpbCBvZiB0aGUgb25ib2FyZGluZyBxdWV1ZS4APE9uYm9hcmRpbmdRdWV1ZQEBCAYFJQtVCwQABC0BIFBhZ2luYXRlZCBjb2xsZWN0aW9uIG9mIG1lbWJlciBwdWJsaWMga2V5cyByZWFkeSB0byBiZSBpbmNsdWRlZCBpbiBhIHJpbmcuAEhEZWxldGlvbkluUHJvZ3Jlc3MAAFkLBAAU5CBUaGUgY29sbGVjdGlvbiBjdXJyZW50bHkgYmVpbmcgZGVsZXRlZCBhbmQgaXRzIHByb2dyZXNzLgA9ASBPbmx5IG9uZSBjb2xsZWN0aW9uIGlzIGFjdGl2ZWx5IGRlbGV0ZWQgYXQgYSB0aW1lLiBXaGVuIGEgY29sbGVjdGlvbiBpcyBtYXJrZWQxASBmb3IgZGVsZXRpb24sIGl0IGlzIGFkZGVkIGhlcmUgd2hlbiBkZWxldGlvbiBwcm9jZXNzaW5nIGJlZ2lucy4gUHJvZ3Jlc3MgaXMFASB0cmFja2VkIHRvIGFsbG93IHJlc3VtcHRpb24gaWYgd2VpZ2h0IHJ1bnMgb3V0IGR1cmluZyBgb25faWRsZWAuAERSaW5nRGVsZXRpb25RdWV1ZQABDAYFBTULEAQAFJggUXVldWUgb2YgcmluZyBwYWdlcyBwZW5kaW5nIGRlbGV0aW9uLgAVASBUaGlzIGlzIHVzZWQgYm90aCBieSBgcmVtb3ZlX3JpbmdgIChpbmRpdmlkdWFsIHJpbmcgZGVsZXRpb24pIGFuZCBieS0BIGNvbGxlY3Rpb24gZGVsZXRpb24uIFJpbmcgcGFnZXMgYXJlIHByb2Nlc3NlZCBmcm9tIHRoaXMgcXVldWUgaW4gYG9uX2lkbGVgrCByZWdhcmRsZXNzIG9mIHdoaWNoIG9wZXJhdGlvbiBxdWV1ZWQgdGhlbS4AAfkEAAHRBgAQOE1heENvbGxlY3Rpb25zOBBkAAAABMQgTWF4aW11bSBudW1iZXIgb2YgY29sbGVjdGlvbnMgYW4gb3duZXIgY2FuIGhhdmUuAFxPbmJvYXJkaW5nUXVldWVQYWdlU2l6ZTgQ/wAAAAhNASBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIGluY2x1ZGVkIGluIGFuIG9uYm9hcmRpbmcgcXVldWUgcGFnZSBiZWZvcmUgYSBuZXcgb25lIGlzJCBjcmVhdGVkLgBcTWF4RmxleGlibGVSaW5nRXhwb25lbnTxBAQJDF0BIFRoZSBtYXhpbXVtIHJpbmcgZXhwb25lbnQgdXNlZCBmb3IgRmxleGlibGUgY29sbGVjdGlvbnMuIFRoaXMgYWxzbyBkZXRlcm1pbmVzIHRoZSBwYWdlVQEgc2l6ZSBmb3IgcGFnaW5hdGVkIHJpbmcga2V5IHN0b3JhZ2UuIEZsZXhpYmxlIGNvbGxlY3Rpb25zIGNhbiBvbmx5IHVzZSByaW5nIHNpemVzIHVwPCB0byB0aGlzIHZhbHVlLgBcUmluZ0J1aWxkaW5nTWVtYmVyTGltaXQ4EGQAAAAIYQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhIHJpbmcgdGhyb3VnaCBhIHNpbmdsZSByb290IGJ1aWxkaW5nGCBjYWxsLgABYQsABCBMb2NhdGlvbuAEOQEgTG9jYXRpb24gdHlwZSBmb3IgaWRlbnRpZnlpbmcgY29sbGVjdGlvbiBvd25lcnMgZnJvbSBvdGhlciBjaGFpbnMvcGFyYWNoYWlucy4AQwAAHENvaW5hZ2UBHENvaW5hZ2U8MENvaW5zQnlPd25lcgABBAUEaQMEABBAIENvaW5zIGJ5IG93bmVyLgBdASBUaGlzIHN0b3JhZ2UgbWFwIGNvbnRhaW5zIGFsbCB0aGUgY29pbnMgY3VycmVudGx5IGNpcmN1bGF0aW5nLiBUaGUgY29pbiBpcyBtaW50ZWQgd2hlbiUBIHVubG9hZGVkIGZyb20gdGhlIHJlY3ljbGVyLCBhbmQgZGVzdHJveWVkIHdoZW4gbG9hZGVkIGludG8gdGhlIHJlY3ljbGVyLgAsTG9ja2VkQ29pbnMAAQQFBGULBAAQBQEgVGVtcG9yYXJ5IGxvY2sgZXhwaXJ5IGZvciBjb2lucyB0aGF0IHByZXZpb3VzbHkgZmFpbGVkIGRpc3BhdGNoLgBlASBBIGNvaW4gb3duZXIgZW50cnkgaXMgbG9ja2VkIHVudGlsIHRoZSBzdG9yZWQgVW5peCB0aW1lc3RhbXAsIHByZXZlbnRpbmcgcmVwZWF0ZWQgZmFpbGVklCBkaXNwYXRjaCBhdHRlbXB0cyBpbiBhIHNob3J0IHBlcmlvZC4AaFRvdGFsVmFsdWVPZkRlc3Ryb3llZENvaW5zAQDEQAAAAAAAAAAAAAAAAAAAAAAUqCBUaGUgdG90YWwgdmFsdWUgb2YgY29pbnMgdGhhdCB3ZXJlIGJ1cm50LgBpASBUaGlzIHRyYWNrcyB2YWx1ZSB0aGF0IGlzIGludGVudGlvbmFsbHkgZGVzdHJveWVkIGFzIHBhcnQgb2YgcHJvdG9jb2wgZmxvd3MgKGZvciBleGFtcGxlOmUBIHJlY3ljbGVyIGV4cGlyYXRpb24gY2xlYW51cCBhbmQgb3V0cHV0LXRva2VuIHNwYW0gcGVuYWx0eSBwYXRoKS4gVGhpcyBzdG9yYWdlIGl0ZW0ga2VlcHPIIHRyYWNrIG9mIHRoZSB0b3RhbCB2YWx1ZSBvZiBzdWNoIGRlc3Ryb3llZCBjb2lucy4AYENvbnN1bWVkRnJlZVVubG9hZFRva2VucwABCAUF5QkQBAAYxCBDb25zdW1lZCBmcmVlIHVubG9hZCB0b2tlbnMgYnkgcGVyaW9kIGFuZCBhbGlhcy4AVQEgVGhpcyBzdG9yYWdlIGtlZXBzIHRyYWNrIG9mIHRoZSBmcmVlIHVubG9hZCB0b2tlbnMgdGhhdCBoYXZlIGJlZW4gY29uc3VtZWQgYnkgcGVvcGxlrCBhbmQgbGl0ZSBwZW9wbGUsIHRvIGF2b2lkIGRvdWJsZSBzcGVuZGluZy4AcCBJdCBpcyBjbGVhcmVkIHBlcmlvZGljYWxseS4AZFJlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWQAAQQFbQMQBABAEQEgVHJhY2tzIHdoZXRoZXIgYSByZWN5Y2xlciBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBjb2luIHZhbHVlLgBdASBBbGwgcmVjeWNsZXIgY29sbGVjdGlvbnMgYXJlIGNyZWF0ZWQgZWFnZXJseSBkdXJpbmcgb25lLXRpbWUgYG9uX3BvbGxgIGluaXRpYWxpemF0aW9uLi0BIFtgUmVjeWNsZXJNYW5hZ2VyOjplbnN1cmVfY29sbGVjdGlvbl9leGlzdHNgXSBzZXJ2ZXMgYXMgYSBzYWZldHkgZmFsbGJhY2suAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgB0UmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXgAAQQFbQM4BABAxCBMYXN0IHJlbW92ZWQgcmluZyBpbmRleCBwZXIgcmVjeWNsZXIgY29pbiB2YWx1ZS4ARQEgUmluZ3MgYXJlIHJlbW92ZWQgc2VxdWVudGlhbGx5IHN0YXJ0aW5nIGZyb20gaW5kZXggMC4gVGhlIG5leHQgcmluZyB0byBjaGVjayBmb3ItASBleHBpcmF0aW9uIGlzIGBsYXN0X3JlbW92ZWQgKyAxYCAob3IgYDBgIGlmIG5vdGhpbmcgaGFzIGJlZW4gcmVtb3ZlZCB5ZXQpLgBVASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFJlY3ljbGVyTWFuYWdlcmBdIHR5cGUgaW5zdGVhZC4AVQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgbWFuYWdlZCBieSBbYFJlY3ljbGVyTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ6QQEgKiBbUmVjeWNsZXJDb2xsZWN0aW9uQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBjb2luIHZhbHVlLlUBICogW1JlY3ljbGVyc0xhc3RSZW1vdmVkUmluZ0luZGV4XSAtIHRoZSBsYXN0IHJlbW92ZWQgcmluZyBpbmRleCBmb3IgZWFjaCBjb2luIHZhbHVlLlkBICogW1JlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyXSAtIHRoZSBtYXBwaW5nIGZyb20gbWVtYmVyIGtleSB0byB0aGUgY29pbiB2YWx1ZSBpdCBpcyBpbi5hASAqIFtSZWN5Y2xlcnNVbmxvYWRlZF0gLSB0aGUgcmVjeWNsZXJzJyB1bmxvYWRlZCBhbGlhc2VzLCBpbmRleGVkIGJ5IGNvaW4gdmFsdWUgYW5kIHJpbmckICAgaW5kZXguKQEgKiBbUmVjeWNsZXJzRHVzdGluZ10gLSBtYXJrcyByaW5ncyB3aXRoIHVubG9hZGVkIGFsaWFzZXMgcGVuZGluZyByZW1vdmFsLgBhASBSaW5nIG1lbWJlcnMsIHBlbmRpbmcgbWVtYmVycywgYW5kIHJpbmcgc3RhdGUgYXJlIG1hbmFnZWQgYnkgW2BDb25maWc6Ok1lbWJlclNlcnZpY2VgXS4AXFJlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyAAEEBVEEbQMEAEARASBNYXBwaW5nIGZyb20gYSByZWN5Y2xlciBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGJlbG9uZ3MgdG8uAE0BIFdoZW4gYSBjb2luIGlzIGxvYWRlZCBpbnRvIGEgcmVjeWNsZXIsIHRoZSBtZW1iZXIga2V5IGlzIHJlY29yZGVkIGhlcmUgc28gdGhhdCB0aGUNASBwYWxsZXQgY2FuIGxvb2sgdXAgd2hpY2ggY29pbiB2YWx1ZSB0aGUgbWVtYmVyIGtleSBjb3JyZXNwb25kcyB0by4AVQEgKipXQVJOSU5HKio6IERvIG5vdCB1c2UgdGhpcyBzdG9yYWdlIGRpcmVjdGx5LCB1c2UgW2BSZWN5Y2xlck1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFUBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BSZWN5Y2xlck1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OkEBICogW1JlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgY29pbiB2YWx1ZS5VASAqIFtSZWN5Y2xlcnNMYXN0UmVtb3ZlZFJpbmdJbmRleF0gLSB0aGUgbGFzdCByZW1vdmVkIHJpbmcgaW5kZXggZm9yIGVhY2ggY29pbiB2YWx1ZS5ZASAqIFtSZWN5Y2xlcnNDb2luVG9SZWN5Y2xlcl0gLSB0aGUgbWFwcGluZyBmcm9tIG1lbWJlciBrZXkgdG8gdGhlIGNvaW4gdmFsdWUgaXQgaXMgaW4uYQEgKiBbUmVjeWNsZXJzVW5sb2FkZWRdIC0gdGhlIHJlY3ljbGVycycgdW5sb2FkZWQgYWxpYXNlcywgaW5kZXhlZCBieSBjb2luIHZhbHVlIGFuZCByaW5nJCAgIGluZGV4LikBICogW1JlY3ljbGVyc0R1c3RpbmddIC0gbWFya3MgcmluZ3Mgd2l0aCB1bmxvYWRlZCBhbGlhc2VzIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAERSZWN5Y2xlcnNVbmxvYWRlZAABDAUFBW0LEAQAQDUBIFRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgKGNvaW4gdmFsdWUsIHJpbmcgaW5kZXgsIGFsaWFzKS4AVQEgV2hlbiBhIGNvaW4gaXMgdW5sb2FkZWQgZnJvbSBhIHJlY3ljbGVyLCB0aGUgYWxpYXMgcHJvZHVjZWQgYnkgdGhlIHJpbmctVlJGIHByb29mIGlzGQEgc3RvcmVkIGhlcmUgdG8gcHJldmVudCBkb3VibGUtc3BlbmRpbmcgd2l0aGluIHRoZSBzYW1lIHJlY3ljbGVyIHJpbmcuAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBAUmVjeWNsZXJzRHVzdGluZwABBAVxCxAEAEgFASBNYXJrcyByZWN5Y2xlciByaW5ncyB0aGF0IGhhdmUgdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuACEBIFdoZW4gYSByZWN5Y2xlciByaW5nIGlzIHJlbW92ZWQsIHRoZSBjbGVhbnVwIG9mIGl0cyB1bmxvYWRlZCBhbGlhc2VzIGluUQEgW1JlY3ljbGVyc1VubG9hZGVkXSBpcyBwZXJmb3JtZWQgZ3JhZHVhbGx5IHRocm91Z2ggdGhpcyBzdG9yYWdlIGl0ZW0uIEFuIGVudHJ5IGhlcmVRASBpbmRpY2F0ZXMgdGhhdCB1bmxvYWRlZCBhbGlhc2VzIGZvciB0aGUgZ2l2ZW4gY29pbiB2YWx1ZSBhbmQgcmluZyBpbmRleCBzdGlsbCBleGlzdFggYW5kIHNob3VsZCBiZSBkdXN0ZWQuAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBYUGFpZFVubG9hZFRva2VuTWVtYmVycwABBAVRBBAEADgJASBNYXBwaW5nIGZyb20gYSBwYWlkIHRva2VuIG1lbWJlciBrZXkgdG8gdGhlIHBlcmlvZCBpdCBiZWxvbmdzIHRvLgBFASBXaGVuIGEgdXNlciBwYXlzIGZvciBhIHJlY3ljbGVyIHVubG9hZCB0b2tlbiwgdGhlIG1lbWJlciBrZXkgaXMgcmVjb3JkZWQgaGVyZSBzbyEBIHRoYXQgdGhlIHBhbGxldCBjYW4gbG9vayB1cCB3aGljaCBwZXJpb2QgdGhlIG1lbWJlciBrZXkgY29ycmVzcG9uZHMgdG8uAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAFxQYWlkVW5sb2FkVG9rZW5Db25zdW1lZAABDAYFBXULEAQAOPQgQ29uc3VtZWQgcGFpZCB1bmxvYWQgdG9rZW5zIGJ5IHBlcmlvZCwgcmluZyBpbmRleCBhbmQgYWxpYXMuAEkBIFdoZW4gYSBwYWlkIHVubG9hZCB0b2tlbiBpcyBjb25zdW1lZCwgdGhlIGFsaWFzIHByb2R1Y2VkIGJ5IHRoZSByaW5nLVZSRiBwcm9vZiBpc/Qgc3RvcmVkIGhlcmUgdG8gcHJldmVudCBkb3VibGUtc3BlbmRpbmcgd2l0aGluIHRoZSBzYW1lIHJpbmcuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAGxQYWlkVG9rZW5Db2xsZWN0aW9uc0NyZWF0ZWQAAQQGOBAEADgJASBUcmFja3Mgd2hldGhlciBhIHBhaWQgdG9rZW4gY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgZ2l2ZW4gcGVyaW9kLgBVASBVc2VzIGBJZGVudGl0eWAgaGFzaGVyIHNvIHRoYXQgaXRlcmF0aW9uIHlpZWxkcyBwZXJpb2RzIGluIG9yZGVyLCBlbmFibGluZyBlZmZpY2llbnRwIGNsZWFudXAgb2YgZXhwaXJlZCBwZXJpb2RzLgBRASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFBhaWRUa25NYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBRASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUGFpZFRrbk1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OvAgKiBbUGFpZFVubG9hZFRva2VuTWVtYmVyc10gLSB0cmFja3MgcmVnaXN0ZXJlZCBtZW1iZXIga2V5cy4ZASAqIFtQYWlkVW5sb2FkVG9rZW5Db25zdW1lZF0gLSB0aGUgY29uc3VtZWQgcGFpZCB1bmxvYWQgdG9rZW4gYWxpYXNlcy45ASAqIFtQYWlkVG9rZW5Db2xsZWN0aW9uc0NyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgcGVyaW9kLkUBICogW1BhaWRVbmxvYWRUb2tlbkR1c3RpbmddIC0gbWFya3MgcGVyaW9kcyB3aXRoIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBYUGFpZFVubG9hZFRva2VuRHVzdGluZwABBAY4EAQAQC0BIE1hcmtzIHBhaWQgdW5sb2FkIHRva2VuIHBlcmlvZHMgdGhhdCBoYXZlIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAFkBIFdoZW4gYSBwYWlkIHVubG9hZCB0b2tlbiBjb2xsZWN0aW9uIGlzIHJlbW92ZWQsIHRoZSBjbGVhbnVwIG9mIGl0cyBjb25zdW1lZCB0b2tlbnMgaW5VASBbUGFpZFVubG9hZFRva2VuQ29uc3VtZWRdIGlzIHBlcmZvcm1lZCBncmFkdWFsbHkgdGhyb3VnaCB0aGlzIHN0b3JhZ2UgaXRlbS4gQW4gZW50cnlNASBoZXJlIGluZGljYXRlcyB0aGF0IGNvbnN1bWVkIHRva2VucyBmb3IgdGhlIGdpdmVuIHBlcmlvZCBzdGlsbCBleGlzdCBhbmQgc2hvdWxkIGJlICBkdXN0ZWQuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAHhQYWlkVW5sb2FkVG9rZW5OZXh0UmluZ1RvQ2xlYW4AAQQGODgEAGD0IFRyYWNrcyB0aGUgbmV4dCByaW5nIGluZGV4IHRvIGNsZWFuIGZvciBlYWNoIGV4cGlyZWQgcGVyaW9kLgA1ASBVc2VkIGJ5IHRoZSBPQ1cgdG8gZGV0ZXJtaW5lIGNsZWFudXAgcHJvZ3Jlc3MgYW5kIGJ5IHRoZSBjb2xsZWN0aW9uIGRlbGV0aW9uxCBleHRyaW5zaWMgdG8gdmVyaWZ5IGFsbCByaW5ncyBoYXZlIGJlZW4gY2xlYW5lZC4APQEgUmluZ3MgYXJlIGNsZWFuZWQgc2VxdWVudGlhbGx5IChvbmUgcGVyIE9DVyBpbnRlcnZhbCkgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UuPQEgVGhpcyBpcyBpbnRlbnRpb25hbDogYSBzaW5nbGUgc3RvcmFnZSBjdXJzb3IgZW5hYmxlcyBPKDEpIGNvbXBsZXRpb24gY2hlY2tzIGluzCBib3RoIFtgUGFpZFRrbk1hbmFnZXI6OmVuc3VyZV9jYW5fY2xlYW5fcmluZ2BdIGFuZEUBIFtgUGFpZFRrbk1hbmFnZXI6OmVuc3VyZV9jYW5fZGVsZXRlX2NvbGxlY3Rpb25gXS4gVGhlIGFsdGVybmF0aXZlIOKAlCBzdWJtaXR0aW5nVQEgYWxsIHJpbmcgY2xlYW5zIGluIHBhcmFsbGVsIOKAlCB3b3VsZCByZXF1aXJlIGZldGNoaW5nIHJpbmcgbWVtYmVycyB0byBjaGVjayB3aGV0aGVyTQEgZWFjaCByaW5nIHdhcyBhbHJlYWR5IGNsZWFuZWQgKHNpbmNlIGByaW5nX3N0YXR1c2Agc3RpbGwgcmVwb3J0cyBgdG90YWwgPiAwYCBhZnRlclUBIGNsZWFudXAgYmVjYXVzZSByaW5ncyBhcmUgbm90IHJlbW92ZWQgdW50aWwgY29sbGVjdGlvbiBkZWxldGlvbikuIENsZWFudXAgb2YgZXhwaXJlZE0BIGNvbGxlY3Rpb25zIGlzIG5vdCB0aW1lLWNyaXRpY2FsLCBzbyB0aGUgc2ltcGxlciBzZXF1ZW50aWFsIGFwcHJvYWNoIGlzIHByZWZlcnJlZC4AUQEgKipXQVJOSU5HKio6IERvIG5vdCB1c2UgdGhpcyBzdG9yYWdlIGRpcmVjdGx5LCB1c2UgW2BQYWlkVGtuTWFuYWdlcmBdIHR5cGUgaW5zdGVhZC4AUQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgbWFuYWdlZCBieSBbYFBhaWRUa25NYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDrwICogW1BhaWRVbmxvYWRUb2tlbk1lbWJlcnNdIC0gdHJhY2tzIHJlZ2lzdGVyZWQgbWVtYmVyIGtleXMuGQEgKiBbUGFpZFVubG9hZFRva2VuQ29uc3VtZWRdIC0gdGhlIGNvbnN1bWVkIHBhaWQgdW5sb2FkIHRva2VuIGFsaWFzZXMuOQEgKiBbUGFpZFRva2VuQ29sbGVjdGlvbnNDcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIHBlcmlvZC5FASAqIFtQYWlkVW5sb2FkVG9rZW5EdXN0aW5nXSAtIG1hcmtzIHBlcmlvZHMgd2l0aCBjb25zdW1lZCB0b2tlbnMgcGVuZGluZyByZW1vdmFsLh0BICogW1BhaWRVbmxvYWRUb2tlbk5leHRSaW5nVG9DbGVhbl0gLSBzZXF1ZW50aWFsIHJpbmcgY2xlYW51cCBwcm9ncmVzcy4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAFxJbml0aWFsaXplUGFsbGV0QWNjb3VudAAAEAQAEMQgV2hldGhlciB0aGUgcGFsbGV0IGFjY291bnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuAFkBIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFsbGV0IGFjY291bnQgd2l0aCBtaW5pbXVtIGJhbGFuY2Ugc28gdGhhdCBpdCBjYW4gaG9sZCBhbnnsIGFtb3VudCBvZiB1bmRlcmx5aW5nIGFzc2V0IGV2ZW4gbGVzcyB0aGFuIG1pbmltdW0gYmFsYW5jZS4AAf0EAAHVBgA8UFJlY3ljbGVyUmluZ0V4cG9uZW508QQECQSwIFRoZSByaW5nIGV4cG9uZW50IGZvciByZWN5Y2xlciBjb2xsZWN0aW9ucy4AbFBhaWRVbmxvYWRUb2tlblJpbmdFeHBvbmVudPEEBAkE1CBUaGUgcmluZyBleHBvbmVudCBmb3IgcGFpZCB1bmxvYWQgdG9rZW4gY29sbGVjdGlvbnMuAERVbmRlcmx5aW5nQXNzZXRJZOAwAQMAoQ8EMgV2yOsLBMwgVGhlIGFzc2V0IGlkIG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IG9mIHRoZSBjb2lucy4ATFVuZGVybHlpbmdBc3NldFVuaXTEQAAAwW/yhiMAAAAAAAAAAAAEvCBUaGUgdW5pdCBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBvZiB0aGUgY29pbnMuADxNaW5pbXVtRXhwb25lbnRtAwQABKQgVGhlIG1pbmltdW0gZXhwb25lbnQgZm9yIHRoZSBjb2luIHZhbHVlLgA8TWF4aW11bUV4cG9uZW50bQMEDgSkIFRoZSBtYXhpbXVtIGV4cG9uZW50IGZvciB0aGUgY29pbiB2YWx1ZS4APE1heFNwbGl0T3V0cHV0czgQIAAAAASsIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBhIHNwbGl0LgBATWF4Q29uc29saWRhdGlvbjgQQAAAAATcIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGlhcyBwcm9vZnMgaW4gYSBjb25zb2xpZGF0aW9uLgCUVW5sb2FkVG9rZW5UaW1lUGVyaW9kUGVvcGxlTGl0ZVBlb3BsZTgQgFEBAATgIFRoZSB0aW1lIHBlcmlvZCBkdXJhdGlvbiBmb3IgdW5sb2FkIHRva2VucywgaW4gc2Vjb25kcy4AqFVubG9hZFRva2VuQWxsb3dhbmNlUGVyVGltZVBlcmlvZEZvclBlb3BsZcRAAADITmdtwRsAAAAAAAAAABRdASBUaGUgYWxsb3dhbmNlIG9mIHVubG9hZCB0b2tlbnMgdGhhdCBhIHBlcnNvbiBjYW4gdXNlIHBlciB0aW1lIHBlcmlvZCwgZXhwcmVzc2VkIGluIHRoZUggdW5kZXJseWluZyBhc3NldC4AVQEgVXNlIHBhbGxldCB2aWV3IHRvIGZldGNoIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiB1bmxvYWQgdG9rZW5zIGdpdmVuIHRoZSBjdXJyZW50ZCBwcmljZSBmb3IgdW5sb2FkIHRva2Vucy4AuFVubG9hZFRva2VuQWxsb3dhbmNlUGVyVGltZVBlcmlvZEZvckxpdGVQZW9wbGXEQAAAstNZW/AGAAAAAAAAAAAUYQEgVGhlIGFsbG93YW5jZSBvZiB1bmxvYWQgdG9rZW5zIHRoYXQgYSBsaXRlIHBlcnNvbiBjYW4gdXNlIHBlciB0aW1lIHBlcmlvZCwgZXhwcmVzc2VkIGluWCB0aGUgdW5kZXJseWluZyBhc3NldC4AWQEgVXNlIHBhbGxldCdzIGdldF9mcmVlX3VubG9hZF90b2tlbl9pbmZvKCkgdG8gZmV0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHVubG9hZMggdG9rZW5zIGdpdmVuIHRoZSBjdXJyZW50IHByaWNlIGZvciB1bmxvYWQgdG9rZW5zLgCATWF4RnJlZVVubG9hZFRva2Vuc1BlclRpbWVQZXJpb2Q4EAoAAAAQGQEgSGFyZCB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGZyZWUgdW5sb2FkIHRva2VucyBwZXIgdGltZSBwZXJpb2QuAIwgVGhlIGVmZmVjdGl2ZSBmcmVlIHRva2VuIGxpbWl0IGlzOgkBIGBtaW4oYWxsb3dhbmNlIC8gY3VycmVudF9mZWUsIE1heEZyZWVVbmxvYWRUb2tlbnNQZXJUaW1lUGVyaW9kKWAuAFhPZmZjaGFpbldvcmtlckludGVydmFsOBAEAAAABPAgVGhlIG51bWJlciBvZiBibG9jayBiZXR3ZWVuIHR3byBvZmZjaGFpbiB3b3JrZXIgZXhlY3V0aW9ucy4AVENvaW5GYWlsdXJlTG9ja1BlcmlvZCggPAAAAAAAAAAQUQEgVGhlIGJhc2UgbnVtYmVyIG9mIHNlY29uZHMgdG8gbG9jayBhIGNvaW4gYWZ0ZXIgYSBmYWlsZWQgZGlzcGF0Y2ggaW4gYEFzQ29pbmAgZmxvdy4APQEgVGhlIGFjdHVhbCBsb2NrIGR1cmF0aW9uIGlzIGV4cG9uZW50aWFsOiBgMl5yZXRyaWVzICogYmFzZWAgd2hlcmUgYHJldHJpZXNgIGlzkCB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzLgA4cGFsbGV0X2FjY291bnQEgG1vZGxjb2luYWdlIAAAAAAAAAAAAAAAAAAAAAAAAAAABHggVGhlIGFjY291bnQgaWQgb2YgdGhlIHBhbGxldC4AAXkLAABAesJxLIp2pSrDuhCikCHsmfkvJO5tPVdJfo88UmFcYWFoZ2V0X2ZyZWVfdW5sb2FkX3Rva2VuX2luZm8AfQskTQEgR2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiBmcmVlIHVubG9hZCB0b2tlbnMgZGlzdHJpYnV0ZWQgdG8gcGVvcGxlIGFuZCBsaXRlIHBlb3BsZawgZ2l2ZW4gdGhlIGN1cnJlbnQgcHJpY2UgZm9yIHVubG9hZCB0b2tlbnMuAF0BIElmIGFuIGVsZW1lbnQgaXMgYE5vbmVgLCBubyBwcmljZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGFuZCBjb252ZXJzaW9uIGJldHdlZW4gbmF0aXZlxCBhbmQgdGhlIHVuZGVybHlpbmcgYXNzZXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZC4AuCBSZXR1cm5zOiBgKGxpbWl0X3Blb3BsZSwgbGltaXRfbGl0ZV9wZW9wbGUpYC4A6CBFYWNoIGVsZW1lbnQgaXMgYE5vbmVgIHdoZW4gaXRzIGxpbWl0IGNhbm5vdCBiZSBjb21wdXRlZC4AesJxLIp2pSrDuhCikCHsmXPdGYKfacSTnvrLZoqsg6tgZ2V0X3JlY3ljbGVyX3Jpbmdfc3RhdHVzCBR2YWx1ZW0DFGluZGV4OIELBOggR2V0IHRoZSByaW5nIHN0YXR1cyBmb3IgYSByZWN5Y2xlciBhdCBhIGdpdmVuIHJpbmcgaW5kZXguAHrCcSyKdqUqw7oQopAh7JlI2ljtqFXqlVC+vSqiW33yaGdldF9yZWN5Y2xlcl9yaW5nX3JldmlzaW9uCBR2YWx1ZW0DFGluZGV4OAkDBPAgR2V0IHRoZSByaW5nIHJldmlzaW9uIGZvciBhIHJlY3ljbGVyIGF0IGEgZ2l2ZW4gcmluZyBpbmRleC4AesJxLIp2pSrDuhCikCHsmbXvxoCaa/NrA65X9MZsBIloZ2V0X3BhaWRfdG9rZW5fcmluZ19zdGF0dXMIGHBlcmlvZDgUaW5kZXg4gQsEHQEgR2V0IHRoZSByaW5nIHN0YXR1cyBmb3IgYSBwYWlkIHRva2VuIGF0IGEgZ2l2ZW4gcGVyaW9kIGFuZCByaW5nIGluZGV4LgB6wnEsinalKsO6EKKQIeyZoPbDEPaoKp98du8gf/2eNXBnZXRfcGFpZF90b2tlbl9yaW5nX3JldmlzaW9uCBhwZXJpb2Q4FGluZGV4OAkDBCUBIEdldCB0aGUgcmluZyByZXZpc2lvbiBmb3IgYSBwYWlkIHRva2VuIGF0IGEgZ2l2ZW4gcGVyaW9kIGFuZCByaW5nIGluZGV4LgB6wnEsinalKsO6EKKQIeyZbrxV6ZzX4j5zJePs/NmbZohnZXRfcGFpZF91bmxvYWRfdG9rZW5fZmVlX2luX2Fzc2V0AD0IEBEBIEdldCB0aGUgY3VycmVudCBmZWUgaW4gdGhlIHVuZGVybHlpbmcgYXNzZXQgZm9yIHBhaWQgdW5sb2FkIHRva2Vucy4AXQEgSWYgbm9uZSBpcyByZXR1cm5lZCBpdCBtZWFucyB0aGF0IG5vIHByaWNlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUsIGFuZCBzb21lIGNvbnZlcnNpb24BASBiZXR3ZWVuIG5hdGl2ZSBhbmQgdGhlIHVuZGVybHlpbmcgYXNzZXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZC4AesJxLIp2pSrDuhCikCHsmc69RKDPUdW6mU9sD+As6eqMZ2V0X3BhaWRfdW5sb2FkX3Rva2VuX2ZlZV9pbl9uYXRpdmUAxAQNASBHZXQgdGhlIGN1cnJlbnQgZmVlIGluIHRoZSBuYXRpdmUgY3VycmVuY3kgZm9yIHBhaWQgdW5sb2FkIHRva2Vucy4AesJxLIp2pSrDuhCikCHsmZ5ekF5ZqkCfsYBreJmmF4VEZ2V0X2NvaW5fYnlfb3duZXIEFG93bmVyBIULBIQgR2V0IGNvaW4gZGV0YWlscyBmb3IgYW4gYWNjb3VudC4AesJxLIp2pSrDuhCikCHsmdqcFukkgqX3o5fxn/ykfxpMZ2V0X2NvaW5fbG9ja191bnRpbAQUb3duZXIEFQMMVQEgR2V0IHRoZSBVbml4IHRpbWVzdGFtcCB1bnRpbCB3aGljaCBhIGNvaW4gaXMgY3VycmVudGx5IGxvY2tlZCBhZnRlciBmYWlsZWQgZGlzcGF0Y2guAEkBIFJldHVybnMgYE5vbmVgIHdoZW4gdGhlcmUgaXMgbm8gbG9jayBvciB3aGVuIHRoZSBzdG9yZWQgbG9jayBoYXMgYWxyZWFkeSBleHBpcmVkLgB6wnEsinalKsO6EKKQIeyZZGMoqHl4CvwS4UJZYBFgUGBnZXRfcmVjeWNsZXJfbWVtYmVyX2luZm8EGG1lbWJlclEEiQsE3CBHZXQgdGhlIGNvaW4gdmFsdWUgZm9yIGEgc3BlY2lmaWMgcmVjeWNsZXIgbWVtYmVyIGtleS4AesJxLIp2pSrDuhCikCHsmU8iBwpDfNFUQuU+iaAqaHRQaXNfcGFpZF90b2tlbl9tZW1iZXIEGG1lbWJlclEEyATUIENoZWNrIHdoZXRoZXIgYSBwYWlkIHRva2VuIG1lbWJlciBrZXkgaXMgcmVnaXN0ZXJlZC4AesJxLIp2pSrDuhCikCHsmSz2R2QhM2Gdfx48vF24ezhQZ2V0X3JlY3ljbGVyX21lbWJlcnMIFHZhbHVlbQMUaW5kZXg4TQQI4CBHZXQgdGhlIG1lbWJlcnMgb2YgYSByZWN5Y2xlciByaW5nICh0aGUgYW5vbnltaXR5IHNldCkuDQEgUmVxdWlyZWQgdG8gYnVpbGQgdGhlIHJpbmcgY29tbWl0bWVudCAoYWNjdW11bGF0b3IpIGZvciB0aGUgcHJvb2YuAHrCcSyKdqUqw7oQopAh7JnxOPwgaPI+APZVDu3OYk9hbGdldF9wYWlkX3Rva2VuX3JpbmdfbWVtYmVycwgYcGVyaW9kOBRpbmRleDhNBAjoIEdldCB0aGUgbWVtYmVycyBvZiBhIHBhaWQgdG9rZW4gcmluZyAodGhlIGFub255bWl0eSBzZXQpLg0BIFJlcXVpcmVkIHRvIGJ1aWxkIHRoZSByaW5nIGNvbW1pdG1lbnQgKGFjY3VtdWxhdG9yKSBmb3IgdGhlIHByb29mLgB6wnEsinalKsO6EKKQIeyZBdqoOiIxhWluJeyB5LJ8hmhpc19yZWN5Y2xlcl9hbGlhc191bmxvYWRlZAwUdmFsdWVtAxRpbmRleDgUYWxpYXMIyAz0IENoZWNrIGlmIGEgcmVjeWNsZXIgYWxpYXMgaGFzIGFscmVhZHkgYmVlbiB1bmxvYWRlZCAoc3BlbnQpLgDwIElmIHRoZSByZWN5Y2xlciBpcyBub3QgbGl2ZSwgdGhlIHJlc3VsdCBpcyBub3Qgc2lnbmlmaWNhbnQuAHrCcSyKdqUqw7oQopAh7JkujYsqm8QIyFrkoAWIV9CPcGlzX3BhaWRfdG9rZW5fYWxpYXNfY29uc3VtZWQMGHBlcmlvZDgUaW5kZXg4FGFsaWFzCMgMwCBDaGVjayBpZiBhIHBhaWQgdW5sb2FkIHRva2VuIGhhcyBiZWVuIGNvbnN1bWVkLgD0IElmIHRoZSBwZXJpb2QgaXMgbm90IGN1cnJlbnQsIHRoZSByZXN1bHQgaXMgbm90IHNpZ25pZmljYW50LgB6wnEsinalKsO6EKKQIeyZvxLQeog2HQ71NeyLXBnl03Bpc19mcmVlX3Rva2VuX2FsaWFzX2NvbnN1bWVkCBhwZXJpb2Q4FGFsaWFzCMgMwCBDaGVjayBpZiBhIGZyZWUgdW5sb2FkIHRva2VuIGhhcyBiZWVuIGNvbnN1bWVkLgD0IElmIHRoZSBwZXJpb2QgaXMgbm90IGN1cnJlbnQsIHRoZSByZXN1bHQgaXMgbm90IHNpZ25pZmljYW50LgBEAABUU3RvcmFnZUluaXRpYWxpemF0aW9uAVRTdG9yYWdlSW5pdGlhbGl6YXRpb24IME9uUG9sbFN0YXR1cwEAjQsEAAT0IEN1cnJlbnQgc3RhdGUgb2YgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaW4gb25fcG9sbCBob29rLgBYWGNtVHJhbnNmZXJJbml0aWF0ZWRBdAAAOAQACLggQmxvY2sgbnVtYmVyIHdoZW4gWENNIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQugCBVc2VkIHRvIHRyYWNrIHRyYW5zZmVyIHRpbWVvdXQuAAAB2QYAAAAAADwAAGRTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlAWRTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlBDBPblBvbGxTdGF0dXMBAJELBAAE9CBDdXJyZW50IHN0YXRlIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGluIG9uX3BvbGwgaG9vay4AAAHdBgAAAAAAQQAAHEFpcmRyb3ABHEFpcmRyb3AoNEV2ZW50U2NoZWR1bGUBAJULBAAM/CBBbGwgdGhlIHNjaGVkdWxlZCBldmVudHMuIEluIG9yZGVyIG9mIHJlZ2lzdHJhdGlvbiBzdGFydCB0aW1lLgA9ASBXQVJOSU5HOiBUaGlzIGl0ZW0gbXVzdCBiZSBrZXB0IGNvbnNpc3RlbnQgd2l0aCBgRXZlbnRTY2hlZHVsZUZpcnN0U3RhcnRUaW1lYC4AbEV2ZW50U2NoZWR1bGVGaXJzdFN0YXJ0VGltZQAAOAQAFOwgVGhlIGZpcnN0IHN0YXJ0IHRpbWUgb2YgdGhlIGZpcnN0IHNjaGVkdWxlZCBldmVudCwgaWYgYW55LgApASBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgdGhlIHByb29mIHNpemUgY29zdCBvZiByZWFkaW5nIHRoZSBlbnRpcmUgc2NoZWR1bGUuAAUBIFdBUk5JTkc6IFRoaXMgaXRlbSBtdXN0IGJlIGtlcHQgY29uc2lzdGVudCB3aXRoIGBFdmVudFNjaGVkdWxlYC4ALE5leHRFdmVudElkAQA4EAAAAAAEaCBUaGUgbmV4dCBnbG9iYWwgZXZlbnQgaWQuADBBY3RpdmVFdmVudHMAAQQFOKELBAAMbCBUaGUgY3VycmVudCBhY3RpdmUgZXZlbnRzLgAJASBXQVJOSU5HOiBUaGlzIGl0ZW0gbXVzdCBiZSBrZXB0IGNvbnNpc3RlbnQgd2l0aCBgQWN0aXZlRXZlbnRJZHNgLgA4QWN0aXZlRXZlbnRJZHMBAKkLBAAMmCBUaGUgaWRzIG9mIHRoZSBjdXJyZW50IGFjdGl2ZSBldmVudHMuAAEBIFdBUk5JTkc6IFRoaXMgaXRlbSBtdXN0IGJlIGtlcHQgY29uc2lzdGVudCB3aXRoIGBBY3RpdmVFdmVudHNgLgBsUGFydGljaXBhbnRJZFRvQWxpYXNBbmREZXN0AAEIBQX1Bq0LBAAEzCBUaGUgcGFydGljaXBhbnQgaWQgdG8gYWxpYXMgZm9yIHRoZSBhY3RpdmUgZXZlbnRzLgBQUGFydGljaXBhbnRBbGlhc1RvSWQAAQgFBeUJOAQABMwgVGhlIHBhcnRpY2lwYW50IGFsaWFzIHRvIGlkIGZvciB0aGUgYWN0aXZlIGV2ZW50cy4AVFdpbm5lcnNUb0Rpc3RyaWJ1dGVUbwEBBAU4sQsEAAwNASBUaGUgd2lubmVycyB0byB3aG9tIHRvIGRpc3RyaWJ1dGUgdGhlIHByaXplIGZvciB0aGUgYWN0aXZlIGV2ZW50cy4AFQEgVGhlIHdpbm5lcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhcyB0aGVpciBwcml6ZSBpcyBkaXN0cmlidXRlZC4AZFdpbm5lcnNXaXRoRmFpbGVkVHJhbnNmZXIAAQgFBbULuQsEAAQNASBUaGUgcHJpemVzIG9mIHdpbm5lcnMgdGhhdCBmYWlsZWQgdG8gYmUgdHJhbnNmZXJyZWQgYXV0b21hdGljYWxseS4AMFBhc3RBaXJkcm9wcwABBAY4vQsEAAhpASBIaXN0b3JpY2FsIHJlY29yZCBvZiBhbGwgcGFzdCBhaXJkcm9wcyB3aGljaCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IHVwIHVudGlsIHRoZSBwb2ludCBvZpwgZGlzdHJpYnV0aW5nIHRoZSBmdW5kcyB0byB0aGUgd2lubmVycy4AARkFAAHhBgAIOGFpcmRyb3BfcG90X2lkBIBtb2RscG9wOmFkcnAAAAAAAAAAAAAAAAAAAAAAAAAAAASQIFRoZSBhY2NvdW50IGlkIGZvciB0aGUgYWlyZHJvcCBwb3QuAFBhaXJkcm9wX2NvbnRleHRfYmFzZQkEcHBvcDpwb2xrYWRvdC5uZXR3b3JrL2FpcmRyb3AIWQEgVGhlIGJhc2UgY29udGV4dCBmb3IgYWlyZHJvcHMuIEVhY2ggYWlyZHJvcCBjb250ZXh0IGlzIGRlcml2ZWQgZnJvbSB0aGlzIGJhc2UgY29udGV4dMwgd2l0aCB0aGUgYWlyZHJvcCBpbmRleCBpbiBMRSBlbmNvZGluZyBhZGRlZCB0byBpdC4AAcULAAAAPQAAUE11bHRpQmxvY2tNaWdyYXRpb25zAVBNdWx0aUJsb2NrTWlncmF0aW9ucwgYQ3Vyc29yAAAtBQQADNggVGhlIGN1cnJlbnRseSBhY3RpdmUgbWlncmF0aW9uIHRvIHJ1biBhbmQgaXRzIGN1cnNvci4AvCBgTm9uZWAgaW5kaWNhdGVzIHRoYXQgbm8gbWlncmF0aW9uIGlzIHJ1bm5pbmcuACBIaXN0b3JpYwABBAVBBRAEABC0IFNldCBvZiBhbGwgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkIG1pZ3JhdGlvbnMuAHEBIFRoaXMgaXMgdXNlZCBhcyBibGFja2xpc3QsIHRvIG5vdCByZS1leGVjdXRlIG1pZ3JhdGlvbnMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSB0aGUxASBjb2RlYmFzZSB5ZXQuIEdvdmVybmFuY2UgY2FuIHJlZ3VsYXJseSBjbGVhciB0aGlzIG91dCB2aWEgYGNsZWFyX2hpc3RvcmljYC4AASUFAAHlBgAIMEN1cnNvck1heExlbjgQAAABABCkIFRoZSBtYXhpbWFsIGxlbmd0aCBvZiBhbiBlbmNvZGVkIGN1cnNvci4AZQEgQSBnb29kIGRlZmF1bHQgbmVlZHMgdG8gc2VsZWN0ZWQgc3VjaCB0aGF0IG5vIG1pZ3JhdGlvbiB3aWxsIGV2ZXIgaGF2ZSBhIGN1cnNvciB3aXRoIE1FTAkBIGFib3ZlIHRoaXMgbGltaXQuIFRoaXMgaXMgc3RhdGljYWxseSBjaGVja2VkIGluIGBpbnRlZ3JpdHlfdGVzdGAuAEBJZGVudGlmaWVyTWF4TGVuOBAAAQAAELQgVGhlIG1heGltYWwgbGVuZ3RoIG9mIGFuIGVuY29kZWQgaWRlbnRpZmllci4AVQEgQSBnb29kIGRlZmF1bHQgbmVlZHMgdG8gc2VsZWN0ZWQgc3VjaCB0aGF0IG5vIG1pZ3JhdGlvbiB3aWxsIGV2ZXIgaGF2ZSBhbiBpZGVudGlmaWVyLQEgd2l0aCBNRUwgYWJvdmUgdGhpcyBsaW1pdC4gVGhpcyBpcyBzdGF0aWNhbGx5IGNoZWNrZWQgaW4gYGludGVncml0eV90ZXN0YC4AAckLAAAAYgAACAQFACAtBAQASAAECAwQFBgcICQoLDA0ODxAREhQVmVyaWZ5TXVsdGlTaWduYXR1cmVNBRAgQXNQZXJzb25RBRBcQXNQcm9vZk9mSW5rUGFydGljaXBhbnRdBRBIU2NvcmVBc1BhcnRpY2lwYW50aQUQNEdhbWVBc0ludml0ZWR1BRA4UGVvcGxlTGl0ZUF1dGiBBRAkQXNDb2luYWdljQUQNEF1dGhvcml6ZUNhbGyhBRA8UmVzdHJpY3RPcmlnaW5zpQUQSENoZWNrTm9uWmVyb1NlbmRlcqkFEEBDaGVja1NwZWNWZXJzaW9urQU4OENoZWNrVHhWZXJzaW9usQU4MENoZWNrR2VuZXNpc7UFPDhDaGVja01vcnRhbGl0ebkFPChDaGVja05vbmNlwQUQLENoZWNrV2VpZ2h0xQUQUENoYXJnZUFzc2V0VHhQYXltZW50yQUQUFN0b3JhZ2VXZWlnaHRSZWNsYWltEBBUHEF1cmFBcGkINHNsb3RfZHVyYXRpb24AzQsMkCBSZXR1cm5zIHRoZSBzbG90IGR1cmF0aW9uIGZvciBBdXJhLgAlASBDdXJyZW50bHksIG9ubHkgdGhlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoaXMgdHlwZSBhdCBnZW5lc2lzIHdpbGwgYmUgdXNlZC4ALGF1dGhvcml0aWVzAI0IBJwgUmV0dXJuIHRoZSBjdXJyZW50IHNldCBvZiBhdXRob3JpdGllcy4ABLggQVBJIG5lY2Vzc2FyeSBmb3IgYmxvY2sgYXV0aG9yc2hpcCB3aXRoIGF1cmEuBABQUmVsYXlQYXJlbnRPZmZzZXRBcGkETHJlbGF5X3BhcmVudF9vZmZzZXQAOAT0IEZldGNoIHRoZSBzbG90IG9mZnNldCB0aGF0IGlzIGV4cGVjdGVkIGZyb20gdGhlIHJlbGF5IGNoYWluLgAQBQEgQVBJIHRvIHRlbGwgdGhlIG5vZGUgc2lkZSBob3cgdGhlIHJlbGF5IHBhcmVudCBzaG91bGQgYmUgY2hvc2VuLgBpASBBIGxhcmdlciBvZmZzZXQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbGF5IHBhcmVudCBzaG91bGQgbm90IGJlIHRoZSB0aXAgb2YgdGhlIHJlbGF5IGNoYWluLDEBIGJ1dCBgTmAgYmxvY2tzIGJlaGluZCB0aGUgdGlwLiBUaGlzIG9mZnNldCBpcyB0aGVuIGVuZm9yY2VkIGJ5IHRoZSBydW50aW1lLgQAYEF1cmFVbmluY2x1ZGVkU2VnbWVudEFwaQQ4Y2FuX2J1aWxkX3Vwb24INGluY2x1ZGVkX2hhc2g8EHNsb3SRCMgoOQEgV2hldGhlciBpdCBpcyBsZWdhbCB0byBleHRlbmQgdGhlIGNoYWluLCBhc3N1bWluZyB0aGUgZ2l2ZW4gYmxvY2sgaXMgdGhlIG1vc3Q1ASByZWNlbnRseSBpbmNsdWRlZCBvbmUgYXMtb2YgdGhlIHJlbGF5IHBhcmVudCB0aGF0IHdpbGwgYmUgYnVpbHQgYWdhaW5zdCwgYW5kcCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gc2xvdC4AUQEgVGhpcyBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBsb2dpYyB0aGUgcnVudGltZSB1c2VzIHdoZW4gdmFsaWRhdGluZyBibG9ja3MgdG84IGF2b2lkIGlzc3Vlcy4AYQEgV2hlbiB0aGUgdW5pbmNsdWRlZCBzZWdtZW50IGlzIGVtcHR5LCBpLmUuIGBpbmNsdWRlZF9oYXNoID09IGF0YCwgd2hlcmUgYXQgaXMgdGhlIGJsb2NrYQEgd2hvc2Ugc3RhdGUgd2UgYXJlIHF1ZXJ5aW5nIGFnYWluc3QsIHRoaXMgbXVzdCBhbHdheXMgcmV0dXJuIGB0cnVlYCBhcyBsb25nIGFzIHRoZSBzbG90vCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBpbmNsdWRlZCBibG9jayBpdHNlbGYuADQ1ASBUaGlzIHJ1bnRpbWUgQVBJIGlzIHVzZWQgdG8gaW5mb3JtIHBvdGVudGlhbCBibG9jayBhdXRob3JzIHdoZXRoZXIgdGhleSB3aWxsJQEgaGF2ZSB0aGUgcmlnaHQgdG8gYXV0aG9yIGF0IGEgc2xvdCwgYXNzdW1pbmcgdGhleSBoYXZlIGNsYWltZWQgdGhlIHNsb3QuAHUBIEluIHBhcnRpY3VsYXIsIHRoaXMgQVBJIGFsbG93cyBBdXJhLWJhc2VkIHBhcmFjaGFpbnMgdG8gcmVndWxhdGUgdGhlaXIgInVuaW5jbHVkZWQgc2VnbWVudCIsbQEgd2hpY2ggaXMgdGhlIHNlY3Rpb24gb2YgdGhlIGhlYWQgb2YgdGhlIGNoYWluIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBhdmFpbGFibGUgaW4gdGhlNCByZWxheSBjaGFpbi4AYQEgV2hlbiB0aGUgdW5pbmNsdWRlZCBzZWdtZW50IGlzIHNob3J0LCBBdXJhIGNoYWlucyB3aWxsIGFsbG93IGF1dGhvcnMgdG8gY3JlYXRlIG11bHRpcGxlXQEgYmxvY2tzIHBlciBzbG90IGluIG9yZGVyIHRvIGJ1aWxkIGEgYmFja2xvZy4gV2hlbiBpdCBpcyBzYXR1cmF0ZWQsIHRoaXMgQVBJIHdpbGwgbGltaXSoIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgY2FuIGJlIGNyZWF0ZWQuACQgQ2hhbmdlczqRASAtIFZlcnNpb24gMjogVXBkYXRlIHRvIGBjYW5fYnVpbGRfdXBvbmAgdG8gdGFrZSBhIHJlbGF5IGNoYWluIGBTbG90YCBpbnN0ZWFkIG9mIGEgcGFyYWNoYWluIGBTbG90YC4IABBDb3JlDBx2ZXJzaW9uACEHBJAgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcnVudGltZS4ANGV4ZWN1dGVfYmxvY2sEFGJsb2Nr0QsQBGQgRXhlY3V0ZSB0aGUgZ2l2ZW4gYmxvY2suAEBpbml0aWFsaXplX2Jsb2NrBBhoZWFkZXJc3QsEQQEgSW5pdGlhbGl6ZSBhIGJsb2NrIHdpdGggdGhlIGdpdmVuIGhlYWRlciBhbmQgcmV0dXJuIHRoZSBydW50aW1lIGV4ZWN1dGl2ZSBtb2RlLgAEIQEgVGhlIGBDb3JlYCBydW50aW1lIGFwaSB0aGF0IGV2ZXJ5IFN1YnN0cmF0ZSBydW50aW1lIG5lZWRzIHRvIGltcGxlbWVudC4UACBNZXRhZGF0YQwgbWV0YWRhdGEA4QsEjCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiBhIHJ1bnRpbWUuAExtZXRhZGF0YV9hdF92ZXJzaW9uBBx2ZXJzaW9uOOULEKQgUmV0dXJucyB0aGUgbWV0YWRhdGEgYXQgYSBnaXZlbiB2ZXJzaW9uLgAFASBJZiB0aGUgZ2l2ZW4gYHZlcnNpb25gIGlzbid0IHN1cHBvcnRlZCwgdGhpcyB3aWxsIHJldHVybiBgTm9uZWAudQEgVXNlIFtgU2VsZjo6bWV0YWRhdGFfdmVyc2lvbnNgXSB0byBmaW5kIG91dCBhYm91dCBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBvZiB0aGUgcnVudGltZS4ARG1ldGFkYXRhX3ZlcnNpb25zAFkEDKQgUmV0dXJucyB0aGUgc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb25zLgDAIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2FsbCBgbWV0YWRhdGFfYXRfdmVyc2lvbmAuAAQBASBUaGUgYE1ldGFkYXRhYCBhcGkgdHJhaXQgdGhhdCByZXR1cm5zIG1ldGFkYXRhIGZvciB0aGUgcnVudGltZS4IAExSdW50aW1lVmlld0Z1bmN0aW9uBFRleGVjdXRlX3ZpZXdfZnVuY3Rpb24IIHF1ZXJ5X2lk6QsUaW5wdXQY7QsEfCBFeGVjdXRlIGEgdmlldyBmdW5jdGlvbiBxdWVyeS4ABKQgUnVudGltZSBBUEkgZm9yIGV4ZWN1dGluZyB2aWV3IGZ1bmN0aW9ucwQAMEJsb2NrQnVpbGRlchA8YXBwbHlfZXh0cmluc2ljBCRleHRyaW5zaWM9B/ULEGwgQXBwbHkgdGhlIGdpdmVuIGV4dHJpbnNpYy4AOQEgUmV0dXJucyBhbiBpbmNsdXNpb24gb3V0Y29tZSB3aGljaCBzcGVjaWZpZXMgaWYgdGhpcyBleHRyaW5zaWMgaXMgaW5jbHVkZWQgaW5MIHRoaXMgYmxvY2sgb3Igbm90LgA4ZmluYWxpemVfYmxvY2sAXARoIEZpbmlzaCB0aGUgY3VycmVudCBibG9jay4ATGluaGVyZW50X2V4dHJpbnNpY3MEIGluaGVyZW50BQxNBwQ9ASBHZW5lcmF0ZSBpbmhlcmVudCBleHRyaW5zaWNzLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4APGNoZWNrX2luaGVyZW50cwgUYmxvY2vRCxBkYXRhBQwVDARVASBDaGVjayB0aGF0IHRoZSBpbmhlcmVudHMgYXJlIHZhbGlkLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4ABHEBIFRoZSBgQmxvY2tCdWlsZGVyYCBhcGkgdHJhaXQgdGhhdCBwcm92aWRlcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eSBmb3IgYnVpbGRpbmcgYSBibG9jay4YAFhUYWdnZWRUcmFuc2FjdGlvblF1ZXVlBFB2YWxpZGF0ZV90cmFuc2FjdGlvbgwYc291cmNlGQwIdHg9ByhibG9ja19oYXNoPB0MJGggVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uLgBlASBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBwb29sIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgZ2l2ZW4gdHJhbnNhY3Rpb24uRQEgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdHJhbnNhY3Rpb25NASBhZ2FpbnN0IGN1cnJlbnQgc3RhdGUuIFRoZSBnaXZlbiBgYmxvY2tfaGFzaGAgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggb2YgdGhlIGJsb2NrfCB0aGF0IGlzIHVzZWQgYXMgY3VycmVudCBzdGF0ZS4ARQEgTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgcGVyZm9ybWVkIGJ5IHRoZSBwb29sIG11bHRpcGxlIHRpbWVzIGFuZCB0cmFuc2FjdGlvbnOkIG1pZ2h0IGJlIHZlcmlmaWVkIGluIGFueSBwb3NzaWJsZSBvcmRlci4ABE0BIFRoZSBgVGFnZ2VkVHJhbnNhY3Rpb25RdWV1ZWAgYXBpIHRyYWl0IGZvciBpbnRlcmZlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBxdWV1ZS4MAERPZmZjaGFpbldvcmtlckFwaQQ8b2ZmY2hhaW5fd29ya2VyBBhoZWFkZXJcEATIIFN0YXJ0cyB0aGUgb2ZmLWNoYWluIHRhc2sgZm9yIGdpdmVuIGJsb2NrIGhlYWRlci4ABGQgVGhlIG9mZmNoYWluIHdvcmtlciBhcGkuCAAsU2Vzc2lvbktleXMIVGdlbmVyYXRlX3Nlc3Npb25fa2V5cwQQc2VlZEkFGBwVASBHZW5lcmF0ZSBhIHNldCBvZiBzZXNzaW9uIGtleXMgd2l0aCBvcHRpb25hbGx5IHVzaW5nIHRoZSBnaXZlbiBzZWVkLgkBIFRoZSBrZXlzIHNob3VsZCBiZSBzdG9yZWQgd2l0aGluIHRoZSBrZXlzdG9yZSBleHBvc2VkIHZpYSBydW50aW1lPCBleHRlcm5hbGl0aWVzLgCwIFRoZSBzZWVkIG5lZWRzIHRvIGJlIGEgdmFsaWQgYHV0ZjhgIHN0cmluZy4A0CBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgU0NBTEUgZW5jb2RlZCBwdWJsaWMga2V5cy4ATGRlY29kZV9zZXNzaW9uX2tleXMEHGVuY29kZWQYJQwMmCBEZWNvZGUgdGhlIGdpdmVuIHB1YmxpYyBzZXNzaW9uIGtleXMuANwgUmV0dXJucyB0aGUgbGlzdCBvZiBwdWJsaWMgcmF3IHB1YmxpYyBrZXlzICsga2V5IHR5cGUuAARoIFNlc3Npb24ga2V5cyBydW50aW1lIGFwaS4EADxBY2NvdW50Tm9uY2VBcGkENGFjY291bnRfbm9uY2UEHGFjY291bnQEOATAIEdldCBjdXJyZW50IGFjY291bnQgbm9uY2Ugb2YgZ2l2ZW4gYEFjY291bnRJZGAuAASAIFRoZSBBUEkgdG8gcXVlcnkgYWNjb3VudCBub25jZS4EAFRUcmFuc2FjdGlvblBheW1lbnRBcGkQKHF1ZXJ5X2luZm8IDHV4dD0HDGxlbjgxDAAARHF1ZXJ5X2ZlZV9kZXRhaWxzCAx1eHQ9BwxsZW44NQwAAExxdWVyeV93ZWlnaHRfdG9fZmVlBBh3ZWlnaHTVAcQAAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGg4xAAAABAAZFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGkQPHF1ZXJ5X2NhbGxfaW5mbwgQY2FsbCAMbGVuODEMBEkBIFF1ZXJ5IGluZm9ybWF0aW9uIG9mIGEgZGlzcGF0Y2ggY2xhc3MsIHdlaWdodCwgYW5kIGZlZSBvZiBhIGdpdmVuIGVuY29kZWQgYENhbGxgLgBYcXVlcnlfY2FsbF9mZWVfZGV0YWlscwgQY2FsbCAMbGVuODUMBLQgUXVlcnkgZmVlIGRldGFpbHMgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC4ATHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodNUBxAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBXZWlnaHRUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4ATHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aDjEBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYExlbmd0aFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LgAADAA0WGNtUGF5bWVudEFwaRB8cXVlcnlfYWNjZXB0YWJsZV9wYXltZW50X2Fzc2V0cwQseGNtX3ZlcnNpb244QQwUtCBSZXR1cm5zIGEgbGlzdCBvZiBhY2NlcHRhYmxlIHBheW1lbnQgYXNzZXRzLgAwICMgQXJndW1lbnRzAGggKiBgeGNtX3ZlcnNpb25gOiBWZXJzaW9uLgBAcXVlcnlfeGNtX3dlaWdodAQcbWVzc2FnZZUBTQwUqCBSZXR1cm5zIGEgd2VpZ2h0IG5lZWRlZCB0byBleGVjdXRlIGEgWENNLgAwICMgQXJndW1lbnRzAHQgKiBgbWVzc2FnZWA6IGBWZXJzaW9uZWRYY21gLgBkcXVlcnlfd2VpZ2h0X3RvX2Fzc2V0X2ZlZQgYd2VpZ2h01QEUYXNzZXQRA1EMGOggQ29udmVydHMgYSB3ZWlnaHQgaW50byBhIGZlZSBmb3IgdGhlIHNwZWNpZmllZCBgQXNzZXRJZGAuADAgIyBBcmd1bWVudHMAiCAqIGB3ZWlnaHRgOiBjb252ZXJ0aWJsZSBgV2VpZ2h0YC58ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0SWRgLgBMcXVlcnlfZGVsaXZlcnlfZmVlcwwsZGVzdGluYXRpb25JARxtZXNzYWdllQEgYXNzZXRfaWQRA1UMKGAgUXVlcnkgZGVsaXZlcnkgZmVlcyBWMi4AHQEgR2V0IGRlbGl2ZXJ5IGZlZXMgZm9yIHNlbmRpbmcgYSBzcGVjaWZpYyBgbWVzc2FnZWAgdG8gYSBgZGVzdGluYXRpb25gLvQgVGhlc2UgYWx3YXlzIGNvbWUgaW4gYSBzcGVjaWZpYyBhc3NldCwgZGVmaW5lZCBieSB0aGUgY2hhaW4uADAgIyBBcmd1bWVudHOBASAqIGBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdGhhdCdsbCBiZSBzZW50LCBuZWNlc3NhcnkgYmVjYXVzZSBtb3N0IGRlbGl2ZXJ5IGZlZXMgYXJlIGJhc2VkIG9uIHRoZVwgICBzaXplIG9mIHRoZSBtZXNzYWdlLmEBICogYGRlc3RpbmF0aW9uYDogVGhlIGRlc3RpbmF0aW9uIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8uIERpZmZlcmVudCBkZXN0aW5hdGlvbnMgbWF5IHVzZcAgICBkaWZmZXJlbnQgc2VuZGVycyB0aGF0IGNoYXJnZSBkaWZmZXJlbnQgZmVlcy4ALHAgQSB0cmFpdCBvZiBYQ00gcGF5bWVudCBBUEkuAKggQVBJIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG9idGFpbmluZzoAxCAqIHRoZSB3ZWlnaHQgcmVxdWlyZWQgdG8gZXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSwFASAqIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGBBc3NldElkYHMgZm9yIG1lc3NhZ2UgZXhlY3V0aW9uIHBheW1lbnQsAQEgKiB0aGUgY29zdCBvZiB0aGUgd2VpZ2h0IGluIHRoZSBzcGVjaWZpZWQgYWNjZXB0YWJsZSBgQXNzZXRJZGAuoCAqIHRoZSBmZWVzIGZvciBhbiBYQ00gbWVzc2FnZSBkZWxpdmVyeS4A8CBUbyBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiB3ZWlnaHQgb2YgdGhlIGNhbGxzIHJlcXVpcmVkIGZvcnUBIFtgeGNtOjpsYXRlc3Q6Okluc3RydWN0aW9uOjpUcmFuc2FjdGBdIGluc3RydWN0aW9uLCBgVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaWAgY2FuIGJlIHVzZWQuCABQTG9jYXRpb25Ub0FjY291bnRBcGkEQGNvbnZlcnRfbG9jYXRpb24EIGxvY2F0aW9uSQFZDASQIENvbnZlcnRzIGBMb2NhdGlvbmAgdG8gYEFjY291bnRJZGAuAAQNASBBUEkgZm9yIHVzZWZ1bCBjb252ZXJzaW9ucyBiZXR3ZWVuIFhDTSBgTG9jYXRpb25gIGFuZCBgQWNjb3VudElkYC4EAChNb2JSdWxlQXBpBCB2b3RlZF9vbggUdm90ZXIIJGRvbmVfb25sechZBAxZASBSZXR1cm5zIGEgbGlzdCBvZiBjYXNlcyB3aGVyZSB0aGUgdXNlciBoYXMgYSB2b3RlIHN0b3JlZCBvbiBjaGFpbi4gSWYgdGhlIGBkb25lX29ubHlgVQEgZmxhZyBpcyBzZXQsIG9ubHkgY2FzZXMgdGhhdCBhcmUgZG9uZSBhbmQgcmVhZHkgdG8gYmUgY2xhaW1lZCB3aWxsIGJlIHJldHVybmVkLiBUaGlzBQEgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHZvdGUgaW50byBhY2NvdW50LgAEtCBUaGUgQVBJIHRvIHF1ZXJ5IHRoZSByZXdhcmRzIGZvciBtb2IgY3JlZGl0LgQANFByb29mT2ZJbmtBcGkERGNhbmRpZGFjeV9kZXBvc2l0AMQE1CBSZXR1cm5zIHRoZSBkZXBvc2l0IG5lY2Vzc2FyeSB0byBiZWNvbWUgYSBjYW5kaWRhdGUuAATsIFRoZSBBUEkgdG8gcXVlcnkgdGhlIGRlcG9zaXQgZm9yIGEgcHJvb2Ygb2YgaW5rIGNhbmRpZGFjeS4EADRQYWxsZXRHYW1lQXBpCDBwbGF5X2RlcG9zaXQAxAS4IFJldHVybnMgdGhlIGRlcG9zaXQgbmVjZXNzYXJ5IHRvIHBsYXkgYSBnYW1lLgB4dmFsaWRhdGVfc3RhdGVtZW50X3dpdGhfcmVhc29uCBhzb3VyY2VhDCRzdGF0ZW1lbnRlDHkMBAUBIFN0YXRlbWVudCB2YWxpZGF0aW9uIHdpdGggcHJlY2lzZSByZWFzb24gZm9yIGludmFsaWQgc3RhdGVtZW50cy4ABKwgVGhlIEFQSSB0byBxdWVyeSB0aGUgZGVwb3NpdCBmb3IgZ2FtZXBsYXkuBABQQ29sbGVjdENvbGxhdGlvbkluZm8EWGNvbGxlY3RfY29sbGF0aW9uX2luZm8EGGhlYWRlclyBDBCcIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2xsYXRpb24uAPQgVGhlIGdpdmVuIGBoZWFkZXJgIGlzIHRoZSBoZWFkZXIgb2YgdGhlIGJ1aWx0IGJsb2NrIGZvciB0aGF0qCB3ZSBhcmUgY29sbGVjdGluZyB0aGUgY29sbGF0aW9uIGluZm8gZm9yLgAU2CBSdW50aW1lIGFwaSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGEgY29sbGF0aW9uLgBEIFZlcnNpb24gaGlzdG9yeToBASAtIFZlcnNpb24gMjogQ2hhbmdlZCBbYFNlbGY6OmNvbGxlY3RfY29sbGF0aW9uX2luZm9gXSBzaWduYXR1cmU1ASAtIFZlcnNpb24gMzogU2lnbmFscyB0byB0aGUgbm9kZSB0byB1c2UgdmVyc2lvbiAxIG9mIFtgUGFyYWNoYWluQmxvY2tEYXRhYF0uDAA4R2VuZXNpc0J1aWxkZXIMLGJ1aWxkX3N0YXRlBBBqc29uGI0MKGUBIEJ1aWxkIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZnJvbSBhIEpTT04gYmxvYiBub3QgdXNpbmcgYW55IGRlZmF1bHRzIGFuZCBzdG9yZSBpdCBpbiB0aGUkIHN0b3JhZ2UuACkBIEluIHRoZSBjYXNlIG9mIGEgRlJBTUUtYmFzZWQgcnVudGltZSwgdGhpcyBmdW5jdGlvbiBkZXNlcmlhbGl6ZXMgdGhlIGZ1bGxVASBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmQgcHV0cyBpdCBpbnRvIHRoZSBzdG9yYWdlLiBJZiB0aGVVASBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhlIGRlc2VyaWFsaXphdGlvbiBmYWlscywgYW4gZXJyb3I0IGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLgAoZ2V0X3ByZXNldAQIaWSRDEkFOGEBIFJldHVybnMgYSBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJ1aWx0LWluIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgaWRlbnRpZmllZCBieRggYGlkYC4AVQEgSWYgYGlkYCBpcyBgTm9uZWAgdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gSlNPTiBibG9iIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWZhdWx0SQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBzdHJ1Y3Qgb2YgdGhlIHJ1bnRpbWUuIEltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBkZWZhdWx0YCBgUnVudGltZUdlbmVzaXNDb25maWdgLgAhASBPdGhlcndpc2UgZnVuY3Rpb24gcmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGJ1aWx0LWluLCBuYW1lZFEBIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgcHJlc2V0IGlkZW50aWZpZWQgYnkgYGlkYCwgb3IgYE5vbmVgIGlmIHN1Y2ggcHJlc2V0IGRvZXMgbm90YQEgZXhpc3QuIFJldHVybmVkIGBWZWM8dTg+YCBjb250YWlucyBieXRlcyBvZiBKU09OIGJsb2IgKHBhdGNoKSB3aGljaCBjb21wcmlzZXMgYSBsaXN0IG9mTQEgKHBvdGVudGlhbGx5IG5lc3RlZCkga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIGZvciBjdXN0b21pemluZyB0aGUgZGVmYXVsdGUBIHJ1bnRpbWUgZ2VuZXNpcyBjb25maWcuIFRoZSBwYXRjaCBzaGFsbCBiZSBtZXJnZWQgKHJmYzczODYpIHdpdGggdGhlIEpTT04gcmVwcmVzZW50YXRpb25hASBvZiB0aGUgZGVmYXVsdCBgUnVudGltZUdlbmVzaXNDb25maWdgIHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgZ2VuZXNpcyBjb25maWcgdGhhdCBjYW6EIGJlIHVzZWQgaW4gYGJ1aWxkX3N0YXRlYCBtZXRob2QuADBwcmVzZXRfbmFtZXMAlQwQUQEgUmV0dXJucyBhIGxpc3Qgb2YgaWRlbnRpZmllcnMgZm9yIGF2YWlsYWJsZSBidWlsdGluIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgcHJlc2V0cy4AYQEgVGhlIHByZXNldHMgZnJvbSB0aGUgbGlzdCBjYW4gYmUgcXVlcmllZCB3aXRoIFtgR2VuZXNpc0J1aWxkZXI6OmdldF9wcmVzZXRgXSBtZXRob2QuIElmAQEgbm8gbmFtZWQgcHJlc2V0cyBhcmUgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWUgdGhlIGxpc3QgaXMgZW1wdHkuAATwIEFQSSB0byBpbnRlcmFjdCB3aXRoIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZm9yIHRoZSBydW50aW1lBABEVmFsaWRhdGVTdGF0ZW1lbnQESHZhbGlkYXRlX3N0YXRlbWVudAgYc291cmNlYQwkc3RhdGVtZW50ZQyZDARgIFZhbGlkYXRlIHRoZSBzdGF0ZW1lbnQuAASwIFJ1bnRpbWUgQVBJIHRyYWl0IGZvciBzdGF0ZW1lbnQgdmFsaWRhdGlvbi4EACDlBaEMAA=="; - -export { binMeta as default }; diff --git a/packages/host-papp/.papi/descriptors/generated.json b/packages/host-papp/.papi/descriptors/generated.json index a6a6771e..5df54ef2 100644 --- a/packages/host-papp/.papi/descriptors/generated.json +++ b/packages/host-papp/.papi/descriptors/generated.json @@ -1 +1 @@ -{"cliVersion":"0.18.0","whitelist":null,"chains":{"people_lite":"0x50b8c73c2a3438eeddf39175bda7d60b"}} \ No newline at end of file +{"cliVersion":"0.21.1","whitelist":null,"chains":{"people_lite":"0x5856bcc2600f139c76f7af463e725b08"},"contracts":{"ink":{},"sol":{}}} \ No newline at end of file diff --git a/packages/host-papp/.papi/descriptors/package.json b/packages/host-papp/.papi/descriptors/package.json index 7f010813..6a5577c1 100644 --- a/packages/host-papp/.papi/descriptors/package.json +++ b/packages/host-papp/.papi/descriptors/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0-autogenerated.34461162202873126", + "version": "0.1.0-autogenerated.11805297896621906130", "name": "@polkadot-api/descriptors", "files": [ "dist" @@ -20,6 +20,6 @@ "types": "./dist/index.d.ts", "sideEffects": false, "peerDependencies": { - "polkadot-api": ">=2" + "polkadot-api": ">=2.0.0" } } diff --git a/packages/host-papp/.papi/descriptors/src/common-types.ts b/packages/host-papp/.papi/descriptors/src/common-types.ts deleted file mode 100644 index 9201d868..00000000 --- a/packages/host-papp/.papi/descriptors/src/common-types.ts +++ /dev/null @@ -1,7842 +0,0 @@ -import {Enum, _Enum, GetEnum, SizedHex, SS58String, FixedSizeArray, ResultPayload, TxCallData} from "polkadot-api"; - - type AnonymousEnum = T & { - __anonymous: true -} - -type MyTuple = [T, ...T[]] - -type SeparateUndefined = undefined extends T - ? undefined | Exclude - : T - -type Anonymize = SeparateUndefined< - T extends - | string - | number - | bigint - | boolean - | void - | undefined - | null - | symbol - | Uint8Array - | Enum - ? T - : T extends AnonymousEnum - ? Enum - : T extends MyTuple - ? { - [K in keyof T]: T[K] - } - : T extends [] - ? [] - : T extends FixedSizeArray - ? number extends L - ? Array - : FixedSizeArray - : { - [K in keyof T & string]: T[K] - } -> - - export type I5sesotjlssv2d = {"nonce": number, "consumers": number, "providers": number, "sufficients": number, "data": Anonymize}; - -export type I1q8tnt1cluu5j = {"free": bigint, "reserved": bigint, "frozen": bigint, "flags": bigint}; - -export type Iffmde3ekjedi9 = {"normal": Anonymize, "operational": Anonymize, "mandatory": Anonymize}; - -export type I4q39t5hn830vp = {"ref_time": bigint, "proof_size": bigint}; - -export type I4mddgoa69c0a2 = Array; - -export type DigestItem = Enum<{"PreRuntime": Anonymize, "Consensus": Anonymize, "Seal": Anonymize, "Other": Uint8Array, "RuntimeEnvironmentUpdated": undefined}>; -export const DigestItem = _Enum as unknown as GetEnum; - -export type I82jm9g7pufuel = [SizedHex<4>, Uint8Array]; - -export type If3cj9t96ueeqn = Array<{"phase": Phase, "event": Enum<{"System": Anonymize, "ParachainSystem": Anonymize, "Balances": Anonymize, "TransactionPayment": TransactionPaymentEvent, "SkipFeelessPayment": Anonymize, "OriginRestriction": Anonymize, "Assets": Anonymize, "AssetsHolder": Anonymize, "AssetRate": Anonymize, "AssetTxPayment": Anonymize, "CollatorSelection": Anonymize, "Session": Anonymize, "XcmpQueue": Anonymize, "PolkadotXcm": Anonymize, "CumulusXcm": Anonymize, "MessageQueue": Anonymize, "Utility": Anonymize, "Multisig": Anonymize, "Sudo": Anonymize, "Proxy": Anonymize, "Identity": Anonymize, "People": Anonymize, "MobRule": Anonymize, "ProofOfInk": Anonymize, "Game": Anonymize, "Score": Anonymize, "DummyDim": Anonymize, "PeopleLite": Anonymize, "Resources": Anonymize, "ChunksManager": Anonymize, "Members": Anonymize, "Coinage": Anonymize, "StorageInitialization": Anonymize, "StorageInitializationLite": Anonymize, "Airdrop": Anonymize, "MultiBlockMigrations": Anonymize}>, "topics": Anonymize}>; - -export type Phase = Enum<{"ApplyExtrinsic": number, "Finalization": undefined, "Initialization": undefined}>; -export const Phase = _Enum as unknown as GetEnum; - -export type Ifofu507b4ql2m = AnonymousEnum<{ -/** - * An extrinsic completed successfully. - */ -"ExtrinsicSuccess": Anonymize, -/** - * An extrinsic failed. - */ -"ExtrinsicFailed": Anonymize, -/** - * `:code` was updated. - */ -"CodeUpdated": undefined, -/** - * A new account was created. - */ -"NewAccount": Anonymize, -/** - * An account was reaped. - */ -"KilledAccount": Anonymize, -/** - * On on-chain remark happened. - */ -"Remarked": Anonymize, -/** - * An upgrade was authorized. - */ -"UpgradeAuthorized": Anonymize, -/** - * An invalid authorized upgrade was rejected while trying to apply it. - */ -"RejectedInvalidAuthorizedUpgrade": Anonymize}>; - -export type Ia82mnkmeo2rhc = {"dispatch_info": Anonymize}; - -export type Ic9s8f85vjtncc = {"weight": Anonymize, "class": DispatchClass, "pays_fee": Enum<{"Yes": undefined, "No": undefined}>}; - -export type DispatchClass = Enum<{"Normal": undefined, "Operational": undefined, "Mandatory": undefined}>; -export const DispatchClass = _Enum as unknown as GetEnum; - -export type I9rkcukfi09eph = {"dispatch_error": Anonymize, "dispatch_info": Anonymize}; - -export type I5pvq44l06a3og = AnonymousEnum<{"Other": undefined, "CannotLookup": undefined, "BadOrigin": undefined, "Module": Enum<{"System": Anonymize, "ParachainSystem": Anonymize, "Timestamp": undefined, "ParachainInfo": undefined, "WeightReclaim": undefined, "Balances": Anonymize, "TransactionPayment": undefined, "SkipFeelessPayment": undefined, "OriginRestriction": Anonymize, "Assets": Anonymize, "AssetsHolder": Anonymize, "AssetRate": Anonymize, "AssetTxPayment": undefined, "Authorship": undefined, "CollatorSelection": Anonymize, "Session": Anonymize, "Aura": undefined, "AuraExt": undefined, "XcmpQueue": Anonymize, "PolkadotXcm": Anonymize, "CumulusXcm": undefined, "MessageQueue": Anonymize, "Utility": Anonymize, "Multisig": Anonymize, "Sudo": Anonymize, "VerifySignature": undefined, "Proxy": Anonymize, "Identity": Anonymize, "People": Anonymize, "MobRule": Anonymize, "ProofOfInk": Anonymize, "Game": Anonymize, "Score": Anonymize, "DummyDim": Anonymize, "PeopleLite": Anonymize, "Resources": Anonymize, "ChunksManager": Anonymize, "Members": Anonymize, "Coinage": Anonymize, "StorageInitialization": undefined, "StorageInitializationLite": undefined, "Airdrop": Anonymize, "MultiBlockMigrations": Anonymize}>, "ConsumerRemaining": undefined, "NoProviders": undefined, "TooManyConsumers": undefined, "Token": TokenError, "Arithmetic": ArithmeticError, "Transactional": TransactionalError, "Exhausted": undefined, "Corruption": undefined, "Unavailable": undefined, "RootNotAllowed": undefined, "Trie": Enum<{"InvalidStateRoot": undefined, "IncompleteDatabase": undefined, "ValueAtIncompleteKey": undefined, "DecoderError": undefined, "InvalidHash": undefined, "DuplicateKey": undefined, "ExtraneousNode": undefined, "ExtraneousValue": undefined, "ExtraneousHashReference": undefined, "InvalidChildReference": undefined, "ValueMismatch": undefined, "IncompleteProof": undefined, "RootMismatch": undefined, "DecodeError": undefined}>}>; - -export type I5o0s7c8q1cc9b = AnonymousEnum<{ -/** - * The name of specification does not match between the current runtime - * and the new runtime. - */ -"InvalidSpecName": undefined, -/** - * The specification version is not allowed to decrease between the current runtime - * and the new runtime. - */ -"SpecVersionNeedsToIncrease": undefined, -/** - * Failed to extract the runtime version from the new runtime. - * - * Either calling `Core_version` or decoding `RuntimeVersion` failed. - */ -"FailedToExtractRuntimeVersion": undefined, -/** - * Suicide called when the account has non-default composite data. - */ -"NonDefaultComposite": undefined, -/** - * There is a non-zero reference count preventing the account from being purged. - */ -"NonZeroRefCount": undefined, -/** - * The origin filter prevent the call to be dispatched. - */ -"CallFiltered": undefined, -/** - * A multi-block migration is ongoing and prevents the current code from being replaced. - */ -"MultiBlockMigrationsOngoing": undefined, -/** - * No upgrade authorized. - */ -"NothingAuthorized": undefined, -/** - * The submitted code is not authorized. - */ -"Unauthorized": undefined}>; - -export type Icjkr35j4tmg7k = AnonymousEnum<{ -/** - * Attempt to upgrade validation function while existing upgrade pending. - */ -"OverlappingUpgrades": undefined, -/** - * Polkadot currently prohibits this parachain from upgrading its validation function. - */ -"ProhibitedByPolkadot": undefined, -/** - * The supplied validation function has compiled into a blob larger than Polkadot is - * willing to run. - */ -"TooBig": undefined, -/** - * The inherent which supplies the validation data did not run this block. - */ -"ValidationDataNotAvailable": undefined, -/** - * The inherent which supplies the host configuration did not run this block. - */ -"HostConfigurationNotAvailable": undefined, -/** - * No validation function upgrade is currently scheduled. - */ -"NotScheduled": undefined}>; - -export type Idj13i7adlomht = AnonymousEnum<{ -/** - * Vesting balance too high to send value. - */ -"VestingBalance": undefined, -/** - * Account liquidity restrictions prevent withdrawal. - */ -"LiquidityRestrictions": undefined, -/** - * Balance too low to send value. - */ -"InsufficientBalance": undefined, -/** - * Value too low to create account due to existential deposit. - */ -"ExistentialDeposit": undefined, -/** - * Transfer/payment would kill account. - */ -"Expendability": undefined, -/** - * A vesting schedule already exists for this account. - */ -"ExistingVestingSchedule": undefined, -/** - * Beneficiary account must pre-exist. - */ -"DeadAccount": undefined, -/** - * Number of named reserves exceed `MaxReserves`. - */ -"TooManyReserves": undefined, -/** - * Number of holds exceed `VariantCountOf`. - */ -"TooManyHolds": undefined, -/** - * Number of freezes exceed `MaxFreezes`. - */ -"TooManyFreezes": undefined, -/** - * The issuance cannot be modified since it is already deactivated. - */ -"IssuanceDeactivated": undefined, -/** - * The delta cannot be zero. - */ -"DeltaZero": undefined}>; - -export type I8pd5n1lppndg2 = AnonymousEnum<{ -/** - * The origin has no usage tracked. - */ -"NoUsage": undefined, -/** - * The usage is not zero. - */ -"NotZero": undefined}>; - -export type I8ktb7n3252jn5 = AnonymousEnum<{ -/** - * Account balance must be greater than or equal to the transfer amount. - */ -"BalanceLow": undefined, -/** - * The account to alter does not exist. - */ -"NoAccount": undefined, -/** - * The signing account has no permission to do the operation. - */ -"NoPermission": undefined, -/** - * The given asset ID is unknown. - */ -"Unknown": undefined, -/** - * The origin account is frozen. - */ -"Frozen": undefined, -/** - * The asset ID is already taken. - */ -"InUse": undefined, -/** - * Invalid witness data given. - */ -"BadWitness": undefined, -/** - * Minimum balance should be non-zero. - */ -"MinBalanceZero": undefined, -/** - * Unable to increment the consumer reference counters on the account. Either no provider - * reference exists to allow a non-zero balance of a non-self-sufficient asset, or one - * fewer then the maximum number of consumers has been reached. - */ -"UnavailableConsumer": undefined, -/** - * Invalid metadata given. - */ -"BadMetadata": undefined, -/** - * No approval exists that would allow the transfer. - */ -"Unapproved": undefined, -/** - * The source account would not survive the transfer and it needs to stay alive. - */ -"WouldDie": undefined, -/** - * The asset-account already exists. - */ -"AlreadyExists": undefined, -/** - * The asset-account doesn't have an associated deposit. - */ -"NoDeposit": undefined, -/** - * The operation would result in funds being burned. - */ -"WouldBurn": undefined, -/** - * The asset is a live asset and is actively being used. Usually emit for operations such - * as `start_destroy` which require the asset to be in a destroying state. - */ -"LiveAsset": undefined, -/** - * The asset is not live, and likely being destroyed. - */ -"AssetNotLive": undefined, -/** - * The asset status is not the expected status. - */ -"IncorrectStatus": undefined, -/** - * The asset should be frozen before the given operation. - */ -"NotFrozen": undefined, -/** - * Callback action resulted in error - */ -"CallbackFailed": undefined, -/** - * The asset ID must be equal to the [`NextAssetId`]. - */ -"BadAssetId": undefined, -/** - * The asset cannot be destroyed because some accounts for this asset contain freezes. - */ -"ContainsFreezes": undefined, -/** - * The asset cannot be destroyed because some accounts for this asset contain holds. - */ -"ContainsHolds": undefined, -/** - * Tried setting too many reserves. - */ -"TooManyReserves": undefined}>; - -export type I3rc9953c1unod = AnonymousEnum<{ -/** - * Number of holds on an account would exceed the count of `RuntimeHoldReason`. - */ -"TooManyHolds": undefined}>; - -export type I3qgd61cgli6cp = AnonymousEnum<{ -/** - * The given asset ID is unknown. - */ -"UnknownAssetKind": undefined, -/** - * The given asset ID already has an assigned conversion rate and cannot be re-created. - */ -"AlreadyExists": undefined, -/** - * Overflow ocurred when calculating the inverse rate. - */ -"Overflow": undefined}>; - -export type I36bcffk2387dv = AnonymousEnum<{ -/** - * The pallet has too many candidates. - */ -"TooManyCandidates": undefined, -/** - * Leaving would result in too few candidates. - */ -"TooFewEligibleCollators": undefined, -/** - * Account is already a candidate. - */ -"AlreadyCandidate": undefined, -/** - * Account is not a candidate. - */ -"NotCandidate": undefined, -/** - * There are too many Invulnerables. - */ -"TooManyInvulnerables": undefined, -/** - * Account is already an Invulnerable. - */ -"AlreadyInvulnerable": undefined, -/** - * Account is not an Invulnerable. - */ -"NotInvulnerable": undefined, -/** - * Account has no associated validator ID. - */ -"NoAssociatedValidatorId": undefined, -/** - * Validator ID is not yet registered. - */ -"ValidatorNotRegistered": undefined, -/** - * Could not insert in the candidate list. - */ -"InsertToCandidateListFailed": undefined, -/** - * Could not remove from the candidate list. - */ -"RemoveFromCandidateListFailed": undefined, -/** - * New deposit amount would be below the minimum candidacy bond. - */ -"DepositTooLow": undefined, -/** - * Could not update the candidate list. - */ -"UpdateCandidateListFailed": undefined, -/** - * Deposit amount is too low to take the target's slot in the candidate list. - */ -"InsufficientBond": undefined, -/** - * The target account to be replaced in the candidate list is not a candidate. - */ -"TargetIsNotCandidate": undefined, -/** - * The updated deposit amount is equal to the amount already reserved. - */ -"IdenticalDeposit": undefined, -/** - * Cannot lower candidacy bond while occupying a future collator slot in the list. - */ -"InvalidUnreserve": undefined}>; - -export type I1e07dgbaqd1sq = AnonymousEnum<{ -/** - * Invalid ownership proof. - */ -"InvalidProof": undefined, -/** - * No associated validator ID for account. - */ -"NoAssociatedValidatorId": undefined, -/** - * Registered duplicate key. - */ -"DuplicatedKey": undefined, -/** - * No keys are associated with this account. - */ -"NoKeys": undefined, -/** - * Key setting account is not live, so it's impossible to associate keys. - */ -"NoAccount": undefined}>; - -export type Idnnbndsjjeqqs = AnonymousEnum<{ -/** - * Setting the queue config failed since one of its values was invalid. - */ -"BadQueueConfig": undefined, -/** - * The execution is already suspended. - */ -"AlreadySuspended": undefined, -/** - * The execution is already resumed. - */ -"AlreadyResumed": undefined, -/** - * There are too many active outbound channels. - */ -"TooManyActiveOutboundChannels": undefined, -/** - * The message is too big. - */ -"TooBig": undefined}>; - -export type I4vcvo9od6afmt = AnonymousEnum<{ -/** - * The desired destination was unreachable, generally because there is a no way of routing - * to it. - */ -"Unreachable": undefined, -/** - * There was some other issue (i.e. not to do with routing) in sending the message. - * Perhaps a lack of space for buffering the message. - */ -"SendFailure": undefined, -/** - * The message execution fails the filter. - */ -"Filtered": undefined, -/** - * The message's weight could not be determined. - */ -"UnweighableMessage": undefined, -/** - * The destination `Location` provided cannot be inverted. - */ -"DestinationNotInvertible": undefined, -/** - * The assets to be sent are empty. - */ -"Empty": undefined, -/** - * Could not re-anchor the assets to declare the fees for the destination chain. - */ -"CannotReanchor": undefined, -/** - * Too many assets have been attempted for transfer. - */ -"TooManyAssets": undefined, -/** - * Origin is invalid for sending. - */ -"InvalidOrigin": undefined, -/** - * The version of the `Versioned` value used is not able to be interpreted. - */ -"BadVersion": undefined, -/** - * The given location could not be used (e.g. because it cannot be expressed in the - * desired version of XCM). - */ -"BadLocation": undefined, -/** - * The referenced subscription could not be found. - */ -"NoSubscription": undefined, -/** - * The location is invalid since it already has a subscription from us. - */ -"AlreadySubscribed": undefined, -/** - * Could not check-out the assets for teleportation to the destination chain. - */ -"CannotCheckOutTeleport": undefined, -/** - * The owner does not own (all) of the asset that they wish to do the operation on. - */ -"LowBalance": undefined, -/** - * The asset owner has too many locks on the asset. - */ -"TooManyLocks": undefined, -/** - * The given account is not an identifiable sovereign account for any location. - */ -"AccountNotSovereign": undefined, -/** - * The operation required fees to be paid which the initiator could not meet. - */ -"FeesNotMet": undefined, -/** - * A remote lock with the corresponding data could not be found. - */ -"LockNotFound": undefined, -/** - * The unlock operation cannot succeed because there are still consumers of the lock. - */ -"InUse": undefined, -/** - * Invalid asset, reserve chain could not be determined for it. - */ -"InvalidAssetUnknownReserve": undefined, -/** - * Invalid asset, do not support remote asset reserves with different fees reserves. - */ -"InvalidAssetUnsupportedReserve": undefined, -/** - * Too many assets with different reserve locations have been attempted for transfer. - */ -"TooManyReserves": undefined, -/** - * Local XCM execution incomplete. - */ -"LocalExecutionIncomplete": undefined, -/** - * Too many locations authorized to alias origin. - */ -"TooManyAuthorizedAliases": undefined, -/** - * Expiry block number is in the past. - */ -"ExpiresInPast": undefined, -/** - * The alias to remove authorization for was not found. - */ -"AliasNotFound": undefined, -/** - * Local XCM execution incomplete with the actual XCM error and the index of the - * instruction that caused the error. - */ -"LocalExecutionIncompleteWithError": Anonymize}>; - -export type I5r8t4iaend96p = {"index": number, "error": Enum<{"Overflow": undefined, "Unimplemented": undefined, "UntrustedReserveLocation": undefined, "UntrustedTeleportLocation": undefined, "LocationFull": undefined, "LocationNotInvertible": undefined, "BadOrigin": undefined, "InvalidLocation": undefined, "AssetNotFound": undefined, "FailedToTransactAsset": undefined, "NotWithdrawable": undefined, "LocationCannotHold": undefined, "ExceedsMaxMessageSize": undefined, "DestinationUnsupported": undefined, "Transport": undefined, "Unroutable": undefined, "UnknownClaim": undefined, "FailedToDecode": undefined, "MaxWeightInvalid": undefined, "NotHoldingFees": undefined, "TooExpensive": undefined, "Trap": undefined, "ExpectationFalse": undefined, "PalletNotFound": undefined, "NameMismatch": undefined, "VersionIncompatible": undefined, "HoldingWouldOverflow": undefined, "ExportError": undefined, "ReanchorFailed": undefined, "NoDeal": undefined, "FeesNotMet": undefined, "LockError": undefined, "NoPermission": undefined, "Unanchored": undefined, "NotDepositable": undefined, "TooManyAssets": undefined, "UnhandledXcmVersion": undefined, "WeightLimitReached": undefined, "Barrier": undefined, "WeightNotComputable": undefined, "ExceedsStackLimit": undefined}>}; - -export type I5iupade5ag2dp = AnonymousEnum<{ -/** - * Page is not reapable because it has items remaining to be processed and is not old - * enough. - */ -"NotReapable": undefined, -/** - * Page to be reaped does not exist. - */ -"NoPage": undefined, -/** - * The referenced message could not be found. - */ -"NoMessage": undefined, -/** - * The message was already processed and cannot be processed again. - */ -"AlreadyProcessed": undefined, -/** - * The message is queued for future execution. - */ -"Queued": undefined, -/** - * There is temporarily not enough weight to continue servicing messages. - */ -"InsufficientWeight": undefined, -/** - * This message is temporarily unprocessable. - * - * Such errors are expected, but not guaranteed, to resolve themselves eventually through - * retrying. - */ -"TemporarilyUnprocessable": undefined, -/** - * The queue is paused and no message can be executed from it. - * - * This can change at any time and may resolve in the future by re-trying. - */ -"QueuePaused": undefined, -/** - * Another call is in progress and needs to finish before this call can happen. - */ -"RecursiveDisallowed": undefined}>; - -export type I8dt2g2hcrgh36 = AnonymousEnum<{ -/** - * Too many calls batched. - */ -"TooManyCalls": undefined}>; - -export type Ia76qmhhg4jvb9 = AnonymousEnum<{ -/** - * Threshold must be 2 or greater. - */ -"MinimumThreshold": undefined, -/** - * Call is already approved by this signatory. - */ -"AlreadyApproved": undefined, -/** - * Call doesn't need any (more) approvals. - */ -"NoApprovalsNeeded": undefined, -/** - * There are too few signatories in the list. - */ -"TooFewSignatories": undefined, -/** - * There are too many signatories in the list. - */ -"TooManySignatories": undefined, -/** - * The signatories were provided out of order; they should be ordered. - */ -"SignatoriesOutOfOrder": undefined, -/** - * The sender was contained in the other signatories; it shouldn't be. - */ -"SenderInSignatories": undefined, -/** - * Multisig operation not found in storage. - */ -"NotFound": undefined, -/** - * Only the account that originally created the multisig is able to cancel it or update - * its deposits. - */ -"NotOwner": undefined, -/** - * No timepoint was given, yet the multisig operation is already underway. - */ -"NoTimepoint": undefined, -/** - * A different timepoint was given to the multisig operation that is underway. - */ -"WrongTimepoint": undefined, -/** - * A timepoint was given, yet no multisig operation is underway. - */ -"UnexpectedTimepoint": undefined, -/** - * The maximum weight information provided was too low. - */ -"MaxWeightTooLow": undefined, -/** - * The data to be stored is already stored. - */ -"AlreadyStored": undefined}>; - -export type Iaug04qjhbli00 = AnonymousEnum<{ -/** - * Sender must be the Sudo account. - */ -"RequireSudo": undefined}>; - -export type Iuvt54ei4cehc = AnonymousEnum<{ -/** - * There are too many proxies registered or too many announcements pending. - */ -"TooMany": undefined, -/** - * Proxy registration not found. - */ -"NotFound": undefined, -/** - * Sender is not a proxy of the account to be proxied. - */ -"NotProxy": undefined, -/** - * A call which is incompatible with the proxy type's filter was attempted. - */ -"Unproxyable": undefined, -/** - * Account is already a proxy. - */ -"Duplicate": undefined, -/** - * Call may not be made by proxy because it may escalate its privileges. - */ -"NoPermission": undefined, -/** - * Announcement, if made at all, was made too recently. - */ -"Unannounced": undefined, -/** - * Cannot add self as proxy. - */ -"NoSelfProxy": undefined}>; - -export type I6ngmnhrhffg3o = AnonymousEnum<{ -/** - * Too many subs-accounts. - */ -"TooManySubAccounts": undefined, -/** - * No alias found for an account. - */ -"NoAlias": undefined, -/** - * Account isn't found. - */ -"NotFound": undefined, -/** - * Account isn't named. - */ -"NotNamed": undefined, -/** - * Empty index. - */ -"EmptyIndex": undefined, -/** - * Fee is changed. - */ -"FeeChanged": undefined, -/** - * No identity found. - */ -"NoIdentity": undefined, -/** - * Sticky judgement. - */ -"StickyJudgement": undefined, -/** - * Judgement given. - */ -"JudgementGiven": undefined, -/** - * Invalid judgement. - */ -"InvalidJudgement": undefined, -/** - * The index is invalid. - */ -"InvalidIndex": undefined, -/** - * The target is invalid. - */ -"InvalidTarget": undefined, -/** - * Maximum amount of registrars reached. Cannot add any more. - */ -"TooManyRegistrars": undefined, -/** - * Account ID is already named. - */ -"AlreadyClaimed": undefined, -/** - * Username has already been reported. - */ -"AlreadyReported": undefined, -/** - * Sender is not a sub-account. - */ -"NotSub": undefined, -/** - * Sub-account isn't owned by sender. - */ -"NotOwned": undefined, -/** - * The provided judgement was for a different identity. - */ -"JudgementForDifferentIdentity": undefined, -/** - * Error that occurs when there is an issue paying for judgement. - */ -"JudgementPaymentFailed": undefined, -/** - * The provided suffix is too long. - */ -"InvalidSuffix": undefined, -/** - * The sender does not have permission to issue a username. - */ -"NotUsernameAuthority": undefined, -/** - * The authority cannot allocate any more usernames. - */ -"NoAllocation": undefined, -/** - * The signature on a username was not valid. - */ -"InvalidSignature": undefined, -/** - * Setting this username requires a signature, but none was provided. - */ -"RequiresSignature": undefined, -/** - * The username does not meet the requirements. - */ -"InvalidUsername": undefined, -/** - * The username is already taken. - */ -"UsernameTaken": undefined, -/** - * The requested username does not exist. - */ -"NoUsername": undefined, -/** - * The reported username was not provided by the system. - */ -"NotSystemProvidedUsername": undefined, -/** - * The username cannot be forcefully removed because it can still be accepted. - */ -"NotExpired": undefined, -/** - * The username cannot be removed because it's still in the grace period. - */ -"TooEarly": undefined, -/** - * The username cannot be removed because it is not unbinding. - */ -"NotUnbinding": undefined, -/** - * The username cannot be unbound because it is already unbinding. - */ -"AlreadyUnbinding": undefined, -/** - * The action cannot be performed because of insufficient privileges (e.g. authority - * trying to unbind a username provided by the system). - */ -"InsufficientPrivileges": undefined, -/** - * The context in which the alias was used is not supported. - */ -"BadContext": undefined, -/** - * No associated request for the judgement received. - */ -"UnexpectedJudgement": undefined, -/** - * The social credential is not supported by the configured identity information provider. - */ -"NotSupported": undefined, -/** - * The person is banned and cannot perform the operation. - */ -"Banned": undefined, -/** - * The person already has a personal identity associated with their alias. - */ -"AlreadyRegistered": undefined, -/** - * The list of judgements ongoing on a personal identity is full. - */ -"JudgementListFull": undefined, -/** - * The username has been reported too recently. - */ -"LastUsernameReportTooRecent": undefined, -/** - * The username has been reported and is undergoing validity judgement. - */ -"UsernameJudgementOngoing": undefined}>; - -export type I4mhu1059shhs0 = AnonymousEnum<{ -/** - * The supplied identifier does not represent a person. - */ -"NotPerson": undefined, -/** - * The given person has no associated key. - */ -"NoKey": undefined, -/** - * The context is not a member of those allowed to have account aliases held. - */ -"InvalidContext": undefined, -/** - * The account is not known. - */ -"InvalidAccount": undefined, -/** - * The account is already in use under another alias. - */ -"AccountInUse": undefined, -/** - * The proof is invalid. - */ -"InvalidProof": undefined, -/** - * The signature is invalid. - */ -"InvalidSignature": undefined, -/** - * There are not yet any members of our personhood set. - */ -"NoMembers": undefined, -/** - * The root cannot be finalized as there are still unpushed members. - */ -"Incomplete": undefined, -/** - * The root is still fresh. - */ -"StillFresh": undefined, -/** - * Too many members have been pushed. - */ -"TooManyMembers": undefined, -/** - * Key already in use by another person. - */ -"KeyAlreadyInUse": undefined, -/** - * The old key was not found when expected. - */ -"KeyNotFound": undefined, -/** - * Could not push member into the ring. - */ -"CouldNotPush": undefined, -/** - * The record is already using this key. - */ -"SameKey": undefined, -/** - * Personal Id was not reserved. - */ -"PersonalIdNotReserved": undefined, -/** - * Personal Id has never been reserved. - */ -"PersonalIdReservationCannotRenew": undefined, -/** - * Personal Id was not reserved or not already recognized. - */ -"PersonalIdNotReservedOrNotRecognized": undefined, -/** - * Ring cannot be merged if it's the top ring. - */ -"InvalidRing": undefined, -/** - * Ring cannot be built while there are suspensions pending. - */ -"SuspensionsPending": undefined, -/** - * Ring cannot be merged if it's not below 1/2 capacity. - */ -"RingAboveMergeThreshold": undefined, -/** - * Suspension indices provided are invalid. - */ -"InvalidSuspensions": undefined, -/** - * An mutating action was queued when there was no mutation session in progress. - */ -"NoMutationSession": undefined, -/** - * An mutating session could not be started. - */ -"CouldNotStartMutationSession": undefined, -/** - * Cannot merge rings while a suspension session is in progress. - */ -"SuspensionSessionInProgress": undefined, -/** - * Call is too late or too early. - */ -"TimeOutOfRange": undefined, -/** - * Alias <-> Account is already set and up to date. - */ -"AliasAccountAlreadySet": undefined, -/** - * Personhood cannot be resumed if it is not suspended. - */ -"NotSuspended": undefined, -/** - * Personhood is suspended. - */ -"Suspended": undefined, -/** - * Invalid state for attempted key migration. - */ -"InvalidKeyMigration": undefined, -/** - * Invalid suspension of a key belonging to a person whose index in the ring has already - * been included in the pending suspensions list. - */ -"KeyAlreadySuspended": undefined, -/** - * The onboarding size must not exceed the maximum ring size. - */ -"InvalidOnboardingSize": undefined, -/** - * The member key is not valid for the crypto. - */ -"InvalidMemberKey": undefined, -/** - * The people collection has already been created. - */ -"PeopleCollectionAlreadyExists": undefined}>; - -export type I940ulmo4j2d84 = AnonymousEnum<{ -/** - * The case does not exist. - */ -"NoSuchCase": undefined, -/** - * The vote does not exist. - */ -"NoSuchVote": undefined, -/** - * The case is not open. - */ -"NotOpen": undefined, -/** - * The case is not ripe. - */ -"NotRipe": undefined, -/** - * The case is not yet done. - */ -"NotDone": undefined, -/** - * The decode of the call failed. Maybe there was a breaking runtime upgrade in between? - */ -"CodecError": undefined, -/** - * The call failed to dispatch. Maybe there was a breaking runtime upgrade in between? - */ -"DispatchError": undefined, -/** - * The case is too recent to be reaped. - */ -"Recent": undefined, -/** - * Not enough credit to payout the rewards. - */ -"NoCredit": undefined, -/** - * No mob credit distribution in place to reward voters. - */ -"NoReward": undefined, -/** - * No points to be converted to mob credit. - */ -"NoPoints": undefined, -/** - * Too many vote claims. - */ -"TooManyClaims": undefined, -/** - * No payout in progress. - */ -"NoPayout": undefined, -/** - * The point and/or credit arithmetic overflows. - */ -"ArithmeticOverflow": undefined, -/** - * Too many payout round schedules. - */ -"TooManySchedules": undefined, -/** - * No payout round schedule found. - */ -"NoSchedule": undefined, -/** - * No vote penalty found. - */ -"NoPenalty": undefined, -/** - * The vote penalty has not expired yet. - */ -"Early": undefined, -/** - * The vote cannot be cast due to a voting penalty in effect. - */ -"UnderPenalty": undefined, -/** - * The open case expiration is disabled due to insufficient active voters. - */ -"CaseExpirationDisabled": undefined}>; - -export type Icouc1975ac8ae = AnonymousEnum<{ -/** - * Account is already applying to make a proof-of-ink. - */ -"InProgress": undefined, -/** - * Account has not been referred. - */ -"NoReferral": undefined, -/** - * The callback context is invalid; this should never happen. - */ -"BadContext": undefined, -/** - * The incoming judgement ID is not what we were expecting for the account. - */ -"UnexpectedJudgement": undefined, -/** - * No arguments were supplied with the judgement. - */ -"NoArgs": undefined, -/** - * The account has not applied to make a proof-of-ink. - */ -"NotApplied": undefined, -/** - * The candidate has not committed to a design. - */ -"NotSelected": undefined, -/** - * The candidate did not prove themselves yet. - */ -"NotProven": undefined, -/** - * The candidate has already started their judgement. - */ -"AlreadyStarted": undefined, -/** - * The personal ID is not in range. - */ -"OutOfRange": undefined, -/** - * The personal ID has already been taken. - */ -"AlreadyTaken": undefined, -/** - * The person has no more referrals left to give. - */ -"NoMoreReferrals": undefined, -/** - * The reroll is too early. - */ -"TooEarly": undefined, -/** - * The referrer's design is not procedural. - */ -"DesignInvalid": undefined, -/** - * The referrer's design is already taken. - */ -"DesignTaken": undefined, -/** - * The referrer doesn't appear to be a person. This should never happen. - */ -"BadParent": undefined, -/** - * The design family doesn't exist. - */ -"BadFamily": undefined, -/** - * The design family is invalid for this choice. - */ -"WrongFamily": undefined, -/** - * The index of the design or variant is beyond the allowed maximum for the family. - */ -"IndexTooBig": undefined, -/** - * The system is busy with too many commitments; try again later. - */ -"Busy": undefined, -/** - * The person has been banned from referring. - */ -"Banned": undefined, -/** - * The candidate has not demonstrated probably through the initial evidence. - */ -"Improbable": undefined, -/** - * The personal identity has already been reserved. - */ -"IdReserved": undefined, -/** - * The personal identity is already taken by a proven person. - */ -"IdUsed": undefined, -/** - * The ticket provided is invalid. - */ -"InvalidTicket": undefined, -/** - * The caller has not provided a referral or invitation ticket. - */ -"NoTicket": undefined, -/** - * The account is not authorized to do this. - */ -"NotAuthorized": undefined, -/** - * The personal identity doesn't exist. - */ -"NotPerson": undefined, -/** - * The candidate is referred. But the operation requires the candidate to not be referred. - */ -"ReferredCandidate": undefined, -/** - * The candidate is not referred. But the operation requires the candidate to be referred. - */ -"NotReferredCandidate": undefined, -/** - * There is no referral reward to register. - */ -"NoRewardToRegister": undefined, -/** - * There is a pending referral reward that must be registered first. - */ -"RewardToRegister": undefined, -/** - * No inviter found. - */ -"NoInviter": undefined, -/** - * Invalid signature. - */ -"InvalidSignature": undefined, -/** - * No invite available. - */ -"NoInvites": undefined, -/** - * Invite is already set. - */ -"AlreadyInvited": undefined, -/** - * The referrer is not a person. - */ -"NoReferrer": undefined, -/** - * The individual is not a person recognized by proof of ink. - */ -"NotPoiPerson": undefined, -/** - * The proof of ownership is invalid. - */ -"InvalidProofOfOwnership": undefined, -/** - * The reimbursement values are invalid. - */ -"InvalidReimbursementValues": undefined}>; - -export type Ib2m42ffigj3u7 = AnonymousEnum<{ -/** - * Game ongoing. - */ -"GameOngoing": undefined, -/** - * No registration phase ongoing. - */ -"NoRegistration": undefined, -/** - * The setup is outdated. - */ -"OutdatedGameSetup": undefined, -/** - * Invalid setup. - */ -"InvalidGameSetup": undefined, -/** - * Invalid report. - */ -"InvalidReport": undefined, -/** - * No game ongoing. - */ -"NoGame": undefined, -/** - * No report phase ongoing. - */ -"NoReporting": undefined, -/** - * Not registered. - */ -"NotRegistered": undefined, -/** - * Player already registered. - */ -"AlreadyRegistered": undefined, -/** - * Report already sent. - */ -"ReportAlreadySent": undefined, -/** - * Operation is not valid yet. - */ -"Early": undefined, -/** - * The operation expect a player account. - */ -"NotKickablePlayer": undefined, -/** - * No archived player found. - */ -"NoArchivedPlayer": undefined, -/** - * No ticket found. - */ -"NoTicket": undefined, -/** - * No invite available. - */ -"NoInvites": undefined, -/** - * Invite is already set. - */ -"AlreadyInvited": undefined, -/** - * Not an account based player, expected an account based player. - */ -"NotAccountPlayer": undefined, -/** - * The player can't use an invite if already playing. - */ -"UseInviteButAlreadyPlaying": undefined, -/** - * The number of existing schedules and new schedules exceeds the configured limit. - */ -"TooManyGameSchedules": undefined, -/** - * The game that was supposed to be removed was not found in scheduled games. - */ -"NoSuchGameScheduled": undefined, -/** - * The statement account signature is invalid. - */ -"InvalidStatementAccountSignature": undefined, -/** - * The statement account is already in used by another player. - */ -"StatementAccountAlreadyInUse": undefined, -/** - * Internal error invalid state. - */ -"InternalErrorInvalidState": undefined, -/** - * The operation cannot be performed in the current game state. - */ -"InvalidGameState": undefined, -/** - * No player found. - */ -"NoPlayer": undefined, -/** - * The player cannot offboard while registered for a game. - */ -"CannotOffboardWhileRegisteredForGame": undefined, -/** - * Invalid state - */ -"InvalidState": undefined}>; - -export type Ib3125ra6v0rq0 = AnonymousEnum<{ -/** - * The calling origin is not a person. - */ -"NotPerson": undefined, -/** - * The person didn't reach personhood. - */ -"HasNotReachedPersonhood": undefined, -/** - * No reward available. - */ -"NoReward": undefined, -/** - * The person has no associated score. - */ -"NoScore": undefined, -/** - * No payout schedule available. - */ -"NoSchedule": undefined, -/** - * Too many payout schedules already registered. - */ -"TooManySchedules": undefined, -/** - * The participant is recognized or has been recognized as a person. - */ -"Recognized": undefined, -/** - * The participant has already cashed out in this era. - */ -"CashOutCooldown": undefined, -/** - * The round is on going or no schedule. - */ -"RoundOnGoingOrNoSchedule": undefined, -/** - * The payout round has not started. - */ -"NoRound": undefined, -/** - * The origin is neither a person nor a signed account. - */ -"BadOriginNotPersonNotSigned": undefined, -/** - * The origin is neither a person nor a signed account nor an account participant. - */ -"BadOriginNotPersonNotSignedNotAccountParticipant": undefined, -/** - * The origin is neither a signed account nor an account participant. - */ -"BadOriginNotSignedNotAccountParticipant": undefined, -/** - * The participant is already participating. - */ -"AlreadyParticipating": undefined, -/** - * The key must be provided. - */ -"KeyMustBeProvided": undefined, -/** - * The key must not be provided. - */ -"KeyMustNotBeProvided": undefined, -/** - * Has reached personhood in the past. - */ -"HasReachedPersonhood": undefined, -/** - * The proof of ownership is invalid. - */ -"InvalidProofOfOwnership": undefined, -/** - * An absence grace tier has a window exceeding the maximum trackable history (8). - */ -"WindowTooLarge": undefined, -/** - * The allowed misses must be strictly less than the window (or both zero). - */ -"AllowedMissesTooLarge": undefined, -/** - * Tiers must be sorted by ascending `population_size_threshold`. - */ -"ScheduleNotSorted": undefined}>; - -export type I4dumqe8b5q0ce = AnonymousEnum<{ -/** - * The personal ID does not belong to a recognized person. - */ -"NotPerson": undefined, -/** - * The personal ID does not belong to a suspended person. - */ -"NotSuspended": undefined, -/** - * The personal ID is not reserved and awaiting recognition. - */ -"NotReserved": undefined, -/** - * The operation does not support this many people. - */ -"TooManyPeople": undefined}>; - -export type I5mjfroiq2c71i = AnonymousEnum<{ -/** - * No attestation allowance. - */ -"NoAttestationAllowance": undefined, -/** - * The signature created by the candidate's account is invalid. - */ -"InvalidAttestationSignature": undefined, -/** - * The signature created by the candidate's ring vrf key is invalid. - */ -"InvalidProofOfOwnership": undefined, -/** - * The candidate is already registered. - */ -"AlreadyRegistered": undefined}>; - -export type Ifu2j71jv4roq4 = AnonymousEnum<{ -/** - * Username does not fit the requirements. - */ -"InvalidUsername": undefined, -/** - * Username is already taken. - */ -"UsernameTaken": undefined, -/** - * Consumer is already registered. - */ -"AlreadyRegistered": undefined, -/** - * Provided proof of ownership is invalid. - */ -"InvalidProofOfOwnership": undefined, -/** - * Person is not registered as a consumer. - */ -"NotRegistered": undefined, -/** - * Consumer is not a full person. - */ -"NotFullPerson": undefined, -/** - * Attempted to update person authorization too early. - */ -"TouchNotReady": undefined, -/** - * Reservation is not active. - */ -"NoReservation": undefined, -/** - * The linked lite identity is not the active holder of the reservation. - */ -"NotReservationHolder": undefined, -/** - * The username in the reservation request is already taken. - */ -"UsernameReservationTaken": undefined, -/** - * The reservation has not expired. - */ -"ReservationFresh": undefined, -/** - * There is no lite consumer to be linked. - */ -"NoLinkedIdentity": undefined, -/** - * The lite consumer is already linked to a full person consumer. - */ -"AlreadyLinked": undefined, -/** - * The requested slot number is out of range. - */ -"InvalidSlot": undefined, -/** - * The account already has an allowance in the slot. - */ -"AccountAlreadyHasAllowance": undefined, -/** - * The person's authorization has not expired yet. - */ -"PersonAuthNotExpired": undefined, -/** - * The person has already been demoted. - */ -"AlreadyDemoted": undefined, -/** - * Queue for this username is full. - */ -"QueueFull": undefined, -/** - * Account is not in the queue for this username. - */ -"NotInQueue": undefined, -/** - * Account already has a reservation for another username. - */ -"AlreadyHasReservation": undefined}>; - -export type I81gtj1f3ennke = AnonymousEnum<{ -/** - * The requested chunk index doesn't exist. - */ -"ChunkNotFound": undefined, -/** - * The provided chunk data couldn't be decoded. - */ -"InvalidChunks": undefined, -/** - * The start index isn't strictly less than the end index. - */ -"InvalidChunkRange": undefined}>; - -export type Ibul94l5l6rt51 = AnonymousEnum<{ -/** - * The supplied identifier does not represent a member. - */ -"NotMember": undefined, -/** - * Ring has no root. - */ -"NoRoot": undefined, -/** - * The proof is invalid. - */ -"InvalidProof": undefined, -/** - * The root cannot be finalized as there are still unpushed members. - */ -"Incomplete": undefined, -/** - * The root is still fresh. - */ -"StillFresh": undefined, -/** - * Too many members have been pushed. - */ -"TooManyMembers": undefined, -/** - * Key already in use by another member. - */ -"KeyAlreadyInUse": undefined, -/** - * The old key was not found when expected. - */ -"KeyNotFound": undefined, -/** - * Could not push member into the ring. - */ -"CouldNotPush": undefined, -/** - * Ring cannot be merged if it's the top ring. - */ -"InvalidRing": undefined, -/** - * Ring cannot be built while there are suspensions pending. - */ -"SuspensionsPending": undefined, -/** - * Ring cannot be merged if it's not below 1/2 capacity. - */ -"RingAboveMergeThreshold": undefined, -/** - * Suspension indices provided are invalid. - */ -"InvalidSuspensions": undefined, -/** - * A mutating action was queued when there was no removal session in progress. - */ -"NoRemovalSession": undefined, -/** - * A removal session could not be started. - */ -"CouldNotStartRemovalSession": undefined, -/** - * Cannot merge rings while a removal session is in progress. - */ -"RemovalSessionInProgress": undefined, -/** - * Invalid suspension of a key belonging to a member whose index in the ring has already - * been included in the pending suspensions list. - */ -"KeyAlreadySuspended": undefined, -/** - * The onboarding size must not exceed the maximum ring size. - */ -"InvalidOnboardingSize": undefined, -/** - * The member key is not valid for the crypto. - */ -"InvalidMemberKey": undefined, -/** - * The collection does not exist. - */ -"CollectionNotFound": undefined, -/** - * The collection already exists. - */ -"CollectionAlreadyExists": undefined, -/** - * Too many collections for this owner. - */ -"TooManyCollections": undefined, -/** - * Flexible collections must use the MaxFlexibleRingExponent ring size. - */ -"InvalidRingSizeForFlexible": undefined, -/** - * The ring exponent is not supported. - */ -"InvalidRingExponent": undefined, -/** - * Insufficient members in the queue to onboard. - */ -"PrematureOnboarding": undefined, -/** - * The collection is marked for deletion and cannot be modified. - */ -"CollectionMarkedForDeletion": undefined, -/** - * The caller is not the owner of the collection. - */ -"NotCollectionOwner": undefined}>; - -export type I49gv5a5vl0e9 = AnonymousEnum<{"MemberKeyAlreadyUsed": undefined, "InvalidMemberKey": undefined, "InternalError": undefined, "RecyclerAlreadyUnloaded": undefined, "InvalidConsolidation": undefined, "ConsolidationTooBig": undefined, "CoinValueTooBig": undefined, "CoinValueTooSmall": undefined, "CoinValueIsLessThanFee": undefined, "CoinValueOutOfBound": undefined, "InvalidAliasProof": undefined, "NoUnloadingRecycler": undefined, "ProofAndAliasMismatch": undefined, "NothingToBuild": undefined, "TooManyRings": undefined, "AddressAlreadyHasCoin": undefined, "InvalidProofOfOwnership": undefined, "EmptyInputs": undefined, -/** - * The fee recycler in the origin does not match the call's recycler. - */ -"RecyclerMismatch": undefined, -/** - * The total unloaded amount is less than the fee. - */ -"InsufficientUnloadForFee": undefined, -/** - * The first alias was not pre-marked by extension (required for FromOutput fee). - */ -"AliasNotPremarked": undefined, -/** - * The recycler revision does not match (recycler may not exist or has been rebuilt). - */ -"InvalidRecyclerRevision": undefined, "InvalidSplit": undefined, -/** - * This operation requires a fresh coin (`age == 0`). - */ -"FreshCoinRequired": undefined, "CannotConvertNativeToAsset": undefined}>; - -export type I78qr63roofevv = AnonymousEnum<{ -/** - * No active airdrop event. - */ -"NoActiveEvent": undefined, -/** - * The origin is not a person. - */ -"NotAPerson": undefined, -/** - * The alias is already registered. - */ -"AliasAlreadyRegistered": undefined, -/** - * The event registration time is invalid. - */ -"InvalidEventRegistrationTime": undefined, -/** - * Participant ID overflow. - */ -"ParticipantIdOverflow": undefined, -/** - * The participant has no prize to claim for the event. - */ -"NoPrizeToClaimForEvent": undefined, -/** - * The event doesn't exist. - */ -"NoEventFound": undefined, -/** - * The schedule is full. - */ -"ScheduleFull": undefined, -/** - * The prize must be more or equal to the minimum balance. - */ -"PrizeMustBeMoreOrEqualToMinBalance": undefined}>; - -export type Iaaqq5jevtahm8 = AnonymousEnum<{ -/** - * The operation cannot complete since some MBMs are ongoing. - */ -"Ongoing": undefined}>; - -export type TokenError = Enum<{"FundsUnavailable": undefined, "OnlyProvider": undefined, "BelowMinimum": undefined, "CannotCreate": undefined, "UnknownAsset": undefined, "Frozen": undefined, "Unsupported": undefined, "CannotCreateHold": undefined, "NotExpendable": undefined, "Blocked": undefined}>; -export const TokenError = _Enum as unknown as GetEnum; - -export type ArithmeticError = Enum<{"Underflow": undefined, "Overflow": undefined, "DivisionByZero": undefined}>; -export const ArithmeticError = _Enum as unknown as GetEnum; - -export type TransactionalError = Enum<{"LimitReached": undefined, "NoLayer": undefined}>; -export const TransactionalError = _Enum as unknown as GetEnum; - -export type Icbccs0ug47ilf = {"account": SS58String}; - -export type I855j4i3kr8ko1 = {"sender": SS58String, "hash": SizedHex<32>}; - -export type Ibgl04rn6nbfm6 = {"code_hash": SizedHex<32>, "check_version": boolean}; - -export type I3sflsrdvuq35i = {"code_hash": SizedHex<32>, "error": Anonymize}; - -export type Icbsekf57miplo = AnonymousEnum<{ -/** - * The validation function has been scheduled to apply. - */ -"ValidationFunctionStored": undefined, -/** - * The validation function was applied as of the contained relay chain block number. - */ -"ValidationFunctionApplied": Anonymize, -/** - * The relay-chain aborted the upgrade process. - */ -"ValidationFunctionDiscarded": undefined, -/** - * Some downward messages have been received and will be processed. - */ -"DownwardMessagesReceived": Anonymize, -/** - * Downward messages were processed using the given weight. - */ -"DownwardMessagesProcessed": Anonymize, -/** - * An upward message was sent to the relay chain. - */ -"UpwardMessageSent": Anonymize}>; - -export type Idd7hd99u0ho0n = {"relay_chain_block_num": number}; - -export type Iafscmv8tjf0ou = {"count": number}; - -export type I100l07kaehdlp = {"weight_used": Anonymize, "dmq_head": SizedHex<32>}; - -export type I6gnbnvip5vvdi = {"message_hash"?: Anonymize}; - -export type I4s6vifaf8k998 = (SizedHex<32>) | undefined; - -export type I3q1cn45sp6et9 = AnonymousEnum<{ -/** - * An account was created with some free balance. - */ -"Endowed": Anonymize, -/** - * An account was removed whose balance was non-zero but below ExistentialDeposit, - * resulting in an outright loss. - */ -"DustLost": Anonymize, -/** - * Transfer succeeded. - */ -"Transfer": Anonymize, -/** - * A balance was set by root. - */ -"BalanceSet": Anonymize, -/** - * Some balance was reserved (moved from free to reserved). - */ -"Reserved": Anonymize, -/** - * Some balance was unreserved (moved from reserved to free). - */ -"Unreserved": Anonymize, -/** - * Some balance was moved from the reserve of the first account to the second account. - * Final argument indicates the destination balance type. - */ -"ReserveRepatriated": Anonymize, -/** - * Some amount was deposited (e.g. for transaction fees). - */ -"Deposit": Anonymize, -/** - * Some amount was withdrawn from the account (e.g. for transaction fees). - */ -"Withdraw": Anonymize, -/** - * Some amount was removed from the account (e.g. for misbehavior). - */ -"Slashed": Anonymize, -/** - * Some amount was minted into an account. - */ -"Minted": Anonymize, -/** - * Some credit was balanced and added to the TotalIssuance. - */ -"MintedCredit": Anonymize, -/** - * Some amount was burned from an account. - */ -"Burned": Anonymize, -/** - * Some debt has been dropped from the Total Issuance. - */ -"BurnedDebt": Anonymize, -/** - * Some amount was suspended from an account (it can be restored later). - */ -"Suspended": Anonymize, -/** - * Some amount was restored into an account. - */ -"Restored": Anonymize, -/** - * An account was upgraded. - */ -"Upgraded": Anonymize, -/** - * Total issuance was increased by `amount`, creating a credit to be balanced. - */ -"Issued": Anonymize, -/** - * Total issuance was decreased by `amount`, creating a debt to be balanced. - */ -"Rescinded": Anonymize, -/** - * Some balance was locked. - */ -"Locked": Anonymize, -/** - * Some balance was unlocked. - */ -"Unlocked": Anonymize, -/** - * Some balance was frozen. - */ -"Frozen": Anonymize, -/** - * Some balance was thawed. - */ -"Thawed": Anonymize, -/** - * The `TotalIssuance` was forcefully changed. - */ -"TotalIssuanceForced": Anonymize, -/** - * Some balance was placed on hold. - */ -"Held": Anonymize, -/** - * Held balance was burned from an account. - */ -"BurnedHeld": Anonymize, -/** - * A transfer of `amount` on hold from `source` to `dest` was initiated. - */ -"TransferOnHold": Anonymize, -/** - * The `transferred` balance is placed on hold at the `dest` account. - */ -"TransferAndHold": Anonymize, -/** - * Some balance was released from hold. - */ -"Released": Anonymize, -/** - * An unexpected/defensive event was triggered. - */ -"Unexpected": Anonymize}>; - -export type Icv68aq8841478 = {"account": SS58String, "free_balance": bigint}; - -export type Ic262ibdoec56a = {"account": SS58String, "amount": bigint}; - -export type Iflcfm9b6nlmdd = {"from": SS58String, "to": SS58String, "amount": bigint}; - -export type Ijrsf4mnp3eka = {"who": SS58String, "free": bigint}; - -export type Id5fm4p8lj5qgi = {"who": SS58String, "amount": bigint}; - -export type I8tjvj9uq4b7hi = {"from": SS58String, "to": SS58String, "amount": bigint, "destination_status": BalanceStatus}; - -export type BalanceStatus = Enum<{"Free": undefined, "Reserved": undefined}>; -export const BalanceStatus = _Enum as unknown as GetEnum; - -export type I3qt1hgg4djhgb = {"amount": bigint}; - -export type I4cbvqmqadhrea = {"who": SS58String}; - -export type I4fooe9dun9o0t = {"old": bigint, "new": bigint}; - -export type I8vi83jdnuv7ad = {"reason": Anonymize, "who": SS58String, "amount": bigint}; - -export type Ic1romdot9iad7 = AnonymousEnum<{"Session": Enum<{"Keys": undefined}>, "PolkadotXcm": Enum<{"AuthorizeAlias": undefined}>, "MobRule": Enum<{"Payout": undefined, "Credit": undefined}>, "ProofOfInk": Enum<{"ProofOfInk": undefined}>, "Game": Enum<{"PlayGame": undefined}>, "Score": Enum<{"Payout": undefined, "Credit": undefined}>, "Coinage": Enum<{"Wrapped": undefined}>, "Airdrop": Enum<{"Airdrop": undefined}>}>; - -export type I8td84k1e6i7l7 = {"reason": Anonymize, "source": SS58String, "dest": SS58String, "amount": bigint}; - -export type Ibthrs8djrs4ha = {"reason": Anonymize, "source": SS58String, "dest": SS58String, "transferred": bigint}; - -export type Iph9c4rn81ub2 = AnonymousEnum<{"BalanceUpdated": undefined, "FailedToMutateAccount": undefined}>; - -export type TransactionPaymentEvent = Enum<{ -/** - * A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, - * has been paid by `who`. - */ -"TransactionFeePaid": Anonymize}>; -export const TransactionPaymentEvent = _Enum as unknown as GetEnum; - -export type Ier2cke86dqbr2 = {"who": SS58String, "actual_fee": bigint, "tip": bigint}; - -export type Ie86pdva84devd = AnonymousEnum<{ -/** - * A transaction fee was skipped. - */ -"FeeSkipped": Anonymize}>; - -export type Ibsq380ld6eu40 = {"origin": Anonymize}; - -export type Idg7v9f2eslg1v = AnonymousEnum<{"system": Enum<{"Root": undefined, "Signed": SS58String, "None": undefined, "Authorized": undefined}>, "PolkadotXcm": Enum<{"Xcm": Anonymize, "Response": Anonymize}>, "CumulusXcm": Enum<{"Relay": undefined, "SiblingParachain": number}>, "People": Enum<{"PersonalIdentity": bigint, "PersonalAlias": Anonymize}>, "ProofOfInk": Enum<{"AuthorizedApplyWithSig": SS58String, "ReferredCandidate": SS58String, "InvitedCandidate": SS58String}>, "Game": Enum<{"Invited": SS58String}>, "Score": Enum<{"AccountParticipant": SS58String}>, "PeopleLite": Enum<{"LitePerson": SS58String}>, "Members": Enum<{"MemberAlias": [SizedHex<32>, Anonymize]}>, "Coinage": Enum<{"Coin": {"coin_id": SS58String, "coin": Anonymize}, "UnloadToken": {"alias_proofs": Anonymize, "proven_msg": SizedHex<32>, "fee": Enum<{"Prepaid": undefined, "FromOutput": {"fee_recycler_value": number, "fee_recycler_index": number}}>}}>}>; - -export type If9iqq7i64mur8 = {"parents": number, "interior": XcmV5Junctions}; - -export type XcmV5Junctions = Enum<{"Here": undefined, "X1": XcmV5Junction, "X2": FixedSizeArray<2, XcmV5Junction>, "X3": FixedSizeArray<3, XcmV5Junction>, "X4": FixedSizeArray<4, XcmV5Junction>, "X5": FixedSizeArray<5, XcmV5Junction>, "X6": FixedSizeArray<6, XcmV5Junction>, "X7": FixedSizeArray<7, XcmV5Junction>, "X8": FixedSizeArray<8, XcmV5Junction>}>; -export const XcmV5Junctions = _Enum as unknown as GetEnum; - -export type XcmV5Junction = Enum<{"Parachain": number, "AccountId32": {"network"?: Anonymize, "id": SizedHex<32>}, "AccountIndex64": {"network"?: Anonymize, "index": bigint}, "AccountKey20": {"network"?: Anonymize, "key": SizedHex<20>}, "PalletInstance": number, "GeneralIndex": bigint, "GeneralKey": Anonymize, "OnlyChild": undefined, "Plurality": Anonymize, "GlobalConsensus": XcmV5NetworkId}>; -export const XcmV5Junction = _Enum as unknown as GetEnum; - -export type I97pd2rst02a7r = (XcmV5NetworkId) | undefined; - -export type XcmV5NetworkId = Enum<{"ByGenesis": SizedHex<32>, "ByFork": Anonymize, "Polkadot": undefined, "Kusama": undefined, "Ethereum": Anonymize, "BitcoinCore": undefined, "BitcoinCash": undefined, "PolkadotBulletin": undefined}>; -export const XcmV5NetworkId = _Enum as unknown as GetEnum; - -export type I15vf5oinmcgps = {"block_number": bigint, "block_hash": SizedHex<32>}; - -export type I623eo8t3jrbeo = {"chain_id": bigint}; - -export type I15lht6t53odo4 = {"length": number, "data": SizedHex<32>}; - -export type I518fbtnclg1oc = {"id": XcmV3JunctionBodyId, "part": XcmV2JunctionBodyPart}; - -export type XcmV3JunctionBodyId = Enum<{"Unit": undefined, "Moniker": SizedHex<4>, "Index": number, "Executive": undefined, "Technical": undefined, "Legislative": undefined, "Judicial": undefined, "Defense": undefined, "Administration": undefined, "Treasury": undefined}>; -export const XcmV3JunctionBodyId = _Enum as unknown as GetEnum; - -export type XcmV2JunctionBodyPart = Enum<{"Voice": undefined, "Members": Anonymize, "Fraction": {"nom": number, "denom": number}, "AtLeastProportion": {"nom": number, "denom": number}, "MoreThanProportion": {"nom": number, "denom": number}}>; -export const XcmV2JunctionBodyPart = _Enum as unknown as GetEnum; - -export type I6vki5ip88t309 = {"revision": number, "ring": number, "ca": Anonymize}; - -export type Icq9999ubti4jr = {"alias": SizedHex<32>, "context": SizedHex<32>}; - -export type I6sjgjftjavcbd = {"value": number, "age": number}; - -export type I496t4k2gj40co = Array>; - -export type I2isv113mtlrp7 = AnonymousEnum<{ -/** - * Usage for an entity is cleaned. - */ -"UsageCleaned": Anonymize}>; - -export type Iea5hvin03frku = {"entity": Anonymize}; - -export type I8arc778cv9pqq = AnonymousEnum<{"PersonalAlias": SizedHex<32>, "PersonalIdentity": bigint, "ReferredCandidate": SS58String, "AccountParticipant": SS58String, "InvitedCandidate": SS58String, "LitePerson": SS58String}>; - -export type I7r4u2ebvv7606 = AnonymousEnum<{ -/** - * Some asset class was created. - */ -"Created": Anonymize, -/** - * Some assets were issued. - */ -"Issued": Anonymize, -/** - * Some assets were transferred. - */ -"Transferred": Anonymize, -/** - * Some assets were destroyed. - */ -"Burned": Anonymize, -/** - * The management team changed. - */ -"TeamChanged": Anonymize, -/** - * The owner changed. - */ -"OwnerChanged": Anonymize, -/** - * Some account `who` was frozen. - */ -"Frozen": Anonymize, -/** - * Some account `who` was thawed. - */ -"Thawed": Anonymize, -/** - * Some asset `asset_id` was frozen. - */ -"AssetFrozen": Anonymize, -/** - * Some asset `asset_id` was thawed. - */ -"AssetThawed": Anonymize, -/** - * Accounts were destroyed for given asset. - */ -"AccountsDestroyed": Anonymize, -/** - * Approvals were destroyed for given asset. - */ -"ApprovalsDestroyed": Anonymize, -/** - * An asset class is in the process of being destroyed. - */ -"DestructionStarted": Anonymize, -/** - * An asset class was destroyed. - */ -"Destroyed": Anonymize, -/** - * Some asset class was force-created. - */ -"ForceCreated": Anonymize, -/** - * New metadata has been set for an asset. - */ -"MetadataSet": Anonymize, -/** - * Metadata has been cleared for an asset. - */ -"MetadataCleared": Anonymize, -/** - * (Additional) funds have been approved for transfer to a destination account. - */ -"ApprovedTransfer": Anonymize, -/** - * An approval for account `delegate` was cancelled by `owner`. - */ -"ApprovalCancelled": Anonymize, -/** - * An `amount` was transferred in its entirety from `owner` to `destination` by - * the approved `delegate`. - */ -"TransferredApproved": Anonymize, -/** - * An asset has had its attributes changed by the `Force` origin. - */ -"AssetStatusChanged": Anonymize, -/** - * The min_balance of an asset has been updated by the asset owner. - */ -"AssetMinBalanceChanged": Anonymize, -/** - * Some account `who` was created with a deposit from `depositor`. - */ -"Touched": Anonymize, -/** - * Some account `who` was blocked. - */ -"Blocked": Anonymize, -/** - * Some assets were deposited (e.g. for transaction fees). - */ -"Deposited": Anonymize, -/** - * Some assets were withdrawn from the account (e.g. for transaction fees). - */ -"Withdrawn": Anonymize, -/** - * Reserve information was set or updated for `asset_id`. - */ -"ReservesUpdated": Anonymize, -/** - * Reserve information was removed for `asset_id`. - */ -"ReservesRemoved": Anonymize}>; - -export type Icqe266pmnr25o = {"asset_id": Anonymize, "creator": SS58String, "owner": SS58String}; - -export type I5hoiph0lqphp = {"asset_id": Anonymize, "owner": SS58String, "amount": bigint}; - -export type I5k7oropl9ofc7 = {"asset_id": Anonymize, "from": SS58String, "to": SS58String, "amount": bigint}; - -export type I48vagp1omigob = {"asset_id": Anonymize, "owner": SS58String, "balance": bigint}; - -export type Ib5tst4ppem1g6 = {"asset_id": Anonymize, "issuer": SS58String, "admin": SS58String, "freezer": SS58String}; - -export type Ibn64edsrg3737 = {"asset_id": Anonymize, "owner": SS58String}; - -export type I83r9d02dh47j9 = {"asset_id": Anonymize, "who": SS58String}; - -export type I22bm4d7re21j9 = {"asset_id": Anonymize}; - -export type I3jnhifvaeuama = {"asset_id": Anonymize, "accounts_destroyed": number, "accounts_remaining": number}; - -export type I8n1gia0lo42ok = {"asset_id": Anonymize, "approvals_destroyed": number, "approvals_remaining": number}; - -export type I6gb0o7lqjfdjq = {"asset_id": Anonymize, "name": Uint8Array, "symbol": Uint8Array, "decimals": number, "is_frozen": boolean}; - -export type Idh36v6iegkmpq = {"asset_id": Anonymize, "source": SS58String, "delegate": SS58String, "amount": bigint}; - -export type I27hnueutmchbe = {"asset_id": Anonymize, "owner": SS58String, "delegate": SS58String}; - -export type Iectm2em66uhao = {"asset_id": Anonymize, "owner": SS58String, "delegate": SS58String, "destination": SS58String, "amount": bigint}; - -export type I7q57goff3j72h = {"asset_id": Anonymize, "new_min_balance": bigint}; - -export type Ibe49veu9i9nro = {"asset_id": Anonymize, "who": SS58String, "depositor": SS58String}; - -export type I1rnkmiu7usb82 = {"asset_id": Anonymize, "who": SS58String, "amount": bigint}; - -export type Iadvnek4gbu68j = {"asset_id": Anonymize, "reserves": Anonymize}; - -export type If2801grpltbp8 = Array<{"reserve": Anonymize, "teleportable": boolean}>; - -export type I7jvog6mrt6b2r = AnonymousEnum<{ -/** - * `who`s balance on hold was increased by `amount`. - */ -"Held": Anonymize, -/** - * `who`s balance on hold was decreased by `amount`. - */ -"Released": Anonymize, -/** - * `who`s balance on hold was burned by `amount`. - */ -"Burned": Anonymize}>; - -export type Id7k54q1ita2p5 = {"who": SS58String, "asset_id": Anonymize, "reason": Anonymize, "amount": bigint}; - -export type I51qnoi21es512 = AnonymousEnum<{"AssetRateCreated": Anonymize, "AssetRateRemoved": Anonymize, "AssetRateUpdated": Anonymize}>; - -export type I72jcvr86rnvv8 = {"asset_kind": Anonymize, "rate": bigint}; - -export type I90c919drss29e = {"asset_kind": Anonymize}; - -export type I5k7edfft48vsq = {"asset_kind": Anonymize, "old": bigint, "new": bigint}; - -export type Ie598chmfqlqa = AnonymousEnum<{ -/** - * A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, - * has been paid by `who` in an asset `asset_id`. - */ -"AssetTxFeePaid": Anonymize}>; - -export type Iaeqj2ebnvkjqe = {"who": SS58String, "actual_fee": bigint, "tip": bigint, "asset_id"?: Anonymize}; - -export type I4pai6qnfk426l = (Anonymize) | undefined; - -export type I4srakrmf0fspo = AnonymousEnum<{ -/** - * New Invulnerables were set. - */ -"NewInvulnerables": Anonymize, -/** - * A new Invulnerable was added. - */ -"InvulnerableAdded": Anonymize, -/** - * An Invulnerable was removed. - */ -"InvulnerableRemoved": Anonymize, -/** - * The number of desired candidates was set. - */ -"NewDesiredCandidates": Anonymize, -/** - * The candidacy bond was set. - */ -"NewCandidacyBond": Anonymize, -/** - * A new candidate joined. - */ -"CandidateAdded": Anonymize, -/** - * Bond of a candidate updated. - */ -"CandidateBondUpdated": Anonymize, -/** - * A candidate was removed. - */ -"CandidateRemoved": Anonymize, -/** - * An account was replaced in the candidate list by another one. - */ -"CandidateReplaced": Anonymize, -/** - * An account was unable to be added to the Invulnerables because they did not have keys - * registered. Other Invulnerables may have been set. - */ -"InvalidInvulnerableSkipped": Anonymize}>; - -export type I39t01nnod9109 = {"invulnerables": Anonymize}; - -export type Ia2lhg7l2hilo3 = Array; - -export type I6v8sm60vvkmk7 = {"account_id": SS58String}; - -export type I1qmtmbe5so8r3 = {"desired_candidates": number}; - -export type Ih99m6ehpcar7 = {"bond_amount": bigint}; - -export type Idgorhsbgdq2ap = {"account_id": SS58String, "deposit": bigint}; - -export type I9ubb2kqevnu6t = {"old": SS58String, "new": SS58String, "deposit": bigint}; - -export type I6ue0ck5fc3u44 = AnonymousEnum<{ -/** - * New session has happened. Note that the argument is the session index, not the - * block number as the type might suggest. - */ -"NewSession": Anonymize, -/** - * The `NewSession` event in the current block also implies a new validator set to be - * queued. - */ -"NewQueued": undefined, -/** - * Validator has been disabled. - */ -"ValidatorDisabled": Anonymize, -/** - * Validator has been re-enabled. - */ -"ValidatorReenabled": Anonymize}>; - -export type I2hq50pu2kdjpo = {"session_index": number}; - -export type I9acqruh7322g2 = {"validator": SS58String}; - -export type Idsqc7mhp6nnle = AnonymousEnum<{ -/** - * An HRMP message was sent to a sibling parachain. - */ -"XcmpMessageSent": Anonymize}>; - -export type I137t1cld92pod = {"message_hash": SizedHex<32>}; - -export type If95hivmqmkiku = AnonymousEnum<{ -/** - * Execution of an XCM message was attempted. - */ -"Attempted": Anonymize, -/** - * An XCM message was sent. - */ -"Sent": Anonymize, -/** - * An XCM message failed to send. - */ -"SendFailed": Anonymize, -/** - * An XCM message failed to process. - */ -"ProcessXcmError": Anonymize, -/** - * Query response received which does not match a registered query. This may be because a - * matching query was never registered, it may be because it is a duplicate response, or - * because the query timed out. - */ -"UnexpectedResponse": Anonymize, -/** - * Query response has been received and is ready for taking with `take_response`. There is - * no registered notification call. - */ -"ResponseReady": Anonymize, -/** - * Query response has been received and query is removed. The registered notification has - * been dispatched and executed successfully. - */ -"Notified": Anonymize, -/** - * Query response has been received and query is removed. The registered notification - * could not be dispatched because the dispatch weight is greater than the maximum weight - * originally budgeted by this runtime for the query result. - */ -"NotifyOverweight": Anonymize, -/** - * Query response has been received and query is removed. There was a general error with - * dispatching the notification call. - */ -"NotifyDispatchError": Anonymize, -/** - * Query response has been received and query is removed. The dispatch was unable to be - * decoded into a `Call`; this might be due to dispatch function having a signature which - * is not `(origin, QueryId, Response)`. - */ -"NotifyDecodeFailed": Anonymize, -/** - * Expected query response has been received but the origin location of the response does - * not match that expected. The query remains registered for a later, valid, response to - * be received and acted upon. - */ -"InvalidResponder": Anonymize, -/** - * Expected query response has been received but the expected origin location placed in - * storage by this runtime previously cannot be decoded. The query remains registered. - * - * This is unexpected (since a location placed in storage in a previously executing - * runtime should be readable prior to query timeout) and dangerous since the possibly - * valid response will be dropped. Manual governance intervention is probably going to be - * needed. - */ -"InvalidResponderVersion": Anonymize, -/** - * Received query response has been read and removed. - */ -"ResponseTaken": Anonymize, -/** - * Some assets have been placed in an asset trap. - */ -"AssetsTrapped": Anonymize, -/** - * An XCM version change notification message has been attempted to be sent. - * - * The cost of sending it (borne by the chain) is included. - */ -"VersionChangeNotified": Anonymize, -/** - * The supported version of a location has been changed. This might be through an - * automatic notification or a manual intervention. - */ -"SupportedVersionChanged": Anonymize, -/** - * A given location which had a version change subscription was dropped owing to an error - * sending the notification to it. - */ -"NotifyTargetSendFail": Anonymize, -/** - * A given location which had a version change subscription was dropped owing to an error - * migrating the location to our new XCM format. - */ -"NotifyTargetMigrationFail": Anonymize, -/** - * Expected query response has been received but the expected querier location placed in - * storage by this runtime previously cannot be decoded. The query remains registered. - * - * This is unexpected (since a location placed in storage in a previously executing - * runtime should be readable prior to query timeout) and dangerous since the possibly - * valid response will be dropped. Manual governance intervention is probably going to be - * needed. - */ -"InvalidQuerierVersion": Anonymize, -/** - * Expected query response has been received but the querier location of the response does - * not match the expected. The query remains registered for a later, valid, response to - * be received and acted upon. - */ -"InvalidQuerier": Anonymize, -/** - * A remote has requested XCM version change notification from us and we have honored it. - * A version information message is sent to them and its cost is included. - */ -"VersionNotifyStarted": Anonymize, -/** - * We have requested that a remote chain send us XCM version change notifications. - */ -"VersionNotifyRequested": Anonymize, -/** - * We have requested that a remote chain stops sending us XCM version change - * notifications. - */ -"VersionNotifyUnrequested": Anonymize, -/** - * Fees were paid from a location for an operation (often for using `SendXcm`). - */ -"FeesPaid": Anonymize, -/** - * Some assets have been claimed from an asset trap - */ -"AssetsClaimed": Anonymize, -/** - * A XCM version migration finished. - */ -"VersionMigrationFinished": Anonymize, -/** - * An `aliaser` location was authorized by `target` to alias it, authorization valid until - * `expiry` block number. - */ -"AliasAuthorized": Anonymize, -/** - * `target` removed alias authorization for `aliaser`. - */ -"AliasAuthorizationRemoved": Anonymize, -/** - * `target` removed all alias authorizations. - */ -"AliasesAuthorizationsRemoved": Anonymize}>; - -export type I61d51nv4cou88 = {"outcome": Anonymize}; - -export type Ieqhmksji3pmv5 = AnonymousEnum<{"Complete": {"used": Anonymize}, "Incomplete": {"used": Anonymize, "error": Anonymize}, "Error": Anonymize}>; - -export type Ieiju48dn66cuh = {"index": number, "error": Anonymize}; - -export type Id56rgs0bdb7gl = AnonymousEnum<{"Overflow": undefined, "Unimplemented": undefined, "UntrustedReserveLocation": undefined, "UntrustedTeleportLocation": undefined, "LocationFull": undefined, "LocationNotInvertible": undefined, "BadOrigin": undefined, "InvalidLocation": undefined, "AssetNotFound": undefined, "FailedToTransactAsset": undefined, "NotWithdrawable": undefined, "LocationCannotHold": undefined, "ExceedsMaxMessageSize": undefined, "DestinationUnsupported": undefined, "Transport": undefined, "Unroutable": undefined, "UnknownClaim": undefined, "FailedToDecode": undefined, "MaxWeightInvalid": undefined, "NotHoldingFees": undefined, "TooExpensive": undefined, "Trap": bigint, "ExpectationFalse": undefined, "PalletNotFound": undefined, "NameMismatch": undefined, "VersionIncompatible": undefined, "HoldingWouldOverflow": undefined, "ExportError": undefined, "ReanchorFailed": undefined, "NoDeal": undefined, "FeesNotMet": undefined, "LockError": undefined, "NoPermission": undefined, "Unanchored": undefined, "NotDepositable": undefined, "TooManyAssets": undefined, "UnhandledXcmVersion": undefined, "WeightLimitReached": Anonymize, "Barrier": undefined, "WeightNotComputable": undefined, "ExceedsStackLimit": undefined}>; - -export type If8u5kl4h8070m = {"origin": Anonymize, "destination": Anonymize, "message": Anonymize, "message_id": SizedHex<32>}; - -export type Ict03eedr8de9s = Array; - -export type XcmV5Instruction = Enum<{"WithdrawAsset": Anonymize, "ReserveAssetDeposited": Anonymize, "ReceiveTeleportedAsset": Anonymize, "QueryResponse": {"query_id": bigint, "response": Anonymize, "max_weight": Anonymize, "querier"?: Anonymize}, "TransferAsset": {"assets": Anonymize, "beneficiary": Anonymize}, "TransferReserveAsset": {"assets": Anonymize, "dest": Anonymize, "xcm": Anonymize}, "Transact": {"origin_kind": XcmV2OriginKind, "fallback_max_weight"?: Anonymize, "call": Uint8Array}, "HrmpNewChannelOpenRequest": Anonymize, "HrmpChannelAccepted": Anonymize, "HrmpChannelClosing": Anonymize, "ClearOrigin": undefined, "DescendOrigin": XcmV5Junctions, "ReportError": Anonymize, "DepositAsset": {"assets": XcmV5AssetFilter, "beneficiary": Anonymize}, "DepositReserveAsset": {"assets": XcmV5AssetFilter, "dest": Anonymize, "xcm": Anonymize}, "ExchangeAsset": {"give": XcmV5AssetFilter, "want": Anonymize, "maximal": boolean}, "InitiateReserveWithdraw": {"assets": XcmV5AssetFilter, "reserve": Anonymize, "xcm": Anonymize}, "InitiateTeleport": {"assets": XcmV5AssetFilter, "dest": Anonymize, "xcm": Anonymize}, "ReportHolding": {"response_info": Anonymize, "assets": XcmV5AssetFilter}, "BuyExecution": {"fees": Anonymize, "weight_limit": XcmV3WeightLimit}, "RefundSurplus": undefined, "SetErrorHandler": Anonymize, "SetAppendix": Anonymize, "ClearError": undefined, "ClaimAsset": {"assets": Anonymize, "ticket": Anonymize}, "Trap": bigint, "SubscribeVersion": Anonymize, "UnsubscribeVersion": undefined, "BurnAsset": Anonymize, "ExpectAsset": Anonymize, "ExpectOrigin"?: Anonymize, "ExpectError"?: Anonymize, "ExpectTransactStatus": XcmV3MaybeErrorCode, "QueryPallet": {"module_name": Uint8Array, "response_info": Anonymize}, "ExpectPallet": Anonymize, "ReportTransactStatus": Anonymize, "ClearTransactStatus": undefined, "UniversalOrigin": XcmV5Junction, "ExportMessage": {"network": XcmV5NetworkId, "destination": XcmV5Junctions, "xcm": Anonymize}, "LockAsset": {"asset": Anonymize, "unlocker": Anonymize}, "UnlockAsset": {"asset": Anonymize, "target": Anonymize}, "NoteUnlockable": {"asset": Anonymize, "owner": Anonymize}, "RequestUnlock": {"asset": Anonymize, "locker": Anonymize}, "SetFeesMode": Anonymize, "SetTopic": SizedHex<32>, "ClearTopic": undefined, "AliasOrigin": Anonymize, "UnpaidExecution": {"weight_limit": XcmV3WeightLimit, "check_origin"?: Anonymize}, "PayFees": {"asset": Anonymize}, "InitiateTransfer": {"destination": Anonymize, "remote_fees"?: (Anonymize) | undefined, "preserve_origin": boolean, "assets": Array>, "remote_xcm": Anonymize}, "ExecuteWithOrigin": {"descendant_origin"?: (XcmV5Junctions) | undefined, "xcm": Anonymize}, "SetHints": {"hints": Array}}>>}}>; -export const XcmV5Instruction = _Enum as unknown as GetEnum; - -export type I4npjalvhmfuj = Array>; - -export type Iffh1nc5e1mod6 = {"id": Anonymize, "fun": XcmV3MultiassetFungibility}; - -export type XcmV3MultiassetFungibility = Enum<{"Fungible": bigint, "NonFungible": XcmV3MultiassetAssetInstance}>; -export const XcmV3MultiassetFungibility = _Enum as unknown as GetEnum; - -export type XcmV3MultiassetAssetInstance = Enum<{"Undefined": undefined, "Index": bigint, "Array4": SizedHex<4>, "Array8": SizedHex<8>, "Array16": SizedHex<16>, "Array32": SizedHex<32>}>; -export const XcmV3MultiassetAssetInstance = _Enum as unknown as GetEnum; - -export type I7vucpgm2c6959 = AnonymousEnum<{"Null": undefined, "Assets": Anonymize, "ExecutionResult"?: Anonymize, "Version": number, "PalletsInfo": Anonymize, "DispatchResult": XcmV3MaybeErrorCode}>; - -export type I3l6ejee750fv1 = ([number, Anonymize]) | undefined; - -export type I599u7h20b52at = Array<{"index": number, "name": Uint8Array, "module_name": Uint8Array, "major": number, "minor": number, "patch": number}>; - -export type XcmV3MaybeErrorCode = Enum<{"Success": undefined, "Error": Uint8Array, "TruncatedError": Uint8Array}>; -export const XcmV3MaybeErrorCode = _Enum as unknown as GetEnum; - -export type XcmV2OriginKind = Enum<{"Native": undefined, "SovereignAccount": undefined, "Superuser": undefined, "Xcm": undefined}>; -export const XcmV2OriginKind = _Enum as unknown as GetEnum; - -export type Iasb8k6ash5mjn = (Anonymize) | undefined; - -export type I5uhhrjqfuo4e5 = {"sender": number, "max_message_size": number, "max_capacity": number}; - -export type Ifij4jam0o7sub = {"recipient": number}; - -export type Ieeb4svd9i8fji = {"initiator": number, "sender": number, "recipient": number}; - -export type I6vsmh07hrp1rc = {"destination": Anonymize, "query_id": bigint, "max_weight": Anonymize}; - -export type XcmV5AssetFilter = Enum<{"Definite": Anonymize, "Wild": XcmV5WildAsset}>; -export const XcmV5AssetFilter = _Enum as unknown as GetEnum; - -export type XcmV5WildAsset = Enum<{"All": undefined, "AllOf": {"id": Anonymize, "fun": XcmV2MultiassetWildFungibility}, "AllCounted": number, "AllOfCounted": {"id": Anonymize, "fun": XcmV2MultiassetWildFungibility, "count": number}}>; -export const XcmV5WildAsset = _Enum as unknown as GetEnum; - -export type XcmV2MultiassetWildFungibility = Enum<{"Fungible": undefined, "NonFungible": undefined}>; -export const XcmV2MultiassetWildFungibility = _Enum as unknown as GetEnum; - -export type XcmV3WeightLimit = Enum<{"Unlimited": undefined, "Limited": Anonymize}>; -export const XcmV3WeightLimit = _Enum as unknown as GetEnum; - -export type Ieprdqqu7ildvr = {"query_id": bigint, "max_response_weight": Anonymize}; - -export type Id7mf37dkpgfjs = {"index": number, "name": Uint8Array, "module_name": Uint8Array, "crate_major": number, "min_crate_minor": number}; - -export type I4nae9rsql8fa7 = {"jit_withdraw": boolean}; - -export type Ifhmc9e7vpeeig = AnonymousEnum<{"Teleport": XcmV5AssetFilter, "ReserveDeposit": XcmV5AssetFilter, "ReserveWithdraw": XcmV5AssetFilter}>; - -export type Ibmuil6p3vl83l = {"origin": Anonymize, "destination": Anonymize, "error": Enum<{"NotApplicable": undefined, "Transport": undefined, "Unroutable": undefined, "DestinationUnsupported": undefined, "ExceedsMaxMessageSize": undefined, "MissingArgument": undefined, "Fees": undefined}>, "message_id": SizedHex<32>}; - -export type I7lul91g50ae87 = {"origin": Anonymize, "error": Anonymize, "message_id": SizedHex<32>}; - -export type Icl7nl1rfeog3i = {"origin": Anonymize, "query_id": bigint}; - -export type Iasr6pj6shs0fl = {"query_id": bigint, "response": Anonymize}; - -export type I2uqmls7kcdnii = {"query_id": bigint, "pallet_index": number, "call_index": number}; - -export type Idg69klialbkb8 = {"query_id": bigint, "pallet_index": number, "call_index": number, "actual_weight": Anonymize, "max_budgeted_weight": Anonymize}; - -export type I7r6b7145022pp = {"origin": Anonymize, "query_id": bigint, "expected_location"?: Anonymize}; - -export type I30pg328m00nr3 = {"query_id": bigint}; - -export type Icmrn7bogp28cs = {"hash": SizedHex<32>, "origin": Anonymize, "assets": XcmVersionedAssets}; - -export type XcmVersionedAssets = Enum<{"V3": Anonymize, "V4": Anonymize, "V5": Anonymize}>; -export const XcmVersionedAssets = _Enum as unknown as GetEnum; - -export type Iai6dhqiq3bach = Array>; - -export type Idcm24504c8bkk = {"id": XcmV3MultiassetAssetId, "fun": XcmV3MultiassetFungibility}; - -export type XcmV3MultiassetAssetId = Enum<{"Concrete": Anonymize, "Abstract": SizedHex<32>}>; -export const XcmV3MultiassetAssetId = _Enum as unknown as GetEnum; - -export type I4c0s5cioidn76 = {"parents": number, "interior": XcmV3Junctions}; - -export type XcmV3Junctions = Enum<{"Here": undefined, "X1": XcmV3Junction, "X2": FixedSizeArray<2, XcmV3Junction>, "X3": FixedSizeArray<3, XcmV3Junction>, "X4": FixedSizeArray<4, XcmV3Junction>, "X5": FixedSizeArray<5, XcmV3Junction>, "X6": FixedSizeArray<6, XcmV3Junction>, "X7": FixedSizeArray<7, XcmV3Junction>, "X8": FixedSizeArray<8, XcmV3Junction>}>; -export const XcmV3Junctions = _Enum as unknown as GetEnum; - -export type XcmV3Junction = Enum<{"Parachain": number, "AccountId32": {"network"?: Anonymize, "id": SizedHex<32>}, "AccountIndex64": {"network"?: Anonymize, "index": bigint}, "AccountKey20": {"network"?: Anonymize, "key": SizedHex<20>}, "PalletInstance": number, "GeneralIndex": bigint, "GeneralKey": Anonymize, "OnlyChild": undefined, "Plurality": Anonymize, "GlobalConsensus": XcmV3JunctionNetworkId}>; -export const XcmV3Junction = _Enum as unknown as GetEnum; - -export type Idcq3vns9tgp5p = (XcmV3JunctionNetworkId) | undefined; - -export type XcmV3JunctionNetworkId = Enum<{"ByGenesis": SizedHex<32>, "ByFork": Anonymize, "Polkadot": undefined, "Kusama": undefined, "Westend": undefined, "Rococo": undefined, "Wococo": undefined, "Ethereum": Anonymize, "BitcoinCore": undefined, "BitcoinCash": undefined, "PolkadotBulletin": undefined}>; -export const XcmV3JunctionNetworkId = _Enum as unknown as GetEnum; - -export type I50mli3hb64f9b = Array>; - -export type Ia5l7mu5a6v49o = {"id": Anonymize, "fun": XcmV3MultiassetFungibility}; - -export type I7m9b5plj4h5ot = {"destination": Anonymize, "result": number, "cost": Anonymize, "message_id": SizedHex<32>}; - -export type I9kt8c221c83ln = {"location": Anonymize, "version": number}; - -export type I9onhk772nfs4f = {"location": Anonymize, "query_id": bigint, "error": Anonymize}; - -export type I3l6bnksrmt56r = {"location": XcmVersionedLocation, "query_id": bigint}; - -export type XcmVersionedLocation = Enum<{"V3": Anonymize, "V4": Anonymize, "V5": Anonymize}>; -export const XcmVersionedLocation = _Enum as unknown as GetEnum; - -export type Idh09k0l2pmdcg = {"origin": Anonymize, "query_id": bigint, "expected_querier": Anonymize, "maybe_actual_querier"?: Anonymize}; - -export type I7uoiphbm0tj4r = {"destination": Anonymize, "cost": Anonymize, "message_id": SizedHex<32>}; - -export type I512p1n7qt24l8 = {"paying": Anonymize, "fees": Anonymize}; - -export type I6s1nbislhk619 = {"version": number}; - -export type I3gghqnh2mj0is = {"aliaser": Anonymize, "target": Anonymize, "expiry"?: Anonymize}; - -export type I35p85j063s0il = (bigint) | undefined; - -export type I6iv852roh6t3h = {"aliaser": Anonymize, "target": Anonymize}; - -export type I9oc2o6itbiopq = {"target": Anonymize}; - -export type I5uv57c3fffoi9 = AnonymousEnum<{ -/** - * Downward message is invalid XCM. - * \[ id \] - */ -"InvalidFormat": SizedHex<32>, -/** - * Downward message is unsupported version of XCM. - * \[ id \] - */ -"UnsupportedVersion": SizedHex<32>, -/** - * Downward message executed with the given outcome. - * \[ id, outcome \] - */ -"ExecutedDownward": Anonymize}>; - -export type Ibslgga81p36aa = [SizedHex<32>, Anonymize]; - -export type I2kosejppk3jon = AnonymousEnum<{ -/** - * Message discarded due to an error in the `MessageProcessor` (usually a format error). - */ -"ProcessingFailed": Anonymize, -/** - * Message is processed. - */ -"Processed": Anonymize, -/** - * Message placed in overweight queue. - */ -"OverweightEnqueued": Anonymize, -/** - * This page was reaped. - */ -"PageReaped": Anonymize}>; - -export type I1rvj4ubaplho0 = { -/** - * The `blake2_256` hash of the message. - */ -"id": SizedHex<32>, -/** - * The queue of the message. - */ -"origin": Anonymize, -/** - * The error that occurred. - * - * This error is pretty opaque. More fine-grained errors need to be emitted as events - * by the `MessageProcessor`. - */ -"error": Enum<{"BadFormat": undefined, "Corrupt": undefined, "Unsupported": undefined, "Overweight": Anonymize, "Yield": undefined, "StackLimitReached": undefined}>}; - -export type Iejeo53sea6n4q = AnonymousEnum<{"Here": undefined, "Parent": undefined, "Sibling": number}>; - -export type Ia3uu7lqcc1q1i = { -/** - * The `blake2_256` hash of the message. - */ -"id": SizedHex<32>, -/** - * The queue of the message. - */ -"origin": Anonymize, -/** - * How much weight was used to process the message. - */ -"weight_used": Anonymize, -/** - * Whether the message was processed. - * - * Note that this does not mean that the underlying `MessageProcessor` was internally - * successful. It *solely* means that the MQ pallet will treat this as a success - * condition and discard the message. Any internal error needs to be emitted as events - * by the `MessageProcessor`. - */ -"success": boolean}; - -export type I7crucfnonitkn = { -/** - * The `blake2_256` hash of the message. - */ -"id": SizedHex<32>, -/** - * The queue of the message. - */ -"origin": Anonymize, -/** - * The page of the message. - */ -"page_index": number, -/** - * The index of the message within the page. - */ -"message_index": number}; - -export type I7tmrp94r9sq4n = { -/** - * The queue of the page. - */ -"origin": Anonymize, -/** - * The index of the page. - */ -"index": number}; - -export type Idul53tft5reqc = AnonymousEnum<{ -/** - * Batch of dispatches did not complete fully. Index of first failing dispatch given, as - * well as the error. - */ -"BatchInterrupted": Anonymize, -/** - * Batch of dispatches completed fully with no error. - */ -"BatchCompleted": undefined, -/** - * Batch of dispatches completed but has errors. - */ -"BatchCompletedWithErrors": undefined, -/** - * A single item within a Batch of dispatches has completed with no error. - */ -"ItemCompleted": undefined, -/** - * A single item within a Batch of dispatches has completed with error. - */ -"ItemFailed": Anonymize, -/** - * A call was dispatched. - */ -"DispatchedAs": Anonymize, -/** - * Main call was dispatched. - */ -"IfElseMainSuccess": undefined, -/** - * The fallback call was dispatched. - */ -"IfElseFallbackCalled": Anonymize}>; - -export type I79le71ktscd50 = {"index": number, "error": Anonymize}; - -export type I70ckf4r79j73 = {"error": Anonymize}; - -export type Id9b74nn3tchdg = {"result": Anonymize}; - -export type I42nm2din5rq69 = ResultPayload>; - -export type Ian9q7t9erse0r = {"main_error": Anonymize}; - -export type Id871khc9is0ck = AnonymousEnum<{ -/** - * A new multisig operation has begun. - */ -"NewMultisig": Anonymize, -/** - * A multisig operation has been approved by someone. - */ -"MultisigApproval": Anonymize, -/** - * A multisig operation has been executed. - */ -"MultisigExecuted": Anonymize, -/** - * A multisig operation has been cancelled. - */ -"MultisigCancelled": Anonymize, -/** - * The deposit for a multisig operation has been updated/poked. - */ -"DepositPoked": Anonymize}>; - -export type Iep27ialq4a7o7 = {"approving": SS58String, "multisig": SS58String, "call_hash": SizedHex<32>}; - -export type Iasu5jvoqr43mv = {"approving": SS58String, "timepoint": Anonymize, "multisig": SS58String, "call_hash": SizedHex<32>}; - -export type Itvprrpb0nm3o = {"height": number, "index": number}; - -export type I1ujdbplbo9mv = {"approving": SS58String, "timepoint": Anonymize, "multisig": SS58String, "call_hash": SizedHex<32>, "result": Anonymize}; - -export type I5qolde99acmd1 = {"cancelling": SS58String, "timepoint": Anonymize, "multisig": SS58String, "call_hash": SizedHex<32>}; - -export type I8gtde5abn1g9a = {"who": SS58String, "call_hash": SizedHex<32>, "old_deposit": bigint, "new_deposit": bigint}; - -export type I7vk784dpkt0sh = AnonymousEnum<{ -/** - * A sudo call just took place. - */ -"Sudid": Anonymize, -/** - * The sudo key has been updated. - */ -"KeyChanged": Anonymize, -/** - * The key was permanently removed. - */ -"KeyRemoved": undefined, -/** - * A [sudo_as](Pallet::sudo_as) call just took place. - */ -"SudoAsDone": Anonymize}>; - -export type I2006ti8jidts7 = { -/** - * The result of the call made by the sudo user. - */ -"sudo_result": Anonymize}; - -export type I5rtkmhm2dng4u = { -/** - * The old sudo key (if one was previously set). - */ -"old"?: Anonymize, -/** - * The new sudo key (if one was set). - */ -"new": SS58String}; - -export type Ihfphjolmsqq1 = (SS58String) | undefined; - -export type I81tnet08pjf8d = AnonymousEnum<{ -/** - * A proxy was executed correctly, with the given. - */ -"ProxyExecuted": Anonymize, -/** - * A pure account has been created by new proxy with given - * disambiguation index and proxy type. - */ -"PureCreated": Anonymize, -/** - * A pure proxy was killed by its spawner. - */ -"PureKilled": Anonymize, -/** - * An announcement was placed to make a call in the future. - */ -"Announced": Anonymize, -/** - * A proxy was added. - */ -"ProxyAdded": Anonymize, -/** - * A proxy was removed. - */ -"ProxyRemoved": Anonymize, -/** - * A deposit stored for proxies or announcements was poked / updated. - */ -"DepositPoked": Anonymize}>; - -export type Iquobi9ukq7tb = {"pure": SS58String, "who": SS58String, "proxy_type": Anonymize, "disambiguation_index": number, "at": number, "extrinsic_index": number}; - -export type Ieuemnllefri8h = AnonymousEnum<{"Any": undefined, "NonTransfer": undefined, "CancelProxy": undefined, "Identity": undefined, "IdentityJudgement": undefined, "Collator": undefined}>; - -export type I4mj21qcksiuf3 = {"pure": SS58String, "spawner": SS58String, "proxy_type": Anonymize, "disambiguation_index": number}; - -export type I2ur0oeqg495j8 = {"real": SS58String, "proxy": SS58String, "call_hash": SizedHex<32>}; - -export type I8v2su1f60qoae = {"delegator": SS58String, "delegatee": SS58String, "proxy_type": Anonymize, "delay": number}; - -export type I1bhd210c3phjj = {"who": SS58String, "kind": Enum<{"Proxies": undefined, "Announcements": undefined}>, "old_deposit": bigint, "new_deposit": bigint}; - -export type Idkb7nir4hamvl = AnonymousEnum<{ -/** - * A name was set or reset (which will remove all judgements). - */ -"IdentitySet": Anonymize, -/** - * A name was cleared, and the given balance returned. - */ -"IdentityCleared": Anonymize, -/** - * A name was removed and the given balance slashed. - */ -"IdentityKilled": Anonymize, -/** - * A judgement was asked from a registrar. - */ -"JudgementRequested": Anonymize, -/** - * A judgement request was retracted. - */ -"JudgementUnrequested": Anonymize, -/** - * A judgement was given by a registrar. - */ -"JudgementGiven": Anonymize, -/** - * A registrar was added. - */ -"RegistrarAdded": Anonymize, -/** - * A sub-identity was added to an identity and the deposit paid. - */ -"SubIdentityAdded": Anonymize, -/** - * An account's sub-identities were set (in bulk). - */ -"SubIdentitiesSet": Anonymize, -/** - * A given sub-account's associated name was changed by its super-identity. - */ -"SubIdentityRenamed": Anonymize, -/** - * A sub-identity was removed from an identity and the deposit freed. - */ -"SubIdentityRemoved": Anonymize, -/** - * A sub-identity was cleared, and the given deposit repatriated from the - * main identity account to the sub-identity account. - */ -"SubIdentityRevoked": Anonymize, -/** - * A username authority was added. - */ -"AuthorityAdded": Anonymize, -/** - * A username authority was removed. - */ -"AuthorityRemoved": Anonymize, -/** - * A username was set for `who`. - */ -"UsernameSet": Anonymize, -/** - * A username was queued, but `who` must accept it prior to `expiration`. - */ -"UsernameQueued": Anonymize, -/** - * A queued username passed its expiration without being claimed and was removed. - */ -"PreapprovalExpired": Anonymize, -/** - * A username was set as a primary and can be looked up from `who`. - */ -"PrimaryUsernameSet": Anonymize, -/** - * A dangling username (as in, a username corresponding to an account that has removed its - * identity) has been removed. - */ -"DanglingUsernameRemoved": Anonymize, -/** - * A username has been unbound. - */ -"UsernameUnbound": Anonymize, -/** - * A username has been removed. - */ -"UsernameRemoved": Anonymize, -/** - * A username has been killed. - */ -"UsernameKilled": Anonymize, -/** - * A username has been reported. - */ -"UsernameReported": Anonymize, -/** - * An identity for a person has been set. - */ -"PersonalIdentitySet": Anonymize, -/** - * Evidence for a credential has beed submitted by a person. - */ -"EvidenceSubmitted": Anonymize, -/** - * A credential was accepted for a person. - */ -"CredentialAccepted": Anonymize, -/** - * A credential was rejected for a person. - */ -"CredentialRejected": Anonymize, -/** - * Person was banned for sending contemptuous evidence. - */ -"PersonBanned": Anonymize, -/** - * A personal identity was cleared. - */ -"PersonalIdentityCleared": Anonymize, -/** - * A reported username was judged valid. - */ -"ReportedUsernameJudgedValid": Anonymize, -/** - * A reported username was judged invalid. - */ -"ReportedUsernameJudgedInvalid": Anonymize, -/** - * The judgment regarding a reported username was unclear or uncertain. - */ -"ReportedUsernameWeakOrUnclearJudgement": Anonymize}>; - -export type Iep1lmt6q3s6r3 = {"who": SS58String, "deposit": bigint}; - -export type I1fac16213rie2 = {"who": SS58String, "registrar_index": number}; - -export type Ifjt77oc391o43 = {"target": SS58String, "registrar_index": number}; - -export type Itvt1jsipv0lc = {"registrar_index": number}; - -export type Ick3mveut33f44 = {"sub": SS58String, "main": SS58String, "deposit": bigint}; - -export type I719lqkkbtikbl = {"main": SS58String, "number_of_subs": number, "new_deposit": bigint}; - -export type Ie4intrc3n8jfu = {"sub": SS58String, "main": SS58String}; - -export type I2rg5btjrsqec0 = {"authority": SS58String}; - -export type Ibdqerrooruuq9 = {"who": SS58String, "username": Uint8Array}; - -export type I8u2ba9jeiu6q0 = {"who": SS58String, "username": Uint8Array, "expiration": number}; - -export type I7ieadb293k6b4 = {"whose": SS58String}; - -export type Ie5l999tf7t2te = {"username": Uint8Array}; - -export type I86ooiomatht8n = {"reporter": SS58String, "username": Uint8Array}; - -export type I7v1eea9s3tjf6 = {"alias": SizedHex<32>, "account": SS58String, "username": Uint8Array}; - -export type Ifcon2ngg4leli = {"alias": SizedHex<32>}; - -export type I7luomlm0cts8l = {"username": Uint8Array, "judgement": Anonymize}; - -export type Id32895epm7otq = AnonymousEnum<{"Truth": Enum<{"True": undefined, "False": undefined}>, "Contempt": undefined}>; - -export type I8gfuga4as8uuv = AnonymousEnum<{ -/** - * An individual has had their personhood recognised and indexed. - */ -"PersonhoodRecognized": Anonymize, -/** - * An individual has had their personhood recognised again and indexed. - */ -"PersonOnboarding": Anonymize, -/** - * A call was dispatched under an alias. - */ -"AliasDispatched": Anonymize, -/** - * An alias-to-account mapping was set or updated. - */ -"AliasAccountSet": Anonymize, -/** - * An alias-to-account mapping was removed. - */ -"AliasAccountUnset": Anonymize, -/** - * A personal ID-to-account mapping was set or updated. - */ -"PersonalIdAccountSet": Anonymize, -/** - * A personal ID-to-account mapping was removed. - */ -"PersonalIdAccountUnset": Anonymize, -/** - * The people collection was created. - */ -"CollectionCreated": undefined, -/** - * Personhood was forcefully recognized by root. - */ -"ForcePersonhoodRecognized": Anonymize}>; - -export type I53pb13fh9bdtb = {"who": bigint, "key": SizedHex<32>}; - -export type I5eoknm3d4b0hp = {"alias": Anonymize, "account": SS58String}; - -export type I1267r4okm030g = {"who": bigint, "account": SS58String}; - -export type I6tuqjmsr5ahcq = {"people": Anonymize}; - -export type Ic5m5lp1oioo8r = Array>; - -export type I1d3k986qbgsge = AnonymousEnum<{ -/** - * A case has been created. - */ -"CaseCreated": Anonymize, -/** - * A callback was triggered from mob-rule. - */ -"Callback": Anonymize, -/** - * There was a codec error when trying to execute the callback. - */ -"CallbackError": undefined, -/** - * The case has been closed with the following result. - */ -"CaseClosed": Anonymize, -/** - * A vote has been placed on a case. - */ -"Voted": Anonymize, -/** - * A vote has been cleaned. - */ -"VoteCleaned": Anonymize, -/** - * A case has been removed. - */ -"CaseRemoved": Anonymize, -/** - * A case has been intervened. - */ -"CaseIntervened": Anonymize, -/** - * Credits for votes have been claimed. - */ -"VotesClaimed": Anonymize, -/** - * A reward that has been paid out. - */ -"RewardPayout": Anonymize, -/** - * A new payout round has been started. - */ -"PayoutRoundStarted": Anonymize, -/** - * Payout rounds have been scheduled. - */ -"PayoutRoundsScheduled": Anonymize, -/** - * A payout schedule has been removed. - */ -"PayoutScheduleRemoved": Anonymize, -/** - * Credit has been claimed from the payout distribution. - */ -"CreditClaimed": Anonymize, -/** - * Stale voting points have been cleaned. - */ -"PointsCleaned": Anonymize, -/** - * A case has been touched (re-evaluated). - */ -"CaseTouched": Anonymize, -/** - * A voting penalty has been cleared. - */ -"VotingPenaltyCleared": Anonymize}>; - -export type Id1vp19i5a7adv = { -/** - * The case index that was created. - */ -"case_index": number}; - -export type Ibi23t489qjaej = { -/** - * The case index that was closed. - */ -"case_index": number, -/** - * The verdict of the closed case. - */ -"verdict": Anonymize}; - -export type I7v53d8lg25u6e = { -/** - * The case voted on. - */ -"case_index": number, -/** - * The alias that voted. - */ -"voter": SizedHex<32>, -/** - * The opinion of the voter. - */ -"opinion": Anonymize}; - -export type Ic01glfot2319 = { -/** - * The case voted on. - */ -"case_index": number, -/** - * The alias that voted. - */ -"voter": SizedHex<32>}; - -export type Ie732hi40q3bng = { -/** - * The alias that voted. - */ -"voter": SizedHex<32>, -/** - * The case that has been intervened. - */ -"case_indices": Anonymize}; - -export type Icgljjb6j82uhn = Array; - -export type I4auq2rk2vmnof = { -/** - * The alias that earned a reward. - */ -"voter": SizedHex<32>, -/** - * The destination account for the payout. - */ -"destination": SS58String, -/** - * The payout amount that was transferred. - */ -"amount": bigint}; - -export type I36d2sa03ne4gv = { -/** - * The index of the new payout round. - */ -"round": number, -/** - * The initial balance allocated for the round. - */ -"initial_balance": bigint, -/** - * Total accumulated points claimable in this round. - */ -"total_points": bigint}; - -export type I1c6o7t4005obp = { -/** - * The amount of funds per round. - */ -"amount": bigint, -/** - * The number of rounds scheduled. - */ -"count": number, -/** - * The minimum period (in blocks) between rounds. - */ -"period": number}; - -export type I666bl2fqjkejo = { -/** - * The index of the removed schedule. - */ -"index": number}; - -export type Id0mmcnagcakpt = { -/** - * The alias of the voter who claimed. - */ -"voter": SizedHex<32>, -/** - * The amount of credit claimed. - */ -"amount": bigint}; - -export type I3sgg3ifcuhgsi = { -/** - * The round index from which points were removed. - */ -"round": number, -/** - * The alias whose points were removed. - */ -"voter": SizedHex<32>}; - -export type I3fn79iu085nho = { -/** - * The case that was touched. - */ -"case_index": number, -/** - * Whether the case was ripened as a result. - */ -"ripened": boolean}; - -export type I1qepegjhn0439 = { -/** - * The alias whose penalty was cleared. - */ -"who": SizedHex<32>}; - -export type I2p1svr0ek31rn = AnonymousEnum<{ -/** - * Candidate applied for verification. - */ -"CandidateApplied": Anonymize, -/** - * Candidate opened a judicial case for their verification evidence. - */ -"JudgementRequested": Anonymize, -/** - * Oracle has provided the judgement for a judicial case. - */ -"JudgementProvided": Anonymize, -/** - * A candidate has been granted a free retry attempt after a failure to verify their - * evidence. - */ -"RetryGranted": Anonymize, -/** - * Register an account as a person. - */ -"PersonRegistered": Anonymize, -/** - * Person referred an account. - */ -"CandidateReferred": Anonymize, -/** - * Entropy for a candidate changed after expiry. - */ -"Rerolled": Anonymize, -/** - * Candidate committed to an ink design. - */ -"DesignCommitted": Anonymize, -/** - * Storage fully allocated for a committed design. - */ -"FullyAllocated": Anonymize, -/** - * Candidate removed after timeout. - */ -"TimedOut": Anonymize, -/** - * Uncommitted candidate removed. - */ -"FlakedOut": Anonymize, -/** - * Referral ticket created by storing the public key on chain. - */ -"TicketReferred": Anonymize, -/** - * Referral ticket removed by removing the public key from chain storage. - */ -"TicketCancelled": Anonymize, -/** - * Candidate applied using a referral ticket. - */ -"TicketApplied": Anonymize, -/** - * Design family added. - */ -"FamilyAdded": Anonymize, -/** - * All invites have been removed for the inviter. - */ -"AllInvitesRemoved": Anonymize, -/** - * Some invites have been removed for the inviter, some are remaining. - */ -"SomeInvitesRemoved": Anonymize, -/** - * Candidate applied using an invitation. - */ -"InvitedCandidateApplied": Anonymize, -/** - * A referrer's reward voucher has been registered. - */ -"ReferralVoucherRegistered": Anonymize, -/** - * Invites have been granted to an account. - */ -"InvitesGranted": Anonymize, -/** - * An invite ticket has been set. - */ -"InviteTicketSet": Anonymize, -/** - * An invite ticket has been cancelled. - */ -"InviteTicketCancelled": Anonymize, -/** - * The pallet configuration has been updated. - */ -"ConfigurationSet": Anonymize}>; - -export type I3g1h0napekm89 = {"account_id": SS58String, "judgement": Anonymize}; - -export type Ib4r095rdf5mqu = {"account_id": SS58String, "failures": number}; - -export type I816g8dafh3n9m = {"account_id": SS58String, "personal_id": bigint}; - -export type I5rguq5hs7ae5g = {"referrer": bigint, "referred": SS58String}; - -export type Id0n15ml7mlce1 = {"account_id": SS58String, "reserved_id": bigint}; - -export type I95dvhl27mlrti = {"referrer": bigint, "ticket": SS58String}; - -export type I6mojmjujt2q9u = {"account_id": SS58String, "referrer": bigint}; - -export type Idnsos6tvi9tt6 = {"index": number, "kind": Anonymize, "id": SizedHex<32>}; - -export type Iflispc7h2jput = AnonymousEnum<{"Designed": Anonymize, "ProceduralAccount": undefined, "ProceduralPersonal": undefined, "Procedural": {"range": number}}>; - -export type I3j43dj5855fif = {"inviter": SS58String}; - -export type I9m7e67l1rvair = {"who": SS58String, "inviter": SS58String}; - -export type I2fsu027d9jn8p = {"referrer": bigint}; - -export type Ibl1gaa0rn2c67 = {"account": SS58String, "count": number}; - -export type I1858d79avs8nu = {"inviter": SS58String, "ticket": SS58String}; - -export type I4s48t49obgv40 = {"config": Anonymize}; - -export type I63ubv9qb76gl3 = {"reroll_timeout": number, "fasttrack_count": number, "maximum": number, "full_alloc_len": bigint, "full_alloc_count": number, "init_alloc_len": bigint, "init_alloc_count": number, "timeout": number}; - -export type I13i6a99rj37i4 = AnonymousEnum<{ -/** - * A new game is starting. - */ -"NewGame": Anonymize, -/** - * The game and its post-process has ended. - */ -"GameEnded": Anonymize, -/** - * A player signed up for the game. - */ -"SignedUp": Anonymize, -/** - * A player submitted their report. - */ -"ReportSubmitted": Anonymize, -/** - * A player offboarded from the game. - */ -"Offboarded": Anonymize, -/** - * An archived player was kicked out. - */ -"KickedOut": Anonymize, -/** - * Invites were granted to an account. - */ -"InvitesGranted": Anonymize, -/** - * An invite ticket was set. - */ -"InviteTicketSet": Anonymize, -/** - * An invite ticket was cancelled. - */ -"InviteTicketCancelled": Anonymize, -/** - * Games were scheduled. - */ -"GamesScheduled": Anonymize, -/** - * A scheduled game was removed. - */ -"ScheduledGameRemoved": Anonymize, -/** - * Statement store usage removed for the account. - */ -"StmtUsageRemoved": Anonymize, -/** - * All invites have been removed for the inviter. - */ -"AllInvitesRemoved": Anonymize, -/** - * Some invites have been removed for the inviter, some are remaining. - */ -"SomeInvitesRemoved": Anonymize}>; - -export type I4dge44jia159s = {"registration_ends": number, "game_date": number, "report_ends": number}; - -export type I7uvflbq4g7rn = {"who": Anonymize}; - -export type Iavh3dqjok18o8 = AnonymousEnum<{"Account": SS58String, "Person": SizedHex<32>}>; - -export type Icpl0grufrj09l = {"who": Anonymize, "game_index": number}; - -export type Ibi26id9j1t520 = {"player": Anonymize}; - -export type Ic9lb0ksm6bqp9 = {"game_play_time": number}; - -export type If82rqk1ehcsot = AnonymousEnum<{ -/** - * A person has claimed credit. - */ -"CreditClaimed": Anonymize, -/** - * Personhood was recognized for an account. - */ -"PersonhoodRecognized": Anonymize, -/** - * Payout rounds have been scheduled. - */ -"PayoutRoundsScheduled": Anonymize, -/** - * A payout schedule has been removed. - */ -"PayoutScheduleRemoved": Anonymize, -/** - * A round has been transitioned. - */ -"RoundTransitioned": Anonymize, -/** - * A payout round has been operated (credit distributed to participants). - */ -"PayoutRoundOperated": Anonymize, -/** - * A participant has cashed out score for points. - */ -"CashedOut": Anonymize}>; - -export type Ieitag1fl7hkds = { -/** - * The person who claimed credit. - */ -"who": Anonymize, -/** - * Destination account that received the transfer. - */ -"destination": SS58String, -/** - * Amount transferred. - */ -"amount": bigint}; - -export type Ie060ubkeme5vs = { -/** - * The account whose personhood was recognized. - */ -"who": Anonymize, -/** - * Whether this was resuming from suspension or first-time recognition. - */ -"resumed": boolean}; - -export type Icpk5dvoekngbe = { -/** - * The amount per round. - */ -"amount": bigint, -/** - * The number of rounds. - */ -"count": number, -/** - * The duration per round in blocks. - */ -"duration": number}; - -export type Iepoo00jurbs3c = { -/** - * The round index that was transitioned. - */ -"round_index": number}; - -export type Inci5ucc4j6it = AnonymousEnum<{ -/** - * A number of IDs was reserved. - */ -"IdsReserved": Anonymize, -/** - * An ID was renewed. - */ -"IdRenewed": Anonymize, -/** - * A reserved ID was removed. - */ -"IdUnreserved": Anonymize, -/** - * Register multiple people. - */ -"PeopleRegistered": Anonymize, -/** - * Suspend a number of people. - */ -"PeopleSuspended": Anonymize, -/** - * Someone's personhood was resumed. - */ -"PersonhoodResumed": Anonymize, -/** - * The pallet enabled suspensions. - */ -"SuspensionsStarted": undefined, -/** - * The pallet disabled suspensions. - */ -"SuspensionsEnded": undefined}>; - -export type I4ov6e94l79mbg = {"id": bigint}; - -export type Iat4ai9vs8l9k5 = AnonymousEnum<{ -/** - * All attestation allowance has been removed for the verifier. - */ -"AllAttestationAllowanceCleared": Anonymize, -/** - * Attestation allowance was increased for an account by `count` attestations. - */ -"AttestationAllowanceIncreased": Anonymize, -/** - * A new lite person was registered through attestation. - */ -"PersonAttested": Anonymize, -/** - * A lite person was registered as a consumer. - */ -"ConsumerRegistered": Anonymize}>; - -export type I58bu3hm7657hm = {"verifier": SS58String}; - -export type Icc0fkkhtd78sc = {"candidate": SS58String, "verifier": SS58String}; - -export type Ia0v5qonnbfrul = AnonymousEnum<{ -/** - * A person has registered as a consumer. - */ -"PersonRegistered": Anonymize, -/** - * A lite person has registered as a consumer. - */ -"LitePersonRegistered": Anonymize, -/** - * A person's authorization was touched. - */ -"PersonAuthorizationTouched": Anonymize, -/** - * An expired username reservation was removed. - */ -"ExpiredUsernameReservationRemoved": Anonymize, -/** - * A consumer's identifier key was updated. - */ -"IdentifierKeyUpdated": Anonymize, -/** - * The username reservation duration was set. - */ -"UsernameReservationDurationSet": Anonymize, -/** - * A statement store slot was updated. - */ -"StmtStoreSlotUpdated": Anonymize, -/** - * A full person was demoted due to expired authorization. - */ -"PersonDemoted": Anonymize}>; - -export type I9vf1so75dnrom = {"alias": SizedHex<32>, "account": SS58String}; - -export type I28tfrqrmts741 = {"username": Uint8Array, "account": SS58String}; - -export type I1i6t85s8phv1c = {"duration": bigint}; - -export type I9lf1r3fch8ino = {"account": SS58String, "slot_number": number}; - -export type I2g1s4krv9s4p2 = AnonymousEnum<{ -/** - * A new chunk page hash set has been initialized (e.g., during genesis). - */ -"ChunkPageHashesInitialized": Anonymize, -/** - * New chunks have been successfully added to an existing or new chunk set. - */ -"ChunksAdded": Anonymize}>; - -export type Ickpn0png35631 = {"ring_exponent": Anonymize, "total_pages": number}; - -export type Idvob66qflhcgd = AnonymousEnum<{"R2e9": undefined, "R2e10": undefined, "R2e14": undefined}>; - -export type I3ns5kg6jo268n = {"ring_exponent": Anonymize, "start_index": number, "count": number}; - -export type I5t3lr0t9e1sk = AnonymousEnum<{ -/** - * An entity has had their membership recognised and indexed. - */ -"MemberAdded": Anonymize, -/** - * An entity has had their membership revoked. - */ -"MemberRemoved": Anonymize, -/** - * A collection has been marked for deletion. - */ -"CollectionMarkedForDeletion": Anonymize, -/** - * A collection has been fully deleted. - */ -"CollectionDeleted": Anonymize, -/** - * A ring was built manually. - */ -"RingBuilt": Anonymize, -/** - * Members were onboarded manually. - */ -"MembersOnboarded": Anonymize, -/** - * Two rings were merged. - */ -"RingsMerged": Anonymize, -/** - * The onboarding size was set for a collection. - */ -"OnboardingSizeSet": Anonymize}>; - -export type I7hu7hl7r35nrm = {"key": SizedHex<32>}; - -export type Idjiu7vp8ovdab = {"identifier": SizedHex<32>}; - -export type Idpufnltgsuodp = {"identifier": SizedHex<32>, "ring_index": number}; - -export type I6mk90q9np5nf3 = {"identifier": SizedHex<32>, "base_ring_index": number, "target_ring_index": number}; - -export type Ichkkipipv6vbf = {"identifier": SizedHex<32>, "onboarding_size": number}; - -export type Ibhe0l6jcu2ska = AnonymousEnum<{"CoinSplit": Anonymize, "CoinTransferred": Anonymize, "RecyclerLoadedWithCoin": Anonymize, "RecyclerLoadedWithExternalAsset": Anonymize, "RecyclerUnloadedIntoCoin": Anonymize, "RecyclerUnloadedIntoExternalAsset": Anonymize, "PaidUnloadTokenRegisteredWithCoin": Anonymize, "PaidUnloadTokenRegisteredWithNative": Anonymize, "PaidUnloadTokenRegisteredWithStable": Anonymize, "PeopleFreeUnloadTokenConsumed": Anonymize, "LitePeopleFreeUnloadTokenConsumed": Anonymize, "RecyclersUnloadedIntoCoin": Anonymize, "RecyclersUnloadedIntoExternalAsset": Anonymize, "RecyclersUnloadedIntoExternalAssetNonAnonymous": Anonymize, "RecyclerUnloadedIntoCoins": Anonymize, "CoinOffboardedIntoExternalAsset": Anonymize, "RecyclerCleaned": Anonymize, "ConsumedFreeTokensCleaned": Anonymize, "PaidUnloadTokenRingCleaned": Anonymize, "RecyclerDustCleaned": undefined, "PaidUnloadTokenDustCleaned": undefined, "ExpiredPaidUnloadTokenCollectionDeleted": Anonymize}>; - -export type I4c20l83g9496a = {"output_count": number}; - -export type I4gp88defd7an = {"to": SS58String, "value": number, "new_age": number}; - -export type Icnkee0to4c5ac = {"value": number}; - -export type Id113tpicu8sh3 = {"who": SS58String, "value": number, "amount": bigint}; - -export type I6ceb7pmur4hki = {"to": SS58String, "input_value": number, "output_value": number, "input_count": number}; - -export type Ie2d9d2u1qa7ro = {"to": SS58String, "value": number, "input_count": number, "amount": bigint}; - -export type I5kek6hgenovr0 = {"fee": bigint, "destroyed": bigint}; - -export type I91tbphb2dk7gn = {"who": SS58String, "fee": bigint}; - -export type I7ts20td7b1pmf = {"period": number}; - -export type I5509mqtnio180 = {"to": SS58String, "output_value": number, "input_count": number}; - -export type Ifojd05k7ogo8n = {"to": SS58String, "input_count": number, "amount": bigint}; - -export type I2h93i19beq4qk = {"who": SS58String, "to": SS58String, "input_count": number, "amount": bigint, "fee_currency": Anonymize}; - -export type I1h1i9ifhurrkc = AnonymousEnum<{"Native": undefined, "Stable": undefined}>; - -export type I4lmgf1qe39res = {"to": SS58String, "value": number, "amount": bigint}; - -export type Igvk3mrc51o9l = {"value": number, "remaining_coins": number, "destroyed_amount": bigint}; - -export type I7315hlp5liq47 = {"period": number, "ring_index": number}; - -export type I41rd0clbf4u3l = AnonymousEnum<{ -/** - * The foreign asset was created and reserves were set. - */ -"AssetCreated": undefined, -/** - * An XCM funds transfer was sent to Asset Hub. - */ -"XcmFundsTransferSent": undefined, -/** - * The XCM transfer timed out and will be retried. - */ -"XcmFundsTransferTimedOut": undefined, -/** - * Transferred funds have been verified. - */ -"FundsVerified": undefined, -/** - * All pots have been funded. - */ -"PotsFunded": undefined, -/** - * Mob Rule payout schedule has been set. - */ -"MobRulePayoutsScheduled": undefined, -/** - * Score payout schedule has been set. - */ -"ScorePayoutsScheduled": undefined, -/** - * The on_poll initialization has completed. - */ -"OnPollInitializationCompleted": undefined, -/** - * Migration: initial people have been recognized. - */ -"MigrationPeopleRecognized": undefined, -/** - * Migration: onboarding size has been set. - */ -"MigrationOnboardingSizeSet": undefined, -/** - * Migration: Proof-of-Ink pallet has been initialized. - */ -"MigrationProofOfInkInitialized": undefined, -/** - * Migration: games have been scheduled. - */ -"MigrationGamesScheduled": undefined, -/** - * Migration: invites have been granted. - */ -"MigrationInvitesGranted": undefined, -/** - * Migration: Proof-of-Ink reimbursement values have been set. - */ -"MigrationReimbursementValuesSet": undefined, -/** - * Migration: People Lite attestation allowances have been set. - */ -"MigrationAttestationAllowancesSet": undefined, -/** - * Migration has completed and on_poll initialization has been triggered. - */ -"MigrationCompleted": undefined}>; - -export type Ieo7gfiinkohj8 = AnonymousEnum<{ -/** - * Attestation allowances have been set and initialization is complete. - */ -"InitializationCompleted": undefined}>; - -export type I7055fe1dtfso8 = AnonymousEnum<{ -/** - * A participant registered for an event. - */ -"ParticipantRegistered": Anonymize, -/** - * The event is started. - */ -"EventStarted": Anonymize, -/** - * The scheduled event is skipped. - */ -"EventSkipped": Anonymize, -/** - * An event was scheduled. - */ -"EventScheduled": Anonymize, -/** - * A scheduled event was removed. - */ -"ScheduledEventRemoved": Anonymize, -/** - * A failed transfer prize was claimed. - */ -"FailedTransferPrizeClaimed": Anonymize, -/** - * The event transitioned to waiting for entropy to build. - */ -"WaitingForEntropyToBuild": Anonymize, -/** - * The event transitioned to drawing winners. - */ -"DrawingWinners": Anonymize, -/** - * The event transitioned to distributing prizes. - */ -"Distributing": Anonymize, -/** - * A prize was distributed to a winner. - */ -"PrizeDistributed": Anonymize, -/** - * A prize transfer failed during distribution. - */ -"PrizeDistributionFailed": Anonymize, -/** - * The event transitioned to clearing storage. - */ -"ClearingStorage": Anonymize, -/** - * The event has completed and been removed. - */ -"EventCompleted": Anonymize}>; - -export type Iflaqn0or9nfpj = {"event_id": number, "participant_id": number, "alias": SizedHex<32>}; - -export type Ib248pp8oe1coj = {"id": number, "event": Anonymize}; - -export type I41gsc0it2tv5p = AnonymousEnum<{"PrizeSet": {"asset_id": Anonymize, "asset_amount": bigint, "winners": number}}>; - -export type Id6g2uejluf2av = {"event_id": number}; - -export type I6os196hd8lgc2 = {"who": SS58String, "event_id": number}; - -export type I71gd3i0mgtnp1 = {"event_id": number, "dest": SS58String, "asset_id": Anonymize, "asset_amount": bigint}; - -export type I94co7vj7h6bo = AnonymousEnum<{ -/** - * A Runtime upgrade started. - * - * Its end is indicated by `UpgradeCompleted` or `UpgradeFailed`. - */ -"UpgradeStarted": Anonymize, -/** - * The current runtime upgrade completed. - * - * This implies that all of its migrations completed successfully as well. - */ -"UpgradeCompleted": undefined, -/** - * Runtime upgrade failed. - * - * This is very bad and will require governance intervention. - */ -"UpgradeFailed": undefined, -/** - * A migration was skipped since it was already executed in the past. - */ -"MigrationSkipped": Anonymize, -/** - * A migration progressed. - */ -"MigrationAdvanced": Anonymize, -/** - * A Migration completed. - */ -"MigrationCompleted": Anonymize, -/** - * A Migration failed. - * - * This implies that the whole upgrade failed and governance intervention is required. - */ -"MigrationFailed": Anonymize, -/** - * The set of historical migrations has been cleared. - */ -"HistoricCleared": Anonymize}>; - -export type If1co0pilmi7oq = { -/** - * The number of migrations that this upgrade contains. - * - * This can be used to design a progress indicator in combination with counting the - * `MigrationCompleted` and `MigrationSkipped` events. - */ -"migrations": number}; - -export type Iae74gjak1qibn = { -/** - * The index of the migration within the [`Config::Migrations`] list. - */ -"index": number, -/** - * The number of blocks that this migration took so far. - */ -"took": number}; - -export type I3escdojpj0551 = { -/** - * Should be passed to `clear_historic` in a successive call. - */ -"next_cursor"?: Anonymize}; - -export type Iabpgqcjikia83 = (Uint8Array) | undefined; - -export type I95g6i7ilua7lq = Array>; - -export type I9jd27rnpm8ttv = FixedSizeArray<2, number>; - -export type Ieniouoqkq4icf = {"spec_version": number, "spec_name": string}; - -export type I1v7jbnil3tjns = Array<{"used_bandwidth": Anonymize, "para_head_hash"?: Anonymize, "consumed_go_ahead_signal"?: Anonymize}>; - -export type Ieafp1gui1o4cl = {"ump_msg_count": number, "ump_total_bytes": number, "hrmp_outgoing": Array<[number, {"msg_count": number, "total_bytes": number}]>}; - -export type Iav8k1edbj86k7 = (UpgradeGoAhead) | undefined; - -export type UpgradeGoAhead = Enum<{"Abort": undefined, "GoAhead": undefined}>; -export const UpgradeGoAhead = _Enum as unknown as GetEnum; - -export type I8jgj1nhcr2dg8 = {"used_bandwidth": Anonymize, "hrmp_watermark"?: Anonymize, "consumed_go_ahead_signal"?: Anonymize}; - -export type I4arjljr6dpflb = (number) | undefined; - -export type Ifn6q3equiq9qi = {"parent_head": Uint8Array, "relay_parent_number": number, "relay_parent_storage_root": SizedHex<32>, "max_pov_size": number}; - -export type Ia3sb0vgvovhtg = (UpgradeRestriction) | undefined; - -export type UpgradeRestriction = Enum<{"Present": undefined}>; -export const UpgradeRestriction = _Enum as unknown as GetEnum; - -export type Itom7fk49o0c9 = Array; - -export type I4i91h98n3cv1b = {"dmq_mqc_head": SizedHex<32>, "relay_dispatch_queue_remaining_capacity": {"remaining_count": number, "remaining_size": number}, "ingress_channels": Array<[number, {"max_capacity": number, "max_total_size": number, "max_message_size": number, "msg_count": number, "total_size": number, "mqc_head"?: Anonymize}]>, "egress_channels": Array<[number, {"max_capacity": number, "max_total_size": number, "max_message_size": number, "msg_count": number, "total_size": number, "mqc_head"?: Anonymize}]>}; - -export type I4iumukclgj8ej = {"max_code_size": number, "max_head_data_size": number, "max_upward_queue_count": number, "max_upward_queue_size": number, "max_upward_message_size": number, "max_upward_message_num_per_candidate": number, "hrmp_max_message_num_per_candidate": number, "validation_upgrade_cooldown": number, "validation_upgrade_delay": number, "async_backing_params": {"max_candidate_depth": number, "allowed_ancestry_len": number}}; - -export type Iqnbvitf7a7l3 = Array>; - -export type I4p5t2krb1gmvp = [number, SizedHex<32>]; - -export type I48i407regf59r = {"sent_at": number, "reverse_idx": number}; - -export type I6r5cbv8ttrb09 = Array<{"recipient": number, "data": Uint8Array}>; - -export type I8ds64oj6581v0 = Array<{"id": SizedHex<8>, "amount": bigint, "reasons": BalancesTypesReasons}>; - -export type BalancesTypesReasons = Enum<{"Fee": undefined, "Misc": undefined, "All": undefined}>; -export const BalancesTypesReasons = _Enum as unknown as GetEnum; - -export type Ia7pdug7cdsg8g = Array<{"id": SizedHex<8>, "amount": bigint}>; - -export type I2sr2hoa6imct2 = Array<{"id": Anonymize, "amount": bigint}>; - -export type I9bin2jc70qt6q = Array>; - -export type TransactionPaymentReleases = Enum<{"V1Ancient": undefined, "V2": undefined}>; -export const TransactionPaymentReleases = _Enum as unknown as GetEnum; - -export type Icj0tssrh6ika3 = {"used": bigint, "at_block": number}; - -export type I3qklfjubrljqh = {"owner": SS58String, "issuer": SS58String, "admin": SS58String, "freezer": SS58String, "supply": bigint, "deposit": bigint, "min_balance": bigint, "is_sufficient": boolean, "accounts": number, "sufficients": number, "approvals": number, "status": Enum<{"Live": undefined, "Frozen": undefined, "Destroying": undefined}>}; - -export type Iag3f1hum3p4c8 = {"balance": bigint, "status": Enum<{"Liquid": undefined, "Frozen": undefined, "Blocked": undefined}>, "reason": Enum<{"Consumer": undefined, "Sufficient": undefined, "DepositHeld": bigint, "DepositRefunded": undefined, "DepositFrom": [SS58String, bigint]}>}; - -export type I4v5g6i7bmt06o = [Anonymize, SS58String]; - -export type I4s6jkha20aoh0 = {"amount": bigint, "deposit": bigint}; - -export type I84bhscllvv07n = [Anonymize, SS58String, SS58String]; - -export type I78s05f59eoi8b = {"deposit": bigint, "name": Uint8Array, "symbol": Uint8Array, "decimals": number, "is_frozen": boolean}; - -export type Ifi4da1gej1fri = Array>; - -export type Ifvgo9568rpmqc = Array>; - -export type I8uo3fpd3bcc6f = [SS58String, SizedHex<32>]; - -export type I6cs1itejju2vv = [bigint, number]; - -export type Ib77b0fp1a6mjr = Array<{"recipient": number, "state": Enum<{"Ok": undefined, "Suspended": undefined}>, "signals_exist": boolean, "first_index": number, "last_index": number}>; - -export type I5g2vv0ckl2m8b = [number, number]; - -export type Ifup3lg9ro8a0f = {"suspend_threshold": number, "drop_threshold": number, "resume_threshold": number}; - -export type I5qfubnuvrnqn6 = AnonymousEnum<{"Pending": {"responder": XcmVersionedLocation, "maybe_match_querier"?: (XcmVersionedLocation) | undefined, "maybe_notify"?: (SizedHex<2>) | undefined, "timeout": number}, "VersionNotifier": {"origin": XcmVersionedLocation, "is_active": boolean}, "Ready": {"response": Enum<{"V3": XcmV3Response, "V4": XcmV4Response, "V5": Anonymize}>, "at": number}}>; - -export type XcmV3Response = Enum<{"Null": undefined, "Assets": Anonymize, "ExecutionResult"?: Anonymize, "Version": number, "PalletsInfo": Anonymize, "DispatchResult": XcmV3MaybeErrorCode}>; -export const XcmV3Response = _Enum as unknown as GetEnum; - -export type I7sltvf8v2nure = ([number, XcmV3TraitsError]) | undefined; - -export type XcmV3TraitsError = Enum<{"Overflow": undefined, "Unimplemented": undefined, "UntrustedReserveLocation": undefined, "UntrustedTeleportLocation": undefined, "LocationFull": undefined, "LocationNotInvertible": undefined, "BadOrigin": undefined, "InvalidLocation": undefined, "AssetNotFound": undefined, "FailedToTransactAsset": undefined, "NotWithdrawable": undefined, "LocationCannotHold": undefined, "ExceedsMaxMessageSize": undefined, "DestinationUnsupported": undefined, "Transport": undefined, "Unroutable": undefined, "UnknownClaim": undefined, "FailedToDecode": undefined, "MaxWeightInvalid": undefined, "NotHoldingFees": undefined, "TooExpensive": undefined, "Trap": bigint, "ExpectationFalse": undefined, "PalletNotFound": undefined, "NameMismatch": undefined, "VersionIncompatible": undefined, "HoldingWouldOverflow": undefined, "ExportError": undefined, "ReanchorFailed": undefined, "NoDeal": undefined, "FeesNotMet": undefined, "LockError": undefined, "NoPermission": undefined, "Unanchored": undefined, "NotDepositable": undefined, "UnhandledXcmVersion": undefined, "WeightLimitReached": Anonymize, "Barrier": undefined, "WeightNotComputable": undefined, "ExceedsStackLimit": undefined}>; -export const XcmV3TraitsError = _Enum as unknown as GetEnum; - -export type XcmV4Response = Enum<{"Null": undefined, "Assets": Anonymize, "ExecutionResult"?: Anonymize, "Version": number, "PalletsInfo": Anonymize, "DispatchResult": XcmV3MaybeErrorCode}>; -export const XcmV4Response = _Enum as unknown as GetEnum; - -export type I8t3u2dv73ahbd = [number, XcmVersionedLocation]; - -export type I7vlvrrl2pnbgk = [bigint, Anonymize, number]; - -export type Ie0rpl5bahldfk = Array<[XcmVersionedLocation, number]>; - -export type XcmPalletVersionMigrationStage = Enum<{"MigrateSupportedVersion": undefined, "MigrateVersionNotifiers": undefined, "NotifyCurrentTargets"?: Anonymize, "MigrateAndNotifyOldTargets": undefined}>; -export const XcmPalletVersionMigrationStage = _Enum as unknown as GetEnum; - -export type I7e5oaj2qi4kl1 = {"amount": bigint, "owner": XcmVersionedLocation, "locker": XcmVersionedLocation, "consumers": Array<[undefined, bigint]>}; - -export type Ie849h3gncgvok = [number, SS58String, XcmVersionedAssetId]; - -export type XcmVersionedAssetId = Enum<{"V3": XcmV3MultiassetAssetId, "V4": Anonymize, "V5": Anonymize}>; -export const XcmVersionedAssetId = _Enum as unknown as GetEnum; - -export type Iat62vud7hlod2 = Array<[bigint, XcmVersionedLocation]>; - -export type Ici7ejds60vj52 = {"aliasers": Array<{"location": XcmVersionedLocation, "expiry"?: Anonymize}>}; - -export type Idh2ug6ou4a8og = {"begin": number, "end": number, "count": number, "ready_neighbours"?: ({"prev": Anonymize, "next": Anonymize}) | undefined, "message_count": bigint, "size": bigint}; - -export type I53esa2ms463bk = {"remaining": number, "remaining_size": number, "first_index": number, "first": number, "last": number, "heap": Uint8Array}; - -export type Ib4jhb8tt3uung = [Anonymize, number]; - -export type Iag146hmjgqfgj = {"when": Anonymize, "deposit": bigint, "depositor": SS58String, "approvals": Anonymize}; - -export type I48e2fe747rjco = [Array<{"delegate": SS58String, "proxy_type": Anonymize, "delay": number}>, bigint]; - -export type I9p9lq3rej5bhc = [Array<{"real": SS58String, "call_hash": SizedHex<32>, "height": number}>, bigint]; - -export type I8sp8i1c9u7kvv = {"judgements": Array<[number, Anonymize]>, "deposit": bigint, "info": Anonymize}; - -export type Icl2bbh90k7l2q = AnonymousEnum<{"Unknown": undefined, "FeePaid": bigint, "Reasonable": undefined, "KnownGood": undefined, "OutOfDate": undefined, "LowQuality": undefined, "Erroneous": undefined, "External": undefined}>; - -export type Ibr5qtvptt8691 = {"display": IdentityData, "legal": IdentityData, "web": IdentityData, "matrix": IdentityData, "email": IdentityData, "pgp_fingerprint"?: (SizedHex<20>) | undefined, "image": IdentityData, "twitter": IdentityData, "github": IdentityData, "discord": IdentityData}; - -export type IdentityData = Enum<{"None": undefined, "Raw0": undefined, "Raw1": number, "Raw2": SizedHex<2>, "Raw3": SizedHex<3>, "Raw4": SizedHex<4>, "Raw5": SizedHex<5>, "Raw6": SizedHex<6>, "Raw7": SizedHex<7>, "Raw8": SizedHex<8>, "Raw9": SizedHex<9>, "Raw10": SizedHex<10>, "Raw11": SizedHex<11>, "Raw12": SizedHex<12>, "Raw13": SizedHex<13>, "Raw14": SizedHex<14>, "Raw15": SizedHex<15>, "Raw16": SizedHex<16>, "Raw17": SizedHex<17>, "Raw18": SizedHex<18>, "Raw19": SizedHex<19>, "Raw20": SizedHex<20>, "Raw21": SizedHex<21>, "Raw22": SizedHex<22>, "Raw23": SizedHex<23>, "Raw24": SizedHex<24>, "Raw25": SizedHex<25>, "Raw26": SizedHex<26>, "Raw27": SizedHex<27>, "Raw28": SizedHex<28>, "Raw29": SizedHex<29>, "Raw30": SizedHex<30>, "Raw31": SizedHex<31>, "Raw32": SizedHex<32>, "BlakeTwo256": SizedHex<32>, "Sha256": SizedHex<32>, "Keccak256": SizedHex<32>, "ShaThree256": SizedHex<32>}>; -export const IdentityData = _Enum as unknown as GetEnum; - -export type I910puuahutflf = [SS58String, IdentityData]; - -export type I4nfjdef0ibh44 = [bigint, Anonymize]; - -export type I74af64m08r6as = Array<({"account": SS58String, "fee": bigint, "fields": bigint}) | undefined>; - -export type Ic8ann3kre6vdm = {"account_id": SS58String, "allocation": number}; - -export type I1j72qfgdejqsv = {"owner": SS58String, "provider": Anonymize}; - -export type Idib8jf3ve40bj = AnonymousEnum<{"Allocation": undefined, "AuthorityDeposit": bigint, "System": undefined}>; - -export type I60biiepd74113 = [SS58String, number, Anonymize]; - -export type I2skcsqibb3i2k = {"account": SS58String, "pending_judgements": Array<[Anonymize, number]>, "banned": boolean, "username_last_reported_at"?: Anonymize}; - -export type Ifgk0bca7f05om = AnonymousEnum<{"Twitter": Anonymize, "Github": Anonymize, "Discord": {"display_and_tag": Uint8Array}}>; - -export type I4ekkp6f1d7a69 = {"reporter": SS58String, "username": Uint8Array, "case_id": number}; - -export type Ifpolrv9bn0ss8 = {"key": SizedHex<32>, "account"?: Anonymize}; - -export type I5h2gdbrcdulu5 = {"voted": number, "cleaned": number, "correct": number, "credit": bigint}; - -export type I14eopu9hl6hgk = {"since": bigint, "details": Anonymize, "tally": {"aye": number, "nay": number, "contempt": number}}; - -export type Ib15skbo4cf2mg = {"statement": Enum<{"ProofOfInk": {"design": Anonymize, "evidence": SizedHex<32>, "probable_acceptable": boolean}, "IdentityCredential": {"platform": Anonymize, "evidence": Uint8Array}, "UsernameValid": Anonymize}>, "context": Uint8Array, "callback": {"pallet_index": number, "call_index": number}}; - -export type I8p7pbmodi01pv = AnonymousEnum<{"DesignedElective": Anonymize, "ProceduralAccount": Anonymize, "ProceduralPersonal": [number, bigint], "Procedural": [number, SizedHex<4>]}>; - -export type Iaq1a4h34blh5u = {"details": Anonymize, "verdict": Anonymize}; - -export type Ieaqfchj8o5p3e = {"since": bigint, "verdict": Anonymize}; - -export type Ia11lg4mrmjqfg = {"round": number, "initial_balance": bigint, "remaining_balance": bigint, "total_points": bigint, "start": number}; - -export type Idevgv5mu1k9gt = Array<{"remaining": number, "amount_per_round": bigint, "period": number}>; - -export type Ic5ardbudan54b = AnonymousEnum<{"Applied": {"cred": Anonymize, "entropy": SizedHex<32>, "entropy_since": number}, "Selected": {"since": number, "cred": Anonymize, "reserved": bigint, "entropy": SizedHex<32>, "design": Anonymize, "allocation": Enum<{"Initial": undefined, "InitDone": undefined, "Full": undefined}>, "judging"?: Anonymize, "failed": number}, "Proven": {"design": Anonymize, "reserved": bigint, "was_referred": boolean, "was_invited": boolean}}>; - -export type Ibt4ac5matmkrm = AnonymousEnum<{"Referred": bigint, "Deposit": bigint, "Invited": SS58String}>; - -export type I6n9krukma1mut = {"design"?: (Anonymize) | undefined, "active_referrals": Anonymize, "allowed_referral_tickets": number, "bad_referrals": number, "successful_referrals": number, "referrals": number, "derivatives": number, "banned": boolean, "pending_referral_rewards": number}; - -export type Ie6cl0ap8d265e = {"kind": Anonymize, "id": SizedHex<32>}; - -export type I9feps983hs1sf = AnonymousEnum<{"Reserved": undefined, "Committed": undefined}>; - -export type I2na29tt2afp0j = FixedSizeArray<2, SS58String>; - -export type Ifip05kcrl65am = Array>; - -export type I644th47nna91b = {"registration": number, "shuffle": number, "post_shuffle_margin": number, "reporting": number, "player_process": number}; - -export type I9u9nqhm3kqr8q = [Anonymize, SizedHex<32>]; - -export type I191vhdj2skphj = AnonymousEnum<{"Kickable": {"first_game": number, "archived_since": number}, "Unkickable": {"first_game": number}}>; - -export type Idfgmv0r2plk6t = {"first_game": number, "registered": boolean, "sent_report": boolean, "yes_person": number, "no_not_person": number, "credibility": Enum<{"Invited": undefined, "Recognized": undefined, "Deposit": bigint}>}; - -export type I5dmkj9ep3uuaq = {"index": number, "registration_ends": number, "shuffle_deadline": number, "game_date": number, "report_ends": number, "state": Enum<{"Registration": {"next_player_index": number}, "Shuffle": {"step": Enum<{"Step1Insert": Anonymize, "Step2Retrieve": {"next_player_index": number, "recognized_finished": boolean}}>}, "Reporting": {"player_count": number}, "PlayerProcess": Anonymize, "Cancelling": Anonymize}>, "max_group_size": number, "rounds": number}; - -export type Ian857vvm41akm = {"last_iteration"?: (Anonymize) | undefined}; - -export type I1v8hffmq0a2s2 = Array<{"game_play_time": number, "rounds": number, "max_group_size": number}>; - -export type Iesh4knl67dirc = {"score": number, "streak": Enum<{"Attended": number, "Absent": number}>, "attendance_history": number, "credit": bigint, "cashed_out": boolean, "reached_personhood": boolean, "has_ever_reached_personhood": boolean, "recognition": Enum<{"ExternallyRecognized": undefined, "NotRecognized": undefined, "Suspended": bigint, "Recognized": bigint}>}; - -export type Idrbto15rld189 = Array<{"population_size_threshold": number, "window": number, "allowed_misses": number}>; - -export type I6lggg4mrl1u2s = [number, Anonymize]; - -export type I3nqube2n1nohj = {"remaining_balance": bigint, "point_price": bigint, "remainder": bigint, "total_points": number}; - -export type Idodgrto60av5h = {"finish_at": number, "credit": bigint}; - -export type Id26d02t80vjh = Array<{"remaining": number, "amount_per_round": bigint, "duration": number}>; - -export type I4009rejbekrdq = {"key": SizedHex<32>, "suspended": boolean}; - -export type I81vbsdqasdsr1 = {"ring_vrf_key": SizedHex<32>, "method": Enum<{"UniqueDevice": SS58String}>}; - -export type I7odqmvebn62ca = {"identifier_key": SizedHex<65>, "full_username"?: Anonymize, "lite_username": Uint8Array, "credibility": Enum<{"Lite": undefined, "Person": {"alias": SizedHex<32>, "last_update": bigint, "demoted": boolean}}>, "stmt_store_slots": Array>}; - -export type Ic66kva37scc9l = Array<{"account": SS58String, "joined_at": bigint}>; - -export type I53g8q9761kkrn = Array>; - -export type I7hvvp2oeegqa0 = [Anonymize, number]; - -export type Iaq2bjd3j738m9 = {"owner": Anonymize, "mode": Enum<{"AppendOnly": undefined, "Flexible": undefined}>, "ring_size": Anonymize}; - -export type I9lcj3313n9e9v = AnonymousEnum<{"External": Anonymize, "Local": SS58String}>; - -export type I6t8fqjt3u136v = {"root": SizedHex<384>, "revision": number, "intermediate": SizedHex<432>}; - -export type I4pact7n2e9a0i = [SizedHex<32>, number]; - -export type I2t447bb26t9i6 = [SizedHex<32>, number, number]; - -export type I831tj5voub6u0 = {"total": number, "included": number, "immutable_since"?: Anonymize}; - -export type I6cufgusp40k9i = {"identifier": SizedHex<32>, "position": Enum<{"Onboarding": {"queue_page": number}, "Included": {"ring_index": number, "ring_page": number, "ring_position": number}, "Suspended": undefined}>}; - -export type I766emmc9ccni0 = AnonymousEnum<{"AppendOnly": undefined, "Mutating": number}>; - -export type Ie1vuhuh0vpgrb = {"identifier": SizedHex<32>, "stage": Enum<{"DeletingRings": undefined, "DeletingOnboardingQueue": undefined, "Finalizing": undefined}>}; - -export type I2l7r05e3266s4 = {"reason": Enum<{"FailedDispatch": {"retries": number}}>, "until": bigint}; - -export type I5eoome1iv99mc = [number, number, SizedHex<32>]; - -export type I35mml84uvstml = AnonymousEnum<{"Inactive": undefined, "CreatingAsset": undefined, "XcmFundsTransfer": undefined, "VerifyingFunds": undefined, "FundingPots": undefined, "SchedulingMobRulePayouts": undefined, "SchedulingScorePayouts": undefined, "Completed": undefined}>; - -export type I83hq8olm7phlp = AnonymousEnum<{"Inactive": undefined, "Completed": undefined}>; - -export type Ianbabfvoj16rj = Array<{"id": number, "info": Anonymize}>; - -export type I7dj7e35j88qa = {"prize": Anonymize, "registration_starts": number, "registration_duration": number}; - -export type I6dk4nvven1i08 = {"id": number, "next_participant_id": number, "info": Anonymize, "status": Enum<{"Registering": undefined, "WaitingForEntropyToBuild": {"started_at_rc_bn": number}, "DrawingWinners": {"entropy": SizedHex<32>}, "Distributing": undefined, "ClearingStorage": undefined}>}; - -export type I3sean4dbblfft = [SizedHex<32>, SS58String]; - -export type I3n8fv9mo53kq5 = [Anonymize, bigint]; - -export type I6ouflveob4eli = [SS58String, number]; - -export type Ibuqgslo88n368 = {"prize": Anonymize, "registration_starts": number, "registration_duration": number, "total_participants": number, "winners": Anonymize}; - -export type Iepbsvlk3qceij = AnonymousEnum<{"Active": {"index": number, "inner_cursor"?: Anonymize, "started_at": number}, "Stuck": undefined}>; - -export type In7a38730s6qs = {"base_block": Anonymize, "max_block": Anonymize, "per_class": {"normal": {"base_extrinsic": Anonymize, "max_extrinsic"?: Anonymize, "max_total"?: Anonymize, "reserved"?: Anonymize}, "operational": {"base_extrinsic": Anonymize, "max_extrinsic"?: Anonymize, "max_total"?: Anonymize, "reserved"?: Anonymize}, "mandatory": {"base_extrinsic": Anonymize, "max_extrinsic"?: Anonymize, "max_total"?: Anonymize, "reserved"?: Anonymize}}}; - -export type If15el53dd76v9 = {"normal": number, "operational": number, "mandatory": number}; - -export type I9s0ave7t0vnrk = {"read": bigint, "write": bigint}; - -export type I4fo08joqmcqnm = {"spec_name": string, "impl_name": string, "authoring_version": number, "spec_version": number, "impl_version": number, "apis": Array<[SizedHex<8>, number]>, "transaction_version": number, "system_version": number}; - -export type I7qcffr6se5g9 = {"max_count": number, "max_size": number}; - -export type Iekve0i6djpd9f = AnonymousEnum<{ -/** - * Make some on-chain remark. - * - * Can be executed by every `origin`. - */ -"remark": Anonymize, -/** - * Set the number of pages in the WebAssembly environment's heap. - */ -"set_heap_pages": Anonymize, -/** - * Set the new runtime code. - */ -"set_code": Anonymize, -/** - * Set the new runtime code without doing any checks of the given `code`. - * - * Note that runtime upgrades will not run if this is called with a not-increasing spec - * version! - */ -"set_code_without_checks": Anonymize, -/** - * Set some items of storage. - */ -"set_storage": Anonymize, -/** - * Kill some items from storage. - */ -"kill_storage": Anonymize, -/** - * Kill all storage items with a key that starts with the given prefix. - * - * **NOTE:** We rely on the Root origin to provide us the number of subkeys under - * the prefix we are removing to accurately calculate the weight of this function. - */ -"kill_prefix": Anonymize, -/** - * Make some on-chain remark and emit event. - */ -"remark_with_event": Anonymize, -/** - * Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied - * later. - * - * This call requires Root origin. - */ -"authorize_upgrade": Anonymize, -/** - * Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied - * later. - * - * WARNING: This authorizes an upgrade that will take place without any safety checks, for - * example that the spec name remains the same and that the version number increases. Not - * recommended for normal use. Use `authorize_upgrade` instead. - * - * This call requires Root origin. - */ -"authorize_upgrade_without_checks": Anonymize, -/** - * Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. - * - * If the authorization required a version check, this call will ensure the spec name - * remains unchanged and that the spec version has increased. - * - * Depending on the runtime's `OnSetCode` configuration, this function may directly apply - * the new `code` in the same block or attempt to schedule the upgrade. - * - * All origins are allowed. - */ -"apply_authorized_upgrade": Anonymize}>; - -export type I8ofcg5rbj0g2c = {"remark": Uint8Array}; - -export type I4adgbll7gku4i = {"pages": bigint}; - -export type I6pjjpfvhvcfru = {"code": Uint8Array}; - -export type I9pj91mj79qekl = {"items": Array>}; - -export type I39uah9nss64h9 = {"keys": Anonymize}; - -export type Ik64dknsq7k08 = {"prefix": Uint8Array, "subkeys": number}; - -export type Ib51vk42m1po4n = {"code_hash": SizedHex<32>}; - -export type I3u72uvpuo4qrt = AnonymousEnum<{ -/** - * Set the current validation data. - * - * This should be invoked exactly once per block. It will panic at the finalization - * phase if the call was not invoked. - * - * The dispatch origin for this call must be `Inherent` - * - * As a side effect, this function upgrades the current validation function - * if the appropriate time has come. - */ -"set_validation_data": Anonymize, "sudo_send_upward_message": Anonymize}>; - -export type Ial23jn8hp0aen = {"data": {"validation_data": Anonymize, "relay_chain_state": Anonymize, "relay_parent_descendants": Array>, "collator_peer_id"?: Anonymize}, "inbound_messages_data": {"downward_messages": {"full_messages": Array<{"sent_at": number, "msg": Uint8Array}>, "hashed_messages": Array>}, "horizontal_messages": {"full_messages": Array<[number, {"sent_at": number, "data": Uint8Array}]>, "hashed_messages": Array<[number, Anonymize]>}}}; - -export type Ic952bubvq4k7d = {"parent_hash": SizedHex<32>, "number": number, "state_root": SizedHex<32>, "extrinsics_root": SizedHex<32>, "digest": Anonymize}; - -export type Icqnh9ino03itn = {"sent_at": number, "msg_hash": SizedHex<32>}; - -export type Ifpj261e8s63m3 = {"message": Uint8Array}; - -export type I7d75gqfg6jh9c = AnonymousEnum<{ -/** - * Set the current time. - * - * This call should be invoked exactly once per block. It will panic at the finalization - * phase, if this call hasn't been invoked by that time. - * - * The timestamp should be greater than the previous one by the amount specified by - * [`Config::MinimumPeriod`]. - * - * The dispatch origin for this call must be _None_. - * - * This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware - * that changing the complexity of this call could result exhausting the resources in a - * block to execute any other calls. - * - * ## Complexity - * - `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) - * - 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in - * `on_finalize`) - * - 1 event handler `on_timestamp_set`. Must be `O(1)`. - */ -"set": Anonymize}>; - -export type Idcr6u6361oad9 = {"now": bigint}; - -export type I9svldsp29mh87 = AnonymousEnum<{ -/** - * Transfer some liquid free balance to another account. - * - * `transfer_allow_death` will set the `FreeBalance` of the sender and receiver. - * If the sender's account is below the existential deposit as a result - * of the transfer, the account will be reaped. - * - * The dispatch origin for this call must be `Signed` by the transactor. - */ -"transfer_allow_death": Anonymize, -/** - * Exactly as `transfer_allow_death`, except the origin must be root and the source account - * may be specified. - */ -"force_transfer": Anonymize, -/** - * Same as the [`transfer_allow_death`] call, but with a check that the transfer will not - * kill the origin account. - * - * 99% of the time you want [`transfer_allow_death`] instead. - * - * [`transfer_allow_death`]: struct.Pallet.html#method.transfer - */ -"transfer_keep_alive": Anonymize, -/** - * Transfer the entire transferable balance from the caller account. - * - * NOTE: This function only attempts to transfer _transferable_ balances. This means that - * any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be - * transferred by this function. To ensure that this function results in a killed account, - * you might need to prepare the account by removing any reference counters, storage - * deposits, etc... - * - * The dispatch origin of this call must be Signed. - * - * - `dest`: The recipient of the transfer. - * - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all - * of the funds the account has, causing the sender account to be killed (false), or - * transfer everything except at least the existential deposit, which will guarantee to - * keep the sender account alive (true). - */ -"transfer_all": Anonymize, -/** - * Unreserve some balance from a user by force. - * - * Can only be called by ROOT. - */ -"force_unreserve": Anonymize, -/** - * Upgrade a specified account. - * - * - `origin`: Must be `Signed`. - * - `who`: The account to be upgraded. - * - * This will waive the transaction fee if at least all but 10% of the accounts needed to - * be upgraded. (We let some not have to be upgraded just in order to allow for the - * possibility of churn). - */ -"upgrade_accounts": Anonymize, -/** - * Set the regular balance of a given account. - * - * The dispatch origin for this call is `root`. - */ -"force_set_balance": Anonymize, -/** - * Adjust the total issuance in a saturating way. - * - * Can only be called by root and always needs a positive `delta`. - * - * # Example - */ -"force_adjust_total_issuance": Anonymize, -/** - * Burn the specified liquid free balance from the origin account. - * - * If the origin's account ends up below the existential deposit as a result - * of the burn and `keep_alive` is false, the account will be reaped. - * - * Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, - * this `burn` operation will reduce total issuance by the amount _burned_. - */ -"burn": Anonymize}>; - -export type I4ktuaksf5i1gk = {"dest": MultiAddress, "value": bigint}; - -export type MultiAddress = Enum<{"Id": SS58String, "Index": undefined, "Raw": Uint8Array, "Address32": SizedHex<32>, "Address20": SizedHex<20>}>; -export const MultiAddress = _Enum as unknown as GetEnum; - -export type I9bqtpv2ii35mp = {"source": MultiAddress, "dest": MultiAddress, "value": bigint}; - -export type I9j7pagd6d4bda = {"dest": MultiAddress, "keep_alive": boolean}; - -export type I2h9pmio37r7fb = {"who": MultiAddress, "amount": bigint}; - -export type Ibmr18suc9ikh9 = {"who": Anonymize}; - -export type I9iq22t0burs89 = {"who": MultiAddress, "new_free": bigint}; - -export type I5u8olqbbvfnvf = {"direction": BalancesAdjustmentDirection, "delta": bigint}; - -export type BalancesAdjustmentDirection = Enum<{"Increase": undefined, "Decrease": undefined}>; -export const BalancesAdjustmentDirection = _Enum as unknown as GetEnum; - -export type I5utcetro501ir = {"value": bigint, "keep_alive": boolean}; - -export type I46ohf9ad4t2nj = AnonymousEnum<{ -/** - * Allow to clean usage associated with an entity when it is zero or when there is no - * longer any allowance for the origin. - */ -"clean_usage": Anonymize}>; - -export type Iu9seb88fh81e = AnonymousEnum<{ -/** - * Issue a new class of fungible assets from a public origin. - * - * This new asset class has no assets initially and its owner is the origin. - * - * The origin must conform to the configured `CreateOrigin` and have sufficient funds free. - * - * Funds of sender are reserved by `AssetDeposit`. - * - * Parameters: - * - `id`: The identifier of the new asset. This must not be currently in use to identify - * an existing asset. If [`NextAssetId`] is set, then this must be equal to it. - * - `admin`: The admin of this class of assets. The admin is the initial address of each - * member of the asset class's admin team. - * - `min_balance`: The minimum balance of this new asset that any single account must - * have. If an account's balance is reduced below this, then it collapses to zero. - * - * Emits `Created` event when successful. - * - * Weight: `O(1)` - */ -"create": Anonymize, -/** - * Issue a new class of fungible assets from a privileged origin. - * - * This new asset class has no assets initially. - * - * The origin must conform to `ForceOrigin`. - * - * Unlike `create`, no funds are reserved. - * - * - `id`: The identifier of the new asset. This must not be currently in use to identify - * an existing asset. If [`NextAssetId`] is set, then this must be equal to it. - * - `owner`: The owner of this class of assets. The owner has full superuser permissions - * over this asset, but may later change and configure the permissions using - * `transfer_ownership` and `set_team`. - * - `min_balance`: The minimum balance of this new asset that any single account must - * have. If an account's balance is reduced below this, then it collapses to zero. - * - * Emits `ForceCreated` event when successful. - * - * Weight: `O(1)` - */ -"force_create": Anonymize, -/** - * Start the process of destroying a fungible asset class. - * - * `start_destroy` is the first in a series of extrinsics that should be called, to allow - * destruction of an asset class. - * - * The origin must conform to `ForceOrigin` or must be `Signed` by the asset's `owner`. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if - * an account contains holds or freezes in place. - */ -"start_destroy": Anonymize, -/** - * Destroy all accounts associated with a given asset. - * - * `destroy_accounts` should only be called after `start_destroy` has been called, and the - * asset is in a `Destroying` state. - * - * Due to weight restrictions, this function may need to be called multiple times to fully - * destroy all accounts. It will destroy `RemoveItemsLimit` accounts at a time. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * Each call emits the `Event::DestroyedAccounts` event. - */ -"destroy_accounts": Anonymize, -/** - * Destroy all approvals associated with a given asset up to the max (T::RemoveItemsLimit). - * - * `destroy_approvals` should only be called after `start_destroy` has been called, and the - * asset is in a `Destroying` state. - * - * Due to weight restrictions, this function may need to be called multiple times to fully - * destroy all approvals. It will destroy `RemoveItemsLimit` approvals at a time. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * Each call emits the `Event::DestroyedApprovals` event. - */ -"destroy_approvals": Anonymize, -/** - * Complete destroying asset and unreserve currency. - * - * `finish_destroy` should only be called after `start_destroy` has been called, and the - * asset is in a `Destroying` state. All accounts or approvals should be destroyed before - * hand. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * Each successful call emits the `Event::Destroyed` event. - */ -"finish_destroy": Anonymize, -/** - * Mint assets of a particular class. - * - * The origin must be Signed and the sender must be the Issuer of the asset `id`. - * - * - `id`: The identifier of the asset to have some amount minted. - * - `beneficiary`: The account to be credited with the minted assets. - * - `amount`: The amount of the asset to be minted. - * - * Emits `Issued` event when successful. - * - * Weight: `O(1)` - * Modes: Pre-existing balance of `beneficiary`; Account pre-existence of `beneficiary`. - */ -"mint": Anonymize, -/** - * Reduce the balance of `who` by as much as possible up to `amount` assets of `id`. - * - * Origin must be Signed and the sender should be the Manager of the asset `id`. - * - * Bails with `NoAccount` if the `who` is already dead. - * - * - `id`: The identifier of the asset to have some amount burned. - * - `who`: The account to be debited from. - * - `amount`: The maximum amount by which `who`'s balance should be reduced. - * - * Emits `Burned` with the actual amount burned. If this takes the balance to below the - * minimum for the asset, then the amount burned is increased to take it to zero. - * - * Weight: `O(1)` - * Modes: Post-existence of `who`; Pre & post Zombie-status of `who`. - */ -"burn": Anonymize, -/** - * Move some assets from the sender account to another. - * - * Origin must be Signed. - * - * - `id`: The identifier of the asset to have some amount transferred. - * - `target`: The account to be credited. - * - `amount`: The amount by which the sender's balance of assets should be reduced and - * `target`'s balance increased. The amount actually transferred may be slightly greater in - * the case that the transfer would otherwise take the sender balance above zero but below - * the minimum balance. Must be greater than zero. - * - * Emits `Transferred` with the actual amount transferred. If this takes the source balance - * to below the minimum for the asset, then the amount transferred is increased to take it - * to zero. - * - * Weight: `O(1)` - * Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of - * `target`. - */ -"transfer": Anonymize, -/** - * Move some assets from the sender account to another, keeping the sender account alive. - * - * Origin must be Signed. - * - * - `id`: The identifier of the asset to have some amount transferred. - * - `target`: The account to be credited. - * - `amount`: The amount by which the sender's balance of assets should be reduced and - * `target`'s balance increased. The amount actually transferred may be slightly greater in - * the case that the transfer would otherwise take the sender balance above zero but below - * the minimum balance. Must be greater than zero. - * - * Emits `Transferred` with the actual amount transferred. If this takes the source balance - * to below the minimum for the asset, then the amount transferred is increased to take it - * to zero. - * - * Weight: `O(1)` - * Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of - * `target`. - */ -"transfer_keep_alive": Anonymize, -/** - * Move some assets from one account to another. - * - * Origin must be Signed and the sender should be the Admin of the asset `id`. - * - * - `id`: The identifier of the asset to have some amount transferred. - * - `source`: The account to be debited. - * - `dest`: The account to be credited. - * - `amount`: The amount by which the `source`'s balance of assets should be reduced and - * `dest`'s balance increased. The amount actually transferred may be slightly greater in - * the case that the transfer would otherwise take the `source` balance above zero but - * below the minimum balance. Must be greater than zero. - * - * Emits `Transferred` with the actual amount transferred. If this takes the source balance - * to below the minimum for the asset, then the amount transferred is increased to take it - * to zero. - * - * Weight: `O(1)` - * Modes: Pre-existence of `dest`; Post-existence of `source`; Account pre-existence of - * `dest`. - */ -"force_transfer": Anonymize, -/** - * Disallow further unprivileged transfers of an asset `id` from an account `who`. `who` - * must already exist as an entry in `Account`s of the asset. If you want to freeze an - * account that does not have an entry, use `touch_other` first. - * - * Origin must be Signed and the sender should be the Freezer of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - `who`: The account to be frozen. - * - * Emits `Frozen`. - * - * Weight: `O(1)` - */ -"freeze": Anonymize, -/** - * Allow unprivileged transfers to and from an account again. - * - * Origin must be Signed and the sender should be the Admin of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - `who`: The account to be unfrozen. - * - * Emits `Thawed`. - * - * Weight: `O(1)` - */ -"thaw": Anonymize, -/** - * Disallow further unprivileged transfers for the asset class. - * - * Origin must be Signed and the sender should be the Freezer of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - * Emits `Frozen`. - * - * Weight: `O(1)` - */ -"freeze_asset": Anonymize, -/** - * Allow unprivileged transfers for the asset again. - * - * Origin must be Signed and the sender should be the Admin of the asset `id`. - * - * - `id`: The identifier of the asset to be thawed. - * - * Emits `Thawed`. - * - * Weight: `O(1)` - */ -"thaw_asset": Anonymize, -/** - * Change the Owner of an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * - `id`: The identifier of the asset. - * - `owner`: The new Owner of this asset. - * - * Emits `OwnerChanged`. - * - * Weight: `O(1)` - */ -"transfer_ownership": Anonymize, -/** - * Change the Issuer, Admin and Freezer of an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - `issuer`: The new Issuer of this asset. - * - `admin`: The new Admin of this asset. - * - `freezer`: The new Freezer of this asset. - * - * Emits `TeamChanged`. - * - * Weight: `O(1)` - */ -"set_team": Anonymize, -/** - * Set the metadata for an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * Funds of sender are reserved according to the formula: - * `MetadataDepositBase + MetadataDepositPerByte * (name.len + symbol.len)` taking into - * account any already reserved funds. - * - * - `id`: The identifier of the asset to update. - * - `name`: The user friendly name of this asset. Limited in length by `StringLimit`. - * - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`. - * - `decimals`: The number of decimals this asset uses to represent one unit. - * - * Emits `MetadataSet`. - * - * Weight: `O(1)` - */ -"set_metadata": Anonymize, -/** - * Clear the metadata for an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * Any deposit is freed for the asset owner. - * - * - `id`: The identifier of the asset to clear. - * - * Emits `MetadataCleared`. - * - * Weight: `O(1)` - */ -"clear_metadata": Anonymize, -/** - * Force the metadata for an asset to some value. - * - * Origin must be ForceOrigin. - * - * Any deposit is left alone. - * - * - `id`: The identifier of the asset to update. - * - `name`: The user friendly name of this asset. Limited in length by `StringLimit`. - * - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`. - * - `decimals`: The number of decimals this asset uses to represent one unit. - * - * Emits `MetadataSet`. - * - * Weight: `O(N + S)` where N and S are the length of the name and symbol respectively. - */ -"force_set_metadata": Anonymize, -/** - * Clear the metadata for an asset. - * - * Origin must be ForceOrigin. - * - * Any deposit is returned. - * - * - `id`: The identifier of the asset to clear. - * - * Emits `MetadataCleared`. - * - * Weight: `O(1)` - */ -"force_clear_metadata": Anonymize, -/** - * Alter the attributes of a given asset. - * - * Origin must be `ForceOrigin`. - * - * - `id`: The identifier of the asset. - * - `owner`: The new Owner of this asset. - * - `issuer`: The new Issuer of this asset. - * - `admin`: The new Admin of this asset. - * - `freezer`: The new Freezer of this asset. - * - `min_balance`: The minimum balance of this new asset that any single account must - * have. If an account's balance is reduced below this, then it collapses to zero. - * - `is_sufficient`: Whether a non-zero balance of this asset is deposit of sufficient - * value to account for the state bloat associated with its balance storage. If set to - * `true`, then non-zero balances may be stored without a `consumer` reference (and thus - * an ED in the Balances pallet or whatever else is used to control user-account state - * growth). - * - `is_frozen`: Whether this asset class is frozen except for permissioned/admin - * instructions. - * - * Emits `AssetStatusChanged` with the identity of the asset. - * - * Weight: `O(1)` - */ -"force_asset_status": Anonymize, -/** - * Approve an amount of asset for transfer by a delegated third-party account. - * - * Origin must be Signed. - * - * Ensures that `ApprovalDeposit` worth of `Currency` is reserved from signing account - * for the purpose of holding the approval. If some non-zero amount of assets is already - * approved from signing account to `delegate`, then it is topped up or unreserved to - * meet the right value. - * - * NOTE: The signing account does not need to own `amount` of assets at the point of - * making this call. - * - * - `id`: The identifier of the asset. - * - `delegate`: The account to delegate permission to transfer asset. - * - `amount`: The amount of asset that may be transferred by `delegate`. If there is - * already an approval in place, then this acts additively. - * - * Emits `ApprovedTransfer` on success. - * - * Weight: `O(1)` - */ -"approve_transfer": Anonymize, -/** - * Cancel all of some asset approved for delegated transfer by a third-party account. - * - * Origin must be Signed and there must be an approval in place between signer and - * `delegate`. - * - * Unreserves any deposit previously reserved by `approve_transfer` for the approval. - * - * - `id`: The identifier of the asset. - * - `delegate`: The account delegated permission to transfer asset. - * - * Emits `ApprovalCancelled` on success. - * - * Weight: `O(1)` - */ -"cancel_approval": Anonymize, -/** - * Cancel all of some asset approved for delegated transfer by a third-party account. - * - * Origin must be either ForceOrigin or Signed origin with the signer being the Admin - * account of the asset `id`. - * - * Unreserves any deposit previously reserved by `approve_transfer` for the approval. - * - * - `id`: The identifier of the asset. - * - `delegate`: The account delegated permission to transfer asset. - * - * Emits `ApprovalCancelled` on success. - * - * Weight: `O(1)` - */ -"force_cancel_approval": Anonymize, -/** - * Transfer some asset balance from a previously delegated account to some third-party - * account. - * - * Origin must be Signed and there must be an approval in place by the `owner` to the - * signer. - * - * If the entire amount approved for transfer is transferred, then any deposit previously - * reserved by `approve_transfer` is unreserved. - * - * - `id`: The identifier of the asset. - * - `owner`: The account which previously approved for a transfer of at least `amount` and - * from which the asset balance will be withdrawn. - * - `destination`: The account to which the asset balance of `amount` will be transferred. - * - `amount`: The amount of assets to transfer. - * - * Emits `TransferredApproved` on success. - * - * Weight: `O(1)` - */ -"transfer_approved": Anonymize, -/** - * Create an asset account for non-provider assets. - * - * A deposit will be taken from the signer account. - * - * - `origin`: Must be Signed; the signer account must have sufficient funds for a deposit - * to be taken. - * - `id`: The identifier of the asset for the account to be created. - * - * Emits `Touched` event when successful. - */ -"touch": Anonymize, -/** - * Return the deposit (if any) of an asset account or a consumer reference (if any) of an - * account. - * - * The origin must be Signed. - * - * - `id`: The identifier of the asset for which the caller would like the deposit - * refunded. - * - `allow_burn`: If `true` then assets may be destroyed in order to complete the refund. - * - * It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if - * the asset account contains holds or freezes in place. - * - * Emits `Refunded` event when successful. - */ -"refund": Anonymize, -/** - * Sets the minimum balance of an asset. - * - * Only works if there aren't any accounts that are holding the asset or if - * the new value of `min_balance` is less than the old one. - * - * Origin must be Signed and the sender has to be the Owner of the - * asset `id`. - * - * - `id`: The identifier of the asset. - * - `min_balance`: The new value of `min_balance`. - * - * Emits `AssetMinBalanceChanged` event when successful. - */ -"set_min_balance": Anonymize, -/** - * Create an asset account for `who`. - * - * A deposit will be taken from the signer account. - * - * - `origin`: Must be Signed; the signer account must have sufficient funds for a deposit - * to be taken. - * - `id`: The identifier of the asset for the account to be created, the asset status must - * be live. - * - `who`: The account to be created. - * - * Emits `Touched` event when successful. - */ -"touch_other": Anonymize, -/** - * Return the deposit (if any) of a target asset account. Useful if you are the depositor. - * - * The origin must be Signed and either the account owner, depositor, or asset `Admin`. In - * order to burn a non-zero balance of the asset, the caller must be the account and should - * use `refund`. - * - * - `id`: The identifier of the asset for the account holding a deposit. - * - `who`: The account to refund. - * - * It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if - * the asset account contains holds or freezes in place. - * - * Emits `Refunded` event when successful. - */ -"refund_other": Anonymize, -/** - * Disallow further unprivileged transfers of an asset `id` to and from an account `who`. - * - * Origin must be Signed and the sender should be the Freezer of the asset `id`. - * - * - `id`: The identifier of the account's asset. - * - `who`: The account to be unblocked. - * - * Emits `Blocked`. - * - * Weight: `O(1)` - */ -"block": Anonymize, -/** - * Transfer the entire transferable balance from the caller asset account. - * - * NOTE: This function only attempts to transfer _transferable_ balances. This means that - * any held, frozen, or minimum balance (when `keep_alive` is `true`), will not be - * transferred by this function. To ensure that this function results in a killed account, - * you might need to prepare the account by removing any reference counters, storage - * deposits, etc... - * - * The dispatch origin of this call must be Signed. - * - * - `id`: The identifier of the asset for the account holding a deposit. - * - `dest`: The recipient of the transfer. - * - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all - * of the funds the asset account has, causing the sender asset account to be killed - * (false), or transfer everything except at least the minimum balance, which will - * guarantee to keep the sender asset account alive (true). - */ -"transfer_all": Anonymize, -/** - * Sets the trusted reserve information of an asset. - * - * Origin must be the Owner of the asset `id`. The origin must conform to the configured - * `CreateOrigin` or be the signed `owner` configured during asset creation. - * - * - `id`: The identifier of the asset. - * - `reserves`: The full list of trusted reserves information. - * - * Emits `AssetMinBalanceChanged` event when successful. - */ -"set_reserves": Anonymize}>; - -export type I7t2thek61ghou = {"id": Anonymize, "admin": MultiAddress, "min_balance": bigint}; - -export type I61tdrsafr1vf3 = {"id": Anonymize, "owner": MultiAddress, "is_sufficient": boolean, "min_balance": bigint}; - -export type Ibsk5g3rhm45pu = {"id": Anonymize}; - -export type Icfoe9q8d4vs8f = {"id": Anonymize, "beneficiary": MultiAddress, "amount": bigint}; - -export type Ibrfmvjrg4trnb = {"id": Anonymize, "who": MultiAddress, "amount": bigint}; - -export type Iedih7t34maii9 = {"id": Anonymize, "target": MultiAddress, "amount": bigint}; - -export type I4e902qbfel1f1 = {"id": Anonymize, "source": MultiAddress, "dest": MultiAddress, "amount": bigint}; - -export type Ie4met0joi8sv0 = {"id": Anonymize, "who": MultiAddress}; - -export type I1t8vq6a06ohhu = {"id": Anonymize, "owner": MultiAddress}; - -export type Icvt3pdunbinm7 = {"id": Anonymize, "issuer": MultiAddress, "admin": MultiAddress, "freezer": MultiAddress}; - -export type I9ui3n41balr2q = {"id": Anonymize, "name": Uint8Array, "symbol": Uint8Array, "decimals": number}; - -export type I89sl7btgl24g2 = {"id": Anonymize, "name": Uint8Array, "symbol": Uint8Array, "decimals": number, "is_frozen": boolean}; - -export type I3u6g26k9kn96u = {"id": Anonymize, "owner": MultiAddress, "issuer": MultiAddress, "admin": MultiAddress, "freezer": MultiAddress, "min_balance": bigint, "is_sufficient": boolean, "is_frozen": boolean}; - -export type If1invp94rsjms = {"id": Anonymize, "delegate": MultiAddress, "amount": bigint}; - -export type Ie5nc19gtiv5sv = {"id": Anonymize, "delegate": MultiAddress}; - -export type Iald3dgvt1hjkb = {"id": Anonymize, "owner": MultiAddress, "delegate": MultiAddress}; - -export type Iurrhahet4gno = {"id": Anonymize, "owner": MultiAddress, "destination": MultiAddress, "amount": bigint}; - -export type I5tamv2nk8bj8o = {"id": Anonymize, "allow_burn": boolean}; - -export type I8apq8e7c7qcpp = {"id": Anonymize, "min_balance": bigint}; - -export type Id1e31ij0c35fv = {"id": Anonymize, "dest": MultiAddress, "keep_alive": boolean}; - -export type Ic6vatc0h2tbq8 = {"id": Anonymize, "reserves": Anonymize}; - -export type I5lh6k2tq92l6m = AnonymousEnum<{ -/** - * Initialize a conversion rate to native balance for the given asset. - * - * ## Complexity - * - O(1) - */ -"create": Anonymize, -/** - * Update the conversion rate to native balance for the given asset. - * - * ## Complexity - * - O(1) - */ -"update": Anonymize, -/** - * Remove an existing conversion rate to native balance for the given asset. - * - * ## Complexity - * - O(1) - */ -"remove": Anonymize}>; - -export type I9dpq5287dur8b = AnonymousEnum<{ -/** - * Set the list of invulnerable (fixed) collators. These collators must do some - * preparation, namely to have registered session keys. - * - * The call will remove any accounts that have not registered keys from the set. That is, - * it is non-atomic; the caller accepts all `AccountId`s passed in `new` _individually_ as - * acceptable Invulnerables, and is not proposing a _set_ of new Invulnerables. - * - * This call does not maintain mutual exclusivity of `Invulnerables` and `Candidates`. It - * is recommended to use a batch of `add_invulnerable` and `remove_invulnerable` instead. A - * `batch_all` can also be used to enforce atomicity. If any candidates are included in - * `new`, they should be removed with `remove_invulnerable_candidate` after execution. - * - * Must be called by the `UpdateOrigin`. - */ -"set_invulnerables": Anonymize, -/** - * Set the ideal number of non-invulnerable collators. If lowering this number, then the - * number of running collators could be higher than this figure. Aside from that edge case, - * there should be no other way to have more candidates than the desired number. - * - * The origin for this call must be the `UpdateOrigin`. - */ -"set_desired_candidates": Anonymize, -/** - * Set the candidacy bond amount. - * - * If the candidacy bond is increased by this call, all current candidates which have a - * deposit lower than the new bond will be kicked from the list and get their deposits - * back. - * - * The origin for this call must be the `UpdateOrigin`. - */ -"set_candidacy_bond": Anonymize, -/** - * Register this account as a collator candidate. The account must (a) already have - * registered session keys and (b) be able to reserve the `CandidacyBond`. - * - * This call is not available to `Invulnerable` collators. - */ -"register_as_candidate": undefined, -/** - * Deregister `origin` as a collator candidate. Note that the collator can only leave on - * session change. The `CandidacyBond` will be unreserved immediately. - * - * This call will fail if the total number of candidates would drop below - * `MinEligibleCollators`. - */ -"leave_intent": undefined, -/** - * Add a new account `who` to the list of `Invulnerables` collators. `who` must have - * registered session keys. If `who` is a candidate, they will be removed. - * - * The origin for this call must be the `UpdateOrigin`. - */ -"add_invulnerable": Anonymize, -/** - * Remove an account `who` from the list of `Invulnerables` collators. `Invulnerables` must - * be sorted. - * - * The origin for this call must be the `UpdateOrigin`. - */ -"remove_invulnerable": Anonymize, -/** - * Update the candidacy bond of collator candidate `origin` to a new amount `new_deposit`. - * - * Setting a `new_deposit` that is lower than the current deposit while `origin` is - * occupying a top-`DesiredCandidates` slot is not allowed. - * - * This call will fail if `origin` is not a collator candidate, the updated bond is lower - * than the minimum candidacy bond, and/or the amount cannot be reserved. - */ -"update_bond": Anonymize, -/** - * The caller `origin` replaces a candidate `target` in the collator candidate list by - * reserving `deposit`. The amount `deposit` reserved by the caller must be greater than - * the existing bond of the target it is trying to replace. - * - * This call will fail if the caller is already a collator candidate or invulnerable, the - * caller does not have registered session keys, the target is not a collator candidate, - * and/or the `deposit` amount cannot be reserved. - */ -"take_candidate_slot": Anonymize}>; - -export type Ifccifqltb5obi = {"new": Anonymize}; - -export type Iadtsfv699cq8b = {"max": number}; - -export type Ialpmgmhr3gk5r = {"bond": bigint}; - -export type I3sdol54kg5jaq = {"new_deposit": bigint}; - -export type I8fougodaj6di6 = {"deposit": bigint, "target": SS58String}; - -export type I77dda7hps0u37 = AnonymousEnum<{ -/** - * Sets the session key(s) of the function caller to `keys`. - * Allows an account to set its session key prior to becoming a validator. - * This doesn't take effect until the next session. - * - * The dispatch origin of this function must be signed. - * - * ## Complexity - * - `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is - * fixed. - */ -"set_keys": Anonymize, -/** - * Removes any session key(s) of the function caller. - * - * This doesn't take effect until the next session. - * - * The dispatch origin of this function must be Signed and the account must be either be - * convertible to a validator ID using the chain's typical addressing system (this usually - * means being a controller account) or directly convertible into a validator ID (which - * usually means being a stash account). - * - * ## Complexity - * - `O(1)` in number of key types. Actual cost depends on the number of length of - * `T::Keys::key_ids()` which is fixed. - */ -"purge_keys": undefined}>; - -export type I81vt5eq60l4b6 = {"keys": SizedHex<32>, "proof": Uint8Array}; - -export type Ib7tahn20bvsep = AnonymousEnum<{ -/** - * Suspends all XCM executions for the XCMP queue, regardless of the sender's origin. - * - * - `origin`: Must pass `ControllerOrigin`. - */ -"suspend_xcm_execution": undefined, -/** - * Resumes all XCM executions for the XCMP queue. - * - * Note that this function doesn't change the status of the in/out bound channels. - * - * - `origin`: Must pass `ControllerOrigin`. - */ -"resume_xcm_execution": undefined, -/** - * Overwrites the number of pages which must be in the queue for the other side to be - * told to suspend their sending. - * - * - `origin`: Must pass `Root`. - * - `new`: Desired value for `QueueConfigData.suspend_value` - */ -"update_suspend_threshold": Anonymize, -/** - * Overwrites the number of pages which must be in the queue after which we drop any - * further messages from the channel. - * - * - `origin`: Must pass `Root`. - * - `new`: Desired value for `QueueConfigData.drop_threshold` - */ -"update_drop_threshold": Anonymize, -/** - * Overwrites the number of pages which the queue must be reduced to before it signals - * that message sending may recommence after it has been suspended. - * - * - `origin`: Must pass `Root`. - * - `new`: Desired value for `QueueConfigData.resume_threshold` - */ -"update_resume_threshold": Anonymize}>; - -export type I3vh014cqgmrfd = {"new": number}; - -export type I6k1inef986368 = AnonymousEnum<{"send": Anonymize, -/** - * Teleport some assets from the local chain to some destination chain. - * - * **This function is deprecated: Use `limited_teleport_assets` instead.** - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, - * with all fees taken as needed from the asset. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` chain. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - */ -"teleport_assets": Anonymize, -/** - * Transfer some assets from the local chain to the destination chain through their local, - * destination or remote reserve. - * - * `assets` must have same reserve location and may not be teleportable to `dest`. - * - `assets` have local reserve: transfer assets to sovereign account of destination - * chain and forward a notification XCM to `dest` to mint and deposit reserve-based - * assets to `beneficiary`. - * - `assets` have destination reserve: burn local assets and forward a notification to - * `dest` chain to withdraw the reserve assets from this chain's sovereign account and - * deposit them to `beneficiary`. - * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move - * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` - * to mint and deposit reserve-based assets to `beneficiary`. - * - * **This function is deprecated: Use `limited_reserve_transfer_assets` instead.** - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, - * with all fees taken as needed from the asset. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - */ -"reserve_transfer_assets": Anonymize, -/** - * Execute an XCM message from a local, signed, origin. - * - * An event is deposited indicating whether `msg` could be executed completely or only - * partially. - * - * No more than `max_weight` will be used in its attempted execution. If this is less than - * the maximum amount of weight that the message could take to be executed, then no - * execution attempt will be made. - */ -"execute": Anonymize, -/** - * Extoll that a particular destination can be communicated with through a particular - * version of XCM. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `location`: The destination that is being described. - * - `xcm_version`: The latest version of XCM that `location` supports. - */ -"force_xcm_version": Anonymize, -/** - * Set a safe XCM version (the version that XCM should be encoded with if the most recent - * version a destination can accept is unknown). - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. - */ -"force_default_xcm_version": Anonymize, -/** - * Ask a location to notify us regarding their XCM version and any changes to it. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `location`: The location to which we should subscribe for XCM version notifications. - */ -"force_subscribe_version_notify": Anonymize, -/** - * Require that a particular destination should no longer notify us regarding any XCM - * version changes. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `location`: The location to which we are currently subscribed for XCM version - * notifications which we no longer desire. - */ -"force_unsubscribe_version_notify": Anonymize, -/** - * Transfer some assets from the local chain to the destination chain through their local, - * destination or remote reserve. - * - * `assets` must have same reserve location and may not be teleportable to `dest`. - * - `assets` have local reserve: transfer assets to sovereign account of destination - * chain and forward a notification XCM to `dest` to mint and deposit reserve-based - * assets to `beneficiary`. - * - `assets` have destination reserve: burn local assets and forward a notification to - * `dest` chain to withdraw the reserve assets from this chain's sovereign account and - * deposit them to `beneficiary`. - * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move - * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` - * to mint and deposit reserve-based assets to `beneficiary`. - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight - * is needed than `weight_limit`, then the operation will fail and the sent assets may be - * at risk. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -"limited_reserve_transfer_assets": Anonymize, -/** - * Teleport some assets from the local chain to some destination chain. - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight - * is needed than `weight_limit`, then the operation will fail and the sent assets may be - * at risk. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` chain. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -"limited_teleport_assets": Anonymize, -/** - * Set or unset the global suspension state of the XCM executor. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `suspended`: `true` to suspend, `false` to resume. - */ -"force_suspension": Anonymize, -/** - * Transfer some assets from the local chain to the destination chain through their local, - * destination or remote reserve, or through teleports. - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for - * `weight_limit` of weight. If more weight is needed than `weight_limit`, then the - * operation will fail and the sent assets may be at risk. - * - * `assets` (excluding `fees`) must have same reserve location or otherwise be teleportable - * to `dest`, no limitations imposed on `fees`. - * - for local reserve: transfer assets to sovereign account of destination chain and - * forward a notification XCM to `dest` to mint and deposit reserve-based assets to - * `beneficiary`. - * - for destination reserve: burn local assets and forward a notification to `dest` chain - * to withdraw the reserve assets from this chain's sovereign account and deposit them - * to `beneficiary`. - * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves - * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint - * and deposit reserve-based assets to `beneficiary`. - * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport - * assets and deposit them to `beneficiary`. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `X2(Parent, - * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send - * from relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -"transfer_assets": Anonymize, -/** - * Claims assets trapped on this pallet because of leftover assets during XCM execution. - * - * - `origin`: Anyone can call this extrinsic. - * - `assets`: The exact assets that were trapped. Use the version to specify what version - * was the latest when they were trapped. - * - `beneficiary`: The location/account where the claimed assets will be deposited. - */ -"claim_assets": Anonymize, -/** - * Transfer assets from the local chain to the destination chain using explicit transfer - * types for assets and fees. - * - * `assets` must have same reserve location or may be teleportable to `dest`. Caller must - * provide the `assets_transfer_type` to be used for `assets`: - * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination - * chain and forward a notification XCM to `dest` to mint and deposit reserve-based - * assets to `beneficiary`. - * - `TransferType::DestinationReserve`: burn local assets and forward a notification to - * `dest` chain to withdraw the reserve assets from this chain's sovereign account and - * deposit them to `beneficiary`. - * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` - * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another - * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically - * the remote `reserve` is Asset Hub. - * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to - * mint/teleport assets and deposit them to `beneficiary`. - * - * On the destination chain, as well as any intermediary hops, `BuyExecution` is used to - * buy execution using transferred `assets` identified by `remote_fees_id`. - * Make sure enough of the specified `remote_fees_id` asset is included in the given list - * of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight - * is needed than `weight_limit`, then the operation will fail and the sent assets may be - * at risk. - * - * `remote_fees_id` may use different transfer type than rest of `assets` and can be - * specified through `fees_transfer_type`. - * - * The caller needs to specify what should happen to the transferred assets once they reach - * the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which - * contains the instructions to execute on `dest` as a final step. - * This is usually as simple as: - * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, - * but could be something more exotic like sending the `assets` even further. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from - * parachain across a bridge to another ecosystem destination. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. - * - `remote_fees_id`: One of the included `assets` to be used to pay fees. - * - `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. - * - `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the - * transfer, which also determines what happens to the assets on the destination chain. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -"transfer_assets_using_type_and_then": Anonymize, -/** - * Authorize another `aliaser` location to alias into the local `origin` making this call. - * The `aliaser` is only authorized until the provided `expiry` block number. - * The call can also be used for a previously authorized alias in order to update its - * `expiry` block number. - * - * Usually useful to allow your local account to be aliased into from a remote location - * also under your control (like your account on another chain). - * - * WARNING: make sure the caller `origin` (you) trusts the `aliaser` location to act in - * their/your name. Once authorized using this call, the `aliaser` can freely impersonate - * `origin` in XCM programs executed on the local chain. - */ -"add_authorized_alias": Anonymize, -/** - * Remove a previously authorized `aliaser` from the list of locations that can alias into - * the local `origin` making this call. - */ -"remove_authorized_alias": Anonymize, -/** - * Remove all previously authorized `aliaser`s that can alias into the local `origin` - * making this call. - */ -"remove_all_authorized_aliases": undefined}>; - -export type Ia5cotcvi888ln = {"dest": XcmVersionedLocation, "message": XcmVersionedXcm}; - -export type XcmVersionedXcm = Enum<{"V3": Anonymize, "V4": Anonymize, "V5": Anonymize}>; -export const XcmVersionedXcm = _Enum as unknown as GetEnum; - -export type Ianvng4e08j9ii = Array; - -export type XcmV3Instruction = Enum<{"WithdrawAsset": Anonymize, "ReserveAssetDeposited": Anonymize, "ReceiveTeleportedAsset": Anonymize, "QueryResponse": {"query_id": bigint, "response": XcmV3Response, "max_weight": Anonymize, "querier"?: Anonymize}, "TransferAsset": {"assets": Anonymize, "beneficiary": Anonymize}, "TransferReserveAsset": {"assets": Anonymize, "dest": Anonymize, "xcm": Anonymize}, "Transact": Anonymize, "HrmpNewChannelOpenRequest": Anonymize, "HrmpChannelAccepted": Anonymize, "HrmpChannelClosing": Anonymize, "ClearOrigin": undefined, "DescendOrigin": XcmV3Junctions, "ReportError": Anonymize, "DepositAsset": {"assets": XcmV3MultiassetMultiAssetFilter, "beneficiary": Anonymize}, "DepositReserveAsset": {"assets": XcmV3MultiassetMultiAssetFilter, "dest": Anonymize, "xcm": Anonymize}, "ExchangeAsset": {"give": XcmV3MultiassetMultiAssetFilter, "want": Anonymize, "maximal": boolean}, "InitiateReserveWithdraw": {"assets": XcmV3MultiassetMultiAssetFilter, "reserve": Anonymize, "xcm": Anonymize}, "InitiateTeleport": {"assets": XcmV3MultiassetMultiAssetFilter, "dest": Anonymize, "xcm": Anonymize}, "ReportHolding": {"response_info": Anonymize, "assets": XcmV3MultiassetMultiAssetFilter}, "BuyExecution": {"fees": Anonymize, "weight_limit": XcmV3WeightLimit}, "RefundSurplus": undefined, "SetErrorHandler": Anonymize, "SetAppendix": Anonymize, "ClearError": undefined, "ClaimAsset": {"assets": Anonymize, "ticket": Anonymize}, "Trap": bigint, "SubscribeVersion": Anonymize, "UnsubscribeVersion": undefined, "BurnAsset": Anonymize, "ExpectAsset": Anonymize, "ExpectOrigin"?: Anonymize, "ExpectError"?: Anonymize, "ExpectTransactStatus": XcmV3MaybeErrorCode, "QueryPallet": Anonymize, "ExpectPallet": Anonymize, "ReportTransactStatus": Anonymize, "ClearTransactStatus": undefined, "UniversalOrigin": XcmV3Junction, "ExportMessage": {"network": XcmV3JunctionNetworkId, "destination": XcmV3Junctions, "xcm": Anonymize}, "LockAsset": {"asset": Anonymize, "unlocker": Anonymize}, "UnlockAsset": {"asset": Anonymize, "target": Anonymize}, "NoteUnlockable": {"asset": Anonymize, "owner": Anonymize}, "RequestUnlock": {"asset": Anonymize, "locker": Anonymize}, "SetFeesMode": Anonymize, "SetTopic": SizedHex<32>, "ClearTopic": undefined, "AliasOrigin": Anonymize, "UnpaidExecution": Anonymize}>; -export const XcmV3Instruction = _Enum as unknown as GetEnum; - -export type Ia9cgf4r40b26h = (Anonymize) | undefined; - -export type I92p6l5cs3fr50 = {"origin_kind": XcmV2OriginKind, "require_weight_at_most": Anonymize, "call": Uint8Array}; - -export type I4r3v6e91d1qbs = {"destination": Anonymize, "query_id": bigint, "max_weight": Anonymize}; - -export type XcmV3MultiassetMultiAssetFilter = Enum<{"Definite": Anonymize, "Wild": XcmV3MultiassetWildMultiAsset}>; -export const XcmV3MultiassetMultiAssetFilter = _Enum as unknown as GetEnum; - -export type XcmV3MultiassetWildMultiAsset = Enum<{"All": undefined, "AllOf": {"id": XcmV3MultiassetAssetId, "fun": XcmV2MultiassetWildFungibility}, "AllCounted": number, "AllOfCounted": {"id": XcmV3MultiassetAssetId, "fun": XcmV2MultiassetWildFungibility, "count": number}}>; -export const XcmV3MultiassetWildMultiAsset = _Enum as unknown as GetEnum; - -export type Iba5bdbapp16oo = {"module_name": Uint8Array, "response_info": Anonymize}; - -export type I40d50jeai33oq = {"weight_limit": XcmV3WeightLimit, "check_origin"?: Anonymize}; - -export type Iegrepoo0c1jc5 = Array; - -export type XcmV4Instruction = Enum<{"WithdrawAsset": Anonymize, "ReserveAssetDeposited": Anonymize, "ReceiveTeleportedAsset": Anonymize, "QueryResponse": {"query_id": bigint, "response": XcmV4Response, "max_weight": Anonymize, "querier"?: Anonymize}, "TransferAsset": {"assets": Anonymize, "beneficiary": Anonymize}, "TransferReserveAsset": {"assets": Anonymize, "dest": Anonymize, "xcm": Anonymize}, "Transact": Anonymize, "HrmpNewChannelOpenRequest": Anonymize, "HrmpChannelAccepted": Anonymize, "HrmpChannelClosing": Anonymize, "ClearOrigin": undefined, "DescendOrigin": XcmV3Junctions, "ReportError": Anonymize, "DepositAsset": {"assets": XcmV4AssetAssetFilter, "beneficiary": Anonymize}, "DepositReserveAsset": {"assets": XcmV4AssetAssetFilter, "dest": Anonymize, "xcm": Anonymize}, "ExchangeAsset": {"give": XcmV4AssetAssetFilter, "want": Anonymize, "maximal": boolean}, "InitiateReserveWithdraw": {"assets": XcmV4AssetAssetFilter, "reserve": Anonymize, "xcm": Anonymize}, "InitiateTeleport": {"assets": XcmV4AssetAssetFilter, "dest": Anonymize, "xcm": Anonymize}, "ReportHolding": {"response_info": Anonymize, "assets": XcmV4AssetAssetFilter}, "BuyExecution": {"fees": Anonymize, "weight_limit": XcmV3WeightLimit}, "RefundSurplus": undefined, "SetErrorHandler": Anonymize, "SetAppendix": Anonymize, "ClearError": undefined, "ClaimAsset": {"assets": Anonymize, "ticket": Anonymize}, "Trap": bigint, "SubscribeVersion": Anonymize, "UnsubscribeVersion": undefined, "BurnAsset": Anonymize, "ExpectAsset": Anonymize, "ExpectOrigin"?: Anonymize, "ExpectError"?: Anonymize, "ExpectTransactStatus": XcmV3MaybeErrorCode, "QueryPallet": Anonymize, "ExpectPallet": Anonymize, "ReportTransactStatus": Anonymize, "ClearTransactStatus": undefined, "UniversalOrigin": XcmV3Junction, "ExportMessage": {"network": XcmV3JunctionNetworkId, "destination": XcmV3Junctions, "xcm": Anonymize}, "LockAsset": {"asset": Anonymize, "unlocker": Anonymize}, "UnlockAsset": {"asset": Anonymize, "target": Anonymize}, "NoteUnlockable": {"asset": Anonymize, "owner": Anonymize}, "RequestUnlock": {"asset": Anonymize, "locker": Anonymize}, "SetFeesMode": Anonymize, "SetTopic": SizedHex<32>, "ClearTopic": undefined, "AliasOrigin": Anonymize, "UnpaidExecution": Anonymize}>; -export const XcmV4Instruction = _Enum as unknown as GetEnum; - -export type XcmV4AssetAssetFilter = Enum<{"Definite": Anonymize, "Wild": XcmV4AssetWildAsset}>; -export const XcmV4AssetAssetFilter = _Enum as unknown as GetEnum; - -export type XcmV4AssetWildAsset = Enum<{"All": undefined, "AllOf": {"id": Anonymize, "fun": XcmV2MultiassetWildFungibility}, "AllCounted": number, "AllOfCounted": {"id": Anonymize, "fun": XcmV2MultiassetWildFungibility, "count": number}}>; -export const XcmV4AssetWildAsset = _Enum as unknown as GetEnum; - -export type I21jsa919m88fd = {"dest": XcmVersionedLocation, "beneficiary": XcmVersionedLocation, "assets": XcmVersionedAssets, "fee_asset_item": number}; - -export type Iegif7m3upfe1k = {"message": XcmVersionedXcm, "max_weight": Anonymize}; - -export type Ic76kfh5ebqkpl = {"maybe_xcm_version"?: Anonymize}; - -export type Icscpmubum33bq = {"location": XcmVersionedLocation}; - -export type I21d2olof7eb60 = {"dest": XcmVersionedLocation, "beneficiary": XcmVersionedLocation, "assets": XcmVersionedAssets, "fee_asset_item": number, "weight_limit": XcmV3WeightLimit}; - -export type Ibgm4rnf22lal1 = {"suspended": boolean}; - -export type Ie68np0vpihith = {"assets": XcmVersionedAssets, "beneficiary": XcmVersionedLocation}; - -export type I9bnv6lu0crf1q = {"dest": XcmVersionedLocation, "assets": XcmVersionedAssets, "assets_transfer_type": Enum<{"Teleport": undefined, "LocalReserve": undefined, "DestinationReserve": undefined, "RemoteReserve": XcmVersionedLocation}>, "remote_fees_id": XcmVersionedAssetId, "fees_transfer_type": Enum<{"Teleport": undefined, "LocalReserve": undefined, "DestinationReserve": undefined, "RemoteReserve": XcmVersionedLocation}>, "custom_xcm_on_dest": XcmVersionedXcm, "weight_limit": XcmV3WeightLimit}; - -export type Iauhjqifrdklq7 = {"aliaser": XcmVersionedLocation, "expires"?: Anonymize}; - -export type Ie1uso9m8rt5cf = {"aliaser": XcmVersionedLocation}; - -export type Ic2uoe7jdksosp = AnonymousEnum<{ -/** - * Remove a page which has no more messages remaining to be processed or is stale. - */ -"reap_page": Anonymize, -/** - * Execute an overweight message. - * - * Temporary processing errors will be propagated whereas permanent errors are treated - * as success condition. - * - * - `origin`: Must be `Signed`. - * - `message_origin`: The origin from which the message to be executed arrived. - * - `page`: The page in the queue in which the message to be executed is sitting. - * - `index`: The index into the queue of the message to be executed. - * - `weight_limit`: The maximum amount of weight allowed to be consumed in the execution - * of the message. - * - * Benchmark complexity considerations: O(index + weight_limit). - */ -"execute_overweight": Anonymize}>; - -export type I40pqum1mu8qg3 = {"message_origin": Anonymize, "page_index": number}; - -export type I1r4c2ghbtvjuc = {"message_origin": Anonymize, "page": number, "index": number, "weight_limit": Anonymize}; - -export type I1lrb1j9ag11jt = AnonymousEnum<{ -/** - * Send a batch of dispatch calls. - * - * May be called from any origin except `None`. - * - * - `calls`: The calls to be dispatched from the same origin. The number of call must not - * exceed the constant: `batched_calls_limit` (available in constant metadata). - * - * If origin is root then the calls are dispatched without checking origin filter. (This - * includes bypassing `frame_system::Config::BaseCallFilter`). - * - * ## Complexity - * - O(C) where C is the number of calls to be batched. - * - * This will return `Ok` in all circumstances. To determine the success of the batch, an - * event is deposited. If a call failed and the batch was interrupted, then the - * `BatchInterrupted` event is deposited, along with the number of successful calls made - * and the error of the failed call. If all were successful, then the `BatchCompleted` - * event is deposited. - */ -"batch": Anonymize, -/** - * Send a call through an indexed pseudonym of the sender. - * - * Filter from origin are passed along. The call will be dispatched with an origin which - * use the same filter as the origin of this call. - * - * NOTE: If you need to ensure that any account-based filtering is not honored (i.e. - * because you expect `proxy` to have been used prior in the call stack and you do not want - * the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` - * in the Multisig pallet instead. - * - * NOTE: Prior to version *12, this was called `as_limited_sub`. - * - * The dispatch origin for this call must be _Signed_. - */ -"as_derivative": Anonymize, -/** - * Send a batch of dispatch calls and atomically execute them. - * The whole transaction will rollback and fail if any of the calls failed. - * - * May be called from any origin except `None`. - * - * - `calls`: The calls to be dispatched from the same origin. The number of call must not - * exceed the constant: `batched_calls_limit` (available in constant metadata). - * - * If origin is root then the calls are dispatched without checking origin filter. (This - * includes bypassing `frame_system::Config::BaseCallFilter`). - * - * ## Complexity - * - O(C) where C is the number of calls to be batched. - */ -"batch_all": Anonymize, -/** - * Dispatches a function call with a provided origin. - * - * The dispatch origin for this call must be _Root_. - * - * ## Complexity - * - O(1). - */ -"dispatch_as": Anonymize, -/** - * Send a batch of dispatch calls. - * Unlike `batch`, it allows errors and won't interrupt. - * - * May be called from any origin except `None`. - * - * - `calls`: The calls to be dispatched from the same origin. The number of call must not - * exceed the constant: `batched_calls_limit` (available in constant metadata). - * - * If origin is root then the calls are dispatch without checking origin filter. (This - * includes bypassing `frame_system::Config::BaseCallFilter`). - * - * ## Complexity - * - O(C) where C is the number of calls to be batched. - */ -"force_batch": Anonymize, -/** - * Dispatch a function call with a specified weight. - * - * This function does not check the weight of the call, and instead allows the - * Root origin to specify the weight of the call. - * - * The dispatch origin for this call must be _Root_. - */ -"with_weight": Anonymize, -/** - * Dispatch a fallback call in the event the main call fails to execute. - * May be called from any origin except `None`. - * - * This function first attempts to dispatch the `main` call. - * If the `main` call fails, the `fallback` is attemted. - * if the fallback is successfully dispatched, the weights of both calls - * are accumulated and an event containing the main call error is deposited. - * - * In the event of a fallback failure the whole call fails - * with the weights returned. - * - * - `main`: The main call to be dispatched. This is the primary action to execute. - * - `fallback`: The fallback call to be dispatched in case the `main` call fails. - * - * ## Dispatch Logic - * - If the origin is `root`, both the main and fallback calls are executed without - * applying any origin filters. - * - If the origin is not `root`, the origin filter is applied to both the `main` and - * `fallback` calls. - * - * ## Use Case - * - Some use cases might involve submitting a `batch` type call in either main, fallback - * or both. - */ -"if_else": Anonymize, -/** - * Dispatches a function call with a provided origin. - * - * Almost the same as [`Pallet::dispatch_as`] but forwards any error of the inner call. - * - * The dispatch origin for this call must be _Root_. - */ -"dispatch_as_fallible": Anonymize}>; - -export type I152bmabo1ja8r = {"calls": Array}; - -export type I5gr18losjkfla = {"index": number, "call": TxCallData}; - -export type Ia1a97fvmufuk9 = {"as_origin": Anonymize, "call": TxCallData}; - -export type Ier9vl0psdeggp = {"call": TxCallData, "weight": Anonymize}; - -export type I5rom81gl99ha6 = {"main": TxCallData, "fallback": TxCallData}; - -export type I3lgodtanj1u5q = AnonymousEnum<{ -/** - * Immediately dispatch a multi-signature call using a single approval from the caller. - * - * The dispatch origin for this call must be _Signed_. - * - * - `other_signatories`: The accounts (other than the sender) who are part of the - * multi-signature, but do not participate in the approval process. - * - `call`: The call to be executed. - * - * Result is equivalent to the dispatched result. - * - * ## Complexity - * O(Z + C) where Z is the length of the call and C its execution weight. - */ -"as_multi_threshold_1": Anonymize, -/** - * Register approval for a dispatch to be made from a deterministic composite account if - * approved by a total of `threshold - 1` of `other_signatories`. - * - * If there are enough, then dispatch the call. - * - * Payment: `DepositBase` will be reserved if this is the first approval, plus - * `threshold` times `DepositFactor`. It is returned once this dispatch happens or - * is cancelled. - * - * The dispatch origin for this call must be _Signed_. - * - * - `threshold`: The total number of approvals for this dispatch before it is executed. - * - `other_signatories`: The accounts (other than the sender) who can approve this - * dispatch. May not be empty. - * - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is - * not the first approval, then it must be `Some`, with the timepoint (block number and - * transaction index) of the first approval transaction. - * - `call`: The call to be executed. - * - * NOTE: Unless this is the final approval, you will generally want to use - * `approve_as_multi` instead, since it only requires a hash of the call. - * - * Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise - * on success, result is `Ok` and the result from the interior call, if it was executed, - * may be found in the deposited `MultisigExecuted` event. - * - * ## Complexity - * - `O(S + Z + Call)`. - * - Up to one balance-reserve or unreserve operation. - * - One passthrough operation, one insert, both `O(S)` where `S` is the number of - * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. - * - One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. - * - One encode & hash, both of complexity `O(S)`. - * - Up to one binary search and insert (`O(logS + S)`). - * - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. - * - One event. - * - The weight of the `call`. - * - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit - * taken for its lifetime of `DepositBase + threshold * DepositFactor`. - */ -"as_multi": Anonymize, -/** - * Register approval for a dispatch to be made from a deterministic composite account if - * approved by a total of `threshold - 1` of `other_signatories`. - * - * Payment: `DepositBase` will be reserved if this is the first approval, plus - * `threshold` times `DepositFactor`. It is returned once this dispatch happens or - * is cancelled. - * - * The dispatch origin for this call must be _Signed_. - * - * - `threshold`: The total number of approvals for this dispatch before it is executed. - * - `other_signatories`: The accounts (other than the sender) who can approve this - * dispatch. May not be empty. - * - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is - * not the first approval, then it must be `Some`, with the timepoint (block number and - * transaction index) of the first approval transaction. - * - `call_hash`: The hash of the call to be executed. - * - * NOTE: If this is the final approval, you will want to use `as_multi` instead. - * - * ## Complexity - * - `O(S)`. - * - Up to one balance-reserve or unreserve operation. - * - One passthrough operation, one insert, both `O(S)` where `S` is the number of - * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. - * - One encode & hash, both of complexity `O(S)`. - * - Up to one binary search and insert (`O(logS + S)`). - * - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. - * - One event. - * - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit - * taken for its lifetime of `DepositBase + threshold * DepositFactor`. - */ -"approve_as_multi": Anonymize, -/** - * Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously - * for this operation will be unreserved on success. - * - * The dispatch origin for this call must be _Signed_. - * - * - `threshold`: The total number of approvals for this dispatch before it is executed. - * - `other_signatories`: The accounts (other than the sender) who can approve this - * dispatch. May not be empty. - * - `timepoint`: The timepoint (block number and transaction index) of the first approval - * transaction for this dispatch. - * - `call_hash`: The hash of the call to be executed. - * - * ## Complexity - * - `O(S)`. - * - Up to one balance-reserve or unreserve operation. - * - One passthrough operation, one insert, both `O(S)` where `S` is the number of - * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. - * - One encode & hash, both of complexity `O(S)`. - * - One event. - * - I/O: 1 read `O(S)`, one remove. - * - Storage: removes one item. - */ -"cancel_as_multi": Anonymize, -/** - * Poke the deposit reserved for an existing multisig operation. - * - * The dispatch origin for this call must be _Signed_ and must be the original depositor of - * the multisig operation. - * - * The transaction fee is waived if the deposit amount has changed. - * - * - `threshold`: The total number of approvals needed for this multisig. - * - `other_signatories`: The accounts (other than the sender) who are part of the - * multisig. - * - `call_hash`: The hash of the call this deposit is reserved for. - * - * Emits `DepositPoked` if successful. - */ -"poke_deposit": Anonymize}>; - -export type I7bfb7cb54ioch = {"other_signatories": Anonymize, "call": TxCallData}; - -export type Iant3bti5h6pr5 = {"threshold": number, "other_signatories": Anonymize, "maybe_timepoint"?: Anonymize, "call": TxCallData, "max_weight": Anonymize}; - -export type I95jfd8j5cr5eh = (Anonymize) | undefined; - -export type Ideaemvoneh309 = {"threshold": number, "other_signatories": Anonymize, "maybe_timepoint"?: Anonymize, "call_hash": SizedHex<32>, "max_weight": Anonymize}; - -export type I3d9o9d7epp66v = {"threshold": number, "other_signatories": Anonymize, "timepoint": Anonymize, "call_hash": SizedHex<32>}; - -export type I6lqh1vgb4mcja = {"threshold": number, "other_signatories": Anonymize, "call_hash": SizedHex<32>}; - -export type Iet0lhejv1ea1t = AnonymousEnum<{ -/** - * Authenticates the sudo key and dispatches a function call with `Root` origin. - */ -"sudo": Anonymize, -/** - * Authenticates the sudo key and dispatches a function call with `Root` origin. - * This function does not check the weight of the call, and instead allows the - * Sudo user to specify the weight of the call. - * - * The dispatch origin for this call must be _Signed_. - */ -"sudo_unchecked_weight": Anonymize, -/** - * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo - * key. - */ -"set_key": Anonymize, -/** - * Authenticates the sudo key and dispatches a function call with `Signed` origin from - * a given account. - * - * The dispatch origin for this call must be _Signed_. - */ -"sudo_as": Anonymize, -/** - * Permanently removes the sudo key. - * - * **This cannot be un-done.** - */ -"remove_key": undefined}>; - -export type Ifbu3sk81n1s98 = {"call": TxCallData}; - -export type I8k3rnvpeeh4hv = {"new": MultiAddress}; - -export type Ibm3nepcfano8f = {"who": MultiAddress, "call": TxCallData}; - -export type I1mbimc2g4f9c7 = AnonymousEnum<{ -/** - * Dispatch the given `call` from an account that the sender is authorised for through - * `add_proxy`. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. - * - `call`: The call to be made by the `real` account. - */ -"proxy": Anonymize, -/** - * Register a proxy account for the sender that is able to make calls on its behalf. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `proxy`: The account that the `caller` would like to make a proxy. - * - `proxy_type`: The permissions allowed for this proxy account. - * - `delay`: The announcement period required of the initial proxy. Will generally be - * zero. - */ -"add_proxy": Anonymize, -/** - * Unregister a proxy account for the sender. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `proxy`: The account that the `caller` would like to remove as a proxy. - * - `proxy_type`: The permissions currently enabled for the removed proxy account. - */ -"remove_proxy": Anonymize, -/** - * Unregister all proxy accounts for the sender. - * - * The dispatch origin for this call must be _Signed_. - * - * WARNING: This may be called on accounts created by `create_pure`, however if done, then - * the unreserved fees will be inaccessible. **All access to this account will be lost.** - */ -"remove_proxies": undefined, -/** - * Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and - * initialize it with a proxy of `proxy_type` for `origin` sender. - * - * Requires a `Signed` origin. - * - * - `proxy_type`: The type of the proxy that the sender will be registered as over the - * new account. This will almost always be the most permissive `ProxyType` possible to - * allow for maximum flexibility. - * - `index`: A disambiguation index, in case this is called multiple times in the same - * transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just - * want to use `0`. - * - `delay`: The announcement period required of the initial proxy. Will generally be - * zero. - * - * Fails with `Duplicate` if this has already been called in this transaction, from the - * same sender, with the same parameters. - * - * Fails if there are insufficient funds to pay for deposit. - */ -"create_pure": Anonymize, -/** - * Removes a previously spawned pure proxy. - * - * WARNING: **All access to this account will be lost.** Any funds held in it will be - * inaccessible. - * - * Requires a `Signed` origin, and the sender account must have been created by a call to - * `create_pure` with corresponding parameters. - * - * - `spawner`: The account that originally called `create_pure` to create this account. - * - `index`: The disambiguation index originally passed to `create_pure`. Probably `0`. - * - `proxy_type`: The proxy type originally passed to `create_pure`. - * - `height`: The height of the chain when the call to `create_pure` was processed. - * - `ext_index`: The extrinsic index in which the call to `create_pure` was processed. - * - * Fails with `NoPermission` in case the caller is not a previously created pure - * account whose `create_pure` call has corresponding parameters. - */ -"kill_pure": Anonymize, -/** - * Publish the hash of a proxy-call that will be made in the future. - * - * This must be called some number of blocks before the corresponding `proxy` is attempted - * if the delay associated with the proxy relationship is greater than zero. - * - * No more than `MaxPending` announcements may be made at any one time. - * - * This will take a deposit of `AnnouncementDepositFactor` as well as - * `AnnouncementDepositBase` if there are no other pending announcements. - * - * The dispatch origin for this call must be _Signed_ and a proxy of `real`. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `call_hash`: The hash of the call to be made by the `real` account. - */ -"announce": Anonymize, -/** - * Remove a given announcement. - * - * May be called by a proxy account to remove a call they previously announced and return - * the deposit. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `call_hash`: The hash of the call to be made by the `real` account. - */ -"remove_announcement": Anonymize, -/** - * Remove the given announcement of a delegate. - * - * May be called by a target (proxied) account to remove a call that one of their delegates - * (`delegate`) has announced they want to execute. The deposit is returned. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `delegate`: The account that previously announced the call. - * - `call_hash`: The hash of the call to be made. - */ -"reject_announcement": Anonymize, -/** - * Dispatch the given `call` from an account that the sender is authorized for through - * `add_proxy`. - * - * Removes any corresponding announcement(s). - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. - * - `call`: The call to be made by the `real` account. - */ -"proxy_announced": Anonymize, -/** - * Poke / Adjust deposits made for proxies and announcements based on current values. - * This can be used by accounts to possibly lower their locked amount. - * - * The dispatch origin for this call must be _Signed_. - * - * The transaction fee is waived if the deposit amount has changed. - * - * Emits `DepositPoked` if successful. - */ -"poke_deposit": undefined}>; - -export type I85imvra134bvp = {"real": MultiAddress, "force_proxy_type"?: Anonymize, "call": TxCallData}; - -export type Icdvjlkfnoshag = (Anonymize) | undefined; - -export type I6hk7temg1mga7 = {"delegate": MultiAddress, "proxy_type": Anonymize, "delay": number}; - -export type I2lbmfajhc5gdu = {"proxy_type": Anonymize, "delay": number, "index": number}; - -export type I2siheq6f2djrd = {"spawner": MultiAddress, "proxy_type": Anonymize, "index": number, "height": number, "ext_index": number}; - -export type I2eb501t8s6hsq = {"real": MultiAddress, "call_hash": SizedHex<32>}; - -export type Ianmuoljk2sk1u = {"delegate": MultiAddress, "call_hash": SizedHex<32>}; - -export type I6neqijlncmft9 = {"delegate": MultiAddress, "real": MultiAddress, "force_proxy_type"?: Anonymize, "call": TxCallData}; - -export type I2ig59mlqf9md7 = AnonymousEnum<{ -/** - * Add a registrar to the system. - * - * The dispatch origin for this call must be `T::RegistrarOrigin`. - * - * - `account`: the account of the registrar. - * - * Emits `RegistrarAdded` if successful. - */ -"add_registrar": Anonymize, -/** - * Set an account's identity information and reserve the appropriate deposit. - * - * If the account already has identity information, the deposit is taken as part payment - * for the new deposit. - * - * The dispatch origin for this call must be _Signed_. - * - * - `info`: The identity information. - * - * Emits `IdentitySet` if successful. - */ -"set_identity": Anonymize, -/** - * Set the sub-accounts of the sender. - * - * Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned - * and an amount `SubAccountDeposit` will be reserved for each item in `subs`. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * identity. - * - * - `subs`: The identity's (new) sub-accounts. - */ -"set_subs": Anonymize, -/** - * Clear an account's identity info and all sub-accounts and return all deposits. - * - * Payment: All reserved balances on the account are returned. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * identity. - * - * Emits `IdentityCleared` if successful. - */ -"clear_identity": undefined, -/** - * Request a judgement from a registrar. - * - * Payment: At most `max_fee` will be reserved for payment to the registrar if judgement - * given. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a - * registered identity. - * - * - `reg_index`: The index of the registrar whose judgement is requested. - * - `max_fee`: The maximum fee that may be paid. This should just be auto-populated as: - * - * ```nocompile - * Self::registrars().get(reg_index).unwrap().fee - * ``` - * - * Emits `JudgementRequested` if successful. - */ -"request_judgement": Anonymize, -/** - * Cancel a previous request. - * - * Payment: A previously reserved deposit is returned on success. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a - * registered identity. - * - * - `reg_index`: The index of the registrar whose judgement is no longer requested. - * - * Emits `JudgementUnrequested` if successful. - */ -"cancel_request": Anonymize, -/** - * Set the fee required for a judgement to be requested from a registrar. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `index`. - * - * - `index`: the index of the registrar whose fee is to be set. - * - `fee`: the new fee. - */ -"set_fee": Anonymize, -/** - * Change the account associated with a registrar. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `index`. - * - * - `index`: the index of the registrar whose fee is to be set. - * - `new`: the new account ID. - */ -"set_account_id": Anonymize, -/** - * Set the field information for a registrar. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `index`. - * - * - `index`: the index of the registrar whose fee is to be set. - * - `fields`: the fields that the registrar concerns themselves with. - */ -"set_fields": Anonymize, -/** - * Provide a judgement for an account's identity. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `reg_index`. - * - * - `reg_index`: the index of the registrar whose judgement is being made. - * - `target`: the account whose identity the judgement is upon. This must be an account - * with a registered identity. - * - `judgement`: the judgement of the registrar of index `reg_index` about `target`. - * - `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is - * provided. - * - * Note: Judgements do not apply to a username. - * - * Emits `JudgementGiven` if successful. - */ -"provide_judgement": Anonymize, -/** - * Remove an account's identity and sub-account information and slash the deposits. - * - * Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by - * `Slash`. Verification request deposits are not returned; they should be cancelled - * manually using `cancel_request`. - * - * The dispatch origin for this call must match `T::ForceOrigin`. - * - * - `target`: the account whose identity the judgement is upon. This must be an account - * with a registered identity. - * - * Emits `IdentityKilled` if successful. - */ -"kill_identity": Anonymize, -/** - * Add the given account to the sender's subs. - * - * Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated - * to the sender. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * sub identity of `sub`. - */ -"add_sub": Anonymize, -/** - * Alter the associated name of the given sub-account. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * sub identity of `sub`. - */ -"rename_sub": Anonymize, -/** - * Remove the given account from the sender's subs. - * - * Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated - * to the sender. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * sub identity of `sub`. - */ -"remove_sub": Anonymize, -/** - * Remove the sender as a sub-account. - * - * Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated - * to the sender (*not* the original depositor). - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * super-identity. - * - * NOTE: This should not normally be used, but is provided in the case that the non- - * controller of an account is maliciously registered as a sub-account. - */ -"quit_sub": undefined, -/** - * Add an `AccountId` with permission to grant usernames with a given `suffix` appended. - * - * The authority can grant up to `allocation` usernames. To top up the allocation or - * change the account used to grant usernames, this call can be used with the updated - * parameters to overwrite the existing configuration. - */ -"add_username_authority": Anonymize, -/** - * Remove `authority` from the username authorities. - */ -"remove_username_authority": Anonymize, -/** - * Set the username for `who`. Must be called by a username authority. - * - * If `use_allocation` is set, the authority must have a username allocation available to - * spend. Otherwise, the authority will need to put up a deposit for registering the - * username. - * - * Users can either pre-sign their usernames or - * accept them later. - * - * Usernames must: - * - Only contain lowercase ASCII characters or digits. - * - When combined with the suffix of the issuing authority be _less than_ the - * `MaxUsernameLength`. - */ -"set_username_for": Anonymize, -/** - * Accept a given username that an `authority` granted. The call must include the full - * username, as in `username.suffix`. Authorities cannot grant usernames to people, only - * to regular accounts. - */ -"accept_username": Anonymize, -/** - * Remove an expired username approval. The username was approved by an authority but never - * accepted by the user and must now be beyond its expiration. The call must include the - * full username, as in `username.suffix`. - */ -"remove_expired_approval": Anonymize, -/** - * Set a given username as the primary. The username should include the suffix. Only - * regular accounts can set their primary username, as people can only have one username, - * granted through a system allocation. - */ -"set_primary_username": Anonymize, -/** - * Start the process of removing a username by placing it in the unbinding usernames map. - * Once the grace period has passed, the username can be deleted by calling - * [remove_username](crate::Call::remove_username). - */ -"unbind_username": Anonymize, -/** - * Permanently delete a username which has been unbinding for longer than the grace period. - * Caller is refunded the fee if the username expired and the removal was successful. - */ -"remove_username": Anonymize, -/** - * Call with [ForceOrigin](crate::Config::ForceOrigin) privileges which deletes a username - * and slashes any deposit associated with it. - */ -"kill_username": Anonymize, -/** - * Sets the username and on-chain account for a person, along with an empty identity which - * can only be populated using an oracle through the social credential verification system. - * The chosen username must be domainless. - * - * The sender must sign the alias using the key associated with the provided on-chain - * account to prove ownership. - * - * The dispatch origin for this call must be the contextual alias of the person and the - * sender must not have already registered their identity and username. - * - * Emits `PersonalIdentitySet` if successful. - */ -"set_personal_identity": Anonymize, -/** - * Open a case for an oracle to judge a social credential of a person. - * - * The dispatch origin for this call must be the contextual alias of the person and the - * sender must have a registered identity. - * - * Emits `EvidenceSubmitted` if successful. - */ -"submit_personal_credential_evidence": Anonymize, -/** - * Callback to enforce the judgement of a social credential. This is to be called only by - * the oracle that judged the case. - */ -"personal_credential_judged": Anonymize, -/** - * Clear a person's identity info. The sender must pay a penalty through the associated - * alias account for removing the identity. - * - * The dispatch origin for this call must be the contextual alias of the person and the - * sender must have a registered identity. - * - * Emits `IdentityPersonalCleared` if successful. - */ -"clear_personal_identity": undefined, -/** - * Report a username as invalid/offensive/wrong/anything else. - * - * The dispatch origin for this call must be a signed extrinsic. - * - * - `username`: The username to be reported. - */ -"report_username": Anonymize, -/** - * Given judgement on a previously reported username either: - * 1. In case username was found valid: - * - slashes the amount deposited by the reporter, - * - does nothing to the identity behind the reported username, - * 2. In case username was found invalid: - * - returns the deposited funds to the reporter, - * - bans the identity behind the reported username. - * Serves as a callback used upon judgement request to the oracle. - * Must only be used by the statement oracle. - */ -"reported_username_judged": Anonymize}>; - -export type Ic6cqd9g0t65v0 = {"account": MultiAddress}; - -export type I5sv83ib1q5mod = {"info": Anonymize}; - -export type Ia9mkdf6l44shb = {"subs": Array>}; - -export type I9l2s4klu0831o = {"reg_index": number, "max_fee": bigint}; - -export type I2ctrt5nqb8o7c = {"reg_index": number}; - -export type I711qahikocb1c = {"index": number, "fee": bigint}; - -export type I6o1er683vod1j = {"index": number, "new": MultiAddress}; - -export type Id6gojh30v9ib2 = {"index": number, "fields": bigint}; - -export type Ibk29mtr51rukj = {"reg_index": number, "target": MultiAddress, "judgement": Anonymize, "identity": SizedHex<32>}; - -export type Id9uqtigc0il3v = {"target": MultiAddress}; - -export type Ic68lsi7chpv5k = {"sub": MultiAddress, "data": IdentityData}; - -export type Iek0boln8pgnko = {"sub": MultiAddress}; - -export type I452bkd71b385t = {"authority": MultiAddress, "suffix": Uint8Array, "allocation": number}; - -export type Ie83f0p0ke1f4u = {"suffix": Uint8Array, "authority": MultiAddress}; - -export type Ib9nmpn9ru9aeh = {"who": MultiAddress, "username": Uint8Array, "signature"?: (Anonymize) | undefined, "use_allocation": boolean}; - -export type I3fo6882e5tjh8 = AnonymousEnum<{"Ed25519": SizedHex<64>, "Sr25519": SizedHex<64>, "Ecdsa": SizedHex<65>, "Eth": SizedHex<65>}>; - -export type I6b6ng21g2eap6 = {"account": SS58String, "signature": Anonymize, "username": Uint8Array}; - -export type Ia5eqng70q48q6 = {"credential": Anonymize}; - -export type I79nh52dspn15s = {"ticket": number, "context": Uint8Array, "judgement": Anonymize}; - -export type I5p4kcd7d4mpq7 = AnonymousEnum<{ -/** - * Dispatch a call under an alias using the `account <-> alias` mapping. - * - * This is a call version of the transaction extension `AsPersonalAliasWithAccount`. - * It is recommended to use the transaction extension instead when suitable. - */ -"under_alias": Anonymize, -/** - * This transaction is refunded if successful and no alias was previously set. - * - * The call is valid from `call_valid_at` until - * `call_valid_at + account_setup_time_tolerance`. - * `account_setup_time_tolerance` is a constant available in the metadata. - * - * Parameters: - * - `account`: The account to set the alias for. - * - `call_valid_at`: The block number when the call becomes valid. - */ -"set_alias_account": Anonymize, -/** - * Remove the mapping from a particular alias to its registered account. - */ -"unset_alias_account": undefined, -/** - * Recognize a set of people without any additional checks. - * - * The people are identified by the provided list of keys and will each be assigned, in - * order, the next available personal ID. - * - * The origin for this call must have root privileges. - */ -"force_recognize_personhood": Anonymize, -/** - * Set a personal id account. - * - * The account can then be used to sign transactions on behalf of the personal id, and - * provide replay protection with the nonce. - * - * This transaction is refunded if successful and no account was previously set for the - * personal id. - * - * The call is valid from `call_valid_at` until - * `call_valid_at + account_setup_time_tolerance`. - * `account_setup_time_tolerance` is a constant available in the metadata. - * - * Parameters: - * - `account`: The account to set the alias for. - * - `call_valid_at`: The block number when the call becomes valid. - */ -"set_personal_id_account": Anonymize, -/** - * Unset the personal id account. - */ -"unset_personal_id_account": undefined, -/** - * Create the people collection. - * - * This call is valid only if the collection doesn't exist yet. Once created, - * this call cannot be executed again. - * - * The collection is created with a fixed configuration: - * - Owner: Configured via `CollectionOwner` type - * - Onboarding size: `PEOPLE_ONBOARDING_SIZE` (10) - * - Mode: `Flexible` - * - Ring size: `R2e9` - */ -"create_people_collection": undefined}>; - -export type I6viutd279aov3 = {"account": SS58String, "call_valid_at": number}; - -export type Id7gcu75dd10kk = AnonymousEnum<{ -/** - * Feeless on success (determined only by top three lines). - */ -"vote": Anonymize, "close_case": Anonymize, -/** - * Origin must be `None`. The transaction is validated in `ValidateUnsigned` - * when the source is local (e.g. from the offchain worker). For external transactions, use - * `clean_vote_signed`. - */ -"clean_vote": Anonymize, "reap_case": Anonymize, "intervene": Anonymize, -/** - * A person claims the mob credit associated with a correct vote on a case. - * The case must be `Done`. - */ -"claim_vote": Anonymize, -/** - * A person converts their claimed mob credit into a direct transfer. - */ -"payout_rewards": Anonymize, -/** - * A person claims multiple mob credits associated a correct vote on a case. The - * case must be `Done`. - */ -"claim_votes": Anonymize, "start_payout_round": undefined, "schedule_payout_rounds": Anonymize, "remove_payout_schedule": Anonymize, "claim_credit": undefined, "clean_points": Anonymize, "force_ripen_case": Anonymize, "touch_case": Anonymize, "clear_voting_penalty": undefined, -/** - * Origin must be signed. - */ -"clean_vote_signed": Anonymize}>; - -export type Ia56ucs8f4gubv = {"case_index": number, "opinion": Anonymize}; - -export type I6a7ia4g91p320 = {"destination": SS58String}; - -export type I7iebj213rflmh = {"case_indices": Anonymize}; - -export type I3os0pogm2iim9 = AnonymousEnum<{ -/** - * - Declare intention to get a tattoo. - * - Deposit is taken. - * - `InkType` may not be `ProceduralDerivative`. - */ -"apply": undefined, -/** - * - Open a judicial case to judge the `evidence`. - * - Calls Judicial/`JudgeStatement(POI_HASH, evidence)` - * - Needs `SignedExtension` to avoid upfront requirement for fee if `judgements == 0`. - * - If `judgements > 0`, then an additional fee should be charged into Treasury. - */ -"submit_evidence": Anonymize, -/** - * Is called by the Oracle when the evidence has been judged. - */ -"judged": Anonymize, -/** - * - Gets a new `index` - * - Puts an entry into `People`. - * - Calls People/`newPerson(index, key)` - * - * # Arguments - * * `key` - The personal identity to register. - * * `destination` - The account receiving the candidate's referral reward. - * * `proof_of_ownerhsip` - The signature of predefined prefix `"pop register using"` - * concatenated with the sender account id. - */ -"register_referred": Anonymize, -/** - * - Gets a new `index` - * - Puts an entry into `People`. - * - Calls People/`newPerson(index, key)` - * - * # Arguments - * * `key` - The personal identity to register. - * * `destination` - The account receiving rewards. - * * `proof_of_ownerhsip` - The signature of predefined prefix `"pop register using"` - * concatenated with the sender account id. - * - * # Warning: - * - * This call can pay two rewards to the same account for non-referred candidates. - * The app is responsible for any additional privacy handling after transfer. - */ -"register_non_referred": Anonymize, "reroll": undefined, -/** - * Commit to a design and authorize the storage for (possibly just initial) evidence. - * - * If a specific personal identity is required, then this can be placed in `require_id`. - * This can be any unused/unreserved personal identity no greater than the `NextId` - * counter. - */ -"commit": Anonymize, "allocate_full": undefined, -/** - * Once a timeout passes, removes a candidate who is selected but not yet proven. - * If the candidate was referred then referral is bad, if candidate applied with deposit, - * deposit is slashed. - */ -"timeout": Anonymize, -/** - * Remove a candidate who has not yet committed. - */ -"flakeout": undefined, -/** - * Utilize a referral signature. - * - * The payload to be signed by the referrer using their registered key pair is the encoded - * bytes of the account ID of the candidate. - */ -"apply_with_signature": Anonymize, -/** - * Apply to the Proof-of-Ink process with an invitation. - * - * The payload to be signed by the inviter using their registered key pair is the encoded - * bytes of the account ID of the candidate. - */ -"apply_with_invitation": Anonymize, -/** - * Add a design family. Must have privileged access to do this. - */ -"add_design_family": Anonymize, -/** - * Add a referral ticket associated with a person. - * - * Only one referral ticket may be active at any given time for one person. Calling this - * extrinsic while a valid ticket is set will overwrite the existing ticket. - * - * If any pending referral rewards are present, they need to be registered first. - */ -"set_referral_ticket": Anonymize, -/** - * Cancel a referral ticket associated with a person. - */ -"cancel_referral_ticket": Anonymize, "register_successful_referral_reward": Anonymize, -/** - * Grants invites to an account so they can distribute them. - * - * The origin must be `InvitationsOrigin. - * - * - `account`: The account to give invites to. - * - `count`: The number of invites to give. - */ -"grant_invites": Anonymize, -/** - * Remove all invites given to an account. - * - * The origin must be `InvitationsOrigin`. - * - * - `account`: The account to remove all invites from. - * - `limit`: The maximum number of pending invites to remove. - */ -"remove_available_and_pending_invites": Anonymize, -/** - * Invite an account. - * - * The origin must be signed by an account and have some invites left. - * - * - `ticket`: The invite ticket to set. - */ -"set_invite_ticket": Anonymize, -/** - * Cancel an invitation. - * - * The origin must be signed by the account that owns the ticket to cancel. - * - * - `ticket`: The invite ticket to cancel. - */ -"cancel_invite_ticket": Anonymize, -/** - * Set the configuration record. Must have privileged access to do this. - */ -"set_configuration": Anonymize, -/** - * Set the values of the reimbursement awarded to referred candidates as well as their - * referrers, along with the number of reimbursements for each value. These values are - * stored in - * reverse order of their priority, so the last value in the list will be the first one - * to be used by the reimbursement system. The length of the two lists must be equal. - * - * WARNING! - * - * After the number of reimbursements is exhausted for a value in the list, the pallet - * starts using the next value immediately for future transfers. - */ -"set_reimbursement_values": Anonymize}>; - -export type I2t4r3qi2bbfq5 = {"evidence": SizedHex<32>}; - -export type In8qsbu1v3duv = {"key": SizedHex<32>, "destination": SS58String, "proof_of_ownership": SizedHex<96>}; - -export type I9cpejm8q1n41i = {"choice": Enum<{"DesignedElective": Anonymize, "ProceduralAccount": number, "ProceduralPersonal": number, "Procedural": Anonymize, "ProceduralDerivative": [bigint, Anonymize]}>, "require_id"?: Anonymize}; - -export type I48li8do1boqsk = {"referrer": bigint, "signature": Anonymize, "ticket": SS58String}; - -export type I8cj8rnq5f1nol = {"inviter": SS58String, "ticket": SS58String, "signature": Anonymize}; - -export type I95p7g3tmk59ap = {"ticket": SS58String}; - -export type Id8vsjdockv55e = {"account": SS58String, "limit": number}; - -export type I1b497vgt5ie3v = {"referred_values": Anonymize, "referrer_values": Anonymize}; - -export type I6jae6u05fbnsi = AnonymousEnum<{ -/** - * Sign up for the game using an account and an invite. - * - * This is for new players or archived players, other players should use - * [`Pallet::sign_up_with_account`] for free. - * - * A game must be ongoing and in its registration phase. - * - * The origin must be a signed by an account and use the `GameAsInvited` extension. - */ -"sign_up_with_invite": Anonymize, -/** - * Sign up for the game using an account. - * - * If the player is new or archived, then a deposit will be taken from the signer. - * Otherwise the call is free. - * - * A game must be ongoing and in its registration phase. - * - * The origin must be signed by an account, or, be signed by an account and use - * `ScoreAsParticipant` extension. - */ -"sign_up_with_account": Anonymize, -/** - * Sign up for the game. - * - * If a player is already recognized by another DIM, they can sign using their alias and - * don't need any deposit or invite to prove their initial credibility. - * On top of this their score is never going below personhood threshold and the player will - * never get archived. - * - * A game must be ongoing and in its registration phase. - * - * The origin must be a personal alias. - * - * Parameters: - * - `statement_account`: the account id to use to interact with the statement store during - * the game. - * - `sig`: the proof of ownership of the account `statement_account` by an alias, it is - * the signature of the message `"pop:game:stmt_account_for_alias:"` concatenated to the - * alias, and then hashed with `blake2_256` (blake2 256bit output). The base of the - * message can be found in the constant: `proof_of_ownership_msg_base`. - */ -"sign_up_with_alias": Anonymize, -/** - * After the game, send the full report. - * - * The game must be ongoing and in its reporting phase. - * - * The origin must be an alias, or signed by an account, or signed by an account and use - * `ScoreAsParticipant` extension. - */ -"report": Anonymize, -/** - * Offboard a player from the game. - * - * The origin must be an alias, or signed by an account, or signed by an account and use - * `ScoreAsParticipant` extension. - * - * There must be no game or the existing game must be in registration phase and the player - * must have not signed up for the game. - */ -"offboard": undefined, -/** - * Kickout a kickable player that is not playing after `NonPlayingKickoutTime`. - * - * The origin must be signed by an account. - * - * - `player`: The player to kickout. It must be archived and kickable with - * `archived_since` older than `NonPlayingKickoutTime`. - */ -"kickout": Anonymize, -/** - * Grant some invites to an account so they can distribute them. - * - * The origin must be `InviteIssuer`. - * - * - `account`: The account to grant invites to. - * - `count`: The number of invites to grant. - */ -"grant_invites": Anonymize, -/** - * Clear all invites given to an account. - * - * The origin must be `InviteIssuer`. - * - * - `account`: The account to remove all invites from. - * - `limit`: The maximum number of pending invites to remove. - */ -"remove_available_and_pending_invites": Anonymize, -/** - * Invite an account. - * - * The origin must be signed by an account and have some invites left. - * - * - `ticket`: The invite ticket to set. - */ -"set_invite_ticket": Anonymize, -/** - * Cancel an invite. - * - * The origin must be signed by the account that owns the ticket to cancel. - * - * - `ticket`: The invite ticket to cancel. - */ -"cancel_invite_ticket": Anonymize, -/** - * Schedules new games according to provided schedules. - * Schedules must be in chronological order, and after the ongoing game (if there is any). - */ -"schedule_games": Anonymize, "remove_scheduled_game": Anonymize, -/** - * Force start the shuffle before its normal start time. - * - * This action can only be performed by the root origin and is only meant for testing. - */ -"testnet_force_start_shuffle": undefined, -/** - * Force end a game's reporting phase before its normal end time. - * - * This action can only be performed by the root origin and is only meant for testing. - * - * The reporting phase only start when the mutation session can be started. The call will - * fail if the mutation session cannot be started. It can be retried few blocks later the - * time for the people mutation sessions to be proceed. - */ -"testnet_force_end_reporting": undefined, -/** - * Force set the game phase periods. - * - * This action can only be performed by the root origin and is only meant for testing. - */ -"testnet_set_game_phases": Anonymize, -/** - * Kill the current game. Whatever the phase it is in. - */ -"testnet_kill_current_game": undefined}>; - -export type Ievhkup0angt51 = {"identifier_key": SizedHex<65>}; - -export type Iagbfsso0n5e7i = {"identifier_key": SizedHex<65>, "statement_account": SS58String, "sig": Anonymize}; - -export type I8dtsqbl6shss6 = {"full_report": Array>>}; - -export type Ifpsbvfoe7erus = {"player": SS58String}; - -export type Isicv7jbqf8q2 = {"games_schedules": Anonymize}; - -export type I49vkvcrq1mpqd = {"phases": Anonymize}; - -export type I99srnbmesb7pd = AnonymousEnum<{ -/** - * Schedule payout rounds. - * - * Called from `ScheduleOrigin` or root. - */ -"schedule_payout_rounds": Anonymize, -/** - * Remove a scheduled payout round. - * - * Called from `ScheduleOrigin` or root. - */ -"remove_payout_schedule": Anonymize, -/** - * Start a new round. - * - * This is valid if the current round is finished, or if the current round doesn't have - * planning and a schedule exists to plan it. - * - * This is a task, and can be called from anybody. - */ -"transition_round": Anonymize, -/** - * Operate some round paying out. - * - * Drains round's participants, up to a limit. For each participant, add the calculated - * reward (`base_reward + remainder_portion`) to their `credit` balance. - * - * Then, moves funds on the pot account from Payout to Credit, so they are owed to specific - * participants rather than the round pool. - * - * Finally, release the leftover from the Payout hold back to the pot's free balance - * (funds are recycled). - * - * This is a task, and can be called from anybody. - * - * * round_index: The index of the round to operate. - * * limit: The maximum number of participants to operate in this call. - */ -"operate_payout_round": Anonymize, -/** - * Cash out half of the score, rounded up. Converts the score into points for the current - * payout round. Caller must have never reached personhood since onboarding. - * - * It can be called once per game session (era). - * - * Origin must be signed or participant (signed extrinsic using ScoreAsParticipant - * transaction extension) - * - * Alias origin is not allowed as they can't cash out. - */ -"cash_out": undefined, -/** - * Redeem full accumulated credit, transferring it to the provided destination account. - * - * Credit is converted from points during payout processing. - * - * Origin must be a person alias, a signed account or a participant (signed extrinsic - * using ScoreAsParticipant transaction extension). - */ -"redeem_credit": Anonymize, -/** - * Register as a person, or resume personhood after suspension. - * - * Requires score >= personhood threshold (or having previously reached it). - * - * If the participant was previously recognised and is now suspended, they must not provide - * a key. The existing key is reused. - * - * If the participant was never recognised, they must provide a key and a proof of - * ownership (`key` parameter): a signature over `"pop register using" || - * sender_account_id`. - * - * Origin must be signed or a participant (signed extrinsic using ScoreAsParticipant - * transaction extension). - */ -"register": Anonymize, -/** - * Set the absence grace schedule. - * - * Every tier must satisfy: `0 <= window <= 8` and `allowed_misses < window`. - * `allowed_misses = 0` disables grace entirely (any absence immediately - * suspends). - * - * Tiers must be provided in ascending order of `population_size_threshold`. - * - * An empty schedule disables the grace period entirely (immediate - * suspension on any missed game). The new ratio takes effect at the start - * of the next report session when `update_thresholds()` recalculates - * `AbsenceGraceRatio`. - * - * Called from `ScheduleOrigin` or root. - */ -"set_absence_grace_schedule": Anonymize}>; - -export type I6vn2ukq88hmrf = {"round_index": number, "limit": number}; - -export type I2vuilbucl2tir = {"key"?: ([SizedHex<32>, SizedHex<96>]) | undefined}; - -export type I2onutgm9avq0n = {"schedule": Anonymize}; - -export type I3c4r0hatvif1e = AnonymousEnum<{ -/** - * Reserve a number of personal IDs. - */ -"reserve_ids": Anonymize, -/** - * Renew a personal ID. The ID must not be in use. - */ -"renew_id_reservation": Anonymize, -/** - * Cancel a personal ID reservation. - */ -"cancel_id_reservation": Anonymize, -/** - * Grant personhood for a list of candidates that have reserved personal IDs. - */ -"recognize_personhood": Anonymize, -/** - * Suspend the personhood of a list of recognized people. The people must not currently be - * suspended. - */ -"suspend_personhood": Anonymize, -/** - * Resume someone's personhood. The person must currently be suspended. - */ -"resume_personhood": Anonymize, -/** - * Start a mutation session in the underlying `People` interface. This call does not check - * whether a mutation session is already ongoing and can start new sessions. - */ -"start_mutation_session": undefined, -/** - * End a mutation session in the underlying `People` interface. This call can end multiple - * mutation sessions, even ones not started by this pallet. - * - * This call will fail if no mutation session is ongoing. - */ -"end_mutation_session": undefined}>; - -export type Ib5ou59k6na5qv = {"ids_and_keys": Array<[bigint, SizedHex<32>]>}; - -export type I7qh4t1qniuepu = {"ids": Array}; - -export type I9edk4gqb8qj54 = AnonymousEnum<{ -/** - * Grant some attestation allowance to an account so they can attest people. - * - * The origin must be `AttestationAllowanceManager`. - * - * - `account`: The account to grant attestations to. - * - `count`: The number of attestations to grant. - */ -"increase_attestation_allowance": Anonymize, -/** - * Clear all attestation allowance for an account. - * - * The origin must be `AttestationAllowanceManager`. - * - * - `account`: The account to remove all attestations from. - */ -"clear_attestation_allowance": Anonymize, -/** - * Attest an account. - * - * The origin must be signed by an account and have some attestation allowance left. - * - * The authority will have to get two signatures from the user: - * - one created using their account key attesting to the ownership of the `candidate` - * account; - * - one created using their ring-vrf key attesting to the ownership of the `ring_vrf_key` - * key. - * - * The message to be signed by both keys from which the signatures are generated is created - * by concatenating the bytes "pop:people-lite:register using" with the encoded bytes of - * the user's account (`candidate`), and the encoded bytes of the ring VRF key - * (`ring_vrf_key`). - * - * - `candidate`: The candidate to be recognized as a lite person. - * - `candidate_signature`: The signature, provided by the candidate, to allow the attester - * to complete the registration process on their behalf. - * - `ring_vrf_key`: The ring VRF key to be associated with the lite person. - * - `ring_vrf_key_signature`: The ring VRF signature, provided by the candidate, to allow - * the attester to complete the registration process. This also prove the ownership of - * the ring VRF key by the candidate. - * - consumer_registration: Optional parameter which can contain the necessary information - * to forward a consumer registration request to the `LiteConsumerRegistrar` service. If - * present, it also contains a signature created by the user in order to validate the - * intent. More information on the signing payload generation available in - * [types::LiteConsumerRegistrationParams::signing_payload]. - */ -"attest": Anonymize, "dispatch_as_signer": Anonymize}>; - -export type I6gk1lo90mp8d9 = {"candidate": SS58String, "candidate_signature": Anonymize, "ring_vrf_key": SizedHex<32>, "proof_of_ownership": SizedHex<96>, "consumer_registration"?: ({"signature": Anonymize, "account": SS58String, "identifier_key": SizedHex<65>, "username": Uint8Array, "reserved_username"?: Anonymize}) | undefined}; - -export type I526v6vcah1gur = AnonymousEnum<{ -/** - * Register a lite person as a consumer. - */ -"register_lite_person": Anonymize, -/** - * Register a proven person as a consumer. - * - * The person must link a previously recognized lite identity, which will be upgraded to a - * full person consumer. In order to prove they hold the lite identity they want to link, - * users must provide a `lite_identity_proof` signature, created by signing the alias bytes - * using their lite consumer account. - * - * The consumer can choose if they want to have a new username or use an existing - * reservation made in the name of the lite consumer who will be linked. - */ -"register_person": Anonymize, -/** - * Update a person's authorization by ensuring they can still authenticate as people. - * - * This call must be performed at least `MinPersonAuthUpdateInterval` seconds after the - * last update in order to prevent spam. - */ -"touch_person_authorization": undefined, -/** - * Remove an expired entry from a username reservation queue. The target entry is - * identified by `account` and can be at any position in the queue. - * Each call removes exactly one entry, so it must be called repeatedly to - * clear multiple expired reservations. - * - * This is a permissionless call; the origin must be authorized. The `account` - * parameter is also used for transaction pool deduplication, allowing parallel - * submissions that target different expired entries in the same queue. - */ -"remove_expired_username_reservation": Anonymize, -/** - * Update the communication identifier key of a consumer. - * - * The origin must be the account registered for that consumer, regardless of their - * credibility. - */ -"update_identifier_key": Anonymize, -/** - * Set the duration for which a username reservation is valid, in seconds. - * - * The origin must be root. - */ -"set_username_reservation_duration": Anonymize, -/** - * Associate an account with a slot for statement store access, or reset a slot. - * - * The associated account can submit statements to the statement store. - * The origin must be a lite person. - * Refunded when assigning an account to a free slot, or when replacing/clearing an - * occupied slot whose last update is older than `AccountsApiRefundCooldown`. - * - * Parameters: - * * `slot_number`: must be in `0..AccountsApiSlotCount`. (`AccountsApiSlotCount` is - * available in the constant metadata) - * * `set_account`: `Some` to set a new account, or `None` to reset to no account. - */ -"set_stmt_store_associated_account_id_at_slot": Anonymize, -/** - * Demote a full person to a lite person after their authorization has expired. - * - * This is a permissionless call; the origin must be authorized. - */ -"demote_auth_expired": Anonymize}>; - -export type Ifd8dbgpm7srdt = {"identifier_key": SizedHex<65>, "username": Uint8Array, "reserved_username"?: Anonymize}; - -export type Ifbug00rch8etj = {"linked_lite_identity": SS58String, "lite_identity_proof": Anonymize, "username_choice": Enum<{"Standalone": Uint8Array, "Reservation": Uint8Array}>}; - -export type Igmmsl9pnapid = {"slot_number": number, "set_account"?: Anonymize}; - -export type I9sqknhnkp2m32 = AnonymousEnum<{ -/** - * Adds a new page of chunks. - * - * The hash of the chunks must match the hash stored on-chain in `ChunkPageHashes`. - * The call will fail if the page already exists on-chain. - */ -"add_chunks": Anonymize, -/** - * Sets the expected hashes for chunk pages for a given ring exponent. - * - * This is a root-only call that allows setting the expected hashes that chunks - * must match when added via `add_chunks`. - * - * Can only be called by root origin. - */ -"set_chunk_page_hashes": Anonymize}>; - -export type Ijgrep2ca50rk = {"ring_exponent": Anonymize, "page_index": number, "encoded_chunks": Uint8Array}; - -export type Iasnonvq8v9o5g = {"ring_exponent": Anonymize, "page_hashes": Anonymize}; - -export type I6sv4qujr95uct = AnonymousEnum<{ -/** - * Build a ring root by including registered members. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ -"build_ring_manual": Anonymize, -/** - * Onboard members into a ring by taking their keys from the onboarding queue and - * registering them into the ring. This does not compute the root, that is done using - * `build_ring`. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ -"onboard_members_manual": Anonymize, -/** - * Merge the members in two rings into a single, new ring. In order for the rings to be - * eligible for merging, they must be below 1/2 of max capacity, have no pending - * suspensions and not be the top ring used for onboarding. - */ -"merge_rings": Anonymize, -/** - * Force set the onboarding size for a collection. This call requires root privileges. - */ -"set_onboarding_size": Anonymize}>; - -export type I1tqpuolr7lnbt = {"identifier": SizedHex<32>, "ring_index": number, "limit"?: Anonymize}; - -export type If13aq7jdorcr5 = AnonymousEnum<{ -/** - * Split a coin into multiple coins. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The call is free and ages the resulting coins by one. - * - * The `split_into` parameter contains a vector of pairs, each pair containing a coin - * value and a list of destination account ids. For each pair, a new coin with the given - * value is created for each destination account id. - * - * Validity requirements: - * * The coin's age must be less than [Config::MaximumAge]. - * * The coin value must be within the bounds defined by [Config::MinimumExponent] and - * [Config::MaximumExponent]. - * * The total value of the new coins must equal the value of the origin coin. - * * The number of outputs must not exceed [Config::MaxSplitOutputs]. - * * The age of the new coins is set to the age of the origin coin plus one. - * * Each destination account must not already have a coin. - */ -"split": Anonymize, -/** - * Transfer a coin to another account. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The call is free and ages the resulting coin by one. - * - * Validity requirements: - * * The destination account must not already have a coin. - * * The coin's age must be less than [Config::MaximumAge]. - */ -"transfer": Anonymize, -/** - * Load coin into a recycler. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The call is free. - * - * The `member_key` parameter is the member key to be included in the recycler, and whose - * alias is used to unload from the recycler. - * - * Validity requirements: - * * The `member_key` must not already be used in another recycler. - * * The `member_key` must be valid (i.e. well formed). - * * The `proof_of_ownership` must be a valid signature of the coin's account id by the - * `member_key`. - */ -"load_recycler_with_coin": Anonymize, -/** - * Load external asset into a recycler. - * - * The origin must be a signed origin. - * - * The transaction fee is refunded. - * - * The `preservation` parameter indicates how the asset transfer should preserve the - * signer's account. - * - * The `value` parameter indicates the coin value to be loaded into the recycler. - * The equivalent amount of the underlying asset is transferred from the signer to - * the pallet account. - * - * The `member_key` parameter is the member key to be included in the recycler, and whose - * alias is used to unload from the recycler. - * - * The `proof_of_ownership` parameter is the signature of the signer's account id by the - * `member_key`. - * - * Requirements: - * * The `member_key` must not already be used in another recycler. - * * The `member_key` must be valid (i.e. well formed). - * * The `value` must be within the bounds defined by [Config::MinimumExponent] and - * [Config::MaximumExponent]. - * * The signer must have enough balance of the underlying asset to cover the equivalent - * amount for the given coin value. - * * The `proof_of_ownership` must be a valid signature of the signer's account id by the - * `member_key`. - */ -"load_recycler_with_external_asset": Anonymize, -/** - * Unload a recycler to mint a new coin. - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`, which can be - * obtained from the transaction extension [AsCoinage] using `AsUnloadTokenPeople`, - * `AsUnloadTokenLitePeople`, or `AsUnloadTokenPaid` variants. - * - * This function allows a user to prove they own one or more coins in a recycler ring - * without revealing which specific coins they own. It consolidates one or multiple inputs - * into a single output coin. - * - * Parameters: - * * `aliases`: the list of aliases corresponding to the member keys included in the - * recycler. The proofs for these aliases are contained in the origin. - * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. - * * `to`: the destination account for the new coin. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * The recycler identified by `value` and `index` must exist. - * * The alias proofs provided in the origin must be valid for the recycler's revision. - * * The `aliases` provided must match the aliases derived from the proofs. - * * The aliases must not have been already unloaded from this recycler. - * * The number of aliases must be a power of two. - * * The resulting consolidated value must not exceed [Config::MaximumExponent]. - */ -"unload_recycler_into_coin": Anonymize, -/** - * Unload a recycler to withdraw the underlying external asset. - * - * The origin must be [Origin::UnloadToken], which can be obtained from the transaction - * extension [AsCoinage]. - * - * When `fee` is [UnloadFee::Prepaid] (via free or paid unload token), no fee is deducted. - * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the unloaded assets. - * - * This function allows a user to withdraw their coins back into the underlying - * asset (e.g., stablecoin). - * - * Parameters: - * * `aliases`: the list of aliases corresponding to the member keys included in the - * recycler. The proofs for these aliases are contained in the origin. - * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. - * * `to`: the destination account for the underlying asset. - * - * Requirements: - * * The origin must be [Origin::UnloadToken]. - * * The recycler identified by `value` and `index` must exist. - * * The alias proofs provided in the origin must be valid for the recycler's revision. - * * The aliases must not have been already unloaded (except for the first one when `fee` - * is [UnloadFee::FromOutput], which was pre-marked in the extension). - */ -"unload_recycler_into_external_asset": Anonymize, -/** - * Pay the fee to register a member key for a paid unload token using a coin. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The coin is consumed. The fee is deducted from the coin's value and transferred to - * [Config::FeeDestination]. The remaining value of the coin is destroyed. - * - * If the call fails, the origin coin is still consumed. - * - * To protect the user against varying fees, if the coin's value is less than the fee, the - * call is invalid (an invalid call never goes into a block). - * - * The `proof_of_ownership` is a signature of the caller's account ID by the `member_key`. - * This ensures the caller controls the member key to prevent front-running. - * - * Requirements: - * * The coin's age must be less than [Config::MaximumAge]. - * * The coin value must be sufficient to cover the fee. - * * The `member_key` must be valid and not already used. - * * The `proof_of_ownership` must be valid. - */ -"pay_for_recycler_unload_fee_token_with_coin": Anonymize, -/** - * Pay the fee to register a member key for a paid unload token using the native currency. - * - * The origin must be Signed. - * - * This adds the `member_key` to a "paid unload token ring". Being part of this ring - * allows the user to later generate an anonymous `UnloadToken` to unload a recycler. - * - * The fee is transferred from the caller to [Config::FeeDestination]. - * - * The `proof_of_ownership` is a signature of the caller's account ID by the `member_key`. - * This ensures the caller controls the member key to prevent front-running. - * - * Requirements: - * * The `member_key` must be valid and not already used. - * * The `proof_of_ownership` must be valid. - */ -"pay_for_recycler_unload_fee_token_with_native": Anonymize, -/** - * Pay the fee to register a member key for a paid unload token using the underlying asset - * i.e. the stablecoin. - * - * The origin must be Signed. - * - * This adds the `member_key` to a "paid unload token ring". Being part of this ring - * allows the user to later generate an anonymous `UnloadToken` to unload a recycler. - * - * The fee is transferred from the caller to [Config::FeeDestination]. - * - * The `proof_of_ownership` is a signature of the caller's account ID by the `member_key`. - * This ensures the caller controls the member key to prevent front-running. - * - * Requirements: - * * The `member_key` must be valid and not already used. - * * The `proof_of_ownership` must be valid. - */ -"pay_for_recycler_unload_fee_token_with_stable": Anonymize, -/** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. Also, - * this call may leak too much information because the resulting coin inherits the worst - * recycler privacy. - * - * Unload multiple recyclers to mint a new consolidated coin. - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`, which can be - * obtained from the transaction extension [AsCoinage] using `AsUnloadTokenPeople`, - * `AsUnloadTokenLitePeople`, or `AsUnloadTokenPaid` variants. - * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) into a single output coin. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the new coin. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * The total value of unloaded coins must be a power of two. - * * The resulting coin value must not exceed [Config::MaximumExponent]. - * * `inputs` must not be empty, and each element must contain at least one alias. - */ -"unload_recyclers_into_coin_unstable": Anonymize, -/** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. - * - * Unload multiple recyclers to withdraw the underlying external asset. - * - * The origin must be [Origin::UnloadToken], which can be obtained from the transaction - * extension [AsCoinage]. - * - * When `fee` is [UnloadFee::Prepaid] (via free or paid unload token), no fee is deducted. - * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the unloaded assets. - * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) and withdraw the total value as the underlying asset. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the asset. - * - * Requirements: - * * The origin must be [Origin::UnloadToken]. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * `inputs` must not be empty, and each element must contain at least one alias. - * * For [UnloadFee::FromOutput], the first alias of the first input was pre-marked in the - * extension. - */ -"unload_recyclers_into_external_asset_unstable": Anonymize, -/** - * Unload a recycler to withdraw the underlying external asset (non-anonymous). - * - * Convenience wrapper around [Self::unload_recyclers_into_external_asset_non_anonymous] - * for the single-recycler case. - * - * See [Self::unload_recyclers_into_external_asset_non_anonymous] for full documentation. - */ -"unload_recycler_into_external_asset_non_anonymous": Anonymize, -/** - * Unload multiple recyclers to withdraw the underlying external asset (non-anonymous). - * - * This is a non-anonymous version of [Self::unload_recyclers_into_external_asset_unstable] - * where the fee is paid explicitly by the signer rather than through the anonymous - * unload token ring. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `alias_proofs`: the proofs for all aliases across all inputs, signed over a message - * that includes the signer. The proofs must correspond sequentially to the aliases in - * `inputs`. - * * `to`: the destination account for the asset. - * * `fee_currency`: whether to pay the fee in native currency or stable asset. - * - * Requirements: - * * The origin must be Signed. - * * All specified recyclers must exist. - * * The alias proofs must correspond sequentially to the aliases in `inputs`. - * * `inputs` must not be empty and each element must contain at least one alias. - * * The signer must have sufficient balance to pay the fee. - */ -"unload_recyclers_into_external_asset_non_anonymous": Anonymize, -/** - * Unload a recycler to mint multiple new coins (split). - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * - * This function combines the functionality of [Self::unload_recycler_into_coin] and - * [Self::split] in a single atomic operation. The resulting coins' age is 1 because - * the action of splitting age coins. This is also important because resulting coins - * are not entirely fresh, they can be linked to other coins. - * - * Unlike [Self::unload_recycler_into_coin], this call does **not** require the number of - * aliases to be a power of two. The only requirement is that the total value of the - * unloaded aliases matches the total value of the new coins specified in `split_into`. - * - * Parameters: - * * `aliases`: the list of aliases corresponding to the member keys included in the - * recycler. The proofs for these aliases are contained in the origin. - * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. - * * `split_into`: a vector of pairs, each pair containing a coin value and a list of - * destination account ids. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * The recycler identified by `value` and `index` must exist. - * * The alias proofs provided in the origin must be valid for the recycler's revision. - * * The `aliases` provided must match the aliases derived from the proofs. - * * The total value of the new coins defined in `split_into` must equal the total value of - * the unloaded coins. - * * Each destination account must not already have a coin. - */ -"unload_recycler_into_coins": Anonymize, -/** - * Directly offboard a fresh, 0-age coin into the underlying external asset. - * - * The origin must be a [Origin::Coin], obtained through [AsCoinage] using `AsCoin`. - * - * Because the coin must be fresh (`age == 0`), this call bypasses the - * recycler/unload-token offboarding flow and releases the underlying asset directly. - * - * Parameters: - * * `to`: destination account that receives the released underlying asset amount. - * - * Requirements: - * * The origin must be [Origin::Coin]. - * * The coin must be fresh: `coin.age == 0`. - * * The coin value must be representable as underlying-asset amount. - */ -"direct_offboard_coin_into_external_asset": Anonymize, -/** - * Clean up an expired recycler. - * - * This is a maintenance call. The origin must be authorized and from local source. - * - * This removes an old recycler that has exceeded its expiration time. - * Any remaining (not unloaded) value in the recycler is considered lost and added to - * [TotalValueOfDestroyedCoins]. - */ -"clean_recycler": Anonymize, -/** - * Cleanup storage for consumed free unload tokens of old periods. - * - * This is a maintenance call. The origin must be authorized and from local source. - */ -"clean_consumed_free_token": Anonymize, -/** - * Clean up a single ring in an expired paid unload token collection. - * - * This is a maintenance call. The origin must be authorized and from local source. - * Rings must be cleaned sequentially (ring 0 first, then 1, etc.) before the - * collection can be deleted via - * [`delete_expired_paid_unload_token_collection`](Self::delete_expired_paid_unload_token_collection). - */ -"clean_paid_unload_token_ring": Anonymize, -/** - * Clean up dust for recyclers. - * - * This is a maintenance call. The origin must be authorized and from local source. - * Removes up to DUST_CLEANUP_BATCH_SIZE unloaded alias entries per call to bound the - * operation. - */ -"clean_recycler_dust": undefined, -/** - * Clean up dust for paid unload tokens. - * - * This is a maintenance call. The origin must be authorized and from local source. - */ -"clean_paid_unload_token_dust": undefined, -/** - * Delete an expired paid unload token collection after all rings have been cleaned. - * - * This is a maintenance call. The origin must be authorized and from local source. - * All rings must have been cleaned via - * [`clean_paid_unload_token_ring`](Self::clean_paid_unload_token_ring) before this - * can be called. - */ -"delete_expired_paid_unload_token_collection": Anonymize}>; - -export type Ibv24s7lkcbv1r = {"split_into": Anonymize}; - -export type Iahm4pssu1c80p = Array<[number, Anonymize]>; - -export type Iadkk9nq2cqqve = {"to": SS58String}; - -export type I5u969d5la0il0 = {"member_key": SizedHex<32>, "proof_of_ownership": SizedHex<96>}; - -export type I9cbgq5mcmbt3f = {"preservation": Enum<{"Expendable": undefined, "Protect": undefined, "Preserve": undefined}>, "value": number, "member_key": SizedHex<32>, "proof_of_ownership": SizedHex<96>}; - -export type I8en8uvi5isgvj = {"aliases": Anonymize, "value": number, "index": number, "revision": number, "to": SS58String}; - -export type I43mn70lup4q9c = {"inputs": Anonymize, "to": SS58String}; - -export type I1d6jcc1nomglu = Array>; - -export type Iblrnm4k0nni51 = {"value": number, "index": number, "revision": number, "aliases": Anonymize}; - -export type I286qhrd3thf21 = {"input": Anonymize, "alias_proofs": Anonymize, "to": SS58String, "fee_currency": Anonymize}; - -export type Iefn145htl05b6 = {"inputs": Anonymize, "alias_proofs": Anonymize, "to": SS58String, "fee_currency": Anonymize}; - -export type I3kigttc60kr03 = {"aliases": Anonymize, "value": number, "index": number, "revision": number, "split_into": Anonymize}; - -export type I631cq2ecsn8vg = AnonymousEnum<{ -/** - * Schedule a airdrop event. - * - * The origin must be `ScheduleOrigin`. - * - * The total amount to be distributed in prizes will be put on hold. The event will be - * added to the schedule and be given an event id. - */ -"schedule_event": Anonymize, -/** - * Remove a scheduled airdrop event. - * - * The origin must be `ScheduleOrigin`. - * - * The event id must refer to a scheduled event. - * - * The total amount to be distributed in prizes will be released from hold. - * The event will be removed from the schedule. - */ -"remove_scheduled_event": Anonymize, -/** - * Register for a particular event. - * - * The origin must be the alias of a person in the context: airdrop context base - * concatenated to the airdrop event id in little-endian encoding in 4 bytes. - * The airdrop context base can be found in the metadata. - * - * The event id must refer to an active event in the registering phase. - * The alias must not be already registered. - * - * `dest` can be any account, it is the destination receiving the prize when winning the - * airdrop. It is better to set a different account for each airdrop to avoid linking - * information about winners. - * - * When registering the caller is assigned an index. This index will be used to identify - * the winners. - */ -"register_for_event": Anonymize, -/** - * Claim the prize of a failed transfer. - * - * Prize are automatically transfered, but if unexpected event happens the transfer can - * fail, this transaction allows to claim the prize. - * - * The origin must signed by the destination of the prize. - * - * The signer must have a failed transfer prize for the given event id. - */ -"claim_failed_transfer_prize": Anonymize}>; - -export type I6carn61qjeh6d = {"event_info": Anonymize}; - -export type I24nmtkeq4rln8 = {"event_id": number, "dest": SS58String}; - -export type I4oqb168b2d4er = AnonymousEnum<{ -/** - * Allows root to set a cursor to forcefully start, stop or forward the migration process. - * - * Should normally not be needed and is only in place as emergency measure. Note that - * restarting the migration process in this manner will not call the - * [`MigrationStatusHandler::started`] hook or emit an `UpgradeStarted` event. - */ -"force_set_cursor": Anonymize, -/** - * Allows root to set an active cursor to forcefully start/forward the migration process. - * - * This is an edge-case version of [`Self::force_set_cursor`] that allows to set the - * `started_at` value to the next block number. Otherwise this would not be possible, since - * `force_set_cursor` takes an absolute block number. Setting `started_at` to `None` - * indicates that the current block number plus one should be used. - */ -"force_set_active_cursor": Anonymize, -/** - * Forces the onboarding of the migrations. - * - * This process happens automatically on a runtime upgrade. It is in place as an emergency - * measurement. The cursor needs to be `None` for this to succeed. - */ -"force_onboard_mbms": undefined, -/** - * Clears the `Historic` set. - * - * `map_cursor` must be set to the last value that was returned by the - * `HistoricCleared` event. The first time `None` can be used. `limit` must be chosen in a - * way that will result in a sensible weight. - */ -"clear_historic": Anonymize}>; - -export type Ibou4u1engb441 = {"cursor"?: (Anonymize) | undefined}; - -export type Id6nbvqoqdj4o2 = {"index": number, "inner_cursor"?: Anonymize, "started_at"?: Anonymize}; - -export type I95iqep3b8snn9 = {"selector": Enum<{"Specific": Anonymize, "Wildcard": {"limit"?: Anonymize, "previous_cursor"?: Anonymize}}>}; - -export type I6052turo9tavh = (Anonymize) | undefined; - -export type Iemk0s5gdc9ruv = (Anonymize) | undefined; - -export type I1v6u80pcf53ne = AnonymousEnum<{"System": Anonymize, "ParachainSystem": Anonymize, "Timestamp": Anonymize, "ParachainInfo": undefined, "Balances": Anonymize, "OriginRestriction": Anonymize, "Assets": Anonymize, "AssetRate": Anonymize, "CollatorSelection": Anonymize, "Session": Anonymize, "XcmpQueue": Anonymize, "PolkadotXcm": Anonymize, "CumulusXcm": undefined, "MessageQueue": Anonymize, "Utility": Anonymize, "Multisig": Anonymize, "Sudo": Anonymize, "Proxy": Anonymize, "Identity": Anonymize, "People": Anonymize, "MobRule": Anonymize, "ProofOfInk": Anonymize, "Game": Anonymize, "Score": Anonymize, "DummyDim": Anonymize, "PeopleLite": Anonymize, "Resources": Anonymize, "ChunksManager": Anonymize, "Members": Anonymize, "Coinage": Anonymize, "Airdrop": Anonymize, "MultiBlockMigrations": Anonymize}>; - -export type Iavc33atjrmdmp = FixedSizeArray<2, Anonymize>; - -export type I596b7bbfu4tap = (Anonymize) | undefined; - -export type Ia4n949ohqh8lm = (Anonymize) | undefined; - -export type Iaqet9jc3ihboe = {"header": Anonymize, "extrinsics": Anonymize}; - -export type I2v50gu3s1aqk6 = AnonymousEnum<{"AllExtrinsics": undefined, "OnlyInherents": undefined}>; - -export type I4gil44d08grh = {"prefix": SizedHex<16>, "suffix": SizedHex<16>}; - -export type I7u915mvkdsb08 = ResultPayload, "Codec": undefined}>>; - -export type Ie7mmsj6dufc7j = ResultPayload, Anonymize>; - -export type I5nrjkj9qumobs = AnonymousEnum<{"Invalid": Enum<{"Call": undefined, "Payment": undefined, "Future": undefined, "Stale": undefined, "BadProof": undefined, "AncientBirthBlock": undefined, "ExhaustsResources": undefined, "Custom": number, "BadMandatory": undefined, "MandatoryValidation": undefined, "BadSigner": undefined, "IndeterminateImplicit": undefined, "UnknownOrigin": undefined}>, "Unknown": TransactionValidityUnknownTransaction}>; - -export type TransactionValidityUnknownTransaction = Enum<{"CannotLookup": undefined, "NoUnsignedValidator": undefined, "Custom": number}>; -export const TransactionValidityUnknownTransaction = _Enum as unknown as GetEnum; - -export type If7uv525tdvv7a = Array<[SizedHex<8>, Uint8Array]>; - -export type I2an1fs2eiebjp = {"okay": boolean, "fatal_error": boolean, "errors": Anonymize}; - -export type TransactionValidityTransactionSource = Enum<{"InBlock": undefined, "Local": undefined, "External": undefined}>; -export const TransactionValidityTransactionSource = _Enum as unknown as GetEnum; - -export type I9ask1o4tfvcvs = ResultPayload<{"priority": bigint, "requires": Anonymize, "provides": Anonymize, "longevity": bigint, "propagate": boolean}, Anonymize>; - -export type Icerf8h8pdu8ss = (Array<[Uint8Array, SizedHex<4>]>) | undefined; - -export type I6spmpef2c7svf = {"weight": Anonymize, "class": DispatchClass, "partial_fee": bigint}; - -export type Iei2mvq0mjvt81 = {"inclusion_fee"?: ({"base_fee": bigint, "len_fee": bigint, "adjusted_weight_fee": bigint}) | undefined, "tip": bigint}; - -export type Iftvbctbo05fu4 = ResultPayload, Anonymize>; - -export type Iavct6f844hfju = AnonymousEnum<{"Unimplemented": undefined, "VersionedConversionFailed": undefined, "WeightNotComputable": undefined, "UnhandledXcmVersion": undefined, "AssetNotFound": undefined, "Unroutable": undefined}>; - -export type Ic0c3req3mlc1l = ResultPayload, Anonymize>; - -export type I7ocn4njqde3v5 = ResultPayload>; - -export type Iek7ha36da9mf5 = ResultPayload>; - -export type Ieh6nis3hdbtgi = ResultPayload>; - -export type Ico18ks790i2bl = AnonymousEnum<{"Chain": undefined, "Network": undefined, "Local": undefined}>; - -export type I815pbp5omtss = {"proof"?: (Enum<{"Sr25519": {"signature": SizedHex<64>, "signer": SizedHex<32>}, "Ed25519": {"signature": SizedHex<64>, "signer": SizedHex<32>}, "Secp256k1Ecdsa": {"signature": SizedHex<65>, "signer": SizedHex<33>}, "OnChain": {"who": SizedHex<32>, "block_hash": SizedHex<32>, "event_index": bigint}}>) | undefined, "decryption_key"?: Anonymize, "channel"?: Anonymize, "priority"?: Anonymize, "num_topics": number, "topics": FixedSizeArray<4, SizedHex<32>>, "data"?: Anonymize}; - -export type Ib808ejar4brae = ResultPayload, Enum<{"NoReportingPhase": undefined, "StatementIsNotSigned": undefined, "InvalidSignature": undefined, "InvalidTopic0": {"expected"?: Anonymize, "actual"?: Anonymize}, "AccountIsNotAPlayer": undefined, "PlayerIsNotRegistered": undefined}>>; - -export type Ic1d4u2opv3fst = {"upward_messages": Anonymize, "horizontal_messages": Anonymize, "new_validation_code"?: Anonymize, "processed_downward_messages": number, "hrmp_watermark": number, "head_data": Uint8Array}; - -export type Ie9sr1iqcg3cgm = ResultPayload; - -export type I1mqgk2tmnn9i2 = (string) | undefined; - -export type I6lr8sctk0bi4e = Array; - -export type I3ju6ot8lfmk90 = ResultPayload, Enum<{"BadProof": undefined, "NoProof": undefined, "InternalError": undefined}>>; - -export type Id3vovj0ihlrsb = AnonymousEnum<{"Signed": Anonymize, "Disabled": undefined}>; - -export type I66dpqsgl2h4uc = {"signature": Anonymize, "account": SS58String}; - -export type I1rmvc8k7ssl0 = (Enum<{"AsPersonalAliasWithAccount": number, "AsPersonalAliasWithProof": [SizedHex<788>, number, SizedHex<32>], "AsPersonalIdentityWithProof": [SizedHex<96>, bigint], "AsPersonalIdentityWithAccount": number, "AsPersonalAliasWithAccountRevised": [number, SizedHex<788>, number, SizedHex<32>]}>) | undefined; - -export type I4rnuci7kia2r1 = (Enum<{"AsApplyWithSig": number, "AsReferred": number, "AsInvited": number}>) | undefined; - -export type I6k0juar2doko8 = ({"nonce": number, "inviter": SS58String, "ticket": SS58String, "signature": Anonymize}) | undefined; - -export type Icbb3ruvdvu6qp = (Enum<{"AsLitePerson": {"nonce": number}}>) | undefined; - -export type Ied6o1m0g5iajq = (Enum<{"AsCoin": undefined, "AsUnloadTokenPeople": {"proof": {"proof": SizedHex<788>, "ring": number}, "period": number, "counter": number, "alias_proofs": Anonymize}, "AsUnloadTokenLitePeople": {"proof": Anonymize, "period": number, "counter": number, "alias_proofs": Anonymize}, "AsUnloadTokenPaid": {"proof": SizedHex<788>, "period": number, "paid_token_ring_index": number, "paid_token_ring_revision": number, "alias_proofs": Anonymize}, "AsUnloadTokenFromOutput": {"fee_recycler_value": number, "fee_recycler_index": number, "fee_recycler_revision": number, "alias_proofs": Anonymize}}>) | undefined; - \ No newline at end of file diff --git a/packages/host-papp/.papi/descriptors/src/common.ts b/packages/host-papp/.papi/descriptors/src/common.ts deleted file mode 100644 index bbec1446..00000000 --- a/packages/host-papp/.papi/descriptors/src/common.ts +++ /dev/null @@ -1,14 +0,0 @@ -const table = new Uint8Array(128); -for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; -export const toBinary = (base64: string) => { - const n = base64.length, - bytes = new Uint8Array((n - Number(base64[n - 1] === '=') - Number(base64[n - 2] === '=')) * 3 / 4 | 0); - for (let i2 = 0, j = 0; i2 < n;) { - const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; - const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; - bytes[j++] = c0 << 2 | c1 >> 4; - bytes[j++] = c1 << 4 | c2 >> 2; - bytes[j++] = c2 << 6 | c3; - } - return bytes; -} \ No newline at end of file diff --git a/packages/host-papp/.papi/descriptors/src/descriptors.ts b/packages/host-papp/.papi/descriptors/src/descriptors.ts deleted file mode 100644 index 0fb95987..00000000 --- a/packages/host-papp/.papi/descriptors/src/descriptors.ts +++ /dev/null @@ -1,38 +0,0 @@ - - const [minified, commonTrees, tokens] = JSON.parse(`[{"people_lite":{"storage":{"1":{"0":0,"ExtrinsicCount":1,"InherentsApplied":2,"BlockWeight":3,"AllExtrinsicsLen":1,"BlockHash":4,"ExtrinsicData":5,"Number":1,"ParentHash":6,"Digest":7,"Events":8,"EventCount":1,"EventTopics":9,"LastRuntimeUpgrade":10,"UpgradedToU32RefCount":2,"UpgradedToTripleRefCount":2,"ExecutionPhase":11,"AuthorizedUpgrade":12,"ExtrinsicWeightReclaimed":13},"2":{"UnincludedSegment":33,"AggregatedUnincludedSegment":34,"PendingValidationCode":35,"NewValidationCode":35,"ValidationData":36,"DidSetValidationCode":2,"LastRelayChainBlockNumber":1,"UpgradeRestrictionSignal":37,"UpgradeGoAhead":38,"RelayStateProof":39,"RelevantMessagingState":40,"HostConfiguration":41,"LastDmqMqcHead":6,"LastHrmpMqcHeads":42,"ProcessedDownwardMessages":1,"LastProcessedDownwardMessage":43,"HrmpWatermark":1,"LastProcessedHrmpMessage":43,"HrmpOutboundMessages":44,"UpwardMessages":39,"PendingUpwardMessages":39,"PendingUpwardSignals":39,"UpwardDeliveryFeeFactor":45,"AnnouncedHrmpMessagesPerCandidate":1,"ReservedXcmpWeightOverride":13,"ReservedDmpWeightOverride":13,"CustomValidationHeadData":35},"3":{"Now":45,"DidUpdate":2},"4":{"ParachainId":1},"5":0,"8":{"0":53,"6":55,"7":56,"TotalIssuance":45,"InactiveIssuance":45,"Locks":54,"Freezes":57},"9":{"NextFeeMultiplier":45,"StorageVersion":79,"TxPaymentCredit":45},"10":0,"11":{"Usages":82},"13":{"0":86,"6":89,"12":88,"Asset":85,"Approvals":87,"NextAssetId":90},"14":{"7":134,"BalancesOnHold":135},"15":{"ConversionRateToNative":137},"16":0,"17":{"Author":144},"18":{"Invulnerables":145,"CandidateList":146,"LastAuthoredBlock":147,"DesiredCandidates":1,"CandidacyBond":45},"19":{"Validators":145,"CurrentIndex":1,"QueuedChanged":2,"QueuedKeys":162,"DisabledValidators":163,"NextKeys":164,"KeyOwner":165},"21":{"20":169,"CurrentSlot":45},"22":{"20":169,"RelaySlotInfo":170},"23":{"InboundXcmpSuspended":171,"OutboundXcmpStatus":172,"OutboundXcmpMessages":173,"SignalMessages":5,"QueueConfig":174,"QueueSuspended":2,"DeliveryFeeFactor":175},"24":{"QueryCounter":45,"Queries":178,"AssetTraps":179,"SafeXcmVersion":1,"SupportedVersion":180,"VersionNotifiers":181,"VersionNotifyTargets":182,"VersionDiscoveryQueue":183,"CurrentMigration":184,"RemoteLockedFungibles":185,"LockedFungibles":186,"XcmExecutionSuspended":2,"ShouldRecordXcm":2,"RecordedXcm":187,"AuthorizedAliases":188},"25":0,"26":{"BookStateFor":227,"ServiceHead":228,"Pages":229},"27":0,"28":{"Multisigs":246},"29":{"Key":144},"30":0,"31":{"Proxies":262,"Announcements":263},"33":{"32":164,"IdentityOf":278,"UsernameOf":279,"SuperOf":280,"SubsOf":281,"Registrars":282,"AuthorityOf":283,"UsernameInfoOf":284,"PendingUsernames":285,"UnbindingUsernames":286,"PersonIdentities":287,"PendingUsernameReports":288},"34":{"32":327,"34":325,"Keys":324,"CounterForKeys":1,"AliasToAccount":326,"AccountToPersonalId":328,"NextPersonalId":45,"PeopleCollectionCreated":2,"ReservedPersonalId":329},"36":{"35":344,"Credits":337,"VotingPenalties":179,"VotingPoints":338,"Votes":339,"CaseCount":1,"OpenCases":340,"RipeCases":341,"DoneCases":342,"AccumulatedPoints":45,"PayoutDistribution":343,"ActiveSince":45},"39":{"34":368,"37":147,"38":373,"Candidates":367,"ReferralTickets":369,"DesignFamilies":370,"CommittedDesigns":371,"AllocationCount":1,"Configuration":372,"ReferrerReimbursementValues":374,"ReferredReimbursementValues":374},"40":{"37":147,"38":373,"40":405,"TestnetStoredPhaseDurations":401,"Nfts":402,"ArchivedPlayers":403,"Players":404,"GameIndex":1,"GameHistory":406,"PlayerAttendanceHistory":407,"IndexToPlayer":408,"PlayerToIndex":407,"ShuffleRecognized":409,"ShuffleNotRecognized":409,"GameSchedules":410,"AliasToStmtAccount":411,"StmtAccountToAlias":164,"CommunicationIdentifiers":412},"41":{"35":431,"Participants":425,"PersonhoodThreshold":1,"AbsenceGraceSchedule":426,"AbsenceGraceRatio":427,"CurrentRoundPoints":1,"CurrentRoundIndex":1,"RoundsPointsForParticipant":428,"RoundPayouts":429,"RoundPlanning":430},"42":{"34":441,"ReservedIds":329},"43":{"LitePeople":447,"AttestationAllowance":147},"44":{"Consumers":451,"StmtStoreAssociatedAccount":452,"UsernameOwnerOf":453,"AccountOfAlias":411,"UsernameReservationDuration":45,"UsernameReservationQueue":454,"ReservationOf":279},"45":{"Chunks":465,"ChunkPageHashes":466},"46":{"46":477,"Collections":471,"SuspendedCollections":471,"IdentifiersOf":472,"Root":473,"CurrentRingIndex":179,"OnboardingSize":179,"RingKeys":474,"RingKeysStatus":475,"PendingSuspensions":476,"ActiveMembers":179,"RingsState":478,"StaleRings":479,"QueuePageIndices":480,"OnboardingQueue":481,"DeletionInProgress":482,"RingDeletionQueue":483},"47":{"CoinsByOwner":493,"LockedCoins":494,"TotalValueOfDestroyedCoins":45,"ConsumedFreeUnloadTokens":495,"RecyclerCollectionCreated":496,"RecyclersLastRemovedRingIndex":406,"RecyclersCoinToRecycler":179,"RecyclersUnloaded":497,"RecyclersDusting":498,"PaidUnloadTokenMembers":499,"PaidUnloadTokenConsumed":497,"PaidTokenCollectionsCreated":496,"PaidUnloadTokenDusting":496,"PaidUnloadTokenNextRingToClean":406,"InitializePalletAccount":500},"49":{"48":544,"XcmTransferInitiatedAt":1},"50":{"48":545},"51":{"EventSchedule":546,"EventScheduleFirstStartTime":1,"NextEventId":1,"ActiveEvents":547,"ActiveEventIds":171,"ParticipantIdToAliasAndDest":548,"ParticipantAliasToId":338,"WinnersToDistributeTo":549,"WinnersWithFailedTransfer":550,"PastAirdrops":551},"52":{"Cursor":561,"Historic":562}},"tx":{"1":{"remark":18,"set_heap_pages":19,"set_code":20,"set_code_without_checks":20,"set_storage":21,"kill_storage":22,"kill_prefix":23,"remark_with_event":18,"authorize_upgrade":24,"authorize_upgrade_without_checks":24,"apply_authorized_upgrade":20},"2":{"set_validation_data":46,"sudo_send_upward_message":47},"3":{"set":52},"4":0,"5":0,"8":{"53":59,"54":58,"55":60,"56":65,"transfer_allow_death":58,"force_unreserve":61,"upgrade_accounts":62,"force_set_balance":63,"force_adjust_total_issuance":64},"9":0,"10":0,"11":{"clean_usage":83},"13":{"53":101,"54":100,"55":114,"56":99,"57":95,"58":100,"force_create":96,"start_destroy":97,"destroy_accounts":97,"destroy_approvals":97,"finish_destroy":97,"mint":98,"freeze":102,"thaw":102,"freeze_asset":97,"thaw_asset":97,"transfer_ownership":103,"set_team":104,"set_metadata":105,"clear_metadata":97,"force_set_metadata":106,"force_clear_metadata":97,"force_asset_status":107,"approve_transfer":108,"cancel_approval":109,"force_cancel_approval":110,"transfer_approved":111,"touch":97,"refund":112,"set_min_balance":113,"touch_other":102,"refund_other":102,"block":102,"set_reserves":115},"14":0,"15":{"57":138,"update":138,"remove":139},"16":0,"17":0,"18":{"set_invulnerables":149,"set_desired_candidates":150,"set_candidacy_bond":151,"register_as_candidate":152,"leave_intent":152,"add_invulnerable":153,"remove_invulnerable":153,"update_bond":154,"take_candidate_slot":155},"19":{"set_keys":166,"purge_keys":152},"21":0,"22":0,"23":{"suspend_xcm_execution":152,"resume_xcm_execution":152,"update_suspend_threshold":176,"update_drop_threshold":176,"update_resume_threshold":176},"24":{"send":190,"teleport_assets":191,"reserve_transfer_assets":191,"execute":192,"force_xcm_version":193,"force_default_xcm_version":194,"force_subscribe_version_notify":195,"force_unsubscribe_version_notify":195,"limited_reserve_transfer_assets":196,"limited_teleport_assets":196,"force_suspension":197,"transfer_assets":196,"claim_assets":198,"transfer_assets_using_type_and_then":199,"add_authorized_alias":200,"remove_authorized_alias":201,"remove_all_authorized_aliases":152},"25":0,"26":{"reap_page":231,"execute_overweight":232},"27":{"batch":237,"as_derivative":238,"batch_all":237,"dispatch_as":239,"force_batch":237,"with_weight":240,"if_else":241,"dispatch_as_fallible":239},"28":{"59":251,"as_multi_threshold_1":247,"as_multi":248,"approve_as_multi":249,"cancel_as_multi":250},"29":{"sudo":257,"sudo_unchecked_weight":240,"set_key":258,"sudo_as":259,"remove_key":152},"30":0,"31":{"59":152,"proxy":266,"add_proxy":267,"remove_proxy":267,"remove_proxies":152,"create_pure":268,"kill_pure":269,"announce":270,"remove_announcement":270,"reject_announcement":271,"proxy_announced":272},"33":{"add_registrar":289,"set_identity":290,"set_subs":291,"clear_identity":152,"request_judgement":292,"cancel_request":293,"set_fee":294,"set_account_id":295,"set_fields":296,"provide_judgement":297,"kill_identity":298,"add_sub":299,"rename_sub":299,"remove_sub":300,"quit_sub":152,"add_username_authority":301,"remove_username_authority":302,"set_username_for":303,"accept_username":304,"remove_expired_approval":304,"set_primary_username":304,"unbind_username":304,"remove_username":304,"kill_username":304,"set_personal_identity":305,"submit_personal_credential_evidence":306,"personal_credential_judged":307,"clear_personal_identity":152,"report_username":304,"reported_username_judged":307},"34":{"under_alias":257,"set_alias_account":331,"unset_alias_account":152,"force_recognize_personhood":332,"set_personal_id_account":331,"unset_personal_id_account":152,"create_people_collection":152},"36":{"60":351,"61":352,"vote":345,"close_case":346,"clean_vote":347,"reap_case":346,"intervene":348,"claim_vote":346,"payout_rewards":349,"claim_votes":350,"start_payout_round":152,"claim_credit":152,"clean_points":353,"force_ripen_case":346,"touch_case":346,"clear_voting_penalty":152,"clean_vote_signed":347},"39":{"62":383,"63":384,"64":382,"65":382,"apply":152,"submit_evidence":375,"judged":307,"register_referred":376,"register_non_referred":376,"reroll":152,"commit":377,"allocate_full":152,"timeout":378,"flakeout":152,"apply_with_signature":379,"apply_with_invitation":380,"add_design_family":381,"set_referral_ticket":382,"cancel_referral_ticket":382,"register_successful_referral_reward":349,"set_configuration":385,"set_reimbursement_values":386},"40":{"62":383,"63":384,"64":382,"65":382,"sign_up_with_invite":413,"sign_up_with_account":413,"sign_up_with_alias":414,"report":415,"offboard":152,"kickout":416,"schedule_games":417,"remove_scheduled_game":418,"testnet_force_start_shuffle":152,"testnet_force_end_reporting":152,"testnet_set_game_phases":419,"testnet_kill_current_game":152},"41":{"60":432,"61":352,"transition_round":433,"operate_payout_round":434,"cash_out":152,"redeem_credit":349,"register":435,"set_absence_grace_schedule":436},"42":{"reserve_ids":442,"renew_id_reservation":443,"cancel_id_reservation":443,"recognize_personhood":444,"suspend_personhood":445,"resume_personhood":443,"start_mutation_session":152,"end_mutation_session":152},"43":{"increase_attestation_allowance":383,"clear_attestation_allowance":378,"attest":448,"dispatch_as_signer":257},"44":{"register_lite_person":456,"register_person":457,"touch_person_authorization":152,"remove_expired_username_reservation":458,"update_identifier_key":413,"set_username_reservation_duration":459,"set_stmt_store_associated_account_id_at_slot":460,"demote_auth_expired":378},"45":{"add_chunks":467,"set_chunk_page_hashes":468},"46":{"build_ring_manual":484,"onboard_members_manual":485,"merge_rings":486,"set_onboarding_size":487},"47":{"58":518,"split":517,"load_recycler_with_coin":519,"load_recycler_with_external_asset":520,"unload_recycler_into_coin":521,"unload_recycler_into_external_asset":521,"pay_for_recycler_unload_fee_token_with_coin":519,"pay_for_recycler_unload_fee_token_with_native":519,"pay_for_recycler_unload_fee_token_with_stable":519,"unload_recyclers_into_coin_unstable":522,"unload_recyclers_into_external_asset_unstable":522,"unload_recycler_into_external_asset_non_anonymous":523,"unload_recyclers_into_external_asset_non_anonymous":524,"unload_recycler_into_coins":525,"direct_offboard_coin_into_external_asset":518,"clean_recycler":526,"clean_consumed_free_token":527,"clean_paid_unload_token_ring":528,"clean_recycler_dust":152,"clean_paid_unload_token_dust":152,"delete_expired_paid_unload_token_collection":527},"49":0,"50":0,"51":{"schedule_event":553,"remove_scheduled_event":554,"register_for_event":555,"claim_failed_transfer_prize":554},"52":{"force_set_cursor":563,"force_set_active_cursor":564,"force_onboard_mbms":152,"clear_historic":565}},"events":{"1":{"ExtrinsicSuccess":25,"ExtrinsicFailed":26,"CodeUpdated":27,"NewAccount":28,"KilledAccount":28,"Remarked":29,"UpgradeAuthorized":30,"RejectedInvalidAuthorizedUpgrade":31},"2":{"ValidationFunctionStored":27,"ValidationFunctionApplied":48,"ValidationFunctionDiscarded":27,"DownwardMessagesReceived":49,"DownwardMessagesProcessed":50,"UpwardMessageSent":51},"3":0,"4":0,"5":0,"8":{"66":70,"67":72,"68":70,"69":70,"70":75,"71":75,"Endowed":66,"DustLost":67,"Transfer":68,"BalanceSet":69,"Reserved":70,"Unreserved":70,"ReserveRepatriated":71,"Deposit":70,"Withdraw":70,"Slashed":70,"Minted":70,"MintedCredit":72,"BurnedDebt":72,"Suspended":70,"Restored":70,"Upgraded":73,"Rescinded":72,"Locked":70,"Unlocked":70,"TotalIssuanceForced":74,"BurnedHeld":75,"TransferOnHold":76,"TransferAndHold":77,"Unexpected":78},"9":{"TransactionFeePaid":80},"10":{"FeeSkipped":81},"11":{"UsageCleaned":84},"13":{"66":119,"67":117,"68":122,"69":122,"Created":116,"Transferred":118,"TeamChanged":120,"OwnerChanged":121,"AssetFrozen":123,"AssetThawed":123,"AccountsDestroyed":124,"ApprovalsDestroyed":125,"DestructionStarted":123,"Destroyed":123,"ForceCreated":121,"MetadataSet":126,"MetadataCleared":123,"ApprovedTransfer":127,"ApprovalCancelled":128,"TransferredApproved":129,"AssetStatusChanged":123,"AssetMinBalanceChanged":130,"Touched":131,"Blocked":122,"Deposited":132,"Withdrawn":132,"ReservesUpdated":133,"ReservesRemoved":123},"14":{"66":136,"70":136,"71":136},"15":{"AssetRateCreated":140,"AssetRateRemoved":141,"AssetRateUpdated":142},"16":{"AssetTxFeePaid":143},"17":0,"18":{"NewInvulnerables":156,"InvulnerableAdded":157,"InvulnerableRemoved":157,"NewDesiredCandidates":158,"NewCandidacyBond":159,"CandidateAdded":160,"CandidateBondUpdated":160,"CandidateRemoved":157,"CandidateReplaced":161,"InvalidInvulnerableSkipped":157},"19":{"NewSession":167,"NewQueued":27,"ValidatorDisabled":168,"ValidatorReenabled":168},"21":0,"22":0,"23":{"XcmpMessageSent":177},"24":{"Attempted":202,"Sent":203,"SendFailed":204,"ProcessXcmError":205,"UnexpectedResponse":206,"ResponseReady":207,"Notified":208,"NotifyOverweight":209,"NotifyDispatchError":208,"NotifyDecodeFailed":208,"InvalidResponder":210,"InvalidResponderVersion":206,"ResponseTaken":211,"AssetsTrapped":212,"VersionChangeNotified":213,"SupportedVersionChanged":214,"NotifyTargetSendFail":215,"NotifyTargetMigrationFail":216,"InvalidQuerierVersion":206,"InvalidQuerier":217,"VersionNotifyStarted":218,"VersionNotifyRequested":218,"VersionNotifyUnrequested":218,"FeesPaid":219,"AssetsClaimed":212,"VersionMigrationFinished":220,"AliasAuthorized":221,"AliasAuthorizationRemoved":222,"AliasesAuthorizationsRemoved":223},"25":{"InvalidFormat":225,"UnsupportedVersion":225,"ExecutedDownward":226},"26":{"ProcessingFailed":233,"Processed":234,"OverweightEnqueued":235,"PageReaped":236},"27":{"BatchInterrupted":242,"BatchCompleted":27,"BatchCompletedWithErrors":27,"ItemCompleted":27,"ItemFailed":243,"DispatchedAs":244,"IfElseMainSuccess":27,"IfElseFallbackCalled":245},"28":{"72":256,"NewMultisig":252,"MultisigApproval":253,"MultisigExecuted":254,"MultisigCancelled":255},"29":{"Sudid":260,"KeyChanged":261,"KeyRemoved":27,"SudoAsDone":260},"30":0,"31":{"72":277,"ProxyExecuted":244,"PureCreated":273,"PureKilled":274,"Announced":275,"ProxyAdded":276,"ProxyRemoved":276},"33":{"73":309,"IdentitySet":73,"IdentityCleared":308,"IdentityKilled":308,"JudgementUnrequested":309,"JudgementGiven":310,"RegistrarAdded":311,"SubIdentityAdded":312,"SubIdentitiesSet":313,"SubIdentityRenamed":314,"SubIdentityRemoved":312,"SubIdentityRevoked":312,"AuthorityAdded":315,"AuthorityRemoved":315,"UsernameSet":316,"UsernameQueued":317,"PreapprovalExpired":318,"PrimaryUsernameSet":316,"DanglingUsernameRemoved":316,"UsernameUnbound":319,"UsernameRemoved":319,"UsernameKilled":319,"UsernameReported":320,"PersonalIdentitySet":321,"EvidenceSubmitted":322,"CredentialAccepted":322,"CredentialRejected":322,"PersonBanned":322,"PersonalIdentityCleared":322,"ReportedUsernameJudgedValid":319,"ReportedUsernameJudgedInvalid":319,"ReportedUsernameWeakOrUnclearJudgement":323},"34":{"74":333,"PersonOnboarding":333,"AliasDispatched":334,"AliasAccountSet":334,"AliasAccountUnset":334,"PersonalIdAccountSet":335,"PersonalIdAccountUnset":335,"CollectionCreated":27,"ForcePersonhoodRecognized":336},"36":{"75":361,"76":362,"77":363,"CaseCreated":354,"Callback":244,"CallbackError":27,"CaseClosed":355,"Voted":356,"VoteCleaned":357,"CaseRemoved":354,"CaseIntervened":355,"VotesClaimed":358,"RewardPayout":359,"PayoutRoundStarted":360,"PointsCleaned":364,"CaseTouched":365,"VotingPenaltyCleared":366},"39":{"73":157,"78":389,"79":395,"80":395,"81":398,"82":399,"83":399,"CandidateApplied":157,"JudgementProvided":387,"RetryGranted":388,"CandidateReferred":390,"Rerolled":157,"DesignCommitted":391,"FullyAllocated":157,"TimedOut":157,"FlakedOut":157,"TicketReferred":392,"TicketCancelled":392,"TicketApplied":393,"FamilyAdded":394,"InvitedCandidateApplied":396,"ReferralVoucherRegistered":397,"ConfigurationSet":400},"40":{"79":395,"80":395,"81":398,"82":395,"83":395,"NewGame":420,"GameEnded":362,"SignedUp":421,"ReportSubmitted":422,"Offboarded":421,"KickedOut":423,"GamesScheduled":49,"ScheduledGameRemoved":424,"StmtUsageRemoved":366},"41":{"74":438,"75":439,"76":362,"77":437,"RoundTransitioned":440,"PayoutRoundOperated":440,"CashedOut":421},"42":{"IdsReserved":49,"IdRenewed":446,"IdUnreserved":446,"PeopleRegistered":49,"PeopleSuspended":49,"PersonhoodResumed":446,"SuspensionsStarted":27,"SuspensionsEnded":27},"43":{"AllAttestationAllowanceCleared":449,"AttestationAllowanceIncreased":398,"PersonAttested":450,"ConsumerRegistered":28},"44":{"78":461,"LitePersonRegistered":28,"PersonAuthorizationTouched":28,"ExpiredUsernameReservationRemoved":462,"IdentifierKeyUpdated":28,"UsernameReservationDurationSet":463,"StmtStoreSlotUpdated":464,"PersonDemoted":28},"45":{"ChunkPageHashesInitialized":469,"ChunksAdded":470},"46":{"MemberAdded":488,"MemberRemoved":488,"CollectionMarkedForDeletion":489,"CollectionDeleted":489,"RingBuilt":490,"MembersOnboarded":489,"RingsMerged":491,"OnboardingSizeSet":492},"47":{"CoinSplit":529,"CoinTransferred":530,"RecyclerLoadedWithCoin":531,"RecyclerLoadedWithExternalAsset":532,"RecyclerUnloadedIntoCoin":533,"RecyclerUnloadedIntoExternalAsset":534,"PaidUnloadTokenRegisteredWithCoin":535,"PaidUnloadTokenRegisteredWithNative":536,"PaidUnloadTokenRegisteredWithStable":536,"PeopleFreeUnloadTokenConsumed":537,"LitePeopleFreeUnloadTokenConsumed":537,"RecyclersUnloadedIntoCoin":538,"RecyclersUnloadedIntoExternalAsset":539,"RecyclersUnloadedIntoExternalAssetNonAnonymous":540,"RecyclerUnloadedIntoCoins":529,"CoinOffboardedIntoExternalAsset":541,"RecyclerCleaned":542,"ConsumedFreeTokensCleaned":537,"PaidUnloadTokenRingCleaned":543,"RecyclerDustCleaned":27,"PaidUnloadTokenDustCleaned":27,"ExpiredPaidUnloadTokenCollectionDeleted":537},"49":{"84":27,"AssetCreated":27,"XcmFundsTransferSent":27,"XcmFundsTransferTimedOut":27,"FundsVerified":27,"PotsFunded":27,"MobRulePayoutsScheduled":27,"ScorePayoutsScheduled":27,"OnPollInitializationCompleted":27,"MigrationPeopleRecognized":27,"MigrationOnboardingSizeSet":27,"MigrationProofOfInkInitialized":27,"MigrationGamesScheduled":27,"MigrationInvitesGranted":27,"MigrationReimbursementValuesSet":27,"MigrationAttestationAllowancesSet":27},"50":{"InitializationCompleted":27},"51":{"ParticipantRegistered":556,"EventStarted":557,"EventSkipped":557,"EventScheduled":558,"ScheduledEventRemoved":558,"FailedTransferPrizeClaimed":559,"WaitingForEntropyToBuild":558,"DrawingWinners":558,"Distributing":558,"PrizeDistributed":560,"PrizeDistributionFailed":560,"ClearingStorage":558,"EventCompleted":558},"52":{"84":567,"UpgradeStarted":566,"UpgradeCompleted":27,"UpgradeFailed":27,"MigrationSkipped":362,"MigrationAdvanced":567,"MigrationFailed":567,"HistoricCleared":568}},"constants":{"1":{"BlockWeights":14,"BlockLength":15,"BlockHashCount":1,"DbWeight":16,"Version":17,"SS58Prefix":1},"2":{"SelfParaId":1},"3":{"MinimumPeriod":45},"4":0,"5":0,"8":{"ExistentialDeposit":45,"MaxLocks":1,"MaxReserves":1,"MaxFreezes":1},"9":{"OperationalFeeMultiplier":1},"10":0,"11":0,"13":{"RemoveItemsLimit":1,"AssetDeposit":45,"AssetAccountDeposit":45,"MetadataDepositBase":45,"MetadataDepositPerByte":45,"ApprovalDeposit":45,"StringLimit":1},"14":0,"15":0,"16":0,"17":0,"18":{"85":148,"MaxCandidates":1,"MinEligibleCollators":1,"MaxInvulnerables":1,"KickThreshold":1,"pot_account":144},"19":{"KeyDeposit":45},"21":{"SlotDuration":45},"22":0,"23":{"MaxInboundSuspended":1,"MaxActiveOutboundChannels":1,"MaxPageSize":1},"24":{"UniversalLocation":189,"AdvertisedXcmVersion":1,"MaxLockers":1,"MaxRemoteLockConsumers":1},"25":0,"26":{"HeapSize":1,"MaxStale":1,"ServiceWeight":230,"IdleMaxServiceWeight":230},"27":{"batched_calls_limit":1},"28":{"DepositBase":45,"DepositFactor":45,"MaxSignatories":1},"29":0,"30":0,"31":{"ProxyDepositBase":45,"ProxyDepositFactor":45,"MaxProxies":1,"MaxPending":1,"AnnouncementDepositBase":45,"AnnouncementDepositFactor":45},"33":{"86":1,"87":1,"BasicDeposit":45,"ByteDeposit":45,"UsernameDeposit":45,"SubAccountDeposit":45,"UsernameReportDeposit":45,"MaxSubAccounts":1,"UsernameReportTimeout":1,"MaxRegistrars":1,"MaxJudgements":1,"PendingUsernameExpiration":1,"UsernameGracePeriod":1,"MaxSuffixLength":1,"CredentialRemovalPenalty":45,"identity_context":6},"34":{"88":1,"RingExponent":330,"account_setup_time_tolerance":1},"36":{"89":90,"90":1,"MaxVoteClaimDuration":45,"MinCaseDuration":1,"MaxVotingDuration":1,"MinTurnoutNominal":1,"MinTurnoutPercentage":1,"VotingPenaltyDuration":1,"MaxVotesClaimable":1,"CleanVotesBatchSize":1,"VotesOpenForClaimsDuration":1,"MinimumVoterThreshold":1,"mob_rule_pot_id":144,"mob_rule_context":6},"39":{"85":148,"MaxActiveReferrals":1,"proof_of_ink_pot_id":144},"40":{"MaxRounds":1,"MaxGroupSize":1,"MinGroupSize":1,"NonPlayingKickoutTime":1,"PhaseDurations":401,"MaxGameSchedules":1,"MaxAttendanceHistoryDepth":1,"proof_of_ownership_msg_base":6},"41":{"89":90,"90":1,"score_pot_id":144,"score_context":6,"ubi_points":1},"42":0,"43":0,"44":{"86":1,"87":1,"PersonAuthDuration":1,"MinPersonAuthUpdateInterval":1,"MaxReservationQueueLength":1,"AccountsApiSlotCount":1,"AccountsApiRefundCooldown":1,"AccountsApiAllowance":455},"45":{"PageSize":1},"46":{"88":1,"MaxCollections":1,"MaxFlexibleRingExponent":330,"RingBuildingMemberLimit":1},"47":{"RecyclerRingExponent":330,"PaidUnloadTokenRingExponent":330,"UnderlyingAssetId":90,"UnderlyingAssetUnit":45,"MinimumExponent":1,"MaximumExponent":1,"MaxSplitOutputs":1,"MaxConsolidation":1,"UnloadTokenTimePeriodPeopleLitePeople":1,"UnloadTokenAllowancePerTimePeriodForPeople":45,"UnloadTokenAllowancePerTimePeriodForLitePeople":45,"MaxFreeUnloadTokensPerTimePeriod":1,"OffchainWorkerInterval":1,"CoinFailureLockPeriod":45,"pallet_account":144},"49":0,"50":0,"51":{"airdrop_pot_id":144,"airdrop_context_base":552},"52":{"CursorMaxLen":1,"IdentifierMaxLen":1}},"viewFns":{"1":0,"2":0,"3":0,"4":0,"5":0,"8":0,"9":0,"10":0,"11":0,"13":{"asset_details":91,"balance_of":92,"get_metadata":93,"get_reserves_data":94},"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":{"check_permissions":264,"is_superset":265},"33":0,"34":0,"36":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":{"get_free_unload_token_info":501,"get_recycler_ring_status":502,"get_recycler_ring_revision":503,"get_paid_token_ring_status":504,"get_paid_token_ring_revision":505,"get_paid_unload_token_fee_in_asset":506,"get_paid_unload_token_fee_in_native":507,"get_coin_by_owner":508,"get_coin_lock_until":509,"get_recycler_member_info":510,"is_paid_token_member":511,"get_recycler_members":512,"get_paid_token_ring_members":513,"is_recycler_alias_unloaded":514,"is_paid_token_alias_consumed":515,"is_free_token_alias_consumed":516},"49":0,"50":0,"51":0,"52":0},"apis":{"12":{"metadata":575,"metadata_at_version":576,"metadata_versions":577},"AuraApi":{"slot_duration":507,"authorities":569},"RelayParentOffsetApi":{"relay_parent_offset":570},"AuraUnincludedSegmentApi":{"can_build_upon":571},"Core":{"version":572,"execute_block":573,"initialize_block":574},"RuntimeViewFunction":{"execute_view_function":578},"BlockBuilder":{"apply_extrinsic":579,"finalize_block":580,"inherent_extrinsics":581,"check_inherents":582},"TaggedTransactionQueue":{"validate_transaction":583},"OffchainWorkerApi":{"offchain_worker":584},"SessionKeys":{"generate_session_keys":585,"decode_session_keys":586},"AccountNonceApi":{"account_nonce":587},"TransactionPaymentApi":{"91":590,"92":591,"query_info":588,"query_fee_details":589},"TransactionPaymentCallApi":{"91":590,"92":591,"query_call_info":592,"query_call_fee_details":593},"XcmPaymentApi":{"query_acceptable_payment_assets":594,"query_xcm_weight":595,"query_weight_to_asset_fee":596,"query_delivery_fees":597},"LocationToAccountApi":{"convert_location":598},"MobRuleApi":{"voted_on":599},"ProofOfInkApi":{"candidacy_deposit":507},"PalletGameApi":{"play_deposit":507,"validate_statement_with_reason":600},"CollectCollationInfo":{"collect_collation_info":601},"GenesisBuilder":{"build_state":602,"get_preset":603,"preset_names":604},"ValidateStatement":{"validate_statement":605}}}},[{}],["Account","System","ParachainSystem","Timestamp","ParachainInfo","WeightReclaim","Reserves","Holds","Balances","TransactionPayment","SkipFeelessPayment","OriginRestriction","Metadata","Assets","AssetsHolder","AssetRate","AssetTxPayment","Authorship","CollatorSelection","Session","Authorities","Aura","AuraExt","XcmpQueue","PolkadotXcm","CumulusXcm","MessageQueue","Utility","Multisig","Sudo","VerifySignature","Proxy","AccountToAlias","Identity","People","RoundSchedules","MobRule","AvailableInvites","PendingInvites","ProofOfInk","Game","Score","DummyDim","PeopleLite","Resources","ChunksManager","Members","Coinage","OnPollStatus","StorageInitialization","StorageInitializationLite","Airdrop","MultiBlockMigrations","force_transfer","transfer_keep_alive","transfer_all","burn","create","transfer","poke_deposit","schedule_payout_rounds","remove_payout_schedule","grant_invites","remove_available_and_pending_invites","set_invite_ticket","cancel_invite_ticket","Burned","Issued","Frozen","Thawed","Held","Released","DepositPoked","JudgementRequested","PersonhoodRecognized","PayoutRoundsScheduled","PayoutScheduleRemoved","CreditClaimed","PersonRegistered","AllInvitesRemoved","SomeInvitesRemoved","InvitesGranted","InviteTicketSet","InviteTicketCancelled","MigrationCompleted","PotId","MaxUsernameLength","MinUsernameLength","OnboardingQueuePageSize","CurrencyLocationInfo","OffchainWorkInterval","query_weight_to_fee","query_length_to_fee"]]`); - - const replaceTokens = (obj: Record): Record => - Object.fromEntries( - Object.entries(obj).map(([key, value]) => { - const unwrappedValue = - typeof value === "object" ? replaceTokens(value as any) : value - const numericKey = Number(key) - if (Number.isNaN(numericKey)) { - return [key, unwrappedValue] - } - return [tokens[numericKey], unwrappedValue] - }), - ) as Record - const tokenizedCommonTrees = commonTrees.map(replaceTokens) - - const unwrap = ( - obj: Record, - depth: number, - ): Record => - depth === 0 - ? (obj as Record) - : Object.fromEntries( - Object.entries(obj).map(([key, value]) => [ - key, - unwrap( - typeof value === "object" ? value : tokenizedCommonTrees[value], - depth - 1, - ), - ]), - ) - - const getChainDescriptors = (key: string) => - unwrap(replaceTokens(minified[key]), 2) - - export const People_lite = getChainDescriptors("people_lite") - \ No newline at end of file diff --git a/packages/host-papp/.papi/descriptors/src/index.ts b/packages/host-papp/.papi/descriptors/src/index.ts deleted file mode 100644 index 8769c33f..00000000 --- a/packages/host-papp/.papi/descriptors/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { default as people_lite, type People_liteWhitelistEntry } from "./people_lite.js"; -export { people_lite } -export type * from "./people_lite.js"; -export { -DigestItem, Phase, DispatchClass, TokenError, ArithmeticError, TransactionalError, BalanceStatus, TransactionPaymentEvent, XcmV5Junctions, XcmV5Junction, XcmV5NetworkId, XcmV3JunctionBodyId, XcmV2JunctionBodyPart, XcmV5Instruction, XcmV3MultiassetFungibility, XcmV3MultiassetAssetInstance, XcmV3MaybeErrorCode, XcmV2OriginKind, XcmV5AssetFilter, XcmV5WildAsset, XcmV2MultiassetWildFungibility, XcmV3WeightLimit, XcmVersionedAssets, XcmV3MultiassetAssetId, XcmV3Junctions, XcmV3Junction, XcmV3JunctionNetworkId, XcmVersionedLocation, UpgradeGoAhead, UpgradeRestriction, BalancesTypesReasons, TransactionPaymentReleases, XcmV3Response, XcmV3TraitsError, XcmV4Response, XcmPalletVersionMigrationStage, XcmVersionedAssetId, IdentityData, MultiAddress, BalancesAdjustmentDirection, XcmVersionedXcm, XcmV3Instruction, XcmV3MultiassetMultiAssetFilter, XcmV3MultiassetWildMultiAsset, XcmV4Instruction, XcmV4AssetAssetFilter, XcmV4AssetWildAsset, TransactionValidityUnknownTransaction, TransactionValidityTransactionSource -} from './common-types.js'; -const metadatas: Record Promise }> = {["0xee12eb3f12f8387448d2bf78c773dda08731483357a1b8fb773374f7b7bc417c"]: people_lite} - -export const getMetadata: (codeHash: string) => Promise = async ( - codeHash: string -)=> { - try { - return await metadatas[codeHash].getMetadata() - } catch {} - return null -} -export type WhitelistEntry = People_liteWhitelistEntry; -export type WhitelistEntriesByChain = Partial<{"*": WhitelistEntry[], people_lite: WhitelistEntry[]}> diff --git a/packages/host-papp/.papi/descriptors/src/metadataTypes.ts b/packages/host-papp/.papi/descriptors/src/metadataTypes.ts deleted file mode 100644 index c9532bc2..00000000 --- a/packages/host-papp/.papi/descriptors/src/metadataTypes.ts +++ /dev/null @@ -1,4 +0,0 @@ - -const content = "eQkAAAAQAQEFAAQBAQUAFAEBBQAcAAQAIAAEACQBAQUAIAEBBQAwAQEFAC0DACAANQMBAQUAPQMBAQUANAEBBQBBAwEBBQAYAQEFAE0DAQEFAFEDAQEFAFUDAQEFAGEDAQAEGHJlbWFyayQBAQUBAAQUcGFnZXMIAQEFAQAEEGNvZGUkAQEFAQAEFGl0ZW1zaQMBAQUBAAQQa2V5c20DAQEFAQAIGHByZWZpeCQcc3Via2V5cwQBAQUBAAQkY29kZV9oYXNoIAEBBQEBBQEABDRkaXNwYXRjaF9pbmZvQAEBBQEACDhkaXNwYXRjaF9lcnJvctQ0ZGlzcGF0Y2hfaW5mb0ABAQUBAQUBAQUBAAQcYWNjb3VudAABAQUBAAgYc2VuZGVyABBoYXNoIAEBBQEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAQEFAQAIJGNvZGVfaGFzaCAUZXJyb3LUAQEFAQEFAQEFAI0DAQEFAJUDAQEFACQBAQUAmQMBAQUAoQMBAQUAhQMBAQUAbQMBAQUAtQMBAQUAvQMBAQUAxQMBAQUAyQMBAQUA0QMBAQUACAEACBBkYXRh3QNUaW5ib3VuZF9tZXNzYWdlc19kYXRhDQQBAQUBAAQcbWVzc2FnZSQBAQUBAQUBAARUcmVsYXlfY2hhaW5fYmxvY2tfbnVtBAEBBQEABBRjb3VudAQBAQUBAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIAEBBQEABDBtZXNzYWdlX2hhc2jcAQAEDG5vdwgBAQUAAAAMAAAAGQQAAAAhBAAAACkEAAAAMQQBAAgQZGVzdDUEFHZhbHVlCAEBBQEADBhzb3VyY2U1BBBkZXN0NQQUdmFsdWUIAQEFAQAIEGRlc3Q1BChrZWVwX2FsaXZlFAEBBQEACAx3aG81BBhhbW91bnQIAQEFAQAEDHdob70BAQEFAQAIDHdobzUEIG5ld19mcmVlCAEBBQEACCRkaXJlY3Rpb245BBRkZWx0YQgBAQUBAAgUdmFsdWUIKGtlZXBfYWxpdmUUAQEFAQEFAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQgBAQUBAAgcYWNjb3VudAAYYW1vdW50CAEBBQEADBBmcm9tAAh0bwAYYW1vdW50CAEBBQEACAx3aG8AEGZyZWUIAQEFAQAIDHdobwAYYW1vdW50CAEBBQEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPkAQEFAQAEGGFtb3VudAgBAQUBAAQMd2hvAAEBBQEACAxvbGQIDG5ldwgBAQUBAAwYcmVhc29uBQEMd2hvABhhbW91bnQIAQEFAQAQGHJlYXNvbgUBGHNvdXJjZQAQZGVzdAAYYW1vdW50CAEBBQEAEBhyZWFzb24FARhzb3VyY2UAEGRlc3QALHRyYW5zZmVycmVkCAEBBQAJAQEBBQA9BAEBBQEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgBAQUBAAQYb3JpZ2lukQEAmQEAQQQBAAQYZW50aXR5mQEBAQUBAQUBAAQYZW50aXR5mQEAUQEASQQATQQAWQQAXQQAYQQAUQEAZQQAUQEApQEBAQUAUQEBAwRRAQBpBAEDCABRAQB5AgEDBFEBAG0EAQMEUQEApQEBAAwIaWRRARRhZG1pbjUELG1pbl9iYWxhbmNlCAEBBQEAEAhpZFEBFG93bmVyNQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UIAQEFAQAECGlkUQEBAQUBAAwIaWRRASxiZW5lZmljaWFyeTUEGGFtb3VudAgBAQUBAAwIaWRRAQx3aG81BBhhbW91bnQIAQEFAQAMCGlkUQEYdGFyZ2V0NQQYYW1vdW50CAEBBQEAEAhpZFEBGHNvdXJjZTUEEGRlc3Q1BBhhbW91bnQIAQEFAQAICGlkUQEMd2hvNQQBAQUBAAgIaWRRARRvd25lcjUEAQEFAQAQCGlkUQEYaXNzdWVyNQQUYWRtaW41BBxmcmVlemVyNQQBAQUBABAIaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBAEBBQEAFAhpZFEBEG5hbWUkGHN5bWJvbCQgZGVjaW1hbHMEJGlzX2Zyb3plbhQBAQUBACAIaWRRARRvd25lcjUEGGlzc3VlcjUEFGFkbWluNQQcZnJlZXplcjUELG1pbl9iYWxhbmNlCDRpc19zdWZmaWNpZW50FCRpc19mcm96ZW4UAQEFAQAMCGlkUQEgZGVsZWdhdGU1BBhhbW91bnQIAQEFAQAICGlkUQEgZGVsZWdhdGU1BAEBBQEADAhpZFEBFG93bmVyNQQgZGVsZWdhdGU1BAEBBQEAEAhpZFEBFG93bmVyNQQsZGVzdGluYXRpb241BBhhbW91bnQIAQEFAQAICGlkUQEoYWxsb3dfYnVybhQBAQUBAAgIaWRRASxtaW5fYmFsYW5jZQgBAQUBAAwIaWRRARBkZXN0NQQoa2VlcF9hbGl2ZRQBAQUBAAgIaWRRASByZXNlcnZlc6UBAQEFAQEFAQAMIGFzc2V0X2lkUQEcY3JlYXRvcgAUb3duZXIAAQEFAQAMIGFzc2V0X2lkUQEUb3duZXIAGGFtb3VudAgBAQUBABAgYXNzZXRfaWRRARBmcm9tAAh0bwAYYW1vdW50CAEBBQEADCBhc3NldF9pZFEBFG93bmVyABxiYWxhbmNlCAEBBQEAECBhc3NldF9pZFEBGGlzc3VlcgAUYWRtaW4AHGZyZWV6ZXIAAQEFAQAIIGFzc2V0X2lkUQEUb3duZXIAAQEFAQAIIGFzc2V0X2lkUQEMd2hvAAEBBQEABCBhc3NldF9pZFEBAQEFAQAMIGFzc2V0X2lkUQFIYWNjb3VudHNfZGVzdHJveWVkBEhhY2NvdW50c19yZW1haW5pbmcEAQEFAQAMIGFzc2V0X2lkUQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwQBAQUBABQgYXNzZXRfaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UAQEFAQAQIGFzc2V0X2lkUQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CAEBBQEADCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQABAQUBABQgYXNzZXRfaWRRARRvd25lcgAgZGVsZWdhdGUALGRlc3RpbmF0aW9uABhhbW91bnQIAQEFAQAIIGFzc2V0X2lkUQE8bmV3X21pbl9iYWxhbmNlCAEBBQEADCBhc3NldF9pZFEBDHdobwAkZGVwb3NpdG9yAAEBBQEADCBhc3NldF9pZFEBDHdobwAYYW1vdW50CAEBBQEACCBhc3NldF9pZFEBIHJlc2VydmVzpQEATQQAKQQATQQACAEBBQEAEAx3aG8AIGFzc2V0X2lkUQEYcmVhc29uBQEYYW1vdW50CABRAQAIAQAIKGFzc2V0X2tpbmRRARByYXRlCAEBBQEABChhc3NldF9raW5kUQEBAQUBAQUBAAgoYXNzZXRfa2luZFEBEHJhdGUIAQEFAQAEKGFzc2V0X2tpbmRRAQEBBQEADChhc3NldF9raW5kUQEMb2xkCAxuZXcIAQEFAQAQDHdobwAoYWN0dWFsX2ZlZQgMdGlwCCBhc3NldF9pZLUBAQEFAAABAQUAvQEBAQUAdQQAAAAEAQEFANkBAQAEDG5ld70BAQEFAQAEDG1heAQBAQUBAAQQYm9uZAgBAQUBAQUBAQUBAAQMd2hvAAEBBQEABCxuZXdfZGVwb3NpdAgBAQUBAAgcZGVwb3NpdAgYdGFyZ2V0AAEBBQEBBQEABDRpbnZ1bG5lcmFibGVzvQEBAQUBAAQoYWNjb3VudF9pZAABAQUBAARIZGVzaXJlZF9jYW5kaWRhdGVzBAEBBQEABCxib25kX2Ftb3VudAgBAQUBAAgoYWNjb3VudF9pZAAcZGVwb3NpdAgBAQUBAAwMb2xkAAxuZXcAHGRlcG9zaXQIAQEFAH0EAQEFADUDAAAAIACBBAAAAQAIEGtleXMgFHByb29mJAEBBQEBBQEABDRzZXNzaW9uX2luZGV4BAEBBQEABCR2YWxpZGF0b3IAAQEFAMUCAQEFAIUEAQEFAM0CAQEFAJEEAJUEACQBAQUAmQQABAAIAQAEDG5ldwQBAQUBAQUBAAQwbWVzc2FnZV9oYXNoIAAIAMEEACAABADFBAAEAMUEAAgAxQQAyQQBAQUA0QQBAQUA1QQA3QQA6QQAAADxBAEBBQBBAgB1AgD9BAEBBQBNAQEACBBkZXN0dQIcbWVzc2FnZSkFAQEFAQAQEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlKQUobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb25RARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbpEDAQEFAQAEIGxvY2F0aW9udQIBAQUBABQQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdCECAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzcQIsYmVuZWZpY2lhcnl1AgEBBQEAHBBkZXN0dQIYYXNzZXRzcQJQYXNzZXRzX3RyYW5zZmVyX3R5cGUtBThyZW1vdGVfZmVlc19pZNkESGZlZXNfdHJhbnNmZXJfdHlwZS0FSGN1c3RvbV94Y21fb25fZGVzdCkFMHdlaWdodF9saW1pdCECAQEFAQAIHGFsaWFzZXJ1AhxleHBpcmVzeQIBAQUBAAQcYWxpYXNlcnUCAQEFAQEFAQAEHG91dGNvbWXVAQEBBQEAEBhvcmlnaW5RASxkZXN0aW5hdGlvblEBHG1lc3NhZ2VBAihtZXNzYWdlX2lkIAEBBQEAEBhvcmlnaW5RASxkZXN0aW5hdGlvblEBFGVycm9yRQIobWVzc2FnZV9pZCABAQUBAAwYb3JpZ2luUQEUZXJyb3LNAShtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW5RASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNlBQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2luUQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9utQEBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpblEBGGFzc2V0c3ECAQEFAQAQLGRlc3RpbmF0aW9uUQEYcmVzdWx0BBBjb3N07QEobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb25RARx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvblEBIHF1ZXJ5X2lkCBRlcnJvcs0BAQEFAQAIIGxvY2F0aW9udQIgcXVlcnlfaWQIAQEFAQAQGG9yaWdpblEBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyUQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXK1AQEBBQEADCxkZXN0aW5hdGlvblEBEGNvc3TtAShtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmdRARBmZWVz7QEBAQUBAAQcdmVyc2lvbgQBAQUBAAwcYWxpYXNlclEBGHRhcmdldFEBGGV4cGlyeXkCAQEFAQAIHGFsaWFzZXJRARh0YXJnZXRRAQEBBQEABBh0YXJnZXRRAQEBBQEACBRpbmRleAQUZXJyb3JsAQEFACABAQUBAwgg1QEAhQIAOQUBAQUAhQIAPQUAQQUBAQUADQIBAAg4bWVzc2FnZV9vcmlnaW6FAihwYWdlX2luZGV4BAEBBQEAEDhtZXNzYWdlX29yaWdpboUCEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYAQEFAQEFAQAMCGlkIBhvcmlnaW6FAhRlcnJvcokCAQEFAQAQCGlkIBhvcmlnaW6FAix3ZWlnaHRfdXNlZBgcc3VjY2VzcxQBAQUBABAIaWQgGG9yaWdpboUCKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEAQEFAQAIGG9yaWdpboUCFGluZGV4BAEABBRjYWxsc80GAQEFAQAIFGluZGV4BBBjYWxsyQYBAQUBAAgkYXNfb3JpZ2lukQEQY2FsbMkGAQEFAQAIEGNhbGzJBhh3ZWlnaHQYAQEFAQAIEG1haW7JBiBmYWxsYmFja8kGAQEFAQEFAQAIFGluZGV4BBRlcnJvctQBAQUBAAQUZXJyb3LUAQEFAQAEGHJlc3VsdJUCAQEFAQAEKG1haW5fZXJyb3LUAHkEANEGAQAIRG90aGVyX3NpZ25hdG9yaWVzvQEQY2FsbMkGAQEFAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ATxtYXliZV90aW1lcG9pbnR5BRBjYWxsyQYobWF4X3dlaWdodBgBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BPG1heWJlX3RpbWVwb2ludHkFJGNhbGxfaGFzaCAobWF4X3dlaWdodBgBAQUBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJHRpbWVwb2ludJ0CJGNhbGxfaGFzaCABAQUBAAwkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJGNhbGxfaGFzaCABAQUBAQUBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIAEBBQEAECRhcHByb3ZpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAUJGFwcHJvdmluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0lQIBAQUBABAoY2FuY2VsbGluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABAMd2hvACRjYWxsX2hhc2ggLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAQQY2FsbMkGAQEFAQAEDG5ldzUEAQEFAQAIDHdobzUEEGNhbGzJBgEBBQEBBQEABCxzdWRvX3Jlc3VsdJUCAQEFAQAIDG9sZKUCDG5ldwAAAADdBgAAAOkGAQMIyQatAgAUAQMIrQKtAgAUAQAMEHJlYWw1BEBmb3JjZV9wcm94eV90eXBlhQUQY2FsbMkGAQEFAQAMIGRlbGVnYXRlNQQocHJveHlfdHlwZa0CFGRlbGF5BAEBBQEADChwcm94eV90eXBlrQIUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVyNQQocHJveHlfdHlwZa0CFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBAAgQcmVhbDUEJGNhbGxfaGFzaCABAQUBAAggZGVsZWdhdGU1BCRjYWxsX2hhc2ggAQEFAQAQIGRlbGVnYXRlNQQQcmVhbDUEQGZvcmNlX3Byb3h5X3R5cGWFBRBjYWxsyQYBAQUBAQUBABgQcHVyZQAMd2hvAChwcm94eV90eXBlrQJQZGlzYW1iaWd1YXRpb25faW5kZXgECGF0BDxleHRyaW5zaWNfaW5kZXgEAQEFAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGWtAlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtAhRkZWxheQQBAQUBABAMd2hvABBraW5ksQIsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAAAAPUGAAAAJAAAAP0FAAAA+QYBAQUABQcAJAAJBwAkABEHACQAFQcAJAAEACAAIQcAIAAlBwEABBxhY2NvdW50NQQBAQUBAAQQaW5mb/kFAQEFAQAEEHN1YnMBBgEBBQEACCRyZWdfaW5kZXgEHG1heF9mZWUIAQEFAQAEJHJlZ19pbmRleAQBAQUBAAgUaW5kZXgEDGZlZQgBAQUBAAgUaW5kZXgEDG5ldzUEAQEFAQAIFGluZGV4BBhmaWVsZHMIAQEFAQAQJHJlZ19pbmRleAQYdGFyZ2V0NQQkanVkZ2VtZW50BQYgaWRlbnRpdHkgAQEFAQAEGHRhcmdldDUEAQEFAQAIDHN1YjUEEGRhdGHxBQEBBQEABAxzdWI1BAEBBQEADCRhdXRob3JpdHk1BBhzdWZmaXgkKGFsbG9jYXRpb24EAQEFAQAIGHN1ZmZpeCQkYXV0aG9yaXR5NQQBAQUBABAMd2hvNQQgdXNlcm5hbWUkJHNpZ25hdHVyZRUGOHVzZV9hbGxvY2F0aW9uFAEBBQEABCB1c2VybmFtZSQBAQUBAAwcYWNjb3VudAAkc2lnbmF0dXJlEQYgdXNlcm5hbWUkAQEFAQAEKGNyZWRlbnRpYWwZBgEBBQEADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudL0CAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEBBQEACCByZXBvcnRlcgAgdXNlcm5hbWUkAQEFAQAMFGFsaWFzIBxhY2NvdW50ACB1c2VybmFtZSQBAQUBAAQUYWxpYXMgAQEFAQAIIHVzZXJuYW1lJCRqdWRnZW1lbnS9AgAgAAgACAApBwBdAQAAAAAAYQEAAAAIAAgAkQIBAQUA+QIBAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdAQBAQUBAAQYcGVvcGxlxQIBAQUBAQUBAAgMd2hvCAxrZXkgAQEFAQAIFGFsaWFzXQEcYWNjb3VudAABAQUBAAgMd2hvCBxhY2NvdW50AAEBBQEABBhwZW9wbGXFAgAgAC0HAMEDAAQAwQMAvQIABABFBwAEAEkHAAQATQcBAQUAUQcBAQUAWQcBAAgoY2FzZV9pbmRleAQcb3Bpbmlvbr0CAQEFAQAEKGNhc2VfaW5kZXgEAQEFAQAIKGNhc2VfaW5kZXgEFHZvdGVyIAEBBQEACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIBAQUBAAQsZGVzdGluYXRpb24AAQEFAQAEMGNhc2VfaW5kaWNlc80CAQEFAQAMGGFtb3VudAgUY291bnQEGHBlcmlvZAQBAQUBAAQUaW5kZXgEAQEFAQAIFHJvdW5kBBR2b3RlciABAQUBAQUBAAQoY2FzZV9pbmRleAQBAQUBAAgoY2FzZV9pbmRleAQcdmVyZGljdL0CAQEFAQAMKGNhc2VfaW5kZXgEFHZvdGVyIBxvcGluaW9uvQIBAQUBAAgoY2FzZV9pbmRleAQUdm90ZXIgAQEFAQAIFHZvdGVyIDBjYXNlX2luZGljZXPNAgEBBQEADBR2b3RlciAsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAwUcm91bmQEPGluaXRpYWxfYmFsYW5jZQgwdG90YWxfcG9pbnRzCAEBBQEADBhhbW91bnQIFGNvdW50BBhwZXJpb2QEAQEFAQAEFGluZGV4BAEBBQEACBR2b3RlciAYYW1vdW50CAEBBQEACBRyb3VuZAQUdm90ZXIgAQEFAQAIKGNhc2VfaW5kZXgEHHJpcGVuZWQUAQEFAQAEDHdobyAAAABlBwAIAG0HAAgAvQEABABxBwAxAwB1BwEBBQDZAgB5BwCRAgEBBQAxBgEABCBldmlkZW5jZSABAQUBAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwKQYBAQUBAAgYY2hvaWNlLQYocmVxdWlyZV9pZHkCAQEFAQAEHGFjY291bnQAAQEFAQAMIHJlZmVycmVyCCRzaWduYXR1cmURBhh0aWNrZXQAAQEFAQAMHGludml0ZXIAGHRpY2tldAAkc2lnbmF0dXJlEQYBAQUBAAwUaW5kZXgEEGtpbmTVAghpZCABAQUBAAQYdGlja2V0AAEBBQEACBxhY2NvdW50ABRjb3VudAQBAQUBAAgcYWNjb3VudAAUbGltaXQEAQEFAQAEGGNvbmZpZ9kCAQEFAQAIPHJlZmVycmVkX3ZhbHVlczEGPHJlZmVycmVyX3ZhbHVlczEGAQEFAQEFAQAIKGFjY291bnRfaWQAJGp1ZGdlbWVudL0CAQEFAQAIKGFjY291bnRfaWQAIGZhaWx1cmVzBAEBBQEACChhY2NvdW50X2lkACxwZXJzb25hbF9pZAgBAQUBAAggcmVmZXJyZXIIIHJlZmVycmVkAAEBBQEACChhY2NvdW50X2lkACxyZXNlcnZlZF9pZAgBAQUBAAggcmVmZXJyZXIIGHRpY2tldAABAQUBAAgoYWNjb3VudF9pZAAgcmVmZXJyZXIIAQEFAQAMFGluZGV4BBBraW5k1QIIaWQgAQEFAQAEHGludml0ZXIAAQEFAQAIDHdobwAcaW52aXRlcgABAQUBAAQgcmVmZXJyZXIIAQEFAQAIHGFjY291bnQAFGNvdW50BAEBBQEACBxpbnZpdGVyABh0aWNrZXQAAQEFAQAEGGNvbmZpZ9kCAQEFAE0GAH0HAJECAOECAIEHAOECAIkHAQEFAJkHAAQABADhAgDNAgCVBADhAgDBAwDhAgEBBQBJBgAgAAAAAAANBgEABDhpZGVudGlmaWVyX2tleQ0GAQEFAQAMOGlkZW50aWZpZXJfa2V5DQZEc3RhdGVtZW50X2FjY291bnQADHNpZxEGAQEFAQAELGZ1bGxfcmVwb3J0QQYBAQUBAAQYcGxheWVyAAEBBQEABDxnYW1lc19zY2hlZHVsZXNJBgEBBQEABDhnYW1lX3BsYXlfdGltZQQBAQUBAAQYcGhhc2VzTQYBAQUBAQUBAAxEcmVnaXN0cmF0aW9uX2VuZHMEJGdhbWVfZGF0ZQQscmVwb3J0X2VuZHMEAQEFAQAEDHdob+ECAQEFAQAIDHdob+ECKGdhbWVfaW5kZXgEAQEFAQAEGHBsYXllcuECAQEFAQAEOGdhbWVfcGxheV90aW1lBADhAgClBwEBBQBhBgEBBQChBACpBwAEAAQArQcBAQUAsQcBAQUAuQcBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAEBBQEACCxyb3VuZF9pbmRleAQUbGltaXQEAQEFAQAEDGtleVkGAQEFAQAEIHNjaGVkdWxlYQYBAQUBAQUBAAwMd2hv4QIsZGVzdGluYXRpb24AGGFtb3VudAgBAQUBAAgMd2hv4QIccmVzdW1lZBQBAQUBAAwYYW1vdW50CBRjb3VudAQgZHVyYXRpb24EAQEFAQAELHJvdW5kX2luZGV4BAAIAL0HAQAEFGNvdW50BAEBBQEABAhpZAgBAQUBAAQwaWRzX2FuZF9rZXlzbQYBAQUBAAQMaWRzcQYBAQUBAQUBAAQIaWQIAAAAxQcBABQkY2FuZGlkYXRlAExjYW5kaWRhdGVfc2lnbmF0dXJlEQYwcmluZ192cmZfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBlRjb25zdW1lcl9yZWdpc3RyYXRpb259BgEBBQEBBQEABCB2ZXJpZmllcgABAQUBAAgkY2FuZGlkYXRlACB2ZXJpZmllcgAAAADVBwAAAAAAJAAAACQA3QcBAQUA4QcBAAw4aWRlbnRpZmllcl9rZXkNBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUdAwEBBQEADFBsaW5rZWRfbGl0ZV9pZGVudGl0eQBMbGl0ZV9pZGVudGl0eV9wcm9vZhEGPHVzZXJuYW1lX2Nob2ljZYUGAQEFAQAIIHVzZXJuYW1lJBxhY2NvdW50AAEBBQEABCBkdXJhdGlvbggBAQUBAAgsc2xvdF9udW1iZXIELHNldF9hY2NvdW50pQIBAQUBAQUBAAgUYWxpYXMgHGFjY291bnQAAQEFAQAIIHVzZXJuYW1lJBxhY2NvdW50AAEBBQEABCBkdXJhdGlvbggBAQUBAAgcYWNjb3VudAAsc2xvdF9udW1iZXIEAOUHAO0HAOUHACABAAw0cmluZ19leHBvbmVudPkCKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJAEBBQEACDRyaW5nX2V4cG9uZW50+QIscGFnZV9oYXNoZXPFAgEBBQEBBQEACDRyaW5nX2V4cG9uZW50+QIsdG90YWxfcGFnZXMEAQEFAQAMNHJpbmdfZXhwb25lbnT5AixzdGFydF9pbmRleAQUY291bnQEACAA+QcA8QcAxQIA/QcACQgADQgAxQIA/QcAEQgA/QcAzQIAIAAZCAAgAB0IAP0HAJECACAAMQMA/QcAxQIBAQUAJQgADQgAkQIBAAwoaWRlbnRpZmllciAocmluZ19pbmRleAQUbGltaXSRAwEBBQEABChpZGVudGlmaWVyIAEBBQEADChpZGVudGlmaWVyIDxiYXNlX3JpbmdfaW5kZXgERHRhcmdldF9yaW5nX2luZGV4BAEBBQEACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUEAQEFAQEFAQAEDGtleSABAQUBAAQoaWRlbnRpZmllciABAQUBAAgoaWRlbnRpZmllciAocmluZ19pbmRleAQBAQUBAAwoaWRlbnRpZmllciA8YmFzZV9yaW5nX2luZGV4BER0YXJnZXRfcmluZ19pbmRleAQBAQUBAAgoaWRlbnRpZmllciA8b25ib2FyZGluZ19zaXplBAAAAH0BAAAALQgAwQMAkQIABACRAgAxCACRAgCVBACRAgAgAJECAQEFAJECAQMAADUIAQMIBAQAOQgBAwgEBACRAwEDCAQEADkIAQMIBAQAkQMBAwAAeQIBAwAACAEDBAAAPQgBAwQAAHkCAQMEIACRAwEDBCAAFAEDCAQEAMUCAQMIBAQAxQIBAwwEBCAAFAEDDAQEIAAUAQMIBCAAFAEABChzcGxpdF9pbnRvmQYBAQUBAAQIdG8AAQEFAQAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGAQEFAQAQMHByZXNlcnZhdGlvbp0GFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBgEBBQEAFBxhbGlhc2VzxQIUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQIdG8AAQEFAQAIGGlucHV0c6UGCHRvAAEBBQEAEBRpbnB1dKEGMGFsaWFzX3Byb29mc4UBCHRvADBmZWVfY3VycmVuY3kFAwEBBQEAEBhpbnB1dHOlBjBhbGlhc19wcm9vZnOFAQh0bwAwZmVlX2N1cnJlbmN5BQMBAQUBABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+ZBgEBBQEABBR2YWx1ZQQBAQUBAAQYcGVyaW9kBAEBBQEACBhwZXJpb2QEKHJpbmdfaW5kZXgEAQEFAQEFAQAEMG91dHB1dF9jb3VudAQBAQUBAAwIdG8AFHZhbHVlBBxuZXdfYWdlBAEBBQEABBR2YWx1ZQQBAQUBAAwMd2hvABR2YWx1ZQQYYW1vdW50CAEBBQEAEAh0bwAsaW5wdXRfdmFsdWUEMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEAQEFAQAQCHRvABR2YWx1ZQQsaW5wdXRfY291bnQEGGFtb3VudAgBAQUBAAgMZmVlCCRkZXN0cm95ZWQIAQEFAQAIDHdobwAMZmVlCAEBBQEABBhwZXJpb2QEAQEFAQAMCHRvADBvdXRwdXRfdmFsdWUELGlucHV0X2NvdW50BAEBBQEADAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgBAQUBABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5BQMBAQUBAAwIdG8AFHZhbHVlBBhhbW91bnQIAQEFAQAMFHZhbHVlBDxyZW1haW5pbmdfY29pbnMEQGRlc3Ryb3llZF9hbW91bnQIAQEFAQAIGHBlcmlvZAQocmluZ19pbmRleAQBAQUAQQgBAQUARQgBAQUATQgABABVCAAxAwBZCAAEAM0CAF0IAGEIAAQAZQgBAQUA4QUBAAQoZXZlbnRfaW5mb60GAQEFAQAEIGV2ZW50X2lkBAEBBQEACCBldmVudF9pZAQQZGVzdAABAQUBAQUBAAwgZXZlbnRfaWQEOHBhcnRpY2lwYW50X2lkBBRhbGlhcyABAQUBAAgIaWQEFGV2ZW50FQMBAQUBAAQgZXZlbnRfaWQEAQEFAQAIDHdobwAgZXZlbnRfaWQEAQEFAQAQIGV2ZW50X2lkBBBkZXN0ACBhc3NldF9pZFEBMGFzc2V0X2Ftb3VudAgBAQUAuQYAJACRAgEABBhjdXJzb3K9BgEBBQEADBRpbmRleAQwaW5uZXJfY3Vyc29yHQMoc3RhcnRlZF9hdJEDAQEFAQAEIHNlbGVjdG9ywQYBAQUBAQUBAAQobWlncmF0aW9ucwQBAQUBAAgUaW5kZXgEEHRvb2sEAQEFAQAELG5leHRfY3Vyc29yHQMBAwAAxQIBAwAABAEDCCAIABQBAwAAYQMBAwRpCACRAgEDBNUDAG0IAQMAACQBAwQEAB0DAQMAAM0CAQMIcQgkAHkIAQMEJACJCAEDAADVAwEDBJEIAG0DAQMIaQiRCACVCAEDDJkIJCAAoQgBAwTVAwCRAgEDBB0DACQBAwQkAK0IAQMEAAAEAQMIJAQAsQgBAwgkBAC9CAEDBBgACAEDBAQACAEDCMkGBACxCAEDCMkGBAC9CAEDBAQAyQgBAwQpBQDNCAEDCBjZBADRCAEDDHUCKQXZBADVCAEDBHUCAN0IAQMIIBQAzQIBAwjhCPUIAP0IAQME1QMAAQkBAwQkAAUJAQMECQkAHQMBAwAADQkBAwjhCPUIABUJGQkBAQECAQMAEBBmcmVlCCByZXNlcnZlZAgYZnJvemVuCBRmbGFncwgAFBRub25jZQQkY29uc3VtZXJzBCRwcm92aWRlcnMELHN1ZmZpY2llbnRzBBBkYXRhDAEAAAggcmVmX3RpbWUIKHByb29mX3NpemUIAAwYbm9ybWFsGCxvcGVyYXRpb25hbBgkbWFuZGF0b3J5GAUBgAUABQEQAhQoUHJlUnVudGltZQADCCgkJENvbnNlbnN1cwADCCgkEFNlYWwAAwgoJBRPdGhlcgEkZFJ1bnRpbWVFbnZpcm9ubWVudFVwZGF0ZWQAAQUELAACDDhBcHBseUV4dHJpbnNpYwEEMEZpbmFsaXphdGlvbgABBThJbml0aWFsaXphdGlvbgABBQIMGE5vcm1hbAABBSxPcGVyYXRpb25hbAABBSRNYW5kYXRvcnkAAQUCCAxZZXMAAQUITm8AAQUADBh3ZWlnaHQYFGNsYXNzOCBwYXlzX2ZlZTwCJDxJbnZhbGlkU3BlY05hbWUAAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQABBTxOb25aZXJvUmVmQ291bnQAAQUwQ2FsbEZpbHRlcmVkAAEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwABBUROb3RoaW5nQXV0aG9yaXplZAABBTBVbmF1dGhvcml6ZWQAAQUCGExPdmVybGFwcGluZ1VwZ3JhZGVzAAEFUFByb2hpYml0ZWRCeVBvbGthZG90AAEFGFRvb0JpZwABBWhWYWxpZGF0aW9uRGF0YU5vdEF2YWlsYWJsZQABBXRIb3N0Q29uZmlndXJhdGlvbk5vdEF2YWlsYWJsZQABBTBOb3RTY2hlZHVsZWQAAQUCMDhWZXN0aW5nQmFsYW5jZQABBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQVMSW5zdWZmaWNpZW50QmFsYW5jZQABBUhFeGlzdGVudGlhbERlcG9zaXQAAQU0RXhwZW5kYWJpbGl0eQABBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQABBSxEZWFkQWNjb3VudAABBTxUb29NYW55UmVzZXJ2ZXMAAQUwVG9vTWFueUhvbGRzAAEFOFRvb01hbnlGcmVlemVzAAEFTElzc3VhbmNlRGVhY3RpdmF0ZWQAAQUkRGVsdGFaZXJvAAEFAggcTm9Vc2FnZQABBRxOb3RaZXJvAAEFAmAoQmFsYW5jZUxvdwABBSROb0FjY291bnQAAQUwTm9QZXJtaXNzaW9uAAEFHFVua25vd24AAQUYRnJvemVuAAEFFEluVXNlAAEFKEJhZFdpdG5lc3MAAQU4TWluQmFsYW5jZVplcm8AAQVMVW5hdmFpbGFibGVDb25zdW1lcgABBSxCYWRNZXRhZGF0YQABBShVbmFwcHJvdmVkAAEFIFdvdWxkRGllAAEFNEFscmVhZHlFeGlzdHMAAQUkTm9EZXBvc2l0AAEFJFdvdWxkQnVybgABBSRMaXZlQXNzZXQAAQUwQXNzZXROb3RMaXZlAAEFPEluY29ycmVjdFN0YXR1cwABBSROb3RGcm96ZW4AAQU4Q2FsbGJhY2tGYWlsZWQAAQUoQmFkQXNzZXRJZAABBTxDb250YWluc0ZyZWV6ZXMAAQU0Q29udGFpbnNIb2xkcwABBTxUb29NYW55UmVzZXJ2ZXMAAQUCBDBUb29NYW55SG9sZHMAAQUCDEBVbmtub3duQXNzZXRLaW5kAAEFNEFscmVhZHlFeGlzdHMAAQUgT3ZlcmZsb3cAAQUCRERUb29NYW55Q2FuZGlkYXRlcwABBVxUb29GZXdFbGlnaWJsZUNvbGxhdG9ycwABBUBBbHJlYWR5Q2FuZGlkYXRlAAEFME5vdENhbmRpZGF0ZQABBVBUb29NYW55SW52dWxuZXJhYmxlcwABBUxBbHJlYWR5SW52dWxuZXJhYmxlAAEFPE5vdEludnVsbmVyYWJsZQABBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBVhWYWxpZGF0b3JOb3RSZWdpc3RlcmVkAAEFbEluc2VydFRvQ2FuZGlkYXRlTGlzdEZhaWxlZAABBXRSZW1vdmVGcm9tQ2FuZGlkYXRlTGlzdEZhaWxlZAABBTREZXBvc2l0VG9vTG93AAEFZFVwZGF0ZUNhbmRpZGF0ZUxpc3RGYWlsZWQAAQVASW5zdWZmaWNpZW50Qm9uZAABBVBUYXJnZXRJc05vdENhbmRpZGF0ZQABBUBJZGVudGljYWxEZXBvc2l0AAEFQEludmFsaWRVbnJlc2VydmUAAQUCFDBJbnZhbGlkUHJvb2YAAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQU0RHVwbGljYXRlZEtleQABBRhOb0tleXMAAQUkTm9BY2NvdW50AAEFAhQ4QmFkUXVldWVDb25maWcAAQVAQWxyZWFkeVN1c3BlbmRlZAABBThBbHJlYWR5UmVzdW1lZAABBXRUb29NYW55QWN0aXZlT3V0Ym91bmRDaGFubmVscwABBRhUb29CaWcAAQUCpCBPdmVyZmxvdwABBTRVbmltcGxlbWVudGVkAAEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgABBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAEFMExvY2F0aW9uRnVsbAABBVRMb2NhdGlvbk5vdEludmVydGlibGUAAQUkQmFkT3JpZ2luAAEFPEludmFsaWRMb2NhdGlvbgABBTRBc3NldE5vdEZvdW5kAAEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAABBTxOb3RXaXRoZHJhd2FibGUAAQVITG9jYXRpb25DYW5ub3RIb2xkAAEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQABBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAEFJFRyYW5zcG9ydAABBShVbnJvdXRhYmxlAAEFMFVua25vd25DbGFpbQABBThGYWlsZWRUb0RlY29kZQABBUBNYXhXZWlnaHRJbnZhbGlkAAEFOE5vdEhvbGRpbmdGZWVzAAEFMFRvb0V4cGVuc2l2ZQABBRBUcmFwAAEFQEV4cGVjdGF0aW9uRmFsc2UAAQU4UGFsbGV0Tm90Rm91bmQAAQUwTmFtZU1pc21hdGNoAAEFTFZlcnNpb25JbmNvbXBhdGlibGUAAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAAQUsRXhwb3J0RXJyb3IAAQU4UmVhbmNob3JGYWlsZWQAAQUYTm9EZWFsAAEFKEZlZXNOb3RNZXQAAQUkTG9ja0Vycm9yAAEFME5vUGVybWlzc2lvbgABBShVbmFuY2hvcmVkAAEFOE5vdERlcG9zaXRhYmxlAAEFNFRvb01hbnlBc3NldHMAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBUhXZWlnaHRMaW1pdFJlYWNoZWQAAQUcQmFycmllcgABBUxXZWlnaHROb3RDb21wdXRhYmxlAAEFREV4Y2VlZHNTdGFja0xpbWl0AAEFAnAsVW5yZWFjaGFibGUAAQUsU2VuZEZhaWx1cmUAAQUgRmlsdGVyZWQAAQVIVW53ZWlnaGFibGVNZXNzYWdlAAEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQABBRRFbXB0eQABBThDYW5ub3RSZWFuY2hvcgABBTRUb29NYW55QXNzZXRzAAEFNEludmFsaWRPcmlnaW4AAQUoQmFkVmVyc2lvbgABBSxCYWRMb2NhdGlvbgABBThOb1N1YnNjcmlwdGlvbgABBURBbHJlYWR5U3Vic2NyaWJlZAABBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AAEFKExvd0JhbGFuY2UAAQUwVG9vTWFueUxvY2tzAAEFTEFjY291bnROb3RTb3ZlcmVpZ24AAQUoRmVlc05vdE1ldAABBTBMb2NrTm90Rm91bmQAAQUUSW5Vc2UAAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUAAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAAEFPFRvb01hbnlSZXNlcnZlcwABBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUAAQVgVG9vTWFueUF1dGhvcml6ZWRBbGlhc2VzAAEFNEV4cGlyZXNJblBhc3QAAQU0QWxpYXNOb3RGb3VuZAABBYRMb2NhbEV4ZWN1dGlvbkluY29tcGxldGVXaXRoRXJyb3IAAAgUaW5kZXgEFGVycm9ybAIkLE5vdFJlYXBhYmxlAAEFGE5vUGFnZQABBSROb01lc3NhZ2UAAQVAQWxyZWFkeVByb2Nlc3NlZAABBRhRdWV1ZWQAAQVISW5zdWZmaWNpZW50V2VpZ2h0AAEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQABBSxRdWV1ZVBhdXNlZAABBUxSZWN1cnNpdmVEaXNhbGxvd2VkAAEFAgQwVG9vTWFueUNhbGxzAAEFAjhATWluaW11bVRocmVzaG9sZAABBTxBbHJlYWR5QXBwcm92ZWQAAQVETm9BcHByb3ZhbHNOZWVkZWQAAQVEVG9vRmV3U2lnbmF0b3JpZXMAAQVIVG9vTWFueVNpZ25hdG9yaWVzAAEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgABBUxTZW5kZXJJblNpZ25hdG9yaWVzAAEFIE5vdEZvdW5kAAEFIE5vdE93bmVyAAEFLE5vVGltZXBvaW50AAEFOFdyb25nVGltZXBvaW50AAEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQAAQU8TWF4V2VpZ2h0VG9vTG93AAEFNEFscmVhZHlTdG9yZWQAAQUCBCxSZXF1aXJlU3VkbwABBQIgHFRvb01hbnkAAQUgTm90Rm91bmQAAQUgTm90UHJveHkAAQUsVW5wcm94eWFibGUAAQUkRHVwbGljYXRlAAEFME5vUGVybWlzc2lvbgABBSxVbmFubm91bmNlZAABBSxOb1NlbGZQcm94eQABBQKkSFRvb01hbnlTdWJBY2NvdW50cwABBRxOb0FsaWFzAAEFIE5vdEZvdW5kAAEFIE5vdE5hbWVkAAEFKEVtcHR5SW5kZXgAAQUoRmVlQ2hhbmdlZAABBShOb0lkZW50aXR5AAEFPFN0aWNreUp1ZGdlbWVudAABBThKdWRnZW1lbnRHaXZlbgABBUBJbnZhbGlkSnVkZ2VtZW50AAEFMEludmFsaWRJbmRleAABBTRJbnZhbGlkVGFyZ2V0AAEFRFRvb01hbnlSZWdpc3RyYXJzAAEFOEFscmVhZHlDbGFpbWVkAAEFPEFscmVhZHlSZXBvcnRlZAABBRhOb3RTdWIAAQUgTm90T3duZWQAAQV0SnVkZ2VtZW50Rm9yRGlmZmVyZW50SWRlbnRpdHkAAQVYSnVkZ2VtZW50UGF5bWVudEZhaWxlZAABBTRJbnZhbGlkU3VmZml4AAEFUE5vdFVzZXJuYW1lQXV0aG9yaXR5AAEFME5vQWxsb2NhdGlvbgABBUBJbnZhbGlkU2lnbmF0dXJlAAEFRFJlcXVpcmVzU2lnbmF0dXJlAAEFPEludmFsaWRVc2VybmFtZQABBTRVc2VybmFtZVRha2VuAAEFKE5vVXNlcm5hbWUAAQVkTm90U3lzdGVtUHJvdmlkZWRVc2VybmFtZQABBShOb3RFeHBpcmVkAAEFIFRvb0Vhcmx5AAEFME5vdFVuYmluZGluZwABBUBBbHJlYWR5VW5iaW5kaW5nAAEFWEluc3VmZmljaWVudFByaXZpbGVnZXMAAQUoQmFkQ29udGV4dAABBUxVbmV4cGVjdGVkSnVkZ2VtZW50AAEFME5vdFN1cHBvcnRlZAABBRhCYW5uZWQAAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVESnVkZ2VtZW50TGlzdEZ1bGwAAQVsTGFzdFVzZXJuYW1lUmVwb3J0VG9vUmVjZW50AAEFYFVzZXJuYW1lSnVkZ2VtZW50T25nb2luZwABBQKIJE5vdFBlcnNvbgABBRROb0tleQABBThJbnZhbGlkQ29udGV4dAABBThJbnZhbGlkQWNjb3VudAABBTBBY2NvdW50SW5Vc2UAAQUwSW52YWxpZFByb29mAAEFQEludmFsaWRTaWduYXR1cmUAAQUkTm9NZW1iZXJzAAEFKEluY29tcGxldGUAAQUoU3RpbGxGcmVzaAABBThUb29NYW55TWVtYmVycwABBTxLZXlBbHJlYWR5SW5Vc2UAAQUsS2V5Tm90Rm91bmQAAQUwQ291bGROb3RQdXNoAAEFHFNhbWVLZXkAAQVUUGVyc29uYWxJZE5vdFJlc2VydmVkAAEFgFBlcnNvbmFsSWRSZXNlcnZhdGlvbkNhbm5vdFJlbmV3AAEFkFBlcnNvbmFsSWROb3RSZXNlcnZlZE9yTm90UmVjb2duaXplZAABBSxJbnZhbGlkUmluZwABBUhTdXNwZW5zaW9uc1BlbmRpbmcAAQVcUmluZ0Fib3ZlTWVyZ2VUaHJlc2hvbGQAAQVISW52YWxpZFN1c3BlbnNpb25zAAEFRE5vTXV0YXRpb25TZXNzaW9uAAEFcENvdWxkTm90U3RhcnRNdXRhdGlvblNlc3Npb24AAQVsU3VzcGVuc2lvblNlc3Npb25JblByb2dyZXNzAAEFOFRpbWVPdXRPZlJhbmdlAAEFWEFsaWFzQWNjb3VudEFscmVhZHlTZXQAAQUwTm90U3VzcGVuZGVkAAEFJFN1c3BlbmRlZAABBUxJbnZhbGlkS2V5TWlncmF0aW9uAAEFTEtleUFscmVhZHlTdXNwZW5kZWQAAQVUSW52YWxpZE9uYm9hcmRpbmdTaXplAAEFQEludmFsaWRNZW1iZXJLZXkAAQV0UGVvcGxlQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQUCUChOb1N1Y2hDYXNlAAEFKE5vU3VjaFZvdGUAAQUcTm90T3BlbgABBRxOb3RSaXBlAAEFHE5vdERvbmUAAQUoQ29kZWNFcnJvcgABBTREaXNwYXRjaEVycm9yAAEFGFJlY2VudAABBSBOb0NyZWRpdAABBSBOb1Jld2FyZAABBSBOb1BvaW50cwABBTRUb29NYW55Q2xhaW1zAAEFIE5vUGF5b3V0AAEFSEFyaXRobWV0aWNPdmVyZmxvdwABBUBUb29NYW55U2NoZWR1bGVzAAEFKE5vU2NoZWR1bGUAAQUkTm9QZW5hbHR5AAEFFEVhcmx5AAEFMFVuZGVyUGVuYWx0eQABBVhDYXNlRXhwaXJhdGlvbkRpc2FibGVkAAEFAqAoSW5Qcm9ncmVzcwABBShOb1JlZmVycmFsAAEFKEJhZENvbnRleHQAAQVMVW5leHBlY3RlZEp1ZGdlbWVudAABBRhOb0FyZ3MAAQUoTm90QXBwbGllZAABBSxOb3RTZWxlY3RlZAABBSROb3RQcm92ZW4AAQU4QWxyZWFkeVN0YXJ0ZWQAAQUoT3V0T2ZSYW5nZQABBTBBbHJlYWR5VGFrZW4AAQU8Tm9Nb3JlUmVmZXJyYWxzAAEFIFRvb0Vhcmx5AAEFNERlc2lnbkludmFsaWQAAQUsRGVzaWduVGFrZW4AAQUkQmFkUGFyZW50AAEFJEJhZEZhbWlseQABBSxXcm9uZ0ZhbWlseQABBSxJbmRleFRvb0JpZwABBRBCdXN5AAEFGEJhbm5lZAABBShJbXByb2JhYmxlAAEFKElkUmVzZXJ2ZWQAAQUYSWRVc2VkAAEFNEludmFsaWRUaWNrZXQAAQUgTm9UaWNrZXQAAQU0Tm90QXV0aG9yaXplZAABBSROb3RQZXJzb24AAQVEUmVmZXJyZWRDYW5kaWRhdGUAAQVQTm90UmVmZXJyZWRDYW5kaWRhdGUAAQVITm9SZXdhcmRUb1JlZ2lzdGVyAAEFQFJld2FyZFRvUmVnaXN0ZXIAAQUkTm9JbnZpdGVyAAEFQEludmFsaWRTaWduYXR1cmUAAQUkTm9JbnZpdGVzAAEFOEFscmVhZHlJbnZpdGVkAAEFKE5vUmVmZXJyZXIAAQUwTm90UG9pUGVyc29uAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFaEludmFsaWRSZWltYnVyc2VtZW50VmFsdWVzAAEFAmwsR2FtZU9uZ29pbmcAAQU4Tm9SZWdpc3RyYXRpb24AAQVET3V0ZGF0ZWRHYW1lU2V0dXAAAQVASW52YWxpZEdhbWVTZXR1cAABBTRJbnZhbGlkUmVwb3J0AAEFGE5vR2FtZQABBSxOb1JlcG9ydGluZwABBTROb3RSZWdpc3RlcmVkAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFRFJlcG9ydEFscmVhZHlTZW50AAEFFEVhcmx5AAEFRE5vdEtpY2thYmxlUGxheWVyAAEFQE5vQXJjaGl2ZWRQbGF5ZXIAAQUgTm9UaWNrZXQAAQUkTm9JbnZpdGVzAAEFOEFscmVhZHlJbnZpdGVkAAEFQE5vdEFjY291bnRQbGF5ZXIAAQVoVXNlSW52aXRlQnV0QWxyZWFkeVBsYXlpbmcAAQVQVG9vTWFueUdhbWVTY2hlZHVsZXMAAQVMTm9TdWNoR2FtZVNjaGVkdWxlZAABBYBJbnZhbGlkU3RhdGVtZW50QWNjb3VudFNpZ25hdHVyZQABBXBTdGF0ZW1lbnRBY2NvdW50QWxyZWFkeUluVXNlAAEFZEludGVybmFsRXJyb3JJbnZhbGlkU3RhdGUAAQVASW52YWxpZEdhbWVTdGF0ZQABBSBOb1BsYXllcgABBZBDYW5ub3RPZmZib2FyZFdoaWxlUmVnaXN0ZXJlZEZvckdhbWUAAQUwSW52YWxpZFN0YXRlAAEFAlQkTm90UGVyc29uAAEFXEhhc05vdFJlYWNoZWRQZXJzb25ob29kAAEFIE5vUmV3YXJkAAEFHE5vU2NvcmUAAQUoTm9TY2hlZHVsZQABBUBUb29NYW55U2NoZWR1bGVzAAEFKFJlY29nbml6ZWQAAQU8Q2FzaE91dENvb2xkb3duAAEFYFJvdW5kT25Hb2luZ09yTm9TY2hlZHVsZQABBRxOb1JvdW5kAAEFbEJhZE9yaWdpbk5vdFBlcnNvbk5vdFNpZ25lZAABBcBCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQAAQWcQmFkT3JpZ2luTm90U2lnbmVkTm90QWNjb3VudFBhcnRpY2lwYW50AAEFUEFscmVhZHlQYXJ0aWNpcGF0aW5nAAEFREtleU11c3RCZVByb3ZpZGVkAAEFUEtleU11c3ROb3RCZVByb3ZpZGVkAAEFUEhhc1JlYWNoZWRQZXJzb25ob29kAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFOFdpbmRvd1Rvb0xhcmdlAAEFVEFsbG93ZWRNaXNzZXNUb29MYXJnZQABBURTY2hlZHVsZU5vdFNvcnRlZAABBQIQJE5vdFBlcnNvbgABBTBOb3RTdXNwZW5kZWQAAQUsTm90UmVzZXJ2ZWQAAQU0VG9vTWFueVBlb3BsZQABBQIQWE5vQXR0ZXN0YXRpb25BbGxvd2FuY2UAAQVsSW52YWxpZEF0dGVzdGF0aW9uU2lnbmF0dXJlAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFREFscmVhZHlSZWdpc3RlcmVkAAEFAlA8SW52YWxpZFVzZXJuYW1lAAEFNFVzZXJuYW1lVGFrZW4AAQVEQWxyZWFkeVJlZ2lzdGVyZWQAAQVcSW52YWxpZFByb29mT2ZPd25lcnNoaXAAAQU0Tm90UmVnaXN0ZXJlZAABBTROb3RGdWxsUGVyc29uAAEFNFRvdWNoTm90UmVhZHkAAQU0Tm9SZXNlcnZhdGlvbgABBVBOb3RSZXNlcnZhdGlvbkhvbGRlcgABBWBVc2VybmFtZVJlc2VydmF0aW9uVGFrZW4AAQVAUmVzZXJ2YXRpb25GcmVzaAABBUBOb0xpbmtlZElkZW50aXR5AAEFNEFscmVhZHlMaW5rZWQAAQUsSW52YWxpZFNsb3QAAQVoQWNjb3VudEFscmVhZHlIYXNBbGxvd2FuY2UAAQVQUGVyc29uQXV0aE5vdEV4cGlyZWQAAQU4QWxyZWFkeURlbW90ZWQAAQUkUXVldWVGdWxsAAEFKE5vdEluUXVldWUAAQVUQWxyZWFkeUhhc1Jlc2VydmF0aW9uAAEFAgw0Q2h1bmtOb3RGb3VuZAABBTRJbnZhbGlkQ2h1bmtzAAEFREludmFsaWRDaHVua1JhbmdlAAEFAmwkTm90TWVtYmVyAAEFGE5vUm9vdAABBTBJbnZhbGlkUHJvb2YAAQUoSW5jb21wbGV0ZQABBShTdGlsbEZyZXNoAAEFOFRvb01hbnlNZW1iZXJzAAEFPEtleUFscmVhZHlJblVzZQABBSxLZXlOb3RGb3VuZAABBTBDb3VsZE5vdFB1c2gAAQUsSW52YWxpZFJpbmcAAQVIU3VzcGVuc2lvbnNQZW5kaW5nAAEFXFJpbmdBYm92ZU1lcmdlVGhyZXNob2xkAAEFSEludmFsaWRTdXNwZW5zaW9ucwABBUBOb1JlbW92YWxTZXNzaW9uAAEFbENvdWxkTm90U3RhcnRSZW1vdmFsU2Vzc2lvbgABBWBSZW1vdmFsU2Vzc2lvbkluUHJvZ3Jlc3MAAQVMS2V5QWxyZWFkeVN1c3BlbmRlZAABBVRJbnZhbGlkT25ib2FyZGluZ1NpemUAAQVASW52YWxpZE1lbWJlcktleQABBUhDb2xsZWN0aW9uTm90Rm91bmQAAQVcQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAAQVIVG9vTWFueUNvbGxlY3Rpb25zAAEFaEludmFsaWRSaW5nU2l6ZUZvckZsZXhpYmxlAAEFTEludmFsaWRSaW5nRXhwb25lbnQAAQVMUHJlbWF0dXJlT25ib2FyZGluZwABBWxDb2xsZWN0aW9uTWFya2VkRm9yRGVsZXRpb24AAQVITm90Q29sbGVjdGlvbk93bmVyAAEFAmRQTWVtYmVyS2V5QWxyZWFkeVVzZWQAAQVASW52YWxpZE1lbWJlcktleQABBTRJbnRlcm5hbEVycm9yAAEFXFJlY3ljbGVyQWxyZWFkeVVubG9hZGVkAAEFUEludmFsaWRDb25zb2xpZGF0aW9uAAEFTENvbnNvbGlkYXRpb25Ub29CaWcAAQU8Q29pblZhbHVlVG9vQmlnAAEFRENvaW5WYWx1ZVRvb1NtYWxsAAEFWENvaW5WYWx1ZUlzTGVzc1RoYW5GZWUAAQVMQ29pblZhbHVlT3V0T2ZCb3VuZAABBURJbnZhbGlkQWxpYXNQcm9vZgABBUxOb1VubG9hZGluZ1JlY3ljbGVyAAEFVFByb29mQW5kQWxpYXNNaXNtYXRjaAABBThOb3RoaW5nVG9CdWlsZAABBTBUb29NYW55UmluZ3MAAQVUQWRkcmVzc0FscmVhZHlIYXNDb2luAAEFXEludmFsaWRQcm9vZk9mT3duZXJzaGlwAAEFLEVtcHR5SW5wdXRzAAEFQFJlY3ljbGVyTWlzbWF0Y2gAAQVgSW5zdWZmaWNpZW50VW5sb2FkRm9yRmVlAAEFREFsaWFzTm90UHJlbWFya2VkAAEFXEludmFsaWRSZWN5Y2xlclJldmlzaW9uAAEFMEludmFsaWRTcGxpdAABBURGcmVzaENvaW5SZXF1aXJlZAABBWhDYW5ub3RDb252ZXJ0TmF0aXZlVG9Bc3NldAABBQIkNE5vQWN0aXZlRXZlbnQAAQUoTm90QVBlcnNvbgABBVhBbGlhc0FscmVhZHlSZWdpc3RlcmVkAAEFcEludmFsaWRFdmVudFJlZ2lzdHJhdGlvblRpbWUAAQVUUGFydGljaXBhbnRJZE92ZXJmbG93AAEFWE5vUHJpemVUb0NsYWltRm9yRXZlbnQAAQUwTm9FdmVudEZvdW5kAAEFMFNjaGVkdWxlRnVsbAABBYhQcml6ZU11c3RCZU1vcmVPckVxdWFsVG9NaW5CYWxhbmNlAAEFAgQcT25nb2luZwABBQKsGFN5c3RlbQFEPFBhcmFjaGFpblN5c3RlbQFIJFRpbWVzdGFtcAABBTRQYXJhY2hhaW5JbmZvAAEFNFdlaWdodFJlY2xhaW0AAQUgQmFsYW5jZXMBTEhUcmFuc2FjdGlvblBheW1lbnQAAQVIU2tpcEZlZWxlc3NQYXltZW50AAEFRE9yaWdpblJlc3RyaWN0aW9uAVAYQXNzZXRzAVQwQXNzZXRzSG9sZGVyAVgkQXNzZXRSYXRlAVw4QXNzZXRUeFBheW1lbnQAAQUoQXV0aG9yc2hpcAABBURDb2xsYXRvclNlbGVjdGlvbgFgHFNlc3Npb24BZBBBdXJhAAEFHEF1cmFFeHQAAQUkWGNtcFF1ZXVlAWgsUG9sa2Fkb3RYY20BcChDdW11bHVzWGNtAAEFME1lc3NhZ2VRdWV1ZQF0HFV0aWxpdHkBeCBNdWx0aXNpZwF8EFN1ZG8BgDxWZXJpZnlTaWduYXR1cmUAAQUUUHJveHkBhCBJZGVudGl0eQGIGFBlb3BsZQGMHE1vYlJ1bGUBkChQcm9vZk9mSW5rAZQQR2FtZQGYFFNjb3JlAZwgRHVtbXlEaW0BoChQZW9wbGVMaXRlAaQkUmVzb3VyY2VzAag0Q2h1bmtzTWFuYWdlcgGsHE1lbWJlcnMBsBxDb2luYWdlAbRUU3RvcmFnZUluaXRpYWxpemF0aW9uAAEFZFN0b3JhZ2VJbml0aWFsaXphdGlvbkxpdGUAAQUcQWlyZHJvcAG4UE11bHRpQmxvY2tNaWdyYXRpb25zAbwCKEBGdW5kc1VuYXZhaWxhYmxlAAEFME9ubHlQcm92aWRlcgABBTBCZWxvd01pbmltdW0AAQUwQ2Fubm90Q3JlYXRlAAEFMFVua25vd25Bc3NldAABBRhGcm96ZW4AAQUsVW5zdXBwb3J0ZWQAAQVAQ2Fubm90Q3JlYXRlSG9sZAABBTROb3RFeHBlbmRhYmxlAAEFHEJsb2NrZWQAAQUCDCRVbmRlcmZsb3cAAQUgT3ZlcmZsb3cAAQU4RGl2aXNpb25CeVplcm8AAQUCCDBMaW1pdFJlYWNoZWQAAQUcTm9MYXllcgABBQI4QEludmFsaWRTdGF0ZVJvb3QAAQVISW5jb21wbGV0ZURhdGFiYXNlAAEFUFZhbHVlQXRJbmNvbXBsZXRlS2V5AAEFMERlY29kZXJFcnJvcgABBSxJbnZhbGlkSGFzaAABBTBEdXBsaWNhdGVLZXkAAQU4RXh0cmFuZW91c05vZGUAAQU8RXh0cmFuZW91c1ZhbHVlAAEFXEV4dHJhbmVvdXNIYXNoUmVmZXJlbmNlAAEFVEludmFsaWRDaGlsZFJlZmVyZW5jZQABBTRWYWx1ZU1pc21hdGNoAAEFPEluY29tcGxldGVQcm9vZgABBTBSb290TWlzbWF0Y2gAAQUsRGVjb2RlRXJyb3IAAQUCPBRPdGhlcgABBTBDYW5ub3RMb29rdXAAAQUkQmFkT3JpZ2luAAEFGE1vZHVsZQHARENvbnN1bWVyUmVtYWluaW5nAAEFLE5vUHJvdmlkZXJzAAEFQFRvb01hbnlDb25zdW1lcnMAAQUUVG9rZW4BxChBcml0aG1ldGljAcg0VHJhbnNhY3Rpb25hbAHMJEV4aGF1c3RlZAABBShDb3JydXB0aW9uAAEFLFVuYXZhaWxhYmxlAAEFOFJvb3ROb3RBbGxvd2VkAAEFEFRyaWUB0AIgQEV4dHJpbnNpY1N1Y2Nlc3MAAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAAAIOGRpc3BhdGNoX2Vycm9y1DRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAABBShOZXdBY2NvdW50AAAEHGFjY291bnQANEtpbGxlZEFjY291bnQAAAQcYWNjb3VudAAgUmVtYXJrZWQAAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAAACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UgFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlAAAIJGNvZGVfaGFzaCAUZXJyb3LUBiACGGBWYWxpZGF0aW9uRnVuY3Rpb25TdG9yZWQAAQVkVmFsaWRhdGlvbkZ1bmN0aW9uQXBwbGllZAAABFRyZWxheV9jaGFpbl9ibG9ja19udW0EbFZhbGlkYXRpb25GdW5jdGlvbkRpc2NhcmRlZAABBWBEb3dud2FyZE1lc3NhZ2VzUmVjZWl2ZWQAAAQUY291bnQEZERvd253YXJkTWVzc2FnZXNQcm9jZXNzZWQAAAgsd2VpZ2h0X3VzZWQYIGRtcV9oZWFkIERVcHdhcmRNZXNzYWdlU2VudAAABDBtZXNzYWdlX2hhc2jcAggQRnJlZQABBSBSZXNlcnZlZAABBQIEEEtleXMAAQUCBDhBdXRob3JpemVBbGlhcwABBQIIGFBheW91dAABBRhDcmVkaXQAAQUCBChQcm9vZk9mSW5rAAEFAgQgUGxheUdhbWUAAQUCBBxXcmFwcGVkAAEFAgQcQWlyZHJvcAABBQIgHFNlc3Npb24B6CxQb2xrYWRvdFhjbQHsHE1vYlJ1bGUB8ChQcm9vZk9mSW5rAfQQR2FtZQH4FFNjb3JlAfAcQ29pbmFnZQH8HEFpcmRyb3ABAQECCDhCYWxhbmNlVXBkYXRlZAABBVRGYWlsZWRUb011dGF0ZUFjY291bnQAAQUCeBxFbmRvd2VkAAAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QAAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgAADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AAAIDHdobwAQZnJlZQggUmVzZXJ2ZWQAAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQAAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAAAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXPkHERlcG9zaXQAAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AAAIDHdobwAYYW1vdW50CBxTbGFzaGVkAAAIDHdobwAYYW1vdW50CBhNaW50ZWQAAAgMd2hvABhhbW91bnQIME1pbnRlZENyZWRpdAAABBhhbW91bnQIGEJ1cm5lZAAACAx3aG8AGGFtb3VudAgoQnVybmVkRGVidAAABBhhbW91bnQIJFN1c3BlbmRlZAAACAx3aG8AGGFtb3VudAggUmVzdG9yZWQAAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAAAEDHdobwAYSXNzdWVkAAAEGGFtb3VudAgkUmVzY2luZGVkAAAEGGFtb3VudAgYTG9ja2VkAAAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAAACAx3aG8AGGFtb3VudAgYRnJvemVuAAAIDHdobwAYYW1vdW50CBhUaGF3ZWQAAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQAAAgMb2xkCAxuZXcIEEhlbGQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIKEJ1cm5lZEhlbGQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIOFRyYW5zZmVyT25Ib2xkAAAQGHJlYXNvbgUBGHNvdXJjZQAQZGVzdAAYYW1vdW50CDxUcmFuc2ZlckFuZEhvbGQAABAYcmVhc29uBQEYc291cmNlABBkZXN0ACx0cmFuc2ZlcnJlZAggUmVsZWFzZWQAAAwYcmVhc29uBQEMd2hvABhhbW91bnQIKFVuZXhwZWN0ZWQBCQECBEhUcmFuc2FjdGlvbkZlZVBhaWQAAAwMd2hvAChhY3R1YWxfZmVlCAx0aXAIAhAQUm9vdAABBRhTaWduZWQBABBOb25lAAEFKEF1dGhvcml6ZWQAAQUCICRCeUdlbmVzaXMBIBhCeUZvcmsAAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAABBRhLdXNhbWEAAQUgRXRoZXJldW0AAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAAEFLEJpdGNvaW5DYXNoAAEFQFBvbGthZG90QnVsbGV0aW4AAQUGGQEFAVACKBBVbml0AAEFHE1vbmlrZXIBKBRJbmRleAEEJEV4ZWN1dGl2ZQABBSRUZWNobmljYWwAAQUsTGVnaXNsYXRpdmUAAQUgSnVkaWNpYWwAAQUcRGVmZW5zZQABBThBZG1pbmlzdHJhdGlvbgABBSBUcmVhc3VyeQABBQIUFFZvaWNlAAEFHE1lbWJlcnMAAAQUY291bnQEIEZyYWN0aW9uAAAIDG5vbQQUZGVub20EREF0TGVhc3RQcm9wb3J0aW9uAAAIDG5vbQQUZGVub20ESE1vcmVUaGFuUHJvcG9ydGlvbgAACAxub20EFGRlbm9tBAIoJFBhcmFjaGFpbgEELEFjY291bnRJZDMyAAAIHG5ldHdvcmsdAQhpZCA4QWNjb3VudEluZGV4NjQAAAgcbmV0d29yax0BFGluZGV4CDBBY2NvdW50S2V5MjAAAAgcbmV0d29yax0BDGtleSEBOFBhbGxldEluc3RhbmNlAQQwR2VuZXJhbEluZGV4AQgoR2VuZXJhbEtleQAACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAABBSRQbHVyYWxpdHkAAAgIaWQlARBwYXJ0KQE8R2xvYmFsQ29uc2Vuc3VzARkBBC0BAQgELQEBDAQtAQEQBC0BARQELQEBGAQtAQEcBC0BASACJBBIZXJlAAEFCFgxAS0BCFgyATEBCFgzATUBCFg0ATkBCFg1AT0BCFg2AUEBCFg3AUUBCFg4AUkBAAgccGFyZW50cwQgaW50ZXJpb3JNAQIIDFhjbQFRASBSZXNwb25zZQFRAQIIFFJlbGF5AAEFQFNpYmxpbmdQYXJhY2hhaW4BBAAIFGFsaWFzIBxjb250ZXh0IAAMIHJldmlzaW9uBBByaW5nBAhjYV0BAghAUGVyc29uYWxJZGVudGl0eQEINFBlcnNvbmFsQWxpYXMBYQECDFhBdXRob3JpemVkQXBwbHlXaXRoU2lnAQBEUmVmZXJyZWRDYW5kaWRhdGUBAEBJbnZpdGVkQ2FuZGlkYXRlAQACBBxJbnZpdGVkAQACBEhBY2NvdW50UGFydGljaXBhbnQBAAIEKExpdGVQZXJzb24BAAIELE1lbWJlckFsaWFzAAMIIGEBAAgUdmFsdWUEDGFnZQQFAVEMBIEBAAIIHFByZXBhaWQAAQUoRnJvbU91dHB1dAAACEhmZWVfcmVjeWNsZXJfdmFsdWUESGZlZV9yZWN5Y2xlcl9pbmRleAQCCBBDb2luAAAIHGNvaW5faWQAEGNvaW59ASxVbmxvYWRUb2tlbgAADDBhbGlhc19wcm9vZnOFAShwcm92ZW5fbXNnIAxmZWWJAQIoGHN5c3RlbQEVASxQb2xrYWRvdFhjbQFVAShDdW11bHVzWGNtAVkBGFBlb3BsZQFlAShQcm9vZk9mSW5rAWkBEEdhbWUBbQEUU2NvcmUBcQEoUGVvcGxlTGl0ZQF1ARxNZW1iZXJzAXkBHENvaW5hZ2UBjQECBChGZWVTa2lwcGVkAAAEGG9yaWdpbpEBAhg0UGVyc29uYWxBbGlhcwEgQFBlcnNvbmFsSWRlbnRpdHkBCERSZWZlcnJlZENhbmRpZGF0ZQEASEFjY291bnRQYXJ0aWNpcGFudAEAQEludml0ZWRDYW5kaWRhdGUBAChMaXRlUGVyc29uAQACBDBVc2FnZUNsZWFuZWQAAAQYZW50aXR5mQEACBxyZXNlcnZlUQEwdGVsZXBvcnRhYmxlFAShAQACcBxDcmVhdGVkAAAMIGFzc2V0X2lkUQEcY3JlYXRvcgAUb3duZXIAGElzc3VlZAAADCBhc3NldF9pZFEBFG93bmVyABhhbW91bnQILFRyYW5zZmVycmVkAAAQIGFzc2V0X2lkUQEQZnJvbQAIdG8AGGFtb3VudAgYQnVybmVkAAAMIGFzc2V0X2lkUQEUb3duZXIAHGJhbGFuY2UILFRlYW1DaGFuZ2VkAAAQIGFzc2V0X2lkUQEYaXNzdWVyABRhZG1pbgAcZnJlZXplcgAwT3duZXJDaGFuZ2VkAAAIIGFzc2V0X2lkUQEUb3duZXIAGEZyb3plbgAACCBhc3NldF9pZFEBDHdobwAYVGhhd2VkAAAIIGFzc2V0X2lkUQEMd2hvACxBc3NldEZyb3plbgAABCBhc3NldF9pZFEBLEFzc2V0VGhhd2VkAAAEIGFzc2V0X2lkUQFEQWNjb3VudHNEZXN0cm95ZWQAAAwgYXNzZXRfaWRRAUhhY2NvdW50c19kZXN0cm95ZWQESGFjY291bnRzX3JlbWFpbmluZwRIQXBwcm92YWxzRGVzdHJveWVkAAAMIGFzc2V0X2lkUQFMYXBwcm92YWxzX2Rlc3Ryb3llZARMYXBwcm92YWxzX3JlbWFpbmluZwRIRGVzdHJ1Y3Rpb25TdGFydGVkAAAEIGFzc2V0X2lkUQEkRGVzdHJveWVkAAAEIGFzc2V0X2lkUQEwRm9yY2VDcmVhdGVkAAAIIGFzc2V0X2lkUQEUb3duZXIALE1ldGFkYXRhU2V0AAAUIGFzc2V0X2lkUQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQkaXNfZnJvemVuFDxNZXRhZGF0YUNsZWFyZWQAAAQgYXNzZXRfaWRRAUBBcHByb3ZlZFRyYW5zZmVyAAAQIGFzc2V0X2lkUQEYc291cmNlACBkZWxlZ2F0ZQAYYW1vdW50CERBcHByb3ZhbENhbmNlbGxlZAAADCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQBMVHJhbnNmZXJyZWRBcHByb3ZlZAAAFCBhc3NldF9pZFEBFG93bmVyACBkZWxlZ2F0ZQAsZGVzdGluYXRpb24AGGFtb3VudAhIQXNzZXRTdGF0dXNDaGFuZ2VkAAAEIGFzc2V0X2lkUQFYQXNzZXRNaW5CYWxhbmNlQ2hhbmdlZAAACCBhc3NldF9pZFEBPG5ld19taW5fYmFsYW5jZQgcVG91Y2hlZAAADCBhc3NldF9pZFEBDHdobwAkZGVwb3NpdG9yABxCbG9ja2VkAAAIIGFzc2V0X2lkUQEMd2hvACREZXBvc2l0ZWQAAAwgYXNzZXRfaWRRAQx3aG8AGGFtb3VudAgkV2l0aGRyYXduAAAMIGFzc2V0X2lkUQEMd2hvABhhbW91bnQIPFJlc2VydmVzVXBkYXRlZAAACCBhc3NldF9pZFEBIHJlc2VydmVzpQE8UmVzZXJ2ZXNSZW1vdmVkAAAEIGFzc2V0X2lkUQECDBBIZWxkAAAQDHdobwAgYXNzZXRfaWRRARhyZWFzb24FARhhbW91bnQIIFJlbGVhc2VkAAAQDHdobwAgYXNzZXRfaWRRARhyZWFzb24FARhhbW91bnQIGEJ1cm5lZAAAEAx3aG8AIGFzc2V0X2lkUQEYcmVhc29uBQEYYW1vdW50CAIMQEFzc2V0UmF0ZUNyZWF0ZWQAAAgoYXNzZXRfa2luZFEBEHJhdGUIQEFzc2V0UmF0ZVJlbW92ZWQAAAQoYXNzZXRfa2luZFEBQEFzc2V0UmF0ZVVwZGF0ZWQAAAwoYXNzZXRfa2luZFEBDG9sZAgMbmV3CAZRAQIEOEFzc2V0VHhGZWVQYWlkAAAQDHdobwAoYWN0dWFsX2ZlZQgMdGlwCCBhc3NldF9pZLUBBAAAAihATmV3SW52dWxuZXJhYmxlcwAABDRpbnZ1bG5lcmFibGVzvQFESW52dWxuZXJhYmxlQWRkZWQAAAQoYWNjb3VudF9pZABMSW52dWxuZXJhYmxlUmVtb3ZlZAAABChhY2NvdW50X2lkAFBOZXdEZXNpcmVkQ2FuZGlkYXRlcwAABEhkZXNpcmVkX2NhbmRpZGF0ZXMEQE5ld0NhbmRpZGFjeUJvbmQAAAQsYm9uZF9hbW91bnQIOENhbmRpZGF0ZUFkZGVkAAAIKGFjY291bnRfaWQAHGRlcG9zaXQIUENhbmRpZGF0ZUJvbmRVcGRhdGVkAAAIKGFjY291bnRfaWQAHGRlcG9zaXQIQENhbmRpZGF0ZVJlbW92ZWQAAAQoYWNjb3VudF9pZABEQ2FuZGlkYXRlUmVwbGFjZWQAAAwMb2xkAAxuZXcAHGRlcG9zaXQIaEludmFsaWRJbnZ1bG5lcmFibGVTa2lwcGVkAAAEKGFjY291bnRfaWQAAhAoTmV3U2Vzc2lvbgAABDRzZXNzaW9uX2luZGV4BCROZXdRdWV1ZWQAAQVEVmFsaWRhdG9yRGlzYWJsZWQAAAQkdmFsaWRhdG9yAEhWYWxpZGF0b3JSZWVuYWJsZWQAAAQkdmFsaWRhdG9yAAIEPFhjbXBNZXNzYWdlU2VudAAABDBtZXNzYWdlX2hhc2ggAqQgT3ZlcmZsb3cAAQU0VW5pbXBsZW1lbnRlZAABBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgABBTBMb2NhdGlvbkZ1bGwAAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAEFJEJhZE9yaWdpbgABBTxJbnZhbGlkTG9jYXRpb24AAQU0QXNzZXROb3RGb3VuZAABBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQAAQU8Tm90V2l0aGRyYXdhYmxlAAEFSExvY2F0aW9uQ2Fubm90SG9sZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBSRUcmFuc3BvcnQAAQUoVW5yb3V0YWJsZQABBTBVbmtub3duQ2xhaW0AAQU4RmFpbGVkVG9EZWNvZGUAAQVATWF4V2VpZ2h0SW52YWxpZAABBThOb3RIb2xkaW5nRmVlcwABBTBUb29FeHBlbnNpdmUAAQUQVHJhcAEIQEV4cGVjdGF0aW9uRmFsc2UAAQU4UGFsbGV0Tm90Rm91bmQAAQUwTmFtZU1pc21hdGNoAAEFTFZlcnNpb25JbmNvbXBhdGlibGUAAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAAQUsRXhwb3J0RXJyb3IAAQU4UmVhbmNob3JGYWlsZWQAAQUYTm9EZWFsAAEFKEZlZXNOb3RNZXQAAQUkTG9ja0Vycm9yAAEFME5vUGVybWlzc2lvbgABBShVbmFuY2hvcmVkAAEFOE5vdERlcG9zaXRhYmxlAAEFNFRvb01hbnlBc3NldHMAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBUhXZWlnaHRMaW1pdFJlYWNoZWQBGBxCYXJyaWVyAAEFTFdlaWdodE5vdENvbXB1dGFibGUAAQVERXhjZWVkc1N0YWNrTGltaXQAAQUACBRpbmRleAQUZXJyb3LNAQIMIENvbXBsZXRlAAAEEHVzZWQYKEluY29tcGxldGUAAAgQdXNlZBgUZXJyb3LRARRFcnJvcgHRAQUBIAUBQAIYJFVuZGVmaW5lZAABBRRJbmRleAEIGEFycmF5NAEoGEFycmF5OAHZARxBcnJheTE2Ad0BHEFycmF5MzIBIAIIIEZ1bmdpYmxlAQgsTm9uRnVuZ2libGUB4QEACAhpZFEBDGZ1buUBBOkBAAMIBM0BBvEBABgUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJBRtYWpvcgQUbWlub3IEFHBhdGNoBAT5AQACDBxTdWNjZXNzAAEFFEVycm9yASQ4VHJ1bmNhdGVkRXJyb3IBJAIYEE51bGwAAQUYQXNzZXRzAe0BPEV4ZWN1dGlvblJlc3VsdAH1ARxWZXJzaW9uAQQsUGFsbGV0c0luZm8B/QE4RGlzcGF0Y2hSZXN1bHQBAQICEBhOYXRpdmUAAQVAU292ZXJlaWduQWNjb3VudAABBSRTdXBlcnVzZXIAAQUMWGNtAAEFBhgADCxkZXN0aW5hdGlvblEBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIIIEZ1bmdpYmxlAAEFLE5vbkZ1bmdpYmxlAAEFAhAMQWxsAAEFFEFsbE9mAAAICGlkUQEMZnVuFQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZFEBDGZ1bhUCFGNvdW50BAIIIERlZmluaXRlAe0BEFdpbGQBGQICCCRVbmxpbWl0ZWQAAQUcTGltaXRlZAEYAgwgVGVsZXBvcnQBHQI4UmVzZXJ2ZURlcG9zaXQBHQI8UmVzZXJ2ZVdpdGhkcmF3AR0CBiUCBCUCAAZNAQIEMEFzc2V0Q2xhaW1lcgAABCBsb2NhdGlvblEBBDUCAALQNFdpdGhkcmF3QXNzZXQB7QFUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkAe0BWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQB7QE0UXVlcnlSZXNwb25zZQAAECBxdWVyeV9pZAggcmVzcG9uc2UFAihtYXhfd2VpZ2h0GBxxdWVyaWVytQE0VHJhbnNmZXJBc3NldAAACBhhc3NldHPtASxiZW5lZmljaWFyeVEBUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0AAAMGGFzc2V0c+0BEGRlc3RRAQx4Y21BAiBUcmFuc2FjdAAADCxvcmlnaW5fa2luZAkCTGZhbGxiYWNrX21heF93ZWlnaHQNAhBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BTQEsUmVwb3J0RXJyb3IBEQIwRGVwb3NpdEFzc2V0AAAIGGFzc2V0cx0CLGJlbmVmaWNpYXJ5UQFMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHMdAhBkZXN0UQEMeGNtQQI0RXhjaGFuZ2VBc3NldAAADBBnaXZlHQIQd2FudO0BHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0cx0CHHJlc2VydmVRAQx4Y21BAkBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0cx0CEGRlc3RRAQx4Y21BAjRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8RAhhhc3NldHMdAjBCdXlFeGVjdXRpb24AAAgQZmVlc+kBMHdlaWdodF9saW1pdCECNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyAUECLFNldEFwcGVuZGl4AUECKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHPtARh0aWNrZXRRARBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAHtASxFeHBlY3RBc3NldAHtATBFeHBlY3RPcmlnaW4BtQEsRXhwZWN0RXJyb3IB9QFQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8RAjBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwERAkxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgEtATRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmsZASxkZXN0aW5hdGlvbk0BDHhjbUECJExvY2tBc3NldAAACBRhc3NldOkBIHVubG9ja2VyUQEsVW5sb2NrQXNzZXQAAAgUYXNzZXTpARh0YXJnZXRRAThOb3RlVW5sb2NrYWJsZQAACBRhc3NldOkBFG93bmVyUQE0UmVxdWVzdFVubG9jawAACBRhc3NldOkBGGxvY2tlclEBLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAVEBPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQhAjBjaGVja19vcmlnaW61ARxQYXlGZWVzAAAEFGFzc2V06QFASW5pdGlhdGVUcmFuc2ZlcgAAFCxkZXN0aW5hdGlvblEBLHJlbW90ZV9mZWVzKQI8cHJlc2VydmVfb3JpZ2luFBhhc3NldHMtAihyZW1vdGVfeGNtQQJERXhlY3V0ZVdpdGhPcmlnaW4AAAhEZGVzY2VuZGFudF9vcmlnaW4xAgx4Y21BAiBTZXRIaW50cwAABBRoaW50czkCBD0CAAIcNE5vdEFwcGxpY2FibGUAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAABBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAQU8TWlzc2luZ0FyZ3VtZW50AAEFEEZlZXMAAQUCLCRCeUdlbmVzaXMBIBhCeUZvcmsAAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAABBRhLdXNhbWEAAQUcV2VzdGVuZAABBRhSb2NvY28AAQUYV29jb2NvAAEFIEV0aGVyZXVtAAAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQABBSxCaXRjb2luQ2FzaAABBUBQb2xrYWRvdEJ1bGxldGluAAEFBkkCAigkUGFyYWNoYWluAQQsQWNjb3VudElkMzIAAAgcbmV0d29ya00CCGlkIDhBY2NvdW50SW5kZXg2NAAACBxuZXR3b3JrTQIUaW5kZXgIMEFjY291bnRLZXkyMAAACBxuZXR3b3JrTQIMa2V5IQE4UGFsbGV0SW5zdGFuY2UBBDBHZW5lcmFsSW5kZXgBCChHZW5lcmFsS2V5AAAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAAEFJFBsdXJhbGl0eQAACAhpZCUBEHBhcnQpATxHbG9iYWxDb25zZW5zdXMBSQICJBBIZXJlAAEFCFgxAVECCFgyAARRAgEICFgzAARRAgEMCFg0AARRAgEQCFg1AARRAgEUCFg2AARRAgEYCFg3AARRAgEcCFg4AARRAgEgAAgccGFyZW50cwQgaW50ZXJpb3JVAgIIIENvbmNyZXRlAVkCIEFic3RyYWN0ASAACAhpZF0CDGZ1buUBBGECAAAICGlkWQIMZnVu5QEEaQIAAgwIVjMBZQIIVjQBbQIIVjUB7QECDAhWMwFZAghWNAFZAghWNQFRAQYIAnQkQXR0ZW1wdGVkAAAEHG91dGNvbWXVARBTZW50AAAQGG9yaWdpblEBLGRlc3RpbmF0aW9uUQEcbWVzc2FnZUECKG1lc3NhZ2VfaWQgKFNlbmRGYWlsZWQAABAYb3JpZ2luUQEsZGVzdGluYXRpb25RARRlcnJvckUCKG1lc3NhZ2VfaWQgPFByb2Nlc3NYY21FcnJvcgAADBhvcmlnaW5RARRlcnJvcs0BKG1lc3NhZ2VfaWQgSFVuZXhwZWN0ZWRSZXNwb25zZQAACBhvcmlnaW5RASBxdWVyeV9pZAg0UmVzcG9uc2VSZWFkeQAACCBxdWVyeV9pZAggcmVzcG9uc2UFAiBOb3RpZmllZAAADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBOb3RpZnlPdmVyd2VpZ2h0AAAUIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgENGFjdHVhbF93ZWlnaHQYTG1heF9idWRnZXRlZF93ZWlnaHQYTE5vdGlmeURpc3BhdGNoRXJyb3IAAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARITm90aWZ5RGVjb2RlRmFpbGVkAAAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQEludmFsaWRSZXNwb25kZXIAAAwYb3JpZ2luUQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9utQFcSW52YWxpZFJlc3BvbmRlclZlcnNpb24AAAgYb3JpZ2luUQEgcXVlcnlfaWQINFJlc3BvbnNlVGFrZW4AAAQgcXVlcnlfaWQINEFzc2V0c1RyYXBwZWQAAAwQaGFzaCAYb3JpZ2luUQEYYXNzZXRzcQJUVmVyc2lvbkNoYW5nZU5vdGlmaWVkAAAQLGRlc3RpbmF0aW9uUQEYcmVzdWx0BBBjb3N07QEobWVzc2FnZV9pZCBcU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQAAAggbG9jYXRpb25RARx2ZXJzaW9uBFBOb3RpZnlUYXJnZXRTZW5kRmFpbAAADCBsb2NhdGlvblEBIHF1ZXJ5X2lkCBRlcnJvcs0BZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwAAAggbG9jYXRpb251AiBxdWVyeV9pZAhUSW52YWxpZFF1ZXJpZXJWZXJzaW9uAAAIGG9yaWdpblEBIHF1ZXJ5X2lkCDhJbnZhbGlkUXVlcmllcgAAEBhvcmlnaW5RASBxdWVyeV9pZAhAZXhwZWN0ZWRfcXVlcmllclEBUG1heWJlX2FjdHVhbF9xdWVyaWVytQFQVmVyc2lvbk5vdGlmeVN0YXJ0ZWQAAAwsZGVzdGluYXRpb25RARBjb3N07QEobWVzc2FnZV9pZCBYVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAAADCxkZXN0aW5hdGlvblEBEGNvc3TtAShtZXNzYWdlX2lkIGBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQAAAwsZGVzdGluYXRpb25RARBjb3N07QEobWVzc2FnZV9pZCAgRmVlc1BhaWQAAAgYcGF5aW5nUQEQZmVlc+0BNEFzc2V0c0NsYWltZWQAAAwQaGFzaCAYb3JpZ2luUQEYYXNzZXRzcQJgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkAAAEHHZlcnNpb24EPEFsaWFzQXV0aG9yaXplZAAADBxhbGlhc2VyUQEYdGFyZ2V0UQEYZXhwaXJ5eQJkQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAAACBxhbGlhc2VyUQEYdGFyZ2V0UQFwQWxpYXNlc0F1dGhvcml6YXRpb25zUmVtb3ZlZAAABBh0YXJnZXRRAQIMNEludmFsaWRGb3JtYXQBIEhVbnN1cHBvcnRlZFZlcnNpb24BIEBFeGVjdXRlZERvd253YXJkAAMIINUBAgwQSGVyZQABBRhQYXJlbnQAAQUcU2libGluZwEEAhgkQmFkRm9ybWF0AAEFHENvcnJ1cHQAAQUsVW5zdXBwb3J0ZWQAAQUoT3ZlcndlaWdodAEYFFlpZWxkAAEFRFN0YWNrTGltaXRSZWFjaGVkAAEFAhBAUHJvY2Vzc2luZ0ZhaWxlZAAADAhpZCAYb3JpZ2luhQIUZXJyb3KJAiRQcm9jZXNzZWQAABAIaWQgGG9yaWdpboUCLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQAABAIaWQgGG9yaWdpboUCKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQAAAgYb3JpZ2luhQIUaW5kZXgEAQUHkQLUAiBAQmF0Y2hJbnRlcnJ1cHRlZAAACBRpbmRleAQUZXJyb3LUOEJhdGNoQ29tcGxldGVkAAEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwABBTRJdGVtQ29tcGxldGVkAAEFKEl0ZW1GYWlsZWQAAAQUZXJyb3LUMERpc3BhdGNoZWRBcwAABBhyZXN1bHSVAkRJZkVsc2VNYWluU3VjY2VzcwABBVBJZkVsc2VGYWxsYmFja0NhbGxlZAAABChtYWluX2Vycm9y1AAIGGhlaWdodAQUaW5kZXgEAhQsTmV3TXVsdGlzaWcAAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAAAQJGFwcHJvdmluZwAkdGltZXBvaW50nQIgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAAAFCRhcHByb3ZpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdJUCRE11bHRpc2lnQ2FuY2VsbGVkAAAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludJ0CIG11bHRpc2lnACRjYWxsX2hhc2ggMERlcG9zaXRQb2tlZAAAEAx3aG8AJGNhbGxfaGFzaCAsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAYAAhAUU3VkaWQAAAQsc3Vkb19yZXN1bHSVAihLZXlDaGFuZ2VkAAAIDG9sZKUCDG5ldwAoS2V5UmVtb3ZlZAABBShTdWRvQXNEb25lAAAELHN1ZG9fcmVzdWx0lQICGAxBbnkAAQUsTm9uVHJhbnNmZXIAAQUsQ2FuY2VsUHJveHkAAQUgSWRlbnRpdHkAAQVESWRlbnRpdHlKdWRnZW1lbnQAAQUgQ29sbGF0b3IAAQUCCBxQcm94aWVzAAEFNEFubm91bmNlbWVudHMAAQUCHDRQcm94eUV4ZWN1dGVkAAAEGHJlc3VsdJUCLFB1cmVDcmVhdGVkAAAYEHB1cmUADHdobwAocHJveHlfdHlwZa0CUGRpc2FtYmlndWF0aW9uX2luZGV4BAhhdAQ8ZXh0cmluc2ljX2luZGV4BChQdXJlS2lsbGVkAAAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGWtAlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAAAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQAABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtAhRkZWxheQQwUHJveHlSZW1vdmVkAAAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQIUZGVsYXkEMERlcG9zaXRQb2tlZAAAEAx3aG8AEGtpbmSxAixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAggQVHJ1ZQABBRRGYWxzZQABBQIIFFRydXRoAbkCIENvbnRlbXB0AAEFAoAsSWRlbnRpdHlTZXQAAAQMd2hvADxJZGVudGl0eUNsZWFyZWQAAAgMd2hvABxkZXBvc2l0CDhJZGVudGl0eUtpbGxlZAAACAx3aG8AHGRlcG9zaXQISEp1ZGdlbWVudFJlcXVlc3RlZAAACAx3aG8APHJlZ2lzdHJhcl9pbmRleARQSnVkZ2VtZW50VW5yZXF1ZXN0ZWQAAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEOEp1ZGdlbWVudEdpdmVuAAAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BDhSZWdpc3RyYXJBZGRlZAAABDxyZWdpc3RyYXJfaW5kZXgEQFN1YklkZW50aXR5QWRkZWQAAAwMc3ViABBtYWluABxkZXBvc2l0CEBTdWJJZGVudGl0aWVzU2V0AAAMEG1haW4AOG51bWJlcl9vZl9zdWJzBCxuZXdfZGVwb3NpdAhIU3ViSWRlbnRpdHlSZW5hbWVkAAAIDHN1YgAQbWFpbgBIU3ViSWRlbnRpdHlSZW1vdmVkAAAMDHN1YgAQbWFpbgAcZGVwb3NpdAhIU3ViSWRlbnRpdHlSZXZva2VkAAAMDHN1YgAQbWFpbgAcZGVwb3NpdAg4QXV0aG9yaXR5QWRkZWQAAAQkYXV0aG9yaXR5AEBBdXRob3JpdHlSZW1vdmVkAAAEJGF1dGhvcml0eQAsVXNlcm5hbWVTZXQAAAgMd2hvACB1c2VybmFtZSQ4VXNlcm5hbWVRdWV1ZWQAAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgRIUHJlYXBwcm92YWxFeHBpcmVkAAAEFHdob3NlAEhQcmltYXJ5VXNlcm5hbWVTZXQAAAgMd2hvACB1c2VybmFtZSRcRGFuZ2xpbmdVc2VybmFtZVJlbW92ZWQAAAgMd2hvACB1c2VybmFtZSQ8VXNlcm5hbWVVbmJvdW5kAAAEIHVzZXJuYW1lJDxVc2VybmFtZVJlbW92ZWQAAAQgdXNlcm5hbWUkOFVzZXJuYW1lS2lsbGVkAAAEIHVzZXJuYW1lJEBVc2VybmFtZVJlcG9ydGVkAAAIIHJlcG9ydGVyACB1c2VybmFtZSRMUGVyc29uYWxJZGVudGl0eVNldAAADBRhbGlhcyAcYWNjb3VudAAgdXNlcm5hbWUkREV2aWRlbmNlU3VibWl0dGVkAAAEFGFsaWFzIEhDcmVkZW50aWFsQWNjZXB0ZWQAAAQUYWxpYXMgSENyZWRlbnRpYWxSZWplY3RlZAAABBRhbGlhcyAwUGVyc29uQmFubmVkAAAEFGFsaWFzIFxQZXJzb25hbElkZW50aXR5Q2xlYXJlZAAABBRhbGlhcyBsUmVwb3J0ZWRVc2VybmFtZUp1ZGdlZFZhbGlkAAAEIHVzZXJuYW1lJHRSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkSW52YWxpZAAABCB1c2VybmFtZSSYUmVwb3J0ZWRVc2VybmFtZVdlYWtPclVuY2xlYXJKdWRnZW1lbnQAAAggdXNlcm5hbWUkJGp1ZGdlbWVudL0CBCAAAiRQUGVyc29uaG9vZFJlY29nbml6ZWQAAAgMd2hvCAxrZXkgQFBlcnNvbk9uYm9hcmRpbmcAAAgMd2hvCAxrZXkgPEFsaWFzRGlzcGF0Y2hlZAAACBRhbGlhc10BHGFjY291bnQAPEFsaWFzQWNjb3VudFNldAAACBRhbGlhc10BHGFjY291bnQAREFsaWFzQWNjb3VudFVuc2V0AAAIFGFsaWFzXQEcYWNjb3VudABQUGVyc29uYWxJZEFjY291bnRTZXQAAAgMd2hvCBxhY2NvdW50AFhQZXJzb25hbElkQWNjb3VudFVuc2V0AAAIDHdobwgcYWNjb3VudABEQ29sbGVjdGlvbkNyZWF0ZWQAAQVkRm9yY2VQZXJzb25ob29kUmVjb2duaXplZAAABBhwZW9wbGXFAgQEAAJELENhc2VDcmVhdGVkAAAEKGNhc2VfaW5kZXgEIENhbGxiYWNrAAAEGHJlc3VsdJUCNENhbGxiYWNrRXJyb3IAAQUoQ2FzZUNsb3NlZAAACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIUVm90ZWQAAAwoY2FzZV9pbmRleAQUdm90ZXIgHG9waW5pb269AixWb3RlQ2xlYW5lZAAACChjYXNlX2luZGV4BBR2b3RlciAsQ2FzZVJlbW92ZWQAAAQoY2FzZV9pbmRleAQ4Q2FzZUludGVydmVuZWQAAAgoY2FzZV9pbmRleAQcdmVyZGljdL0CMFZvdGVzQ2xhaW1lZAAACBR2b3RlciAwY2FzZV9pbmRpY2VzzQIwUmV3YXJkUGF5b3V0AAAMFHZvdGVyICxkZXN0aW5hdGlvbgAYYW1vdW50CEhQYXlvdXRSb3VuZFN0YXJ0ZWQAAAwUcm91bmQEPGluaXRpYWxfYmFsYW5jZQgwdG90YWxfcG9pbnRzCFRQYXlvdXRSb3VuZHNTY2hlZHVsZWQAAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBFRQYXlvdXRTY2hlZHVsZVJlbW92ZWQAAAQUaW5kZXgENENyZWRpdENsYWltZWQAAAgUdm90ZXIgGGFtb3VudAg0UG9pbnRzQ2xlYW5lZAAACBRyb3VuZAQUdm90ZXIgLENhc2VUb3VjaGVkAAAIKGNhc2VfaW5kZXgEHHJpcGVuZWQUUFZvdGluZ1BlbmFsdHlDbGVhcmVkAAAEDHdobyACECBEZXNpZ25lZAAABBRjb3VudAREUHJvY2VkdXJhbEFjY291bnQAAQVIUHJvY2VkdXJhbFBlcnNvbmFsAAEFKFByb2NlZHVyYWwAAAQUcmFuZ2UEACA4cmVyb2xsX3RpbWVvdXQEPGZhc3R0cmFja19jb3VudAQcbWF4aW11bQQ4ZnVsbF9hbGxvY19sZW4IQGZ1bGxfYWxsb2NfY291bnQEOGluaXRfYWxsb2NfbGVuCEBpbml0X2FsbG9jX2NvdW50BBx0aW1lb3V0BAJcQENhbmRpZGF0ZUFwcGxpZWQAAAQoYWNjb3VudF9pZABISnVkZ2VtZW50UmVxdWVzdGVkAAAEKGFjY291bnRfaWQAREp1ZGdlbWVudFByb3ZpZGVkAAAIKGFjY291bnRfaWQAJGp1ZGdlbWVudL0CMFJldHJ5R3JhbnRlZAAACChhY2NvdW50X2lkACBmYWlsdXJlcwRAUGVyc29uUmVnaXN0ZXJlZAAACChhY2NvdW50X2lkACxwZXJzb25hbF9pZAhEQ2FuZGlkYXRlUmVmZXJyZWQAAAggcmVmZXJyZXIIIHJlZmVycmVkACBSZXJvbGxlZAAABChhY2NvdW50X2lkADxEZXNpZ25Db21taXR0ZWQAAAgoYWNjb3VudF9pZAAscmVzZXJ2ZWRfaWQIOEZ1bGx5QWxsb2NhdGVkAAAEKGFjY291bnRfaWQAIFRpbWVkT3V0AAAEKGFjY291bnRfaWQAJEZsYWtlZE91dAAABChhY2NvdW50X2lkADhUaWNrZXRSZWZlcnJlZAAACCByZWZlcnJlcggYdGlja2V0ADxUaWNrZXRDYW5jZWxsZWQAAAggcmVmZXJyZXIIGHRpY2tldAA0VGlja2V0QXBwbGllZAAACChhY2NvdW50X2lkACByZWZlcnJlcggsRmFtaWx5QWRkZWQAAAwUaW5kZXgEEGtpbmTVAghpZCBEQWxsSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgBIU29tZUludml0ZXNSZW1vdmVkAAAEHGludml0ZXIAXEludml0ZWRDYW5kaWRhdGVBcHBsaWVkAAAIDHdobwAcaW52aXRlcgBkUmVmZXJyYWxWb3VjaGVyUmVnaXN0ZXJlZAAABCByZWZlcnJlcgg4SW52aXRlc0dyYW50ZWQAAAgcYWNjb3VudAAUY291bnQEPEludml0ZVRpY2tldFNldAAACBxpbnZpdGVyABh0aWNrZXQAVEludml0ZVRpY2tldENhbmNlbGxlZAAACBxpbnZpdGVyABh0aWNrZXQAQENvbmZpZ3VyYXRpb25TZXQAAAQYY29uZmln2QICCBxBY2NvdW50AQAYUGVyc29uASACOBxOZXdHYW1lAAAMRHJlZ2lzdHJhdGlvbl9lbmRzBCRnYW1lX2RhdGUELHJlcG9ydF9lbmRzBCRHYW1lRW5kZWQAAAQUaW5kZXgEIFNpZ25lZFVwAAAEDHdob+ECPFJlcG9ydFN1Ym1pdHRlZAAACAx3aG/hAihnYW1lX2luZGV4BChPZmZib2FyZGVkAAAEDHdob+ECJEtpY2tlZE91dAAABBhwbGF5ZXLhAjhJbnZpdGVzR3JhbnRlZAAACBxhY2NvdW50ABRjb3VudAQ8SW52aXRlVGlja2V0U2V0AAAEHGludml0ZXIAVEludml0ZVRpY2tldENhbmNlbGxlZAAABBxpbnZpdGVyADhHYW1lc1NjaGVkdWxlZAAABBRjb3VudARQU2NoZWR1bGVkR2FtZVJlbW92ZWQAAAQ4Z2FtZV9wbGF5X3RpbWUEQFN0bXRVc2FnZVJlbW92ZWQAAAQMd2hvIERBbGxJbnZpdGVzUmVtb3ZlZAAABBxpbnZpdGVyAEhTb21lSW52aXRlc1JlbW92ZWQAAAQcaW52aXRlcgACHDRDcmVkaXRDbGFpbWVkAAAMDHdob+ECLGRlc3RpbmF0aW9uABhhbW91bnQIUFBlcnNvbmhvb2RSZWNvZ25pemVkAAAIDHdob+ECHHJlc3VtZWQUVFBheW91dFJvdW5kc1NjaGVkdWxlZAAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRUUGF5b3V0U2NoZWR1bGVSZW1vdmVkAAAEFGluZGV4BERSb3VuZFRyYW5zaXRpb25lZAAABCxyb3VuZF9pbmRleARMUGF5b3V0Um91bmRPcGVyYXRlZAAABCxyb3VuZF9pbmRleAQkQ2FzaGVkT3V0AAAEDHdob+ECAiAsSWRzUmVzZXJ2ZWQAAAQUY291bnQEJElkUmVuZXdlZAAABAhpZAgwSWRVbnJlc2VydmVkAAAECGlkCEBQZW9wbGVSZWdpc3RlcmVkAAAEFGNvdW50BDxQZW9wbGVTdXNwZW5kZWQAAAQUY291bnQERFBlcnNvbmhvb2RSZXN1bWVkAAAECGlkCEhTdXNwZW5zaW9uc1N0YXJ0ZWQAAQVAU3VzcGVuc2lvbnNFbmRlZAABBQIQeEFsbEF0dGVzdGF0aW9uQWxsb3dhbmNlQ2xlYXJlZAAABCB2ZXJpZmllcgB0QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQAAAgcYWNjb3VudAAUY291bnQEOFBlcnNvbkF0dGVzdGVkAAAIJGNhbmRpZGF0ZQAgdmVyaWZpZXIASENvbnN1bWVyUmVnaXN0ZXJlZAAABBxhY2NvdW50AAIgQFBlcnNvblJlZ2lzdGVyZWQAAAgUYWxpYXMgHGFjY291bnQAUExpdGVQZXJzb25SZWdpc3RlcmVkAAAEHGFjY291bnQAaFBlcnNvbkF1dGhvcml6YXRpb25Ub3VjaGVkAAAEHGFjY291bnQAhEV4cGlyZWRVc2VybmFtZVJlc2VydmF0aW9uUmVtb3ZlZAAACCB1c2VybmFtZSQcYWNjb3VudABQSWRlbnRpZmllcktleVVwZGF0ZWQAAAQcYWNjb3VudAB4VXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uU2V0AAAEIGR1cmF0aW9uCFBTdG10U3RvcmVTbG90VXBkYXRlZAAACBxhY2NvdW50ACxzbG90X251bWJlcgQ0UGVyc29uRGVtb3RlZAAABBxhY2NvdW50AAIMEFIyZTkAAQUUUjJlMTAAAQUUUjJlMTQAAQUCCGhDaHVua1BhZ2VIYXNoZXNJbml0aWFsaXplZAAACDRyaW5nX2V4cG9uZW50+QIsdG90YWxfcGFnZXMELENodW5rc0FkZGVkAAAMNHJpbmdfZXhwb25lbnT5AixzdGFydF9pbmRleAQUY291bnQEAiAsTWVtYmVyQWRkZWQAAAQMa2V5IDRNZW1iZXJSZW1vdmVkAAAEDGtleSBsQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uAAAEKGlkZW50aWZpZXIgRENvbGxlY3Rpb25EZWxldGVkAAAEKGlkZW50aWZpZXIgJFJpbmdCdWlsdAAACChpZGVudGlmaWVyIChyaW5nX2luZGV4BEBNZW1iZXJzT25ib2FyZGVkAAAEKGlkZW50aWZpZXIgLFJpbmdzTWVyZ2VkAAAMKGlkZW50aWZpZXIgPGJhc2VfcmluZ19pbmRleAREdGFyZ2V0X3JpbmdfaW5kZXgERE9uYm9hcmRpbmdTaXplU2V0AAAIKGlkZW50aWZpZXIgPG9uYm9hcmRpbmdfc2l6ZQQCCBhOYXRpdmUAAQUYU3RhYmxlAAEFAlgkQ29pblNwbGl0AAAEMG91dHB1dF9jb3VudAQ8Q29pblRyYW5zZmVycmVkAAAMCHRvABR2YWx1ZQQcbmV3X2FnZQRYUmVjeWNsZXJMb2FkZWRXaXRoQ29pbgAABBR2YWx1ZQR8UmVjeWNsZXJMb2FkZWRXaXRoRXh0ZXJuYWxBc3NldAAADAx3aG8AFHZhbHVlBBhhbW91bnQIYFJlY3ljbGVyVW5sb2FkZWRJbnRvQ29pbgAAEAh0bwAsaW5wdXRfdmFsdWUEMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEhFJlY3ljbGVyVW5sb2FkZWRJbnRvRXh0ZXJuYWxBc3NldAAAEAh0bwAUdmFsdWUELGlucHV0X2NvdW50BBhhbW91bnQIhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbgAACAxmZWUIJGRlc3Ryb3llZAiMUGFpZFVubG9hZFRva2VuUmVnaXN0ZXJlZFdpdGhOYXRpdmUAAAgMd2hvAAxmZWUIjFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoU3RhYmxlAAAIDHdobwAMZmVlCHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEhExpdGVQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAAABBhwZXJpb2QEZFJlY3ljbGVyc1VubG9hZGVkSW50b0NvaW4AAAwIdG8AMG91dHB1dF92YWx1ZQQsaW5wdXRfY291bnQEiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8ALGlucHV0X2NvdW50BBhhbW91bnQIuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMAABQMd2hvAAh0bwAsaW5wdXRfY291bnQEGGFtb3VudAgwZmVlX2N1cnJlbmN5BQNkUmVjeWNsZXJVbmxvYWRlZEludG9Db2lucwAABDBvdXRwdXRfY291bnQEfENvaW5PZmZib2FyZGVkSW50b0V4dGVybmFsQXNzZXQAAAwIdG8AFHZhbHVlBBhhbW91bnQIPFJlY3ljbGVyQ2xlYW5lZAAADBR2YWx1ZQQ8cmVtYWluaW5nX2NvaW5zBEBkZXN0cm95ZWRfYW1vdW50CGRDb25zdW1lZEZyZWVUb2tlbnNDbGVhbmVkAAAEGHBlcmlvZARoUGFpZFVubG9hZFRva2VuUmluZ0NsZWFuZWQAAAgYcGVyaW9kBChyaW5nX2luZGV4BExSZWN5Y2xlckR1c3RDbGVhbmVkAAEFaFBhaWRVbmxvYWRUb2tlbkR1c3RDbGVhbmVkAAEFnEV4cGlyZWRQYWlkVW5sb2FkVG9rZW5Db2xsZWN0aW9uRGVsZXRlZAAABBhwZXJpb2QEAkAwQXNzZXRDcmVhdGVkAAEFUFhjbUZ1bmRzVHJhbnNmZXJTZW50AAEFYFhjbUZ1bmRzVHJhbnNmZXJUaW1lZE91dAABBTRGdW5kc1ZlcmlmaWVkAAEFKFBvdHNGdW5kZWQAAQVcTW9iUnVsZVBheW91dHNTY2hlZHVsZWQAAQVUU2NvcmVQYXlvdXRzU2NoZWR1bGVkAAEFdE9uUG9sbEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAEFZE1pZ3JhdGlvblBlb3BsZVJlY29nbml6ZWQAAQVoTWlncmF0aW9uT25ib2FyZGluZ1NpemVTZXQAAQV4TWlncmF0aW9uUHJvb2ZPZklua0luaXRpYWxpemVkAAEFXE1pZ3JhdGlvbkdhbWVzU2NoZWR1bGVkAAEFXE1pZ3JhdGlvbkludml0ZXNHcmFudGVkAAEFfE1pZ3JhdGlvblJlaW1idXJzZW1lbnRWYWx1ZXNTZXQAAQWETWlncmF0aW9uQXR0ZXN0YXRpb25BbGxvd2FuY2VzU2V0AAEFSE1pZ3JhdGlvbkNvbXBsZXRlZAABBQIEXEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAEFAgQgUHJpemVTZXQAAAwgYXNzZXRfaWRRATBhc3NldF9hbW91bnQIHHdpbm5lcnMEAjRUUGFydGljaXBhbnRSZWdpc3RlcmVkAAAMIGV2ZW50X2lkBDhwYXJ0aWNpcGFudF9pZAQUYWxpYXMgMEV2ZW50U3RhcnRlZAAACAhpZAQUZXZlbnQVAzBFdmVudFNraXBwZWQAAAgIaWQEFGV2ZW50FQM4RXZlbnRTY2hlZHVsZWQAAAQgZXZlbnRfaWQEVFNjaGVkdWxlZEV2ZW50UmVtb3ZlZAAABCBldmVudF9pZARoRmFpbGVkVHJhbnNmZXJQcml6ZUNsYWltZWQAAAgMd2hvACBldmVudF9pZARgV2FpdGluZ0ZvckVudHJvcHlUb0J1aWxkAAAEIGV2ZW50X2lkBDhEcmF3aW5nV2lubmVycwAABCBldmVudF9pZAQwRGlzdHJpYnV0aW5nAAAEIGV2ZW50X2lkBEBQcml6ZURpc3RyaWJ1dGVkAAAQIGV2ZW50X2lkBBBkZXN0ACBhc3NldF9pZFEBMGFzc2V0X2Ftb3VudAhcUHJpemVEaXN0cmlidXRpb25GYWlsZWQAABAgZXZlbnRfaWQEEGRlc3QAIGFzc2V0X2lkUQEwYXNzZXRfYW1vdW50CDxDbGVhcmluZ1N0b3JhZ2UAAAQgZXZlbnRfaWQEOEV2ZW50Q29tcGxldGVkAAAEIGV2ZW50X2lkBAYkAiA4VXBncmFkZVN0YXJ0ZWQAAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAABBTRVcGdyYWRlRmFpbGVkAAEFQE1pZ3JhdGlvblNraXBwZWQAAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAAAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQAAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAAACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAAAELG5leHRfY3Vyc29yHQMCkBhTeXN0ZW0B2DxQYXJhY2hhaW5TeXN0ZW0B4CBCYWxhbmNlcwENAUhUcmFuc2FjdGlvblBheW1lbnQBEQFIU2tpcEZlZWxlc3NQYXltZW50AZUBRE9yaWdpblJlc3RyaWN0aW9uAZ0BGEFzc2V0cwGpATBBc3NldHNIb2xkZXIBrQEkQXNzZXRSYXRlAbEBOEFzc2V0VHhQYXltZW50AbkBRENvbGxhdG9yU2VsZWN0aW9uAcEBHFNlc3Npb24BxQEkWGNtcFF1ZXVlAckBLFBvbGthZG90WGNtAX0CKEN1bXVsdXNYY20BgQIwTWVzc2FnZVF1ZXVlAY0CHFV0aWxpdHkBmQIgTXVsdGlzaWcBoQIQU3VkbwGpAhRQcm94eQG1AiBJZGVudGl0eQHBAhhQZW9wbGUByQIcTW9iUnVsZQHRAihQcm9vZk9mSW5rAd0CEEdhbWUB5QIUU2NvcmUB6QIgRHVtbXlEaW0B7QIoUGVvcGxlTGl0ZQHxAiRSZXNvdXJjZXMB9QI0Q2h1bmtzTWFuYWdlcgH9AhxNZW1iZXJzAQEDHENvaW5hZ2UBCQNUU3RvcmFnZUluaXRpYWxpemF0aW9uAQ0DZFN0b3JhZ2VJbml0aWFsaXphdGlvbkxpdGUBEQMcQWlyZHJvcAEZA1BNdWx0aUJsb2NrTWlncmF0aW9ucwEhAwAMFHBoYXNlNBRldmVudCUDGHRvcGljc8UCBCkDAAQEAQgEMQMAAQEACDBzcGVjX3ZlcnNpb24EJHNwZWNfbmFtZTkDAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAAQOGJhc2VfZXh0cmluc2ljGDRtYXhfZXh0cmluc2ljDQIkbWF4X3RvdGFsDQIgcmVzZXJ2ZWQNAgAMGG5vcm1hbEUDLG9wZXJhdGlvbmFsRQMkbWFuZGF0b3J5RQMADChiYXNlX2Jsb2NrGCRtYXhfYmxvY2sYJHBlcl9jbGFzc0kDAAwYbm9ybWFsBCxvcGVyYXRpb25hbAQkbWFuZGF0b3J5BAAIEHJlYWQIFHdyaXRlCAMI2QEEBFkDAAAgJHNwZWNfbmFtZTkDJGltcGxfbmFtZTkDRGF1dGhvcmluZ192ZXJzaW9uBDBzcGVjX3ZlcnNpb24EMGltcGxfdmVyc2lvbgQQYXBpc10DTHRyYW5zYWN0aW9uX3ZlcnNpb24EOHN5c3RlbV92ZXJzaW9uBAQkAQgEZQMABCQAAAgkbXNnX2NvdW50BCx0b3RhbF9ieXRlcwQDCARxAwR1AwAADDR1bXBfbXNnX2NvdW50BDx1bXBfdG90YWxfYnl0ZXMENGhybXBfb3V0Z29pbmd5AwIIFEFib3J0AAEFHEdvQWhlYWQAAQUGgQMADDh1c2VkX2JhbmR3aWR0aH0DOHBhcmFfaGVhZF9oYXNo3GBjb25zdW1lZF9nb19haGVhZF9zaWduYWyFAwSJAwAGBAAMOHVzZWRfYmFuZHdpZHRofQM4aHJtcF93YXRlcm1hcmuRA2Bjb25zdW1lZF9nb19haGVhZF9zaWduYWyFAwAQLHBhcmVudF9oZWFkJExyZWxheV9wYXJlbnRfbnVtYmVyBGRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290IDBtYXhfcG92X3NpemUEAgQcUHJlc2VudAABBQadAwAIPHJlbWFpbmluZ19jb3VudAQ4cmVtYWluaW5nX3NpemUEABgwbWF4X2NhcGFjaXR5BDhtYXhfdG90YWxfc2l6ZQRAbWF4X21lc3NhZ2Vfc2l6ZQQkbXNnX2NvdW50BCh0b3RhbF9zaXplBCBtcWNfaGVhZNwDCASpAwStAwAAEDBkbXFfbXFjX2hlYWQgnHJlbGF5X2Rpc3BhdGNoX3F1ZXVlX3JlbWFpbmluZ19jYXBhY2l0eaUDQGluZ3Jlc3NfY2hhbm5lbHOxAzxlZ3Jlc3NfY2hhbm5lbHOxAwAITG1heF9jYW5kaWRhdGVfZGVwdGgEUGFsbG93ZWRfYW5jZXN0cnlfbGVuBAAoNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXO5AwMIBCAEwQMAAAgcc2VudF9hdAQscmV2ZXJzZV9pZHgEAAgkcmVjaXBpZW50BBBkYXRhJATNAwAAFCxwYXJlbnRfaGFzaCAYbnVtYmVyBChzdGF0ZV9yb290IDxleHRyaW5zaWNzX3Jvb3QgGGRpZ2VzdDAE1QMAABA8dmFsaWRhdGlvbl9kYXRhmQNEcmVsYXlfY2hhaW5fc3RhdGVtA2ByZWxheV9wYXJlbnRfZGVzY2VuZGFudHPZA0Bjb2xsYXRvcl9wZWVyX2lkHQMACBxzZW50X2F0BAxtc2ckBOEDAAAIHHNlbnRfYXQEIG1zZ19oYXNoIATpAwAACDRmdWxsX21lc3NhZ2Vz5QM8aGFzaGVkX21lc3NhZ2Vz7QMACBxzZW50X2F0BBBkYXRhJAMIBPUDBPkDAAMIBOkDBAEEAAAINGZ1bGxfbWVzc2FnZXP9AzxoYXNoZWRfbWVzc2FnZXMFBAAIRGRvd253YXJkX21lc3NhZ2Vz8QNMaG9yaXpvbnRhbF9tZXNzYWdlcwkEAgwMRmVlAAEFEE1pc2MAAQUMQWxsAAEFAAwIaWTZARhhbW91bnQIHHJlYXNvbnMRBAQVBAAACAhpZNkBGGFtb3VudAgEHQQAAAgIaWQFARhhbW91bnQIBCUEAAAEGGFtb3VudAgELQQAAhQISWQBABRJbmRleAGRAgxSYXcBJCRBZGRyZXNzMzIBICRBZGRyZXNzMjABIQECCCBJbmNyZWFzZQABBSBEZWNyZWFzZQABBQIIJFYxQW5jaWVudAABBQhWMgABBQAIEHVzZWQIIGF0X2Jsb2NrBAIMEExpdmUAAQUYRnJvemVuAAEFKERlc3Ryb3lpbmcAAQUAMBRvd25lcgAYaXNzdWVyABRhZG1pbgAcZnJlZXplcgAYc3VwcGx5CBxkZXBvc2l0CCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQgYWNjb3VudHMELHN1ZmZpY2llbnRzBCRhcHByb3ZhbHMEGHN0YXR1c0UEAwhRAQACDBhMaXF1aWQAAQUYRnJvemVuAAEFHEJsb2NrZWQAAQUCFCBDb25zdW1lcgABBShTdWZmaWNpZW50AAEFLERlcG9zaXRIZWxkAQg8RGVwb3NpdFJlZnVuZGVkAAEFLERlcG9zaXRGcm9tAAMIAAgADBxiYWxhbmNlCBhzdGF0dXNRBBhyZWFzb25VBAMMUQEAAAAIGGFtb3VudAgcZGVwb3NpdAgAFBxkZXBvc2l0CBBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UBkkEBmUEAAgMd2hvABxkZXBvc2l0CARxBAADCAAgBHkEAAMIKCQDCAgEAggIT2sAAQUkU3VzcGVuZGVkAAEFABQkcmVjaXBpZW50BBRzdGF0ZYkENHNpZ25hbHNfZXhpc3QULGZpcnN0X2luZGV4BChsYXN0X2luZGV4BASNBAADCAQEAAxEc3VzcGVuZF90aHJlc2hvbGQEOGRyb3BfdGhyZXNob2xkBEByZXN1bWVfdGhyZXNob2xkBAZ1AgUBCAahBAKgIE92ZXJmbG93AAEFNFVuaW1wbGVtZW50ZWQAAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAQUwTG9jYXRpb25GdWxsAAEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQABBSRCYWRPcmlnaW4AAQU8SW52YWxpZExvY2F0aW9uAAEFNEFzc2V0Tm90Rm91bmQAAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAEFPE5vdFdpdGhkcmF3YWJsZQABBUhMb2NhdGlvbkNhbm5vdEhvbGQAAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAAEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAQUkVHJhbnNwb3J0AAEFKFVucm91dGFibGUAAQUwVW5rbm93bkNsYWltAAEFOEZhaWxlZFRvRGVjb2RlAAEFQE1heFdlaWdodEludmFsaWQAAQU4Tm90SG9sZGluZ0ZlZXMAAQUwVG9vRXhwZW5zaXZlAAEFEFRyYXABCEBFeHBlY3RhdGlvbkZhbHNlAAEFOFBhbGxldE5vdEZvdW5kAAEFME5hbWVNaXNtYXRjaAABBUxWZXJzaW9uSW5jb21wYXRpYmxlAAEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AAEFLEV4cG9ydEVycm9yAAEFOFJlYW5jaG9yRmFpbGVkAAEFGE5vRGVhbAABBShGZWVzTm90TWV0AAEFJExvY2tFcnJvcgABBTBOb1Blcm1pc3Npb24AAQUoVW5hbmNob3JlZAABBThOb3REZXBvc2l0YWJsZQABBUxVbmhhbmRsZWRYY21WZXJzaW9uAAEFSFdlaWdodExpbWl0UmVhY2hlZAEYHEJhcnJpZXIAAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQABBURFeGNlZWRzU3RhY2tMaW1pdAABBQMIBKkEBq0EAhgQTnVsbAABBRhBc3NldHMBZQI8RXhlY3V0aW9uUmVzdWx0AbEEHFZlcnNpb24BBCxQYWxsZXRzSW5mbwH9AThEaXNwYXRjaFJlc3VsdAEBAgIYEE51bGwAAQUYQXNzZXRzAW0CPEV4ZWN1dGlvblJlc3VsdAGxBBxWZXJzaW9uAQQsUGFsbGV0c0luZm8B/QE4RGlzcGF0Y2hSZXN1bHQBAQICDAhWMwG1BAhWNAG5BAhWNQEFAgIMHFBlbmRpbmcAABAkcmVzcG9uZGVydQJMbWF5YmVfbWF0Y2hfcXVlcmllcp0EMG1heWJlX25vdGlmeaUEHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgAACBhvcmlnaW51AiRpc19hY3RpdmUUFFJlYWR5AAAIIHJlc3BvbnNlvQQIYXQEAwgEdQIDDAgYBAMIdQIEBM0EAAIQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAEFXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEFUE5vdGlmeUN1cnJlbnRUYXJnZXRzAR0DaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAEFAgwIVjMBXQIIVjQBWQIIVjUBUQEDDAQA2QQDCJECCAThBAAAEBhhbW91bnQIFG93bmVydQIYbG9ja2VydQIkY29uc3VtZXJz5QQDCAh1AgTtBAAACCBsb2NhdGlvbnUCGGV4cGlyeXkCBPUEAAAEIGFsaWFzZXJz+QQGWQIADCxkZXN0aW5hdGlvblkCIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GAIQDEFsbAABBRRBbGxPZgAACAhpZF0CDGZ1bhUCKEFsbENvdW50ZWQBBDBBbGxPZkNvdW50ZWQAAAwIaWRdAgxmdW4VAhRjb3VudAQCCCBEZWZpbml0ZQFlAhBXaWxkAQkFAsA0V2l0aGRyYXdBc3NldAFlAlRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBZQJYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAFlAjRRdWVyeVJlc3BvbnNlAAAQIHF1ZXJ5X2lkCCByZXNwb25zZbUEKG1heF93ZWlnaHQYHHF1ZXJpZXIBBTRUcmFuc2ZlckFzc2V0AAAIGGFzc2V0c2UCLGJlbmVmaWNpYXJ5WQJQVHJhbnNmZXJSZXNlcnZlQXNzZXQAAAwYYXNzZXRzZQIQZGVzdFkCDHhjbRUFIFRyYW5zYWN0AAAMLG9yaWdpbl9raW5kCQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAAADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAAABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwAADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgABBTREZXNjZW5kT3JpZ2luAVUCLFJlcG9ydEVycm9yAQUFMERlcG9zaXRBc3NldAAACBhhc3NldHMNBSxiZW5lZmljaWFyeVkCTERlcG9zaXRSZXNlcnZlQXNzZXQAAAwYYXNzZXRzDQUQZGVzdFkCDHhjbRUFNEV4Y2hhbmdlQXNzZXQAAAwQZ2l2ZQ0FEHdhbnRlAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwAADBhhc3NldHMNBRxyZXNlcnZlWQIMeGNtFQVASW5pdGlhdGVUZWxlcG9ydAAADBhhc3NldHMNBRBkZXN0WQIMeGNtFQU0UmVwb3J0SG9sZGluZwAACDRyZXNwb25zZV9pbmZvBQUYYXNzZXRzDQUwQnV5RXhlY3V0aW9uAAAIEGZlZXNhAjB3ZWlnaHRfbGltaXQhAjRSZWZ1bmRTdXJwbHVzAAEFPFNldEVycm9ySGFuZGxlcgEVBSxTZXRBcHBlbmRpeAEVBShDbGVhckVycm9yAAEFKENsYWltQXNzZXQAAAgYYXNzZXRzZQIYdGlja2V0WQIQVHJhcAEIQFN1YnNjcmliZVZlcnNpb24AAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgABBSRCdXJuQXNzZXQBZQIsRXhwZWN0QXNzZXQBZQIwRXhwZWN0T3JpZ2luAQEFLEV4cGVjdEVycm9yAbEEUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQECLFF1ZXJ5UGFsbGV0AAAILG1vZHVsZV9uYW1lJDRyZXNwb25zZV9pbmZvBQUwRXhwZWN0UGFsbGV0AAAUFGluZGV4BBBuYW1lJCxtb2R1bGVfbmFtZSQsY3JhdGVfbWFqb3IEPG1pbl9jcmF0ZV9taW5vcgRQUmVwb3J0VHJhbnNhY3RTdGF0dXMBBQVMQ2xlYXJUcmFuc2FjdFN0YXR1cwABBTxVbml2ZXJzYWxPcmlnaW4BUQI0RXhwb3J0TWVzc2FnZQAADBxuZXR3b3JrSQIsZGVzdGluYXRpb25VAgx4Y20VBSRMb2NrQXNzZXQAAAgUYXNzZXRhAiB1bmxvY2tlclkCLFVubG9ja0Fzc2V0AAAIFGFzc2V0YQIYdGFyZ2V0WQI4Tm90ZVVubG9ja2FibGUAAAgUYXNzZXRhAhRvd25lclkCNFJlcXVlc3RVbmxvY2sAAAgUYXNzZXRhAhhsb2NrZXJZAixTZXRGZWVzTW9kZQAABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljASAoQ2xlYXJUb3BpYwABBSxBbGlhc09yaWdpbgFZAjxVbnBhaWRFeGVjdXRpb24AAAgwd2VpZ2h0X2xpbWl0IQIwY2hlY2tfb3JpZ2luAQUEEQUAAhAMQWxsAAEFFEFsbE9mAAAICGlkWQIMZnVuFQIoQWxsQ291bnRlZAEEMEFsbE9mQ291bnRlZAAADAhpZFkCDGZ1bhUCFGNvdW50BAIIIERlZmluaXRlAW0CEFdpbGQBGQUCwDRXaXRoZHJhd0Fzc2V0AW0CVFJlc2VydmVBc3NldERlcG9zaXRlZAFtAlhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AW0CNFF1ZXJ5UmVzcG9uc2UAABAgcXVlcnlfaWQIIHJlc3BvbnNluQQobWF4X3dlaWdodBgccXVlcmllcgEFNFRyYW5zZmVyQXNzZXQAAAgYYXNzZXRzbQIsYmVuZWZpY2lhcnlZAlBUcmFuc2ZlclJlc2VydmVBc3NldAAADBhhc3NldHNtAhBkZXN0WQIMeGNtJQUgVHJhbnNhY3QAAAwsb3JpZ2luX2tpbmQJAlhyZXF1aXJlX3dlaWdodF9hdF9tb3N0GBBjYWxsJGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0AAAMGHNlbmRlcgRAbWF4X21lc3NhZ2Vfc2l6ZQQwbWF4X2NhcGFjaXR5BExIcm1wQ2hhbm5lbEFjY2VwdGVkAAAEJHJlY2lwaWVudARISHJtcENoYW5uZWxDbG9zaW5nAAAMJGluaXRpYXRvcgQYc2VuZGVyBCRyZWNpcGllbnQELENsZWFyT3JpZ2luAAEFNERlc2NlbmRPcmlnaW4BVQIsUmVwb3J0RXJyb3IBBQUwRGVwb3NpdEFzc2V0AAAIGGFzc2V0cx0FLGJlbmVmaWNpYXJ5WQJMRGVwb3NpdFJlc2VydmVBc3NldAAADBhhc3NldHMdBRBkZXN0WQIMeGNtJQU0RXhjaGFuZ2VBc3NldAAADBBnaXZlHQUQd2FudG0CHG1heGltYWwUXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3AAAMGGFzc2V0cx0FHHJlc2VydmVZAgx4Y20lBUBJbml0aWF0ZVRlbGVwb3J0AAAMGGFzc2V0cx0FEGRlc3RZAgx4Y20lBTRSZXBvcnRIb2xkaW5nAAAINHJlc3BvbnNlX2luZm8FBRhhc3NldHMdBTBCdXlFeGVjdXRpb24AAAgQZmVlc2kCMHdlaWdodF9saW1pdCECNFJlZnVuZFN1cnBsdXMAAQU8U2V0RXJyb3JIYW5kbGVyASUFLFNldEFwcGVuZGl4ASUFKENsZWFyRXJyb3IAAQUoQ2xhaW1Bc3NldAAACBhhc3NldHNtAhh0aWNrZXRZAhBUcmFwAQhAU3Vic2NyaWJlVmVyc2lvbgAACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAAEFJEJ1cm5Bc3NldAFtAixFeHBlY3RBc3NldAFtAjBFeHBlY3RPcmlnaW4BAQUsRXhwZWN0RXJyb3IBsQRQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAQIsUXVlcnlQYWxsZXQAAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm8FBTBFeHBlY3RQYWxsZXQAABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEFBUxDbGVhclRyYW5zYWN0U3RhdHVzAAEFPFVuaXZlcnNhbE9yaWdpbgFRAjRFeHBvcnRNZXNzYWdlAAAMHG5ldHdvcmtJAixkZXN0aW5hdGlvblUCDHhjbSUFJExvY2tBc3NldAAACBRhc3NldGkCIHVubG9ja2VyWQIsVW5sb2NrQXNzZXQAAAgUYXNzZXRpAhh0YXJnZXRZAjhOb3RlVW5sb2NrYWJsZQAACBRhc3NldGkCFG93bmVyWQI0UmVxdWVzdFVubG9jawAACBRhc3NldGkCGGxvY2tlclkCLFNldEZlZXNNb2RlAAAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBIChDbGVhclRvcGljAAEFLEFsaWFzT3JpZ2luAVkCPFVucGFpZEV4ZWN1dGlvbgAACDB3ZWlnaHRfbGltaXQhAjBjaGVja19vcmlnaW4BBQQhBQACDAhWMwEVBQhWNAElBQhWNQFBAgIQIFRlbGVwb3J0AAEFMExvY2FsUmVzZXJ2ZQABBUhEZXN0aW5hdGlvblJlc2VydmUAAQU0UmVtb3RlUmVzZXJ2ZQF1AgAIEHByZXaFAhBuZXh0hQIGMQUAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3VyczUFNG1lc3NhZ2VfY291bnQIEHNpemUIAwiFAgQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkAiwYcmVtYXJrAAAEGHJlbWFyayQ4c2V0X2hlYXBfcGFnZXMAAAQUcGFnZXMIIHNldF9jb2RlAAAEEGNvZGUkXHNldF9jb2RlX3dpdGhvdXRfY2hlY2tzAAAEEGNvZGUkLHNldF9zdG9yYWdlAAAEFGl0ZW1zaQMwa2lsbF9zdG9yYWdlAAAEEGtleXNtAyxraWxsX3ByZWZpeAAACBhwcmVmaXgkHHN1YmtleXMERHJlbWFya193aXRoX2V2ZW50AAAEGHJlbWFyayREYXV0aG9yaXplX3VwZ3JhZGUAAAQkY29kZV9oYXNoIIBhdXRob3JpemVfdXBncmFkZV93aXRob3V0X2NoZWNrcwAABCRjb2RlX2hhc2ggYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQAABBBjb2RlJAIITHNldF92YWxpZGF0aW9uX2RhdGEAAAgQZGF0Yd0DVGluYm91bmRfbWVzc2FnZXNfZGF0YQ0EYHN1ZG9fc2VuZF91cHdhcmRfbWVzc2FnZQAABBxtZXNzYWdlJAIEDHNldAAABAxub3cIAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgAAAgQZGVzdDUEFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgAADBhzb3VyY2U1BBBkZXN0NQQUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAgQZGVzdDUEFHZhbHVlCDB0cmFuc2Zlcl9hbGwAAAgQZGVzdDUEKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQAACAx3aG81BBhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMAAAQMd2hvvQFEZm9yY2Vfc2V0X2JhbGFuY2UAAAgMd2hvNQQgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQAACCRkaXJlY3Rpb245BBRkZWx0YQgQYnVybgAACBR2YWx1ZQgoa2VlcF9hbGl2ZRQCBCxjbGVhbl91c2FnZQAABBhlbnRpdHmZAQKIGGNyZWF0ZQAADAhpZFEBFGFkbWluNQQsbWluX2JhbGFuY2UIMGZvcmNlX2NyZWF0ZQAAEAhpZFEBFG93bmVyNQQ0aXNfc3VmZmljaWVudBQsbWluX2JhbGFuY2UINHN0YXJ0X2Rlc3Ryb3kAAAQIaWRRAUBkZXN0cm95X2FjY291bnRzAAAECGlkUQFEZGVzdHJveV9hcHByb3ZhbHMAAAQIaWRRAThmaW5pc2hfZGVzdHJveQAABAhpZFEBEG1pbnQAAAwIaWRRASxiZW5lZmljaWFyeTUEGGFtb3VudAgQYnVybgAADAhpZFEBDHdobzUEGGFtb3VudAggdHJhbnNmZXIAAAwIaWRRARh0YXJnZXQ1BBhhbW91bnQITHRyYW5zZmVyX2tlZXBfYWxpdmUAAAwIaWRRARh0YXJnZXQ1BBhhbW91bnQIOGZvcmNlX3RyYW5zZmVyAAAQCGlkUQEYc291cmNlNQQQZGVzdDUEGGFtb3VudAgYZnJlZXplAAAICGlkUQEMd2hvNQQQdGhhdwAACAhpZFEBDHdobzUEMGZyZWV6ZV9hc3NldAAABAhpZFEBKHRoYXdfYXNzZXQAAAQIaWRRAUh0cmFuc2Zlcl9vd25lcnNoaXAAAAgIaWRRARRvd25lcjUEIHNldF90ZWFtAAAQCGlkUQEYaXNzdWVyNQQUYWRtaW41BBxmcmVlemVyNQQwc2V0X21ldGFkYXRhAAAQCGlkUQEQbmFtZSQYc3ltYm9sJCBkZWNpbWFscwQ4Y2xlYXJfbWV0YWRhdGEAAAQIaWRRAUhmb3JjZV9zZXRfbWV0YWRhdGEAABQIaWRRARBuYW1lJBhzeW1ib2wkIGRlY2ltYWxzBCRpc19mcm96ZW4UUGZvcmNlX2NsZWFyX21ldGFkYXRhAAAECGlkUQFIZm9yY2VfYXNzZXRfc3RhdHVzAAAgCGlkUQEUb3duZXI1BBhpc3N1ZXI1BBRhZG1pbjUEHGZyZWV6ZXI1BCxtaW5fYmFsYW5jZQg0aXNfc3VmZmljaWVudBQkaXNfZnJvemVuFEBhcHByb3ZlX3RyYW5zZmVyAAAMCGlkUQEgZGVsZWdhdGU1BBhhbW91bnQIPGNhbmNlbF9hcHByb3ZhbAAACAhpZFEBIGRlbGVnYXRlNQRUZm9yY2VfY2FuY2VsX2FwcHJvdmFsAAAMCGlkUQEUb3duZXI1BCBkZWxlZ2F0ZTUERHRyYW5zZmVyX2FwcHJvdmVkAAAQCGlkUQEUb3duZXI1BCxkZXN0aW5hdGlvbjUEGGFtb3VudAgUdG91Y2gAAAQIaWRRARhyZWZ1bmQAAAgIaWRRAShhbGxvd19idXJuFDxzZXRfbWluX2JhbGFuY2UAAAgIaWRRASxtaW5fYmFsYW5jZQgsdG91Y2hfb3RoZXIAAAgIaWRRAQx3aG81BDByZWZ1bmRfb3RoZXIAAAgIaWRRAQx3aG81BBRibG9jawAACAhpZFEBDHdobzUEMHRyYW5zZmVyX2FsbAAADAhpZFEBEGRlc3Q1BChrZWVwX2FsaXZlFDBzZXRfcmVzZXJ2ZXMAAAgIaWRRASByZXNlcnZlc6UBAgwYY3JlYXRlAAAIKGFzc2V0X2tpbmRRARByYXRlCBh1cGRhdGUAAAgoYXNzZXRfa2luZFEBEHJhdGUIGHJlbW92ZQAABChhc3NldF9raW5kUQECJERzZXRfaW52dWxuZXJhYmxlcwAABAxuZXe9AVhzZXRfZGVzaXJlZF9jYW5kaWRhdGVzAAAEDG1heARIc2V0X2NhbmRpZGFjeV9ib25kAAAEEGJvbmQIVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQABBTBsZWF2ZV9pbnRlbnQAAQVAYWRkX2ludnVsbmVyYWJsZQAABAx3aG8ATHJlbW92ZV9pbnZ1bG5lcmFibGUAAAQMd2hvACx1cGRhdGVfYm9uZAAABCxuZXdfZGVwb3NpdAhMdGFrZV9jYW5kaWRhdGVfc2xvdAAACBxkZXBvc2l0CBh0YXJnZXQAAgggc2V0X2tleXMAAAgQa2V5cyAUcHJvb2YkKHB1cmdlX2tleXMAAQUCFFRzdXNwZW5kX3hjbV9leGVjdXRpb24AAQVQcmVzdW1lX3hjbV9leGVjdXRpb24AAQVgdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkAAAEDG5ldwRUdXBkYXRlX2Ryb3BfdGhyZXNob2xkAAAEDG5ldwRcdXBkYXRlX3Jlc3VtZV90aHJlc2hvbGQAAAQMbmV3BAJEEHNlbmQAAAgQZGVzdHUCHG1lc3NhZ2UpBTx0ZWxlcG9ydF9hc3NldHMAABAQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAAAQEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAAAIHG1lc3NhZ2UpBShtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgAACCBsb2NhdGlvblEBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24AAAREbWF5YmVfeGNtX3ZlcnNpb26RA3hmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkAAAQgbG9jYXRpb251AoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQAABCBsb2NhdGlvbnUCfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMAABQQZGVzdHUCLGJlbmVmaWNpYXJ5dQIYYXNzZXRzcQI4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdCECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAAAUEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQhAkBmb3JjZV9zdXNwZW5zaW9uAAAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAAAUEGRlc3R1AixiZW5lZmljaWFyeXUCGGFzc2V0c3ECOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXQhAjBjbGFpbV9hc3NldHMAAAgYYXNzZXRzcQIsYmVuZWZpY2lhcnl1Aox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgAAHBBkZXN0dQIYYXNzZXRzcQJQYXNzZXRzX3RyYW5zZmVyX3R5cGUtBThyZW1vdGVfZmVlc19pZNkESGZlZXNfdHJhbnNmZXJfdHlwZS0FSGN1c3RvbV94Y21fb25fZGVzdCkFMHdlaWdodF9saW1pdCECUGFkZF9hdXRob3JpemVkX2FsaWFzAAAIHGFsaWFzZXJ1AhxleHBpcmVzeQJccmVtb3ZlX2F1dGhvcml6ZWRfYWxpYXMAAAQcYWxpYXNlcnUCdHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzAAEFAggkcmVhcF9wYWdlAAAIOG1lc3NhZ2Vfb3JpZ2luhQIocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AAAQOG1lc3NhZ2Vfb3JpZ2luhQIQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCIBRiYXRjaAAABBRjYWxsc80GNGFzX2Rlcml2YXRpdmUAAAgUaW5kZXgEEGNhbGzJBiRiYXRjaF9hbGwAAAQUY2FsbHPNBixkaXNwYXRjaF9hcwAACCRhc19vcmlnaW6RARBjYWxsyQYsZm9yY2VfYmF0Y2gAAAQUY2FsbHPNBix3aXRoX3dlaWdodAAACBBjYWxsyQYYd2VpZ2h0GBxpZl9lbHNlAAAIEG1haW7JBiBmYWxsYmFja8kGUGRpc3BhdGNoX2FzX2ZhbGxpYmxlAAAIJGFzX29yaWdpbpEBEGNhbGzJBgadAgIUUGFzX211bHRpX3RocmVzaG9sZF8xAAAIRG90aGVyX3NpZ25hdG9yaWVzvQEQY2FsbMkGIGFzX211bHRpAAAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ATxtYXliZV90aW1lcG9pbnR5BRBjYWxsyQYobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQAAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVzvQE8bWF5YmVfdGltZXBvaW50eQUkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkAABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc70BJHRpbWVwb2ludJ0CJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AAAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXO9ASRjYWxsX2hhc2ggAhQQc3VkbwAABBBjYWxsyQZUc3Vkb191bmNoZWNrZWRfd2VpZ2h0AAAIEGNhbGzJBhh3ZWlnaHQYHHNldF9rZXkAAAQMbmV3NQQcc3Vkb19hcwAACAx3aG81BBBjYWxsyQYocmVtb3ZlX2tleQABBQatAgIsFHByb3h5AAAMEHJlYWw1BEBmb3JjZV9wcm94eV90eXBlhQUQY2FsbMkGJGFkZF9wcm94eQAADCBkZWxlZ2F0ZTUEKHByb3h5X3R5cGWtAhRkZWxheQQwcmVtb3ZlX3Byb3h5AAAMIGRlbGVnYXRlNQQocHJveHlfdHlwZa0CFGRlbGF5BDhyZW1vdmVfcHJveGllcwABBSxjcmVhdGVfcHVyZQAADChwcm94eV90eXBlrQIUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUAABQcc3Bhd25lcjUEKHByb3h5X3R5cGWtAhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAAAIEHJlYWw1BCRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQAAAgQcmVhbDUEJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAAACCBkZWxlZ2F0ZTUEJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAAAQIGRlbGVnYXRlNQQQcmVhbDUEQGZvcmNlX3Byb3h5X3R5cGWFBRBjYWxsyQYwcG9rZV9kZXBvc2l0AAEFBQEMBQEUBQEYBQEcBQEkBQEoBQEsBQEwBQE0BQE4BQE8BQFEBQFIBQFMBQFUBQFYBQFcBQFgBQFkBQFoBQFsBQFwBQF0BQF4BQF8ApgQTm9uZQABBRBSYXcwAZECEFJhdzEBBBBSYXcyAaEEEFJhdzMBjQUQUmF3NAEoEFJhdzUBkQUQUmF3NgGVBRBSYXc3AZkFEFJhdzgB2QEQUmF3OQGdBRRSYXcxMAGhBRRSYXcxMQGlBRRSYXcxMgGpBRRSYXcxMwGtBRRSYXcxNAGxBRRSYXcxNQG1BRRSYXcxNgHdARRSYXcxNwG5BRRSYXcxOAG9BRRSYXcxOQHBBRRSYXcyMAEhARRSYXcyMQHFBRRSYXcyMgHJBRRSYXcyMwHNBRRSYXcyNAHRBRRSYXcyNQHVBRRSYXcyNgHZBRRSYXcyNwHdBRRSYXcyOAHhBRRSYXcyOQHlBRRSYXczMAHpBRRSYXczMQHtBRRSYXczMgEgLEJsYWtlVHdvMjU2ASAYU2hhMjU2ASAkS2VjY2FrMjU2ASAsU2hhVGhyZWUyNTYBIAYhAQAoHGRpc3BsYXnxBRRsZWdhbPEFDHdlYvEFGG1hdHJpePEFFGVtYWls8QU8cGdwX2ZpbmdlcnByaW509QUUaW1hZ2XxBRx0d2l0dGVy8QUYZ2l0aHVi8QUcZGlzY29yZPEFAwgA8QUE/QUAAiAcVW5rbm93bgABBRxGZWVQYWlkAQgoUmVhc29uYWJsZQABBSRLbm93bkdvb2QAAQUkT3V0T2ZEYXRlAAEFKExvd1F1YWxpdHkAAQUkRXJyb25lb3VzAAEFIEV4dGVybmFsAAEFBQEBAQUBBQECEBxFZDI1NTE5AQkGHFNyMjU1MTkBCQYURWNkc2EBDQYMRXRoAQ0GBhEGAgwcVHdpdHRlcgAABCB1c2VybmFtZSQYR2l0aHViAAAEIHVzZXJuYW1lJBxEaXNjb3JkAAAEPGRpc3BsYXlfYW5kX3RhZyQCeDRhZGRfcmVnaXN0cmFyAAAEHGFjY291bnQ1BDBzZXRfaWRlbnRpdHkAAAQQaW5mb/kFIHNldF9zdWJzAAAEEHN1YnMBBjhjbGVhcl9pZGVudGl0eQABBURyZXF1ZXN0X2p1ZGdlbWVudAAACCRyZWdfaW5kZXgEHG1heF9mZWUIOGNhbmNlbF9yZXF1ZXN0AAAEJHJlZ19pbmRleAQcc2V0X2ZlZQAACBRpbmRleAQMZmVlCDhzZXRfYWNjb3VudF9pZAAACBRpbmRleAQMbmV3NQQoc2V0X2ZpZWxkcwAACBRpbmRleAQYZmllbGRzCERwcm92aWRlX2p1ZGdlbWVudAAAECRyZWdfaW5kZXgEGHRhcmdldDUEJGp1ZGdlbWVudAUGIGlkZW50aXR5IDRraWxsX2lkZW50aXR5AAAEGHRhcmdldDUEHGFkZF9zdWIAAAgMc3ViNQQQZGF0YfEFKHJlbmFtZV9zdWIAAAgMc3ViNQQQZGF0YfEFKHJlbW92ZV9zdWIAAAQMc3ViNQQgcXVpdF9zdWIAAQVYYWRkX3VzZXJuYW1lX2F1dGhvcml0eQAADCRhdXRob3JpdHk1BBhzdWZmaXgkKGFsbG9jYXRpb24EZHJlbW92ZV91c2VybmFtZV9hdXRob3JpdHkAAAgYc3VmZml4JCRhdXRob3JpdHk1BEBzZXRfdXNlcm5hbWVfZm9yAAAQDHdobzUEIHVzZXJuYW1lJCRzaWduYXR1cmUVBjh1c2VfYWxsb2NhdGlvbhQ8YWNjZXB0X3VzZXJuYW1lAAAEIHVzZXJuYW1lJFxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAAABCB1c2VybmFtZSRQc2V0X3ByaW1hcnlfdXNlcm5hbWUAAAQgdXNlcm5hbWUkPHVuYmluZF91c2VybmFtZQAABCB1c2VybmFtZSQ8cmVtb3ZlX3VzZXJuYW1lAAAEIHVzZXJuYW1lJDRraWxsX3VzZXJuYW1lAAAEIHVzZXJuYW1lJFRzZXRfcGVyc29uYWxfaWRlbnRpdHkAAAwcYWNjb3VudAAkc2lnbmF0dXJlEQYgdXNlcm5hbWUkjHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlAAAEKGNyZWRlbnRpYWwZBmhwZXJzb25hbF9jcmVkZW50aWFsX2p1ZGdlZAAADBh0aWNrZXQEHGNvbnRleHQkJGp1ZGdlbWVudL0CXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5AAEFPHJlcG9ydF91c2VybmFtZQAABCB1c2VybmFtZSRgcmVwb3J0ZWRfdXNlcm5hbWVfanVkZ2VkAAAMGHRpY2tldAQcY29udGV4dCQkanVkZ2VtZW50vQICHCx1bmRlcl9hbGlhcwAABBBjYWxsyQZEc2V0X2FsaWFzX2FjY291bnQAAAgcYWNjb3VudAA0Y2FsbF92YWxpZF9hdARMdW5zZXRfYWxpYXNfYWNjb3VudAABBWhmb3JjZV9yZWNvZ25pemVfcGVyc29uaG9vZAAABBhwZW9wbGXFAlxzZXRfcGVyc29uYWxfaWRfYWNjb3VudAAACBxhY2NvdW50ADRjYWxsX3ZhbGlkX2F0BGR1bnNldF9wZXJzb25hbF9pZF9hY2NvdW50AAEFYGNyZWF0ZV9wZW9wbGVfY29sbGVjdGlvbgABBQJEEHZvdGUAAAgoY2FzZV9pbmRleAQcb3Bpbmlvbr0CKGNsb3NlX2Nhc2UAAAQoY2FzZV9pbmRleAQoY2xlYW5fdm90ZQAACChjYXNlX2luZGV4BBR2b3RlciAkcmVhcF9jYXNlAAAEKGNhc2VfaW5kZXgEJGludGVydmVuZQAACChjYXNlX2luZGV4BBx2ZXJkaWN0vQIoY2xhaW1fdm90ZQAABChjYXNlX2luZGV4BDhwYXlvdXRfcmV3YXJkcwAABCxkZXN0aW5hdGlvbgAsY2xhaW1fdm90ZXMAAAQwY2FzZV9pbmRpY2VzzQJIc3RhcnRfcGF5b3V0X3JvdW5kAAEFWHNjaGVkdWxlX3BheW91dF9yb3VuZHMAAAwYYW1vdW50CBRjb3VudAQYcGVyaW9kBFhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlAAAEFGluZGV4BDBjbGFpbV9jcmVkaXQAAQUwY2xlYW5fcG9pbnRzAAAIFHJvdW5kBBR2b3RlciBAZm9yY2VfcmlwZW5fY2FzZQAABChjYXNlX2luZGV4BCh0b3VjaF9jYXNlAAAEKGNhc2VfaW5kZXgEUGNsZWFyX3ZvdGluZ19wZW5hbHR5AAEFRGNsZWFuX3ZvdGVfc2lnbmVkAAAIKGNhc2VfaW5kZXgEFHZvdGVyIAUBgQECFEBEZXNpZ25lZEVsZWN0aXZlAAQEAQhEUHJvY2VkdXJhbEFjY291bnQBBEhQcm9jZWR1cmFsUGVyc29uYWwBBChQcm9jZWR1cmFsAAMIBARQUHJvY2VkdXJhbERlcml2YXRpdmUAAwgIeQIEhQQAAlgUYXBwbHkAAQU8c3VibWl0X2V2aWRlbmNlAAAEIGV2aWRlbmNlIBhqdWRnZWQAAAwYdGlja2V0BBxjb250ZXh0JCRqdWRnZW1lbnS9AkRyZWdpc3Rlcl9yZWZlcnJlZAAADAxrZXkgLGRlc3RpbmF0aW9uAEhwcm9vZl9vZl9vd25lcnNoaXApBlRyZWdpc3Rlcl9ub25fcmVmZXJyZWQAAAwMa2V5ICxkZXN0aW5hdGlvbgBIcHJvb2Zfb2Zfb3duZXJzaGlwKQYYcmVyb2xsAAEFGGNvbW1pdAAACBhjaG9pY2UtBihyZXF1aXJlX2lkeQI0YWxsb2NhdGVfZnVsbAABBRx0aW1lb3V0AAAEHGFjY291bnQAIGZsYWtlb3V0AAEFUGFwcGx5X3dpdGhfc2lnbmF0dXJlAAAMIHJlZmVycmVyCCRzaWduYXR1cmURBhh0aWNrZXQAVGFwcGx5X3dpdGhfaW52aXRhdGlvbgAADBxpbnZpdGVyABh0aWNrZXQAJHNpZ25hdHVyZREGRGFkZF9kZXNpZ25fZmFtaWx5AAAMFGluZGV4BBBraW5k1QIIaWQgTHNldF9yZWZlcnJhbF90aWNrZXQAAAQYdGlja2V0AFhjYW5jZWxfcmVmZXJyYWxfdGlja2V0AAAEGHRpY2tldACMcmVnaXN0ZXJfc3VjY2Vzc2Z1bF9yZWZlcnJhbF9yZXdhcmQAAAQsZGVzdGluYXRpb24ANGdyYW50X2ludml0ZXMAAAgcYWNjb3VudAAUY291bnQEkHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwAACBxhY2NvdW50ABRsaW1pdAREc2V0X2ludml0ZV90aWNrZXQAAAQYdGlja2V0AFBjYW5jZWxfaW52aXRlX3RpY2tldAAABBh0aWNrZXQARHNldF9jb25maWd1cmF0aW9uAAAEGGNvbmZpZ9kCYHNldF9yZWltYnVyc2VtZW50X3ZhbHVlcwAACDxyZWZlcnJlZF92YWx1ZXMxBjxyZWZlcnJlcl92YWx1ZXMxBgIIGFBlcnNvbgABBSROb3RQZXJzb24AAQUEOQYABD0GAAAMOGdhbWVfcGxheV90aW1lBBhyb3VuZHMEOG1heF9ncm91cF9zaXplBARFBgAAFDByZWdpc3RyYXRpb24EHHNodWZmbGUETHBvc3Rfc2h1ZmZsZV9tYXJnaW4EJHJlcG9ydGluZwQ4cGxheWVyX3Byb2Nlc3MEAkBMc2lnbl91cF93aXRoX2ludml0ZQAABDhpZGVudGlmaWVyX2tleQ0GUHNpZ25fdXBfd2l0aF9hY2NvdW50AAAEOGlkZW50aWZpZXJfa2V5DQZIc2lnbl91cF93aXRoX2FsaWFzAAAMOGlkZW50aWZpZXJfa2V5DQZEc3RhdGVtZW50X2FjY291bnQADHNpZxEGGHJlcG9ydAAABCxmdWxsX3JlcG9ydEEGIG9mZmJvYXJkAAEFHGtpY2tvdXQAAAQYcGxheWVyADRncmFudF9pbnZpdGVzAAAIHGFjY291bnQAFGNvdW50BJByZW1vdmVfYXZhaWxhYmxlX2FuZF9wZW5kaW5nX2ludml0ZXMAAAgcYWNjb3VudAAUbGltaXQERHNldF9pbnZpdGVfdGlja2V0AAAEGHRpY2tldABQY2FuY2VsX2ludml0ZV90aWNrZXQAAAQYdGlja2V0ADhzY2hlZHVsZV9nYW1lcwAABDxnYW1lc19zY2hlZHVsZXNJBlRyZW1vdmVfc2NoZWR1bGVkX2dhbWUAAAQ4Z2FtZV9wbGF5X3RpbWUEbHRlc3RuZXRfZm9yY2Vfc3RhcnRfc2h1ZmZsZQABBWx0ZXN0bmV0X2ZvcmNlX2VuZF9yZXBvcnRpbmcAAQVcdGVzdG5ldF9zZXRfZ2FtZV9waGFzZXMAAAQYcGhhc2VzTQZkdGVzdG5ldF9raWxsX2N1cnJlbnRfZ2FtZQABBQMIICkGBlUGAAxkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZAQYd2luZG93BDhhbGxvd2VkX21pc3NlcwQEXQYAAiBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwAADBhhbW91bnQIFGNvdW50BCBkdXJhdGlvbgRYcmVtb3ZlX3BheW91dF9zY2hlZHVsZQAABBRpbmRleARAdHJhbnNpdGlvbl9yb3VuZAAABCxyb3VuZF9pbmRleARQb3BlcmF0ZV9wYXlvdXRfcm91bmQAAAgscm91bmRfaW5kZXgEFGxpbWl0BCBjYXNoX291dAABBTRyZWRlZW1fY3JlZGl0AAAELGRlc3RpbmF0aW9uACByZWdpc3RlcgAABAxrZXlZBmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQAABCBzY2hlZHVsZWEGAwgIIARpBgAECAACICxyZXNlcnZlX2lkcwAABBRjb3VudARQcmVuZXdfaWRfcmVzZXJ2YXRpb24AAAQIaWQIVGNhbmNlbF9pZF9yZXNlcnZhdGlvbgAABAhpZAhQcmVjb2duaXplX3BlcnNvbmhvb2QAAAQwaWRzX2FuZF9rZXlzbQZIc3VzcGVuZF9wZXJzb25ob29kAAAEDGlkc3EGRHJlc3VtZV9wZXJzb25ob29kAAAECGlkCFhzdGFydF9tdXRhdGlvbl9zZXNzaW9uAAEFUGVuZF9tdXRhdGlvbl9zZXNzaW9uAAEFABQkc2lnbmF0dXJlEQYcYWNjb3VudAA4aWRlbnRpZmllcl9rZXkNBiB1c2VybmFtZSREcmVzZXJ2ZWRfdXNlcm5hbWUdAwZ5BgIQeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQAACBxhY2NvdW50ABRjb3VudARsY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlAAAEHGFjY291bnQAGGF0dGVzdAAAFCRjYW5kaWRhdGUATGNhbmRpZGF0ZV9zaWduYXR1cmURBjByaW5nX3ZyZl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGVGNvbnN1bWVyX3JlZ2lzdHJhdGlvbn0GSGRpc3BhdGNoX2FzX3NpZ25lcgAABBBjYWxsyQYCCChTdGFuZGFsb25lASQsUmVzZXJ2YXRpb24BJAIgUHJlZ2lzdGVyX2xpdGVfcGVyc29uAAAMOGlkZW50aWZpZXJfa2V5DQYgdXNlcm5hbWUkRHJlc2VydmVkX3VzZXJuYW1lHQM8cmVnaXN0ZXJfcGVyc29uAAAMUGxpbmtlZF9saXRlX2lkZW50aXR5AExsaXRlX2lkZW50aXR5X3Byb29mEQY8dXNlcm5hbWVfY2hvaWNlhQZodG91Y2hfcGVyc29uX2F1dGhvcml6YXRpb24AAQWMcmVtb3ZlX2V4cGlyZWRfdXNlcm5hbWVfcmVzZXJ2YXRpb24AAAggdXNlcm5hbWUkHGFjY291bnQAVHVwZGF0ZV9pZGVudGlmaWVyX2tleQAABDhpZGVudGlmaWVyX2tleQ0GhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgAABCBkdXJhdGlvbgiwc2V0X3N0bXRfc3RvcmVfYXNzb2NpYXRlZF9hY2NvdW50X2lkX2F0X3Nsb3QAAAgsc2xvdF9udW1iZXIELHNldF9hY2NvdW50pQJMZGVtb3RlX2F1dGhfZXhwaXJlZAAABBxhY2NvdW50AAIIKGFkZF9jaHVua3MAAAw0cmluZ19leHBvbmVudPkCKHBhZ2VfaW5kZXgEOGVuY29kZWRfY2h1bmtzJFRzZXRfY2h1bmtfcGFnZV9oYXNoZXMAAAg0cmluZ19leHBvbmVudPkCLHBhZ2VfaGFzaGVzxQICEERidWlsZF9yaW5nX21hbnVhbAAADChpZGVudGlmaWVyIChyaW5nX2luZGV4BBRsaW1pdJEDWG9uYm9hcmRfbWVtYmVyc19tYW51YWwAAAQoaWRlbnRpZmllciAsbWVyZ2VfcmluZ3MAAAwoaWRlbnRpZmllciA8YmFzZV9yaW5nX2luZGV4BER0YXJnZXRfcmluZ19pbmRleARMc2V0X29uYm9hcmRpbmdfc2l6ZQAACChpZGVudGlmaWVyIDxvbmJvYXJkaW5nX3NpemUEAwgEvQEElQYAAgwoRXhwZW5kYWJsZQABBRxQcm90ZWN0AAEFIFByZXNlcnZlAAEFABAUdmFsdWUEFGluZGV4BCByZXZpc2lvbgQcYWxpYXNlc8UCBKEGAAJUFHNwbGl0AAAEKHNwbGl0X2ludG+ZBiB0cmFuc2ZlcgAABAh0bwBcbG9hZF9yZWN5Y2xlcl93aXRoX2NvaW4AAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwKQaEbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0AAAQMHByZXNlcnZhdGlvbp0GFHZhbHVlBChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBmR1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luAAAUHGFsaWFzZXPFAhR2YWx1ZQQUaW5kZXgEIHJldmlzaW9uBAh0bwCMdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXQAABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24ECHRvAKxwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9jb2luAAAIKG1lbWJlcl9rZXkgSHByb29mX29mX293bmVyc2hpcCkGtHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX25hdGl2ZQAACChtZW1iZXJfa2V5IEhwcm9vZl9vZl9vd25lcnNoaXApBrRwYXlfZm9yX3JlY3ljbGVyX3VubG9hZF9mZWVfdG9rZW5fd2l0aF9zdGFibGUAAAgobWVtYmVyX2tleSBIcHJvb2Zfb2Zfb3duZXJzaGlwKQaMdW5sb2FkX3JlY3ljbGVyc19pbnRvX2NvaW5fdW5zdGFibGUAAAgYaW5wdXRzpQYIdG8AtHVubG9hZF9yZWN5Y2xlcnNfaW50b19leHRlcm5hbF9hc3NldF91bnN0YWJsZQAACBhpbnB1dHOlBgh0bwDEdW5sb2FkX3JlY3ljbGVyX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBRpbnB1dKEGMGFsaWFzX3Byb29mc4UBCHRvADBmZWVfY3VycmVuY3kFA8h1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91cwAAEBhpbnB1dHOlBjBhbGlhc19wcm9vZnOFAQh0bwAwZmVlX2N1cnJlbmN5BQNodW5sb2FkX3JlY3ljbGVyX2ludG9fY29pbnMAABQcYWxpYXNlc8UCFHZhbHVlBBRpbmRleAQgcmV2aXNpb24EKHNwbGl0X2ludG+ZBqBkaXJlY3Rfb2ZmYm9hcmRfY29pbl9pbnRvX2V4dGVybmFsX2Fzc2V0AAAECHRvADhjbGVhbl9yZWN5Y2xlcgAABBR2YWx1ZQRkY2xlYW5fY29uc3VtZWRfZnJlZV90b2tlbgAABBhwZXJpb2QEcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcAAAgYcGVyaW9kBChyaW5nX2luZGV4BExjbGVhbl9yZWN5Y2xlcl9kdXN0AAEFcGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAAQWsZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbgAABBhwZXJpb2QEAAwUcHJpemUVA0xyZWdpc3RyYXRpb25fc3RhcnRzBFRyZWdpc3RyYXRpb25fZHVyYXRpb24EAhA4c2NoZWR1bGVfZXZlbnQAAAQoZXZlbnRfaW5mb60GWHJlbW92ZV9zY2hlZHVsZWRfZXZlbnQAAAQgZXZlbnRfaWQESHJlZ2lzdGVyX2Zvcl9ldmVudAAACCBldmVudF9pZAQQZGVzdABsY2xhaW1fZmFpbGVkX3RyYW5zZmVyX3ByaXplAAAEIGV2ZW50X2lkBAAMFGluZGV4BDBpbm5lcl9jdXJzb3IdAyhzdGFydGVkX2F0BAIIGEFjdGl2ZQG1BhRTdHVjawABBQa5BgIIIFNwZWNpZmljAW0DIFdpbGRjYXJkAAAIFGxpbWl0kQM8cHJldmlvdXNfY3Vyc29yHQMCEEBmb3JjZV9zZXRfY3Vyc29yAAAEGGN1cnNvcr0GXGZvcmNlX3NldF9hY3RpdmVfY3Vyc29yAAAMFGluZGV4BDBpbm5lcl9jdXJzb3IdAyhzdGFydGVkX2F0kQNIZm9yY2Vfb25ib2FyZF9tYm1zAAEFOGNsZWFyX2hpc3RvcmljAAAEIHNlbGVjdG9ywQYCgBhTeXN0ZW0BRQU8UGFyYWNoYWluU3lzdGVtAUkFJFRpbWVzdGFtcAFNBTRQYXJhY2hhaW5JbmZvAZECIEJhbGFuY2VzAVEFRE9yaWdpblJlc3RyaWN0aW9uAVUFGEFzc2V0cwFZBSRBc3NldFJhdGUBXQVEQ29sbGF0b3JTZWxlY3Rpb24BYQUcU2Vzc2lvbgFlBSRYY21wUXVldWUBaQUsUG9sa2Fkb3RYY20BbQUoQ3VtdWx1c1hjbQGRAjBNZXNzYWdlUXVldWUBcQUcVXRpbGl0eQF1BSBNdWx0aXNpZwF9BRBTdWRvAYEFFFByb3h5AYkFIElkZW50aXR5AR0GGFBlb3BsZQEhBhxNb2JSdWxlASUGKFByb29mT2ZJbmsBNQYQR2FtZQFRBhRTY29yZQFlBiBEdW1teURpbQF1BihQZW9wbGVMaXRlAYEGJFJlc291cmNlcwGJBjRDaHVua3NNYW5hZ2VyAY0GHE1lbWJlcnMBkQYcQ29pbmFnZQGpBhxBaXJkcm9wAbEGUE11bHRpQmxvY2tNaWdyYXRpb25zAcUGBMkGAAAQEHdoZW6dAhxkZXBvc2l0CCRkZXBvc2l0b3IAJGFwcHJvdmFsc70BAAwgZGVsZWdhdGUAKHByb3h5X3R5cGWtAhRkZWxheQQE1QYAAwjZBggADBByZWFsACRjYWxsX2hhc2ggGGhlaWdodAQE4QYAAwjlBggDCAQFBgTtBgAADChqdWRnZW1lbnRz8QYcZGVwb3NpdAgQaW5mb/kFAwgIvQEADBxhY2NvdW50AAxmZWUIGGZpZWxkcwgG/QYEAQcAAAgoYWNjb3VudF9pZAAoYWxsb2NhdGlvbgQCDChBbGxvY2F0aW9uAAEFQEF1dGhvcml0eURlcG9zaXQBCBhTeXN0ZW0AAQUACBRvd25lcgAgcHJvdmlkZXINBwMMAAQNBwMIGQYEBBkHAAAQHGFjY291bnQASHBlbmRpbmdfanVkZ2VtZW50cx0HGGJhbm5lZBRkdXNlcm5hbWVfbGFzdF9yZXBvcnRlZF9hdJEDAAwgcmVwb3J0ZXIAIHVzZXJuYW1lJBxjYXNlX2lkBAAIDGtleSAcYWNjb3VudKUCABAUdm90ZWQEHGNsZWFuZWQEHGNvcnJlY3QEGGNyZWRpdAgCEEBEZXNpZ25lZEVsZWN0aXZlAAQEAQhEUHJvY2VkdXJhbEFjY291bnQAAwgEIEhQcm9jZWR1cmFsUGVyc29uYWwAAwgECChQcm9jZWR1cmFsAAMIBCgCDChQcm9vZk9mSW5rAAAMGGRlc2lnbjEHIGV2aWRlbmNlIExwcm9iYWJsZV9hY2NlcHRhYmxlFEhJZGVudGl0eUNyZWRlbnRpYWwAAAggcGxhdGZvcm0ZBiBldmlkZW5jZSQ0VXNlcm5hbWVWYWxpZAAABCB1c2VybmFtZSQACDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEAAwkc3RhdGVtZW50NQccY29udGV4dCQgY2FsbGJhY2s5BwAMDGF5ZQQMbmF5BCBjb250ZW1wdAQADBRzaW5jZQgcZGV0YWlscz0HFHRhbGx5QQcACBxkZXRhaWxzPQccdmVyZGljdL0CAAgUc2luY2UIHHZlcmRpY3S9AgAUFHJvdW5kBDxpbml0aWFsX2JhbGFuY2UIRHJlbWFpbmluZ19iYWxhbmNlCDB0b3RhbF9wb2ludHMIFHN0YXJ0BAAMJHJlbWFpbmluZwRAYW1vdW50X3Blcl9yb3VuZAgYcGVyaW9kBARVBwACDCBSZWZlcnJlZAEIHERlcG9zaXQBCBxJbnZpdGVkAQACDBxJbml0aWFsAAEFIEluaXREb25lAAEFEEZ1bGwAAQUCDBxBcHBsaWVkAAAMEGNyZWRdBxxlbnRyb3B5IDRlbnRyb3B5X3NpbmNlBCBTZWxlY3RlZAAAIBRzaW5jZQQQY3JlZF0HIHJlc2VydmVkCBxlbnRyb3B5IBhkZXNpZ24xByhhbGxvY2F0aW9uYQccanVkZ2luZ5EDGGZhaWxlZAQYUHJvdmVuAAAQGGRlc2lnbjEHIHJlc2VydmVkCDB3YXNfcmVmZXJyZWQULHdhc19pbnZpdGVkFAYxBwAkGGRlc2lnbmkHQGFjdGl2ZV9yZWZlcnJhbHO9AWBhbGxvd2VkX3JlZmVycmFsX3RpY2tldHMENGJhZF9yZWZlcnJhbHMEUHN1Y2Nlc3NmdWxfcmVmZXJyYWxzBCRyZWZlcnJhbHMELGRlcml2YXRpdmVzBBhiYW5uZWQUYHBlbmRpbmdfcmVmZXJyYWxfcmV3YXJkcwQACBBraW5k1QIIaWQgAgggUmVzZXJ2ZWQAAQUkQ29tbWl0dGVkAAEFBAABCAMI4QIgAgggS2lja2FibGUAAAgoZmlyc3RfZ2FtZQQ4YXJjaGl2ZWRfc2luY2UEKFVua2lja2FibGUAAAQoZmlyc3RfZ2FtZQQCDBxJbnZpdGVkAAEFKFJlY29nbml6ZWQAAQUcRGVwb3NpdAEIABgoZmlyc3RfZ2FtZQQocmVnaXN0ZXJlZBQsc2VudF9yZXBvcnQUKHllc19wZXJzb24ENG5vX25vdF9wZXJzb24ELGNyZWRpYmlsaXR5hQcG4QICCCxTdGVwMUluc2VydAAABDhsYXN0X2l0ZXJhdGlvbo0HNFN0ZXAyUmV0cmlldmUAAAhEbmV4dF9wbGF5ZXJfaW5kZXgETHJlY29nbml6ZWRfZmluaXNoZWQUAhQwUmVnaXN0cmF0aW9uAAAERG5leHRfcGxheWVyX2luZGV4BBxTaHVmZmxlAAAEEHN0ZXCRByRSZXBvcnRpbmcAAAQwcGxheWVyX2NvdW50BDRQbGF5ZXJQcm9jZXNzAAAEOGxhc3RfaXRlcmF0aW9ujQcoQ2FuY2VsbGluZwAABDhsYXN0X2l0ZXJhdGlvbo0HACAUaW5kZXgERHJlZ2lzdHJhdGlvbl9lbmRzBEBzaHVmZmxlX2RlYWRsaW5lBCRnYW1lX2RhdGUELHJlcG9ydF9lbmRzBBRzdGF0ZZUHOG1heF9ncm91cF9zaXplBBhyb3VuZHMEAgggQXR0ZW5kZWQBBBhBYnNlbnQBBAIQUEV4dGVybmFsbHlSZWNvZ25pemVkAAEFNE5vdFJlY29nbml6ZWQAAQUkU3VzcGVuZGVkAQgoUmVjb2duaXplZAEIACAUc2NvcmUEGHN0cmVha50HSGF0dGVuZGFuY2VfaGlzdG9yeQQYY3JlZGl0CChjYXNoZWRfb3V0FEhyZWFjaGVkX3BlcnNvbmhvb2QUbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZBQscmVjb2duaXRpb26hBwMIBOECABBEcmVtYWluaW5nX2JhbGFuY2UILHBvaW50X3ByaWNlCCRyZW1haW5kZXIIMHRvdGFsX3BvaW50cwQACCRmaW5pc2hfYXQEGGNyZWRpdAgADCRyZW1haW5pbmcEQGFtb3VudF9wZXJfcm91bmQIIGR1cmF0aW9uBAS1BwAACAxrZXkgJHN1c3BlbmRlZBQCBDBVbmlxdWVEZXZpY2UBAAAIMHJpbmdfdnJmX2tleSAYbWV0aG9kwQcCCBBMaXRlAAEFGFBlcnNvbgAADBRhbGlhcyAsbGFzdF91cGRhdGUIHGRlbW90ZWQUAgggT2NjdXBpZWQAAAgoYWNjb3VudF9pZAAUc2luY2UIEEZyZWUAAQUEzQcAABQ4aWRlbnRpZmllcl9rZXkNBjRmdWxsX3VzZXJuYW1lHQM0bGl0ZV91c2VybmFtZSQsY3JlZGliaWxpdHnJB0BzdG10X3N0b3JlX3Nsb3Rz0QcACBxhY2NvdW50ACRqb2luZWRfYXQIBNkHAAAIJG1heF9jb3VudAQgbWF4X3NpemUEAwj5AgQFAcAE6QcAAgggRXh0ZXJuYWwBUQEUTG9jYWwBAAIIKEFwcGVuZE9ubHkAAQUgRmxleGlibGUAAQUADBRvd25lcvEHEG1vZGX1ByRyaW5nX3NpemX5AgMIIAQFAQEGBQHBBgAMEHJvb3QBCCByZXZpc2lvbgQwaW50ZXJtZWRpYXRlBQgDDCAEBAAMFHRvdGFsBCBpbmNsdWRlZAQ8aW1tdXRhYmxlX3NpbmNleQICDChPbmJvYXJkaW5nAAAEKHF1ZXVlX3BhZ2UEIEluY2x1ZGVkAAAMKHJpbmdfaW5kZXgEJHJpbmdfcGFnZQQ0cmluZ19wb3NpdGlvbgQkU3VzcGVuZGVkAAEFAAgoaWRlbnRpZmllciAgcG9zaXRpb24VCAIIKEFwcGVuZE9ubHkAAQUgTXV0YXRpbmcBBAIMNERlbGV0aW5nUmluZ3MAAQVcRGVsZXRpbmdPbmJvYXJkaW5nUXVldWUAAQUoRmluYWxpemluZwABBQAIKGlkZW50aWZpZXIgFHN0YWdlIQgCBDhGYWlsZWREaXNwYXRjaAAABBxyZXRyaWVzBAAIGHJlYXNvbikIFHVudGlsCAMMBAQgBJEDAQgGEQgGfQECICBJbmFjdGl2ZQABBTRDcmVhdGluZ0Fzc2V0AAEFQFhjbUZ1bmRzVHJhbnNmZXIAAQU4VmVyaWZ5aW5nRnVuZHMAAQUsRnVuZGluZ1BvdHMAAQVgU2NoZWR1bGluZ01vYlJ1bGVQYXlvdXRzAAEFWFNjaGVkdWxpbmdTY29yZVBheW91dHMAAQUkQ29tcGxldGVkAAEFAgggSW5hY3RpdmUAAQUkQ29tcGxldGVkAAEFAAgIaWQEEGluZm+tBgRJCAACFCxSZWdpc3RlcmluZwABBWBXYWl0aW5nRm9yRW50cm9weVRvQnVpbGQAAARAc3RhcnRlZF9hdF9yY19ibgQ4RHJhd2luZ1dpbm5lcnMAAAQcZW50cm9weSAwRGlzdHJpYnV0aW5nAAEFPENsZWFyaW5nU3RvcmFnZQABBQAQCGlkBExuZXh0X3BhcnRpY2lwYW50X2lkBBBpbmZvrQYYc3RhdHVzUQgDCCAAAwgABAMIUQEIABQUcHJpemUVA0xyZWdpc3RyYXRpb25fc3RhcnRzBFRyZWdpc3RyYXRpb25fZHVyYXRpb24ESHRvdGFsX3BhcnRpY2lwYW50cwQcd2lubmVyc8UCAAgYaGVhZGVy1QMoZXh0cmluc2ljc20DAgg0QWxsRXh0cmluc2ljcwABBTRPbmx5SW5oZXJlbnRzAAEFAAgYcHJlZml43QEYc3VmZml43QECDDhOb3RJbXBsZW1lbnRlZAABBSBOb3RGb3VuZAFxCBRDb2RlYwABBQckdQgCNBBDYWxsAAEFHFBheW1lbnQAAQUYRnV0dXJlAAEFFFN0YWxlAAEFIEJhZFByb29mAAEFREFuY2llbnRCaXJ0aEJsb2NrAAEFREV4aGF1c3RzUmVzb3VyY2VzAAEFGEN1c3RvbQEEMEJhZE1hbmRhdG9yeQABBUxNYW5kYXRvcnlWYWxpZGF0aW9uAAEFJEJhZFNpZ25lcgABBVRJbmRldGVybWluYXRlSW1wbGljaXQAAQU0VW5rbm93bk9yaWdpbgABBQIMMENhbm5vdExvb2t1cAABBUxOb1Vuc2lnbmVkVmFsaWRhdG9yAAEFGEN1c3RvbQEEAggcSW52YWxpZAF9CBxVbmtub3duAYEIB5UChQgDCNkBJASNCAAADBBva2F5FCxmYXRhbF9lcnJvchQYZXJyb3JzkQgCDBxJbkJsb2NrAAEFFExvY2FsAAEFIEV4dGVybmFsAAEFABQgcHJpb3JpdHkIIHJlcXVpcmVzbQMgcHJvdmlkZXNtAyRsb25nZXZpdHkIJHByb3BhZ2F0ZRQHnQiFCAMIJCgEpQgABqkIAAwYd2VpZ2h0GBRjbGFzczgscGFydGlhbF9mZWUIAAwgYmFzZV9mZWUIHGxlbl9mZWUITGFkanVzdGVkX3dlaWdodF9mZWUIBrUIAAg0aW5jbHVzaW9uX2ZlZbkIDHRpcAgE2QQAAhg0VW5pbXBsZW1lbnRlZAABBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEFTFdlaWdodE5vdENvbXB1dGFibGUAAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgABBTRBc3NldE5vdEZvdW5kAAEFKFVucm91dGFibGUAAQUHwQjFCAcYxQgHCMUIB3ECxQgCCCxVbnN1cHBvcnRlZAABBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEFBwDZCAIMFENoYWluAAEFHE5ldHdvcmsAAQUUTG9jYWwAAQUFAYQCEBxTcjI1NTE5AAAIJHNpZ25hdHVyZQkGGHNpZ25lciAcRWQyNTUxOQAACCRzaWduYXR1cmUJBhhzaWduZXIgOFNlY3AyNTZrMUVjZHNhAAAIJHNpZ25hdHVyZQ0GGHNpZ25lcuUIHE9uQ2hhaW4AAAwMd2hvIChibG9ja19oYXNoICxldmVudF9pbmRleAgG6QgEIAEQABwUcHJvb2btCDhkZWNyeXB0aW9uX2tledwcY2hhbm5lbNwgcHJpb3JpdHmRAyhudW1fdG9waWNzBBh0b3BpY3PxCBBkYXRhHQMCGEBOb1JlcG9ydGluZ1BoYXNlAAEFUFN0YXRlbWVudElzTm90U2lnbmVkAAEFQEludmFsaWRTaWduYXR1cmUAAQU0SW52YWxpZFRvcGljMAAACCBleHBlY3RlZNwYYWN0dWFs3ExBY2NvdW50SXNOb3RBUGxheWVyAAEFVFBsYXllcklzTm90UmVnaXN0ZXJlZAABBQfhB/kIABg8dXB3YXJkX21lc3NhZ2VzbQNMaG9yaXpvbnRhbF9tZXNzYWdlc9EDTG5ld192YWxpZGF0aW9uX2NvZGUdA2xwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMEOGhybXBfd2F0ZXJtYXJrBCRoZWFkX2RhdGEkB5ECOQMGOQMEOQMAAgwgQmFkUHJvb2YAAQUcTm9Qcm9vZgABBTRJbnRlcm5hbEVycm9yAAEFB+EHEQk=" -export default content - \ No newline at end of file diff --git a/packages/host-papp/.papi/descriptors/src/people_lite.ts b/packages/host-papp/.papi/descriptors/src/people_lite.ts deleted file mode 100644 index bbeb0873..00000000 --- a/packages/host-papp/.papi/descriptors/src/people_lite.ts +++ /dev/null @@ -1,12304 +0,0 @@ -import {StorageDescriptor, PlainDescriptor, TxDescriptor, RuntimeDescriptor, Enum, _Enum, GetEnum, ApisFromDef, QueryFromPalletsDef, TxFromPalletsDef, EventsFromPalletsDef, ErrorsFromPalletsDef, ConstFromPalletsDef, ViewFnsFromPalletsDef, SS58String, SizedHex, FixedSizeArray} from "polkadot-api"; - import type {I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, If3cj9t96ueeqn, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I4q39t5hn830vp, I1v7jbnil3tjns, I8jgj1nhcr2dg8, Ifn6q3equiq9qi, Ia3sb0vgvovhtg, Iav8k1edbj86k7, Itom7fk49o0c9, I4i91h98n3cv1b, I4iumukclgj8ej, Iqnbvitf7a7l3, I48i407regf59r, I6r5cbv8ttrb09, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, I2sr2hoa6imct2, I9bin2jc70qt6q, TransactionPaymentReleases, Icj0tssrh6ika3, I8arc778cv9pqq, I3qklfjubrljqh, If9iqq7i64mur8, Iag3f1hum3p4c8, I4v5g6i7bmt06o, I4s6jkha20aoh0, I84bhscllvv07n, I78s05f59eoi8b, If2801grpltbp8, Ia2lhg7l2hilo3, Ifi4da1gej1fri, Ifvgo9568rpmqc, I82jm9g7pufuel, Ic5m5lp1oioo8r, I6cs1itejju2vv, Icgljjb6j82uhn, Ib77b0fp1a6mjr, I5g2vv0ckl2m8b, Ifup3lg9ro8a0f, I5qfubnuvrnqn6, I8t3u2dv73ahbd, I7vlvrrl2pnbgk, Ie0rpl5bahldfk, XcmPalletVersionMigrationStage, I7e5oaj2qi4kl1, Ie849h3gncgvok, Iat62vud7hlod2, Ict03eedr8de9s, Ici7ejds60vj52, XcmVersionedLocation, Idh2ug6ou4a8og, Iejeo53sea6n4q, I53esa2ms463bk, Ib4jhb8tt3uung, Iag146hmjgqfgj, I8uo3fpd3bcc6f, I48e2fe747rjco, I9p9lq3rej5bhc, I8sp8i1c9u7kvv, I910puuahutflf, I4nfjdef0ibh44, I74af64m08r6as, Ic8ann3kre6vdm, I1j72qfgdejqsv, I60biiepd74113, I2skcsqibb3i2k, I4ekkp6f1d7a69, Ifpolrv9bn0ss8, Icq9999ubti4jr, I6vki5ip88t309, I5h2gdbrcdulu5, I4p5t2krb1gmvp, Id32895epm7otq, I14eopu9hl6hgk, Iaq1a4h34blh5u, Ieaqfchj8o5p3e, Ia11lg4mrmjqfg, Idevgv5mu1k9gt, Ic5ardbudan54b, I6n9krukma1mut, Ie6cl0ap8d265e, I9feps983hs1sf, I9jd27rnpm8ttv, I63ubv9qb76gl3, I2na29tt2afp0j, Ifip05kcrl65am, I644th47nna91b, I9u9nqhm3kqr8q, I191vhdj2skphj, Iavh3dqjok18o8, Idfgmv0r2plk6t, I5dmkj9ep3uuaq, I1v8hffmq0a2s2, Iesh4knl67dirc, Idrbto15rld189, I6lggg4mrl1u2s, I3nqube2n1nohj, Idodgrto60av5h, Id26d02t80vjh, I4009rejbekrdq, I81vbsdqasdsr1, I7odqmvebn62ca, Ic66kva37scc9l, I53g8q9761kkrn, I7hvvp2oeegqa0, Iaq2bjd3j738m9, I9lcj3313n9e9v, I6t8fqjt3u136v, I4pact7n2e9a0i, I2t447bb26t9i6, I831tj5voub6u0, I6cufgusp40k9i, I766emmc9ccni0, Ie1vuhuh0vpgrb, I6sjgjftjavcbd, I2l7r05e3266s4, I5eoome1iv99mc, I35mml84uvstml, I83hq8olm7phlp, Ianbabfvoj16rj, I6dk4nvven1i08, I3sean4dbblfft, I3n8fv9mo53kq5, I6ouflveob4eli, Ibuqgslo88n368, Iepbsvlk3qceij, In7a38730s6qs, If15el53dd76v9, I9s0ave7t0vnrk, I4fo08joqmcqnm, XcmV5Junctions, Iasb8k6ash5mjn, Idvob66qflhcgd, I7qcffr6se5g9, Iekve0i6djpd9f, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, I3u72uvpuo4qrt, Ial23jn8hp0aen, Ifpj261e8s63m3, I7d75gqfg6jh9c, Idcr6u6361oad9, I9svldsp29mh87, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, I46ohf9ad4t2nj, Iea5hvin03frku, Iu9seb88fh81e, I7t2thek61ghou, I61tdrsafr1vf3, Ibsk5g3rhm45pu, Icfoe9q8d4vs8f, Ibrfmvjrg4trnb, Iedih7t34maii9, I4e902qbfel1f1, Ie4met0joi8sv0, I1t8vq6a06ohhu, Icvt3pdunbinm7, I9ui3n41balr2q, I89sl7btgl24g2, I3u6g26k9kn96u, If1invp94rsjms, Ie5nc19gtiv5sv, Iald3dgvt1hjkb, Iurrhahet4gno, I5tamv2nk8bj8o, I8apq8e7c7qcpp, Id1e31ij0c35fv, Ic6vatc0h2tbq8, I5lh6k2tq92l6m, I72jcvr86rnvv8, I90c919drss29e, I9dpq5287dur8b, Ifccifqltb5obi, Iadtsfv699cq8b, Ialpmgmhr3gk5r, I4cbvqmqadhrea, I3sdol54kg5jaq, I8fougodaj6di6, I77dda7hps0u37, I81vt5eq60l4b6, Ib7tahn20bvsep, I3vh014cqgmrfd, I6k1inef986368, Ia5cotcvi888ln, I21jsa919m88fd, Iegif7m3upfe1k, I9kt8c221c83ln, Ic76kfh5ebqkpl, Icscpmubum33bq, I21d2olof7eb60, Ibgm4rnf22lal1, Ie68np0vpihith, I9bnv6lu0crf1q, Iauhjqifrdklq7, Ie1uso9m8rt5cf, Ic2uoe7jdksosp, I40pqum1mu8qg3, I1r4c2ghbtvjuc, I1lrb1j9ag11jt, I152bmabo1ja8r, I5gr18losjkfla, Ia1a97fvmufuk9, Ier9vl0psdeggp, I5rom81gl99ha6, I3lgodtanj1u5q, I7bfb7cb54ioch, Iant3bti5h6pr5, Ideaemvoneh309, I3d9o9d7epp66v, I6lqh1vgb4mcja, Iet0lhejv1ea1t, Ifbu3sk81n1s98, I8k3rnvpeeh4hv, Ibm3nepcfano8f, I1mbimc2g4f9c7, I85imvra134bvp, I6hk7temg1mga7, I2lbmfajhc5gdu, I2siheq6f2djrd, I2eb501t8s6hsq, Ianmuoljk2sk1u, I6neqijlncmft9, I2ig59mlqf9md7, Ic6cqd9g0t65v0, I5sv83ib1q5mod, Ia9mkdf6l44shb, I9l2s4klu0831o, I2ctrt5nqb8o7c, I711qahikocb1c, I6o1er683vod1j, Id6gojh30v9ib2, Ibk29mtr51rukj, Id9uqtigc0il3v, Ic68lsi7chpv5k, Iek0boln8pgnko, I452bkd71b385t, Ie83f0p0ke1f4u, Ib9nmpn9ru9aeh, Ie5l999tf7t2te, I6b6ng21g2eap6, Ia5eqng70q48q6, I79nh52dspn15s, I5p4kcd7d4mpq7, I6viutd279aov3, I6tuqjmsr5ahcq, Id7gcu75dd10kk, Ia56ucs8f4gubv, Id1vp19i5a7adv, Ic01glfot2319, Ibi23t489qjaej, I6a7ia4g91p320, I7iebj213rflmh, I1c6o7t4005obp, I666bl2fqjkejo, I3sgg3ifcuhgsi, I3os0pogm2iim9, I2t4r3qi2bbfq5, In8qsbu1v3duv, I9cpejm8q1n41i, Icbccs0ug47ilf, I48li8do1boqsk, I8cj8rnq5f1nol, Idnsos6tvi9tt6, I95p7g3tmk59ap, Ibl1gaa0rn2c67, Id8vsjdockv55e, I4s48t49obgv40, I1b497vgt5ie3v, I6jae6u05fbnsi, Ievhkup0angt51, Iagbfsso0n5e7i, I8dtsqbl6shss6, Ifpsbvfoe7erus, Isicv7jbqf8q2, Ic9lb0ksm6bqp9, I49vkvcrq1mpqd, I99srnbmesb7pd, Icpk5dvoekngbe, Iepoo00jurbs3c, I6vn2ukq88hmrf, I2vuilbucl2tir, I2onutgm9avq0n, I3c4r0hatvif1e, Iafscmv8tjf0ou, I4ov6e94l79mbg, Ib5ou59k6na5qv, I7qh4t1qniuepu, I9edk4gqb8qj54, I6gk1lo90mp8d9, I526v6vcah1gur, Ifd8dbgpm7srdt, Ifbug00rch8etj, I28tfrqrmts741, I1i6t85s8phv1c, Igmmsl9pnapid, I9sqknhnkp2m32, Ijgrep2ca50rk, Iasnonvq8v9o5g, I6sv4qujr95uct, I1tqpuolr7lnbt, Idjiu7vp8ovdab, I6mk90q9np5nf3, Ichkkipipv6vbf, If13aq7jdorcr5, Ibv24s7lkcbv1r, Iadkk9nq2cqqve, I5u969d5la0il0, I9cbgq5mcmbt3f, I8en8uvi5isgvj, I43mn70lup4q9c, I286qhrd3thf21, Iefn145htl05b6, I3kigttc60kr03, Icnkee0to4c5ac, I7ts20td7b1pmf, I7315hlp5liq47, I631cq2ecsn8vg, I6carn61qjeh6d, Id6g2uejluf2av, I24nmtkeq4rln8, I4oqb168b2d4er, Ibou4u1engb441, Id6nbvqoqdj4o2, I95iqep3b8snn9, Ifofu507b4ql2m, Ia82mnkmeo2rhc, I9rkcukfi09eph, I855j4i3kr8ko1, I3sflsrdvuq35i, Icbsekf57miplo, Idd7hd99u0ho0n, I100l07kaehdlp, I6gnbnvip5vvdi, I3q1cn45sp6et9, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, Id5fm4p8lj5qgi, I8tjvj9uq4b7hi, I3qt1hgg4djhgb, I4fooe9dun9o0t, I8vi83jdnuv7ad, I8td84k1e6i7l7, Ibthrs8djrs4ha, Iph9c4rn81ub2, TransactionPaymentEvent, Ier2cke86dqbr2, Ie86pdva84devd, Ibsq380ld6eu40, I2isv113mtlrp7, I7r4u2ebvv7606, Icqe266pmnr25o, I5hoiph0lqphp, I5k7oropl9ofc7, I48vagp1omigob, Ib5tst4ppem1g6, Ibn64edsrg3737, I83r9d02dh47j9, I22bm4d7re21j9, I3jnhifvaeuama, I8n1gia0lo42ok, I6gb0o7lqjfdjq, Idh36v6iegkmpq, I27hnueutmchbe, Iectm2em66uhao, I7q57goff3j72h, Ibe49veu9i9nro, I1rnkmiu7usb82, Iadvnek4gbu68j, I7jvog6mrt6b2r, Id7k54q1ita2p5, I51qnoi21es512, I5k7edfft48vsq, Ie598chmfqlqa, Iaeqj2ebnvkjqe, I4srakrmf0fspo, I39t01nnod9109, I6v8sm60vvkmk7, I1qmtmbe5so8r3, Ih99m6ehpcar7, Idgorhsbgdq2ap, I9ubb2kqevnu6t, I6ue0ck5fc3u44, I2hq50pu2kdjpo, I9acqruh7322g2, Idsqc7mhp6nnle, I137t1cld92pod, If95hivmqmkiku, I61d51nv4cou88, If8u5kl4h8070m, Ibmuil6p3vl83l, I7lul91g50ae87, Icl7nl1rfeog3i, Iasr6pj6shs0fl, I2uqmls7kcdnii, Idg69klialbkb8, I7r6b7145022pp, I30pg328m00nr3, Icmrn7bogp28cs, I7m9b5plj4h5ot, I9onhk772nfs4f, I3l6bnksrmt56r, Idh09k0l2pmdcg, I7uoiphbm0tj4r, I512p1n7qt24l8, I6s1nbislhk619, I3gghqnh2mj0is, I6iv852roh6t3h, I9oc2o6itbiopq, I5uv57c3fffoi9, Ibslgga81p36aa, I2kosejppk3jon, I1rvj4ubaplho0, Ia3uu7lqcc1q1i, I7crucfnonitkn, I7tmrp94r9sq4n, Idul53tft5reqc, I79le71ktscd50, I70ckf4r79j73, Id9b74nn3tchdg, Ian9q7t9erse0r, Id871khc9is0ck, Iep27ialq4a7o7, Iasu5jvoqr43mv, I1ujdbplbo9mv, I5qolde99acmd1, I8gtde5abn1g9a, I7vk784dpkt0sh, I2006ti8jidts7, I5rtkmhm2dng4u, I81tnet08pjf8d, Iquobi9ukq7tb, I4mj21qcksiuf3, I2ur0oeqg495j8, I8v2su1f60qoae, I1bhd210c3phjj, Idkb7nir4hamvl, Iep1lmt6q3s6r3, I1fac16213rie2, Ifjt77oc391o43, Itvt1jsipv0lc, Ick3mveut33f44, I719lqkkbtikbl, Ie4intrc3n8jfu, I2rg5btjrsqec0, Ibdqerrooruuq9, I8u2ba9jeiu6q0, I7ieadb293k6b4, I86ooiomatht8n, I7v1eea9s3tjf6, Ifcon2ngg4leli, I7luomlm0cts8l, I8gfuga4as8uuv, I53pb13fh9bdtb, I5eoknm3d4b0hp, I1267r4okm030g, I1d3k986qbgsge, I7v53d8lg25u6e, Ie732hi40q3bng, I4auq2rk2vmnof, I36d2sa03ne4gv, Id0mmcnagcakpt, I3fn79iu085nho, I1qepegjhn0439, I2p1svr0ek31rn, I3g1h0napekm89, Ib4r095rdf5mqu, I816g8dafh3n9m, I5rguq5hs7ae5g, Id0n15ml7mlce1, I95dvhl27mlrti, I6mojmjujt2q9u, I3j43dj5855fif, I9m7e67l1rvair, I2fsu027d9jn8p, I1858d79avs8nu, I13i6a99rj37i4, I4dge44jia159s, I7uvflbq4g7rn, Icpl0grufrj09l, Ibi26id9j1t520, If82rqk1ehcsot, Ieitag1fl7hkds, Ie060ubkeme5vs, Inci5ucc4j6it, Iat4ai9vs8l9k5, I58bu3hm7657hm, Icc0fkkhtd78sc, Ia0v5qonnbfrul, I9vf1so75dnrom, I9lf1r3fch8ino, I2g1s4krv9s4p2, Ickpn0png35631, I3ns5kg6jo268n, I5t3lr0t9e1sk, I7hu7hl7r35nrm, Idpufnltgsuodp, Ibhe0l6jcu2ska, I4c20l83g9496a, I4gp88defd7an, Id113tpicu8sh3, I6ceb7pmur4hki, Ie2d9d2u1qa7ro, I5kek6hgenovr0, I91tbphb2dk7gn, I5509mqtnio180, Ifojd05k7ogo8n, I2h93i19beq4qk, I4lmgf1qe39res, Igvk3mrc51o9l, I41rd0clbf4u3l, Ieo7gfiinkohj8, I7055fe1dtfso8, Iflaqn0or9nfpj, Ib248pp8oe1coj, I6os196hd8lgc2, I71gd3i0mgtnp1, I94co7vj7h6bo, If1co0pilmi7oq, Iae74gjak1qibn, I3escdojpj0551, I5o0s7c8q1cc9b, Icjkr35j4tmg7k, Idj13i7adlomht, I8pd5n1lppndg2, I8ktb7n3252jn5, I3rc9953c1unod, I3qgd61cgli6cp, I36bcffk2387dv, I1e07dgbaqd1sq, Idnnbndsjjeqqs, I4vcvo9od6afmt, I5r8t4iaend96p, I5iupade5ag2dp, I8dt2g2hcrgh36, Ia76qmhhg4jvb9, Iaug04qjhbli00, Iuvt54ei4cehc, I6ngmnhrhffg3o, I4mhu1059shhs0, I940ulmo4j2d84, Icouc1975ac8ae, Ib2m42ffigj3u7, Ib3125ra6v0rq0, I4dumqe8b5q0ce, I5mjfroiq2c71i, Ifu2j71jv4roq4, I81gtj1f3ennke, Ibul94l5l6rt51, I49gv5a5vl0e9, I78qr63roofevv, Iaaqq5jevtahm8, I6052turo9tavh, I35p85j063s0il, Iemk0s5gdc9ruv, I1v6u80pcf53ne, Ieuemnllefri8h, Iavc33atjrmdmp, I596b7bbfu4tap, I4arjljr6dpflb, Ia4n949ohqh8lm, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, I4gil44d08grh, I7u915mvkdsb08, Ie7mmsj6dufc7j, If7uv525tdvv7a, I2an1fs2eiebjp, TransactionValidityTransactionSource, I9ask1o4tfvcvs, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, Iftvbctbo05fu4, XcmVersionedXcm, Ic0c3req3mlc1l, XcmVersionedAssetId, I7ocn4njqde3v5, Iek7ha36da9mf5, Ieh6nis3hdbtgi, Ico18ks790i2bl, I815pbp5omtss, Ib808ejar4brae, Ic1d4u2opv3fst, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, I3ju6ot8lfmk90, Id3vovj0ihlrsb, I1rmvc8k7ssl0, I4rnuci7kia2r1, I6k0juar2doko8, Icbb3ruvdvu6qp, Ied6o1m0g5iajq, I5pvq44l06a3og} from "./common-types"; - import { toBinary } from "./common" - - const descriptorValues = import("./descriptors").then(module => module["People_lite"]); - const metadataTypes = import("./metadataTypes").then( - module => toBinary('default' in module ? module.default : module) - ); - - -type AnonymousEnum = T & { - __anonymous: true -} - -type MyTuple = [T, ...T[]] - -type SeparateUndefined = undefined extends T - ? undefined | Exclude - : T - -type Anonymize = SeparateUndefined< - T extends - | string - | number - | bigint - | boolean - | void - | undefined - | null - | symbol - | Uint8Array - | Enum - ? T - : T extends AnonymousEnum - ? Enum - : T extends MyTuple - ? { - [K in keyof T]: T[K] - } - : T extends [] - ? [] - : T extends FixedSizeArray - ? number extends L - ? Array - : FixedSizeArray - : { - [K in keyof T & string]: T[K] - } -> - -type IStorage = {System: { - -/** - * The full account information for a particular account ID. - */ -Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * Total extrinsics count for the current block. - */ -ExtrinsicCount: StorageDescriptor<[], number, true, never>, - - -/** - * Whether all inherents have been applied. - */ -InherentsApplied: StorageDescriptor<[], boolean, false, never>, - - -/** - * The current weight for the block. - */ -BlockWeight: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Total length (in bytes) for all extrinsics put together, for the current block. - */ -AllExtrinsicsLen: StorageDescriptor<[], number, true, never>, - - -/** - * Map of block numbers to block hashes. - */ -BlockHash: StorageDescriptor<[Key: number], SizedHex<32>, false, never>, - - -/** - * Extrinsics data for the current block (maps an extrinsic's index to its data). - */ -ExtrinsicData: StorageDescriptor<[Key: number], Uint8Array, false, never>, - - -/** - * The current block number being processed. Set by `execute_block`. - */ -Number: StorageDescriptor<[], number, false, never>, - - -/** - * Hash of the previous block. - */ -ParentHash: StorageDescriptor<[], SizedHex<32>, false, never>, - - -/** - * Digest of the current block, also part of the block header. - */ -Digest: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Events deposited for the current block. - * - * NOTE: The item is unbound and should therefore never be read on chain. - * It could otherwise inflate the PoV size of a block. - * - * Events have a large in-memory size. Box the events to not go out-of-memory - * just in case someone still reads them from within the runtime. - */ -Events: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The number of events in the `Events` list. - */ -EventCount: StorageDescriptor<[], number, false, never>, - - -/** - * Mapping between a topic (represented by T::Hash) and a vector of indexes - * of events in the `>` list. - * - * All topic vectors have deterministic storage locations depending on the topic. This - * allows light-clients to leverage the changes trie storage tracking mechanism and - * in case of changes fetch the list of events of interest. - * - * The value has the type `(BlockNumberFor, EventIndex)` because if we used only just - * the `EventIndex` then in case if the topic has the same contents on the next block - * no notification will be triggered thus the event might be lost. - */ -EventTopics: StorageDescriptor<[Key: SizedHex<32>], Anonymize, false, never>, - - -/** - * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. - */ -LastRuntimeUpgrade: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * True if we have upgraded so that `type RefCount` is `u32`. False (default) if not. - */ -UpgradedToU32RefCount: StorageDescriptor<[], boolean, false, never>, - - -/** - * True if we have upgraded so that AccountInfo contains three types of `RefCount`. False - * (default) if not. - */ -UpgradedToTripleRefCount: StorageDescriptor<[], boolean, false, never>, - - -/** - * The execution phase of the block. - */ -ExecutionPhase: StorageDescriptor<[], Phase, true, never>, - - -/** - * `Some` if a code upgrade has been authorized. - */ -AuthorizedUpgrade: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The weight reclaimed for the extrinsic. - * - * This information is available until the end of the extrinsic execution. - * More precisely this information is removed in `note_applied_extrinsic`. - * - * Logic doing some post dispatch weight reduction must update this storage to avoid duplicate - * reduction. - */ -ExtrinsicWeightReclaimed: StorageDescriptor<[], Anonymize, false, never>}, -ParachainSystem: { - -/** - * Latest included block descendants the runtime accepted. In other words, these are - * ancestors of the currently executing block which have not been included in the observed - * relay-chain state. - * - * The segment length is limited by the capacity returned from the [`ConsensusHook`] configured - * in the pallet. - */ -UnincludedSegment: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Storage field that keeps track of bandwidth used by the unincluded segment along with the - * latest HRMP watermark. Used for limiting the acceptance of new blocks with - * respect to relay chain constraints. - */ -AggregatedUnincludedSegment: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * In case of a scheduled upgrade, this storage field contains the validation code to be - * applied. - * - * As soon as the relay chain gives us the go-ahead signal, we will overwrite the - * [`:code`][sp_core::storage::well_known_keys::CODE] which will result the next block process - * with the new validation code. This concludes the upgrade process. - */ -PendingValidationCode: StorageDescriptor<[], Uint8Array, false, never>, - - -/** - * Validation code that is set by the parachain and is to be communicated to collator and - * consequently the relay-chain. - * - * This will be cleared in `on_initialize` of each new block if no other pallet already set - * the value. - */ -NewValidationCode: StorageDescriptor<[], Uint8Array, true, never>, - - -/** - * The [`PersistedValidationData`] set for this block. - * - * This value is expected to be set only once by the [`Pallet::set_validation_data`] inherent. - */ -ValidationData: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * Were the validation data set to notify the relay chain? - */ -DidSetValidationCode: StorageDescriptor<[], boolean, false, never>, - - -/** - * The relay chain block number associated with the last parachain block. - * - * This is updated in `on_finalize`. - */ -LastRelayChainBlockNumber: StorageDescriptor<[], number, false, never>, - - -/** - * An option which indicates if the relay-chain restricts signalling a validation code upgrade. - * In other words, if this is `Some` and [`NewValidationCode`] is `Some` then the produced - * candidate will be invalid. - * - * This storage item is a mirror of the corresponding value for the current parachain from the - * relay-chain. This value is ephemeral which means it doesn't hit the storage. This value is - * set after the inherent. - */ -UpgradeRestrictionSignal: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Optional upgrade go-ahead signal from the relay-chain. - * - * This storage item is a mirror of the corresponding value for the current parachain from the - * relay-chain. This value is ephemeral which means it doesn't hit the storage. This value is - * set after the inherent. - */ -UpgradeGoAhead: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The state proof for the last relay parent block. - * - * This field is meant to be updated each block with the validation data inherent. Therefore, - * before processing of the inherent, e.g. in `on_initialize` this data may be stale. - * - * This data is also absent from the genesis. - */ -RelayStateProof: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The snapshot of some state related to messaging relevant to the current parachain as per - * the relay parent. - * - * This field is meant to be updated each block with the validation data inherent. Therefore, - * before processing of the inherent, e.g. in `on_initialize` this data may be stale. - * - * This data is also absent from the genesis. - */ -RelevantMessagingState: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The parachain host configuration that was obtained from the relay parent. - * - * This field is meant to be updated each block with the validation data inherent. Therefore, - * before processing of the inherent, e.g. in `on_initialize` this data may be stale. - * - * This data is also absent from the genesis. - */ -HostConfiguration: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The last downward message queue chain head we have observed. - * - * This value is loaded before and saved after processing inbound downward messages carried - * by the system inherent. - */ -LastDmqMqcHead: StorageDescriptor<[], SizedHex<32>, false, never>, - - -/** - * The message queue chain heads we have observed per each channel incoming channel. - * - * This value is loaded before and saved after processing inbound downward messages carried - * by the system inherent. - */ -LastHrmpMqcHeads: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Number of downward messages processed in a block. - * - * This will be cleared in `on_initialize` of each new block. - */ -ProcessedDownwardMessages: StorageDescriptor<[], number, false, never>, - - -/** - * The last processed downward message. - * - * We need to keep track of this to filter the messages that have been already processed. - */ -LastProcessedDownwardMessage: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * HRMP watermark that was set in a block. - */ -HrmpWatermark: StorageDescriptor<[], number, false, never>, - - -/** - * The last processed HRMP message. - * - * We need to keep track of this to filter the messages that have been already processed. - */ -LastProcessedHrmpMessage: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * HRMP messages that were sent in a block. - * - * This will be cleared in `on_initialize` of each new block. - */ -HrmpOutboundMessages: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Upward messages that were sent in a block. - * - * This will be cleared in `on_initialize` for each new block. - */ -UpwardMessages: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Upward messages that are still pending and not yet sent to the relay chain. - */ -PendingUpwardMessages: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Upward signals that are still pending and not yet sent to the relay chain. - * - * This will be cleared in `on_finalize` for each block. - */ -PendingUpwardSignals: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The factor to multiply the base delivery fee by for UMP. - */ -UpwardDeliveryFeeFactor: StorageDescriptor<[], bigint, false, never>, - - -/** - * The number of HRMP messages we observed in `on_initialize` and thus used that number for - * announcing the weight of `on_initialize` and `on_finalize`. - */ -AnnouncedHrmpMessagesPerCandidate: StorageDescriptor<[], number, false, never>, - - -/** - * The weight we reserve at the beginning of the block for processing XCMP messages. This - * overrides the amount set in the Config trait. - */ -ReservedXcmpWeightOverride: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The weight we reserve at the beginning of the block for processing DMP messages. This - * overrides the amount set in the Config trait. - */ -ReservedDmpWeightOverride: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * A custom head data that should be returned as result of `validate_block`. - * - * See `Pallet::set_custom_validation_head_data` for more information. - */ -CustomValidationHeadData: StorageDescriptor<[], Uint8Array, true, never>}, -Timestamp: { - -/** - * The current time for the current block. - */ -Now: StorageDescriptor<[], bigint, false, never>, - - -/** - * Whether the timestamp has been updated in this block. - * - * This value is updated to `true` upon successful submission of a timestamp by a node. - * It is then checked at the end of each block execution in the `on_finalize` hook. - */ -DidUpdate: StorageDescriptor<[], boolean, false, never>}, -ParachainInfo: { - -/** - - */ -ParachainId: StorageDescriptor<[], number, false, never>}, -Balances: { - -/** - * The total units issued in the system. - */ -TotalIssuance: StorageDescriptor<[], bigint, false, never>, - - -/** - * The total units of outstanding deactivated balance in the system. - */ -InactiveIssuance: StorageDescriptor<[], bigint, false, never>, - - -/** - * The Balances pallet example of storing the balance of an account. - * - * # Example - * - * ```nocompile - * impl pallet_balances::Config for Runtime { - * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> - * } - * ``` - * - * You can also store the balance of an account in the `System` pallet. - * - * # Example - * - * ```nocompile - * impl pallet_balances::Config for Runtime { - * type AccountStore = System - * } - * ``` - * - * But this comes with tradeoffs, storing account balances in the system pallet stores - * `frame_system` data alongside the account data contrary to storing account balances in the - * `Balances` pallet, which uses a `StorageMap` to store balances data only. - * NOTE: This is only used in the case that this pallet is used to store balances. - */ -Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * Any liquidity locks on some account balances. - * NOTE: Should only be accessed when setting, changing and freeing a lock. - * - * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` - */ -Locks: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * Named reserves on some account balances. - * - * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` - */ -Reserves: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * Holds on account balances. - */ -Holds: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * Freeze locks on account balances. - */ -Freezes: StorageDescriptor<[Key: SS58String], Anonymize, false, never>}, -TransactionPayment: { - -/** - - */ -NextFeeMultiplier: StorageDescriptor<[], bigint, false, never>, - - -/** - - */ -StorageVersion: StorageDescriptor<[], TransactionPaymentReleases, false, never>, - - -/** - * The `OnChargeTransaction` stores the withdrawn tx fee here. - * - * Use `withdraw_txfee` and `remaining_txfee` to access from outside the crate. - */ -TxPaymentCredit: StorageDescriptor<[], bigint, true, never>}, -OriginRestriction: { - -/** - * The current usage for each entity. - */ -Usages: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>}, -Assets: { - -/** - * Details of an asset. - */ -Asset: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * The holdings of a specific account for a specific asset. - */ -Account: StorageDescriptor, Anonymize, true, never>, - - -/** - * Approved balance transfers. First balance is the amount approved for transfer. Second - * is the amount of `T::Currency` reserved for storing this. - * First key is the asset ID, second key is the owner and third key is the delegate. - */ -Approvals: StorageDescriptor, Anonymize, true, never>, - - -/** - * Metadata of an asset. - */ -Metadata: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>, - - -/** - * Maps an asset to a list of its configured reserve information. - */ -Reserves: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>, - - -/** - * The asset ID enforced for the next asset creation, if any present. Otherwise, this storage - * item has no effect. - * - * This can be useful for setting up constraints for IDs of the new assets. For example, by - * providing an initial [`NextAssetId`] and using the [`crate::AutoIncAssetId`] callback, an - * auto-increment model can be applied to all new asset IDs. - * - * The initial next asset ID can be set using the [`GenesisConfig`] or the - * [SetNextAssetId](`migration::next_asset_id::SetNextAssetId`) migration. - */ -NextAssetId: StorageDescriptor<[], Anonymize, true, never>}, -AssetsHolder: { - -/** - * A map that stores holds applied on an account for a given AssetId. - */ -Holds: StorageDescriptor, Anonymize, false, never>, - - -/** - * A map that stores the current total balance on hold for every account on a given AssetId. - */ -BalancesOnHold: StorageDescriptor, bigint, true, never>}, -AssetRate: { - -/** - * Maps an asset to its fixed point representation in the native balance. - * - * E.g. `native_amount = asset_amount * ConversionRateToNative::::get(asset_kind)` - */ -ConversionRateToNative: StorageDescriptor<[Key: Anonymize], bigint, true, never>}, -Authorship: { - -/** - * Author of current block. - */ -Author: StorageDescriptor<[], SS58String, true, never>}, -CollatorSelection: { - -/** - * The invulnerable, permissioned collators. This list must be sorted. - */ -Invulnerables: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The (community, limited) collation candidates. `Candidates` and `Invulnerables` should be - * mutually exclusive. - * - * This list is sorted in ascending order by deposit and when the deposits are equal, the least - * recently updated is considered greater. - */ -CandidateList: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Last block authored by collator. - */ -LastAuthoredBlock: StorageDescriptor<[Key: SS58String], number, false, never>, - - -/** - * Desired number of candidates. - * - * This should ideally always be less than [`Config::MaxCandidates`] for weights to be correct. - */ -DesiredCandidates: StorageDescriptor<[], number, false, never>, - - -/** - * Fixed amount to deposit to become a collator. - * - * When a collator calls `leave_intent` they immediately receive the deposit back. - */ -CandidacyBond: StorageDescriptor<[], bigint, false, never>}, -Session: { - -/** - * The current set of validators. - */ -Validators: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Current index of the session. - */ -CurrentIndex: StorageDescriptor<[], number, false, never>, - - -/** - * True if the underlying economic identities or weighting behind the validators - * has changed in the queued validator set. - */ -QueuedChanged: StorageDescriptor<[], boolean, false, never>, - - -/** - * The queued keys for the next session. When the next session begins, these keys - * will be used to determine the validator's session keys. - */ -QueuedKeys: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Indices of disabled validators. - * - * The vec is always kept sorted so that we can find whether a given validator is - * disabled using binary search. It gets cleared when `on_session_ending` returns - * a new set of identities. - */ -DisabledValidators: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The next session keys for a validator. - */ -NextKeys: StorageDescriptor<[Key: SS58String], SizedHex<32>, true, never>, - - -/** - * The owner of a key. The key is the `KeyTypeId` + the encoded key. - */ -KeyOwner: StorageDescriptor<[Key: Anonymize], SS58String, true, never>}, -Aura: { - -/** - * The current authority set. - */ -Authorities: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The current slot of this block. - * - * This will be set in `on_initialize`. - */ -CurrentSlot: StorageDescriptor<[], bigint, false, never>}, -AuraExt: { - -/** - * Serves as cache for the authorities. - * - * The authorities in AuRa are overwritten in `on_initialize` when we switch to a new session, - * but we require the old authorities to verify the seal when validating a PoV. This will - * always be updated to the latest AuRa authorities in `on_finalize`. - */ -Authorities: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Current relay chain slot paired with a number of authored blocks. - * - * This is updated in [`FixedVelocityConsensusHook::on_state_proof`] with the current relay - * chain slot as provided by the relay chain state proof. - */ -RelaySlotInfo: StorageDescriptor<[], Anonymize, true, never>}, -XcmpQueue: { - -/** - * The suspended inbound XCMP channels. All others are not suspended. - * - * This is a `StorageValue` instead of a `StorageMap` since we expect multiple reads per block - * to different keys with a one byte payload. The access to `BoundedBTreeSet` will be cached - * within the block and therefore only included once in the proof size. - * - * NOTE: The PoV benchmarking cannot know this and will over-estimate, but the actual proof - * will be smaller. - */ -InboundXcmpSuspended: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The non-empty XCMP channels in order of becoming non-empty, and the index of the first - * and last outbound message. If the two indices are equal, then it indicates an empty - * queue and there must be a non-`Ok` `OutboundStatus`. We assume queues grow no greater - * than 65535 items. Queue indices for normal messages begin at one; zero is reserved in - * case of the need to send a high-priority signal message this block. - * The bool is true if there is a signal message waiting to be sent. - */ -OutboundXcmpStatus: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The messages outbound in a given XCMP channel. - */ -OutboundXcmpMessages: StorageDescriptor, Uint8Array, false, never>, - - -/** - * Any signal messages waiting to be sent. - */ -SignalMessages: StorageDescriptor<[Key: number], Uint8Array, false, never>, - - -/** - * The configuration which controls the dynamics of the outbound queue. - */ -QueueConfig: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Whether or not the XCMP queue is suspended from executing incoming XCMs or not. - */ -QueueSuspended: StorageDescriptor<[], boolean, false, never>, - - -/** - * The factor to multiply the base delivery fee by. - */ -DeliveryFeeFactor: StorageDescriptor<[Key: number], bigint, false, never>}, -PolkadotXcm: { - -/** - * The latest available query index. - */ -QueryCounter: StorageDescriptor<[], bigint, false, never>, - - -/** - * The ongoing queries. - */ -Queries: StorageDescriptor<[Key: bigint], Anonymize, true, never>, - - -/** - * The existing asset traps. - * - * Key is the blake2 256 hash of (origin, versioned `Assets`) pair. Value is the number of - * times this pair has been trapped (usually just 1 if it exists at all). - */ -AssetTraps: StorageDescriptor<[Key: SizedHex<32>], number, false, never>, - - -/** - * Default version to encode XCM when latest version of destination is unknown. If `None`, - * then the destinations whose XCM version is unknown are considered unreachable. - */ -SafeXcmVersion: StorageDescriptor<[], number, true, never>, - - -/** - * The Latest versions that we know various locations support. - */ -SupportedVersion: StorageDescriptor, number, true, never>, - - -/** - * All locations that we have requested version notifications from. - */ -VersionNotifiers: StorageDescriptor, bigint, true, never>, - - -/** - * The target locations that are subscribed to our version changes, as well as the most recent - * of our versions we informed them of. - */ -VersionNotifyTargets: StorageDescriptor, Anonymize, true, never>, - - -/** - * Destinations whose latest XCM version we would like to know. Duplicates not allowed, and - * the `u32` counter is the number of times that a send to the destination has been attempted, - * which is used as a prioritization. - */ -VersionDiscoveryQueue: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The current migration's stage, if any. - */ -CurrentMigration: StorageDescriptor<[], XcmPalletVersionMigrationStage, true, never>, - - -/** - * Fungible assets which we know are locked on a remote chain. - */ -RemoteLockedFungibles: StorageDescriptor, Anonymize, true, never>, - - -/** - * Fungible assets which we know are locked on this chain. - */ -LockedFungibles: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Global suspension state of the XCM executor. - */ -XcmExecutionSuspended: StorageDescriptor<[], boolean, false, never>, - - -/** - * Whether or not incoming XCMs (both executed locally and received) should be recorded. - * Only one XCM program will be recorded at a time. - * This is meant to be used in runtime APIs, and it's advised it stays false - * for all other use cases, so as to not degrade regular performance. - * - * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] - * implementation in the XCM executor configuration. - */ -ShouldRecordXcm: StorageDescriptor<[], boolean, false, never>, - - -/** - * If [`ShouldRecordXcm`] is set to true, then the last XCM program executed locally - * will be stored here. - * Runtime APIs can fetch the XCM that was executed by accessing this value. - * - * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] - * implementation in the XCM executor configuration. - */ -RecordedXcm: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * Map of authorized aliasers of local origins. Each local location can authorize a list of - * other locations to alias into it. Each aliaser is only valid until its inner `expiry` - * block number. - */ -AuthorizedAliases: StorageDescriptor<[Key: XcmVersionedLocation], Anonymize, true, never>}, -MessageQueue: { - -/** - * The index of the first and last (non-empty) pages. - */ -BookStateFor: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>, - - -/** - * The origin at which we should begin servicing. - */ -ServiceHead: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The map of page indices to pages. - */ -Pages: StorageDescriptor, Anonymize, true, never>}, -Multisig: { - -/** - * The set of open multisig operations. - */ -Multisigs: StorageDescriptor, Anonymize, true, never>}, -Sudo: { - -/** - * The `AccountId` of the sudo key. - */ -Key: StorageDescriptor<[], SS58String, true, never>}, -Proxy: { - -/** - * The set of account proxies. Maps the account which has delegated to the accounts - * which are being delegated to, together with the amount held on deposit. - */ -Proxies: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * The announcements made by the proxy (key). - */ -Announcements: StorageDescriptor<[Key: SS58String], Anonymize, false, never>}, -Identity: { - -/** - * Information that is pertinent to identify the entity behind an account. First item is the - * registration, second is the account's primary username. - * - * TWOX-NOTE: OK ― `AccountId` is a secure hash. - */ -IdentityOf: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Identifies the primary username of an account. - */ -UsernameOf: StorageDescriptor<[Key: SS58String], Uint8Array, true, never>, - - -/** - * The super-identity of an alternative "sub" identity together with its name, within that - * context. If the account is not some other account's sub-identity, then just `None`. - */ -SuperOf: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Alternative "sub" identities of this account. - * - * The first item is the deposit, the second is a vector of the accounts. - * - * TWOX-NOTE: OK ― `AccountId` is a secure hash. - */ -SubsOf: StorageDescriptor<[Key: SS58String], Anonymize, false, never>, - - -/** - * The set of registrars. Not expected to get very big as can only be added through a - * special origin (likely a council motion). - * - * The index into this can be cast to `RegistrarIndex` to get a valid value. - */ -Registrars: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * A map of the accounts who are authorized to grant usernames. - */ -AuthorityOf: StorageDescriptor<[Key: Uint8Array], Anonymize, true, never>, - - -/** - * Reverse lookup from `username` to the `AccountId` that has registered it and the provider of - * the username. The `owner` value should be a key in the `UsernameOf` map, but it may not if - * the user has cleared their username or it has been removed. - * - * Multiple usernames may map to the same `AccountId`, but `UsernameOf` will only map to one - * primary username. - */ -UsernameInfoOf: StorageDescriptor<[Key: Uint8Array], Anonymize, true, never>, - - -/** - * Usernames that an authority has granted, but that the account controller has not confirmed - * that they want it. - * - * Used primarily in cases where the `AccountId` cannot provide a signature - * because they are a pure proxy, multisig, etc. In order to confirm it, they should call - * [accept_username](`Call::accept_username`). - * - * First tuple item is the account and second is the acceptance deadline. - */ -PendingUsernames: StorageDescriptor<[Key: Uint8Array], Anonymize, true, never>, - - -/** - * Usernames for which the authority that granted them has started the removal process by - * unbinding them. Each unbinding username maps to its grace period expiry, which is the first - * block in which the username could be deleted through a - * [remove_username](`Call::remove_username`) call. - */ -UnbindingUsernames: StorageDescriptor<[Key: Uint8Array], number, true, never>, - - -/** - * The metadata associated with a person through their contextual alias for the purposes of - * registering identity information. - */ -PersonIdentities: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>, - - -/** - * Reverse lookup of accounts controlled by a person through a contextual alias. All people - * that registered an identity must also associate an on-chain account to it. - */ -AccountToAlias: StorageDescriptor<[Key: SS58String], SizedHex<32>, true, never>, - - -/** - * Stores pending reports of usernames. - */ -PendingUsernameReports: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>}, -People: { - -/** - * The current individuals we recognise, but not necessarily yet included in a ring. - * - * Look-up from the crypto (public) key to the immutable ID of the individual (`PersonalId`). A - * person can have two different entries in this map if they queued a key migration which - * hasn't been enacted yet. - */ -Keys: StorageDescriptor<[Key: SizedHex<32>], bigint, true, never>, - - -/** - * Counter for the related counted storage map - */ -CounterForKeys: StorageDescriptor<[], number, false, never>, - - -/** - * The current individuals we recognise, but not necessarily yet included in a ring. - * - * Immutable ID of the individual (`PersonalId`) to information about their key and status. - */ -People: StorageDescriptor<[Key: bigint], Anonymize, true, never>, - - -/** - * Conversion of a contextual alias to an account ID. - */ -AliasToAccount: StorageDescriptor<[Key: Anonymize], SS58String, true, never>, - - -/** - * Conversion of an account ID to a contextual alias. - */ -AccountToAlias: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Association of an account ID to a personal ID. - * - * Managed with `set_personal_id_account` and `unset_personal_id_account`. - * Reverse lookup is inside `People` storage, inside the record. - */ -AccountToPersonalId: StorageDescriptor<[Key: SS58String], bigint, true, never>, - - -/** - * The next free and never reserved personal ID. - */ -NextPersonalId: StorageDescriptor<[], bigint, false, never>, - - -/** - * Whether the people collection has been created. - */ -PeopleCollectionCreated: StorageDescriptor<[], boolean, false, never>, - - -/** - * Candidates' reserved identities which we track. - */ -ReservedPersonalId: StorageDescriptor<[Key: bigint], null, true, never>}, -MobRule: { - -/** - * The voting records of all aliases. - */ -Credits: StorageDescriptor<[Key: SizedHex<32>], Anonymize, false, never>, - - -/** - * The vote penalties of users and their starting moment. Voters with penalties cannot vote in - * contempt until the penalty expires and is removed. - */ -VotingPenalties: StorageDescriptor<[Key: SizedHex<32>], number, true, never>, - - -/** - * The accumulated points of all aliases, during each funding round. The points accumulated - * during round `N` can be redeemed for rewards only during round `N + 1`. - */ -VotingPoints: StorageDescriptor, number, false, never>, - - -/** - * All votes cast, segregated by case and voter. - */ -Votes: StorageDescriptor, Anonymize, true, never>, - - -/** - * The number of cases, open or recently closed, stored in the pallet. - */ -CaseCount: StorageDescriptor<[], number, false, never>, - - -/** - * The open cases recorded in the pallet. These cases can still be voted on. - */ -OpenCases: StorageDescriptor<[Key: number], Anonymize, true, never>, - - -/** - * The ripe cases recorded in the pallet. The voting has concluded on these cases and a verdict - * has been reached, but they cannot be removed yet in order to allow people to claim their - * votes. - */ -RipeCases: StorageDescriptor<[Key: number], Anonymize, true, never>, - - -/** - * The done cases recorded in the pallet. These cases are obsolete and can be removed from - * storage. - */ -DoneCases: StorageDescriptor<[Key: number], Anonymize, true, never>, - - -/** - * The number of points accumulated through correct votes during the current payout round. This - * amount is going to determine the point/reward exchange rate of the next reward payout round. - */ -AccumulatedPoints: StorageDescriptor<[], bigint, false, never>, - - -/** - * Describes the parameters of the current payout round. - */ -PayoutDistribution: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * Describes the schedules of the payout rounds. - */ -RoundSchedules: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The timestamp, in seconds, of the moment enough active voters were detected and voting was - * enabled. This value will not be present if there are too few active voters. - */ -ActiveSince: StorageDescriptor<[], bigint, true, never>}, -ProofOfInk: { - -/** - * The current personal identities which are going through the proof-of-ink process. - */ -Candidates: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * The personal identities which we track; all which have been recognized through proof-of-ink - * are in here. - */ -People: StorageDescriptor<[Key: bigint], Anonymize, true, never>, - - -/** - * The tickets stored on-chain ready to be used to refer candidates. - */ -ReferralTickets: StorageDescriptor<[Key: bigint], Anonymize, true, never>, - - -/** - * The current design families we recognise. - */ -DesignFamilies: StorageDescriptor<[Key: number], Anonymize, true, never>, - - -/** - * The committed designs which are no longer available. - */ -CommittedDesigns: StorageDescriptor, Anonymize, true, never>, - - -/** - * The number of judgements currently ongoing. - */ -AllocationCount: StorageDescriptor<[], number, false, never>, - - -/** - * The configuration. - */ -Configuration: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Number of invitations available to distribute for an account. - */ -AvailableInvites: StorageDescriptor<[Key: SS58String], number, false, never>, - - -/** - * Pending invitations for each inviter (an account that invites others). - * - * If the key `(inviter, ticket)` exists, then the ticket is currently a pending invite. - */ -PendingInvites: StorageDescriptor, null, true, never>, - - -/** - * The values of the reimbursement awarded to referrers, along with how many of each value - * should be awarded. These values are stored in reverse order of their priority, so the last - * value in the list will be the first one to be used by the reimbursement system. - * - * Storage item name keeps the legacy prefix for storage readability compatibility. - */ -ReferrerReimbursementValues: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The values of the reimbursement awarded to referred people, along with how many of each - * value should be awarded. These values are stored in reverse order of their priority, so the - * last value in the list will be the first one to be used by the reimbursement system. - * - * Storage item name keeps the legacy prefix for storage readability compatibility. - */ -ReferredReimbursementValues: StorageDescriptor<[], Anonymize, true, never>}, -Game: { - -/** - * The overriden phase durations for the testnet. - */ -TestnetStoredPhaseDurations: StorageDescriptor<[], Anonymize, true, never>, - - -/** - - */ -Nfts: StorageDescriptor, null, true, never>, - - -/** - * All the player with zero score but still onboarded in indiv_pallet_score. - */ -ArchivedPlayers: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * All the player in the game. - * - * Account-based player accounts in this storage and statement accounts in - * [`StmtAccountToAlias`] must not overlap. - */ -Players: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * The current game index. - */ -GameIndex: StorageDescriptor<[], number, false, never>, - - -/** - * The information for the next game or ongoing game. - */ -Game: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The mapping from past games, identified by their game index, to the start timestamp, in - * seconds since the UNIX epoch. - */ -GameHistory: StorageDescriptor<[Key: number], number, true, never>, - - -/** - * Entries of previously attended games of each player. - */ -PlayerAttendanceHistory: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>, - - -/** - * The mapping from round index and player index to player. - */ -IndexToPlayer: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * The mapping from player to their indices in each round. - */ -PlayerToIndex: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * Storage used to compute the shuffle order of recognized people. - */ -ShuffleRecognized: StorageDescriptor, Anonymize, true, never>, - - -/** - * Storage used to compute the shuffle order of not recognized people, i.e. candidates. - */ -ShuffleNotRecognized: StorageDescriptor, Anonymize, true, never>, - - -/** - - */ -GameSchedules: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Number of invites available to distribute for an account. - */ -AvailableInvites: StorageDescriptor<[Key: SS58String], number, false, never>, - - -/** - * Pending invites for each inviter. - * - * If the key `(inviter, ticket)` exists then the ticket is currently a pending invite, from - * the inviter. - */ -PendingInvites: StorageDescriptor, null, true, never>, - - -/** - * Mapping from alias to the account id to use for interacting with the statement store. - * - * Account-based player simply use their account and are not part of this mapping. - * Reverse mapping is available in storage [`StmtAccountToAlias`]. - * - * This is removed when the alias-based player gets archived. - * This is updated when the alias-based player signs up with another statement account. - */ -AliasToStmtAccount: StorageDescriptor<[Key: SizedHex<32>], SS58String, true, never>, - - -/** - * Mapping from the account id to use for interacting with statement store to the alias. - * - * Account-based player simply use their account and are not part of this mapping. - * Reverse mapping is available in storage [`AliasToStmtAccount`]. - * This is removed when the alias-based player gets archived. - * This is updated when the alias-based player signs up with another statement account. - * - * Statement accounts in this storage and account-based player accounts in [`Players`] must - * not overlap. - */ -StmtAccountToAlias: StorageDescriptor<[Key: SS58String], SizedHex<32>, true, never>, - - -/** - * The communication identifiers used by players to establish an encrypted P2P connection in - * order to play the game. The account under which the communication identifier is registered - * should be the same account used to interact with the statement store. - */ -CommunicationIdentifiers: StorageDescriptor<[Key: SS58String], SizedHex<65>, true, never>}, -Score: { - -/** - * The participants informations. - */ -Participants: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * The score threshold required to reach personhood. - */ -PersonhoodThreshold: StorageDescriptor<[], number, false, never>, - - -/** - * Runtime-configurable schedule of absence-grace tiers, sorted by ascending - * population size threshold. Each tier specifies how many misses are - * tolerated within recent games before a participant's personhood is - * suspended. - * - * When empty or unset, a hardcoded default schedule is used. - */ -AbsenceGraceSchedule: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * The currently active absence-grace ratio `(allowed_misses, window)`, - * derived from `AbsenceGraceSchedule` and the current active-person count. - * - * Updated each time `update_thresholds()` runs (at the start of every - * attendance report session). Read by `set_attendance` to decide whether - * a participant should be suspended. - */ -AbsenceGraceRatio: StorageDescriptor<[], SizedHex<2>, false, never>, - - -/** - * The accumulated points in the current round. - */ -CurrentRoundPoints: StorageDescriptor<[], number, false, never>, - - -/** - * The index of the current round. - * - * This must be the sum of all points accumulated in `RoundsPointsForParticipant` for the - * current round. - * - * **WARNING**: This storage must be consistent with `RoundsPointsForParticipant`, use - * `fn add_points_to_participant` to update it. - */ -CurrentRoundIndex: StorageDescriptor<[], number, false, never>, - - -/** - * The points accumulated by a participant in a round. - * - * For the current round, this storage must be updated alongside `CurrentRoundPoints`. - * - * **WARNING**: This storage must be consistent with `CurrentRoundPoints`, use - * `fn add_points_to_participant` to update it. - */ -RoundsPointsForParticipant: StorageDescriptor, number, false, never>, - - -/** - * The rounds that are currently paying out. - * - * Rounds are paying out after they have finished accumulating points. - * When all their points have been paid out, they are removed from storage. - */ -RoundPayouts: StorageDescriptor<[Key: number], Anonymize, true, never>, - - -/** - * The planning of the current round that is accumulating points. - * - * If none the current round is ongoing and will be planned on the next schedule. - */ -RoundPlanning: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * Describes the schedules of the payout rounds. - */ -RoundSchedules: StorageDescriptor<[], Anonymize, false, never>}, -DummyDim: { - -/** - * The personal IDs that are reserved by unproven people. - */ -ReservedIds: StorageDescriptor<[Key: bigint], null, true, never>, - - -/** - * The people we track along with their records. - */ -People: StorageDescriptor<[Key: bigint], Anonymize, true, never>}, -PeopleLite: { - -/** - - */ -LitePeople: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Number of attestations available to distribute for a verifier account id. - */ -AttestationAllowance: StorageDescriptor<[Key: SS58String], number, false, never>}, -Resources: { - -/** - * Accounts used to identify consumers mapped to their consumer information. - */ -Consumers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Accounts associated with a statement store slot. - */ -StmtStoreAssociatedAccount: StorageDescriptor<[Key: SS58String], SS58String, true, never>, - - -/** - * Reverse lookup from `username` to the `AccountId` that has registered it. The `owner` value - * should be a key in the `Consumers` map. There can be at most 2 usernames pointing to the - * same `owner`: - * - username associated with a consumer's lite person identity - this will always be present; - * - optionally another username associated with the consumer's full person identity, if - * applicable. - */ -UsernameOwnerOf: StorageDescriptor<[Key: Uint8Array], SS58String, true, never>, - - -/** - * Reverse lookup from registered aliases to the `AccountId` used to register as a consumer. - */ -AccountOfAlias: StorageDescriptor<[Key: SizedHex<32>], SS58String, true, never>, - - -/** - * The amount of time for which a username reservation is valid, in seconds. After this - * time period elapses, the reservation can be voided. - */ -UsernameReservationDuration: StorageDescriptor<[], bigint, false, never>, - - -/** - * Map from a reserved `username` to a queue of `ReservationQueueEntry` items, each holding an - * account and the timestamp when it joined. Old reservations can be removed from storage. - */ -UsernameReservationQueue: StorageDescriptor<[Key: Uint8Array], Anonymize, true, never>, - - -/** - * Reverse lookup from an account to the username it has reserved. Each account can have at - * most one active reservation at a time. - */ -ReservationOf: StorageDescriptor<[Key: SS58String], Uint8Array, true, never>}, -ChunksManager: { - -/** - * Paginated collection of chunks (RingExponent -> PageIndex -> Chunks). - */ -Chunks: StorageDescriptor, Anonymize, true, never>, - - -/** - * The hash for each page of chunks. - */ -ChunkPageHashes: StorageDescriptor, SizedHex<32>, true, never>}, -Members: { - -/** - * Information about each collection, keyed by identifier. - */ -Collections: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>, - - -/** - * Collections that have been marked for deletion and are being processed. - * Once a collection is moved here, normal operations will fail with CollectionNotFound. - */ -SuspendedCollections: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>, - - -/** - * The identifiers of collections owned by an entity. - */ -IdentifiersOf: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>, - - -/** - * The current members we recognise. - */ -Root: StorageDescriptor, Anonymize, true, never>, - - -/** - * Keeps track of the ring index currently being populated. - */ -CurrentRingIndex: StorageDescriptor<[Key: SizedHex<32>], number, false, never>, - - -/** - * Maximum number of members queued before onboarding to a ring. - */ -OnboardingSize: StorageDescriptor<[Key: SizedHex<32>], number, false, never>, - - -/** - * Both the keys that are included in built rings and the keys that will be used in future - * rings. Paginated by (Identifier, RingIndex, PageIndex) where each page contains up to - * `RingCapacityFromExponent` keys. The page size equals the flexible ring exponent's capacity, - * ensuring Flexible collections never need more than one page. - */ -RingKeys: StorageDescriptor, Anonymize, false, never>, - - -/** - * Stores the meta information for each ring, the number of keys and how many are actually - * included in the root. - */ -RingKeysStatus: StorageDescriptor, Anonymize, false, never>, - - -/** - * A map of all rings which currently have pending suspensions and need cleaning, along with - * their respective number of suspended keys which need to be removed. - * Note: Currently only supports single-page rings, so bounded by `RingCapacityFromExponent`. - */ -PendingSuspensions: StorageDescriptor, Anonymize, false, never>, - - -/** - * The number of members currently included in a ring. - */ -ActiveMembers: StorageDescriptor<[Key: SizedHex<32>], number, false, never>, - - -/** - * The current members part of all collections (either included in rings, suspended and queued - * for removal from a ring, suspended and not in any ring, or onboarding). - * - * Member public key to information about their membership and status. - */ -Members: StorageDescriptor<[Key: SizedHex<32>], Anonymize, true, never>, - - -/** - * The current state of all rings managed for a given identifier. - */ -RingsState: StorageDescriptor<[Key: SizedHex<32>], Anonymize, false, never>, - - -/** - * Set of rings which are stale and require building. - */ -StaleRings: StorageDescriptor, null, true, never>, - - -/** - * Keeps track of the page indices of the head and tail of the onboarding queue. - */ -QueuePageIndices: StorageDescriptor<[Key: SizedHex<32>], Anonymize, false, never>, - - -/** - * Paginated collection of member public keys ready to be included in a ring. - */ -OnboardingQueue: StorageDescriptor, Anonymize, false, never>, - - -/** - * The collection currently being deleted and its progress. - * - * Only one collection is actively deleted at a time. When a collection is marked - * for deletion, it is added here when deletion processing begins. Progress is - * tracked to allow resumption if weight runs out during `on_idle`. - */ -DeletionInProgress: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * Queue of ring pages pending deletion. - * - * This is used both by `remove_ring` (individual ring deletion) and by - * collection deletion. Ring pages are processed from this queue in `on_idle` - * regardless of which operation queued them. - */ -RingDeletionQueue: StorageDescriptor, null, true, never>}, -Coinage: { - -/** - * Coins by owner. - * - * This storage map contains all the coins currently circulating. The coin is minted when - * unloaded from the recycler, and destroyed when loaded into the recycler. - */ -CoinsByOwner: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * Temporary lock expiry for coins that previously failed dispatch. - * - * A coin owner entry is locked until the stored Unix timestamp, preventing repeated failed - * dispatch attempts in a short period. - */ -LockedCoins: StorageDescriptor<[Key: SS58String], Anonymize, true, never>, - - -/** - * The total value of coins that were burnt. - * - * This tracks value that is intentionally destroyed as part of protocol flows (for example: - * recycler expiration cleanup and output-token spam penalty path). This storage item keeps - * track of the total value of such destroyed coins. - */ -TotalValueOfDestroyedCoins: StorageDescriptor<[], bigint, false, never>, - - -/** - * Consumed free unload tokens by period and alias. - * - * This storage keeps track of the free unload tokens that have been consumed by people - * and lite people, to avoid double spending. - * - * It is cleared periodically. - */ -ConsumedFreeUnloadTokens: StorageDescriptor, null, true, never>, - - -/** - * Tracks whether a recycler collection exists for a given coin value. - * - * All recycler collections are created eagerly during one-time `on_poll` initialization. - * [`RecyclerManager::ensure_collection_exists`] serves as a safety fallback. - * - * **WARNING**: Do not use this storage directly, use [`RecyclerManager`] type instead. - * - * This storage item is managed by [`RecyclerManager`] and is part of a consistent set: - * * [RecyclerCollectionCreated] - whether the collection exists for a coin value. - * * [RecyclersLastRemovedRingIndex] - the last removed ring index for each coin value. - * * [RecyclersCoinToRecycler] - the mapping from member key to the coin value it is in. - * * [RecyclersUnloaded] - the recyclers' unloaded aliases, indexed by coin value and ring - * index. - * * [RecyclersDusting] - marks rings with unloaded aliases pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -RecyclerCollectionCreated: StorageDescriptor<[Key: number], null, true, never>, - - -/** - * Last removed ring index per recycler coin value. - * - * Rings are removed sequentially starting from index 0. The next ring to check for - * expiration is `last_removed + 1` (or `0` if nothing has been removed yet). - * - * **WARNING**: Do not use this storage directly, use [`RecyclerManager`] type instead. - * - * This storage item is managed by [`RecyclerManager`] and is part of a consistent set: - * * [RecyclerCollectionCreated] - whether the collection exists for a coin value. - * * [RecyclersLastRemovedRingIndex] - the last removed ring index for each coin value. - * * [RecyclersCoinToRecycler] - the mapping from member key to the coin value it is in. - * * [RecyclersUnloaded] - the recyclers' unloaded aliases, indexed by coin value and ring - * index. - * * [RecyclersDusting] - marks rings with unloaded aliases pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -RecyclersLastRemovedRingIndex: StorageDescriptor<[Key: number], number, true, never>, - - -/** - * Mapping from a recycler member key to the coin value it belongs to. - * - * When a coin is loaded into a recycler, the member key is recorded here so that the - * pallet can look up which coin value the member key corresponds to. - * - * **WARNING**: Do not use this storage directly, use [`RecyclerManager`] type instead. - * - * This storage item is managed by [`RecyclerManager`] and is part of a consistent set: - * * [RecyclerCollectionCreated] - whether the collection exists for a coin value. - * * [RecyclersLastRemovedRingIndex] - the last removed ring index for each coin value. - * * [RecyclersCoinToRecycler] - the mapping from member key to the coin value it is in. - * * [RecyclersUnloaded] - the recyclers' unloaded aliases, indexed by coin value and ring - * index. - * * [RecyclersDusting] - marks rings with unloaded aliases pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -RecyclersCoinToRecycler: StorageDescriptor<[Key: SizedHex<32>], number, true, never>, - - -/** - * The recyclers' unloaded aliases, indexed by (coin value, ring index, alias). - * - * When a coin is unloaded from a recycler, the alias produced by the ring-VRF proof is - * stored here to prevent double-spending within the same recycler ring. - * - * **WARNING**: Do not use this storage directly, use [`RecyclerManager`] type instead. - * - * This storage item is managed by [`RecyclerManager`] and is part of a consistent set: - * * [RecyclerCollectionCreated] - whether the collection exists for a coin value. - * * [RecyclersLastRemovedRingIndex] - the last removed ring index for each coin value. - * * [RecyclersCoinToRecycler] - the mapping from member key to the coin value it is in. - * * [RecyclersUnloaded] - the recyclers' unloaded aliases, indexed by coin value and ring - * index. - * * [RecyclersDusting] - marks rings with unloaded aliases pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -RecyclersUnloaded: StorageDescriptor, null, true, never>, - - -/** - * Marks recycler rings that have unloaded aliases pending removal. - * - * When a recycler ring is removed, the cleanup of its unloaded aliases in - * [RecyclersUnloaded] is performed gradually through this storage item. An entry here - * indicates that unloaded aliases for the given coin value and ring index still exist - * and should be dusted. - * - * **WARNING**: Do not use this storage directly, use [`RecyclerManager`] type instead. - * - * This storage item is managed by [`RecyclerManager`] and is part of a consistent set: - * * [RecyclerCollectionCreated] - whether the collection exists for a coin value. - * * [RecyclersLastRemovedRingIndex] - the last removed ring index for each coin value. - * * [RecyclersCoinToRecycler] - the mapping from member key to the coin value it is in. - * * [RecyclersUnloaded] - the recyclers' unloaded aliases, indexed by coin value and ring - * index. - * * [RecyclersDusting] - marks rings with unloaded aliases pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -RecyclersDusting: StorageDescriptor<[Key: Anonymize], null, true, never>, - - -/** - * Mapping from a paid token member key to the period it belongs to. - * - * When a user pays for a recycler unload token, the member key is recorded here so - * that the pallet can look up which period the member key corresponds to. - * - * **WARNING**: Do not use this storage directly, use [`PaidTknManager`] type instead. - * - * This storage item is managed by [`PaidTknManager`] and is part of a consistent set: - * * [PaidUnloadTokenMembers] - tracks registered member keys. - * * [PaidUnloadTokenConsumed] - the consumed paid unload token aliases. - * * [PaidTokenCollectionsCreated] - whether the collection exists for a period. - * * [PaidUnloadTokenDusting] - marks periods with consumed tokens pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -PaidUnloadTokenMembers: StorageDescriptor<[Key: SizedHex<32>], null, true, never>, - - -/** - * Consumed paid unload tokens by period, ring index and alias. - * - * When a paid unload token is consumed, the alias produced by the ring-VRF proof is - * stored here to prevent double-spending within the same ring. - * - * **WARNING**: Do not use this storage directly, use [`PaidTknManager`] type instead. - * - * This storage item is managed by [`PaidTknManager`] and is part of a consistent set: - * * [PaidUnloadTokenMembers] - tracks registered member keys. - * * [PaidUnloadTokenConsumed] - the consumed paid unload token aliases. - * * [PaidTokenCollectionsCreated] - whether the collection exists for a period. - * * [PaidUnloadTokenDusting] - marks periods with consumed tokens pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -PaidUnloadTokenConsumed: StorageDescriptor, null, true, never>, - - -/** - * Tracks whether a paid token collection exists for a given period. - * - * Uses `Identity` hasher so that iteration yields periods in order, enabling efficient - * cleanup of expired periods. - * - * **WARNING**: Do not use this storage directly, use [`PaidTknManager`] type instead. - * - * This storage item is managed by [`PaidTknManager`] and is part of a consistent set: - * * [PaidUnloadTokenMembers] - tracks registered member keys. - * * [PaidUnloadTokenConsumed] - the consumed paid unload token aliases. - * * [PaidTokenCollectionsCreated] - whether the collection exists for a period. - * * [PaidUnloadTokenDusting] - marks periods with consumed tokens pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -PaidTokenCollectionsCreated: StorageDescriptor<[Key: number], null, true, never>, - - -/** - * Marks paid unload token periods that have consumed tokens pending removal. - * - * When a paid unload token collection is removed, the cleanup of its consumed tokens in - * [PaidUnloadTokenConsumed] is performed gradually through this storage item. An entry - * here indicates that consumed tokens for the given period still exist and should be - * dusted. - * - * **WARNING**: Do not use this storage directly, use [`PaidTknManager`] type instead. - * - * This storage item is managed by [`PaidTknManager`] and is part of a consistent set: - * * [PaidUnloadTokenMembers] - tracks registered member keys. - * * [PaidUnloadTokenConsumed] - the consumed paid unload token aliases. - * * [PaidTokenCollectionsCreated] - whether the collection exists for a period. - * * [PaidUnloadTokenDusting] - marks periods with consumed tokens pending removal. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -PaidUnloadTokenDusting: StorageDescriptor<[Key: number], null, true, never>, - - -/** - * Tracks the next ring index to clean for each expired period. - * - * Used by the OCW to determine cleanup progress and by the collection deletion - * extrinsic to verify all rings have been cleaned. - * - * Rings are cleaned sequentially (one per OCW interval) rather than all at once. - * This is intentional: a single storage cursor enables O(1) completion checks in - * both [`PaidTknManager::ensure_can_clean_ring`] and - * [`PaidTknManager::ensure_can_delete_collection`]. The alternative — submitting - * all ring cleans in parallel — would require fetching ring members to check whether - * each ring was already cleaned (since `ring_status` still reports `total > 0` after - * cleanup because rings are not removed until collection deletion). Cleanup of expired - * collections is not time-critical, so the simpler sequential approach is preferred. - * - * **WARNING**: Do not use this storage directly, use [`PaidTknManager`] type instead. - * - * This storage item is managed by [`PaidTknManager`] and is part of a consistent set: - * * [PaidUnloadTokenMembers] - tracks registered member keys. - * * [PaidUnloadTokenConsumed] - the consumed paid unload token aliases. - * * [PaidTokenCollectionsCreated] - whether the collection exists for a period. - * * [PaidUnloadTokenDusting] - marks periods with consumed tokens pending removal. - * * [PaidUnloadTokenNextRingToClean] - sequential ring cleanup progress. - * - * Ring members, pending members, and ring state are managed by [`Config::MemberService`]. - */ -PaidUnloadTokenNextRingToClean: StorageDescriptor<[Key: number], number, true, never>, - - -/** - * Whether the pallet account has been initialized. - * - * We need to initialize the pallet account with minimum balance so that it can hold any - * amount of underlying asset even less than minimum balance. - */ -InitializePalletAccount: StorageDescriptor<[], null, true, never>}, -StorageInitialization: { - -/** - * Current state of the initialization process in on_poll hook. - */ -OnPollStatus: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * Block number when XCM transfer was initiated. - * Used to track transfer timeout. - */ -XcmTransferInitiatedAt: StorageDescriptor<[], number, true, never>}, -StorageInitializationLite: { - -/** - * Current state of the initialization process in on_poll hook. - */ -OnPollStatus: StorageDescriptor<[], Anonymize, false, never>}, -Airdrop: { - -/** - * All the scheduled events. In order of registration start time. - * - * WARNING: This item must be kept consistent with `EventScheduleFirstStartTime`. - */ -EventSchedule: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The first start time of the first scheduled event, if any. - * - * This is used to avoid the proof size cost of reading the entire schedule. - * - * WARNING: This item must be kept consistent with `EventSchedule`. - */ -EventScheduleFirstStartTime: StorageDescriptor<[], number, true, never>, - - -/** - * The next global event id. - */ -NextEventId: StorageDescriptor<[], number, false, never>, - - -/** - * The current active events. - * - * WARNING: This item must be kept consistent with `ActiveEventIds`. - */ -ActiveEvents: StorageDescriptor<[Key: number], Anonymize, true, never>, - - -/** - * The ids of the current active events. - * - * WARNING: This item must be kept consistent with `ActiveEvents`. - */ -ActiveEventIds: StorageDescriptor<[], Anonymize, false, never>, - - -/** - * The participant id to alias for the active events. - */ -ParticipantIdToAliasAndDest: StorageDescriptor, Anonymize, true, never>, - - -/** - * The participant alias to id for the active events. - */ -ParticipantAliasToId: StorageDescriptor, number, true, never>, - - -/** - * The winners to whom to distribute the prize for the active events. - * - * The winners are removed from the list as their prize is distributed. - */ -WinnersToDistributeTo: StorageDescriptor<[Key: number], Anonymize, false, never>, - - -/** - * The prizes of winners that failed to be transferred automatically. - */ -WinnersWithFailedTransfer: StorageDescriptor, Anonymize, true, never>, - - -/** - * Historical record of all past airdrops which completed successfully up until the point of - * distributing the funds to the winners. - */ -PastAirdrops: StorageDescriptor<[Key: number], Anonymize, true, never>}, -MultiBlockMigrations: { - -/** - * The currently active migration to run and its cursor. - * - * `None` indicates that no migration is running. - */ -Cursor: StorageDescriptor<[], Anonymize, true, never>, - - -/** - * Set of all successfully executed migrations. - * - * This is used as blacklist, to not re-execute migrations that have not been removed from the - * codebase yet. Governance can regularly clear this out via `clear_historic`. - */ -Historic: StorageDescriptor<[Key: Uint8Array], null, true, never>}}; -type ICalls = {System: { - -/** - * Make some on-chain remark. - * - * Can be executed by every `origin`. - */ -remark: TxDescriptor>, - - -/** - * Set the number of pages in the WebAssembly environment's heap. - */ -set_heap_pages: TxDescriptor>, - - -/** - * Set the new runtime code. - */ -set_code: TxDescriptor>, - - -/** - * Set the new runtime code without doing any checks of the given `code`. - * - * Note that runtime upgrades will not run if this is called with a not-increasing spec - * version! - */ -set_code_without_checks: TxDescriptor>, - - -/** - * Set some items of storage. - */ -set_storage: TxDescriptor>, - - -/** - * Kill some items from storage. - */ -kill_storage: TxDescriptor>, - - -/** - * Kill all storage items with a key that starts with the given prefix. - * - * **NOTE:** We rely on the Root origin to provide us the number of subkeys under - * the prefix we are removing to accurately calculate the weight of this function. - */ -kill_prefix: TxDescriptor>, - - -/** - * Make some on-chain remark and emit event. - */ -remark_with_event: TxDescriptor>, - - -/** - * Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied - * later. - * - * This call requires Root origin. - */ -authorize_upgrade: TxDescriptor>, - - -/** - * Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied - * later. - * - * WARNING: This authorizes an upgrade that will take place without any safety checks, for - * example that the spec name remains the same and that the version number increases. Not - * recommended for normal use. Use `authorize_upgrade` instead. - * - * This call requires Root origin. - */ -authorize_upgrade_without_checks: TxDescriptor>, - - -/** - * Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. - * - * If the authorization required a version check, this call will ensure the spec name - * remains unchanged and that the spec version has increased. - * - * Depending on the runtime's `OnSetCode` configuration, this function may directly apply - * the new `code` in the same block or attempt to schedule the upgrade. - * - * All origins are allowed. - */ -apply_authorized_upgrade: TxDescriptor>}, -ParachainSystem: { - -/** - * Set the current validation data. - * - * This should be invoked exactly once per block. It will panic at the finalization - * phase if the call was not invoked. - * - * The dispatch origin for this call must be `Inherent` - * - * As a side effect, this function upgrades the current validation function - * if the appropriate time has come. - */ -set_validation_data: TxDescriptor>, - - -/** - - */ -sudo_send_upward_message: TxDescriptor>}, -Timestamp: { - -/** - * Set the current time. - * - * This call should be invoked exactly once per block. It will panic at the finalization - * phase, if this call hasn't been invoked by that time. - * - * The timestamp should be greater than the previous one by the amount specified by - * [`Config::MinimumPeriod`]. - * - * The dispatch origin for this call must be _None_. - * - * This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware - * that changing the complexity of this call could result exhausting the resources in a - * block to execute any other calls. - * - * ## Complexity - * - `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) - * - 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in - * `on_finalize`) - * - 1 event handler `on_timestamp_set`. Must be `O(1)`. - */ -set: TxDescriptor>}, -Balances: { - -/** - * Transfer some liquid free balance to another account. - * - * `transfer_allow_death` will set the `FreeBalance` of the sender and receiver. - * If the sender's account is below the existential deposit as a result - * of the transfer, the account will be reaped. - * - * The dispatch origin for this call must be `Signed` by the transactor. - */ -transfer_allow_death: TxDescriptor>, - - -/** - * Exactly as `transfer_allow_death`, except the origin must be root and the source account - * may be specified. - */ -force_transfer: TxDescriptor>, - - -/** - * Same as the [`transfer_allow_death`] call, but with a check that the transfer will not - * kill the origin account. - * - * 99% of the time you want [`transfer_allow_death`] instead. - * - * [`transfer_allow_death`]: struct.Pallet.html#method.transfer - */ -transfer_keep_alive: TxDescriptor>, - - -/** - * Transfer the entire transferable balance from the caller account. - * - * NOTE: This function only attempts to transfer _transferable_ balances. This means that - * any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be - * transferred by this function. To ensure that this function results in a killed account, - * you might need to prepare the account by removing any reference counters, storage - * deposits, etc... - * - * The dispatch origin of this call must be Signed. - * - * - `dest`: The recipient of the transfer. - * - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all - * of the funds the account has, causing the sender account to be killed (false), or - * transfer everything except at least the existential deposit, which will guarantee to - * keep the sender account alive (true). - */ -transfer_all: TxDescriptor>, - - -/** - * Unreserve some balance from a user by force. - * - * Can only be called by ROOT. - */ -force_unreserve: TxDescriptor>, - - -/** - * Upgrade a specified account. - * - * - `origin`: Must be `Signed`. - * - `who`: The account to be upgraded. - * - * This will waive the transaction fee if at least all but 10% of the accounts needed to - * be upgraded. (We let some not have to be upgraded just in order to allow for the - * possibility of churn). - */ -upgrade_accounts: TxDescriptor>, - - -/** - * Set the regular balance of a given account. - * - * The dispatch origin for this call is `root`. - */ -force_set_balance: TxDescriptor>, - - -/** - * Adjust the total issuance in a saturating way. - * - * Can only be called by root and always needs a positive `delta`. - * - * # Example - */ -force_adjust_total_issuance: TxDescriptor>, - - -/** - * Burn the specified liquid free balance from the origin account. - * - * If the origin's account ends up below the existential deposit as a result - * of the burn and `keep_alive` is false, the account will be reaped. - * - * Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, - * this `burn` operation will reduce total issuance by the amount _burned_. - */ -burn: TxDescriptor>}, -OriginRestriction: { - -/** - * Allow to clean usage associated with an entity when it is zero or when there is no - * longer any allowance for the origin. - */ -clean_usage: TxDescriptor>}, -Assets: { - -/** - * Issue a new class of fungible assets from a public origin. - * - * This new asset class has no assets initially and its owner is the origin. - * - * The origin must conform to the configured `CreateOrigin` and have sufficient funds free. - * - * Funds of sender are reserved by `AssetDeposit`. - * - * Parameters: - * - `id`: The identifier of the new asset. This must not be currently in use to identify - * an existing asset. If [`NextAssetId`] is set, then this must be equal to it. - * - `admin`: The admin of this class of assets. The admin is the initial address of each - * member of the asset class's admin team. - * - `min_balance`: The minimum balance of this new asset that any single account must - * have. If an account's balance is reduced below this, then it collapses to zero. - * - * Emits `Created` event when successful. - * - * Weight: `O(1)` - */ -create: TxDescriptor>, - - -/** - * Issue a new class of fungible assets from a privileged origin. - * - * This new asset class has no assets initially. - * - * The origin must conform to `ForceOrigin`. - * - * Unlike `create`, no funds are reserved. - * - * - `id`: The identifier of the new asset. This must not be currently in use to identify - * an existing asset. If [`NextAssetId`] is set, then this must be equal to it. - * - `owner`: The owner of this class of assets. The owner has full superuser permissions - * over this asset, but may later change and configure the permissions using - * `transfer_ownership` and `set_team`. - * - `min_balance`: The minimum balance of this new asset that any single account must - * have. If an account's balance is reduced below this, then it collapses to zero. - * - * Emits `ForceCreated` event when successful. - * - * Weight: `O(1)` - */ -force_create: TxDescriptor>, - - -/** - * Start the process of destroying a fungible asset class. - * - * `start_destroy` is the first in a series of extrinsics that should be called, to allow - * destruction of an asset class. - * - * The origin must conform to `ForceOrigin` or must be `Signed` by the asset's `owner`. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if - * an account contains holds or freezes in place. - */ -start_destroy: TxDescriptor>, - - -/** - * Destroy all accounts associated with a given asset. - * - * `destroy_accounts` should only be called after `start_destroy` has been called, and the - * asset is in a `Destroying` state. - * - * Due to weight restrictions, this function may need to be called multiple times to fully - * destroy all accounts. It will destroy `RemoveItemsLimit` accounts at a time. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * Each call emits the `Event::DestroyedAccounts` event. - */ -destroy_accounts: TxDescriptor>, - - -/** - * Destroy all approvals associated with a given asset up to the max (T::RemoveItemsLimit). - * - * `destroy_approvals` should only be called after `start_destroy` has been called, and the - * asset is in a `Destroying` state. - * - * Due to weight restrictions, this function may need to be called multiple times to fully - * destroy all approvals. It will destroy `RemoveItemsLimit` approvals at a time. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * Each call emits the `Event::DestroyedApprovals` event. - */ -destroy_approvals: TxDescriptor>, - - -/** - * Complete destroying asset and unreserve currency. - * - * `finish_destroy` should only be called after `start_destroy` has been called, and the - * asset is in a `Destroying` state. All accounts or approvals should be destroyed before - * hand. - * - * - `id`: The identifier of the asset to be destroyed. This must identify an existing - * asset. - * - * Each successful call emits the `Event::Destroyed` event. - */ -finish_destroy: TxDescriptor>, - - -/** - * Mint assets of a particular class. - * - * The origin must be Signed and the sender must be the Issuer of the asset `id`. - * - * - `id`: The identifier of the asset to have some amount minted. - * - `beneficiary`: The account to be credited with the minted assets. - * - `amount`: The amount of the asset to be minted. - * - * Emits `Issued` event when successful. - * - * Weight: `O(1)` - * Modes: Pre-existing balance of `beneficiary`; Account pre-existence of `beneficiary`. - */ -mint: TxDescriptor>, - - -/** - * Reduce the balance of `who` by as much as possible up to `amount` assets of `id`. - * - * Origin must be Signed and the sender should be the Manager of the asset `id`. - * - * Bails with `NoAccount` if the `who` is already dead. - * - * - `id`: The identifier of the asset to have some amount burned. - * - `who`: The account to be debited from. - * - `amount`: The maximum amount by which `who`'s balance should be reduced. - * - * Emits `Burned` with the actual amount burned. If this takes the balance to below the - * minimum for the asset, then the amount burned is increased to take it to zero. - * - * Weight: `O(1)` - * Modes: Post-existence of `who`; Pre & post Zombie-status of `who`. - */ -burn: TxDescriptor>, - - -/** - * Move some assets from the sender account to another. - * - * Origin must be Signed. - * - * - `id`: The identifier of the asset to have some amount transferred. - * - `target`: The account to be credited. - * - `amount`: The amount by which the sender's balance of assets should be reduced and - * `target`'s balance increased. The amount actually transferred may be slightly greater in - * the case that the transfer would otherwise take the sender balance above zero but below - * the minimum balance. Must be greater than zero. - * - * Emits `Transferred` with the actual amount transferred. If this takes the source balance - * to below the minimum for the asset, then the amount transferred is increased to take it - * to zero. - * - * Weight: `O(1)` - * Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of - * `target`. - */ -transfer: TxDescriptor>, - - -/** - * Move some assets from the sender account to another, keeping the sender account alive. - * - * Origin must be Signed. - * - * - `id`: The identifier of the asset to have some amount transferred. - * - `target`: The account to be credited. - * - `amount`: The amount by which the sender's balance of assets should be reduced and - * `target`'s balance increased. The amount actually transferred may be slightly greater in - * the case that the transfer would otherwise take the sender balance above zero but below - * the minimum balance. Must be greater than zero. - * - * Emits `Transferred` with the actual amount transferred. If this takes the source balance - * to below the minimum for the asset, then the amount transferred is increased to take it - * to zero. - * - * Weight: `O(1)` - * Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of - * `target`. - */ -transfer_keep_alive: TxDescriptor>, - - -/** - * Move some assets from one account to another. - * - * Origin must be Signed and the sender should be the Admin of the asset `id`. - * - * - `id`: The identifier of the asset to have some amount transferred. - * - `source`: The account to be debited. - * - `dest`: The account to be credited. - * - `amount`: The amount by which the `source`'s balance of assets should be reduced and - * `dest`'s balance increased. The amount actually transferred may be slightly greater in - * the case that the transfer would otherwise take the `source` balance above zero but - * below the minimum balance. Must be greater than zero. - * - * Emits `Transferred` with the actual amount transferred. If this takes the source balance - * to below the minimum for the asset, then the amount transferred is increased to take it - * to zero. - * - * Weight: `O(1)` - * Modes: Pre-existence of `dest`; Post-existence of `source`; Account pre-existence of - * `dest`. - */ -force_transfer: TxDescriptor>, - - -/** - * Disallow further unprivileged transfers of an asset `id` from an account `who`. `who` - * must already exist as an entry in `Account`s of the asset. If you want to freeze an - * account that does not have an entry, use `touch_other` first. - * - * Origin must be Signed and the sender should be the Freezer of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - `who`: The account to be frozen. - * - * Emits `Frozen`. - * - * Weight: `O(1)` - */ -freeze: TxDescriptor>, - - -/** - * Allow unprivileged transfers to and from an account again. - * - * Origin must be Signed and the sender should be the Admin of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - `who`: The account to be unfrozen. - * - * Emits `Thawed`. - * - * Weight: `O(1)` - */ -thaw: TxDescriptor>, - - -/** - * Disallow further unprivileged transfers for the asset class. - * - * Origin must be Signed and the sender should be the Freezer of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - * Emits `Frozen`. - * - * Weight: `O(1)` - */ -freeze_asset: TxDescriptor>, - - -/** - * Allow unprivileged transfers for the asset again. - * - * Origin must be Signed and the sender should be the Admin of the asset `id`. - * - * - `id`: The identifier of the asset to be thawed. - * - * Emits `Thawed`. - * - * Weight: `O(1)` - */ -thaw_asset: TxDescriptor>, - - -/** - * Change the Owner of an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * - `id`: The identifier of the asset. - * - `owner`: The new Owner of this asset. - * - * Emits `OwnerChanged`. - * - * Weight: `O(1)` - */ -transfer_ownership: TxDescriptor>, - - -/** - * Change the Issuer, Admin and Freezer of an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * - `id`: The identifier of the asset to be frozen. - * - `issuer`: The new Issuer of this asset. - * - `admin`: The new Admin of this asset. - * - `freezer`: The new Freezer of this asset. - * - * Emits `TeamChanged`. - * - * Weight: `O(1)` - */ -set_team: TxDescriptor>, - - -/** - * Set the metadata for an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * Funds of sender are reserved according to the formula: - * `MetadataDepositBase + MetadataDepositPerByte * (name.len + symbol.len)` taking into - * account any already reserved funds. - * - * - `id`: The identifier of the asset to update. - * - `name`: The user friendly name of this asset. Limited in length by `StringLimit`. - * - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`. - * - `decimals`: The number of decimals this asset uses to represent one unit. - * - * Emits `MetadataSet`. - * - * Weight: `O(1)` - */ -set_metadata: TxDescriptor>, - - -/** - * Clear the metadata for an asset. - * - * Origin must be Signed and the sender should be the Owner of the asset `id`. - * - * Any deposit is freed for the asset owner. - * - * - `id`: The identifier of the asset to clear. - * - * Emits `MetadataCleared`. - * - * Weight: `O(1)` - */ -clear_metadata: TxDescriptor>, - - -/** - * Force the metadata for an asset to some value. - * - * Origin must be ForceOrigin. - * - * Any deposit is left alone. - * - * - `id`: The identifier of the asset to update. - * - `name`: The user friendly name of this asset. Limited in length by `StringLimit`. - * - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`. - * - `decimals`: The number of decimals this asset uses to represent one unit. - * - * Emits `MetadataSet`. - * - * Weight: `O(N + S)` where N and S are the length of the name and symbol respectively. - */ -force_set_metadata: TxDescriptor>, - - -/** - * Clear the metadata for an asset. - * - * Origin must be ForceOrigin. - * - * Any deposit is returned. - * - * - `id`: The identifier of the asset to clear. - * - * Emits `MetadataCleared`. - * - * Weight: `O(1)` - */ -force_clear_metadata: TxDescriptor>, - - -/** - * Alter the attributes of a given asset. - * - * Origin must be `ForceOrigin`. - * - * - `id`: The identifier of the asset. - * - `owner`: The new Owner of this asset. - * - `issuer`: The new Issuer of this asset. - * - `admin`: The new Admin of this asset. - * - `freezer`: The new Freezer of this asset. - * - `min_balance`: The minimum balance of this new asset that any single account must - * have. If an account's balance is reduced below this, then it collapses to zero. - * - `is_sufficient`: Whether a non-zero balance of this asset is deposit of sufficient - * value to account for the state bloat associated with its balance storage. If set to - * `true`, then non-zero balances may be stored without a `consumer` reference (and thus - * an ED in the Balances pallet or whatever else is used to control user-account state - * growth). - * - `is_frozen`: Whether this asset class is frozen except for permissioned/admin - * instructions. - * - * Emits `AssetStatusChanged` with the identity of the asset. - * - * Weight: `O(1)` - */ -force_asset_status: TxDescriptor>, - - -/** - * Approve an amount of asset for transfer by a delegated third-party account. - * - * Origin must be Signed. - * - * Ensures that `ApprovalDeposit` worth of `Currency` is reserved from signing account - * for the purpose of holding the approval. If some non-zero amount of assets is already - * approved from signing account to `delegate`, then it is topped up or unreserved to - * meet the right value. - * - * NOTE: The signing account does not need to own `amount` of assets at the point of - * making this call. - * - * - `id`: The identifier of the asset. - * - `delegate`: The account to delegate permission to transfer asset. - * - `amount`: The amount of asset that may be transferred by `delegate`. If there is - * already an approval in place, then this acts additively. - * - * Emits `ApprovedTransfer` on success. - * - * Weight: `O(1)` - */ -approve_transfer: TxDescriptor>, - - -/** - * Cancel all of some asset approved for delegated transfer by a third-party account. - * - * Origin must be Signed and there must be an approval in place between signer and - * `delegate`. - * - * Unreserves any deposit previously reserved by `approve_transfer` for the approval. - * - * - `id`: The identifier of the asset. - * - `delegate`: The account delegated permission to transfer asset. - * - * Emits `ApprovalCancelled` on success. - * - * Weight: `O(1)` - */ -cancel_approval: TxDescriptor>, - - -/** - * Cancel all of some asset approved for delegated transfer by a third-party account. - * - * Origin must be either ForceOrigin or Signed origin with the signer being the Admin - * account of the asset `id`. - * - * Unreserves any deposit previously reserved by `approve_transfer` for the approval. - * - * - `id`: The identifier of the asset. - * - `delegate`: The account delegated permission to transfer asset. - * - * Emits `ApprovalCancelled` on success. - * - * Weight: `O(1)` - */ -force_cancel_approval: TxDescriptor>, - - -/** - * Transfer some asset balance from a previously delegated account to some third-party - * account. - * - * Origin must be Signed and there must be an approval in place by the `owner` to the - * signer. - * - * If the entire amount approved for transfer is transferred, then any deposit previously - * reserved by `approve_transfer` is unreserved. - * - * - `id`: The identifier of the asset. - * - `owner`: The account which previously approved for a transfer of at least `amount` and - * from which the asset balance will be withdrawn. - * - `destination`: The account to which the asset balance of `amount` will be transferred. - * - `amount`: The amount of assets to transfer. - * - * Emits `TransferredApproved` on success. - * - * Weight: `O(1)` - */ -transfer_approved: TxDescriptor>, - - -/** - * Create an asset account for non-provider assets. - * - * A deposit will be taken from the signer account. - * - * - `origin`: Must be Signed; the signer account must have sufficient funds for a deposit - * to be taken. - * - `id`: The identifier of the asset for the account to be created. - * - * Emits `Touched` event when successful. - */ -touch: TxDescriptor>, - - -/** - * Return the deposit (if any) of an asset account or a consumer reference (if any) of an - * account. - * - * The origin must be Signed. - * - * - `id`: The identifier of the asset for which the caller would like the deposit - * refunded. - * - `allow_burn`: If `true` then assets may be destroyed in order to complete the refund. - * - * It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if - * the asset account contains holds or freezes in place. - * - * Emits `Refunded` event when successful. - */ -refund: TxDescriptor>, - - -/** - * Sets the minimum balance of an asset. - * - * Only works if there aren't any accounts that are holding the asset or if - * the new value of `min_balance` is less than the old one. - * - * Origin must be Signed and the sender has to be the Owner of the - * asset `id`. - * - * - `id`: The identifier of the asset. - * - `min_balance`: The new value of `min_balance`. - * - * Emits `AssetMinBalanceChanged` event when successful. - */ -set_min_balance: TxDescriptor>, - - -/** - * Create an asset account for `who`. - * - * A deposit will be taken from the signer account. - * - * - `origin`: Must be Signed; the signer account must have sufficient funds for a deposit - * to be taken. - * - `id`: The identifier of the asset for the account to be created, the asset status must - * be live. - * - `who`: The account to be created. - * - * Emits `Touched` event when successful. - */ -touch_other: TxDescriptor>, - - -/** - * Return the deposit (if any) of a target asset account. Useful if you are the depositor. - * - * The origin must be Signed and either the account owner, depositor, or asset `Admin`. In - * order to burn a non-zero balance of the asset, the caller must be the account and should - * use `refund`. - * - * - `id`: The identifier of the asset for the account holding a deposit. - * - `who`: The account to refund. - * - * It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if - * the asset account contains holds or freezes in place. - * - * Emits `Refunded` event when successful. - */ -refund_other: TxDescriptor>, - - -/** - * Disallow further unprivileged transfers of an asset `id` to and from an account `who`. - * - * Origin must be Signed and the sender should be the Freezer of the asset `id`. - * - * - `id`: The identifier of the account's asset. - * - `who`: The account to be unblocked. - * - * Emits `Blocked`. - * - * Weight: `O(1)` - */ -block: TxDescriptor>, - - -/** - * Transfer the entire transferable balance from the caller asset account. - * - * NOTE: This function only attempts to transfer _transferable_ balances. This means that - * any held, frozen, or minimum balance (when `keep_alive` is `true`), will not be - * transferred by this function. To ensure that this function results in a killed account, - * you might need to prepare the account by removing any reference counters, storage - * deposits, etc... - * - * The dispatch origin of this call must be Signed. - * - * - `id`: The identifier of the asset for the account holding a deposit. - * - `dest`: The recipient of the transfer. - * - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all - * of the funds the asset account has, causing the sender asset account to be killed - * (false), or transfer everything except at least the minimum balance, which will - * guarantee to keep the sender asset account alive (true). - */ -transfer_all: TxDescriptor>, - - -/** - * Sets the trusted reserve information of an asset. - * - * Origin must be the Owner of the asset `id`. The origin must conform to the configured - * `CreateOrigin` or be the signed `owner` configured during asset creation. - * - * - `id`: The identifier of the asset. - * - `reserves`: The full list of trusted reserves information. - * - * Emits `AssetMinBalanceChanged` event when successful. - */ -set_reserves: TxDescriptor>}, -AssetRate: { - -/** - * Initialize a conversion rate to native balance for the given asset. - * - * ## Complexity - * - O(1) - */ -create: TxDescriptor>, - - -/** - * Update the conversion rate to native balance for the given asset. - * - * ## Complexity - * - O(1) - */ -update: TxDescriptor>, - - -/** - * Remove an existing conversion rate to native balance for the given asset. - * - * ## Complexity - * - O(1) - */ -remove: TxDescriptor>}, -CollatorSelection: { - -/** - * Set the list of invulnerable (fixed) collators. These collators must do some - * preparation, namely to have registered session keys. - * - * The call will remove any accounts that have not registered keys from the set. That is, - * it is non-atomic; the caller accepts all `AccountId`s passed in `new` _individually_ as - * acceptable Invulnerables, and is not proposing a _set_ of new Invulnerables. - * - * This call does not maintain mutual exclusivity of `Invulnerables` and `Candidates`. It - * is recommended to use a batch of `add_invulnerable` and `remove_invulnerable` instead. A - * `batch_all` can also be used to enforce atomicity. If any candidates are included in - * `new`, they should be removed with `remove_invulnerable_candidate` after execution. - * - * Must be called by the `UpdateOrigin`. - */ -set_invulnerables: TxDescriptor>, - - -/** - * Set the ideal number of non-invulnerable collators. If lowering this number, then the - * number of running collators could be higher than this figure. Aside from that edge case, - * there should be no other way to have more candidates than the desired number. - * - * The origin for this call must be the `UpdateOrigin`. - */ -set_desired_candidates: TxDescriptor>, - - -/** - * Set the candidacy bond amount. - * - * If the candidacy bond is increased by this call, all current candidates which have a - * deposit lower than the new bond will be kicked from the list and get their deposits - * back. - * - * The origin for this call must be the `UpdateOrigin`. - */ -set_candidacy_bond: TxDescriptor>, - - -/** - * Register this account as a collator candidate. The account must (a) already have - * registered session keys and (b) be able to reserve the `CandidacyBond`. - * - * This call is not available to `Invulnerable` collators. - */ -register_as_candidate: TxDescriptor, - - -/** - * Deregister `origin` as a collator candidate. Note that the collator can only leave on - * session change. The `CandidacyBond` will be unreserved immediately. - * - * This call will fail if the total number of candidates would drop below - * `MinEligibleCollators`. - */ -leave_intent: TxDescriptor, - - -/** - * Add a new account `who` to the list of `Invulnerables` collators. `who` must have - * registered session keys. If `who` is a candidate, they will be removed. - * - * The origin for this call must be the `UpdateOrigin`. - */ -add_invulnerable: TxDescriptor>, - - -/** - * Remove an account `who` from the list of `Invulnerables` collators. `Invulnerables` must - * be sorted. - * - * The origin for this call must be the `UpdateOrigin`. - */ -remove_invulnerable: TxDescriptor>, - - -/** - * Update the candidacy bond of collator candidate `origin` to a new amount `new_deposit`. - * - * Setting a `new_deposit` that is lower than the current deposit while `origin` is - * occupying a top-`DesiredCandidates` slot is not allowed. - * - * This call will fail if `origin` is not a collator candidate, the updated bond is lower - * than the minimum candidacy bond, and/or the amount cannot be reserved. - */ -update_bond: TxDescriptor>, - - -/** - * The caller `origin` replaces a candidate `target` in the collator candidate list by - * reserving `deposit`. The amount `deposit` reserved by the caller must be greater than - * the existing bond of the target it is trying to replace. - * - * This call will fail if the caller is already a collator candidate or invulnerable, the - * caller does not have registered session keys, the target is not a collator candidate, - * and/or the `deposit` amount cannot be reserved. - */ -take_candidate_slot: TxDescriptor>}, -Session: { - -/** - * Sets the session key(s) of the function caller to `keys`. - * Allows an account to set its session key prior to becoming a validator. - * This doesn't take effect until the next session. - * - * The dispatch origin of this function must be signed. - * - * ## Complexity - * - `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is - * fixed. - */ -set_keys: TxDescriptor>, - - -/** - * Removes any session key(s) of the function caller. - * - * This doesn't take effect until the next session. - * - * The dispatch origin of this function must be Signed and the account must be either be - * convertible to a validator ID using the chain's typical addressing system (this usually - * means being a controller account) or directly convertible into a validator ID (which - * usually means being a stash account). - * - * ## Complexity - * - `O(1)` in number of key types. Actual cost depends on the number of length of - * `T::Keys::key_ids()` which is fixed. - */ -purge_keys: TxDescriptor}, -XcmpQueue: { - -/** - * Suspends all XCM executions for the XCMP queue, regardless of the sender's origin. - * - * - `origin`: Must pass `ControllerOrigin`. - */ -suspend_xcm_execution: TxDescriptor, - - -/** - * Resumes all XCM executions for the XCMP queue. - * - * Note that this function doesn't change the status of the in/out bound channels. - * - * - `origin`: Must pass `ControllerOrigin`. - */ -resume_xcm_execution: TxDescriptor, - - -/** - * Overwrites the number of pages which must be in the queue for the other side to be - * told to suspend their sending. - * - * - `origin`: Must pass `Root`. - * - `new`: Desired value for `QueueConfigData.suspend_value` - */ -update_suspend_threshold: TxDescriptor>, - - -/** - * Overwrites the number of pages which must be in the queue after which we drop any - * further messages from the channel. - * - * - `origin`: Must pass `Root`. - * - `new`: Desired value for `QueueConfigData.drop_threshold` - */ -update_drop_threshold: TxDescriptor>, - - -/** - * Overwrites the number of pages which the queue must be reduced to before it signals - * that message sending may recommence after it has been suspended. - * - * - `origin`: Must pass `Root`. - * - `new`: Desired value for `QueueConfigData.resume_threshold` - */ -update_resume_threshold: TxDescriptor>}, -PolkadotXcm: { - -/** - - */ -send: TxDescriptor>, - - -/** - * Teleport some assets from the local chain to some destination chain. - * - * **This function is deprecated: Use `limited_teleport_assets` instead.** - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, - * with all fees taken as needed from the asset. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` chain. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - */ -teleport_assets: TxDescriptor>, - - -/** - * Transfer some assets from the local chain to the destination chain through their local, - * destination or remote reserve. - * - * `assets` must have same reserve location and may not be teleportable to `dest`. - * - `assets` have local reserve: transfer assets to sovereign account of destination - * chain and forward a notification XCM to `dest` to mint and deposit reserve-based - * assets to `beneficiary`. - * - `assets` have destination reserve: burn local assets and forward a notification to - * `dest` chain to withdraw the reserve assets from this chain's sovereign account and - * deposit them to `beneficiary`. - * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move - * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` - * to mint and deposit reserve-based assets to `beneficiary`. - * - * **This function is deprecated: Use `limited_reserve_transfer_assets` instead.** - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, - * with all fees taken as needed from the asset. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - */ -reserve_transfer_assets: TxDescriptor>, - - -/** - * Execute an XCM message from a local, signed, origin. - * - * An event is deposited indicating whether `msg` could be executed completely or only - * partially. - * - * No more than `max_weight` will be used in its attempted execution. If this is less than - * the maximum amount of weight that the message could take to be executed, then no - * execution attempt will be made. - */ -execute: TxDescriptor>, - - -/** - * Extoll that a particular destination can be communicated with through a particular - * version of XCM. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `location`: The destination that is being described. - * - `xcm_version`: The latest version of XCM that `location` supports. - */ -force_xcm_version: TxDescriptor>, - - -/** - * Set a safe XCM version (the version that XCM should be encoded with if the most recent - * version a destination can accept is unknown). - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. - */ -force_default_xcm_version: TxDescriptor>, - - -/** - * Ask a location to notify us regarding their XCM version and any changes to it. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `location`: The location to which we should subscribe for XCM version notifications. - */ -force_subscribe_version_notify: TxDescriptor>, - - -/** - * Require that a particular destination should no longer notify us regarding any XCM - * version changes. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `location`: The location to which we are currently subscribed for XCM version - * notifications which we no longer desire. - */ -force_unsubscribe_version_notify: TxDescriptor>, - - -/** - * Transfer some assets from the local chain to the destination chain through their local, - * destination or remote reserve. - * - * `assets` must have same reserve location and may not be teleportable to `dest`. - * - `assets` have local reserve: transfer assets to sovereign account of destination - * chain and forward a notification XCM to `dest` to mint and deposit reserve-based - * assets to `beneficiary`. - * - `assets` have destination reserve: burn local assets and forward a notification to - * `dest` chain to withdraw the reserve assets from this chain's sovereign account and - * deposit them to `beneficiary`. - * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move - * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` - * to mint and deposit reserve-based assets to `beneficiary`. - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight - * is needed than `weight_limit`, then the operation will fail and the sent assets may be - * at risk. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -limited_reserve_transfer_assets: TxDescriptor>, - - -/** - * Teleport some assets from the local chain to some destination chain. - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight - * is needed than `weight_limit`, then the operation will fail and the sent assets may be - * at risk. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` chain. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -limited_teleport_assets: TxDescriptor>, - - -/** - * Set or unset the global suspension state of the XCM executor. - * - * - `origin`: Must be an origin specified by AdminOrigin. - * - `suspended`: `true` to suspend, `false` to resume. - */ -force_suspension: TxDescriptor>, - - -/** - * Transfer some assets from the local chain to the destination chain through their local, - * destination or remote reserve, or through teleports. - * - * Fee payment on the destination side is made from the asset in the `assets` vector of - * index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for - * `weight_limit` of weight. If more weight is needed than `weight_limit`, then the - * operation will fail and the sent assets may be at risk. - * - * `assets` (excluding `fees`) must have same reserve location or otherwise be teleportable - * to `dest`, no limitations imposed on `fees`. - * - for local reserve: transfer assets to sovereign account of destination chain and - * forward a notification XCM to `dest` to mint and deposit reserve-based assets to - * `beneficiary`. - * - for destination reserve: burn local assets and forward a notification to `dest` chain - * to withdraw the reserve assets from this chain's sovereign account and deposit them - * to `beneficiary`. - * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves - * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint - * and deposit reserve-based assets to `beneficiary`. - * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport - * assets and deposit them to `beneficiary`. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `X2(Parent, - * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send - * from relay to parachain. - * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will - * generally be an `AccountId32` value. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `fee_asset_item`: The index into `assets` of the item which should be used to pay - * fees. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -transfer_assets: TxDescriptor>, - - -/** - * Claims assets trapped on this pallet because of leftover assets during XCM execution. - * - * - `origin`: Anyone can call this extrinsic. - * - `assets`: The exact assets that were trapped. Use the version to specify what version - * was the latest when they were trapped. - * - `beneficiary`: The location/account where the claimed assets will be deposited. - */ -claim_assets: TxDescriptor>, - - -/** - * Transfer assets from the local chain to the destination chain using explicit transfer - * types for assets and fees. - * - * `assets` must have same reserve location or may be teleportable to `dest`. Caller must - * provide the `assets_transfer_type` to be used for `assets`: - * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination - * chain and forward a notification XCM to `dest` to mint and deposit reserve-based - * assets to `beneficiary`. - * - `TransferType::DestinationReserve`: burn local assets and forward a notification to - * `dest` chain to withdraw the reserve assets from this chain's sovereign account and - * deposit them to `beneficiary`. - * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` - * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another - * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically - * the remote `reserve` is Asset Hub. - * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to - * mint/teleport assets and deposit them to `beneficiary`. - * - * On the destination chain, as well as any intermediary hops, `BuyExecution` is used to - * buy execution using transferred `assets` identified by `remote_fees_id`. - * Make sure enough of the specified `remote_fees_id` asset is included in the given list - * of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight - * is needed than `weight_limit`, then the operation will fail and the sent assets may be - * at risk. - * - * `remote_fees_id` may use different transfer type than rest of `assets` and can be - * specified through `fees_transfer_type`. - * - * The caller needs to specify what should happen to the transferred assets once they reach - * the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which - * contains the instructions to execute on `dest` as a final step. - * This is usually as simple as: - * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, - * but could be something more exotic like sending the `assets` even further. - * - * - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - * - `dest`: Destination context for the assets. Will typically be `[Parent, - * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from - * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from - * parachain across a bridge to another ecosystem destination. - * - `assets`: The assets to be withdrawn. This should include the assets used to pay the - * fee on the `dest` (and possibly reserve) chains. - * - `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. - * - `remote_fees_id`: One of the included `assets` to be used to pay fees. - * - `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. - * - `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the - * transfer, which also determines what happens to the assets on the destination chain. - * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. - */ -transfer_assets_using_type_and_then: TxDescriptor>, - - -/** - * Authorize another `aliaser` location to alias into the local `origin` making this call. - * The `aliaser` is only authorized until the provided `expiry` block number. - * The call can also be used for a previously authorized alias in order to update its - * `expiry` block number. - * - * Usually useful to allow your local account to be aliased into from a remote location - * also under your control (like your account on another chain). - * - * WARNING: make sure the caller `origin` (you) trusts the `aliaser` location to act in - * their/your name. Once authorized using this call, the `aliaser` can freely impersonate - * `origin` in XCM programs executed on the local chain. - */ -add_authorized_alias: TxDescriptor>, - - -/** - * Remove a previously authorized `aliaser` from the list of locations that can alias into - * the local `origin` making this call. - */ -remove_authorized_alias: TxDescriptor>, - - -/** - * Remove all previously authorized `aliaser`s that can alias into the local `origin` - * making this call. - */ -remove_all_authorized_aliases: TxDescriptor}, -MessageQueue: { - -/** - * Remove a page which has no more messages remaining to be processed or is stale. - */ -reap_page: TxDescriptor>, - - -/** - * Execute an overweight message. - * - * Temporary processing errors will be propagated whereas permanent errors are treated - * as success condition. - * - * - `origin`: Must be `Signed`. - * - `message_origin`: The origin from which the message to be executed arrived. - * - `page`: The page in the queue in which the message to be executed is sitting. - * - `index`: The index into the queue of the message to be executed. - * - `weight_limit`: The maximum amount of weight allowed to be consumed in the execution - * of the message. - * - * Benchmark complexity considerations: O(index + weight_limit). - */ -execute_overweight: TxDescriptor>}, -Utility: { - -/** - * Send a batch of dispatch calls. - * - * May be called from any origin except `None`. - * - * - `calls`: The calls to be dispatched from the same origin. The number of call must not - * exceed the constant: `batched_calls_limit` (available in constant metadata). - * - * If origin is root then the calls are dispatched without checking origin filter. (This - * includes bypassing `frame_system::Config::BaseCallFilter`). - * - * ## Complexity - * - O(C) where C is the number of calls to be batched. - * - * This will return `Ok` in all circumstances. To determine the success of the batch, an - * event is deposited. If a call failed and the batch was interrupted, then the - * `BatchInterrupted` event is deposited, along with the number of successful calls made - * and the error of the failed call. If all were successful, then the `BatchCompleted` - * event is deposited. - */ -batch: TxDescriptor>, - - -/** - * Send a call through an indexed pseudonym of the sender. - * - * Filter from origin are passed along. The call will be dispatched with an origin which - * use the same filter as the origin of this call. - * - * NOTE: If you need to ensure that any account-based filtering is not honored (i.e. - * because you expect `proxy` to have been used prior in the call stack and you do not want - * the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` - * in the Multisig pallet instead. - * - * NOTE: Prior to version *12, this was called `as_limited_sub`. - * - * The dispatch origin for this call must be _Signed_. - */ -as_derivative: TxDescriptor>, - - -/** - * Send a batch of dispatch calls and atomically execute them. - * The whole transaction will rollback and fail if any of the calls failed. - * - * May be called from any origin except `None`. - * - * - `calls`: The calls to be dispatched from the same origin. The number of call must not - * exceed the constant: `batched_calls_limit` (available in constant metadata). - * - * If origin is root then the calls are dispatched without checking origin filter. (This - * includes bypassing `frame_system::Config::BaseCallFilter`). - * - * ## Complexity - * - O(C) where C is the number of calls to be batched. - */ -batch_all: TxDescriptor>, - - -/** - * Dispatches a function call with a provided origin. - * - * The dispatch origin for this call must be _Root_. - * - * ## Complexity - * - O(1). - */ -dispatch_as: TxDescriptor>, - - -/** - * Send a batch of dispatch calls. - * Unlike `batch`, it allows errors and won't interrupt. - * - * May be called from any origin except `None`. - * - * - `calls`: The calls to be dispatched from the same origin. The number of call must not - * exceed the constant: `batched_calls_limit` (available in constant metadata). - * - * If origin is root then the calls are dispatch without checking origin filter. (This - * includes bypassing `frame_system::Config::BaseCallFilter`). - * - * ## Complexity - * - O(C) where C is the number of calls to be batched. - */ -force_batch: TxDescriptor>, - - -/** - * Dispatch a function call with a specified weight. - * - * This function does not check the weight of the call, and instead allows the - * Root origin to specify the weight of the call. - * - * The dispatch origin for this call must be _Root_. - */ -with_weight: TxDescriptor>, - - -/** - * Dispatch a fallback call in the event the main call fails to execute. - * May be called from any origin except `None`. - * - * This function first attempts to dispatch the `main` call. - * If the `main` call fails, the `fallback` is attemted. - * if the fallback is successfully dispatched, the weights of both calls - * are accumulated and an event containing the main call error is deposited. - * - * In the event of a fallback failure the whole call fails - * with the weights returned. - * - * - `main`: The main call to be dispatched. This is the primary action to execute. - * - `fallback`: The fallback call to be dispatched in case the `main` call fails. - * - * ## Dispatch Logic - * - If the origin is `root`, both the main and fallback calls are executed without - * applying any origin filters. - * - If the origin is not `root`, the origin filter is applied to both the `main` and - * `fallback` calls. - * - * ## Use Case - * - Some use cases might involve submitting a `batch` type call in either main, fallback - * or both. - */ -if_else: TxDescriptor>, - - -/** - * Dispatches a function call with a provided origin. - * - * Almost the same as [`Pallet::dispatch_as`] but forwards any error of the inner call. - * - * The dispatch origin for this call must be _Root_. - */ -dispatch_as_fallible: TxDescriptor>}, -Multisig: { - -/** - * Immediately dispatch a multi-signature call using a single approval from the caller. - * - * The dispatch origin for this call must be _Signed_. - * - * - `other_signatories`: The accounts (other than the sender) who are part of the - * multi-signature, but do not participate in the approval process. - * - `call`: The call to be executed. - * - * Result is equivalent to the dispatched result. - * - * ## Complexity - * O(Z + C) where Z is the length of the call and C its execution weight. - */ -as_multi_threshold_1: TxDescriptor>, - - -/** - * Register approval for a dispatch to be made from a deterministic composite account if - * approved by a total of `threshold - 1` of `other_signatories`. - * - * If there are enough, then dispatch the call. - * - * Payment: `DepositBase` will be reserved if this is the first approval, plus - * `threshold` times `DepositFactor`. It is returned once this dispatch happens or - * is cancelled. - * - * The dispatch origin for this call must be _Signed_. - * - * - `threshold`: The total number of approvals for this dispatch before it is executed. - * - `other_signatories`: The accounts (other than the sender) who can approve this - * dispatch. May not be empty. - * - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is - * not the first approval, then it must be `Some`, with the timepoint (block number and - * transaction index) of the first approval transaction. - * - `call`: The call to be executed. - * - * NOTE: Unless this is the final approval, you will generally want to use - * `approve_as_multi` instead, since it only requires a hash of the call. - * - * Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise - * on success, result is `Ok` and the result from the interior call, if it was executed, - * may be found in the deposited `MultisigExecuted` event. - * - * ## Complexity - * - `O(S + Z + Call)`. - * - Up to one balance-reserve or unreserve operation. - * - One passthrough operation, one insert, both `O(S)` where `S` is the number of - * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. - * - One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. - * - One encode & hash, both of complexity `O(S)`. - * - Up to one binary search and insert (`O(logS + S)`). - * - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. - * - One event. - * - The weight of the `call`. - * - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit - * taken for its lifetime of `DepositBase + threshold * DepositFactor`. - */ -as_multi: TxDescriptor>, - - -/** - * Register approval for a dispatch to be made from a deterministic composite account if - * approved by a total of `threshold - 1` of `other_signatories`. - * - * Payment: `DepositBase` will be reserved if this is the first approval, plus - * `threshold` times `DepositFactor`. It is returned once this dispatch happens or - * is cancelled. - * - * The dispatch origin for this call must be _Signed_. - * - * - `threshold`: The total number of approvals for this dispatch before it is executed. - * - `other_signatories`: The accounts (other than the sender) who can approve this - * dispatch. May not be empty. - * - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is - * not the first approval, then it must be `Some`, with the timepoint (block number and - * transaction index) of the first approval transaction. - * - `call_hash`: The hash of the call to be executed. - * - * NOTE: If this is the final approval, you will want to use `as_multi` instead. - * - * ## Complexity - * - `O(S)`. - * - Up to one balance-reserve or unreserve operation. - * - One passthrough operation, one insert, both `O(S)` where `S` is the number of - * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. - * - One encode & hash, both of complexity `O(S)`. - * - Up to one binary search and insert (`O(logS + S)`). - * - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. - * - One event. - * - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit - * taken for its lifetime of `DepositBase + threshold * DepositFactor`. - */ -approve_as_multi: TxDescriptor>, - - -/** - * Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously - * for this operation will be unreserved on success. - * - * The dispatch origin for this call must be _Signed_. - * - * - `threshold`: The total number of approvals for this dispatch before it is executed. - * - `other_signatories`: The accounts (other than the sender) who can approve this - * dispatch. May not be empty. - * - `timepoint`: The timepoint (block number and transaction index) of the first approval - * transaction for this dispatch. - * - `call_hash`: The hash of the call to be executed. - * - * ## Complexity - * - `O(S)`. - * - Up to one balance-reserve or unreserve operation. - * - One passthrough operation, one insert, both `O(S)` where `S` is the number of - * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. - * - One encode & hash, both of complexity `O(S)`. - * - One event. - * - I/O: 1 read `O(S)`, one remove. - * - Storage: removes one item. - */ -cancel_as_multi: TxDescriptor>, - - -/** - * Poke the deposit reserved for an existing multisig operation. - * - * The dispatch origin for this call must be _Signed_ and must be the original depositor of - * the multisig operation. - * - * The transaction fee is waived if the deposit amount has changed. - * - * - `threshold`: The total number of approvals needed for this multisig. - * - `other_signatories`: The accounts (other than the sender) who are part of the - * multisig. - * - `call_hash`: The hash of the call this deposit is reserved for. - * - * Emits `DepositPoked` if successful. - */ -poke_deposit: TxDescriptor>}, -Sudo: { - -/** - * Authenticates the sudo key and dispatches a function call with `Root` origin. - */ -sudo: TxDescriptor>, - - -/** - * Authenticates the sudo key and dispatches a function call with `Root` origin. - * This function does not check the weight of the call, and instead allows the - * Sudo user to specify the weight of the call. - * - * The dispatch origin for this call must be _Signed_. - */ -sudo_unchecked_weight: TxDescriptor>, - - -/** - * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo - * key. - */ -set_key: TxDescriptor>, - - -/** - * Authenticates the sudo key and dispatches a function call with `Signed` origin from - * a given account. - * - * The dispatch origin for this call must be _Signed_. - */ -sudo_as: TxDescriptor>, - - -/** - * Permanently removes the sudo key. - * - * **This cannot be un-done.** - */ -remove_key: TxDescriptor}, -Proxy: { - -/** - * Dispatch the given `call` from an account that the sender is authorised for through - * `add_proxy`. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. - * - `call`: The call to be made by the `real` account. - */ -proxy: TxDescriptor>, - - -/** - * Register a proxy account for the sender that is able to make calls on its behalf. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `proxy`: The account that the `caller` would like to make a proxy. - * - `proxy_type`: The permissions allowed for this proxy account. - * - `delay`: The announcement period required of the initial proxy. Will generally be - * zero. - */ -add_proxy: TxDescriptor>, - - -/** - * Unregister a proxy account for the sender. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `proxy`: The account that the `caller` would like to remove as a proxy. - * - `proxy_type`: The permissions currently enabled for the removed proxy account. - */ -remove_proxy: TxDescriptor>, - - -/** - * Unregister all proxy accounts for the sender. - * - * The dispatch origin for this call must be _Signed_. - * - * WARNING: This may be called on accounts created by `create_pure`, however if done, then - * the unreserved fees will be inaccessible. **All access to this account will be lost.** - */ -remove_proxies: TxDescriptor, - - -/** - * Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and - * initialize it with a proxy of `proxy_type` for `origin` sender. - * - * Requires a `Signed` origin. - * - * - `proxy_type`: The type of the proxy that the sender will be registered as over the - * new account. This will almost always be the most permissive `ProxyType` possible to - * allow for maximum flexibility. - * - `index`: A disambiguation index, in case this is called multiple times in the same - * transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just - * want to use `0`. - * - `delay`: The announcement period required of the initial proxy. Will generally be - * zero. - * - * Fails with `Duplicate` if this has already been called in this transaction, from the - * same sender, with the same parameters. - * - * Fails if there are insufficient funds to pay for deposit. - */ -create_pure: TxDescriptor>, - - -/** - * Removes a previously spawned pure proxy. - * - * WARNING: **All access to this account will be lost.** Any funds held in it will be - * inaccessible. - * - * Requires a `Signed` origin, and the sender account must have been created by a call to - * `create_pure` with corresponding parameters. - * - * - `spawner`: The account that originally called `create_pure` to create this account. - * - `index`: The disambiguation index originally passed to `create_pure`. Probably `0`. - * - `proxy_type`: The proxy type originally passed to `create_pure`. - * - `height`: The height of the chain when the call to `create_pure` was processed. - * - `ext_index`: The extrinsic index in which the call to `create_pure` was processed. - * - * Fails with `NoPermission` in case the caller is not a previously created pure - * account whose `create_pure` call has corresponding parameters. - */ -kill_pure: TxDescriptor>, - - -/** - * Publish the hash of a proxy-call that will be made in the future. - * - * This must be called some number of blocks before the corresponding `proxy` is attempted - * if the delay associated with the proxy relationship is greater than zero. - * - * No more than `MaxPending` announcements may be made at any one time. - * - * This will take a deposit of `AnnouncementDepositFactor` as well as - * `AnnouncementDepositBase` if there are no other pending announcements. - * - * The dispatch origin for this call must be _Signed_ and a proxy of `real`. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `call_hash`: The hash of the call to be made by the `real` account. - */ -announce: TxDescriptor>, - - -/** - * Remove a given announcement. - * - * May be called by a proxy account to remove a call they previously announced and return - * the deposit. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `call_hash`: The hash of the call to be made by the `real` account. - */ -remove_announcement: TxDescriptor>, - - -/** - * Remove the given announcement of a delegate. - * - * May be called by a target (proxied) account to remove a call that one of their delegates - * (`delegate`) has announced they want to execute. The deposit is returned. - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `delegate`: The account that previously announced the call. - * - `call_hash`: The hash of the call to be made. - */ -reject_announcement: TxDescriptor>, - - -/** - * Dispatch the given `call` from an account that the sender is authorized for through - * `add_proxy`. - * - * Removes any corresponding announcement(s). - * - * The dispatch origin for this call must be _Signed_. - * - * Parameters: - * - `real`: The account that the proxy will make a call on behalf of. - * - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. - * - `call`: The call to be made by the `real` account. - */ -proxy_announced: TxDescriptor>, - - -/** - * Poke / Adjust deposits made for proxies and announcements based on current values. - * This can be used by accounts to possibly lower their locked amount. - * - * The dispatch origin for this call must be _Signed_. - * - * The transaction fee is waived if the deposit amount has changed. - * - * Emits `DepositPoked` if successful. - */ -poke_deposit: TxDescriptor}, -Identity: { - -/** - * Add a registrar to the system. - * - * The dispatch origin for this call must be `T::RegistrarOrigin`. - * - * - `account`: the account of the registrar. - * - * Emits `RegistrarAdded` if successful. - */ -add_registrar: TxDescriptor>, - - -/** - * Set an account's identity information and reserve the appropriate deposit. - * - * If the account already has identity information, the deposit is taken as part payment - * for the new deposit. - * - * The dispatch origin for this call must be _Signed_. - * - * - `info`: The identity information. - * - * Emits `IdentitySet` if successful. - */ -set_identity: TxDescriptor>, - - -/** - * Set the sub-accounts of the sender. - * - * Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned - * and an amount `SubAccountDeposit` will be reserved for each item in `subs`. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * identity. - * - * - `subs`: The identity's (new) sub-accounts. - */ -set_subs: TxDescriptor>, - - -/** - * Clear an account's identity info and all sub-accounts and return all deposits. - * - * Payment: All reserved balances on the account are returned. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * identity. - * - * Emits `IdentityCleared` if successful. - */ -clear_identity: TxDescriptor, - - -/** - * Request a judgement from a registrar. - * - * Payment: At most `max_fee` will be reserved for payment to the registrar if judgement - * given. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a - * registered identity. - * - * - `reg_index`: The index of the registrar whose judgement is requested. - * - `max_fee`: The maximum fee that may be paid. This should just be auto-populated as: - * - * ```nocompile - * Self::registrars().get(reg_index).unwrap().fee - * ``` - * - * Emits `JudgementRequested` if successful. - */ -request_judgement: TxDescriptor>, - - -/** - * Cancel a previous request. - * - * Payment: A previously reserved deposit is returned on success. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a - * registered identity. - * - * - `reg_index`: The index of the registrar whose judgement is no longer requested. - * - * Emits `JudgementUnrequested` if successful. - */ -cancel_request: TxDescriptor>, - - -/** - * Set the fee required for a judgement to be requested from a registrar. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `index`. - * - * - `index`: the index of the registrar whose fee is to be set. - * - `fee`: the new fee. - */ -set_fee: TxDescriptor>, - - -/** - * Change the account associated with a registrar. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `index`. - * - * - `index`: the index of the registrar whose fee is to be set. - * - `new`: the new account ID. - */ -set_account_id: TxDescriptor>, - - -/** - * Set the field information for a registrar. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `index`. - * - * - `index`: the index of the registrar whose fee is to be set. - * - `fields`: the fields that the registrar concerns themselves with. - */ -set_fields: TxDescriptor>, - - -/** - * Provide a judgement for an account's identity. - * - * The dispatch origin for this call must be _Signed_ and the sender must be the account - * of the registrar whose index is `reg_index`. - * - * - `reg_index`: the index of the registrar whose judgement is being made. - * - `target`: the account whose identity the judgement is upon. This must be an account - * with a registered identity. - * - `judgement`: the judgement of the registrar of index `reg_index` about `target`. - * - `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is - * provided. - * - * Note: Judgements do not apply to a username. - * - * Emits `JudgementGiven` if successful. - */ -provide_judgement: TxDescriptor>, - - -/** - * Remove an account's identity and sub-account information and slash the deposits. - * - * Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by - * `Slash`. Verification request deposits are not returned; they should be cancelled - * manually using `cancel_request`. - * - * The dispatch origin for this call must match `T::ForceOrigin`. - * - * - `target`: the account whose identity the judgement is upon. This must be an account - * with a registered identity. - * - * Emits `IdentityKilled` if successful. - */ -kill_identity: TxDescriptor>, - - -/** - * Add the given account to the sender's subs. - * - * Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated - * to the sender. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * sub identity of `sub`. - */ -add_sub: TxDescriptor>, - - -/** - * Alter the associated name of the given sub-account. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * sub identity of `sub`. - */ -rename_sub: TxDescriptor>, - - -/** - * Remove the given account from the sender's subs. - * - * Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated - * to the sender. - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * sub identity of `sub`. - */ -remove_sub: TxDescriptor>, - - -/** - * Remove the sender as a sub-account. - * - * Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated - * to the sender (*not* the original depositor). - * - * The dispatch origin for this call must be _Signed_ and the sender must have a registered - * super-identity. - * - * NOTE: This should not normally be used, but is provided in the case that the non- - * controller of an account is maliciously registered as a sub-account. - */ -quit_sub: TxDescriptor, - - -/** - * Add an `AccountId` with permission to grant usernames with a given `suffix` appended. - * - * The authority can grant up to `allocation` usernames. To top up the allocation or - * change the account used to grant usernames, this call can be used with the updated - * parameters to overwrite the existing configuration. - */ -add_username_authority: TxDescriptor>, - - -/** - * Remove `authority` from the username authorities. - */ -remove_username_authority: TxDescriptor>, - - -/** - * Set the username for `who`. Must be called by a username authority. - * - * If `use_allocation` is set, the authority must have a username allocation available to - * spend. Otherwise, the authority will need to put up a deposit for registering the - * username. - * - * Users can either pre-sign their usernames or - * accept them later. - * - * Usernames must: - * - Only contain lowercase ASCII characters or digits. - * - When combined with the suffix of the issuing authority be _less than_ the - * `MaxUsernameLength`. - */ -set_username_for: TxDescriptor>, - - -/** - * Accept a given username that an `authority` granted. The call must include the full - * username, as in `username.suffix`. Authorities cannot grant usernames to people, only - * to regular accounts. - */ -accept_username: TxDescriptor>, - - -/** - * Remove an expired username approval. The username was approved by an authority but never - * accepted by the user and must now be beyond its expiration. The call must include the - * full username, as in `username.suffix`. - */ -remove_expired_approval: TxDescriptor>, - - -/** - * Set a given username as the primary. The username should include the suffix. Only - * regular accounts can set their primary username, as people can only have one username, - * granted through a system allocation. - */ -set_primary_username: TxDescriptor>, - - -/** - * Start the process of removing a username by placing it in the unbinding usernames map. - * Once the grace period has passed, the username can be deleted by calling - * [remove_username](crate::Call::remove_username). - */ -unbind_username: TxDescriptor>, - - -/** - * Permanently delete a username which has been unbinding for longer than the grace period. - * Caller is refunded the fee if the username expired and the removal was successful. - */ -remove_username: TxDescriptor>, - - -/** - * Call with [ForceOrigin](crate::Config::ForceOrigin) privileges which deletes a username - * and slashes any deposit associated with it. - */ -kill_username: TxDescriptor>, - - -/** - * Sets the username and on-chain account for a person, along with an empty identity which - * can only be populated using an oracle through the social credential verification system. - * The chosen username must be domainless. - * - * The sender must sign the alias using the key associated with the provided on-chain - * account to prove ownership. - * - * The dispatch origin for this call must be the contextual alias of the person and the - * sender must not have already registered their identity and username. - * - * Emits `PersonalIdentitySet` if successful. - */ -set_personal_identity: TxDescriptor>, - - -/** - * Open a case for an oracle to judge a social credential of a person. - * - * The dispatch origin for this call must be the contextual alias of the person and the - * sender must have a registered identity. - * - * Emits `EvidenceSubmitted` if successful. - */ -submit_personal_credential_evidence: TxDescriptor>, - - -/** - * Callback to enforce the judgement of a social credential. This is to be called only by - * the oracle that judged the case. - */ -personal_credential_judged: TxDescriptor>, - - -/** - * Clear a person's identity info. The sender must pay a penalty through the associated - * alias account for removing the identity. - * - * The dispatch origin for this call must be the contextual alias of the person and the - * sender must have a registered identity. - * - * Emits `IdentityPersonalCleared` if successful. - */ -clear_personal_identity: TxDescriptor, - - -/** - * Report a username as invalid/offensive/wrong/anything else. - * - * The dispatch origin for this call must be a signed extrinsic. - * - * - `username`: The username to be reported. - */ -report_username: TxDescriptor>, - - -/** - * Given judgement on a previously reported username either: - * 1. In case username was found valid: - * - slashes the amount deposited by the reporter, - * - does nothing to the identity behind the reported username, - * 2. In case username was found invalid: - * - returns the deposited funds to the reporter, - * - bans the identity behind the reported username. - * Serves as a callback used upon judgement request to the oracle. - * Must only be used by the statement oracle. - */ -reported_username_judged: TxDescriptor>}, -People: { - -/** - * Dispatch a call under an alias using the `account <-> alias` mapping. - * - * This is a call version of the transaction extension `AsPersonalAliasWithAccount`. - * It is recommended to use the transaction extension instead when suitable. - */ -under_alias: TxDescriptor>, - - -/** - * This transaction is refunded if successful and no alias was previously set. - * - * The call is valid from `call_valid_at` until - * `call_valid_at + account_setup_time_tolerance`. - * `account_setup_time_tolerance` is a constant available in the metadata. - * - * Parameters: - * - `account`: The account to set the alias for. - * - `call_valid_at`: The block number when the call becomes valid. - */ -set_alias_account: TxDescriptor>, - - -/** - * Remove the mapping from a particular alias to its registered account. - */ -unset_alias_account: TxDescriptor, - - -/** - * Recognize a set of people without any additional checks. - * - * The people are identified by the provided list of keys and will each be assigned, in - * order, the next available personal ID. - * - * The origin for this call must have root privileges. - */ -force_recognize_personhood: TxDescriptor>, - - -/** - * Set a personal id account. - * - * The account can then be used to sign transactions on behalf of the personal id, and - * provide replay protection with the nonce. - * - * This transaction is refunded if successful and no account was previously set for the - * personal id. - * - * The call is valid from `call_valid_at` until - * `call_valid_at + account_setup_time_tolerance`. - * `account_setup_time_tolerance` is a constant available in the metadata. - * - * Parameters: - * - `account`: The account to set the alias for. - * - `call_valid_at`: The block number when the call becomes valid. - */ -set_personal_id_account: TxDescriptor>, - - -/** - * Unset the personal id account. - */ -unset_personal_id_account: TxDescriptor, - - -/** - * Create the people collection. - * - * This call is valid only if the collection doesn't exist yet. Once created, - * this call cannot be executed again. - * - * The collection is created with a fixed configuration: - * - Owner: Configured via `CollectionOwner` type - * - Onboarding size: `PEOPLE_ONBOARDING_SIZE` (10) - * - Mode: `Flexible` - * - Ring size: `R2e9` - */ -create_people_collection: TxDescriptor}, -MobRule: { - -/** - * Feeless on success (determined only by top three lines). - */ -vote: TxDescriptor>, - - -/** - - */ -close_case: TxDescriptor>, - - -/** - * Origin must be `None`. The transaction is validated in `ValidateUnsigned` - * when the source is local (e.g. from the offchain worker). For external transactions, use - * `clean_vote_signed`. - */ -clean_vote: TxDescriptor>, - - -/** - - */ -reap_case: TxDescriptor>, - - -/** - - */ -intervene: TxDescriptor>, - - -/** - * A person claims the mob credit associated with a correct vote on a case. - * The case must be `Done`. - */ -claim_vote: TxDescriptor>, - - -/** - * A person converts their claimed mob credit into a direct transfer. - */ -payout_rewards: TxDescriptor>, - - -/** - * A person claims multiple mob credits associated a correct vote on a case. The - * case must be `Done`. - */ -claim_votes: TxDescriptor>, - - -/** - - */ -start_payout_round: TxDescriptor, - - -/** - - */ -schedule_payout_rounds: TxDescriptor>, - - -/** - - */ -remove_payout_schedule: TxDescriptor>, - - -/** - - */ -claim_credit: TxDescriptor, - - -/** - - */ -clean_points: TxDescriptor>, - - -/** - - */ -force_ripen_case: TxDescriptor>, - - -/** - - */ -touch_case: TxDescriptor>, - - -/** - - */ -clear_voting_penalty: TxDescriptor, - - -/** - * Origin must be signed. - */ -clean_vote_signed: TxDescriptor>}, -ProofOfInk: { - -/** - * - Declare intention to get a tattoo. - * - Deposit is taken. - * - `InkType` may not be `ProceduralDerivative`. - */ -apply: TxDescriptor, - - -/** - * - Open a judicial case to judge the `evidence`. - * - Calls Judicial/`JudgeStatement(POI_HASH, evidence)` - * - Needs `SignedExtension` to avoid upfront requirement for fee if `judgements == 0`. - * - If `judgements > 0`, then an additional fee should be charged into Treasury. - */ -submit_evidence: TxDescriptor>, - - -/** - * Is called by the Oracle when the evidence has been judged. - */ -judged: TxDescriptor>, - - -/** - * - Gets a new `index` - * - Puts an entry into `People`. - * - Calls People/`newPerson(index, key)` - * - * # Arguments - * * `key` - The personal identity to register. - * * `destination` - The account receiving the candidate's referral reward. - * * `proof_of_ownerhsip` - The signature of predefined prefix `"pop register using"` - * concatenated with the sender account id. - */ -register_referred: TxDescriptor>, - - -/** - * - Gets a new `index` - * - Puts an entry into `People`. - * - Calls People/`newPerson(index, key)` - * - * # Arguments - * * `key` - The personal identity to register. - * * `destination` - The account receiving rewards. - * * `proof_of_ownerhsip` - The signature of predefined prefix `"pop register using"` - * concatenated with the sender account id. - * - * # Warning: - * - * This call can pay two rewards to the same account for non-referred candidates. - * The app is responsible for any additional privacy handling after transfer. - */ -register_non_referred: TxDescriptor>, - - -/** - - */ -reroll: TxDescriptor, - - -/** - * Commit to a design and authorize the storage for (possibly just initial) evidence. - * - * If a specific personal identity is required, then this can be placed in `require_id`. - * This can be any unused/unreserved personal identity no greater than the `NextId` - * counter. - */ -commit: TxDescriptor>, - - -/** - - */ -allocate_full: TxDescriptor, - - -/** - * Once a timeout passes, removes a candidate who is selected but not yet proven. - * If the candidate was referred then referral is bad, if candidate applied with deposit, - * deposit is slashed. - */ -timeout: TxDescriptor>, - - -/** - * Remove a candidate who has not yet committed. - */ -flakeout: TxDescriptor, - - -/** - * Utilize a referral signature. - * - * The payload to be signed by the referrer using their registered key pair is the encoded - * bytes of the account ID of the candidate. - */ -apply_with_signature: TxDescriptor>, - - -/** - * Apply to the Proof-of-Ink process with an invitation. - * - * The payload to be signed by the inviter using their registered key pair is the encoded - * bytes of the account ID of the candidate. - */ -apply_with_invitation: TxDescriptor>, - - -/** - * Add a design family. Must have privileged access to do this. - */ -add_design_family: TxDescriptor>, - - -/** - * Add a referral ticket associated with a person. - * - * Only one referral ticket may be active at any given time for one person. Calling this - * extrinsic while a valid ticket is set will overwrite the existing ticket. - * - * If any pending referral rewards are present, they need to be registered first. - */ -set_referral_ticket: TxDescriptor>, - - -/** - * Cancel a referral ticket associated with a person. - */ -cancel_referral_ticket: TxDescriptor>, - - -/** - - */ -register_successful_referral_reward: TxDescriptor>, - - -/** - * Grants invites to an account so they can distribute them. - * - * The origin must be `InvitationsOrigin. - * - * - `account`: The account to give invites to. - * - `count`: The number of invites to give. - */ -grant_invites: TxDescriptor>, - - -/** - * Remove all invites given to an account. - * - * The origin must be `InvitationsOrigin`. - * - * - `account`: The account to remove all invites from. - * - `limit`: The maximum number of pending invites to remove. - */ -remove_available_and_pending_invites: TxDescriptor>, - - -/** - * Invite an account. - * - * The origin must be signed by an account and have some invites left. - * - * - `ticket`: The invite ticket to set. - */ -set_invite_ticket: TxDescriptor>, - - -/** - * Cancel an invitation. - * - * The origin must be signed by the account that owns the ticket to cancel. - * - * - `ticket`: The invite ticket to cancel. - */ -cancel_invite_ticket: TxDescriptor>, - - -/** - * Set the configuration record. Must have privileged access to do this. - */ -set_configuration: TxDescriptor>, - - -/** - * Set the values of the reimbursement awarded to referred candidates as well as their - * referrers, along with the number of reimbursements for each value. These values are - * stored in - * reverse order of their priority, so the last value in the list will be the first one - * to be used by the reimbursement system. The length of the two lists must be equal. - * - * WARNING! - * - * After the number of reimbursements is exhausted for a value in the list, the pallet - * starts using the next value immediately for future transfers. - */ -set_reimbursement_values: TxDescriptor>}, -Game: { - -/** - * Sign up for the game using an account and an invite. - * - * This is for new players or archived players, other players should use - * [`Pallet::sign_up_with_account`] for free. - * - * A game must be ongoing and in its registration phase. - * - * The origin must be a signed by an account and use the `GameAsInvited` extension. - */ -sign_up_with_invite: TxDescriptor>, - - -/** - * Sign up for the game using an account. - * - * If the player is new or archived, then a deposit will be taken from the signer. - * Otherwise the call is free. - * - * A game must be ongoing and in its registration phase. - * - * The origin must be signed by an account, or, be signed by an account and use - * `ScoreAsParticipant` extension. - */ -sign_up_with_account: TxDescriptor>, - - -/** - * Sign up for the game. - * - * If a player is already recognized by another DIM, they can sign using their alias and - * don't need any deposit or invite to prove their initial credibility. - * On top of this their score is never going below personhood threshold and the player will - * never get archived. - * - * A game must be ongoing and in its registration phase. - * - * The origin must be a personal alias. - * - * Parameters: - * - `statement_account`: the account id to use to interact with the statement store during - * the game. - * - `sig`: the proof of ownership of the account `statement_account` by an alias, it is - * the signature of the message `"pop:game:stmt_account_for_alias:"` concatenated to the - * alias, and then hashed with `blake2_256` (blake2 256bit output). The base of the - * message can be found in the constant: `proof_of_ownership_msg_base`. - */ -sign_up_with_alias: TxDescriptor>, - - -/** - * After the game, send the full report. - * - * The game must be ongoing and in its reporting phase. - * - * The origin must be an alias, or signed by an account, or signed by an account and use - * `ScoreAsParticipant` extension. - */ -report: TxDescriptor>, - - -/** - * Offboard a player from the game. - * - * The origin must be an alias, or signed by an account, or signed by an account and use - * `ScoreAsParticipant` extension. - * - * There must be no game or the existing game must be in registration phase and the player - * must have not signed up for the game. - */ -offboard: TxDescriptor, - - -/** - * Kickout a kickable player that is not playing after `NonPlayingKickoutTime`. - * - * The origin must be signed by an account. - * - * - `player`: The player to kickout. It must be archived and kickable with - * `archived_since` older than `NonPlayingKickoutTime`. - */ -kickout: TxDescriptor>, - - -/** - * Grant some invites to an account so they can distribute them. - * - * The origin must be `InviteIssuer`. - * - * - `account`: The account to grant invites to. - * - `count`: The number of invites to grant. - */ -grant_invites: TxDescriptor>, - - -/** - * Clear all invites given to an account. - * - * The origin must be `InviteIssuer`. - * - * - `account`: The account to remove all invites from. - * - `limit`: The maximum number of pending invites to remove. - */ -remove_available_and_pending_invites: TxDescriptor>, - - -/** - * Invite an account. - * - * The origin must be signed by an account and have some invites left. - * - * - `ticket`: The invite ticket to set. - */ -set_invite_ticket: TxDescriptor>, - - -/** - * Cancel an invite. - * - * The origin must be signed by the account that owns the ticket to cancel. - * - * - `ticket`: The invite ticket to cancel. - */ -cancel_invite_ticket: TxDescriptor>, - - -/** - * Schedules new games according to provided schedules. - * Schedules must be in chronological order, and after the ongoing game (if there is any). - */ -schedule_games: TxDescriptor>, - - -/** - - */ -remove_scheduled_game: TxDescriptor>, - - -/** - * Force start the shuffle before its normal start time. - * - * This action can only be performed by the root origin and is only meant for testing. - */ -testnet_force_start_shuffle: TxDescriptor, - - -/** - * Force end a game's reporting phase before its normal end time. - * - * This action can only be performed by the root origin and is only meant for testing. - * - * The reporting phase only start when the mutation session can be started. The call will - * fail if the mutation session cannot be started. It can be retried few blocks later the - * time for the people mutation sessions to be proceed. - */ -testnet_force_end_reporting: TxDescriptor, - - -/** - * Force set the game phase periods. - * - * This action can only be performed by the root origin and is only meant for testing. - */ -testnet_set_game_phases: TxDescriptor>, - - -/** - * Kill the current game. Whatever the phase it is in. - */ -testnet_kill_current_game: TxDescriptor}, -Score: { - -/** - * Schedule payout rounds. - * - * Called from `ScheduleOrigin` or root. - */ -schedule_payout_rounds: TxDescriptor>, - - -/** - * Remove a scheduled payout round. - * - * Called from `ScheduleOrigin` or root. - */ -remove_payout_schedule: TxDescriptor>, - - -/** - * Start a new round. - * - * This is valid if the current round is finished, or if the current round doesn't have - * planning and a schedule exists to plan it. - * - * This is a task, and can be called from anybody. - */ -transition_round: TxDescriptor>, - - -/** - * Operate some round paying out. - * - * Drains round's participants, up to a limit. For each participant, add the calculated - * reward (`base_reward + remainder_portion`) to their `credit` balance. - * - * Then, moves funds on the pot account from Payout to Credit, so they are owed to specific - * participants rather than the round pool. - * - * Finally, release the leftover from the Payout hold back to the pot's free balance - * (funds are recycled). - * - * This is a task, and can be called from anybody. - * - * * round_index: The index of the round to operate. - * * limit: The maximum number of participants to operate in this call. - */ -operate_payout_round: TxDescriptor>, - - -/** - * Cash out half of the score, rounded up. Converts the score into points for the current - * payout round. Caller must have never reached personhood since onboarding. - * - * It can be called once per game session (era). - * - * Origin must be signed or participant (signed extrinsic using ScoreAsParticipant - * transaction extension) - * - * Alias origin is not allowed as they can't cash out. - */ -cash_out: TxDescriptor, - - -/** - * Redeem full accumulated credit, transferring it to the provided destination account. - * - * Credit is converted from points during payout processing. - * - * Origin must be a person alias, a signed account or a participant (signed extrinsic - * using ScoreAsParticipant transaction extension). - */ -redeem_credit: TxDescriptor>, - - -/** - * Register as a person, or resume personhood after suspension. - * - * Requires score >= personhood threshold (or having previously reached it). - * - * If the participant was previously recognised and is now suspended, they must not provide - * a key. The existing key is reused. - * - * If the participant was never recognised, they must provide a key and a proof of - * ownership (`key` parameter): a signature over `"pop register using" || - * sender_account_id`. - * - * Origin must be signed or a participant (signed extrinsic using ScoreAsParticipant - * transaction extension). - */ -register: TxDescriptor>, - - -/** - * Set the absence grace schedule. - * - * Every tier must satisfy: `0 <= window <= 8` and `allowed_misses < window`. - * `allowed_misses = 0` disables grace entirely (any absence immediately - * suspends). - * - * Tiers must be provided in ascending order of `population_size_threshold`. - * - * An empty schedule disables the grace period entirely (immediate - * suspension on any missed game). The new ratio takes effect at the start - * of the next report session when `update_thresholds()` recalculates - * `AbsenceGraceRatio`. - * - * Called from `ScheduleOrigin` or root. - */ -set_absence_grace_schedule: TxDescriptor>}, -DummyDim: { - -/** - * Reserve a number of personal IDs. - */ -reserve_ids: TxDescriptor>, - - -/** - * Renew a personal ID. The ID must not be in use. - */ -renew_id_reservation: TxDescriptor>, - - -/** - * Cancel a personal ID reservation. - */ -cancel_id_reservation: TxDescriptor>, - - -/** - * Grant personhood for a list of candidates that have reserved personal IDs. - */ -recognize_personhood: TxDescriptor>, - - -/** - * Suspend the personhood of a list of recognized people. The people must not currently be - * suspended. - */ -suspend_personhood: TxDescriptor>, - - -/** - * Resume someone's personhood. The person must currently be suspended. - */ -resume_personhood: TxDescriptor>, - - -/** - * Start a mutation session in the underlying `People` interface. This call does not check - * whether a mutation session is already ongoing and can start new sessions. - */ -start_mutation_session: TxDescriptor, - - -/** - * End a mutation session in the underlying `People` interface. This call can end multiple - * mutation sessions, even ones not started by this pallet. - * - * This call will fail if no mutation session is ongoing. - */ -end_mutation_session: TxDescriptor}, -PeopleLite: { - -/** - * Grant some attestation allowance to an account so they can attest people. - * - * The origin must be `AttestationAllowanceManager`. - * - * - `account`: The account to grant attestations to. - * - `count`: The number of attestations to grant. - */ -increase_attestation_allowance: TxDescriptor>, - - -/** - * Clear all attestation allowance for an account. - * - * The origin must be `AttestationAllowanceManager`. - * - * - `account`: The account to remove all attestations from. - */ -clear_attestation_allowance: TxDescriptor>, - - -/** - * Attest an account. - * - * The origin must be signed by an account and have some attestation allowance left. - * - * The authority will have to get two signatures from the user: - * - one created using their account key attesting to the ownership of the `candidate` - * account; - * - one created using their ring-vrf key attesting to the ownership of the `ring_vrf_key` - * key. - * - * The message to be signed by both keys from which the signatures are generated is created - * by concatenating the bytes "pop:people-lite:register using" with the encoded bytes of - * the user's account (`candidate`), and the encoded bytes of the ring VRF key - * (`ring_vrf_key`). - * - * - `candidate`: The candidate to be recognized as a lite person. - * - `candidate_signature`: The signature, provided by the candidate, to allow the attester - * to complete the registration process on their behalf. - * - `ring_vrf_key`: The ring VRF key to be associated with the lite person. - * - `ring_vrf_key_signature`: The ring VRF signature, provided by the candidate, to allow - * the attester to complete the registration process. This also prove the ownership of - * the ring VRF key by the candidate. - * - consumer_registration: Optional parameter which can contain the necessary information - * to forward a consumer registration request to the `LiteConsumerRegistrar` service. If - * present, it also contains a signature created by the user in order to validate the - * intent. More information on the signing payload generation available in - * [types::LiteConsumerRegistrationParams::signing_payload]. - */ -attest: TxDescriptor>, - - -/** - - */ -dispatch_as_signer: TxDescriptor>}, -Resources: { - -/** - * Register a lite person as a consumer. - */ -register_lite_person: TxDescriptor>, - - -/** - * Register a proven person as a consumer. - * - * The person must link a previously recognized lite identity, which will be upgraded to a - * full person consumer. In order to prove they hold the lite identity they want to link, - * users must provide a `lite_identity_proof` signature, created by signing the alias bytes - * using their lite consumer account. - * - * The consumer can choose if they want to have a new username or use an existing - * reservation made in the name of the lite consumer who will be linked. - */ -register_person: TxDescriptor>, - - -/** - * Update a person's authorization by ensuring they can still authenticate as people. - * - * This call must be performed at least `MinPersonAuthUpdateInterval` seconds after the - * last update in order to prevent spam. - */ -touch_person_authorization: TxDescriptor, - - -/** - * Remove an expired entry from a username reservation queue. The target entry is - * identified by `account` and can be at any position in the queue. - * Each call removes exactly one entry, so it must be called repeatedly to - * clear multiple expired reservations. - * - * This is a permissionless call; the origin must be authorized. The `account` - * parameter is also used for transaction pool deduplication, allowing parallel - * submissions that target different expired entries in the same queue. - */ -remove_expired_username_reservation: TxDescriptor>, - - -/** - * Update the communication identifier key of a consumer. - * - * The origin must be the account registered for that consumer, regardless of their - * credibility. - */ -update_identifier_key: TxDescriptor>, - - -/** - * Set the duration for which a username reservation is valid, in seconds. - * - * The origin must be root. - */ -set_username_reservation_duration: TxDescriptor>, - - -/** - * Associate an account with a slot for statement store access, or reset a slot. - * - * The associated account can submit statements to the statement store. - * The origin must be a lite person. - * Refunded when assigning an account to a free slot, or when replacing/clearing an - * occupied slot whose last update is older than `AccountsApiRefundCooldown`. - * - * Parameters: - * * `slot_number`: must be in `0..AccountsApiSlotCount`. (`AccountsApiSlotCount` is - * available in the constant metadata) - * * `set_account`: `Some` to set a new account, or `None` to reset to no account. - */ -set_stmt_store_associated_account_id_at_slot: TxDescriptor>, - - -/** - * Demote a full person to a lite person after their authorization has expired. - * - * This is a permissionless call; the origin must be authorized. - */ -demote_auth_expired: TxDescriptor>}, -ChunksManager: { - -/** - * Adds a new page of chunks. - * - * The hash of the chunks must match the hash stored on-chain in `ChunkPageHashes`. - * The call will fail if the page already exists on-chain. - */ -add_chunks: TxDescriptor>, - - -/** - * Sets the expected hashes for chunk pages for a given ring exponent. - * - * This is a root-only call that allows setting the expected hashes that chunks - * must match when added via `add_chunks`. - * - * Can only be called by root origin. - */ -set_chunk_page_hashes: TxDescriptor>}, -Members: { - -/** - * Build a ring root by including registered members. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ -build_ring_manual: TxDescriptor>, - - -/** - * Onboard members into a ring by taking their keys from the onboarding queue and - * registering them into the ring. This does not compute the root, that is done using - * `build_ring`. - * - * This task is performed automatically by the pallet through the `on_idle` hook whenever - * there is leftover weight in a block. This call is meant to be a backup in case of - * extreme congestion and should be submitted by signed origins. - */ -onboard_members_manual: TxDescriptor>, - - -/** - * Merge the members in two rings into a single, new ring. In order for the rings to be - * eligible for merging, they must be below 1/2 of max capacity, have no pending - * suspensions and not be the top ring used for onboarding. - */ -merge_rings: TxDescriptor>, - - -/** - * Force set the onboarding size for a collection. This call requires root privileges. - */ -set_onboarding_size: TxDescriptor>}, -Coinage: { - -/** - * Split a coin into multiple coins. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The call is free and ages the resulting coins by one. - * - * The `split_into` parameter contains a vector of pairs, each pair containing a coin - * value and a list of destination account ids. For each pair, a new coin with the given - * value is created for each destination account id. - * - * Validity requirements: - * * The coin's age must be less than [Config::MaximumAge]. - * * The coin value must be within the bounds defined by [Config::MinimumExponent] and - * [Config::MaximumExponent]. - * * The total value of the new coins must equal the value of the origin coin. - * * The number of outputs must not exceed [Config::MaxSplitOutputs]. - * * The age of the new coins is set to the age of the origin coin plus one. - * * Each destination account must not already have a coin. - */ -split: TxDescriptor>, - - -/** - * Transfer a coin to another account. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The call is free and ages the resulting coin by one. - * - * Validity requirements: - * * The destination account must not already have a coin. - * * The coin's age must be less than [Config::MaximumAge]. - */ -transfer: TxDescriptor>, - - -/** - * Load coin into a recycler. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The call is free. - * - * The `member_key` parameter is the member key to be included in the recycler, and whose - * alias is used to unload from the recycler. - * - * Validity requirements: - * * The `member_key` must not already be used in another recycler. - * * The `member_key` must be valid (i.e. well formed). - * * The `proof_of_ownership` must be a valid signature of the coin's account id by the - * `member_key`. - */ -load_recycler_with_coin: TxDescriptor>, - - -/** - * Load external asset into a recycler. - * - * The origin must be a signed origin. - * - * The transaction fee is refunded. - * - * The `preservation` parameter indicates how the asset transfer should preserve the - * signer's account. - * - * The `value` parameter indicates the coin value to be loaded into the recycler. - * The equivalent amount of the underlying asset is transferred from the signer to - * the pallet account. - * - * The `member_key` parameter is the member key to be included in the recycler, and whose - * alias is used to unload from the recycler. - * - * The `proof_of_ownership` parameter is the signature of the signer's account id by the - * `member_key`. - * - * Requirements: - * * The `member_key` must not already be used in another recycler. - * * The `member_key` must be valid (i.e. well formed). - * * The `value` must be within the bounds defined by [Config::MinimumExponent] and - * [Config::MaximumExponent]. - * * The signer must have enough balance of the underlying asset to cover the equivalent - * amount for the given coin value. - * * The `proof_of_ownership` must be a valid signature of the signer's account id by the - * `member_key`. - */ -load_recycler_with_external_asset: TxDescriptor>, - - -/** - * Unload a recycler to mint a new coin. - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`, which can be - * obtained from the transaction extension [AsCoinage] using `AsUnloadTokenPeople`, - * `AsUnloadTokenLitePeople`, or `AsUnloadTokenPaid` variants. - * - * This function allows a user to prove they own one or more coins in a recycler ring - * without revealing which specific coins they own. It consolidates one or multiple inputs - * into a single output coin. - * - * Parameters: - * * `aliases`: the list of aliases corresponding to the member keys included in the - * recycler. The proofs for these aliases are contained in the origin. - * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. - * * `to`: the destination account for the new coin. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * The recycler identified by `value` and `index` must exist. - * * The alias proofs provided in the origin must be valid for the recycler's revision. - * * The `aliases` provided must match the aliases derived from the proofs. - * * The aliases must not have been already unloaded from this recycler. - * * The number of aliases must be a power of two. - * * The resulting consolidated value must not exceed [Config::MaximumExponent]. - */ -unload_recycler_into_coin: TxDescriptor>, - - -/** - * Unload a recycler to withdraw the underlying external asset. - * - * The origin must be [Origin::UnloadToken], which can be obtained from the transaction - * extension [AsCoinage]. - * - * When `fee` is [UnloadFee::Prepaid] (via free or paid unload token), no fee is deducted. - * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the unloaded assets. - * - * This function allows a user to withdraw their coins back into the underlying - * asset (e.g., stablecoin). - * - * Parameters: - * * `aliases`: the list of aliases corresponding to the member keys included in the - * recycler. The proofs for these aliases are contained in the origin. - * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. - * * `to`: the destination account for the underlying asset. - * - * Requirements: - * * The origin must be [Origin::UnloadToken]. - * * The recycler identified by `value` and `index` must exist. - * * The alias proofs provided in the origin must be valid for the recycler's revision. - * * The aliases must not have been already unloaded (except for the first one when `fee` - * is [UnloadFee::FromOutput], which was pre-marked in the extension). - */ -unload_recycler_into_external_asset: TxDescriptor>, - - -/** - * Pay the fee to register a member key for a paid unload token using a coin. - * - * The origin must be a [Origin::Coin], which can be obtained from the transaction - * extension [AsCoinage]. - * - * The coin is consumed. The fee is deducted from the coin's value and transferred to - * [Config::FeeDestination]. The remaining value of the coin is destroyed. - * - * If the call fails, the origin coin is still consumed. - * - * To protect the user against varying fees, if the coin's value is less than the fee, the - * call is invalid (an invalid call never goes into a block). - * - * The `proof_of_ownership` is a signature of the caller's account ID by the `member_key`. - * This ensures the caller controls the member key to prevent front-running. - * - * Requirements: - * * The coin's age must be less than [Config::MaximumAge]. - * * The coin value must be sufficient to cover the fee. - * * The `member_key` must be valid and not already used. - * * The `proof_of_ownership` must be valid. - */ -pay_for_recycler_unload_fee_token_with_coin: TxDescriptor>, - - -/** - * Pay the fee to register a member key for a paid unload token using the native currency. - * - * The origin must be Signed. - * - * This adds the `member_key` to a "paid unload token ring". Being part of this ring - * allows the user to later generate an anonymous `UnloadToken` to unload a recycler. - * - * The fee is transferred from the caller to [Config::FeeDestination]. - * - * The `proof_of_ownership` is a signature of the caller's account ID by the `member_key`. - * This ensures the caller controls the member key to prevent front-running. - * - * Requirements: - * * The `member_key` must be valid and not already used. - * * The `proof_of_ownership` must be valid. - */ -pay_for_recycler_unload_fee_token_with_native: TxDescriptor>, - - -/** - * Pay the fee to register a member key for a paid unload token using the underlying asset - * i.e. the stablecoin. - * - * The origin must be Signed. - * - * This adds the `member_key` to a "paid unload token ring". Being part of this ring - * allows the user to later generate an anonymous `UnloadToken` to unload a recycler. - * - * The fee is transferred from the caller to [Config::FeeDestination]. - * - * The `proof_of_ownership` is a signature of the caller's account ID by the `member_key`. - * This ensures the caller controls the member key to prevent front-running. - * - * Requirements: - * * The `member_key` must be valid and not already used. - * * The `proof_of_ownership` must be valid. - */ -pay_for_recycler_unload_fee_token_with_stable: TxDescriptor>, - - -/** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. Also, - * this call may leak too much information because the resulting coin inherits the worst - * recycler privacy. - * - * Unload multiple recyclers to mint a new consolidated coin. - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`, which can be - * obtained from the transaction extension [AsCoinage] using `AsUnloadTokenPeople`, - * `AsUnloadTokenLitePeople`, or `AsUnloadTokenPaid` variants. - * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) into a single output coin. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the new coin. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * The total value of unloaded coins must be a power of two. - * * The resulting coin value must not exceed [Config::MaximumExponent]. - * * `inputs` must not be empty, and each element must contain at least one alias. - */ -unload_recyclers_into_coin_unstable: TxDescriptor>, - - -/** - * WARNING: This call is unstable and might be removed in the future, because - * proofs for multiple recyclers may not be batchable for the v1 release. - * - * Unload multiple recyclers to withdraw the underlying external asset. - * - * The origin must be [Origin::UnloadToken], which can be obtained from the transaction - * extension [AsCoinage]. - * - * When `fee` is [UnloadFee::Prepaid] (via free or paid unload token), no fee is deducted. - * When `fee` is [UnloadFee::FromOutput], the fee is deducted from the unloaded assets. - * - * This function allows a user to consolidate coins from different recyclers (potentially - * with different values) and withdraw the total value as the underlying asset. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `to`: The destination account for the asset. - * - * Requirements: - * * The origin must be [Origin::UnloadToken]. - * * All specified recyclers must exist. - * * The alias proofs in the origin must correspond sequentially to the aliases in - * `inputs`. - * * `inputs` must not be empty, and each element must contain at least one alias. - * * For [UnloadFee::FromOutput], the first alias of the first input was pre-marked in the - * extension. - */ -unload_recyclers_into_external_asset_unstable: TxDescriptor>, - - -/** - * Unload a recycler to withdraw the underlying external asset (non-anonymous). - * - * Convenience wrapper around [Self::unload_recyclers_into_external_asset_non_anonymous] - * for the single-recycler case. - * - * See [Self::unload_recyclers_into_external_asset_non_anonymous] for full documentation. - */ -unload_recycler_into_external_asset_non_anonymous: TxDescriptor>, - - -/** - * Unload multiple recyclers to withdraw the underlying external asset (non-anonymous). - * - * This is a non-anonymous version of [Self::unload_recyclers_into_external_asset_unstable] - * where the fee is paid explicitly by the signer rather than through the anonymous - * unload token ring. - * - * Parameters: - * * `inputs`: A list of inputs, specifying the recycler and aliases to unload. - * * `alias_proofs`: the proofs for all aliases across all inputs, signed over a message - * that includes the signer. The proofs must correspond sequentially to the aliases in - * `inputs`. - * * `to`: the destination account for the asset. - * * `fee_currency`: whether to pay the fee in native currency or stable asset. - * - * Requirements: - * * The origin must be Signed. - * * All specified recyclers must exist. - * * The alias proofs must correspond sequentially to the aliases in `inputs`. - * * `inputs` must not be empty and each element must contain at least one alias. - * * The signer must have sufficient balance to pay the fee. - */ -unload_recyclers_into_external_asset_non_anonymous: TxDescriptor>, - - -/** - * Unload a recycler to mint multiple new coins (split). - * - * The origin must be a [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * - * This function combines the functionality of [Self::unload_recycler_into_coin] and - * [Self::split] in a single atomic operation. The resulting coins' age is 1 because - * the action of splitting age coins. This is also important because resulting coins - * are not entirely fresh, they can be linked to other coins. - * - * Unlike [Self::unload_recycler_into_coin], this call does **not** require the number of - * aliases to be a power of two. The only requirement is that the total value of the - * unloaded aliases matches the total value of the new coins specified in `split_into`. - * - * Parameters: - * * `aliases`: the list of aliases corresponding to the member keys included in the - * recycler. The proofs for these aliases are contained in the origin. - * * `value` and `index`: identifies the recycler being unloaded. - * * `_revision`: the recycler revision used for the alias_proofs. - * * `split_into`: a vector of pairs, each pair containing a coin value and a list of - * destination account ids. - * - * Requirements: - * * The origin must be [Origin::UnloadToken] with `fee: UnloadFee::Prepaid`. - * * The recycler identified by `value` and `index` must exist. - * * The alias proofs provided in the origin must be valid for the recycler's revision. - * * The `aliases` provided must match the aliases derived from the proofs. - * * The total value of the new coins defined in `split_into` must equal the total value of - * the unloaded coins. - * * Each destination account must not already have a coin. - */ -unload_recycler_into_coins: TxDescriptor>, - - -/** - * Directly offboard a fresh, 0-age coin into the underlying external asset. - * - * The origin must be a [Origin::Coin], obtained through [AsCoinage] using `AsCoin`. - * - * Because the coin must be fresh (`age == 0`), this call bypasses the - * recycler/unload-token offboarding flow and releases the underlying asset directly. - * - * Parameters: - * * `to`: destination account that receives the released underlying asset amount. - * - * Requirements: - * * The origin must be [Origin::Coin]. - * * The coin must be fresh: `coin.age == 0`. - * * The coin value must be representable as underlying-asset amount. - */ -direct_offboard_coin_into_external_asset: TxDescriptor>, - - -/** - * Clean up an expired recycler. - * - * This is a maintenance call. The origin must be authorized and from local source. - * - * This removes an old recycler that has exceeded its expiration time. - * Any remaining (not unloaded) value in the recycler is considered lost and added to - * [TotalValueOfDestroyedCoins]. - */ -clean_recycler: TxDescriptor>, - - -/** - * Cleanup storage for consumed free unload tokens of old periods. - * - * This is a maintenance call. The origin must be authorized and from local source. - */ -clean_consumed_free_token: TxDescriptor>, - - -/** - * Clean up a single ring in an expired paid unload token collection. - * - * This is a maintenance call. The origin must be authorized and from local source. - * Rings must be cleaned sequentially (ring 0 first, then 1, etc.) before the - * collection can be deleted via - * [`delete_expired_paid_unload_token_collection`](Self::delete_expired_paid_unload_token_collection). - */ -clean_paid_unload_token_ring: TxDescriptor>, - - -/** - * Clean up dust for recyclers. - * - * This is a maintenance call. The origin must be authorized and from local source. - * Removes up to DUST_CLEANUP_BATCH_SIZE unloaded alias entries per call to bound the - * operation. - */ -clean_recycler_dust: TxDescriptor, - - -/** - * Clean up dust for paid unload tokens. - * - * This is a maintenance call. The origin must be authorized and from local source. - */ -clean_paid_unload_token_dust: TxDescriptor, - - -/** - * Delete an expired paid unload token collection after all rings have been cleaned. - * - * This is a maintenance call. The origin must be authorized and from local source. - * All rings must have been cleaned via - * [`clean_paid_unload_token_ring`](Self::clean_paid_unload_token_ring) before this - * can be called. - */ -delete_expired_paid_unload_token_collection: TxDescriptor>}, -Airdrop: { - -/** - * Schedule a airdrop event. - * - * The origin must be `ScheduleOrigin`. - * - * The total amount to be distributed in prizes will be put on hold. The event will be - * added to the schedule and be given an event id. - */ -schedule_event: TxDescriptor>, - - -/** - * Remove a scheduled airdrop event. - * - * The origin must be `ScheduleOrigin`. - * - * The event id must refer to a scheduled event. - * - * The total amount to be distributed in prizes will be released from hold. - * The event will be removed from the schedule. - */ -remove_scheduled_event: TxDescriptor>, - - -/** - * Register for a particular event. - * - * The origin must be the alias of a person in the context: airdrop context base - * concatenated to the airdrop event id in little-endian encoding in 4 bytes. - * The airdrop context base can be found in the metadata. - * - * The event id must refer to an active event in the registering phase. - * The alias must not be already registered. - * - * `dest` can be any account, it is the destination receiving the prize when winning the - * airdrop. It is better to set a different account for each airdrop to avoid linking - * information about winners. - * - * When registering the caller is assigned an index. This index will be used to identify - * the winners. - */ -register_for_event: TxDescriptor>, - - -/** - * Claim the prize of a failed transfer. - * - * Prize are automatically transfered, but if unexpected event happens the transfer can - * fail, this transaction allows to claim the prize. - * - * The origin must signed by the destination of the prize. - * - * The signer must have a failed transfer prize for the given event id. - */ -claim_failed_transfer_prize: TxDescriptor>}, -MultiBlockMigrations: { - -/** - * Allows root to set a cursor to forcefully start, stop or forward the migration process. - * - * Should normally not be needed and is only in place as emergency measure. Note that - * restarting the migration process in this manner will not call the - * [`MigrationStatusHandler::started`] hook or emit an `UpgradeStarted` event. - */ -force_set_cursor: TxDescriptor>, - - -/** - * Allows root to set an active cursor to forcefully start/forward the migration process. - * - * This is an edge-case version of [`Self::force_set_cursor`] that allows to set the - * `started_at` value to the next block number. Otherwise this would not be possible, since - * `force_set_cursor` takes an absolute block number. Setting `started_at` to `None` - * indicates that the current block number plus one should be used. - */ -force_set_active_cursor: TxDescriptor>, - - -/** - * Forces the onboarding of the migrations. - * - * This process happens automatically on a runtime upgrade. It is in place as an emergency - * measurement. The cursor needs to be `None` for this to succeed. - */ -force_onboard_mbms: TxDescriptor, - - -/** - * Clears the `Historic` set. - * - * `map_cursor` must be set to the last value that was returned by the - * `HistoricCleared` event. The first time `None` can be used. `limit` must be chosen in a - * way that will result in a sensible weight. - */ -clear_historic: TxDescriptor>}}; -type IEvent = {System: { - -/** - * An extrinsic completed successfully. - */ -ExtrinsicSuccess: PlainDescriptor>, - - -/** - * An extrinsic failed. - */ -ExtrinsicFailed: PlainDescriptor>, - - -/** - * `:code` was updated. - */ -CodeUpdated: PlainDescriptor, - - -/** - * A new account was created. - */ -NewAccount: PlainDescriptor>, - - -/** - * An account was reaped. - */ -KilledAccount: PlainDescriptor>, - - -/** - * On on-chain remark happened. - */ -Remarked: PlainDescriptor>, - - -/** - * An upgrade was authorized. - */ -UpgradeAuthorized: PlainDescriptor>, - - -/** - * An invalid authorized upgrade was rejected while trying to apply it. - */ -RejectedInvalidAuthorizedUpgrade: PlainDescriptor>}, -ParachainSystem: { - -/** - * The validation function has been scheduled to apply. - */ -ValidationFunctionStored: PlainDescriptor, - - -/** - * The validation function was applied as of the contained relay chain block number. - */ -ValidationFunctionApplied: PlainDescriptor>, - - -/** - * The relay-chain aborted the upgrade process. - */ -ValidationFunctionDiscarded: PlainDescriptor, - - -/** - * Some downward messages have been received and will be processed. - */ -DownwardMessagesReceived: PlainDescriptor>, - - -/** - * Downward messages were processed using the given weight. - */ -DownwardMessagesProcessed: PlainDescriptor>, - - -/** - * An upward message was sent to the relay chain. - */ -UpwardMessageSent: PlainDescriptor>}, -Balances: { - -/** - * An account was created with some free balance. - */ -Endowed: PlainDescriptor>, - - -/** - * An account was removed whose balance was non-zero but below ExistentialDeposit, - * resulting in an outright loss. - */ -DustLost: PlainDescriptor>, - - -/** - * Transfer succeeded. - */ -Transfer: PlainDescriptor>, - - -/** - * A balance was set by root. - */ -BalanceSet: PlainDescriptor>, - - -/** - * Some balance was reserved (moved from free to reserved). - */ -Reserved: PlainDescriptor>, - - -/** - * Some balance was unreserved (moved from reserved to free). - */ -Unreserved: PlainDescriptor>, - - -/** - * Some balance was moved from the reserve of the first account to the second account. - * Final argument indicates the destination balance type. - */ -ReserveRepatriated: PlainDescriptor>, - - -/** - * Some amount was deposited (e.g. for transaction fees). - */ -Deposit: PlainDescriptor>, - - -/** - * Some amount was withdrawn from the account (e.g. for transaction fees). - */ -Withdraw: PlainDescriptor>, - - -/** - * Some amount was removed from the account (e.g. for misbehavior). - */ -Slashed: PlainDescriptor>, - - -/** - * Some amount was minted into an account. - */ -Minted: PlainDescriptor>, - - -/** - * Some credit was balanced and added to the TotalIssuance. - */ -MintedCredit: PlainDescriptor>, - - -/** - * Some amount was burned from an account. - */ -Burned: PlainDescriptor>, - - -/** - * Some debt has been dropped from the Total Issuance. - */ -BurnedDebt: PlainDescriptor>, - - -/** - * Some amount was suspended from an account (it can be restored later). - */ -Suspended: PlainDescriptor>, - - -/** - * Some amount was restored into an account. - */ -Restored: PlainDescriptor>, - - -/** - * An account was upgraded. - */ -Upgraded: PlainDescriptor>, - - -/** - * Total issuance was increased by `amount`, creating a credit to be balanced. - */ -Issued: PlainDescriptor>, - - -/** - * Total issuance was decreased by `amount`, creating a debt to be balanced. - */ -Rescinded: PlainDescriptor>, - - -/** - * Some balance was locked. - */ -Locked: PlainDescriptor>, - - -/** - * Some balance was unlocked. - */ -Unlocked: PlainDescriptor>, - - -/** - * Some balance was frozen. - */ -Frozen: PlainDescriptor>, - - -/** - * Some balance was thawed. - */ -Thawed: PlainDescriptor>, - - -/** - * The `TotalIssuance` was forcefully changed. - */ -TotalIssuanceForced: PlainDescriptor>, - - -/** - * Some balance was placed on hold. - */ -Held: PlainDescriptor>, - - -/** - * Held balance was burned from an account. - */ -BurnedHeld: PlainDescriptor>, - - -/** - * A transfer of `amount` on hold from `source` to `dest` was initiated. - */ -TransferOnHold: PlainDescriptor>, - - -/** - * The `transferred` balance is placed on hold at the `dest` account. - */ -TransferAndHold: PlainDescriptor>, - - -/** - * Some balance was released from hold. - */ -Released: PlainDescriptor>, - - -/** - * An unexpected/defensive event was triggered. - */ -Unexpected: PlainDescriptor>}, -TransactionPayment: { - -/** - * A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, - * has been paid by `who`. - */ -TransactionFeePaid: PlainDescriptor>}, -SkipFeelessPayment: { - -/** - * A transaction fee was skipped. - */ -FeeSkipped: PlainDescriptor>}, -OriginRestriction: { - -/** - * Usage for an entity is cleaned. - */ -UsageCleaned: PlainDescriptor>}, -Assets: { - -/** - * Some asset class was created. - */ -Created: PlainDescriptor>, - - -/** - * Some assets were issued. - */ -Issued: PlainDescriptor>, - - -/** - * Some assets were transferred. - */ -Transferred: PlainDescriptor>, - - -/** - * Some assets were destroyed. - */ -Burned: PlainDescriptor>, - - -/** - * The management team changed. - */ -TeamChanged: PlainDescriptor>, - - -/** - * The owner changed. - */ -OwnerChanged: PlainDescriptor>, - - -/** - * Some account `who` was frozen. - */ -Frozen: PlainDescriptor>, - - -/** - * Some account `who` was thawed. - */ -Thawed: PlainDescriptor>, - - -/** - * Some asset `asset_id` was frozen. - */ -AssetFrozen: PlainDescriptor>, - - -/** - * Some asset `asset_id` was thawed. - */ -AssetThawed: PlainDescriptor>, - - -/** - * Accounts were destroyed for given asset. - */ -AccountsDestroyed: PlainDescriptor>, - - -/** - * Approvals were destroyed for given asset. - */ -ApprovalsDestroyed: PlainDescriptor>, - - -/** - * An asset class is in the process of being destroyed. - */ -DestructionStarted: PlainDescriptor>, - - -/** - * An asset class was destroyed. - */ -Destroyed: PlainDescriptor>, - - -/** - * Some asset class was force-created. - */ -ForceCreated: PlainDescriptor>, - - -/** - * New metadata has been set for an asset. - */ -MetadataSet: PlainDescriptor>, - - -/** - * Metadata has been cleared for an asset. - */ -MetadataCleared: PlainDescriptor>, - - -/** - * (Additional) funds have been approved for transfer to a destination account. - */ -ApprovedTransfer: PlainDescriptor>, - - -/** - * An approval for account `delegate` was cancelled by `owner`. - */ -ApprovalCancelled: PlainDescriptor>, - - -/** - * An `amount` was transferred in its entirety from `owner` to `destination` by - * the approved `delegate`. - */ -TransferredApproved: PlainDescriptor>, - - -/** - * An asset has had its attributes changed by the `Force` origin. - */ -AssetStatusChanged: PlainDescriptor>, - - -/** - * The min_balance of an asset has been updated by the asset owner. - */ -AssetMinBalanceChanged: PlainDescriptor>, - - -/** - * Some account `who` was created with a deposit from `depositor`. - */ -Touched: PlainDescriptor>, - - -/** - * Some account `who` was blocked. - */ -Blocked: PlainDescriptor>, - - -/** - * Some assets were deposited (e.g. for transaction fees). - */ -Deposited: PlainDescriptor>, - - -/** - * Some assets were withdrawn from the account (e.g. for transaction fees). - */ -Withdrawn: PlainDescriptor>, - - -/** - * Reserve information was set or updated for `asset_id`. - */ -ReservesUpdated: PlainDescriptor>, - - -/** - * Reserve information was removed for `asset_id`. - */ -ReservesRemoved: PlainDescriptor>}, -AssetsHolder: { - -/** - * `who`s balance on hold was increased by `amount`. - */ -Held: PlainDescriptor>, - - -/** - * `who`s balance on hold was decreased by `amount`. - */ -Released: PlainDescriptor>, - - -/** - * `who`s balance on hold was burned by `amount`. - */ -Burned: PlainDescriptor>}, -AssetRate: { - -/** - - */ -AssetRateCreated: PlainDescriptor>, - - -/** - - */ -AssetRateRemoved: PlainDescriptor>, - - -/** - - */ -AssetRateUpdated: PlainDescriptor>}, -AssetTxPayment: { - -/** - * A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, - * has been paid by `who` in an asset `asset_id`. - */ -AssetTxFeePaid: PlainDescriptor>}, -CollatorSelection: { - -/** - * New Invulnerables were set. - */ -NewInvulnerables: PlainDescriptor>, - - -/** - * A new Invulnerable was added. - */ -InvulnerableAdded: PlainDescriptor>, - - -/** - * An Invulnerable was removed. - */ -InvulnerableRemoved: PlainDescriptor>, - - -/** - * The number of desired candidates was set. - */ -NewDesiredCandidates: PlainDescriptor>, - - -/** - * The candidacy bond was set. - */ -NewCandidacyBond: PlainDescriptor>, - - -/** - * A new candidate joined. - */ -CandidateAdded: PlainDescriptor>, - - -/** - * Bond of a candidate updated. - */ -CandidateBondUpdated: PlainDescriptor>, - - -/** - * A candidate was removed. - */ -CandidateRemoved: PlainDescriptor>, - - -/** - * An account was replaced in the candidate list by another one. - */ -CandidateReplaced: PlainDescriptor>, - - -/** - * An account was unable to be added to the Invulnerables because they did not have keys - * registered. Other Invulnerables may have been set. - */ -InvalidInvulnerableSkipped: PlainDescriptor>}, -Session: { - -/** - * New session has happened. Note that the argument is the session index, not the - * block number as the type might suggest. - */ -NewSession: PlainDescriptor>, - - -/** - * The `NewSession` event in the current block also implies a new validator set to be - * queued. - */ -NewQueued: PlainDescriptor, - - -/** - * Validator has been disabled. - */ -ValidatorDisabled: PlainDescriptor>, - - -/** - * Validator has been re-enabled. - */ -ValidatorReenabled: PlainDescriptor>}, -XcmpQueue: { - -/** - * An HRMP message was sent to a sibling parachain. - */ -XcmpMessageSent: PlainDescriptor>}, -PolkadotXcm: { - -/** - * Execution of an XCM message was attempted. - */ -Attempted: PlainDescriptor>, - - -/** - * An XCM message was sent. - */ -Sent: PlainDescriptor>, - - -/** - * An XCM message failed to send. - */ -SendFailed: PlainDescriptor>, - - -/** - * An XCM message failed to process. - */ -ProcessXcmError: PlainDescriptor>, - - -/** - * Query response received which does not match a registered query. This may be because a - * matching query was never registered, it may be because it is a duplicate response, or - * because the query timed out. - */ -UnexpectedResponse: PlainDescriptor>, - - -/** - * Query response has been received and is ready for taking with `take_response`. There is - * no registered notification call. - */ -ResponseReady: PlainDescriptor>, - - -/** - * Query response has been received and query is removed. The registered notification has - * been dispatched and executed successfully. - */ -Notified: PlainDescriptor>, - - -/** - * Query response has been received and query is removed. The registered notification - * could not be dispatched because the dispatch weight is greater than the maximum weight - * originally budgeted by this runtime for the query result. - */ -NotifyOverweight: PlainDescriptor>, - - -/** - * Query response has been received and query is removed. There was a general error with - * dispatching the notification call. - */ -NotifyDispatchError: PlainDescriptor>, - - -/** - * Query response has been received and query is removed. The dispatch was unable to be - * decoded into a `Call`; this might be due to dispatch function having a signature which - * is not `(origin, QueryId, Response)`. - */ -NotifyDecodeFailed: PlainDescriptor>, - - -/** - * Expected query response has been received but the origin location of the response does - * not match that expected. The query remains registered for a later, valid, response to - * be received and acted upon. - */ -InvalidResponder: PlainDescriptor>, - - -/** - * Expected query response has been received but the expected origin location placed in - * storage by this runtime previously cannot be decoded. The query remains registered. - * - * This is unexpected (since a location placed in storage in a previously executing - * runtime should be readable prior to query timeout) and dangerous since the possibly - * valid response will be dropped. Manual governance intervention is probably going to be - * needed. - */ -InvalidResponderVersion: PlainDescriptor>, - - -/** - * Received query response has been read and removed. - */ -ResponseTaken: PlainDescriptor>, - - -/** - * Some assets have been placed in an asset trap. - */ -AssetsTrapped: PlainDescriptor>, - - -/** - * An XCM version change notification message has been attempted to be sent. - * - * The cost of sending it (borne by the chain) is included. - */ -VersionChangeNotified: PlainDescriptor>, - - -/** - * The supported version of a location has been changed. This might be through an - * automatic notification or a manual intervention. - */ -SupportedVersionChanged: PlainDescriptor>, - - -/** - * A given location which had a version change subscription was dropped owing to an error - * sending the notification to it. - */ -NotifyTargetSendFail: PlainDescriptor>, - - -/** - * A given location which had a version change subscription was dropped owing to an error - * migrating the location to our new XCM format. - */ -NotifyTargetMigrationFail: PlainDescriptor>, - - -/** - * Expected query response has been received but the expected querier location placed in - * storage by this runtime previously cannot be decoded. The query remains registered. - * - * This is unexpected (since a location placed in storage in a previously executing - * runtime should be readable prior to query timeout) and dangerous since the possibly - * valid response will be dropped. Manual governance intervention is probably going to be - * needed. - */ -InvalidQuerierVersion: PlainDescriptor>, - - -/** - * Expected query response has been received but the querier location of the response does - * not match the expected. The query remains registered for a later, valid, response to - * be received and acted upon. - */ -InvalidQuerier: PlainDescriptor>, - - -/** - * A remote has requested XCM version change notification from us and we have honored it. - * A version information message is sent to them and its cost is included. - */ -VersionNotifyStarted: PlainDescriptor>, - - -/** - * We have requested that a remote chain send us XCM version change notifications. - */ -VersionNotifyRequested: PlainDescriptor>, - - -/** - * We have requested that a remote chain stops sending us XCM version change - * notifications. - */ -VersionNotifyUnrequested: PlainDescriptor>, - - -/** - * Fees were paid from a location for an operation (often for using `SendXcm`). - */ -FeesPaid: PlainDescriptor>, - - -/** - * Some assets have been claimed from an asset trap - */ -AssetsClaimed: PlainDescriptor>, - - -/** - * A XCM version migration finished. - */ -VersionMigrationFinished: PlainDescriptor>, - - -/** - * An `aliaser` location was authorized by `target` to alias it, authorization valid until - * `expiry` block number. - */ -AliasAuthorized: PlainDescriptor>, - - -/** - * `target` removed alias authorization for `aliaser`. - */ -AliasAuthorizationRemoved: PlainDescriptor>, - - -/** - * `target` removed all alias authorizations. - */ -AliasesAuthorizationsRemoved: PlainDescriptor>}, -CumulusXcm: { - -/** - * Downward message is invalid XCM. - * \[ id \] - */ -InvalidFormat: PlainDescriptor>, - - -/** - * Downward message is unsupported version of XCM. - * \[ id \] - */ -UnsupportedVersion: PlainDescriptor>, - - -/** - * Downward message executed with the given outcome. - * \[ id, outcome \] - */ -ExecutedDownward: PlainDescriptor>}, -MessageQueue: { - -/** - * Message discarded due to an error in the `MessageProcessor` (usually a format error). - */ -ProcessingFailed: PlainDescriptor>, - - -/** - * Message is processed. - */ -Processed: PlainDescriptor>, - - -/** - * Message placed in overweight queue. - */ -OverweightEnqueued: PlainDescriptor>, - - -/** - * This page was reaped. - */ -PageReaped: PlainDescriptor>}, -Utility: { - -/** - * Batch of dispatches did not complete fully. Index of first failing dispatch given, as - * well as the error. - */ -BatchInterrupted: PlainDescriptor>, - - -/** - * Batch of dispatches completed fully with no error. - */ -BatchCompleted: PlainDescriptor, - - -/** - * Batch of dispatches completed but has errors. - */ -BatchCompletedWithErrors: PlainDescriptor, - - -/** - * A single item within a Batch of dispatches has completed with no error. - */ -ItemCompleted: PlainDescriptor, - - -/** - * A single item within a Batch of dispatches has completed with error. - */ -ItemFailed: PlainDescriptor>, - - -/** - * A call was dispatched. - */ -DispatchedAs: PlainDescriptor>, - - -/** - * Main call was dispatched. - */ -IfElseMainSuccess: PlainDescriptor, - - -/** - * The fallback call was dispatched. - */ -IfElseFallbackCalled: PlainDescriptor>}, -Multisig: { - -/** - * A new multisig operation has begun. - */ -NewMultisig: PlainDescriptor>, - - -/** - * A multisig operation has been approved by someone. - */ -MultisigApproval: PlainDescriptor>, - - -/** - * A multisig operation has been executed. - */ -MultisigExecuted: PlainDescriptor>, - - -/** - * A multisig operation has been cancelled. - */ -MultisigCancelled: PlainDescriptor>, - - -/** - * The deposit for a multisig operation has been updated/poked. - */ -DepositPoked: PlainDescriptor>}, -Sudo: { - -/** - * A sudo call just took place. - */ -Sudid: PlainDescriptor>, - - -/** - * The sudo key has been updated. - */ -KeyChanged: PlainDescriptor>, - - -/** - * The key was permanently removed. - */ -KeyRemoved: PlainDescriptor, - - -/** - * A [sudo_as](Pallet::sudo_as) call just took place. - */ -SudoAsDone: PlainDescriptor>}, -Proxy: { - -/** - * A proxy was executed correctly, with the given. - */ -ProxyExecuted: PlainDescriptor>, - - -/** - * A pure account has been created by new proxy with given - * disambiguation index and proxy type. - */ -PureCreated: PlainDescriptor>, - - -/** - * A pure proxy was killed by its spawner. - */ -PureKilled: PlainDescriptor>, - - -/** - * An announcement was placed to make a call in the future. - */ -Announced: PlainDescriptor>, - - -/** - * A proxy was added. - */ -ProxyAdded: PlainDescriptor>, - - -/** - * A proxy was removed. - */ -ProxyRemoved: PlainDescriptor>, - - -/** - * A deposit stored for proxies or announcements was poked / updated. - */ -DepositPoked: PlainDescriptor>}, -Identity: { - -/** - * A name was set or reset (which will remove all judgements). - */ -IdentitySet: PlainDescriptor>, - - -/** - * A name was cleared, and the given balance returned. - */ -IdentityCleared: PlainDescriptor>, - - -/** - * A name was removed and the given balance slashed. - */ -IdentityKilled: PlainDescriptor>, - - -/** - * A judgement was asked from a registrar. - */ -JudgementRequested: PlainDescriptor>, - - -/** - * A judgement request was retracted. - */ -JudgementUnrequested: PlainDescriptor>, - - -/** - * A judgement was given by a registrar. - */ -JudgementGiven: PlainDescriptor>, - - -/** - * A registrar was added. - */ -RegistrarAdded: PlainDescriptor>, - - -/** - * A sub-identity was added to an identity and the deposit paid. - */ -SubIdentityAdded: PlainDescriptor>, - - -/** - * An account's sub-identities were set (in bulk). - */ -SubIdentitiesSet: PlainDescriptor>, - - -/** - * A given sub-account's associated name was changed by its super-identity. - */ -SubIdentityRenamed: PlainDescriptor>, - - -/** - * A sub-identity was removed from an identity and the deposit freed. - */ -SubIdentityRemoved: PlainDescriptor>, - - -/** - * A sub-identity was cleared, and the given deposit repatriated from the - * main identity account to the sub-identity account. - */ -SubIdentityRevoked: PlainDescriptor>, - - -/** - * A username authority was added. - */ -AuthorityAdded: PlainDescriptor>, - - -/** - * A username authority was removed. - */ -AuthorityRemoved: PlainDescriptor>, - - -/** - * A username was set for `who`. - */ -UsernameSet: PlainDescriptor>, - - -/** - * A username was queued, but `who` must accept it prior to `expiration`. - */ -UsernameQueued: PlainDescriptor>, - - -/** - * A queued username passed its expiration without being claimed and was removed. - */ -PreapprovalExpired: PlainDescriptor>, - - -/** - * A username was set as a primary and can be looked up from `who`. - */ -PrimaryUsernameSet: PlainDescriptor>, - - -/** - * A dangling username (as in, a username corresponding to an account that has removed its - * identity) has been removed. - */ -DanglingUsernameRemoved: PlainDescriptor>, - - -/** - * A username has been unbound. - */ -UsernameUnbound: PlainDescriptor>, - - -/** - * A username has been removed. - */ -UsernameRemoved: PlainDescriptor>, - - -/** - * A username has been killed. - */ -UsernameKilled: PlainDescriptor>, - - -/** - * A username has been reported. - */ -UsernameReported: PlainDescriptor>, - - -/** - * An identity for a person has been set. - */ -PersonalIdentitySet: PlainDescriptor>, - - -/** - * Evidence for a credential has beed submitted by a person. - */ -EvidenceSubmitted: PlainDescriptor>, - - -/** - * A credential was accepted for a person. - */ -CredentialAccepted: PlainDescriptor>, - - -/** - * A credential was rejected for a person. - */ -CredentialRejected: PlainDescriptor>, - - -/** - * Person was banned for sending contemptuous evidence. - */ -PersonBanned: PlainDescriptor>, - - -/** - * A personal identity was cleared. - */ -PersonalIdentityCleared: PlainDescriptor>, - - -/** - * A reported username was judged valid. - */ -ReportedUsernameJudgedValid: PlainDescriptor>, - - -/** - * A reported username was judged invalid. - */ -ReportedUsernameJudgedInvalid: PlainDescriptor>, - - -/** - * The judgment regarding a reported username was unclear or uncertain. - */ -ReportedUsernameWeakOrUnclearJudgement: PlainDescriptor>}, -People: { - -/** - * An individual has had their personhood recognised and indexed. - */ -PersonhoodRecognized: PlainDescriptor>, - - -/** - * An individual has had their personhood recognised again and indexed. - */ -PersonOnboarding: PlainDescriptor>, - - -/** - * A call was dispatched under an alias. - */ -AliasDispatched: PlainDescriptor>, - - -/** - * An alias-to-account mapping was set or updated. - */ -AliasAccountSet: PlainDescriptor>, - - -/** - * An alias-to-account mapping was removed. - */ -AliasAccountUnset: PlainDescriptor>, - - -/** - * A personal ID-to-account mapping was set or updated. - */ -PersonalIdAccountSet: PlainDescriptor>, - - -/** - * A personal ID-to-account mapping was removed. - */ -PersonalIdAccountUnset: PlainDescriptor>, - - -/** - * The people collection was created. - */ -CollectionCreated: PlainDescriptor, - - -/** - * Personhood was forcefully recognized by root. - */ -ForcePersonhoodRecognized: PlainDescriptor>}, -MobRule: { - -/** - * A case has been created. - */ -CaseCreated: PlainDescriptor>, - - -/** - * A callback was triggered from mob-rule. - */ -Callback: PlainDescriptor>, - - -/** - * There was a codec error when trying to execute the callback. - */ -CallbackError: PlainDescriptor, - - -/** - * The case has been closed with the following result. - */ -CaseClosed: PlainDescriptor>, - - -/** - * A vote has been placed on a case. - */ -Voted: PlainDescriptor>, - - -/** - * A vote has been cleaned. - */ -VoteCleaned: PlainDescriptor>, - - -/** - * A case has been removed. - */ -CaseRemoved: PlainDescriptor>, - - -/** - * A case has been intervened. - */ -CaseIntervened: PlainDescriptor>, - - -/** - * Credits for votes have been claimed. - */ -VotesClaimed: PlainDescriptor>, - - -/** - * A reward that has been paid out. - */ -RewardPayout: PlainDescriptor>, - - -/** - * A new payout round has been started. - */ -PayoutRoundStarted: PlainDescriptor>, - - -/** - * Payout rounds have been scheduled. - */ -PayoutRoundsScheduled: PlainDescriptor>, - - -/** - * A payout schedule has been removed. - */ -PayoutScheduleRemoved: PlainDescriptor>, - - -/** - * Credit has been claimed from the payout distribution. - */ -CreditClaimed: PlainDescriptor>, - - -/** - * Stale voting points have been cleaned. - */ -PointsCleaned: PlainDescriptor>, - - -/** - * A case has been touched (re-evaluated). - */ -CaseTouched: PlainDescriptor>, - - -/** - * A voting penalty has been cleared. - */ -VotingPenaltyCleared: PlainDescriptor>}, -ProofOfInk: { - -/** - * Candidate applied for verification. - */ -CandidateApplied: PlainDescriptor>, - - -/** - * Candidate opened a judicial case for their verification evidence. - */ -JudgementRequested: PlainDescriptor>, - - -/** - * Oracle has provided the judgement for a judicial case. - */ -JudgementProvided: PlainDescriptor>, - - -/** - * A candidate has been granted a free retry attempt after a failure to verify their - * evidence. - */ -RetryGranted: PlainDescriptor>, - - -/** - * Register an account as a person. - */ -PersonRegistered: PlainDescriptor>, - - -/** - * Person referred an account. - */ -CandidateReferred: PlainDescriptor>, - - -/** - * Entropy for a candidate changed after expiry. - */ -Rerolled: PlainDescriptor>, - - -/** - * Candidate committed to an ink design. - */ -DesignCommitted: PlainDescriptor>, - - -/** - * Storage fully allocated for a committed design. - */ -FullyAllocated: PlainDescriptor>, - - -/** - * Candidate removed after timeout. - */ -TimedOut: PlainDescriptor>, - - -/** - * Uncommitted candidate removed. - */ -FlakedOut: PlainDescriptor>, - - -/** - * Referral ticket created by storing the public key on chain. - */ -TicketReferred: PlainDescriptor>, - - -/** - * Referral ticket removed by removing the public key from chain storage. - */ -TicketCancelled: PlainDescriptor>, - - -/** - * Candidate applied using a referral ticket. - */ -TicketApplied: PlainDescriptor>, - - -/** - * Design family added. - */ -FamilyAdded: PlainDescriptor>, - - -/** - * All invites have been removed for the inviter. - */ -AllInvitesRemoved: PlainDescriptor>, - - -/** - * Some invites have been removed for the inviter, some are remaining. - */ -SomeInvitesRemoved: PlainDescriptor>, - - -/** - * Candidate applied using an invitation. - */ -InvitedCandidateApplied: PlainDescriptor>, - - -/** - * A referrer's reward voucher has been registered. - */ -ReferralVoucherRegistered: PlainDescriptor>, - - -/** - * Invites have been granted to an account. - */ -InvitesGranted: PlainDescriptor>, - - -/** - * An invite ticket has been set. - */ -InviteTicketSet: PlainDescriptor>, - - -/** - * An invite ticket has been cancelled. - */ -InviteTicketCancelled: PlainDescriptor>, - - -/** - * The pallet configuration has been updated. - */ -ConfigurationSet: PlainDescriptor>}, -Game: { - -/** - * A new game is starting. - */ -NewGame: PlainDescriptor>, - - -/** - * The game and its post-process has ended. - */ -GameEnded: PlainDescriptor>, - - -/** - * A player signed up for the game. - */ -SignedUp: PlainDescriptor>, - - -/** - * A player submitted their report. - */ -ReportSubmitted: PlainDescriptor>, - - -/** - * A player offboarded from the game. - */ -Offboarded: PlainDescriptor>, - - -/** - * An archived player was kicked out. - */ -KickedOut: PlainDescriptor>, - - -/** - * Invites were granted to an account. - */ -InvitesGranted: PlainDescriptor>, - - -/** - * An invite ticket was set. - */ -InviteTicketSet: PlainDescriptor>, - - -/** - * An invite ticket was cancelled. - */ -InviteTicketCancelled: PlainDescriptor>, - - -/** - * Games were scheduled. - */ -GamesScheduled: PlainDescriptor>, - - -/** - * A scheduled game was removed. - */ -ScheduledGameRemoved: PlainDescriptor>, - - -/** - * Statement store usage removed for the account. - */ -StmtUsageRemoved: PlainDescriptor>, - - -/** - * All invites have been removed for the inviter. - */ -AllInvitesRemoved: PlainDescriptor>, - - -/** - * Some invites have been removed for the inviter, some are remaining. - */ -SomeInvitesRemoved: PlainDescriptor>}, -Score: { - -/** - * A person has claimed credit. - */ -CreditClaimed: PlainDescriptor>, - - -/** - * Personhood was recognized for an account. - */ -PersonhoodRecognized: PlainDescriptor>, - - -/** - * Payout rounds have been scheduled. - */ -PayoutRoundsScheduled: PlainDescriptor>, - - -/** - * A payout schedule has been removed. - */ -PayoutScheduleRemoved: PlainDescriptor>, - - -/** - * A round has been transitioned. - */ -RoundTransitioned: PlainDescriptor>, - - -/** - * A payout round has been operated (credit distributed to participants). - */ -PayoutRoundOperated: PlainDescriptor>, - - -/** - * A participant has cashed out score for points. - */ -CashedOut: PlainDescriptor>}, -DummyDim: { - -/** - * A number of IDs was reserved. - */ -IdsReserved: PlainDescriptor>, - - -/** - * An ID was renewed. - */ -IdRenewed: PlainDescriptor>, - - -/** - * A reserved ID was removed. - */ -IdUnreserved: PlainDescriptor>, - - -/** - * Register multiple people. - */ -PeopleRegistered: PlainDescriptor>, - - -/** - * Suspend a number of people. - */ -PeopleSuspended: PlainDescriptor>, - - -/** - * Someone's personhood was resumed. - */ -PersonhoodResumed: PlainDescriptor>, - - -/** - * The pallet enabled suspensions. - */ -SuspensionsStarted: PlainDescriptor, - - -/** - * The pallet disabled suspensions. - */ -SuspensionsEnded: PlainDescriptor}, -PeopleLite: { - -/** - * All attestation allowance has been removed for the verifier. - */ -AllAttestationAllowanceCleared: PlainDescriptor>, - - -/** - * Attestation allowance was increased for an account by `count` attestations. - */ -AttestationAllowanceIncreased: PlainDescriptor>, - - -/** - * A new lite person was registered through attestation. - */ -PersonAttested: PlainDescriptor>, - - -/** - * A lite person was registered as a consumer. - */ -ConsumerRegistered: PlainDescriptor>}, -Resources: { - -/** - * A person has registered as a consumer. - */ -PersonRegistered: PlainDescriptor>, - - -/** - * A lite person has registered as a consumer. - */ -LitePersonRegistered: PlainDescriptor>, - - -/** - * A person's authorization was touched. - */ -PersonAuthorizationTouched: PlainDescriptor>, - - -/** - * An expired username reservation was removed. - */ -ExpiredUsernameReservationRemoved: PlainDescriptor>, - - -/** - * A consumer's identifier key was updated. - */ -IdentifierKeyUpdated: PlainDescriptor>, - - -/** - * The username reservation duration was set. - */ -UsernameReservationDurationSet: PlainDescriptor>, - - -/** - * A statement store slot was updated. - */ -StmtStoreSlotUpdated: PlainDescriptor>, - - -/** - * A full person was demoted due to expired authorization. - */ -PersonDemoted: PlainDescriptor>}, -ChunksManager: { - -/** - * A new chunk page hash set has been initialized (e.g., during genesis). - */ -ChunkPageHashesInitialized: PlainDescriptor>, - - -/** - * New chunks have been successfully added to an existing or new chunk set. - */ -ChunksAdded: PlainDescriptor>}, -Members: { - -/** - * An entity has had their membership recognised and indexed. - */ -MemberAdded: PlainDescriptor>, - - -/** - * An entity has had their membership revoked. - */ -MemberRemoved: PlainDescriptor>, - - -/** - * A collection has been marked for deletion. - */ -CollectionMarkedForDeletion: PlainDescriptor>, - - -/** - * A collection has been fully deleted. - */ -CollectionDeleted: PlainDescriptor>, - - -/** - * A ring was built manually. - */ -RingBuilt: PlainDescriptor>, - - -/** - * Members were onboarded manually. - */ -MembersOnboarded: PlainDescriptor>, - - -/** - * Two rings were merged. - */ -RingsMerged: PlainDescriptor>, - - -/** - * The onboarding size was set for a collection. - */ -OnboardingSizeSet: PlainDescriptor>}, -Coinage: { - -/** - - */ -CoinSplit: PlainDescriptor>, - - -/** - - */ -CoinTransferred: PlainDescriptor>, - - -/** - - */ -RecyclerLoadedWithCoin: PlainDescriptor>, - - -/** - - */ -RecyclerLoadedWithExternalAsset: PlainDescriptor>, - - -/** - - */ -RecyclerUnloadedIntoCoin: PlainDescriptor>, - - -/** - - */ -RecyclerUnloadedIntoExternalAsset: PlainDescriptor>, - - -/** - - */ -PaidUnloadTokenRegisteredWithCoin: PlainDescriptor>, - - -/** - - */ -PaidUnloadTokenRegisteredWithNative: PlainDescriptor>, - - -/** - - */ -PaidUnloadTokenRegisteredWithStable: PlainDescriptor>, - - -/** - - */ -PeopleFreeUnloadTokenConsumed: PlainDescriptor>, - - -/** - - */ -LitePeopleFreeUnloadTokenConsumed: PlainDescriptor>, - - -/** - - */ -RecyclersUnloadedIntoCoin: PlainDescriptor>, - - -/** - - */ -RecyclersUnloadedIntoExternalAsset: PlainDescriptor>, - - -/** - - */ -RecyclersUnloadedIntoExternalAssetNonAnonymous: PlainDescriptor>, - - -/** - - */ -RecyclerUnloadedIntoCoins: PlainDescriptor>, - - -/** - - */ -CoinOffboardedIntoExternalAsset: PlainDescriptor>, - - -/** - - */ -RecyclerCleaned: PlainDescriptor>, - - -/** - - */ -ConsumedFreeTokensCleaned: PlainDescriptor>, - - -/** - - */ -PaidUnloadTokenRingCleaned: PlainDescriptor>, - - -/** - - */ -RecyclerDustCleaned: PlainDescriptor, - - -/** - - */ -PaidUnloadTokenDustCleaned: PlainDescriptor, - - -/** - - */ -ExpiredPaidUnloadTokenCollectionDeleted: PlainDescriptor>}, -StorageInitialization: { - -/** - * The foreign asset was created and reserves were set. - */ -AssetCreated: PlainDescriptor, - - -/** - * An XCM funds transfer was sent to Asset Hub. - */ -XcmFundsTransferSent: PlainDescriptor, - - -/** - * The XCM transfer timed out and will be retried. - */ -XcmFundsTransferTimedOut: PlainDescriptor, - - -/** - * Transferred funds have been verified. - */ -FundsVerified: PlainDescriptor, - - -/** - * All pots have been funded. - */ -PotsFunded: PlainDescriptor, - - -/** - * Mob Rule payout schedule has been set. - */ -MobRulePayoutsScheduled: PlainDescriptor, - - -/** - * Score payout schedule has been set. - */ -ScorePayoutsScheduled: PlainDescriptor, - - -/** - * The on_poll initialization has completed. - */ -OnPollInitializationCompleted: PlainDescriptor, - - -/** - * Migration: initial people have been recognized. - */ -MigrationPeopleRecognized: PlainDescriptor, - - -/** - * Migration: onboarding size has been set. - */ -MigrationOnboardingSizeSet: PlainDescriptor, - - -/** - * Migration: Proof-of-Ink pallet has been initialized. - */ -MigrationProofOfInkInitialized: PlainDescriptor, - - -/** - * Migration: games have been scheduled. - */ -MigrationGamesScheduled: PlainDescriptor, - - -/** - * Migration: invites have been granted. - */ -MigrationInvitesGranted: PlainDescriptor, - - -/** - * Migration: Proof-of-Ink reimbursement values have been set. - */ -MigrationReimbursementValuesSet: PlainDescriptor, - - -/** - * Migration: People Lite attestation allowances have been set. - */ -MigrationAttestationAllowancesSet: PlainDescriptor, - - -/** - * Migration has completed and on_poll initialization has been triggered. - */ -MigrationCompleted: PlainDescriptor}, -StorageInitializationLite: { - -/** - * Attestation allowances have been set and initialization is complete. - */ -InitializationCompleted: PlainDescriptor}, -Airdrop: { - -/** - * A participant registered for an event. - */ -ParticipantRegistered: PlainDescriptor>, - - -/** - * The event is started. - */ -EventStarted: PlainDescriptor>, - - -/** - * The scheduled event is skipped. - */ -EventSkipped: PlainDescriptor>, - - -/** - * An event was scheduled. - */ -EventScheduled: PlainDescriptor>, - - -/** - * A scheduled event was removed. - */ -ScheduledEventRemoved: PlainDescriptor>, - - -/** - * A failed transfer prize was claimed. - */ -FailedTransferPrizeClaimed: PlainDescriptor>, - - -/** - * The event transitioned to waiting for entropy to build. - */ -WaitingForEntropyToBuild: PlainDescriptor>, - - -/** - * The event transitioned to drawing winners. - */ -DrawingWinners: PlainDescriptor>, - - -/** - * The event transitioned to distributing prizes. - */ -Distributing: PlainDescriptor>, - - -/** - * A prize was distributed to a winner. - */ -PrizeDistributed: PlainDescriptor>, - - -/** - * A prize transfer failed during distribution. - */ -PrizeDistributionFailed: PlainDescriptor>, - - -/** - * The event transitioned to clearing storage. - */ -ClearingStorage: PlainDescriptor>, - - -/** - * The event has completed and been removed. - */ -EventCompleted: PlainDescriptor>}, -MultiBlockMigrations: { - -/** - * A Runtime upgrade started. - * - * Its end is indicated by `UpgradeCompleted` or `UpgradeFailed`. - */ -UpgradeStarted: PlainDescriptor>, - - -/** - * The current runtime upgrade completed. - * - * This implies that all of its migrations completed successfully as well. - */ -UpgradeCompleted: PlainDescriptor, - - -/** - * Runtime upgrade failed. - * - * This is very bad and will require governance intervention. - */ -UpgradeFailed: PlainDescriptor, - - -/** - * A migration was skipped since it was already executed in the past. - */ -MigrationSkipped: PlainDescriptor>, - - -/** - * A migration progressed. - */ -MigrationAdvanced: PlainDescriptor>, - - -/** - * A Migration completed. - */ -MigrationCompleted: PlainDescriptor>, - - -/** - * A Migration failed. - * - * This implies that the whole upgrade failed and governance intervention is required. - */ -MigrationFailed: PlainDescriptor>, - - -/** - * The set of historical migrations has been cleared. - */ -HistoricCleared: PlainDescriptor>}}; -type IError = {System: { - -/** - * The name of specification does not match between the current runtime - * and the new runtime. - */ -InvalidSpecName: PlainDescriptor, - - -/** - * The specification version is not allowed to decrease between the current runtime - * and the new runtime. - */ -SpecVersionNeedsToIncrease: PlainDescriptor, - - -/** - * Failed to extract the runtime version from the new runtime. - * - * Either calling `Core_version` or decoding `RuntimeVersion` failed. - */ -FailedToExtractRuntimeVersion: PlainDescriptor, - - -/** - * Suicide called when the account has non-default composite data. - */ -NonDefaultComposite: PlainDescriptor, - - -/** - * There is a non-zero reference count preventing the account from being purged. - */ -NonZeroRefCount: PlainDescriptor, - - -/** - * The origin filter prevent the call to be dispatched. - */ -CallFiltered: PlainDescriptor, - - -/** - * A multi-block migration is ongoing and prevents the current code from being replaced. - */ -MultiBlockMigrationsOngoing: PlainDescriptor, - - -/** - * No upgrade authorized. - */ -NothingAuthorized: PlainDescriptor, - - -/** - * The submitted code is not authorized. - */ -Unauthorized: PlainDescriptor}, -ParachainSystem: { - -/** - * Attempt to upgrade validation function while existing upgrade pending. - */ -OverlappingUpgrades: PlainDescriptor, - - -/** - * Polkadot currently prohibits this parachain from upgrading its validation function. - */ -ProhibitedByPolkadot: PlainDescriptor, - - -/** - * The supplied validation function has compiled into a blob larger than Polkadot is - * willing to run. - */ -TooBig: PlainDescriptor, - - -/** - * The inherent which supplies the validation data did not run this block. - */ -ValidationDataNotAvailable: PlainDescriptor, - - -/** - * The inherent which supplies the host configuration did not run this block. - */ -HostConfigurationNotAvailable: PlainDescriptor, - - -/** - * No validation function upgrade is currently scheduled. - */ -NotScheduled: PlainDescriptor}, -Balances: { - -/** - * Vesting balance too high to send value. - */ -VestingBalance: PlainDescriptor, - - -/** - * Account liquidity restrictions prevent withdrawal. - */ -LiquidityRestrictions: PlainDescriptor, - - -/** - * Balance too low to send value. - */ -InsufficientBalance: PlainDescriptor, - - -/** - * Value too low to create account due to existential deposit. - */ -ExistentialDeposit: PlainDescriptor, - - -/** - * Transfer/payment would kill account. - */ -Expendability: PlainDescriptor, - - -/** - * A vesting schedule already exists for this account. - */ -ExistingVestingSchedule: PlainDescriptor, - - -/** - * Beneficiary account must pre-exist. - */ -DeadAccount: PlainDescriptor, - - -/** - * Number of named reserves exceed `MaxReserves`. - */ -TooManyReserves: PlainDescriptor, - - -/** - * Number of holds exceed `VariantCountOf`. - */ -TooManyHolds: PlainDescriptor, - - -/** - * Number of freezes exceed `MaxFreezes`. - */ -TooManyFreezes: PlainDescriptor, - - -/** - * The issuance cannot be modified since it is already deactivated. - */ -IssuanceDeactivated: PlainDescriptor, - - -/** - * The delta cannot be zero. - */ -DeltaZero: PlainDescriptor}, -OriginRestriction: { - -/** - * The origin has no usage tracked. - */ -NoUsage: PlainDescriptor, - - -/** - * The usage is not zero. - */ -NotZero: PlainDescriptor}, -Assets: { - -/** - * Account balance must be greater than or equal to the transfer amount. - */ -BalanceLow: PlainDescriptor, - - -/** - * The account to alter does not exist. - */ -NoAccount: PlainDescriptor, - - -/** - * The signing account has no permission to do the operation. - */ -NoPermission: PlainDescriptor, - - -/** - * The given asset ID is unknown. - */ -Unknown: PlainDescriptor, - - -/** - * The origin account is frozen. - */ -Frozen: PlainDescriptor, - - -/** - * The asset ID is already taken. - */ -InUse: PlainDescriptor, - - -/** - * Invalid witness data given. - */ -BadWitness: PlainDescriptor, - - -/** - * Minimum balance should be non-zero. - */ -MinBalanceZero: PlainDescriptor, - - -/** - * Unable to increment the consumer reference counters on the account. Either no provider - * reference exists to allow a non-zero balance of a non-self-sufficient asset, or one - * fewer then the maximum number of consumers has been reached. - */ -UnavailableConsumer: PlainDescriptor, - - -/** - * Invalid metadata given. - */ -BadMetadata: PlainDescriptor, - - -/** - * No approval exists that would allow the transfer. - */ -Unapproved: PlainDescriptor, - - -/** - * The source account would not survive the transfer and it needs to stay alive. - */ -WouldDie: PlainDescriptor, - - -/** - * The asset-account already exists. - */ -AlreadyExists: PlainDescriptor, - - -/** - * The asset-account doesn't have an associated deposit. - */ -NoDeposit: PlainDescriptor, - - -/** - * The operation would result in funds being burned. - */ -WouldBurn: PlainDescriptor, - - -/** - * The asset is a live asset and is actively being used. Usually emit for operations such - * as `start_destroy` which require the asset to be in a destroying state. - */ -LiveAsset: PlainDescriptor, - - -/** - * The asset is not live, and likely being destroyed. - */ -AssetNotLive: PlainDescriptor, - - -/** - * The asset status is not the expected status. - */ -IncorrectStatus: PlainDescriptor, - - -/** - * The asset should be frozen before the given operation. - */ -NotFrozen: PlainDescriptor, - - -/** - * Callback action resulted in error - */ -CallbackFailed: PlainDescriptor, - - -/** - * The asset ID must be equal to the [`NextAssetId`]. - */ -BadAssetId: PlainDescriptor, - - -/** - * The asset cannot be destroyed because some accounts for this asset contain freezes. - */ -ContainsFreezes: PlainDescriptor, - - -/** - * The asset cannot be destroyed because some accounts for this asset contain holds. - */ -ContainsHolds: PlainDescriptor, - - -/** - * Tried setting too many reserves. - */ -TooManyReserves: PlainDescriptor}, -AssetsHolder: { - -/** - * Number of holds on an account would exceed the count of `RuntimeHoldReason`. - */ -TooManyHolds: PlainDescriptor}, -AssetRate: { - -/** - * The given asset ID is unknown. - */ -UnknownAssetKind: PlainDescriptor, - - -/** - * The given asset ID already has an assigned conversion rate and cannot be re-created. - */ -AlreadyExists: PlainDescriptor, - - -/** - * Overflow ocurred when calculating the inverse rate. - */ -Overflow: PlainDescriptor}, -CollatorSelection: { - -/** - * The pallet has too many candidates. - */ -TooManyCandidates: PlainDescriptor, - - -/** - * Leaving would result in too few candidates. - */ -TooFewEligibleCollators: PlainDescriptor, - - -/** - * Account is already a candidate. - */ -AlreadyCandidate: PlainDescriptor, - - -/** - * Account is not a candidate. - */ -NotCandidate: PlainDescriptor, - - -/** - * There are too many Invulnerables. - */ -TooManyInvulnerables: PlainDescriptor, - - -/** - * Account is already an Invulnerable. - */ -AlreadyInvulnerable: PlainDescriptor, - - -/** - * Account is not an Invulnerable. - */ -NotInvulnerable: PlainDescriptor, - - -/** - * Account has no associated validator ID. - */ -NoAssociatedValidatorId: PlainDescriptor, - - -/** - * Validator ID is not yet registered. - */ -ValidatorNotRegistered: PlainDescriptor, - - -/** - * Could not insert in the candidate list. - */ -InsertToCandidateListFailed: PlainDescriptor, - - -/** - * Could not remove from the candidate list. - */ -RemoveFromCandidateListFailed: PlainDescriptor, - - -/** - * New deposit amount would be below the minimum candidacy bond. - */ -DepositTooLow: PlainDescriptor, - - -/** - * Could not update the candidate list. - */ -UpdateCandidateListFailed: PlainDescriptor, - - -/** - * Deposit amount is too low to take the target's slot in the candidate list. - */ -InsufficientBond: PlainDescriptor, - - -/** - * The target account to be replaced in the candidate list is not a candidate. - */ -TargetIsNotCandidate: PlainDescriptor, - - -/** - * The updated deposit amount is equal to the amount already reserved. - */ -IdenticalDeposit: PlainDescriptor, - - -/** - * Cannot lower candidacy bond while occupying a future collator slot in the list. - */ -InvalidUnreserve: PlainDescriptor}, -Session: { - -/** - * Invalid ownership proof. - */ -InvalidProof: PlainDescriptor, - - -/** - * No associated validator ID for account. - */ -NoAssociatedValidatorId: PlainDescriptor, - - -/** - * Registered duplicate key. - */ -DuplicatedKey: PlainDescriptor, - - -/** - * No keys are associated with this account. - */ -NoKeys: PlainDescriptor, - - -/** - * Key setting account is not live, so it's impossible to associate keys. - */ -NoAccount: PlainDescriptor}, -XcmpQueue: { - -/** - * Setting the queue config failed since one of its values was invalid. - */ -BadQueueConfig: PlainDescriptor, - - -/** - * The execution is already suspended. - */ -AlreadySuspended: PlainDescriptor, - - -/** - * The execution is already resumed. - */ -AlreadyResumed: PlainDescriptor, - - -/** - * There are too many active outbound channels. - */ -TooManyActiveOutboundChannels: PlainDescriptor, - - -/** - * The message is too big. - */ -TooBig: PlainDescriptor}, -PolkadotXcm: { - -/** - * The desired destination was unreachable, generally because there is a no way of routing - * to it. - */ -Unreachable: PlainDescriptor, - - -/** - * There was some other issue (i.e. not to do with routing) in sending the message. - * Perhaps a lack of space for buffering the message. - */ -SendFailure: PlainDescriptor, - - -/** - * The message execution fails the filter. - */ -Filtered: PlainDescriptor, - - -/** - * The message's weight could not be determined. - */ -UnweighableMessage: PlainDescriptor, - - -/** - * The destination `Location` provided cannot be inverted. - */ -DestinationNotInvertible: PlainDescriptor, - - -/** - * The assets to be sent are empty. - */ -Empty: PlainDescriptor, - - -/** - * Could not re-anchor the assets to declare the fees for the destination chain. - */ -CannotReanchor: PlainDescriptor, - - -/** - * Too many assets have been attempted for transfer. - */ -TooManyAssets: PlainDescriptor, - - -/** - * Origin is invalid for sending. - */ -InvalidOrigin: PlainDescriptor, - - -/** - * The version of the `Versioned` value used is not able to be interpreted. - */ -BadVersion: PlainDescriptor, - - -/** - * The given location could not be used (e.g. because it cannot be expressed in the - * desired version of XCM). - */ -BadLocation: PlainDescriptor, - - -/** - * The referenced subscription could not be found. - */ -NoSubscription: PlainDescriptor, - - -/** - * The location is invalid since it already has a subscription from us. - */ -AlreadySubscribed: PlainDescriptor, - - -/** - * Could not check-out the assets for teleportation to the destination chain. - */ -CannotCheckOutTeleport: PlainDescriptor, - - -/** - * The owner does not own (all) of the asset that they wish to do the operation on. - */ -LowBalance: PlainDescriptor, - - -/** - * The asset owner has too many locks on the asset. - */ -TooManyLocks: PlainDescriptor, - - -/** - * The given account is not an identifiable sovereign account for any location. - */ -AccountNotSovereign: PlainDescriptor, - - -/** - * The operation required fees to be paid which the initiator could not meet. - */ -FeesNotMet: PlainDescriptor, - - -/** - * A remote lock with the corresponding data could not be found. - */ -LockNotFound: PlainDescriptor, - - -/** - * The unlock operation cannot succeed because there are still consumers of the lock. - */ -InUse: PlainDescriptor, - - -/** - * Invalid asset, reserve chain could not be determined for it. - */ -InvalidAssetUnknownReserve: PlainDescriptor, - - -/** - * Invalid asset, do not support remote asset reserves with different fees reserves. - */ -InvalidAssetUnsupportedReserve: PlainDescriptor, - - -/** - * Too many assets with different reserve locations have been attempted for transfer. - */ -TooManyReserves: PlainDescriptor, - - -/** - * Local XCM execution incomplete. - */ -LocalExecutionIncomplete: PlainDescriptor, - - -/** - * Too many locations authorized to alias origin. - */ -TooManyAuthorizedAliases: PlainDescriptor, - - -/** - * Expiry block number is in the past. - */ -ExpiresInPast: PlainDescriptor, - - -/** - * The alias to remove authorization for was not found. - */ -AliasNotFound: PlainDescriptor, - - -/** - * Local XCM execution incomplete with the actual XCM error and the index of the - * instruction that caused the error. - */ -LocalExecutionIncompleteWithError: PlainDescriptor>}, -MessageQueue: { - -/** - * Page is not reapable because it has items remaining to be processed and is not old - * enough. - */ -NotReapable: PlainDescriptor, - - -/** - * Page to be reaped does not exist. - */ -NoPage: PlainDescriptor, - - -/** - * The referenced message could not be found. - */ -NoMessage: PlainDescriptor, - - -/** - * The message was already processed and cannot be processed again. - */ -AlreadyProcessed: PlainDescriptor, - - -/** - * The message is queued for future execution. - */ -Queued: PlainDescriptor, - - -/** - * There is temporarily not enough weight to continue servicing messages. - */ -InsufficientWeight: PlainDescriptor, - - -/** - * This message is temporarily unprocessable. - * - * Such errors are expected, but not guaranteed, to resolve themselves eventually through - * retrying. - */ -TemporarilyUnprocessable: PlainDescriptor, - - -/** - * The queue is paused and no message can be executed from it. - * - * This can change at any time and may resolve in the future by re-trying. - */ -QueuePaused: PlainDescriptor, - - -/** - * Another call is in progress and needs to finish before this call can happen. - */ -RecursiveDisallowed: PlainDescriptor}, -Utility: { - -/** - * Too many calls batched. - */ -TooManyCalls: PlainDescriptor}, -Multisig: { - -/** - * Threshold must be 2 or greater. - */ -MinimumThreshold: PlainDescriptor, - - -/** - * Call is already approved by this signatory. - */ -AlreadyApproved: PlainDescriptor, - - -/** - * Call doesn't need any (more) approvals. - */ -NoApprovalsNeeded: PlainDescriptor, - - -/** - * There are too few signatories in the list. - */ -TooFewSignatories: PlainDescriptor, - - -/** - * There are too many signatories in the list. - */ -TooManySignatories: PlainDescriptor, - - -/** - * The signatories were provided out of order; they should be ordered. - */ -SignatoriesOutOfOrder: PlainDescriptor, - - -/** - * The sender was contained in the other signatories; it shouldn't be. - */ -SenderInSignatories: PlainDescriptor, - - -/** - * Multisig operation not found in storage. - */ -NotFound: PlainDescriptor, - - -/** - * Only the account that originally created the multisig is able to cancel it or update - * its deposits. - */ -NotOwner: PlainDescriptor, - - -/** - * No timepoint was given, yet the multisig operation is already underway. - */ -NoTimepoint: PlainDescriptor, - - -/** - * A different timepoint was given to the multisig operation that is underway. - */ -WrongTimepoint: PlainDescriptor, - - -/** - * A timepoint was given, yet no multisig operation is underway. - */ -UnexpectedTimepoint: PlainDescriptor, - - -/** - * The maximum weight information provided was too low. - */ -MaxWeightTooLow: PlainDescriptor, - - -/** - * The data to be stored is already stored. - */ -AlreadyStored: PlainDescriptor}, -Sudo: { - -/** - * Sender must be the Sudo account. - */ -RequireSudo: PlainDescriptor}, -Proxy: { - -/** - * There are too many proxies registered or too many announcements pending. - */ -TooMany: PlainDescriptor, - - -/** - * Proxy registration not found. - */ -NotFound: PlainDescriptor, - - -/** - * Sender is not a proxy of the account to be proxied. - */ -NotProxy: PlainDescriptor, - - -/** - * A call which is incompatible with the proxy type's filter was attempted. - */ -Unproxyable: PlainDescriptor, - - -/** - * Account is already a proxy. - */ -Duplicate: PlainDescriptor, - - -/** - * Call may not be made by proxy because it may escalate its privileges. - */ -NoPermission: PlainDescriptor, - - -/** - * Announcement, if made at all, was made too recently. - */ -Unannounced: PlainDescriptor, - - -/** - * Cannot add self as proxy. - */ -NoSelfProxy: PlainDescriptor}, -Identity: { - -/** - * Too many subs-accounts. - */ -TooManySubAccounts: PlainDescriptor, - - -/** - * No alias found for an account. - */ -NoAlias: PlainDescriptor, - - -/** - * Account isn't found. - */ -NotFound: PlainDescriptor, - - -/** - * Account isn't named. - */ -NotNamed: PlainDescriptor, - - -/** - * Empty index. - */ -EmptyIndex: PlainDescriptor, - - -/** - * Fee is changed. - */ -FeeChanged: PlainDescriptor, - - -/** - * No identity found. - */ -NoIdentity: PlainDescriptor, - - -/** - * Sticky judgement. - */ -StickyJudgement: PlainDescriptor, - - -/** - * Judgement given. - */ -JudgementGiven: PlainDescriptor, - - -/** - * Invalid judgement. - */ -InvalidJudgement: PlainDescriptor, - - -/** - * The index is invalid. - */ -InvalidIndex: PlainDescriptor, - - -/** - * The target is invalid. - */ -InvalidTarget: PlainDescriptor, - - -/** - * Maximum amount of registrars reached. Cannot add any more. - */ -TooManyRegistrars: PlainDescriptor, - - -/** - * Account ID is already named. - */ -AlreadyClaimed: PlainDescriptor, - - -/** - * Username has already been reported. - */ -AlreadyReported: PlainDescriptor, - - -/** - * Sender is not a sub-account. - */ -NotSub: PlainDescriptor, - - -/** - * Sub-account isn't owned by sender. - */ -NotOwned: PlainDescriptor, - - -/** - * The provided judgement was for a different identity. - */ -JudgementForDifferentIdentity: PlainDescriptor, - - -/** - * Error that occurs when there is an issue paying for judgement. - */ -JudgementPaymentFailed: PlainDescriptor, - - -/** - * The provided suffix is too long. - */ -InvalidSuffix: PlainDescriptor, - - -/** - * The sender does not have permission to issue a username. - */ -NotUsernameAuthority: PlainDescriptor, - - -/** - * The authority cannot allocate any more usernames. - */ -NoAllocation: PlainDescriptor, - - -/** - * The signature on a username was not valid. - */ -InvalidSignature: PlainDescriptor, - - -/** - * Setting this username requires a signature, but none was provided. - */ -RequiresSignature: PlainDescriptor, - - -/** - * The username does not meet the requirements. - */ -InvalidUsername: PlainDescriptor, - - -/** - * The username is already taken. - */ -UsernameTaken: PlainDescriptor, - - -/** - * The requested username does not exist. - */ -NoUsername: PlainDescriptor, - - -/** - * The reported username was not provided by the system. - */ -NotSystemProvidedUsername: PlainDescriptor, - - -/** - * The username cannot be forcefully removed because it can still be accepted. - */ -NotExpired: PlainDescriptor, - - -/** - * The username cannot be removed because it's still in the grace period. - */ -TooEarly: PlainDescriptor, - - -/** - * The username cannot be removed because it is not unbinding. - */ -NotUnbinding: PlainDescriptor, - - -/** - * The username cannot be unbound because it is already unbinding. - */ -AlreadyUnbinding: PlainDescriptor, - - -/** - * The action cannot be performed because of insufficient privileges (e.g. authority - * trying to unbind a username provided by the system). - */ -InsufficientPrivileges: PlainDescriptor, - - -/** - * The context in which the alias was used is not supported. - */ -BadContext: PlainDescriptor, - - -/** - * No associated request for the judgement received. - */ -UnexpectedJudgement: PlainDescriptor, - - -/** - * The social credential is not supported by the configured identity information provider. - */ -NotSupported: PlainDescriptor, - - -/** - * The person is banned and cannot perform the operation. - */ -Banned: PlainDescriptor, - - -/** - * The person already has a personal identity associated with their alias. - */ -AlreadyRegistered: PlainDescriptor, - - -/** - * The list of judgements ongoing on a personal identity is full. - */ -JudgementListFull: PlainDescriptor, - - -/** - * The username has been reported too recently. - */ -LastUsernameReportTooRecent: PlainDescriptor, - - -/** - * The username has been reported and is undergoing validity judgement. - */ -UsernameJudgementOngoing: PlainDescriptor}, -People: { - -/** - * The supplied identifier does not represent a person. - */ -NotPerson: PlainDescriptor, - - -/** - * The given person has no associated key. - */ -NoKey: PlainDescriptor, - - -/** - * The context is not a member of those allowed to have account aliases held. - */ -InvalidContext: PlainDescriptor, - - -/** - * The account is not known. - */ -InvalidAccount: PlainDescriptor, - - -/** - * The account is already in use under another alias. - */ -AccountInUse: PlainDescriptor, - - -/** - * The proof is invalid. - */ -InvalidProof: PlainDescriptor, - - -/** - * The signature is invalid. - */ -InvalidSignature: PlainDescriptor, - - -/** - * There are not yet any members of our personhood set. - */ -NoMembers: PlainDescriptor, - - -/** - * The root cannot be finalized as there are still unpushed members. - */ -Incomplete: PlainDescriptor, - - -/** - * The root is still fresh. - */ -StillFresh: PlainDescriptor, - - -/** - * Too many members have been pushed. - */ -TooManyMembers: PlainDescriptor, - - -/** - * Key already in use by another person. - */ -KeyAlreadyInUse: PlainDescriptor, - - -/** - * The old key was not found when expected. - */ -KeyNotFound: PlainDescriptor, - - -/** - * Could not push member into the ring. - */ -CouldNotPush: PlainDescriptor, - - -/** - * The record is already using this key. - */ -SameKey: PlainDescriptor, - - -/** - * Personal Id was not reserved. - */ -PersonalIdNotReserved: PlainDescriptor, - - -/** - * Personal Id has never been reserved. - */ -PersonalIdReservationCannotRenew: PlainDescriptor, - - -/** - * Personal Id was not reserved or not already recognized. - */ -PersonalIdNotReservedOrNotRecognized: PlainDescriptor, - - -/** - * Ring cannot be merged if it's the top ring. - */ -InvalidRing: PlainDescriptor, - - -/** - * Ring cannot be built while there are suspensions pending. - */ -SuspensionsPending: PlainDescriptor, - - -/** - * Ring cannot be merged if it's not below 1/2 capacity. - */ -RingAboveMergeThreshold: PlainDescriptor, - - -/** - * Suspension indices provided are invalid. - */ -InvalidSuspensions: PlainDescriptor, - - -/** - * An mutating action was queued when there was no mutation session in progress. - */ -NoMutationSession: PlainDescriptor, - - -/** - * An mutating session could not be started. - */ -CouldNotStartMutationSession: PlainDescriptor, - - -/** - * Cannot merge rings while a suspension session is in progress. - */ -SuspensionSessionInProgress: PlainDescriptor, - - -/** - * Call is too late or too early. - */ -TimeOutOfRange: PlainDescriptor, - - -/** - * Alias <-> Account is already set and up to date. - */ -AliasAccountAlreadySet: PlainDescriptor, - - -/** - * Personhood cannot be resumed if it is not suspended. - */ -NotSuspended: PlainDescriptor, - - -/** - * Personhood is suspended. - */ -Suspended: PlainDescriptor, - - -/** - * Invalid state for attempted key migration. - */ -InvalidKeyMigration: PlainDescriptor, - - -/** - * Invalid suspension of a key belonging to a person whose index in the ring has already - * been included in the pending suspensions list. - */ -KeyAlreadySuspended: PlainDescriptor, - - -/** - * The onboarding size must not exceed the maximum ring size. - */ -InvalidOnboardingSize: PlainDescriptor, - - -/** - * The member key is not valid for the crypto. - */ -InvalidMemberKey: PlainDescriptor, - - -/** - * The people collection has already been created. - */ -PeopleCollectionAlreadyExists: PlainDescriptor}, -MobRule: { - -/** - * The case does not exist. - */ -NoSuchCase: PlainDescriptor, - - -/** - * The vote does not exist. - */ -NoSuchVote: PlainDescriptor, - - -/** - * The case is not open. - */ -NotOpen: PlainDescriptor, - - -/** - * The case is not ripe. - */ -NotRipe: PlainDescriptor, - - -/** - * The case is not yet done. - */ -NotDone: PlainDescriptor, - - -/** - * The decode of the call failed. Maybe there was a breaking runtime upgrade in between? - */ -CodecError: PlainDescriptor, - - -/** - * The call failed to dispatch. Maybe there was a breaking runtime upgrade in between? - */ -DispatchError: PlainDescriptor, - - -/** - * The case is too recent to be reaped. - */ -Recent: PlainDescriptor, - - -/** - * Not enough credit to payout the rewards. - */ -NoCredit: PlainDescriptor, - - -/** - * No mob credit distribution in place to reward voters. - */ -NoReward: PlainDescriptor, - - -/** - * No points to be converted to mob credit. - */ -NoPoints: PlainDescriptor, - - -/** - * Too many vote claims. - */ -TooManyClaims: PlainDescriptor, - - -/** - * No payout in progress. - */ -NoPayout: PlainDescriptor, - - -/** - * The point and/or credit arithmetic overflows. - */ -ArithmeticOverflow: PlainDescriptor, - - -/** - * Too many payout round schedules. - */ -TooManySchedules: PlainDescriptor, - - -/** - * No payout round schedule found. - */ -NoSchedule: PlainDescriptor, - - -/** - * No vote penalty found. - */ -NoPenalty: PlainDescriptor, - - -/** - * The vote penalty has not expired yet. - */ -Early: PlainDescriptor, - - -/** - * The vote cannot be cast due to a voting penalty in effect. - */ -UnderPenalty: PlainDescriptor, - - -/** - * The open case expiration is disabled due to insufficient active voters. - */ -CaseExpirationDisabled: PlainDescriptor}, -ProofOfInk: { - -/** - * Account is already applying to make a proof-of-ink. - */ -InProgress: PlainDescriptor, - - -/** - * Account has not been referred. - */ -NoReferral: PlainDescriptor, - - -/** - * The callback context is invalid; this should never happen. - */ -BadContext: PlainDescriptor, - - -/** - * The incoming judgement ID is not what we were expecting for the account. - */ -UnexpectedJudgement: PlainDescriptor, - - -/** - * No arguments were supplied with the judgement. - */ -NoArgs: PlainDescriptor, - - -/** - * The account has not applied to make a proof-of-ink. - */ -NotApplied: PlainDescriptor, - - -/** - * The candidate has not committed to a design. - */ -NotSelected: PlainDescriptor, - - -/** - * The candidate did not prove themselves yet. - */ -NotProven: PlainDescriptor, - - -/** - * The candidate has already started their judgement. - */ -AlreadyStarted: PlainDescriptor, - - -/** - * The personal ID is not in range. - */ -OutOfRange: PlainDescriptor, - - -/** - * The personal ID has already been taken. - */ -AlreadyTaken: PlainDescriptor, - - -/** - * The person has no more referrals left to give. - */ -NoMoreReferrals: PlainDescriptor, - - -/** - * The reroll is too early. - */ -TooEarly: PlainDescriptor, - - -/** - * The referrer's design is not procedural. - */ -DesignInvalid: PlainDescriptor, - - -/** - * The referrer's design is already taken. - */ -DesignTaken: PlainDescriptor, - - -/** - * The referrer doesn't appear to be a person. This should never happen. - */ -BadParent: PlainDescriptor, - - -/** - * The design family doesn't exist. - */ -BadFamily: PlainDescriptor, - - -/** - * The design family is invalid for this choice. - */ -WrongFamily: PlainDescriptor, - - -/** - * The index of the design or variant is beyond the allowed maximum for the family. - */ -IndexTooBig: PlainDescriptor, - - -/** - * The system is busy with too many commitments; try again later. - */ -Busy: PlainDescriptor, - - -/** - * The person has been banned from referring. - */ -Banned: PlainDescriptor, - - -/** - * The candidate has not demonstrated probably through the initial evidence. - */ -Improbable: PlainDescriptor, - - -/** - * The personal identity has already been reserved. - */ -IdReserved: PlainDescriptor, - - -/** - * The personal identity is already taken by a proven person. - */ -IdUsed: PlainDescriptor, - - -/** - * The ticket provided is invalid. - */ -InvalidTicket: PlainDescriptor, - - -/** - * The caller has not provided a referral or invitation ticket. - */ -NoTicket: PlainDescriptor, - - -/** - * The account is not authorized to do this. - */ -NotAuthorized: PlainDescriptor, - - -/** - * The personal identity doesn't exist. - */ -NotPerson: PlainDescriptor, - - -/** - * The candidate is referred. But the operation requires the candidate to not be referred. - */ -ReferredCandidate: PlainDescriptor, - - -/** - * The candidate is not referred. But the operation requires the candidate to be referred. - */ -NotReferredCandidate: PlainDescriptor, - - -/** - * There is no referral reward to register. - */ -NoRewardToRegister: PlainDescriptor, - - -/** - * There is a pending referral reward that must be registered first. - */ -RewardToRegister: PlainDescriptor, - - -/** - * No inviter found. - */ -NoInviter: PlainDescriptor, - - -/** - * Invalid signature. - */ -InvalidSignature: PlainDescriptor, - - -/** - * No invite available. - */ -NoInvites: PlainDescriptor, - - -/** - * Invite is already set. - */ -AlreadyInvited: PlainDescriptor, - - -/** - * The referrer is not a person. - */ -NoReferrer: PlainDescriptor, - - -/** - * The individual is not a person recognized by proof of ink. - */ -NotPoiPerson: PlainDescriptor, - - -/** - * The proof of ownership is invalid. - */ -InvalidProofOfOwnership: PlainDescriptor, - - -/** - * The reimbursement values are invalid. - */ -InvalidReimbursementValues: PlainDescriptor}, -Game: { - -/** - * Game ongoing. - */ -GameOngoing: PlainDescriptor, - - -/** - * No registration phase ongoing. - */ -NoRegistration: PlainDescriptor, - - -/** - * The setup is outdated. - */ -OutdatedGameSetup: PlainDescriptor, - - -/** - * Invalid setup. - */ -InvalidGameSetup: PlainDescriptor, - - -/** - * Invalid report. - */ -InvalidReport: PlainDescriptor, - - -/** - * No game ongoing. - */ -NoGame: PlainDescriptor, - - -/** - * No report phase ongoing. - */ -NoReporting: PlainDescriptor, - - -/** - * Not registered. - */ -NotRegistered: PlainDescriptor, - - -/** - * Player already registered. - */ -AlreadyRegistered: PlainDescriptor, - - -/** - * Report already sent. - */ -ReportAlreadySent: PlainDescriptor, - - -/** - * Operation is not valid yet. - */ -Early: PlainDescriptor, - - -/** - * The operation expect a player account. - */ -NotKickablePlayer: PlainDescriptor, - - -/** - * No archived player found. - */ -NoArchivedPlayer: PlainDescriptor, - - -/** - * No ticket found. - */ -NoTicket: PlainDescriptor, - - -/** - * No invite available. - */ -NoInvites: PlainDescriptor, - - -/** - * Invite is already set. - */ -AlreadyInvited: PlainDescriptor, - - -/** - * Not an account based player, expected an account based player. - */ -NotAccountPlayer: PlainDescriptor, - - -/** - * The player can't use an invite if already playing. - */ -UseInviteButAlreadyPlaying: PlainDescriptor, - - -/** - * The number of existing schedules and new schedules exceeds the configured limit. - */ -TooManyGameSchedules: PlainDescriptor, - - -/** - * The game that was supposed to be removed was not found in scheduled games. - */ -NoSuchGameScheduled: PlainDescriptor, - - -/** - * The statement account signature is invalid. - */ -InvalidStatementAccountSignature: PlainDescriptor, - - -/** - * The statement account is already in used by another player. - */ -StatementAccountAlreadyInUse: PlainDescriptor, - - -/** - * Internal error invalid state. - */ -InternalErrorInvalidState: PlainDescriptor, - - -/** - * The operation cannot be performed in the current game state. - */ -InvalidGameState: PlainDescriptor, - - -/** - * No player found. - */ -NoPlayer: PlainDescriptor, - - -/** - * The player cannot offboard while registered for a game. - */ -CannotOffboardWhileRegisteredForGame: PlainDescriptor, - - -/** - * Invalid state - */ -InvalidState: PlainDescriptor}, -Score: { - -/** - * The calling origin is not a person. - */ -NotPerson: PlainDescriptor, - - -/** - * The person didn't reach personhood. - */ -HasNotReachedPersonhood: PlainDescriptor, - - -/** - * No reward available. - */ -NoReward: PlainDescriptor, - - -/** - * The person has no associated score. - */ -NoScore: PlainDescriptor, - - -/** - * No payout schedule available. - */ -NoSchedule: PlainDescriptor, - - -/** - * Too many payout schedules already registered. - */ -TooManySchedules: PlainDescriptor, - - -/** - * The participant is recognized or has been recognized as a person. - */ -Recognized: PlainDescriptor, - - -/** - * The participant has already cashed out in this era. - */ -CashOutCooldown: PlainDescriptor, - - -/** - * The round is on going or no schedule. - */ -RoundOnGoingOrNoSchedule: PlainDescriptor, - - -/** - * The payout round has not started. - */ -NoRound: PlainDescriptor, - - -/** - * The origin is neither a person nor a signed account. - */ -BadOriginNotPersonNotSigned: PlainDescriptor, - - -/** - * The origin is neither a person nor a signed account nor an account participant. - */ -BadOriginNotPersonNotSignedNotAccountParticipant: PlainDescriptor, - - -/** - * The origin is neither a signed account nor an account participant. - */ -BadOriginNotSignedNotAccountParticipant: PlainDescriptor, - - -/** - * The participant is already participating. - */ -AlreadyParticipating: PlainDescriptor, - - -/** - * The key must be provided. - */ -KeyMustBeProvided: PlainDescriptor, - - -/** - * The key must not be provided. - */ -KeyMustNotBeProvided: PlainDescriptor, - - -/** - * Has reached personhood in the past. - */ -HasReachedPersonhood: PlainDescriptor, - - -/** - * The proof of ownership is invalid. - */ -InvalidProofOfOwnership: PlainDescriptor, - - -/** - * An absence grace tier has a window exceeding the maximum trackable history (8). - */ -WindowTooLarge: PlainDescriptor, - - -/** - * The allowed misses must be strictly less than the window (or both zero). - */ -AllowedMissesTooLarge: PlainDescriptor, - - -/** - * Tiers must be sorted by ascending `population_size_threshold`. - */ -ScheduleNotSorted: PlainDescriptor}, -DummyDim: { - -/** - * The personal ID does not belong to a recognized person. - */ -NotPerson: PlainDescriptor, - - -/** - * The personal ID does not belong to a suspended person. - */ -NotSuspended: PlainDescriptor, - - -/** - * The personal ID is not reserved and awaiting recognition. - */ -NotReserved: PlainDescriptor, - - -/** - * The operation does not support this many people. - */ -TooManyPeople: PlainDescriptor}, -PeopleLite: { - -/** - * No attestation allowance. - */ -NoAttestationAllowance: PlainDescriptor, - - -/** - * The signature created by the candidate's account is invalid. - */ -InvalidAttestationSignature: PlainDescriptor, - - -/** - * The signature created by the candidate's ring vrf key is invalid. - */ -InvalidProofOfOwnership: PlainDescriptor, - - -/** - * The candidate is already registered. - */ -AlreadyRegistered: PlainDescriptor}, -Resources: { - -/** - * Username does not fit the requirements. - */ -InvalidUsername: PlainDescriptor, - - -/** - * Username is already taken. - */ -UsernameTaken: PlainDescriptor, - - -/** - * Consumer is already registered. - */ -AlreadyRegistered: PlainDescriptor, - - -/** - * Provided proof of ownership is invalid. - */ -InvalidProofOfOwnership: PlainDescriptor, - - -/** - * Person is not registered as a consumer. - */ -NotRegistered: PlainDescriptor, - - -/** - * Consumer is not a full person. - */ -NotFullPerson: PlainDescriptor, - - -/** - * Attempted to update person authorization too early. - */ -TouchNotReady: PlainDescriptor, - - -/** - * Reservation is not active. - */ -NoReservation: PlainDescriptor, - - -/** - * The linked lite identity is not the active holder of the reservation. - */ -NotReservationHolder: PlainDescriptor, - - -/** - * The username in the reservation request is already taken. - */ -UsernameReservationTaken: PlainDescriptor, - - -/** - * The reservation has not expired. - */ -ReservationFresh: PlainDescriptor, - - -/** - * There is no lite consumer to be linked. - */ -NoLinkedIdentity: PlainDescriptor, - - -/** - * The lite consumer is already linked to a full person consumer. - */ -AlreadyLinked: PlainDescriptor, - - -/** - * The requested slot number is out of range. - */ -InvalidSlot: PlainDescriptor, - - -/** - * The account already has an allowance in the slot. - */ -AccountAlreadyHasAllowance: PlainDescriptor, - - -/** - * The person's authorization has not expired yet. - */ -PersonAuthNotExpired: PlainDescriptor, - - -/** - * The person has already been demoted. - */ -AlreadyDemoted: PlainDescriptor, - - -/** - * Queue for this username is full. - */ -QueueFull: PlainDescriptor, - - -/** - * Account is not in the queue for this username. - */ -NotInQueue: PlainDescriptor, - - -/** - * Account already has a reservation for another username. - */ -AlreadyHasReservation: PlainDescriptor}, -ChunksManager: { - -/** - * The requested chunk index doesn't exist. - */ -ChunkNotFound: PlainDescriptor, - - -/** - * The provided chunk data couldn't be decoded. - */ -InvalidChunks: PlainDescriptor, - - -/** - * The start index isn't strictly less than the end index. - */ -InvalidChunkRange: PlainDescriptor}, -Members: { - -/** - * The supplied identifier does not represent a member. - */ -NotMember: PlainDescriptor, - - -/** - * Ring has no root. - */ -NoRoot: PlainDescriptor, - - -/** - * The proof is invalid. - */ -InvalidProof: PlainDescriptor, - - -/** - * The root cannot be finalized as there are still unpushed members. - */ -Incomplete: PlainDescriptor, - - -/** - * The root is still fresh. - */ -StillFresh: PlainDescriptor, - - -/** - * Too many members have been pushed. - */ -TooManyMembers: PlainDescriptor, - - -/** - * Key already in use by another member. - */ -KeyAlreadyInUse: PlainDescriptor, - - -/** - * The old key was not found when expected. - */ -KeyNotFound: PlainDescriptor, - - -/** - * Could not push member into the ring. - */ -CouldNotPush: PlainDescriptor, - - -/** - * Ring cannot be merged if it's the top ring. - */ -InvalidRing: PlainDescriptor, - - -/** - * Ring cannot be built while there are suspensions pending. - */ -SuspensionsPending: PlainDescriptor, - - -/** - * Ring cannot be merged if it's not below 1/2 capacity. - */ -RingAboveMergeThreshold: PlainDescriptor, - - -/** - * Suspension indices provided are invalid. - */ -InvalidSuspensions: PlainDescriptor, - - -/** - * A mutating action was queued when there was no removal session in progress. - */ -NoRemovalSession: PlainDescriptor, - - -/** - * A removal session could not be started. - */ -CouldNotStartRemovalSession: PlainDescriptor, - - -/** - * Cannot merge rings while a removal session is in progress. - */ -RemovalSessionInProgress: PlainDescriptor, - - -/** - * Invalid suspension of a key belonging to a member whose index in the ring has already - * been included in the pending suspensions list. - */ -KeyAlreadySuspended: PlainDescriptor, - - -/** - * The onboarding size must not exceed the maximum ring size. - */ -InvalidOnboardingSize: PlainDescriptor, - - -/** - * The member key is not valid for the crypto. - */ -InvalidMemberKey: PlainDescriptor, - - -/** - * The collection does not exist. - */ -CollectionNotFound: PlainDescriptor, - - -/** - * The collection already exists. - */ -CollectionAlreadyExists: PlainDescriptor, - - -/** - * Too many collections for this owner. - */ -TooManyCollections: PlainDescriptor, - - -/** - * Flexible collections must use the MaxFlexibleRingExponent ring size. - */ -InvalidRingSizeForFlexible: PlainDescriptor, - - -/** - * The ring exponent is not supported. - */ -InvalidRingExponent: PlainDescriptor, - - -/** - * Insufficient members in the queue to onboard. - */ -PrematureOnboarding: PlainDescriptor, - - -/** - * The collection is marked for deletion and cannot be modified. - */ -CollectionMarkedForDeletion: PlainDescriptor, - - -/** - * The caller is not the owner of the collection. - */ -NotCollectionOwner: PlainDescriptor}, -Coinage: { - -/** - - */ -MemberKeyAlreadyUsed: PlainDescriptor, - - -/** - - */ -InvalidMemberKey: PlainDescriptor, - - -/** - - */ -InternalError: PlainDescriptor, - - -/** - - */ -RecyclerAlreadyUnloaded: PlainDescriptor, - - -/** - - */ -InvalidConsolidation: PlainDescriptor, - - -/** - - */ -ConsolidationTooBig: PlainDescriptor, - - -/** - - */ -CoinValueTooBig: PlainDescriptor, - - -/** - - */ -CoinValueTooSmall: PlainDescriptor, - - -/** - - */ -CoinValueIsLessThanFee: PlainDescriptor, - - -/** - - */ -CoinValueOutOfBound: PlainDescriptor, - - -/** - - */ -InvalidAliasProof: PlainDescriptor, - - -/** - - */ -NoUnloadingRecycler: PlainDescriptor, - - -/** - - */ -ProofAndAliasMismatch: PlainDescriptor, - - -/** - - */ -NothingToBuild: PlainDescriptor, - - -/** - - */ -TooManyRings: PlainDescriptor, - - -/** - - */ -AddressAlreadyHasCoin: PlainDescriptor, - - -/** - - */ -InvalidProofOfOwnership: PlainDescriptor, - - -/** - - */ -EmptyInputs: PlainDescriptor, - - -/** - * The fee recycler in the origin does not match the call's recycler. - */ -RecyclerMismatch: PlainDescriptor, - - -/** - * The total unloaded amount is less than the fee. - */ -InsufficientUnloadForFee: PlainDescriptor, - - -/** - * The first alias was not pre-marked by extension (required for FromOutput fee). - */ -AliasNotPremarked: PlainDescriptor, - - -/** - * The recycler revision does not match (recycler may not exist or has been rebuilt). - */ -InvalidRecyclerRevision: PlainDescriptor, - - -/** - - */ -InvalidSplit: PlainDescriptor, - - -/** - * This operation requires a fresh coin (`age == 0`). - */ -FreshCoinRequired: PlainDescriptor, - - -/** - - */ -CannotConvertNativeToAsset: PlainDescriptor}, -Airdrop: { - -/** - * No active airdrop event. - */ -NoActiveEvent: PlainDescriptor, - - -/** - * The origin is not a person. - */ -NotAPerson: PlainDescriptor, - - -/** - * The alias is already registered. - */ -AliasAlreadyRegistered: PlainDescriptor, - - -/** - * The event registration time is invalid. - */ -InvalidEventRegistrationTime: PlainDescriptor, - - -/** - * Participant ID overflow. - */ -ParticipantIdOverflow: PlainDescriptor, - - -/** - * The participant has no prize to claim for the event. - */ -NoPrizeToClaimForEvent: PlainDescriptor, - - -/** - * The event doesn't exist. - */ -NoEventFound: PlainDescriptor, - - -/** - * The schedule is full. - */ -ScheduleFull: PlainDescriptor, - - -/** - * The prize must be more or equal to the minimum balance. - */ -PrizeMustBeMoreOrEqualToMinBalance: PlainDescriptor}, -MultiBlockMigrations: { - -/** - * The operation cannot complete since some MBMs are ongoing. - */ -Ongoing: PlainDescriptor}}; -type IConstants = {System: { - -/** - * Block & extrinsics weights: base values and limits. - */ -BlockWeights: PlainDescriptor>, - - -/** - * The maximum length of a block (in bytes). - */ -BlockLength: PlainDescriptor>, - - -/** - * Maximum number of block number to block hash mappings to keep (oldest pruned first). - */ -BlockHashCount: PlainDescriptor, - - -/** - * The weight of runtime database operations the runtime can invoke. - */ -DbWeight: PlainDescriptor>, - - -/** - * Get the chain's in-code version. - */ -Version: PlainDescriptor>, - - -/** - * The designated SS58 prefix of this chain. - * - * This replaces the "ss58Format" property declared in the chain spec. Reason is - * that the runtime should know about the prefix in order to make use of it as - * an identifier of the chain. - */ -SS58Prefix: PlainDescriptor}, -ParachainSystem: { - -/** - * Returns the parachain ID we are running with. - */ -SelfParaId: PlainDescriptor}, -Timestamp: { - -/** - * The minimum period between blocks. - * - * Be aware that this is different to the *expected* period that the block production - * apparatus provides. Your chosen consensus system will generally work with this to - * determine a sensible block time. For example, in the Aura pallet it will be double this - * period on default settings. - */ -MinimumPeriod: PlainDescriptor}, -Balances: { - -/** - * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! - * - * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for - * this pallet. However, you do so at your own risk: this will open up a major DoS vector. - * In case you have multiple sources of provider references, you may also get unexpected - * behaviour if you set this to zero. - * - * Bottom line: Do yourself a favour and make it at least one! - */ -ExistentialDeposit: PlainDescriptor, - - -/** - * The maximum number of locks that should exist on an account. - * Not strictly enforced, but used for weight estimation. - * - * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` - */ -MaxLocks: PlainDescriptor, - - -/** - * The maximum number of named reserves that can exist on an account. - * - * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` - */ -MaxReserves: PlainDescriptor, - - -/** - * The maximum number of individual freeze locks that can exist on an account at any time. - */ -MaxFreezes: PlainDescriptor}, -TransactionPayment: { - -/** - * A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their - * `priority` - * - * This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later - * added to a tip component in regular `priority` calculations. - * It means that a `Normal` transaction can front-run a similarly-sized `Operational` - * extrinsic (with no tip), by including a tip value greater than the virtual tip. - * - * ```rust,ignore - * // For `Normal` - * let priority = priority_calc(tip); - * - * // For `Operational` - * let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier; - * let priority = priority_calc(tip + virtual_tip); - * ``` - * - * Note that since we use `final_fee` the multiplier applies also to the regular `tip` - * sent with the transaction. So, not only does the transaction get a priority bump based - * on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational` - * transactions. - */ -OperationalFeeMultiplier: PlainDescriptor}, -Assets: { - -/** - * Max number of items to destroy per `destroy_accounts` and `destroy_approvals` call. - * - * Must be configured to result in a weight that makes each call fit in a block. - */ -RemoveItemsLimit: PlainDescriptor, - - -/** - * The basic amount of funds that must be reserved for an asset. - */ -AssetDeposit: PlainDescriptor, - - -/** - * The amount of funds that must be reserved for a non-provider asset account to be - * maintained. - */ -AssetAccountDeposit: PlainDescriptor, - - -/** - * The basic amount of funds that must be reserved when adding metadata to your asset. - */ -MetadataDepositBase: PlainDescriptor, - - -/** - * The additional funds that must be reserved for the number of bytes you store in your - * metadata. - */ -MetadataDepositPerByte: PlainDescriptor, - - -/** - * The amount of funds that must be reserved when creating a new approval. - */ -ApprovalDeposit: PlainDescriptor, - - -/** - * The maximum length of a name or symbol stored on-chain. - */ -StringLimit: PlainDescriptor}, -CollatorSelection: { - -/** - * Account Identifier from which the internal Pot is generated. - */ -PotId: PlainDescriptor>, - - -/** - * Maximum number of candidates that we should have. - * - * This does not take into account the invulnerables. - */ -MaxCandidates: PlainDescriptor, - - -/** - * Minimum number eligible collators. Should always be greater than zero. This includes - * Invulnerable collators. This ensures that there will always be one collator who can - * produce a block. - */ -MinEligibleCollators: PlainDescriptor, - - -/** - * Maximum number of invulnerables. - */ -MaxInvulnerables: PlainDescriptor, - - -/** - - */ -KickThreshold: PlainDescriptor, - - -/** - * Gets this pallet's derived pot account. - */ -pot_account: PlainDescriptor}, -Session: { - -/** - * The amount to be held when setting keys. - */ -KeyDeposit: PlainDescriptor}, -Aura: { - -/** - * The slot duration Aura should run with, expressed in milliseconds. - * The effective value of this type should not change while the chain is running. - * - * For backwards compatibility either use [`MinimumPeriodTimesTwo`] or a const. - */ -SlotDuration: PlainDescriptor}, -XcmpQueue: { - -/** - * The maximum number of inbound XCMP channels that can be suspended simultaneously. - * - * Any further channel suspensions will fail and messages may get dropped without further - * notice. Choosing a high value (1000) is okay; the trade-off that is described in - * [`InboundXcmpSuspended`] still applies at that scale. - */ -MaxInboundSuspended: PlainDescriptor, - - -/** - * Maximal number of outbound XCMP channels that can have messages queued at the same time. - * - * If this is reached, then no further messages can be sent to channels that do not yet - * have a message queued. This should be set to the expected maximum of outbound channels - * which is determined by [`Self::ChannelInfo`]. It is important to set this large enough, - * since otherwise the congestion control protocol will not work as intended and messages - * may be dropped. This value increases the PoV and should therefore not be picked too - * high. Governance needs to pay attention to not open more channels than this value. - */ -MaxActiveOutboundChannels: PlainDescriptor, - - -/** - * The maximal page size for HRMP message pages. - * - * A lower limit can be set dynamically, but this is the hard-limit for the PoV worst case - * benchmarking. The limit for the size of a message is slightly below this, since some - * overhead is incurred for encoding the format. - */ -MaxPageSize: PlainDescriptor}, -PolkadotXcm: { - -/** - * This chain's Universal Location. - */ -UniversalLocation: PlainDescriptor, - - -/** - * The latest supported version that we advertise. Generally just set it to - * `pallet_xcm::CurrentXcmVersion`. - */ -AdvertisedXcmVersion: PlainDescriptor, - - -/** - * The maximum number of local XCM locks that a single account may have. - */ -MaxLockers: PlainDescriptor, - - -/** - * The maximum number of consumers a single remote lock may have. - */ -MaxRemoteLockConsumers: PlainDescriptor}, -MessageQueue: { - -/** - * The size of the page; this implies the maximum message size which can be sent. - * - * A good value depends on the expected message sizes, their weights, the weight that is - * available for processing them and the maximal needed message size. The maximal message - * size is slightly lower than this as defined by [`MaxMessageLenOf`]. - */ -HeapSize: PlainDescriptor, - - -/** - * The maximum number of stale pages (i.e. of overweight messages) allowed before culling - * can happen. Once there are more stale pages than this, then historical pages may be - * dropped, even if they contain unprocessed overweight messages. - */ -MaxStale: PlainDescriptor, - - -/** - * The amount of weight (if any) which should be provided to the message queue for - * servicing enqueued items `on_initialize`. - * - * This may be legitimately `None` in the case that you will call - * `ServiceQueues::service_queues` manually or set [`Self::IdleMaxServiceWeight`] to have - * it run in `on_idle`. - */ -ServiceWeight: PlainDescriptor>, - - -/** - * The maximum amount of weight (if any) to be used from remaining weight `on_idle` which - * should be provided to the message queue for servicing enqueued items `on_idle`. - * Useful for parachains to process messages at the same block they are received. - * - * If `None`, it will not call `ServiceQueues::service_queues` in `on_idle`. - */ -IdleMaxServiceWeight: PlainDescriptor>}, -Utility: { - -/** - * The limit on the number of batched calls. - */ -batched_calls_limit: PlainDescriptor}, -Multisig: { - -/** - * The base amount of currency needed to reserve for creating a multisig execution or to - * store a dispatch call for later. - * - * This is held for an additional storage item whose value size is - * `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is - * `32 + sizeof(AccountId)` bytes. - */ -DepositBase: PlainDescriptor, - - -/** - * The amount of currency needed per unit threshold when creating a multisig execution. - * - * This is held for adding 32 bytes more into a pre-existing storage value. - */ -DepositFactor: PlainDescriptor, - - -/** - * The maximum amount of signatories allowed in the multisig. - */ -MaxSignatories: PlainDescriptor}, -Proxy: { - -/** - * The base amount of currency needed to reserve for creating a proxy. - * - * This is held for an additional storage item whose value size is - * `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes. - */ -ProxyDepositBase: PlainDescriptor, - - -/** - * The amount of currency needed per proxy added. - * - * This is held for adding 32 bytes plus an instance of `ProxyType` more into a - * pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take - * into account `32 + proxy_type.encode().len()` bytes of data. - */ -ProxyDepositFactor: PlainDescriptor, - - -/** - * The maximum amount of proxies allowed for a single account. - */ -MaxProxies: PlainDescriptor, - - -/** - * The maximum amount of time-delayed announcements that are allowed to be pending. - */ -MaxPending: PlainDescriptor, - - -/** - * The base amount of currency needed to reserve for creating an announcement. - * - * This is held when a new storage item holding a `Balance` is created (typically 16 - * bytes). - */ -AnnouncementDepositBase: PlainDescriptor, - - -/** - * The amount of currency needed per announcement made. - * - * This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes) - * into a pre-existing storage value. - */ -AnnouncementDepositFactor: PlainDescriptor}, -Identity: { - -/** - * The amount held on deposit for a registered identity. - */ -BasicDeposit: PlainDescriptor, - - -/** - * The amount held on deposit per encoded byte for a registered identity. - */ -ByteDeposit: PlainDescriptor, - - -/** - * The amount held on deposit per registered username. This value should change only in - * runtime upgrades with proper migration of existing deposits. - */ -UsernameDeposit: PlainDescriptor, - - -/** - * The amount held on deposit for a registered subaccount. This should account for the fact - * that one storage item's value will increase by the size of an account ID, and there will - * be another trie item whose value is the size of an account ID plus 32 bytes. - */ -SubAccountDeposit: PlainDescriptor, - - -/** - * The amount held on deposit per reported username. - */ -UsernameReportDeposit: PlainDescriptor, - - -/** - * The maximum number of sub-accounts allowed per identified account. - */ -MaxSubAccounts: PlainDescriptor, - - -/** - * The number of blocks that have to pass between the last time a given username was - * reported and now in order to be able to report it again. In other words, it represents - * the username validity safety period. - */ -UsernameReportTimeout: PlainDescriptor, - - -/** - * Maximum number of registrars allowed in the system. Needed to bound the complexity - * of, e.g., updating judgements. - */ -MaxRegistrars: PlainDescriptor, - - -/** - * Maximum number of judgements per personal identity allowed in the system. - */ -MaxJudgements: PlainDescriptor, - - -/** - * The number of blocks within which a username grant must be accepted. - */ -PendingUsernameExpiration: PlainDescriptor, - - -/** - * The number of blocks that must pass to enable the permanent deletion of a username by - * its respective authority. - */ -UsernameGracePeriod: PlainDescriptor, - - -/** - * The maximum length of a suffix. - */ -MaxSuffixLength: PlainDescriptor, - - -/** - * The maximum length of a username, including its suffix and any system-added delimiters. - */ -MaxUsernameLength: PlainDescriptor, - - -/** - * The minimum length of a username or suffix. - */ -MinUsernameLength: PlainDescriptor, - - -/** - * The fee that a person must pay through their associated on-chain account in order to - * remove their identity. - */ -CredentialRemovalPenalty: PlainDescriptor, - - -/** - * The context used for the proofs required to authenticate as a personal alias in - * identity. - */ -identity_context: PlainDescriptor>}, -People: { - -/** - * The ring exponent used to operate the people member collection in `MemberService`. - */ -RingExponent: PlainDescriptor>, - - -/** - * Maximum number of people included in an onboarding queue page before a new one is - * created. - */ -OnboardingQueuePageSize: PlainDescriptor, - - -/** - * The amount of block number tolerance we allow for a setup account transaction. - * - * `set_alias_account` and `set_personal_id_account` calls contains - * `call_valid_at` as a parameter, those calls are valid if the block number is within - * the tolerance period. - */ -account_setup_time_tolerance: PlainDescriptor}, -MobRule: { - -/** - * The location of the used currency. It is informational only. - */ -CurrencyLocationInfo: PlainDescriptor>, - - -/** - * The number of seconds before a case times out and can be reaped. - */ -MaxVoteClaimDuration: PlainDescriptor, - - -/** - * The number of seconds a case must stay open for voting before it can be closed. - */ -MinCaseDuration: PlainDescriptor, - - -/** - * The maximum number of seconds for which a case could stay open for voting. - */ -MaxVotingDuration: PlainDescriptor, - - -/** - * The minimum number of votes a case must receive before a verdict can be reached. - */ -MinTurnoutNominal: PlainDescriptor, - - -/** - * The minimum number of votes as a percentage of the total voter count a case must receive - * before a verdict can be reached. - */ -MinTurnoutPercentage: PlainDescriptor, - - -/** - * The number of blocks that a penalty is applied for. - */ -VotingPenaltyDuration: PlainDescriptor, - - -/** - * The maximum number of votes claimable in a single extrinsic. - */ -MaxVotesClaimable: PlainDescriptor, - - -/** - * The interval at which offchain worker runs. - */ -OffchainWorkInterval: PlainDescriptor, - - -/** - * Maximum number of votes that will be cleaned during offchain worker run. - */ -CleanVotesBatchSize: PlainDescriptor, - - -/** - * The time in seconds during which votes can be claimed on done cases. - * Measured from the time the case becomes 'Done'. - */ -VotesOpenForClaimsDuration: PlainDescriptor, - - -/** - * The minimum number of active voters required to allow voting. When this threshold is not - * met, open cases cannot time out. - */ -MinimumVoterThreshold: PlainDescriptor, - - -/** - * Get a unique, inaccessible account ID from the `PotId`. - */ -mob_rule_pot_id: PlainDescriptor, - - -/** - * The context used for the proofs required to authenticate as a personal alias in mob - * rule. - */ -mob_rule_context: PlainDescriptor>}, -ProofOfInk: { - -/** - * The maximum number of active referrals a user can have open. - * It cannot exceed 200. - */ -MaxActiveReferrals: PlainDescriptor, - - -/** - * Account Identifier from which the reward pot is generated. - * - * The account must be funded so rewards can be paid during registration and - * referral reward claims. - * - * The `PalletId` must be a constant as it is exposed in the metadata. - * Changing this value with a runtime upgrade can be done at any time, the new account will - * then need to be funded accordingly. - */ -PotId: PlainDescriptor>, - - -/** - * The account ID of the pot used for reward transfers. - */ -proof_of_ink_pot_id: PlainDescriptor}, -Game: { - -/** - * The maximum number of rounds in a game. - * - * Note: the actual number of rounds is configured per game. - */ -MaxRounds: PlainDescriptor, - - -/** - * The maximum number of players in a group. - * - * Note: the actual number of players in a group is configured per game. - */ -MaxGroupSize: PlainDescriptor, - - -/** - * The minimum number of players in a group. - * - * When scheduling a game the value for `max_group_size` must be at least this minimum + 1. - * - * In order to have no single-player groups, this value must be at least 2. - * - * Note: the actual minimum number of players in a group is configured per game, it is - * `max_group_size - 1`. - */ -MinGroupSize: PlainDescriptor, - - -/** - * The time after which a player that is not playing can be kicked out. - * - * This is only for account players, not persons. - */ -NonPlayingKickoutTime: PlainDescriptor, - - -/** - * The durations of each game phase, in seconds. - */ -PhaseDurations: PlainDescriptor>, - - -/** - * The Maximum number of game schedules the pallet can store. - */ -MaxGameSchedules: PlainDescriptor, - - -/** - * The maximum number of past games for which player attendance is stored. Any attendance - * entries older than this will be imminently purged from storage. - */ -MaxAttendanceHistoryDepth: PlainDescriptor, - - -/** - * The base message of the proof of ownership of an account by an alias. - * - * The full message is this base concatenated to the alias and then hashed with - * `blake2_256` (blake2 with 256 bit output). - */ -proof_of_ownership_msg_base: PlainDescriptor>}, -Score: { - -/** - * The location of the used currency. It is informational only. - */ -CurrencyLocationInfo: PlainDescriptor>, - - -/** - * The interval at which offchain worker runs. - */ -OffchainWorkInterval: PlainDescriptor, - - -/** - * Get a unique, inaccessible account ID from the `PotId`. - */ -score_pot_id: PlainDescriptor, - - -/** - * The context used for the proofs required to authenticate as a personal alias in score - * pallet. - */ -score_context: PlainDescriptor>, - - -/** - * The number of points received when attending as a recognized person. - */ -ubi_points: PlainDescriptor}, -Resources: { - -/** - * The maximum length of a username, including any potential trailing digits. - */ -MaxUsernameLength: PlainDescriptor, - - -/** - * The minimum length of a username. - */ -MinUsernameLength: PlainDescriptor, - - -/** - * The duration of time, in seconds, for which a person's authorization is valid. After - * this period elapses, people will no longer be considered active, but their resource - * allowances should default to the same values used for lite people. - */ -PersonAuthDuration: PlainDescriptor, - - -/** - * The minimum interval of time, in seconds, which must pass before updating a person's - * authorization. - */ -MinPersonAuthUpdateInterval: PlainDescriptor, - - -/** - * Maximum number of accounts that can queue for a single reserved username. - */ -MaxReservationQueueLength: PlainDescriptor, - - -/** - * The number of slots for the accounts API authorization. - * - * Increasing or decreasing this value will require a migration. - */ -AccountsApiSlotCount: PlainDescriptor, - - -/** - * The refund cooldown, in seconds, for the accounts API. - */ -AccountsApiRefundCooldown: PlainDescriptor, - - -/** - * The Statement Store allowance for the accounts API. - */ -AccountsApiAllowance: PlainDescriptor>}, -ChunksManager: { - -/** - * Number of chunks per page. Must be a power of two. - */ -PageSize: PlainDescriptor}, -Members: { - -/** - * Maximum number of collections an owner can have. - */ -MaxCollections: PlainDescriptor, - - -/** - * Maximum number of members included in an onboarding queue page before a new one is - * created. - */ -OnboardingQueuePageSize: PlainDescriptor, - - -/** - * The maximum ring exponent used for Flexible collections. This also determines the page - * size for paginated ring key storage. Flexible collections can only use ring sizes up - * to this value. - */ -MaxFlexibleRingExponent: PlainDescriptor>, - - -/** - * Maximum number of members that can be included in a ring through a single root building - * call. - */ -RingBuildingMemberLimit: PlainDescriptor}, -Coinage: { - -/** - * The ring exponent for recycler collections. - */ -RecyclerRingExponent: PlainDescriptor>, - - -/** - * The ring exponent for paid unload token collections. - */ -PaidUnloadTokenRingExponent: PlainDescriptor>, - - -/** - * The asset id of the underlying asset of the coins. - */ -UnderlyingAssetId: PlainDescriptor>, - - -/** - * The unit of the underlying asset of the coins. - */ -UnderlyingAssetUnit: PlainDescriptor, - - -/** - * The minimum exponent for the coin value. - */ -MinimumExponent: PlainDescriptor, - - -/** - * The maximum exponent for the coin value. - */ -MaximumExponent: PlainDescriptor, - - -/** - * The maximum number of outputs for a split. - */ -MaxSplitOutputs: PlainDescriptor, - - -/** - * The maximum number of alias proofs in a consolidation. - */ -MaxConsolidation: PlainDescriptor, - - -/** - * The time period duration for unload tokens, in seconds. - */ -UnloadTokenTimePeriodPeopleLitePeople: PlainDescriptor, - - -/** - * The allowance of unload tokens that a person can use per time period, expressed in the - * underlying asset. - * - * Use pallet view to fetch the corresponding number of unload tokens given the current - * price for unload tokens. - */ -UnloadTokenAllowancePerTimePeriodForPeople: PlainDescriptor, - - -/** - * The allowance of unload tokens that a lite person can use per time period, expressed in - * the underlying asset. - * - * Use pallet's get_free_unload_token_info() to fetch the corresponding number of unload - * tokens given the current price for unload tokens. - */ -UnloadTokenAllowancePerTimePeriodForLitePeople: PlainDescriptor, - - -/** - * Hard upper bound on the number of free unload tokens per time period. - * - * The effective free token limit is: - * `min(allowance / current_fee, MaxFreeUnloadTokensPerTimePeriod)`. - */ -MaxFreeUnloadTokensPerTimePeriod: PlainDescriptor, - - -/** - * The number of block between two offchain worker executions. - */ -OffchainWorkerInterval: PlainDescriptor, - - -/** - * The base number of seconds to lock a coin after a failed dispatch in `AsCoin` flow. - * - * The actual lock duration is exponential: `2^retries * base` where `retries` is - * the number of consecutive failures. - */ -CoinFailureLockPeriod: PlainDescriptor, - - -/** - * The account id of the pallet. - */ -pallet_account: PlainDescriptor}, -Airdrop: { - -/** - * The account id for the airdrop pot. - */ -airdrop_pot_id: PlainDescriptor, - - -/** - * The base context for airdrops. Each airdrop context is derived from this base context - * with the airdrop index in LE encoding added to it. - */ -airdrop_context_base: PlainDescriptor>}, -MultiBlockMigrations: { - -/** - * The maximal length of an encoded cursor. - * - * A good default needs to selected such that no migration will ever have a cursor with MEL - * above this limit. This is statically checked in `integrity_test`. - */ -CursorMaxLen: PlainDescriptor, - - -/** - * The maximal length of an encoded identifier. - * - * A good default needs to selected such that no migration will ever have an identifier - * with MEL above this limit. This is statically checked in `integrity_test`. - */ -IdentifierMaxLen: PlainDescriptor}}; -type IViewFns = {Assets: { - -/** - * Provide the asset details for asset `id`. - */ -asset_details: RuntimeDescriptor<[id: Anonymize], Anonymize>, - - -/** - * Provide the balance of `who` for asset `id`. - */ -balance_of: RuntimeDescriptor<[who: SS58String, id: Anonymize], Anonymize>, - - -/** - * Provide the configured metadata for asset `id`. - */ -get_metadata: RuntimeDescriptor<[id: Anonymize], Anonymize>, - - -/** - * Provide the configured reserves data for asset `id`. - */ -get_reserves_data: RuntimeDescriptor<[id: Anonymize], Anonymize>}, -Proxy: { - -/** - * Check if a `RuntimeCall` is allowed for a given `ProxyType`. - */ -check_permissions: RuntimeDescriptor<[call: Anonymize, proxy_type: Anonymize], boolean>, - - -/** - * Check if one `ProxyType` is a subset of another `ProxyType`. - */ -is_superset: RuntimeDescriptor<[to_check: Anonymize, against: Anonymize], boolean>}, -Coinage: { - -/** - * Get the current number of free unload tokens distributed to people and lite people - * given the current price for unload tokens. - * - * If an element is `None`, no price is currently available and conversion between native - * and the underlying asset needs to be configured. - * - * Returns: `(limit_people, limit_lite_people)`. - * - * Each element is `None` when its limit cannot be computed. - */ -get_free_unload_token_info: RuntimeDescriptor<[], Anonymize>, - - -/** - * Get the ring status for a recycler at a given ring index. - */ -get_recycler_ring_status: RuntimeDescriptor<[value: number, index: number], Anonymize>, - - -/** - * Get the ring revision for a recycler at a given ring index. - */ -get_recycler_ring_revision: RuntimeDescriptor<[value: number, index: number], Anonymize>, - - -/** - * Get the ring status for a paid token at a given period and ring index. - */ -get_paid_token_ring_status: RuntimeDescriptor<[period: number, index: number], Anonymize>, - - -/** - * Get the ring revision for a paid token at a given period and ring index. - */ -get_paid_token_ring_revision: RuntimeDescriptor<[period: number, index: number], Anonymize>, - - -/** - * Get the current fee in the underlying asset for paid unload tokens. - * - * If none is returned it means that no price is currently available, and some conversion - * between native and the underlying asset needs to be configured. - */ -get_paid_unload_token_fee_in_asset: RuntimeDescriptor<[], Anonymize>, - - -/** - * Get the current fee in the native currency for paid unload tokens. - */ -get_paid_unload_token_fee_in_native: RuntimeDescriptor<[], bigint>, - - -/** - * Get coin details for an account. - */ -get_coin_by_owner: RuntimeDescriptor<[owner: SS58String], Anonymize>, - - -/** - * Get the Unix timestamp until which a coin is currently locked after failed dispatch. - * - * Returns `None` when there is no lock or when the stored lock has already expired. - */ -get_coin_lock_until: RuntimeDescriptor<[owner: SS58String], Anonymize>, - - -/** - * Get the coin value for a specific recycler member key. - */ -get_recycler_member_info: RuntimeDescriptor<[member: SizedHex<32>], Anonymize>, - - -/** - * Check whether a paid token member key is registered. - */ -is_paid_token_member: RuntimeDescriptor<[member: SizedHex<32>], boolean>, - - -/** - * Get the members of a recycler ring (the anonymity set). - * Required to build the ring commitment (accumulator) for the proof. - */ -get_recycler_members: RuntimeDescriptor<[value: number, index: number], Anonymize>, - - -/** - * Get the members of a paid token ring (the anonymity set). - * Required to build the ring commitment (accumulator) for the proof. - */ -get_paid_token_ring_members: RuntimeDescriptor<[period: number, index: number], Anonymize>, - - -/** - * Check if a recycler alias has already been unloaded (spent). - * - * If the recycler is not live, the result is not significant. - */ -is_recycler_alias_unloaded: RuntimeDescriptor<[value: number, index: number, alias: SizedHex<32>], boolean>, - - -/** - * Check if a paid unload token has been consumed. - * - * If the period is not current, the result is not significant. - */ -is_paid_token_alias_consumed: RuntimeDescriptor<[period: number, index: number, alias: SizedHex<32>], boolean>, - - -/** - * Check if a free unload token has been consumed. - * - * If the period is not current, the result is not significant. - */ -is_free_token_alias_consumed: RuntimeDescriptor<[period: number, alias: SizedHex<32>], boolean>}}; -type IRuntimeCalls = { - -/** - * API necessary for block authorship with aura. - */ -AuraApi: { - -/** - * Returns the slot duration for Aura. - * - * Currently, only the value provided by this type at genesis will be used. - */ -slot_duration: RuntimeDescriptor<[], bigint>, - - -/** - * Return the current set of authorities. - */ -authorities: RuntimeDescriptor<[], Anonymize>}, - - -/** - * API to tell the node side how the relay parent should be chosen. - * - * A larger offset indicates that the relay parent should not be the tip of the relay chain, - * but `N` blocks behind the tip. This offset is then enforced by the runtime. - */ -RelayParentOffsetApi: { - -/** - * Fetch the slot offset that is expected from the relay chain. - */ -relay_parent_offset: RuntimeDescriptor<[], number>}, - - -/** - * This runtime API is used to inform potential block authors whether they will - * have the right to author at a slot, assuming they have claimed the slot. - * - * In particular, this API allows Aura-based parachains to regulate their "unincluded segment", - * which is the section of the head of the chain which has not yet been made available in the - * relay chain. - * - * When the unincluded segment is short, Aura chains will allow authors to create multiple - * blocks per slot in order to build a backlog. When it is saturated, this API will limit - * the amount of blocks that can be created. - * - * Changes: - * - Version 2: Update to `can_build_upon` to take a relay chain `Slot` instead of a parachain `Slot`. - */ -AuraUnincludedSegmentApi: { - -/** - * Whether it is legal to extend the chain, assuming the given block is the most - * recently included one as-of the relay parent that will be built against, and - * the given relay chain slot. - * - * This should be consistent with the logic the runtime uses when validating blocks to - * avoid issues. - * - * When the unincluded segment is empty, i.e. `included_hash == at`, where at is the block - * whose state we are querying against, this must always return `true` as long as the slot - * is more recent than the included block itself. - */ -can_build_upon: RuntimeDescriptor<[included_hash: SizedHex<32>, slot: bigint], boolean>}, - - -/** - * The `Core` runtime api that every Substrate runtime needs to implement. - */ -Core: { - -/** - * Returns the version of the runtime. - */ -version: RuntimeDescriptor<[], Anonymize>, - - -/** - * Execute the given block. - */ -execute_block: RuntimeDescriptor<[block: Anonymize], undefined>, - - -/** - * Initialize a block with the given header and return the runtime executive mode. - */ -initialize_block: RuntimeDescriptor<[header: Anonymize], Anonymize>}, - - -/** - * The `Metadata` api trait that returns metadata for the runtime. - */ -Metadata: { - -/** - * Returns the metadata of a runtime. - */ -metadata: RuntimeDescriptor<[], Uint8Array>, - - -/** - * Returns the metadata at a given version. - * - * If the given `version` isn't supported, this will return `None`. - * Use [`Self::metadata_versions`] to find out about supported metadata version of the runtime. - */ -metadata_at_version: RuntimeDescriptor<[version: number], Anonymize>, - - -/** - * Returns the supported metadata versions. - * - * This can be used to call `metadata_at_version`. - */ -metadata_versions: RuntimeDescriptor<[], Anonymize>}, - - -/** - * Runtime API for executing view functions - */ -RuntimeViewFunction: { - -/** - * Execute a view function query. - */ -execute_view_function: RuntimeDescriptor<[query_id: Anonymize, input: Uint8Array], Anonymize>}, - - -/** - * The `BlockBuilder` api trait that provides the required functionality for building a block. - */ -BlockBuilder: { - -/** - * Apply the given extrinsic. - * - * Returns an inclusion outcome which specifies if this extrinsic is included in - * this block or not. - */ -apply_extrinsic: RuntimeDescriptor<[extrinsic: Uint8Array], Anonymize>, - - -/** - * Finish the current block. - */ -finalize_block: RuntimeDescriptor<[], Anonymize>, - - -/** - * Generate inherent extrinsics. The inherent data will vary from chain to chain. - */ -inherent_extrinsics: RuntimeDescriptor<[inherent: Anonymize], Anonymize>, - - -/** - * Check that the inherents are valid. The inherent data will vary from chain to chain. - */ -check_inherents: RuntimeDescriptor<[block: Anonymize, data: Anonymize], Anonymize>}, - - -/** - * The `TaggedTransactionQueue` api trait for interfering with the transaction queue. - */ -TaggedTransactionQueue: { - -/** - * Validate the transaction. - * - * This method is invoked by the transaction pool to learn details about given transaction. - * The implementation should make sure to verify the correctness of the transaction - * against current state. The given `block_hash` corresponds to the hash of the block - * that is used as current state. - * - * Note that this call may be performed by the pool multiple times and transactions - * might be verified in any possible order. - */ -validate_transaction: RuntimeDescriptor<[source: TransactionValidityTransactionSource, tx: Uint8Array, block_hash: SizedHex<32>], Anonymize>}, - - -/** - * The offchain worker api. - */ -OffchainWorkerApi: { - -/** - * Starts the off-chain task for given block header. - */ -offchain_worker: RuntimeDescriptor<[header: Anonymize], undefined>}, - - -/** - * Session keys runtime api. - */ -SessionKeys: { - -/** - * Generate a set of session keys with optionally using the given seed. - * The keys should be stored within the keystore exposed via runtime - * externalities. - * - * The seed needs to be a valid `utf8` string. - * - * Returns the concatenated SCALE encoded public keys. - */ -generate_session_keys: RuntimeDescriptor<[seed: Anonymize], Uint8Array>, - - -/** - * Decode the given public session keys. - * - * Returns the list of public raw public keys + key type. - */ -decode_session_keys: RuntimeDescriptor<[encoded: Uint8Array], Anonymize>}, - - -/** - * The API to query account nonce. - */ -AccountNonceApi: { - -/** - * Get current account nonce of given `AccountId`. - */ -account_nonce: RuntimeDescriptor<[account: SS58String], number>}, - - -/** - - */ -TransactionPaymentApi: { - -/** - - */ -query_info: RuntimeDescriptor<[uxt: Uint8Array, len: number], Anonymize>, - - -/** - - */ -query_fee_details: RuntimeDescriptor<[uxt: Uint8Array, len: number], Anonymize>, - - -/** - - */ -query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>, - - -/** - - */ -query_length_to_fee: RuntimeDescriptor<[length: number], bigint>}, - - -/** - - */ -TransactionPaymentCallApi: { - -/** - * Query information of a dispatch class, weight, and fee of a given encoded `Call`. - */ -query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>, - - -/** - * Query fee details of a given encoded `Call`. - */ -query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>, - - -/** - * Query the output of the current `WeightToFee` given some input. - */ -query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>, - - -/** - * Query the output of the current `LengthToFee` given some input. - */ -query_length_to_fee: RuntimeDescriptor<[length: number], bigint>}, - - -/** - * A trait of XCM payment API. - * - * API provides functionality for obtaining: - * - * * the weight required to execute an XCM message, - * * a list of acceptable `AssetId`s for message execution payment, - * * the cost of the weight in the specified acceptable `AssetId`. - * * the fees for an XCM message delivery. - * - * To determine the execution weight of the calls required for - * [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. - */ -XcmPaymentApi: { - -/** - * Returns a list of acceptable payment assets. - * - * # Arguments - * - * * `xcm_version`: Version. - */ -query_acceptable_payment_assets: RuntimeDescriptor<[xcm_version: number], Anonymize>, - - -/** - * Returns a weight needed to execute a XCM. - * - * # Arguments - * - * * `message`: `VersionedXcm`. - */ -query_xcm_weight: RuntimeDescriptor<[message: XcmVersionedXcm], Anonymize>, - - -/** - * Converts a weight into a fee for the specified `AssetId`. - * - * # Arguments - * - * * `weight`: convertible `Weight`. - * * `asset`: `VersionedAssetId`. - */ -query_weight_to_asset_fee: RuntimeDescriptor<[weight: Anonymize, asset: XcmVersionedAssetId], Anonymize>, - - -/** - * Query delivery fees V2. - * - * Get delivery fees for sending a specific `message` to a `destination`. - * These always come in a specific asset, defined by the chain. - * - * # Arguments - * * `message`: The message that'll be sent, necessary because most delivery fees are based on the - * size of the message. - * * `destination`: The destination to send the message to. Different destinations may use - * different senders that charge different fees. - */ -query_delivery_fees: RuntimeDescriptor<[destination: XcmVersionedLocation, message: XcmVersionedXcm, asset_id: XcmVersionedAssetId], Anonymize>}, - - -/** - * API for useful conversions between XCM `Location` and `AccountId`. - */ -LocationToAccountApi: { - -/** - * Converts `Location` to `AccountId`. - */ -convert_location: RuntimeDescriptor<[location: XcmVersionedLocation], Anonymize>}, - - -/** - * The API to query the rewards for mob credit. - */ -MobRuleApi: { - -/** - * Returns a list of cases where the user has a vote stored on chain. If the `done_only` - * flag is set, only cases that are done and ready to be claimed will be returned. This - * function does not take the correctness of the vote into account. - */ -voted_on: RuntimeDescriptor<[voter: SizedHex<32>, done_only: boolean], Anonymize>}, - - -/** - * The API to query the deposit for a proof of ink candidacy. - */ -ProofOfInkApi: { - -/** - * Returns the deposit necessary to become a candidate. - */ -candidacy_deposit: RuntimeDescriptor<[], bigint>}, - - -/** - * The API to query the deposit for gameplay. - */ -PalletGameApi: { - -/** - * Returns the deposit necessary to play a game. - */ -play_deposit: RuntimeDescriptor<[], bigint>, - - -/** - * Statement validation with precise reason for invalid statements. - */ -validate_statement_with_reason: RuntimeDescriptor<[source: Anonymize, statement: Anonymize], Anonymize>}, - - -/** - * Runtime api to collect information about a collation. - * - * Version history: - * - Version 2: Changed [`Self::collect_collation_info`] signature - * - Version 3: Signals to the node to use version 1 of [`ParachainBlockData`]. - */ -CollectCollationInfo: { - -/** - * Collect information about a collation. - * - * The given `header` is the header of the built block for that - * we are collecting the collation info for. - */ -collect_collation_info: RuntimeDescriptor<[header: Anonymize], Anonymize>}, - - -/** - * API to interact with `RuntimeGenesisConfig` for the runtime - */ -GenesisBuilder: { - -/** - * Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the - * storage. - * - * In the case of a FRAME-based runtime, this function deserializes the full - * `RuntimeGenesisConfig` from the given JSON blob and puts it into the storage. If the - * provided JSON blob is incorrect or incomplete or the deserialization fails, an error - * is returned. - * - * Please note that provided JSON blob must contain all `RuntimeGenesisConfig` fields, no - * defaults will be used. - */ -build_state: RuntimeDescriptor<[json: Uint8Array], Anonymize>, - - -/** - * Returns a JSON blob representation of the built-in `RuntimeGenesisConfig` identified by - * `id`. - * - * If `id` is `None` the function should return JSON blob representation of the default - * `RuntimeGenesisConfig` struct of the runtime. Implementation must provide default - * `RuntimeGenesisConfig`. - * - * Otherwise function returns a JSON representation of the built-in, named - * `RuntimeGenesisConfig` preset identified by `id`, or `None` if such preset does not - * exist. Returned `Vec` contains bytes of JSON blob (patch) which comprises a list of - * (potentially nested) key-value pairs that are intended for customizing the default - * runtime genesis config. The patch shall be merged (rfc7386) with the JSON representation - * of the default `RuntimeGenesisConfig` to create a comprehensive genesis config that can - * be used in `build_state` method. - */ -get_preset: RuntimeDescriptor<[id: Anonymize], Anonymize>, - - -/** - * Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets. - * - * The presets from the list can be queried with [`GenesisBuilder::get_preset`] method. If - * no named presets are provided by the runtime the list is empty. - */ -preset_names: RuntimeDescriptor<[], Anonymize>}, - - -/** - * Runtime API trait for statement validation. - */ -ValidateStatement: { - -/** - * Validate the statement. - */ -validate_statement: RuntimeDescriptor<[source: Anonymize, statement: Anonymize], Anonymize>}}; -export type People_liteDispatchError = Anonymize -type IAsset = PlainDescriptor> -const asset: IAsset = {} as IAsset -export type People_liteExtensions = { - "VerifyMultiSignature": {value: Anonymize}, -"AsPerson": {value: Anonymize}, -"AsProofOfInkParticipant": {value: Anonymize}, -"ScoreAsParticipant": {value: Anonymize}, -"GameAsInvited": {value: Anonymize}, -"PeopleLiteAuth": {value: Anonymize}, -"AsCoinage": {value: Anonymize}, -"RestrictOrigins": {value: boolean} - } -const extensions = {} as People_liteExtensions -const getMetadata: () => Promise = () => import("./people_lite_metadata.js").then( - module => toBinary('default' in module ? module.default : module) -) -const genesis: string | undefined = "0xd01475fde5d0592989b7715ae1d2e89fdb4f8c7688c09c850d75e1d4bdb47d64" - -type PalletsTypedef = { - __storage: IStorage, - __tx: ICalls, - __event: IEvent, - __error: IError, - __const: IConstants - __view: IViewFns -} - -export type People_lite = { - descriptors: { - pallets: PalletsTypedef, - apis: IRuntimeCalls - } & Promise, - metadataTypes: Promise - asset: IAsset - extensions: People_liteExtensions - getMetadata: () => Promise - genesis: string | undefined -}; -const _allDescriptors = { descriptors: descriptorValues, metadataTypes, asset, extensions, getMetadata, genesis } as any as People_lite; -export default _allDescriptors; - -export type People_liteApis = ApisFromDef -export type People_liteQueries = QueryFromPalletsDef -export type People_liteCalls = TxFromPalletsDef -export type People_liteEvents = EventsFromPalletsDef -export type People_liteErrors = ErrorsFromPalletsDef -export type People_liteConstants = ConstFromPalletsDef -export type People_liteViewFns = ViewFnsFromPalletsDef -export type People_liteCallData = Anonymize & { value: { type: string } }; - -type AllInteractions = {storage: {System: ['Account', 'ExtrinsicCount', 'InherentsApplied', 'BlockWeight', 'AllExtrinsicsLen', 'BlockHash', 'ExtrinsicData', 'Number', 'ParentHash', 'Digest', 'Events', 'EventCount', 'EventTopics', 'LastRuntimeUpgrade', 'UpgradedToU32RefCount', 'UpgradedToTripleRefCount', 'ExecutionPhase', 'AuthorizedUpgrade', 'ExtrinsicWeightReclaimed'], -ParachainSystem: ['UnincludedSegment', 'AggregatedUnincludedSegment', 'PendingValidationCode', 'NewValidationCode', 'ValidationData', 'DidSetValidationCode', 'LastRelayChainBlockNumber', 'UpgradeRestrictionSignal', 'UpgradeGoAhead', 'RelayStateProof', 'RelevantMessagingState', 'HostConfiguration', 'LastDmqMqcHead', 'LastHrmpMqcHeads', 'ProcessedDownwardMessages', 'LastProcessedDownwardMessage', 'HrmpWatermark', 'LastProcessedHrmpMessage', 'HrmpOutboundMessages', 'UpwardMessages', 'PendingUpwardMessages', 'PendingUpwardSignals', 'UpwardDeliveryFeeFactor', 'AnnouncedHrmpMessagesPerCandidate', 'ReservedXcmpWeightOverride', 'ReservedDmpWeightOverride', 'CustomValidationHeadData'], -Timestamp: ['Now', 'DidUpdate'], -ParachainInfo: ['ParachainId'], -Balances: ['TotalIssuance', 'InactiveIssuance', 'Account', 'Locks', 'Reserves', 'Holds', 'Freezes'], -TransactionPayment: ['NextFeeMultiplier', 'StorageVersion', 'TxPaymentCredit'], -OriginRestriction: ['Usages'], -Assets: ['Asset', 'Account', 'Approvals', 'Metadata', 'Reserves', 'NextAssetId'], -AssetsHolder: ['Holds', 'BalancesOnHold'], -AssetRate: ['ConversionRateToNative'], -Authorship: ['Author'], -CollatorSelection: ['Invulnerables', 'CandidateList', 'LastAuthoredBlock', 'DesiredCandidates', 'CandidacyBond'], -Session: ['Validators', 'CurrentIndex', 'QueuedChanged', 'QueuedKeys', 'DisabledValidators', 'NextKeys', 'KeyOwner'], -Aura: ['Authorities', 'CurrentSlot'], -AuraExt: ['Authorities', 'RelaySlotInfo'], -XcmpQueue: ['InboundXcmpSuspended', 'OutboundXcmpStatus', 'OutboundXcmpMessages', 'SignalMessages', 'QueueConfig', 'QueueSuspended', 'DeliveryFeeFactor'], -PolkadotXcm: ['QueryCounter', 'Queries', 'AssetTraps', 'SafeXcmVersion', 'SupportedVersion', 'VersionNotifiers', 'VersionNotifyTargets', 'VersionDiscoveryQueue', 'CurrentMigration', 'RemoteLockedFungibles', 'LockedFungibles', 'XcmExecutionSuspended', 'ShouldRecordXcm', 'RecordedXcm', 'AuthorizedAliases'], -MessageQueue: ['BookStateFor', 'ServiceHead', 'Pages'], -Multisig: ['Multisigs'], -Sudo: ['Key'], -Proxy: ['Proxies', 'Announcements'], -Identity: ['IdentityOf', 'UsernameOf', 'SuperOf', 'SubsOf', 'Registrars', 'AuthorityOf', 'UsernameInfoOf', 'PendingUsernames', 'UnbindingUsernames', 'PersonIdentities', 'AccountToAlias', 'PendingUsernameReports'], -People: ['Keys', 'CounterForKeys', 'People', 'AliasToAccount', 'AccountToAlias', 'AccountToPersonalId', 'NextPersonalId', 'PeopleCollectionCreated', 'ReservedPersonalId'], -MobRule: ['Credits', 'VotingPenalties', 'VotingPoints', 'Votes', 'CaseCount', 'OpenCases', 'RipeCases', 'DoneCases', 'AccumulatedPoints', 'PayoutDistribution', 'RoundSchedules', 'ActiveSince'], -ProofOfInk: ['Candidates', 'People', 'ReferralTickets', 'DesignFamilies', 'CommittedDesigns', 'AllocationCount', 'Configuration', 'AvailableInvites', 'PendingInvites', 'ReferrerReimbursementValues', 'ReferredReimbursementValues'], -Game: ['TestnetStoredPhaseDurations', 'Nfts', 'ArchivedPlayers', 'Players', 'GameIndex', 'Game', 'GameHistory', 'PlayerAttendanceHistory', 'IndexToPlayer', 'PlayerToIndex', 'ShuffleRecognized', 'ShuffleNotRecognized', 'GameSchedules', 'AvailableInvites', 'PendingInvites', 'AliasToStmtAccount', 'StmtAccountToAlias', 'CommunicationIdentifiers'], -Score: ['Participants', 'PersonhoodThreshold', 'AbsenceGraceSchedule', 'AbsenceGraceRatio', 'CurrentRoundPoints', 'CurrentRoundIndex', 'RoundsPointsForParticipant', 'RoundPayouts', 'RoundPlanning', 'RoundSchedules'], -DummyDim: ['ReservedIds', 'People'], -PeopleLite: ['LitePeople', 'AttestationAllowance'], -Resources: ['Consumers', 'StmtStoreAssociatedAccount', 'UsernameOwnerOf', 'AccountOfAlias', 'UsernameReservationDuration', 'UsernameReservationQueue', 'ReservationOf'], -ChunksManager: ['Chunks', 'ChunkPageHashes'], -Members: ['Collections', 'SuspendedCollections', 'IdentifiersOf', 'Root', 'CurrentRingIndex', 'OnboardingSize', 'RingKeys', 'RingKeysStatus', 'PendingSuspensions', 'ActiveMembers', 'Members', 'RingsState', 'StaleRings', 'QueuePageIndices', 'OnboardingQueue', 'DeletionInProgress', 'RingDeletionQueue'], -Coinage: ['CoinsByOwner', 'LockedCoins', 'TotalValueOfDestroyedCoins', 'ConsumedFreeUnloadTokens', 'RecyclerCollectionCreated', 'RecyclersLastRemovedRingIndex', 'RecyclersCoinToRecycler', 'RecyclersUnloaded', 'RecyclersDusting', 'PaidUnloadTokenMembers', 'PaidUnloadTokenConsumed', 'PaidTokenCollectionsCreated', 'PaidUnloadTokenDusting', 'PaidUnloadTokenNextRingToClean', 'InitializePalletAccount'], -StorageInitialization: ['OnPollStatus', 'XcmTransferInitiatedAt'], -StorageInitializationLite: ['OnPollStatus'], -Airdrop: ['EventSchedule', 'EventScheduleFirstStartTime', 'NextEventId', 'ActiveEvents', 'ActiveEventIds', 'ParticipantIdToAliasAndDest', 'ParticipantAliasToId', 'WinnersToDistributeTo', 'WinnersWithFailedTransfer', 'PastAirdrops'], -MultiBlockMigrations: ['Cursor', 'Historic']}, -tx: {System: ['remark', 'set_heap_pages', 'set_code', 'set_code_without_checks', 'set_storage', 'kill_storage', 'kill_prefix', 'remark_with_event', 'authorize_upgrade', 'authorize_upgrade_without_checks', 'apply_authorized_upgrade'], -ParachainSystem: ['set_validation_data', 'sudo_send_upward_message'], -Timestamp: ['set'], -Balances: ['transfer_allow_death', 'force_transfer', 'transfer_keep_alive', 'transfer_all', 'force_unreserve', 'upgrade_accounts', 'force_set_balance', 'force_adjust_total_issuance', 'burn'], -OriginRestriction: ['clean_usage'], -Assets: ['create', 'force_create', 'start_destroy', 'destroy_accounts', 'destroy_approvals', 'finish_destroy', 'mint', 'burn', 'transfer', 'transfer_keep_alive', 'force_transfer', 'freeze', 'thaw', 'freeze_asset', 'thaw_asset', 'transfer_ownership', 'set_team', 'set_metadata', 'clear_metadata', 'force_set_metadata', 'force_clear_metadata', 'force_asset_status', 'approve_transfer', 'cancel_approval', 'force_cancel_approval', 'transfer_approved', 'touch', 'refund', 'set_min_balance', 'touch_other', 'refund_other', 'block', 'transfer_all', 'set_reserves'], -AssetRate: ['create', 'update', 'remove'], -CollatorSelection: ['set_invulnerables', 'set_desired_candidates', 'set_candidacy_bond', 'register_as_candidate', 'leave_intent', 'add_invulnerable', 'remove_invulnerable', 'update_bond', 'take_candidate_slot'], -Session: ['set_keys', 'purge_keys'], -XcmpQueue: ['suspend_xcm_execution', 'resume_xcm_execution', 'update_suspend_threshold', 'update_drop_threshold', 'update_resume_threshold'], -PolkadotXcm: ['send', 'teleport_assets', 'reserve_transfer_assets', 'execute', 'force_xcm_version', 'force_default_xcm_version', 'force_subscribe_version_notify', 'force_unsubscribe_version_notify', 'limited_reserve_transfer_assets', 'limited_teleport_assets', 'force_suspension', 'transfer_assets', 'claim_assets', 'transfer_assets_using_type_and_then', 'add_authorized_alias', 'remove_authorized_alias', 'remove_all_authorized_aliases'], -MessageQueue: ['reap_page', 'execute_overweight'], -Utility: ['batch', 'as_derivative', 'batch_all', 'dispatch_as', 'force_batch', 'with_weight', 'if_else', 'dispatch_as_fallible'], -Multisig: ['as_multi_threshold_1', 'as_multi', 'approve_as_multi', 'cancel_as_multi', 'poke_deposit'], -Sudo: ['sudo', 'sudo_unchecked_weight', 'set_key', 'sudo_as', 'remove_key'], -Proxy: ['proxy', 'add_proxy', 'remove_proxy', 'remove_proxies', 'create_pure', 'kill_pure', 'announce', 'remove_announcement', 'reject_announcement', 'proxy_announced', 'poke_deposit'], -Identity: ['add_registrar', 'set_identity', 'set_subs', 'clear_identity', 'request_judgement', 'cancel_request', 'set_fee', 'set_account_id', 'set_fields', 'provide_judgement', 'kill_identity', 'add_sub', 'rename_sub', 'remove_sub', 'quit_sub', 'add_username_authority', 'remove_username_authority', 'set_username_for', 'accept_username', 'remove_expired_approval', 'set_primary_username', 'unbind_username', 'remove_username', 'kill_username', 'set_personal_identity', 'submit_personal_credential_evidence', 'personal_credential_judged', 'clear_personal_identity', 'report_username', 'reported_username_judged'], -People: ['under_alias', 'set_alias_account', 'unset_alias_account', 'force_recognize_personhood', 'set_personal_id_account', 'unset_personal_id_account', 'create_people_collection'], -MobRule: ['vote', 'close_case', 'clean_vote', 'reap_case', 'intervene', 'claim_vote', 'payout_rewards', 'claim_votes', 'start_payout_round', 'schedule_payout_rounds', 'remove_payout_schedule', 'claim_credit', 'clean_points', 'force_ripen_case', 'touch_case', 'clear_voting_penalty', 'clean_vote_signed'], -ProofOfInk: ['apply', 'submit_evidence', 'judged', 'register_referred', 'register_non_referred', 'reroll', 'commit', 'allocate_full', 'timeout', 'flakeout', 'apply_with_signature', 'apply_with_invitation', 'add_design_family', 'set_referral_ticket', 'cancel_referral_ticket', 'register_successful_referral_reward', 'grant_invites', 'remove_available_and_pending_invites', 'set_invite_ticket', 'cancel_invite_ticket', 'set_configuration', 'set_reimbursement_values'], -Game: ['sign_up_with_invite', 'sign_up_with_account', 'sign_up_with_alias', 'report', 'offboard', 'kickout', 'grant_invites', 'remove_available_and_pending_invites', 'set_invite_ticket', 'cancel_invite_ticket', 'schedule_games', 'remove_scheduled_game', 'testnet_force_start_shuffle', 'testnet_force_end_reporting', 'testnet_set_game_phases', 'testnet_kill_current_game'], -Score: ['schedule_payout_rounds', 'remove_payout_schedule', 'transition_round', 'operate_payout_round', 'cash_out', 'redeem_credit', 'register', 'set_absence_grace_schedule'], -DummyDim: ['reserve_ids', 'renew_id_reservation', 'cancel_id_reservation', 'recognize_personhood', 'suspend_personhood', 'resume_personhood', 'start_mutation_session', 'end_mutation_session'], -PeopleLite: ['increase_attestation_allowance', 'clear_attestation_allowance', 'attest', 'dispatch_as_signer'], -Resources: ['register_lite_person', 'register_person', 'touch_person_authorization', 'remove_expired_username_reservation', 'update_identifier_key', 'set_username_reservation_duration', 'set_stmt_store_associated_account_id_at_slot', 'demote_auth_expired'], -ChunksManager: ['add_chunks', 'set_chunk_page_hashes'], -Members: ['build_ring_manual', 'onboard_members_manual', 'merge_rings', 'set_onboarding_size'], -Coinage: ['split', 'transfer', 'load_recycler_with_coin', 'load_recycler_with_external_asset', 'unload_recycler_into_coin', 'unload_recycler_into_external_asset', 'pay_for_recycler_unload_fee_token_with_coin', 'pay_for_recycler_unload_fee_token_with_native', 'pay_for_recycler_unload_fee_token_with_stable', 'unload_recyclers_into_coin_unstable', 'unload_recyclers_into_external_asset_unstable', 'unload_recycler_into_external_asset_non_anonymous', 'unload_recyclers_into_external_asset_non_anonymous', 'unload_recycler_into_coins', 'direct_offboard_coin_into_external_asset', 'clean_recycler', 'clean_consumed_free_token', 'clean_paid_unload_token_ring', 'clean_recycler_dust', 'clean_paid_unload_token_dust', 'delete_expired_paid_unload_token_collection'], -Airdrop: ['schedule_event', 'remove_scheduled_event', 'register_for_event', 'claim_failed_transfer_prize'], -MultiBlockMigrations: ['force_set_cursor', 'force_set_active_cursor', 'force_onboard_mbms', 'clear_historic']}, -events: {System: ['ExtrinsicSuccess', 'ExtrinsicFailed', 'CodeUpdated', 'NewAccount', 'KilledAccount', 'Remarked', 'UpgradeAuthorized', 'RejectedInvalidAuthorizedUpgrade'], -ParachainSystem: ['ValidationFunctionStored', 'ValidationFunctionApplied', 'ValidationFunctionDiscarded', 'DownwardMessagesReceived', 'DownwardMessagesProcessed', 'UpwardMessageSent'], -Balances: ['Endowed', 'DustLost', 'Transfer', 'BalanceSet', 'Reserved', 'Unreserved', 'ReserveRepatriated', 'Deposit', 'Withdraw', 'Slashed', 'Minted', 'MintedCredit', 'Burned', 'BurnedDebt', 'Suspended', 'Restored', 'Upgraded', 'Issued', 'Rescinded', 'Locked', 'Unlocked', 'Frozen', 'Thawed', 'TotalIssuanceForced', 'Held', 'BurnedHeld', 'TransferOnHold', 'TransferAndHold', 'Released', 'Unexpected'], -TransactionPayment: ['TransactionFeePaid'], -SkipFeelessPayment: ['FeeSkipped'], -OriginRestriction: ['UsageCleaned'], -Assets: ['Created', 'Issued', 'Transferred', 'Burned', 'TeamChanged', 'OwnerChanged', 'Frozen', 'Thawed', 'AssetFrozen', 'AssetThawed', 'AccountsDestroyed', 'ApprovalsDestroyed', 'DestructionStarted', 'Destroyed', 'ForceCreated', 'MetadataSet', 'MetadataCleared', 'ApprovedTransfer', 'ApprovalCancelled', 'TransferredApproved', 'AssetStatusChanged', 'AssetMinBalanceChanged', 'Touched', 'Blocked', 'Deposited', 'Withdrawn', 'ReservesUpdated', 'ReservesRemoved'], -AssetsHolder: ['Held', 'Released', 'Burned'], -AssetRate: ['AssetRateCreated', 'AssetRateRemoved', 'AssetRateUpdated'], -AssetTxPayment: ['AssetTxFeePaid'], -CollatorSelection: ['NewInvulnerables', 'InvulnerableAdded', 'InvulnerableRemoved', 'NewDesiredCandidates', 'NewCandidacyBond', 'CandidateAdded', 'CandidateBondUpdated', 'CandidateRemoved', 'CandidateReplaced', 'InvalidInvulnerableSkipped'], -Session: ['NewSession', 'NewQueued', 'ValidatorDisabled', 'ValidatorReenabled'], -XcmpQueue: ['XcmpMessageSent'], -PolkadotXcm: ['Attempted', 'Sent', 'SendFailed', 'ProcessXcmError', 'UnexpectedResponse', 'ResponseReady', 'Notified', 'NotifyOverweight', 'NotifyDispatchError', 'NotifyDecodeFailed', 'InvalidResponder', 'InvalidResponderVersion', 'ResponseTaken', 'AssetsTrapped', 'VersionChangeNotified', 'SupportedVersionChanged', 'NotifyTargetSendFail', 'NotifyTargetMigrationFail', 'InvalidQuerierVersion', 'InvalidQuerier', 'VersionNotifyStarted', 'VersionNotifyRequested', 'VersionNotifyUnrequested', 'FeesPaid', 'AssetsClaimed', 'VersionMigrationFinished', 'AliasAuthorized', 'AliasAuthorizationRemoved', 'AliasesAuthorizationsRemoved'], -CumulusXcm: ['InvalidFormat', 'UnsupportedVersion', 'ExecutedDownward'], -MessageQueue: ['ProcessingFailed', 'Processed', 'OverweightEnqueued', 'PageReaped'], -Utility: ['BatchInterrupted', 'BatchCompleted', 'BatchCompletedWithErrors', 'ItemCompleted', 'ItemFailed', 'DispatchedAs', 'IfElseMainSuccess', 'IfElseFallbackCalled'], -Multisig: ['NewMultisig', 'MultisigApproval', 'MultisigExecuted', 'MultisigCancelled', 'DepositPoked'], -Sudo: ['Sudid', 'KeyChanged', 'KeyRemoved', 'SudoAsDone'], -Proxy: ['ProxyExecuted', 'PureCreated', 'PureKilled', 'Announced', 'ProxyAdded', 'ProxyRemoved', 'DepositPoked'], -Identity: ['IdentitySet', 'IdentityCleared', 'IdentityKilled', 'JudgementRequested', 'JudgementUnrequested', 'JudgementGiven', 'RegistrarAdded', 'SubIdentityAdded', 'SubIdentitiesSet', 'SubIdentityRenamed', 'SubIdentityRemoved', 'SubIdentityRevoked', 'AuthorityAdded', 'AuthorityRemoved', 'UsernameSet', 'UsernameQueued', 'PreapprovalExpired', 'PrimaryUsernameSet', 'DanglingUsernameRemoved', 'UsernameUnbound', 'UsernameRemoved', 'UsernameKilled', 'UsernameReported', 'PersonalIdentitySet', 'EvidenceSubmitted', 'CredentialAccepted', 'CredentialRejected', 'PersonBanned', 'PersonalIdentityCleared', 'ReportedUsernameJudgedValid', 'ReportedUsernameJudgedInvalid', 'ReportedUsernameWeakOrUnclearJudgement'], -People: ['PersonhoodRecognized', 'PersonOnboarding', 'AliasDispatched', 'AliasAccountSet', 'AliasAccountUnset', 'PersonalIdAccountSet', 'PersonalIdAccountUnset', 'CollectionCreated', 'ForcePersonhoodRecognized'], -MobRule: ['CaseCreated', 'Callback', 'CallbackError', 'CaseClosed', 'Voted', 'VoteCleaned', 'CaseRemoved', 'CaseIntervened', 'VotesClaimed', 'RewardPayout', 'PayoutRoundStarted', 'PayoutRoundsScheduled', 'PayoutScheduleRemoved', 'CreditClaimed', 'PointsCleaned', 'CaseTouched', 'VotingPenaltyCleared'], -ProofOfInk: ['CandidateApplied', 'JudgementRequested', 'JudgementProvided', 'RetryGranted', 'PersonRegistered', 'CandidateReferred', 'Rerolled', 'DesignCommitted', 'FullyAllocated', 'TimedOut', 'FlakedOut', 'TicketReferred', 'TicketCancelled', 'TicketApplied', 'FamilyAdded', 'AllInvitesRemoved', 'SomeInvitesRemoved', 'InvitedCandidateApplied', 'ReferralVoucherRegistered', 'InvitesGranted', 'InviteTicketSet', 'InviteTicketCancelled', 'ConfigurationSet'], -Game: ['NewGame', 'GameEnded', 'SignedUp', 'ReportSubmitted', 'Offboarded', 'KickedOut', 'InvitesGranted', 'InviteTicketSet', 'InviteTicketCancelled', 'GamesScheduled', 'ScheduledGameRemoved', 'StmtUsageRemoved', 'AllInvitesRemoved', 'SomeInvitesRemoved'], -Score: ['CreditClaimed', 'PersonhoodRecognized', 'PayoutRoundsScheduled', 'PayoutScheduleRemoved', 'RoundTransitioned', 'PayoutRoundOperated', 'CashedOut'], -DummyDim: ['IdsReserved', 'IdRenewed', 'IdUnreserved', 'PeopleRegistered', 'PeopleSuspended', 'PersonhoodResumed', 'SuspensionsStarted', 'SuspensionsEnded'], -PeopleLite: ['AllAttestationAllowanceCleared', 'AttestationAllowanceIncreased', 'PersonAttested', 'ConsumerRegistered'], -Resources: ['PersonRegistered', 'LitePersonRegistered', 'PersonAuthorizationTouched', 'ExpiredUsernameReservationRemoved', 'IdentifierKeyUpdated', 'UsernameReservationDurationSet', 'StmtStoreSlotUpdated', 'PersonDemoted'], -ChunksManager: ['ChunkPageHashesInitialized', 'ChunksAdded'], -Members: ['MemberAdded', 'MemberRemoved', 'CollectionMarkedForDeletion', 'CollectionDeleted', 'RingBuilt', 'MembersOnboarded', 'RingsMerged', 'OnboardingSizeSet'], -Coinage: ['CoinSplit', 'CoinTransferred', 'RecyclerLoadedWithCoin', 'RecyclerLoadedWithExternalAsset', 'RecyclerUnloadedIntoCoin', 'RecyclerUnloadedIntoExternalAsset', 'PaidUnloadTokenRegisteredWithCoin', 'PaidUnloadTokenRegisteredWithNative', 'PaidUnloadTokenRegisteredWithStable', 'PeopleFreeUnloadTokenConsumed', 'LitePeopleFreeUnloadTokenConsumed', 'RecyclersUnloadedIntoCoin', 'RecyclersUnloadedIntoExternalAsset', 'RecyclersUnloadedIntoExternalAssetNonAnonymous', 'RecyclerUnloadedIntoCoins', 'CoinOffboardedIntoExternalAsset', 'RecyclerCleaned', 'ConsumedFreeTokensCleaned', 'PaidUnloadTokenRingCleaned', 'RecyclerDustCleaned', 'PaidUnloadTokenDustCleaned', 'ExpiredPaidUnloadTokenCollectionDeleted'], -StorageInitialization: ['AssetCreated', 'XcmFundsTransferSent', 'XcmFundsTransferTimedOut', 'FundsVerified', 'PotsFunded', 'MobRulePayoutsScheduled', 'ScorePayoutsScheduled', 'OnPollInitializationCompleted', 'MigrationPeopleRecognized', 'MigrationOnboardingSizeSet', 'MigrationProofOfInkInitialized', 'MigrationGamesScheduled', 'MigrationInvitesGranted', 'MigrationReimbursementValuesSet', 'MigrationAttestationAllowancesSet', 'MigrationCompleted'], -StorageInitializationLite: ['InitializationCompleted'], -Airdrop: ['ParticipantRegistered', 'EventStarted', 'EventSkipped', 'EventScheduled', 'ScheduledEventRemoved', 'FailedTransferPrizeClaimed', 'WaitingForEntropyToBuild', 'DrawingWinners', 'Distributing', 'PrizeDistributed', 'PrizeDistributionFailed', 'ClearingStorage', 'EventCompleted'], -MultiBlockMigrations: ['UpgradeStarted', 'UpgradeCompleted', 'UpgradeFailed', 'MigrationSkipped', 'MigrationAdvanced', 'MigrationCompleted', 'MigrationFailed', 'HistoricCleared']}, -errors: {System: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered', 'MultiBlockMigrationsOngoing', 'NothingAuthorized', 'Unauthorized'], -ParachainSystem: ['OverlappingUpgrades', 'ProhibitedByPolkadot', 'TooBig', 'ValidationDataNotAvailable', 'HostConfigurationNotAvailable', 'NotScheduled'], -Balances: ['VestingBalance', 'LiquidityRestrictions', 'InsufficientBalance', 'ExistentialDeposit', 'Expendability', 'ExistingVestingSchedule', 'DeadAccount', 'TooManyReserves', 'TooManyHolds', 'TooManyFreezes', 'IssuanceDeactivated', 'DeltaZero'], -OriginRestriction: ['NoUsage', 'NotZero'], -Assets: ['BalanceLow', 'NoAccount', 'NoPermission', 'Unknown', 'Frozen', 'InUse', 'BadWitness', 'MinBalanceZero', 'UnavailableConsumer', 'BadMetadata', 'Unapproved', 'WouldDie', 'AlreadyExists', 'NoDeposit', 'WouldBurn', 'LiveAsset', 'AssetNotLive', 'IncorrectStatus', 'NotFrozen', 'CallbackFailed', 'BadAssetId', 'ContainsFreezes', 'ContainsHolds', 'TooManyReserves'], -AssetsHolder: ['TooManyHolds'], -AssetRate: ['UnknownAssetKind', 'AlreadyExists', 'Overflow'], -CollatorSelection: ['TooManyCandidates', 'TooFewEligibleCollators', 'AlreadyCandidate', 'NotCandidate', 'TooManyInvulnerables', 'AlreadyInvulnerable', 'NotInvulnerable', 'NoAssociatedValidatorId', 'ValidatorNotRegistered', 'InsertToCandidateListFailed', 'RemoveFromCandidateListFailed', 'DepositTooLow', 'UpdateCandidateListFailed', 'InsufficientBond', 'TargetIsNotCandidate', 'IdenticalDeposit', 'InvalidUnreserve'], -Session: ['InvalidProof', 'NoAssociatedValidatorId', 'DuplicatedKey', 'NoKeys', 'NoAccount'], -XcmpQueue: ['BadQueueConfig', 'AlreadySuspended', 'AlreadyResumed', 'TooManyActiveOutboundChannels', 'TooBig'], -PolkadotXcm: ['Unreachable', 'SendFailure', 'Filtered', 'UnweighableMessage', 'DestinationNotInvertible', 'Empty', 'CannotReanchor', 'TooManyAssets', 'InvalidOrigin', 'BadVersion', 'BadLocation', 'NoSubscription', 'AlreadySubscribed', 'CannotCheckOutTeleport', 'LowBalance', 'TooManyLocks', 'AccountNotSovereign', 'FeesNotMet', 'LockNotFound', 'InUse', 'InvalidAssetUnknownReserve', 'InvalidAssetUnsupportedReserve', 'TooManyReserves', 'LocalExecutionIncomplete', 'TooManyAuthorizedAliases', 'ExpiresInPast', 'AliasNotFound', 'LocalExecutionIncompleteWithError'], -MessageQueue: ['NotReapable', 'NoPage', 'NoMessage', 'AlreadyProcessed', 'Queued', 'InsufficientWeight', 'TemporarilyUnprocessable', 'QueuePaused', 'RecursiveDisallowed'], -Utility: ['TooManyCalls'], -Multisig: ['MinimumThreshold', 'AlreadyApproved', 'NoApprovalsNeeded', 'TooFewSignatories', 'TooManySignatories', 'SignatoriesOutOfOrder', 'SenderInSignatories', 'NotFound', 'NotOwner', 'NoTimepoint', 'WrongTimepoint', 'UnexpectedTimepoint', 'MaxWeightTooLow', 'AlreadyStored'], -Sudo: ['RequireSudo'], -Proxy: ['TooMany', 'NotFound', 'NotProxy', 'Unproxyable', 'Duplicate', 'NoPermission', 'Unannounced', 'NoSelfProxy'], -Identity: ['TooManySubAccounts', 'NoAlias', 'NotFound', 'NotNamed', 'EmptyIndex', 'FeeChanged', 'NoIdentity', 'StickyJudgement', 'JudgementGiven', 'InvalidJudgement', 'InvalidIndex', 'InvalidTarget', 'TooManyRegistrars', 'AlreadyClaimed', 'AlreadyReported', 'NotSub', 'NotOwned', 'JudgementForDifferentIdentity', 'JudgementPaymentFailed', 'InvalidSuffix', 'NotUsernameAuthority', 'NoAllocation', 'InvalidSignature', 'RequiresSignature', 'InvalidUsername', 'UsernameTaken', 'NoUsername', 'NotSystemProvidedUsername', 'NotExpired', 'TooEarly', 'NotUnbinding', 'AlreadyUnbinding', 'InsufficientPrivileges', 'BadContext', 'UnexpectedJudgement', 'NotSupported', 'Banned', 'AlreadyRegistered', 'JudgementListFull', 'LastUsernameReportTooRecent', 'UsernameJudgementOngoing'], -People: ['NotPerson', 'NoKey', 'InvalidContext', 'InvalidAccount', 'AccountInUse', 'InvalidProof', 'InvalidSignature', 'NoMembers', 'Incomplete', 'StillFresh', 'TooManyMembers', 'KeyAlreadyInUse', 'KeyNotFound', 'CouldNotPush', 'SameKey', 'PersonalIdNotReserved', 'PersonalIdReservationCannotRenew', 'PersonalIdNotReservedOrNotRecognized', 'InvalidRing', 'SuspensionsPending', 'RingAboveMergeThreshold', 'InvalidSuspensions', 'NoMutationSession', 'CouldNotStartMutationSession', 'SuspensionSessionInProgress', 'TimeOutOfRange', 'AliasAccountAlreadySet', 'NotSuspended', 'Suspended', 'InvalidKeyMigration', 'KeyAlreadySuspended', 'InvalidOnboardingSize', 'InvalidMemberKey', 'PeopleCollectionAlreadyExists'], -MobRule: ['NoSuchCase', 'NoSuchVote', 'NotOpen', 'NotRipe', 'NotDone', 'CodecError', 'DispatchError', 'Recent', 'NoCredit', 'NoReward', 'NoPoints', 'TooManyClaims', 'NoPayout', 'ArithmeticOverflow', 'TooManySchedules', 'NoSchedule', 'NoPenalty', 'Early', 'UnderPenalty', 'CaseExpirationDisabled'], -ProofOfInk: ['InProgress', 'NoReferral', 'BadContext', 'UnexpectedJudgement', 'NoArgs', 'NotApplied', 'NotSelected', 'NotProven', 'AlreadyStarted', 'OutOfRange', 'AlreadyTaken', 'NoMoreReferrals', 'TooEarly', 'DesignInvalid', 'DesignTaken', 'BadParent', 'BadFamily', 'WrongFamily', 'IndexTooBig', 'Busy', 'Banned', 'Improbable', 'IdReserved', 'IdUsed', 'InvalidTicket', 'NoTicket', 'NotAuthorized', 'NotPerson', 'ReferredCandidate', 'NotReferredCandidate', 'NoRewardToRegister', 'RewardToRegister', 'NoInviter', 'InvalidSignature', 'NoInvites', 'AlreadyInvited', 'NoReferrer', 'NotPoiPerson', 'InvalidProofOfOwnership', 'InvalidReimbursementValues'], -Game: ['GameOngoing', 'NoRegistration', 'OutdatedGameSetup', 'InvalidGameSetup', 'InvalidReport', 'NoGame', 'NoReporting', 'NotRegistered', 'AlreadyRegistered', 'ReportAlreadySent', 'Early', 'NotKickablePlayer', 'NoArchivedPlayer', 'NoTicket', 'NoInvites', 'AlreadyInvited', 'NotAccountPlayer', 'UseInviteButAlreadyPlaying', 'TooManyGameSchedules', 'NoSuchGameScheduled', 'InvalidStatementAccountSignature', 'StatementAccountAlreadyInUse', 'InternalErrorInvalidState', 'InvalidGameState', 'NoPlayer', 'CannotOffboardWhileRegisteredForGame', 'InvalidState'], -Score: ['NotPerson', 'HasNotReachedPersonhood', 'NoReward', 'NoScore', 'NoSchedule', 'TooManySchedules', 'Recognized', 'CashOutCooldown', 'RoundOnGoingOrNoSchedule', 'NoRound', 'BadOriginNotPersonNotSigned', 'BadOriginNotPersonNotSignedNotAccountParticipant', 'BadOriginNotSignedNotAccountParticipant', 'AlreadyParticipating', 'KeyMustBeProvided', 'KeyMustNotBeProvided', 'HasReachedPersonhood', 'InvalidProofOfOwnership', 'WindowTooLarge', 'AllowedMissesTooLarge', 'ScheduleNotSorted'], -DummyDim: ['NotPerson', 'NotSuspended', 'NotReserved', 'TooManyPeople'], -PeopleLite: ['NoAttestationAllowance', 'InvalidAttestationSignature', 'InvalidProofOfOwnership', 'AlreadyRegistered'], -Resources: ['InvalidUsername', 'UsernameTaken', 'AlreadyRegistered', 'InvalidProofOfOwnership', 'NotRegistered', 'NotFullPerson', 'TouchNotReady', 'NoReservation', 'NotReservationHolder', 'UsernameReservationTaken', 'ReservationFresh', 'NoLinkedIdentity', 'AlreadyLinked', 'InvalidSlot', 'AccountAlreadyHasAllowance', 'PersonAuthNotExpired', 'AlreadyDemoted', 'QueueFull', 'NotInQueue', 'AlreadyHasReservation'], -ChunksManager: ['ChunkNotFound', 'InvalidChunks', 'InvalidChunkRange'], -Members: ['NotMember', 'NoRoot', 'InvalidProof', 'Incomplete', 'StillFresh', 'TooManyMembers', 'KeyAlreadyInUse', 'KeyNotFound', 'CouldNotPush', 'InvalidRing', 'SuspensionsPending', 'RingAboveMergeThreshold', 'InvalidSuspensions', 'NoRemovalSession', 'CouldNotStartRemovalSession', 'RemovalSessionInProgress', 'KeyAlreadySuspended', 'InvalidOnboardingSize', 'InvalidMemberKey', 'CollectionNotFound', 'CollectionAlreadyExists', 'TooManyCollections', 'InvalidRingSizeForFlexible', 'InvalidRingExponent', 'PrematureOnboarding', 'CollectionMarkedForDeletion', 'NotCollectionOwner'], -Coinage: ['MemberKeyAlreadyUsed', 'InvalidMemberKey', 'InternalError', 'RecyclerAlreadyUnloaded', 'InvalidConsolidation', 'ConsolidationTooBig', 'CoinValueTooBig', 'CoinValueTooSmall', 'CoinValueIsLessThanFee', 'CoinValueOutOfBound', 'InvalidAliasProof', 'NoUnloadingRecycler', 'ProofAndAliasMismatch', 'NothingToBuild', 'TooManyRings', 'AddressAlreadyHasCoin', 'InvalidProofOfOwnership', 'EmptyInputs', 'RecyclerMismatch', 'InsufficientUnloadForFee', 'AliasNotPremarked', 'InvalidRecyclerRevision', 'InvalidSplit', 'FreshCoinRequired', 'CannotConvertNativeToAsset'], -Airdrop: ['NoActiveEvent', 'NotAPerson', 'AliasAlreadyRegistered', 'InvalidEventRegistrationTime', 'ParticipantIdOverflow', 'NoPrizeToClaimForEvent', 'NoEventFound', 'ScheduleFull', 'PrizeMustBeMoreOrEqualToMinBalance'], -MultiBlockMigrations: ['Ongoing']}, -constants: {System: ['BlockWeights', 'BlockLength', 'BlockHashCount', 'DbWeight', 'Version', 'SS58Prefix'], -ParachainSystem: ['SelfParaId'], -Timestamp: ['MinimumPeriod'], -Balances: ['ExistentialDeposit', 'MaxLocks', 'MaxReserves', 'MaxFreezes'], -TransactionPayment: ['OperationalFeeMultiplier'], -Assets: ['RemoveItemsLimit', 'AssetDeposit', 'AssetAccountDeposit', 'MetadataDepositBase', 'MetadataDepositPerByte', 'ApprovalDeposit', 'StringLimit'], -CollatorSelection: ['PotId', 'MaxCandidates', 'MinEligibleCollators', 'MaxInvulnerables', 'KickThreshold', 'pot_account'], -Session: ['KeyDeposit'], -Aura: ['SlotDuration'], -XcmpQueue: ['MaxInboundSuspended', 'MaxActiveOutboundChannels', 'MaxPageSize'], -PolkadotXcm: ['UniversalLocation', 'AdvertisedXcmVersion', 'MaxLockers', 'MaxRemoteLockConsumers'], -MessageQueue: ['HeapSize', 'MaxStale', 'ServiceWeight', 'IdleMaxServiceWeight'], -Utility: ['batched_calls_limit'], -Multisig: ['DepositBase', 'DepositFactor', 'MaxSignatories'], -Proxy: ['ProxyDepositBase', 'ProxyDepositFactor', 'MaxProxies', 'MaxPending', 'AnnouncementDepositBase', 'AnnouncementDepositFactor'], -Identity: ['BasicDeposit', 'ByteDeposit', 'UsernameDeposit', 'SubAccountDeposit', 'UsernameReportDeposit', 'MaxSubAccounts', 'UsernameReportTimeout', 'MaxRegistrars', 'MaxJudgements', 'PendingUsernameExpiration', 'UsernameGracePeriod', 'MaxSuffixLength', 'MaxUsernameLength', 'MinUsernameLength', 'CredentialRemovalPenalty', 'identity_context'], -People: ['RingExponent', 'OnboardingQueuePageSize', 'account_setup_time_tolerance'], -MobRule: ['CurrencyLocationInfo', 'MaxVoteClaimDuration', 'MinCaseDuration', 'MaxVotingDuration', 'MinTurnoutNominal', 'MinTurnoutPercentage', 'VotingPenaltyDuration', 'MaxVotesClaimable', 'OffchainWorkInterval', 'CleanVotesBatchSize', 'VotesOpenForClaimsDuration', 'MinimumVoterThreshold', 'mob_rule_pot_id', 'mob_rule_context'], -ProofOfInk: ['MaxActiveReferrals', 'PotId', 'proof_of_ink_pot_id'], -Game: ['MaxRounds', 'MaxGroupSize', 'MinGroupSize', 'NonPlayingKickoutTime', 'PhaseDurations', 'MaxGameSchedules', 'MaxAttendanceHistoryDepth', 'proof_of_ownership_msg_base'], -Score: ['CurrencyLocationInfo', 'OffchainWorkInterval', 'score_pot_id', 'score_context', 'ubi_points'], -Resources: ['MaxUsernameLength', 'MinUsernameLength', 'PersonAuthDuration', 'MinPersonAuthUpdateInterval', 'MaxReservationQueueLength', 'AccountsApiSlotCount', 'AccountsApiRefundCooldown', 'AccountsApiAllowance'], -ChunksManager: ['PageSize'], -Members: ['MaxCollections', 'OnboardingQueuePageSize', 'MaxFlexibleRingExponent', 'RingBuildingMemberLimit'], -Coinage: ['RecyclerRingExponent', 'PaidUnloadTokenRingExponent', 'UnderlyingAssetId', 'UnderlyingAssetUnit', 'MinimumExponent', 'MaximumExponent', 'MaxSplitOutputs', 'MaxConsolidation', 'UnloadTokenTimePeriodPeopleLitePeople', 'UnloadTokenAllowancePerTimePeriodForPeople', 'UnloadTokenAllowancePerTimePeriodForLitePeople', 'MaxFreeUnloadTokensPerTimePeriod', 'OffchainWorkerInterval', 'CoinFailureLockPeriod', 'pallet_account'], -Airdrop: ['airdrop_pot_id', 'airdrop_context_base'], -MultiBlockMigrations: ['CursorMaxLen', 'IdentifierMaxLen']}, -viewFns: {Assets: ['asset_details', 'balance_of', 'get_metadata', 'get_reserves_data'], -Proxy: ['check_permissions', 'is_superset'], -Coinage: ['get_free_unload_token_info', 'get_recycler_ring_status', 'get_recycler_ring_revision', 'get_paid_token_ring_status', 'get_paid_token_ring_revision', 'get_paid_unload_token_fee_in_asset', 'get_paid_unload_token_fee_in_native', 'get_coin_by_owner', 'get_coin_lock_until', 'get_recycler_member_info', 'is_paid_token_member', 'get_recycler_members', 'get_paid_token_ring_members', 'is_recycler_alias_unloaded', 'is_paid_token_alias_consumed', 'is_free_token_alias_consumed']}, -apis: {AuraApi: ['slot_duration', 'authorities'], -RelayParentOffsetApi: ['relay_parent_offset'], -AuraUnincludedSegmentApi: ['can_build_upon'], -Core: ['version', 'execute_block', 'initialize_block'], -Metadata: ['metadata', 'metadata_at_version', 'metadata_versions'], -RuntimeViewFunction: ['execute_view_function'], -BlockBuilder: ['apply_extrinsic', 'finalize_block', 'inherent_extrinsics', 'check_inherents'], -TaggedTransactionQueue: ['validate_transaction'], -OffchainWorkerApi: ['offchain_worker'], -SessionKeys: ['generate_session_keys', 'decode_session_keys'], -AccountNonceApi: ['account_nonce'], -TransactionPaymentApi: ['query_info', 'query_fee_details', 'query_weight_to_fee', 'query_length_to_fee'], -TransactionPaymentCallApi: ['query_call_info', 'query_call_fee_details', 'query_weight_to_fee', 'query_length_to_fee'], -XcmPaymentApi: ['query_acceptable_payment_assets', 'query_xcm_weight', 'query_weight_to_asset_fee', 'query_delivery_fees'], -LocationToAccountApi: ['convert_location'], -MobRuleApi: ['voted_on'], -ProofOfInkApi: ['candidacy_deposit'], -PalletGameApi: ['play_deposit', 'validate_statement_with_reason'], -CollectCollationInfo: ['collect_collation_info'], -GenesisBuilder: ['build_state', 'get_preset', 'preset_names'], -ValidateStatement: ['validate_statement']}}; - -export type People_liteWhitelistEntry = - | PalletKey - | `query.${NestedKey}` - | `tx.${NestedKey}` - | `event.${NestedKey}` - | `error.${NestedKey}` - | `const.${NestedKey}` - | `view.${NestedKey}` - | `api.${NestedKey}` - -type PalletKey = `*.${({ - [K in keyof AllInteractions]: K extends 'apis' ? never : keyof AllInteractions[K] -})[keyof AllInteractions]}` -type NestedKey> = - | "*" - | { - [P in keyof D & string]: - | `${P}.*` - | `${P}.${D[P][number]}` - }[keyof D & string] diff --git a/packages/host-papp/.papi/descriptors/src/people_lite_metadata.ts b/packages/host-papp/.papi/descriptors/src/people_lite_metadata.ts deleted file mode 100644 index 47321fdd..00000000 --- a/packages/host-papp/.papi/descriptors/src/people_lite_metadata.ts +++ /dev/null @@ -1 +0,0 @@ -const binMeta: string = "bWV0YRClDAAMKHNwX3J1bnRpbWUwbXVsdGlhZGRyZXNzME11bHRpQWRkcmVzcwgkQWNjb3VudElkAQQwQWNjb3VudEluZGV4ARABFAhJZAQABAEkQWNjb3VudElkAAAAFEluZGV4BAAUATBBY2NvdW50SW5kZXgAAQAMUmF3BAAYARxWZWM8dTg+AAIAJEFkZHJlc3MzMgQACAEgW3U4OyAzMl0AAwAkQWRkcmVzczIwBAAcASBbdTg7IDIwXQAEAAAEDBxzcF9jb3JlGGNyeXB0byxBY2NvdW50SWQzMgAABAAIASBbdTg7IDMyXQAACAAAAyAAAAAMAAwAAAUDABAAAAQAABQAAAYQABgAAAIMABwAAAMUAAAADAAgCGRuZXh0X3Blb3BsZV9wYXNlb19ydW50aW1lLFJ1bnRpbWVDYWxsAAGAGFN5c3RlbQQAJAGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAPFBhcmFjaGFpblN5c3RlbQQAQAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhY2hhaW5TeXN0ZW0sIFJ1bnRpbWU+AAEAJFRpbWVzdGFtcAQAsAG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUaW1lc3RhbXAsIFJ1bnRpbWU+AAIANFBhcmFjaGFpbkluZm8EALgByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYWNoYWluSW5mbywgUnVudGltZT4AAwAgQmFsYW5jZXMEALwBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAoARE9yaWdpblJlc3RyaWN0aW9uBADUAdkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE9yaWdpblJlc3RyaWN0aW9uLCBSdW50aW1lPgANABhBc3NldHMEANwBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRzLCBSdW50aW1lPgAOACRBc3NldFJhdGUEACkBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AEABEQ29sbGF0b3JTZWxlY3Rpb24EADEBAdkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbGxhdG9yU2VsZWN0aW9uLCBSdW50aW1lPgAVABxTZXNzaW9uBAA1AQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTZXNzaW9uLCBSdW50aW1lPgAWACRYY21wUXVldWUEAEEBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbXBRdWV1ZSwgUnVudGltZT4AHgAsUG9sa2Fkb3RYY20EAEUBAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBvbGthZG90WGNtLCBSdW50aW1lPgAfAChDdW11bHVzWGNtBAAZAwG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDdW11bHVzWGNtLCBSdW50aW1lPgAgADBNZXNzYWdlUXVldWUEAB0DAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1lc3NhZ2VRdWV1ZSwgUnVudGltZT4AIgAcVXRpbGl0eQQAJQMBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AKAAgTXVsdGlzaWcEAIEDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE11bHRpc2lnLCBSdW50aW1lPgApABBTdWRvBACNAwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgAqABRQcm94eQQAkQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+ACwAIElkZW50aXR5BACdAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eSwgUnVudGltZT4AMgAYUGVvcGxlBABJBAGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQZW9wbGUsIFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAFUEAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1vYlJ1bGUsIFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEAF0EAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb29mT2ZJbmssIFJ1bnRpbWU+ADUAEEdhbWUEAH0EAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdhbWUsIFJ1bnRpbWU+ADcAFFNjb3JlBAChBAGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTY29yZSwgUnVudGltZT4AOAAgRHVtbXlEaW0EALkEAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPER1bW15RGltLCBSdW50aW1lPgA7AChQZW9wbGVMaXRlBADRBAG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQZW9wbGVMaXRlLCBSdW50aW1lPgA+ACRSZXNvdXJjZXMEAOEEAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlc291cmNlcywgUnVudGltZT4APwA0Q2h1bmtzTWFuYWdlcgQA7QQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2h1bmtzTWFuYWdlciwgUnVudGltZT4AQAAcTWVtYmVycwQA+QQBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVtYmVycywgUnVudGltZT4AQwAcQ29pbmFnZQQA/QQBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29pbmFnZSwgUnVudGltZT4ARAAcQWlyZHJvcAQAGQUBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QWlyZHJvcCwgUnVudGltZT4APQBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEACUFAeUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE11bHRpQmxvY2tNaWdyYXRpb25zLCBSdW50aW1lPgBiAAAkDDBmcmFtZV9zeXN0ZW0YcGFsbGV0EENhbGwEBFQAASwYcmVtYXJrBAEYcmVtYXJrGAEcVmVjPHU4PgAADGhNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrLgCIQ2FuIGJlIGV4ZWN1dGVkIGJ5IGV2ZXJ5IGBvcmlnaW5gLjhzZXRfaGVhcF9wYWdlcwQBFHBhZ2VzKAEMdTY0AAEE+FNldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBXZWJBc3NlbWJseSBlbnZpcm9ubWVudCdzIGhlYXAuIHNldF9jb2RlBAEQY29kZRgBHFZlYzx1OD4AAgRkU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlLlxzZXRfY29kZV93aXRob3V0X2NoZWNrcwQBEGNvZGUYARxWZWM8dTg+AAMQGQFTZXQgdGhlIG5ldyBydW50aW1lIGNvZGUgd2l0aG91dCBkb2luZyBhbnkgY2hlY2tzIG9mIHRoZSBnaXZlbiBgY29kZWAuAFEBTm90ZSB0aGF0IHJ1bnRpbWUgdXBncmFkZXMgd2lsbCBub3QgcnVuIGlmIHRoaXMgaXMgY2FsbGVkIHdpdGggYSBub3QtaW5jcmVhc2luZyBzcGVjIHZlcnNpb24hLHNldF9zdG9yYWdlBAEUaXRlbXMsATRWZWM8S2V5VmFsdWU+AAQEaFNldCBzb21lIGl0ZW1zIG9mIHN0b3JhZ2UuMGtpbGxfc3RvcmFnZQQBEGtleXM0ASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeBgBDEtleQABHHN1YmtleXM4AQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrGAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDwBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoPAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlGAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLigAAAUGACwAAAIwADAAAAQIGBgANAAAAhgAOAAABQUAPAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQACAEgW3U4OyAzMl0AAEAMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW0YcGFsbGV0EENhbGwEBFQAAQhMc2V0X3ZhbGlkYXRpb25fZGF0YQgBEGRhdGFEAWhCYXNpY1BhcmFjaGFpbkluaGVyZW50RGF0YQABVGluYm91bmRfbWVzc2FnZXNfZGF0YXwBTEluYm91bmRNZXNzYWdlc0RhdGEAACSAU2V0IHRoZSBjdXJyZW50IHZhbGlkYXRpb24gZGF0YS4AQQFUaGlzIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSBwZXIgYmxvY2suIEl0IHdpbGwgcGFuaWMgYXQgdGhlIGZpbmFsaXphdGlvbohwaGFzZSBpZiB0aGUgY2FsbCB3YXMgbm90IGludm9rZWQuANBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgSW5oZXJlbnRgACEBQXMgYSBzaWRlIGVmZmVjdCwgdGhpcyBmdW5jdGlvbiB1cGdyYWRlcyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGZ1bmN0aW9uhGlmIHRoZSBhcHByb3ByaWF0ZSB0aW1lIGhhcyBjb21lLmBzdWRvX3NlbmRfdXB3YXJkX21lc3NhZ2UEARxtZXNzYWdlGAE0VXB3YXJkTWVzc2FnZQABAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5EDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudGhCYXNpY1BhcmFjaGFpbkluaGVyZW50RGF0YQAAEAE8dmFsaWRhdGlvbl9kYXRhSAFcUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGEAAURyZWxheV9jaGFpbl9zdGF0ZVABVHNwX3RyaWU6OlN0b3JhZ2VQcm9vZgABYHJlbGF5X3BhcmVudF9kZXNjZW5kYW50c1gBQFZlYzxSZWxheUhlYWRlcj4AAUBjb2xsYXRvcl9wZWVyX2lkdAFYT3B0aW9uPEFwcHJvdmVkUGVlcklkPgAASAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OVxQZXJzaXN0ZWRWYWxpZGF0aW9uRGF0YQgESAE8BE4BOAAQASxwYXJlbnRfaGVhZEwBIEhlYWREYXRhAAFMcmVsYXlfcGFyZW50X251bWJlcjgBBE4AAWRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290PAEESAABMG1heF9wb3Zfc2l6ZTgBDHUzMgAATAx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcyBIZWFkRGF0YQAABAAYARxWZWM8dTg+AABQDBxzcF90cmllNHN0b3JhZ2VfcHJvb2YwU3RvcmFnZVByb29mAAAEASh0cmllX25vZGVzVAFEQlRyZWVTZXQ8VmVjPHU4Pj4AAFQEIEJUcmVlU2V0BARUARgABAA0AAAAWAAAAlwAXBAoc3BfcnVudGltZRxnZW5lcmljGGhlYWRlchhIZWFkZXIIGE51bWJlcgE4EEhhc2gAABQBLHBhcmVudF9oYXNoPAEwSGFzaDo6T3V0cHV0AAEYbnVtYmVyYAEYTnVtYmVyAAEoc3RhdGVfcm9vdDwBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDwBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdGQBGERpZ2VzdAAAYAAABjgAZBAoc3BfcnVudGltZRxnZW5lcmljGGRpZ2VzdBhEaWdlc3QAAAQBEGxvZ3NoATxWZWM8RGlnZXN0SXRlbT4AAGgAAAJsAGwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QoRGlnZXN0SXRlbQABFChQcmVSdW50aW1lCABwAURDb25zZW5zdXNFbmdpbmVJZAAAGAEcVmVjPHU4PgAGACRDb25zZW5zdXMIAHABRENvbnNlbnN1c0VuZ2luZUlkAAAYARxWZWM8dTg+AAQAEFNlYWwIAHABRENvbnNlbnN1c0VuZ2luZUlkAAAYARxWZWM8dTg+AAUAFE90aGVyBAAYARxWZWM8dTg+AAAAZFJ1bnRpbWVFbnZpcm9ubWVudFVwZGF0ZWQACAAAcAAAAwQAAAAMAHQEGE9wdGlvbgQEVAF4AQgQTm9uZQAAABBTb21lBAB4AAABAAB4DExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAAfAx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUhwYXJhY2hhaW5faW5oZXJlbnRMSW5ib3VuZE1lc3NhZ2VzRGF0YQAACAFEZG93bndhcmRfbWVzc2FnZXOAAXxBYnJpZGdlZEluYm91bmREb3dud2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc5QBbEFicmlkZ2VkSW5ib3VuZEhybXBNZXNzYWdlcwAAgAx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUhwYXJhY2hhaW5faW5oZXJlbnSEQWJyaWRnZWRJbmJvdW5kTWVzc2FnZXNDb2xsZWN0aW9uBBxNZXNzYWdlAYQACAE0ZnVsbF9tZXNzYWdlc4gBMFZlYzxNZXNzYWdlPgABPGhhc2hlZF9tZXNzYWdlc4wBfFZlYzxNZXNzYWdlOjpDb21wcmVzc2VkTWVzc2FnZT4AAIQIYHBvbGthZG90X2NvcmVfcHJpbWl0aXZlc1hJbmJvdW5kRG93bndhcmRNZXNzYWdlBCxCbG9ja051bWJlcgE4AAgBHHNlbnRfYXQ4ASxCbG9ja051bWJlcgABDG1zZxgBPERvd253YXJkTWVzc2FnZQAAiAAAAoQAjAAAApAAkAiUY3VtdWx1c19wcmltaXRpdmVzX3BhcmFjaGFpbl9pbmhlcmVudDRIYXNoZWRNZXNzYWdlAAAIARxzZW50X2F0OAFUUmVsYXlDaGFpbkJsb2NrTnVtYmVyAAEgbXNnX2hhc2g8ATRzcF9jb3JlOjpIMjU2AACUDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudIRBYnJpZGdlZEluYm91bmRNZXNzYWdlc0NvbGxlY3Rpb24EHE1lc3NhZ2UBmAAIATRmdWxsX21lc3NhZ2VzpAEwVmVjPE1lc3NhZ2U+AAE8aGFzaGVkX21lc3NhZ2VzqAF8VmVjPE1lc3NhZ2U6OkNvbXByZXNzZWRNZXNzYWdlPgAAmAAABAicoACcDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzCElkAAAEADgBDHUzMgAAoAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzSEluYm91bmRIcm1wTWVzc2FnZQQsQmxvY2tOdW1iZXIBOAAIARxzZW50X2F0OAEsQmxvY2tOdW1iZXIAARBkYXRhGAFMYWxsb2M6OnZlYzo6VmVjPHU4PgAApAAAApgAqAAAAqwArAAABAickACwDEBwYWxsZXRfdGltZXN0YW1wGHBhbGxldBBDYWxsBARUAAEEDHNldAQBDG5vd7QBJFQ6Ok1vbWVudAAATFRTZXQgdGhlIGN1cnJlbnQgdGltZS4AVQFUaGlzIGNhbGwgc2hvdWxkIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIHBlciBibG9jay4gSXQgd2lsbCBwYW5pYyBhdCB0aGUgZmluYWxpemF0aW9u1HBoYXNlLCBpZiB0aGlzIGNhbGwgaGFzbid0IGJlZW4gaW52b2tlZCBieSB0aGF0IHRpbWUuAEEBVGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91cyBvbmUgYnkgdGhlIGFtb3VudCBzcGVjaWZpZWQgYnloW2BDb25maWc6Ok1pbmltdW1QZXJpb2RgXS4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Ob25lXy4AUQFUaGlzIGRpc3BhdGNoIGNsYXNzIGlzIF9NYW5kYXRvcnlfIHRvIGVuc3VyZSBpdCBnZXRzIGV4ZWN1dGVkIGluIHRoZSBibG9jay4gQmUgYXdhcmVRAXRoYXQgY2hhbmdpbmcgdGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBjYWxsIGNvdWxkIHJlc3VsdCBleGhhdXN0aW5nIHRoZSByZXNvdXJjZXMgaW4gYYRibG9jayB0byBleGVjdXRlIGFueSBvdGhlciBjYWxscy4ANCMjIENvbXBsZXhpdHkxAS0gYE8oMSlgIChOb3RlIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mIGBPblRpbWVzdGFtcFNldGAgbXVzdCBhbHNvIGJlIGBPKDEpYClVAS0gMSBzdG9yYWdlIHJlYWQgYW5kIDEgc3RvcmFnZSBtdXRhdGlvbiAoY29kZWMgYE8oMSlgIGJlY2F1c2Ugb2YgYERpZFVwZGF0ZTo6dGFrZWAgaW5AICBgb25fZmluYWxpemVgKdQtIDEgZXZlbnQgaGFuZGxlciBgb25fdGltZXN0YW1wX3NldGAuIE11c3QgYmUgYE8oMSlgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy60AAAGKAC4DFhzdGFnaW5nX3BhcmFjaGFpbl9pbmZvGHBhbGxldBBDYWxsBARUAAEABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrwMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQQQ2FsbAgEVAAESQABJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAgBEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVlwAEoVDo6QmFsYW5jZQAAHNRUcmFuc2ZlciBzb21lIGxpcXVpZCBmcmVlIGJhbGFuY2UgdG8gYW5vdGhlciBhY2NvdW50LgA1AWB0cmFuc2Zlcl9hbGxvd19kZWF0aGAgd2lsbCBzZXQgdGhlIGBGcmVlQmFsYW5jZWAgb2YgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuEQFJZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCBpcyBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdLBvZiB0aGUgdHJhbnNmZXIsIHRoZSBhY2NvdW50IHdpbGwgYmUgcmVhcGVkLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBTaWduZWRgIGJ5IHRoZSB0cmFuc2FjdG9yLjhmb3JjZV90cmFuc2ZlcgwBGHNvdXJjZQABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQZGVzdAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXAAShUOjpCYWxhbmNlAAIIYQFFeGFjdGx5IGFzIGB0cmFuc2Zlcl9hbGxvd19kZWF0aGAsIGV4Y2VwdCB0aGUgb3JpZ2luIG11c3QgYmUgcm9vdCBhbmQgdGhlIHNvdXJjZSBhY2NvdW50RG1heSBiZSBzcGVjaWZpZWQuTHRyYW5zZmVyX2tlZXBfYWxpdmUIARBkZXN0AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZcABKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKGtlZXBfYWxpdmXIARBib29sAAQ8BQFUcmFuc2ZlciB0aGUgZW50aXJlIHRyYW5zZmVyYWJsZSBiYWxhbmNlIGZyb20gdGhlIGNhbGxlciBhY2NvdW50LgBZAU5PVEU6IFRoaXMgZnVuY3Rpb24gb25seSBhdHRlbXB0cyB0byB0cmFuc2ZlciBfdHJhbnNmZXJhYmxlXyBiYWxhbmNlcy4gVGhpcyBtZWFucyB0aGF0YQFhbnkgbG9ja2VkLCByZXNlcnZlZCwgb3IgZXhpc3RlbnRpYWwgZGVwb3NpdHMgKHdoZW4gYGtlZXBfYWxpdmVgIGlzIGB0cnVlYCksIHdpbGwgbm90IGJlXQF0cmFuc2ZlcnJlZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJlc3VsdHMgaW4gYSBraWxsZWQgYWNjb3VudCxFAXlvdSBtaWdodCBuZWVkIHRvIHByZXBhcmUgdGhlIGFjY291bnQgYnkgcmVtb3ZpbmcgYW55IHJlZmVyZW5jZSBjb3VudGVycywgc3RvcmFnZUBkZXBvc2l0cywgZXRjLi4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFNpZ25lZC4AoC0gYGRlc3RgOiBUaGUgcmVjaXBpZW50IG9mIHRoZSB0cmFuc2Zlci5ZAS0gYGtlZXBfYWxpdmVgOiBBIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBgdHJhbnNmZXJfYWxsYCBvcGVyYXRpb24gc2hvdWxkIHNlbmQgYWxsTQEgIG9mIHRoZSBmdW5kcyB0aGUgYWNjb3VudCBoYXMsIGNhdXNpbmcgdGhlIHNlbmRlciBhY2NvdW50IHRvIGJlIGtpbGxlZCAoZmFsc2UpLCBvclkBICB0cmFuc2ZlciBldmVyeXRoaW5nIGV4Y2VwdCBhdCBsZWFzdCB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCwgd2hpY2ggd2lsbCBndWFyYW50ZWUgdG+cICBrZWVwIHRoZSBzZW5kZXIgYWNjb3VudCBhbGl2ZSAodHJ1ZSkuPGZvcmNlX3VucmVzZXJ2ZQgBDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50xAEoVDo6QmFsYW5jZQAFDLBVbnJlc2VydmUgc29tZSBiYWxhbmNlIGZyb20gYSB1c2VyIGJ5IGZvcmNlLgBsQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJPT1QuQHVwZ3JhZGVfYWNjb3VudHMEAQx3aG/MAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBuZXdfZnJlZcABKFQ6OkJhbGFuY2UACAysU2V0IHRoZSByZWd1bGFyIGJhbGFuY2Ugb2YgYSBnaXZlbiBhY2NvdW50LgCwVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIGlzIGByb290YC5sZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlCAEkZGlyZWN0aW9u0AFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRhwAEoVDo6QmFsYW5jZQAJFLhBZGp1c3QgdGhlIHRvdGFsIGlzc3VhbmNlIGluIGEgc2F0dXJhdGluZyB3YXkuAPxDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbmQgYWx3YXlzIG5lZWRzIGEgcG9zaXRpdmUgYGRlbHRhYC4AJCMgRXhhbXBsZRBidXJuCAEUdmFsdWXAAShUOjpCYWxhbmNlAAEoa2VlcF9hbGl2ZcgBEGJvb2wAChz8QnVybiB0aGUgc3BlY2lmaWVkIGxpcXVpZCBmcmVlIGJhbGFuY2UgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQuACUBSWYgdGhlIG9yaWdpbidzIGFjY291bnQgZW5kcyB1cCBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdAkBb2YgdGhlIGJ1cm4gYW5kIGBrZWVwX2FsaXZlYCBpcyBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuAFEBVW5saWtlIHNlbmRpbmcgZnVuZHMgdG8gYSBfYnVybl8gYWRkcmVzcywgd2hpY2ggbWVyZWx5IG1ha2VzIHRoZSBmdW5kcyBpbmFjY2Vzc2libGUsIQF0aGlzIGBidXJuYCBvcGVyYXRpb24gd2lsbCByZWR1Y2UgdG90YWwgaXNzdWFuY2UgYnkgdGhlIGFtb3VudCBfYnVybmVkXy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuwAAABsQAxAAABQcAyAAABQAAzAAAAgQA0Aw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzTEFkanVzdG1lbnREaXJlY3Rpb24AAQggSW5jcmVhc2UAAAAgRGVjcmVhc2UAAQAA1Ax8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbhhwYWxsZXQQQ2FsbAQEVAABBCxjbGVhbl91c2FnZQQBGGVudGl0edgBTFQ6OlJlc3RyaWN0ZWRFbnRpdHkAAQhJAUFsbG93IHRvIGNsZWFuIHVzYWdlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgd2hlbiBpdCBpcyB6ZXJvIG9yIHdoZW4gdGhlcmUgaXMgbm+QbG9uZ2VyIGFueSBhbGxvd2FuY2UgZm9yIHRoZSBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtgIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWVAUmVzdHJpY3RlZEVudGl0eQABGDRQZXJzb25hbEFsaWFzBAAIARRBbGlhcwAAAEBQZXJzb25hbElkZW50aXR5BAAoAQx1NjQAAQBEUmVmZXJyZWRDYW5kaWRhdGUEAAQBJEFjY291bnRJZAACAEhBY2NvdW50UGFydGljaXBhbnQEAAQBJEFjY291bnRJZAADAEBJbnZpdGVkQ2FuZGlkYXRlBAAEASRBY2NvdW50SWQABAAoTGl0ZVBlcnNvbgQABAEkQWNjb3VudElkAAUAANwMNHBhbGxldF9hc3NldHMYcGFsbGV0EENhbGwIBFQABEkAAYgYY3JlYXRlDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEUYWRtaW4AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLG1pbl9iYWxhbmNlxAEoVDo6QmFsYW5jZQAATOhJc3N1ZSBhIG5ldyBjbGFzcyBvZiBmdW5naWJsZSBhc3NldHMgZnJvbSBhIHB1YmxpYyBvcmlnaW4uACUBVGhpcyBuZXcgYXNzZXQgY2xhc3MgaGFzIG5vIGFzc2V0cyBpbml0aWFsbHkgYW5kIGl0cyBvd25lciBpcyB0aGUgb3JpZ2luLgBhAVRoZSBvcmlnaW4gbXVzdCBjb25mb3JtIHRvIHRoZSBjb25maWd1cmVkIGBDcmVhdGVPcmlnaW5gIGFuZCBoYXZlIHN1ZmZpY2llbnQgZnVuZHMgZnJlZS4AvEZ1bmRzIG9mIHNlbmRlciBhcmUgcmVzZXJ2ZWQgYnkgYEFzc2V0RGVwb3NpdGAuACxQYXJhbWV0ZXJzOlkBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbmV3IGFzc2V0LiBUaGlzIG11c3Qgbm90IGJlIGN1cnJlbnRseSBpbiB1c2UgdG8gaWRlbnRpZnkxAWFuIGV4aXN0aW5nIGFzc2V0LiBJZiBbYE5leHRBc3NldElkYF0gaXMgc2V0LCB0aGVuIHRoaXMgbXVzdCBiZSBlcXVhbCB0byBpdC5ZAS0gYGFkbWluYDogVGhlIGFkbWluIG9mIHRoaXMgY2xhc3Mgb2YgYXNzZXRzLiBUaGUgYWRtaW4gaXMgdGhlIGluaXRpYWwgYWRkcmVzcyBvZiBlYWNonG1lbWJlciBvZiB0aGUgYXNzZXQgY2xhc3MncyBhZG1pbiB0ZWFtLk0BLSBgbWluX2JhbGFuY2VgOiBUaGUgbWluaW11bSBiYWxhbmNlIG9mIHRoaXMgbmV3IGFzc2V0IHRoYXQgYW55IHNpbmdsZSBhY2NvdW50IG11c3Q9AWhhdmUuIElmIGFuIGFjY291bnQncyBiYWxhbmNlIGlzIHJlZHVjZWQgYmVsb3cgdGhpcywgdGhlbiBpdCBjb2xsYXBzZXMgdG8gemVyby4AmEVtaXRzIGBDcmVhdGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuADhXZWlnaHQ6IGBPKDEpYDBmb3JjZV9jcmVhdGUQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARRvd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAE0aXNfc3VmZmljaWVudMgBEGJvb2wAASxtaW5fYmFsYW5jZcABKFQ6OkJhbGFuY2UAAUz4SXNzdWUgYSBuZXcgY2xhc3Mgb2YgZnVuZ2libGUgYXNzZXRzIGZyb20gYSBwcml2aWxlZ2VkIG9yaWdpbi4AtFRoaXMgbmV3IGFzc2V0IGNsYXNzIGhhcyBubyBhc3NldHMgaW5pdGlhbGx5LgCkVGhlIG9yaWdpbiBtdXN0IGNvbmZvcm0gdG8gYEZvcmNlT3JpZ2luYC4AnFVubGlrZSBgY3JlYXRlYCwgbm8gZnVuZHMgYXJlIHJlc2VydmVkLgBZAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIG5ldyBhc3NldC4gVGhpcyBtdXN0IG5vdCBiZSBjdXJyZW50bHkgaW4gdXNlIHRvIGlkZW50aWZ5MQFhbiBleGlzdGluZyBhc3NldC4gSWYgW2BOZXh0QXNzZXRJZGBdIGlzIHNldCwgdGhlbiB0aGlzIG11c3QgYmUgZXF1YWwgdG8gaXQuWQEtIGBvd25lcmA6IFRoZSBvd25lciBvZiB0aGlzIGNsYXNzIG9mIGFzc2V0cy4gVGhlIG93bmVyIGhhcyBmdWxsIHN1cGVydXNlciBwZXJtaXNzaW9ucyUBb3ZlciB0aGlzIGFzc2V0LCBidXQgbWF5IGxhdGVyIGNoYW5nZSBhbmQgY29uZmlndXJlIHRoZSBwZXJtaXNzaW9ucyB1c2luZ5BgdHJhbnNmZXJfb3duZXJzaGlwYCBhbmQgYHNldF90ZWFtYC5NAS0gYG1pbl9iYWxhbmNlYDogVGhlIG1pbmltdW0gYmFsYW5jZSBvZiB0aGlzIG5ldyBhc3NldCB0aGF0IGFueSBzaW5nbGUgYWNjb3VudCBtdXN0PQFoYXZlLiBJZiBhbiBhY2NvdW50J3MgYmFsYW5jZSBpcyByZWR1Y2VkIGJlbG93IHRoaXMsIHRoZW4gaXQgY29sbGFwc2VzIHRvIHplcm8uAKxFbWl0cyBgRm9yY2VDcmVhdGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuADhXZWlnaHQ6IGBPKDEpYDRzdGFydF9kZXN0cm95BAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAIw3FN0YXJ0IHRoZSBwcm9jZXNzIG9mIGRlc3Ryb3lpbmcgYSBmdW5naWJsZSBhc3NldCBjbGFzcy4AWQFgc3RhcnRfZGVzdHJveWAgaXMgdGhlIGZpcnN0IGluIGEgc2VyaWVzIG9mIGV4dHJpbnNpY3MgdGhhdCBzaG91bGQgYmUgY2FsbGVkLCB0byBhbGxvd3hkZXN0cnVjdGlvbiBvZiBhbiBhc3NldCBjbGFzcy4AUQFUaGUgb3JpZ2luIG11c3QgY29uZm9ybSB0byBgRm9yY2VPcmlnaW5gIG9yIG11c3QgYmUgYFNpZ25lZGAgYnkgdGhlIGFzc2V0J3MgYG93bmVyYC4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgBJAUl0IHdpbGwgZmFpbCB3aXRoIGVpdGhlciBbYEVycm9yOjpDb250YWluc0hvbGRzYF0gb3IgW2BFcnJvcjo6Q29udGFpbnNGcmVlemVzYF0gaWa4YW4gYWNjb3VudCBjb250YWlucyBob2xkcyBvciBmcmVlemVzIGluIHBsYWNlLkBkZXN0cm95X2FjY291bnRzBAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAMwzERlc3Ryb3kgYWxsIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFzc2V0LgBdAWBkZXN0cm95X2FjY291bnRzYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYHN0YXJ0X2Rlc3Ryb3lgIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHRoZYRhc3NldCBpcyBpbiBhIGBEZXN0cm95aW5nYCBzdGF0ZS4AXQFEdWUgdG8gd2VpZ2h0IHJlc3RyaWN0aW9ucywgdGhpcyBmdW5jdGlvbiBtYXkgbmVlZCB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gZnVsbHkxAWRlc3Ryb3kgYWxsIGFjY291bnRzLiBJdCB3aWxsIGRlc3Ryb3kgYFJlbW92ZUl0ZW1zTGltaXRgIGFjY291bnRzIGF0IGEgdGltZS4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgDURWFjaCBjYWxsIGVtaXRzIHRoZSBgRXZlbnQ6OkRlc3Ryb3llZEFjY291bnRzYCBldmVudC5EZGVzdHJveV9hcHByb3ZhbHMEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIABDBhAURlc3Ryb3kgYWxsIGFwcHJvdmFscyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhc3NldCB1cCB0byB0aGUgbWF4IChUOjpSZW1vdmVJdGVtc0xpbWl0KS4AYQFgZGVzdHJveV9hcHByb3ZhbHNgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBgc3RhcnRfZGVzdHJveWAgaGFzIGJlZW4gY2FsbGVkLCBhbmQgdGhlhGFzc2V0IGlzIGluIGEgYERlc3Ryb3lpbmdgIHN0YXRlLgBdAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBmdWxseTkBZGVzdHJveSBhbGwgYXBwcm92YWxzLiBJdCB3aWxsIGRlc3Ryb3kgYFJlbW92ZUl0ZW1zTGltaXRgIGFwcHJvdmFscyBhdCBhIHRpbWUuAE0BLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgZGVzdHJveWVkLiBUaGlzIG11c3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgICBhc3NldC4A2EVhY2ggY2FsbCBlbWl0cyB0aGUgYEV2ZW50OjpEZXN0cm95ZWRBcHByb3ZhbHNgIGV2ZW50LjhmaW5pc2hfZGVzdHJveQQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgAFKMRDb21wbGV0ZSBkZXN0cm95aW5nIGFzc2V0IGFuZCB1bnJlc2VydmUgY3VycmVuY3kuAFUBYGZpbmlzaF9kZXN0cm95YCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYHN0YXJ0X2Rlc3Ryb3lgIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHRoZVkBYXNzZXQgaXMgaW4gYSBgRGVzdHJveWluZ2Agc3RhdGUuIEFsbCBhY2NvdW50cyBvciBhcHByb3ZhbHMgc2hvdWxkIGJlIGRlc3Ryb3llZCBiZWZvcmUUaGFuZC4ATQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBkZXN0cm95ZWQuIFRoaXMgbXVzdCBpZGVudGlmeSBhbiBleGlzdGluZyAgIGFzc2V0LgDgRWFjaCBzdWNjZXNzZnVsIGNhbGwgZW1pdHMgdGhlIGBFdmVudDo6RGVzdHJveWVkYCBldmVudC4QbWludAwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABLGJlbmVmaWNpYXJ5AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlAAYwiE1pbnQgYXNzZXRzIG9mIGEgcGFydGljdWxhciBjbGFzcy4AOQFUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIElzc3VlciBvZiB0aGUgYXNzZXQgYGlkYC4A/C0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGhhdmUgc29tZSBhbW91bnQgbWludGVkLg0BLSBgYmVuZWZpY2lhcnlgOiBUaGUgYWNjb3VudCB0byBiZSBjcmVkaXRlZCB3aXRoIHRoZSBtaW50ZWQgYXNzZXRzLsQtIGBhbW91bnRgOiBUaGUgYW1vdW50IG9mIHRoZSBhc3NldCB0byBiZSBtaW50ZWQuAJRFbWl0cyBgSXNzdWVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuADhXZWlnaHQ6IGBPKDEpYFUBTW9kZXM6IFByZS1leGlzdGluZyBiYWxhbmNlIG9mIGBiZW5lZmljaWFyeWA7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZiBgYmVuZWZpY2lhcnlgLhBidXJuDAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlAAc8RQFSZWR1Y2UgdGhlIGJhbGFuY2Ugb2YgYHdob2AgYnkgYXMgbXVjaCBhcyBwb3NzaWJsZSB1cCB0byBgYW1vdW50YCBhc3NldHMgb2YgYGlkYC4ANQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBNYW5hZ2VyIG9mIHRoZSBhc3NldCBgaWRgLgDQQmFpbHMgd2l0aCBgTm9BY2NvdW50YCBpZiB0aGUgYHdob2AgaXMgYWxyZWFkeSBkZWFkLgD8LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCBidXJuZWQuoC0gYHdob2A6IFRoZSBhY2NvdW50IHRvIGJlIGRlYml0ZWQgZnJvbS4pAS0gYGFtb3VudGA6IFRoZSBtYXhpbXVtIGFtb3VudCBieSB3aGljaCBgd2hvYCdzIGJhbGFuY2Ugc2hvdWxkIGJlIHJlZHVjZWQuAFEBRW1pdHMgYEJ1cm5lZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCBidXJuZWQuIElmIHRoaXMgdGFrZXMgdGhlIGJhbGFuY2UgdG8gYmVsb3cgdGhlOQFtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCBidXJuZWQgaXMgaW5jcmVhc2VkIHRvIHRha2UgaXQgdG8gemVyby4AOFdlaWdodDogYE8oMSlgCQFNb2RlczogUG9zdC1leGlzdGVuY2Ugb2YgYHdob2A7IFByZSAmIHBvc3QgWm9tYmllLXN0YXR1cyBvZiBgd2hvYC4gdHJhbnNmZXIMAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UACEjQTW92ZSBzb21lIGFzc2V0cyBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudCB0byBhbm90aGVyLgBYT3JpZ2luIG11c3QgYmUgU2lnbmVkLgARAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGhhdmUgc29tZSBhbW91bnQgdHJhbnNmZXJyZWQunC0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRvIGJlIGNyZWRpdGVkLlEBLSBgYW1vdW50YDogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VuZGVyJ3MgYmFsYW5jZSBvZiBhc3NldHMgc2hvdWxkIGJlIHJlZHVjZWQgYW5kYQFgdGFyZ2V0YCdzIGJhbGFuY2UgaW5jcmVhc2VkLiBUaGUgYW1vdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkIG1heSBiZSBzbGlnaHRseSBncmVhdGVyIGluXQF0aGUgY2FzZSB0aGF0IHRoZSB0cmFuc2ZlciB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgc2VuZGVyIGJhbGFuY2UgYWJvdmUgemVybyBidXQgYmVsb3e8dGhlIG1pbmltdW0gYmFsYW5jZS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4AYQFFbWl0cyBgVHJhbnNmZXJyZWRgIHdpdGggdGhlIGFjdHVhbCBhbW91bnQgdHJhbnNmZXJyZWQuIElmIHRoaXMgdGFrZXMgdGhlIHNvdXJjZSBiYWxhbmNlXQF0byBiZWxvdyB0aGUgbWluaW11bSBmb3IgdGhlIGFzc2V0LCB0aGVuIHRoZSBhbW91bnQgdHJhbnNmZXJyZWQgaXMgaW5jcmVhc2VkIHRvIHRha2UgaXQgdG8gemVyby4AOFdlaWdodDogYE8oMSlgUQFNb2RlczogUHJlLWV4aXN0ZW5jZSBvZiBgdGFyZ2V0YDsgUG9zdC1leGlzdGVuY2Ugb2Ygc2VuZGVyOyBBY2NvdW50IHByZS1leGlzdGVuY2Ugb2YkYHRhcmdldGAuTHRyYW5zZmVyX2tlZXBfYWxpdmUMAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UACUhZAU1vdmUgc29tZSBhc3NldHMgZnJvbSB0aGUgc2VuZGVyIGFjY291bnQgdG8gYW5vdGhlciwga2VlcGluZyB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUuAFhPcmlnaW4gbXVzdCBiZSBTaWduZWQuABEBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCB0cmFuc2ZlcnJlZC6cLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gYmUgY3JlZGl0ZWQuUQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzZW5kZXIncyBiYWxhbmNlIG9mIGFzc2V0cyBzaG91bGQgYmUgcmVkdWNlZCBhbmRhAWB0YXJnZXRgJ3MgYmFsYW5jZSBpbmNyZWFzZWQuIFRoZSBhbW91bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgbWF5IGJlIHNsaWdodGx5IGdyZWF0ZXIgaW5dAXRoZSBjYXNlIHRoYXQgdGhlIHRyYW5zZmVyIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBzZW5kZXIgYmFsYW5jZSBhYm92ZSB6ZXJvIGJ1dCBiZWxvd7x0aGUgbWluaW11bSBiYWxhbmNlLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgBhAUVtaXRzIGBUcmFuc2ZlcnJlZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCB0cmFuc2ZlcnJlZC4gSWYgdGhpcyB0YWtlcyB0aGUgc291cmNlIGJhbGFuY2VdAXRvIGJlbG93IHRoZSBtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBpcyBpbmNyZWFzZWQgdG8gdGFrZSBpdCB0byB6ZXJvLgA4V2VpZ2h0OiBgTygxKWBRAU1vZGVzOiBQcmUtZXhpc3RlbmNlIG9mIGB0YXJnZXRgOyBQb3N0LWV4aXN0ZW5jZSBvZiBzZW5kZXI7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZiRgdGFyZ2V0YC44Zm9yY2VfdHJhbnNmZXIQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARhzb3VyY2UAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGGFtb3VudMABKFQ6OkJhbGFuY2UACky0TW92ZSBzb21lIGFzc2V0cyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXIuAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgQWRtaW4gb2YgdGhlIGFzc2V0IGBpZGAuABEBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gaGF2ZSBzb21lIGFtb3VudCB0cmFuc2ZlcnJlZC6YLSBgc291cmNlYDogVGhlIGFjY291bnQgdG8gYmUgZGViaXRlZC6ULSBgZGVzdGA6IFRoZSBhY2NvdW50IHRvIGJlIGNyZWRpdGVkLlkBLSBgYW1vdW50YDogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgYHNvdXJjZWAncyBiYWxhbmNlIG9mIGFzc2V0cyBzaG91bGQgYmUgcmVkdWNlZCBhbmRZAWBkZXN0YCdzIGJhbGFuY2UgaW5jcmVhc2VkLiBUaGUgYW1vdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkIG1heSBiZSBzbGlnaHRseSBncmVhdGVyIGluTQF0aGUgY2FzZSB0aGF0IHRoZSB0cmFuc2ZlciB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgYHNvdXJjZWAgYmFsYW5jZSBhYm92ZSB6ZXJvIGJ1dNRiZWxvdyB0aGUgbWluaW11bSBiYWxhbmNlLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgBhAUVtaXRzIGBUcmFuc2ZlcnJlZGAgd2l0aCB0aGUgYWN0dWFsIGFtb3VudCB0cmFuc2ZlcnJlZC4gSWYgdGhpcyB0YWtlcyB0aGUgc291cmNlIGJhbGFuY2VdAXRvIGJlbG93IHRoZSBtaW5pbXVtIGZvciB0aGUgYXNzZXQsIHRoZW4gdGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBpcyBpbmNyZWFzZWQgdG8gdGFrZSBpdCB0byB6ZXJvLgA4V2VpZ2h0OiBgTygxKWBRAU1vZGVzOiBQcmUtZXhpc3RlbmNlIG9mIGBkZXN0YDsgUG9zdC1leGlzdGVuY2Ugb2YgYHNvdXJjZWA7IEFjY291bnQgcHJlLWV4aXN0ZW5jZSBvZhxgZGVzdGAuGGZyZWV6ZQgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAswVQFEaXNhbGxvdyBmdXJ0aGVyIHVucHJpdmlsZWdlZCB0cmFuc2ZlcnMgb2YgYW4gYXNzZXQgYGlkYCBmcm9tIGFuIGFjY291bnQgYHdob2AuIGB3aG9gTQFtdXN0IGFscmVhZHkgZXhpc3QgYXMgYW4gZW50cnkgaW4gYEFjY291bnRgcyBvZiB0aGUgYXNzZXQuIElmIHlvdSB3YW50IHRvIGZyZWV6ZSBhbvRhY2NvdW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBlbnRyeSwgdXNlIGB0b3VjaF9vdGhlcmAgZmlyc3QuADUBT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgRnJlZXplciBvZiB0aGUgYXNzZXQgYGlkYC4AxC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGZyb3plbi6ILSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgZnJvemVuLgA8RW1pdHMgYEZyb3plbmAuADhXZWlnaHQ6IGBPKDEpYBB0aGF3CAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4ADCjoQWxsb3cgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyB0byBhbmQgZnJvbSBhbiBhY2NvdW50IGFnYWluLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEFkbWluIG9mIHRoZSBhc3NldCBgaWRgLgDELSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgZnJvemVuLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1bmZyb3plbi4APEVtaXRzIGBUaGF3ZWRgLgA4V2VpZ2h0OiBgTygxKWAwZnJlZXplX2Fzc2V0BAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAA0k8ERpc2FsbG93IGZ1cnRoZXIgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyBmb3IgdGhlIGFzc2V0IGNsYXNzLgA1AU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEZyZWV6ZXIgb2YgdGhlIGFzc2V0IGBpZGAuAMQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBiZSBmcm96ZW4uADxFbWl0cyBgRnJvemVuYC4AOFdlaWdodDogYE8oMSlgKHRoYXdfYXNzZXQEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIADiTEQWxsb3cgdW5wcml2aWxlZ2VkIHRyYW5zZmVycyBmb3IgdGhlIGFzc2V0IGFnYWluLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEFkbWluIG9mIHRoZSBhc3NldCBgaWRgLgDELSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gYmUgdGhhd2VkLgA8RW1pdHMgYFRoYXdlZGAuADhXZWlnaHQ6IGBPKDEpYEh0cmFuc2Zlcl9vd25lcnNoaXAIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARRvd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AA8odENoYW5nZSB0aGUgT3duZXIgb2YgYW4gYXNzZXQuAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgc2VuZGVyIHNob3VsZCBiZSB0aGUgT3duZXIgb2YgdGhlIGFzc2V0IGBpZGAuAJAtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldC6cLSBgb3duZXJgOiBUaGUgbmV3IE93bmVyIG9mIHRoaXMgYXNzZXQuAFRFbWl0cyBgT3duZXJDaGFuZ2VkYC4AOFdlaWdodDogYE8oMSlgIHNldF90ZWFtEAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEYaXNzdWVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRhZG1pbgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcZnJlZXplcgABUEFjY291bnRJZExvb2t1cE9mPFQ+ABAwxENoYW5nZSB0aGUgSXNzdWVyLCBBZG1pbiBhbmQgRnJlZXplciBvZiBhbiBhc3NldC4ALQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4AxC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIGJlIGZyb3plbi6kLSBgaXNzdWVyYDogVGhlIG5ldyBJc3N1ZXIgb2YgdGhpcyBhc3NldC6cLSBgYWRtaW5gOiBUaGUgbmV3IEFkbWluIG9mIHRoaXMgYXNzZXQurC0gYGZyZWV6ZXJgOiBUaGUgbmV3IEZyZWV6ZXIgb2YgdGhpcyBhc3NldC4AUEVtaXRzIGBUZWFtQ2hhbmdlZGAuADhXZWlnaHQ6IGBPKDEpYDBzZXRfbWV0YWRhdGEQAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAARBuYW1lGAEcVmVjPHU4PgABGHN5bWJvbBgBHFZlYzx1OD4AASBkZWNpbWFscwwBCHU4ABFAeFNldCB0aGUgbWV0YWRhdGEgZm9yIGFuIGFzc2V0LgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIE93bmVyIG9mIHRoZSBhc3NldCBgaWRgLgDYRnVuZHMgb2Ygc2VuZGVyIGFyZSByZXNlcnZlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6UQFgTWV0YWRhdGFEZXBvc2l0QmFzZSArIE1ldGFkYXRhRGVwb3NpdFBlckJ5dGUgKiAobmFtZS5sZW4gKyBzeW1ib2wubGVuKWAgdGFraW5nIGludG+MYWNjb3VudCBhbnkgYWxyZWFkeSByZXNlcnZlZCBmdW5kcy4AuC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IHRvIHVwZGF0ZS5NAS0gYG5hbWVgOiBUaGUgdXNlciBmcmllbmRseSBuYW1lIG9mIHRoaXMgYXNzZXQuIExpbWl0ZWQgaW4gbGVuZ3RoIGJ5IGBTdHJpbmdMaW1pdGAuTQEtIGBzeW1ib2xgOiBUaGUgZXhjaGFuZ2Ugc3ltYm9sIGZvciB0aGlzIGFzc2V0LiBMaW1pdGVkIGluIGxlbmd0aCBieSBgU3RyaW5nTGltaXRgLi0BLSBgZGVjaW1hbHNgOiBUaGUgbnVtYmVyIG9mIGRlY2ltYWxzIHRoaXMgYXNzZXQgdXNlcyB0byByZXByZXNlbnQgb25lIHVuaXQuAFBFbWl0cyBgTWV0YWRhdGFTZXRgLgA4V2VpZ2h0OiBgTygxKWA4Y2xlYXJfbWV0YWRhdGEEAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAEiyAQ2xlYXIgdGhlIG1ldGFkYXRhIGZvciBhbiBhc3NldC4ALQFPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgc2hvdWxkIGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4ApEFueSBkZXBvc2l0IGlzIGZyZWVkIGZvciB0aGUgYXNzZXQgb3duZXIuALQtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCB0byBjbGVhci4AYEVtaXRzIGBNZXRhZGF0YUNsZWFyZWRgLgA4V2VpZ2h0OiBgTygxKWBIZm9yY2Vfc2V0X21ldGFkYXRhFAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEQbmFtZRgBHFZlYzx1OD4AARhzeW1ib2wYARxWZWM8dTg+AAEgZGVjaW1hbHMMAQh1OAABJGlzX2Zyb3plbsgBEGJvb2wAEzi4Rm9yY2UgdGhlIG1ldGFkYXRhIGZvciBhbiBhc3NldCB0byBzb21lIHZhbHVlLgBsT3JpZ2luIG11c3QgYmUgRm9yY2VPcmlnaW4uAGhBbnkgZGVwb3NpdCBpcyBsZWZ0IGFsb25lLgC4LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gdXBkYXRlLk0BLSBgbmFtZWA6IFRoZSB1c2VyIGZyaWVuZGx5IG5hbWUgb2YgdGhpcyBhc3NldC4gTGltaXRlZCBpbiBsZW5ndGggYnkgYFN0cmluZ0xpbWl0YC5NAS0gYHN5bWJvbGA6IFRoZSBleGNoYW5nZSBzeW1ib2wgZm9yIHRoaXMgYXNzZXQuIExpbWl0ZWQgaW4gbGVuZ3RoIGJ5IGBTdHJpbmdMaW1pdGAuLQEtIGBkZWNpbWFsc2A6IFRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdGhpcyBhc3NldCB1c2VzIHRvIHJlcHJlc2VudCBvbmUgdW5pdC4AUEVtaXRzIGBNZXRhZGF0YVNldGAuAFEBV2VpZ2h0OiBgTyhOICsgUylgIHdoZXJlIE4gYW5kIFMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHN5bWJvbCByZXNwZWN0aXZlbHkuUGZvcmNlX2NsZWFyX21ldGFkYXRhBAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyABQsgENsZWFyIHRoZSBtZXRhZGF0YSBmb3IgYW4gYXNzZXQuAGxPcmlnaW4gbXVzdCBiZSBGb3JjZU9yaWdpbi4AYEFueSBkZXBvc2l0IGlzIHJldHVybmVkLgC0LSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgdG8gY2xlYXIuAGBFbWl0cyBgTWV0YWRhdGFDbGVhcmVkYC4AOFdlaWdodDogYE8oMSlgSGZvcmNlX2Fzc2V0X3N0YXR1cyABCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABFG93bmVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhpc3N1ZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGFkbWluAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxmcmVlemVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASxtaW5fYmFsYW5jZcABKFQ6OkJhbGFuY2UAATRpc19zdWZmaWNpZW50yAEQYm9vbAABJGlzX2Zyb3plbsgBEGJvb2wAFViYQWx0ZXIgdGhlIGF0dHJpYnV0ZXMgb2YgYSBnaXZlbiBhc3NldC4AdE9yaWdpbiBtdXN0IGJlIGBGb3JjZU9yaWdpbmAuAJAtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldC6cLSBgb3duZXJgOiBUaGUgbmV3IE93bmVyIG9mIHRoaXMgYXNzZXQupC0gYGlzc3VlcmA6IFRoZSBuZXcgSXNzdWVyIG9mIHRoaXMgYXNzZXQunC0gYGFkbWluYDogVGhlIG5ldyBBZG1pbiBvZiB0aGlzIGFzc2V0LqwtIGBmcmVlemVyYDogVGhlIG5ldyBGcmVlemVyIG9mIHRoaXMgYXNzZXQuTQEtIGBtaW5fYmFsYW5jZWA6IFRoZSBtaW5pbXVtIGJhbGFuY2Ugb2YgdGhpcyBuZXcgYXNzZXQgdGhhdCBhbnkgc2luZ2xlIGFjY291bnQgbXVzdD0BaGF2ZS4gSWYgYW4gYWNjb3VudCdzIGJhbGFuY2UgaXMgcmVkdWNlZCBiZWxvdyB0aGlzLCB0aGVuIGl0IGNvbGxhcHNlcyB0byB6ZXJvLlEBLSBgaXNfc3VmZmljaWVudGA6IFdoZXRoZXIgYSBub24temVybyBiYWxhbmNlIG9mIHRoaXMgYXNzZXQgaXMgZGVwb3NpdCBvZiBzdWZmaWNpZW50TQF2YWx1ZSB0byBhY2NvdW50IGZvciB0aGUgc3RhdGUgYmxvYXQgYXNzb2NpYXRlZCB3aXRoIGl0cyBiYWxhbmNlIHN0b3JhZ2UuIElmIHNldCB0b1UBYHRydWVgLCB0aGVuIG5vbi16ZXJvIGJhbGFuY2VzIG1heSBiZSBzdG9yZWQgd2l0aG91dCBhIGBjb25zdW1lcmAgcmVmZXJlbmNlIChhbmQgdGh1c00BYW4gRUQgaW4gdGhlIEJhbGFuY2VzIHBhbGxldCBvciB3aGF0ZXZlciBlbHNlIGlzIHVzZWQgdG8gY29udHJvbCB1c2VyLWFjY291bnQgc3RhdGUgZ3Jvd3RoKS49AS0gYGlzX2Zyb3plbmA6IFdoZXRoZXIgdGhpcyBhc3NldCBjbGFzcyBpcyBmcm96ZW4gZXhjZXB0IGZvciBwZXJtaXNzaW9uZWQvYWRtaW40aW5zdHJ1Y3Rpb25zLgDoRW1pdHMgYEFzc2V0U3RhdHVzQ2hhbmdlZGAgd2l0aCB0aGUgaWRlbnRpdHkgb2YgdGhlIGFzc2V0LgA4V2VpZ2h0OiBgTygxKWBAYXBwcm92ZV90cmFuc2ZlcgwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlABZQLQFBcHByb3ZlIGFuIGFtb3VudCBvZiBhc3NldCBmb3IgdHJhbnNmZXIgYnkgYSBkZWxlZ2F0ZWQgdGhpcmQtcGFydHkgYWNjb3VudC4AWE9yaWdpbiBtdXN0IGJlIFNpZ25lZC4ATQFFbnN1cmVzIHRoYXQgYEFwcHJvdmFsRGVwb3NpdGAgd29ydGggb2YgYEN1cnJlbmN5YCBpcyByZXNlcnZlZCBmcm9tIHNpZ25pbmcgYWNjb3VudFUBZm9yIHRoZSBwdXJwb3NlIG9mIGhvbGRpbmcgdGhlIGFwcHJvdmFsLiBJZiBzb21lIG5vbi16ZXJvIGFtb3VudCBvZiBhc3NldHMgaXMgYWxyZWFkeUkBYXBwcm92ZWQgZnJvbSBzaWduaW5nIGFjY291bnQgdG8gYGRlbGVnYXRlYCwgdGhlbiBpdCBpcyB0b3BwZWQgdXAgb3IgdW5yZXNlcnZlZCB0b1RtZWV0IHRoZSByaWdodCB2YWx1ZS4ARQFOT1RFOiBUaGUgc2lnbmluZyBhY2NvdW50IGRvZXMgbm90IG5lZWQgdG8gb3duIGBhbW91bnRgIG9mIGFzc2V0cyBhdCB0aGUgcG9pbnQgb2ZEbWFraW5nIHRoaXMgY2FsbC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0Lg0BLSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0byBkZWxlZ2F0ZSBwZXJtaXNzaW9uIHRvIHRyYW5zZmVyIGFzc2V0LkkBLSBgYW1vdW50YDogVGhlIGFtb3VudCBvZiBhc3NldCB0aGF0IG1heSBiZSB0cmFuc2ZlcnJlZCBieSBgZGVsZWdhdGVgLiBJZiB0aGVyZSBpc+BhbHJlYWR5IGFuIGFwcHJvdmFsIGluIHBsYWNlLCB0aGVuIHRoaXMgYWN0cyBhZGRpdGl2ZWx5LgCQRW1pdHMgYEFwcHJvdmVkVHJhbnNmZXJgIG9uIHN1Y2Nlc3MuADhXZWlnaHQ6IGBPKDEpYDxjYW5jZWxfYXBwcm92YWwIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABc0SQFDYW5jZWwgYWxsIG9mIHNvbWUgYXNzZXQgYXBwcm92ZWQgZm9yIGRlbGVnYXRlZCB0cmFuc2ZlciBieSBhIHRoaXJkLXBhcnR5IGFjY291bnQuAD0BT3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCB0aGVyZSBtdXN0IGJlIGFuIGFwcHJvdmFsIGluIHBsYWNlIGJldHdlZW4gc2lnbmVyIGFuZCxgZGVsZWdhdGVgLgBJAVVucmVzZXJ2ZXMgYW55IGRlcG9zaXQgcHJldmlvdXNseSByZXNlcnZlZCBieSBgYXBwcm92ZV90cmFuc2ZlcmAgZm9yIHRoZSBhcHByb3ZhbC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LgUBLSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCBkZWxlZ2F0ZWQgcGVybWlzc2lvbiB0byB0cmFuc2ZlciBhc3NldC4AlEVtaXRzIGBBcHByb3ZhbENhbmNlbGxlZGAgb24gc3VjY2Vzcy4AOFdlaWdodDogYE8oMSlgVGZvcmNlX2NhbmNlbF9hcHByb3ZhbAwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABFG93bmVyAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABg0SQFDYW5jZWwgYWxsIG9mIHNvbWUgYXNzZXQgYXBwcm92ZWQgZm9yIGRlbGVnYXRlZCB0cmFuc2ZlciBieSBhIHRoaXJkLXBhcnR5IGFjY291bnQuAEkBT3JpZ2luIG11c3QgYmUgZWl0aGVyIEZvcmNlT3JpZ2luIG9yIFNpZ25lZCBvcmlnaW4gd2l0aCB0aGUgc2lnbmVyIGJlaW5nIHRoZSBBZG1pbmhhY2NvdW50IG9mIHRoZSBhc3NldCBgaWRgLgBJAVVucmVzZXJ2ZXMgYW55IGRlcG9zaXQgcHJldmlvdXNseSByZXNlcnZlZCBieSBgYXBwcm92ZV90cmFuc2ZlcmAgZm9yIHRoZSBhcHByb3ZhbC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LgUBLSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCBkZWxlZ2F0ZWQgcGVybWlzc2lvbiB0byB0cmFuc2ZlciBhc3NldC4AlEVtaXRzIGBBcHByb3ZhbENhbmNlbGxlZGAgb24gc3VjY2Vzcy4AOFdlaWdodDogYE8oMSlgRHRyYW5zZmVyX2FwcHJvdmVkEAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEUb3duZXIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLGRlc3RpbmF0aW9uAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnTAAShUOjpCYWxhbmNlABlITQFUcmFuc2ZlciBzb21lIGFzc2V0IGJhbGFuY2UgZnJvbSBhIHByZXZpb3VzbHkgZGVsZWdhdGVkIGFjY291bnQgdG8gc29tZSB0aGlyZC1wYXJ0eSBhY2NvdW50LgBJAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlcmUgbXVzdCBiZSBhbiBhcHByb3ZhbCBpbiBwbGFjZSBieSB0aGUgYG93bmVyYCB0byB0aGUcc2lnbmVyLgBZAUlmIHRoZSBlbnRpcmUgYW1vdW50IGFwcHJvdmVkIGZvciB0cmFuc2ZlciBpcyB0cmFuc2ZlcnJlZCwgdGhlbiBhbnkgZGVwb3NpdCBwcmV2aW91c2x5tHJlc2VydmVkIGJ5IGBhcHByb3ZlX3RyYW5zZmVyYCBpcyB1bnJlc2VydmVkLgCQLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQuYQEtIGBvd25lcmA6IFRoZSBhY2NvdW50IHdoaWNoIHByZXZpb3VzbHkgYXBwcm92ZWQgZm9yIGEgdHJhbnNmZXIgb2YgYXQgbGVhc3QgYGFtb3VudGAgYW5kvGZyb20gd2hpY2ggdGhlIGFzc2V0IGJhbGFuY2Ugd2lsbCBiZSB3aXRoZHJhd24uYQEtIGBkZXN0aW5hdGlvbmA6IFRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBhc3NldCBiYWxhbmNlIG9mIGBhbW91bnRgIHdpbGwgYmUgdHJhbnNmZXJyZWQutC0gYGFtb3VudGA6IFRoZSBhbW91bnQgb2YgYXNzZXRzIHRvIHRyYW5zZmVyLgCcRW1pdHMgYFRyYW5zZmVycmVkQXBwcm92ZWRgIG9uIHN1Y2Nlc3MuADhXZWlnaHQ6IGBPKDEpYBR0b3VjaAQBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgAaJMBDcmVhdGUgYW4gYXNzZXQgYWNjb3VudCBmb3Igbm9uLXByb3ZpZGVyIGFzc2V0cy4AwEEgZGVwb3NpdCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHNpZ25lciBhY2NvdW50LgBdAS0gYG9yaWdpbmA6IE11c3QgYmUgU2lnbmVkOyB0aGUgc2lnbmVyIGFjY291bnQgbXVzdCBoYXZlIHN1ZmZpY2llbnQgZnVuZHMgZm9yIGEgZGVwb3NpdDggIHRvIGJlIHRha2VuLgkBLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgZm9yIHRoZSBhY2NvdW50IHRvIGJlIGNyZWF0ZWQuAJhFbWl0cyBgVG91Y2hlZGAgZXZlbnQgd2hlbiBzdWNjZXNzZnVsLhhyZWZ1bmQIAQhpZOABTFQ6OkFzc2V0SWRQYXJhbWV0ZXIAAShhbGxvd19idXJuyAEQYm9vbAAbNFkBUmV0dXJuIHRoZSBkZXBvc2l0IChpZiBhbnkpIG9mIGFuIGFzc2V0IGFjY291bnQgb3IgYSBjb25zdW1lciByZWZlcmVuY2UgKGlmIGFueSkgb2YgYW4gYWNjb3VudC4AaFRoZSBvcmlnaW4gbXVzdCBiZSBTaWduZWQuAD0BLSBgaWRgOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXNzZXQgZm9yIHdoaWNoIHRoZSBjYWxsZXIgd291bGQgbGlrZSB0aGUgZGVwb3NpdCwgIHJlZnVuZGVkLl0BLSBgYWxsb3dfYnVybmA6IElmIGB0cnVlYCB0aGVuIGFzc2V0cyBtYXkgYmUgZGVzdHJveWVkIGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSByZWZ1bmQuAEkBSXQgd2lsbCBmYWlsIHdpdGggZWl0aGVyIFtgRXJyb3I6OkNvbnRhaW5zSG9sZHNgXSBvciBbYEVycm9yOjpDb250YWluc0ZyZWV6ZXNgXSBpZtR0aGUgYXNzZXQgYWNjb3VudCBjb250YWlucyBob2xkcyBvciBmcmVlemVzIGluIHBsYWNlLgCcRW1pdHMgYFJlZnVuZGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuPHNldF9taW5fYmFsYW5jZQgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABLG1pbl9iYWxhbmNlxAEoVDo6QmFsYW5jZQAcMJRTZXRzIHRoZSBtaW5pbXVtIGJhbGFuY2Ugb2YgYW4gYXNzZXQuACEBT25seSB3b3JrcyBpZiB0aGVyZSBhcmVuJ3QgYW55IGFjY291bnRzIHRoYXQgYXJlIGhvbGRpbmcgdGhlIGFzc2V0IG9yIGlm4HRoZSBuZXcgdmFsdWUgb2YgYG1pbl9iYWxhbmNlYCBpcyBsZXNzIHRoYW4gdGhlIG9sZCBvbmUuAPxPcmlnaW4gbXVzdCBiZSBTaWduZWQgYW5kIHRoZSBzZW5kZXIgaGFzIHRvIGJlIHRoZSBPd25lciBvZiB0aGUsYXNzZXQgYGlkYC4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LsAtIGBtaW5fYmFsYW5jZWA6IFRoZSBuZXcgdmFsdWUgb2YgYG1pbl9iYWxhbmNlYC4A1EVtaXRzIGBBc3NldE1pbkJhbGFuY2VDaGFuZ2VkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuLHRvdWNoX290aGVyCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEMd2hvAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AHSyIQ3JlYXRlIGFuIGFzc2V0IGFjY291bnQgZm9yIGB3aG9gLgDAQSBkZXBvc2l0IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgc2lnbmVyIGFjY291bnQuAF0BLSBgb3JpZ2luYDogTXVzdCBiZSBTaWduZWQ7IHRoZSBzaWduZXIgYWNjb3VudCBtdXN0IGhhdmUgc3VmZmljaWVudCBmdW5kcyBmb3IgYSBkZXBvc2l0OCAgdG8gYmUgdGFrZW4uYQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBmb3IgdGhlIGFjY291bnQgdG8gYmUgY3JlYXRlZCwgdGhlIGFzc2V0IHN0YXR1cyBtdXN0KCAgYmUgbGl2ZS6MLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgY3JlYXRlZC4AmEVtaXRzIGBUb3VjaGVkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuMHJlZnVuZF9vdGhlcggBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AB40XQFSZXR1cm4gdGhlIGRlcG9zaXQgKGlmIGFueSkgb2YgYSB0YXJnZXQgYXNzZXQgYWNjb3VudC4gVXNlZnVsIGlmIHlvdSBhcmUgdGhlIGRlcG9zaXRvci4AXQFUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkIGFuZCBlaXRoZXIgdGhlIGFjY291bnQgb3duZXIsIGRlcG9zaXRvciwgb3IgYXNzZXQgYEFkbWluYC4gSW5hAW9yZGVyIHRvIGJ1cm4gYSBub24temVybyBiYWxhbmNlIG9mIHRoZSBhc3NldCwgdGhlIGNhbGxlciBtdXN0IGJlIHRoZSBhY2NvdW50IGFuZCBzaG91bGQ0dXNlIGByZWZ1bmRgLgAZAS0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IGZvciB0aGUgYWNjb3VudCBob2xkaW5nIGEgZGVwb3NpdC58LSBgd2hvYDogVGhlIGFjY291bnQgdG8gcmVmdW5kLgBJAUl0IHdpbGwgZmFpbCB3aXRoIGVpdGhlciBbYEVycm9yOjpDb250YWluc0hvbGRzYF0gb3IgW2BFcnJvcjo6Q29udGFpbnNGcmVlemVzYF0gaWbUdGhlIGFzc2V0IGFjY291bnQgY29udGFpbnMgaG9sZHMgb3IgZnJlZXplcyBpbiBwbGFjZS4AnEVtaXRzIGBSZWZ1bmRlZGAgZXZlbnQgd2hlbiBzdWNjZXNzZnVsLhRibG9jawgBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AB8oWQFEaXNhbGxvdyBmdXJ0aGVyIHVucHJpdmlsZWdlZCB0cmFuc2ZlcnMgb2YgYW4gYXNzZXQgYGlkYCB0byBhbmQgZnJvbSBhbiBhY2NvdW50IGB3aG9gLgA1AU9yaWdpbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIHNlbmRlciBzaG91bGQgYmUgdGhlIEZyZWV6ZXIgb2YgdGhlIGFzc2V0IGBpZGAuALgtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhY2NvdW50J3MgYXNzZXQulC0gYHdob2A6IFRoZSBhY2NvdW50IHRvIGJlIHVuYmxvY2tlZC4AQEVtaXRzIGBCbG9ja2VkYC4AOFdlaWdodDogYE8oMSlgMHRyYW5zZmVyX2FsbAwBCGlk4AFMVDo6QXNzZXRJZFBhcmFtZXRlcgABEGRlc3QAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKGtlZXBfYWxpdmXIARBib29sACBAHQFUcmFuc2ZlciB0aGUgZW50aXJlIHRyYW5zZmVyYWJsZSBiYWxhbmNlIGZyb20gdGhlIGNhbGxlciBhc3NldCBhY2NvdW50LgBZAU5PVEU6IFRoaXMgZnVuY3Rpb24gb25seSBhdHRlbXB0cyB0byB0cmFuc2ZlciBfdHJhbnNmZXJhYmxlXyBiYWxhbmNlcy4gVGhpcyBtZWFucyB0aGF0PQFhbnkgaGVsZCwgZnJvemVuLCBvciBtaW5pbXVtIGJhbGFuY2UgKHdoZW4gYGtlZXBfYWxpdmVgIGlzIGB0cnVlYCksIHdpbGwgbm90IGJlXQF0cmFuc2ZlcnJlZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJlc3VsdHMgaW4gYSBraWxsZWQgYWNjb3VudCxFAXlvdSBtaWdodCBuZWVkIHRvIHByZXBhcmUgdGhlIGFjY291bnQgYnkgcmVtb3ZpbmcgYW55IHJlZmVyZW5jZSBjb3VudGVycywgc3RvcmFnZUBkZXBvc2l0cywgZXRjLi4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFNpZ25lZC4AGQEtIGBpZGA6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBmb3IgdGhlIGFjY291bnQgaG9sZGluZyBhIGRlcG9zaXQuoC0gYGRlc3RgOiBUaGUgcmVjaXBpZW50IG9mIHRoZSB0cmFuc2Zlci5ZAS0gYGtlZXBfYWxpdmVgOiBBIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBgdHJhbnNmZXJfYWxsYCBvcGVyYXRpb24gc2hvdWxkIHNlbmQgYWxsTQEgIG9mIHRoZSBmdW5kcyB0aGUgYXNzZXQgYWNjb3VudCBoYXMsIGNhdXNpbmcgdGhlIHNlbmRlciBhc3NldCBhY2NvdW50IHRvIGJlIGtpbGxlZEUBICAoZmFsc2UpLCBvciB0cmFuc2ZlciBldmVyeXRoaW5nIGV4Y2VwdCBhdCBsZWFzdCB0aGUgbWluaW11bSBiYWxhbmNlLCB3aGljaCB3aWxs6CAgZ3VhcmFudGVlIHRvIGtlZXAgdGhlIHNlbmRlciBhc3NldCBhY2NvdW50IGFsaXZlICh0cnVlKS4wc2V0X3Jlc2VydmVzCAEIaWTgAUxUOjpBc3NldElkUGFyYW1ldGVyAAEgcmVzZXJ2ZXMdAQHIQm91bmRlZFZlYzxUOjpSZXNlcnZlRGF0YSwgQ29uc3RVMzI8TUFYX1JFU0VSVkVTPj4AISTEU2V0cyB0aGUgdHJ1c3RlZCByZXNlcnZlIGluZm9ybWF0aW9uIG9mIGFuIGFzc2V0LgBVAU9yaWdpbiBtdXN0IGJlIHRoZSBPd25lciBvZiB0aGUgYXNzZXQgYGlkYC4gVGhlIG9yaWdpbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGNvbmZpZ3VyZWQlAWBDcmVhdGVPcmlnaW5gIG9yIGJlIHRoZSBzaWduZWQgYG93bmVyYCBjb25maWd1cmVkIGR1cmluZyBhc3NldCBjcmVhdGlvbi4AkC0gYGlkYDogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0LvAtIGByZXNlcnZlc2A6IFRoZSBmdWxsIGxpc3Qgb2YgdHJ1c3RlZCByZXNlcnZlcyBpbmZvcm1hdGlvbi4A1EVtaXRzIGBBc3NldE1pbkJhbGFuY2VDaGFuZ2VkYCBldmVudCB3aGVuIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuAQLHN0YWdpbmdfeGNtCHY1IGxvY2F0aW9uIExvY2F0aW9uAAAIARxwYXJlbnRzDAEIdTgAASBpbnRlcmlvcuQBJEp1bmN0aW9ucwAA5BAsc3RhZ2luZ194Y20IdjUkanVuY3Rpb25zJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBADoAUhBcmM8W0p1bmN0aW9uOyAxXT4AAQAIWDIEAAEBAUhBcmM8W0p1bmN0aW9uOyAyXT4AAgAIWDMEAAUBAUhBcmM8W0p1bmN0aW9uOyAzXT4AAwAIWDQEAAkBAUhBcmM8W0p1bmN0aW9uOyA0XT4ABAAIWDUEAA0BAUhBcmM8W0p1bmN0aW9uOyA1XT4ABQAIWDYEABEBAUhBcmM8W0p1bmN0aW9uOyA2XT4ABgAIWDcEABUBAUhBcmM8W0p1bmN0aW9uOyA3XT4ABwAIWDgEABkBAUhBcmM8W0p1bmN0aW9uOyA4XT4ACAAA6AAAAwEAAADsAOwQLHN0YWdpbmdfeGNtCHY1IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQAYAEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQIASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmvwAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4tAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmvwAURPcHRpb248TmV0d29ya0lkPgABDGtleRwBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAMAQh1OAAEADBHZW5lcmFsSW5kZXgEAMABEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAwBCHU4AAEQZGF0YQgBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZPgBGEJvZHlJZAABEHBhcnT8ASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEAPQBJE5ldHdvcmtJZAAJAADwBBhPcHRpb24EBFQB9AEIEE5vbmUAAAAQU29tZQQA9AAAAQAA9BAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24kTmV0d29ya0lkAAEgJEJ5R2VuZXNpcwQACAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyKAEMdTY0AAEoYmxvY2tfaGFzaAgBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADACBFdGhlcmV1bQQBIGNoYWluX2lktAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAA+BAMeGNtCHYzIGp1bmN0aW9uGEJvZHlJZAABKBBVbml0AAAAHE1vbmlrZXIEAHABHFt1ODsgNF0AAQAUSW5kZXgEAGABDHUzMgACACRFeGVjdXRpdmUAAwAkVGVjaG5pY2FsAAQALExlZ2lzbGF0aXZlAAUAIEp1ZGljaWFsAAYAHERlZmVuc2UABwA4QWRtaW5pc3RyYXRpb24ACAAgVHJlYXN1cnkACQAA/BAMeGNtCHYzIGp1bmN0aW9uIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudGABDHUzMgABACBGcmFjdGlvbggBDG5vbWABDHUzMgABFGRlbm9tYAEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9tYAEMdTMyAAEUZGVub21gAQx1MzIAAwBITW9yZVRoYW5Qcm9wb3J0aW9uCAEMbm9tYAEMdTMyAAEUZGVub21gAQx1MzIABAAAAQEAAAMCAAAA7AAFAQAAAwMAAADsAAkBAAADBAAAAOwADQEAAAMFAAAA7AARAQAAAwYAAADsABUBAAADBwAAAOwAGQEAAAMIAAAA7AAdAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEBBFMAAAQAJQEBGFZlYzxUPgAAIQEMNGFzc2V0c19jb21tb25gbG9jYWxfYW5kX2ZvcmVpZ25fYXNzZXRzXEZvcmVpZ25Bc3NldFJlc2VydmVEYXRhAAAIARxyZXNlcnZl4AEgTG9jYXRpb24AATB0ZWxlcG9ydGFibGXIARBib29sAAAlAQAAAiEBACkBDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQQQ2FsbAQEVAABDBhjcmVhdGUIAShhc3NldF9raW5k4AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRlLQEBJEZpeGVkVTEyOAAAEA0BSW5pdGlhbGl6ZSBhIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkYdXBkYXRlCAEoYXNzZXRfa2luZOABREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZS0BASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5k4AFEQm94PFQ6OkFzc2V0S2luZD4AAhAlAVJlbW92ZSBhbiBleGlzdGluZyBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLi0BDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50JEZpeGVkVTEyOAAABADEARB1MTI4AAAxAQxkcGFsbGV0X2NvbGxhdG9yX3NlbGVjdGlvbhhwYWxsZXQQQ2FsbAQEVAABJERzZXRfaW52dWxuZXJhYmxlcwQBDG5ld8wBRFZlYzxUOjpBY2NvdW50SWQ+AAA0MQFTZXQgdGhlIGxpc3Qgb2YgaW52dWxuZXJhYmxlIChmaXhlZCkgY29sbGF0b3JzLiBUaGVzZSBjb2xsYXRvcnMgbXVzdCBkbyBzb21l0HByZXBhcmF0aW9uLCBuYW1lbHkgdG8gaGF2ZSByZWdpc3RlcmVkIHNlc3Npb24ga2V5cy4AWQFUaGUgY2FsbCB3aWxsIHJlbW92ZSBhbnkgYWNjb3VudHMgdGhhdCBoYXZlIG5vdCByZWdpc3RlcmVkIGtleXMgZnJvbSB0aGUgc2V0LiBUaGF0IGlzLF0BaXQgaXMgbm9uLWF0b21pYzsgdGhlIGNhbGxlciBhY2NlcHRzIGFsbCBgQWNjb3VudElkYHMgcGFzc2VkIGluIGBuZXdgIF9pbmRpdmlkdWFsbHlfIGFzMQFhY2NlcHRhYmxlIEludnVsbmVyYWJsZXMsIGFuZCBpcyBub3QgcHJvcG9zaW5nIGEgX3NldF8gb2YgbmV3IEludnVsbmVyYWJsZXMuAFkBVGhpcyBjYWxsIGRvZXMgbm90IG1haW50YWluIG11dHVhbCBleGNsdXNpdml0eSBvZiBgSW52dWxuZXJhYmxlc2AgYW5kIGBDYW5kaWRhdGVzYC4gSXRhAWlzIHJlY29tbWVuZGVkIHRvIHVzZSBhIGJhdGNoIG9mIGBhZGRfaW52dWxuZXJhYmxlYCBhbmQgYHJlbW92ZV9pbnZ1bG5lcmFibGVgIGluc3RlYWQuIEFRAWBiYXRjaF9hbGxgIGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5mb3JjZSBhdG9taWNpdHkuIElmIGFueSBjYW5kaWRhdGVzIGFyZSBpbmNsdWRlZCBpbk0BYG5ld2AsIHRoZXkgc2hvdWxkIGJlIHJlbW92ZWQgd2l0aCBgcmVtb3ZlX2ludnVsbmVyYWJsZV9jYW5kaWRhdGVgIGFmdGVyIGV4ZWN1dGlvbi4AlE11c3QgYmUgY2FsbGVkIGJ5IHRoZSBgVXBkYXRlT3JpZ2luYC5Yc2V0X2Rlc2lyZWRfY2FuZGlkYXRlcwQBDG1heDgBDHUzMgABFFUBU2V0IHRoZSBpZGVhbCBudW1iZXIgb2Ygbm9uLWludnVsbmVyYWJsZSBjb2xsYXRvcnMuIElmIGxvd2VyaW5nIHRoaXMgbnVtYmVyLCB0aGVuIHRoZWEBbnVtYmVyIG9mIHJ1bm5pbmcgY29sbGF0b3JzIGNvdWxkIGJlIGhpZ2hlciB0aGFuIHRoaXMgZmlndXJlLiBBc2lkZSBmcm9tIHRoYXQgZWRnZSBjYXNlLDUBdGhlcmUgc2hvdWxkIGJlIG5vIG90aGVyIHdheSB0byBoYXZlIG1vcmUgY2FuZGlkYXRlcyB0aGFuIHRoZSBkZXNpcmVkIG51bWJlci4A0FRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBgVXBkYXRlT3JpZ2luYC5Ic2V0X2NhbmRpZGFjeV9ib25kBAEQYm9uZMQBMEJhbGFuY2VPZjxUPgACHHhTZXQgdGhlIGNhbmRpZGFjeSBib25kIGFtb3VudC4AUQFJZiB0aGUgY2FuZGlkYWN5IGJvbmQgaXMgaW5jcmVhc2VkIGJ5IHRoaXMgY2FsbCwgYWxsIGN1cnJlbnQgY2FuZGlkYXRlcyB3aGljaCBoYXZlIGFNAWRlcG9zaXQgbG93ZXIgdGhhbiB0aGUgbmV3IGJvbmQgd2lsbCBiZSBraWNrZWQgZnJvbSB0aGUgbGlzdCBhbmQgZ2V0IHRoZWlyIGRlcG9zaXRzFGJhY2suANBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgYFVwZGF0ZU9yaWdpbmAuVHJlZ2lzdGVyX2FzX2NhbmRpZGF0ZQADEEEBUmVnaXN0ZXIgdGhpcyBhY2NvdW50IGFzIGEgY29sbGF0b3IgY2FuZGlkYXRlLiBUaGUgYWNjb3VudCBtdXN0IChhKSBhbHJlYWR5IGhhdmUdAXJlZ2lzdGVyZWQgc2Vzc2lvbiBrZXlzIGFuZCAoYikgYmUgYWJsZSB0byByZXNlcnZlIHRoZSBgQ2FuZGlkYWN5Qm9uZGAuANxUaGlzIGNhbGwgaXMgbm90IGF2YWlsYWJsZSB0byBgSW52dWxuZXJhYmxlYCBjb2xsYXRvcnMuMGxlYXZlX2ludGVudAAEFFUBRGVyZWdpc3RlciBgb3JpZ2luYCBhcyBhIGNvbGxhdG9yIGNhbmRpZGF0ZS4gTm90ZSB0aGF0IHRoZSBjb2xsYXRvciBjYW4gb25seSBsZWF2ZSBvbg0Bc2Vzc2lvbiBjaGFuZ2UuIFRoZSBgQ2FuZGlkYWN5Qm9uZGAgd2lsbCBiZSB1bnJlc2VydmVkIGltbWVkaWF0ZWx5LgAZAVRoaXMgY2FsbCB3aWxsIGZhaWwgaWYgdGhlIHRvdGFsIG51bWJlciBvZiBjYW5kaWRhdGVzIHdvdWxkIGRyb3AgYmVsb3dcYE1pbkVsaWdpYmxlQ29sbGF0b3JzYC5AYWRkX2ludnVsbmVyYWJsZQQBDHdobwQBMFQ6OkFjY291bnRJZAAFEEUBQWRkIGEgbmV3IGFjY291bnQgYHdob2AgdG8gdGhlIGxpc3Qgb2YgYEludnVsbmVyYWJsZXNgIGNvbGxhdG9ycy4gYHdob2AgbXVzdCBoYXZlHQFyZWdpc3RlcmVkIHNlc3Npb24ga2V5cy4gSWYgYHdob2AgaXMgYSBjYW5kaWRhdGUsIHRoZXkgd2lsbCBiZSByZW1vdmVkLgDQVGhlIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGBVcGRhdGVPcmlnaW5gLkxyZW1vdmVfaW52dWxuZXJhYmxlBAEMd2hvBAEwVDo6QWNjb3VudElkAAYQYQFSZW1vdmUgYW4gYWNjb3VudCBgd2hvYCBmcm9tIHRoZSBsaXN0IG9mIGBJbnZ1bG5lcmFibGVzYCBjb2xsYXRvcnMuIGBJbnZ1bG5lcmFibGVzYCBtdXN0KGJlIHNvcnRlZC4A0FRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBgVXBkYXRlT3JpZ2luYC4sdXBkYXRlX2JvbmQEASxuZXdfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAHHF0BVXBkYXRlIHRoZSBjYW5kaWRhY3kgYm9uZCBvZiBjb2xsYXRvciBjYW5kaWRhdGUgYG9yaWdpbmAgdG8gYSBuZXcgYW1vdW50IGBuZXdfZGVwb3NpdGAuAEEBU2V0dGluZyBhIGBuZXdfZGVwb3NpdGAgdGhhdCBpcyBsb3dlciB0aGFuIHRoZSBjdXJyZW50IGRlcG9zaXQgd2hpbGUgYG9yaWdpbmAgaXPgb2NjdXB5aW5nIGEgdG9wLWBEZXNpcmVkQ2FuZGlkYXRlc2Agc2xvdCBpcyBub3QgYWxsb3dlZC4AWQFUaGlzIGNhbGwgd2lsbCBmYWlsIGlmIGBvcmlnaW5gIGlzIG5vdCBhIGNvbGxhdG9yIGNhbmRpZGF0ZSwgdGhlIHVwZGF0ZWQgYm9uZCBpcyBsb3dlchkBdGhhbiB0aGUgbWluaW11bSBjYW5kaWRhY3kgYm9uZCwgYW5kL29yIHRoZSBhbW91bnQgY2Fubm90IGJlIHJlc2VydmVkLkx0YWtlX2NhbmRpZGF0ZV9zbG90CAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgABGHRhcmdldAQBMFQ6OkFjY291bnRJZAAIHE0BVGhlIGNhbGxlciBgb3JpZ2luYCByZXBsYWNlcyBhIGNhbmRpZGF0ZSBgdGFyZ2V0YCBpbiB0aGUgY29sbGF0b3IgY2FuZGlkYXRlIGxpc3QgYnlVAXJlc2VydmluZyBgZGVwb3NpdGAuIFRoZSBhbW91bnQgYGRlcG9zaXRgIHJlc2VydmVkIGJ5IHRoZSBjYWxsZXIgbXVzdCBiZSBncmVhdGVyIHRoYW7gdGhlIGV4aXN0aW5nIGJvbmQgb2YgdGhlIHRhcmdldCBpdCBpcyB0cnlpbmcgdG8gcmVwbGFjZS4AWQFUaGlzIGNhbGwgd2lsbCBmYWlsIGlmIHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBhIGNvbGxhdG9yIGNhbmRpZGF0ZSBvciBpbnZ1bG5lcmFibGUsIHRoZVUBY2FsbGVyIGRvZXMgbm90IGhhdmUgcmVnaXN0ZXJlZCBzZXNzaW9uIGtleXMsIHRoZSB0YXJnZXQgaXMgbm90IGEgY29sbGF0b3IgY2FuZGlkYXRlLLxhbmQvb3IgdGhlIGBkZXBvc2l0YCBhbW91bnQgY2Fubm90IGJlIHJlc2VydmVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy41AQw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0EENhbGwEBFQAAQggc2V0X2tleXMIARBrZXlzOQEBHFQ6OktleXMAARRwcm9vZhgBHFZlYzx1OD4AACTkU2V0cyB0aGUgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlciB0byBga2V5c2AuHQFBbGxvd3MgYW4gYWNjb3VudCB0byBzZXQgaXRzIHNlc3Npb24ga2V5IHByaW9yIHRvIGJlY29taW5nIGEgdmFsaWRhdG9yLsBUaGlzIGRvZXNuJ3QgdGFrZSBlZmZlY3QgdW50aWwgdGhlIG5leHQgc2Vzc2lvbi4A0FRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIHNpZ25lZC4ANCMjIENvbXBsZXhpdHlZAS0gYE8oMSlgLiBBY3R1YWwgY29zdCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgbGVuZ3RoIG9mIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzICAgZml4ZWQuKHB1cmdlX2tleXMAATDIUmVtb3ZlcyBhbnkgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlci4AwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSBlaXRoZXIgYmVdAWNvbnZlcnRpYmxlIHRvIGEgdmFsaWRhdG9yIElEIHVzaW5nIHRoZSBjaGFpbidzIHR5cGljYWwgYWRkcmVzc2luZyBzeXN0ZW0gKHRoaXMgdXN1YWxseVEBbWVhbnMgYmVpbmcgYSBjb250cm9sbGVyIGFjY291bnQpIG9yIGRpcmVjdGx5IGNvbnZlcnRpYmxlIGludG8gYSB2YWxpZGF0b3IgSUQgKHdoaWNolHVzdWFsbHkgbWVhbnMgYmVpbmcgYSBzdGFzaCBhY2NvdW50KS4ANCMjIENvbXBsZXhpdHk9AS0gYE8oMSlgIGluIG51bWJlciBvZiBrZXkgdHlwZXMuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2aYICBgVDo6S2V5czo6a2V5X2lkcygpYCB3aGljaCBpcyBmaXhlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuOQEIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUsU2Vzc2lvbktleXMAAAQBEGF1cmE9AQHEPEF1cmEgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwAAPQEQRHNwX2NvbnNlbnN1c19hdXJhHHNyMjU1MTksYXBwX3NyMjU1MTkYUHVibGljAAAEAAgBPHNyMjU1MTk6OlB1YmxpYwAAQQEMZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWUYcGFsbGV0EENhbGwEBFQAARRUc3VzcGVuZF94Y21fZXhlY3V0aW9uAAEMSQFTdXNwZW5kcyBhbGwgWENNIGV4ZWN1dGlvbnMgZm9yIHRoZSBYQ01QIHF1ZXVlLCByZWdhcmRsZXNzIG9mIHRoZSBzZW5kZXIncyBvcmlnaW4uAKQtIGBvcmlnaW5gOiBNdXN0IHBhc3MgYENvbnRyb2xsZXJPcmlnaW5gLlByZXN1bWVfeGNtX2V4ZWN1dGlvbgACFLhSZXN1bWVzIGFsbCBYQ00gZXhlY3V0aW9ucyBmb3IgdGhlIFhDTVAgcXVldWUuAD0BTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGFuZ2UgdGhlIHN0YXR1cyBvZiB0aGUgaW4vb3V0IGJvdW5kIGNoYW5uZWxzLgCkLSBgb3JpZ2luYDogTXVzdCBwYXNzIGBDb250cm9sbGVyT3JpZ2luYC5gdXBkYXRlX3N1c3BlbmRfdGhyZXNob2xkBAEMbmV3OAEMdTMyAAMUSQFPdmVyd3JpdGVzIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggbXVzdCBiZSBpbiB0aGUgcXVldWUgZm9yIHRoZSBvdGhlciBzaWRlIHRvIGJleHRvbGQgdG8gc3VzcGVuZCB0aGVpciBzZW5kaW5nLgB0LSBgb3JpZ2luYDogTXVzdCBwYXNzIGBSb290YC7oLSBgbmV3YDogRGVzaXJlZCB2YWx1ZSBmb3IgYFF1ZXVlQ29uZmlnRGF0YS5zdXNwZW5kX3ZhbHVlYFR1cGRhdGVfZHJvcF90aHJlc2hvbGQEAQxuZXc4AQx1MzIABBRFAU92ZXJ3cml0ZXMgdGhlIG51bWJlciBvZiBwYWdlcyB3aGljaCBtdXN0IGJlIGluIHRoZSBxdWV1ZSBhZnRlciB3aGljaCB3ZSBkcm9wIGFueYhmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gdGhlIGNoYW5uZWwuAHQtIGBvcmlnaW5gOiBNdXN0IHBhc3MgYFJvb3RgLuwtIGBuZXdgOiBEZXNpcmVkIHZhbHVlIGZvciBgUXVldWVDb25maWdEYXRhLmRyb3BfdGhyZXNob2xkYFx1cGRhdGVfcmVzdW1lX3RocmVzaG9sZAQBDG5ldzgBDHUzMgAFFE0BT3ZlcndyaXRlcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIHRoZSBxdWV1ZSBtdXN0IGJlIHJlZHVjZWQgdG8gYmVmb3JlIGl0IHNpZ25hbHMBAXRoYXQgbWVzc2FnZSBzZW5kaW5nIG1heSByZWNvbW1lbmNlIGFmdGVyIGl0IGhhcyBiZWVuIHN1c3BlbmRlZC4AdC0gYG9yaWdpbmA6IE11c3QgcGFzcyBgUm9vdGAu9C0gYG5ld2A6IERlc2lyZWQgdmFsdWUgZm9yIGBRdWV1ZUNvbmZpZ0RhdGEucmVzdW1lX3RocmVzaG9sZGAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQEMKHBhbGxldF94Y20YcGFsbGV0EENhbGwEBFQAAUQQc2VuZAgBEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABHG1lc3NhZ2WVAQFUQm94PFZlcnNpb25lZFhjbTwoKT4+AAAAPHRlbGVwb3J0X2Fzc2V0cxABEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbTgBDHUzMgABSBEBVGVsZXBvcnQgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gc29tZSBkZXN0aW5hdGlvbiBjaGFpbi4AHQEqKlRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDogVXNlIGBsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0c2AgaW5zdGVhZC4qKgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYC4gVGhlIHdlaWdodCBsaW1pdCBmb3IgZmVlcyBpcyBub3QgcHJvdmlkZWQgYW5kIHRodXMgaXMgdW5saW1pdGVkLLR3aXRoIGFsbCBmZWVzIHRha2VuIGFzIG5lZWRlZCBmcm9tIHRoZSBhc3NldC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzEAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAJ4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4APQEqKlRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZDogVXNlIGBsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy4cZXhlY3V0ZQgBHG1lc3NhZ2XdAgG0Qm94PFZlcnNpb25lZFhjbTw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4+AAEobWF4X3dlaWdodNUBARhXZWlnaHQAAyDQRXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSBmcm9tIGEgbG9jYWwsIHNpZ25lZCwgb3JpZ2luLgBNAUFuIGV2ZW50IGlzIGRlcG9zaXRlZCBpbmRpY2F0aW5nIHdoZXRoZXIgYG1zZ2AgY291bGQgYmUgZXhlY3V0ZWQgY29tcGxldGVseSBvciBvbmx5KHBhcnRpYWxseS4AXQFObyBtb3JlIHRoYW4gYG1heF93ZWlnaHRgIHdpbGwgYmUgdXNlZCBpbiBpdHMgYXR0ZW1wdGVkIGV4ZWN1dGlvbi4gSWYgdGhpcyBpcyBsZXNzIHRoYW5BAXRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgdGhhdCB0aGUgbWVzc2FnZSBjb3VsZCB0YWtlIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIG5vfGV4ZWN1dGlvbiBhdHRlbXB0IHdpbGwgYmUgbWFkZS5EZm9yY2VfeGNtX3ZlcnNpb24IASBsb2NhdGlvbuABNEJveDxMb2NhdGlvbj4AARx2ZXJzaW9uOAEoWGNtVmVyc2lvbgAEGEkBRXh0b2xsIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIGNhbiBiZSBjb21tdW5pY2F0ZWQgd2l0aCB0aHJvdWdoIGEgcGFydGljdWxhcjx2ZXJzaW9uIG9mIFhDTS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7YLSBgbG9jYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdGhhdCBpcyBiZWluZyBkZXNjcmliZWQuEQEtIGB4Y21fdmVyc2lvbmA6IFRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYQ00gdGhhdCBgbG9jYXRpb25gIHN1cHBvcnRzLmRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uBAFEbWF5YmVfeGNtX3ZlcnNpb24JAwFIT3B0aW9uPFhjbVZlcnNpb24+AAUUWQFTZXQgYSBzYWZlIFhDTSB2ZXJzaW9uICh0aGUgdmVyc2lvbiB0aGF0IFhDTSBzaG91bGQgYmUgZW5jb2RlZCB3aXRoIGlmIHRoZSBtb3N0IHJlY2VudLR2ZXJzaW9uIGEgZGVzdGluYXRpb24gY2FuIGFjY2VwdCBpcyB1bmtub3duKS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi45AS0gYG1heWJlX3hjbV92ZXJzaW9uYDogVGhlIGRlZmF1bHQgWENNIGVuY29kaW5nIHZlcnNpb24sIG9yIGBOb25lYCB0byBkaXNhYmxlLnhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAYQOQFBc2sgYSBsb2NhdGlvbiB0byBub3RpZnkgdXMgcmVnYXJkaW5nIHRoZWlyIFhDTSB2ZXJzaW9uIGFuZCBhbnkgY2hhbmdlcyB0byBpdC4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi5ZAS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIHNob3VsZCBzdWJzY3JpYmUgZm9yIFhDTSB2ZXJzaW9uIG5vdGlmaWNhdGlvbnMugGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb25JAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAHGEkBUmVxdWlyZSB0aGF0IGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG5vdGlmeSB1cyByZWdhcmRpbmcgYW55IFhDTUB2ZXJzaW9uIGNoYW5nZXMuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uPQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBhcmUgY3VycmVudGx5IHN1YnNjcmliZWQgZm9yIFhDTSB2ZXJzaW9uqCAgbm90aWZpY2F0aW9ucyB3aGljaCB3ZSBubyBsb25nZXIgZGVzaXJlLnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzFAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0AAh4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzFAEQZGVzdEkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kCAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtOAEMdTMyAAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0AAlIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5AZm9yY2Vfc3VzcGVuc2lvbgQBJHN1c3BlbmRlZMgBEGJvb2wAChD0U2V0IG9yIHVuc2V0IHRoZSBnbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtAtIGBzdXNwZW5kZWRgOiBgdHJ1ZWAgdG8gc3VzcGVuZCwgYGZhbHNlYCB0byByZXN1bWUuPHRyYW5zZmVyX2Fzc2V0cxQBEGRlc3RJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbTgBDHUzMgABMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAALhF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWws0GRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLCBvciB0aHJvdWdoIHRlbGVwb3J0cy4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2Y1AWluZGV4IGBmZWVfYXNzZXRfaXRlbWAgKGhlbmNlIHJlZmVycmVkIHRvIGFzIGBmZWVzYCksIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yQQFgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0IGlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZdxvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAGEBYGFzc2V0c2AgKGV4Y2x1ZGluZyBgZmVlc2ApIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3Igb3RoZXJ3aXNlIGJlIHRlbGVwb3J0YWJsZbB0byBgZGVzdGAsIG5vIGxpbWl0YXRpb25zIGltcG9zZWQgb24gYGZlZXNgLk0BIC0gZm9yIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbiBjaGFpbiBhbmRNASAgIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvRCAgIGBiZW5lZmljaWFyeWAuYQEgLSBmb3IgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG8gYGRlc3RgIGNoYWluWQEgICB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5kIGRlcG9zaXQgdGhlbVAgICB0byBgYmVuZWZpY2lhcnlgLl0BIC0gZm9yIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlIHJlc2VydmVzXQEgICBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3RgIHRvIG1pbnTUICAgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5RASAtIGZvciB0ZWxlcG9ydHM6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG8gbWludC90ZWxlcG9ydLAgICBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uLQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFgyKFBhcmVudCxVASAgUGFyYWNoYWluKC4uKSlgIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgWDEoUGFyYWNoYWluKC4uKSlgIHRvIHNlbmRoICBmcm9tIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4wY2xhaW1fYXNzZXRzCAEYYXNzZXRz2QIBUEJveDxWZXJzaW9uZWRBc3NldHM+AAEsYmVuZWZpY2lhcnlJAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAMGFUBQ2xhaW1zIGFzc2V0cyB0cmFwcGVkIG9uIHRoaXMgcGFsbGV0IGJlY2F1c2Ugb2YgbGVmdG92ZXIgYXNzZXRzIGR1cmluZyBYQ00gZXhlY3V0aW9uLgCsLSBgb3JpZ2luYDogQW55b25lIGNhbiBjYWxsIHRoaXMgZXh0cmluc2ljLl0BLSBgYXNzZXRzYDogVGhlIGV4YWN0IGFzc2V0cyB0aGF0IHdlcmUgdHJhcHBlZC4gVXNlIHRoZSB2ZXJzaW9uIHRvIHNwZWNpZnkgd2hhdCB2ZXJzaW9umHdhcyB0aGUgbGF0ZXN0IHdoZW4gdGhleSB3ZXJlIHRyYXBwZWQuRQEtIGBiZW5lZmljaWFyeWA6IFRoZSBsb2NhdGlvbi9hY2NvdW50IHdoZXJlIHRoZSBjbGFpbWVkIGFzc2V0cyB3aWxsIGJlIGRlcG9zaXRlZC6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4cARBkZXN0SQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZAgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAVBhc3NldHNfdHJhbnNmZXJfdHlwZQ0DAURCb3g8VHJhbnNmZXJUeXBlPgABOHJlbW90ZV9mZWVzX2lkEQMBVEJveDxWZXJzaW9uZWRBc3NldElkPgABSGZlZXNfdHJhbnNmZXJfdHlwZQ0DAURCb3g8VHJhbnNmZXJUeXBlPgABSGN1c3RvbV94Y21fb25fZGVzdJUBAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQADcBVAVRyYW5zZmVyIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdXNpbmcgZXhwbGljaXQgdHJhbnNmZXJodHlwZXMgZm9yIGFzc2V0cyBhbmQgZmVlcy4AWQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG1heSBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLiBDYWxsZXIgbXVzdOxwcm92aWRlIHRoZSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgIHRvIGJlIHVzZWQgZm9yIGBhc3NldHNgOlEBIC0gYFRyYW5zZmVyVHlwZTo6TG9jYWxSZXNlcnZlYDogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OkRlc3RpbmF0aW9uUmVzZXJ2ZWA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OlJlbW90ZVJlc2VydmUocmVzZXJ2ZSlgOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gYHJlc2VydmVgYQEgICBjaGFpbiB0byBtb3ZlIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyVQEgICBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4gVHlwaWNhbGx5lCAgIHRoZSByZW1vdGUgYHJlc2VydmVgIGlzIEFzc2V0IEh1Yi5FASAtIGBUcmFuc2ZlclR5cGU6OlRlbGVwb3J0YDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0b+ggICBtaW50L3RlbGVwb3J0IGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuAFUBT24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLCBhcyB3ZWxsIGFzIGFueSBpbnRlcm1lZGlhcnkgaG9wcywgYEJ1eUV4ZWN1dGlvbmAgaXMgdXNlZCB0byEBYnV5IGV4ZWN1dGlvbiB1c2luZyB0cmFuc2ZlcnJlZCBgYXNzZXRzYCBpZGVudGlmaWVkIGJ5IGByZW1vdGVfZmVlc19pZGAuWQFNYWtlIHN1cmUgZW5vdWdoIG9mIHRoZSBzcGVjaWZpZWQgYHJlbW90ZV9mZWVzX2lkYCBhc3NldCBpcyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbGlzdGEBb2YgYGFzc2V0c2AuIGByZW1vdGVfZmVlc19pZGAgc2hvdWxkIGJlIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgLiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4ARQFgcmVtb3RlX2ZlZXNfaWRgIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zZmVyIHR5cGUgdGhhbiByZXN0IG9mIGBhc3NldHNgIGFuZCBjYW4gYmWcc3BlY2lmaWVkIHRocm91Z2ggYGZlZXNfdHJhbnNmZXJfdHlwZWAuAGEBVGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiB0byB0aGUgdHJhbnNmZXJyZWQgYXNzZXRzIG9uY2UgdGhleSByZWFjaEEBdGhlIGBkZXN0YCBjaGFpbi4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjdXN0b21feGNtX29uX2Rlc3RgIHBhcmFtZXRlciwgd2hpY2j8Y29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0byBleGVjdXRlIG9uIGBkZXN0YCBhcyBhIGZpbmFsIHN0ZXAufCAgVGhpcyBpcyB1c3VhbGx5IGFzIHNpbXBsZSBhczpRASAgYFhjbSh2ZWMhW0RlcG9zaXRBc3NldCB7IGFzc2V0czogV2lsZChBbGxDb3VudGVkKGFzc2V0cy5sZW4oKSkpLCBiZW5lZmljaWFyeSB9XSlgLDEBICBidXQgY291bGQgYmUgc29tZXRoaW5nIG1vcmUgZXhvdGljIGxpa2Ugc2VuZGluZyB0aGUgYGFzc2V0c2AgZXZlbiBmdXJ0aGVyLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tPQEgIHJlbGF5IHRvIHBhcmFjaGFpbiwgb3IgYChwYXJlbnRzOiAyLCAoR2xvYmFsQ29uc2Vuc3VzKC4uKSwgLi4pKWAgdG8gc2VuZCBmcm9t9CAgcGFyYWNoYWluIGFjcm9zcyBhIGJyaWRnZSB0byBhbm90aGVyIGVjb3N5c3RlbSBkZXN0aW5hdGlvbi5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuPQEtIGBhc3NldHNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGFzc2V0c2AuIQEtIGByZW1vdGVfZmVlc19pZGA6IE9uZSBvZiB0aGUgaW5jbHVkZWQgYGFzc2V0c2AgdG8gYmUgdXNlZCB0byBwYXkgZmVlcy5JAS0gYGZlZXNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGZlZXNgIGFzc2V0cy5ZAS0gYGN1c3RvbV94Y21fb25fZGVzdGA6IFRoZSBYQ00gdG8gYmUgZXhlY3V0ZWQgb24gYGRlc3RgIGNoYWluIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlWQEgIHRyYW5zZmVyLCB3aGljaCBhbHNvIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIHRoZSBhc3NldHMgb24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuUGFkZF9hdXRob3JpemVkX2FsaWFzCAEcYWxpYXNlckkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcZXhwaXJlcxUDASxPcHRpb248dTY0PgAOLF0BQXV0aG9yaXplIGFub3RoZXIgYGFsaWFzZXJgIGxvY2F0aW9uIHRvIGFsaWFzIGludG8gdGhlIGxvY2FsIGBvcmlnaW5gIG1ha2luZyB0aGlzIGNhbGwuKQFUaGUgYGFsaWFzZXJgIGlzIG9ubHkgYXV0aG9yaXplZCB1bnRpbCB0aGUgcHJvdmlkZWQgYGV4cGlyeWAgYmxvY2sgbnVtYmVyLkkBVGhlIGNhbGwgY2FuIGFsc28gYmUgdXNlZCBmb3IgYSBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYWxpYXMgaW4gb3JkZXIgdG8gdXBkYXRlIGl0c1hgZXhwaXJ5YCBibG9jayBudW1iZXIuAFEBVXN1YWxseSB1c2VmdWwgdG8gYWxsb3cgeW91ciBsb2NhbCBhY2NvdW50IHRvIGJlIGFsaWFzZWQgaW50byBmcm9tIGEgcmVtb3RlIGxvY2F0aW9u9GFsc28gdW5kZXIgeW91ciBjb250cm9sIChsaWtlIHlvdXIgYWNjb3VudCBvbiBhbm90aGVyIGNoYWluKS4AUQFXQVJOSU5HOiBtYWtlIHN1cmUgdGhlIGNhbGxlciBgb3JpZ2luYCAoeW91KSB0cnVzdHMgdGhlIGBhbGlhc2VyYCBsb2NhdGlvbiB0byBhY3QgaW5ZAXRoZWlyL3lvdXIgbmFtZS4gT25jZSBhdXRob3JpemVkIHVzaW5nIHRoaXMgY2FsbCwgdGhlIGBhbGlhc2VyYCBjYW4gZnJlZWx5IGltcGVyc29uYXRl1GBvcmlnaW5gIGluIFhDTSBwcm9ncmFtcyBleGVjdXRlZCBvbiB0aGUgbG9jYWwgY2hhaW4uXHJlbW92ZV9hdXRob3JpemVkX2FsaWFzBAEcYWxpYXNlckkBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AA8IXQFSZW1vdmUgYSBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYGFsaWFzZXJgIGZyb20gdGhlIGxpc3Qgb2YgbG9jYXRpb25zIHRoYXQgY2FuIGFsaWFzIGludG+QdGhlIGxvY2FsIGBvcmlnaW5gIG1ha2luZyB0aGlzIGNhbGwudHJlbW92ZV9hbGxfYXV0aG9yaXplZF9hbGlhc2VzABAISQFSZW1vdmUgYWxsIHByZXZpb3VzbHkgYXV0aG9yaXplZCBgYWxpYXNlcmBzIHRoYXQgY2FuIGFsaWFzIGludG8gdGhlIGxvY2FsIGBvcmlnaW5gRG1ha2luZyB0aGlzIGNhbGwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkBCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjMEAE0BAUR2Mzo6TXVsdGlMb2NhdGlvbgADAAhWNAQAYQEBMHY0OjpMb2NhdGlvbgAEAAhWNQQA4AEwdjU6OkxvY2F0aW9uAAUAAE0BECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9yUQEBJEp1bmN0aW9ucwAAUQEQDHhjbQh2MyRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEAFUBASBKdW5jdGlvbgABAAhYMggAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAgAIWDMMAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAwAIWDQQAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAEAAhYNRQAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ABQAIWDYYAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ABgAIWDccAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAHAAhYOCAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24AAFUBASBKdW5jdGlvbgAAVQEBIEp1bmN0aW9uAABVAQEgSnVuY3Rpb24ACAAAVQEQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAGABDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmtZAQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAgBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya1kBAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4tAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmtZAQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXkcASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQADAEIdTgABAAwR2VuZXJhbEluZGV4BADAARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgMAQh1OAABEGRhdGEIASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWT4ARhCb2R5SWQAARBwYXJ0/AEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBABdAQEkTmV0d29ya0lkAAkAAFkBBBhPcHRpb24EBFQBXQEBCBBOb25lAAAAEFNvbWUEAF0BAAABAABdARAMeGNtCHYzIGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAgBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcigBDHU2NAABKGJsb2NrX2hhc2gIASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAABhARAsc3RhZ2luZ194Y20IdjQgbG9jYXRpb24gTG9jYXRpb24AAAgBHHBhcmVudHMMAQh1OAABIGludGVyaW9yZQEBJEp1bmN0aW9ucwAAZQEQLHN0YWdpbmdfeGNtCHY0JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAaQEBSEFyYzxbSnVuY3Rpb247IDFdPgABAAhYMgQAeQEBSEFyYzxbSnVuY3Rpb247IDJdPgACAAhYMwQAfQEBSEFyYzxbSnVuY3Rpb247IDNdPgADAAhYNAQAgQEBSEFyYzxbSnVuY3Rpb247IDRdPgAEAAhYNQQAhQEBSEFyYzxbSnVuY3Rpb247IDVdPgAFAAhYNgQAiQEBSEFyYzxbSnVuY3Rpb247IDZdPgAGAAhYNwQAjQEBSEFyYzxbSnVuY3Rpb247IDddPgAHAAhYOAQAkQEBSEFyYzxbSnVuY3Rpb247IDhdPgAIAABpAQAAAwEAAABtAQBtARAsc3RhZ2luZ194Y20IdjQganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBABgAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrcQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQIASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmtxAQFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleLQBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrcQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V5HAEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAwBCHU4AAQAMEdlbmVyYWxJbmRleAQAwAEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoDAEIdTgAARBkYXRhCAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk+AEYQm9keUlkAAEQcGFydPwBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAdQEBJE5ldHdvcmtJZAAJAABxAQQYT3B0aW9uBARUAXUBAQgQTm9uZQAAABBTb21lBAB1AQAAAQAAdQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAgBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcigBDHU2NAABKGJsb2NrX2hhc2gIASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWS0AQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAB5AQAAAwIAAABtAQB9AQAAAwMAAABtAQCBAQAAAwQAAABtAQCFAQAAAwUAAABtAQCJAQAAAwYAAABtAQCNAQAAAwcAAABtAQCRAQAAAwgAAABtAQCVAQgMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAJkBAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAEQIBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BABdAgFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAAmQEMDHhjbQh2MwxYY20EEENhbGwAAAQAnQEBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAJ0BAAACoQEAoQEMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAClAQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAClAQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQApQEBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZLQBHFF1ZXJ5SWQAASByZXNwb25zZcUBASBSZXNwb25zZQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAEccXVlcmllcvEBAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5TQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHOlAQEsTXVsdGlBc3NldHMAARBkZXN0TQEBNE11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5k9QEBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N01QEBGFdlaWdodAABEGNhbGz5AQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBABRAQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAD9AQFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeU0BATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlAQIBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW50pQEBLE11bHRpQXNzZXRzAAEcbWF4aW1hbMgBEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZv/QEBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc60BAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACZAQEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACZAQEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABGHRpY2tldE0BATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQApQEBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAClAQEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADxAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/9AQFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAD9AQFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAFUBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya10BASROZXR3b3JrSWQAASxkZXN0aW5hdGlvblEBAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldK0BAShNdWx0aUFzc2V0AAEgdW5sb2NrZXJNAQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARh0YXJnZXRNAQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARRvd25lck0BATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldK0BAShNdWx0aUFzc2V0AAEYbG9ja2VyTQEBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBABNAQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7xAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAKUBEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACpAQE8VmVjPE11bHRpQXNzZXQ+AACpAQAAAq0BAK0BEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZLEBARxBc3NldElkAAEMZnVutQEBLEZ1bmdpYmlsaXR5AACxARAMeGNtCHYzKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQATQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEAAgBIFt1ODsgMzJdAAEAALUBEAx4Y20IdjMobXVsdGlhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQAwAEQdTEyOAAAACxOb25GdW5naWJsZQQAuQEBNEFzc2V0SW5zdGFuY2UAAQAAuQEQDHhjbQh2MyhtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADAARB1MTI4AAEAGEFycmF5NAQAcAEcW3U4OyA0XQACABhBcnJheTgEAL0BARxbdTg7IDhdAAMAHEFycmF5MTYEAMEBASBbdTg7IDE2XQAEABxBcnJheTMyBAAIASBbdTg7IDMyXQAFAAC9AQAAAwgAAAAMAMEBAAADEAAAAAwAxQEMDHhjbQh2MyBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQApQEBLE11bHRpQXNzZXRzAAEAPEV4ZWN1dGlvblJlc3VsdAQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AAIAHFZlcnNpb24EADgBOHN1cGVyOjpWZXJzaW9uAAMALFBhbGxldHNJbmZvBADZAQGYQm91bmRlZFZlYzxQYWxsZXRJbmZvLCBNYXhQYWxsZXRzSW5mbz4ABAA4RGlzcGF0Y2hSZXN1bHQEAOkBAThNYXliZUVycm9yQ29kZQAFAADJAQQYT3B0aW9uBARUAc0BAQgQTm9uZQAAABBTb21lBADNAQAAAQAAzQEAAAQIONEBANEBEAx4Y20IdjMYdHJhaXRzFEVycm9yAAGgIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwAwTG9jYXRpb25GdWxsAAQAVExvY2F0aW9uTm90SW52ZXJ0aWJsZQAFACRCYWRPcmlnaW4ABgA8SW52YWxpZExvY2F0aW9uAAcANEFzc2V0Tm90Rm91bmQACABURmFpbGVkVG9UcmFuc2FjdEFzc2V0AAkAPE5vdFdpdGhkcmF3YWJsZQAKAEhMb2NhdGlvbkNhbm5vdEhvbGQACwBURXhjZWVkc01heE1lc3NhZ2VTaXplAAwAWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQADQAkVHJhbnNwb3J0AA4AKFVucm91dGFibGUADwAwVW5rbm93bkNsYWltABAAOEZhaWxlZFRvRGVjb2RlABEAQE1heFdlaWdodEludmFsaWQAEgA4Tm90SG9sZGluZ0ZlZXMAEwAwVG9vRXhwZW5zaXZlABQAEFRyYXAEACgBDHU2NAAVAEBFeHBlY3RhdGlvbkZhbHNlABYAOFBhbGxldE5vdEZvdW5kABcAME5hbWVNaXNtYXRjaAAYAExWZXJzaW9uSW5jb21wYXRpYmxlABkAUEhvbGRpbmdXb3VsZE92ZXJmbG93ABoALEV4cG9ydEVycm9yABsAOFJlYW5jaG9yRmFpbGVkABwAGE5vRGVhbAAdAChGZWVzTm90TWV0AB4AJExvY2tFcnJvcgAfADBOb1Blcm1pc3Npb24AIAAoVW5hbmNob3JlZAAhADhOb3REZXBvc2l0YWJsZQAiAExVbmhhbmRsZWRYY21WZXJzaW9uACMASFdlaWdodExpbWl0UmVhY2hlZAQA1QEBGFdlaWdodAAkABxCYXJyaWVyACUATFdlaWdodE5vdENvbXB1dGFibGUAJgBERXhjZWVkc1N0YWNrTGltaXQAJwAA1QEMKHNwX3dlaWdodHMkd2VpZ2h0X3YyGFdlaWdodAAACAEgcmVmX3RpbWW0AQx1NjQAAShwcm9vZl9zaXpltAEMdTY0AADZAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAd0BBFMAAAQA5QEBGFZlYzxUPgAA3QEMDHhjbQh2MyhQYWxsZXRJbmZvAAAYARRpbmRleGABDHUzMgABEG5hbWXhAQGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZeEBAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yYAEMdTMyAAEUbWlub3JgAQx1MzIAARRwYXRjaGABDHUzMgAA4QEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADlAQAAAt0BAOkBDAx4Y20IdjM4TWF5YmVFcnJvckNvZGUAAQwcU3VjY2VzcwAAABRFcnJvcgQA7QEBjEJvdW5kZWRWZWM8dTgsIE1heERpc3BhdGNoRXJyb3JMZW4+AAEAOFRydW5jYXRlZEVycm9yBADtAQGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAgAA7QEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AADxAQQYT3B0aW9uBARUAU0BAQgQTm9uZQAAABBTb21lBABNAQAAAQAA9QEMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAA+QEMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkGAEcVmVjPHU4PgAA/QEMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb25NAQE0TXVsdGlMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAABAhAMeGNtCHYzKG11bHRpYXNzZXRATXVsdGlBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQApQEBLE11bHRpQXNzZXRzAAAAEFdpbGQEAAUCAThXaWxkTXVsdGlBc3NldAABAAAFAhAMeGNtCHYzKG11bHRpYXNzZXQ4V2lsZE11bHRpQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWSxAQEcQXNzZXRJZAABDGZ1bgkCATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQAYAEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlksQEBHEFzc2V0SWQAAQxmdW4JAgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnRgAQx1MzIAAwAACQIQDHhjbQh2MyhtdWx0aWFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAAANAgwMeGNtCHYzLFdlaWdodExpbWl0AAEIJFVubGltaXRlZAAAABxMaW1pdGVkBADVAQEYV2VpZ2h0AAEAABECDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAFQIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AABUCAAACGQIAGQIMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAB0CARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAAdAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAB0CARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlNQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVySQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cx0CARhBc3NldHMAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cx0CARhBc3NldHMAARBkZXN0YQEBIExvY2F0aW9uAAEMeGNtEQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdNUBARhXZWlnaHQAARBjYWxs+QEBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAZQEBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAE0CAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNRAgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlUQIBLEFzc2V0RmlsdGVyAAEQd2FudB0CARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c1ECASxBc3NldEZpbHRlcgABHHJlc2VydmVhAQEgTG9jYXRpb24AAQx4Y20RAgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMlAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEABECASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEABECASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzHQIBGEFzc2V0cwABGHRpY2tldGEBASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAB0CARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAB0CARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBABJAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQATQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBABtAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmt1AQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb25lAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbRECARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0JQIBFEFzc2V0AAEgdW5sb2NrZXJhAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldCUCARRBc3NldAABGHRhcmdldGEBASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0JQIBFEFzc2V0AAEUb3duZXJhAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0JQIBFEFzc2V0AAEYbG9ja2VyYQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3yAEQYm9vbAArACBTZXRUb3BpYwQACAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQAYQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbkkCAUBPcHRpb248TG9jYXRpb24+AC8AAB0CECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAIQIBKFZlYzxBc3NldD4AACECAAACJQIAJQIQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZCkCARxBc3NldElkAAEMZnVuLQIBLEZ1bmdpYmlsaXR5AAApAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABABhAQEgTG9jYXRpb24AAC0CECxzdGFnaW5nX3hjbQh2NBRhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQAwAEQdTEyOAAAACxOb25GdW5naWJsZQQAMQIBNEFzc2V0SW5zdGFuY2UAAQAAMQIQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADAARB1MTI4AAEAGEFycmF5NAQAcAEcW3U4OyA0XQACABhBcnJheTgEAL0BARxbdTg7IDhdAAMAHEFycmF5MTYEAMEBASBbdTg7IDE2XQAEABxBcnJheTMyBAAIASBbdTg7IDMyXQAFAAA1Agwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAB0CARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAOAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EADkCAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQA6QEBOE1heWJlRXJyb3JDb2RlAAUAADkCDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBPQIEUwAABABFAgEYVmVjPFQ+AAA9Agwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXhgAQx1MzIAARBuYW1lQQIBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVBAgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcmABDHUzMgABFG1pbm9yYAEMdTMyAAEUcGF0Y2hgAQx1MzIAAEECDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAARQIAAAI9AgBJAgQYT3B0aW9uBARUAWEBAQgQTm9uZQAAABBTb21lBABhAQAAAQAATQIMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbmEBASBMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AABRAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAB0CARhBc3NldHMAAAAQV2lsZAQAVQIBJFdpbGRBc3NldAABAABVAhAsc3RhZ2luZ194Y20IdjQUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkKQIBHEFzc2V0SWQAAQxmdW5ZAgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAGABDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZCkCARxBc3NldElkAAEMZnVuWQIBPFdpbGRGdW5naWJpbGl0eQABFGNvdW50YAEMdTMyAAMAAFkCECxzdGFnaW5nX3hjbQh2NBRhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAXQIMLHN0YWdpbmdfeGNtCHY1DFhjbQQQQ2FsbAAABABhAgFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAYQIAAAJlAgBlAgwsc3RhZ2luZ194Y20IdjUsSW5zdHJ1Y3Rpb24EEENhbGwAAdA0V2l0aGRyYXdBc3NldAQAaQIBGEFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAGkCARhBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAaQIBGEFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWS0ARxRdWVyeUlkAAEgcmVzcG9uc2WBAgEgUmVzcG9uc2UAAShtYXhfd2VpZ2h01QEBGFdlaWdodAABHHF1ZXJpZXKhAgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzaQIBGEFzc2V0cwABLGJlbmVmaWNpYXJ54AEgTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHNpAgEYQXNzZXRzAAEQZGVzdOABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodKUCAThPcHRpb248V2VpZ2h0PgABEGNhbGz5AQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBACpAgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnngASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEQZGVzdOABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWtAgEsQXNzZXRGaWx0ZXIAARB3YW50aQIBGEFzc2V0cwABHG1heGltYWzIARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZeABIExvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzrQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXNxAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAF0CASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAF0CASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzaQIBGEFzc2V0cwABGHRpY2tldOABIExvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAaQIBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQAaQIBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAKECAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBACFAgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm+pAgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBACpAgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAOwBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3Jr9AEkTmV0d29ya0lkAAEsZGVzdGluYXRpb27kAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtXQIBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRxAgEUQXNzZXQAASB1bmxvY2tlcuABIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXRxAgEUQXNzZXQAARh0YXJnZXTgASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0cQIBFEFzc2V0AAEUb3duZXLgASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRxAgEUQXNzZXQAARhsb2NrZXLgASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhd8gBEGJvb2wAKwAgU2V0VG9waWMEAAgBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAOABIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbqECAUBPcHRpb248TG9jYXRpb24+AC8AHFBheUZlZXMEARRhc3NldHECARRBc3NldAAwAEBJbml0aWF0ZVRyYW5zZmVyFAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzuQIBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbsgBEGJvb2wAARhhc3NldHPBAgHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtXQIBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbskCAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y21dAgEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHPNAgGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAAGkCECxzdGFnaW5nX3hjbQh2NRRhc3NldBhBc3NldHMAAAQAbQIBKFZlYzxBc3NldD4AAG0CAAACcQIAcQIQLHN0YWdpbmdfeGNtCHY1FGFzc2V0FEFzc2V0AAAIAQhpZHUCARxBc3NldElkAAEMZnVueQIBLEZ1bmdpYmlsaXR5AAB1AhAsc3RhZ2luZ194Y20IdjUUYXNzZXQcQXNzZXRJZAAABADgASBMb2NhdGlvbgAAeQIQLHN0YWdpbmdfeGNtCHY1FGFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBADAARB1MTI4AAAALE5vbkZ1bmdpYmxlBAB9AgE0QXNzZXRJbnN0YW5jZQABAAB9AhAsc3RhZ2luZ194Y20IdjUUYXNzZXQ0QXNzZXRJbnN0YW5jZQABGCRVbmRlZmluZWQAAAAUSW5kZXgEAMABEHUxMjgAAQAYQXJyYXk0BABwARxbdTg7IDRdAAIAGEFycmF5OAQAvQEBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwQEBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAgBIFt1ODsgMzJdAAUAAIECDCxzdGFnaW5nX3hjbQh2NSBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQAaQIBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEAIUCAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAA4AThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAkQIBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BADpAQE4TWF5YmVFcnJvckNvZGUABQAAhQIEGE9wdGlvbgQEVAGJAgEIEE5vbmUAAAAQU29tZQQAiQIAAAEAAIkCAAAECDiNAgCNAhAMeGNtCHY1GHRyYWl0cxRFcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAoAQx1NjQAFQBARXhwZWN0YXRpb25GYWxzZQAWADhQYWxsZXROb3RGb3VuZAAXADBOYW1lTWlzbWF0Y2gAGABMVmVyc2lvbkluY29tcGF0aWJsZQAZAFBIb2xkaW5nV291bGRPdmVyZmxvdwAaACxFeHBvcnRFcnJvcgAbADhSZWFuY2hvckZhaWxlZAAcABhOb0RlYWwAHQAoRmVlc05vdE1ldAAeACRMb2NrRXJyb3IAHwAwTm9QZXJtaXNzaW9uACAAKFVuYW5jaG9yZWQAIQA4Tm90RGVwb3NpdGFibGUAIgA0VG9vTWFueUFzc2V0cwAjAExVbmhhbmRsZWRYY21WZXJzaW9uACQASFdlaWdodExpbWl0UmVhY2hlZAQA1QEBGFdlaWdodAAlABxCYXJyaWVyACYATFdlaWdodE5vdENvbXB1dGFibGUAJwBERXhjZWVkc1N0YWNrTGltaXQAKAAAkQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGVAgRTAAAEAJ0CARhWZWM8VD4AAJUCDCxzdGFnaW5nX3hjbQh2NShQYWxsZXRJbmZvAAAYARRpbmRleGABDHUzMgABEG5hbWWZAgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZZkCAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yYAEMdTMyAAEUbWlub3JgAQx1MzIAARRwYXRjaGABDHUzMgAAmQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AACdAgAAApUCAKECBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAApQIEGE9wdGlvbgQEVAHVAQEIEE5vbmUAAAAQU29tZQQA1QEAAAEAAKkCDCxzdGFnaW5nX3hjbQh2NURRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABIHF1ZXJ5X2lktAEcUXVlcnlJZAABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AACtAhAsc3RhZ2luZ194Y20IdjUUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAGkCARhBc3NldHMAAAAQV2lsZAQAsQIBJFdpbGRBc3NldAABAACxAhAsc3RhZ2luZ194Y20IdjUUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkdQIBHEFzc2V0SWQAAQxmdW61AgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAGABDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZHUCARxBc3NldElkAAEMZnVutQIBPFdpbGRGdW5naWJpbGl0eQABFGNvdW50YAEMdTMyAAMAALUCECxzdGFnaW5nX3hjbQh2NRRhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAuQIEGE9wdGlvbgQEVAG9AgEIEE5vbmUAAAAQU29tZQQAvQIAAAEAAL0CECxzdGFnaW5nX3hjbQh2NRRhc3NldExBc3NldFRyYW5zZmVyRmlsdGVyAAEMIFRlbGVwb3J0BACtAgEsQXNzZXRGaWx0ZXIAAAA4UmVzZXJ2ZURlcG9zaXQEAK0CASxBc3NldEZpbHRlcgABADxSZXNlcnZlV2l0aGRyYXcEAK0CASxBc3NldEZpbHRlcgACAADBAgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAb0CBFMAAAQAxQIBGFZlYzxUPgAAxQIAAAK9AgDJAgQYT3B0aW9uBARUAeQBCBBOb25lAAAAEFNvbWUEAOQAAAEAAM0CDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB0QIEUwAABADVAgEYVmVjPFQ+AADRAgwsc3RhZ2luZ194Y20IdjUQSGludAABBDBBc3NldENsYWltZXIEASBsb2NhdGlvbuABIExvY2F0aW9uAAAAANUCAAAC0QIA2QIIDHhjbTxWZXJzaW9uZWRBc3NldHMAAQwIVjMEAKUBATx2Mzo6TXVsdGlBc3NldHMAAwAIVjQEAB0CASh2NDo6QXNzZXRzAAQACFY1BABpAgEodjU6OkFzc2V0cwAFAADdAggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAOECAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQA8QIBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BAD9AgFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAA4QIMDHhjbQh2MwxYY20EEENhbGwAAAQA5QIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAOUCAAAC6QIA6QIMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAClAQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAClAQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQApQEBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZLQBHFF1ZXJ5SWQAASByZXNwb25zZcUBASBSZXNwb25zZQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAEccXVlcmllcvEBAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5TQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHOlAQEsTXVsdGlBc3NldHMAARBkZXN0TQEBNE11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5k9QEBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N01QEBGFdlaWdodAABEGNhbGztAgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyYAEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZWABDHUzMgABMG1heF9jYXBhY2l0eWABDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50YAEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcmABDHUzMgABGHNlbmRlcmABDHUzMgABJHJlY2lwaWVudGABDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBABRAQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAD9AQFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeU0BATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlAQIBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW50pQEBLE11bHRpQXNzZXRzAAEcbWF4aW1hbMgBEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHMBAgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RNAQE0TXVsdGlMb2NhdGlvbgABDHhjbZkBARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZv/QEBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzAQIBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc60BAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADhAgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BADhAgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c6UBASxNdWx0aUFzc2V0cwABGHRpY2tldE0BATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEALQBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWS0ARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodNUBARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQApQEBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAClAQEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADxAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBADJAQFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAOkBAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/9AQFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXhgAQx1MzIAARBuYW1lGAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lGAEcVmVjPHU4PgABLGNyYXRlX21ham9yYAEMdTMyAAE8bWluX2NyYXRlX21pbm9yYAEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAD9AQFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAFUBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya10BASROZXR3b3JrSWQAASxkZXN0aW5hdGlvblEBAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y22ZAQEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldK0BAShNdWx0aUFzc2V0AAEgdW5sb2NrZXJNAQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARh0YXJnZXRNAQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0rQEBKE11bHRpQXNzZXQAARRvd25lck0BATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldK0BAShNdWx0aUFzc2V0AAEYbG9ja2VyTQEBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBABNAQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7xAQFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAO0CDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZBgBHFZlYzx1OD4AAPECDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQA9QIBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAPUCAAAC+QIA+QIMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAB0CARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAAdAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAB0CARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlNQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVySQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cx0CARhBc3NldHMAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cx0CARhBc3NldHMAARBkZXN0YQEBIExvY2F0aW9uAAEMeGNtEQIBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZPUBAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdNUBARhXZWlnaHQAARBjYWxs7QIBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAZQEBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAE0CAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNRAgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyeWEBASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlUQIBLEFzc2V0RmlsdGVyAAEQd2FudB0CARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c1ECASxBc3NldEZpbHRlcgABHHJlc2VydmVhAQEgTG9jYXRpb24AAQx4Y20RAgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyAAEQZGVzdGEBASBMb2NhdGlvbgABDHhjbRECARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzUQIBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMlAgEUQXNzZXQAATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAPECASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAPECASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzHQIBGEFzc2V0cwABGHRpY2tldGEBASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAB0CARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAB0CARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBABJAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAyQEBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvTQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQATQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBABtAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmt1AQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb25lAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbRECARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0JQIBFEFzc2V0AAEgdW5sb2NrZXJhAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldCUCARRBc3NldAABGHRhcmdldGEBASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0JQIBFEFzc2V0AAEUb3duZXJhAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0JQIBFEFzc2V0AAEYbG9ja2VyYQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3yAEQYm9vbAArACBTZXRUb3BpYwQACAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQAYQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdA0CASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbkkCAUBPcHRpb248TG9jYXRpb24+AC8AAP0CDCxzdGFnaW5nX3hjbQh2NQxYY20EEENhbGwAAAQAAQMBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAAEDAAACBQMABQMMLHN0YWdpbmdfeGNtCHY1LEluc3RydWN0aW9uBBBDYWxsAAHQNFdpdGhkcmF3QXNzZXQEAGkCARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABpAgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAGkCARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lktAEcUXVlcnlJZAABIHJlc3BvbnNlgQIBIFJlc3BvbnNlAAEobWF4X3dlaWdodNUBARhXZWlnaHQAARxxdWVyaWVyoQIBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c2kCARhBc3NldHMAASxiZW5lZmljaWFyeeABIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzaQIBGEFzc2V0cwABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmT1AQEoT3JpZ2luS2luZAABTGZhbGxiYWNrX21heF93ZWlnaHSlAgE4T3B0aW9uPFdlaWdodD4AARBjYWxs7QIBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcmABDHUzMgABQG1heF9tZXNzYWdlX3NpemVgAQx1MzIAATBtYXhfY2FwYWNpdHlgAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudGABDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3JgAQx1MzIAARhzZW5kZXJgAQx1MzIAASRyZWNpcGllbnRgAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQA5AFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c60CASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABEGRlc3TgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlrQIBLEFzc2V0RmlsdGVyAAEQd2FudGkCARhBc3NldHMAARxtYXhpbWFsyAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c60CASxBc3NldEZpbHRlcgABHHJlc2VydmXgASBMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHOtAgEsQXNzZXRGaWx0ZXIAARBkZXN04AEgTG9jYXRpb24AAQx4Y21dAgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb6kCAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c60CASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzcQIBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0DQIBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBAD9AgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BAD9AgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c2kCARhBc3NldHMAARh0aWNrZXTgASBMb2NhdGlvbgAYABBUcmFwBAC0AQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lktAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHTVAQEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAGkCARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAGkCARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAChAgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAhQIBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBADpAQE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4YAEMdTMyAAEQbmFtZRgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZRgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcmABDHUzMgABPG1pbl9jcmF0ZV9taW5vcmABDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAqQIBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBADsASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya/QBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9u5AFASW50ZXJpb3JMb2NhdGlvbgABDHhjbV0CARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0cQIBFEFzc2V0AAEgdW5sb2NrZXLgASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0cQIBFEFzc2V0AAEYdGFyZ2V04AEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldHECARRBc3NldAABFG93bmVy4AEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0cQIBFEFzc2V0AAEYbG9ja2Vy4AEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXfIARBib29sACsAIFNldFRvcGljBAAIASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBADgASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQNAgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW6hAgFAT3B0aW9uPExvY2F0aW9uPgAvABxQYXlGZWVzBAEUYXNzZXRxAgEUQXNzZXQAMABASW5pdGlhdGVUcmFuc2ZlchQBLGRlc3RpbmF0aW9u4AEgTG9jYXRpb24AASxyZW1vdGVfZmVlc7kCAWxPcHRpb248QXNzZXRUcmFuc2ZlckZpbHRlcj4AATxwcmVzZXJ2ZV9vcmlnaW7IARBib29sAAEYYXNzZXRzwQIB4EJvdW5kZWRWZWM8QXNzZXRUcmFuc2ZlckZpbHRlciwgTWF4QXNzZXRUcmFuc2ZlckZpbHRlcnM+AAEocmVtb3RlX3hjbV0CARxYY208KCk+ADEAREV4ZWN1dGVXaXRoT3JpZ2luCAFEZGVzY2VuZGFudF9vcmlnaW7JAgFgT3B0aW9uPEludGVyaW9yTG9jYXRpb24+AAEMeGNt/QIBJFhjbTxDYWxsPgAyACBTZXRIaW50cwQBFGhpbnRzzQIBhEJvdW5kZWRWZWM8SGludCwgSGludE51bVZhcmlhbnRzPgAzAAAJAwQYT3B0aW9uBARUATgBCBBOb25lAAAAEFNvbWUEADgAAAEAAA0DEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQASQEBRFZlcnNpb25lZExvY2F0aW9uAAMAABEDCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABDAhWMwQAsQEBLHYzOjpBc3NldElkAAMACFY0BAApAgEsdjQ6OkFzc2V0SWQABAAIVjUEAHUCASx2NTo6QXNzZXRJZAAFAAAVAwQYT3B0aW9uBARUASgBCBBOb25lAAAAEFNvbWUEACgAAAEAABkDDEhjdW11bHVzX3BhbGxldF94Y20YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQMMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXg4ASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZTgBJFBhZ2VJbmRleAABFGluZGV4OAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdNUBARhXZWlnaHQAATR4RXhlY3V0ZSBhbiBvdmVyd2VpZ2h0IG1lc3NhZ2UuAE0BVGVtcG9yYXJ5IHByb2Nlc3NpbmcgZXJyb3JzIHdpbGwgYmUgcHJvcGFnYXRlZCB3aGVyZWFzIHBlcm1hbmVudCBlcnJvcnMgYXJlIHRyZWF0ZWRUYXMgc3VjY2VzcyBjb25kaXRpb24uAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLjUBLSBgbWVzc2FnZV9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgYXJyaXZlZC49AS0gYHBhZ2VgOiBUaGUgcGFnZSBpbiB0aGUgcXVldWUgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgaXMgc2l0dGluZy4JAS0gYGluZGV4YDogVGhlIGluZGV4IGludG8gdGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkLlkBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCBhbGxvd2VkIHRvIGJlIGNvbnN1bWVkIGluIHRoZSBleGVjdXRpb25EICBvZiB0aGUgbWVzc2FnZS4A9EJlbmNobWFyayBjb21wbGV4aXR5IGNvbnNpZGVyYXRpb25zOiBPKGluZGV4ICsgd2VpZ2h0X2xpbWl0KS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQMIXGN1bXVsdXNfcHJpbWl0aXZlc19jb3JlWEFnZ3JlZ2F0ZU1lc3NhZ2VPcmlnaW4AAQwQSGVyZQAAABhQYXJlbnQAAQAcU2libGluZwQAnAEYUGFyYUlkAAIAACUDDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABIBRiYXRjaAQBFGNhbGxzKQMBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4LQMBDHUxNgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAE03FNlbmQgYSBjYWxsIHRocm91Z2ggYW4gaW5kZXhlZCBwc2V1ZG9ueW0gb2YgdGhlIHNlbmRlci4AVQFGaWx0ZXIgZnJvbSBvcmlnaW4gYXJlIHBhc3NlZCBhbG9uZy4gVGhlIGNhbGwgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYW4gb3JpZ2luIHdoaWNovHVzZSB0aGUgc2FtZSBmaWx0ZXIgYXMgdGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwuAEUBTk9URTogSWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYW55IGFjY291bnQtYmFzZWQgZmlsdGVyaW5nIGlzIG5vdCBob25vcmVkIChpLmUuYQFiZWNhdXNlIHlvdSBleHBlY3QgYHByb3h5YCB0byBoYXZlIGJlZW4gdXNlZCBwcmlvciBpbiB0aGUgY2FsbCBzdGFjayBhbmQgeW91IGRvIG5vdCB3YW50UQF0aGUgY2FsbCByZXN0cmljdGlvbnMgdG8gYXBwbHkgdG8gYW55IHN1Yi1hY2NvdW50cyksIHRoZW4gdXNlIGBhc19tdWx0aV90aHJlc2hvbGRfMWB8aW4gdGhlIE11bHRpc2lnIHBhbGxldCBpbnN0ZWFkLgD0Tk9URTogUHJpb3IgdG8gdmVyc2lvbiAqMTIsIHRoaXMgd2FzIGNhbGxlZCBgYXNfbGltaXRlZF9zdWJgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uJGJhdGNoX2FsbAQBFGNhbGxzKQMBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAjTsU2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzIGFuZCBhdG9taWNhbGx5IGV4ZWN1dGUgdGhlbS4hAVRoZSB3aG9sZSB0cmFuc2FjdGlvbiB3aWxsIHJvbGxiYWNrIGFuZCBmYWlsIGlmIGFueSBvZiB0aGUgY2FsbHMgZmFpbGVkLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLixkaXNwYXRjaF9hcwgBJGFzX29yaWdpbjEDAVRCb3g8VDo6UGFsbGV0c09yaWdpbj4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADGMhEaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgcHJvdmlkZWQgb3JpZ2luLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuLGZvcmNlX2JhdGNoBAEUY2FsbHMpAwF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAENHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMu1FVubGlrZSBgYmF0Y2hgLCBpdCBhbGxvd3MgZXJyb3JzIGFuZCB3b24ndCBpbnRlcnJ1cHQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAE0BSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLix3aXRoX3dlaWdodAgBEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h01QEBGFdlaWdodAAFGMREaXNwYXRjaCBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHNwZWNpZmllZCB3ZWlnaHQuAC0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhluFJvb3Qgb3JpZ2luIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4caWZfZWxzZQgBEG1haW4gAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEgZmFsbGJhY2sgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAZcFQFEaXNwYXRjaCBhIGZhbGxiYWNrIGNhbGwgaW4gdGhlIGV2ZW50IHRoZSBtYWluIGNhbGwgZmFpbHMgdG8gZXhlY3V0ZS6wTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4A5FRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGhlIGBtYWluYCBjYWxsLtRJZiB0aGUgYG1haW5gIGNhbGwgZmFpbHMsIHRoZSBgZmFsbGJhY2tgIGlzIGF0dGVtdGVkLhUBaWYgdGhlIGZhbGxiYWNrIGlzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLCB0aGUgd2VpZ2h0cyBvZiBib3RoIGNhbGxzJQFhcmUgYWNjdW11bGF0ZWQgYW5kIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1haW4gY2FsbCBlcnJvciBpcyBkZXBvc2l0ZWQuANxJbiB0aGUgZXZlbnQgb2YgYSBmYWxsYmFjayBmYWlsdXJlIHRoZSB3aG9sZSBjYWxsIGZhaWxzaHdpdGggdGhlIHdlaWdodHMgcmV0dXJuZWQuAEEBLSBgbWFpbmA6IFRoZSBtYWluIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC4gVGhpcyBpcyB0aGUgcHJpbWFyeSBhY3Rpb24gdG8gZXhlY3V0ZS49AS0gYGZhbGxiYWNrYDogVGhlIGZhbGxiYWNrIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZCBpbiBjYXNlIHRoZSBgbWFpbmAgY2FsbCBmYWlscy4ARCMjIERpc3BhdGNoIExvZ2ljQQEtIElmIHRoZSBvcmlnaW4gaXMgYHJvb3RgLCBib3RoIHRoZSBtYWluIGFuZCBmYWxsYmFjayBjYWxscyBhcmUgZXhlY3V0ZWQgd2l0aG91dHggIGFwcGx5aW5nIGFueSBvcmlnaW4gZmlsdGVycy5JAS0gSWYgdGhlIG9yaWdpbiBpcyBub3QgYHJvb3RgLCB0aGUgb3JpZ2luIGZpbHRlciBpcyBhcHBsaWVkIHRvIGJvdGggdGhlIGBtYWluYCBhbmRMICBgZmFsbGJhY2tgIGNhbGxzLgAsIyMgVXNlIENhc2VZAS0gU29tZSB1c2UgY2FzZXMgbWlnaHQgaW52b2x2ZSBzdWJtaXR0aW5nIGEgYGJhdGNoYCB0eXBlIGNhbGwgaW4gZWl0aGVyIG1haW4sIGZhbGxiYWNrKCAgb3IgYm90aC5QZGlzcGF0Y2hfYXNfZmFsbGlibGUIASRhc19vcmlnaW4xAwFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABxTIRGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHByb3ZpZGVkIG9yaWdpbi4AUQFBbG1vc3QgdGhlIHNhbWUgYXMgW2BQYWxsZXQ6OmRpc3BhdGNoX2FzYF0gYnV0IGZvcndhcmRzIGFueSBlcnJvciBvZiB0aGUgaW5uZXIgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQMAAAIgAC0DAAAFBAAxAwhkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZTBPcmlnaW5DYWxsZXIAASgYc3lzdGVtBAA1AwF0ZnJhbWVfc3lzdGVtOjpPcmlnaW48UnVudGltZT4AAAAsUG9sa2Fkb3RYY20EADkDAUhwYWxsZXRfeGNtOjpPcmlnaW4AHwAoQ3VtdWx1c1hjbQQAPQMBaGN1bXVsdXNfcGFsbGV0X3hjbTo6T3JpZ2luACAAGFBlb3BsZQQAQQMBbGluZGl2X3BhbGxldF9wZW9wbGU6Ok9yaWdpbgAzAChQcm9vZk9mSW5rBABNAwGoaW5kaXZfcGFsbGV0X3Byb29mX29mX2luazo6T3JpZ2luPFJ1bnRpbWU+ADUAEEdhbWUEAFEDAYhpbmRpdl9wYWxsZXRfZ2FtZTo6T3JpZ2luPFJ1bnRpbWU+ADcAFFNjb3JlBABVAwGMaW5kaXZfcGFsbGV0X3Njb3JlOjpPcmlnaW48UnVudGltZT4AOAAoUGVvcGxlTGl0ZQQAWQMBpGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZTo6T3JpZ2luPFJ1bnRpbWU+AD4AHE1lbWJlcnMEAF0DAXBpbmRpdl9wYWxsZXRfbWVtYmVyczo6T3JpZ2luAEMAHENvaW5hZ2UEAGEDAZRpbmRpdl9wYWxsZXRfY29pbmFnZTo6T3JpZ2luPFJ1bnRpbWU+AEQAADUDDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoJFJhd09yaWdpbgQkQWNjb3VudElkAQQBEBBSb290AAAAGFNpZ25lZAQABAEkQWNjb3VudElkAAEAEE5vbmUAAgAoQXV0aG9yaXplZAADAAA5AwwocGFsbGV0X3hjbRhwYWxsZXQYT3JpZ2luAAEIDFhjbQQA4AEgTG9jYXRpb24AAAAgUmVzcG9uc2UEAOABIExvY2F0aW9uAAEAAD0DDEhjdW11bHVzX3BhbGxldF94Y20YcGFsbGV0GE9yaWdpbgABCBRSZWxheQAAAEBTaWJsaW5nUGFyYWNoYWluBACcARhQYXJhSWQAAQAAQQMMTGluZGl2X3BhbGxldF9wZW9wbGUYcGFsbGV0GE9yaWdpbgABCEBQZXJzb25hbElkZW50aXR5BAAoAShQZXJzb25hbElkAAAANFBlcnNvbmFsQWxpYXMEAEUDAVhSZXZpc2VkQ29udGV4dHVhbEFsaWFzAAEAAEUDEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5WFJldmlzZWRDb250ZXh0dWFsQWxpYXMAAAwBIHJldmlzaW9uOAE0UmV2aXNpb25JbmRleAABEHJpbmc4ASRSaW5nSW5kZXgAAQhjYUkDATxDb250ZXh0dWFsQWxpYXMAAEkDEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5PENvbnRleHR1YWxBbGlhcwAACAEUYWxpYXMIARRBbGlhcwABHGNvbnRleHQIARxDb250ZXh0AABNAwxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQYT3JpZ2luBARUAAEMWEF1dGhvcml6ZWRBcHBseVdpdGhTaWcEAAQBMFQ6OkFjY291bnRJZAAAAERSZWZlcnJlZENhbmRpZGF0ZQQABAEwVDo6QWNjb3VudElkAAEAQEludml0ZWRDYW5kaWRhdGUEAAQBMFQ6OkFjY291bnRJZAACAABRAwxEaW5kaXZfcGFsbGV0X2dhbWUYcGFsbGV0GE9yaWdpbgQEVAABBBxJbnZpdGVkBAAEATBUOjpBY2NvdW50SWQAAAAAVQMMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQYT3JpZ2luBARUAAEESEFjY291bnRQYXJ0aWNpcGFudAQABAEwVDo6QWNjb3VudElkAAAAAFkDDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUYcGFsbGV0GE9yaWdpbgQEVAABBChMaXRlUGVyc29uBAAEATBUOjpBY2NvdW50SWQAAAAAXQMMUGluZGl2X3BhbGxldF9tZW1iZXJzGHBhbGxldBhPcmlnaW4AAQQsTWVtYmVyQWxpYXMIAAgBKElkZW50aWZpZXIAAEUDAVhSZXZpc2VkQ29udGV4dHVhbEFsaWFzAAAAAGEDDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQYT3JpZ2luBARUAWUDAQgQQ29pbggBHGNvaW5faWQEATBUOjpBY2NvdW50SWQAARBjb2luaQMBEENvaW4AAAAsVW5sb2FkVG9rZW4MATBhbGlhc19wcm9vZnNxAwGsQm91bmRlZFZlYzxQcm9vZk9mPFQ+LCBUOjpNYXhDb25zb2xpZGF0aW9uPgABKHByb3Zlbl9tc2cIASBbdTg7IDMyXQABDGZlZX0DASRVbmxvYWRGZWUAAQAAZQMIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUcUnVudGltZQAAAABpAwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0EENvaW4AAAgBFHZhbHVlbQMBJENvaW5WYWx1ZQABDGFnZS0DAQx1MTYAAG0DAAAFCQBxAwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUDBFMAAAQAeQMBGFZlYzxUPgAAdQMAAAMUAwAADAB5AwAAAnUDAH0DDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQkVW5sb2FkRmVlAAEIHFByZXBhaWQAAAAoRnJvbU91dHB1dAgBSGZlZV9yZWN5Y2xlcl92YWx1ZW0DASRDb2luVmFsdWUAAUhmZWVfcmVjeWNsZXJfaW5kZXg4ASRSaW5nSW5kZXgAAQAAgQMMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQQQ2FsbAQEVAABFFBhc19tdWx0aV90aHJlc2hvbGRfMQgBRG90aGVyX3NpZ25hdG9yaWVzzAFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAMFEBSW1tZWRpYXRlbHkgZGlzcGF0Y2ggYSBtdWx0aS1zaWduYXR1cmUgY2FsbCB1c2luZyBhIHNpbmdsZSBhcHByb3ZhbCBmcm9tIHRoZSBjYWxsZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4APQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gYXJlIHBhcnQgb2YgdGhlAQFtdWx0aS1zaWduYXR1cmUsIGJ1dCBkbyBub3QgcGFydGljaXBhdGUgaW4gdGhlIGFwcHJvdmFsIHByb2Nlc3MuiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4AuFJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkaXNwYXRjaGVkIHJlc3VsdC4ANCMjIENvbXBsZXhpdHkZAU8oWiArIEMpIHdoZXJlIFogaXMgdGhlIGxlbmd0aCBvZiB0aGUgY2FsbCBhbmQgQyBpdHMgZXhlY3V0aW9uIHdlaWdodC4gYXNfbXVsdGkUASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludIUDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAGcVQFSZWdpc3RlciBhcHByb3ZhbCBmb3IgYSBkaXNwYXRjaCB0byBiZSBtYWRlIGZyb20gYSBkZXRlcm1pbmlzdGljIGNvbXBvc2l0ZSBhY2NvdW50IGlm+GFwcHJvdmVkIGJ5IGEgdG90YWwgb2YgYHRocmVzaG9sZCAtIDFgIG9mIGBvdGhlcl9zaWduYXRvcmllc2AuALBJZiB0aGVyZSBhcmUgZW5vdWdoLCB0aGVuIGRpc3BhdGNoIHRoZSBjYWxsLgAtAVBheW1lbnQ6IGBEZXBvc2l0QmFzZWAgd2lsbCBiZSByZXNlcnZlZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgcGx1cz0BYHRocmVzaG9sZGAgdGltZXMgYERlcG9zaXRGYWN0b3JgLiBJdCBpcyByZXR1cm5lZCBvbmNlIHRoaXMgZGlzcGF0Y2ggaGFwcGVucyBvcjRpcyBjYW5jZWxsZWQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AVQEtIGB0aHJlc2hvbGRgOiBUaGUgdG90YWwgbnVtYmVyIG9mIGFwcHJvdmFscyBmb3IgdGhpcyBkaXNwYXRjaCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuQQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gY2FuIGFwcHJvdmUgdGhpc2xkaXNwYXRjaC4gTWF5IG5vdCBiZSBlbXB0eS5ZAS0gYG1heWJlX3RpbWVwb2ludGA6IElmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIHRoaXMgbXVzdCBiZSBgTm9uZWAuIElmIGl0IGlzUQFub3QgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIGl0IG11c3QgYmUgYFNvbWVgLCB3aXRoIHRoZSB0aW1lcG9pbnQgKGJsb2NrIG51bWJlciBhbmTUdHJhbnNhY3Rpb24gaW5kZXgpIG9mIHRoZSBmaXJzdCBhcHByb3ZhbCB0cmFuc2FjdGlvbi6ILSBgY2FsbGA6IFRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgAdAU5PVEU6IFVubGVzcyB0aGlzIGlzIHRoZSBmaW5hbCBhcHByb3ZhbCwgeW91IHdpbGwgZ2VuZXJhbGx5IHdhbnQgdG8gdXNlGQFgYXBwcm92ZV9hc19tdWx0aWAgaW5zdGVhZCwgc2luY2UgaXQgb25seSByZXF1aXJlcyBhIGhhc2ggb2YgdGhlIGNhbGwuAFkBUmVzdWx0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRpc3BhdGNoZWQgcmVzdWx0IGlmIGB0aHJlc2hvbGRgIGlzIGV4YWN0bHkgYDFgLiBPdGhlcndpc2VVAW9uIHN1Y2Nlc3MsIHJlc3VsdCBpcyBgT2tgIGFuZCB0aGUgcmVzdWx0IGZyb20gdGhlIGludGVyaW9yIGNhbGwsIGlmIGl0IHdhcyBleGVjdXRlZCzcbWF5IGJlIGZvdW5kIGluIHRoZSBkZXBvc2l0ZWQgYE11bHRpc2lnRXhlY3V0ZWRgIGV2ZW50LgA0IyMgQ29tcGxleGl0eVAtIGBPKFMgKyBaICsgQ2FsbClgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLiEBLSBPbmUgY2FsbCBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oWilgIHdoZXJlIGBaYCBpcyB0eC1sZW4uvC0gT25lIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhTKWAu1C0gVXAgdG8gb25lIGJpbmFyeSBzZWFyY2ggYW5kIGluc2VydCAoYE8obG9nUyArIFMpYCku+C0gSS9POiAxIHJlYWQgYE8oUylgLCB1cCB0byAxIG11dGF0ZSBgTyhTKWAuIFVwIHRvIG9uZSByZW1vdmUuMC0gT25lIGV2ZW50LmwtIFRoZSB3ZWlnaHQgb2YgdGhlIGBjYWxsYC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuQGFwcHJvdmVfYXNfbXVsdGkUASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludIUDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gIASBbdTg7IDMyXQABKG1heF93ZWlnaHTVAQEYV2VpZ2h0AAJ4VQFSZWdpc3RlciBhcHByb3ZhbCBmb3IgYSBkaXNwYXRjaCB0byBiZSBtYWRlIGZyb20gYSBkZXRlcm1pbmlzdGljIGNvbXBvc2l0ZSBhY2NvdW50IGlm+GFwcHJvdmVkIGJ5IGEgdG90YWwgb2YgYHRocmVzaG9sZCAtIDFgIG9mIGBvdGhlcl9zaWduYXRvcmllc2AuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLswtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBleGVjdXRlZC4ANQFOT1RFOiBJZiB0aGlzIGlzIHRoZSBmaW5hbCBhcHByb3ZhbCwgeW91IHdpbGwgd2FudCB0byB1c2UgYGFzX211bHRpYCBpbnN0ZWFkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQuTQEtIFN0b3JhZ2U6IGluc2VydHMgb25lIGl0ZW0sIHZhbHVlIHNpemUgYm91bmRlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIGEgZGVwb3NpdBkBICB0YWtlbiBmb3IgaXRzIGxpZmV0aW1lIG9mIGBEZXBvc2l0QmFzZSArIHRocmVzaG9sZCAqIERlcG9zaXRGYWN0b3JgLjxjYW5jZWxfYXNfbXVsdGkQASR0aHJlc2hvbGQtAwEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXPMAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludIkDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoCAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uMHBva2VfZGVwb3NpdAwBJHRocmVzaG9sZC0DAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc8wBRFZlYzxUOjpBY2NvdW50SWQ+AAEkY2FsbF9oYXNoCAEgW3U4OyAzMl0ABDT0UG9rZSB0aGUgZGVwb3NpdCByZXNlcnZlZCBmb3IgYW4gZXhpc3RpbmcgbXVsdGlzaWcgb3BlcmF0aW9uLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3Igb2ZcdGhlIG11bHRpc2lnIG9wZXJhdGlvbi4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuABkBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgbmVlZGVkIGZvciB0aGlzIG11bHRpc2lnLj0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZSwgIG11bHRpc2lnLgUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdGhpcyBkZXBvc2l0IGlzIHJlc2VydmVkIGZvci4AjEVtaXRzIGBEZXBvc2l0UG9rZWRgIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoUDBBhPcHRpb24EBFQBiQMBCBBOb25lAAAAEFNvbWUEAIkDAAABAACJAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBOAAIARhoZWlnaHQ4ASxCbG9ja051bWJlcgABFGluZGV4OAEMdTMyAACNAwwscGFsbGV0X3N1ZG8YcGFsbGV0EENhbGwEBFQAARQQc3VkbwQBEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAENQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLlRzdWRvX3VuY2hlY2tlZF93ZWlnaHQIARBjYWxsIAF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABGHdlaWdodNUBARhXZWlnaHQAARQ1AUF1dGhlbnRpY2F0ZXMgdGhlIHN1ZG8ga2V5IGFuZCBkaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGBSb290YCBvcmlnaW4uLQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGWwU3VkbyB1c2VyIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLhxzZXRfa2V5BAEMbmV3AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AAghdAUF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgc3VkbyBrZXkgYW5kIHNldHMgdGhlIGdpdmVuIEFjY291bnRJZCAoYG5ld2ApIGFzIHRoZSBuZXcgc3VkbxBrZXkuHHN1ZG9fYXMIAQx3aG8AAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMQTQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgU2lnbmVkYCBvcmlnaW4gZnJvbUBhIGdpdmVuIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ocmVtb3ZlX2tleQAEDIRQZXJtYW5lbnRseSByZW1vdmVzIHRoZSBzdWRvIGtleS4AbCoqVGhpcyBjYW5ub3QgYmUgdW4tZG9uZS4qKgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6RAwwwcGFsbGV0X3Byb3h5GHBhbGxldBBDYWxsBARUAAEsFHByb3h5DAEQcmVhbAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZZUDAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGwgAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAkTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXNlZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoNAS0gYHJlYWxgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBwcm94eSB3aWxsIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZi5hAS0gYGZvcmNlX3Byb3h5X3R5cGVgOiBTcGVjaWZ5IHRoZSBleGFjdCBwcm94eSB0eXBlIHRvIGJlIHVzZWQgYW5kIGNoZWNrZWQgZm9yIHRoaXMgY2FsbC7QLSBgY2FsbGA6IFRoZSBjYWxsIHRvIGJlIG1hZGUgYnkgdGhlIGByZWFsYCBhY2NvdW50LiRhZGRfcHJveHkMASBkZWxlZ2F0ZQABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZZkDATBUOjpQcm94eVR5cGUAARRkZWxheTgBREJsb2NrTnVtYmVyRm9yPFQ+AAEkRQFSZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIgdGhhdCBpcyBhYmxlIHRvIG1ha2UgY2FsbHMgb24gaXRzIGJlaGFsZi4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoRAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byBtYWtlIGEgcHJveHku/C0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgYWxsb3dlZCBmb3IgdGhpcyBwcm94eSBhY2NvdW50Lk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4wcmVtb3ZlX3Byb3h5DAEgZGVsZWdhdGUAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAF0BV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYGNyZWF0ZV9wdXJlYCwgaG93ZXZlciBpZiBkb25lLCB0aGVuWQF0aGUgdW5yZXNlcnZlZCBmZWVzIHdpbGwgYmUgaW5hY2Nlc3NpYmxlLiAqKkFsbCBhY2Nlc3MgdG8gdGhpcyBhY2NvdW50IHdpbGwgYmUgbG9zdC4qKixjcmVhdGVfcHVyZQwBKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgABFGluZGV4LQMBDHUxNgAESDkBU3Bhd24gYSBmcmVzaCBuZXcgYWNjb3VudCB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb3RoZXJ3aXNlIGluYWNjZXNzaWJsZSwgYW5k/GluaXRpYWxpemUgaXQgd2l0aCBhIHByb3h5IG9mIGBwcm94eV90eXBlYCBmb3IgYG9yaWdpbmAgc2VuZGVyLgBsUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4uAFEBLSBgcHJveHlfdHlwZWA6IFRoZSB0eXBlIG9mIHRoZSBwcm94eSB0aGF0IHRoZSBzZW5kZXIgd2lsbCBiZSByZWdpc3RlcmVkIGFzIG92ZXIgdGhlTQFuZXcgYWNjb3VudC4gVGhpcyB3aWxsIGFsbW9zdCBhbHdheXMgYmUgdGhlIG1vc3QgcGVybWlzc2l2ZSBgUHJveHlUeXBlYCBwb3NzaWJsZSB0b3hhbGxvdyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eS5RAS0gYGluZGV4YDogQSBkaXNhbWJpZ3VhdGlvbiBpbmRleCwgaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZV0BdHJhbnNhY3Rpb24gKGUuZy4gd2l0aCBgdXRpbGl0eTo6YmF0Y2hgKS4gVW5sZXNzIHlvdSdyZSB1c2luZyBgYmF0Y2hgIHlvdSBwcm9iYWJseSBqdXN0QHdhbnQgdG8gdXNlIGAwYC5NAS0gYGRlbGF5YDogVGhlIGFubm91bmNlbWVudCBwZXJpb2QgcmVxdWlyZWQgb2YgdGhlIGluaXRpYWwgcHJveHkuIFdpbGwgZ2VuZXJhbGx5IGJlFHplcm8uAFEBRmFpbHMgd2l0aCBgRHVwbGljYXRlYCBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIGZyb20gdGhlmHNhbWUgc2VuZGVyLCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuAORGYWlscyBpZiB0aGVyZSBhcmUgaW5zdWZmaWNpZW50IGZ1bmRzIHRvIHBheSBmb3IgZGVwb3NpdC4ka2lsbF9wdXJlFAEcc3Bhd25lcgABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZZkDATBUOjpQcm94eVR5cGUAARRpbmRleC0DAQx1MTYAARhoZWlnaHRgAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleGABDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+wYGNyZWF0ZV9wdXJlYCB3aXRoIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4AVQEtIGBzcGF3bmVyYDogVGhlIGFjY291bnQgdGhhdCBvcmlnaW5hbGx5IGNhbGxlZCBgY3JlYXRlX3B1cmVgIHRvIGNyZWF0ZSB0aGlzIGFjY291bnQuVQEtIGBpbmRleGA6IFRoZSBkaXNhbWJpZ3VhdGlvbiBpbmRleCBvcmlnaW5hbGx5IHBhc3NlZCB0byBgY3JlYXRlX3B1cmVgLiBQcm9iYWJseSBgMGAuCQEtIGBwcm94eV90eXBlYDogVGhlIHByb3h5IHR5cGUgb3JpZ2luYWxseSBwYXNzZWQgdG8gYGNyZWF0ZV9wdXJlYC5FAS0gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIGNoYWluIHdoZW4gdGhlIGNhbGwgdG8gYGNyZWF0ZV9wdXJlYCB3YXMgcHJvY2Vzc2VkLlEBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgY3JlYXRlX3B1cmVgIHdhcyBwcm9jZXNzZWQuADUBRmFpbHMgd2l0aCBgTm9QZXJtaXNzaW9uYCBpbiBjYXNlIHRoZSBjYWxsZXIgaXMgbm90IGEgcHJldmlvdXNseSBjcmVhdGVkIHB1cmX4YWNjb3VudCB3aG9zZSBgY3JlYXRlX3B1cmVgIGNhbGwgaGFzIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4gYW5ub3VuY2UIARByZWFsAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAY8BQFQdWJsaXNoIHRoZSBoYXNoIG9mIGEgcHJveHktY2FsbCB0aGF0IHdpbGwgYmUgbWFkZSBpbiB0aGUgZnV0dXJlLgBdAVRoaXMgbXVzdCBiZSBjYWxsZWQgc29tZSBudW1iZXIgb2YgYmxvY2tzIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBgcHJveHlgIGlzIGF0dGVtcHRlZCUBaWYgdGhlIGRlbGF5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJveHkgcmVsYXRpb25zaGlwIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgARAU5vIG1vcmUgdGhhbiBgTWF4UGVuZGluZ2AgYW5ub3VuY2VtZW50cyBtYXkgYmUgbWFkZSBhdCBhbnkgb25lIHRpbWUuAAkBVGhpcyB3aWxsIHRha2UgYSBkZXBvc2l0IG9mIGBBbm5vdW5jZW1lbnREZXBvc2l0RmFjdG9yYCBhcyB3ZWxsIGFzGQFgQW5ub3VuY2VtZW50RGVwb3NpdEJhc2VgIGlmIHRoZXJlIGFyZSBubyBvdGhlciBwZW5kaW5nIGFubm91bmNlbWVudHMuACUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgcHJveHkgb2YgYHJlYWxgLgAsUGFyYW1ldGVyczoNAS0gYHJlYWxgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBwcm94eSB3aWxsIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZi4VAS0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIG1hZGUgYnkgdGhlIGByZWFsYCBhY2NvdW50LkxyZW1vdmVfYW5ub3VuY2VtZW50CAEQcmVhbAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoPAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAgosFJlbW92ZSB0aGUgZ2l2ZW4gYW5ub3VuY2VtZW50IG9mIGEgZGVsZWdhdGUuAGEBTWF5IGJlIGNhbGxlZCBieSBhIHRhcmdldCAocHJveGllZCkgYWNjb3VudCB0byByZW1vdmUgYSBjYWxsIHRoYXQgb25lIG9mIHRoZWlyIGRlbGVnYXRlcyUBKGBkZWxlZ2F0ZWApIGhhcyBhbm5vdW5jZWQgdGhleSB3YW50IHRvIGV4ZWN1dGUuIFRoZSBkZXBvc2l0IGlzIHJldHVybmVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOvQtIGBkZWxlZ2F0ZWA6IFRoZSBhY2NvdW50IHRoYXQgcHJldmlvdXNseSBhbm5vdW5jZWQgdGhlIGNhbGwuvC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIG1hZGUuPHByb3h5X2Fubm91bmNlZBABIGRlbGVnYXRlAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARByZWFsAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBllQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbCABfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ACSxNAURpc3BhdGNoIHRoZSBnaXZlbiBgY2FsbGAgZnJvbSBhbiBhY2NvdW50IHRoYXQgdGhlIHNlbmRlciBpcyBhdXRob3JpemVkIGZvciB0aHJvdWdoMGBhZGRfcHJveHlgLgCoUmVtb3ZlcyBhbnkgY29ycmVzcG9uZGluZyBhbm5vdW5jZW1lbnQocykuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4wcG9rZV9kZXBvc2l0AAogSQFQb2tlIC8gQWRqdXN0IGRlcG9zaXRzIG1hZGUgZm9yIHByb3hpZXMgYW5kIGFubm91bmNlbWVudHMgYmFzZWQgb24gY3VycmVudCB2YWx1ZXMuDQFUaGlzIGNhbiBiZSB1c2VkIGJ5IGFjY291bnRzIHRvIHBvc3NpYmx5IGxvd2VyIHRoZWlyIGxvY2tlZCBhbW91bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuAIxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6VAwQYT3B0aW9uBARUAZkDAQgQTm9uZQAAABBTb21lBACZAwAAAQAAmQMIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUkUHJveHlUeXBlAAEYDEFueQAAACxOb25UcmFuc2ZlcgABACxDYW5jZWxQcm94eQACACBJZGVudGl0eQADAERJZGVudGl0eUp1ZGdlbWVudAAEACBDb2xsYXRvcgAFAACdAwxUaW5kaXZfcGFsbGV0X2lkZW50aXR5GHBhbGxldBBDYWxsBARUAAF4NGFkZF9yZWdpc3RyYXIEARxhY2NvdW50AAFQQWNjb3VudElkTG9va3VwT2Y8VD4AABx4QWRkIGEgcmVnaXN0cmFyIHRvIHRoZSBzeXN0ZW0uAPxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgVDo6UmVnaXN0cmFyT3JpZ2luYC4AqC0gYGFjY291bnRgOiB0aGUgYWNjb3VudCBvZiB0aGUgcmVnaXN0cmFyLgCURW1pdHMgYFJlZ2lzdHJhckFkZGVkYCBpZiBzdWNjZXNzZnVsLjBzZXRfaWRlbnRpdHkEARBpbmZvoQMBbEJveDxUOjpJZGVudGl0eUluZm9ybWF0aW9uPgABKCkBU2V0IGFuIGFjY291bnQncyBpZGVudGl0eSBpbmZvcm1hdGlvbiBhbmQgcmVzZXJ2ZSB0aGUgYXBwcm9wcmlhdGUgZGVwb3NpdC4AVQFJZiB0aGUgYWNjb3VudCBhbHJlYWR5IGhhcyBpZGVudGl0eSBpbmZvcm1hdGlvbiwgdGhlIGRlcG9zaXQgaXMgdGFrZW4gYXMgcGFydCBwYXltZW50UGZvciB0aGUgbmV3IGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AjC0gYGluZm9gOiBUaGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uAIhFbWl0cyBgSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwuIHNldF9zdWJzBAEQc3Vicx0EAWRWZWM8KFQ6OkFjY291bnRJZCwgRGF0YSk+AAIkjFNldCB0aGUgc3ViLWFjY291bnRzIG9mIHRoZSBzZW5kZXIuAFUBUGF5bWVudDogQW55IGFnZ3JlZ2F0ZSBiYWxhbmNlIHJlc2VydmVkIGJ5IHByZXZpb3VzIGBzZXRfc3Vic2AgY2FsbHMgd2lsbCBiZSByZXR1cm5lZC0BYW5kIGFuIGFtb3VudCBgU3ViQWNjb3VudERlcG9zaXRgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGVhY2ggaXRlbSBpbiBgc3Vic2AuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AsC0gYHN1YnNgOiBUaGUgaWRlbnRpdHkncyAobmV3KSBzdWItYWNjb3VudHMuOGNsZWFyX2lkZW50aXR5AAMgOQFDbGVhciBhbiBhY2NvdW50J3MgaWRlbnRpdHkgaW5mbyBhbmQgYWxsIHN1Yi1hY2NvdW50cyBhbmQgcmV0dXJuIGFsbCBkZXBvc2l0cy4A7FBheW1lbnQ6IEFsbCByZXNlcnZlZCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudCBhcmUgcmV0dXJuZWQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AmEVtaXRzIGBJZGVudGl0eUNsZWFyZWRgIGlmIHN1Y2Nlc3NmdWwuRHJlcXVlc3RfanVkZ2VtZW50CAEkcmVnX2luZGV4YAE4UmVnaXN0cmFySW5kZXgAARxtYXhfZmVlwAEwQmFsYW5jZU9mPFQ+AARAlFJlcXVlc3QgYSBqdWRnZW1lbnQgZnJvbSBhIHJlZ2lzdHJhci4AVQFQYXltZW50OiBBdCBtb3N0IGBtYXhfZmVlYCB3aWxsIGJlIHJlc2VydmVkIGZvciBwYXltZW50IHRvIHRoZSByZWdpc3RyYXIgaWYganVkZ2VtZW50GGdpdmVuLgA1AVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhUHJlZ2lzdGVyZWQgaWRlbnRpdHkuAB0BLSBgcmVnX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UganVkZ2VtZW50IGlzIHJlcXVlc3RlZC5VAS0gYG1heF9mZWVgOiBUaGUgbWF4aW11bSBmZWUgdGhhdCBtYXkgYmUgcGFpZC4gVGhpcyBzaG91bGQganVzdCBiZSBhdXRvLXBvcHVsYXRlZCBhczoAMGBgYG5vY29tcGlsZbhTZWxmOjpyZWdpc3RyYXJzKCkuZ2V0KHJlZ19pbmRleCkudW53cmFwKCkuZmVlDGBgYACkRW1pdHMgYEp1ZGdlbWVudFJlcXVlc3RlZGAgaWYgc3VjY2Vzc2Z1bC44Y2FuY2VsX3JlcXVlc3QEASRyZWdfaW5kZXg4AThSZWdpc3RyYXJJbmRleAAFKGhDYW5jZWwgYSBwcmV2aW91cyByZXF1ZXN0LgD4UGF5bWVudDogQSBwcmV2aW91c2x5IHJlc2VydmVkIGRlcG9zaXQgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4ANQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYVByZWdpc3RlcmVkIGlkZW50aXR5LgBFAS0gYHJlZ19pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBubyBsb25nZXIgcmVxdWVzdGVkLgCsRW1pdHMgYEp1ZGdlbWVudFVucmVxdWVzdGVkYCBpZiBzdWNjZXNzZnVsLhxzZXRfZmVlCAEUaW5kZXhgAThSZWdpc3RyYXJJbmRleAABDGZlZcABMEJhbGFuY2VPZjxUPgAGHBkBU2V0IHRoZSBmZWUgcmVxdWlyZWQgZm9yIGEganVkZ2VtZW50IHRvIGJlIHJlcXVlc3RlZCBmcm9tIGEgcmVnaXN0cmFyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIGFjY291bnSgb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBpbmRleCBpcyBgaW5kZXhgLgD0LSBgaW5kZXhgOiB0aGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBmZWUgaXMgdG8gYmUgc2V0LlQtIGBmZWVgOiB0aGUgbmV3IGZlZS44c2V0X2FjY291bnRfaWQIARRpbmRleGABOFJlZ2lzdHJhckluZGV4AAEMbmV3AAFQQWNjb3VudElkTG9va3VwT2Y8VD4ABxy8Q2hhbmdlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdHJhci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50oG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYGluZGV4YC4A9C0gYGluZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgZmVlIGlzIHRvIGJlIHNldC5wLSBgbmV3YDogdGhlIG5ldyBhY2NvdW50IElELihzZXRfZmllbGRzCAEUaW5kZXhgAThSZWdpc3RyYXJJbmRleAABGGZpZWxkcygBKQE8VDo6SWRlbnRpdHlJbmZvcm1hdGlvbiBhcyBJZGVudGl0eUluZm9ybWF0aW9uUHJvdmlkZXI+OjoKRmllbGRzSWRlbnRpZmllcgAIHKhTZXQgdGhlIGZpZWxkIGluZm9ybWF0aW9uIGZvciBhIHJlZ2lzdHJhci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50oG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYGluZGV4YC4A9C0gYGluZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgZmVlIGlzIHRvIGJlIHNldC4NAS0gYGZpZWxkc2A6IHRoZSBmaWVsZHMgdGhhdCB0aGUgcmVnaXN0cmFyIGNvbmNlcm5zIHRoZW1zZWx2ZXMgd2l0aC5EcHJvdmlkZV9qdWRnZW1lbnQQASRyZWdfaW5kZXhgAThSZWdpc3RyYXJJbmRleAABGHRhcmdldAABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkanVkZ2VtZW50JQQBXEp1ZGdlbWVudDxCYWxhbmNlT2Y8VD4+AAEgaWRlbnRpdHk8ARxUOjpIYXNoAAk8uFByb3ZpZGUgYSBqdWRnZW1lbnQgZm9yIGFuIGFjY291bnQncyBpZGVudGl0eS4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBhY2NvdW50sG9mIHRoZSByZWdpc3RyYXIgd2hvc2UgaW5kZXggaXMgYHJlZ19pbmRleGAuACEBLSBgcmVnX2luZGV4YDogdGhlIGluZGV4IG9mIHRoZSByZWdpc3RyYXIgd2hvc2UganVkZ2VtZW50IGlzIGJlaW5nIG1hZGUuVQEtIGB0YXJnZXRgOiB0aGUgYWNjb3VudCB3aG9zZSBpZGVudGl0eSB0aGUganVkZ2VtZW50IGlzIHVwb24uIFRoaXMgbXVzdCBiZSBhbiBhY2NvdW50dCAgd2l0aCBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuSQEtIGBqdWRnZW1lbnRgOiB0aGUganVkZ2VtZW50IG9mIHRoZSByZWdpc3RyYXIgb2YgaW5kZXggYHJlZ19pbmRleGAgYWJvdXQgYHRhcmdldGAuXQEtIGBpZGVudGl0eWA6IFRoZSBoYXNoIG9mIHRoZSBbYElkZW50aXR5SW5mb3JtYXRpb25Qcm92aWRlcmBdIGZvciB0aGF0IHRoZSBqdWRnZW1lbnQgaXMsICBwcm92aWRlZC4AsE5vdGU6IEp1ZGdlbWVudHMgZG8gbm90IGFwcGx5IHRvIGEgdXNlcm5hbWUuAJRFbWl0cyBgSnVkZ2VtZW50R2l2ZW5gIGlmIHN1Y2Nlc3NmdWwuNGtpbGxfaWRlbnRpdHkEARh0YXJnZXQAAVBBY2NvdW50SWRMb29rdXBPZjxUPgAKMEEBUmVtb3ZlIGFuIGFjY291bnQncyBpZGVudGl0eSBhbmQgc3ViLWFjY291bnQgaW5mb3JtYXRpb24gYW5kIHNsYXNoIHRoZSBkZXBvc2l0cy4AYQFQYXltZW50OiBSZXNlcnZlZCBiYWxhbmNlcyBmcm9tIGBzZXRfc3Vic2AgYW5kIGBzZXRfaWRlbnRpdHlgIGFyZSBzbGFzaGVkIGFuZCBoYW5kbGVkIGJ5RQFgU2xhc2hgLiBWZXJpZmljYXRpb24gcmVxdWVzdCBkZXBvc2l0cyBhcmUgbm90IHJldHVybmVkOyB0aGV5IHNob3VsZCBiZSBjYW5jZWxsZWSAbWFudWFsbHkgdXNpbmcgYGNhbmNlbF9yZXF1ZXN0YC4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuAFUBLSBgdGFyZ2V0YDogdGhlIGFjY291bnQgd2hvc2UgaWRlbnRpdHkgdGhlIGp1ZGdlbWVudCBpcyB1cG9uLiBUaGlzIG11c3QgYmUgYW4gYWNjb3VudHQgIHdpdGggYSByZWdpc3RlcmVkIGlkZW50aXR5LgCURW1pdHMgYElkZW50aXR5S2lsbGVkYCBpZiBzdWNjZXNzZnVsLhxhZGRfc3ViCAEMc3ViAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhpQMBEERhdGEACxysQWRkIHRoZSBnaXZlbiBhY2NvdW50IHRvIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW5hbWVfc3ViCAEMc3ViAAFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhpQMBEERhdGEADBDMQWx0ZXIgdGhlIGFzc29jaWF0ZWQgbmFtZSBvZiB0aGUgZ2l2ZW4gc3ViLWFjY291bnQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZFhzdWIgaWRlbnRpdHkgb2YgYHN1YmAuKHJlbW92ZV9zdWIEAQxzdWIAAVBBY2NvdW50SWRMb29rdXBPZjxUPgANHMBSZW1vdmUgdGhlIGdpdmVuIGFjY291bnQgZnJvbSB0aGUgc2VuZGVyJ3Mgc3Vicy4AXQFQYXltZW50OiBCYWxhbmNlIHJlc2VydmVkIGJ5IGEgcHJldmlvdXMgYHNldF9zdWJzYCBjYWxsIGZvciBvbmUgc3ViIHdpbGwgYmUgcmVwYXRyaWF0ZWQ4dG8gdGhlIHNlbmRlci4AYQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYSByZWdpc3RlcmVkWHN1YiBpZGVudGl0eSBvZiBgc3ViYC4gcXVpdF9zdWIADiiMUmVtb3ZlIHRoZSBzZW5kZXIgYXMgYSBzdWItYWNjb3VudC4AXQFQYXltZW50OiBCYWxhbmNlIHJlc2VydmVkIGJ5IGEgcHJldmlvdXMgYHNldF9zdWJzYCBjYWxsIGZvciBvbmUgc3ViIHdpbGwgYmUgcmVwYXRyaWF0ZWS0dG8gdGhlIHNlbmRlciAoKm5vdCogdGhlIG9yaWdpbmFsIGRlcG9zaXRvcikuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZDxzdXBlci1pZGVudGl0eS4ARQFOT1RFOiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgdXNlZCwgYnV0IGlzIHByb3ZpZGVkIGluIHRoZSBjYXNlIHRoYXQgdGhlIG5vbi0RAWNvbnRyb2xsZXIgb2YgYW4gYWNjb3VudCBpcyBtYWxpY2lvdXNseSByZWdpc3RlcmVkIGFzIGEgc3ViLWFjY291bnQuWGFkZF91c2VybmFtZV9hdXRob3JpdHkMASRhdXRob3JpdHkAAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHN1ZmZpeBgBHFZlYzx1OD4AAShhbGxvY2F0aW9uOAEMdTMyAA8UVQFBZGQgYW4gYEFjY291bnRJZGAgd2l0aCBwZXJtaXNzaW9uIHRvIGdyYW50IHVzZXJuYW1lcyB3aXRoIGEgZ2l2ZW4gYHN1ZmZpeGAgYXBwZW5kZWQuAEUBVGhlIGF1dGhvcml0eSBjYW4gZ3JhbnQgdXAgdG8gYGFsbG9jYXRpb25gIHVzZXJuYW1lcy4gVG8gdG9wIHVwIHRoZSBhbGxvY2F0aW9uIG9ySQFjaGFuZ2UgdGhlIGFjY291bnQgdXNlZCB0byBncmFudCB1c2VybmFtZXMsIHRoaXMgY2FsbCBjYW4gYmUgdXNlZCB3aXRoIHRoZSB1cGRhdGVkzHBhcmFtZXRlcnMgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLmRyZW1vdmVfdXNlcm5hbWVfYXV0aG9yaXR5CAEYc3VmZml4GAEcVmVjPHU4PgABJGF1dGhvcml0eQABUEFjY291bnRJZExvb2t1cE9mPFQ+ABAExFJlbW92ZSBgYXV0aG9yaXR5YCBmcm9tIHRoZSB1c2VybmFtZSBhdXRob3JpdGllcy5Ac2V0X3VzZXJuYW1lX2ZvchABDHdobwABUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgdXNlcm5hbWUYARxWZWM8dTg+AAEkc2lnbmF0dXJlKQQBcE9wdGlvbjxUOjpPZmZjaGFpblNpZ25hdHVyZT4AATh1c2VfYWxsb2NhdGlvbsgBEGJvb2wAETQNAVNldCB0aGUgdXNlcm5hbWUgZm9yIGB3aG9gLiBNdXN0IGJlIGNhbGxlZCBieSBhIHVzZXJuYW1lIGF1dGhvcml0eS4AWQFJZiBgdXNlX2FsbG9jYXRpb25gIGlzIHNldCwgdGhlIGF1dGhvcml0eSBtdXN0IGhhdmUgYSB1c2VybmFtZSBhbGxvY2F0aW9uIGF2YWlsYWJsZSB0b0UBc3BlbmQuIE90aGVyd2lzZSwgdGhlIGF1dGhvcml0eSB3aWxsIG5lZWQgdG8gcHV0IHVwIGEgZGVwb3NpdCBmb3IgcmVnaXN0ZXJpbmcgdGhlJHVzZXJuYW1lLgCwVXNlcnMgY2FuIGVpdGhlciBwcmUtc2lnbiB0aGVpciB1c2VybmFtZXMgb3JIYWNjZXB0IHRoZW0gbGF0ZXIuADxVc2VybmFtZXMgbXVzdDrYICAtIE9ubHkgY29udGFpbiBsb3dlcmNhc2UgQVNDSUkgY2hhcmFjdGVycyBvciBkaWdpdHMuNQEgIC0gV2hlbiBjb21iaW5lZCB3aXRoIHRoZSBzdWZmaXggb2YgdGhlIGlzc3VpbmcgYXV0aG9yaXR5IGJlIF9sZXNzIHRoYW5fIHRoZWAgICAgYE1heFVzZXJuYW1lTGVuZ3RoYC48YWNjZXB0X3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEgxNAUFjY2VwdCBhIGdpdmVuIHVzZXJuYW1lIHRoYXQgYW4gYGF1dGhvcml0eWAgZ3JhbnRlZC4gVGhlIGNhbGwgbXVzdCBpbmNsdWRlIHRoZSBmdWxsVQF1c2VybmFtZSwgYXMgaW4gYHVzZXJuYW1lLnN1ZmZpeGAuIEF1dGhvcml0aWVzIGNhbm5vdCBncmFudCB1c2VybmFtZXMgdG8gcGVvcGxlLCBvbmx5UHRvIHJlZ3VsYXIgYWNjb3VudHMuXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEwxhAVJlbW92ZSBhbiBleHBpcmVkIHVzZXJuYW1lIGFwcHJvdmFsLiBUaGUgdXNlcm5hbWUgd2FzIGFwcHJvdmVkIGJ5IGFuIGF1dGhvcml0eSBidXQgbmV2ZXJVAWFjY2VwdGVkIGJ5IHRoZSB1c2VyIGFuZCBtdXN0IG5vdyBiZSBiZXlvbmQgaXRzIGV4cGlyYXRpb24uIFRoZSBjYWxsIG11c3QgaW5jbHVkZSB0aGWcZnVsbCB1c2VybmFtZSwgYXMgaW4gYHVzZXJuYW1lLnN1ZmZpeGAuUHNldF9wcmltYXJ5X3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AFAxFAVNldCBhIGdpdmVuIHVzZXJuYW1lIGFzIHRoZSBwcmltYXJ5LiBUaGUgdXNlcm5hbWUgc2hvdWxkIGluY2x1ZGUgdGhlIHN1ZmZpeC4gT25seVkBcmVndWxhciBhY2NvdW50cyBjYW4gc2V0IHRoZWlyIHByaW1hcnkgdXNlcm5hbWUsIGFzIHBlb3BsZSBjYW4gb25seSBoYXZlIG9uZSB1c2VybmFtZSyQZ3JhbnRlZCB0aHJvdWdoIGEgc3lzdGVtIGFsbG9jYXRpb24uPHVuYmluZF91c2VybmFtZQQBIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABUMWQFTdGFydCB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBhIHVzZXJuYW1lIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIHVuYmluZGluZyB1c2VybmFtZXMgbWFwLiEBT25jZSB0aGUgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQsIHRoZSB1c2VybmFtZSBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nwFtyZW1vdmVfdXNlcm5hbWVdKGNyYXRlOjpDYWxsOjpyZW1vdmVfdXNlcm5hbWUpLjxyZW1vdmVfdXNlcm5hbWUEASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAWCGEBUGVybWFuZW50bHkgZGVsZXRlIGEgdXNlcm5hbWUgd2hpY2ggaGFzIGJlZW4gdW5iaW5kaW5nIGZvciBsb25nZXIgdGhhbiB0aGUgZ3JhY2UgcGVyaW9kLkkBQ2FsbGVyIGlzIHJlZnVuZGVkIHRoZSBmZWUgaWYgdGhlIHVzZXJuYW1lIGV4cGlyZWQgYW5kIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLjRraWxsX3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AFwhdAUNhbGwgd2l0aCBbRm9yY2VPcmlnaW5dKGNyYXRlOjpDb25maWc6OkZvcmNlT3JpZ2luKSBwcml2aWxlZ2VzIHdoaWNoIGRlbGV0ZXMgYSB1c2VybmFtZaxhbmQgc2xhc2hlcyBhbnkgZGVwb3NpdCBhc3NvY2lhdGVkIHdpdGggaXQuVHNldF9wZXJzb25hbF9pZGVudGl0eQwBHGFjY291bnQEATBUOjpBY2NvdW50SWQAASRzaWduYXR1cmUtBAFQVDo6T2ZmY2hhaW5TaWduYXR1cmUAASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAYLF0BU2V0cyB0aGUgdXNlcm5hbWUgYW5kIG9uLWNoYWluIGFjY291bnQgZm9yIGEgcGVyc29uLCBhbG9uZyB3aXRoIGFuIGVtcHR5IGlkZW50aXR5IHdoaWNoYQFjYW4gb25seSBiZSBwb3B1bGF0ZWQgdXNpbmcgYW4gb3JhY2xlIHRocm91Z2ggdGhlIHNvY2lhbCBjcmVkZW50aWFsIHZlcmlmaWNhdGlvbiBzeXN0ZW0unFRoZSBjaG9zZW4gdXNlcm5hbWUgbXVzdCBiZSBkb21haW5sZXNzLgBJAVRoZSBzZW5kZXIgbXVzdCBzaWduIHRoZSBhbGlhcyB1c2luZyB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgb24tY2hhaW5sYWNjb3VudCB0byBwcm92ZSBvd25lcnNoaXAuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGNvbnRleHR1YWwgYWxpYXMgb2YgdGhlIHBlcnNvbiBhbmQgdGhlEQFzZW5kZXIgbXVzdCBub3QgaGF2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlaXIgaWRlbnRpdHkgYW5kIHVzZXJuYW1lLgCoRW1pdHMgYFBlcnNvbmFsSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwujHN1Ym1pdF9wZXJzb25hbF9jcmVkZW50aWFsX2V2aWRlbmNlBAEoY3JlZGVudGlhbD0EARhTb2NpYWwAGRgNAU9wZW4gYSBjYXNlIGZvciBhbiBvcmFjbGUgdG8ganVkZ2UgYSBzb2NpYWwgY3JlZGVudGlhbCBvZiBhIHBlcnNvbi4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY29udGV4dHVhbCBhbGlhcyBvZiB0aGUgcGVyc29uIGFuZCB0aGWcc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuAKBFbWl0cyBgRXZpZGVuY2VTdWJtaXR0ZWRgIGlmIHN1Y2Nlc3NmdWwuaHBlcnNvbmFsX2NyZWRlbnRpYWxfanVkZ2VkDAEYdGlja2V0OAFET3JhY2xlVGlja2V0T2Y8VD4AARxjb250ZXh0eAFASnVkZ2VtZW50Q29udGV4dAABJGp1ZGdlbWVudEEEATxPcmFjbGVKdWRnZW1lbnQAGghZAUNhbGxiYWNrIHRvIGVuZm9yY2UgdGhlIGp1ZGdlbWVudCBvZiBhIHNvY2lhbCBjcmVkZW50aWFsLiBUaGlzIGlzIHRvIGJlIGNhbGxlZCBvbmx5IGJ5gHRoZSBvcmFjbGUgdGhhdCBqdWRnZWQgdGhlIGNhc2UuXGNsZWFyX3BlcnNvbmFsX2lkZW50aXR5ABscUQFDbGVhciBhIHBlcnNvbidzIGlkZW50aXR5IGluZm8uIFRoZSBzZW5kZXIgbXVzdCBwYXkgYSBwZW5hbHR5IHRocm91Z2ggdGhlIGFzc29jaWF0ZWSgYWxpYXMgYWNjb3VudCBmb3IgcmVtb3ZpbmcgdGhlIGlkZW50aXR5LgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjb250ZXh0dWFsIGFsaWFzIG9mIHRoZSBwZXJzb24gYW5kIHRoZZxzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCBpZGVudGl0eS4AuEVtaXRzIGBJZGVudGl0eVBlcnNvbmFsQ2xlYXJlZGAgaWYgc3VjY2Vzc2Z1bC48cmVwb3J0X3VzZXJuYW1lBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AHBTsUmVwb3J0IGEgdXNlcm5hbWUgYXMgaW52YWxpZC9vZmZlbnNpdmUvd3JvbmcvYW55dGhpbmcgZWxzZS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGEgc2lnbmVkIGV4dHJpbnNpYy4AqC0gYHVzZXJuYW1lYDogVGhlIHVzZXJuYW1lIHRvIGJlIHJlcG9ydGVkLmByZXBvcnRlZF91c2VybmFtZV9qdWRnZWQMARh0aWNrZXQ4AWBjcmF0ZTo6T3JhY2xlVGlja2V0T2Y8VD4AARxjb250ZXh0eAFASnVkZ2VtZW50Q29udGV4dAABJGp1ZGdlbWVudEEEATxPcmFjbGVKdWRnZW1lbnQAHSTkR2l2ZW4ganVkZ2VtZW50IG9uIGEgcHJldmlvdXNseSByZXBvcnRlZCB1c2VybmFtZSBlaXRoZXI6kDEuIEluIGNhc2UgdXNlcm5hbWUgd2FzIGZvdW5kIHZhbGlkOrwtIHNsYXNoZXMgdGhlIGFtb3VudCBkZXBvc2l0ZWQgYnkgdGhlIHJlcG9ydGVyLPAtIGRvZXMgbm90aGluZyB0byB0aGUgaWRlbnRpdHkgYmVoaW5kIHRoZSByZXBvcnRlZCB1c2VybmFtZSyYMi4gSW4gY2FzZSB1c2VybmFtZSB3YXMgZm91bmQgaW52YWxpZDq4LSByZXR1cm5zIHRoZSBkZXBvc2l0ZWQgZnVuZHMgdG8gdGhlIHJlcG9ydGVyLMQtIGJhbnMgdGhlIGlkZW50aXR5IGJlaGluZCB0aGUgcmVwb3J0ZWQgdXNlcm5hbWUu/FNlcnZlcyBhcyBhIGNhbGxiYWNrIHVzZWQgdXBvbiBqdWRnZW1lbnQgcmVxdWVzdCB0byB0aGUgb3JhY2xlLqhNdXN0IG9ubHkgYmUgdXNlZCBieSB0aGUgc3RhdGVtZW50IG9yYWNsZS4EcElkZW50aXR5IHBhbGxldCBkZWNsYXJhdGlvbi6hAwxkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZRhwZW9wbGUwSWRlbnRpdHlJbmZvAAAoARxkaXNwbGF5pQMBEERhdGEAARRsZWdhbKUDARBEYXRhAAEMd2VipQMBEERhdGEAARhtYXRyaXilAwEQRGF0YQABFGVtYWlspQMBEERhdGEAATxwZ3BfZmluZ2VycHJpbnQZBAFAT3B0aW9uPFt1ODsgMjBdPgABFGltYWdlpQMBEERhdGEAARx0d2l0dGVypQMBEERhdGEAARhnaXRodWKlAwEQRGF0YQABHGRpc2NvcmSlAwEQRGF0YQAApQMMVGluZGl2X3BhbGxldF9pZGVudGl0eRR0eXBlcxBEYXRhAAGYEE5vbmUAAAAQUmF3MAQAqQMAAAEAEFJhdzEEAK0DAAACABBSYXcyBACxAwAAAwAQUmF3MwQAtQMAAAQAEFJhdzQEAHAAAAUAEFJhdzUEALkDAAAGABBSYXc2BAC9AwAABwAQUmF3NwQAwQMAAAgAEFJhdzgEAL0BAAAJABBSYXc5BADFAwAACgAUUmF3MTAEAMkDAAALABRSYXcxMQQAzQMAAAwAFFJhdzEyBADRAwAADQAUUmF3MTMEANUDAAAOABRSYXcxNAQA2QMAAA8AFFJhdzE1BADdAwAAEAAUUmF3MTYEAMEBAAARABRSYXcxNwQA4QMAABIAFFJhdzE4BADlAwAAEwAUUmF3MTkEAOkDAAAUABRSYXcyMAQAHAAAFQAUUmF3MjEEAO0DAAAWABRSYXcyMgQA8QMAABcAFFJhdzIzBAD1AwAAGAAUUmF3MjQEAPkDAAAZABRSYXcyNQQA/QMAABoAFFJhdzI2BAABBAAAGwAUUmF3MjcEAAUEAAAcABRSYXcyOAQACQQAAB0AFFJhdzI5BAANBAAAHgAUUmF3MzAEABEEAAAfABRSYXczMQQAFQQAACAAFFJhdzMyBAAIAAAhACxCbGFrZVR3bzI1NgQACAAAIgAYU2hhMjU2BAAIAAAjACRLZWNjYWsyNTYEAAgAACQALFNoYVRocmVlMjU2BAAIAAAlAACpAwAAAwAAAAAMAK0DAAADAQAAAAwAsQMAAAMCAAAADAC1AwAAAwMAAAAMALkDAAADBQAAAAwAvQMAAAMGAAAADADBAwAAAwcAAAAMAMUDAAADCQAAAAwAyQMAAAMKAAAADADNAwAAAwsAAAAMANEDAAADDAAAAAwA1QMAAAMNAAAADADZAwAAAw4AAAAMAN0DAAADDwAAAAwA4QMAAAMRAAAADADlAwAAAxIAAAAMAOkDAAADEwAAAAwA7QMAAAMVAAAADADxAwAAAxYAAAAMAPUDAAADFwAAAAwA+QMAAAMYAAAADAD9AwAAAxkAAAAMAAEEAAADGgAAAAwABQQAAAMbAAAADAAJBAAAAxwAAAAMAA0EAAADHQAAAAwAEQQAAAMeAAAADAAVBAAAAx8AAAAMABkEBBhPcHRpb24EBFQBHAEIEE5vbmUAAAAQU29tZQQAHAAAAQAAHQQAAAIhBAAhBAAABAgEpQMAJQQMVGluZGl2X3BhbGxldF9pZGVudGl0eRR0eXBlcyRKdWRnZW1lbnQEHEJhbGFuY2UBxAEgHFVua25vd24AAAAcRmVlUGFpZAQAxAEcQmFsYW5jZQABAChSZWFzb25hYmxlAAIAJEtub3duR29vZAADACRPdXRPZkRhdGUABAAoTG93UXVhbGl0eQAFACRFcnJvbmVvdXMABgAgRXh0ZXJuYWwABwAAKQQEGE9wdGlvbgQEVAEtBAEIEE5vbmUAAAAQU29tZQQALQQAAAEAAC0ECChzcF9ydW50aW1lOE11bHRpU2lnbmF0dXJlAAEQHEVkMjU1MTkEADEEAUhlZDI1NTE5OjpTaWduYXR1cmUAAAAcU3IyNTUxOQQAMQQBSHNyMjU1MTk6OlNpZ25hdHVyZQABABRFY2RzYQQANQQBQGVjZHNhOjpTaWduYXR1cmUAAgAMRXRoBAA1BAFYZWNkc2E6OktlY2Nha1NpZ25hdHVyZQADAAAxBAAAA0AAAAAMADUEAAADQQAAAAwAOQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AAA9BBQ0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSBpZGVudGl0eRhTb2NpYWwAAQwcVHdpdHRlcgQBIHVzZXJuYW1lOQQBEERhdGEAAAAYR2l0aHViBAEgdXNlcm5hbWU5BAEQRGF0YQABABxEaXNjb3JkBAE8ZGlzcGxheV9hbmRfdGFnOQQBEERhdGEAAgAAQQQQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkkSnVkZ2VtZW50AAEIFFRydXRoBABFBAEUVHJ1dGgAAAAgQ29udGVtcHQAAQAARQQQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkUVHJ1dGgAAQgQVHJ1ZQAAABRGYWxzZQABAABJBAxMaW5kaXZfcGFsbGV0X3Blb3BsZRhwYWxsZXQQQ2FsbAQEVAABHCx1bmRlcl9hbGlhcwQBEGNhbGwgAbRCb3g8PFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpSdW50aW1lQ2FsbD4AABAVAURpc3BhdGNoIGEgY2FsbCB1bmRlciBhbiBhbGlhcyB1c2luZyB0aGUgYGFjY291bnQgPC0+IGFsaWFzYCBtYXBwaW5nLgBFAVRoaXMgaXMgYSBjYWxsIHZlcnNpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBgQXNQZXJzb25hbEFsaWFzV2l0aEFjY291bnRgLiUBSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gaW5zdGVhZCB3aGVuIHN1aXRhYmxlLkRzZXRfYWxpYXNfYWNjb3VudAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAATRjYWxsX3ZhbGlkX2F0OAFEQmxvY2tOdW1iZXJGb3I8VD4AASQtAVRoaXMgdHJhbnNhY3Rpb24gaXMgcmVmdW5kZWQgaWYgc3VjY2Vzc2Z1bCBhbmQgbm8gYWxpYXMgd2FzIHByZXZpb3VzbHkgc2V0LgCwVGhlIGNhbGwgaXMgdmFsaWQgZnJvbSBgY2FsbF92YWxpZF9hdGAgdW50aWy8YGNhbGxfdmFsaWRfYXQgKyBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYC4dAWBhY2NvdW50X3NldHVwX3RpbWVfdG9sZXJhbmNlYCBpcyBhIGNvbnN0YW50IGF2YWlsYWJsZSBpbiB0aGUgbWV0YWRhdGEuACxQYXJhbWV0ZXJzOrgtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gc2V0IHRoZSBhbGlhcyBmb3IuAQEtIGBjYWxsX3ZhbGlkX2F0YDogVGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZSBjYWxsIGJlY29tZXMgdmFsaWQuTHVuc2V0X2FsaWFzX2FjY291bnQAAgQVAVJlbW92ZSB0aGUgbWFwcGluZyBmcm9tIGEgcGFydGljdWxhciBhbGlhcyB0byBpdHMgcmVnaXN0ZXJlZCBhY2NvdW50Lmhmb3JjZV9yZWNvZ25pemVfcGVyc29uaG9vZAQBGHBlb3BsZU0EAUBWZWM8TWVtYmVyT2Y8VD4+AAMY4FJlY29nbml6ZSBhIHNldCBvZiBwZW9wbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBjaGVja3MuAFEBVGhlIHBlb3BsZSBhcmUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgbGlzdCBvZiBrZXlzIGFuZCB3aWxsIGVhY2ggYmUgYXNzaWduZWQsIGlumG9yZGVyLCB0aGUgbmV4dCBhdmFpbGFibGUgcGVyc29uYWwgSUQuAMxUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcy5cc2V0X3BlcnNvbmFsX2lkX2FjY291bnQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAE0Y2FsbF92YWxpZF9hdDgBREJsb2NrTnVtYmVyRm9yPFQ+AAQ8aFNldCBhIHBlcnNvbmFsIGlkIGFjY291bnQuAE0BVGhlIGFjY291bnQgY2FuIHRoZW4gYmUgdXNlZCB0byBzaWduIHRyYW5zYWN0aW9ucyBvbiBiZWhhbGYgb2YgdGhlIHBlcnNvbmFsIGlkLCBhbmSkcHJvdmlkZSByZXBsYXkgcHJvdGVjdGlvbiB3aXRoIHRoZSBub25jZS4AUQFUaGlzIHRyYW5zYWN0aW9uIGlzIHJlZnVuZGVkIGlmIHN1Y2Nlc3NmdWwgYW5kIG5vIGFjY291bnQgd2FzIHByZXZpb3VzbHkgc2V0IGZvciB0aGUwcGVyc29uYWwgaWQuALBUaGUgY2FsbCBpcyB2YWxpZCBmcm9tIGBjYWxsX3ZhbGlkX2F0YCB1bnRpbLxgY2FsbF92YWxpZF9hdCArIGFjY291bnRfc2V0dXBfdGltZV90b2xlcmFuY2VgLh0BYGFjY291bnRfc2V0dXBfdGltZV90b2xlcmFuY2VgIGlzIGEgY29uc3RhbnQgYXZhaWxhYmxlIGluIHRoZSBtZXRhZGF0YS4ALFBhcmFtZXRlcnM6uC0gYGFjY291bnRgOiBUaGUgYWNjb3VudCB0byBzZXQgdGhlIGFsaWFzIGZvci4BAS0gYGNhbGxfdmFsaWRfYXRgOiBUaGUgYmxvY2sgbnVtYmVyIHdoZW4gdGhlIGNhbGwgYmVjb21lcyB2YWxpZC5kdW5zZXRfcGVyc29uYWxfaWRfYWNjb3VudAAFBHhVbnNldCB0aGUgcGVyc29uYWwgaWQgYWNjb3VudC5gY3JlYXRlX3Blb3BsZV9jb2xsZWN0aW9uAAYodENyZWF0ZSB0aGUgcGVvcGxlIGNvbGxlY3Rpb24uACkBVGhpcyBjYWxsIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGNvbGxlY3Rpb24gZG9lc24ndCBleGlzdCB5ZXQuIE9uY2UgY3JlYXRlZCyMdGhpcyBjYWxsIGNhbm5vdCBiZSBleGVjdXRlZCBhZ2Fpbi4A1FRoZSBjb2xsZWN0aW9uIGlzIGNyZWF0ZWQgd2l0aCBhIGZpeGVkIGNvbmZpZ3VyYXRpb246uC0gT3duZXI6IENvbmZpZ3VyZWQgdmlhIGBDb2xsZWN0aW9uT3duZXJgIHR5cGXALSBPbmJvYXJkaW5nIHNpemU6IGBQRU9QTEVfT05CT0FSRElOR19TSVpFYCAoMTApSC0gTW9kZTogYEZsZXhpYmxlYEwtIFJpbmcgc2l6ZTogYFIyZTlgBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLk0EAAACUQQAUQQMKHZlcmlmaWFibGU0cmluZ192cmZfaW1wbEBFbmNvZGVkUHVibGljS2V5AAAEAAgBVFt1ODsgUFVCTElDX0tFWV9TSVpFXQAAVQQMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQQQ2FsbAQEVAABRBB2b3RlCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAABHG9waW5pb25BBAEkSnVkZ2VtZW50AAAE4EZlZWxlc3Mgb24gc3VjY2VzcyAoZGV0ZXJtaW5lZCBvbmx5IGJ5IHRvcCB0aHJlZSBsaW5lcykuKGNsb3NlX2Nhc2UEAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEAKGNsZWFuX3ZvdGUIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEUdm90ZXIIARRBbGlhcwACDCUBT3JpZ2luIG11c3QgYmUgYE5vbmVgLiBUaGUgdHJhbnNhY3Rpb24gaXMgdmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYGEBd2hlbiB0aGUgc291cmNlIGlzIGxvY2FsIChlLmcuIGZyb20gdGhlIG9mZmNoYWluIHdvcmtlcikuIEZvciBleHRlcm5hbCB0cmFuc2FjdGlvbnMsIHVzZVBgY2xlYW5fdm90ZV9zaWduZWRgLiRyZWFwX2Nhc2UEAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAMAJGludGVydmVuZQgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgAARx2ZXJkaWN0QQQBJEp1ZGdlbWVudAAEAChjbGFpbV92b3RlBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAAFCCEBQSBwZXJzb24gY2xhaW1zIHRoZSBtb2IgY3JlZGl0IGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlY3Qgdm90ZSBvbiBhIGNhc2UuYFRoZSBjYXNlIG11c3QgYmUgYERvbmVgLjhwYXlvdXRfcmV3YXJkcwQBLGRlc3RpbmF0aW9uBAEwVDo6QWNjb3VudElkAAYECQFBIHBlcnNvbiBjb252ZXJ0cyB0aGVpciBjbGFpbWVkIG1vYiBjcmVkaXQgaW50byBhIGRpcmVjdCB0cmFuc2Zlci4sY2xhaW1fdm90ZXMEATBjYXNlX2luZGljZXNZBAE4VmVjPENhc2VJbmRleD4ABwg1AUEgcGVyc29uIGNsYWltcyBtdWx0aXBsZSBtb2IgY3JlZGl0cyBhc3NvY2lhdGVkIGEgY29ycmVjdCB2b3RlIG9uIGEgY2FzZS4gVGhlUGNhc2UgbXVzdCBiZSBgRG9uZWAuSHN0YXJ0X3BheW91dF9yb3VuZAAIAFhzY2hlZHVsZV9wYXlvdXRfcm91bmRzDAEYYW1vdW50xAEwQmFsYW5jZU9mPFQ+AAEUY291bnQ4AQx1MzIAARhwZXJpb2Q4AURCbG9ja051bWJlckZvcjxUPgAJAFhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlBAEUaW5kZXg4AQx1MzIACgAwY2xhaW1fY3JlZGl0AAsAMGNsZWFuX3BvaW50cwgBFHJvdW5kOAEoUm91bmRJbmRleAABFHZvdGVyCAEUQWxpYXMADABAZm9yY2VfcmlwZW5fY2FzZQQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgADQAodG91Y2hfY2FzZQQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgADgBQY2xlYXJfdm90aW5nX3BlbmFsdHkADwBEY2xlYW5fdm90ZV9zaWduZWQIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4AAEUdm90ZXIIARRBbGlhcwAQBFhPcmlnaW4gbXVzdCBiZSBzaWduZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLlkEAAACOABdBAxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQQQ2FsbAQEVAABWBRhcHBseQAADJAtIERlY2xhcmUgaW50ZW50aW9uIHRvIGdldCBhIHRhdHRvby5MLSBEZXBvc2l0IGlzIHRha2VuLrgtIGBJbmtUeXBlYCBtYXkgbm90IGJlIGBQcm9jZWR1cmFsRGVyaXZhdGl2ZWAuPHN1Ym1pdF9ldmlkZW5jZQQBIGV2aWRlbmNlCAEwRXZpZGVuY2VIYXNoAAEQvC0gT3BlbiBhIGp1ZGljaWFsIGNhc2UgdG8ganVkZ2UgdGhlIGBldmlkZW5jZWAu1C0gQ2FsbHMgSnVkaWNpYWwvYEp1ZGdlU3RhdGVtZW50KFBPSV9IQVNILCBldmlkZW5jZSlgUQEtIE5lZWRzIGBTaWduZWRFeHRlbnNpb25gIHRvIGF2b2lkIHVwZnJvbnQgcmVxdWlyZW1lbnQgZm9yIGZlZSBpZiBganVkZ2VtZW50cyA9PSAwYC45AS0gSWYgYGp1ZGdlbWVudHMgPiAwYCwgdGhlbiBhbiBhZGRpdGlvbmFsIGZlZSBzaG91bGQgYmUgY2hhcmdlZCBpbnRvIFRyZWFzdXJ5LhhqdWRnZWQMARh0aWNrZXQ4AURPcmFjbGVUaWNrZXRPZjxUPgABHGNvbnRleHR4AUBKdWRnZW1lbnRDb250ZXh0AAEkanVkZ2VtZW50QQQBJEp1ZGdlbWVudAACBOhJcyBjYWxsZWQgYnkgdGhlIE9yYWNsZSB3aGVuIHRoZSBldmlkZW5jZSBoYXMgYmVlbiBqdWRnZWQuRHJlZ2lzdGVyX3JlZmVycmVkDAEMa2V5UQQBLE1lbWJlck9mPFQ+AAEsZGVzdGluYXRpb24EATBUOjpBY2NvdW50SWQAAUhwcm9vZl9vZl9vd25lcnNoaXBhBAGwPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUAAyRQLSBHZXRzIGEgbmV3IGBpbmRleGB4LSBQdXRzIGFuIGVudHJ5IGludG8gYFBlb3BsZWAumC0gQ2FsbHMgUGVvcGxlL2BuZXdQZXJzb24oaW5kZXgsIGtleSlgACwjIEFyZ3VtZW50c7AqIGBrZXlgIC0gVGhlIHBlcnNvbmFsIGlkZW50aXR5IHRvIHJlZ2lzdGVyLiEBKiBgZGVzdGluYXRpb25gIC0gVGhlIGFjY291bnQgcmVjZWl2aW5nIHRoZSBjYW5kaWRhdGUncyByZWZlcnJhbCByZXdhcmQuSQEqIGBwcm9vZl9vZl9vd25lcmhzaXBgIC0gVGhlIHNpZ25hdHVyZSBvZiBwcmVkZWZpbmVkIHByZWZpeCBgInBvcCByZWdpc3RlciB1c2luZyJgqCAgY29uY2F0ZW5hdGVkIHdpdGggdGhlIHNlbmRlciBhY2NvdW50IGlkLlRyZWdpc3Rlcl9ub25fcmVmZXJyZWQMAQxrZXlRBAEsTWVtYmVyT2Y8VD4AASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAABSHByb29mX29mX293bmVyc2hpcGEEAbA8VDo6Q3J5cHRvIGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAEOFAtIEdldHMgYSBuZXcgYGluZGV4YHgtIFB1dHMgYW4gZW50cnkgaW50byBgUGVvcGxlYC6YLSBDYWxscyBQZW9wbGUvYG5ld1BlcnNvbihpbmRleCwga2V5KWAALCMgQXJndW1lbnRzsCogYGtleWAgLSBUaGUgcGVyc29uYWwgaWRlbnRpdHkgdG8gcmVnaXN0ZXIuwCogYGRlc3RpbmF0aW9uYCAtIFRoZSBhY2NvdW50IHJlY2VpdmluZyByZXdhcmRzLkkBKiBgcHJvb2Zfb2Zfb3duZXJoc2lwYCAtIFRoZSBzaWduYXR1cmUgb2YgcHJlZGVmaW5lZCBwcmVmaXggYCJwb3AgcmVnaXN0ZXIgdXNpbmciYKggIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBzZW5kZXIgYWNjb3VudCBpZC4AKCMgV2FybmluZzoAOQFUaGlzIGNhbGwgY2FuIHBheSB0d28gcmV3YXJkcyB0byB0aGUgc2FtZSBhY2NvdW50IGZvciBub24tcmVmZXJyZWQgY2FuZGlkYXRlcy4pAVRoZSBhcHAgaXMgcmVzcG9uc2libGUgZm9yIGFueSBhZGRpdGlvbmFsIHByaXZhY3kgaGFuZGxpbmcgYWZ0ZXIgdHJhbnNmZXIuGHJlcm9sbAAFABhjb21taXQIARhjaG9pY2VlBAEkSW5rQ2hvaWNlAAEocmVxdWlyZV9pZBUDAUhPcHRpb248UGVyc29uYWxJZD4ABhRJAUNvbW1pdCB0byBhIGRlc2lnbiBhbmQgYXV0aG9yaXplIHRoZSBzdG9yYWdlIGZvciAocG9zc2libHkganVzdCBpbml0aWFsKSBldmlkZW5jZS4AVQFJZiBhIHNwZWNpZmljIHBlcnNvbmFsIGlkZW50aXR5IGlzIHJlcXVpcmVkLCB0aGVuIHRoaXMgY2FuIGJlIHBsYWNlZCBpbiBgcmVxdWlyZV9pZGAuQQFUaGlzIGNhbiBiZSBhbnkgdW51c2VkL3VucmVzZXJ2ZWQgcGVyc29uYWwgaWRlbnRpdHkgbm8gZ3JlYXRlciB0aGFuIHRoZSBgTmV4dElkYCBjb3VudGVyLjRhbGxvY2F0ZV9mdWxsAAcAHHRpbWVvdXQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAgMOQFPbmNlIGEgdGltZW91dCBwYXNzZXMsIHJlbW92ZXMgYSBjYW5kaWRhdGUgd2hvIGlzIHNlbGVjdGVkIGJ1dCBub3QgeWV0IHByb3Zlbi5ZAUlmIHRoZSBjYW5kaWRhdGUgd2FzIHJlZmVycmVkIHRoZW4gcmVmZXJyYWwgaXMgYmFkLCBpZiBjYW5kaWRhdGUgYXBwbGllZCB3aXRoIGRlcG9zaXQsTGRlcG9zaXQgaXMgc2xhc2hlZC4gZmxha2VvdXQACQS0UmVtb3ZlIGEgY2FuZGlkYXRlIHdobyBoYXMgbm90IHlldCBjb21taXR0ZWQuUGFwcGx5X3dpdGhfc2lnbmF0dXJlDAEgcmVmZXJyZXIoAShQZXJzb25hbElkAAEkc2lnbmF0dXJlLQQBSFQ6OlRpY2tldFNpZ25hdHVyZQABGHRpY2tldAQBJFQ6OlRpY2tldAAKEHRVdGlsaXplIGEgcmVmZXJyYWwgc2lnbmF0dXJlLgBdAVRoZSBwYXlsb2FkIHRvIGJlIHNpZ25lZCBieSB0aGUgcmVmZXJyZXIgdXNpbmcgdGhlaXIgcmVnaXN0ZXJlZCBrZXkgcGFpciBpcyB0aGUgZW5jb2RlZKRieXRlcyBvZiB0aGUgYWNjb3VudCBJRCBvZiB0aGUgY2FuZGlkYXRlLlRhcHBseV93aXRoX2ludml0YXRpb24MARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEsVGlja2V0T2Y8VD4AASRzaWduYXR1cmUtBAFIVDo6VGlja2V0U2lnbmF0dXJlABMQ1EFwcGx5IHRvIHRoZSBQcm9vZi1vZi1JbmsgcHJvY2VzcyB3aXRoIGFuIGludml0YXRpb24uAFkBVGhlIHBheWxvYWQgdG8gYmUgc2lnbmVkIGJ5IHRoZSBpbnZpdGVyIHVzaW5nIHRoZWlyIHJlZ2lzdGVyZWQga2V5IHBhaXIgaXMgdGhlIGVuY29kZWSkYnl0ZXMgb2YgdGhlIGFjY291bnQgSUQgb2YgdGhlIGNhbmRpZGF0ZS5EYWRkX2Rlc2lnbl9mYW1pbHkMARRpbmRleC0DASxGYW1pbHlJbmRleAABEGtpbmRpBAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQACwTwQWRkIGEgZGVzaWduIGZhbWlseS4gTXVzdCBoYXZlIHByaXZpbGVnZWQgYWNjZXNzIHRvIGRvIHRoaXMuTHNldF9yZWZlcnJhbF90aWNrZXQEARh0aWNrZXQEASRUOjpUaWNrZXQADBi8QWRkIGEgcmVmZXJyYWwgdGlja2V0IGFzc29jaWF0ZWQgd2l0aCBhIHBlcnNvbi4AVQFPbmx5IG9uZSByZWZlcnJhbCB0aWNrZXQgbWF5IGJlIGFjdGl2ZSBhdCBhbnkgZ2l2ZW4gdGltZSBmb3Igb25lIHBlcnNvbi4gQ2FsbGluZyB0aGlzJQFleHRyaW5zaWMgd2hpbGUgYSB2YWxpZCB0aWNrZXQgaXMgc2V0IHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyB0aWNrZXQuADkBSWYgYW55IHBlbmRpbmcgcmVmZXJyYWwgcmV3YXJkcyBhcmUgcHJlc2VudCwgdGhleSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgZmlyc3QuWGNhbmNlbF9yZWZlcnJhbF90aWNrZXQEARh0aWNrZXQEASRUOjpUaWNrZXQADQTIQ2FuY2VsIGEgcmVmZXJyYWwgdGlja2V0IGFzc29jaWF0ZWQgd2l0aCBhIHBlcnNvbi6McmVnaXN0ZXJfc3VjY2Vzc2Z1bF9yZWZlcnJhbF9yZXdhcmQEASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAAOADRncmFudF9pbnZpdGVzCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAA8Y5EdyYW50cyBpbnZpdGVzIHRvIGFuIGFjY291bnQgc28gdGhleSBjYW4gZGlzdHJpYnV0ZSB0aGVtLgCYVGhlIG9yaWdpbiBtdXN0IGJlIGBJbnZpdGF0aW9uc09yaWdpbi4AsC0gYGFjY291bnRgOiBUaGUgYWNjb3VudCB0byBnaXZlIGludml0ZXMgdG8upC0gYGNvdW50YDogVGhlIG51bWJlciBvZiBpbnZpdGVzIHRvIGdpdmUukHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRsaW1pdDgBDHUzMgAQGJxSZW1vdmUgYWxsIGludml0ZXMgZ2l2ZW4gdG8gYW4gYWNjb3VudC4AnFRoZSBvcmlnaW4gbXVzdCBiZSBgSW52aXRhdGlvbnNPcmlnaW5gLgDQLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgaW52aXRlcyBmcm9tLuwtIGBsaW1pdGA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIGludml0ZXMgdG8gcmVtb3ZlLkRzZXRfaW52aXRlX3RpY2tldAQBGHRpY2tldAQBLFRpY2tldE9mPFQ+ABEUSEludml0ZSBhbiBhY2NvdW50LgANAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgaGF2ZSBzb21lIGludml0ZXMgbGVmdC4AlC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIHNldC5QY2FuY2VsX2ludml0ZV90aWNrZXQEARh0aWNrZXQEASxUaWNrZXRPZjxUPgASFFRDYW5jZWwgYW4gaW52aXRhdGlvbi4AIQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IHRoZSBhY2NvdW50IHRoYXQgb3ducyB0aGUgdGlja2V0IHRvIGNhbmNlbC4AoC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIGNhbmNlbC5Ec2V0X2NvbmZpZ3VyYXRpb24EARhjb25maWdtBAF8Q29uZmlnUmVjb3JkPEJsb2NrTnVtYmVyRm9yPFQ+PgAyBBUBU2V0IHRoZSBjb25maWd1cmF0aW9uIHJlY29yZC4gTXVzdCBoYXZlIHByaXZpbGVnZWQgYWNjZXNzIHRvIGRvIHRoaXMuYHNldF9yZWltYnVyc2VtZW50X3ZhbHVlcwgBPHJlZmVycmVkX3ZhbHVlc3EEAehCb3VuZGVkVmVjPChCYWxhbmNlT2Y8VD4sIHUzMiksIFQ6Ok1heFJlaW1idXJzZW1lbnRWYWx1ZXM+AAE8cmVmZXJyZXJfdmFsdWVzcQQB6EJvdW5kZWRWZWM8KEJhbGFuY2VPZjxUPiwgdTMyKSwgVDo6TWF4UmVpbWJ1cnNlbWVudFZhbHVlcz4AMyhNAVNldCB0aGUgdmFsdWVzIG9mIHRoZSByZWltYnVyc2VtZW50IGF3YXJkZWQgdG8gcmVmZXJyZWQgY2FuZGlkYXRlcyBhcyB3ZWxsIGFzIHRoZWlyTQFyZWZlcnJlcnMsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiByZWltYnVyc2VtZW50cyBmb3IgZWFjaCB2YWx1ZS4gVGhlc2UgdmFsdWVzIGFyZSRzdG9yZWQgaW5RAXJldmVyc2Ugb3JkZXIgb2YgdGhlaXIgcHJpb3JpdHksIHNvIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IG9uZUkBdG8gYmUgdXNlZCBieSB0aGUgcmVpbWJ1cnNlbWVudCBzeXN0ZW0uIFRoZSBsZW5ndGggb2YgdGhlIHR3byBsaXN0cyBtdXN0IGJlIGVxdWFsLgAgV0FSTklORyEATQFBZnRlciB0aGUgbnVtYmVyIG9mIHJlaW1idXJzZW1lbnRzIGlzIGV4aGF1c3RlZCBmb3IgYSB2YWx1ZSBpbiB0aGUgbGlzdCwgdGhlIHBhbGxldPRzdGFydHMgdXNpbmcgdGhlIG5leHQgdmFsdWUgaW1tZWRpYXRlbHkgZm9yIGZ1dHVyZSB0cmFuc2ZlcnMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmEEAAADYAAAAAwAZQQMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0JElua0Nob2ljZQABFEBEZXNpZ25lZEVsZWN0aXZlCAAtAwEsRmFtaWx5SW5kZXgAAC0DASxEZXNpZ25JbmRleAAAAERQcm9jZWR1cmFsQWNjb3VudAQALQMBLEZhbWlseUluZGV4AAEASFByb2NlZHVyYWxQZXJzb25hbAQALQMBLEZhbWlseUluZGV4AAIAKFByb2NlZHVyYWwIAC0DASxGYW1pbHlJbmRleAAADAEwVmFyaWFudEluZGV4AAMAUFByb2NlZHVyYWxEZXJpdmF0aXZlCAAoAShQZXJzb25hbElkAAAVAwFIT3B0aW9uPFBlcnNvbmFsSWQ+AAQAAGkEDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldChGYW1pbHlLaW5kAAEQIERlc2lnbmVkBAEUY291bnQtAwEsRGVzaWduSW5kZXgAAABEUHJvY2VkdXJhbEFjY291bnQAAQBIUHJvY2VkdXJhbFBlcnNvbmFsAAIAKFByb2NlZHVyYWwEARRyYW5nZQwBMFZhcmlhbnRJbmRleAADAABtBAxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQwQ29uZmlnUmVjb3JkBCxCbG9ja051bWJlcgE4ACABOHJlcm9sbF90aW1lb3V0OAEsQmxvY2tOdW1iZXIAATxmYXN0dHJhY2tfY291bnQ4AQx1MzIAARxtYXhpbXVtOAEMdTMyAAE4ZnVsbF9hbGxvY19sZW4oAQx1NjQAAUBmdWxsX2FsbG9jX2NvdW50OAEMdTMyAAE4aW5pdF9hbGxvY19sZW4oAQx1NjQAAUBpbml0X2FsbG9jX2NvdW50OAEMdTMyAAEcdGltZW91dDgBLEJsb2NrTnVtYmVyAABxBAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUEBFMAAAQAeQQBGFZlYzxUPgAAdQQAAAQIxDgAeQQAAAJ1BAB9BAxEaW5kaXZfcGFsbGV0X2dhbWUYcGFsbGV0EENhbGwEBFQAAUBMc2lnbl91cF93aXRoX2ludml0ZQQBOGlkZW50aWZpZXJfa2V5NQQBXENvbW11bmljYXRpb25JZGVudGlmaWVyAAAg0FNpZ24gdXAgZm9yIHRoZSBnYW1lIHVzaW5nIGFuIGFjY291bnQgYW5kIGFuIGludml0ZS4AFQFUaGlzIGlzIGZvciBuZXcgcGxheWVycyBvciBhcmNoaXZlZCBwbGF5ZXJzLCBvdGhlciBwbGF5ZXJzIHNob3VsZCB1c2WoW2BQYWxsZXQ6OnNpZ25fdXBfd2l0aF9hY2NvdW50YF0gZm9yIGZyZWUuANRBIGdhbWUgbXVzdCBiZSBvbmdvaW5nIGFuZCBpbiBpdHMgcmVnaXN0cmF0aW9uIHBoYXNlLgBBAVRoZSBvcmlnaW4gbXVzdCBiZSBhIHNpZ25lZCBieSBhbiBhY2NvdW50IGFuZCB1c2UgdGhlIGBHYW1lQXNJbnZpdGVkYCBleHRlbnNpb24uUHNpZ25fdXBfd2l0aF9hY2NvdW50BAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAASSYU2lnbiB1cCBmb3IgdGhlIGdhbWUgdXNpbmcgYW4gYWNjb3VudC4APQFJZiB0aGUgcGxheWVyIGlzIG5ldyBvciBhcmNoaXZlZCwgdGhlbiBhIGRlcG9zaXQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBzaWduZXIubE90aGVyd2lzZSB0aGUgY2FsbCBpcyBmcmVlLgDUQSBnYW1lIG11c3QgYmUgb25nb2luZyBhbmQgaW4gaXRzIHJlZ2lzdHJhdGlvbiBwaGFzZS4AMQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IGFuIGFjY291bnQsIG9yLCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgdXNlfGBTY29yZUFzUGFydGljaXBhbnRgIGV4dGVuc2lvbi5Ic2lnbl91cF93aXRoX2FsaWFzDAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAAURzdGF0ZW1lbnRfYWNjb3VudAQBMFQ6OkFjY291bnRJZAABDHNpZy0EAUxUOjpBY2NvdW50U2lnbmF0dXJlAAJIVFNpZ24gdXAgZm9yIHRoZSBnYW1lLgBVAUlmIGEgcGxheWVyIGlzIGFscmVhZHkgcmVjb2duaXplZCBieSBhbm90aGVyIERJTSwgdGhleSBjYW4gc2lnbiB1c2luZyB0aGVpciBhbGlhcyBhbmQRAWRvbid0IG5lZWQgYW55IGRlcG9zaXQgb3IgaW52aXRlIHRvIHByb3ZlIHRoZWlyIGluaXRpYWwgY3JlZGliaWxpdHkuYQFPbiB0b3Agb2YgdGhpcyB0aGVpciBzY29yZSBpcyBuZXZlciBnb2luZyBiZWxvdyBwZXJzb25ob29kIHRocmVzaG9sZCBhbmQgdGhlIHBsYXllciB3aWxsTG5ldmVyIGdldCBhcmNoaXZlZC4A1EEgZ2FtZSBtdXN0IGJlIG9uZ29pbmcgYW5kIGluIGl0cyByZWdpc3RyYXRpb24gcGhhc2UuAJBUaGUgb3JpZ2luIG11c3QgYmUgYSBwZXJzb25hbCBhbGlhcy4ALFBhcmFtZXRlcnM6YQEtIGBzdGF0ZW1lbnRfYWNjb3VudGA6IHRoZSBhY2NvdW50IGlkIHRvIHVzZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBzdGF0ZW1lbnQgc3RvcmUgZHVyaW5nLCAgdGhlIGdhbWUuVQEtIGBzaWdgOiB0aGUgcHJvb2Ygb2Ygb3duZXJzaGlwIG9mIHRoZSBhY2NvdW50IGBzdGF0ZW1lbnRfYWNjb3VudGAgYnkgYW4gYWxpYXMsIGl0IGlzXQEgIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UgYCJwb3A6Z2FtZTpzdG10X2FjY291bnRfZm9yX2FsaWFzOiJgIGNvbmNhdGVuYXRlZCB0byB0aGVJASAgYWxpYXMsIGFuZCB0aGVuIGhhc2hlZCB3aXRoIGBibGFrZTJfMjU2YCAoYmxha2UyIDI1NmJpdCBvdXRwdXQpLiBUaGUgYmFzZSBvZiB0aGUZASAgbWVzc2FnZSBjYW4gYmUgZm91bmQgaW4gdGhlIGNvbnN0YW50OiBgcHJvb2Zfb2Zfb3duZXJzaGlwX21zZ19iYXNlYC4YcmVwb3J0BAEsZnVsbF9yZXBvcnSBBAE0RnVsbFJlcG9ydDxUPgADGJRBZnRlciB0aGUgZ2FtZSwgc2VuZCB0aGUgZnVsbCByZXBvcnQuANBUaGUgZ2FtZSBtdXN0IGJlIG9uZ29pbmcgYW5kIGluIGl0cyByZXBvcnRpbmcgcGhhc2UuAFUBVGhlIG9yaWdpbiBtdXN0IGJlIGFuIGFsaWFzLCBvciBzaWduZWQgYnkgYW4gYWNjb3VudCwgb3Igc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIHVzZXxgU2NvcmVBc1BhcnRpY2lwYW50YCBleHRlbnNpb24uIG9mZmJvYXJkAAQcgE9mZmJvYXJkIGEgcGxheWVyIGZyb20gdGhlIGdhbWUuAFUBVGhlIG9yaWdpbiBtdXN0IGJlIGFuIGFsaWFzLCBvciBzaWduZWQgYnkgYW4gYWNjb3VudCwgb3Igc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIHVzZXxgU2NvcmVBc1BhcnRpY2lwYW50YCBleHRlbnNpb24uAF0BVGhlcmUgbXVzdCBiZSBubyBnYW1lIG9yIHRoZSBleGlzdGluZyBnYW1lIG11c3QgYmUgaW4gcmVnaXN0cmF0aW9uIHBoYXNlIGFuZCB0aGUgcGxheWVylG11c3QgaGF2ZSBub3Qgc2lnbmVkIHVwIGZvciB0aGUgZ2FtZS4ca2lja291dAQBGHBsYXllcgQBMFQ6OkFjY291bnRJZAAFGDEBS2lja291dCBhIGtpY2thYmxlIHBsYXllciB0aGF0IGlzIG5vdCBwbGF5aW5nIGFmdGVyIGBOb25QbGF5aW5nS2lja291dFRpbWVgLgCgVGhlIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSBhbiBhY2NvdW50LgAhAS0gYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8ga2lja291dC4gSXQgbXVzdCBiZSBhcmNoaXZlZCBhbmQga2lja2FibGUgd2l0aNggIGBhcmNoaXZlZF9zaW5jZWAgb2xkZXIgdGhhbiBgTm9uUGxheWluZ0tpY2tvdXRUaW1lYC40Z3JhbnRfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRjb3VudDgBDHUzMgAGGPRHcmFudCBzb21lIGludml0ZXMgdG8gYW4gYWNjb3VudCBzbyB0aGV5IGNhbiBkaXN0cmlidXRlIHRoZW0uAIhUaGUgb3JpZ2luIG11c3QgYmUgYEludml0ZUlzc3VlcmAuALQtIGBhY2NvdW50YDogVGhlIGFjY291bnQgdG8gZ3JhbnQgaW52aXRlcyB0by6oLSBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGludml0ZXMgdG8gZ3JhbnQukHJlbW92ZV9hdmFpbGFibGVfYW5kX3BlbmRpbmdfaW52aXRlcwgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRsaW1pdDgBDHUzMgAHGJhDbGVhciBhbGwgaW52aXRlcyBnaXZlbiB0byBhbiBhY2NvdW50LgCIVGhlIG9yaWdpbiBtdXN0IGJlIGBJbnZpdGVJc3N1ZXJgLgDQLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgaW52aXRlcyBmcm9tLuwtIGBsaW1pdGA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIGludml0ZXMgdG8gcmVtb3ZlLkRzZXRfaW52aXRlX3RpY2tldAQBGHRpY2tldAQBLFRpY2tldE9mPFQ+AAgUSEludml0ZSBhbiBhY2NvdW50LgANAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgYW4gYWNjb3VudCBhbmQgaGF2ZSBzb21lIGludml0ZXMgbGVmdC4AlC0gYHRpY2tldGA6IFRoZSBpbnZpdGUgdGlja2V0IHRvIHNldC5QY2FuY2VsX2ludml0ZV90aWNrZXQEARh0aWNrZXQEASxUaWNrZXRPZjxUPgAJFERDYW5jZWwgYW4gaW52aXRlLgAhAVRoZSBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgdGhlIGFjY291bnQgdGhhdCBvd25zIHRoZSB0aWNrZXQgdG8gY2FuY2VsLgCgLSBgdGlja2V0YDogVGhlIGludml0ZSB0aWNrZXQgdG8gY2FuY2VsLjhzY2hlZHVsZV9nYW1lcwQBPGdhbWVzX3NjaGVkdWxlc5UEAURWZWM8R2FtZVNjaGVkdWxlPgAKCNBTY2hlZHVsZXMgbmV3IGdhbWVzIGFjY29yZGluZyB0byBwcm92aWRlZCBzY2hlZHVsZXMuXQFTY2hlZHVsZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgYWZ0ZXIgdGhlIG9uZ29pbmcgZ2FtZSAoaWYgdGhlcmUgaXMgYW55KS5UcmVtb3ZlX3NjaGVkdWxlZF9nYW1lBAE4Z2FtZV9wbGF5X3RpbWU4AQx1MzIACwBsdGVzdG5ldF9mb3JjZV9zdGFydF9zaHVmZmxlAGUM1EZvcmNlIHN0YXJ0IHRoZSBzaHVmZmxlIGJlZm9yZSBpdHMgbm9ybWFsIHN0YXJ0IHRpbWUuAE0BVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IHRoZSByb290IG9yaWdpbiBhbmQgaXMgb25seSBtZWFudCBmb3IgdGVzdGluZy5sdGVzdG5ldF9mb3JjZV9lbmRfcmVwb3J0aW5nAGYc+EZvcmNlIGVuZCBhIGdhbWUncyByZXBvcnRpbmcgcGhhc2UgYmVmb3JlIGl0cyBub3JtYWwgZW5kIHRpbWUuAE0BVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IHRoZSByb290IG9yaWdpbiBhbmQgaXMgb25seSBtZWFudCBmb3IgdGVzdGluZy4AWQFUaGUgcmVwb3J0aW5nIHBoYXNlIG9ubHkgc3RhcnQgd2hlbiB0aGUgbXV0YXRpb24gc2Vzc2lvbiBjYW4gYmUgc3RhcnRlZC4gVGhlIGNhbGwgd2lsbFkBZmFpbCBpZiB0aGUgbXV0YXRpb24gc2Vzc2lvbiBjYW5ub3QgYmUgc3RhcnRlZC4gSXQgY2FuIGJlIHJldHJpZWQgZmV3IGJsb2NrcyBsYXRlciB0aGXQdGltZSBmb3IgdGhlIHBlb3BsZSBtdXRhdGlvbiBzZXNzaW9ucyB0byBiZSBwcm9jZWVkLlx0ZXN0bmV0X3NldF9nYW1lX3BoYXNlcwQBGHBoYXNlc50EAUxQaGFzZUR1cmF0aW9uVmFsdWVzAGcMhEZvcmNlIHNldCB0aGUgZ2FtZSBwaGFzZSBwZXJpb2RzLgBNAVRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSB0aGUgcm9vdCBvcmlnaW4gYW5kIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuZHRlc3RuZXRfa2lsbF9jdXJyZW50X2dhbWUAaATMS2lsbCB0aGUgY3VycmVudCBnYW1lLiBXaGF0ZXZlciB0aGUgcGhhc2UgaXQgaXMgaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBhQQEUwAABACRBAEYVmVjPFQ+AACFBAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAYkEBFMAAAQAjQQBGFZlYzxUPgAAiQQMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzGFJlcG9ydAABCBhQZXJzb24AAAAkTm90UGVyc29uAAEAAI0EAAACiQQAkQQAAAKFBACVBAAAApkEAJkEDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlczBHYW1lU2NoZWR1bGUAAAwBOGdhbWVfcGxheV90aW1lOAEMdTMyAAEYcm91bmRzDAEIdTgAAThtYXhfZ3JvdXBfc2l6ZTgBDHUzMgAAnQQMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzTFBoYXNlRHVyYXRpb25WYWx1ZXMAABQBMHJlZ2lzdHJhdGlvbjgBDHUzMgABHHNodWZmbGU4AQx1MzIAAUxwb3N0X3NodWZmbGVfbWFyZ2luOAEMdTMyAAEkcmVwb3J0aW5nOAEMdTMyAAE4cGxheWVyX3Byb2Nlc3M4AQx1MzIAAKEEDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0EENhbGwEBFQAASBYc2NoZWR1bGVfcGF5b3V0X3JvdW5kcwwBGGFtb3VudMQBMEJhbGFuY2VPZjxUPgABFGNvdW50OAEMdTMyAAEgZHVyYXRpb244AURCbG9ja051bWJlckZvcjxUPgABDFxTY2hlZHVsZSBwYXlvdXQgcm91bmRzLgCUQ2FsbGVkIGZyb20gYFNjaGVkdWxlT3JpZ2luYCBvciByb290LlhyZW1vdmVfcGF5b3V0X3NjaGVkdWxlBAEUaW5kZXg4AQx1MzIAAgyAUmVtb3ZlIGEgc2NoZWR1bGVkIHBheW91dCByb3VuZC4AlENhbGxlZCBmcm9tIGBTY2hlZHVsZU9yaWdpbmAgb3Igcm9vdC5AdHJhbnNpdGlvbl9yb3VuZAQBLHJvdW5kX2luZGV4OAEMdTMyAAMYSFN0YXJ0IGEgbmV3IHJvdW5kLgBRAVRoaXMgaXMgdmFsaWQgaWYgdGhlIGN1cnJlbnQgcm91bmQgaXMgZmluaXNoZWQsIG9yIGlmIHRoZSBjdXJyZW50IHJvdW5kIGRvZXNuJ3QgaGF2ZahwbGFubmluZyBhbmQgYSBzY2hlZHVsZSBleGlzdHMgdG8gcGxhbiBpdC4AvFRoaXMgaXMgYSB0YXNrLCBhbmQgY2FuIGJlIGNhbGxlZCBmcm9tIGFueWJvZHkuUG9wZXJhdGVfcGF5b3V0X3JvdW5kCAEscm91bmRfaW5kZXg4AShSb3VuZEluZGV4AAEUbGltaXQ4AQx1MzIABDx4T3BlcmF0ZSBzb21lIHJvdW5kIHBheWluZyBvdXQuAFEBRHJhaW5zIHJvdW5kJ3MgcGFydGljaXBhbnRzLCB1cCB0byBhIGxpbWl0LiBGb3IgZWFjaCBwYXJ0aWNpcGFudCwgYWRkIHRoZSBjYWxjdWxhdGVkFQFyZXdhcmQgKGBiYXNlX3Jld2FyZCArIHJlbWFpbmRlcl9wb3J0aW9uYCkgdG8gdGhlaXIgYGNyZWRpdGAgYmFsYW5jZS4AYQFUaGVuLCBtb3ZlcyBmdW5kcyBvbiB0aGUgcG90IGFjY291bnQgZnJvbSBQYXlvdXQgdG8gQ3JlZGl0LCBzbyB0aGV5IGFyZSBvd2VkIHRvIHNwZWNpZmljoHBhcnRpY2lwYW50cyByYXRoZXIgdGhhbiB0aGUgcm91bmQgcG9vbC4ARQFGaW5hbGx5LCByZWxlYXNlIHRoZSBsZWZ0b3ZlciBmcm9tIHRoZSBQYXlvdXQgaG9sZCBiYWNrIHRvIHRoZSBwb3QncyBmcmVlIGJhbGFuY2VUKGZ1bmRzIGFyZSByZWN5Y2xlZCkuALxUaGlzIGlzIGEgdGFzaywgYW5kIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnlib2R5LgDEKiByb3VuZF9pbmRleDogVGhlIGluZGV4IG9mIHRoZSByb3VuZCB0byBvcGVyYXRlLhEBKiBsaW1pdDogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0byBvcGVyYXRlIGluIHRoaXMgY2FsbC4gY2FzaF9vdXQABSRZAUNhc2ggb3V0IGhhbGYgb2YgdGhlIHNjb3JlLCByb3VuZGVkIHVwLiBDb252ZXJ0cyB0aGUgc2NvcmUgaW50byBwb2ludHMgZm9yIHRoZSBjdXJyZW50JQFwYXlvdXQgcm91bmQuIENhbGxlciBtdXN0IGhhdmUgbmV2ZXIgcmVhY2hlZCBwZXJzb25ob29kIHNpbmNlIG9uYm9hcmRpbmcuALRJdCBjYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGdhbWUgc2Vzc2lvbiAoZXJhKS4APQFPcmlnaW4gbXVzdCBiZSBzaWduZWQgb3IgcGFydGljaXBhbnQgKHNpZ25lZCBleHRyaW5zaWMgdXNpbmcgU2NvcmVBc1BhcnRpY2lwYW50WHRyYW5zYWN0aW9uIGV4dGVuc2lvbikAzEFsaWFzIG9yaWdpbiBpcyBub3QgYWxsb3dlZCBhcyB0aGV5IGNhbid0IGNhc2ggb3V0LjRyZWRlZW1fY3JlZGl0BAEsZGVzdGluYXRpb24EATBUOjpBY2NvdW50SWQABhhRAVJlZGVlbSBmdWxsIGFjY3VtdWxhdGVkIGNyZWRpdCwgdHJhbnNmZXJyaW5nIGl0IHRvIHRoZSBwcm92aWRlZCBkZXN0aW5hdGlvbiBhY2NvdW50LgDkQ3JlZGl0IGlzIGNvbnZlcnRlZCBmcm9tIHBvaW50cyBkdXJpbmcgcGF5b3V0IHByb2Nlc3NpbmcuAEkBT3JpZ2luIG11c3QgYmUgYSBwZXJzb24gYWxpYXMsIGEgc2lnbmVkIGFjY291bnQgb3IgYSBwYXJ0aWNpcGFudCAoc2lnbmVkIGV4dHJpbnNpY8B1c2luZyBTY29yZUFzUGFydGljaXBhbnQgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uKS4gcmVnaXN0ZXIEAQxrZXmlBAENAU9wdGlvbjwoTWVtYmVyT2Y8VD4sPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUpCj4ABzTwUmVnaXN0ZXIgYXMgYSBwZXJzb24sIG9yIHJlc3VtZSBwZXJzb25ob29kIGFmdGVyIHN1c3BlbnNpb24uACUBUmVxdWlyZXMgc2NvcmUgPj0gcGVyc29uaG9vZCB0aHJlc2hvbGQgKG9yIGhhdmluZyBwcmV2aW91c2x5IHJlYWNoZWQgaXQpLgBhAUlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgcHJldmlvdXNseSByZWNvZ25pc2VkIGFuZCBpcyBub3cgc3VzcGVuZGVkLCB0aGV5IG11c3Qgbm90IHByb3ZpZGWIYSBrZXkuIFRoZSBleGlzdGluZyBrZXkgaXMgcmV1c2VkLgA9AUlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgbmV2ZXIgcmVjb2duaXNlZCwgdGhleSBtdXN0IHByb3ZpZGUgYSBrZXkgYW5kIGEgcHJvb2Ygb2YZAW93bmVyc2hpcCAoYGtleWAgcGFyYW1ldGVyKTogYSBzaWduYXR1cmUgb3ZlciBgInBvcCByZWdpc3RlciB1c2luZyIgfHxMc2VuZGVyX2FjY291bnRfaWRgLgBFAU9yaWdpbiBtdXN0IGJlIHNpZ25lZCBvciBhIHBhcnRpY2lwYW50IChzaWduZWQgZXh0cmluc2ljIHVzaW5nIFNjb3JlQXNQYXJ0aWNpcGFudFx0cmFuc2FjdGlvbiBleHRlbnNpb24pLmhzZXRfYWJzZW5jZV9ncmFjZV9zY2hlZHVsZQQBIHNjaGVkdWxlrQQBREFic2VuY2VHcmFjZVRpZXJzAAg4fFNldCB0aGUgYWJzZW5jZSBncmFjZSBzY2hlZHVsZS4AKQFFdmVyeSB0aWVyIG11c3Qgc2F0aXNmeTogYDAgPD0gd2luZG93IDw9IDhgIGFuZCBgYWxsb3dlZF9taXNzZXMgPCB3aW5kb3dgLhUBYGFsbG93ZWRfbWlzc2VzID0gMGAgZGlzYWJsZXMgZ3JhY2UgZW50aXJlbHkgKGFueSBhYnNlbmNlIGltbWVkaWF0ZWx5KHN1c3BlbmRzKS4AJQFUaWVycyBtdXN0IGJlIHByb3ZpZGVkIGluIGFzY2VuZGluZyBvcmRlciBvZiBgcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZGAuAPxBbiBlbXB0eSBzY2hlZHVsZSBkaXNhYmxlcyB0aGUgZ3JhY2UgcGVyaW9kIGVudGlyZWx5IChpbW1lZGlhdGUdAXN1c3BlbnNpb24gb24gYW55IG1pc3NlZCBnYW1lKS4gVGhlIG5ldyByYXRpbyB0YWtlcyBlZmZlY3QgYXQgdGhlIHN0YXJ0CQFvZiB0aGUgbmV4dCByZXBvcnQgc2Vzc2lvbiB3aGVuIGB1cGRhdGVfdGhyZXNob2xkcygpYCByZWNhbGN1bGF0ZXNQYEFic2VuY2VHcmFjZVJhdGlvYC4AlENhbGxlZCBmcm9tIGBTY2hlZHVsZU9yaWdpbmAgb3Igcm9vdC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMupQQEGE9wdGlvbgQEVAGpBAEIEE5vbmUAAAAQU29tZQQAqQQAAAEAAKkEAAAECFEEYQQArQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGxBARTAAAEALUEARhWZWM8VD4AALEEDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXNAQWJzZW5jZUdyYWNlVGllcgAADAFkcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZDgBDHUzMgABGHdpbmRvdwwBCHU4AAE4YWxsb3dlZF9taXNzZXMMAQh1OAAAtQQAAAKxBAC5BAxYaW5kaXZfcGFsbGV0X2R1bW15X2RpbRhwYWxsZXQQQ2FsbAQEVAABICxyZXNlcnZlX2lkcwQBFGNvdW50OAEMdTMyAAAEhFJlc2VydmUgYSBudW1iZXIgb2YgcGVyc29uYWwgSURzLlByZW5ld19pZF9yZXNlcnZhdGlvbgQBCGlkKAEoUGVyc29uYWxJZAABBLxSZW5ldyBhIHBlcnNvbmFsIElELiBUaGUgSUQgbXVzdCBub3QgYmUgaW4gdXNlLlRjYW5jZWxfaWRfcmVzZXJ2YXRpb24EAQhpZCgBKFBlcnNvbmFsSWQAAgSEQ2FuY2VsIGEgcGVyc29uYWwgSUQgcmVzZXJ2YXRpb24uUHJlY29nbml6ZV9wZXJzb25ob29kBAEwaWRzX2FuZF9rZXlzvQQB8EJvdW5kZWRWZWM8KFBlcnNvbmFsSWQsIE1lbWJlck9mPFQ+KSwgVDo6TWF4UGVyc29uQmF0Y2hTaXplPgADBCkBR3JhbnQgcGVyc29uaG9vZCBmb3IgYSBsaXN0IG9mIGNhbmRpZGF0ZXMgdGhhdCBoYXZlIHJlc2VydmVkIHBlcnNvbmFsIElEcy5Ic3VzcGVuZF9wZXJzb25ob29kBAEMaWRzyQQBtEJvdW5kZWRWZWM8UGVyc29uYWxJZCwgVDo6TWF4UGVyc29uQmF0Y2hTaXplPgAECF0BU3VzcGVuZCB0aGUgcGVyc29uaG9vZCBvZiBhIGxpc3Qgb2YgcmVjb2duaXplZCBwZW9wbGUuIFRoZSBwZW9wbGUgbXVzdCBub3QgY3VycmVudGx5IGJlKHN1c3BlbmRlZC5EcmVzdW1lX3BlcnNvbmhvb2QEAQhpZCgBKFBlcnNvbmFsSWQABQQRAVJlc3VtZSBzb21lb25lJ3MgcGVyc29uaG9vZC4gVGhlIHBlcnNvbiBtdXN0IGN1cnJlbnRseSBiZSBzdXNwZW5kZWQuWHN0YXJ0X211dGF0aW9uX3Nlc3Npb24ABghdAVN0YXJ0IGEgbXV0YXRpb24gc2Vzc2lvbiBpbiB0aGUgdW5kZXJseWluZyBgUGVvcGxlYCBpbnRlcmZhY2UuIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGVjayUBd2hldGhlciBhIG11dGF0aW9uIHNlc3Npb24gaXMgYWxyZWFkeSBvbmdvaW5nIGFuZCBjYW4gc3RhcnQgbmV3IHNlc3Npb25zLlBlbmRfbXV0YXRpb25fc2Vzc2lvbgAHEF0BRW5kIGEgbXV0YXRpb24gc2Vzc2lvbiBpbiB0aGUgdW5kZXJseWluZyBgUGVvcGxlYCBpbnRlcmZhY2UuIFRoaXMgY2FsbCBjYW4gZW5kIG11bHRpcGxl4G11dGF0aW9uIHNlc3Npb25zLCBldmVuIG9uZXMgbm90IHN0YXJ0ZWQgYnkgdGhpcyBwYWxsZXQuANhUaGlzIGNhbGwgd2lsbCBmYWlsIGlmIG5vIG11dGF0aW9uIHNlc3Npb24gaXMgb25nb2luZy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuvQQMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHBBARTAAAEAMUEARhWZWM8VD4AAMEEAAAECChRBADFBAAAAsEEAMkEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKARTAAAEAM0EARhWZWM8VD4AAM0EAAACKADRBAxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBBDYWxsBARUAAEQeGluY3JlYXNlX2F0dGVzdGF0aW9uX2FsbG93YW5jZQgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARRjb3VudDgBDHUzMgAAGCUBR3JhbnQgc29tZSBhdHRlc3RhdGlvbiBhbGxvd2FuY2UgdG8gYW4gYWNjb3VudCBzbyB0aGV5IGNhbiBhdHRlc3QgcGVvcGxlLgDEVGhlIG9yaWdpbiBtdXN0IGJlIGBBdHRlc3RhdGlvbkFsbG93YW5jZU1hbmFnZXJgLgDILSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIGdyYW50IGF0dGVzdGF0aW9ucyB0by68LSBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGF0dGVzdGF0aW9ucyB0byBncmFudC5sY2xlYXJfYXR0ZXN0YXRpb25fYWxsb3dhbmNlBAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFLxDbGVhciBhbGwgYXR0ZXN0YXRpb24gYWxsb3dhbmNlIGZvciBhbiBhY2NvdW50LgDEVGhlIG9yaWdpbiBtdXN0IGJlIGBBdHRlc3RhdGlvbkFsbG93YW5jZU1hbmFnZXJgLgDkLSBgYWNjb3VudGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSBhbGwgYXR0ZXN0YXRpb25zIGZyb20uGGF0dGVzdBQBJGNhbmRpZGF0ZQQBMFQ6OkFjY291bnRJZAABTGNhbmRpZGF0ZV9zaWduYXR1cmUtBAFcVDo6QXR0ZXN0YXRpb25TaWduYXR1cmUAATByaW5nX3ZyZl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAGwPFQ6OkNyeXB0byBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUAAVRjb25zdW1lcl9yZWdpc3RyYXRpb27VBAGsT3B0aW9uPExpdGVDb25zdW1lclJlZ2lzdHJhdGlvblBhcmFtc09mPFQ+PgACbEhBdHRlc3QgYW4gYWNjb3VudC4ARQFUaGUgb3JpZ2luIG11c3QgYmUgc2lnbmVkIGJ5IGFuIGFjY291bnQgYW5kIGhhdmUgc29tZSBhdHRlc3RhdGlvbiBhbGxvd2FuY2UgbGVmdC4A8FRoZSBhdXRob3JpdHkgd2lsbCBoYXZlIHRvIGdldCB0d28gc2lnbmF0dXJlcyBmcm9tIHRoZSB1c2VyOk0BLSBvbmUgY3JlYXRlZCB1c2luZyB0aGVpciBhY2NvdW50IGtleSBhdHRlc3RpbmcgdG8gdGhlIG93bmVyc2hpcCBvZiB0aGUgYGNhbmRpZGF0ZWAoICBhY2NvdW50O10BLSBvbmUgY3JlYXRlZCB1c2luZyB0aGVpciByaW5nLXZyZiBrZXkgYXR0ZXN0aW5nIHRvIHRoZSBvd25lcnNoaXAgb2YgdGhlIGByaW5nX3ZyZl9rZXlgGCAga2V5LgBhAVRoZSBtZXNzYWdlIHRvIGJlIHNpZ25lZCBieSBib3RoIGtleXMgZnJvbSB3aGljaCB0aGUgc2lnbmF0dXJlcyBhcmUgZ2VuZXJhdGVkIGlzIGNyZWF0ZWRVAWJ5IGNvbmNhdGVuYXRpbmcgdGhlIGJ5dGVzICJwb3A6cGVvcGxlLWxpdGU6cmVnaXN0ZXIgdXNpbmciIHdpdGggdGhlIGVuY29kZWQgYnl0ZXMgb2YtAXRoZSB1c2VyJ3MgYWNjb3VudCAoYGNhbmRpZGF0ZWApLCBhbmQgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhlIHJpbmcgVlJGIGtleUQoYHJpbmdfdnJmX2tleWApLgD8LSBgY2FuZGlkYXRlYDogVGhlIGNhbmRpZGF0ZSB0byBiZSByZWNvZ25pemVkIGFzIGEgbGl0ZSBwZXJzb24uYQEtIGBjYW5kaWRhdGVfc2lnbmF0dXJlYDogVGhlIHNpZ25hdHVyZSwgcHJvdmlkZWQgYnkgdGhlIGNhbmRpZGF0ZSwgdG8gYWxsb3cgdGhlIGF0dGVzdGVy3CAgdG8gY29tcGxldGUgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzIG9uIHRoZWlyIGJlaGFsZi4lAS0gYHJpbmdfdnJmX2tleWA6IFRoZSByaW5nIFZSRiBrZXkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaXRlIHBlcnNvbi5dAS0gYHJpbmdfdnJmX2tleV9zaWduYXR1cmVgOiBUaGUgcmluZyBWUkYgc2lnbmF0dXJlLCBwcm92aWRlZCBieSB0aGUgY2FuZGlkYXRlLCB0byBhbGxvd1UBICB0aGUgYXR0ZXN0ZXIgdG8gY29tcGxldGUgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBUaGlzIGFsc28gcHJvdmUgdGhlIG93bmVyc2hpcCBvZpAgIHRoZSByaW5nIFZSRiBrZXkgYnkgdGhlIGNhbmRpZGF0ZS5dAS0gY29uc3VtZXJfcmVnaXN0cmF0aW9uOiBPcHRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggY2FuIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbl0BICB0byBmb3J3YXJkIGEgY29uc3VtZXIgcmVnaXN0cmF0aW9uIHJlcXVlc3QgdG8gdGhlIGBMaXRlQ29uc3VtZXJSZWdpc3RyYXJgIHNlcnZpY2UuIElmUQEgIHByZXNlbnQsIGl0IGFsc28gY29udGFpbnMgYSBzaWduYXR1cmUgY3JlYXRlZCBieSB0aGUgdXNlciBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGUlASAgaW50ZW50LiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzaWduaW5nIHBheWxvYWQgZ2VuZXJhdGlvbiBhdmFpbGFibGUgaW7sICBbdHlwZXM6OkxpdGVDb25zdW1lclJlZ2lzdHJhdGlvblBhcmFtczo6c2lnbmluZ19wYXlsb2FkXS5IZGlzcGF0Y2hfYXNfc2lnbmVyBAEQY2FsbCABTEJveDxUOjpSdW50aW1lQ2FsbD4ABQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu1QQEGE9wdGlvbgQEVAHZBAEIEE5vbmUAAAAQU29tZQQA2QQAAAEAANkEDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXN4TGl0ZUNvbnN1bWVyUmVnaXN0cmF0aW9uUGFyYW1zCCRBY2NvdW50SWQBBCRTaWduYXR1cmUBLQQAFAEkc2lnbmF0dXJlLQQBJFNpZ25hdHVyZQABHGFjY291bnQEASRBY2NvdW50SWQAAThpZGVudGlmaWVyX2tleTUEAVxDb21tdW5pY2F0aW9uSWRlbnRpZmllcgABIHVzZXJuYW1lOQQBIFVzZXJuYW1lAAFEcmVzZXJ2ZWRfdXNlcm5hbWXdBAFAT3B0aW9uPFVzZXJuYW1lPgAA3QQEGE9wdGlvbgQEVAE5BAEIEE5vbmUAAAAQU29tZQQAOQQAAAEAAOEEDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzGHBhbGxldBBDYWxsBARUAAEgUHJlZ2lzdGVyX2xpdGVfcGVyc29uDAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAASB1c2VybmFtZTkEASBVc2VybmFtZQABRHJlc2VydmVkX3VzZXJuYW1l3QQBQE9wdGlvbjxVc2VybmFtZT4AAASUUmVnaXN0ZXIgYSBsaXRlIHBlcnNvbiBhcyBhIGNvbnN1bWVyLjxyZWdpc3Rlcl9wZXJzb24MAVBsaW5rZWRfbGl0ZV9pZGVudGl0eQQBMFQ6OkFjY291bnRJZAABTGxpdGVfaWRlbnRpdHlfcHJvb2YtBAFQVDo6T2ZmY2hhaW5TaWduYXR1cmUAATx1c2VybmFtZV9jaG9pY2XlBAFYUGVyc29uYWxVc2VybmFtZUNob2ljZQABJJxSZWdpc3RlciBhIHByb3ZlbiBwZXJzb24gYXMgYSBjb25zdW1lci4AXQFUaGUgcGVyc29uIG11c3QgbGluayBhIHByZXZpb3VzbHkgcmVjb2duaXplZCBsaXRlIGlkZW50aXR5LCB3aGljaCB3aWxsIGJlIHVwZ3JhZGVkIHRvIGFZAWZ1bGwgcGVyc29uIGNvbnN1bWVyLiBJbiBvcmRlciB0byBwcm92ZSB0aGV5IGhvbGQgdGhlIGxpdGUgaWRlbnRpdHkgdGhleSB3YW50IHRvIGxpbmssYQF1c2VycyBtdXN0IHByb3ZpZGUgYSBgbGl0ZV9pZGVudGl0eV9wcm9vZmAgc2lnbmF0dXJlLCBjcmVhdGVkIGJ5IHNpZ25pbmcgdGhlIGFsaWFzIGJ5dGVziHVzaW5nIHRoZWlyIGxpdGUgY29uc3VtZXIgYWNjb3VudC4AOQFUaGUgY29uc3VtZXIgY2FuIGNob29zZSBpZiB0aGV5IHdhbnQgdG8gaGF2ZSBhIG5ldyB1c2VybmFtZSBvciB1c2UgYW4gZXhpc3RpbmcVAXJlc2VydmF0aW9uIG1hZGUgaW4gdGhlIG5hbWUgb2YgdGhlIGxpdGUgY29uc3VtZXIgd2hvIHdpbGwgYmUgbGlua2VkLmh0b3VjaF9wZXJzb25fYXV0aG9yaXphdGlvbgACEEkBVXBkYXRlIGEgcGVyc29uJ3MgYXV0aG9yaXphdGlvbiBieSBlbnN1cmluZyB0aGV5IGNhbiBzdGlsbCBhdXRoZW50aWNhdGUgYXMgcGVvcGxlLgBRAVRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBhdCBsZWFzdCBgTWluUGVyc29uQXV0aFVwZGF0ZUludGVydmFsYCBzZWNvbmRzIGFmdGVyIHRoZZRsYXN0IHVwZGF0ZSBpbiBvcmRlciB0byBwcmV2ZW50IHNwYW0ujHJlbW92ZV9leHBpcmVkX3VzZXJuYW1lX3Jlc2VydmF0aW9uCAEgdXNlcm5hbWU5BAEgVXNlcm5hbWUAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMgOQFSZW1vdmUgYW4gZXhwaXJlZCBlbnRyeSBmcm9tIGEgdXNlcm5hbWUgcmVzZXJ2YXRpb24gcXVldWUuIFRoZSB0YXJnZXQgZW50cnkgaXMBAWlkZW50aWZpZWQgYnkgYGFjY291bnRgIGFuZCBjYW4gYmUgYXQgYW55IHBvc2l0aW9uIGluIHRoZSBxdWV1ZS4dAUVhY2ggY2FsbCByZW1vdmVzIGV4YWN0bHkgb25lIGVudHJ5LCBzbyBpdCBtdXN0IGJlIGNhbGxlZCByZXBlYXRlZGx5IHRvkGNsZWFyIG11bHRpcGxlIGV4cGlyZWQgcmVzZXJ2YXRpb25zLgAtAVRoaXMgaXMgYSBwZXJtaXNzaW9ubGVzcyBjYWxsOyB0aGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZC4gVGhlIGBhY2NvdW50YDEBcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBmb3IgdHJhbnNhY3Rpb24gcG9vbCBkZWR1cGxpY2F0aW9uLCBhbGxvd2luZyBwYXJhbGxlbBEBc3VibWlzc2lvbnMgdGhhdCB0YXJnZXQgZGlmZmVyZW50IGV4cGlyZWQgZW50cmllcyBpbiB0aGUgc2FtZSBxdWV1ZS5UdXBkYXRlX2lkZW50aWZpZXJfa2V5BAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIABBDYVXBkYXRlIHRoZSBjb21tdW5pY2F0aW9uIGlkZW50aWZpZXIga2V5IG9mIGEgY29uc3VtZXIuAEEBVGhlIG9yaWdpbiBtdXN0IGJlIHRoZSBhY2NvdW50IHJlZ2lzdGVyZWQgZm9yIHRoYXQgY29uc3VtZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIwY3JlZGliaWxpdHkuhHNldF91c2VybmFtZV9yZXNlcnZhdGlvbl9kdXJhdGlvbgQBIGR1cmF0aW9uKAEMdTY0AAUMHQFTZXQgdGhlIGR1cmF0aW9uIGZvciB3aGljaCBhIHVzZXJuYW1lIHJlc2VydmF0aW9uIGlzIHZhbGlkLCBpbiBzZWNvbmRzLgBgVGhlIG9yaWdpbiBtdXN0IGJlIHJvb3QusHNldF9zdG10X3N0b3JlX2Fzc29jaWF0ZWRfYWNjb3VudF9pZF9hdF9zbG90CAEsc2xvdF9udW1iZXIMAQh1OAABLHNldF9hY2NvdW506QQBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAYsNQFBc3NvY2lhdGUgYW4gYWNjb3VudCB3aXRoIGEgc2xvdCBmb3Igc3RhdGVtZW50IHN0b3JlIGFjY2Vzcywgb3IgcmVzZXQgYSBzbG90LgARAVRoZSBhc3NvY2lhdGVkIGFjY291bnQgY2FuIHN1Ym1pdCBzdGF0ZW1lbnRzIHRvIHRoZSBzdGF0ZW1lbnQgc3RvcmUuhFRoZSBvcmlnaW4gbXVzdCBiZSBhIGxpdGUgcGVyc29uLkEBUmVmdW5kZWQgd2hlbiBhc3NpZ25pbmcgYW4gYWNjb3VudCB0byBhIGZyZWUgc2xvdCwgb3Igd2hlbiByZXBsYWNpbmcvY2xlYXJpbmcgYW4pAW9jY3VwaWVkIHNsb3Qgd2hvc2UgbGFzdCB1cGRhdGUgaXMgb2xkZXIgdGhhbiBgQWNjb3VudHNBcGlSZWZ1bmRDb29sZG93bmAuACxQYXJhbWV0ZXJzOkUBKiBgc2xvdF9udW1iZXJgOiBtdXN0IGJlIGluIGAwLi5BY2NvdW50c0FwaVNsb3RDb3VudGAuIChgQWNjb3VudHNBcGlTbG90Q291bnRgIGlzlCAgYXZhaWxhYmxlIGluIHRoZSBjb25zdGFudCBtZXRhZGF0YSk9ASogYHNldF9hY2NvdW50YDogYFNvbWVgIHRvIHNldCBhIG5ldyBhY2NvdW50LCBvciBgTm9uZWAgdG8gcmVzZXQgdG8gbm8gYWNjb3VudC5MZGVtb3RlX2F1dGhfZXhwaXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQABwwxAURlbW90ZSBhIGZ1bGwgcGVyc29uIHRvIGEgbGl0ZSBwZXJzb24gYWZ0ZXIgdGhlaXIgYXV0aG9yaXphdGlvbiBoYXMgZXhwaXJlZC4A9FRoaXMgaXMgYSBwZXJtaXNzaW9ubGVzcyBjYWxsOyB0aGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu5QQMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXNYUGVyc29uYWxVc2VybmFtZUNob2ljZQABCChTdGFuZGFsb25lBAA5BAEgVXNlcm5hbWUAAAAsUmVzZXJ2YXRpb24EADkEASBVc2VybmFtZQABAADpBAQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAAO0EDGxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXIYcGFsbGV0EENhbGwEBFQAAQgoYWRkX2NodW5rcwwBNHJpbmdfZXhwb25lbnTxBAEwUmluZ0V4cG9uZW50AAEocGFnZV9pbmRleDgBJFBhZ2VJbmRleAABOGVuY29kZWRfY2h1bmtzGAEcVmVjPHU4PgAAEGhBZGRzIGEgbmV3IHBhZ2Ugb2YgY2h1bmtzLgBBAVRoZSBoYXNoIG9mIHRoZSBjaHVua3MgbXVzdCBtYXRjaCB0aGUgaGFzaCBzdG9yZWQgb24tY2hhaW4gaW4gYENodW5rUGFnZUhhc2hlc2Au3FRoZSBjYWxsIHdpbGwgZmFpbCBpZiB0aGUgcGFnZSBhbHJlYWR5IGV4aXN0cyBvbi1jaGFpbi5Uc2V0X2NodW5rX3BhZ2VfaGFzaGVzCAE0cmluZ19leHBvbmVudPEEATBSaW5nRXhwb25lbnQAASxwYWdlX2hhc2hlc/UEAUhWZWM8Q2h1bmtQYWdlSGFzaD4AARgNAVNldHMgdGhlIGV4cGVjdGVkIGhhc2hlcyBmb3IgY2h1bmsgcGFnZXMgZm9yIGEgZ2l2ZW4gcmluZyBleHBvbmVudC4AMQFUaGlzIGlzIGEgcm9vdC1vbmx5IGNhbGwgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGUgZXhwZWN0ZWQgaGFzaGVzIHRoYXQgY2h1bmtznG11c3QgbWF0Y2ggd2hlbiBhZGRlZCB2aWEgYGFkZF9jaHVua3NgLgCIQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3Qgb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7xBBA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eTBSaW5nRXhwb25lbnQAAQwQUjJlOQAJABRSMmUxMAAKABRSMmUxNAAOAAD1BAAAAggA+QQMUGluZGl2X3BhbGxldF9tZW1iZXJzGHBhbGxldBBDYWxsBARUAAEQRGJ1aWxkX3JpbmdfbWFudWFsDAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAShyaW5nX2luZGV4OAEkUmluZ0luZGV4AAEUbGltaXQJAwEsT3B0aW9uPHUzMj4AZBTIQnVpbGQgYSByaW5nIHJvb3QgYnkgaW5jbHVkaW5nIHJlZ2lzdGVyZWQgbWVtYmVycy4AWQFUaGlzIHRhc2sgaXMgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhbGxldCB0aHJvdWdoIHRoZSBgb25faWRsZWAgaG9vayB3aGVuZXZlckUBdGhlcmUgaXMgbGVmdG92ZXIgd2VpZ2h0IGluIGEgYmxvY2suIFRoaXMgY2FsbCBpcyBtZWFudCB0byBiZSBhIGJhY2t1cCBpbiBjYXNlIG9m9GV4dHJlbWUgY29uZ2VzdGlvbiBhbmQgc2hvdWxkIGJlIHN1Ym1pdHRlZCBieSBzaWduZWQgb3JpZ2lucy5Yb25ib2FyZF9tZW1iZXJzX21hbnVhbAQBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAGUcOQFPbmJvYXJkIG1lbWJlcnMgaW50byBhIHJpbmcgYnkgdGFraW5nIHRoZWlyIGtleXMgZnJvbSB0aGUgb25ib2FyZGluZyBxdWV1ZSBhbmRJAXJlZ2lzdGVyaW5nIHRoZW0gaW50byB0aGUgcmluZy4gVGhpcyBkb2VzIG5vdCBjb21wdXRlIHRoZSByb290LCB0aGF0IGlzIGRvbmUgdXNpbmc0YGJ1aWxkX3JpbmdgLgBZAVRoaXMgdGFzayBpcyBwZXJmb3JtZWQgYXV0b21hdGljYWxseSBieSB0aGUgcGFsbGV0IHRocm91Z2ggdGhlIGBvbl9pZGxlYCBob29rIHdoZW5ldmVyRQF0aGVyZSBpcyBsZWZ0b3ZlciB3ZWlnaHQgaW4gYSBibG9jay4gVGhpcyBjYWxsIGlzIG1lYW50IHRvIGJlIGEgYmFja3VwIGluIGNhc2Ugb2b0ZXh0cmVtZSBjb25nZXN0aW9uIGFuZCBzaG91bGQgYmUgc3VibWl0dGVkIGJ5IHNpZ25lZCBvcmlnaW5zLixtZXJnZV9yaW5ncwwBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAE8YmFzZV9yaW5nX2luZGV4OAEkUmluZ0luZGV4AAFEdGFyZ2V0X3JpbmdfaW5kZXg4ASRSaW5nSW5kZXgAZgxRAU1lcmdlIHRoZSBtZW1iZXJzIGluIHR3byByaW5ncyBpbnRvIGEgc2luZ2xlLCBuZXcgcmluZy4gSW4gb3JkZXIgZm9yIHRoZSByaW5ncyB0byBiZTUBZWxpZ2libGUgZm9yIG1lcmdpbmcsIHRoZXkgbXVzdCBiZSBiZWxvdyAxLzIgb2YgbWF4IGNhcGFjaXR5LCBoYXZlIG5vIHBlbmRpbmfgc3VzcGVuc2lvbnMgYW5kIG5vdCBiZSB0aGUgdG9wIHJpbmcgdXNlZCBmb3Igb25ib2FyZGluZy5Mc2V0X29uYm9hcmRpbmdfc2l6ZQgBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAE8b25ib2FyZGluZ19zaXplOAEMdTMyAAgETQFGb3JjZSBzZXQgdGhlIG9uYm9hcmRpbmcgc2l6ZSBmb3IgYSBjb2xsZWN0aW9uLiBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2VzLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79BAxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0EENhbGwEBFQAAVQUc3BsaXQEAShzcGxpdF9pbnRvAQUBjFZlYzwoQ29pblZhbHVlLCBWZWM8VDo6QWNjb3VudElkPik+AABMhFNwbGl0IGEgY29pbiBpbnRvIG11bHRpcGxlIGNvaW5zLgA9AVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OkNvaW5dLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgdHJhbnNhY3Rpb25YZXh0ZW5zaW9uIFtBc0NvaW5hZ2VdLgDUVGhlIGNhbGwgaXMgZnJlZSBhbmQgYWdlcyB0aGUgcmVzdWx0aW5nIGNvaW5zIGJ5IG9uZS4ASQFUaGUgYHNwbGl0X2ludG9gIHBhcmFtZXRlciBjb250YWlucyBhIHZlY3RvciBvZiBwYWlycywgZWFjaCBwYWlyIGNvbnRhaW5pbmcgYSBjb2luVQF2YWx1ZSBhbmQgYSBsaXN0IG9mIGRlc3RpbmF0aW9uIGFjY291bnQgaWRzLiBGb3IgZWFjaCBwYWlyLCBhIG5ldyBjb2luIHdpdGggdGhlIGdpdmVuxHZhbHVlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZGVzdGluYXRpb24gYWNjb3VudCBpZC4AWFZhbGlkaXR5IHJlcXVpcmVtZW50czrgKiBUaGUgY29pbidzIGFnZSBtdXN0IGJlIGxlc3MgdGhhbiBbQ29uZmlnOjpNYXhpbXVtQWdlXS5NASogVGhlIGNvaW4gdmFsdWUgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBkZWZpbmVkIGJ5IFtDb25maWc6Ok1pbmltdW1FeHBvbmVudF0gYW5kcCAgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS4tASogVGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgbXVzdCBlcXVhbCB0aGUgdmFsdWUgb2YgdGhlIG9yaWdpbiBjb2luLgkBKiBUaGUgbnVtYmVyIG9mIG91dHB1dHMgbXVzdCBub3QgZXhjZWVkIFtDb25maWc6Ok1heFNwbGl0T3V0cHV0c10uJQEqIFRoZSBhZ2Ugb2YgdGhlIG5ldyBjb2lucyBpcyBzZXQgdG8gdGhlIGFnZSBvZiB0aGUgb3JpZ2luIGNvaW4gcGx1cyBvbmUu4CogRWFjaCBkZXN0aW5hdGlvbiBhY2NvdW50IG11c3Qgbm90IGFscmVhZHkgaGF2ZSBhIGNvaW4uIHRyYW5zZmVyBAEIdG8EATBUOjpBY2NvdW50SWQAASiMVHJhbnNmZXIgYSBjb2luIHRvIGFub3RoZXIgYWNjb3VudC4APQFUaGUgb3JpZ2luIG11c3QgYmUgYSBbT3JpZ2luOjpDb2luXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4A0FRoZSBjYWxsIGlzIGZyZWUgYW5kIGFnZXMgdGhlIHJlc3VsdGluZyBjb2luIGJ5IG9uZS4AWFZhbGlkaXR5IHJlcXVpcmVtZW50czrcKiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBtdXN0IG5vdCBhbHJlYWR5IGhhdmUgYSBjb2luLuAqIFRoZSBjb2luJ3MgYWdlIG11c3QgYmUgbGVzcyB0aGFuIFtDb25maWc6Ok1heGltdW1BZ2VdLlxsb2FkX3JlY3ljbGVyX3dpdGhfY29pbggBKG1lbWJlcl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAE4U2lnbmF0dXJlT2Y8VD4AAjxoTG9hZCBjb2luIGludG8gYSByZWN5Y2xlci4APQFUaGUgb3JpZ2luIG11c3QgYmUgYSBbT3JpZ2luOjpDb2luXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4ARFRoZSBjYWxsIGlzIGZyZWUuAFkBVGhlIGBtZW1iZXJfa2V5YCBwYXJhbWV0ZXIgaXMgdGhlIG1lbWJlciBrZXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlY3ljbGVyLCBhbmQgd2hvc2WoYWxpYXMgaXMgdXNlZCB0byB1bmxvYWQgZnJvbSB0aGUgcmVjeWNsZXIuAFhWYWxpZGl0eSByZXF1aXJlbWVudHM6AQEqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBub3QgYWxyZWFkeSBiZSB1c2VkIGluIGFub3RoZXIgcmVjeWNsZXIu0CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIChpLmUuIHdlbGwgZm9ybWVkKS5RASogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgYSB2YWxpZCBzaWduYXR1cmUgb2YgdGhlIGNvaW4ncyBhY2NvdW50IGlkIGJ5IHRoZTwgIGBtZW1iZXJfa2V5YC6EbG9hZF9yZWN5Y2xlcl93aXRoX2V4dGVybmFsX2Fzc2V0EAEwcHJlc2VydmF0aW9uCQUBRENvZGVjUHJlc2VydmF0aW9uAAEUdmFsdWVtAwEkQ29pblZhbHVlAAEobWVtYmVyX2tleVEEASxNZW1iZXJPZjxUPgABSHByb29mX29mX293bmVyc2hpcGEEAThTaWduYXR1cmVPZjxUPgADcJBMb2FkIGV4dGVybmFsIGFzc2V0IGludG8gYSByZWN5Y2xlci4AjFRoZSBvcmlnaW4gbXVzdCBiZSBhIHNpZ25lZCBvcmlnaW4uAIBUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHJlZnVuZGVkLgBFAVRoZSBgcHJlc2VydmF0aW9uYCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyB0aGUgYXNzZXQgdHJhbnNmZXIgc2hvdWxkIHByZXNlcnZlIHRoZURzaWduZXIncyBhY2NvdW50LgA5AVRoZSBgdmFsdWVgIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGNvaW4gdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIHJlY3ljbGVyLj0BVGhlIGVxdWl2YWxlbnQgYW1vdW50IG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIHNpZ25lciB0b0x0aGUgcGFsbGV0IGFjY291bnQuAFkBVGhlIGBtZW1iZXJfa2V5YCBwYXJhbWV0ZXIgaXMgdGhlIG1lbWJlciBrZXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlY3ljbGVyLCBhbmQgd2hvc2WoYWxpYXMgaXMgdXNlZCB0byB1bmxvYWQgZnJvbSB0aGUgcmVjeWNsZXIuAFUBVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIHBhcmFtZXRlciBpcyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBzaWduZXIncyBhY2NvdW50IGlkIGJ5IHRoZTRgbWVtYmVyX2tleWAuADRSZXF1aXJlbWVudHM6AQEqIFRoZSBgbWVtYmVyX2tleWAgbXVzdCBub3QgYWxyZWFkeSBiZSB1c2VkIGluIGFub3RoZXIgcmVjeWNsZXIu0CogVGhlIGBtZW1iZXJfa2V5YCBtdXN0IGJlIHZhbGlkIChpLmUuIHdlbGwgZm9ybWVkKS5BASogVGhlIGB2YWx1ZWAgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBkZWZpbmVkIGJ5IFtDb25maWc6Ok1pbmltdW1FeHBvbmVudF0gYW5kcCAgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS5VASogVGhlIHNpZ25lciBtdXN0IGhhdmUgZW5vdWdoIGJhbGFuY2Ugb2YgdGhlIHVuZGVybHlpbmcgYXNzZXQgdG8gY292ZXIgdGhlIGVxdWl2YWxlbnSIICBhbW91bnQgZm9yIHRoZSBnaXZlbiBjb2luIHZhbHVlLlkBKiBUaGUgYHByb29mX29mX293bmVyc2hpcGAgbXVzdCBiZSBhIHZhbGlkIHNpZ25hdHVyZSBvZiB0aGUgc2lnbmVyJ3MgYWNjb3VudCBpZCBieSB0aGU0YG1lbWJlcl9rZXlgLmR1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luFAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAEUdmFsdWVtAwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAQh0bwQBMFQ6OkFjY291bnRJZAAEZJRVbmxvYWQgYSByZWN5Y2xlciB0byBtaW50IGEgbmV3IGNvaW4uAF0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6VW5sb2FkVG9rZW5dIHdpdGggYGZlZTogVW5sb2FkRmVlOjpQcmVwYWlkYCwgd2hpY2ggY2FuIGJlQQFvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvbiBleHRlbnNpb24gW0FzQ29pbmFnZV0gdXNpbmcgYEFzVW5sb2FkVG9rZW5QZW9wbGVgLOxgQXNVbmxvYWRUb2tlbkxpdGVQZW9wbGVgLCBvciBgQXNVbmxvYWRUb2tlblBhaWRgIHZhcmlhbnRzLgBJAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdXNlciB0byBwcm92ZSB0aGV5IG93biBvbmUgb3IgbW9yZSBjb2lucyBpbiBhIHJlY3ljbGVyIHJpbmddAXdpdGhvdXQgcmV2ZWFsaW5nIHdoaWNoIHNwZWNpZmljIGNvaW5zIHRoZXkgb3duLiBJdCBjb25zb2xpZGF0ZXMgb25lIG9yIG11bHRpcGxlIGlucHV0c2hpbnRvIGEgc2luZ2xlIG91dHB1dCBjb2luLgAsUGFyYW1ldGVyczpFASogYGFsaWFzZXNgOiB0aGUgbGlzdCBvZiBhbGlhc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBrZXlzIGluY2x1ZGVkIGluIHRoZRUBICByZWN5Y2xlci4gVGhlIHByb29mcyBmb3IgdGhlc2UgYWxpYXNlcyBhcmUgY29udGFpbmVkIGluIHRoZSBvcmlnaW4u+CogYHZhbHVlYCBhbmQgYGluZGV4YDogaWRlbnRpZmllcyB0aGUgcmVjeWNsZXIgYmVpbmcgdW5sb2FkZWQu/CogYF9yZXZpc2lvbmA6IHRoZSByZWN5Y2xlciByZXZpc2lvbiB1c2VkIGZvciB0aGUgYWxpYXNfcHJvb2ZzLsQqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgbmV3IGNvaW4uADRSZXF1aXJlbWVudHM6KQEqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0gd2l0aCBgZmVlOiBVbmxvYWRGZWU6OlByZXBhaWRgLvAqIFRoZSByZWN5Y2xlciBpZGVudGlmaWVkIGJ5IGB2YWx1ZWAgYW5kIGBpbmRleGAgbXVzdCBleGlzdC5RASogVGhlIGFsaWFzIHByb29mcyBwcm92aWRlZCBpbiB0aGUgb3JpZ2luIG11c3QgYmUgdmFsaWQgZm9yIHRoZSByZWN5Y2xlcidzIHJldmlzaW9uLiEBKiBUaGUgYGFsaWFzZXNgIHByb3ZpZGVkIG11c3QgbWF0Y2ggdGhlIGFsaWFzZXMgZGVyaXZlZCBmcm9tIHRoZSBwcm9vZnMuFQEqIFRoZSBhbGlhc2VzIG11c3Qgbm90IGhhdmUgYmVlbiBhbHJlYWR5IHVubG9hZGVkIGZyb20gdGhpcyByZWN5Y2xlci68KiBUaGUgbnVtYmVyIG9mIGFsaWFzZXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by41ASogVGhlIHJlc3VsdGluZyBjb25zb2xpZGF0ZWQgdmFsdWUgbXVzdCBub3QgZXhjZWVkIFtDb25maWc6Ok1heGltdW1FeHBvbmVudF0ujHVubG9hZF9yZWN5Y2xlcl9pbnRvX2V4dGVybmFsX2Fzc2V0FAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAEUdmFsdWVtAwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAQh0bwQBMFQ6OkFjY291bnRJZAAFYPBVbmxvYWQgYSByZWN5Y2xlciB0byB3aXRoZHJhdyB0aGUgdW5kZXJseWluZyBleHRlcm5hbCBhc3NldC4AUQFUaGUgb3JpZ2luIG11c3QgYmUgW09yaWdpbjo6VW5sb2FkVG9rZW5dLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgdHJhbnNhY3Rpb25YZXh0ZW5zaW9uIFtBc0NvaW5hZ2VdLgBdAVdoZW4gYGZlZWAgaXMgW1VubG9hZEZlZTo6UHJlcGFpZF0gKHZpYSBmcmVlIG9yIHBhaWQgdW5sb2FkIHRva2VuKSwgbm8gZmVlIGlzIGRlZHVjdGVkLlEBV2hlbiBgZmVlYCBpcyBbVW5sb2FkRmVlOjpGcm9tT3V0cHV0XSwgdGhlIGZlZSBpcyBkZWR1Y3RlZCBmcm9tIHRoZSB1bmxvYWRlZCBhc3NldHMuADEBVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSB1c2VyIHRvIHdpdGhkcmF3IHRoZWlyIGNvaW5zIGJhY2sgaW50byB0aGUgdW5kZXJseWluZ2Rhc3NldCAoZS5nLiwgc3RhYmxlY29pbikuACxQYXJhbWV0ZXJzOkUBKiBgYWxpYXNlc2A6IHRoZSBsaXN0IG9mIGFsaWFzZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbWVtYmVyIGtleXMgaW5jbHVkZWQgaW4gdGhlFQEgIHJlY3ljbGVyLiBUaGUgcHJvb2ZzIGZvciB0aGVzZSBhbGlhc2VzIGFyZSBjb250YWluZWQgaW4gdGhlIG9yaWdpbi74KiBgdmFsdWVgIGFuZCBgaW5kZXhgOiBpZGVudGlmaWVzIHRoZSByZWN5Y2xlciBiZWluZyB1bmxvYWRlZC78KiBgX3JldmlzaW9uYDogdGhlIHJlY3ljbGVyIHJldmlzaW9uIHVzZWQgZm9yIHRoZSBhbGlhc19wcm9vZnMu5CogYHRvYDogdGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSB1bmRlcmx5aW5nIGFzc2V0LgA0UmVxdWlyZW1lbnRzOqwqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0u8CogVGhlIHJlY3ljbGVyIGlkZW50aWZpZWQgYnkgYHZhbHVlYCBhbmQgYGluZGV4YCBtdXN0IGV4aXN0LlEBKiBUaGUgYWxpYXMgcHJvb2ZzIHByb3ZpZGVkIGluIHRoZSBvcmlnaW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIHJlY3ljbGVyJ3MgcmV2aXNpb24uWQEqIFRoZSBhbGlhc2VzIG11c3Qgbm90IGhhdmUgYmVlbiBhbHJlYWR5IHVubG9hZGVkIChleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUgd2hlbiBgZmVlYBUBICBpcyBbVW5sb2FkRmVlOjpGcm9tT3V0cHV0XSwgd2hpY2ggd2FzIHByZS1tYXJrZWQgaW4gdGhlIGV4dGVuc2lvbikurHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX2NvaW4IAShtZW1iZXJfa2V5UQQBLE1lbWJlck9mPFQ+AAFIcHJvb2Zfb2Zfb3duZXJzaGlwYQQBuDxDcnlwdG9PZjxUPiBhcyBHZW5lcmF0ZVZlcmlmaWFibGU+OjpTaWduYXR1cmUABlQpAVBheSB0aGUgZmVlIHRvIHJlZ2lzdGVyIGEgbWVtYmVyIGtleSBmb3IgYSBwYWlkIHVubG9hZCB0b2tlbiB1c2luZyBhIGNvaW4uAD0BVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6Q29pbl0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc2FjdGlvblhleHRlbnNpb24gW0FzQ29pbmFnZV0uAEkBVGhlIGNvaW4gaXMgY29uc3VtZWQuIFRoZSBmZWUgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgY29pbidzIHZhbHVlIGFuZCB0cmFuc2ZlcnJlZCB0bx0BW0NvbmZpZzo6RmVlRGVzdGluYXRpb25dLiBUaGUgcmVtYWluaW5nIHZhbHVlIG9mIHRoZSBjb2luIGlzIGRlc3Ryb3llZC4A1ElmIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3JpZ2luIGNvaW4gaXMgc3RpbGwgY29uc3VtZWQuAF0BVG8gcHJvdGVjdCB0aGUgdXNlciBhZ2FpbnN0IHZhcnlpbmcgZmVlcywgaWYgdGhlIGNvaW4ncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGZlZSwgdGhl6GNhbGwgaXMgaW52YWxpZCAoYW4gaW52YWxpZCBjYWxsIG5ldmVyIGdvZXMgaW50byBhIGJsb2NrKS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrgKiBUaGUgY29pbidzIGFnZSBtdXN0IGJlIGxlc3MgdGhhbiBbQ29uZmlnOjpNYXhpbXVtQWdlXS7UKiBUaGUgY29pbiB2YWx1ZSBtdXN0IGJlIHN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIGZlZS7YKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQutHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX25hdGl2ZQgBKG1lbWJlcl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAG4PENyeXB0b09mPFQ+IGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAHPF0BUGF5IHRoZSBmZWUgdG8gcmVnaXN0ZXIgYSBtZW1iZXIga2V5IGZvciBhIHBhaWQgdW5sb2FkIHRva2VuIHVzaW5nIHRoZSBuYXRpdmUgY3VycmVuY3kuAGhUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkLgBFAVRoaXMgYWRkcyB0aGUgYG1lbWJlcl9rZXlgIHRvIGEgInBhaWQgdW5sb2FkIHRva2VuIHJpbmciLiBCZWluZyBwYXJ0IG9mIHRoaXMgcmluZ0kBYWxsb3dzIHRoZSB1c2VyIHRvIGxhdGVyIGdlbmVyYXRlIGFuIGFub255bW91cyBgVW5sb2FkVG9rZW5gIHRvIHVubG9hZCBhIHJlY3ljbGVyLgANAVRoZSBmZWUgaXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgY2FsbGVyIHRvIFtDb25maWc6OkZlZURlc3RpbmF0aW9uXS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrYKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQutHBheV9mb3JfcmVjeWNsZXJfdW5sb2FkX2ZlZV90b2tlbl93aXRoX3N0YWJsZQgBKG1lbWJlcl9rZXlRBAEsTWVtYmVyT2Y8VD4AAUhwcm9vZl9vZl9vd25lcnNoaXBhBAG4PENyeXB0b09mPFQ+IGFzIEdlbmVyYXRlVmVyaWZpYWJsZT46OlNpZ25hdHVyZQAIQF0BUGF5IHRoZSBmZWUgdG8gcmVnaXN0ZXIgYSBtZW1iZXIga2V5IGZvciBhIHBhaWQgdW5sb2FkIHRva2VuIHVzaW5nIHRoZSB1bmRlcmx5aW5nIGFzc2V0UGkuZS4gdGhlIHN0YWJsZWNvaW4uAGhUaGUgb3JpZ2luIG11c3QgYmUgU2lnbmVkLgBFAVRoaXMgYWRkcyB0aGUgYG1lbWJlcl9rZXlgIHRvIGEgInBhaWQgdW5sb2FkIHRva2VuIHJpbmciLiBCZWluZyBwYXJ0IG9mIHRoaXMgcmluZ0kBYWxsb3dzIHRoZSB1c2VyIHRvIGxhdGVyIGdlbmVyYXRlIGFuIGFub255bW91cyBgVW5sb2FkVG9rZW5gIHRvIHVubG9hZCBhIHJlY3ljbGVyLgANAVRoZSBmZWUgaXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgY2FsbGVyIHRvIFtDb25maWc6OkZlZURlc3RpbmF0aW9uXS4AXQFUaGUgYHByb29mX29mX293bmVyc2hpcGAgaXMgYSBzaWduYXR1cmUgb2YgdGhlIGNhbGxlcidzIGFjY291bnQgSUQgYnkgdGhlIGBtZW1iZXJfa2V5YC4lAVRoaXMgZW5zdXJlcyB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBtZW1iZXIga2V5IHRvIHByZXZlbnQgZnJvbnQtcnVubmluZy4ANFJlcXVpcmVtZW50czrYKiBUaGUgYG1lbWJlcl9rZXlgIG11c3QgYmUgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHVzZWQupCogVGhlIGBwcm9vZl9vZl9vd25lcnNoaXBgIG11c3QgYmUgdmFsaWQujHVubG9hZF9yZWN5Y2xlcnNfaW50b19jb2luX3Vuc3RhYmxlCAEYaW5wdXRzDQUBYFZlYzxVbmxvYWRSZWN5Y2xlcklucHV0PgABCHRvBAEwVDo6QWNjb3VudElkAAloKQFXQVJOSU5HOiBUaGlzIGNhbGwgaXMgdW5zdGFibGUgYW5kIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgYmVjYXVzZTEBcHJvb2ZzIGZvciBtdWx0aXBsZSByZWN5Y2xlcnMgbWF5IG5vdCBiZSBiYXRjaGFibGUgZm9yIHRoZSB2MSByZWxlYXNlLiBBbHNvLFUBdGhpcyBjYWxsIG1heSBsZWFrIHRvbyBtdWNoIGluZm9ybWF0aW9uIGJlY2F1c2UgdGhlIHJlc3VsdGluZyBjb2luIGluaGVyaXRzIHRoZSB3b3JzdERyZWN5Y2xlciBwcml2YWN5LgDoVW5sb2FkIG11bHRpcGxlIHJlY3ljbGVycyB0byBtaW50IGEgbmV3IGNvbnNvbGlkYXRlZCBjb2luLgBdAVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OlVubG9hZFRva2VuXSB3aXRoIGBmZWU6IFVubG9hZEZlZTo6UHJlcGFpZGAsIHdoaWNoIGNhbiBiZUEBb2J0YWluZWQgZnJvbSB0aGUgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIFtBc0NvaW5hZ2VdIHVzaW5nIGBBc1VubG9hZFRva2VuUGVvcGxlYCzsYEFzVW5sb2FkVG9rZW5MaXRlUGVvcGxlYCwgb3IgYEFzVW5sb2FkVG9rZW5QYWlkYCB2YXJpYW50cy4AWQFUaGlzIGZ1bmN0aW9uIGFsbG93cyBhIHVzZXIgdG8gY29uc29saWRhdGUgY29pbnMgZnJvbSBkaWZmZXJlbnQgcmVjeWNsZXJzIChwb3RlbnRpYWxsecR3aXRoIGRpZmZlcmVudCB2YWx1ZXMpIGludG8gYSBzaW5nbGUgb3V0cHV0IGNvaW4uACxQYXJhbWV0ZXJzOjEBKiBgaW5wdXRzYDogQSBsaXN0IG9mIGlucHV0cywgc3BlY2lmeWluZyB0aGUgcmVjeWNsZXIgYW5kIGFsaWFzZXMgdG8gdW5sb2FkLsQqIGB0b2A6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgbmV3IGNvaW4uADRSZXF1aXJlbWVudHM6KQEqIFRoZSBvcmlnaW4gbXVzdCBiZSBbT3JpZ2luOjpVbmxvYWRUb2tlbl0gd2l0aCBgZmVlOiBVbmxvYWRGZWU6OlByZXBhaWRgLpQqIEFsbCBzcGVjaWZpZWQgcmVjeWNsZXJzIG11c3QgZXhpc3QuPQEqIFRoZSBhbGlhcyBwcm9vZnMgaW4gdGhlIG9yaWdpbiBtdXN0IGNvcnJlc3BvbmQgc2VxdWVudGlhbGx5IHRvIHRoZSBhbGlhc2VzIGluLCAgYGlucHV0c2Au7CogVGhlIHRvdGFsIHZhbHVlIG9mIHVubG9hZGVkIGNvaW5zIG11c3QgYmUgYSBwb3dlciBvZiB0d28uFQEqIFRoZSByZXN1bHRpbmcgY29pbiB2YWx1ZSBtdXN0IG5vdCBleGNlZWQgW0NvbmZpZzo6TWF4aW11bUV4cG9uZW50XS49ASogYGlucHV0c2AgbXVzdCBub3QgYmUgZW1wdHksIGFuZCBlYWNoIGVsZW1lbnQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhbGlhcy60dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X3Vuc3RhYmxlCAEYaW5wdXRzDQUBYFZlYzxVbmxvYWRSZWN5Y2xlcklucHV0PgABCHRvBAEwVDo6QWNjb3VudElkAApoKQFXQVJOSU5HOiBUaGlzIGNhbGwgaXMgdW5zdGFibGUgYW5kIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgYmVjYXVzZRkBcHJvb2ZzIGZvciBtdWx0aXBsZSByZWN5Y2xlcnMgbWF5IG5vdCBiZSBiYXRjaGFibGUgZm9yIHRoZSB2MSByZWxlYXNlLgARAVVubG9hZCBtdWx0aXBsZSByZWN5Y2xlcnMgdG8gd2l0aGRyYXcgdGhlIHVuZGVybHlpbmcgZXh0ZXJuYWwgYXNzZXQuAFEBVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRyYW5zYWN0aW9uWGV4dGVuc2lvbiBbQXNDb2luYWdlXS4AXQFXaGVuIGBmZWVgIGlzIFtVbmxvYWRGZWU6OlByZXBhaWRdICh2aWEgZnJlZSBvciBwYWlkIHVubG9hZCB0b2tlbiksIG5vIGZlZSBpcyBkZWR1Y3RlZC5RAVdoZW4gYGZlZWAgaXMgW1VubG9hZEZlZTo6RnJvbU91dHB1dF0sIHRoZSBmZWUgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgdW5sb2FkZWQgYXNzZXRzLgBZAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdXNlciB0byBjb25zb2xpZGF0ZSBjb2lucyBmcm9tIGRpZmZlcmVudCByZWN5Y2xlcnMgKHBvdGVudGlhbGx5MQF3aXRoIGRpZmZlcmVudCB2YWx1ZXMpIGFuZCB3aXRoZHJhdyB0aGUgdG90YWwgdmFsdWUgYXMgdGhlIHVuZGVybHlpbmcgYXNzZXQuACxQYXJhbWV0ZXJzOjEBKiBgaW5wdXRzYDogQSBsaXN0IG9mIGlucHV0cywgc3BlY2lmeWluZyB0aGUgcmVjeWNsZXIgYW5kIGFsaWFzZXMgdG8gdW5sb2FkLrgqIGB0b2A6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgYXNzZXQuADRSZXF1aXJlbWVudHM6rCogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXS6UKiBBbGwgc3BlY2lmaWVkIHJlY3ljbGVycyBtdXN0IGV4aXN0Lj0BKiBUaGUgYWxpYXMgcHJvb2ZzIGluIHRoZSBvcmlnaW4gbXVzdCBjb3JyZXNwb25kIHNlcXVlbnRpYWxseSB0byB0aGUgYWxpYXNlcyBpbiwgIGBpbnB1dHNgLj0BKiBgaW5wdXRzYCBtdXN0IG5vdCBiZSBlbXB0eSwgYW5kIGVhY2ggZWxlbWVudCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGFsaWFzLl0BKiBGb3IgW1VubG9hZEZlZTo6RnJvbU91dHB1dF0sIHRoZSBmaXJzdCBhbGlhcyBvZiB0aGUgZmlyc3QgaW5wdXQgd2FzIHByZS1tYXJrZWQgaW4gdGhlMCAgZXh0ZW5zaW9uLsR1bmxvYWRfcmVjeWNsZXJfaW50b19leHRlcm5hbF9hc3NldF9ub25fYW5vbnltb3VzEAEUaW5wdXQRBQFMVW5sb2FkUmVjeWNsZXJJbnB1dAABMGFsaWFzX3Byb29mc3EDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEIdG8EATBUOjpBY2NvdW50SWQAATBmZWVfY3VycmVuY3kVBQEsRmVlQ3VycmVuY3kACxgxAVVubG9hZCBhIHJlY3ljbGVyIHRvIHdpdGhkcmF3IHRoZSB1bmRlcmx5aW5nIGV4dGVybmFsIGFzc2V0IChub24tYW5vbnltb3VzKS4AVQFDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBbU2VsZjo6dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X25vbl9hbm9ueW1vdXNddGZvciB0aGUgc2luZ2xlLXJlY3ljbGVyIGNhc2UuAFkBU2VlIFtTZWxmOjp1bmxvYWRfcmVjeWNsZXJzX2ludG9fZXh0ZXJuYWxfYXNzZXRfbm9uX2Fub255bW91c10gZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi7IdW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X25vbl9hbm9ueW1vdXMQARhpbnB1dHMNBQFgVmVjPFVubG9hZFJlY3ljbGVySW5wdXQ+AAEwYWxpYXNfcHJvb2ZzcQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAQh0bwQBMFQ6OkFjY291bnRJZAABMGZlZV9jdXJyZW5jeRUFASxGZWVDdXJyZW5jeQAMUFEBVW5sb2FkIG11bHRpcGxlIHJlY3ljbGVycyB0byB3aXRoZHJhdyB0aGUgdW5kZXJseWluZyBleHRlcm5hbCBhc3NldCAobm9uLWFub255bW91cykuAGEBVGhpcyBpcyBhIG5vbi1hbm9ueW1vdXMgdmVyc2lvbiBvZiBbU2VsZjo6dW5sb2FkX3JlY3ljbGVyc19pbnRvX2V4dGVybmFsX2Fzc2V0X3Vuc3RhYmxlXUEBd2hlcmUgdGhlIGZlZSBpcyBwYWlkIGV4cGxpY2l0bHkgYnkgdGhlIHNpZ25lciByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBhbm9ueW1vdXNIdW5sb2FkIHRva2VuIHJpbmcuACxQYXJhbWV0ZXJzOjEBKiBgaW5wdXRzYDogQSBsaXN0IG9mIGlucHV0cywgc3BlY2lmeWluZyB0aGUgcmVjeWNsZXIgYW5kIGFsaWFzZXMgdG8gdW5sb2FkLlUBKiBgYWxpYXNfcHJvb2ZzYDogdGhlIHByb29mcyBmb3IgYWxsIGFsaWFzZXMgYWNyb3NzIGFsbCBpbnB1dHMsIHNpZ25lZCBvdmVyIGEgbWVzc2FnZVUBICB0aGF0IGluY2x1ZGVzIHRoZSBzaWduZXIuIFRoZSBwcm9vZnMgbXVzdCBjb3JyZXNwb25kIHNlcXVlbnRpYWxseSB0byB0aGUgYWxpYXNlcyBpbiwgIGBpbnB1dHNgLrgqIGB0b2A6IHRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGZvciB0aGUgYXNzZXQuMQEqIGBmZWVfY3VycmVuY3lgOiB3aGV0aGVyIHRvIHBheSB0aGUgZmVlIGluIG5hdGl2ZSBjdXJyZW5jeSBvciBzdGFibGUgYXNzZXQuADRSZXF1aXJlbWVudHM6cCogVGhlIG9yaWdpbiBtdXN0IGJlIFNpZ25lZC6UKiBBbGwgc3BlY2lmaWVkIHJlY3ljbGVycyBtdXN0IGV4aXN0Li0BKiBUaGUgYWxpYXMgcHJvb2ZzIG11c3QgY29ycmVzcG9uZCBzZXF1ZW50aWFsbHkgdG8gdGhlIGFsaWFzZXMgaW4gYGlucHV0c2AuOQEqIGBpbnB1dHNgIG11c3Qgbm90IGJlIGVtcHR5IGFuZCBlYWNoIGVsZW1lbnQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhbGlhcy7kKiBUaGUgc2lnbmVyIG11c3QgaGF2ZSBzdWZmaWNpZW50IGJhbGFuY2UgdG8gcGF5IHRoZSBmZWUuaHVubG9hZF9yZWN5Y2xlcl9pbnRvX2NvaW5zFAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAEUdmFsdWVtAwEkQ29pblZhbHVlAAEUaW5kZXg4ASRSaW5nSW5kZXgAASByZXZpc2lvbjgBNFJldmlzaW9uSW5kZXgAAShzcGxpdF9pbnRvAQUBjFZlYzwoQ29pblZhbHVlLCBWZWM8VDo6QWNjb3VudElkPik+AA101FVubG9hZCBhIHJlY3ljbGVyIHRvIG1pbnQgbXVsdGlwbGUgbmV3IGNvaW5zIChzcGxpdCkuACkBVGhlIG9yaWdpbiBtdXN0IGJlIGEgW09yaWdpbjo6VW5sb2FkVG9rZW5dIHdpdGggYGZlZTogVW5sb2FkRmVlOjpQcmVwYWlkYC4ARQFUaGlzIGZ1bmN0aW9uIGNvbWJpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFtTZWxmOjp1bmxvYWRfcmVjeWNsZXJfaW50b19jb2luXSBhbmRFAVtTZWxmOjpzcGxpdF0gaW4gYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvbi4gVGhlIHJlc3VsdGluZyBjb2lucycgYWdlIGlzIDEgYmVjYXVzZUUBdGhlIGFjdGlvbiBvZiBzcGxpdHRpbmcgYWdlIGNvaW5zLiBUaGlzIGlzIGFsc28gaW1wb3J0YW50IGJlY2F1c2UgcmVzdWx0aW5nIGNvaW5z6GFyZSBub3QgZW50aXJlbHkgZnJlc2gsIHRoZXkgY2FuIGJlIGxpbmtlZCB0byBvdGhlciBjb2lucy4AWQFVbmxpa2UgW1NlbGY6OnVubG9hZF9yZWN5Y2xlcl9pbnRvX2NvaW5dLCB0aGlzIGNhbGwgZG9lcyAqKm5vdCoqIHJlcXVpcmUgdGhlIG51bWJlciBvZkUBYWxpYXNlcyB0byBiZSBhIHBvd2VyIG9mIHR3by4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgdG90YWwgdmFsdWUgb2YgdGhlUQF1bmxvYWRlZCBhbGlhc2VzIG1hdGNoZXMgdGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgc3BlY2lmaWVkIGluIGBzcGxpdF9pbnRvYC4ALFBhcmFtZXRlcnM6RQEqIGBhbGlhc2VzYDogdGhlIGxpc3Qgb2YgYWxpYXNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZW1iZXIga2V5cyBpbmNsdWRlZCBpbiB0aGUVASAgcmVjeWNsZXIuIFRoZSBwcm9vZnMgZm9yIHRoZXNlIGFsaWFzZXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luLvgqIGB2YWx1ZWAgYW5kIGBpbmRleGA6IGlkZW50aWZpZXMgdGhlIHJlY3ljbGVyIGJlaW5nIHVubG9hZGVkLvwqIGBfcmV2aXNpb25gOiB0aGUgcmVjeWNsZXIgcmV2aXNpb24gdXNlZCBmb3IgdGhlIGFsaWFzX3Byb29mcy5JASogYHNwbGl0X2ludG9gOiBhIHZlY3RvciBvZiBwYWlycywgZWFjaCBwYWlyIGNvbnRhaW5pbmcgYSBjb2luIHZhbHVlIGFuZCBhIGxpc3Qgb2ZoICBkZXN0aW5hdGlvbiBhY2NvdW50IGlkcy4ANFJlcXVpcmVtZW50czopASogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OlVubG9hZFRva2VuXSB3aXRoIGBmZWU6IFVubG9hZEZlZTo6UHJlcGFpZGAu8CogVGhlIHJlY3ljbGVyIGlkZW50aWZpZWQgYnkgYHZhbHVlYCBhbmQgYGluZGV4YCBtdXN0IGV4aXN0LlEBKiBUaGUgYWxpYXMgcHJvb2ZzIHByb3ZpZGVkIGluIHRoZSBvcmlnaW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIHJlY3ljbGVyJ3MgcmV2aXNpb24uIQEqIFRoZSBgYWxpYXNlc2AgcHJvdmlkZWQgbXVzdCBtYXRjaCB0aGUgYWxpYXNlcyBkZXJpdmVkIGZyb20gdGhlIHByb29mcy5hASogVGhlIHRvdGFsIHZhbHVlIG9mIHRoZSBuZXcgY29pbnMgZGVmaW5lZCBpbiBgc3BsaXRfaW50b2AgbXVzdCBlcXVhbCB0aGUgdG90YWwgdmFsdWUgb2ZUICB0aGUgdW5sb2FkZWQgY29pbnMu4CogRWFjaCBkZXN0aW5hdGlvbiBhY2NvdW50IG11c3Qgbm90IGFscmVhZHkgaGF2ZSBhIGNvaW4uoGRpcmVjdF9vZmZib2FyZF9jb2luX2ludG9fZXh0ZXJuYWxfYXNzZXQEAQh0bwQBMFQ6OkFjY291bnRJZAAOOCUBRGlyZWN0bHkgb2ZmYm9hcmQgYSBmcmVzaCwgMC1hZ2UgY29pbiBpbnRvIHRoZSB1bmRlcmx5aW5nIGV4dGVybmFsIGFzc2V0LgBFAVRoZSBvcmlnaW4gbXVzdCBiZSBhIFtPcmlnaW46OkNvaW5dLCBvYnRhaW5lZCB0aHJvdWdoIFtBc0NvaW5hZ2VdIHVzaW5nIGBBc0NvaW5gLgANAUJlY2F1c2UgdGhlIGNvaW4gbXVzdCBiZSBmcmVzaCAoYGFnZSA9PSAwYCksIHRoaXMgY2FsbCBieXBhc3NlcyB0aGVJAXJlY3ljbGVyL3VubG9hZC10b2tlbiBvZmZib2FyZGluZyBmbG93IGFuZCByZWxlYXNlcyB0aGUgdW5kZXJseWluZyBhc3NldCBkaXJlY3RseS4ALFBhcmFtZXRlcnM6PQEqIGB0b2A6IGRlc3RpbmF0aW9uIGFjY291bnQgdGhhdCByZWNlaXZlcyB0aGUgcmVsZWFzZWQgdW5kZXJseWluZyBhc3NldCBhbW91bnQuADRSZXF1aXJlbWVudHM6kCogVGhlIG9yaWdpbiBtdXN0IGJlIFtPcmlnaW46OkNvaW5dLqgqIFRoZSBjb2luIG11c3QgYmUgZnJlc2g6IGBjb2luLmFnZSA9PSAwYC4JASogVGhlIGNvaW4gdmFsdWUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIHVuZGVybHlpbmctYXNzZXQgYW1vdW50LjhjbGVhbl9yZWN5Y2xlcgQBFHZhbHVlbQMBJENvaW5WYWx1ZQBlHHRDbGVhbiB1cCBhbiBleHBpcmVkIHJlY3ljbGVyLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UuAA0BVGhpcyByZW1vdmVzIGFuIG9sZCByZWN5Y2xlciB0aGF0IGhhcyBleGNlZWRlZCBpdHMgZXhwaXJhdGlvbiB0aW1lLkkBQW55IHJlbWFpbmluZyAobm90IHVubG9hZGVkKSB2YWx1ZSBpbiB0aGUgcmVjeWNsZXIgaXMgY29uc2lkZXJlZCBsb3N0IGFuZCBhZGRlZCB0b3RbVG90YWxWYWx1ZU9mRGVzdHJveWVkQ29pbnNdLmRjbGVhbl9jb25zdW1lZF9mcmVlX3Rva2VuBAEYcGVyaW9kOAEYUGVyaW9kAGYM/ENsZWFudXAgc3RvcmFnZSBmb3IgY29uc3VtZWQgZnJlZSB1bmxvYWQgdG9rZW5zIG9mIG9sZCBwZXJpb2RzLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UucGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX3JpbmcIARhwZXJpb2Q4ARhQZXJpb2QAAShyaW5nX2luZGV4OAEkUmluZ0luZGV4AGgYCQFDbGVhbiB1cCBhIHNpbmdsZSByaW5nIGluIGFuIGV4cGlyZWQgcGFpZCB1bmxvYWQgdG9rZW4gY29sbGVjdGlvbi4AQQFUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gVGhlIG9yaWdpbiBtdXN0IGJlIGF1dGhvcml6ZWQgYW5kIGZyb20gbG9jYWwgc291cmNlLikBUmluZ3MgbXVzdCBiZSBjbGVhbmVkIHNlcXVlbnRpYWxseSAocmluZyAwIGZpcnN0LCB0aGVuIDEsIGV0Yy4pIGJlZm9yZSB0aGV0Y29sbGVjdGlvbiBjYW4gYmUgZGVsZXRlZCB2aWGNAVtgZGVsZXRlX2V4cGlyZWRfcGFpZF91bmxvYWRfdG9rZW5fY29sbGVjdGlvbmBdKFNlbGY6OmRlbGV0ZV9leHBpcmVkX3BhaWRfdW5sb2FkX3Rva2VuX2NvbGxlY3Rpb24pLkxjbGVhbl9yZWN5Y2xlcl9kdXN0AGkUcENsZWFuIHVwIGR1c3QgZm9yIHJlY3ljbGVycy4AQQFUaGlzIGlzIGEgbWFpbnRlbmFuY2UgY2FsbC4gVGhlIG9yaWdpbiBtdXN0IGJlIGF1dGhvcml6ZWQgYW5kIGZyb20gbG9jYWwgc291cmNlLkkBUmVtb3ZlcyB1cCB0byBEVVNUX0NMRUFOVVBfQkFUQ0hfU0laRSB1bmxvYWRlZCBhbGlhcyBlbnRyaWVzIHBlciBjYWxsIHRvIGJvdW5kIHRoZShvcGVyYXRpb24ucGNsZWFuX3BhaWRfdW5sb2FkX3Rva2VuX2R1c3QAagyUQ2xlYW4gdXAgZHVzdCBmb3IgcGFpZCB1bmxvYWQgdG9rZW5zLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UurGRlbGV0ZV9leHBpcmVkX3BhaWRfdW5sb2FkX3Rva2VuX2NvbGxlY3Rpb24EARhwZXJpb2Q4ARhQZXJpb2QAaxhFAURlbGV0ZSBhbiBleHBpcmVkIHBhaWQgdW5sb2FkIHRva2VuIGNvbGxlY3Rpb24gYWZ0ZXIgYWxsIHJpbmdzIGhhdmUgYmVlbiBjbGVhbmVkLgBBAVRoaXMgaXMgYSBtYWludGVuYW5jZSBjYWxsLiBUaGUgb3JpZ2luIG11c3QgYmUgYXV0aG9yaXplZCBhbmQgZnJvbSBsb2NhbCBzb3VyY2UukEFsbCByaW5ncyBtdXN0IGhhdmUgYmVlbiBjbGVhbmVkIHZpYUEBW2BjbGVhbl9wYWlkX3VubG9hZF90b2tlbl9yaW5nYF0oU2VsZjo6Y2xlYW5fcGFpZF91bmxvYWRfdG9rZW5fcmluZykgYmVmb3JlIHRoaXM4Y2FuIGJlIGNhbGxlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuAQUAAAIFBQAFBQAABAhtA8wACQUMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldERDb2RlY1ByZXNlcnZhdGlvbgABDChFeHBlbmRhYmxlAAAAHFByb3RlY3QAAQAgUHJlc2VydmUAAgAADQUAAAIRBQARBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0TFVubG9hZFJlY3ljbGVySW5wdXQAABABFHZhbHVlbQMBJENvaW5WYWx1ZQABFGluZGV4OAEkUmluZ0luZGV4AAEgcmV2aXNpb244ATRSZXZpc2lvbkluZGV4AAEcYWxpYXNlc/UEAShWZWM8QWxpYXM+AAAVBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0LEZlZUN1cnJlbmN5AAEIGE5hdGl2ZQAAABhTdGFibGUAAQAAGQUMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldBBDYWxsBARUAAEQOHNjaGVkdWxlX2V2ZW50BAEoZXZlbnRfaW5mbx0FAThFdmVudEluZm9PZjxUPgAAGGRTY2hlZHVsZSBhIGFpcmRyb3AgZXZlbnQuAJBUaGUgb3JpZ2luIG11c3QgYmUgYFNjaGVkdWxlT3JpZ2luYC4ATQFUaGUgdG90YWwgYW1vdW50IHRvIGJlIGRpc3RyaWJ1dGVkIGluIHByaXplcyB3aWxsIGJlIHB1dCBvbiBob2xkLiBUaGUgZXZlbnQgd2lsbCBiZbxhZGRlZCB0byB0aGUgc2NoZWR1bGUgYW5kIGJlIGdpdmVuIGFuIGV2ZW50IGlkLlhyZW1vdmVfc2NoZWR1bGVkX2V2ZW50BAEgZXZlbnRfaWQ4ARxFdmVudElkAAEghFJlbW92ZSBhIHNjaGVkdWxlZCBhaXJkcm9wIGV2ZW50LgCQVGhlIG9yaWdpbiBtdXN0IGJlIGBTY2hlZHVsZU9yaWdpbmAuALRUaGUgZXZlbnQgaWQgbXVzdCByZWZlciB0byBhIHNjaGVkdWxlZCBldmVudC4AIQFUaGUgdG90YWwgYW1vdW50IHRvIGJlIGRpc3RyaWJ1dGVkIGluIHByaXplcyB3aWxsIGJlIHJlbGVhc2VkIGZyb20gaG9sZC6wVGhlIGV2ZW50IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzY2hlZHVsZS5IcmVnaXN0ZXJfZm9yX2V2ZW50CAEgZXZlbnRfaWQ4ARxFdmVudElkAAEQZGVzdAQBMFQ6OkFjY291bnRJZAADPIBSZWdpc3RlciBmb3IgYSBwYXJ0aWN1bGFyIGV2ZW50LgA1AVRoZSBvcmlnaW4gbXVzdCBiZSB0aGUgYWxpYXMgb2YgYSBwZXJzb24gaW4gdGhlIGNvbnRleHQ6IGFpcmRyb3AgY29udGV4dCBiYXNlKQFjb25jYXRlbmF0ZWQgdG8gdGhlIGFpcmRyb3AgZXZlbnQgaWQgaW4gbGl0dGxlLWVuZGlhbiBlbmNvZGluZyBpbiA0IGJ5dGVzLthUaGUgYWlyZHJvcCBjb250ZXh0IGJhc2UgY2FuIGJlIGZvdW5kIGluIHRoZSBtZXRhZGF0YS4AEQFUaGUgZXZlbnQgaWQgbXVzdCByZWZlciB0byBhbiBhY3RpdmUgZXZlbnQgaW4gdGhlIHJlZ2lzdGVyaW5nIHBoYXNlLqRUaGUgYWxpYXMgbXVzdCBub3QgYmUgYWxyZWFkeSByZWdpc3RlcmVkLgBVAWBkZXN0YCBjYW4gYmUgYW55IGFjY291bnQsIGl0IGlzIHRoZSBkZXN0aW5hdGlvbiByZWNlaXZpbmcgdGhlIHByaXplIHdoZW4gd2lubmluZyB0aGVJAWFpcmRyb3AuIEl0IGlzIGJldHRlciB0byBzZXQgYSBkaWZmZXJlbnQgYWNjb3VudCBmb3IgZWFjaCBhaXJkcm9wIHRvIGF2b2lkIGxpbmtpbmdoaW5mb3JtYXRpb24gYWJvdXQgd2lubmVycy4AVQFXaGVuIHJlZ2lzdGVyaW5nIHRoZSBjYWxsZXIgaXMgYXNzaWduZWQgYW4gaW5kZXguIFRoaXMgaW5kZXggd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5MHRoZSB3aW5uZXJzLmxjbGFpbV9mYWlsZWRfdHJhbnNmZXJfcHJpemUEASBldmVudF9pZDgBHEV2ZW50SWQABCCUQ2xhaW0gdGhlIHByaXplIG9mIGEgZmFpbGVkIHRyYW5zZmVyLgBRAVByaXplIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zZmVyZWQsIGJ1dCBpZiB1bmV4cGVjdGVkIGV2ZW50IGhhcHBlbnMgdGhlIHRyYW5zZmVyIGNhbsRmYWlsLCB0aGlzIHRyYW5zYWN0aW9uIGFsbG93cyB0byBjbGFpbSB0aGUgcHJpemUuANxUaGUgb3JpZ2luIG11c3Qgc2lnbmVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJpemUuABEBVGhlIHNpZ25lciBtdXN0IGhhdmUgYSBmYWlsZWQgdHJhbnNmZXIgcHJpemUgZm9yIHRoZSBnaXZlbiBldmVudCBpZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQUMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldCRFdmVudEluZm8IHEFzc2V0SWQB4DBBc3NldEJhbGFuY2UBxAAMARRwcml6ZSEFAYxBaXJkcm9wUHJpemU8QXNzZXRJZCwgQXNzZXRCYWxhbmNlPgABTHJlZ2lzdHJhdGlvbl9zdGFydHM4AQx1MzIAAVRyZWdpc3RyYXRpb25fZHVyYXRpb244AQx1MzIAACEFDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQwQWlyZHJvcFByaXplCBxBc3NldElkAeAwQXNzZXRCYWxhbmNlAcQBBCBQcml6ZVNldAwBIGFzc2V0X2lk4AEcQXNzZXRJZAABMGFzc2V0X2Ftb3VudMQBMEFzc2V0QmFsYW5jZQABHHdpbm5lcnM4AQx1MzIAAAAAJQUMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBBDYWxsBARUAAEQQGZvcmNlX3NldF9jdXJzb3IEARhjdXJzb3IpBQFMT3B0aW9uPEN1cnNvck9mPFQ+PgAAFF0BQWxsb3dzIHJvb3QgdG8gc2V0IGEgY3Vyc29yIHRvIGZvcmNlZnVsbHkgc3RhcnQsIHN0b3Agb3IgZm9yd2FyZCB0aGUgbWlncmF0aW9uIHByb2Nlc3MuAEkBU2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgYW5kIGlzIG9ubHkgaW4gcGxhY2UgYXMgZW1lcmdlbmN5IG1lYXN1cmUuIE5vdGUgdGhhdAUBcmVzdGFydGluZyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaW4gdGhpcyBtYW5uZXIgd2lsbCBub3QgY2FsbCB0aGUtAVtgTWlncmF0aW9uU3RhdHVzSGFuZGxlcjo6c3RhcnRlZGBdIGhvb2sgb3IgZW1pdCBhbiBgVXBncmFkZVN0YXJ0ZWRgIGV2ZW50Llxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgwBFGluZGV4OAEMdTMyAAEwaW5uZXJfY3Vyc29yOQUBWE9wdGlvbjxSYXdDdXJzb3JPZjxUPj4AAShzdGFydGVkX2F0CQMBZE9wdGlvbjxCbG9ja051bWJlckZvcjxUPj4AARhZAUFsbG93cyByb290IHRvIHNldCBhbiBhY3RpdmUgY3Vyc29yIHRvIGZvcmNlZnVsbHkgc3RhcnQvZm9yd2FyZCB0aGUgbWlncmF0aW9uIHByb2Nlc3MuAEUBVGhpcyBpcyBhbiBlZGdlLWNhc2UgdmVyc2lvbiBvZiBbYFNlbGY6OmZvcmNlX3NldF9jdXJzb3JgXSB0aGF0IGFsbG93cyB0byBzZXQgdGhlYQFgc3RhcnRlZF9hdGAgdmFsdWUgdG8gdGhlIG5leHQgYmxvY2sgbnVtYmVyLiBPdGhlcndpc2UgdGhpcyB3b3VsZCBub3QgYmUgcG9zc2libGUsIHNpbmNlRQFgZm9yY2Vfc2V0X2N1cnNvcmAgdGFrZXMgYW4gYWJzb2x1dGUgYmxvY2sgbnVtYmVyLiBTZXR0aW5nIGBzdGFydGVkX2F0YCB0byBgTm9uZWABAWluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBwbHVzIG9uZSBzaG91bGQgYmUgdXNlZC5IZm9yY2Vfb25ib2FyZF9tYm1zAAIQoEZvcmNlcyB0aGUgb25ib2FyZGluZyBvZiB0aGUgbWlncmF0aW9ucy4AXQFUaGlzIHByb2Nlc3MgaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIGEgcnVudGltZSB1cGdyYWRlLiBJdCBpcyBpbiBwbGFjZSBhcyBhbiBlbWVyZ2VuY3n8bWVhc3VyZW1lbnQuIFRoZSBjdXJzb3IgbmVlZHMgdG8gYmUgYE5vbmVgIGZvciB0aGlzIHRvIHN1Y2NlZWQuOGNsZWFyX2hpc3RvcmljBAEgc2VsZWN0b3I9BQGgSGlzdG9yaWNDbGVhbnVwU2VsZWN0b3I8SWRlbnRpZmllck9mPFQ+PgADFGhDbGVhcnMgdGhlIGBIaXN0b3JpY2Agc2V0LgANAWBtYXBfY3Vyc29yYCBtdXN0IGJlIHNldCB0byB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyByZXR1cm5lZCBieSB0aGVdAWBIaXN0b3JpY0NsZWFyZWRgIGV2ZW50LiBUaGUgZmlyc3QgdGltZSBgTm9uZWAgY2FuIGJlIHVzZWQuIGBsaW1pdGAgbXVzdCBiZSBjaG9zZW4gaW4gYah3YXkgdGhhdCB3aWxsIHJlc3VsdCBpbiBhIHNlbnNpYmxlIHdlaWdodC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQUEGE9wdGlvbgQEVAEtBQEIEE5vbmUAAAAQU29tZQQALQUAAAEAAC0FCERwYWxsZXRfbWlncmF0aW9uczxNaWdyYXRpb25DdXJzb3IIGEN1cnNvcgExBSxCbG9ja051bWJlcgE4AQgYQWN0aXZlBAA1BQGEQWN0aXZlQ3Vyc29yPEN1cnNvciwgQmxvY2tOdW1iZXI+AAAAFFN0dWNrAAEAADEFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAANQUIRHBhbGxldF9taWdyYXRpb25zMEFjdGl2ZUN1cnNvcggYQ3Vyc29yATEFLEJsb2NrTnVtYmVyATgADAEUaW5kZXg4AQx1MzIAATBpbm5lcl9jdXJzb3I5BQE4T3B0aW9uPEN1cnNvcj4AAShzdGFydGVkX2F0OAEsQmxvY2tOdW1iZXIAADkFBBhPcHRpb24EBFQBMQUBCBBOb25lAAAAEFNvbWUEADEFAAABAAA9BQhEcGFsbGV0X21pZ3JhdGlvbnNcSGlzdG9yaWNDbGVhbnVwU2VsZWN0b3IECElkAUEFAQggU3BlY2lmaWMEAEUFARxWZWM8SWQ+AAAAIFdpbGRjYXJkCAEUbGltaXQJAwEsT3B0aW9uPHUzMj4AATxwcmV2aW91c19jdXJzb3JJBQE8T3B0aW9uPFZlYzx1OD4+AAEAAEEFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAARQUAAAJBBQBJBQQYT3B0aW9uBARUARgBCBBOb25lAAAAEFNvbWUEABgAAAEAAE0FDFxwYWxsZXRfdmVyaWZ5X3NpZ25hdHVyZSRleHRlbnNpb248VmVyaWZ5U2lnbmF0dXJlBARUAAEIGFNpZ25lZAgBJHNpZ25hdHVyZS0EATBUOjpTaWduYXR1cmUAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAAAIERpc2FibGVkAAEAAFEFDExpbmRpdl9wYWxsZXRfcGVvcGxlJGV4dGVuc2lvbiBBc1BlcnNvbgQEVAAABABVBQFcT3B0aW9uPEFzUGVyc29uSW5mbzxUPj4AAFUFBBhPcHRpb24EBFQBWQUBCBBOb25lAAAAEFNvbWUEAFkFAAABAABZBQxMaW5kaXZfcGFsbGV0X3Blb3BsZSRleHRlbnNpb24wQXNQZXJzb25JbmZvBARUAAEUaEFzUGVyc29uYWxBbGlhc1dpdGhBY2NvdW50BAA4ASBUOjpOb25jZQAAAGBBc1BlcnNvbmFsQWxpYXNXaXRoUHJvb2YMAHUDAShQcm9vZk9mPFQ+AAA4ASRSaW5nSW5kZXgAAAgBHENvbnRleHQAAQBsQXNQZXJzb25hbElkZW50aXR5V2l0aFByb29mCABhBAE4U2lnbmF0dXJlT2Y8VD4AACgBKFBlcnNvbmFsSWQAAgB0QXNQZXJzb25hbElkZW50aXR5V2l0aEFjY291bnQEADgBIFQ6Ok5vbmNlAAMAhEFzUGVyc29uYWxBbGlhc1dpdGhBY2NvdW50UmV2aXNlZBAAOAEgVDo6Tm9uY2UAAHUDAShQcm9vZk9mPFQ+AAA4ASRSaW5nSW5kZXgAAAgBHENvbnRleHQABAAAXQUMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmskZXh0ZW5zaW9uXEFzUHJvb2ZPZklua1BhcnRpY2lwYW50BARUAAAEAGEFAZhPcHRpb248QXNQcm9vZk9mSW5rUGFydGljaXBhbnRJbmZvPFQ+PgAAYQUEGE9wdGlvbgQEVAFlBQEIEE5vbmUAAAAQU29tZQQAZQUAAAEAAGUFDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rJGV4dGVuc2lvbmxBc1Byb29mT2ZJbmtQYXJ0aWNpcGFudEluZm8EBFQAAQw4QXNBcHBseVdpdGhTaWcEADgBIFQ6Ok5vbmNlAAAAKEFzUmVmZXJyZWQEADgBIFQ6Ok5vbmNlAAEAJEFzSW52aXRlZAQAOAEgVDo6Tm9uY2UAAgAAaQUMSGluZGl2X3BhbGxldF9zY29yZSRleHRlbnNpb25IU2NvcmVBc1BhcnRpY2lwYW50BARUAAAEAG0FAaBPcHRpb248U2NvcmVBc1BhcnRpY2lwYW50RGF0YTxUOjpOb25jZT4+AABtBQQYT3B0aW9uBARUAXEFAQgQTm9uZQAAABBTb21lBABxBQAAAQAAcQUMSGluZGl2X3BhbGxldF9zY29yZSRleHRlbnNpb25YU2NvcmVBc1BhcnRpY2lwYW50RGF0YQQUTm9uY2UBOAAEARRub25jZTgBFE5vbmNlAAB1BQxEaW5kaXZfcGFsbGV0X2dhbWUkZXh0ZW5zaW9uNEdhbWVBc0ludml0ZWQEBFQAAAQAeQUBcE9wdGlvbjxHYW1lQXNJbnZpdGVkRGF0YTxUPj4AAHkFBBhPcHRpb24EBFQBfQUBCBBOb25lAAAAEFNvbWUEAH0FAAABAAB9BQxEaW5kaXZfcGFsbGV0X2dhbWUkZXh0ZW5zaW9uREdhbWVBc0ludml0ZWREYXRhBARUAAAQARRub25jZTgBIFQ6Ok5vbmNlAAEcaW52aXRlcgQBMFQ6OkFjY291bnRJZAABGHRpY2tldAQBLFRpY2tldE9mPFQ+AAEkc2lnbmF0dXJlLQQBSFQ6OlRpY2tldFNpZ25hdHVyZQAAgQUMYGluZGl2X3BhbGxldF9wZW9wbGVfbGl0ZSRleHRlbnNpb244UGVvcGxlTGl0ZUF1dGgEBFQAAAQAhQUBfE9wdGlvbjxQZW9wbGVMaXRlQXV0aERhdGFPZjxUPj4AAIUFBBhPcHRpb24EBFQBiQUBCBBOb25lAAAAEFNvbWUEAIkFAAABAACJBQxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlJGV4dGVuc2lvbkhQZW9wbGVMaXRlQXV0aERhdGEEFE5vbmNlATgBBDBBc0xpdGVQZXJzb24EARRub25jZTgBFE5vbmNlAAAAAI0FDFBpbmRpdl9wYWxsZXRfY29pbmFnZSRleHRlbnNpb24kQXNDb2luYWdlBARUAAAEAJEFAWBPcHRpb248QXNDb2luYWdlSW5mbzxUPj4AAJEFBBhPcHRpb24EBFQBlQUBCBBOb25lAAAAEFNvbWUEAJUFAAABAACVBQxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UkZXh0ZW5zaW9uNEFzQ29pbmFnZUluZm8EBFQAARQYQXNDb2luAAAATEFzVW5sb2FkVG9rZW5QZW9wbGUQARRwcm9vZpkFAaA8VDo6UGVvcGxlUHJvb2YgYXMgVmFsaWRhdGVQcm9vZj46OlByb29mAAEYcGVyaW9kOAEYUGVyaW9kAAEcY291bnRlcjgBDHUzMgABMGFsaWFzX3Byb29mc3EDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAEAXEFzVW5sb2FkVG9rZW5MaXRlUGVvcGxlEAEUcHJvb2adBQGwPFQ6OkxpdGVQZW9wbGVQcm9vZiBhcyBWYWxpZGF0ZVByb29mPjo6UHJvb2YAARhwZXJpb2Q4ARhQZXJpb2QAARxjb3VudGVyOAEMdTMyAAEwYWxpYXNfcHJvb2ZzcQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAgBEQXNVbmxvYWRUb2tlblBhaWQUARRwcm9vZnUDAShQcm9vZk9mPFQ+AAEYcGVyaW9kOAEYUGVyaW9kAAFUcGFpZF90b2tlbl9yaW5nX2luZGV4OAEMdTMyAAFgcGFpZF90b2tlbl9yaW5nX3JldmlzaW9uOAEMdTMyAAEwYWxpYXNfcHJvb2ZzcQMBrEJvdW5kZWRWZWM8UHJvb2ZPZjxUPiwgVDo6TWF4Q29uc29saWRhdGlvbj4AAwBcQXNVbmxvYWRUb2tlbkZyb21PdXRwdXQQAUhmZWVfcmVjeWNsZXJfdmFsdWVtAwEkQ29pblZhbHVlAAFIZmVlX3JlY3ljbGVyX2luZGV4OAEkUmluZ0luZGV4AAFUZmVlX3JlY3ljbGVyX3JldmlzaW9uOAE0UmV2aXNpb25JbmRleAABMGFsaWFzX3Byb29mc3EDAaxCb3VuZGVkVmVjPFByb29mT2Y8VD4sIFQ6Ok1heENvbnNvbGlkYXRpb24+AAQAAJkFDGRuZXh0X3Blb3BsZV9wYXNlb19ydW50aW1lGHBlb3BsZSxQZW9wbGVQcm9vZgAACAEUcHJvb2Z1AwHgPEJhbmRlcnNuYXRjaFZyZlZlcmlmaWFibGUgYXMgR2VuZXJhdGVWZXJpZmlhYmxlPjo6UHJvb2YAARByaW5nOAEkUmluZ0luZGV4AACdBQxkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZRhwZW9wbGVYTGl0ZVBlb3BsZVByb29mTm90QW5vbgAACAEkc2lnbmF0dXJlLQQBOE11bHRpU2lnbmF0dXJlAAEcYWNjb3VudAQBJEFjY291bnRJZAAAoQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zOGF1dGhvcml6ZV9jYWxsNEF1dGhvcml6ZUNhbGwEBFQAAAAApQUIfGluZGl2X3BhbGxldF9vcmlnaW5fcmVzdHJpY3Rpb244UmVzdHJpY3RPcmlnaW4EBFQAAAQAyAEQYm9vbAAAqQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zVGNoZWNrX25vbl96ZXJvX3NlbmRlckhDaGVja05vblplcm9TZW5kZXIEBFQAAAAArQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zSGNoZWNrX3NwZWNfdmVyc2lvbkBDaGVja1NwZWNWZXJzaW9uBARUAAAAALEFEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0BjaGVja190eF92ZXJzaW9uOENoZWNrVHhWZXJzaW9uBARUAAAAALUFEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczRjaGVja19nZW5lc2lzMENoZWNrR2VuZXNpcwQEVAAAAAC5BRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM8Y2hlY2tfbW9ydGFsaXR5OENoZWNrTW9ydGFsaXR5BARUAAAEAL0FAQxFcmEAAL0FEChzcF9ydW50aW1lHGdlbmVyaWMMZXJhDEVyYQABAQQgSW1tb3J0YWwAAAAcTW9ydGFsMQQADAAAAQAcTW9ydGFsMgQADAAAAgAcTW9ydGFsMwQADAAAAwAcTW9ydGFsNAQADAAABAAcTW9ydGFsNQQADAAABQAcTW9ydGFsNgQADAAABgAcTW9ydGFsNwQADAAABwAcTW9ydGFsOAQADAAACAAcTW9ydGFsOQQADAAACQAgTW9ydGFsMTAEAAwAAAoAIE1vcnRhbDExBAAMAAALACBNb3J0YWwxMgQADAAADAAgTW9ydGFsMTMEAAwAAA0AIE1vcnRhbDE0BAAMAAAOACBNb3J0YWwxNQQADAAADwAgTW9ydGFsMTYEAAwAABAAIE1vcnRhbDE3BAAMAAARACBNb3J0YWwxOAQADAAAEgAgTW9ydGFsMTkEAAwAABMAIE1vcnRhbDIwBAAMAAAUACBNb3J0YWwyMQQADAAAFQAgTW9ydGFsMjIEAAwAABYAIE1vcnRhbDIzBAAMAAAXACBNb3J0YWwyNAQADAAAGAAgTW9ydGFsMjUEAAwAABkAIE1vcnRhbDI2BAAMAAAaACBNb3J0YWwyNwQADAAAGwAgTW9ydGFsMjgEAAwAABwAIE1vcnRhbDI5BAAMAAAdACBNb3J0YWwzMAQADAAAHgAgTW9ydGFsMzEEAAwAAB8AIE1vcnRhbDMyBAAMAAAgACBNb3J0YWwzMwQADAAAIQAgTW9ydGFsMzQEAAwAACIAIE1vcnRhbDM1BAAMAAAjACBNb3J0YWwzNgQADAAAJAAgTW9ydGFsMzcEAAwAACUAIE1vcnRhbDM4BAAMAAAmACBNb3J0YWwzOQQADAAAJwAgTW9ydGFsNDAEAAwAACgAIE1vcnRhbDQxBAAMAAApACBNb3J0YWw0MgQADAAAKgAgTW9ydGFsNDMEAAwAACsAIE1vcnRhbDQ0BAAMAAAsACBNb3J0YWw0NQQADAAALQAgTW9ydGFsNDYEAAwAAC4AIE1vcnRhbDQ3BAAMAAAvACBNb3J0YWw0OAQADAAAMAAgTW9ydGFsNDkEAAwAADEAIE1vcnRhbDUwBAAMAAAyACBNb3J0YWw1MQQADAAAMwAgTW9ydGFsNTIEAAwAADQAIE1vcnRhbDUzBAAMAAA1ACBNb3J0YWw1NAQADAAANgAgTW9ydGFsNTUEAAwAADcAIE1vcnRhbDU2BAAMAAA4ACBNb3J0YWw1NwQADAAAOQAgTW9ydGFsNTgEAAwAADoAIE1vcnRhbDU5BAAMAAA7ACBNb3J0YWw2MAQADAAAPAAgTW9ydGFsNjEEAAwAAD0AIE1vcnRhbDYyBAAMAAA+ACBNb3J0YWw2MwQADAAAPwAgTW9ydGFsNjQEAAwAAEAAIE1vcnRhbDY1BAAMAABBACBNb3J0YWw2NgQADAAAQgAgTW9ydGFsNjcEAAwAAEMAIE1vcnRhbDY4BAAMAABEACBNb3J0YWw2OQQADAAARQAgTW9ydGFsNzAEAAwAAEYAIE1vcnRhbDcxBAAMAABHACBNb3J0YWw3MgQADAAASAAgTW9ydGFsNzMEAAwAAEkAIE1vcnRhbDc0BAAMAABKACBNb3J0YWw3NQQADAAASwAgTW9ydGFsNzYEAAwAAEwAIE1vcnRhbDc3BAAMAABNACBNb3J0YWw3OAQADAAATgAgTW9ydGFsNzkEAAwAAE8AIE1vcnRhbDgwBAAMAABQACBNb3J0YWw4MQQADAAAUQAgTW9ydGFsODIEAAwAAFIAIE1vcnRhbDgzBAAMAABTACBNb3J0YWw4NAQADAAAVAAgTW9ydGFsODUEAAwAAFUAIE1vcnRhbDg2BAAMAABWACBNb3J0YWw4NwQADAAAVwAgTW9ydGFsODgEAAwAAFgAIE1vcnRhbDg5BAAMAABZACBNb3J0YWw5MAQADAAAWgAgTW9ydGFsOTEEAAwAAFsAIE1vcnRhbDkyBAAMAABcACBNb3J0YWw5MwQADAAAXQAgTW9ydGFsOTQEAAwAAF4AIE1vcnRhbDk1BAAMAABfACBNb3J0YWw5NgQADAAAYAAgTW9ydGFsOTcEAAwAAGEAIE1vcnRhbDk4BAAMAABiACBNb3J0YWw5OQQADAAAYwAkTW9ydGFsMTAwBAAMAABkACRNb3J0YWwxMDEEAAwAAGUAJE1vcnRhbDEwMgQADAAAZgAkTW9ydGFsMTAzBAAMAABnACRNb3J0YWwxMDQEAAwAAGgAJE1vcnRhbDEwNQQADAAAaQAkTW9ydGFsMTA2BAAMAABqACRNb3J0YWwxMDcEAAwAAGsAJE1vcnRhbDEwOAQADAAAbAAkTW9ydGFsMTA5BAAMAABtACRNb3J0YWwxMTAEAAwAAG4AJE1vcnRhbDExMQQADAAAbwAkTW9ydGFsMTEyBAAMAABwACRNb3J0YWwxMTMEAAwAAHEAJE1vcnRhbDExNAQADAAAcgAkTW9ydGFsMTE1BAAMAABzACRNb3J0YWwxMTYEAAwAAHQAJE1vcnRhbDExNwQADAAAdQAkTW9ydGFsMTE4BAAMAAB2ACRNb3J0YWwxMTkEAAwAAHcAJE1vcnRhbDEyMAQADAAAeAAkTW9ydGFsMTIxBAAMAAB5ACRNb3J0YWwxMjIEAAwAAHoAJE1vcnRhbDEyMwQADAAAewAkTW9ydGFsMTI0BAAMAAB8ACRNb3J0YWwxMjUEAAwAAH0AJE1vcnRhbDEyNgQADAAAfgAkTW9ydGFsMTI3BAAMAAB/ACRNb3J0YWwxMjgEAAwAAIAAJE1vcnRhbDEyOQQADAAAgQAkTW9ydGFsMTMwBAAMAACCACRNb3J0YWwxMzEEAAwAAIMAJE1vcnRhbDEzMgQADAAAhAAkTW9ydGFsMTMzBAAMAACFACRNb3J0YWwxMzQEAAwAAIYAJE1vcnRhbDEzNQQADAAAhwAkTW9ydGFsMTM2BAAMAACIACRNb3J0YWwxMzcEAAwAAIkAJE1vcnRhbDEzOAQADAAAigAkTW9ydGFsMTM5BAAMAACLACRNb3J0YWwxNDAEAAwAAIwAJE1vcnRhbDE0MQQADAAAjQAkTW9ydGFsMTQyBAAMAACOACRNb3J0YWwxNDMEAAwAAI8AJE1vcnRhbDE0NAQADAAAkAAkTW9ydGFsMTQ1BAAMAACRACRNb3J0YWwxNDYEAAwAAJIAJE1vcnRhbDE0NwQADAAAkwAkTW9ydGFsMTQ4BAAMAACUACRNb3J0YWwxNDkEAAwAAJUAJE1vcnRhbDE1MAQADAAAlgAkTW9ydGFsMTUxBAAMAACXACRNb3J0YWwxNTIEAAwAAJgAJE1vcnRhbDE1MwQADAAAmQAkTW9ydGFsMTU0BAAMAACaACRNb3J0YWwxNTUEAAwAAJsAJE1vcnRhbDE1NgQADAAAnAAkTW9ydGFsMTU3BAAMAACdACRNb3J0YWwxNTgEAAwAAJ4AJE1vcnRhbDE1OQQADAAAnwAkTW9ydGFsMTYwBAAMAACgACRNb3J0YWwxNjEEAAwAAKEAJE1vcnRhbDE2MgQADAAAogAkTW9ydGFsMTYzBAAMAACjACRNb3J0YWwxNjQEAAwAAKQAJE1vcnRhbDE2NQQADAAApQAkTW9ydGFsMTY2BAAMAACmACRNb3J0YWwxNjcEAAwAAKcAJE1vcnRhbDE2OAQADAAAqAAkTW9ydGFsMTY5BAAMAACpACRNb3J0YWwxNzAEAAwAAKoAJE1vcnRhbDE3MQQADAAAqwAkTW9ydGFsMTcyBAAMAACsACRNb3J0YWwxNzMEAAwAAK0AJE1vcnRhbDE3NAQADAAArgAkTW9ydGFsMTc1BAAMAACvACRNb3J0YWwxNzYEAAwAALAAJE1vcnRhbDE3NwQADAAAsQAkTW9ydGFsMTc4BAAMAACyACRNb3J0YWwxNzkEAAwAALMAJE1vcnRhbDE4MAQADAAAtAAkTW9ydGFsMTgxBAAMAAC1ACRNb3J0YWwxODIEAAwAALYAJE1vcnRhbDE4MwQADAAAtwAkTW9ydGFsMTg0BAAMAAC4ACRNb3J0YWwxODUEAAwAALkAJE1vcnRhbDE4NgQADAAAugAkTW9ydGFsMTg3BAAMAAC7ACRNb3J0YWwxODgEAAwAALwAJE1vcnRhbDE4OQQADAAAvQAkTW9ydGFsMTkwBAAMAAC+ACRNb3J0YWwxOTEEAAwAAL8AJE1vcnRhbDE5MgQADAAAwAAkTW9ydGFsMTkzBAAMAADBACRNb3J0YWwxOTQEAAwAAMIAJE1vcnRhbDE5NQQADAAAwwAkTW9ydGFsMTk2BAAMAADEACRNb3J0YWwxOTcEAAwAAMUAJE1vcnRhbDE5OAQADAAAxgAkTW9ydGFsMTk5BAAMAADHACRNb3J0YWwyMDAEAAwAAMgAJE1vcnRhbDIwMQQADAAAyQAkTW9ydGFsMjAyBAAMAADKACRNb3J0YWwyMDMEAAwAAMsAJE1vcnRhbDIwNAQADAAAzAAkTW9ydGFsMjA1BAAMAADNACRNb3J0YWwyMDYEAAwAAM4AJE1vcnRhbDIwNwQADAAAzwAkTW9ydGFsMjA4BAAMAADQACRNb3J0YWwyMDkEAAwAANEAJE1vcnRhbDIxMAQADAAA0gAkTW9ydGFsMjExBAAMAADTACRNb3J0YWwyMTIEAAwAANQAJE1vcnRhbDIxMwQADAAA1QAkTW9ydGFsMjE0BAAMAADWACRNb3J0YWwyMTUEAAwAANcAJE1vcnRhbDIxNgQADAAA2AAkTW9ydGFsMjE3BAAMAADZACRNb3J0YWwyMTgEAAwAANoAJE1vcnRhbDIxOQQADAAA2wAkTW9ydGFsMjIwBAAMAADcACRNb3J0YWwyMjEEAAwAAN0AJE1vcnRhbDIyMgQADAAA3gAkTW9ydGFsMjIzBAAMAADfACRNb3J0YWwyMjQEAAwAAOAAJE1vcnRhbDIyNQQADAAA4QAkTW9ydGFsMjI2BAAMAADiACRNb3J0YWwyMjcEAAwAAOMAJE1vcnRhbDIyOAQADAAA5AAkTW9ydGFsMjI5BAAMAADlACRNb3J0YWwyMzAEAAwAAOYAJE1vcnRhbDIzMQQADAAA5wAkTW9ydGFsMjMyBAAMAADoACRNb3J0YWwyMzMEAAwAAOkAJE1vcnRhbDIzNAQADAAA6gAkTW9ydGFsMjM1BAAMAADrACRNb3J0YWwyMzYEAAwAAOwAJE1vcnRhbDIzNwQADAAA7QAkTW9ydGFsMjM4BAAMAADuACRNb3J0YWwyMzkEAAwAAO8AJE1vcnRhbDI0MAQADAAA8AAkTW9ydGFsMjQxBAAMAADxACRNb3J0YWwyNDIEAAwAAPIAJE1vcnRhbDI0MwQADAAA8wAkTW9ydGFsMjQ0BAAMAAD0ACRNb3J0YWwyNDUEAAwAAPUAJE1vcnRhbDI0NgQADAAA9gAkTW9ydGFsMjQ3BAAMAAD3ACRNb3J0YWwyNDgEAAwAAPgAJE1vcnRhbDI0OQQADAAA+QAkTW9ydGFsMjUwBAAMAAD6ACRNb3J0YWwyNTEEAAwAAPsAJE1vcnRhbDI1MgQADAAA/AAkTW9ydGFsMjUzBAAMAAD9ACRNb3J0YWwyNTQEAAwAAP4AJE1vcnRhbDI1NQQADAAA/wAAwQUQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zLGNoZWNrX25vbmNlKENoZWNrTm9uY2UEBFQAAAQAYAEgVDo6Tm9uY2UAAMUFEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczBjaGVja193ZWlnaHQsQ2hlY2tXZWlnaHQEBFQAAAAAyQUIXHBhbGxldF9hc3NldF90eF9wYXltZW50UENoYXJnZUFzc2V0VHhQYXltZW50BARUAAAIAQx0aXDAATBCYWxhbmNlT2Y8VD4AASBhc3NldF9pZKECAWhPcHRpb248Q2hhcmdlQXNzZXRJZE9mPFQ+PgAAzQUIMGZyYW1lX3N5c3RlbSxBY2NvdW50SW5mbwgUTm9uY2UBOCxBY2NvdW50RGF0YQHRBQAUARRub25jZTgBFE5vbmNlAAEkY29uc3VtZXJzOAEgUmVmQ291bnQAASRwcm92aWRlcnM4ASBSZWZDb3VudAABLHN1ZmZpY2llbnRzOAEgUmVmQ291bnQAARBkYXRh0QUBLEFjY291bnREYXRhAADRBQw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLEFjY291bnREYXRhBBxCYWxhbmNlAcQAEAEQZnJlZcQBHEJhbGFuY2UAASByZXNlcnZlZMQBHEJhbGFuY2UAARhmcm96ZW7EARxCYWxhbmNlAAEUZmxhZ3PVBQEoRXh0cmFGbGFncwAA1QUMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEAMQBEHUxMjgAANkFDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQB1QEADAEYbm9ybWFs1QEBBFQAASxvcGVyYXRpb25hbNUBAQRUAAEkbWFuZGF0b3J51QEBBFQAAN0FAAAC4QUA4QUIMGZyYW1lX3N5c3RlbSxFdmVudFJlY29yZAgERQHlBQRUATwADAEUcGhhc2XpBgEUUGhhc2UAARRldmVudOUFAQRFAAEYdG9waWNz7QYBGFZlYzxUPgAA5QUIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUwUnVudGltZUV2ZW50AAGQGFN5c3RlbQQA6QUBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAA8UGFyYWNoYWluU3lzdGVtBAARBgG8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAQAgQmFsYW5jZXMEABkGAXxwYWxsZXRfYmFsYW5jZXM6OkV2ZW50PFJ1bnRpbWU+AAoASFRyYW5zYWN0aW9uUGF5bWVudAQASQYBqHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50OjpFdmVudDxSdW50aW1lPgALAEhTa2lwRmVlbGVzc1BheW1lbnQEAE0GAaxwYWxsZXRfc2tpcF9mZWVsZXNzX3BheW1lbnQ6OkV2ZW50PFJ1bnRpbWU+AAwARE9yaWdpblJlc3RyaWN0aW9uBABRBgG8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbjo6RXZlbnQ8UnVudGltZT4ADQAYQXNzZXRzBABVBgF0cGFsbGV0X2Fzc2V0czo6RXZlbnQ8UnVudGltZT4ADgAwQXNzZXRzSG9sZGVyBABZBgGQcGFsbGV0X2Fzc2V0c19ob2xkZXI6OkV2ZW50PFJ1bnRpbWU+AA8AJEFzc2V0UmF0ZQQAXQYBhHBhbGxldF9hc3NldF9yYXRlOjpFdmVudDxSdW50aW1lPgAQADhBc3NldFR4UGF5bWVudAQAYQYBnHBhbGxldF9hc3NldF90eF9wYXltZW50OjpFdmVudDxSdW50aW1lPgARAERDb2xsYXRvclNlbGVjdGlvbgQAZQYBpHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb246OkV2ZW50PFJ1bnRpbWU+ABUAHFNlc3Npb24EAGkGAXhwYWxsZXRfc2Vzc2lvbjo6RXZlbnQ8UnVudGltZT4AFgAkWGNtcFF1ZXVlBABtBgGkY3VtdWx1c19wYWxsZXRfeGNtcF9xdWV1ZTo6RXZlbnQ8UnVudGltZT4AHgAsUG9sa2Fkb3RYY20EAHEGAWhwYWxsZXRfeGNtOjpFdmVudDxSdW50aW1lPgAfAChDdW11bHVzWGNtBACBBgGIY3VtdWx1c19wYWxsZXRfeGNtOjpFdmVudDxSdW50aW1lPgAgADBNZXNzYWdlUXVldWUEAIUGAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXZlbnQ8UnVudGltZT4AIgAcVXRpbGl0eQQAjQYBVHBhbGxldF91dGlsaXR5OjpFdmVudAAoACBNdWx0aXNpZwQAlQYBfHBhbGxldF9tdWx0aXNpZzo6RXZlbnQ8UnVudGltZT4AKQAQU3VkbwQAmQYBbHBhbGxldF9zdWRvOjpFdmVudDxSdW50aW1lPgAqABRQcm94eQQAnQYBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4ALAAgSWRlbnRpdHkEAKUGAZRpbmRpdl9wYWxsZXRfaWRlbnRpdHk6OkV2ZW50PFJ1bnRpbWU+ADIAGFBlb3BsZQQAqQYBjGluZGl2X3BhbGxldF9wZW9wbGU6OkV2ZW50PFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAK0GAZRpbmRpdl9wYWxsZXRfbW9iX3J1bGU6OkV2ZW50PFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEALEGAaRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rOjpFdmVudDxSdW50aW1lPgA1ABBHYW1lBAC1BgGEaW5kaXZfcGFsbGV0X2dhbWU6OkV2ZW50PFJ1bnRpbWU+ADcAFFNjb3JlBAC9BgGIaW5kaXZfcGFsbGV0X3Njb3JlOjpFdmVudDxSdW50aW1lPgA4ACBEdW1teURpbQQAwQYBmGluZGl2X3BhbGxldF9kdW1teV9kaW06OkV2ZW50PFJ1bnRpbWU+ADsAKFBlb3BsZUxpdGUEAMUGAaBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGU6OkV2ZW50PFJ1bnRpbWU+AD4AJFJlc291cmNlcwQAyQYBmGluZGl2X3BhbGxldF9yZXNvdXJjZXM6OkV2ZW50PFJ1bnRpbWU+AD8ANENodW5rc01hbmFnZXIEAM0GAaxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXI6OkV2ZW50PFJ1bnRpbWU+AEAAHE1lbWJlcnMEANEGAZBpbmRpdl9wYWxsZXRfbWVtYmVyczo6RXZlbnQ8UnVudGltZT4AQwAcQ29pbmFnZQQA1QYBkGluZGl2X3BhbGxldF9jb2luYWdlOjpFdmVudDxSdW50aW1lPgBEAFRTdG9yYWdlSW5pdGlhbGl6YXRpb24EANkGAcxpbmRpdl9wYWxsZXRfc3RvcmFnZV9pbml0aWFsaXphdGlvbjo6RXZlbnQ8UnVudGltZT4APABkU3RvcmFnZUluaXRpYWxpemF0aW9uTGl0ZQQA3QYB4GluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGU6OkV2ZW50PFJ1bnRpbWU+AEEAHEFpcmRyb3AEAOEGAZBpbmRpdl9wYWxsZXRfYWlyZHJvcDo6RXZlbnQ8UnVudGltZT4APQBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEAOUGAYRwYWxsZXRfbWlncmF0aW9uczo6RXZlbnQ8UnVudGltZT4AYgAA6QUMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXZlbnQEBFQAASBARXh0cmluc2ljU3VjY2VzcwQBNGRpc3BhdGNoX2luZm/tBQFERGlzcGF0Y2hFdmVudEluZm8AAASQQW4gZXh0cmluc2ljIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuPEV4dHJpbnNpY0ZhaWxlZAgBOGRpc3BhdGNoX2Vycm9y+QUBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZv7QUBRERpc3BhdGNoRXZlbnRJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIEATBUOjpBY2NvdW50SWQAARBoYXNoPAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoPAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb27IARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQugFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlCAEkY29kZV9oYXNoPAEcVDo6SGFzaAABFGVycm9y+QUBNERpc3BhdGNoRXJyb3IABwQRAUFuIGludmFsaWQgYXV0aG9yaXplZCB1cGdyYWRlIHdhcyByZWplY3RlZCB3aGlsZSB0cnlpbmcgdG8gYXBwbHkgaXQuBHBFdmVudCBmb3IgdGhlIFN5c3RlbSBwYWxsZXQu7QUIMGZyYW1lX3N5c3RlbUREaXNwYXRjaEV2ZW50SW5mbwAADAEYd2VpZ2h01QEBGFdlaWdodAABFGNsYXNz8QUBNERpc3BhdGNoQ2xhc3MAASBwYXlzX2ZlZfUFARBQYXlzAADxBQw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAA9QUMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gQUGF5cwABCAxZZXMAAAAITm8AAQAA+QUIKHNwX3J1bnRpbWU0RGlzcGF0Y2hFcnJvcgABPBRPdGhlcgAAADBDYW5ub3RMb29rdXAAAQAkQmFkT3JpZ2luAAIAGE1vZHVsZQQA/QUBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAAEGAShUb2tlbkVycm9yAAcAKEFyaXRobWV0aWMEAAUGATxBcml0aG1ldGljRXJyb3IACAA0VHJhbnNhY3Rpb25hbAQACQYBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANABBUcmllBAANBgEkVHJpZUVycm9yAA4AAP0FCChzcF9ydW50aW1lLE1vZHVsZUVycm9yAAAIARRpbmRleAwBCHU4AAEUZXJyb3JwAYxbdTg7IE1BWF9NT0RVTEVfRVJST1JfRU5DT0RFRF9TSVpFXQAAAQYIKHNwX3J1bnRpbWUoVG9rZW5FcnJvcgABKEBGdW5kc1VuYXZhaWxhYmxlAAAAME9ubHlQcm92aWRlcgABADBCZWxvd01pbmltdW0AAgAwQ2Fubm90Q3JlYXRlAAMAMFVua25vd25Bc3NldAAEABhGcm96ZW4ABQAsVW5zdXBwb3J0ZWQABgBAQ2Fubm90Q3JlYXRlSG9sZAAHADROb3RFeHBlbmRhYmxlAAgAHEJsb2NrZWQACQAABQYINHNwX2FyaXRobWV0aWM8QXJpdGhtZXRpY0Vycm9yAAEMJFVuZGVyZmxvdwAAACBPdmVyZmxvdwABADhEaXZpc2lvbkJ5WmVybwACAAAJBggoc3BfcnVudGltZUhUcmFuc2FjdGlvbmFsRXJyb3IAAQgwTGltaXRSZWFjaGVkAAAAHE5vTGF5ZXIAAQAADQYMKHNwX3J1bnRpbWUwcHJvdmluZ190cmllJFRyaWVFcnJvcgABOEBJbnZhbGlkU3RhdGVSb290AAAASEluY29tcGxldGVEYXRhYmFzZQABAFBWYWx1ZUF0SW5jb21wbGV0ZUtleQACADBEZWNvZGVyRXJyb3IAAwAsSW52YWxpZEhhc2gABAAwRHVwbGljYXRlS2V5AAUAOEV4dHJhbmVvdXNOb2RlAAYAPEV4dHJhbmVvdXNWYWx1ZQAHAFxFeHRyYW5lb3VzSGFzaFJlZmVyZW5jZQAIAFRJbnZhbGlkQ2hpbGRSZWZlcmVuY2UACQA0VmFsdWVNaXNtYXRjaAAKADxJbmNvbXBsZXRlUHJvb2YACwAwUm9vdE1pc21hdGNoAAwALERlY29kZUVycm9yAA0AABEGDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtGHBhbGxldBRFdmVudAQEVAABGGBWYWxpZGF0aW9uRnVuY3Rpb25TdG9yZWQAAATQVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gaGFzIGJlZW4gc2NoZWR1bGVkIHRvIGFwcGx5LmRWYWxpZGF0aW9uRnVuY3Rpb25BcHBsaWVkBAFUcmVsYXlfY2hhaW5fYmxvY2tfbnVtOAFUUmVsYXlDaGFpbkJsb2NrTnVtYmVyAAEERQFUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiB3YXMgYXBwbGllZCBhcyBvZiB0aGUgY29udGFpbmVkIHJlbGF5IGNoYWluIGJsb2NrIG51bWJlci5sVmFsaWRhdGlvbkZ1bmN0aW9uRGlzY2FyZGVkAAIEsFRoZSByZWxheS1jaGFpbiBhYm9ydGVkIHRoZSB1cGdyYWRlIHByb2Nlc3MuYERvd253YXJkTWVzc2FnZXNSZWNlaXZlZAQBFGNvdW50OAEMdTMyAAMEAQFTb21lIGRvd253YXJkIG1lc3NhZ2VzIGhhdmUgYmVlbiByZWNlaXZlZCBhbmQgd2lsbCBiZSBwcm9jZXNzZWQuZERvd253YXJkTWVzc2FnZXNQcm9jZXNzZWQIASx3ZWlnaHRfdXNlZNUBARhXZWlnaHQAASBkbXFfaGVhZDwBRHJlbGF5X2NoYWluOjpIYXNoAAQE4ERvd253YXJkIG1lc3NhZ2VzIHdlcmUgcHJvY2Vzc2VkIHVzaW5nIHRoZSBnaXZlbiB3ZWlnaHQuRFVwd2FyZE1lc3NhZ2VTZW50BAEwbWVzc2FnZV9oYXNoFQYBPE9wdGlvbjxYY21IYXNoPgAFBLhBbiB1cHdhcmQgbWVzc2FnZSB3YXMgc2VudCB0byB0aGUgcmVsYXkgY2hhaW4uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQYEGE9wdGlvbgQEVAEIAQgQTm9uZQAAABBTb21lBAAIAAABAAAZBgw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABeBxFbmRvd2VkCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZcQBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20EATBUOjpBY2NvdW50SWQAAQh0bwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEQZnJlZcQBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQQBMFQ6OkFjY291bnRJZAABCHRvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1cx0GARhTdGF0dXMABghNAVNvbWUgYmFsYW5jZSB3YXMgbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZSBvZiB0aGUgZmlyc3QgYWNjb3VudCB0byB0aGUgc2Vjb25kIGFjY291bnQu2EZpbmFsIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gYmFsYW5jZSB0eXBlLhxEZXBvc2l0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAHBNhTb21lIGFtb3VudCB3YXMgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4gV2l0aGRyYXcIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAgEHQFTb21lIGFtb3VudCB3YXMgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLhxTbGFzaGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAJBAEBU29tZSBhbW91bnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgbWlzYmVoYXZpb3IpLhhNaW50ZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAAoEnFNvbWUgYW1vdW50IHdhcyBtaW50ZWQgaW50byBhbiBhY2NvdW50LjBNaW50ZWRDcmVkaXQEARhhbW91bnTEAShUOjpCYWxhbmNlAAsE4FNvbWUgY3JlZGl0IHdhcyBiYWxhbmNlZCBhbmQgYWRkZWQgdG8gdGhlIFRvdGFsSXNzdWFuY2UuGEJ1cm5lZAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UADAScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuKEJ1cm5lZERlYnQEARhhbW91bnTEAShUOjpCYWxhbmNlAA0EzFNvbWUgZGVidCBoYXMgYmVlbiBkcm9wcGVkIGZyb20gdGhlIFRvdGFsIElzc3VhbmNlLiRTdXNwZW5kZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAA4EFQFTb21lIGFtb3VudCB3YXMgc3VzcGVuZGVkIGZyb20gYW4gYWNjb3VudCAoaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyKS4gUmVzdG9yZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlAA8EpFNvbWUgYW1vdW50IHdhcyByZXN0b3JlZCBpbnRvIGFuIGFjY291bnQuIFVwZ3JhZGVkBAEMd2hvBAEwVDo6QWNjb3VudElkABAEYEFuIGFjY291bnQgd2FzIHVwZ3JhZGVkLhhJc3N1ZWQEARhhbW91bnTEAShUOjpCYWxhbmNlABEELQFUb3RhbCBpc3N1YW5jZSB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGNyZWRpdCB0byBiZSBiYWxhbmNlZC4kUmVzY2luZGVkBAEYYW1vdW50xAEoVDo6QmFsYW5jZQASBCUBVG90YWwgaXNzdWFuY2Ugd2FzIGRlY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBkZWJ0IHRvIGJlIGJhbGFuY2VkLhhMb2NrZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgbG9ja2VkLiBVbmxvY2tlZAgBDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAFARoU29tZSBiYWxhbmNlIHdhcyB1bmxvY2tlZC4YRnJvemVuCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAVBGBTb21lIGJhbGFuY2Ugd2FzIGZyb3plbi4YVGhhd2VkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAWBGBTb21lIGJhbGFuY2Ugd2FzIHRoYXdlZC5MVG90YWxJc3N1YW5jZUZvcmNlZAgBDG9sZMQBKFQ6OkJhbGFuY2UAAQxuZXfEAShUOjpCYWxhbmNlABcErFRoZSBgVG90YWxJc3N1YW5jZWAgd2FzIGZvcmNlZnVsbHkgY2hhbmdlZC4QSGVsZAwBGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAGASAU29tZSBiYWxhbmNlIHdhcyBwbGFjZWQgb24gaG9sZC4oQnVybmVkSGVsZAwBGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABDHdobwQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAGQSgSGVsZCBiYWxhbmNlIHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LjhUcmFuc2Zlck9uSG9sZBABGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGHNvdXJjZQQBMFQ6OkFjY291bnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABoEFQFBIHRyYW5zZmVyIG9mIGBhbW91bnRgIG9uIGhvbGQgZnJvbSBgc291cmNlYCB0byBgZGVzdGAgd2FzIGluaXRpYXRlZC48VHJhbnNmZXJBbmRIb2xkEAEYcmVhc29uIQYBUFQ6OlJ1bnRpbWVIb2xkUmVhc29uAAEYc291cmNlBAEwVDo6QWNjb3VudElkAAEQZGVzdAQBMFQ6OkFjY291bnRJZAABLHRyYW5zZmVycmVkxAEoVDo6QmFsYW5jZQAbBAkBVGhlIGB0cmFuc2ZlcnJlZGAgYmFsYW5jZSBpcyBwbGFjZWQgb24gaG9sZCBhdCB0aGUgYGRlc3RgIGFjY291bnQuIFJlbGVhc2VkDAEYcmVhc29uIQYBUFQ6OlJ1bnRpbWVIb2xkUmVhc29uAAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAcBJBTb21lIGJhbGFuY2Ugd2FzIHJlbGVhc2VkIGZyb20gaG9sZC4oVW5leHBlY3RlZAQARQYBOFVuZXhwZWN0ZWRLaW5kAB0EsEFuIHVuZXhwZWN0ZWQvZGVmZW5zaXZlIGV2ZW50IHdhcyB0cmlnZ2VyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0HQYUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjNEJhbGFuY2VTdGF0dXMAAQgQRnJlZQAAACBSZXNlcnZlZAABAAAhBghkbmV4dF9wZW9wbGVfcGFzZW9fcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABIBxTZXNzaW9uBAAlBgFocGFsbGV0X3Nlc3Npb246OkhvbGRSZWFzb24AFgAsUG9sa2Fkb3RYY20EACkGAVhwYWxsZXRfeGNtOjpIb2xkUmVhc29uAB8AHE1vYlJ1bGUEAC0GAYRpbmRpdl9wYWxsZXRfbW9iX3J1bGU6OkhvbGRSZWFzb24ANAAoUHJvb2ZPZkluawQAMQYBlGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbms6OkhvbGRSZWFzb24ANQAQR2FtZQQANQYBdGluZGl2X3BhbGxldF9nYW1lOjpIb2xkUmVhc29uADcAFFNjb3JlBAA5BgF4aW5kaXZfcGFsbGV0X3Njb3JlOjpIb2xkUmVhc29uADgAHENvaW5hZ2UEAD0GAYBpbmRpdl9wYWxsZXRfY29pbmFnZTo6SG9sZFJlYXNvbgBEABxBaXJkcm9wBABBBgGAaW5kaXZfcGFsbGV0X2FpcmRyb3A6OkhvbGRSZWFzb24APQAAJQYMOHBhbGxldF9zZXNzaW9uGHBhbGxldChIb2xkUmVhc29uAAEEEEtleXMAAAAAKQYMKHBhbGxldF94Y20YcGFsbGV0KEhvbGRSZWFzb24AAQQ4QXV0aG9yaXplQWxpYXMAAAAALQYMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQoSG9sZFJlYXNvbgABCBhQYXlvdXQAAAAYQ3JlZGl0AAEAADEGDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldChIb2xkUmVhc29uAAEEKFByb29mT2ZJbmsAAAAANQYMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldChIb2xkUmVhc29uAAEEIFBsYXlHYW1lAAAAADkGDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0KEhvbGRSZWFzb24AAQgYUGF5b3V0AAAAGENyZWRpdAABAAA9BgxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0KEhvbGRSZWFzb24AAQQcV3JhcHBlZAAAAABBBgxQaW5kaXZfcGFsbGV0X2FpcmRyb3AYcGFsbGV0KEhvbGRSZWFzb24AAQQcQWlyZHJvcAAAAABFBgw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldDhVbmV4cGVjdGVkS2luZAABCDhCYWxhbmNlVXBkYXRlZAAAAFRGYWlsZWRUb011dGF0ZUFjY291bnQAAQAASQYMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50GHBhbGxldBRFdmVudAQEVAABBEhUcmFuc2FjdGlvbkZlZVBhaWQMAQx3aG8EATBUOjpBY2NvdW50SWQAAShhY3R1YWxfZmVlxAEwQmFsYW5jZU9mPFQ+AAEMdGlwxAEwQmFsYW5jZU9mPFQ+AAAIWQFBIHRyYW5zYWN0aW9uIGZlZSBgYWN0dWFsX2ZlZWAsIG9mIHdoaWNoIGB0aXBgIHdhcyBhZGRlZCB0byB0aGUgbWluaW11bSBpbmNsdXNpb24gZmVlLFxoYXMgYmVlbiBwYWlkIGJ5IGB3aG9gLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0GDGxwYWxsZXRfc2tpcF9mZWVsZXNzX3BheW1lbnQYcGFsbGV0FEV2ZW50BARUAAEEKEZlZVNraXBwZWQEARhvcmlnaW4xAwHAPFQ6OlJ1bnRpbWVPcmlnaW4gYXMgT3JpZ2luVHJhaXQ+OjpQYWxsZXRzT3JpZ2luAAAEeEEgdHJhbnNhY3Rpb24gZmVlIHdhcyBza2lwcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFEGDHxpbmRpdl9wYWxsZXRfb3JpZ2luX3Jlc3RyaWN0aW9uGHBhbGxldBRFdmVudAQEVAABBDBVc2FnZUNsZWFuZWQEARhlbnRpdHnYAUxUOjpSZXN0cmljdGVkRW50aXR5AAAEfFVzYWdlIGZvciBhbiBlbnRpdHkgaXMgY2xlYW5lZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRVBgw0cGFsbGV0X2Fzc2V0cxhwYWxsZXQURXZlbnQIBFQABEkAAXAcQ3JlYXRlZAwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABHGNyZWF0b3IEATBUOjpBY2NvdW50SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAAABHRTb21lIGFzc2V0IGNsYXNzIHdhcyBjcmVhdGVkLhhJc3N1ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAQRgU29tZSBhc3NldHMgd2VyZSBpc3N1ZWQuLFRyYW5zZmVycmVkEAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEQZnJvbQQBMFQ6OkFjY291bnRJZAABCHRvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQACBHRTb21lIGFzc2V0cyB3ZXJlIHRyYW5zZmVycmVkLhhCdXJuZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAABHGJhbGFuY2XEAShUOjpCYWxhbmNlAAMEbFNvbWUgYXNzZXRzIHdlcmUgZGVzdHJveWVkLixUZWFtQ2hhbmdlZBABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGGlzc3VlcgQBMFQ6OkFjY291bnRJZAABFGFkbWluBAEwVDo6QWNjb3VudElkAAEcZnJlZXplcgQBMFQ6OkFjY291bnRJZAAEBHBUaGUgbWFuYWdlbWVudCB0ZWFtIGNoYW5nZWQuME93bmVyQ2hhbmdlZAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABFG93bmVyBAEwVDo6QWNjb3VudElkAAUESFRoZSBvd25lciBjaGFuZ2VkLhhGcm96ZW4IASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQABgR4U29tZSBhY2NvdW50IGB3aG9gIHdhcyBmcm96ZW4uGFRoYXdlZAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABDHdobwQBMFQ6OkFjY291bnRJZAAHBHhTb21lIGFjY291bnQgYHdob2Agd2FzIHRoYXdlZC4sQXNzZXRGcm96ZW4EASBhc3NldF9pZOABKFQ6OkFzc2V0SWQACASEU29tZSBhc3NldCBgYXNzZXRfaWRgIHdhcyBmcm96ZW4uLEFzc2V0VGhhd2VkBAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAkEhFNvbWUgYXNzZXQgYGFzc2V0X2lkYCB3YXMgdGhhd2VkLkRBY2NvdW50c0Rlc3Ryb3llZAwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABSGFjY291bnRzX2Rlc3Ryb3llZDgBDHUzMgABSGFjY291bnRzX3JlbWFpbmluZzgBDHUzMgAKBKBBY2NvdW50cyB3ZXJlIGRlc3Ryb3llZCBmb3IgZ2l2ZW4gYXNzZXQuSEFwcHJvdmFsc0Rlc3Ryb3llZAwBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABTGFwcHJvdmFsc19kZXN0cm95ZWQ4AQx1MzIAAUxhcHByb3ZhbHNfcmVtYWluaW5nOAEMdTMyAAsEpEFwcHJvdmFscyB3ZXJlIGRlc3Ryb3llZCBmb3IgZ2l2ZW4gYXNzZXQuSERlc3RydWN0aW9uU3RhcnRlZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAAMBNBBbiBhc3NldCBjbGFzcyBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQuJERlc3Ryb3llZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAANBHRBbiBhc3NldCBjbGFzcyB3YXMgZGVzdHJveWVkLjBGb3JjZUNyZWF0ZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAAOBIxTb21lIGFzc2V0IGNsYXNzIHdhcyBmb3JjZS1jcmVhdGVkLixNZXRhZGF0YVNldBQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABEG5hbWUYARxWZWM8dTg+AAEYc3ltYm9sGAEcVmVjPHU4PgABIGRlY2ltYWxzDAEIdTgAASRpc19mcm96ZW7IARBib29sAA8EnE5ldyBtZXRhZGF0YSBoYXMgYmVlbiBzZXQgZm9yIGFuIGFzc2V0LjxNZXRhZGF0YUNsZWFyZWQEASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAEAScTWV0YWRhdGEgaGFzIGJlZW4gY2xlYXJlZCBmb3IgYW4gYXNzZXQuQEFwcHJvdmVkVHJhbnNmZXIQASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhzb3VyY2UEATBUOjpBY2NvdW50SWQAASBkZWxlZ2F0ZQQBMFQ6OkFjY291bnRJZAABGGFtb3VudMQBKFQ6OkJhbGFuY2UAEQQxAShBZGRpdGlvbmFsKSBmdW5kcyBoYXZlIGJlZW4gYXBwcm92ZWQgZm9yIHRyYW5zZmVyIHRvIGEgZGVzdGluYXRpb24gYWNjb3VudC5EQXBwcm92YWxDYW5jZWxsZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARRvd25lcgQBMFQ6OkFjY291bnRJZAABIGRlbGVnYXRlBAEwVDo6QWNjb3VudElkABIE8EFuIGFwcHJvdmFsIGZvciBhY2NvdW50IGBkZWxlZ2F0ZWAgd2FzIGNhbmNlbGxlZCBieSBgb3duZXJgLkxUcmFuc2ZlcnJlZEFwcHJvdmVkFAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEUb3duZXIEATBUOjpBY2NvdW50SWQAASBkZWxlZ2F0ZQQBMFQ6OkFjY291bnRJZAABLGRlc3RpbmF0aW9uBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQATCDEBQW4gYGFtb3VudGAgd2FzIHRyYW5zZmVycmVkIGluIGl0cyBlbnRpcmV0eSBmcm9tIGBvd25lcmAgdG8gYGRlc3RpbmF0aW9uYCBieWB0aGUgYXBwcm92ZWQgYGRlbGVnYXRlYC5IQXNzZXRTdGF0dXNDaGFuZ2VkBAEgYXNzZXRfaWTgAShUOjpBc3NldElkABQE+EFuIGFzc2V0IGhhcyBoYWQgaXRzIGF0dHJpYnV0ZXMgY2hhbmdlZCBieSB0aGUgYEZvcmNlYCBvcmlnaW4uWEFzc2V0TWluQmFsYW5jZUNoYW5nZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAATxuZXdfbWluX2JhbGFuY2XEAShUOjpCYWxhbmNlABUEAQFUaGUgbWluX2JhbGFuY2Ugb2YgYW4gYXNzZXQgaGFzIGJlZW4gdXBkYXRlZCBieSB0aGUgYXNzZXQgb3duZXIuHFRvdWNoZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAASRkZXBvc2l0b3IEATBUOjpBY2NvdW50SWQAFgT8U29tZSBhY2NvdW50IGB3aG9gIHdhcyBjcmVhdGVkIHdpdGggYSBkZXBvc2l0IGZyb20gYGRlcG9zaXRvcmAuHEJsb2NrZWQIASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAFwR8U29tZSBhY2NvdW50IGB3aG9gIHdhcyBibG9ja2VkLiREZXBvc2l0ZWQMASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAAQx3aG8EATBUOjpBY2NvdW50SWQAARhhbW91bnTEAShUOjpCYWxhbmNlABgE3FNvbWUgYXNzZXRzIHdlcmUgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4kV2l0aGRyYXduDAEgYXNzZXRfaWTgAShUOjpBc3NldElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAEYYW1vdW50xAEoVDo6QmFsYW5jZQAZBCEBU29tZSBhc3NldHMgd2VyZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuPFJlc2VydmVzVXBkYXRlZAgBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABIHJlc2VydmVzJQEBTFZlYzxUOjpSZXNlcnZlRGF0YT4AGgTYUmVzZXJ2ZSBpbmZvcm1hdGlvbiB3YXMgc2V0IG9yIHVwZGF0ZWQgZm9yIGBhc3NldF9pZGAuPFJlc2VydmVzUmVtb3ZlZAQBIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAAbBLxSZXNlcnZlIGluZm9ybWF0aW9uIHdhcyByZW1vdmVkIGZvciBgYXNzZXRfaWRgLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFkGDFBwYWxsZXRfYXNzZXRzX2hvbGRlchhwYWxsZXQURXZlbnQIBFQABEkAAQwQSGVsZBABDHdobwQBMFQ6OkFjY291bnRJZAABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAATEYHdob2BzIGJhbGFuY2Ugb24gaG9sZCB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLiBSZWxlYXNlZBABDHdobwQBMFQ6OkFjY291bnRJZAABIGFzc2V0X2lk4AEoVDo6QXNzZXRJZAABGHJlYXNvbiEGAVBUOjpSdW50aW1lSG9sZFJlYXNvbgABGGFtb3VudMQBKFQ6OkJhbGFuY2UAAQTEYHdob2BzIGJhbGFuY2Ugb24gaG9sZCB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLhhCdXJuZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABKFQ6OkFzc2V0SWQAARhyZWFzb24hBgFQVDo6UnVudGltZUhvbGRSZWFzb24AARhhbW91bnTEAShUOjpCYWxhbmNlAAIEuGB3aG9gcyBiYWxhbmNlIG9uIGhvbGQgd2FzIGJ1cm5lZCBieSBgYW1vdW50YC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRdBgxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k4AEwVDo6QXNzZXRLaW5kAAEQcmF0ZS0BASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTgATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTgATBUOjpBc3NldEtpbmQAAQxvbGQtAQEkRml4ZWRVMTI4AAEMbmV3LQEBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldGEGDFxwYWxsZXRfYXNzZXRfdHhfcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQQ4QXNzZXRUeEZlZVBhaWQQAQx3aG8EATBUOjpBY2NvdW50SWQAAShhY3R1YWxfZmVlxAFEQXNzZXRCYWxhbmNlT2Y8VD4AAQx0aXDEAURBc3NldEJhbGFuY2VPZjxUPgABIGFzc2V0X2lkoQIBaE9wdGlvbjxDaGFyZ2VBc3NldElkT2Y8VD4+AAAIWQFBIHRyYW5zYWN0aW9uIGZlZSBgYWN0dWFsX2ZlZWAsIG9mIHdoaWNoIGB0aXBgIHdhcyBhZGRlZCB0byB0aGUgbWluaW11bSBpbmNsdXNpb24gZmVlLLhoYXMgYmVlbiBwYWlkIGJ5IGB3aG9gIGluIGFuIGFzc2V0IGBhc3NldF9pZGAuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0ZQYMZHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb24YcGFsbGV0FEV2ZW50BARUAAEoQE5ld0ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVzzAFEVmVjPFQ6OkFjY291bnRJZD4AAARsTmV3IEludnVsbmVyYWJsZXMgd2VyZSBzZXQuREludnVsbmVyYWJsZUFkZGVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABBHRBIG5ldyBJbnZ1bG5lcmFibGUgd2FzIGFkZGVkLkxJbnZ1bG5lcmFibGVSZW1vdmVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAACBHBBbiBJbnZ1bG5lcmFibGUgd2FzIHJlbW92ZWQuUE5ld0Rlc2lyZWRDYW5kaWRhdGVzBAFIZGVzaXJlZF9jYW5kaWRhdGVzOAEMdTMyAAMEpFRoZSBudW1iZXIgb2YgZGVzaXJlZCBjYW5kaWRhdGVzIHdhcyBzZXQuQE5ld0NhbmRpZGFjeUJvbmQEASxib25kX2Ftb3VudMQBMEJhbGFuY2VPZjxUPgAEBGxUaGUgY2FuZGlkYWN5IGJvbmQgd2FzIHNldC44Q2FuZGlkYXRlQWRkZWQIAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAFBFxBIG5ldyBjYW5kaWRhdGUgam9pbmVkLlBDYW5kaWRhdGVCb25kVXBkYXRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAYEcEJvbmQgb2YgYSBjYW5kaWRhdGUgdXBkYXRlZC5AQ2FuZGlkYXRlUmVtb3ZlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQABwRgQSBjYW5kaWRhdGUgd2FzIHJlbW92ZWQuRENhbmRpZGF0ZVJlcGxhY2VkDAEMb2xkBAEwVDo6QWNjb3VudElkAAEMbmV3BAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAIBPRBbiBhY2NvdW50IHdhcyByZXBsYWNlZCBpbiB0aGUgY2FuZGlkYXRlIGxpc3QgYnkgYW5vdGhlciBvbmUuaEludmFsaWRJbnZ1bG5lcmFibGVTa2lwcGVkBAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAAJCFUBQW4gYWNjb3VudCB3YXMgdW5hYmxlIHRvIGJlIGFkZGVkIHRvIHRoZSBJbnZ1bG5lcmFibGVzIGJlY2F1c2UgdGhleSBkaWQgbm90IGhhdmUga2V5c8hyZWdpc3RlcmVkLiBPdGhlciBJbnZ1bG5lcmFibGVzIG1heSBoYXZlIGJlZW4gc2V0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldGkGDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXZlbnQEBFQAARAoTmV3U2Vzc2lvbgQBNHNlc3Npb25faW5kZXg4ATBTZXNzaW9uSW5kZXgAAAg5AU5ldyBzZXNzaW9uIGhhcyBoYXBwZW5lZC4gTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBpcyB0aGUgc2Vzc2lvbiBpbmRleCwgbm90IHRoZZxibG9jayBudW1iZXIgYXMgdGhlIHR5cGUgbWlnaHQgc3VnZ2VzdC4kTmV3UXVldWVkAAEISQFUaGUgYE5ld1Nlc3Npb25gIGV2ZW50IGluIHRoZSBjdXJyZW50IGJsb2NrIGFsc28gaW1wbGllcyBhIG5ldyB2YWxpZGF0b3Igc2V0IHRvIGJlHHF1ZXVlZC5EVmFsaWRhdG9yRGlzYWJsZWQEASR2YWxpZGF0b3IEAThUOjpWYWxpZGF0b3JJZAACBHBWYWxpZGF0b3IgaGFzIGJlZW4gZGlzYWJsZWQuSFZhbGlkYXRvclJlZW5hYmxlZAQBJHZhbGlkYXRvcgQBOFQ6OlZhbGlkYXRvcklkAAMEeFZhbGlkYXRvciBoYXMgYmVlbiByZS1lbmFibGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldG0GDGRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABBDxYY21wTWVzc2FnZVNlbnQEATBtZXNzYWdlX2hhc2gIARxYY21IYXNoAAAEwEFuIEhSTVAgbWVzc2FnZSB3YXMgc2VudCB0byBhIHNpYmxpbmcgcGFyYWNoYWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldHEGDChwYWxsZXRfeGNtGHBhbGxldBRFdmVudAQEVAABdCRBdHRlbXB0ZWQEARxvdXRjb21ldQYBUHhjbTo6bGF0ZXN0OjpPdXRjb21lAAAEqEV4ZWN1dGlvbiBvZiBhbiBYQ00gbWVzc2FnZSB3YXMgYXR0ZW1wdGVkLhBTZW50EAEYb3JpZ2lu4AEgTG9jYXRpb24AASxkZXN0aW5hdGlvbuABIExvY2F0aW9uAAEcbWVzc2FnZV0CARxYY208KCk+AAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAAQRgQW4gWENNIG1lc3NhZ2Ugd2FzIHNlbnQuKFNlbmRGYWlsZWQQARhvcmlnaW7gASBMb2NhdGlvbgABLGRlc3RpbmF0aW9u4AEgTG9jYXRpb24AARRlcnJvcn0GASRTZW5kRXJyb3IAAShtZXNzYWdlX2lkCAEcWGNtSGFzaAACBHhBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gc2VuZC48UHJvY2Vzc1hjbUVycm9yDAEYb3JpZ2lu4AEgTG9jYXRpb24AARRlcnJvco0CASBYY21FcnJvcgABKG1lc3NhZ2VfaWQIARxYY21IYXNoAAMEhEFuIFhDTSBtZXNzYWdlIGZhaWxlZCB0byBwcm9jZXNzLkhVbmV4cGVjdGVkUmVzcG9uc2UIARhvcmlnaW7gASBMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAAEDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQoARxRdWVyeUlkAAEgcmVzcG9uc2WBAgEgUmVzcG9uc2UABQhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAYIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAE0YWN0dWFsX3dlaWdodNUBARhXZWlnaHQAAUxtYXhfYnVkZ2V0ZWRfd2VpZ2h01QEBGFdlaWdodAAHDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZCgBHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgMAQh1OAABKGNhbGxfaW5kZXgMAQh1OAAICFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkKAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAkMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkAAFEZXhwZWN0ZWRfbG9jYXRpb26hAgFAT3B0aW9uPExvY2F0aW9uPgAKDFkBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBvcmlnaW4gbG9jYXRpb24gb2YgdGhlIHJlc3BvbnNlIGRvZXNVAW5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uXEludmFsaWRSZXNwb25kZXJWZXJzaW9uCAEYb3JpZ2lu4AEgTG9jYXRpb24AASBxdWVyeV9pZCgBHFF1ZXJ5SWQACxxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkKAEcUXVlcnlJZAAMBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDwBEEgyNTYAARhvcmlnaW7gASBMb2NhdGlvbgABGGFzc2V0c9kCATxWZXJzaW9uZWRBc3NldHMADQS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbuABIExvY2F0aW9uAAEYcmVzdWx0OAEoWGNtVmVyc2lvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gADgwlAUFuIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgc2VudC4A4FRoZSBjb3N0IG9mIHNlbmRpbmcgaXQgKGJvcm5lIGJ5IHRoZSBjaGFpbikgaXMgaW5jbHVkZWQuXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkCAEgbG9jYXRpb27gASBMb2NhdGlvbgABHHZlcnNpb244AShYY21WZXJzaW9uAA8IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb27gASBMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAABFGVycm9yjQIBIFhjbUVycm9yABAIWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkKAEcUXVlcnlJZAARCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkABIcVQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIGV4cGVjdGVkIHF1ZXJpZXIgbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjhJbnZhbGlkUXVlcmllchABGG9yaWdpbuABIExvY2F0aW9uAAEgcXVlcnlfaWQoARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcuABIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXKhAgFAT3B0aW9uPExvY2F0aW9uPgATDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFAhZAUEgcmVtb3RlIGhhcyByZXF1ZXN0ZWQgWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHVzIGFuZCB3ZSBoYXZlIGhvbm9yZWQgaXQuHQFBIHZlcnNpb24gaW5mb3JtYXRpb24gbWVzc2FnZSBpcyBzZW50IHRvIHRoZW0gYW5kIGl0cyBjb3N0IGlzIGluY2x1ZGVkLlhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFQQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb27gASBMb2NhdGlvbgABEGNvc3RpAgEYQXNzZXRzAAEobWVzc2FnZV9pZAgBHFhjbUhhc2gAFgglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbmfgASBMb2NhdGlvbgABEGZlZXNpAgEYQXNzZXRzABcEMQFGZWVzIHdlcmUgcGFpZCBmcm9tIGEgbG9jYXRpb24gZm9yIGFuIG9wZXJhdGlvbiAob2Z0ZW4gZm9yIHVzaW5nIGBTZW5kWGNtYCkuNEFzc2V0c0NsYWltZWQMARBoYXNoPAEQSDI1NgABGG9yaWdpbuABIExvY2F0aW9uAAEYYXNzZXRz2QIBPFZlcnNpb25lZEFzc2V0cwAYBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbjgBKFhjbVZlcnNpb24AGQSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuPEFsaWFzQXV0aG9yaXplZAwBHGFsaWFzZXLgASBMb2NhdGlvbgABGHRhcmdldOABIExvY2F0aW9uAAEYZXhwaXJ5FQMBLE9wdGlvbjx1NjQ+ABoIXQFBbiBgYWxpYXNlcmAgbG9jYXRpb24gd2FzIGF1dGhvcml6ZWQgYnkgYHRhcmdldGAgdG8gYWxpYXMgaXQsIGF1dGhvcml6YXRpb24gdmFsaWQgdW50aWxYYGV4cGlyeWAgYmxvY2sgbnVtYmVyLmRBbGlhc0F1dGhvcml6YXRpb25SZW1vdmVkCAEcYWxpYXNlcuABIExvY2F0aW9uAAEYdGFyZ2V04AEgTG9jYXRpb24AGwTMYHRhcmdldGAgcmVtb3ZlZCBhbGlhcyBhdXRob3JpemF0aW9uIGZvciBgYWxpYXNlcmAucEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQEARh0YXJnZXTgASBMb2NhdGlvbgAcBKhgdGFyZ2V0YCByZW1vdmVkIGFsbCBhbGlhcyBhdXRob3JpemF0aW9ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXR1BhAsc3RhZ2luZ194Y20IdjUYdHJhaXRzHE91dGNvbWUAAQwgQ29tcGxldGUEARB1c2Vk1QEBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZNUBARhXZWlnaHQAARRlcnJvcnkGAUBJbnN0cnVjdGlvbkVycm9yAAEAFEVycm9yBAB5BgFASW5zdHJ1Y3Rpb25FcnJvcgACAAB5BhAsc3RhZ2luZ194Y20IdjUYdHJhaXRzQEluc3RydWN0aW9uRXJyb3IAAAgBFGluZGV4DAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yjQIBFEVycm9yAAB9BhAMeGNtCHYzGHRyYWl0cyRTZW5kRXJyb3IAARw0Tm90QXBwbGljYWJsZQAAACRUcmFuc3BvcnQAAQAoVW5yb3V0YWJsZQACAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAAMAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAEADxNaXNzaW5nQXJndW1lbnQABQAQRmVlcwAGAACBBgxIY3VtdWx1c19wYWxsZXRfeGNtGHBhbGxldBRFdmVudAQEVAABDDRJbnZhbGlkRm9ybWF0BAAIASBbdTg7IDMyXQAACIBEb3dud2FyZCBtZXNzYWdlIGlzIGludmFsaWQgWENNLiBcWyBpZCBcXUhVbnN1cHBvcnRlZFZlcnNpb24EAAgBIFt1ODsgMzJdAAEIvERvd253YXJkIG1lc3NhZ2UgaXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBYQ00uIFxbIGlkIFxdQEV4ZWN1dGVkRG93bndhcmQIAAgBIFt1ODsgMzJdAAB1BgEcT3V0Y29tZQACCMREb3dud2FyZCBtZXNzYWdlIGV4ZWN1dGVkIHdpdGggdGhlIGdpdmVuIG91dGNvbWUuRFxbIGlkLCBvdXRjb21lIFxdBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0hQYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ8ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcokGAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ8ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4hAwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZNUBARhXZWlnaHQEwEhvdyBtdWNoIHdlaWdodCB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgEcc3VjY2Vzc8gBEGJvb2wYiFdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZC4ASQFOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHVuZGVybHlpbmcgYE1lc3NhZ2VQcm9jZXNzb3JgIHdhcyBpbnRlcm5hbGx5NQFzdWNjZXNzZnVsLiBJdCAqc29sZWx5KiBtZWFucyB0aGF0IHRoZSBNUSBwYWxsZXQgd2lsbCB0cmVhdCB0aGlzIGFzIGEgc3VjY2Vzc00BY29uZGl0aW9uIGFuZCBkaXNjYXJkIHRoZSBtZXNzYWdlLiBBbnkgaW50ZXJuYWwgZXJyb3IgbmVlZHMgdG8gYmUgZW1pdHRlZCBhcyBldmVudHNoYnkgdGhlIGBNZXNzYWdlUHJvY2Vzc29yYC4BBFRNZXNzYWdlIGlzIHByb2Nlc3NlZC5IT3ZlcndlaWdodEVucXVldWVkEAEIaWQIASBbdTg7IDMyXQSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEocGFnZV9pbmRleDgBJFBhZ2VJbmRleARgVGhlIHBhZ2Ugb2YgdGhlIG1lc3NhZ2UuATRtZXNzYWdlX2luZGV4OAEcVDo6U2l6ZQSkVGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgcGFnZS4CBIxNZXNzYWdlIHBsYWNlZCBpbiBvdmVyd2VpZ2h0IHF1ZXVlLihQYWdlUmVhcGVkCAEYb3JpZ2luIQMBSE1lc3NhZ2VPcmlnaW5PZjxUPgRYVGhlIHF1ZXVlIG9mIHRoZSBwYWdlLgEUaW5kZXg4ASRQYWdlSW5kZXgEWFRoZSBpbmRleCBvZiB0aGUgcGFnZS4DBFRUaGlzIHBhZ2Ugd2FzIHJlYXBlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSJBhA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgbWVzc2FnZXNMUHJvY2Vzc01lc3NhZ2VFcnJvcgABGCRCYWRGb3JtYXQAAAAcQ29ycnVwdAABACxVbnN1cHBvcnRlZAACAChPdmVyd2VpZ2h0BADVAQEYV2VpZ2h0AAMAFFlpZWxkAAQARFN0YWNrTGltaXRSZWFjaGVkAAUAAI0GDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXZlbnQAASBAQmF0Y2hJbnRlcnJ1cHRlZAgBFGluZGV4OAEMdTMyAAEUZXJyb3L5BQE0RGlzcGF0Y2hFcnJvcgAACFUBQmF0Y2ggb2YgZGlzcGF0Y2hlcyBkaWQgbm90IGNvbXBsZXRlIGZ1bGx5LiBJbmRleCBvZiBmaXJzdCBmYWlsaW5nIGRpc3BhdGNoIGdpdmVuLCBhc0h3ZWxsIGFzIHRoZSBlcnJvci44QmF0Y2hDb21wbGV0ZWQAAQTIQmF0Y2ggb2YgZGlzcGF0Y2hlcyBjb21wbGV0ZWQgZnVsbHkgd2l0aCBubyBlcnJvci5gQmF0Y2hDb21wbGV0ZWRXaXRoRXJyb3JzAAIEtEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGJ1dCBoYXMgZXJyb3JzLjRJdGVtQ29tcGxldGVkAAMEHQFBIHNpbmdsZSBpdGVtIHdpdGhpbiBhIEJhdGNoIG9mIGRpc3BhdGNoZXMgaGFzIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9yLihJdGVtRmFpbGVkBAEUZXJyb3L5BQE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0AAUEWEEgY2FsbCB3YXMgZGlzcGF0Y2hlZC5ESWZFbHNlTWFpblN1Y2Nlc3MABgRkTWFpbiBjYWxsIHdhcyBkaXNwYXRjaGVkLlBJZkVsc2VGYWxsYmFja0NhbGxlZAQBKG1haW5fZXJyb3L5BQE0RGlzcGF0Y2hFcnJvcgAHBIRUaGUgZmFsbGJhY2sgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSRBgQYUmVzdWx0CARUARAERQH5BQEICE9rBAAQAAAAAAxFcnIEAPkFAAABAACVBgw8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFdmVudAQEVAABFCxOZXdNdWx0aXNpZwwBJGFwcHJvdmluZwQBMFQ6OkFjY291bnRJZAABIG11bHRpc2lnBAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoCAEgQ2FsbEhhc2gAAASMQSBuZXcgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWd1bi5ATXVsdGlzaWdBcHByb3ZhbBABJGFwcHJvdmluZwQBMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludIkDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcEATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gIASBDYWxsSGFzaAABBMhBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZCBieSBzb21lb25lLkBNdWx0aXNpZ0V4ZWN1dGVkFAEkYXBwcm92aW5nBAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50iQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwQBMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAgBIENhbGxIYXNoAAEYcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0AAIEnEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLkRNdWx0aXNpZ0NhbmNlbGxlZBABKGNhbmNlbGxpbmcEATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnSJAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnBAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoCAEgQ2FsbEhhc2gAAwSgQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLjBEZXBvc2l0UG9rZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gIASBDYWxsSGFzaAABLG9sZF9kZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXTEATBCYWxhbmNlT2Y8VD4ABATwVGhlIGRlcG9zaXQgZm9yIGEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQvcG9rZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0mQYMLHBhbGxldF9zdWRvGHBhbGxldBRFdmVudAQEVAABEBRTdWRpZAQBLHN1ZG9fcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4ABHBBIHN1ZG8gY2FsbCBqdXN0IHRvb2sgcGxhY2UuKEtleUNoYW5nZWQIAQxvbGTpBAFQT3B0aW9uPFQ6OkFjY291bnRJZD4EtFRoZSBvbGQgc3VkbyBrZXkgKGlmIG9uZSB3YXMgcHJldmlvdXNseSBzZXQpLgEMbmV3BAEwVDo6QWNjb3VudElkBIhUaGUgbmV3IHN1ZG8ga2V5IChpZiBvbmUgd2FzIHNldCkuAQR4VGhlIHN1ZG8ga2V5IGhhcyBiZWVuIHVwZGF0ZWQuKEtleVJlbW92ZWQAAgSAVGhlIGtleSB3YXMgcGVybWFuZW50bHkgcmVtb3ZlZC4oU3Vkb0FzRG9uZQQBLHN1ZG9fcmVzdWx0kQYBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4DBMhBIFtzdWRvX2FzXShQYWxsZXQ6OnN1ZG9fYXMpIGNhbGwganVzdCB0b29rIHBsYWNlLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJ0GDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEcNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSRBgE4RGlzcGF0Y2hSZXN1bHQAAAS8QSBwcm94eSB3YXMgZXhlY3V0ZWQgY29ycmVjdGx5LCB3aXRoIHRoZSBnaXZlbi4sUHVyZUNyZWF0ZWQYARBwdXJlBAEwVDo6QWNjb3VudElkAAEMd2hvBAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZZkDATBUOjpQcm94eVR5cGUAAVBkaXNhbWJpZ3VhdGlvbl9pbmRleC0DAQx1MTYAAQhhdDgBREJsb2NrTnVtYmVyRm9yPFQ+AAE8ZXh0cmluc2ljX2luZGV4OAEMdTMyAAEI3EEgcHVyZSBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnkgbmV3IHByb3h5IHdpdGggZ2l2ZW6QZGlzYW1iaWd1YXRpb24gaW5kZXggYW5kIHByb3h5IHR5cGUuKFB1cmVLaWxsZWQQARBwdXJlBAEwVDo6QWNjb3VudElkAAEcc3Bhd25lcgQBMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAFQZGlzYW1iaWd1YXRpb25faW5kZXgtAwEMdTE2AAIEnEEgcHVyZSBwcm94eSB3YXMga2lsbGVkIGJ5IGl0cyBzcGF3bmVyLiRBbm5vdW5jZWQMARByZWFsBAEwVDo6QWNjb3VudElkAAEUcHJveHkEATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g8ATRDYWxsSGFzaE9mPFQ+AAME4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IEATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUEATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlmQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5OAFEQmxvY2tOdW1iZXJGb3I8VD4ABARIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgQBMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQQBMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGWZAwEwVDo6UHJveHlUeXBlAAEUZGVsYXk4AURCbG9ja051bWJlckZvcjxUPgAFBFBBIHByb3h5IHdhcyByZW1vdmVkLjBEZXBvc2l0UG9rZWQQAQx3aG8EATBUOjpBY2NvdW50SWQAARBraW5koQYBLERlcG9zaXRLaW5kAAEsb2xkX2RlcG9zaXTEATBCYWxhbmNlT2Y8VD4AASxuZXdfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAGBAkBQSBkZXBvc2l0IHN0b3JlZCBmb3IgcHJveGllcyBvciBhbm5vdW5jZW1lbnRzIHdhcyBwb2tlZCAvIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0oQYIMHBhbGxldF9wcm94eSxEZXBvc2l0S2luZAABCBxQcm94aWVzAAAANEFubm91bmNlbWVudHMAAQAApQYMVGluZGl2X3BhbGxldF9pZGVudGl0eRhwYWxsZXQURXZlbnQEBFQAAYAsSWRlbnRpdHlTZXQEAQx3aG8EATBUOjpBY2NvdW50SWQAAATsQSBuYW1lIHdhcyBzZXQgb3IgcmVzZXQgKHdoaWNoIHdpbGwgcmVtb3ZlIGFsbCBqdWRnZW1lbnRzKS48SWRlbnRpdHlDbGVhcmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgABBMxBIG5hbWUgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gYmFsYW5jZSByZXR1cm5lZC44SWRlbnRpdHlLaWxsZWQIAQx3aG8EATBUOjpBY2NvdW50SWQAARxkZXBvc2l0xAEwQmFsYW5jZU9mPFQ+AAIExEEgbmFtZSB3YXMgcmVtb3ZlZCBhbmQgdGhlIGdpdmVuIGJhbGFuY2Ugc2xhc2hlZC5ISnVkZ2VtZW50UmVxdWVzdGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4OAE4UmVnaXN0cmFySW5kZXgAAwScQSBqdWRnZW1lbnQgd2FzIGFza2VkIGZyb20gYSByZWdpc3RyYXIuUEp1ZGdlbWVudFVucmVxdWVzdGVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4OAE4UmVnaXN0cmFySW5kZXgABASIQSBqdWRnZW1lbnQgcmVxdWVzdCB3YXMgcmV0cmFjdGVkLjhKdWRnZW1lbnRHaXZlbggBGHRhcmdldAQBMFQ6OkFjY291bnRJZAABPHJlZ2lzdHJhcl9pbmRleDgBOFJlZ2lzdHJhckluZGV4AAUElEEganVkZ2VtZW50IHdhcyBnaXZlbiBieSBhIHJlZ2lzdHJhci44UmVnaXN0cmFyQWRkZWQEATxyZWdpc3RyYXJfaW5kZXg4AThSZWdpc3RyYXJJbmRleAAGBFhBIHJlZ2lzdHJhciB3YXMgYWRkZWQuQFN1YklkZW50aXR5QWRkZWQMAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAHBPRBIHN1Yi1pZGVudGl0eSB3YXMgYWRkZWQgdG8gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IHBhaWQuQFN1YklkZW50aXRpZXNTZXQMARBtYWluBAEwVDo6QWNjb3VudElkAAE4bnVtYmVyX29mX3N1YnM4AQx1MzIAASxuZXdfZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgAIBLxBbiBhY2NvdW50J3Mgc3ViLWlkZW50aXRpZXMgd2VyZSBzZXQgKGluIGJ1bGspLkhTdWJJZGVudGl0eVJlbmFtZWQIAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAkEIQFBIGdpdmVuIHN1Yi1hY2NvdW50J3MgYXNzb2NpYXRlZCBuYW1lIHdhcyBjaGFuZ2VkIGJ5IGl0cyBzdXBlci1pZGVudGl0eS5IU3ViSWRlbnRpdHlSZW1vdmVkDAEMc3ViBAEwVDo6QWNjb3VudElkAAEQbWFpbgQBMFQ6OkFjY291bnRJZAABHGRlcG9zaXTEATBCYWxhbmNlT2Y8VD4ACgQJAUEgc3ViLWlkZW50aXR5IHdhcyByZW1vdmVkIGZyb20gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IGZyZWVkLkhTdWJJZGVudGl0eVJldm9rZWQMAQxzdWIEATBUOjpBY2NvdW50SWQAARBtYWluBAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdMQBMEJhbGFuY2VPZjxUPgALCBkBQSBzdWItaWRlbnRpdHkgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gZGVwb3NpdCByZXBhdHJpYXRlZCBmcm9tIHRoZchtYWluIGlkZW50aXR5IGFjY291bnQgdG8gdGhlIHN1Yi1pZGVudGl0eSBhY2NvdW50LjhBdXRob3JpdHlBZGRlZAQBJGF1dGhvcml0eQQBMFQ6OkFjY291bnRJZAAMBHxBIHVzZXJuYW1lIGF1dGhvcml0eSB3YXMgYWRkZWQuQEF1dGhvcml0eVJlbW92ZWQEASRhdXRob3JpdHkEATBUOjpBY2NvdW50SWQADQSEQSB1c2VybmFtZSBhdXRob3JpdHkgd2FzIHJlbW92ZWQuLFVzZXJuYW1lU2V0CAEMd2hvBAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4ADgR0QSB1c2VybmFtZSB3YXMgc2V0IGZvciBgd2hvYC44VXNlcm5hbWVRdWV1ZWQMAQx3aG8EATBUOjpBY2NvdW50SWQAASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgABKGV4cGlyYXRpb244AURCbG9ja051bWJlckZvcjxUPgAPBBkBQSB1c2VybmFtZSB3YXMgcXVldWVkLCBidXQgYHdob2AgbXVzdCBhY2NlcHQgaXQgcHJpb3IgdG8gYGV4cGlyYXRpb25gLkhQcmVhcHByb3ZhbEV4cGlyZWQEARR3aG9zZQQBMFQ6OkFjY291bnRJZAAQBDkBQSBxdWV1ZWQgdXNlcm5hbWUgcGFzc2VkIGl0cyBleHBpcmF0aW9uIHdpdGhvdXQgYmVpbmcgY2xhaW1lZCBhbmQgd2FzIHJlbW92ZWQuSFByaW1hcnlVc2VybmFtZVNldAgBDHdobwQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABEEAQFBIHVzZXJuYW1lIHdhcyBzZXQgYXMgYSBwcmltYXJ5IGFuZCBjYW4gYmUgbG9va2VkIHVwIGZyb20gYHdob2AuXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEghdAUEgZGFuZ2xpbmcgdXNlcm5hbWUgKGFzIGluLCBhIHVzZXJuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gYWNjb3VudCB0aGF0IGhhcyByZW1vdmVkIGl0c2xpZGVudGl0eSkgaGFzIGJlZW4gcmVtb3ZlZC48VXNlcm5hbWVVbmJvdW5kBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AEwRwQSB1c2VybmFtZSBoYXMgYmVlbiB1bmJvdW5kLjxVc2VybmFtZVJlbW92ZWQEASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAUBHBBIHVzZXJuYW1lIGhhcyBiZWVuIHJlbW92ZWQuOFVzZXJuYW1lS2lsbGVkBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AFQRsQSB1c2VybmFtZSBoYXMgYmVlbiBraWxsZWQuQFVzZXJuYW1lUmVwb3J0ZWQIASByZXBvcnRlcgQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABYEdEEgdXNlcm5hbWUgaGFzIGJlZW4gcmVwb3J0ZWQuTFBlcnNvbmFsSWRlbnRpdHlTZXQMARRhbGlhcwgBFEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lOQQBLFVzZXJuYW1lPFQ+ABcEmEFuIGlkZW50aXR5IGZvciBhIHBlcnNvbiBoYXMgYmVlbiBzZXQuREV2aWRlbmNlU3VibWl0dGVkBAEUYWxpYXMIARRBbGlhcwAYBORFdmlkZW5jZSBmb3IgYSBjcmVkZW50aWFsIGhhcyBiZWVkIHN1Ym1pdHRlZCBieSBhIHBlcnNvbi5IQ3JlZGVudGlhbEFjY2VwdGVkBAEUYWxpYXMIARRBbGlhcwAZBJxBIGNyZWRlbnRpYWwgd2FzIGFjY2VwdGVkIGZvciBhIHBlcnNvbi5IQ3JlZGVudGlhbFJlamVjdGVkBAEUYWxpYXMIARRBbGlhcwAaBJxBIGNyZWRlbnRpYWwgd2FzIHJlamVjdGVkIGZvciBhIHBlcnNvbi4wUGVyc29uQmFubmVkBAEUYWxpYXMIARRBbGlhcwAbBNBQZXJzb24gd2FzIGJhbm5lZCBmb3Igc2VuZGluZyBjb250ZW1wdHVvdXMgZXZpZGVuY2UuXFBlcnNvbmFsSWRlbnRpdHlDbGVhcmVkBAEUYWxpYXMIARRBbGlhcwAcBIBBIHBlcnNvbmFsIGlkZW50aXR5IHdhcyBjbGVhcmVkLmxSZXBvcnRlZFVzZXJuYW1lSnVkZ2VkVmFsaWQEASB1c2VybmFtZTkEASxVc2VybmFtZTxUPgAdBJRBIHJlcG9ydGVkIHVzZXJuYW1lIHdhcyBqdWRnZWQgdmFsaWQudFJlcG9ydGVkVXNlcm5hbWVKdWRnZWRJbnZhbGlkBAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AHgScQSByZXBvcnRlZCB1c2VybmFtZSB3YXMganVkZ2VkIGludmFsaWQumFJlcG9ydGVkVXNlcm5hbWVXZWFrT3JVbmNsZWFySnVkZ2VtZW50CAEgdXNlcm5hbWU5BAEsVXNlcm5hbWU8VD4AASRqdWRnZW1lbnRBBAE8T3JhY2xlSnVkZ2VtZW50AB8EEQFUaGUganVkZ21lbnQgcmVnYXJkaW5nIGEgcmVwb3J0ZWQgdXNlcm5hbWUgd2FzIHVuY2xlYXIgb3IgdW5jZXJ0YWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldKkGDExpbmRpdl9wYWxsZXRfcGVvcGxlGHBhbGxldBRFdmVudAQEVAABJFBQZXJzb25ob29kUmVjb2duaXplZAgBDHdobygBKFBlcnNvbmFsSWQAAQxrZXlRBAEsTWVtYmVyT2Y8VD4AAAT4QW4gaW5kaXZpZHVhbCBoYXMgaGFkIHRoZWlyIHBlcnNvbmhvb2QgcmVjb2duaXNlZCBhbmQgaW5kZXhlZC5AUGVyc29uT25ib2FyZGluZwgBDHdobygBKFBlcnNvbmFsSWQAAQxrZXlRBAEsTWVtYmVyT2Y8VD4AAQQRAUFuIGluZGl2aWR1YWwgaGFzIGhhZCB0aGVpciBwZXJzb25ob29kIHJlY29nbmlzZWQgYWdhaW4gYW5kIGluZGV4ZWQuPEFsaWFzRGlzcGF0Y2hlZAgBFGFsaWFzSQMBPENvbnRleHR1YWxBbGlhcwABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAgSUQSBjYWxsIHdhcyBkaXNwYXRjaGVkIHVuZGVyIGFuIGFsaWFzLjxBbGlhc0FjY291bnRTZXQIARRhbGlhc0kDATxDb250ZXh0dWFsQWxpYXMAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEvEFuIGFsaWFzLXRvLWFjY291bnQgbWFwcGluZyB3YXMgc2V0IG9yIHVwZGF0ZWQuREFsaWFzQWNjb3VudFVuc2V0CAEUYWxpYXNJAwE8Q29udGV4dHVhbEFsaWFzAAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBKBBbiBhbGlhcy10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuUFBlcnNvbmFsSWRBY2NvdW50U2V0CAEMd2hvKAEoUGVyc29uYWxJZAABHGFjY291bnQEATBUOjpBY2NvdW50SWQABQTQQSBwZXJzb25hbCBJRC10by1hY2NvdW50IG1hcHBpbmcgd2FzIHNldCBvciB1cGRhdGVkLlhQZXJzb25hbElkQWNjb3VudFVuc2V0CAEMd2hvKAEoUGVyc29uYWxJZAABHGFjY291bnQEATBUOjpBY2NvdW50SWQABgS0QSBwZXJzb25hbCBJRC10by1hY2NvdW50IG1hcHBpbmcgd2FzIHJlbW92ZWQuRENvbGxlY3Rpb25DcmVhdGVkAAcEiFRoZSBwZW9wbGUgY29sbGVjdGlvbiB3YXMgY3JlYXRlZC5kRm9yY2VQZXJzb25ob29kUmVjb2duaXplZAQBGHBlb3BsZU0EAUBWZWM8TWVtYmVyT2Y8VD4+AAgEtFBlcnNvbmhvb2Qgd2FzIGZvcmNlZnVsbHkgcmVjb2duaXplZCBieSByb290LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldK0GDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0FEV2ZW50BARUAAFELENhc2VDcmVhdGVkBAEoY2FzZV9pbmRleDgBJENhc2VJbmRleASAVGhlIGNhc2UgaW5kZXggdGhhdCB3YXMgY3JlYXRlZC4ABGBBIGNhc2UgaGFzIGJlZW4gY3JlYXRlZC4gQ2FsbGJhY2sEARhyZXN1bHSRBgE4RGlzcGF0Y2hSZXN1bHQEbFRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrLgEEnEEgY2FsbGJhY2sgd2FzIHRyaWdnZXJlZCBmcm9tIG1vYi1ydWxlLjRDYWxsYmFja0Vycm9yAAIE8FRoZXJlIHdhcyBhIGNvZGVjIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLihDYXNlQ2xvc2VkCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleAR8VGhlIGNhc2UgaW5kZXggdGhhdCB3YXMgY2xvc2VkLgEcdmVyZGljdEEEASRKdWRnZW1lbnQEfFRoZSB2ZXJkaWN0IG9mIHRoZSBjbG9zZWQgY2FzZS4DBMxUaGUgY2FzZSBoYXMgYmVlbiBjbG9zZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlc3VsdC4UVm90ZWQMAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4BEhUaGUgY2FzZSB2b3RlZCBvbi4BFHZvdGVyCAEUQWxpYXMEVFRoZSBhbGlhcyB0aGF0IHZvdGVkLgEcb3BpbmlvbkEEASRKdWRnZW1lbnQEZFRoZSBvcGluaW9uIG9mIHRoZSB2b3Rlci4EBIRBIHZvdGUgaGFzIGJlZW4gcGxhY2VkIG9uIGEgY2FzZS4sVm90ZUNsZWFuZWQIAShjYXNlX2luZGV4OAEkQ2FzZUluZGV4BEhUaGUgY2FzZSB2b3RlZCBvbi4BFHZvdGVyCAEUQWxpYXMEVFRoZSBhbGlhcyB0aGF0IHZvdGVkLgUEYEEgdm90ZSBoYXMgYmVlbiBjbGVhbmVkLixDYXNlUmVtb3ZlZAQBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgESFRoZSBjYXNlIHZvdGVkIG9uLgYEYEEgY2FzZSBoYXMgYmVlbiByZW1vdmVkLjhDYXNlSW50ZXJ2ZW5lZAgBKGNhc2VfaW5kZXg4ASRDYXNlSW5kZXgEiFRoZSBjYXNlIHRoYXQgaGFzIGJlZW4gaW50ZXJ2ZW5lZC4BHHZlcmRpY3RBBAEkSnVkZ2VtZW50BIBUaGUgdmVyZGljdCBhcHBsaWVkIHRvIHRoZSBjYXNlLgcEbEEgY2FzZSBoYXMgYmVlbiBpbnRlcnZlbmVkLjBWb3Rlc0NsYWltZWQIARR2b3RlcggBFEFsaWFzBFRUaGUgYWxpYXMgdGhhdCB2b3RlZC4BMGNhc2VfaW5kaWNlc1kEAThWZWM8Q2FzZUluZGV4PgSIVGhlIGNhc2UgdGhhdCBoYXMgYmVlbiBpbnRlcnZlbmVkLggEkENyZWRpdHMgZm9yIHZvdGVzIGhhdmUgYmVlbiBjbGFpbWVkLjBSZXdhcmRQYXlvdXQMARR2b3RlcggBFEFsaWFzBHxUaGUgYWxpYXMgdGhhdCBlYXJuZWQgYSByZXdhcmQuASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAScVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBwYXlvdXQuARhhbW91bnTEATBCYWxhbmNlT2Y8VD4EnFRoZSBwYXlvdXQgYW1vdW50IHRoYXQgd2FzIHRyYW5zZmVycmVkLgkEgEEgcmV3YXJkIHRoYXQgaGFzIGJlZW4gcGFpZCBvdXQuSFBheW91dFJvdW5kU3RhcnRlZAwBFHJvdW5kOAEoUm91bmRJbmRleASIVGhlIGluZGV4IG9mIHRoZSBuZXcgcGF5b3V0IHJvdW5kLgE8aW5pdGlhbF9iYWxhbmNlxAEwQmFsYW5jZU9mPFQ+BLBUaGUgaW5pdGlhbCBiYWxhbmNlIGFsbG9jYXRlZCBmb3IgdGhlIHJvdW5kLgEwdG90YWxfcG9pbnRzKAEkVm90ZUNvdW50BMRUb3RhbCBhY2N1bXVsYXRlZCBwb2ludHMgY2xhaW1hYmxlIGluIHRoaXMgcm91bmQuCgSQQSBuZXcgcGF5b3V0IHJvdW5kIGhhcyBiZWVuIHN0YXJ0ZWQuVFBheW91dFJvdW5kc1NjaGVkdWxlZAwBGGFtb3VudMQBMEJhbGFuY2VPZjxUPgR4VGhlIGFtb3VudCBvZiBmdW5kcyBwZXIgcm91bmQuARRjb3VudDgBDHUzMgR8VGhlIG51bWJlciBvZiByb3VuZHMgc2NoZWR1bGVkLgEYcGVyaW9kOAFEQmxvY2tOdW1iZXJGb3I8VD4EuFRoZSBtaW5pbXVtIHBlcmlvZCAoaW4gYmxvY2tzKSBiZXR3ZWVuIHJvdW5kcy4LBIhQYXlvdXQgcm91bmRzIGhhdmUgYmVlbiBzY2hlZHVsZWQuVFBheW91dFNjaGVkdWxlUmVtb3ZlZAQBFGluZGV4OAEMdTMyBIhUaGUgaW5kZXggb2YgdGhlIHJlbW92ZWQgc2NoZWR1bGUuDASMQSBwYXlvdXQgc2NoZWR1bGUgaGFzIGJlZW4gcmVtb3ZlZC40Q3JlZGl0Q2xhaW1lZAgBFHZvdGVyCAEUQWxpYXMEjFRoZSBhbGlhcyBvZiB0aGUgdm90ZXIgd2hvIGNsYWltZWQuARhhbW91bnTEATBCYWxhbmNlT2Y8VD4EdFRoZSBhbW91bnQgb2YgY3JlZGl0IGNsYWltZWQuDQTUQ3JlZGl0IGhhcyBiZWVuIGNsYWltZWQgZnJvbSB0aGUgcGF5b3V0IGRpc3RyaWJ1dGlvbi40UG9pbnRzQ2xlYW5lZAgBFHJvdW5kOAEoUm91bmRJbmRleAS8VGhlIHJvdW5kIGluZGV4IGZyb20gd2hpY2ggcG9pbnRzIHdlcmUgcmVtb3ZlZC4BFHZvdGVyCAEUQWxpYXMEkFRoZSBhbGlhcyB3aG9zZSBwb2ludHMgd2VyZSByZW1vdmVkLg4EmFN0YWxlIHZvdGluZyBwb2ludHMgaGF2ZSBiZWVuIGNsZWFuZWQuLENhc2VUb3VjaGVkCAEoY2FzZV9pbmRleDgBJENhc2VJbmRleARoVGhlIGNhc2UgdGhhdCB3YXMgdG91Y2hlZC4BHHJpcGVuZWTIARBib29sBKRXaGV0aGVyIHRoZSBjYXNlIHdhcyByaXBlbmVkIGFzIGEgcmVzdWx0Lg8EnEEgY2FzZSBoYXMgYmVlbiB0b3VjaGVkIChyZS1ldmFsdWF0ZWQpLlBWb3RpbmdQZW5hbHR5Q2xlYXJlZAQBDHdobwgBFEFsaWFzBJBUaGUgYWxpYXMgd2hvc2UgcGVuYWx0eSB3YXMgY2xlYXJlZC4QBIhBIHZvdGluZyBwZW5hbHR5IGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0sQYMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0FEV2ZW50BARUAAFcQENhbmRpZGF0ZUFwcGxpZWQEAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAAEjENhbmRpZGF0ZSBhcHBsaWVkIGZvciB2ZXJpZmljYXRpb24uSEp1ZGdlbWVudFJlcXVlc3RlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAAQQFAUNhbmRpZGF0ZSBvcGVuZWQgYSBqdWRpY2lhbCBjYXNlIGZvciB0aGVpciB2ZXJpZmljYXRpb24gZXZpZGVuY2UuREp1ZGdlbWVudFByb3ZpZGVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABJGp1ZGdlbWVudEEEASRKdWRnZW1lbnQAAgTYT3JhY2xlIGhhcyBwcm92aWRlZCB0aGUganVkZ2VtZW50IGZvciBhIGp1ZGljaWFsIGNhc2UuMFJldHJ5R3JhbnRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAASBmYWlsdXJlczgBDHUzMgADCEUBQSBjYW5kaWRhdGUgaGFzIGJlZW4gZ3JhbnRlZCBhIGZyZWUgcmV0cnkgYXR0ZW1wdCBhZnRlciBhIGZhaWx1cmUgdG8gdmVyaWZ5IHRoZWlyJGV2aWRlbmNlLkBQZXJzb25SZWdpc3RlcmVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABLHBlcnNvbmFsX2lkKAEoUGVyc29uYWxJZAAEBIBSZWdpc3RlciBhbiBhY2NvdW50IGFzIGEgcGVyc29uLkRDYW5kaWRhdGVSZWZlcnJlZAgBIHJlZmVycmVyKAEoUGVyc29uYWxJZAABIHJlZmVycmVkBAEwVDo6QWNjb3VudElkAAUEbFBlcnNvbiByZWZlcnJlZCBhbiBhY2NvdW50LiBSZXJvbGxlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQABgS0RW50cm9weSBmb3IgYSBjYW5kaWRhdGUgY2hhbmdlZCBhZnRlciBleHBpcnkuPERlc2lnbkNvbW1pdHRlZAgBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQAASxyZXNlcnZlZF9pZCgBKFBlcnNvbmFsSWQABwSUQ2FuZGlkYXRlIGNvbW1pdHRlZCB0byBhbiBpbmsgZGVzaWduLjhGdWxseUFsbG9jYXRlZAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQACAS8U3RvcmFnZSBmdWxseSBhbGxvY2F0ZWQgZm9yIGEgY29tbWl0dGVkIGRlc2lnbi4gVGltZWRPdXQEAShhY2NvdW50X2lkBAEwVDo6QWNjb3VudElkAAkEgENhbmRpZGF0ZSByZW1vdmVkIGFmdGVyIHRpbWVvdXQuJEZsYWtlZE91dAQBKGFjY291bnRfaWQEATBUOjpBY2NvdW50SWQACgR4VW5jb21taXR0ZWQgY2FuZGlkYXRlIHJlbW92ZWQuOFRpY2tldFJlZmVycmVkCAEgcmVmZXJyZXIoAShQZXJzb25hbElkAAEYdGlja2V0BAEkVDo6VGlja2V0AAsE7FJlZmVycmFsIHRpY2tldCBjcmVhdGVkIGJ5IHN0b3JpbmcgdGhlIHB1YmxpYyBrZXkgb24gY2hhaW4uPFRpY2tldENhbmNlbGxlZAgBIHJlZmVycmVyKAEoUGVyc29uYWxJZAABGHRpY2tldAQBJFQ6OlRpY2tldAAMBBkBUmVmZXJyYWwgdGlja2V0IHJlbW92ZWQgYnkgcmVtb3ZpbmcgdGhlIHB1YmxpYyBrZXkgZnJvbSBjaGFpbiBzdG9yYWdlLjRUaWNrZXRBcHBsaWVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABIHJlZmVycmVyKAEoUGVyc29uYWxJZAANBKhDYW5kaWRhdGUgYXBwbGllZCB1c2luZyBhIHJlZmVycmFsIHRpY2tldC4sRmFtaWx5QWRkZWQMARRpbmRleC0DASxGYW1pbHlJbmRleAABEGtpbmRpBAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQADgRQRGVzaWduIGZhbWlseSBhZGRlZC5EQWxsSW52aXRlc1JlbW92ZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAA8EuEFsbCBpbnZpdGVzIGhhdmUgYmVlbiByZW1vdmVkIGZvciB0aGUgaW52aXRlci5IU29tZUludml0ZXNSZW1vdmVkBAEcaW52aXRlcgQBMFQ6OkFjY291bnRJZAAQBA0BU29tZSBpbnZpdGVzIGhhdmUgYmVlbiByZW1vdmVkIGZvciB0aGUgaW52aXRlciwgc29tZSBhcmUgcmVtYWluaW5nLlxJbnZpdGVkQ2FuZGlkYXRlQXBwbGllZAgBDHdobwQBMFQ6OkFjY291bnRJZAABHGludml0ZXIEATBUOjpBY2NvdW50SWQAEQSYQ2FuZGlkYXRlIGFwcGxpZWQgdXNpbmcgYW4gaW52aXRhdGlvbi5kUmVmZXJyYWxWb3VjaGVyUmVnaXN0ZXJlZAQBIHJlZmVycmVyKAEoUGVyc29uYWxJZAASBMBBIHJlZmVycmVyJ3MgcmV3YXJkIHZvdWNoZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZC44SW52aXRlc0dyYW50ZWQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEUY291bnQ4AQx1MzIAEwSgSW52aXRlcyBoYXZlIGJlZW4gZ3JhbnRlZCB0byBhbiBhY2NvdW50LjxJbnZpdGVUaWNrZXRTZXQIARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEkVDo6VGlja2V0ABQEeEFuIGludml0ZSB0aWNrZXQgaGFzIGJlZW4gc2V0LlRJbnZpdGVUaWNrZXRDYW5jZWxsZWQIARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAEYdGlja2V0BAEkVDo6VGlja2V0ABUEkEFuIGludml0ZSB0aWNrZXQgaGFzIGJlZW4gY2FuY2VsbGVkLkBDb25maWd1cmF0aW9uU2V0BAEYY29uZmlnbQQBfENvbmZpZ1JlY29yZDxCbG9ja051bWJlckZvcjxUPj4AFgSoVGhlIHBhbGxldCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0tQYMRGluZGl2X3BhbGxldF9nYW1lGHBhbGxldBRFdmVudAQEVAABOBxOZXdHYW1lDAFEcmVnaXN0cmF0aW9uX2VuZHM4AQx1MzIAASRnYW1lX2RhdGU4AQx1MzIAASxyZXBvcnRfZW5kczgBDHUzMgAABFxBIG5ldyBnYW1lIGlzIHN0YXJ0aW5nLiRHYW1lRW5kZWQEARRpbmRleDgBDHUzMgABBKBUaGUgZ2FtZSBhbmQgaXRzIHBvc3QtcHJvY2VzcyBoYXMgZW5kZWQuIFNpZ25lZFVwBAEMd2hvuQYBdEFjY291bnRPclBlcnNvbjxUOjpBY2NvdW50SWQ+AAIEgEEgcGxheWVyIHNpZ25lZCB1cCBmb3IgdGhlIGdhbWUuPFJlcG9ydFN1Ym1pdHRlZAgBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgABKGdhbWVfaW5kZXg4AQx1MzIAAwSAQSBwbGF5ZXIgc3VibWl0dGVkIHRoZWlyIHJlcG9ydC4oT2ZmYm9hcmRlZAQBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgAEBIhBIHBsYXllciBvZmZib2FyZGVkIGZyb20gdGhlIGdhbWUuJEtpY2tlZE91dAQBGHBsYXllcrkGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgAFBIhBbiBhcmNoaXZlZCBwbGF5ZXIgd2FzIGtpY2tlZCBvdXQuOEludml0ZXNHcmFudGVkCAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAABFGNvdW50OAEMdTMyAAYEjEludml0ZXMgd2VyZSBncmFudGVkIHRvIGFuIGFjY291bnQuPEludml0ZVRpY2tldFNldAQBHGludml0ZXIEATBUOjpBY2NvdW50SWQABwRkQW4gaW52aXRlIHRpY2tldCB3YXMgc2V0LlRJbnZpdGVUaWNrZXRDYW5jZWxsZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAAgEfEFuIGludml0ZSB0aWNrZXQgd2FzIGNhbmNlbGxlZC44R2FtZXNTY2hlZHVsZWQEARRjb3VudDgBDHUzMgAJBFRHYW1lcyB3ZXJlIHNjaGVkdWxlZC5QU2NoZWR1bGVkR2FtZVJlbW92ZWQEAThnYW1lX3BsYXlfdGltZTgBDHUzMgAKBHRBIHNjaGVkdWxlZCBnYW1lIHdhcyByZW1vdmVkLkBTdG10VXNhZ2VSZW1vdmVkBAEMd2hvCAEgW3U4OyAzMl0ACwS4U3RhdGVtZW50IHN0b3JlIHVzYWdlIHJlbW92ZWQgZm9yIHRoZSBhY2NvdW50LkRBbGxJbnZpdGVzUmVtb3ZlZAQBHGludml0ZXIEATBUOjpBY2NvdW50SWQADAS4QWxsIGludml0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZm9yIHRoZSBpbnZpdGVyLkhTb21lSW52aXRlc1JlbW92ZWQEARxpbnZpdGVyBAEwVDo6QWNjb3VudElkAA0EDQFTb21lIGludml0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZm9yIHRoZSBpbnZpdGVyLCBzb21lIGFyZSByZW1haW5pbmcuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0uQYMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlczxBY2NvdW50T3JQZXJzb24EJEFjY291bnRJZAEEAQgcQWNjb3VudAQABAEkQWNjb3VudElkAAAAGFBlcnNvbgQACAEUQWxpYXMAAQAAvQYMSGluZGl2X3BhbGxldF9zY29yZRhwYWxsZXQURXZlbnQEBFQAARw0Q3JlZGl0Q2xhaW1lZAwBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgR4VGhlIHBlcnNvbiB3aG8gY2xhaW1lZCBjcmVkaXQuASxkZXN0aW5hdGlvbgQBMFQ6OkFjY291bnRJZAS8RGVzdGluYXRpb24gYWNjb3VudCB0aGF0IHJlY2VpdmVkIHRoZSB0cmFuc2Zlci4BGGFtb3VudMQBMEJhbGFuY2VPZjxUPgRMQW1vdW50IHRyYW5zZmVycmVkLgAEcEEgcGVyc29uIGhhcyBjbGFpbWVkIGNyZWRpdC5QUGVyc29uaG9vZFJlY29nbml6ZWQIAQx3aG+5BgF0QWNjb3VudE9yUGVyc29uPFQ6OkFjY291bnRJZD4EsFRoZSBhY2NvdW50IHdob3NlIHBlcnNvbmhvb2Qgd2FzIHJlY29nbml6ZWQuARxyZXN1bWVkyAEQYm9vbAQRAVdoZXRoZXIgdGhpcyB3YXMgcmVzdW1pbmcgZnJvbSBzdXNwZW5zaW9uIG9yIGZpcnN0LXRpbWUgcmVjb2duaXRpb24uAQSkUGVyc29uaG9vZCB3YXMgcmVjb2duaXplZCBmb3IgYW4gYWNjb3VudC5UUGF5b3V0Um91bmRzU2NoZWR1bGVkDAEYYW1vdW50xAEwQmFsYW5jZU9mPFQ+BFRUaGUgYW1vdW50IHBlciByb3VuZC4BFGNvdW50OAEMdTMyBFRUaGUgbnVtYmVyIG9mIHJvdW5kcy4BIGR1cmF0aW9uOAFEQmxvY2tOdW1iZXJGb3I8VD4EhFRoZSBkdXJhdGlvbiBwZXIgcm91bmQgaW4gYmxvY2tzLgIEiFBheW91dCByb3VuZHMgaGF2ZSBiZWVuIHNjaGVkdWxlZC5UUGF5b3V0U2NoZWR1bGVSZW1vdmVkBAEUaW5kZXg4AQx1MzIEiFRoZSBpbmRleCBvZiB0aGUgcmVtb3ZlZCBzY2hlZHVsZS4DBIxBIHBheW91dCBzY2hlZHVsZSBoYXMgYmVlbiByZW1vdmVkLkRSb3VuZFRyYW5zaXRpb25lZAQBLHJvdW5kX2luZGV4OAEoUm91bmRJbmRleASYVGhlIHJvdW5kIGluZGV4IHRoYXQgd2FzIHRyYW5zaXRpb25lZC4EBHhBIHJvdW5kIGhhcyBiZWVuIHRyYW5zaXRpb25lZC5MUGF5b3V0Um91bmRPcGVyYXRlZAQBLHJvdW5kX2luZGV4OAEoUm91bmRJbmRleASIVGhlIHJvdW5kIGluZGV4IHRoYXQgd2FzIG9wZXJhdGVkLgUEGQFBIHBheW91dCByb3VuZCBoYXMgYmVlbiBvcGVyYXRlZCAoY3JlZGl0IGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cykuJENhc2hlZE91dAQBDHdob7kGAXRBY2NvdW50T3JQZXJzb248VDo6QWNjb3VudElkPgR8VGhlIHBhcnRpY2lwYW50IHdobyBjYXNoZWQgb3V0LgYEuEEgcGFydGljaXBhbnQgaGFzIGNhc2hlZCBvdXQgc2NvcmUgZm9yIHBvaW50cy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTBBgxYaW5kaXZfcGFsbGV0X2R1bW15X2RpbRhwYWxsZXQURXZlbnQEBFQAASAsSWRzUmVzZXJ2ZWQEARRjb3VudDgBDHUzMgAABHRBIG51bWJlciBvZiBJRHMgd2FzIHJlc2VydmVkLiRJZFJlbmV3ZWQEAQhpZCgBKFBlcnNvbmFsSWQAAQRIQW4gSUQgd2FzIHJlbmV3ZWQuMElkVW5yZXNlcnZlZAQBCGlkKAEoUGVyc29uYWxJZAACBGhBIHJlc2VydmVkIElEIHdhcyByZW1vdmVkLkBQZW9wbGVSZWdpc3RlcmVkBAEUY291bnQ4AQx1MzIAAwRkUmVnaXN0ZXIgbXVsdGlwbGUgcGVvcGxlLjxQZW9wbGVTdXNwZW5kZWQEARRjb3VudDgBDHUzMgAEBGxTdXNwZW5kIGEgbnVtYmVyIG9mIHBlb3BsZS5EUGVyc29uaG9vZFJlc3VtZWQEAQhpZCgBKFBlcnNvbmFsSWQABQSEU29tZW9uZSdzIHBlcnNvbmhvb2Qgd2FzIHJlc3VtZWQuSFN1c3BlbnNpb25zU3RhcnRlZAAGBHxUaGUgcGFsbGV0IGVuYWJsZWQgc3VzcGVuc2lvbnMuQFN1c3BlbnNpb25zRW5kZWQABwSAVGhlIHBhbGxldCBkaXNhYmxlZCBzdXNwZW5zaW9ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTFBgxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBRFdmVudAQEVAABEHhBbGxBdHRlc3RhdGlvbkFsbG93YW5jZUNsZWFyZWQEASB2ZXJpZmllcgQBMFQ6OkFjY291bnRJZAAABPBBbGwgYXR0ZXN0YXRpb24gYWxsb3dhbmNlIGhhcyBiZWVuIHJlbW92ZWQgZm9yIHRoZSB2ZXJpZmllci50QXR0ZXN0YXRpb25BbGxvd2FuY2VJbmNyZWFzZWQIARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEUY291bnQ4AQx1MzIAAQQtAUF0dGVzdGF0aW9uIGFsbG93YW5jZSB3YXMgaW5jcmVhc2VkIGZvciBhbiBhY2NvdW50IGJ5IGBjb3VudGAgYXR0ZXN0YXRpb25zLjhQZXJzb25BdHRlc3RlZAgBJGNhbmRpZGF0ZQQBMFQ6OkFjY291bnRJZAABIHZlcmlmaWVyBAEwVDo6QWNjb3VudElkAAIE1EEgbmV3IGxpdGUgcGVyc29uIHdhcyByZWdpc3RlcmVkIHRocm91Z2ggYXR0ZXN0YXRpb24uSENvbnN1bWVyUmVnaXN0ZXJlZAQBHGFjY291bnQEATBUOjpBY2NvdW50SWQAAwSsQSBsaXRlIHBlcnNvbiB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNvbnN1bWVyLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkGDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzGHBhbGxldBRFdmVudAQEVAABIEBQZXJzb25SZWdpc3RlcmVkCAEUYWxpYXMIARRBbGlhcwABHGFjY291bnQEATBUOjpBY2NvdW50SWQAAASYQSBwZXJzb24gaGFzIHJlZ2lzdGVyZWQgYXMgYSBjb25zdW1lci5QTGl0ZVBlcnNvblJlZ2lzdGVyZWQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAEErEEgbGl0ZSBwZXJzb24gaGFzIHJlZ2lzdGVyZWQgYXMgYSBjb25zdW1lci5oUGVyc29uQXV0aG9yaXphdGlvblRvdWNoZWQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAIElEEgcGVyc29uJ3MgYXV0aG9yaXphdGlvbiB3YXMgdG91Y2hlZC6ERXhwaXJlZFVzZXJuYW1lUmVzZXJ2YXRpb25SZW1vdmVkCAEgdXNlcm5hbWU5BAEgVXNlcm5hbWUAARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAMEsEFuIGV4cGlyZWQgdXNlcm5hbWUgcmVzZXJ2YXRpb24gd2FzIHJlbW92ZWQuUElkZW50aWZpZXJLZXlVcGRhdGVkBAEcYWNjb3VudAQBMFQ6OkFjY291bnRJZAAEBKBBIGNvbnN1bWVyJ3MgaWRlbnRpZmllciBrZXkgd2FzIHVwZGF0ZWQueFVzZXJuYW1lUmVzZXJ2YXRpb25EdXJhdGlvblNldAQBIGR1cmF0aW9uKAEMdTY0AAUEqFRoZSB1c2VybmFtZSByZXNlcnZhdGlvbiBkdXJhdGlvbiB3YXMgc2V0LlBTdG10U3RvcmVTbG90VXBkYXRlZAgBHGFjY291bnQEATBUOjpBY2NvdW50SWQAASxzbG90X251bWJlcgwBCHU4AAYEjEEgc3RhdGVtZW50IHN0b3JlIHNsb3Qgd2FzIHVwZGF0ZWQuNFBlcnNvbkRlbW90ZWQEARxhY2NvdW50BAEwVDo6QWNjb3VudElkAAcE3EEgZnVsbCBwZXJzb24gd2FzIGRlbW90ZWQgZHVlIHRvIGV4cGlyZWQgYXV0aG9yaXphdGlvbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTNBgxsaW5kaXZfcGFsbGV0X2NodW5rc19tYW5hZ2VyGHBhbGxldBRFdmVudAQEVAABCGhDaHVua1BhZ2VIYXNoZXNJbml0aWFsaXplZAgBNHJpbmdfZXhwb25lbnTxBAEwUmluZ0V4cG9uZW50AAEsdG90YWxfcGFnZXM4AQx1MzIAAAQZAUEgbmV3IGNodW5rIHBhZ2UgaGFzaCBzZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKGUuZy4sIGR1cmluZyBnZW5lc2lzKS4sQ2h1bmtzQWRkZWQMATRyaW5nX2V4cG9uZW508QQBMFJpbmdFeHBvbmVudAABLHN0YXJ0X2luZGV4OAEMdTMyAAEUY291bnQ4AQx1MzIAAQQhAU5ldyBjaHVua3MgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byBhbiBleGlzdGluZyBvciBuZXcgY2h1bmsgc2V0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNEGDFBpbmRpdl9wYWxsZXRfbWVtYmVycxhwYWxsZXQURXZlbnQEBFQAASAsTWVtYmVyQWRkZWQEAQxrZXlRBAEsTWVtYmVyT2Y8VD4AAAToQW4gZW50aXR5IGhhcyBoYWQgdGhlaXIgbWVtYmVyc2hpcCByZWNvZ25pc2VkIGFuZCBpbmRleGVkLjRNZW1iZXJSZW1vdmVkBAEMa2V5UQQBLE1lbWJlck9mPFQ+AAEErEFuIGVudGl0eSBoYXMgaGFkIHRoZWlyIG1lbWJlcnNoaXAgcmV2b2tlZC5sQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAgSoQSBjb2xsZWN0aW9uIGhhcyBiZWVuIG1hcmtlZCBmb3IgZGVsZXRpb24uRENvbGxlY3Rpb25EZWxldGVkBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAAwSQQSBjb2xsZWN0aW9uIGhhcyBiZWVuIGZ1bGx5IGRlbGV0ZWQuJFJpbmdCdWlsdAgBKGlkZW50aWZpZXIIAShJZGVudGlmaWVyAAEocmluZ19pbmRleDgBJFJpbmdJbmRleAAEBGhBIHJpbmcgd2FzIGJ1aWx0IG1hbnVhbGx5LkBNZW1iZXJzT25ib2FyZGVkBAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIABQSATWVtYmVycyB3ZXJlIG9uYm9hcmRlZCBtYW51YWxseS4sUmluZ3NNZXJnZWQMAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABPGJhc2VfcmluZ19pbmRleDgBJFJpbmdJbmRleAABRHRhcmdldF9yaW5nX2luZGV4OAEkUmluZ0luZGV4AAYEWFR3byByaW5ncyB3ZXJlIG1lcmdlZC5ET25ib2FyZGluZ1NpemVTZXQIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABPG9uYm9hcmRpbmdfc2l6ZTgBDHUzMgAHBLRUaGUgb25ib2FyZGluZyBzaXplIHdhcyBzZXQgZm9yIGEgY29sbGVjdGlvbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTVBgxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0FEV2ZW50BARUAAFYJENvaW5TcGxpdAQBMG91dHB1dF9jb3VudDgBDHUzMgAAADxDb2luVHJhbnNmZXJyZWQMAQh0bwQBMFQ6OkFjY291bnRJZAABFHZhbHVlbQMBJENvaW5WYWx1ZQABHG5ld19hZ2UtAwEMdTE2AAEAWFJlY3ljbGVyTG9hZGVkV2l0aENvaW4EARR2YWx1ZW0DASRDb2luVmFsdWUAAgB8UmVjeWNsZXJMb2FkZWRXaXRoRXh0ZXJuYWxBc3NldAwBDHdobwQBMFQ6OkFjY291bnRJZAABFHZhbHVlbQMBJENvaW5WYWx1ZQABGGFtb3VudMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgADAGBSZWN5Y2xlclVubG9hZGVkSW50b0NvaW4QAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X3ZhbHVlbQMBJENvaW5WYWx1ZQABMG91dHB1dF92YWx1ZW0DASRDb2luVmFsdWUAASxpbnB1dF9jb3VudDgBDHUzMgAEAIRSZWN5Y2xlclVubG9hZGVkSW50b0V4dGVybmFsQXNzZXQQAQh0bwQBMFQ6OkFjY291bnRJZAABFHZhbHVlbQMBJENvaW5WYWx1ZQABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAUAhFBhaWRVbmxvYWRUb2tlblJlZ2lzdGVyZWRXaXRoQ29pbggBDGZlZcQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgABJGRlc3Ryb3llZMQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgAGAIxQYWlkVW5sb2FkVG9rZW5SZWdpc3RlcmVkV2l0aE5hdGl2ZQgBDHdobwQBMFQ6OkFjY291bnRJZAABDGZlZcQBSE5hdGl2ZUJhbGFuY2VPZjxUPgAHAIxQYWlkVW5sb2FkVG9rZW5SZWdpc3RlcmVkV2l0aFN0YWJsZQgBDHdobwQBMFQ6OkFjY291bnRJZAABDGZlZcQBVEZ1bmdpYmxlc0JhbGFuY2VPZjxUPgAIAHRQZW9wbGVGcmVlVW5sb2FkVG9rZW5Db25zdW1lZAQBGHBlcmlvZDgBGFBlcmlvZAAJAIRMaXRlUGVvcGxlRnJlZVVubG9hZFRva2VuQ29uc3VtZWQEARhwZXJpb2Q4ARhQZXJpb2QACgBkUmVjeWNsZXJzVW5sb2FkZWRJbnRvQ29pbgwBCHRvBAEwVDo6QWNjb3VudElkAAEwb3V0cHV0X3ZhbHVlbQMBJENvaW5WYWx1ZQABLGlucHV0X2NvdW50OAEMdTMyAAsAiFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXQMAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAwAuFJlY3ljbGVyc1VubG9hZGVkSW50b0V4dGVybmFsQXNzZXROb25Bbm9ueW1vdXMUAQx3aG8EATBUOjpBY2NvdW50SWQAAQh0bwQBMFQ6OkFjY291bnRJZAABLGlucHV0X2NvdW50OAEMdTMyAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AAEwZmVlX2N1cnJlbmN5FQUBLEZlZUN1cnJlbmN5AA0AZFJlY3ljbGVyVW5sb2FkZWRJbnRvQ29pbnMEATBvdXRwdXRfY291bnQ4AQx1MzIADgB8Q29pbk9mZmJvYXJkZWRJbnRvRXh0ZXJuYWxBc3NldAwBCHRvBAEwVDo6QWNjb3VudElkAAEUdmFsdWVtAwEkQ29pblZhbHVlAAEYYW1vdW50xAFURnVuZ2libGVzQmFsYW5jZU9mPFQ+AA8APFJlY3ljbGVyQ2xlYW5lZAwBFHZhbHVlbQMBJENvaW5WYWx1ZQABPHJlbWFpbmluZ19jb2luczgBDHUzMgABQGRlc3Ryb3llZF9hbW91bnTEAVRGdW5naWJsZXNCYWxhbmNlT2Y8VD4AEABkQ29uc3VtZWRGcmVlVG9rZW5zQ2xlYW5lZAQBGHBlcmlvZDgBGFBlcmlvZAARAGhQYWlkVW5sb2FkVG9rZW5SaW5nQ2xlYW5lZAgBGHBlcmlvZDgBGFBlcmlvZAABKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAEgBMUmVjeWNsZXJEdXN0Q2xlYW5lZAATAGhQYWlkVW5sb2FkVG9rZW5EdXN0Q2xlYW5lZAAUAJxFeHBpcmVkUGFpZFVubG9hZFRva2VuQ29sbGVjdGlvbkRlbGV0ZWQEARhwZXJpb2Q4ARhQZXJpb2QAFQAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTZBgyMaW5kaXZfcGFsbGV0X3N0b3JhZ2VfaW5pdGlhbGl6YXRpb24YcGFsbGV0FEV2ZW50BARUAAFAMEFzc2V0Q3JlYXRlZAAABNBUaGUgZm9yZWlnbiBhc3NldCB3YXMgY3JlYXRlZCBhbmQgcmVzZXJ2ZXMgd2VyZSBzZXQuUFhjbUZ1bmRzVHJhbnNmZXJTZW50AAEEsEFuIFhDTSBmdW5kcyB0cmFuc2ZlciB3YXMgc2VudCB0byBBc3NldCBIdWIuYFhjbUZ1bmRzVHJhbnNmZXJUaW1lZE91dAACBLxUaGUgWENNIHRyYW5zZmVyIHRpbWVkIG91dCBhbmQgd2lsbCBiZSByZXRyaWVkLjRGdW5kc1ZlcmlmaWVkAAMElFRyYW5zZmVycmVkIGZ1bmRzIGhhdmUgYmVlbiB2ZXJpZmllZC4oUG90c0Z1bmRlZAAEBGhBbGwgcG90cyBoYXZlIGJlZW4gZnVuZGVkLlxNb2JSdWxlUGF5b3V0c1NjaGVkdWxlZAAFBJhNb2IgUnVsZSBwYXlvdXQgc2NoZWR1bGUgaGFzIGJlZW4gc2V0LlRTY29yZVBheW91dHNTY2hlZHVsZWQABgSMU2NvcmUgcGF5b3V0IHNjaGVkdWxlIGhhcyBiZWVuIHNldC50T25Qb2xsSW5pdGlhbGl6YXRpb25Db21wbGV0ZWQABwSkVGhlIG9uX3BvbGwgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5kTWlncmF0aW9uUGVvcGxlUmVjb2duaXplZAAIBLxNaWdyYXRpb246IGluaXRpYWwgcGVvcGxlIGhhdmUgYmVlbiByZWNvZ25pemVkLmhNaWdyYXRpb25PbmJvYXJkaW5nU2l6ZVNldAAJBKBNaWdyYXRpb246IG9uYm9hcmRpbmcgc2l6ZSBoYXMgYmVlbiBzZXQueE1pZ3JhdGlvblByb29mT2ZJbmtJbml0aWFsaXplZAAKBNBNaWdyYXRpb246IFByb29mLW9mLUluayBwYWxsZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXE1pZ3JhdGlvbkdhbWVzU2NoZWR1bGVkAAsElE1pZ3JhdGlvbjogZ2FtZXMgaGF2ZSBiZWVuIHNjaGVkdWxlZC5cTWlncmF0aW9uSW52aXRlc0dyYW50ZWQADASUTWlncmF0aW9uOiBpbnZpdGVzIGhhdmUgYmVlbiBncmFudGVkLnxNaWdyYXRpb25SZWltYnVyc2VtZW50VmFsdWVzU2V0AA0E7E1pZ3JhdGlvbjogUHJvb2Ytb2YtSW5rIHJlaW1idXJzZW1lbnQgdmFsdWVzIGhhdmUgYmVlbiBzZXQuhE1pZ3JhdGlvbkF0dGVzdGF0aW9uQWxsb3dhbmNlc1NldAAOBPBNaWdyYXRpb246IFBlb3BsZSBMaXRlIGF0dGVzdGF0aW9uIGFsbG93YW5jZXMgaGF2ZSBiZWVuIHNldC5ITWlncmF0aW9uQ29tcGxldGVkAA8EGQFNaWdyYXRpb24gaGFzIGNvbXBsZXRlZCBhbmQgb25fcG9sbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV03QYMoGluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGUYcGFsbGV0FEV2ZW50BARUAAEEXEluaXRpYWxpemF0aW9uQ29tcGxldGVkAAAEEQFBdHRlc3RhdGlvbiBhbGxvd2FuY2VzIGhhdmUgYmVlbiBzZXQgYW5kIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldOEGDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQURXZlbnQEBFQAATRUUGFydGljaXBhbnRSZWdpc3RlcmVkDAEgZXZlbnRfaWQ4ARxFdmVudElkAAE4cGFydGljaXBhbnRfaWQ4ATRQYXJ0aWNpcGFudElkAAEUYWxpYXMIARRBbGlhcwAABJhBIHBhcnRpY2lwYW50IHJlZ2lzdGVyZWQgZm9yIGFuIGV2ZW50LjBFdmVudFN0YXJ0ZWQIAQhpZDgBHEV2ZW50SWQAARRldmVudCEFAURBaXJkcm9wUHJpemVPZjxUPgABBFRUaGUgZXZlbnQgaXMgc3RhcnRlZC4wRXZlbnRTa2lwcGVkCAEIaWQ4ARxFdmVudElkAAEUZXZlbnQhBQFEQWlyZHJvcFByaXplT2Y8VD4AAgR8VGhlIHNjaGVkdWxlZCBldmVudCBpcyBza2lwcGVkLjhFdmVudFNjaGVkdWxlZAQBIGV2ZW50X2lkOAEcRXZlbnRJZAADBFxBbiBldmVudCB3YXMgc2NoZWR1bGVkLlRTY2hlZHVsZWRFdmVudFJlbW92ZWQEASBldmVudF9pZDgBHEV2ZW50SWQABAR4QSBzY2hlZHVsZWQgZXZlbnQgd2FzIHJlbW92ZWQuaEZhaWxlZFRyYW5zZmVyUHJpemVDbGFpbWVkCAEMd2hvBAEwVDo6QWNjb3VudElkAAEgZXZlbnRfaWQ4ARxFdmVudElkAAUEkEEgZmFpbGVkIHRyYW5zZmVyIHByaXplIHdhcyBjbGFpbWVkLmBXYWl0aW5nRm9yRW50cm9weVRvQnVpbGQEASBldmVudF9pZDgBHEV2ZW50SWQABgTcVGhlIGV2ZW50IHRyYW5zaXRpb25lZCB0byB3YWl0aW5nIGZvciBlbnRyb3B5IHRvIGJ1aWxkLjhEcmF3aW5nV2lubmVycwQBIGV2ZW50X2lkOAEcRXZlbnRJZAAHBKhUaGUgZXZlbnQgdHJhbnNpdGlvbmVkIHRvIGRyYXdpbmcgd2lubmVycy4wRGlzdHJpYnV0aW5nBAEgZXZlbnRfaWQ4ARxFdmVudElkAAgEuFRoZSBldmVudCB0cmFuc2l0aW9uZWQgdG8gZGlzdHJpYnV0aW5nIHByaXplcy5AUHJpemVEaXN0cmlidXRlZBABIGV2ZW50X2lkOAEcRXZlbnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABMEFzc2V0SWRPZjxUPgABMGFzc2V0X2Ftb3VudMQBREFzc2V0QmFsYW5jZU9mPFQ+AAkEkEEgcHJpemUgd2FzIGRpc3RyaWJ1dGVkIHRvIGEgd2lubmVyLlxQcml6ZURpc3RyaWJ1dGlvbkZhaWxlZBABIGV2ZW50X2lkOAEcRXZlbnRJZAABEGRlc3QEATBUOjpBY2NvdW50SWQAASBhc3NldF9pZOABMEFzc2V0SWRPZjxUPgABMGFzc2V0X2Ftb3VudMQBREFzc2V0QmFsYW5jZU9mPFQ+AAoEsEEgcHJpemUgdHJhbnNmZXIgZmFpbGVkIGR1cmluZyBkaXN0cmlidXRpb24uPENsZWFyaW5nU3RvcmFnZQQBIGV2ZW50X2lkOAEcRXZlbnRJZAALBKxUaGUgZXZlbnQgdHJhbnNpdGlvbmVkIHRvIGNsZWFyaW5nIHN0b3JhZ2UuOEV2ZW50Q29tcGxldGVkBAEgZXZlbnRfaWQ4ARxFdmVudElkAAwEpFRoZSBldmVudCBoYXMgY29tcGxldGVkIGFuZCBiZWVuIHJlbW92ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV05QYMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBRFdmVudAQEVAABIDhVcGdyYWRlU3RhcnRlZAQBKG1pZ3JhdGlvbnM4AQx1MzIQ0FRoZSBudW1iZXIgb2YgbWlncmF0aW9ucyB0aGF0IHRoaXMgdXBncmFkZSBjb250YWlucy4AQQFUaGlzIGNhbiBiZSB1c2VkIHRvIGRlc2lnbiBhIHByb2dyZXNzIGluZGljYXRvciBpbiBjb21iaW5hdGlvbiB3aXRoIGNvdW50aW5nIHRoZcxgTWlncmF0aW9uQ29tcGxldGVkYCBhbmQgYE1pZ3JhdGlvblNraXBwZWRgIGV2ZW50cy4ADGhBIFJ1bnRpbWUgdXBncmFkZSBzdGFydGVkLgD4SXRzIGVuZCBpcyBpbmRpY2F0ZWQgYnkgYFVwZ3JhZGVDb21wbGV0ZWRgIG9yIGBVcGdyYWRlRmFpbGVkYC5AVXBncmFkZUNvbXBsZXRlZAABDJhUaGUgY3VycmVudCBydW50aW1lIHVwZ3JhZGUgY29tcGxldGVkLgAdAVRoaXMgaW1wbGllcyB0aGF0IGFsbCBvZiBpdHMgbWlncmF0aW9ucyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFzIHdlbGwuNFVwZ3JhZGVGYWlsZWQAAgxcUnVudGltZSB1cGdyYWRlIGZhaWxlZC4A6FRoaXMgaXMgdmVyeSBiYWQgYW5kIHdpbGwgcmVxdWlyZSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi5ATWlncmF0aW9uU2tpcHBlZAQBFGluZGV4OAEMdTMyBCkBVGhlIGluZGV4IG9mIHRoZSBza2lwcGVkIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4DBAkBQSBtaWdyYXRpb24gd2FzIHNraXBwZWQgc2luY2UgaXQgd2FzIGFscmVhZHkgZXhlY3V0ZWQgaW4gdGhlIHBhc3QuRE1pZ3JhdGlvbkFkdmFuY2VkCAEUaW5kZXg4AQx1MzIECQFUaGUgaW5kZXggb2YgdGhlIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4BEHRvb2s4AURCbG9ja051bWJlckZvcjxUPgTUVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB0aGlzIG1pZ3JhdGlvbiB0b29rIHNvIGZhci4EBFxBIG1pZ3JhdGlvbiBwcm9ncmVzc2VkLkhNaWdyYXRpb25Db21wbGV0ZWQIARRpbmRleDgBDHUzMgQJAVRoZSBpbmRleCBvZiB0aGUgbWlncmF0aW9uIHdpdGhpbiB0aGUgW2BDb25maWc6Ok1pZ3JhdGlvbnNgXSBsaXN0LgEQdG9vazgBREJsb2NrTnVtYmVyRm9yPFQ+BNRUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHRoaXMgbWlncmF0aW9uIHRvb2sgc28gZmFyLgUEWEEgTWlncmF0aW9uIGNvbXBsZXRlZC48TWlncmF0aW9uRmFpbGVkCAEUaW5kZXg4AQx1MzIECQFUaGUgaW5kZXggb2YgdGhlIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4BEHRvb2s4AURCbG9ja051bWJlckZvcjxUPgTUVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB0aGlzIG1pZ3JhdGlvbiB0b29rIHNvIGZhci4GDExBIE1pZ3JhdGlvbiBmYWlsZWQuAE0BVGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdob2xlIHVwZ3JhZGUgZmFpbGVkIGFuZCBnb3Zlcm5hbmNlIGludGVydmVudGlvbiBpcyByZXF1aXJlZC48SGlzdG9yaWNDbGVhcmVkBAEsbmV4dF9jdXJzb3JJBQE8T3B0aW9uPFZlYzx1OD4+BOhTaG91bGQgYmUgcGFzc2VkIHRvIGBjbGVhcl9oaXN0b3JpY2AgaW4gYSBzdWNjZXNzaXZlIGNhbGwuBwTIVGhlIHNldCBvZiBoaXN0b3JpY2FsIG1pZ3JhdGlvbnMgaGFzIGJlZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTpBggwZnJhbWVfc3lzdGVtFFBoYXNlAAEMOEFwcGx5RXh0cmluc2ljBAA4AQx1MzIAAAAwRmluYWxpemF0aW9uAAEAOEluaXRpYWxpemF0aW9uAAIAAO0GAAACPADxBgAAAvUGAPUGAAAECDg4APkGCDBmcmFtZV9zeXN0ZW1YTGFzdFJ1bnRpbWVVcGdyYWRlSW5mbwAACAEwc3BlY192ZXJzaW9uYAFMY29kZWM6OkNvbXBhY3Q8dTMyPgABJHNwZWNfbmFtZf0GAURDb3c8J3N0YXRpYywgc3RyPgAA/QYEDENvdwQEVAEBBwAEAAEHAAAAAQcAAAUCAAUHCDBmcmFtZV9zeXN0ZW1gQ29kZVVwZ3JhZGVBdXRob3JpemF0aW9uBARUAAAIASRjb2RlX2hhc2g8ARxUOjpIYXNoAAE0Y2hlY2tfdmVyc2lvbsgBEGJvb2wAAAkHDDBmcmFtZV9zeXN0ZW0YbGltaXRzMEJsb2NrV2VpZ2h0cwAADAEoYmFzZV9ibG9ja9UBARhXZWlnaHQAASRtYXhfYmxvY2vVAQEYV2VpZ2h0AAEkcGVyX2NsYXNzDQcBhFBlckRpc3BhdGNoQ2xhc3M8V2VpZ2h0c1BlckNsYXNzPgAADQcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAERBwAMARhub3JtYWwRBwEEVAABLG9wZXJhdGlvbmFsEQcBBFQAASRtYW5kYXRvcnkRBwEEVAAAEQcMMGZyYW1lX3N5c3RlbRhsaW1pdHM8V2VpZ2h0c1BlckNsYXNzAAAQAThiYXNlX2V4dHJpbnNpY9UBARhXZWlnaHQAATRtYXhfZXh0cmluc2ljpQIBOE9wdGlvbjxXZWlnaHQ+AAEkbWF4X3RvdGFspQIBOE9wdGlvbjxXZWlnaHQ+AAEgcmVzZXJ2ZWSlAgE4T3B0aW9uPFdlaWdodD4AABUHDDBmcmFtZV9zeXN0ZW0YbGltaXRzLEJsb2NrTGVuZ3RoAAAEAQxtYXgZBwFUUGVyRGlzcGF0Y2hDbGFzczx1MzI+AAAZBww0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUATgADAEYbm9ybWFsOAEEVAABLG9wZXJhdGlvbmFsOAEEVAABJG1hbmRhdG9yeTgBBFQAAB0HCChzcF93ZWlnaHRzPFJ1bnRpbWVEYldlaWdodAAACAEQcmVhZCgBDHU2NAABFHdyaXRlKAEMdTY0AAAhBwgoc3BfdmVyc2lvbjhSdW50aW1lVmVyc2lvbgAAIAEkc3BlY19uYW1l/QYBRENvdzwnc3RhdGljLCBzdHI+AAEkaW1wbF9uYW1l/QYBRENvdzwnc3RhdGljLCBzdHI+AAFEYXV0aG9yaW5nX3ZlcnNpb244AQx1MzIAATBzcGVjX3ZlcnNpb244AQx1MzIAATBpbXBsX3ZlcnNpb244AQx1MzIAARBhcGlzJQcBHEFwaXNWZWMAAUx0cmFuc2FjdGlvbl92ZXJzaW9uOAEMdTMyAAE4c3lzdGVtX3ZlcnNpb24MAQh1OAAAJQcEDENvdwQEVAEpBwAEACkHAAAAKQcAAAItBwAtBwAABAi9ATgAMQcMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXJyb3IEBFQAASQ8SW52YWxpZFNwZWNOYW1lAAAIEQFUaGUgbmFtZSBvZiBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLmhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQABCEEBVGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpcyBub3QgYWxsb3dlZCB0byBkZWNyZWFzZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS50RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAgzsRmFpbGVkIHRvIGV4dHJhY3QgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIHRoZSBuZXcgcnVudGltZS4ACQFFaXRoZXIgY2FsbGluZyBgQ29yZV92ZXJzaW9uYCBvciBkZWNvZGluZyBgUnVudGltZVZlcnNpb25gIGZhaWxlZC5MTm9uRGVmYXVsdENvbXBvc2l0ZQADBPxTdWljaWRlIGNhbGxlZCB3aGVuIHRoZSBhY2NvdW50IGhhcyBub24tZGVmYXVsdCBjb21wb3NpdGUgZGF0YS48Tm9uWmVyb1JlZkNvdW50AAQENQFUaGVyZSBpcyBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCBwcmV2ZW50aW5nIHRoZSBhY2NvdW50IGZyb20gYmVpbmcgcHVyZ2VkLjBDYWxsRmlsdGVyZWQABQTQVGhlIG9yaWdpbiBmaWx0ZXIgcHJldmVudCB0aGUgY2FsbCB0byBiZSBkaXNwYXRjaGVkLmxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcABgRVAUEgbXVsdGktYmxvY2sgbWlncmF0aW9uIGlzIG9uZ29pbmcgYW5kIHByZXZlbnRzIHRoZSBjdXJyZW50IGNvZGUgZnJvbSBiZWluZyByZXBsYWNlZC5ETm90aGluZ0F1dGhvcml6ZWQABwRYTm8gdXBncmFkZSBhdXRob3JpemVkLjBVbmF1dGhvcml6ZWQACASUVGhlIHN1Ym1pdHRlZCBjb2RlIGlzIG5vdCBhdXRob3JpemVkLgRsRXJyb3IgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0NQcMKHNwX3J1bnRpbWUYdHJhaXRzLEJsYWtlVHdvMjU2AAAAADkHEChzcF9ydW50aW1lHGdlbmVyaWMUYmxvY2sUQmxvY2sIGEhlYWRlcgFcJEV4dHJpbnNpYwE9BwAIARhoZWFkZXJcARhIZWFkZXIAAShleHRyaW5zaWNzTQcBOFZlYzxFeHRyaW5zaWM+AAA9BxAoc3BfcnVudGltZRxnZW5lcmljTHVuY2hlY2tlZF9leHRyaW5zaWNIVW5jaGVja2VkRXh0cmluc2ljEBxBZGRyZXNzAQAQQ2FsbAEgJFNpZ25hdHVyZQEtBBRFeHRyYQFBBwAEABgAAABBBwh0Y3VtdWx1c19wYWxsZXRfd2VpZ2h0X3JlY2xhaW1QU3RvcmFnZVdlaWdodFJlY2xhaW0IBFQABFMBRQcABABFBwEEUwAARQcAAAQoSQelBakFrQWxBbUFuQXBBcUFyQUASQcAAAQgTQVRBV0FaQV1BYEFjQWhBQBNBwAAAj0HAFEHAAACVQcAVQcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IdW5pbmNsdWRlZF9zZWdtZW50IEFuY2VzdG9yBARIATwADAE4dXNlZF9iYW5kd2lkdGhZBwE0VXNlZEJhbmR3aWR0aAABOHBhcmFfaGVhZF9oYXNobQcBJE9wdGlvbjxIPgABYGNvbnN1bWVkX2dvX2FoZWFkX3NpZ25hbHEHAYxPcHRpb248cmVsYXlfY2hhaW46OlVwZ3JhZGVHb0FoZWFkPgAAWQcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW1IdW5pbmNsdWRlZF9zZWdtZW50NFVzZWRCYW5kd2lkdGgAAAwBNHVtcF9tc2dfY291bnQ4AQx1MzIAATx1bXBfdG90YWxfYnl0ZXM4AQx1MzIAATRocm1wX291dGdvaW5nXQcBjEJUcmVlTWFwPFBhcmFJZCwgSHJtcENoYW5uZWxVcGRhdGU+AABdBwQgQlRyZWVNYXAIBEsBnARWAWEHAAQAZQcAAABhBwx8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbUh1bmluY2x1ZGVkX3NlZ21lbnRESHJtcENoYW5uZWxVcGRhdGUAAAgBJG1zZ19jb3VudDgBDHUzMgABLHRvdGFsX2J5dGVzOAEMdTMyAABlBwAAAmkHAGkHAAAECJxhBwBtBwQYT3B0aW9uBARUATwBCBBOb25lAAAAEFNvbWUEADwAAAEAAHEHBBhPcHRpb24EBFQBdQcBCBBOb25lAAAAEFNvbWUEAHUHAAABAAB1BwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OThVcGdyYWRlR29BaGVhZAABCBRBYm9ydAAAABxHb0FoZWFkAAEAAHkHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHVuaW5jbHVkZWRfc2VnbWVudDhTZWdtZW50VHJhY2tlcgQESAE8AAwBOHVzZWRfYmFuZHdpZHRoWQcBNFVzZWRCYW5kd2lkdGgAAThocm1wX3dhdGVybWFyawkDAYBPcHRpb248cmVsYXlfY2hhaW46OkJsb2NrTnVtYmVyPgABYGNvbnN1bWVkX2dvX2FoZWFkX3NpZ25hbHEHAYxPcHRpb248cmVsYXlfY2hhaW46OlVwZ3JhZGVHb0FoZWFkPgAAfQcEGE9wdGlvbgQEVAGBBwEIEE5vbmUAAAAQU29tZQQAgQcAAAEAAIEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY5SFVwZ3JhZGVSZXN0cmljdGlvbgABBBxQcmVzZW50AAAAAIUHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtUHJlbGF5X3N0YXRlX3NuYXBzaG90WE1lc3NhZ2luZ1N0YXRlU25hcHNob3QAABABMGRtcV9tcWNfaGVhZDwBRHJlbGF5X2NoYWluOjpIYXNoAAGccmVsYXlfZGlzcGF0Y2hfcXVldWVfcmVtYWluaW5nX2NhcGFjaXR5iQcBjFJlbGF5RGlzcGF0Y2hRdWV1ZVJlbWFpbmluZ0NhcGFjaXR5AAFAaW5ncmVzc19jaGFubmVsc40HAYhWZWM8KFBhcmFJZCwgQWJyaWRnZWRIcm1wQ2hhbm5lbCk+AAE8ZWdyZXNzX2NoYW5uZWxzjQcBiFZlYzwoUGFyYUlkLCBBYnJpZGdlZEhybXBDaGFubmVsKT4AAIkHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtUHJlbGF5X3N0YXRlX3NuYXBzaG90jFJlbGF5RGlzcGF0Y2hRdWV1ZVJlbWFpbmluZ0NhcGFjaXR5AAAIATxyZW1haW5pbmdfY291bnQ4AQx1MzIAAThyZW1haW5pbmdfc2l6ZTgBDHUzMgAAjQcAAAKRBwCRBwAABAiclQcAlQcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjlMQWJyaWRnZWRIcm1wQ2hhbm5lbAAAGAEwbWF4X2NhcGFjaXR5OAEMdTMyAAE4bWF4X3RvdGFsX3NpemU4AQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplOAEMdTMyAAEkbXNnX2NvdW50OAEMdTMyAAEodG90YWxfc2l6ZTgBDHUzMgABIG1xY19oZWFkbQcBME9wdGlvbjxIYXNoPgAAmQcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjlkQWJyaWRnZWRIb3N0Q29uZmlndXJhdGlvbgAAKAE0bWF4X2NvZGVfc2l6ZTgBDHUzMgABSG1heF9oZWFkX2RhdGFfc2l6ZTgBDHUzMgABWG1heF91cHdhcmRfcXVldWVfY291bnQ4AQx1MzIAAVRtYXhfdXB3YXJkX3F1ZXVlX3NpemU4AQx1MzIAAVxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZTgBDHUzMgABkG1heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZTgBDHUzMgABiGhybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGU4AQx1MzIAAWx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd244ASxCbG9ja051bWJlcgABYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheTgBLEJsb2NrTnVtYmVyAAFQYXN5bmNfYmFja2luZ19wYXJhbXOdBwFIQXN5bmNCYWNraW5nUGFyYW1zAACdBxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OTRhc3luY19iYWNraW5nSEFzeW5jQmFja2luZ1BhcmFtcwAACAFMbWF4X2NhbmRpZGF0ZV9kZXB0aDgBDHUzMgABUGFsbG93ZWRfYW5jZXN0cnlfbGVuOAEMdTMyAAChBwiUY3VtdWx1c19wcmltaXRpdmVzX3BhcmFjaGFpbl9pbmhlcmVudERNZXNzYWdlUXVldWVDaGFpbgAABAA8ASRSZWxheUhhc2gAAKUHBCBCVHJlZU1hcAgESwGcBFYBoQcABACpBwAAAKkHAAACrQcArQcAAAQInKEHALEHDHxjdW11bHVzX3BhbGxldF9wYXJhY2hhaW5fc3lzdGVtSHBhcmFjaGFpbl9pbmhlcmVudEBJbmJvdW5kTWVzc2FnZUlkAAAIARxzZW50X2F0OAEsQmxvY2tOdW1iZXIAASxyZXZlcnNlX2lkeDgBDHUzMgAAtQcAAAK5BwC5BwhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAZwACAEkcmVjaXBpZW50nAEISWQAARBkYXRhGAFMYWxsb2M6OnZlYzo6VmVjPHU4PgAAvQcMfGN1bXVsdXNfcGFsbGV0X3BhcmFjaGFpbl9zeXN0ZW0YcGFsbGV0FEVycm9yBARUAAEYTE92ZXJsYXBwaW5nVXBncmFkZXMAAAQZAUF0dGVtcHQgdG8gdXBncmFkZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHdoaWxlIGV4aXN0aW5nIHVwZ3JhZGUgcGVuZGluZy5QUHJvaGliaXRlZEJ5UG9sa2Fkb3QAAQRNAVBvbGthZG90IGN1cnJlbnRseSBwcm9oaWJpdHMgdGhpcyBwYXJhY2hhaW4gZnJvbSB1cGdyYWRpbmcgaXRzIHZhbGlkYXRpb24gZnVuY3Rpb24uGFRvb0JpZwACCEUBVGhlIHN1cHBsaWVkIHZhbGlkYXRpb24gZnVuY3Rpb24gaGFzIGNvbXBpbGVkIGludG8gYSBibG9iIGxhcmdlciB0aGFuIFBvbGthZG90IGlzPHdpbGxpbmcgdG8gcnVuLmhWYWxpZGF0aW9uRGF0YU5vdEF2YWlsYWJsZQADBB0BVGhlIGluaGVyZW50IHdoaWNoIHN1cHBsaWVzIHRoZSB2YWxpZGF0aW9uIGRhdGEgZGlkIG5vdCBydW4gdGhpcyBibG9jay50SG9zdENvbmZpZ3VyYXRpb25Ob3RBdmFpbGFibGUABAQpAVRoZSBpbmhlcmVudCB3aGljaCBzdXBwbGllcyB0aGUgaG9zdCBjb25maWd1cmF0aW9uIGRpZCBub3QgcnVuIHRoaXMgYmxvY2suME5vdFNjaGVkdWxlZAAFBNhObyB2YWxpZGF0aW9uIGZ1bmN0aW9uIHVwZ3JhZGUgaXMgY3VycmVudGx5IHNjaGVkdWxlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuwQcMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHFBwRTAAAEAM0HARhWZWM8VD4AAMUHDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQmFsYW5jZUxvY2sEHEJhbGFuY2UBxAAMAQhpZL0BAThMb2NrSWRlbnRpZmllcgABGGFtb3VudMQBHEJhbGFuY2UAARxyZWFzb25zyQcBHFJlYXNvbnMAAMkHDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMcUmVhc29ucwABDAxGZWUAAAAQTWlzYwABAAxBbGwAAgAAzQcAAALFBwDRBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAdUHBFMAAAQA2QcBGFZlYzxUPgAA1QcMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxSZXNlcnZlRGF0YQhEUmVzZXJ2ZUlkZW50aWZpZXIBvQEcQmFsYW5jZQHEAAgBCGlkvQEBRFJlc2VydmVJZGVudGlmaWVyAAEYYW1vdW50xAEcQmFsYW5jZQAA2QcAAALVBwDdBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeEHBFMAAAQA5QcBGFZlYzxUPgAA4QcUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAEhBhxCYWxhbmNlAcQACAEIaWQhBgEISWQAARhhbW91bnTEARxCYWxhbmNlAADlBwAAAuEHAOkHDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB7QcEUwAABADxBwEYVmVjPFQ+AADtBxQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkARAcQmFsYW5jZQHEAAgBCGlkEAEISWQAARhhbW91bnTEARxCYWxhbmNlAADxBwAAAu0HAPUHDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC75BwhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQgUmVsZWFzZXMAAQgkVjFBbmNpZW50AAAACFYyAAEAAP0HEDRmcmFtZV9zdXBwb3J0GHRyYWl0cxxzdG9yYWdlGE5vRHJvcAQEVAEBCAAEAAEIAQRUAAABCBg0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zIGZ1bmdpYmxlJGltYmFsYW5jZSRJbWJhbGFuY2UMBEIBxBhPbkRyb3AAOE9wcG9zaXRlT25Ecm9wAAAEARhhbW91bnTEAQRCAAAFCAx8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbhhwYWxsZXQUVXNhZ2UIHEJhbGFuY2UBxCxCbG9ja051bWJlcgE4AAgBEHVzZWTEARxCYWxhbmNlAAEgYXRfYmxvY2s4ASxCbG9ja051bWJlcgAACQgMfGluZGl2X3BhbGxldF9vcmlnaW5fcmVzdHJpY3Rpb24YcGFsbGV0FEVycm9yBARUAAEIHE5vVXNhZ2UAAASAVGhlIG9yaWdpbiBoYXMgbm8gdXNhZ2UgdHJhY2tlZC4cTm90WmVybwABBFhUaGUgdXNhZ2UgaXMgbm90IHplcm8uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lg0IDDRwYWxsZXRfYXNzZXRzFHR5cGVzMEFzc2V0RGV0YWlscwwcQmFsYW5jZQHEJEFjY291bnRJZAEEOERlcG9zaXRCYWxhbmNlAcQAMAEUb3duZXIEASRBY2NvdW50SWQAARhpc3N1ZXIEASRBY2NvdW50SWQAARRhZG1pbgQBJEFjY291bnRJZAABHGZyZWV6ZXIEASRBY2NvdW50SWQAARhzdXBwbHnEARxCYWxhbmNlAAEcZGVwb3NpdMQBOERlcG9zaXRCYWxhbmNlAAEsbWluX2JhbGFuY2XEARxCYWxhbmNlAAE0aXNfc3VmZmljaWVudMgBEGJvb2wAASBhY2NvdW50czgBDHUzMgABLHN1ZmZpY2llbnRzOAEMdTMyAAEkYXBwcm92YWxzOAEMdTMyAAEYc3RhdHVzEQgBLEFzc2V0U3RhdHVzAAARCAw0cGFsbGV0X2Fzc2V0cxR0eXBlcyxBc3NldFN0YXR1cwABDBBMaXZlAAAAGEZyb3plbgABAChEZXN0cm95aW5nAAIAABUIAAAECOAEABkIDDRwYWxsZXRfYXNzZXRzFHR5cGVzMEFzc2V0QWNjb3VudBAcQmFsYW5jZQHEOERlcG9zaXRCYWxhbmNlAcQURXh0cmEBECRBY2NvdW50SWQBBAAQARxiYWxhbmNlxAEcQmFsYW5jZQABGHN0YXR1cx0IATRBY2NvdW50U3RhdHVzAAEYcmVhc29uIQgBqEV4aXN0ZW5jZVJlYXNvbjxEZXBvc2l0QmFsYW5jZSwgQWNjb3VudElkPgABFGV4dHJhEAEURXh0cmEAAB0IDDRwYWxsZXRfYXNzZXRzFHR5cGVzNEFjY291bnRTdGF0dXMAAQwYTGlxdWlkAAAAGEZyb3plbgABABxCbG9ja2VkAAIAACEIDDRwYWxsZXRfYXNzZXRzFHR5cGVzPEV4aXN0ZW5jZVJlYXNvbggcQmFsYW5jZQHEJEFjY291bnRJZAEEARQgQ29uc3VtZXIAAAAoU3VmZmljaWVudAABACxEZXBvc2l0SGVsZAQAxAEcQmFsYW5jZQACADxEZXBvc2l0UmVmdW5kZWQAAwAsRGVwb3NpdEZyb20IAAQBJEFjY291bnRJZAAAxAEcQmFsYW5jZQAEAAAlCAAABAzgBAQAKQgMNHBhbGxldF9hc3NldHMUdHlwZXMgQXBwcm92YWwIHEJhbGFuY2UBxDhEZXBvc2l0QmFsYW5jZQHEAAgBGGFtb3VudMQBHEJhbGFuY2UAARxkZXBvc2l0xAE4RGVwb3NpdEJhbGFuY2UAAC0IDDRwYWxsZXRfYXNzZXRzFHR5cGVzNEFzc2V0TWV0YWRhdGEIOERlcG9zaXRCYWxhbmNlAcQ0Qm91bmRlZFN0cmluZwExCAAUARxkZXBvc2l0xAE4RGVwb3NpdEJhbGFuY2UAARBuYW1lMQgBNEJvdW5kZWRTdHJpbmcAARhzeW1ib2wxCAE0Qm91bmRlZFN0cmluZwABIGRlY2ltYWxzDAEIdTgAASRpc19mcm96ZW7IARBib29sAAAxCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQwEUwAABAAYARhWZWM8VD4AADUIDDRwYWxsZXRfYXNzZXRzGHBhbGxldBRFcnJvcggEVAAESQABYChCYWxhbmNlTG93AAAEFQFBY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRyYW5zZmVyIGFtb3VudC4kTm9BY2NvdW50AAEEkFRoZSBhY2NvdW50IHRvIGFsdGVyIGRvZXMgbm90IGV4aXN0LjBOb1Blcm1pc3Npb24AAgToVGhlIHNpZ25pbmcgYWNjb3VudCBoYXMgbm8gcGVybWlzc2lvbiB0byBkbyB0aGUgb3BlcmF0aW9uLhxVbmtub3duAAMEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLhhGcm96ZW4ABAR0VGhlIG9yaWdpbiBhY2NvdW50IGlzIGZyb3plbi4USW5Vc2UABQR4VGhlIGFzc2V0IElEIGlzIGFscmVhZHkgdGFrZW4uKEJhZFdpdG5lc3MABgRsSW52YWxpZCB3aXRuZXNzIGRhdGEgZ2l2ZW4uOE1pbkJhbGFuY2VaZXJvAAcEjE1pbmltdW0gYmFsYW5jZSBzaG91bGQgYmUgbm9uLXplcm8uTFVuYXZhaWxhYmxlQ29uc3VtZXIACAxZAVVuYWJsZSB0byBpbmNyZW1lbnQgdGhlIGNvbnN1bWVyIHJlZmVyZW5jZSBjb3VudGVycyBvbiB0aGUgYWNjb3VudC4gRWl0aGVyIG5vIHByb3ZpZGVyTQFyZWZlcmVuY2UgZXhpc3RzIHRvIGFsbG93IGEgbm9uLXplcm8gYmFsYW5jZSBvZiBhIG5vbi1zZWxmLXN1ZmZpY2llbnQgYXNzZXQsIG9yIG9uZfBmZXdlciB0aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdW1lcnMgaGFzIGJlZW4gcmVhY2hlZC4sQmFkTWV0YWRhdGEACQRcSW52YWxpZCBtZXRhZGF0YSBnaXZlbi4oVW5hcHByb3ZlZAAKBMRObyBhcHByb3ZhbCBleGlzdHMgdGhhdCB3b3VsZCBhbGxvdyB0aGUgdHJhbnNmZXIuIFdvdWxkRGllAAsENQFUaGUgc291cmNlIGFjY291bnQgd291bGQgbm90IHN1cnZpdmUgdGhlIHRyYW5zZmVyIGFuZCBpdCBuZWVkcyB0byBzdGF5IGFsaXZlLjRBbHJlYWR5RXhpc3RzAAwEhFRoZSBhc3NldC1hY2NvdW50IGFscmVhZHkgZXhpc3RzLiROb0RlcG9zaXQADQTUVGhlIGFzc2V0LWFjY291bnQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZGVwb3NpdC4kV291bGRCdXJuAA4ExFRoZSBvcGVyYXRpb24gd291bGQgcmVzdWx0IGluIGZ1bmRzIGJlaW5nIGJ1cm5lZC4kTGl2ZUFzc2V0AA8IWQFUaGUgYXNzZXQgaXMgYSBsaXZlIGFzc2V0IGFuZCBpcyBhY3RpdmVseSBiZWluZyB1c2VkLiBVc3VhbGx5IGVtaXQgZm9yIG9wZXJhdGlvbnMgc3VjaB0BYXMgYHN0YXJ0X2Rlc3Ryb3lgIHdoaWNoIHJlcXVpcmUgdGhlIGFzc2V0IHRvIGJlIGluIGEgZGVzdHJveWluZyBzdGF0ZS4wQXNzZXROb3RMaXZlABAEyFRoZSBhc3NldCBpcyBub3QgbGl2ZSwgYW5kIGxpa2VseSBiZWluZyBkZXN0cm95ZWQuPEluY29ycmVjdFN0YXR1cwARBLBUaGUgYXNzZXQgc3RhdHVzIGlzIG5vdCB0aGUgZXhwZWN0ZWQgc3RhdHVzLiROb3RGcm96ZW4AEgTYVGhlIGFzc2V0IHNob3VsZCBiZSBmcm96ZW4gYmVmb3JlIHRoZSBnaXZlbiBvcGVyYXRpb24uOENhbGxiYWNrRmFpbGVkABMEhENhbGxiYWNrIGFjdGlvbiByZXN1bHRlZCBpbiBlcnJvcihCYWRBc3NldElkABQEyFRoZSBhc3NldCBJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBbYE5leHRBc3NldElkYF0uPENvbnRhaW5zRnJlZXplcwAVBE0BVGhlIGFzc2V0IGNhbm5vdCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBzb21lIGFjY291bnRzIGZvciB0aGlzIGFzc2V0IGNvbnRhaW4gZnJlZXplcy40Q29udGFpbnNIb2xkcwAWBEUBVGhlIGFzc2V0IGNhbm5vdCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBzb21lIGFjY291bnRzIGZvciB0aGlzIGFzc2V0IGNvbnRhaW4gaG9sZHMuPFRvb01hbnlSZXNlcnZlcwAXBIBUcmllZCBzZXR0aW5nIHRvbyBtYW55IHJlc2VydmVzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC45CAQYT3B0aW9uBARUAQ0IAQgQTm9uZQAAABBTb21lBAANCAAAAQAAPQgEGE9wdGlvbgQEVAHEAQgQTm9uZQAAABBTb21lBADEAAABAABBCAQYT3B0aW9uBARUAS0IAQgQTm9uZQAAABBTb21lBAAtCAAAAQAARQgMUHBhbGxldF9hc3NldHNfaG9sZGVyGHBhbGxldBRFcnJvcggEVAAESQABBDBUb29NYW55SG9sZHMAAAQxAU51bWJlciBvZiBob2xkcyBvbiBhbiBhY2NvdW50IHdvdWxkIGV4Y2VlZCB0aGUgY291bnQgb2YgYFJ1bnRpbWVIb2xkUmVhc29uYC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuSQgMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFcnJvcgQEVAABDEBVbmtub3duQXNzZXRLaW5kAAAEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLjRBbHJlYWR5RXhpc3RzAAEEUQFUaGUgZ2l2ZW4gYXNzZXQgSUQgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY29udmVyc2lvbiByYXRlIGFuZCBjYW5ub3QgYmUgcmUtY3JlYXRlZC4gT3ZlcmZsb3cAAgTMT3ZlcmZsb3cgb2N1cnJlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIHJhdGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lk0IDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAMwBGFZlYzxUPgAAUQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFVCARTAAAEAFkIARhWZWM8VD4AAFUIDGRwYWxsZXRfY29sbGF0b3Jfc2VsZWN0aW9uGHBhbGxldDRDYW5kaWRhdGVJbmZvCCRBY2NvdW50SWQBBBxCYWxhbmNlAcQACAEMd2hvBAEkQWNjb3VudElkAAEcZGVwb3NpdMQBHEJhbGFuY2UAAFkIAAACVQgAXQgINGZyYW1lX3N1cHBvcnQgUGFsbGV0SWQAAAQAvQEBHFt1ODsgOF0AAGEIDGRwYWxsZXRfY29sbGF0b3Jfc2VsZWN0aW9uGHBhbGxldBRFcnJvcgQEVAABRERUb29NYW55Q2FuZGlkYXRlcwAABIxUaGUgcGFsbGV0IGhhcyB0b28gbWFueSBjYW5kaWRhdGVzLlxUb29GZXdFbGlnaWJsZUNvbGxhdG9ycwABBKxMZWF2aW5nIHdvdWxkIHJlc3VsdCBpbiB0b28gZmV3IGNhbmRpZGF0ZXMuQEFscmVhZHlDYW5kaWRhdGUAAgR8QWNjb3VudCBpcyBhbHJlYWR5IGEgY2FuZGlkYXRlLjBOb3RDYW5kaWRhdGUAAwRsQWNjb3VudCBpcyBub3QgYSBjYW5kaWRhdGUuUFRvb01hbnlJbnZ1bG5lcmFibGVzAAQEhFRoZXJlIGFyZSB0b28gbWFueSBJbnZ1bG5lcmFibGVzLkxBbHJlYWR5SW52dWxuZXJhYmxlAAUEjEFjY291bnQgaXMgYWxyZWFkeSBhbiBJbnZ1bG5lcmFibGUuPE5vdEludnVsbmVyYWJsZQAGBHxBY2NvdW50IGlzIG5vdCBhbiBJbnZ1bG5lcmFibGUuXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAcEnEFjY291bnQgaGFzIG5vIGFzc29jaWF0ZWQgdmFsaWRhdG9yIElELlhWYWxpZGF0b3JOb3RSZWdpc3RlcmVkAAgEjFZhbGlkYXRvciBJRCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQubEluc2VydFRvQ2FuZGlkYXRlTGlzdEZhaWxlZAAJBJxDb3VsZCBub3QgaW5zZXJ0IGluIHRoZSBjYW5kaWRhdGUgbGlzdC50UmVtb3ZlRnJvbUNhbmRpZGF0ZUxpc3RGYWlsZWQACgSkQ291bGQgbm90IHJlbW92ZSBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdC40RGVwb3NpdFRvb0xvdwALBPROZXcgZGVwb3NpdCBhbW91bnQgd291bGQgYmUgYmVsb3cgdGhlIG1pbmltdW0gY2FuZGlkYWN5IGJvbmQuZFVwZGF0ZUNhbmRpZGF0ZUxpc3RGYWlsZWQADASQQ291bGQgbm90IHVwZGF0ZSB0aGUgY2FuZGlkYXRlIGxpc3QuQEluc3VmZmljaWVudEJvbmQADQQpAURlcG9zaXQgYW1vdW50IGlzIHRvbyBsb3cgdG8gdGFrZSB0aGUgdGFyZ2V0J3Mgc2xvdCBpbiB0aGUgY2FuZGlkYXRlIGxpc3QuUFRhcmdldElzTm90Q2FuZGlkYXRlAA4ELQFUaGUgdGFyZ2V0IGFjY291bnQgdG8gYmUgcmVwbGFjZWQgaW4gdGhlIGNhbmRpZGF0ZSBsaXN0IGlzIG5vdCBhIGNhbmRpZGF0ZS5ASWRlbnRpY2FsRGVwb3NpdAAPBA0BVGhlIHVwZGF0ZWQgZGVwb3NpdCBhbW91bnQgaXMgZXF1YWwgdG8gdGhlIGFtb3VudCBhbHJlYWR5IHJlc2VydmVkLkBJbnZhbGlkVW5yZXNlcnZlABAEPQFDYW5ub3QgbG93ZXIgY2FuZGlkYWN5IGJvbmQgd2hpbGUgb2NjdXB5aW5nIGEgZnV0dXJlIGNvbGxhdG9yIHNsb3QgaW4gdGhlIGxpc3QuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LmUIAAACaQgAaQgAAAQIBDkBAG0IAAACcQgAcQgAAAQIOHUIAHUIDChzcF9zdGFraW5nHG9mZmVuY2U8T2ZmZW5jZVNldmVyaXR5AAAEAHkIARxQZXJiaWxsAAB5CAw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcmJpbGwAAAQAOAEMdTMyAAB9CAAABAiBCBgAgQgMHHNwX2NvcmUYY3J5cHRvJEtleVR5cGVJZAAABABwARxbdTg7IDRdAACFCAw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0FEVycm9yBARUAAEUMEludmFsaWRQcm9vZgAABGBJbnZhbGlkIG93bmVyc2hpcCBwcm9vZi5cTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQAAQScTm8gYXNzb2NpYXRlZCB2YWxpZGF0b3IgSUQgZm9yIGFjY291bnQuNER1cGxpY2F0ZWRLZXkAAgRkUmVnaXN0ZXJlZCBkdXBsaWNhdGUga2V5LhhOb0tleXMAAwSkTm8ga2V5cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWNjb3VudC4kTm9BY2NvdW50AAQEGQFLZXkgc2V0dGluZyBhY2NvdW50IGlzIG5vdCBsaXZlLCBzbyBpdCdzIGltcG9zc2libGUgdG8gYXNzb2NpYXRlIGtleXMuBHRFcnJvciBmb3IgdGhlIHNlc3Npb24gcGFsbGV0LokIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBPQEEUwAABACNCAEYVmVjPFQ+AACNCAAAAj0BAJEICEhzcF9jb25zZW5zdXNfc2xvdHMQU2xvdAAABAAoAQx1NjQAAJUIAAAECJEIOACZCAxMYm91bmRlZF9jb2xsZWN0aW9uc0Rib3VuZGVkX2J0cmVlX3NldDxCb3VuZGVkQlRyZWVTZXQIBFQBnARTAAAEAJ0IASxCVHJlZVNldDxUPgAAnQgEIEJUcmVlU2V0BARUAZwABAChCAAAAKEIAAACnAClCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakIBFMAAAQAsQgBGFZlYzxUPgAAqQgIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWVYT3V0Ym91bmRDaGFubmVsRGV0YWlscwAAFAEkcmVjaXBpZW50nAEYUGFyYUlkAAEUc3RhdGWtCAE0T3V0Ym91bmRTdGF0ZQABNHNpZ25hbHNfZXhpc3TIARBib29sAAEsZmlyc3RfaW5kZXgtAwEMdTE2AAEobGFzdF9pbmRleC0DAQx1MTYAAK0ICGRjdW11bHVzX3BhbGxldF94Y21wX3F1ZXVlNE91dGJvdW5kU3RhdGUAAQgIT2sAAAAkU3VzcGVuZGVkAAEAALEIAAACqQgAtQgAAAQInC0DALkIDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBDARTAAAEABgBGFZlYzxUPgAAvQgIZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWU8UXVldWVDb25maWdEYXRhAAAMAURzdXNwZW5kX3RocmVzaG9sZDgBDHUzMgABOGRyb3BfdGhyZXNob2xkOAEMdTMyAAFAcmVzdW1lX3RocmVzaG9sZDgBDHUzMgAAwQgMZGN1bXVsdXNfcGFsbGV0X3hjbXBfcXVldWUYcGFsbGV0FEVycm9yBARUAAEUOEJhZFF1ZXVlQ29uZmlnAAAEEQFTZXR0aW5nIHRoZSBxdWV1ZSBjb25maWcgZmFpbGVkIHNpbmNlIG9uZSBvZiBpdHMgdmFsdWVzIHdhcyBpbnZhbGlkLkBBbHJlYWR5U3VzcGVuZGVkAAEEjFRoZSBleGVjdXRpb24gaXMgYWxyZWFkeSBzdXNwZW5kZWQuOEFscmVhZHlSZXN1bWVkAAIEhFRoZSBleGVjdXRpb24gaXMgYWxyZWFkeSByZXN1bWVkLnRUb29NYW55QWN0aXZlT3V0Ym91bmRDaGFubmVscwADBLBUaGVyZSBhcmUgdG9vIG1hbnkgYWN0aXZlIG91dGJvdW5kIGNoYW5uZWxzLhhUb29CaWcABARcVGhlIG1lc3NhZ2UgaXMgdG9vIGJpZy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuxQgMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgE4AQwcUGVuZGluZxABJHJlc3BvbmRlckkBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXLJCAFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmec0IAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dDgBLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZcgBEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZdUIAURWZXJzaW9uZWRSZXNwb25zZQABCGF0OAEsQmxvY2tOdW1iZXIAAgAAyQgEGE9wdGlvbgQEVAFJAQEIEE5vbmUAAAAQU29tZQQASQEAAAEAAM0IBBhPcHRpb24EBFQB0QgBCBBOb25lAAAAEFNvbWUEANEIAAABAADRCAAABAgMDADVCAgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYzBADFAQEwdjM6OlJlc3BvbnNlAAMACFY0BAA1AgEwdjQ6OlJlc3BvbnNlAAQACFY1BACBAgEwdjU6OlJlc3BvbnNlAAUAANkIAAAECDhJAQDdCAAABAwo1QE4AOEIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB5QgEUwAABADpCAEYVmVjPFQ+AADlCAAABAhJATgA6QgAAALlCADtCAwocGFsbGV0X3hjbRhwYWxsZXRUVmVyc2lvbk1pZ3JhdGlvblN0YWdlAAEQXE1pZ3JhdGVTdXBwb3J0ZWRWZXJzaW9uAAAAXE1pZ3JhdGVWZXJzaW9uTm90aWZpZXJzAAEAUE5vdGlmeUN1cnJlbnRUYXJnZXRzBABJBQE8T3B0aW9uPFZlYzx1OD4+AAIAaE1pZ3JhdGVBbmROb3RpZnlPbGRUYXJnZXRzAAMAAPEIAAAEDDgEEQMA9QgMKHBhbGxldF94Y20YcGFsbGV0aFJlbW90ZUxvY2tlZEZ1bmdpYmxlUmVjb3JkCEhDb25zdW1lcklkZW50aWZpZXIBEDBNYXhDb25zdW1lcnMAABABGGFtb3VudMQBEHUxMjgAARRvd25lckkBAURWZXJzaW9uZWRMb2NhdGlvbgABGGxvY2tlckkBAURWZXJzaW9uZWRMb2NhdGlvbgABJGNvbnN1bWVyc/kIAdBCb3VuZGVkVmVjPChDb25zdW1lcklkZW50aWZpZXIsIHUxMjgpLCBNYXhDb25zdW1lcnM+AAD5CAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAf0IBFMAAAQAAQkBGFZlYzxUPgAA/QgAAAQIEMQAAQkAAAL9CAAFCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQkJBFMAAAQADQkBGFZlYzxUPgAACQkAAAQIxEkBAA0JAAACCQkAEQkIKHBhbGxldF94Y21YQXV0aG9yaXplZEFsaWFzZXNFbnRyeQgYVGlja2V0ARUJDE1BWAEZCQAIASBhbGlhc2Vycx0JAXhCb3VuZGVkVmVjPE9yaWdpbkFsaWFzZXIsIE1BWD4AARh0aWNrZXQVCQEYVGlja2V0AAAVCRA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMcc3RvcmFnZSBEaXNhYmxlZAAAAAAZCQwocGFsbGV0X3hjbRhwYWxsZXRQTWF4QXV0aG9yaXplZEFsaWFzZXMAAAAAHQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEhCQRTAAAEACUJARhWZWM8VD4AACEJDEB4Y21fcnVudGltZV9hcGlzSGF1dGhvcml6ZWRfYWxpYXNlczRPcmlnaW5BbGlhc2VyAAAIASBsb2NhdGlvbkkBAURWZXJzaW9uZWRMb2NhdGlvbgABGGV4cGlyeRUDASxPcHRpb248dTY0PgAAJQkAAAIhCQApCQwocGFsbGV0X3hjbRhwYWxsZXQURXJyb3IEBFQAAXAsVW5yZWFjaGFibGUAAAhdAVRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIHdhcyB1bnJlYWNoYWJsZSwgZ2VuZXJhbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBubyB3YXkgb2Ygcm91dGluZxh0byBpdC4sU2VuZEZhaWx1cmUAAQhBAVRoZXJlIHdhcyBzb21lIG90aGVyIGlzc3VlIChpLmUuIG5vdCB0byBkbyB3aXRoIHJvdXRpbmcpIGluIHNlbmRpbmcgdGhlIG1lc3NhZ2UuyFBlcmhhcHMgYSBsYWNrIG9mIHNwYWNlIGZvciBidWZmZXJpbmcgdGhlIG1lc3NhZ2UuIEZpbHRlcmVkAAIEnFRoZSBtZXNzYWdlIGV4ZWN1dGlvbiBmYWlscyB0aGUgZmlsdGVyLkhVbndlaWdoYWJsZU1lc3NhZ2UAAwS0VGhlIG1lc3NhZ2UncyB3ZWlnaHQgY291bGQgbm90IGJlIGRldGVybWluZWQuYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQAEBNxUaGUgZGVzdGluYXRpb24gYExvY2F0aW9uYCBwcm92aWRlZCBjYW5ub3QgYmUgaW52ZXJ0ZWQuFEVtcHR5AAUEgFRoZSBhc3NldHMgdG8gYmUgc2VudCBhcmUgZW1wdHkuOENhbm5vdFJlYW5jaG9yAAYENQFDb3VsZCBub3QgcmUtYW5jaG9yIHRoZSBhc3NldHMgdG8gZGVjbGFyZSB0aGUgZmVlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIGNoYWluLjRUb29NYW55QXNzZXRzAAcExFRvbyBtYW55IGFzc2V0cyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci40SW52YWxpZE9yaWdpbgAIBHhPcmlnaW4gaXMgaW52YWxpZCBmb3Igc2VuZGluZy4oQmFkVmVyc2lvbgAJBCEBVGhlIHZlcnNpb24gb2YgdGhlIGBWZXJzaW9uZWRgIHZhbHVlIHVzZWQgaXMgbm90IGFibGUgdG8gYmUgaW50ZXJwcmV0ZWQuLEJhZExvY2F0aW9uAAoIQQFUaGUgZ2l2ZW4gbG9jYXRpb24gY291bGQgbm90IGJlIHVzZWQgKGUuZy4gYmVjYXVzZSBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIHRoZWBkZXNpcmVkIHZlcnNpb24gb2YgWENNKS44Tm9TdWJzY3JpcHRpb24ACwS8VGhlIHJlZmVyZW5jZWQgc3Vic2NyaXB0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC5EQWxyZWFkeVN1YnNjcmliZWQADAQRAVRoZSBsb2NhdGlvbiBpcyBpbnZhbGlkIHNpbmNlIGl0IGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uIGZyb20gdXMuWENhbm5vdENoZWNrT3V0VGVsZXBvcnQADQQpAUNvdWxkIG5vdCBjaGVjay1vdXQgdGhlIGFzc2V0cyBmb3IgdGVsZXBvcnRhdGlvbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4uKExvd0JhbGFuY2UADgRBAVRoZSBvd25lciBkb2VzIG5vdCBvd24gKGFsbCkgb2YgdGhlIGFzc2V0IHRoYXQgdGhleSB3aXNoIHRvIGRvIHRoZSBvcGVyYXRpb24gb24uMFRvb01hbnlMb2NrcwAPBMBUaGUgYXNzZXQgb3duZXIgaGFzIHRvbyBtYW55IGxvY2tzIG9uIHRoZSBhc3NldC5MQWNjb3VudE5vdFNvdmVyZWlnbgAQBDEBVGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGFuIGlkZW50aWZpYWJsZSBzb3ZlcmVpZ24gYWNjb3VudCBmb3IgYW55IGxvY2F0aW9uLihGZWVzTm90TWV0ABEEKQFUaGUgb3BlcmF0aW9uIHJlcXVpcmVkIGZlZXMgdG8gYmUgcGFpZCB3aGljaCB0aGUgaW5pdGlhdG9yIGNvdWxkIG5vdCBtZWV0LjBMb2NrTm90Rm91bmQAEgT0QSByZW1vdGUgbG9jayB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgY291bGQgbm90IGJlIGZvdW5kLhRJblVzZQATBEkBVGhlIHVubG9jayBvcGVyYXRpb24gY2Fubm90IHN1Y2NlZWQgYmVjYXVzZSB0aGVyZSBhcmUgc3RpbGwgY29uc3VtZXJzIG9mIHRoZSBsb2NrLmhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQAVBPBJbnZhbGlkIGFzc2V0LCByZXNlcnZlIGNoYWluIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGZvciBpdC54SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlABYERQFJbnZhbGlkIGFzc2V0LCBkbyBub3Qgc3VwcG9ydCByZW1vdGUgYXNzZXQgcmVzZXJ2ZXMgd2l0aCBkaWZmZXJlbnQgZmVlcyByZXNlcnZlcy48VG9vTWFueVJlc2VydmVzABcESQFUb28gbWFueSBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmVzZXJ2ZSBsb2NhdGlvbnMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQAYBHxMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUuYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwAZBLhUb28gbWFueSBsb2NhdGlvbnMgYXV0aG9yaXplZCB0byBhbGlhcyBvcmlnaW4uNEV4cGlyZXNJblBhc3QAGgSMRXhwaXJ5IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC40QWxpYXNOb3RGb3VuZAAbBNBUaGUgYWxpYXMgdG8gcmVtb3ZlIGF1dGhvcml6YXRpb24gZm9yIHdhcyBub3QgZm91bmQuhExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZVdpdGhFcnJvcggBFGluZGV4DAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yLQkBOEV4ZWN1dGlvbkVycm9yABwINQFMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUgd2l0aCB0aGUgYWN0dWFsIFhDTSBlcnJvciBhbmQgdGhlIGluZGV4IG9mIHRoZYhpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Li0JDChwYWxsZXRfeGNtGGVycm9yczhFeGVjdXRpb25FcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIANFRvb01hbnlBc3NldHMAIwBMVW5oYW5kbGVkWGNtVmVyc2lvbgAkAEhXZWlnaHRMaW1pdFJlYWNoZWQAJQAcQmFycmllcgAmAExXZWlnaHROb3RDb21wdXRhYmxlACcAREV4Y2VlZHNTdGFja0xpbWl0ACgAADEJCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZSRCb29rU3RhdGUENE1lc3NhZ2VPcmlnaW4BIQMAGAEUYmVnaW44ASRQYWdlSW5kZXgAAQxlbmQ4ASRQYWdlSW5kZXgAARRjb3VudDgBJFBhZ2VJbmRleAABQHJlYWR5X25laWdoYm91cnM1CQGET3B0aW9uPE5laWdoYm91cnM8TWVzc2FnZU9yaWdpbj4+AAE0bWVzc2FnZV9jb3VudCgBDHU2NAABEHNpemUoAQx1NjQAADUJBBhPcHRpb24EBFQBOQkBCBBOb25lAAAAEFNvbWUEADkJAAABAAA5CQhQcGFsbGV0X21lc3NhZ2VfcXVldWUoTmVpZ2hib3VycwQ0TWVzc2FnZU9yaWdpbgEhAwAIARBwcmV2IQMBNE1lc3NhZ2VPcmlnaW4AARBuZXh0IQMBNE1lc3NhZ2VPcmlnaW4AAD0JAAAECCEDOABBCQhQcGFsbGV0X21lc3NhZ2VfcXVldWUQUGFnZQgQU2l6ZQE4IEhlYXBTaXplAAAYASRyZW1haW5pbmc4ARBTaXplAAE4cmVtYWluaW5nX3NpemU4ARBTaXplAAEsZmlyc3RfaW5kZXg4ARBTaXplAAEUZmlyc3Q4ARBTaXplAAEQbGFzdDgBEFNpemUAARBoZWFwRQkBnEJvdW5kZWRWZWM8dTgsIEludG9VMzI8SGVhcFNpemUsIFNpemU+PgAARQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AABJCQxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0FEVycm9yBARUAAEkLE5vdFJlYXBhYmxlAAAISQFQYWdlIGlzIG5vdCByZWFwYWJsZSBiZWNhdXNlIGl0IGhhcyBpdGVtcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIGFuZCBpcyBub3Qgb2xkHGVub3VnaC4YTm9QYWdlAAEEhFBhZ2UgdG8gYmUgcmVhcGVkIGRvZXMgbm90IGV4aXN0LiROb01lc3NhZ2UAAgSoVGhlIHJlZmVyZW5jZWQgbWVzc2FnZSBjb3VsZCBub3QgYmUgZm91bmQuQEFscmVhZHlQcm9jZXNzZWQAAwQBAVRoZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZCBhZ2Fpbi4YUXVldWVkAAQErFRoZSBtZXNzYWdlIGlzIHF1ZXVlZCBmb3IgZnV0dXJlIGV4ZWN1dGlvbi5ISW5zdWZmaWNpZW50V2VpZ2h0AAUEGQFUaGVyZSBpcyB0ZW1wb3JhcmlseSBub3QgZW5vdWdoIHdlaWdodCB0byBjb250aW51ZSBzZXJ2aWNpbmcgbWVzc2FnZXMuYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQAGEKhUaGlzIG1lc3NhZ2UgaXMgdGVtcG9yYXJpbHkgdW5wcm9jZXNzYWJsZS4AWQFTdWNoIGVycm9ycyBhcmUgZXhwZWN0ZWQsIGJ1dCBub3QgZ3VhcmFudGVlZCwgdG8gcmVzb2x2ZSB0aGVtc2VsdmVzIGV2ZW50dWFsbHkgdGhyb3VnaCRyZXRyeWluZy4sUXVldWVQYXVzZWQABwzsVGhlIHF1ZXVlIGlzIHBhdXNlZCBhbmQgbm8gbWVzc2FnZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBpdC4AHQFUaGlzIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIG1heSByZXNvbHZlIGluIHRoZSBmdXR1cmUgYnkgcmUtdHJ5aW5nLkxSZWN1cnNpdmVEaXNhbGxvd2VkAAgEMQFBbm90aGVyIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgYW5kIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhpcyBjYWxsIGNhbiBoYXBwZW4uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lk0JDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXJyb3IEBFQAAQQwVG9vTWFueUNhbGxzAAAEXFRvbyBtYW55IGNhbGxzIGJhdGNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlEJAAAECAQIAFUJCDxwYWxsZXRfbXVsdGlzaWcgTXVsdGlzaWcQLEJsb2NrTnVtYmVyATgcQmFsYW5jZQHEJEFjY291bnRJZAEEME1heEFwcHJvdmFscwAAEAEQd2hlbokDAVhUaW1lcG9pbnQ8QmxvY2tOdW1iZXI+AAEcZGVwb3NpdMQBHEJhbGFuY2UAASRkZXBvc2l0b3IEASRBY2NvdW50SWQAASRhcHByb3ZhbHNZCQGMQm91bmRlZFZlYzxBY2NvdW50SWQsIE1heEFwcHJvdmFscz4AAFkJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAMwBGFZlYzxUPgAAXQkMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXJyb3IEBFQAAThATWluaW11bVRocmVzaG9sZAAABHxUaHJlc2hvbGQgbXVzdCBiZSAyIG9yIGdyZWF0ZXIuPEFscmVhZHlBcHByb3ZlZAABBKxDYWxsIGlzIGFscmVhZHkgYXBwcm92ZWQgYnkgdGhpcyBzaWduYXRvcnkuRE5vQXBwcm92YWxzTmVlZGVkAAIEnENhbGwgZG9lc24ndCBuZWVkIGFueSAobW9yZSkgYXBwcm92YWxzLkRUb29GZXdTaWduYXRvcmllcwADBKhUaGVyZSBhcmUgdG9vIGZldyBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5IVG9vTWFueVNpZ25hdG9yaWVzAAQErFRoZXJlIGFyZSB0b28gbWFueSBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5UU2lnbmF0b3JpZXNPdXRPZk9yZGVyAAUEDQFUaGUgc2lnbmF0b3JpZXMgd2VyZSBwcm92aWRlZCBvdXQgb2Ygb3JkZXI7IHRoZXkgc2hvdWxkIGJlIG9yZGVyZWQuTFNlbmRlckluU2lnbmF0b3JpZXMABgQNAVRoZSBzZW5kZXIgd2FzIGNvbnRhaW5lZCBpbiB0aGUgb3RoZXIgc2lnbmF0b3JpZXM7IGl0IHNob3VsZG4ndCBiZS4gTm90Rm91bmQABwSgTXVsdGlzaWcgb3BlcmF0aW9uIG5vdCBmb3VuZCBpbiBzdG9yYWdlLiBOb3RPd25lcgAICFEBT25seSB0aGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGUgbXVsdGlzaWcgaXMgYWJsZSB0byBjYW5jZWwgaXQgb3IgdXBkYXRlNGl0cyBkZXBvc2l0cy4sTm9UaW1lcG9pbnQACQQdAU5vIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIGlzIGFscmVhZHkgdW5kZXJ3YXkuOFdyb25nVGltZXBvaW50AAoELQFBIGRpZmZlcmVudCB0aW1lcG9pbnQgd2FzIGdpdmVuIHRvIHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gdGhhdCBpcyB1bmRlcndheS5MVW5leHBlY3RlZFRpbWVwb2ludAALBPRBIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCBubyBtdWx0aXNpZyBvcGVyYXRpb24gaXMgdW5kZXJ3YXkuPE1heFdlaWdodFRvb0xvdwAMBNBUaGUgbWF4aW11bSB3ZWlnaHQgaW5mb3JtYXRpb24gcHJvdmlkZWQgd2FzIHRvbyBsb3cuNEFscmVhZHlTdG9yZWQADQSgVGhlIGRhdGEgdG8gYmUgc3RvcmVkIGlzIGFscmVhZHkgc3RvcmVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5hCQwscGFsbGV0X3N1ZG8YcGFsbGV0FEVycm9yBARUAAEELFJlcXVpcmVTdWRvAAAEgFNlbmRlciBtdXN0IGJlIHRoZSBTdWRvIGFjY291bnQuBGhFcnJvciBmb3IgdGhlIFN1ZG8gcGFsbGV0LmUJAAAECGkJxABpCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAW0JBFMAAAQAcQkBGFZlYzxUPgAAbQkIMHBhbGxldF9wcm94eTxQcm94eURlZmluaXRpb24MJEFjY291bnRJZAEEJFByb3h5VHlwZQGZAyxCbG9ja051bWJlcgE4AAwBIGRlbGVnYXRlBAEkQWNjb3VudElkAAEocHJveHlfdHlwZZkDASRQcm94eVR5cGUAARRkZWxheTgBLEJsb2NrTnVtYmVyAABxCQAAAm0JAHUJAAAECHkJxAB5CQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAX0JBFMAAAQAgQkBGFZlYzxUPgAAfQkIMHBhbGxldF9wcm94eTBBbm5vdW5jZW1lbnQMJEFjY291bnRJZAEEEEhhc2gBPCxCbG9ja051bWJlcgE4AAwBEHJlYWwEASRBY2NvdW50SWQAASRjYWxsX2hhc2g8ARBIYXNoAAEYaGVpZ2h0OAEsQmxvY2tOdW1iZXIAAIEJAAACfQkAhQkMMHBhbGxldF9wcm94eRhwYWxsZXQURXJyb3IEBFQAASAcVG9vTWFueQAABCEBVGhlcmUgYXJlIHRvbyBtYW55IHByb3hpZXMgcmVnaXN0ZXJlZCBvciB0b28gbWFueSBhbm5vdW5jZW1lbnRzIHBlbmRpbmcuIE5vdEZvdW5kAAEEdFByb3h5IHJlZ2lzdHJhdGlvbiBub3QgZm91bmQuIE5vdFByb3h5AAIEzFNlbmRlciBpcyBub3QgYSBwcm94eSBvZiB0aGUgYWNjb3VudCB0byBiZSBwcm94aWVkLixVbnByb3h5YWJsZQADBCEBQSBjYWxsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm94eSB0eXBlJ3MgZmlsdGVyIHdhcyBhdHRlbXB0ZWQuJER1cGxpY2F0ZQAEBGxBY2NvdW50IGlzIGFscmVhZHkgYSBwcm94eS4wTm9QZXJtaXNzaW9uAAUEFQFDYWxsIG1heSBub3QgYmUgbWFkZSBieSBwcm94eSBiZWNhdXNlIGl0IG1heSBlc2NhbGF0ZSBpdHMgcHJpdmlsZWdlcy4sVW5hbm5vdW5jZWQABgTQQW5ub3VuY2VtZW50LCBpZiBtYWRlIGF0IGFsbCwgd2FzIG1hZGUgdG9vIHJlY2VudGx5LixOb1NlbGZQcm94eQAHBGRDYW5ub3QgYWRkIHNlbGYgYXMgcHJveHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LokJDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXMwUmVnaXN0cmF0aW9uDBxCYWxhbmNlAcQ0TWF4SnVkZ2VtZW50cwAwSWRlbnRpdHlJbmZvAaEDAAwBKGp1ZGdlbWVudHONCQH8Qm91bmRlZFZlYzwoUmVnaXN0cmFySW5kZXgsIEp1ZGdlbWVudDxCYWxhbmNlPiksIE1heEp1ZGdlbWVudHM+AAEcZGVwb3NpdMQBHEJhbGFuY2UAARBpbmZvoQMBMElkZW50aXR5SW5mbwAAjQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGRCQRTAAAEAJUJARhWZWM8VD4AAJEJAAAECDglBACVCQAAApEJAJkJAAAECMRZCQCdCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAaEJBFMAAAQAqQkBGFZlYzxUPgAAoQkEGE9wdGlvbgQEVAGlCQEIEE5vbmUAAAAQU29tZQQApQkAAAEAAKUJDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXM0UmVnaXN0cmFySW5mbwwcQmFsYW5jZQHEJEFjY291bnRJZAEEHElkRmllbGQBKAAMARxhY2NvdW50BAEkQWNjb3VudElkAAEMZmVlxAEcQmFsYW5jZQABGGZpZWxkcygBHElkRmllbGQAAKkJAAACoQkArQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEMBFMAAAQAGAEYVmVjPFQ+AACxCQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzTEF1dGhvcml0eVByb3BlcnRpZXMEHEFjY291bnQBBAAIAShhY2NvdW50X2lkBAEcQWNjb3VudAABKGFsbG9jYXRpb244AShBbGxvY2F0aW9uAAC1CQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzTFVzZXJuYW1lSW5mb3JtYXRpb24IHEFjY291bnQBBBxCYWxhbmNlAcQACAEUb3duZXIEARxBY2NvdW50AAEgcHJvdmlkZXK5CQFEUHJvdmlkZXI8QmFsYW5jZT4AALkJDFRpbmRpdl9wYWxsZXRfaWRlbnRpdHkUdHlwZXMgUHJvdmlkZXIEHEJhbGFuY2UBxAEMKEFsbG9jYXRpb24AAABAQXV0aG9yaXR5RGVwb3NpdAQAxAEcQmFsYW5jZQABABhTeXN0ZW0AAgAAvQkAAAQMBDi5CQDBCQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzQFBlcnNvbmFsSWRlbnRpdHkQJEFjY291bnRJZAEELEp1ZGdlbWVudElkATg0TWF4SnVkZ2VtZW50cwAsQmxvY2tOdW1iZXIBOAAQARxhY2NvdW50BAEkQWNjb3VudElkAAFIcGVuZGluZ19qdWRnZW1lbnRzxQkBwEJvdW5kZWRWZWM8KFNvY2lhbCwgSnVkZ2VtZW50SWQpLCBNYXhKdWRnZW1lbnRzPgABGGJhbm5lZMgBEGJvb2wAAWR1c2VybmFtZV9sYXN0X3JlcG9ydGVkX2F0CQMBTE9wdGlvbjxCbG9ja051bWJlcj4AAMUJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQByQkEUwAABADNCQEYVmVjPFQ+AADJCQAABAg9BDgAzQkAAALJCQDRCQxUaW5kaXZfcGFsbGV0X2lkZW50aXR5FHR5cGVzOFVzZXJuYW1lUmVwb3J0DCRBY2NvdW50SWQBBCBVc2VybmFtZQE5BBhUaWNrZXQBOAAMASByZXBvcnRlcgQBJEFjY291bnRJZAABIHVzZXJuYW1lOQQBIFVzZXJuYW1lAAEcY2FzZV9pZDgBGFRpY2tldAAA1QkMVGluZGl2X3BhbGxldF9pZGVudGl0eRhwYWxsZXQURXJyb3IEBFQAAaRIVG9vTWFueVN1YkFjY291bnRzAAAEXFRvbyBtYW55IHN1YnMtYWNjb3VudHMuHE5vQWxpYXMAAQR4Tm8gYWxpYXMgZm91bmQgZm9yIGFuIGFjY291bnQuIE5vdEZvdW5kAAIEUEFjY291bnQgaXNuJ3QgZm91bmQuIE5vdE5hbWVkAAMEUEFjY291bnQgaXNuJ3QgbmFtZWQuKEVtcHR5SW5kZXgABAQwRW1wdHkgaW5kZXguKEZlZUNoYW5nZWQABQQ8RmVlIGlzIGNoYW5nZWQuKE5vSWRlbnRpdHkABgRITm8gaWRlbnRpdHkgZm91bmQuPFN0aWNreUp1ZGdlbWVudAAHBERTdGlja3kganVkZ2VtZW50LjhKdWRnZW1lbnRHaXZlbgAIBEBKdWRnZW1lbnQgZ2l2ZW4uQEludmFsaWRKdWRnZW1lbnQACQRISW52YWxpZCBqdWRnZW1lbnQuMEludmFsaWRJbmRleAAKBFRUaGUgaW5kZXggaXMgaW52YWxpZC40SW52YWxpZFRhcmdldAALBFhUaGUgdGFyZ2V0IGlzIGludmFsaWQuRFRvb01hbnlSZWdpc3RyYXJzAAwE6E1heGltdW0gYW1vdW50IG9mIHJlZ2lzdHJhcnMgcmVhY2hlZC4gQ2Fubm90IGFkZCBhbnkgbW9yZS44QWxyZWFkeUNsYWltZWQADQRwQWNjb3VudCBJRCBpcyBhbHJlYWR5IG5hbWVkLjxBbHJlYWR5UmVwb3J0ZWQADgSMVXNlcm5hbWUgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4YTm90U3ViAA8EcFNlbmRlciBpcyBub3QgYSBzdWItYWNjb3VudC4gTm90T3duZWQAEASIU3ViLWFjY291bnQgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyLnRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQARBNBUaGUgcHJvdmlkZWQganVkZ2VtZW50IHdhcyBmb3IgYSBkaWZmZXJlbnQgaWRlbnRpdHkuWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAEgT4RXJyb3IgdGhhdCBvY2N1cnMgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSBwYXlpbmcgZm9yIGp1ZGdlbWVudC40SW52YWxpZFN1ZmZpeAATBIBUaGUgcHJvdmlkZWQgc3VmZml4IGlzIHRvbyBsb25nLlBOb3RVc2VybmFtZUF1dGhvcml0eQAUBOBUaGUgc2VuZGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpc3N1ZSBhIHVzZXJuYW1lLjBOb0FsbG9jYXRpb24AFQTEVGhlIGF1dGhvcml0eSBjYW5ub3QgYWxsb2NhdGUgYW55IG1vcmUgdXNlcm5hbWVzLkBJbnZhbGlkU2lnbmF0dXJlABYEqFRoZSBzaWduYXR1cmUgb24gYSB1c2VybmFtZSB3YXMgbm90IHZhbGlkLkRSZXF1aXJlc1NpZ25hdHVyZQAXBAkBU2V0dGluZyB0aGlzIHVzZXJuYW1lIHJlcXVpcmVzIGEgc2lnbmF0dXJlLCBidXQgbm9uZSB3YXMgcHJvdmlkZWQuPEludmFsaWRVc2VybmFtZQAYBLBUaGUgdXNlcm5hbWUgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzLjRVc2VybmFtZVRha2VuABkEeFRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLihOb1VzZXJuYW1lABoEmFRoZSByZXF1ZXN0ZWQgdXNlcm5hbWUgZG9lcyBub3QgZXhpc3QuZE5vdFN5c3RlbVByb3ZpZGVkVXNlcm5hbWUAGwTUVGhlIHJlcG9ydGVkIHVzZXJuYW1lIHdhcyBub3QgcHJvdmlkZWQgYnkgdGhlIHN5c3RlbS4oTm90RXhwaXJlZAAcBC0BVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSBmb3JjZWZ1bGx5IHJlbW92ZWQgYmVjYXVzZSBpdCBjYW4gc3RpbGwgYmUgYWNjZXB0ZWQuIFRvb0Vhcmx5AB0EGQFUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCdzIHN0aWxsIGluIHRoZSBncmFjZSBwZXJpb2QuME5vdFVuYmluZGluZwAeBOxUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCBpcyBub3QgdW5iaW5kaW5nLkBBbHJlYWR5VW5iaW5kaW5nAB8E/FRoZSB1c2VybmFtZSBjYW5ub3QgYmUgdW5ib3VuZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgdW5iaW5kaW5nLlhJbnN1ZmZpY2llbnRQcml2aWxlZ2VzACAIRQFUaGUgYWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlcyAoZS5nLiBhdXRob3JpdHnQdHJ5aW5nIHRvIHVuYmluZCBhIHVzZXJuYW1lIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0pLihCYWRDb250ZXh0ACEE5FRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBhbGlhcyB3YXMgdXNlZCBpcyBub3Qgc3VwcG9ydGVkLkxVbmV4cGVjdGVkSnVkZ2VtZW50ACIExE5vIGFzc29jaWF0ZWQgcmVxdWVzdCBmb3IgdGhlIGp1ZGdlbWVudCByZWNlaXZlZC4wTm90U3VwcG9ydGVkACMEXQFUaGUgc29jaWFsIGNyZWRlbnRpYWwgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29uZmlndXJlZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBwcm92aWRlci4YQmFubmVkACQE2FRoZSBwZXJzb24gaXMgYmFubmVkIGFuZCBjYW5ub3QgcGVyZm9ybSB0aGUgb3BlcmF0aW9uLkRBbHJlYWR5UmVnaXN0ZXJlZAAlBB0BVGhlIHBlcnNvbiBhbHJlYWR5IGhhcyBhIHBlcnNvbmFsIGlkZW50aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGVpciBhbGlhcy5ESnVkZ2VtZW50TGlzdEZ1bGwAJgT4VGhlIGxpc3Qgb2YganVkZ2VtZW50cyBvbmdvaW5nIG9uIGEgcGVyc29uYWwgaWRlbnRpdHkgaXMgZnVsbC5sTGFzdFVzZXJuYW1lUmVwb3J0VG9vUmVjZW50ACcEsFRoZSB1c2VybmFtZSBoYXMgYmVlbiByZXBvcnRlZCB0b28gcmVjZW50bHkuYFVzZXJuYW1lSnVkZ2VtZW50T25nb2luZwAoBBEBVGhlIHVzZXJuYW1lIGhhcyBiZWVuIHJlcG9ydGVkIGFuZCBpcyB1bmRlcmdvaW5nIHZhbGlkaXR5IGp1ZGdlbWVudC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu2QkMTGluZGl2X3BhbGxldF9wZW9wbGUUdHlwZXMwUGVyc29uUmVjb3JkCBhNZW1iZXIBUQQkQWNjb3VudElkAQQACAEMa2V5UQQBGE1lbWJlcgABHGFjY291bnTpBAFET3B0aW9uPEFjY291bnRJZD4AAN0JDExpbmRpdl9wYWxsZXRfcGVvcGxlGHBhbGxldBRFcnJvcgQEVAABiCROb3RQZXJzb24AAATQVGhlIHN1cHBsaWVkIGlkZW50aWZpZXIgZG9lcyBub3QgcmVwcmVzZW50IGEgcGVyc29uLhROb0tleQABBJxUaGUgZ2l2ZW4gcGVyc29uIGhhcyBubyBhc3NvY2lhdGVkIGtleS44SW52YWxpZENvbnRleHQAAgQpAVRoZSBjb250ZXh0IGlzIG5vdCBhIG1lbWJlciBvZiB0aG9zZSBhbGxvd2VkIHRvIGhhdmUgYWNjb3VudCBhbGlhc2VzIGhlbGQuOEludmFsaWRBY2NvdW50AAMEZFRoZSBhY2NvdW50IGlzIG5vdCBrbm93bi4wQWNjb3VudEluVXNlAAQEyFRoZSBhY2NvdW50IGlzIGFscmVhZHkgaW4gdXNlIHVuZGVyIGFub3RoZXIgYWxpYXMuMEludmFsaWRQcm9vZgAFBFRUaGUgcHJvb2YgaXMgaW52YWxpZC5ASW52YWxpZFNpZ25hdHVyZQAGBGRUaGUgc2lnbmF0dXJlIGlzIGludmFsaWQuJE5vTWVtYmVycwAHBNBUaGVyZSBhcmUgbm90IHlldCBhbnkgbWVtYmVycyBvZiBvdXIgcGVyc29uaG9vZCBzZXQuKEluY29tcGxldGUACAQFAVRoZSByb290IGNhbm5vdCBiZSBmaW5hbGl6ZWQgYXMgdGhlcmUgYXJlIHN0aWxsIHVucHVzaGVkIG1lbWJlcnMuKFN0aWxsRnJlc2gACQRgVGhlIHJvb3QgaXMgc3RpbGwgZnJlc2guOFRvb01hbnlNZW1iZXJzAAoEiFRvbyBtYW55IG1lbWJlcnMgaGF2ZSBiZWVuIHB1c2hlZC48S2V5QWxyZWFkeUluVXNlAAsElEtleSBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHBlcnNvbi4sS2V5Tm90Rm91bmQADASgVGhlIG9sZCBrZXkgd2FzIG5vdCBmb3VuZCB3aGVuIGV4cGVjdGVkLjBDb3VsZE5vdFB1c2gADQSQQ291bGQgbm90IHB1c2ggbWVtYmVyIGludG8gdGhlIHJpbmcuHFNhbWVLZXkADgSUVGhlIHJlY29yZCBpcyBhbHJlYWR5IHVzaW5nIHRoaXMga2V5LlRQZXJzb25hbElkTm90UmVzZXJ2ZWQADwR0UGVyc29uYWwgSWQgd2FzIG5vdCByZXNlcnZlZC6AUGVyc29uYWxJZFJlc2VydmF0aW9uQ2Fubm90UmVuZXcAEASQUGVyc29uYWwgSWQgaGFzIG5ldmVyIGJlZW4gcmVzZXJ2ZWQukFBlcnNvbmFsSWROb3RSZXNlcnZlZE9yTm90UmVjb2duaXplZAARBNxQZXJzb25hbCBJZCB3YXMgbm90IHJlc2VydmVkIG9yIG5vdCBhbHJlYWR5IHJlY29nbml6ZWQuLEludmFsaWRSaW5nABIErFJpbmcgY2Fubm90IGJlIG1lcmdlZCBpZiBpdCdzIHRoZSB0b3AgcmluZy5IU3VzcGVuc2lvbnNQZW5kaW5nABME5FJpbmcgY2Fubm90IGJlIGJ1aWx0IHdoaWxlIHRoZXJlIGFyZSBzdXNwZW5zaW9ucyBwZW5kaW5nLlxSaW5nQWJvdmVNZXJnZVRocmVzaG9sZAAUBNRSaW5nIGNhbm5vdCBiZSBtZXJnZWQgaWYgaXQncyBub3QgYmVsb3cgMS8yIGNhcGFjaXR5LkhJbnZhbGlkU3VzcGVuc2lvbnMAFQSgU3VzcGVuc2lvbiBpbmRpY2VzIHByb3ZpZGVkIGFyZSBpbnZhbGlkLkROb011dGF0aW9uU2Vzc2lvbgAWBDUBQW4gbXV0YXRpbmcgYWN0aW9uIHdhcyBxdWV1ZWQgd2hlbiB0aGVyZSB3YXMgbm8gbXV0YXRpb24gc2Vzc2lvbiBpbiBwcm9ncmVzcy5wQ291bGROb3RTdGFydE11dGF0aW9uU2Vzc2lvbgAXBKRBbiBtdXRhdGluZyBzZXNzaW9uIGNvdWxkIG5vdCBiZSBzdGFydGVkLmxTdXNwZW5zaW9uU2Vzc2lvbkluUHJvZ3Jlc3MAGAT0Q2Fubm90IG1lcmdlIHJpbmdzIHdoaWxlIGEgc3VzcGVuc2lvbiBzZXNzaW9uIGlzIGluIHByb2dyZXNzLjhUaW1lT3V0T2ZSYW5nZQAZBHhDYWxsIGlzIHRvbyBsYXRlIG9yIHRvbyBlYXJseS5YQWxpYXNBY2NvdW50QWxyZWFkeVNldAAaBMBBbGlhcyA8LT4gQWNjb3VudCBpcyBhbHJlYWR5IHNldCBhbmQgdXAgdG8gZGF0ZS4wTm90U3VzcGVuZGVkABsE0FBlcnNvbmhvb2QgY2Fubm90IGJlIHJlc3VtZWQgaWYgaXQgaXMgbm90IHN1c3BlbmRlZC4kU3VzcGVuZGVkABwEYFBlcnNvbmhvb2QgaXMgc3VzcGVuZGVkLkxJbnZhbGlkS2V5TWlncmF0aW9uAB0EqEludmFsaWQgc3RhdGUgZm9yIGF0dGVtcHRlZCBrZXkgbWlncmF0aW9uLkxLZXlBbHJlYWR5U3VzcGVuZGVkAB4IVQFJbnZhbGlkIHN1c3BlbnNpb24gb2YgYSBrZXkgYmVsb25naW5nIHRvIGEgcGVyc29uIHdob3NlIGluZGV4IGluIHRoZSByaW5nIGhhcyBhbHJlYWR5uGJlZW4gaW5jbHVkZWQgaW4gdGhlIHBlbmRpbmcgc3VzcGVuc2lvbnMgbGlzdC5USW52YWxpZE9uYm9hcmRpbmdTaXplAB8E6FRoZSBvbmJvYXJkaW5nIHNpemUgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHJpbmcgc2l6ZS5ASW52YWxpZE1lbWJlcktleQAgBKxUaGUgbWVtYmVyIGtleSBpcyBub3QgdmFsaWQgZm9yIHRoZSBjcnlwdG8udFBlb3BsZUNvbGxlY3Rpb25BbHJlYWR5RXhpc3RzACEEvFRoZSBwZW9wbGUgY29sbGVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LuEJDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0JE1vYkNyZWRpdAQcQmFsYW5jZQHEABABFHZvdGVkOAEMdTMyAAEcY2xlYW5lZDgBDHUzMgABHGNvcnJlY3Q4AQx1MzIAARhjcmVkaXTEARxCYWxhbmNlAADlCQAABAg4CADpCQxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBPcGVuQ2FzZQQsUnVudGltZUNhbGwBIAAMARRzaW5jZSgBQFNlY3NTaW5jZUdlbmVzaXMAARxkZXRhaWxz7QkBYENhc2VEZXRhaWxzPFJ1bnRpbWVDYWxsPgABFHRhbGx5/QkBJFZvdGVUYWxseQAA7QkMVGluZGl2X3BhbGxldF9tb2JfcnVsZRhwYWxsZXQsQ2FzZURldGFpbHMELFJ1bnRpbWVDYWxsASAADAEkc3RhdGVtZW508QkBJFN0YXRlbWVudAABHGNvbnRleHR4AUBKdWRnZW1lbnRDb250ZXh0AAEgY2FsbGJhY2v5CQH8Q2FsbGJhY2s8KENhc2VJbmRleCwgSnVkZ2VtZW50Q29udGV4dCwgSnVkZ2VtZW50KSwgUnVudGltZUNhbGw+AADxCRA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eSRTdGF0ZW1lbnQAAQwoUHJvb2ZPZkluawwBGGRlc2lnbvUJAVRwcm9vZl9vZl9pbms6Oklua1NwZWMAASBldmlkZW5jZQgBMEV2aWRlbmNlSGFzaAABTHByb2JhYmxlX2FjY2VwdGFibGXIARBib29sAAAASElkZW50aXR5Q3JlZGVudGlhbAgBIHBsYXRmb3JtPQQBQGlkZW50aXR5OjpTb2NpYWwAASBldmlkZW5jZTkEAThpZGVudGl0eTo6RGF0YQABADRVc2VybmFtZVZhbGlkBAEgdXNlcm5hbWU5BAE4aWRlbnRpdHk6OkRhdGEAAgAA9QkUNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkwcHJvb2Zfb2ZfaW5rHElua1NwZWMAARBARGVzaWduZWRFbGVjdGl2ZQgALQMBLEZhbWlseUluZGV4AAAtAwEsRGVzaWduSW5kZXgAAABEUHJvY2VkdXJhbEFjY291bnQIAC0DASxGYW1pbHlJbmRleAAACAEkQWNjb3VudElkAAEASFByb2NlZHVyYWxQZXJzb25hbAgALQMBLEZhbWlseUluZGV4AAAoAShQZXJzb25hbElkAAIAKFByb2NlZHVyYWwIAC0DASxGYW1pbHlJbmRleAAAcAE4UHJvY2VkdXJhbFNlZWQAAwAA+QkQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkgQ2FsbGJhY2sIGFBhcmFtcwAsUnVudGltZUNhbGwAAAgBMHBhbGxldF9pbmRleAwBCHU4AAEoY2FsbF9pbmRleAwBCHU4AAD9CQxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCRWb3RlVGFsbHkAAAwBDGF5ZTgBDHUzMgABDG5heTgBDHUzMgABIGNvbnRlbXB0OAEMdTMyAAABCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBSaXBlQ2FzZQQsUnVudGltZUNhbGwBIAAIARxkZXRhaWxz7QkBYENhc2VEZXRhaWxzPFJ1bnRpbWVDYWxsPgABHHZlcmRpY3RBBAEkSnVkZ2VtZW50AAAFCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldCBEb25lQ2FzZQAACAEUc2luY2UoAUBTZWNzU2luY2VHZW5lc2lzAAEcdmVyZGljdEEEASRKdWRnZW1lbnQAAAkKDFRpbmRpdl9wYWxsZXRfbW9iX3J1bGUYcGFsbGV0SENyZWRpdERpc3RyaWJ1dGlvbggcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgAFAEUcm91bmQ4AShSb3VuZEluZGV4AAE8aW5pdGlhbF9iYWxhbmNlxAEcQmFsYW5jZQABRHJlbWFpbmluZ19iYWxhbmNlxAEcQmFsYW5jZQABMHRvdGFsX3BvaW50cygBJFZvdGVDb3VudAABFHN0YXJ0OAEsQmxvY2tOdW1iZXIAAA0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQoEUwAABAAVCgEYVmVjPFQ+AAARCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldDhQYXlvdXRTY2hlZHVsZQgcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgADAEkcmVtYWluaW5nOAEoUm91bmRJbmRleAABQGFtb3VudF9wZXJfcm91bmTEARxCYWxhbmNlAAEYcGVyaW9kOAEsQmxvY2tOdW1iZXIAABUKAAACEQoAGQoMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAwBCHU4AAAdCgxUaW5kaXZfcGFsbGV0X21vYl9ydWxlGHBhbGxldBRFcnJvcgQEVAABUChOb1N1Y2hDYXNlAAAEYFRoZSBjYXNlIGRvZXMgbm90IGV4aXN0LihOb1N1Y2hWb3RlAAEEYFRoZSB2b3RlIGRvZXMgbm90IGV4aXN0LhxOb3RPcGVuAAIEVFRoZSBjYXNlIGlzIG5vdCBvcGVuLhxOb3RSaXBlAAMEVFRoZSBjYXNlIGlzIG5vdCByaXBlLhxOb3REb25lAAQEZFRoZSBjYXNlIGlzIG5vdCB5ZXQgZG9uZS4oQ29kZWNFcnJvcgAFBFUBVGhlIGRlY29kZSBvZiB0aGUgY2FsbCBmYWlsZWQuIE1heWJlIHRoZXJlIHdhcyBhIGJyZWFraW5nIHJ1bnRpbWUgdXBncmFkZSBpbiBiZXR3ZWVuPzREaXNwYXRjaEVycm9yAAYETQFUaGUgY2FsbCBmYWlsZWQgdG8gZGlzcGF0Y2guIE1heWJlIHRoZXJlIHdhcyBhIGJyZWFraW5nIHJ1bnRpbWUgdXBncmFkZSBpbiBiZXR3ZWVuPxhSZWNlbnQABwSQVGhlIGNhc2UgaXMgdG9vIHJlY2VudCB0byBiZSByZWFwZWQuIE5vQ3JlZGl0AAgEoE5vdCBlbm91Z2ggY3JlZGl0IHRvIHBheW91dCB0aGUgcmV3YXJkcy4gTm9SZXdhcmQACQTUTm8gbW9iIGNyZWRpdCBkaXN0cmlidXRpb24gaW4gcGxhY2UgdG8gcmV3YXJkIHZvdGVycy4gTm9Qb2ludHMACgSgTm8gcG9pbnRzIHRvIGJlIGNvbnZlcnRlZCB0byBtb2IgY3JlZGl0LjRUb29NYW55Q2xhaW1zAAsEVFRvbyBtYW55IHZvdGUgY2xhaW1zLiBOb1BheW91dAAMBFhObyBwYXlvdXQgaW4gcHJvZ3Jlc3MuSEFyaXRobWV0aWNPdmVyZmxvdwANBLRUaGUgcG9pbnQgYW5kL29yIGNyZWRpdCBhcml0aG1ldGljIG92ZXJmbG93cy5AVG9vTWFueVNjaGVkdWxlcwAOBIBUb28gbWFueSBwYXlvdXQgcm91bmQgc2NoZWR1bGVzLihOb1NjaGVkdWxlAA8EfE5vIHBheW91dCByb3VuZCBzY2hlZHVsZSBmb3VuZC4kTm9QZW5hbHR5ABAEWE5vIHZvdGUgcGVuYWx0eSBmb3VuZC4URWFybHkAEQSUVGhlIHZvdGUgcGVuYWx0eSBoYXMgbm90IGV4cGlyZWQgeWV0LjBVbmRlclBlbmFsdHkAEgToVGhlIHZvdGUgY2Fubm90IGJlIGNhc3QgZHVlIHRvIGEgdm90aW5nIHBlbmFsdHkgaW4gZWZmZWN0LlhDYXNlRXhwaXJhdGlvbkRpc2FibGVkABMEHQFUaGUgb3BlbiBjYXNlIGV4cGlyYXRpb24gaXMgZGlzYWJsZWQgZHVlIHRvIGluc3VmZmljaWVudCBhY3RpdmUgdm90ZXJzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4hCgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQkQ2FuZGlkYXRlECxKdWRnZW1lbnRJZAE4HERlcG9zaXQBJQosQmxvY2tOdW1iZXIBOCRBY2NvdW50SWQBBAEMHEFwcGxpZWQMARBjcmVkKQoBrENyZWRpYmlsaXR5PERlcG9zaXQsIFBlcnNvbmFsSWQsIEFjY291bnRJZD4AARxlbnRyb3B5CAEcRW50cm9weQABNGVudHJvcHlfc2luY2U4ASxCbG9ja051bWJlcgAAACBTZWxlY3RlZCABFHNpbmNlOAEsQmxvY2tOdW1iZXIAARBjcmVkKQoBrENyZWRpYmlsaXR5PERlcG9zaXQsIFBlcnNvbmFsSWQsIEFjY291bnRJZD4AASByZXNlcnZlZCgBKFBlcnNvbmFsSWQAARxlbnRyb3B5CAEcRW50cm9weQABGGRlc2lnbvUJARxJbmtTcGVjAAEoYWxsb2NhdGlvbi0KAShBbGxvY2F0aW9uAAEcanVkZ2luZwkDAUxPcHRpb248SnVkZ2VtZW50SWQ+AAEYZmFpbGVkOAEcQ291bnRlcgABABhQcm92ZW4QARhkZXNpZ271CQEcSW5rU3BlYwABIHJlc2VydmVkKAEoUGVyc29uYWxJZAABMHdhc19yZWZlcnJlZMgBEGJvb2wAASx3YXNfaW52aXRlZMgBEGJvb2wAAgAAJQoUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAxAEoRjo6QmFsYW5jZQAAKQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0LENyZWRpYmlsaXR5DBxEZXBvc2l0ASUKKFBlcnNvbmFsSWQBKCRBY2NvdW50SWQBBAEMIFJlZmVycmVkBAAoAShQZXJzb25hbElkAAAAHERlcG9zaXQEACUKARxEZXBvc2l0AAEAHEludml0ZWQEAAQBJEFjY291bnRJZAACAAAtCgxkaW5kaXZfcGFsbGV0X3Byb29mX29mX2luaxhwYWxsZXQoQWxsb2NhdGlvbgABDBxJbml0aWFsAAAAIEluaXREb25lAAEAEEZ1bGwAAgAAMQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0GFBlcnNvbgQ8Qm91bmRlZEFjY291bnRzATUKACQBGGRlc2lnbjkKATxPcHRpb248SW5rU3BlYz4AAUBhY3RpdmVfcmVmZXJyYWxzNQoBPEJvdW5kZWRBY2NvdW50cwABYGFsbG93ZWRfcmVmZXJyYWxfdGlja2V0czgBHENvdW50ZXIAATRiYWRfcmVmZXJyYWxzOAEcQ291bnRlcgABUHN1Y2Nlc3NmdWxfcmVmZXJyYWxzOAEcQ291bnRlcgABJHJlZmVycmFsczgBHENvdW50ZXIAASxkZXJpdmF0aXZlczgBHENvdW50ZXIAARhiYW5uZWTIARBib29sAAFgcGVuZGluZ19yZWZlcnJhbF9yZXdhcmRzOAEcQ291bnRlcgAANQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEEBFMAAAQAzAEYVmVjPFQ+AAA5CgQYT3B0aW9uBARUAfUJAQgQTm9uZQAAABBTb21lBAD1CQAAAQAAPQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFBCgRTAAAEAEUKARhWZWM8VD4AAEEKDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldDhSZWZlcnJhbFRpY2tldAQYVGlja2V0AQQABAEYdGlja2V0BAEYVGlja2V0AABFCgAAAkEKAEkKDGRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rGHBhbGxldBhGYW1pbHkAAAgBEGtpbmRpBAEoRmFtaWx5S2luZAABCGlkCAEgRmFtaWx5SWQAAE0KAAAECC0DLQMAUQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0MERlc2lnblN0YXR1cwABCCBSZXNlcnZlZAAAACRDb21taXR0ZWQAAQAAVQoAAAQIBAQAWQoMZGluZGl2X3BhbGxldF9wcm9vZl9vZl9pbmsYcGFsbGV0FEVycm9yBARUAAGgKEluUHJvZ3Jlc3MAAATMQWNjb3VudCBpcyBhbHJlYWR5IGFwcGx5aW5nIHRvIG1ha2UgYSBwcm9vZi1vZi1pbmsuKE5vUmVmZXJyYWwAAQR4QWNjb3VudCBoYXMgbm90IGJlZW4gcmVmZXJyZWQuKEJhZENvbnRleHQAAgToVGhlIGNhbGxiYWNrIGNvbnRleHQgaXMgaW52YWxpZDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLkxVbmV4cGVjdGVkSnVkZ2VtZW50AAMEIQFUaGUgaW5jb21pbmcganVkZ2VtZW50IElEIGlzIG5vdCB3aGF0IHdlIHdlcmUgZXhwZWN0aW5nIGZvciB0aGUgYWNjb3VudC4YTm9BcmdzAAQEuE5vIGFyZ3VtZW50cyB3ZXJlIHN1cHBsaWVkIHdpdGggdGhlIGp1ZGdlbWVudC4oTm90QXBwbGllZAAFBMxUaGUgYWNjb3VudCBoYXMgbm90IGFwcGxpZWQgdG8gbWFrZSBhIHByb29mLW9mLWluay4sTm90U2VsZWN0ZWQABgSwVGhlIGNhbmRpZGF0ZSBoYXMgbm90IGNvbW1pdHRlZCB0byBhIGRlc2lnbi4kTm90UHJvdmVuAAcErFRoZSBjYW5kaWRhdGUgZGlkIG5vdCBwcm92ZSB0aGVtc2VsdmVzIHlldC44QWxyZWFkeVN0YXJ0ZWQACATIVGhlIGNhbmRpZGF0ZSBoYXMgYWxyZWFkeSBzdGFydGVkIHRoZWlyIGp1ZGdlbWVudC4oT3V0T2ZSYW5nZQAJBIBUaGUgcGVyc29uYWwgSUQgaXMgbm90IGluIHJhbmdlLjBBbHJlYWR5VGFrZW4ACgScVGhlIHBlcnNvbmFsIElEIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uPE5vTW9yZVJlZmVycmFscwALBLhUaGUgcGVyc29uIGhhcyBubyBtb3JlIHJlZmVycmFscyBsZWZ0IHRvIGdpdmUuIFRvb0Vhcmx5AAwEYFRoZSByZXJvbGwgaXMgdG9vIGVhcmx5LjREZXNpZ25JbnZhbGlkAA0EoFRoZSByZWZlcnJlcidzIGRlc2lnbiBpcyBub3QgcHJvY2VkdXJhbC4sRGVzaWduVGFrZW4ADgScVGhlIHJlZmVycmVyJ3MgZGVzaWduIGlzIGFscmVhZHkgdGFrZW4uJEJhZFBhcmVudAAPBBUBVGhlIHJlZmVycmVyIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgcGVyc29uLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uJEJhZEZhbWlseQAQBIBUaGUgZGVzaWduIGZhbWlseSBkb2Vzbid0IGV4aXN0LixXcm9uZ0ZhbWlseQARBLRUaGUgZGVzaWduIGZhbWlseSBpcyBpbnZhbGlkIGZvciB0aGlzIGNob2ljZS4sSW5kZXhUb29CaWcAEgRBAVRoZSBpbmRleCBvZiB0aGUgZGVzaWduIG9yIHZhcmlhbnQgaXMgYmV5b25kIHRoZSBhbGxvd2VkIG1heGltdW0gZm9yIHRoZSBmYW1pbHkuEEJ1c3kAEwT4VGhlIHN5c3RlbSBpcyBidXN5IHdpdGggdG9vIG1hbnkgY29tbWl0bWVudHM7IHRyeSBhZ2FpbiBsYXRlci4YQmFubmVkABQEqFRoZSBwZXJzb24gaGFzIGJlZW4gYmFubmVkIGZyb20gcmVmZXJyaW5nLihJbXByb2JhYmxlABUEJQFUaGUgY2FuZGlkYXRlIGhhcyBub3QgZGVtb25zdHJhdGVkIHByb2JhYmx5IHRocm91Z2ggdGhlIGluaXRpYWwgZXZpZGVuY2UuKElkUmVzZXJ2ZWQAFgTAVGhlIHBlcnNvbmFsIGlkZW50aXR5IGhhcyBhbHJlYWR5IGJlZW4gcmVzZXJ2ZWQuGElkVXNlZAAXBOhUaGUgcGVyc29uYWwgaWRlbnRpdHkgaXMgYWxyZWFkeSB0YWtlbiBieSBhIHByb3ZlbiBwZXJzb24uNEludmFsaWRUaWNrZXQAGAR8VGhlIHRpY2tldCBwcm92aWRlZCBpcyBpbnZhbGlkLiBOb1RpY2tldAAZBPBUaGUgY2FsbGVyIGhhcyBub3QgcHJvdmlkZWQgYSByZWZlcnJhbCBvciBpbnZpdGF0aW9uIHRpY2tldC40Tm90QXV0aG9yaXplZAAaBKRUaGUgYWNjb3VudCBpcyBub3QgYXV0aG9yaXplZCB0byBkbyB0aGlzLiROb3RQZXJzb24AGwSQVGhlIHBlcnNvbmFsIGlkZW50aXR5IGRvZXNuJ3QgZXhpc3QuRFJlZmVycmVkQ2FuZGlkYXRlABwEXQFUaGUgY2FuZGlkYXRlIGlzIHJlZmVycmVkLiBCdXQgdGhlIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2FuZGlkYXRlIHRvIG5vdCBiZSByZWZlcnJlZC5QTm90UmVmZXJyZWRDYW5kaWRhdGUAHQRdAVRoZSBjYW5kaWRhdGUgaXMgbm90IHJlZmVycmVkLiBCdXQgdGhlIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgY2FuZGlkYXRlIHRvIGJlIHJlZmVycmVkLkhOb1Jld2FyZFRvUmVnaXN0ZXIAHgSgVGhlcmUgaXMgbm8gcmVmZXJyYWwgcmV3YXJkIHRvIHJlZ2lzdGVyLkBSZXdhcmRUb1JlZ2lzdGVyAB8EBQFUaGVyZSBpcyBhIHBlbmRpbmcgcmVmZXJyYWwgcmV3YXJkIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkIGZpcnN0LiROb0ludml0ZXIAIARETm8gaW52aXRlciBmb3VuZC5ASW52YWxpZFNpZ25hdHVyZQAhBEhJbnZhbGlkIHNpZ25hdHVyZS4kTm9JbnZpdGVzACIEUE5vIGludml0ZSBhdmFpbGFibGUuOEFscmVhZHlJbnZpdGVkACMEWEludml0ZSBpcyBhbHJlYWR5IHNldC4oTm9SZWZlcnJlcgAkBHRUaGUgcmVmZXJyZXIgaXMgbm90IGEgcGVyc29uLjBOb3RQb2lQZXJzb24AJQToVGhlIGluZGl2aWR1YWwgaXMgbm90IGEgcGVyc29uIHJlY29nbml6ZWQgYnkgcHJvb2Ygb2YgaW5rLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAAmBIhUaGUgcHJvb2Ygb2Ygb3duZXJzaGlwIGlzIGludmFsaWQuaEludmFsaWRSZWltYnVyc2VtZW50VmFsdWVzACcElFRoZSByZWltYnVyc2VtZW50IHZhbHVlcyBhcmUgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuXQoAAAQIuQYIAGEKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlczhBcmNoaXZlZFBsYXllcgQsQmxvY2tOdW1iZXIBOAEIIEtpY2thYmxlCAEoZmlyc3RfZ2FtZTgBDHUzMgABOGFyY2hpdmVkX3NpbmNlOAEsQmxvY2tOdW1iZXIAAAAoVW5raWNrYWJsZQQBKGZpcnN0X2dhbWU4AQx1MzIAAQAAZQoMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzGFBsYXllcgQsUGxheURlcG9zaXQBaQoAGAEoZmlyc3RfZ2FtZTgBDHUzMgABKHJlZ2lzdGVyZWTIARBib29sAAEsc2VudF9yZXBvcnTIARBib29sAAEoeWVzX3BlcnNvbgwBCHU4AAE0bm9fbm90X3BlcnNvbgwBCHU4AAEsY3JlZGliaWxpdHltCgF4UGxheWVyQ3JlZGliaWxpdHk8UGxheURlcG9zaXQ+AABpChQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zIGZ1bmdpYmxlREhvbGRDb25zaWRlcmF0aW9uFARBAARGAARSAAREAAhGcAAABADEAShGOjpCYWxhbmNlAABtCgxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXNEUGxheWVyQ3JlZGliaWxpdHkELFBsYXlEZXBvc2l0AWkKAQwcSW52aXRlZAAAAChSZWNvZ25pemVkAAEAHERlcG9zaXQEAGkKASxQbGF5RGVwb3NpdAACAABxCgxEaW5kaXZfcGFsbGV0X2dhbWUUdHlwZXMgR2FtZUluZm8EJEFjY291bnRJZAEEACABFGluZGV4OAEMdTMyAAFEcmVnaXN0cmF0aW9uX2VuZHM4AQx1MzIAAUBzaHVmZmxlX2RlYWRsaW5lOAEMdTMyAAEkZ2FtZV9kYXRlOAEMdTMyAAEscmVwb3J0X2VuZHM4AQx1MzIAARRzdGF0ZXUKAVBHYW1lU3RhdGU8QWNjb3VudElkPgABOG1heF9ncm91cF9zaXplOAEMdTMyAAEYcm91bmRzDAEIdTgAAHUKDERpbmRpdl9wYWxsZXRfZ2FtZRR0eXBlcyRHYW1lU3RhdGUEJEFjY291bnRJZAEEARQwUmVnaXN0cmF0aW9uBAFEbmV4dF9wbGF5ZXJfaW5kZXg4AQx1MzIAAAAcU2h1ZmZsZQQBEHN0ZXB5CgFYU2h1ZmZsZVN0ZXA8QWNjb3VudElkPgABACRSZXBvcnRpbmcEATBwbGF5ZXJfY291bnQ4AQx1MzIAAgA0UGxheWVyUHJvY2VzcwQBOGxhc3RfaXRlcmF0aW9ufQoBiE9wdGlvbjxBY2NvdW50T3JQZXJzb248QWNjb3VudElkPj4AAwAoQ2FuY2VsbGluZwQBOGxhc3RfaXRlcmF0aW9ufQoBiE9wdGlvbjxBY2NvdW50T3JQZXJzb248QWNjb3VudElkPj4ABAAAeQoMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzLFNodWZmbGVTdGVwBCRBY2NvdW50SWQBBAEILFN0ZXAxSW5zZXJ0BAE4bGFzdF9pdGVyYXRpb259CgGIT3B0aW9uPEFjY291bnRPclBlcnNvbjxBY2NvdW50SWQ+PgAAADRTdGVwMlJldHJpZXZlCAFEbmV4dF9wbGF5ZXJfaW5kZXg4AQx1MzIAAUxyZWNvZ25pemVkX2ZpbmlzaGVkyAEQYm9vbAABAAB9CgQYT3B0aW9uBARUAbkGAQgQTm9uZQAAABBTb21lBAC5BgAAAQAAgQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAWQQBGFZlYzxUPgAAhQoAAAQIDDgAiQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAWQQBGFZlYzxUPgAAjQoAAAQIDAgAkQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGZBARTAAAEAJUEARhWZWM8VD4AAJUKDERpbmRpdl9wYWxsZXRfZ2FtZRhwYWxsZXQURXJyb3IEBFQAAWwsR2FtZU9uZ29pbmcAAAQ0R2FtZSBvbmdvaW5nLjhOb1JlZ2lzdHJhdGlvbgABBHhObyByZWdpc3RyYXRpb24gcGhhc2Ugb25nb2luZy5ET3V0ZGF0ZWRHYW1lU2V0dXAAAgRYVGhlIHNldHVwIGlzIG91dGRhdGVkLkBJbnZhbGlkR2FtZVNldHVwAAMEOEludmFsaWQgc2V0dXAuNEludmFsaWRSZXBvcnQABAQ8SW52YWxpZCByZXBvcnQuGE5vR2FtZQAFBEBObyBnYW1lIG9uZ29pbmcuLE5vUmVwb3J0aW5nAAYEYE5vIHJlcG9ydCBwaGFzZSBvbmdvaW5nLjROb3RSZWdpc3RlcmVkAAcEPE5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAAIBGhQbGF5ZXIgYWxyZWFkeSByZWdpc3RlcmVkLkRSZXBvcnRBbHJlYWR5U2VudAAJBFBSZXBvcnQgYWxyZWFkeSBzZW50LhRFYXJseQAKBGxPcGVyYXRpb24gaXMgbm90IHZhbGlkIHlldC5ETm90S2lja2FibGVQbGF5ZXIACwSYVGhlIG9wZXJhdGlvbiBleHBlY3QgYSBwbGF5ZXIgYWNjb3VudC5ATm9BcmNoaXZlZFBsYXllcgAMBGRObyBhcmNoaXZlZCBwbGF5ZXIgZm91bmQuIE5vVGlja2V0AA0EQE5vIHRpY2tldCBmb3VuZC4kTm9JbnZpdGVzAA4EUE5vIGludml0ZSBhdmFpbGFibGUuOEFscmVhZHlJbnZpdGVkAA8EWEludml0ZSBpcyBhbHJlYWR5IHNldC5ATm90QWNjb3VudFBsYXllcgAQBPhOb3QgYW4gYWNjb3VudCBiYXNlZCBwbGF5ZXIsIGV4cGVjdGVkIGFuIGFjY291bnQgYmFzZWQgcGxheWVyLmhVc2VJbnZpdGVCdXRBbHJlYWR5UGxheWluZwARBMhUaGUgcGxheWVyIGNhbid0IHVzZSBhbiBpbnZpdGUgaWYgYWxyZWFkeSBwbGF5aW5nLlBUb29NYW55R2FtZVNjaGVkdWxlcwASBEEBVGhlIG51bWJlciBvZiBleGlzdGluZyBzY2hlZHVsZXMgYW5kIG5ldyBzY2hlZHVsZXMgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBsaW1pdC5MTm9TdWNoR2FtZVNjaGVkdWxlZAATBCkBVGhlIGdhbWUgdGhhdCB3YXMgc3VwcG9zZWQgdG8gYmUgcmVtb3ZlZCB3YXMgbm90IGZvdW5kIGluIHNjaGVkdWxlZCBnYW1lcy6ASW52YWxpZFN0YXRlbWVudEFjY291bnRTaWduYXR1cmUAFASsVGhlIHN0YXRlbWVudCBhY2NvdW50IHNpZ25hdHVyZSBpcyBpbnZhbGlkLnBTdGF0ZW1lbnRBY2NvdW50QWxyZWFkeUluVXNlABUE7FRoZSBzdGF0ZW1lbnQgYWNjb3VudCBpcyBhbHJlYWR5IGluIHVzZWQgYnkgYW5vdGhlciBwbGF5ZXIuZEludGVybmFsRXJyb3JJbnZhbGlkU3RhdGUAFgR0SW50ZXJuYWwgZXJyb3IgaW52YWxpZCBzdGF0ZS5ASW52YWxpZEdhbWVTdGF0ZQAXBPBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgaW4gdGhlIGN1cnJlbnQgZ2FtZSBzdGF0ZS4gTm9QbGF5ZXIAGARATm8gcGxheWVyIGZvdW5kLpBDYW5ub3RPZmZib2FyZFdoaWxlUmVnaXN0ZXJlZEZvckdhbWUAGQTcVGhlIHBsYXllciBjYW5ub3Qgb2ZmYm9hcmQgd2hpbGUgcmVnaXN0ZXJlZCBmb3IgYSBnYW1lLjBJbnZhbGlkU3RhdGUAGgQ0SW52YWxpZCBzdGF0ZQSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6ZCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzLFBhcnRpY2lwYW50BBxCYWxhbmNlAcQAIAEUc2NvcmU4AQx1MzIAARhzdHJlYWudCgEYU3RyZWFrAAFIYXR0ZW5kYW5jZV9oaXN0b3J5oQoBREF0dGVuZGFuY2VIaXN0b3J5AAEYY3JlZGl0xAEcQmFsYW5jZQABKGNhc2hlZF9vdXTIARBib29sAAFIcmVhY2hlZF9wZXJzb25ob29kyAEQYm9vbAABbGhhc19ldmVyX3JlYWNoZWRfcGVyc29uaG9vZMgBEGJvb2wAASxyZWNvZ25pdGlvbqUKASxSZWNvZ25pdGlvbgAAnQoMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlcxhTdHJlYWsAAQggQXR0ZW5kZWQEADgBDHUzMgAAABhBYnNlbnQEADgBDHUzMgABAAChCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzREF0dGVuZGFuY2VIaXN0b3J5AAAEAAwBCHU4AAClCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzLFJlY29nbml0aW9uAAEQUEV4dGVybmFsbHlSZWNvZ25pemVkAAAANE5vdFJlY29nbml6ZWQAAQAkU3VzcGVuZGVkBAAoAShQZXJzb25hbElkAAIAKFJlY29nbml6ZWQEACgBKFBlcnNvbmFsSWQAAwAAqQoAAAQIOLkGAK0KDEhpbmRpdl9wYWxsZXRfc2NvcmUUdHlwZXMsUm91bmRQYXlvdXQEHEJhbGFuY2UBxAAQAURyZW1haW5pbmdfYmFsYW5jZcQBHEJhbGFuY2UAASxwb2ludF9wcmljZcQBHEJhbGFuY2UAASRyZW1haW5kZXLEARxCYWxhbmNlAAEwdG90YWxfcG9pbnRzOAEMdTMyAACxCgxIaW5kaXZfcGFsbGV0X3Njb3JlFHR5cGVzJFJvdW5kSW5mbwgsQmxvY2tOdW1iZXIBOBxCYWxhbmNlAcQACAEkZmluaXNoX2F0OAEsQmxvY2tOdW1iZXIAARhjcmVkaXTEARxCYWxhbmNlAAC1CgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbkKBFMAAAQAvQoBGFZlYzxUPgAAuQoMSGluZGl2X3BhbGxldF9zY29yZRR0eXBlczhQYXlvdXRTY2hlZHVsZQgcQmFsYW5jZQHELEJsb2NrTnVtYmVyATgADAEkcmVtYWluaW5nOAEMdTMyAAFAYW1vdW50X3Blcl9yb3VuZMQBHEJhbGFuY2UAASBkdXJhdGlvbjgBLEJsb2NrTnVtYmVyAAC9CgAAArkKAMEKDEhpbmRpdl9wYWxsZXRfc2NvcmUYcGFsbGV0FEVycm9yBARUAAFUJE5vdFBlcnNvbgAABIxUaGUgY2FsbGluZyBvcmlnaW4gaXMgbm90IGEgcGVyc29uLlxIYXNOb3RSZWFjaGVkUGVyc29uaG9vZAABBIxUaGUgcGVyc29uIGRpZG4ndCByZWFjaCBwZXJzb25ob29kLiBOb1Jld2FyZAACBFBObyByZXdhcmQgYXZhaWxhYmxlLhxOb1Njb3JlAAMEjFRoZSBwZXJzb24gaGFzIG5vIGFzc29jaWF0ZWQgc2NvcmUuKE5vU2NoZWR1bGUABAR0Tm8gcGF5b3V0IHNjaGVkdWxlIGF2YWlsYWJsZS5AVG9vTWFueVNjaGVkdWxlcwAFBLRUb28gbWFueSBwYXlvdXQgc2NoZWR1bGVzIGFscmVhZHkgcmVnaXN0ZXJlZC4oUmVjb2duaXplZAAGBAUBVGhlIHBhcnRpY2lwYW50IGlzIHJlY29nbml6ZWQgb3IgaGFzIGJlZW4gcmVjb2duaXplZCBhcyBhIHBlcnNvbi48Q2FzaE91dENvb2xkb3duAAcEzFRoZSBwYXJ0aWNpcGFudCBoYXMgYWxyZWFkeSBjYXNoZWQgb3V0IGluIHRoaXMgZXJhLmBSb3VuZE9uR29pbmdPck5vU2NoZWR1bGUACASUVGhlIHJvdW5kIGlzIG9uIGdvaW5nIG9yIG5vIHNjaGVkdWxlLhxOb1JvdW5kAAkEhFRoZSBwYXlvdXQgcm91bmQgaGFzIG5vdCBzdGFydGVkLmxCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWQACgTQVGhlIG9yaWdpbiBpcyBuZWl0aGVyIGEgcGVyc29uIG5vciBhIHNpZ25lZCBhY2NvdW50LsBCYWRPcmlnaW5Ob3RQZXJzb25Ob3RTaWduZWROb3RBY2NvdW50UGFydGljaXBhbnQACwQ9AVRoZSBvcmlnaW4gaXMgbmVpdGhlciBhIHBlcnNvbiBub3IgYSBzaWduZWQgYWNjb3VudCBub3IgYW4gYWNjb3VudCBwYXJ0aWNpcGFudC6cQmFkT3JpZ2luTm90U2lnbmVkTm90QWNjb3VudFBhcnRpY2lwYW50AAwECQFUaGUgb3JpZ2luIGlzIG5laXRoZXIgYSBzaWduZWQgYWNjb3VudCBub3IgYW4gYWNjb3VudCBwYXJ0aWNpcGFudC5QQWxyZWFkeVBhcnRpY2lwYXRpbmcADQSkVGhlIHBhcnRpY2lwYW50IGlzIGFscmVhZHkgcGFydGljaXBhdGluZy5ES2V5TXVzdEJlUHJvdmlkZWQADgRkVGhlIGtleSBtdXN0IGJlIHByb3ZpZGVkLlBLZXlNdXN0Tm90QmVQcm92aWRlZAAPBHRUaGUga2V5IG11c3Qgbm90IGJlIHByb3ZpZGVkLlBIYXNSZWFjaGVkUGVyc29uaG9vZAAQBIxIYXMgcmVhY2hlZCBwZXJzb25ob29kIGluIHRoZSBwYXN0LlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAARBIhUaGUgcHJvb2Ygb2Ygb3duZXJzaGlwIGlzIGludmFsaWQuOFdpbmRvd1Rvb0xhcmdlABIEPQFBbiBhYnNlbmNlIGdyYWNlIHRpZXIgaGFzIGEgd2luZG93IGV4Y2VlZGluZyB0aGUgbWF4aW11bSB0cmFja2FibGUgaGlzdG9yeSAoOCkuVEFsbG93ZWRNaXNzZXNUb29MYXJnZQATBCEBVGhlIGFsbG93ZWQgbWlzc2VzIG11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSB3aW5kb3cgKG9yIGJvdGggemVybykuRFNjaGVkdWxlTm90U29ydGVkABQE+FRpZXJzIG11c3QgYmUgc29ydGVkIGJ5IGFzY2VuZGluZyBgcG9wdWxhdGlvbl9zaXplX3RocmVzaG9sZGAuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LsUKDFhpbmRpdl9wYWxsZXRfZHVtbXlfZGltGHBhbGxldBhSZWNvcmQEDEtleQFRBAAIAQxrZXlRBAEMS2V5AAEkc3VzcGVuZGVkyAEQYm9vbAAAyQoMWGluZGl2X3BhbGxldF9kdW1teV9kaW0YcGFsbGV0FEVycm9yBARUAAEQJE5vdFBlcnNvbgAABNxUaGUgcGVyc29uYWwgSUQgZG9lcyBub3QgYmVsb25nIHRvIGEgcmVjb2duaXplZCBwZXJzb24uME5vdFN1c3BlbmRlZAABBNhUaGUgcGVyc29uYWwgSUQgZG9lcyBub3QgYmVsb25nIHRvIGEgc3VzcGVuZGVkIHBlcnNvbi4sTm90UmVzZXJ2ZWQAAgTkVGhlIHBlcnNvbmFsIElEIGlzIG5vdCByZXNlcnZlZCBhbmQgYXdhaXRpbmcgcmVjb2duaXRpb24uNFRvb01hbnlQZW9wbGUAAwTAVGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWFueSBwZW9wbGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ls0KDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXM4TGl0ZVBlcnNvbkluZm8IGE1lbWJlcgFRBBhNZXRob2QB0QoACAEwcmluZ192cmZfa2V5UQQBGE1lbWJlcgABGG1ldGhvZNEKARhNZXRob2QAANEKDGBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGUUdHlwZXNEUmVjb2duaXRpb25NZXRob2QEHEFjY291bnQBBAEEMFVuaXF1ZURldmljZQQABAEcQWNjb3VudAAAAADVCgxgaW5kaXZfcGFsbGV0X3Blb3BsZV9saXRlGHBhbGxldBRFcnJvcgQEVAABEFhOb0F0dGVzdGF0aW9uQWxsb3dhbmNlAAAEZE5vIGF0dGVzdGF0aW9uIGFsbG93YW5jZS5sSW52YWxpZEF0dGVzdGF0aW9uU2lnbmF0dXJlAAEE8FRoZSBzaWduYXR1cmUgY3JlYXRlZCBieSB0aGUgY2FuZGlkYXRlJ3MgYWNjb3VudCBpcyBpbnZhbGlkLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAACBAUBVGhlIHNpZ25hdHVyZSBjcmVhdGVkIGJ5IHRoZSBjYW5kaWRhdGUncyByaW5nIHZyZiBrZXkgaXMgaW52YWxpZC5EQWxyZWFkeVJlZ2lzdGVyZWQAAwSQVGhlIGNhbmRpZGF0ZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LtkKDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzFHR5cGVzMENvbnN1bWVySW5mbwQEVAAAFAE4aWRlbnRpZmllcl9rZXk1BAFcQ29tbXVuaWNhdGlvbklkZW50aWZpZXIAATRmdWxsX3VzZXJuYW1l3QQBQE9wdGlvbjxVc2VybmFtZT4AATRsaXRlX3VzZXJuYW1lOQQBIFVzZXJuYW1lAAEsY3JlZGliaWxpdHndCgEsQ3JlZGliaWxpdHkAAUBzdG10X3N0b3JlX3Nsb3Rz4QoBRFN0bXRTdG9yZVNsb3RzPFQ+AADdCgxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlcyxDcmVkaWJpbGl0eQABCBBMaXRlAAAAGFBlcnNvbgwBFGFsaWFzCAEUQWxpYXMAASxsYXN0X3VwZGF0ZSgBDHU2NAABHGRlbW90ZWTIARBib29sAAEAAOEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB5QoEUwAABADpCgEYVmVjPFQ+AADlCgxYaW5kaXZfcGFsbGV0X3Jlc291cmNlcxR0eXBlczRTdG10U3RvcmVTbG90BARUAAEIIE9jY3VwaWVkCAEoYWNjb3VudF9pZAQBMFQ6OkFjY291bnRJZAABFHNpbmNlKAEMdTY0AAAAEEZyZWUAAQAA6QoAAALlCgDtCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAfEKBFMAAAQA9QoBGFZlYzxUPgAA8QoMWGluZGl2X3BhbGxldF9yZXNvdXJjZXMUdHlwZXNUUmVzZXJ2YXRpb25RdWV1ZUVudHJ5BBxBY2NvdW50AQQACAEcYWNjb3VudAQBHEFjY291bnQAASRqb2luZWRfYXQoAQx1NjQAAPUKAAAC8QoA+QoMSHNwX3N0YXRlbWVudF9zdG9yZSxydW50aW1lX2FwaThWYWxpZFN0YXRlbWVudAAACAEkbWF4X2NvdW50OAEMdTMyAAEgbWF4X3NpemU4AQx1MzIAAP0KDFhpbmRpdl9wYWxsZXRfcmVzb3VyY2VzGHBhbGxldBRFcnJvcgQEVAABUDxJbnZhbGlkVXNlcm5hbWUAAAScVXNlcm5hbWUgZG9lcyBub3QgZml0IHRoZSByZXF1aXJlbWVudHMuNFVzZXJuYW1lVGFrZW4AAQRoVXNlcm5hbWUgaXMgYWxyZWFkeSB0YWtlbi5EQWxyZWFkeVJlZ2lzdGVyZWQAAgR8Q29uc3VtZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxJbnZhbGlkUHJvb2ZPZk93bmVyc2hpcAADBJxQcm92aWRlZCBwcm9vZiBvZiBvd25lcnNoaXAgaXMgaW52YWxpZC40Tm90UmVnaXN0ZXJlZAAEBJxQZXJzb24gaXMgbm90IHJlZ2lzdGVyZWQgYXMgYSBjb25zdW1lci40Tm90RnVsbFBlcnNvbgAFBHhDb25zdW1lciBpcyBub3QgYSBmdWxsIHBlcnNvbi40VG91Y2hOb3RSZWFkeQAGBMxBdHRlbXB0ZWQgdG8gdXBkYXRlIHBlcnNvbiBhdXRob3JpemF0aW9uIHRvbyBlYXJseS40Tm9SZXNlcnZhdGlvbgAHBGhSZXNlcnZhdGlvbiBpcyBub3QgYWN0aXZlLlBOb3RSZXNlcnZhdGlvbkhvbGRlcgAIBBUBVGhlIGxpbmtlZCBsaXRlIGlkZW50aXR5IGlzIG5vdCB0aGUgYWN0aXZlIGhvbGRlciBvZiB0aGUgcmVzZXJ2YXRpb24uYFVzZXJuYW1lUmVzZXJ2YXRpb25UYWtlbgAJBORUaGUgdXNlcm5hbWUgaW4gdGhlIHJlc2VydmF0aW9uIHJlcXVlc3QgaXMgYWxyZWFkeSB0YWtlbi5AUmVzZXJ2YXRpb25GcmVzaAAKBIBUaGUgcmVzZXJ2YXRpb24gaGFzIG5vdCBleHBpcmVkLkBOb0xpbmtlZElkZW50aXR5AAsEnFRoZXJlIGlzIG5vIGxpdGUgY29uc3VtZXIgdG8gYmUgbGlua2VkLjRBbHJlYWR5TGlua2VkAAwE+FRoZSBsaXRlIGNvbnN1bWVyIGlzIGFscmVhZHkgbGlua2VkIHRvIGEgZnVsbCBwZXJzb24gY29uc3VtZXIuLEludmFsaWRTbG90AA0EqFRoZSByZXF1ZXN0ZWQgc2xvdCBudW1iZXIgaXMgb3V0IG9mIHJhbmdlLmhBY2NvdW50QWxyZWFkeUhhc0FsbG93YW5jZQAOBMRUaGUgYWNjb3VudCBhbHJlYWR5IGhhcyBhbiBhbGxvd2FuY2UgaW4gdGhlIHNsb3QuUFBlcnNvbkF1dGhOb3RFeHBpcmVkAA8EvFRoZSBwZXJzb24ncyBhdXRob3JpemF0aW9uIGhhcyBub3QgZXhwaXJlZCB5ZXQuOEFscmVhZHlEZW1vdGVkABAEkFRoZSBwZXJzb24gaGFzIGFscmVhZHkgYmVlbiBkZW1vdGVkLiRRdWV1ZUZ1bGwAEQSAUXVldWUgZm9yIHRoaXMgdXNlcm5hbWUgaXMgZnVsbC4oTm90SW5RdWV1ZQASBLhBY2NvdW50IGlzIG5vdCBpbiB0aGUgcXVldWUgZm9yIHRoaXMgdXNlcm5hbWUuVEFscmVhZHlIYXNSZXNlcnZhdGlvbgATBNxBY2NvdW50IGFscmVhZHkgaGFzIGEgcmVzZXJ2YXRpb24gZm9yIGFub3RoZXIgdXNlcm5hbWUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgELAAAECPEEOAAFCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQkLBFMAAAQADQsBGFZlYzxUPgAACQsAAAMwAAAADAANCwAAAgkLABELDGxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXIYcGFsbGV0FEVycm9yBARUAAEMNENodW5rTm90Rm91bmQAAASgVGhlIHJlcXVlc3RlZCBjaHVuayBpbmRleCBkb2Vzbid0IGV4aXN0LjRJbnZhbGlkQ2h1bmtzAAEEsFRoZSBwcm92aWRlZCBjaHVuayBkYXRhIGNvdWxkbid0IGJlIGRlY29kZWQuREludmFsaWRDaHVua1JhbmdlAAIE3FRoZSBzdGFydCBpbmRleCBpc24ndCBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIGVuZCBpbmRleC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuFQsMUGluZGl2X3BhbGxldF9tZW1iZXJzFHR5cGVzOENvbGxlY3Rpb25JbmZvCBxBY2NvdW50AQQgTG9jYXRpb24B4AAMARRvd25lchkLAYhDb2xsZWN0aW9uT3duZXI8QWNjb3VudCwgTG9jYXRpb24+AAEQbW9kZR0LASBSaW5nTW9kZQABJHJpbmdfc2l6ZfEEATBSaW5nRXhwb25lbnQAABkLDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlczxDb2xsZWN0aW9uT3duZXIIHEFjY291bnQBBCBMb2NhdGlvbgHgAQggRXh0ZXJuYWwEAOABIExvY2F0aW9uAAAAFExvY2FsBAAEARxBY2NvdW50AAEAAB0LEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5IFJpbmdNb2RlAAEIKEFwcGVuZE9ubHkAAAAgRmxleGlibGUAAQAAIQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQA9QQBGFZlYzxUPgAAJQsAAAQICDgAKQsMUGluZGl2X3BhbGxldF9tZW1iZXJzFHR5cGVzIFJpbmdSb290BARUAAAMARByb290LQsBME1lbWJlcnNPZjxUPgABIHJldmlzaW9uOAE0UmV2aXNpb25JbmRleAABMGludGVybWVkaWF0ZTELAURJbnRlcm1lZGlhdGVPZjxUPgAALQsAAAOAAQAADAAxCwAAA7ABAAAMADULAAAEDAg4OAA5CwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAVEEBFMAAAQATQQBGFZlYzxUPgAAPQsQNGluZGl2X3N1cHBvcnQYdHJhaXRzHHJlYWxpdHkoUmluZ1N0YXR1cwAADAEUdG90YWw4AQx1MzIAASBpbmNsdWRlZDgBDHUzMgABPGltbXV0YWJsZV9zaW5jZRUDASxPcHRpb248dTY0PgAAQQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAWQQBGFZlYzxUPgAARQsMUGluZGl2X3BhbGxldF9tZW1iZXJzFHR5cGVzME1lbWJlclJlY29yZAAACAEoaWRlbnRpZmllcggBKElkZW50aWZpZXIAASBwb3NpdGlvbkkLATBSaW5nUG9zaXRpb24AAEkLEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5MFJpbmdQb3NpdGlvbgABDChPbmJvYXJkaW5nBAEocXVldWVfcGFnZTgBJFBhZ2VJbmRleAAAACBJbmNsdWRlZAwBKHJpbmdfaW5kZXg4ASRSaW5nSW5kZXgAASRyaW5nX3BhZ2U4ASRQYWdlSW5kZXgAATRyaW5nX3Bvc2l0aW9uOAEMdTMyAAEAJFN1c3BlbmRlZAACAABNCxA0aW5kaXZfc3VwcG9ydBh0cmFpdHMccmVhbGl0eUBSaW5nTWVtYmVyc1N0YXRlAAAEARBtb2RlUQsBQFJpbmdNdXRhdGlvbk1vZGUAAFELEDRpbmRpdl9zdXBwb3J0GHRyYWl0cxxyZWFsaXR5QFJpbmdNdXRhdGlvbk1vZGUAAQgoQXBwZW5kT25seQAAACBNdXRhdGluZwQADAEIdTgAAQAAVQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFRBARTAAAEAE0EARhWZWM8VD4AAFkLDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlc0BEZWxldGlvblByb2dyZXNzAAAIAShpZGVudGlmaWVyCAEoSWRlbnRpZmllcgABFHN0YWdlXQsBNERlbGV0aW9uU3RhZ2UAAF0LDFBpbmRpdl9wYWxsZXRfbWVtYmVycxR0eXBlczREZWxldGlvblN0YWdlAAEMNERlbGV0aW5nUmluZ3MAAABcRGVsZXRpbmdPbmJvYXJkaW5nUXVldWUAAQAoRmluYWxpemluZwACAABhCwxQaW5kaXZfcGFsbGV0X21lbWJlcnMYcGFsbGV0FEVycm9yBARUAAFsJE5vdE1lbWJlcgAABNBUaGUgc3VwcGxpZWQgaWRlbnRpZmllciBkb2VzIG5vdCByZXByZXNlbnQgYSBtZW1iZXIuGE5vUm9vdAABBERSaW5nIGhhcyBubyByb290LjBJbnZhbGlkUHJvb2YAAgRUVGhlIHByb29mIGlzIGludmFsaWQuKEluY29tcGxldGUAAwQFAVRoZSByb290IGNhbm5vdCBiZSBmaW5hbGl6ZWQgYXMgdGhlcmUgYXJlIHN0aWxsIHVucHVzaGVkIG1lbWJlcnMuKFN0aWxsRnJlc2gABARgVGhlIHJvb3QgaXMgc3RpbGwgZnJlc2guOFRvb01hbnlNZW1iZXJzAAUEiFRvbyBtYW55IG1lbWJlcnMgaGF2ZSBiZWVuIHB1c2hlZC48S2V5QWxyZWFkeUluVXNlAAYElEtleSBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIG1lbWJlci4sS2V5Tm90Rm91bmQABwSgVGhlIG9sZCBrZXkgd2FzIG5vdCBmb3VuZCB3aGVuIGV4cGVjdGVkLjBDb3VsZE5vdFB1c2gACASQQ291bGQgbm90IHB1c2ggbWVtYmVyIGludG8gdGhlIHJpbmcuLEludmFsaWRSaW5nAAkErFJpbmcgY2Fubm90IGJlIG1lcmdlZCBpZiBpdCdzIHRoZSB0b3AgcmluZy5IU3VzcGVuc2lvbnNQZW5kaW5nAAoE5FJpbmcgY2Fubm90IGJlIGJ1aWx0IHdoaWxlIHRoZXJlIGFyZSBzdXNwZW5zaW9ucyBwZW5kaW5nLlxSaW5nQWJvdmVNZXJnZVRocmVzaG9sZAALBNRSaW5nIGNhbm5vdCBiZSBtZXJnZWQgaWYgaXQncyBub3QgYmVsb3cgMS8yIGNhcGFjaXR5LkhJbnZhbGlkU3VzcGVuc2lvbnMADASgU3VzcGVuc2lvbiBpbmRpY2VzIHByb3ZpZGVkIGFyZSBpbnZhbGlkLkBOb1JlbW92YWxTZXNzaW9uAA0ELQFBIG11dGF0aW5nIGFjdGlvbiB3YXMgcXVldWVkIHdoZW4gdGhlcmUgd2FzIG5vIHJlbW92YWwgc2Vzc2lvbiBpbiBwcm9ncmVzcy5sQ291bGROb3RTdGFydFJlbW92YWxTZXNzaW9uAA4EnEEgcmVtb3ZhbCBzZXNzaW9uIGNvdWxkIG5vdCBiZSBzdGFydGVkLmBSZW1vdmFsU2Vzc2lvbkluUHJvZ3Jlc3MADwToQ2Fubm90IG1lcmdlIHJpbmdzIHdoaWxlIGEgcmVtb3ZhbCBzZXNzaW9uIGlzIGluIHByb2dyZXNzLkxLZXlBbHJlYWR5U3VzcGVuZGVkABAIVQFJbnZhbGlkIHN1c3BlbnNpb24gb2YgYSBrZXkgYmVsb25naW5nIHRvIGEgbWVtYmVyIHdob3NlIGluZGV4IGluIHRoZSByaW5nIGhhcyBhbHJlYWR5uGJlZW4gaW5jbHVkZWQgaW4gdGhlIHBlbmRpbmcgc3VzcGVuc2lvbnMgbGlzdC5USW52YWxpZE9uYm9hcmRpbmdTaXplABEE6FRoZSBvbmJvYXJkaW5nIHNpemUgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHJpbmcgc2l6ZS5ASW52YWxpZE1lbWJlcktleQASBKxUaGUgbWVtYmVyIGtleSBpcyBub3QgdmFsaWQgZm9yIHRoZSBjcnlwdG8uSENvbGxlY3Rpb25Ob3RGb3VuZAATBHhUaGUgY29sbGVjdGlvbiBkb2VzIG5vdCBleGlzdC5cQ29sbGVjdGlvbkFscmVhZHlFeGlzdHMAFAR4VGhlIGNvbGxlY3Rpb24gYWxyZWFkeSBleGlzdHMuSFRvb01hbnlDb2xsZWN0aW9ucwAVBJBUb28gbWFueSBjb2xsZWN0aW9ucyBmb3IgdGhpcyBvd25lci5oSW52YWxpZFJpbmdTaXplRm9yRmxleGlibGUAFgQRAUZsZXhpYmxlIGNvbGxlY3Rpb25zIG11c3QgdXNlIHRoZSBNYXhGbGV4aWJsZVJpbmdFeHBvbmVudCByaW5nIHNpemUuTEludmFsaWRSaW5nRXhwb25lbnQAFwSMVGhlIHJpbmcgZXhwb25lbnQgaXMgbm90IHN1cHBvcnRlZC5MUHJlbWF0dXJlT25ib2FyZGluZwAYBLRJbnN1ZmZpY2llbnQgbWVtYmVycyBpbiB0aGUgcXVldWUgdG8gb25ib2FyZC5sQ29sbGVjdGlvbk1hcmtlZEZvckRlbGV0aW9uABkE9FRoZSBjb2xsZWN0aW9uIGlzIG1hcmtlZCBmb3IgZGVsZXRpb24gYW5kIGNhbm5vdCBiZSBtb2RpZmllZC5ITm90Q29sbGVjdGlvbk93bmVyABoEuFRoZSBjYWxsZXIgaXMgbm90IHRoZSBvd25lciBvZiB0aGUgY29sbGVjdGlvbi4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQsMUGluZGl2X3BhbGxldF9jb2luYWdlGHBhbGxldChMb2NrZWRDb2luAAAIARhyZWFzb25pCwEoTG9ja1JlYXNvbgABFHVudGlsKAEMdTY0AABpCwxQaW5kaXZfcGFsbGV0X2NvaW5hZ2UYcGFsbGV0KExvY2tSZWFzb24AAQQ4RmFpbGVkRGlzcGF0Y2gEARxyZXRyaWVzDAEIdTgAAAAAbQsAAAQMbQM4CABxCwAABAhtAzgAdQsAAAQMODgIAHkLDFBpbmRpdl9wYWxsZXRfY29pbmFnZRhwYWxsZXQURXJyb3IEBFQAAWRQTWVtYmVyS2V5QWxyZWFkeVVzZWQAAABASW52YWxpZE1lbWJlcktleQABADRJbnRlcm5hbEVycm9yAAIAXFJlY3ljbGVyQWxyZWFkeVVubG9hZGVkAAMAUEludmFsaWRDb25zb2xpZGF0aW9uAAQATENvbnNvbGlkYXRpb25Ub29CaWcABQA8Q29pblZhbHVlVG9vQmlnAAYARENvaW5WYWx1ZVRvb1NtYWxsAAcAWENvaW5WYWx1ZUlzTGVzc1RoYW5GZWUACABMQ29pblZhbHVlT3V0T2ZCb3VuZAAJAERJbnZhbGlkQWxpYXNQcm9vZgAKAExOb1VubG9hZGluZ1JlY3ljbGVyAAsAVFByb29mQW5kQWxpYXNNaXNtYXRjaAAMADhOb3RoaW5nVG9CdWlsZAANADBUb29NYW55UmluZ3MADgBUQWRkcmVzc0FscmVhZHlIYXNDb2luAA8AXEludmFsaWRQcm9vZk9mT3duZXJzaGlwABAALEVtcHR5SW5wdXRzABEAQFJlY3ljbGVyTWlzbWF0Y2gAEgQJAVRoZSBmZWUgcmVjeWNsZXIgaW4gdGhlIG9yaWdpbiBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsbCdzIHJlY3ljbGVyLmBJbnN1ZmZpY2llbnRVbmxvYWRGb3JGZWUAEwS8VGhlIHRvdGFsIHVubG9hZGVkIGFtb3VudCBpcyBsZXNzIHRoYW4gdGhlIGZlZS5EQWxpYXNOb3RQcmVtYXJrZWQAFAQ5AVRoZSBmaXJzdCBhbGlhcyB3YXMgbm90IHByZS1tYXJrZWQgYnkgZXh0ZW5zaW9uIChyZXF1aXJlZCBmb3IgRnJvbU91dHB1dCBmZWUpLlxJbnZhbGlkUmVjeWNsZXJSZXZpc2lvbgAVBEkBVGhlIHJlY3ljbGVyIHJldmlzaW9uIGRvZXMgbm90IG1hdGNoIChyZWN5Y2xlciBtYXkgbm90IGV4aXN0IG9yIGhhcyBiZWVuIHJlYnVpbHQpLjBJbnZhbGlkU3BsaXQAFgBERnJlc2hDb2luUmVxdWlyZWQAFwTIVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgYSBmcmVzaCBjb2luIChgYWdlID09IDBgKS5oQ2Fubm90Q29udmVydE5hdGl2ZVRvQXNzZXQAGAAEgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQufQsAAAQICQMJAwCBCwQYT3B0aW9uBARUAT0LAQgQTm9uZQAAABBTb21lBAA9CwAAAQAAhQsEGE9wdGlvbgQEVAFpAwEIEE5vbmUAAAAQU29tZQQAaQMAAAEAAIkLBBhPcHRpb24EBFQBbQMBCBBOb25lAAAAEFNvbWUEAG0DAAABAACNCwyMaW5kaXZfcGFsbGV0X3N0b3JhZ2VfaW5pdGlhbGl6YXRpb24YcGFsbGV0LE9uUG9sbFN0YXRlAAEgIEluYWN0aXZlAAAANENyZWF0aW5nQXNzZXQAAQBAWGNtRnVuZHNUcmFuc2ZlcgACADhWZXJpZnlpbmdGdW5kcwADACxGdW5kaW5nUG90cwAEAGBTY2hlZHVsaW5nTW9iUnVsZVBheW91dHMABQBYU2NoZWR1bGluZ1Njb3JlUGF5b3V0cwAGACRDb21wbGV0ZWQABwAAkQsMoGluZGl2X3BhbGxldF9zdG9yYWdlX2luaXRpYWxpemF0aW9uX2xpdGUYcGFsbGV0LE9uUG9sbFN0YXRlAAEIIEluYWN0aXZlAAAAJENvbXBsZXRlZAABAACVCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAZkLBFMAAAQAnQsBGFZlYzxUPgAAmQsMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldDhTY2hlZHVsZWRFdmVudAgcQXNzZXRJZAHgMEFzc2V0QmFsYW5jZQHEAAgBCGlkOAEcRXZlbnRJZAABEGluZm8dBQGARXZlbnRJbmZvPEFzc2V0SWQsIEFzc2V0QmFsYW5jZT4AAJ0LAAACmQsAoQsMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldEhBY3RpdmVBaXJkcm9wRXZlbnQMHEFzc2V0SWQB4DBBc3NldEJhbGFuY2UBxFRSZWxheUNoYWluQmxvY2tOdW1iZXIBOAAQAQhpZDgBDHUzMgABTG5leHRfcGFydGljaXBhbnRfaWQ4ATRQYXJ0aWNpcGFudElkAAEQaW5mbx0FAYBFdmVudEluZm88QXNzZXRJZCwgQXNzZXRCYWxhbmNlPgABGHN0YXR1c6ULAbxBY3RpdmVBaXJkcm9wRXZlbnRTdGF0dXM8UmVsYXlDaGFpbkJsb2NrTnVtYmVyPgAApQsMUGluZGl2X3BhbGxldF9haXJkcm9wGHBhbGxldGBBY3RpdmVBaXJkcm9wRXZlbnRTdGF0dXMEVFJlbGF5Q2hhaW5CbG9ja051bWJlcgE4ARQsUmVnaXN0ZXJpbmcAAABgV2FpdGluZ0ZvckVudHJvcHlUb0J1aWxkBAFAc3RhcnRlZF9hdF9yY19ibjgBVFJlbGF5Q2hhaW5CbG9ja051bWJlcgABADhEcmF3aW5nV2lubmVycwQBHGVudHJvcHkIASBbdTg7IDMyXQACADBEaXN0cmlidXRpbmcAAwA8Q2xlYXJpbmdTdG9yYWdlAAQAAKkLDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAFkEARhWZWM8VD4AAK0LAAAECAgEALELDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAFkEARhWZWM8VD4AALULAAAECAQ4ALkLAAAECODEAL0LDFBpbmRpdl9wYWxsZXRfYWlyZHJvcBhwYWxsZXQ8UGFzdEFpcmRyb3BJbmZvCBxBc3NldElkAeAwQXNzZXRCYWxhbmNlAcQAFAEUcHJpemUhBQGMQWlyZHJvcFByaXplPEFzc2V0SWQsIEFzc2V0QmFsYW5jZT4AAUxyZWdpc3RyYXRpb25fc3RhcnRzOAEMdTMyAAFUcmVnaXN0cmF0aW9uX2R1cmF0aW9uOAEMdTMyAAFIdG90YWxfcGFydGljaXBhbnRzOAEMdTMyAAEcd2lubmVyc8ELAaBCb3VuZGVkVmVjPEFsaWFzLCBDb25zdFUzMjxNQVhfV0lOTkVSUz4+AADBCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAD1BAEYVmVjPFQ+AADFCwxQaW5kaXZfcGFsbGV0X2FpcmRyb3AYcGFsbGV0FEVycm9yBARUAAEkNE5vQWN0aXZlRXZlbnQAAARgTm8gYWN0aXZlIGFpcmRyb3AgZXZlbnQuKE5vdEFQZXJzb24AAQRsVGhlIG9yaWdpbiBpcyBub3QgYSBwZXJzb24uWEFsaWFzQWxyZWFkeVJlZ2lzdGVyZWQAAgSAVGhlIGFsaWFzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5wSW52YWxpZEV2ZW50UmVnaXN0cmF0aW9uVGltZQADBJxUaGUgZXZlbnQgcmVnaXN0cmF0aW9uIHRpbWUgaXMgaW52YWxpZC5UUGFydGljaXBhbnRJZE92ZXJmbG93AAQEYFBhcnRpY2lwYW50IElEIG92ZXJmbG93LlhOb1ByaXplVG9DbGFpbUZvckV2ZW50AAUE0FRoZSBwYXJ0aWNpcGFudCBoYXMgbm8gcHJpemUgdG8gY2xhaW0gZm9yIHRoZSBldmVudC4wTm9FdmVudEZvdW5kAAYEYFRoZSBldmVudCBkb2Vzbid0IGV4aXN0LjBTY2hlZHVsZUZ1bGwABwRUVGhlIHNjaGVkdWxlIGlzIGZ1bGwuiFByaXplTXVzdEJlTW9yZU9yRXF1YWxUb01pbkJhbGFuY2UACATcVGhlIHByaXplIG11c3QgYmUgbW9yZSBvciBlcXVhbCB0byB0aGUgbWluaW11bSBiYWxhbmNlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JCwxEcGFsbGV0X21pZ3JhdGlvbnMYcGFsbGV0FEVycm9yBARUAAEEHE9uZ29pbmcAAAToVGhlIG9wZXJhdGlvbiBjYW5ub3QgY29tcGxldGUgc2luY2Ugc29tZSBNQk1zIGFyZSBvbmdvaW5nLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7NCwhIc3BfY29uc2Vuc3VzX3Nsb3RzMFNsb3REdXJhdGlvbgAABAAoAQx1NjQAANELEChzcF9ydW50aW1lHGdlbmVyaWMUYmxvY2skTGF6eUJsb2NrCBhIZWFkZXIBXCRFeHRyaW5zaWMBPQcACAEYaGVhZGVyXAEYSGVhZGVyAAEoZXh0cmluc2ljc9ULAVBWZWM8T3BhcXVlRXh0cmluc2ljPgAA1QsAAALZCwDZCwgoc3BfcnVudGltZTxPcGFxdWVFeHRyaW5zaWMAAAQAGAEcVmVjPHU4PgAA3QsIKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAA4QsIHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAGAEcVmVjPHU4PgAA5QsEGE9wdGlvbgQEVAHhCwEIEE5vbmUAAAAQU29tZQQA4QsAAAEAAOkLDDRmcmFtZV9zdXBwb3J0OHZpZXdfZnVuY3Rpb25zOFZpZXdGdW5jdGlvbklkAAAIARhwcmVmaXjBAQEgW3U4OyAxNl0AARhzdWZmaXjBAQEgW3U4OyAxNl0AAO0LBBhSZXN1bHQIBFQBGARFAfELAQgIT2sEABgAAAAADEVycgQA8QsAAAEAAPELDDRmcmFtZV9zdXBwb3J0OHZpZXdfZnVuY3Rpb25zZFZpZXdGdW5jdGlvbkRpc3BhdGNoRXJyb3IAAQw4Tm90SW1wbGVtZW50ZWQAAAAgTm90Rm91bmQEAOkLAThWaWV3RnVuY3Rpb25JZAABABRDb2RlYwACAAD1CwQYUmVzdWx0CARUAZEGBEUB+QsBCAhPawQAkQYAAAAADEVycgQA+QsAAAEAAPkLDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5YFRyYW5zYWN0aW9uVmFsaWRpdHlFcnJvcgABCBxJbnZhbGlkBAD9CwFISW52YWxpZFRyYW5zYWN0aW9uAAAAHFVua25vd24EAAEMAUhVbmtub3duVHJhbnNhY3Rpb24AAQAA/QsMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlISW52YWxpZFRyYW5zYWN0aW9uAAE0EENhbGwAAAAcUGF5bWVudAABABhGdXR1cmUAAgAUU3RhbGUAAwAgQmFkUHJvb2YABABEQW5jaWVudEJpcnRoQmxvY2sABQBERXhoYXVzdHNSZXNvdXJjZXMABgAYQ3VzdG9tBAAMAQh1OAAHADBCYWRNYW5kYXRvcnkACABMTWFuZGF0b3J5VmFsaWRhdGlvbgAJACRCYWRTaWduZXIACgBUSW5kZXRlcm1pbmF0ZUltcGxpY2l0AAsANFVua25vd25PcmlnaW4ADAAAAQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlIVW5rbm93blRyYW5zYWN0aW9uAAEMMENhbm5vdExvb2t1cAAAAExOb1Vuc2lnbmVkVmFsaWRhdG9yAAEAGEN1c3RvbQQADAEIdTgAAgAABQwIMHNwX2luaGVyZW50czBJbmhlcmVudERhdGEAAAQBEGRhdGEJDAGUQlRyZWVNYXA8SW5oZXJlbnRJZGVudGlmaWVyLCBWZWM8dTg+PgAACQwEIEJUcmVlTWFwCARLAb0BBFYBGAAEAA0MAAAADQwAAAIRDAARDAAABAi9ARgAFQwIMHNwX2luaGVyZW50c1BDaGVja0luaGVyZW50c1Jlc3VsdAAADAEQb2thecgBEGJvb2wAASxmYXRhbF9lcnJvcsgBEGJvb2wAARhlcnJvcnMFDAEwSW5oZXJlbnREYXRhAAAZDAwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eURUcmFuc2FjdGlvblNvdXJjZQABDBxJbkJsb2NrAAAAFExvY2FsAAEAIEV4dGVybmFsAAIAAB0MBBhSZXN1bHQIBFQBIQwERQH5CwEICE9rBAAhDAAAAAAMRXJyBAD5CwAAAQAAIQwMKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlAVmFsaWRUcmFuc2FjdGlvbgAAFAEgcHJpb3JpdHkoAUxUcmFuc2FjdGlvblByaW9yaXR5AAEgcmVxdWlyZXM0AUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXM0AUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEkbG9uZ2V2aXR5KAFQVHJhbnNhY3Rpb25Mb25nZXZpdHkAASRwcm9wYWdhdGXIARBib29sAAAlDAQYT3B0aW9uBARUASkMAQgQTm9uZQAAABBTb21lBAApDAAAAQAAKQwAAAItDAAtDAAABAgYgQgAMQwMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzTFJ1bnRpbWVEaXNwYXRjaEluZm8IHEJhbGFuY2UBxBhXZWlnaHQB1QEADAEYd2VpZ2h01QEBGFdlaWdodAABFGNsYXNz8QUBNERpc3BhdGNoQ2xhc3MAASxwYXJ0aWFsX2ZlZcQBHEJhbGFuY2UAADUMDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlcyhGZWVEZXRhaWxzBBxCYWxhbmNlAcQACAE0aW5jbHVzaW9uX2ZlZTkMAXRPcHRpb248SW5jbHVzaW9uRmVlPEJhbGFuY2U+PgABDHRpcMQBHEJhbGFuY2UAADkMBBhPcHRpb24EBFQBPQwBCBBOb25lAAAAEFNvbWUEAD0MAAABAAA9DAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMwSW5jbHVzaW9uRmVlBBxCYWxhbmNlAcQADAEgYmFzZV9mZWXEARxCYWxhbmNlAAEcbGVuX2ZlZcQBHEJhbGFuY2UAAUxhZGp1c3RlZF93ZWlnaHRfZmVlxAEcQmFsYW5jZQAAQQwEGFJlc3VsdAgEVAFFDARFAUkMAQgIT2sEAEUMAAAAAAxFcnIEAEkMAAABAABFDAAAAhEDAEkMDEB4Y21fcnVudGltZV9hcGlzEGZlZXMURXJyb3IAARg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEATFdlaWdodE5vdENvbXB1dGFibGUAAgBMVW5oYW5kbGVkWGNtVmVyc2lvbgADADRBc3NldE5vdEZvdW5kAAQAKFVucm91dGFibGUABQAATQwEGFJlc3VsdAgEVAHVAQRFAUkMAQgIT2sEANUBAAAAAAxFcnIEAEkMAAABAABRDAQYUmVzdWx0CARUAcQERQFJDAEICE9rBADEAAAAAAxFcnIEAEkMAAABAABVDAQYUmVzdWx0CARUAdkCBEUBSQwBCAhPawQA2QIAAAAADEVycgQASQwAAAEAAFkMBBhSZXN1bHQIBFQBBARFAV0MAQgIT2sEAAQAAAAADEVycgQAXQwAAAEAAF0MDEB4Y21fcnVudGltZV9hcGlzLGNvbnZlcnNpb25zFEVycm9yAAEILFVuc3VwcG9ydGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQAAYQwMSHNwX3N0YXRlbWVudF9zdG9yZSxydW50aW1lX2FwaTxTdGF0ZW1lbnRTb3VyY2UAAQwUQ2hhaW4AAAAcTmV0d29yawABABRMb2NhbAACAABlDAhIc3Bfc3RhdGVtZW50X3N0b3JlJFN0YXRlbWVudAAAHAEUcHJvb2ZpDAE0T3B0aW9uPFByb29mPgABOGRlY3J5cHRpb25fa2V5FQYBVE9wdGlvbjxEZWNyeXB0aW9uS2V5PgABHGNoYW5uZWwVBgE8T3B0aW9uPENoYW5uZWw+AAEgcHJpb3JpdHkJAwEsT3B0aW9uPHUzMj4AAShudW1fdG9waWNzDAEIdTgAARh0b3BpY3N1DAFMW1RvcGljOyBNQVhfVE9QSUNTXQABEGRhdGFJBQE8T3B0aW9uPFZlYzx1OD4+AABpDAQYT3B0aW9uBARUAW0MAQgQTm9uZQAAABBTb21lBABtDAAAAQAAbQwISHNwX3N0YXRlbWVudF9zdG9yZRRQcm9vZgABEBxTcjI1NTE5CAEkc2lnbmF0dXJlMQQBIFt1ODsgNjRdAAEYc2lnbmVyCAEgW3U4OyAzMl0AAAAcRWQyNTUxOQgBJHNpZ25hdHVyZTEEASBbdTg7IDY0XQABGHNpZ25lcggBIFt1ODsgMzJdAAEAOFNlY3AyNTZrMUVjZHNhCAEkc2lnbmF0dXJlNQQBIFt1ODsgNjVdAAEYc2lnbmVycQwBIFt1ODsgMzNdAAIAHE9uQ2hhaW4MAQx3aG8IASRBY2NvdW50SWQAAShibG9ja19oYXNoCAEkQmxvY2tIYXNoAAEsZXZlbnRfaW5kZXgoAQx1NjQAAwAAcQwAAAMhAAAADAB1DAAAAwQAAAAIAHkMBBhSZXN1bHQIBFQB+QoERQF9DAEICE9rBAD5CgAAAAAMRXJyBAB9DAAAAQAAfQwMRGluZGl2X3BhbGxldF9nYW1lFHR5cGVzWEludmFsaWRTdGF0ZW1lbnRSZWFzb24AARhATm9SZXBvcnRpbmdQaGFzZQAAAFBTdGF0ZW1lbnRJc05vdFNpZ25lZAABAEBJbnZhbGlkU2lnbmF0dXJlAAIANEludmFsaWRUb3BpYzAIASBleHBlY3RlZBUGAUBPcHRpb248W3U4OyAzMl0+AAEYYWN0dWFsFQYBQE9wdGlvbjxbdTg7IDMyXT4AAwBMQWNjb3VudElzTm90QVBsYXllcgAEAFRQbGF5ZXJJc05vdFJlZ2lzdGVyZWQABQAAgQwIXGN1bXVsdXNfcHJpbWl0aXZlc19jb3JlNENvbGxhdGlvbkluZm8AABgBPHVwd2FyZF9tZXNzYWdlczQBSFZlYzxVcHdhcmRNZXNzYWdlPgABTGhvcml6b250YWxfbWVzc2FnZXO1BwFgVmVjPE91dGJvdW5kSHJtcE1lc3NhZ2U+AAFMbmV3X3ZhbGlkYXRpb25fY29kZYUMAYxPcHRpb248cmVsYXlfY2hhaW46OlZhbGlkYXRpb25Db2RlPgABbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlczgBDHUzMgABOGhybXBfd2F0ZXJtYXJrOAFgcmVsYXlfY2hhaW46OkJsb2NrTnVtYmVyAAEkaGVhZF9kYXRhTAEgSGVhZERhdGEAAIUMBBhPcHRpb24EBFQBiQwBCBBOb25lAAAAEFNvbWUEAIkMAAABAACJDAx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAAYARxWZWM8dTg+AACNDAQYUmVzdWx0CARUARAERQEBBwEICE9rBAAQAAAAAAxFcnIEAAEHAAABAACRDAQYT3B0aW9uBARUAQEHAQgQTm9uZQAAABBTb21lBAABBwAAAQAAlQwAAAIBBwCZDAQYUmVzdWx0CARUAfkKBEUBnQwBCAhPawQA+QoAAAAADEVycgQAnQwAAAEAAJ0MDEhzcF9zdGF0ZW1lbnRfc3RvcmUscnVudGltZV9hcGlASW52YWxpZFN0YXRlbWVudAABDCBCYWRQcm9vZgAAABxOb1Byb29mAAEANEludGVybmFsRXJyb3IAAgAAoQwIZG5leHRfcGVvcGxlX3Bhc2VvX3J1bnRpbWUwUnVudGltZUVycm9yAAF4GFN5c3RlbQQAMQcBcGZyYW1lX3N5c3RlbTo6RXJyb3I8UnVudGltZT4AAAA8UGFyYWNoYWluU3lzdGVtBAC9BwG8Y3VtdWx1c19wYWxsZXRfcGFyYWNoYWluX3N5c3RlbTo6RXJyb3I8UnVudGltZT4AAQAgQmFsYW5jZXMEAPUHAXxwYWxsZXRfYmFsYW5jZXM6OkVycm9yPFJ1bnRpbWU+AAoARE9yaWdpblJlc3RyaWN0aW9uBAAJCAG8aW5kaXZfcGFsbGV0X29yaWdpbl9yZXN0cmljdGlvbjo6RXJyb3I8UnVudGltZT4ADQAYQXNzZXRzBAA1CAF0cGFsbGV0X2Fzc2V0czo6RXJyb3I8UnVudGltZT4ADgAwQXNzZXRzSG9sZGVyBABFCAGQcGFsbGV0X2Fzc2V0c19ob2xkZXI6OkVycm9yPFJ1bnRpbWU+AA8AJEFzc2V0UmF0ZQQASQgBhHBhbGxldF9hc3NldF9yYXRlOjpFcnJvcjxSdW50aW1lPgAQAERDb2xsYXRvclNlbGVjdGlvbgQAYQgBpHBhbGxldF9jb2xsYXRvcl9zZWxlY3Rpb246OkVycm9yPFJ1bnRpbWU+ABUAHFNlc3Npb24EAIUIAXhwYWxsZXRfc2Vzc2lvbjo6RXJyb3I8UnVudGltZT4AFgAkWGNtcFF1ZXVlBADBCAGkY3VtdWx1c19wYWxsZXRfeGNtcF9xdWV1ZTo6RXJyb3I8UnVudGltZT4AHgAsUG9sa2Fkb3RYY20EACkJAWhwYWxsZXRfeGNtOjpFcnJvcjxSdW50aW1lPgAfADBNZXNzYWdlUXVldWUEAEkJAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXJyb3I8UnVudGltZT4AIgAcVXRpbGl0eQQATQkBeHBhbGxldF91dGlsaXR5OjpFcnJvcjxSdW50aW1lPgAoACBNdWx0aXNpZwQAXQkBfHBhbGxldF9tdWx0aXNpZzo6RXJyb3I8UnVudGltZT4AKQAQU3VkbwQAYQkBbHBhbGxldF9zdWRvOjpFcnJvcjxSdW50aW1lPgAqABRQcm94eQQAhQkBcHBhbGxldF9wcm94eTo6RXJyb3I8UnVudGltZT4ALAAgSWRlbnRpdHkEANUJAZRpbmRpdl9wYWxsZXRfaWRlbnRpdHk6OkVycm9yPFJ1bnRpbWU+ADIAGFBlb3BsZQQA3QkBjGluZGl2X3BhbGxldF9wZW9wbGU6OkVycm9yPFJ1bnRpbWU+ADMAHE1vYlJ1bGUEAB0KAZRpbmRpdl9wYWxsZXRfbW9iX3J1bGU6OkVycm9yPFJ1bnRpbWU+ADQAKFByb29mT2ZJbmsEAFkKAaRpbmRpdl9wYWxsZXRfcHJvb2Zfb2ZfaW5rOjpFcnJvcjxSdW50aW1lPgA1ABBHYW1lBACVCgGEaW5kaXZfcGFsbGV0X2dhbWU6OkVycm9yPFJ1bnRpbWU+ADcAFFNjb3JlBADBCgGIaW5kaXZfcGFsbGV0X3Njb3JlOjpFcnJvcjxSdW50aW1lPgA4ACBEdW1teURpbQQAyQoBmGluZGl2X3BhbGxldF9kdW1teV9kaW06OkVycm9yPFJ1bnRpbWU+ADsAKFBlb3BsZUxpdGUEANUKAaBpbmRpdl9wYWxsZXRfcGVvcGxlX2xpdGU6OkVycm9yPFJ1bnRpbWU+AD4AJFJlc291cmNlcwQA/QoBmGluZGl2X3BhbGxldF9yZXNvdXJjZXM6OkVycm9yPFJ1bnRpbWU+AD8ANENodW5rc01hbmFnZXIEABELAaxpbmRpdl9wYWxsZXRfY2h1bmtzX21hbmFnZXI6OkVycm9yPFJ1bnRpbWU+AEAAHE1lbWJlcnMEAGELAZBpbmRpdl9wYWxsZXRfbWVtYmVyczo6RXJyb3I8UnVudGltZT4AQwAcQ29pbmFnZQQAeQsBkGluZGl2X3BhbGxldF9jb2luYWdlOjpFcnJvcjxSdW50aW1lPgBEABxBaXJkcm9wBADFCwGQaW5kaXZfcGFsbGV0X2FpcmRyb3A6OkVycm9yPFJ1bnRpbWU+AD0AUE11bHRpQmxvY2tNaWdyYXRpb25zBADJCwGEcGFsbGV0X21pZ3JhdGlvbnM6OkVycm9yPFJ1bnRpbWU+AGIAAKwYU3lzdGVtARhTeXN0ZW1MHEFjY291bnQBAQQCBM0FQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELgA4RXh0cmluc2ljQ291bnQAADgEAAS4IFRvdGFsIGV4dHJpbnNpY3MgY291bnQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgBASW5oZXJlbnRzQXBwbGllZAEAyAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLgAsQmxvY2tXZWlnaHQBANkFGAAAAAAAAASIIFRoZSBjdXJyZW50IHdlaWdodCBmb3IgdGhlIGJsb2NrLgBAQWxsRXh0cmluc2ljc0xlbgAAOAQABEEBIFRvdGFsIGxlbmd0aCAoaW4gYnl0ZXMpIGZvciBhbGwgZXh0cmluc2ljcyBwdXQgdG9nZXRoZXIsIGZvciB0aGUgY3VycmVudCBibG9jay4AJEJsb2NrSGFzaAEBBAU4PIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASYIE1hcCBvZiBibG9jayBudW1iZXJzIHRvIGJsb2NrIGhhc2hlcy4ANEV4dHJpbnNpY0RhdGEBAQQFOBgEAAQ9ASBFeHRyaW5zaWNzIGRhdGEgZm9yIHRoZSBjdXJyZW50IGJsb2NrIChtYXBzIGFuIGV4dHJpbnNpYydzIGluZGV4IHRvIGl0cyBkYXRhKS4AGE51bWJlcgEAOBAAAAAABAkBIFRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBiZWluZyBwcm9jZXNzZWQuIFNldCBieSBgZXhlY3V0ZV9ibG9ja2AuAChQYXJlbnRIYXNoAQA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAgSGFzaCBvZiB0aGUgcHJldmlvdXMgYmxvY2suABhEaWdlc3QBAGQEAATwIERpZ2VzdCBvZiB0aGUgY3VycmVudCBibG9jaywgYWxzbyBwYXJ0IG9mIHRoZSBibG9jayBoZWFkZXIuABhFdmVudHMBAN0FBAAcoCBFdmVudHMgZGVwb3NpdGVkIGZvciB0aGUgY3VycmVudCBibG9jay4AHQEgTk9URTogVGhlIGl0ZW0gaXMgdW5ib3VuZCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBuZXZlciBiZSByZWFkIG9uIGNoYWluLtAgSXQgY291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIFBvViBzaXplIG9mIGEgYmxvY2suAC0BIEV2ZW50cyBoYXZlIGEgbGFyZ2UgaW4tbWVtb3J5IHNpemUuIEJveCB0aGUgZXZlbnRzIHRvIG5vdCBnbyBvdXQtb2YtbWVtb3J5/CBqdXN0IGluIGNhc2Ugc29tZW9uZSBzdGlsbCByZWFkcyB0aGVtIGZyb20gd2l0aGluIHRoZSBydW50aW1lLgAoRXZlbnRDb3VudAEAOBAAAAAABLggVGhlIG51bWJlciBvZiBldmVudHMgaW4gdGhlIGBFdmVudHM8VD5gIGxpc3QuACxFdmVudFRvcGljcwEBBAI88QYEACglASBNYXBwaW5nIGJldHdlZW4gYSB0b3BpYyAocmVwcmVzZW50ZWQgYnkgVDo6SGFzaCkgYW5kIGEgdmVjdG9yIG9mIGluZGV4ZXOUIG9mIGV2ZW50cyBpbiB0aGUgYDxFdmVudHM8VD4+YCBsaXN0LgBRASBBbGwgdG9waWMgdmVjdG9ycyBoYXZlIGRldGVybWluaXN0aWMgc3RvcmFnZSBsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0b3BpYy4gVGhpc0UBIGFsbG93cyBsaWdodC1jbGllbnRzIHRvIGxldmVyYWdlIHRoZSBjaGFuZ2VzIHRyaWUgc3RvcmFnZSB0cmFja2luZyBtZWNoYW5pc20gYW5k5CBpbiBjYXNlIG9mIGNoYW5nZXMgZmV0Y2ggdGhlIGxpc3Qgb2YgZXZlbnRzIG9mIGludGVyZXN0LgBZASBUaGUgdmFsdWUgaGFzIHRoZSB0eXBlIGAoQmxvY2tOdW1iZXJGb3I8VD4sIEV2ZW50SW5kZXgpYCBiZWNhdXNlIGlmIHdlIHVzZWQgb25seSBqdXN0TQEgdGhlIGBFdmVudEluZGV4YCB0aGVuIGluIGNhc2UgaWYgdGhlIHRvcGljIGhhcyB0aGUgc2FtZSBjb250ZW50cyBvbiB0aGUgbmV4dCBibG9jawEBIG5vIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCB0aHVzIHRoZSBldmVudCBtaWdodCBiZSBsb3N0LgBITGFzdFJ1bnRpbWVVcGdyYWRlAAD5BgQABFUBIFN0b3JlcyB0aGUgYHNwZWNfdmVyc2lvbmAgYW5kIGBzcGVjX25hbWVgIG9mIHdoZW4gdGhlIGxhc3QgcnVudGltZSB1cGdyYWRlIGhhcHBlbmVkLgBUVXBncmFkZWRUb1UzMlJlZkNvdW50AQDIBAAETQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgYHR5cGUgUmVmQ291bnRgIGlzIGB1MzJgLiBGYWxzZSAoZGVmYXVsdCkgaWYgbm90LgBgVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQDIBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuADhFeGVjdXRpb25QaGFzZQAA6QYEAASIIFRoZSBleGVjdXRpb24gcGhhc2Ugb2YgdGhlIGJsb2NrLgBEQXV0aG9yaXplZFVwZ3JhZGUAAAUHBAAEuCBgU29tZWAgaWYgYSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gYXV0aG9yaXplZC4AYEV4dHJpbnNpY1dlaWdodFJlY2xhaW1lZAEA1QEIAAAcoCBUaGUgd2VpZ2h0IHJlY2xhaW1lZCBmb3IgdGhlIGV4dHJpbnNpYy4AIQEgVGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdW50aWwgdGhlIGVuZCBvZiB0aGUgZXh0cmluc2ljIGV4ZWN1dGlvbi4hASBNb3JlIHByZWNpc2VseSB0aGlzIGluZm9ybWF0aW9uIGlzIHJlbW92ZWQgaW4gYG5vdGVfYXBwbGllZF9leHRyaW5zaWNgLgBxASBMb2dpYyBkb2luZyBzb21lIHBvc3QgZGlzcGF0Y2ggd2VpZ2h0IHJlZHVjdGlvbiBtdXN0IHVwZGF0ZSB0aGlzIHN0b3JhZ2UgdG8gYXZvaWQgZHVwbGljYXRlLCByZWR1Y3Rpb24uAAEkAAHpBQAYMEJsb2NrV2VpZ2h0cwkHiQEHAPIFKgEACwAgSqnRAQIAgAICZc0dAAELwFYN70UBAgDAAQELAJj3Pl0BAgDgAQEAAAJlzR0AAQvA3l9ZugECAGACAQsAIEqp0QECAIACAQcAiFJqdAIAoAACZc0dAAAAAATQIEJsb2NrICYgZXh0cmluc2ljcyB3ZWlnaHRzOiBiYXNlIHZhbHVlcyBhbmQgbGltaXRzLgAsQmxvY2tMZW5ndGgVBzAAADwAAABQAAAAUAAEqCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBibG9jayAoaW4gYnl0ZXMpLgA4QmxvY2tIYXNoQ291bnQ4EAAQAAAEVQEgTWF4aW11bSBudW1iZXIgb2YgYmxvY2sgbnVtYmVyIHRvIGJsb2NrIGhhc2ggbWFwcGluZ3MgdG8ga2VlcCAob2xkZXN0IHBydW5lZCBmaXJzdCkuACBEYldlaWdodB0HQEB4fQEAAAAAAOH1BQAAAAAECQEgVGhlIHdlaWdodCBvZiBydW50aW1lIGRhdGFiYXNlIG9wZXJhdGlvbnMgdGhlIHJ1bnRpbWUgY2FuIGludm9rZS4AHFZlcnNpb24hB8kERG5leHQtcGVvcGxlLXBhc2VvRG5leHQtcGVvcGxlLXBhc2VvAQAAAEJCDwAAAAAAVN1xjVzFMmLUAQAAAATnBSGg09L4AQAAANe92KJyyg1lAgAAAN9qy2iZB2CbBQAAADfjl/x8kfXkAgAAAMzZ3mOWyJnKAQAAAED+OtQB+JWaBgAAANK8mJfu0I8VAwAAAPeLJ4vlP0VMAgAAAKs8BXIpH+uLAQAAALydiZBPW5I/AQAAADfIuxNQqaKoBAAAAPP/FNWrUnBZAwAAAG/1LuhY5sW9AgAAAJ/7UFqnONacAQAAANC6x75KawkgAQAAAJKH+w4CG8hUAQAAAIQ7b4zsgJjHAQAAAOqT4/FvPWliAwAAAPvFd7nXR+/WAQAAAL6fsMkagEbPAQAAAAEAAAABBIQgR2V0IHRoZSBjaGFpbidzIGluLWNvZGUgdmVyc2lvbi4AKFNTNThQcmVmaXgtAwgqABSoIFRoZSBkZXNpZ25hdGVkIFNTNTggcHJlZml4IG9mIHRoaXMgY2hhaW4uADkBIFRoaXMgcmVwbGFjZXMgdGhlICJzczU4Rm9ybWF0IiBwcm9wZXJ0eSBkZWNsYXJlZCBpbiB0aGUgY2hhaW4gc3BlYy4gUmVhc29uIGlzMQEgdGhhdCB0aGUgcnVudGltZSBzaG91bGQga25vdyBhYm91dCB0aGUgcHJlZml4IGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIGl0IGFzcCBhbiBpZGVudGlmaWVyIG9mIHRoZSBjaGFpbi4AATEHABwsUnVudGltZUNhbGwgBIwgVGhlIGFnZ3JlZ2F0ZWQgYFJ1bnRpbWVDYWxsYCB0eXBlLhROb25jZTgESQEgVGhpcyBzdG9yZXMgdGhlIG51bWJlciBvZiBwcmV2aW91cyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc2VuZGVyIGFjY291bnQuEEhhc2g8BJggVGhlIG91dHB1dCBvZiB0aGUgYEhhc2hpbmdgIGZ1bmN0aW9uLhxIYXNoaW5nNQcEIQEgVGhlIGhhc2hpbmcgc3lzdGVtIChhbGdvcml0aG0pIGJlaW5nIHVzZWQgaW4gdGhlIHJ1bnRpbWUgKGUuZy4gQmxha2UyKS4kQWNjb3VudElkBATIIFRoZSB1c2VyIGFjY291bnQgaWRlbnRpZmllciB0eXBlIGZvciB0aGUgcnVudGltZS4UQmxvY2s5BwhhASBUaGUgQmxvY2sgdHlwZSB1c2VkIGJ5IHRoZSBydW50aW1lLiBUaGlzIGlzIHVzZWQgYnkgYGNvbnN0cnVjdF9ydW50aW1lYCB0byByZXRyaWV2ZSB0aGXMIGV4dHJpbnNpY3Mgb3Igb3RoZXIgYmxvY2sgc3BlY2lmaWMgZGF0YSBhcyBuZWVkZWQuLEFjY291bnREYXRh0QUIYQEgRGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudCAob3RoZXIgdGhhbiBub25jZS90cmFuc2FjdGlvbiBjb3VudGVyLCB3aGljaCB0aGlzZCBwYWxsZXQgZG9lcyByZWdhcmRsZXNzKS4AAAAAPFBhcmFjaGFpblN5c3RlbQE8UGFyYWNoYWluU3lzdGVtbERVbmluY2x1ZGVkU2VnbWVudAEAUQcEABhJASBMYXRlc3QgaW5jbHVkZWQgYmxvY2sgZGVzY2VuZGFudHMgdGhlIHJ1bnRpbWUgYWNjZXB0ZWQuIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhcmVhASBhbmNlc3RvcnMgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgYmxvY2sgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbmNsdWRlZCBpbiB0aGUgb2JzZXJ2ZWRMIHJlbGF5LWNoYWluIHN0YXRlLgB1ASBUaGUgc2VnbWVudCBsZW5ndGggaXMgbGltaXRlZCBieSB0aGUgY2FwYWNpdHkgcmV0dXJuZWQgZnJvbSB0aGUgW2BDb25zZW5zdXNIb29rYF0gY29uZmlndXJlZDwgaW4gdGhlIHBhbGxldC4AbEFnZ3JlZ2F0ZWRVbmluY2x1ZGVkU2VnbWVudAAAeQcEAAxpASBTdG9yYWdlIGZpZWxkIHRoYXQga2VlcHMgdHJhY2sgb2YgYmFuZHdpZHRoIHVzZWQgYnkgdGhlIHVuaW5jbHVkZWQgc2VnbWVudCBhbG9uZyB3aXRoIHRoZS0BIGxhdGVzdCBIUk1QIHdhdGVybWFyay4gVXNlZCBmb3IgbGltaXRpbmcgdGhlIGFjY2VwdGFuY2Ugb2YgbmV3IGJsb2NrcyB3aXRokCByZXNwZWN0IHRvIHJlbGF5IGNoYWluIGNvbnN0cmFpbnRzLgBUUGVuZGluZ1ZhbGlkYXRpb25Db2RlAQAYBAAYWQEgSW4gY2FzZSBvZiBhIHNjaGVkdWxlZCB1cGdyYWRlLCB0aGlzIHN0b3JhZ2UgZmllbGQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gY29kZSB0byBiZSQgYXBwbGllZC4APQEgQXMgc29vbiBhcyB0aGUgcmVsYXkgY2hhaW4gZ2l2ZXMgdXMgdGhlIGdvLWFoZWFkIHNpZ25hbCwgd2Ugd2lsbCBvdmVyd3JpdGUgdGhlcQEgW2A6Y29kZWBdW3NwX2NvcmU6OnN0b3JhZ2U6OndlbGxfa25vd25fa2V5czo6Q09ERV0gd2hpY2ggd2lsbCByZXN1bHQgdGhlIG5leHQgYmxvY2sgcHJvY2VzcwkBIHdpdGggdGhlIG5ldyB2YWxpZGF0aW9uIGNvZGUuIFRoaXMgY29uY2x1ZGVzIHRoZSB1cGdyYWRlIHByb2Nlc3MuAEROZXdWYWxpZGF0aW9uQ29kZQAAGAQAFF0BIFZhbGlkYXRpb24gY29kZSB0aGF0IGlzIHNldCBieSB0aGUgcGFyYWNoYWluIGFuZCBpcyB0byBiZSBjb21tdW5pY2F0ZWQgdG8gY29sbGF0b3IgYW5keCBjb25zZXF1ZW50bHkgdGhlIHJlbGF5LWNoYWluLgBlASBUaGlzIHdpbGwgYmUgY2xlYXJlZCBpbiBgb25faW5pdGlhbGl6ZWAgb2YgZWFjaCBuZXcgYmxvY2sgaWYgbm8gb3RoZXIgcGFsbGV0IGFscmVhZHkgc2V0LCB0aGUgdmFsdWUuADhWYWxpZGF0aW9uRGF0YQAASAQADNAgVGhlIFtgUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGFgXSBzZXQgZm9yIHRoaXMgYmxvY2suAHEBIFRoaXMgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0IG9ubHkgb25jZSBieSB0aGUgW2BQYWxsZXQ6OnNldF92YWxpZGF0aW9uX2RhdGFgXSBpbmhlcmVudC4AUERpZFNldFZhbGlkYXRpb25Db2RlAQDIBAAE4CBXZXJlIHRoZSB2YWxpZGF0aW9uIGRhdGEgc2V0IHRvIG5vdGlmeSB0aGUgcmVsYXkgY2hhaW4/AGRMYXN0UmVsYXlDaGFpbkJsb2NrTnVtYmVyAQA4EAAAAAAMHQEgVGhlIHJlbGF5IGNoYWluIGJsb2NrIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgcGFyYWNoYWluIGJsb2NrLgCIIFRoaXMgaXMgdXBkYXRlZCBpbiBgb25fZmluYWxpemVgLgBgVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAQB9BwQAHHUBIEFuIG9wdGlvbiB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIHJlbGF5LWNoYWluIHJlc3RyaWN0cyBzaWduYWxsaW5nIGEgdmFsaWRhdGlvbiBjb2RlIHVwZ3JhZGUuYQEgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgaXMgYFNvbWVgIGFuZCBbYE5ld1ZhbGlkYXRpb25Db2RlYF0gaXMgYFNvbWVgIHRoZW4gdGhlIHByb2R1Y2VkbCBjYW5kaWRhdGUgd2lsbCBiZSBpbnZhbGlkLgBxASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBhIG1pcnJvciBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGZyb20gdGhlbQEgcmVsYXktY2hhaW4uIFRoaXMgdmFsdWUgaXMgZXBoZW1lcmFsIHdoaWNoIG1lYW5zIGl0IGRvZXNuJ3QgaGl0IHRoZSBzdG9yYWdlLiBUaGlzIHZhbHVlIGlzYCBzZXQgYWZ0ZXIgdGhlIGluaGVyZW50LgA4VXBncmFkZUdvQWhlYWQBAHEHBAAU3CBPcHRpb25hbCB1cGdyYWRlIGdvLWFoZWFkIHNpZ25hbCBmcm9tIHRoZSByZWxheS1jaGFpbi4AcQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgYSBtaXJyb3Igb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHBhcmFjaGFpbiBmcm9tIHRoZW0BIHJlbGF5LWNoYWluLiBUaGlzIHZhbHVlIGlzIGVwaGVtZXJhbCB3aGljaCBtZWFucyBpdCBkb2Vzbid0IGhpdCB0aGUgc3RvcmFnZS4gVGhpcyB2YWx1ZSBpc2Agc2V0IGFmdGVyIHRoZSBpbmhlcmVudC4APFJlbGF5U3RhdGVQcm9vZgAAUAQAGMQgVGhlIHN0YXRlIHByb29mIGZvciB0aGUgbGFzdCByZWxheSBwYXJlbnQgYmxvY2suAG0BIFRoaXMgZmllbGQgaXMgbWVhbnQgdG8gYmUgdXBkYXRlZCBlYWNoIGJsb2NrIHdpdGggdGhlIHZhbGlkYXRpb24gZGF0YSBpbmhlcmVudC4gVGhlcmVmb3JlLE0BIGJlZm9yZSBwcm9jZXNzaW5nIG9mIHRoZSBpbmhlcmVudCwgZS5nLiBpbiBgb25faW5pdGlhbGl6ZWAgdGhpcyBkYXRhIG1heSBiZSBzdGFsZS4ArCBUaGlzIGRhdGEgaXMgYWxzbyBhYnNlbnQgZnJvbSB0aGUgZ2VuZXNpcy4AWFJlbGV2YW50TWVzc2FnaW5nU3RhdGUAAIUHBAAcZQEgVGhlIHNuYXBzaG90IG9mIHNvbWUgc3RhdGUgcmVsYXRlZCB0byBtZXNzYWdpbmcgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgcGFyYWNoYWluIGFzIHBlckggdGhlIHJlbGF5IHBhcmVudC4AbQEgVGhpcyBmaWVsZCBpcyBtZWFudCB0byBiZSB1cGRhdGVkIGVhY2ggYmxvY2sgd2l0aCB0aGUgdmFsaWRhdGlvbiBkYXRhIGluaGVyZW50LiBUaGVyZWZvcmUsTQEgYmVmb3JlIHByb2Nlc3Npbmcgb2YgdGhlIGluaGVyZW50LCBlLmcuIGluIGBvbl9pbml0aWFsaXplYCB0aGlzIGRhdGEgbWF5IGJlIHN0YWxlLgCsIFRoaXMgZGF0YSBpcyBhbHNvIGFic2VudCBmcm9tIHRoZSBnZW5lc2lzLgBESG9zdENvbmZpZ3VyYXRpb24AAJkHBAAYKQEgVGhlIHBhcmFjaGFpbiBob3N0IGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgb2J0YWluZWQgZnJvbSB0aGUgcmVsYXkgcGFyZW50LgBtASBUaGlzIGZpZWxkIGlzIG1lYW50IHRvIGJlIHVwZGF0ZWQgZWFjaCBibG9jayB3aXRoIHRoZSB2YWxpZGF0aW9uIGRhdGEgaW5oZXJlbnQuIFRoZXJlZm9yZSxNASBiZWZvcmUgcHJvY2Vzc2luZyBvZiB0aGUgaW5oZXJlbnQsIGUuZy4gaW4gYG9uX2luaXRpYWxpemVgIHRoaXMgZGF0YSBtYXkgYmUgc3RhbGUuAKwgVGhpcyBkYXRhIGlzIGFsc28gYWJzZW50IGZyb20gdGhlIGdlbmVzaXMuADhMYXN0RG1xTXFjSGVhZAEAoQeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ9CBUaGUgbGFzdCBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGNoYWluIGhlYWQgd2UgaGF2ZSBvYnNlcnZlZC4AZQEgVGhpcyB2YWx1ZSBpcyBsb2FkZWQgYmVmb3JlIGFuZCBzYXZlZCBhZnRlciBwcm9jZXNzaW5nIGluYm91bmQgZG93bndhcmQgbWVzc2FnZXMgY2FycmllZGAgYnkgdGhlIHN5c3RlbSBpbmhlcmVudC4AQExhc3RIcm1wTXFjSGVhZHMBAKUHBAAQSQEgVGhlIG1lc3NhZ2UgcXVldWUgY2hhaW4gaGVhZHMgd2UgaGF2ZSBvYnNlcnZlZCBwZXIgZWFjaCBjaGFubmVsIGluY29taW5nIGNoYW5uZWwuAGUBIFRoaXMgdmFsdWUgaXMgbG9hZGVkIGJlZm9yZSBhbmQgc2F2ZWQgYWZ0ZXIgcHJvY2Vzc2luZyBpbmJvdW5kIGRvd253YXJkIG1lc3NhZ2VzIGNhcnJpZWRgIGJ5IHRoZSBzeXN0ZW0gaW5oZXJlbnQuAGRQcm9jZXNzZWREb3dud2FyZE1lc3NhZ2VzAQA4EAAAAAAMyCBOdW1iZXIgb2YgZG93bndhcmQgbWVzc2FnZXMgcHJvY2Vzc2VkIGluIGEgYmxvY2suAOwgVGhpcyB3aWxsIGJlIGNsZWFyZWQgaW4gYG9uX2luaXRpYWxpemVgIG9mIGVhY2ggbmV3IGJsb2NrLgBwTGFzdFByb2Nlc3NlZERvd253YXJkTWVzc2FnZQAAsQcEAAyUIFRoZSBsYXN0IHByb2Nlc3NlZCBkb3dud2FyZCBtZXNzYWdlLgBdASBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkLgA0SHJtcFdhdGVybWFyawEAOBAAAAAABKAgSFJNUCB3YXRlcm1hcmsgdGhhdCB3YXMgc2V0IGluIGEgYmxvY2suAGBMYXN0UHJvY2Vzc2VkSHJtcE1lc3NhZ2UAALEHBAAMhCBUaGUgbGFzdCBwcm9jZXNzZWQgSFJNUCBtZXNzYWdlLgBdASBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkLgBQSHJtcE91dGJvdW5kTWVzc2FnZXMBALUHBAAMpCBIUk1QIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50IGluIGEgYmxvY2suAOwgVGhpcyB3aWxsIGJlIGNsZWFyZWQgaW4gYG9uX2luaXRpYWxpemVgIG9mIGVhY2ggbmV3IGJsb2NrLgA4VXB3YXJkTWVzc2FnZXMBADQEAAysIFVwd2FyZCBtZXNzYWdlcyB0aGF0IHdlcmUgc2VudCBpbiBhIGJsb2NrLgDwIFRoaXMgd2lsbCBiZSBjbGVhcmVkIGluIGBvbl9pbml0aWFsaXplYCBmb3IgZWFjaCBuZXcgYmxvY2suAFRQZW5kaW5nVXB3YXJkTWVzc2FnZXMBADQEAAQxASBVcHdhcmQgbWVzc2FnZXMgdGhhdCBhcmUgc3RpbGwgcGVuZGluZyBhbmQgbm90IHlldCBzZW50IHRvIHRoZSByZWxheSBjaGFpbi4AUFBlbmRpbmdVcHdhcmRTaWduYWxzAQA0BAAMLQEgVXB3YXJkIHNpZ25hbHMgdGhhdCBhcmUgc3RpbGwgcGVuZGluZyBhbmQgbm90IHlldCBzZW50IHRvIHRoZSByZWxheSBjaGFpbi4A2CBUaGlzIHdpbGwgYmUgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGZvciBlYWNoIGJsb2NrLgBcVXB3YXJkRGVsaXZlcnlGZWVGYWN0b3IBAC0BQAAAZKeztuANAAAAAAAAAAAE5CBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieSBmb3IgVU1QLgCEQW5ub3VuY2VkSHJtcE1lc3NhZ2VzUGVyQ2FuZGlkYXRlAQA4EAAAAAAIZQEgVGhlIG51bWJlciBvZiBIUk1QIG1lc3NhZ2VzIHdlIG9ic2VydmVkIGluIGBvbl9pbml0aWFsaXplYCBhbmQgdGh1cyB1c2VkIHRoYXQgbnVtYmVyIGZvcvAgYW5ub3VuY2luZyB0aGUgd2VpZ2h0IG9mIGBvbl9pbml0aWFsaXplYCBhbmQgYG9uX2ZpbmFsaXplYC4AaFJlc2VydmVkWGNtcFdlaWdodE92ZXJyaWRlAADVAQQACF0BIFRoZSB3ZWlnaHQgd2UgcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jayBmb3IgcHJvY2Vzc2luZyBYQ01QIG1lc3NhZ2VzLiBUaGlzuCBvdmVycmlkZXMgdGhlIGFtb3VudCBzZXQgaW4gdGhlIENvbmZpZyB0cmFpdC4AZFJlc2VydmVkRG1wV2VpZ2h0T3ZlcnJpZGUAANUBBAAIWQEgVGhlIHdlaWdodCB3ZSByZXNlcnZlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrIGZvciBwcm9jZXNzaW5nIERNUCBtZXNzYWdlcy4gVGhpc7ggb3ZlcnJpZGVzIHRoZSBhbW91bnQgc2V0IGluIHRoZSBDb25maWcgdHJhaXQuAGBDdXN0b21WYWxpZGF0aW9uSGVhZERhdGEAABgEAAwpASBBIGN1c3RvbSBoZWFkIGRhdGEgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYXMgcmVzdWx0IG9mIGB2YWxpZGF0ZV9ibG9ja2AuABEBIFNlZSBgUGFsbGV0OjpzZXRfY3VzdG9tX3ZhbGlkYXRpb25faGVhZF9kYXRhYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4AAUAAAREGAAQoU2VsZlBhcmFJZJwQFBQAAAS4IFJldHVybnMgdGhlIHBhcmFjaGFpbiBJRCB3ZSBhcmUgcnVubmluZyB3aXRoLgABvQcAAAABAAAkVGltZXN0YW1wASRUaW1lc3RhbXAIDE5vdwEAKCAAAAAAAAAAAASgIFRoZSBjdXJyZW50IHRpbWUgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAkRGlkVXBkYXRlAQDIBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgABsAAABDRNaW5pbXVtUGVyaW9kKCAAAAAAAAAAABiMIFRoZSBtaW5pbXVtIHBlcmlvZCBiZXR3ZWVuIGJsb2Nrcy4ATQEgQmUgYXdhcmUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byB0aGUgKmV4cGVjdGVkKiBwZXJpb2QgdGhhdCB0aGUgYmxvY2sgcHJvZHVjdGlvbkkBIGFwcGFyYXR1cyBwcm92aWRlcy4gWW91ciBjaG9zZW4gY29uc2Vuc3VzIHN5c3RlbSB3aWxsIGdlbmVyYWxseSB3b3JrIHdpdGggdGhpcyB0b2EBIGRldGVybWluZSBhIHNlbnNpYmxlIGJsb2NrIHRpbWUuIEZvciBleGFtcGxlLCBpbiB0aGUgQXVyYSBwYWxsZXQgaXQgd2lsbCBiZSBkb3VibGUgdGhpc3AgcGVyaW9kIG9uIGRlZmF1bHQgc2V0dGluZ3MuAAAEGE1vbWVudCgEmCBUeXBlIHVzZWQgZm9yIGV4cHJlc3NpbmcgYSB0aW1lc3RhbXAuAAIAADRQYXJhY2hhaW5JbmZvATRQYXJhY2hhaW5JbmZvBCxQYXJhY2hhaW5JZAEAnBBkAAAAAAABuAAAAAAAAAMAADRXZWlnaHRSZWNsYWltAAAAAAAAAAQIgQEgUGFsbGV0IHRvIHVzZSBhbG9uZ3NpZGUgdGhlIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiBbYFN0b3JhZ2VXZWlnaHRSZWNsYWltYF0sIHRoZSBwYWxsZXQgcHJvdmlkZXOMIHdlaWdodCBpbmZvcm1hdGlvbiBhbmQgYmVuY2htYXJrcy4AIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAxEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLgBASW5hY3RpdmVJc3N1YW5jZQEAxEAAAAAAAAAAAAAAAAAAAAAABAkBIFRoZSB0b3RhbCB1bml0cyBvZiBvdXRzdGFuZGluZyBkZWFjdGl2YXRlZCBiYWxhbmNlIGluIHRoZSBzeXN0ZW0uABxBY2NvdW50AQEEAgTRBQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLgAUTG9ja3MBAQQCBMEHBAAQuCBBbnkgbGlxdWlkaXR5IGxvY2tzIG9uIHNvbWUgYWNjb3VudCBiYWxhbmNlcy4lASBOT1RFOiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB3aGVuIHNldHRpbmcsIGNoYW5naW5nIGFuZCBmcmVlaW5nIGEgbG9jay4ArQEgVXNlIG9mIGxvY2tzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGZyZWV6ZXMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYAAgUmVzZXJ2ZXMBAQQCBNEHBAAMpCBOYW1lZCByZXNlcnZlcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gABRIb2xkcwEBBAIE3QcEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuABxGcmVlemVzAQEEAgTpBwQABIggRnJlZXplIGxvY2tzIG9uIGFjY291bnQgYmFsYW5jZXMuAAG8AAEZBgAQSEV4aXN0ZW50aWFsRGVwb3NpdMRAAMqaOwAAAAAAAAAAAAAAACBBASBUaGUgbWluaW11bSBhbW91bnQgcmVxdWlyZWQgdG8ga2VlcCBhbiBhY2NvdW50IG9wZW4uIE1VU1QgQkUgR1JFQVRFUiBUSEFOIFpFUk8hAFkBIElmIHlvdSAqcmVhbGx5KiBuZWVkIGl0IHRvIGJlIHplcm8sIHlvdSBjYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGBpbnNlY3VyZV96ZXJvX2VkYCBmb3JhASB0aGlzIHBhbGxldC4gSG93ZXZlciwgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2s6IHRoaXMgd2lsbCBvcGVuIHVwIGEgbWFqb3IgRG9TIHZlY3Rvci5ZASBJbiBjYXNlIHlvdSBoYXZlIG11bHRpcGxlIHNvdXJjZXMgb2YgcHJvdmlkZXIgcmVmZXJlbmNlcywgeW91IG1heSBhbHNvIGdldCB1bmV4cGVjdGVkjCBiZWhhdmlvdXIgaWYgeW91IHNldCB0aGlzIHRvIHplcm8uAPAgQm90dG9tIGxpbmU6IERvIHlvdXJzZWxmIGEgZmF2b3VyIGFuZCBtYWtlIGl0IGF0IGxlYXN0IG9uZSEAIE1heExvY2tzOBAyAAAAEPQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2tzIHRoYXQgc2hvdWxkIGV4aXN0IG9uIGFuIGFjY291bnQu3CBOb3Qgc3RyaWN0bHkgZW5mb3JjZWQsIGJ1dCB1c2VkIGZvciB3ZWlnaHQgZXN0aW1hdGlvbi4ArQEgVXNlIG9mIGxvY2tzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGZyZWV6ZXMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYAAsTWF4UmVzZXJ2ZXM4EDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gAChNYXhGcmVlemVzOBAAAAAABGEBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGZyZWV6ZSBsb2NrcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50IGF0IGFueSB0aW1lLgAB9QcAEERSdW50aW1lSG9sZFJlYXNvbiEGBHQgVGhlIG92ZXJhcmNoaW5nIGhvbGQgcmVhc29uLhxCYWxhbmNlxARsIFRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQuRFJlc2VydmVJZGVudGlmaWVyvQEMaCBUaGUgSUQgdHlwZSBmb3IgcmVzZXJ2ZXMuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gQEZyZWV6ZUlkZW50aWZpZXIQBGQgVGhlIElEIHR5cGUgZm9yIGZyZWV6ZXMuAAoAAEhUcmFuc2FjdGlvblBheW1lbnQBSFRyYW5zYWN0aW9uUGF5bWVudAxETmV4dEZlZU11bHRpcGxpZXIBAC0BQAAAZKeztuANAAAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEA+QcEAAAAPFR4UGF5bWVudENyZWRpdAAA/QcEAAzwIFRoZSBgT25DaGFyZ2VUcmFuc2FjdGlvbmAgc3RvcmVzIHRoZSB3aXRoZHJhd24gdHggZmVlIGhlcmUuADUBIFVzZSBgd2l0aGRyYXdfdHhmZWVgIGFuZCBgcmVtYWluaW5nX3R4ZmVlYCB0byBhY2Nlc3MgZnJvbSBvdXRzaWRlIHRoZSBjcmF0ZS4AAAFJBgAEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcgwEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AAAAACwAASFNraXBGZWVsZXNzUGF5bWVudAAAAU0GAAAAAAAMAABET3JpZ2luUmVzdHJpY3Rpb24BRE9yaWdpblJlc3RyaWN0aW9uBBhVc2FnZXMAAQQC2AUIBAAEjCBUaGUgY3VycmVudCB1c2FnZSBmb3IgZWFjaCBlbnRpdHkuAAHUAAFRBgAAAQkIAARAUmVzdHJpY3RlZEVudGl0edgkUQEgVGhlIHR5cGUgdGhhdCByZXByZXNlbnQgdGhlIGVudGl0aWVzIHRyYWNrZWQsIGl0cyBhbGxvd2FuY2UgYW5kIHRoZSBjb252ZXJzaW9uIGZyb22YIG9yaWdpbiBpcyBib3VuZGVkIGluIFtgUmVzdHJpY3Rpb25gXS4AHQEgVGhpcyBpcyB0aGUgY2Fub25pY2FsIG9yaWdpbiBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHVzYWdlIHRyYWNraW5nLowgRWFjaCBlbnRpdHkgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5LgBJASBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIG9yaWdpbiBhcyBhIG11bHRpcGxlIG9yaWdpbiBjYW4gcmVwcmVzZW50IGEgc2luZ2xlIGVudGl0eS5hASBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIERBTyBvcmlnaW4gd2l0aCBhIHBlcmNlbnRhZ2Ugb2Ygdm90ZXJzLCB3ZSB3YW50IHRvIHRyYWNrIHRoZSBEQU+sIGVudGl0eSByZWdhcmRsZXNzIG9mIHRoZSB2b3RlciBwZXJjZW50YWdlLgANAAAYQXNzZXRzARhBc3NldHMYFEFzc2V0AAEEAuANCAQABFQgRGV0YWlscyBvZiBhbiBhc3NldC4AHEFjY291bnQAAQgCAhUIGQgEAATkIFRoZSBob2xkaW5ncyBvZiBhIHNwZWNpZmljIGFjY291bnQgZm9yIGEgc3BlY2lmaWMgYXNzZXQuACRBcHByb3ZhbHMAAQwCAgIlCCkIBAAMWQEgQXBwcm92ZWQgYmFsYW5jZSB0cmFuc2ZlcnMuIEZpcnN0IGJhbGFuY2UgaXMgdGhlIGFtb3VudCBhcHByb3ZlZCBmb3IgdHJhbnNmZXIuIFNlY29uZOggaXMgdGhlIGFtb3VudCBvZiBgVDo6Q3VycmVuY3lgIHJlc2VydmVkIGZvciBzdG9yaW5nIHRoaXMuSQEgRmlyc3Qga2V5IGlzIHRoZSBhc3NldCBJRCwgc2Vjb25kIGtleSBpcyB0aGUgb3duZXIgYW5kIHRoaXJkIGtleSBpcyB0aGUgZGVsZWdhdGUuACBNZXRhZGF0YQEBBALgLQhQAAAAAAAAAAAAAAAAAAAAAAAAAAAEWCBNZXRhZGF0YSBvZiBhbiBhc3NldC4AIFJlc2VydmVzAQEEAuAdAQQABPwgTWFwcyBhbiBhc3NldCB0byBhIGxpc3Qgb2YgaXRzIGNvbmZpZ3VyZWQgcmVzZXJ2ZSBpbmZvcm1hdGlvbi4ALE5leHRBc3NldElkAADgBAAkbQEgVGhlIGFzc2V0IElEIGVuZm9yY2VkIGZvciB0aGUgbmV4dCBhc3NldCBjcmVhdGlvbiwgaWYgYW55IHByZXNlbnQuIE90aGVyd2lzZSwgdGhpcyBzdG9yYWdlUCBpdGVtIGhhcyBubyBlZmZlY3QuAGUBIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igc2V0dGluZyB1cCBjb25zdHJhaW50cyBmb3IgSURzIG9mIHRoZSBuZXcgYXNzZXRzLiBGb3IgZXhhbXBsZSwgYnlpASBwcm92aWRpbmcgYW4gaW5pdGlhbCBbYE5leHRBc3NldElkYF0gYW5kIHVzaW5nIHRoZSBbYGNyYXRlOjpBdXRvSW5jQXNzZXRJZGBdIGNhbGxiYWNrLCBhbuggYXV0by1pbmNyZW1lbnQgbW9kZWwgY2FuIGJlIGFwcGxpZWQgdG8gYWxsIG5ldyBhc3NldCBJRHMuACEBIFRoZSBpbml0aWFsIG5leHQgYXNzZXQgSUQgY2FuIGJlIHNldCB1c2luZyB0aGUgW2BHZW5lc2lzQ29uZmlnYF0gb3IgdGhlIQEgW1NldE5leHRBc3NldElkXShgbWlncmF0aW9uOjpuZXh0X2Fzc2V0X2lkOjpTZXROZXh0QXNzZXRJZGApIG1pZ3JhdGlvbi4AAdwAAVUGABxAUmVtb3ZlSXRlbXNMaW1pdDgQ6AMAAAxRASBNYXggbnVtYmVyIG9mIGl0ZW1zIHRvIGRlc3Ryb3kgcGVyIGBkZXN0cm95X2FjY291bnRzYCBhbmQgYGRlc3Ryb3lfYXBwcm92YWxzYCBjYWxsLgA5ASBNdXN0IGJlIGNvbmZpZ3VyZWQgdG8gcmVzdWx0IGluIGEgd2VpZ2h0IHRoYXQgbWFrZXMgZWFjaCBjYWxsIGZpdCBpbiBhIGJsb2NrLgAwQXNzZXREZXBvc2l0xEAAypo7AAAAAAAAAAAAAAAABPggVGhlIGJhc2ljIGFtb3VudCBvZiBmdW5kcyB0aGF0IG11c3QgYmUgcmVzZXJ2ZWQgZm9yIGFuIGFzc2V0LgBMQXNzZXRBY2NvdW50RGVwb3NpdMRAAPRpswIAAAAAAAAAAAAAAAhFASBUaGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCBmb3IgYSBub24tcHJvdmlkZXIgYXNzZXQgYWNjb3VudCB0byBiZTAgbWFpbnRhaW5lZC4ATE1ldGFkYXRhRGVwb3NpdEJhc2XEQACoW+kDAAAAAAAAAAAAAAAEUQEgVGhlIGJhc2ljIGFtb3VudCBvZiBmdW5kcyB0aGF0IG11c3QgYmUgcmVzZXJ2ZWQgd2hlbiBhZGRpbmcgbWV0YWRhdGEgdG8geW91ciBhc3NldC4AWE1ldGFkYXRhRGVwb3NpdFBlckJ5dGXEQADh9QUAAAAAAAAAAAAAAAAIVQEgVGhlIGFkZGl0aW9uYWwgZnVuZHMgdGhhdCBtdXN0IGJlIHJlc2VydmVkIGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSBzdG9yZSBpbiB5b3VyKCBtZXRhZGF0YS4APEFwcHJvdmFsRGVwb3NpdMRAAMqaOwAAAAAAAAAAAAAAAAQhASBUaGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGFwcHJvdmFsLgAsU3RyaW5nTGltaXQ4EDIAAAAE4CBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBuYW1lIG9yIHN5bWJvbCBzdG9yZWQgb24tY2hhaW4uAAE1CAAUHEJhbGFuY2XEBJwgVGhlIHVuaXRzIGluIHdoaWNoIHdlIHJlY29yZCBiYWxhbmNlcy4cQXNzZXRJZOAEjCBJZGVudGlmaWVyIGZvciB0aGUgY2xhc3Mgb2YgYXNzZXQuQEFzc2V0SWRQYXJhbWV0ZXLgHFkBIFdyYXBwZXIgYXJvdW5kIGBTZWxmOjpBc3NldElkYCB0byB1c2UgaW4gZGlzcGF0Y2hhYmxlIGNhbGwgc2lnbmF0dXJlcy4gQWxsb3dzIHRoZSB1c2VRASBvZiBjb21wYWN0IGVuY29kaW5nIGluIGluc3RhbmNlcyBvZiB0aGUgcGFsbGV0LCB3aGljaCB3aWxsIHByZXZlbnQgYnJlYWtpbmcgY2hhbmdlcwUBIHJlc3VsdGluZyBmcm9tIHRoZSByZW1vdmFsIG9mIGBIYXNDb21wYWN0YCBmcm9tIGBTZWxmOjpBc3NldElkYC4AWQEgVGhpcyB0eXBlIGluY2x1ZGVzIHRoZSBgRnJvbTxTZWxmOjpBc3NldElkPmAgYm91bmQsIHNpbmNlIHRpZ2h0bHkgY291cGxlZCBwYWxsZXRzIG1heUUBIHdhbnQgdG8gY29udmVydCBhbiBgQXNzZXRJZGAgaW50byBhIHBhcmFtZXRlciBmb3IgY2FsbGluZyBkaXNwYXRjaGFibGUgZnVuY3Rpb25zKCBkaXJlY3RseS4sUmVzZXJ2ZURhdGEhAQToIEluZm9ybWF0aW9uIGFib3V0IHJlc2VydmUgbG9jYXRpb25zIGZvciBhIGNsYXNzIG9mIGFzc2V0LhRFeHRyYRAE+CBBZGRpdGlvbmFsIGRhdGEgdG8gYmUgc3RvcmVkIHdpdGggYW4gYWNjb3VudCdzIGFzc2V0IGJhbGFuY2UuEGgqWdUaueSKjIzEGP+XCNKnApetC0vdPaS3RimmWm5cNGFzc2V0X2RldGFpbHMECGlk4DkIBKggUHJvdmlkZSB0aGUgYXNzZXQgZGV0YWlscyBmb3IgYXNzZXQgYGlkYC4AaCpZ1Rq55IqMjMQY/5cI0lMax+IbdrEh52Hkc0GaGwIoYmFsYW5jZV9vZggMd2hvBAhpZOA9CAS0IFByb3ZpZGUgdGhlIGJhbGFuY2Ugb2YgYHdob2AgZm9yIGFzc2V0IGBpZGAuAGgqWdUaueSKjIzEGP+XCNIuh2akDRtp1hUb2AHldVBeMGdldF9tZXRhZGF0YQQIaWTgQQgEwCBQcm92aWRlIHRoZSBjb25maWd1cmVkIG1ldGFkYXRhIGZvciBhc3NldCBgaWRgLgBoKlnVGrnkioyMxBj/lwjSZPY/KSPjmCgkMWOBrh5phkRnZXRfcmVzZXJ2ZXNfZGF0YQQIaWTgJQEE1CBQcm92aWRlIHRoZSBjb25maWd1cmVkIHJlc2VydmVzIGRhdGEgZm9yIGFzc2V0IGBpZGAuAA4AADBBc3NldHNIb2xkZXIBMEFzc2V0c0hvbGRlcggUSG9sZHMBAQgCAhUI3QcEAAQNASBBIG1hcCB0aGF0IHN0b3JlcyBob2xkcyBhcHBsaWVkIG9uIGFuIGFjY291bnQgZm9yIGEgZ2l2ZW4gQXNzZXRJZC4AOEJhbGFuY2VzT25Ib2xkAAEIAgIVCMQEAARpASBBIG1hcCB0aGF0IHN0b3JlcyB0aGUgY3VycmVudCB0b3RhbCBiYWxhbmNlIG9uIGhvbGQgZm9yIGV2ZXJ5IGFjY291bnQgb24gYSBnaXZlbiBBc3NldElkLgAAAVkGAAABRQgABERSdW50aW1lSG9sZFJlYXNvbiEGBHwgVGhlIG92ZXJhcmNoaW5nIGZyZWV6ZSByZWFzb24uAA8AACRBc3NldFJhdGUBJEFzc2V0UmF0ZQRYQ29udmVyc2lvblJhdGVUb05hdGl2ZQABBALgLQEEAAwdASBNYXBzIGFuIGFzc2V0IHRvIGl0cyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGJhbGFuY2UuAE0BIEUuZy4gYG5hdGl2ZV9hbW91bnQgPSBhc3NldF9hbW91bnQgKiBDb252ZXJzaW9uUmF0ZVRvTmF0aXZlOjo8VD46OmdldChhc3NldF9raW5kKWAAASkBAAFdBgAAAUkIAAQkQXNzZXRLaW5k4ARFASBUaGUgdHlwZSBmb3IgYXNzZXQga2luZHMgZm9yIHdoaWNoIHRoZSBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgaXMgc2V0LgAQAAA4QXNzZXRUeFBheW1lbnQAAAFhBgAAAAAAEQAAKEF1dGhvcnNoaXABKEF1dGhvcnNoaXAEGEF1dGhvcgAABAQABGQgQXV0aG9yIG9mIGN1cnJlbnQgYmxvY2suAAAAAAAAABQAAERDb2xsYXRvclNlbGVjdGlvbgFEQ29sbGF0b3JTZWxlY3Rpb24UNEludnVsbmVyYWJsZXMBAE0IBAAEEQEgVGhlIGludnVsbmVyYWJsZSwgcGVybWlzc2lvbmVkIGNvbGxhdG9ycy4gVGhpcyBsaXN0IG11c3QgYmUgc29ydGVkLgA0Q2FuZGlkYXRlTGlzdAEAUQgEABRpASBUaGUgKGNvbW11bml0eSwgbGltaXRlZCkgY29sbGF0aW9uIGNhbmRpZGF0ZXMuIGBDYW5kaWRhdGVzYCBhbmQgYEludnVsbmVyYWJsZXNgIHNob3VsZCBiZVAgbXV0dWFsbHkgZXhjbHVzaXZlLgB1ASBUaGlzIGxpc3QgaXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSBkZXBvc2l0IGFuZCB3aGVuIHRoZSBkZXBvc2l0cyBhcmUgZXF1YWwsIHRoZSBsZWFzdKAgcmVjZW50bHkgdXBkYXRlZCBpcyBjb25zaWRlcmVkIGdyZWF0ZXIuAERMYXN0QXV0aG9yZWRCbG9jawEBBAUEOBAAAAAABIQgTGFzdCBibG9jayBhdXRob3JlZCBieSBjb2xsYXRvci4ARERlc2lyZWRDYW5kaWRhdGVzAQA4EAAAAAAMeCBEZXNpcmVkIG51bWJlciBvZiBjYW5kaWRhdGVzLgB1ASBUaGlzIHNob3VsZCBpZGVhbGx5IGFsd2F5cyBiZSBsZXNzIHRoYW4gW2BDb25maWc6Ok1heENhbmRpZGF0ZXNgXSBmb3Igd2VpZ2h0cyB0byBiZSBjb3JyZWN0LgA0Q2FuZGlkYWN5Qm9uZAEAxEAAAAAAAAAAAAAAAAAAAAAADLggRml4ZWQgYW1vdW50IHRvIGRlcG9zaXQgdG8gYmVjb21lIGEgY29sbGF0b3IuAEEBIFdoZW4gYSBjb2xsYXRvciBjYWxscyBgbGVhdmVfaW50ZW50YCB0aGV5IGltbWVkaWF0ZWx5IHJlY2VpdmUgdGhlIGRlcG9zaXQgYmFjay4AATEBAAFlBgAYFFBvdElkXQggUG90U3Rha2UE9CBBY2NvdW50IElkZW50aWZpZXIgZnJvbSB3aGljaCB0aGUgaW50ZXJuYWwgUG90IGlzIGdlbmVyYXRlZC4ANE1heENhbmRpZGF0ZXM4EGQAAAAMyCBNYXhpbXVtIG51bWJlciBvZiBjYW5kaWRhdGVzIHRoYXQgd2Ugc2hvdWxkIGhhdmUuAMwgVGhpcyBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgaW52dWxuZXJhYmxlcy4AUE1pbkVsaWdpYmxlQ29sbGF0b3JzOBAEAAAADFUBIE1pbmltdW0gbnVtYmVyIGVsaWdpYmxlIGNvbGxhdG9ycy4gU2hvdWxkIGFsd2F5cyBiZSBncmVhdGVyIHRoYW4gemVyby4gVGhpcyBpbmNsdWRlc1EBIEludnVsbmVyYWJsZSBjb2xsYXRvcnMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYWx3YXlzIGJlIG9uZSBjb2xsYXRvciB3aG8gY2FuRCBwcm9kdWNlIGEgYmxvY2suAEBNYXhJbnZ1bG5lcmFibGVzOBAUAAAABIQgTWF4aW11bSBudW1iZXIgb2YgaW52dWxuZXJhYmxlcy4ANEtpY2tUaHJlc2hvbGQ4EDAqAAAAACxwb3RfYWNjb3VudASAbW9kbFBvdFN0YWtlAAAAAAAAAAAAAAAAAAAAAAAAAAAEoCBHZXRzIHRoaXMgcGFsbGV0J3MgZGVyaXZlZCBwb3QgYWNjb3VudC4AAWEIAAQsVmFsaWRhdG9ySWQEBHQgQSBzdGFibGUgSUQgZm9yIGEgdmFsaWRhdG9yLgAVAAAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEAzAQABHwgVGhlIGN1cnJlbnQgc2V0IG9mIHZhbGlkYXRvcnMuADBDdXJyZW50SW5kZXgBADgQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uADRRdWV1ZWRDaGFuZ2VkAQDIBAAIOQEgVHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBlY29ub21pYyBpZGVudGl0aWVzIG9yIHdlaWdodGluZyBiZWhpbmQgdGhlIHZhbGlkYXRvcnOkIGhhcyBjaGFuZ2VkIGluIHRoZSBxdWV1ZWQgdmFsaWRhdG9yIHNldC4AKFF1ZXVlZEtleXMBAGUIBAAIPQEgVGhlIHF1ZXVlZCBrZXlzIGZvciB0aGUgbmV4dCBzZXNzaW9uLiBXaGVuIHRoZSBuZXh0IHNlc3Npb24gYmVnaW5zLCB0aGVzZSBrZXlz4CB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZGF0b3IncyBzZXNzaW9uIGtleXMuAEhEaXNhYmxlZFZhbGlkYXRvcnMBAG0IBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuACBOZXh0S2V5cwABBAUEOQEEAAScIFRoZSBuZXh0IHNlc3Npb24ga2V5cyBmb3IgYSB2YWxpZGF0b3IuACBLZXlPd25lcgABBAV9CAQEAAQJASBUaGUgb3duZXIgb2YgYSBrZXkuIFRoZSBrZXkgaXMgdGhlIGBLZXlUeXBlSWRgICsgdGhlIGVuY29kZWQga2V5LgABNQEAAWkGAAQoS2V5RGVwb3NpdMRAAAAAAAAAAAAAAAAAAAAAAASkIFRoZSBhbW91bnQgdG8gYmUgaGVsZCB3aGVuIHNldHRpbmcga2V5cy4AAYUIAAgsVmFsaWRhdG9ySWQEBHQgQSBzdGFibGUgSUQgZm9yIGEgdmFsaWRhdG9yLhBLZXlzOQEEKCBUaGUga2V5cy4AFgAAEEF1cmEBEEF1cmEILEF1dGhvcml0aWVzAQCJCAQABGwgVGhlIGN1cnJlbnQgYXV0aG9yaXR5IHNldC4ALEN1cnJlbnRTbG90AQCRCCAAAAAAAAAAAAyAIFRoZSBjdXJyZW50IHNsb3Qgb2YgdGhpcyBibG9jay4AlCBUaGlzIHdpbGwgYmUgc2V0IGluIGBvbl9pbml0aWFsaXplYC4AAAAEMFNsb3REdXJhdGlvbigg4C4AAAAAAAAQDQEgVGhlIHNsb3QgZHVyYXRpb24gQXVyYSBzaG91bGQgcnVuIHdpdGgsIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuPQEgVGhlIGVmZmVjdGl2ZSB2YWx1ZSBvZiB0aGlzIHR5cGUgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hpbGUgdGhlIGNoYWluIGlzIHJ1bm5pbmcuADUBIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBlaXRoZXIgdXNlIFtgTWluaW11bVBlcmlvZFRpbWVzVHdvYF0gb3IgYSBjb25zdC4AAAQsQXV0aG9yaXR5SWQ9AQSYIFRoZSBpZGVudGlmaWVyIHR5cGUgZm9yIGFuIGF1dGhvcml0eS4AFwAAHEF1cmFFeHQBHEF1cmFFeHQILEF1dGhvcml0aWVzAQCJCAQAFJQgU2VydmVzIGFzIGNhY2hlIGZvciB0aGUgYXV0aG9yaXRpZXMuAHEBIFRoZSBhdXRob3JpdGllcyBpbiBBdVJhIGFyZSBvdmVyd3JpdHRlbiBpbiBgb25faW5pdGlhbGl6ZWAgd2hlbiB3ZSBzd2l0Y2ggdG8gYSBuZXcgc2Vzc2lvbixdASBidXQgd2UgcmVxdWlyZSB0aGUgb2xkIGF1dGhvcml0aWVzIHRvIHZlcmlmeSB0aGUgc2VhbCB3aGVuIHZhbGlkYXRpbmcgYSBQb1YuIFRoaXMgd2lsbA0BIGFsd2F5cyBiZSB1cGRhdGVkIHRvIHRoZSBsYXRlc3QgQXVSYSBhdXRob3JpdGllcyBpbiBgb25fZmluYWxpemVgLgA0UmVsYXlTbG90SW5mbwAAlQgEABAJASBDdXJyZW50IHJlbGF5IGNoYWluIHNsb3QgcGFpcmVkIHdpdGggYSBudW1iZXIgb2YgYXV0aG9yZWQgYmxvY2tzLgBlASBUaGlzIGlzIHVwZGF0ZWQgaW4gW2BGaXhlZFZlbG9jaXR5Q29uc2Vuc3VzSG9vazo6b25fc3RhdGVfcHJvb2ZgXSB3aXRoIHRoZSBjdXJyZW50IHJlbGF53CBjaGFpbiBzbG90IGFzIHByb3ZpZGVkIGJ5IHRoZSByZWxheSBjaGFpbiBzdGF0ZSBwcm9vZi4AAAAAAAAAGAAAJFhjbXBRdWV1ZQEkWGNtcFF1ZXVlHFBJbmJvdW5kWGNtcFN1c3BlbmRlZAEAmQgEACANASBUaGUgc3VzcGVuZGVkIGluYm91bmQgWENNUCBjaGFubmVscy4gQWxsIG90aGVycyBhcmUgbm90IHN1c3BlbmRlZC4AcQEgVGhpcyBpcyBhIGBTdG9yYWdlVmFsdWVgIGluc3RlYWQgb2YgYSBgU3RvcmFnZU1hcGAgc2luY2Ugd2UgZXhwZWN0IG11bHRpcGxlIHJlYWRzIHBlciBibG9ja2kBIHRvIGRpZmZlcmVudCBrZXlzIHdpdGggYSBvbmUgYnl0ZSBwYXlsb2FkLiBUaGUgYWNjZXNzIHRvIGBCb3VuZGVkQlRyZWVTZXRgIHdpbGwgYmUgY2FjaGVkFQEgd2l0aGluIHRoZSBibG9jayBhbmQgdGhlcmVmb3JlIG9ubHkgaW5jbHVkZWQgb25jZSBpbiB0aGUgcHJvb2Ygc2l6ZS4AZQEgTk9URTogVGhlIFBvViBiZW5jaG1hcmtpbmcgY2Fubm90IGtub3cgdGhpcyBhbmQgd2lsbCBvdmVyLWVzdGltYXRlLCBidXQgdGhlIGFjdHVhbCBwcm9vZkQgd2lsbCBiZSBzbWFsbGVyLgBIT3V0Ym91bmRYY21wU3RhdHVzAQClCAQAGF0BIFRoZSBub24tZW1wdHkgWENNUCBjaGFubmVscyBpbiBvcmRlciBvZiBiZWNvbWluZyBub24tZW1wdHksIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0UQEgYW5kIGxhc3Qgb3V0Ym91bmQgbWVzc2FnZS4gSWYgdGhlIHR3byBpbmRpY2VzIGFyZSBlcXVhbCwgdGhlbiBpdCBpbmRpY2F0ZXMgYW4gZW1wdHlZASBxdWV1ZSBhbmQgdGhlcmUgbXVzdCBiZSBhIG5vbi1gT2tgIGBPdXRib3VuZFN0YXR1c2AuIFdlIGFzc3VtZSBxdWV1ZXMgZ3JvdyBubyBncmVhdGVyWQEgdGhhbiA2NTUzNSBpdGVtcy4gUXVldWUgaW5kaWNlcyBmb3Igbm9ybWFsIG1lc3NhZ2VzIGJlZ2luIGF0IG9uZTsgemVybyBpcyByZXNlcnZlZCBpbhEBIGNhc2Ugb2YgdGhlIG5lZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgc2lnbmFsIG1lc3NhZ2UgdGhpcyBibG9jay4JASBUaGUgYm9vbCBpcyB0cnVlIGlmIHRoZXJlIGlzIGEgc2lnbmFsIG1lc3NhZ2Ugd2FpdGluZyB0byBiZSBzZW50LgBQT3V0Ym91bmRYY21wTWVzc2FnZXMBAQgCBbUIuQgEAAS8IFRoZSBtZXNzYWdlcyBvdXRib3VuZCBpbiBhIGdpdmVuIFhDTVAgY2hhbm5lbC4AOFNpZ25hbE1lc3NhZ2VzAQEEApy5CAQABKAgQW55IHNpZ25hbCBtZXNzYWdlcyB3YWl0aW5nIHRvIGJlIHNlbnQuACxRdWV1ZUNvbmZpZwEAvQgwIAAAADAAAAAIAAAABBUBIFRoZSBjb25maWd1cmF0aW9uIHdoaWNoIGNvbnRyb2xzIHRoZSBkeW5hbWljcyBvZiB0aGUgb3V0Ym91bmQgcXVldWUuADhRdWV1ZVN1c3BlbmRlZAEAyAQABEEBIFdoZXRoZXIgb3Igbm90IHRoZSBYQ01QIHF1ZXVlIGlzIHN1c3BlbmRlZCBmcm9tIGV4ZWN1dGluZyBpbmNvbWluZyBYQ01zIG9yIG5vdC4ARERlbGl2ZXJ5RmVlRmFjdG9yAQEEBZwtAUAAAGSns7bgDQAAAAAAAAAABMQgVGhlIGZhY3RvciB0byBtdWx0aXBseSB0aGUgYmFzZSBkZWxpdmVyeSBmZWUgYnkuAAFBAQABbQYADExNYXhJbmJvdW5kU3VzcGVuZGVkOBDoAwAAFEkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmJvdW5kIFhDTVAgY2hhbm5lbHMgdGhhdCBjYW4gYmUgc3VzcGVuZGVkIHNpbXVsdGFuZW91c2x5LgBdASBBbnkgZnVydGhlciBjaGFubmVsIHN1c3BlbnNpb25zIHdpbGwgZmFpbCBhbmQgbWVzc2FnZXMgbWF5IGdldCBkcm9wcGVkIHdpdGhvdXQgZnVydGhlckUBIG5vdGljZS4gQ2hvb3NpbmcgYSBoaWdoIHZhbHVlICgxMDAwKSBpcyBva2F5OyB0aGUgdHJhZGUtb2ZmIHRoYXQgaXMgZGVzY3JpYmVkIGlu2CBbYEluYm91bmRYY21wU3VzcGVuZGVkYF0gc3RpbGwgYXBwbGllcyBhdCB0aGF0IHNjYWxlLgBkTWF4QWN0aXZlT3V0Ym91bmRDaGFubmVsczgQgAAAACBlASBNYXhpbWFsIG51bWJlciBvZiBvdXRib3VuZCBYQ01QIGNoYW5uZWxzIHRoYXQgY2FuIGhhdmUgbWVzc2FnZXMgcXVldWVkIGF0IHRoZSBzYW1lIHRpbWUuAFUBIElmIHRoaXMgaXMgcmVhY2hlZCwgdGhlbiBubyBmdXJ0aGVyIG1lc3NhZ2VzIGNhbiBiZSBzZW50IHRvIGNoYW5uZWxzIHRoYXQgZG8gbm90IHlldF0BIGhhdmUgYSBtZXNzYWdlIHF1ZXVlZC4gVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBleHBlY3RlZCBtYXhpbXVtIG9mIG91dGJvdW5kIGNoYW5uZWxzYQEgd2hpY2ggaXMgZGV0ZXJtaW5lZCBieSBbYFNlbGY6OkNoYW5uZWxJbmZvYF0uIEl0IGlzIGltcG9ydGFudCB0byBzZXQgdGhpcyBsYXJnZSBlbm91Z2gsXQEgc2luY2Ugb3RoZXJ3aXNlIHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgcHJvdG9jb2wgd2lsbCBub3Qgd29yayBhcyBpbnRlbmRlZCBhbmQgbWVzc2FnZXNRASBtYXkgYmUgZHJvcHBlZC4gVGhpcyB2YWx1ZSBpbmNyZWFzZXMgdGhlIFBvViBhbmQgc2hvdWxkIHRoZXJlZm9yZSBub3QgYmUgcGlja2VkIHRvb00BIGhpZ2guIEdvdmVybmFuY2UgbmVlZHMgdG8gcGF5IGF0dGVudGlvbiB0byBub3Qgb3BlbiBtb3JlIGNoYW5uZWxzIHRoYW4gdGhpcyB2YWx1ZS4ALE1heFBhZ2VTaXplOBAAnAEAFLggVGhlIG1heGltYWwgcGFnZSBzaXplIGZvciBIUk1QIG1lc3NhZ2UgcGFnZXMuAGEBIEEgbG93ZXIgbGltaXQgY2FuIGJlIHNldCBkeW5hbWljYWxseSwgYnV0IHRoaXMgaXMgdGhlIGhhcmQtbGltaXQgZm9yIHRoZSBQb1Ygd29yc3QgY2FzZVUBIGJlbmNobWFya2luZy4gVGhlIGxpbWl0IGZvciB0aGUgc2l6ZSBvZiBhIG1lc3NhZ2UgaXMgc2xpZ2h0bHkgYmVsb3cgdGhpcywgc2luY2Ugc29tZbggb3ZlcmhlYWQgaXMgaW5jdXJyZWQgZm9yIGVuY29kaW5nIHRoZSBmb3JtYXQuAAHBCAAAAB4AACxQb2xrYWRvdFhjbQEsUG9sa2Fkb3RYY208MFF1ZXJ5Q291bnRlcgEAKCAAAAAAAAAAAASIIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHF1ZXJ5IGluZGV4LgAcUXVlcmllcwABBAIoxQgEAARUIFRoZSBvbmdvaW5nIHF1ZXJpZXMuAChBc3NldFRyYXBzAQEEBjw4EAAAAAAQaCBUaGUgZXhpc3RpbmcgYXNzZXQgdHJhcHMuAGEBIEtleSBpcyB0aGUgYmxha2UyIDI1NiBoYXNoIG9mIChvcmlnaW4sIHZlcnNpb25lZCBgQXNzZXRzYCkgcGFpci4gVmFsdWUgaXMgdGhlIG51bWJlciBvZh0BIHRpbWVzIHRoaXMgcGFpciBoYXMgYmVlbiB0cmFwcGVkICh1c3VhbGx5IGp1c3QgMSBpZiBpdCBleGlzdHMgYXQgYWxsKS4AOFNhZmVYY21WZXJzaW9uAAA4BAAIYQEgRGVmYXVsdCB2ZXJzaW9uIHRvIGVuY29kZSBYQ00gd2hlbiBsYXRlc3QgdmVyc2lvbiBvZiBkZXN0aW5hdGlvbiBpcyB1bmtub3duLiBJZiBgTm9uZWAsPQEgdGhlbiB0aGUgZGVzdGluYXRpb25zIHdob3NlIFhDTSB2ZXJzaW9uIGlzIHVua25vd24gYXJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuAEBTdXBwb3J0ZWRWZXJzaW9uAAEIBQLZCDgEAATwIFRoZSBMYXRlc3QgdmVyc2lvbnMgdGhhdCB3ZSBrbm93IHZhcmlvdXMgbG9jYXRpb25zIHN1cHBvcnQuAEBWZXJzaW9uTm90aWZpZXJzAAEIBQLZCCgEAAQFASBBbGwgbG9jYXRpb25zIHRoYXQgd2UgaGF2ZSByZXF1ZXN0ZWQgdmVyc2lvbiBub3RpZmljYXRpb25zIGZyb20uAFBWZXJzaW9uTm90aWZ5VGFyZ2V0cwABCAUC2QjdCAQACHEBIFRoZSB0YXJnZXQgbG9jYXRpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gb3VyIHZlcnNpb24gY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgbW9zdCByZWNlbnSUIG9mIG91ciB2ZXJzaW9ucyB3ZSBpbmZvcm1lZCB0aGVtIG9mLgBUVmVyc2lvbkRpc2NvdmVyeVF1ZXVlAQDhCAQADGUBIERlc3RpbmF0aW9ucyB3aG9zZSBsYXRlc3QgWENNIHZlcnNpb24gd2Ugd291bGQgbGlrZSB0byBrbm93LiBEdXBsaWNhdGVzIG5vdCBhbGxvd2VkLCBhbmRxASB0aGUgYHUzMmAgY291bnRlciBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYSBzZW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBoYXMgYmVlbiBhdHRlbXB0ZWQsjCB3aGljaCBpcyB1c2VkIGFzIGEgcHJpb3JpdGl6YXRpb24uAEBDdXJyZW50TWlncmF0aW9uAADtCAQABJwgVGhlIGN1cnJlbnQgbWlncmF0aW9uJ3Mgc3RhZ2UsIGlmIGFueS4AVFJlbW90ZUxvY2tlZEZ1bmdpYmxlcwABDAUCAvEI9QgEAATwIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gYSByZW1vdGUgY2hhaW4uADxMb2NrZWRGdW5naWJsZXMAAQQCBAUJBAAE4CBGdW5naWJsZSBhc3NldHMgd2hpY2ggd2Uga25vdyBhcmUgbG9ja2VkIG9uIHRoaXMgY2hhaW4uAFRYY21FeGVjdXRpb25TdXNwZW5kZWQBAMgEAAS0IEdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuADxTaG91bGRSZWNvcmRYY20BAMgEABxZASBXaGV0aGVyIG9yIG5vdCBpbmNvbWluZyBYQ01zIChib3RoIGV4ZWN1dGVkIGxvY2FsbHkgYW5kIHJlY2VpdmVkKSBzaG91bGQgYmUgcmVjb3JkZWQuxCBPbmx5IG9uZSBYQ00gcHJvZ3JhbSB3aWxsIGJlIHJlY29yZGVkIGF0IGEgdGltZS4pASBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gcnVudGltZSBBUElzLCBhbmQgaXQncyBhZHZpc2VkIGl0IHN0YXlzIGZhbHNlDQEgZm9yIGFsbCBvdGhlciB1c2UgY2FzZXMsIHNvIGFzIHRvIG5vdCBkZWdyYWRlIHJlZ3VsYXIgcGVyZm9ybWFuY2UuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4ALFJlY29yZGVkWGNtAABdAgQAGEkBIElmIFtgU2hvdWxkUmVjb3JkWGNtYF0gaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhlIGxhc3QgWENNIHByb2dyYW0gZXhlY3V0ZWQgbG9jYWxseVQgd2lsbCBiZSBzdG9yZWQgaGVyZS4pASBSdW50aW1lIEFQSXMgY2FuIGZldGNoIHRoZSBYQ00gdGhhdCB3YXMgZXhlY3V0ZWQgYnkgYWNjZXNzaW5nIHRoaXMgdmFsdWUuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4AREF1dGhvcml6ZWRBbGlhc2VzAAEEAkkBEQkEAAxlASBNYXAgb2YgYXV0aG9yaXplZCBhbGlhc2VycyBvZiBsb2NhbCBvcmlnaW5zLiBFYWNoIGxvY2FsIGxvY2F0aW9uIGNhbiBhdXRob3JpemUgYSBsaXN0IG9mWQEgb3RoZXIgbG9jYXRpb25zIHRvIGFsaWFzIGludG8gaXQuIEVhY2ggYWxpYXNlciBpcyBvbmx5IHZhbGlkIHVudGlsIGl0cyBpbm5lciBgZXhwaXJ5YDggYmxvY2sgbnVtYmVyLgABRQEIAQK5AVRoaXMgZXh0cmluc2ljIHVzZXMgYFdlaWdodExpbWl0OjpVbmxpbWl0ZWRgLCBwbGVhc2UgbWlncmF0ZSB0byBgbGltaXRlZF90ZWxlcG9ydF9hc3NldHNgIG9yIGB0cmFuc2Zlcl9hc3NldHNgAAIC2QFUaGlzIGV4dHJpbnNpYyB1c2VzIGBXZWlnaHRMaW1pdDo6VW5saW1pdGVkYCwgcGxlYXNlIG1pZ3JhdGUgdG8gYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIG9yIGB0cmFuc2Zlcl9hc3NldHNgAAFxBgAQRFVuaXZlcnNhbExvY2F0aW9u5BgCCQIAUVAEhCBUaGlzIGNoYWluJ3MgVW5pdmVyc2FsIExvY2F0aW9uLgBQQWR2ZXJ0aXNlZFhjbVZlcnNpb244EAUAAAAIJQEgVGhlIGxhdGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiB0aGF0IHdlIGFkdmVydGlzZS4gR2VuZXJhbGx5IGp1c3Qgc2V0IGl0IHRvhCBgcGFsbGV0X3hjbTo6Q3VycmVudFhjbVZlcnNpb25gLgAoTWF4TG9ja2VyczgQCAAAAAQZASBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgWENNIGxvY2tzIHRoYXQgYSBzaW5nbGUgYWNjb3VudCBtYXkgaGF2ZS4AWE1heFJlbW90ZUxvY2tDb25zdW1lcnM4EAAAAAAE/CBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uc3VtZXJzIGEgc2luZ2xlIHJlbW90ZSBsb2NrIG1heSBoYXZlLgABKQkEGAK8VXNlIGBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGVXaXRoRXJyb3JgIGluc3RlYWQBGDIwLjAuMAgsUnVudGltZUNhbGwgBGQgVGhlIHJ1bnRpbWUgYENhbGxgIHR5cGUucFJlbW90ZUxvY2tDb25zdW1lcklkZW50aWZpZXIQBMQgVGhlIElEIHR5cGUgZm9yIGxvY2FsIGNvbnN1bWVycyBvZiByZW1vdGUgbG9ja3MuAB8AAChDdW11bHVzWGNtAAEZAwABgQYAAAAAACAAADBNZXNzYWdlUXVldWUBME1lc3NhZ2VRdWV1ZQwwQm9va1N0YXRlRm9yAQEEBSEDMQl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGFuZCBsYXN0IChub24tZW1wdHkpIHBhZ2VzLgAsU2VydmljZUhlYWQAACEDBAAEvCBUaGUgb3JpZ2luIGF0IHdoaWNoIHdlIHNob3VsZCBiZWdpbiBzZXJ2aWNpbmcuABRQYWdlcwABCAUFPQlBCQQABIggVGhlIG1hcCBvZiBwYWdlIGluZGljZXMgdG8gcGFnZXMuAAEdAwABhQYAECBIZWFwU2l6ZTgQAJwBABQ9ASBUaGUgc2l6ZSBvZiB0aGUgcGFnZTsgdGhpcyBpbXBsaWVzIHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB3aGljaCBjYW4gYmUgc2VudC4AWQEgQSBnb29kIHZhbHVlIGRlcGVuZHMgb24gdGhlIGV4cGVjdGVkIG1lc3NhZ2Ugc2l6ZXMsIHRoZWlyIHdlaWdodHMsIHRoZSB3ZWlnaHQgdGhhdCBpc10BIGF2YWlsYWJsZSBmb3IgcHJvY2Vzc2luZyB0aGVtIGFuZCB0aGUgbWF4aW1hbCBuZWVkZWQgbWVzc2FnZSBzaXplLiBUaGUgbWF4aW1hbCBtZXNzYWdlEQEgc2l6ZSBpcyBzbGlnaHRseSBsb3dlciB0aGFuIHRoaXMgYXMgZGVmaW5lZCBieSBbYE1heE1lc3NhZ2VMZW5PZmBdLgAgTWF4U3RhbGU4EAgAAAAMXQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIHBhZ2VzIChpLmUuIG9mIG92ZXJ3ZWlnaHQgbWVzc2FnZXMpIGFsbG93ZWQgYmVmb3JlIGN1bGxpbmdRASBjYW4gaGFwcGVuLiBPbmNlIHRoZXJlIGFyZSBtb3JlIHN0YWxlIHBhZ2VzIHRoYW4gdGhpcywgdGhlbiBoaXN0b3JpY2FsIHBhZ2VzIG1heSBiZfwgZHJvcHBlZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gdW5wcm9jZXNzZWQgb3ZlcndlaWdodCBtZXNzYWdlcy4ANFNlcnZpY2VXZWlnaHSlAiwBBwBYQPuiAgDgABhBASBUaGUgYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB3aGljaCBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yqCBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2luaXRpYWxpemVgLgD8IFRoaXMgbWF5IGJlIGxlZ2l0aW1hdGVseSBgTm9uZWAgaW4gdGhlIGNhc2UgdGhhdCB5b3Ugd2lsbCBjYWxsXQEgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBtYW51YWxseSBvciBzZXQgW2BTZWxmOjpJZGxlTWF4U2VydmljZVdlaWdodGBdIHRvIGhhdmVUIGl0IHJ1biBpbiBgb25faWRsZWAuAFBJZGxlTWF4U2VydmljZVdlaWdodKUCLAEHAFhA+6ICAOAAFF0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgdG8gYmUgdXNlZCBmcm9tIHJlbWFpbmluZyB3ZWlnaHQgYG9uX2lkbGVgIHdoaWNoQQEgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2lkbGVgLj0BIFVzZWZ1bCBmb3IgcGFyYWNoYWlucyB0byBwcm9jZXNzIG1lc3NhZ2VzIGF0IHRoZSBzYW1lIGJsb2NrIHRoZXkgYXJlIHJlY2VpdmVkLgApASBJZiBgTm9uZWAsIGl0IHdpbGwgbm90IGNhbGwgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBpbiBgb25faWRsZWAuAAFJCQAEEFNpemU4BFQgUGFnZS9oZWFwIHNpemUgdHlwZS4AIgAAHFV0aWxpdHkAASUDAAGNBgAETGJhdGNoZWRfY2FsbHNfbGltaXQ4EKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgABTQkACCxSdW50aW1lQ2FsbCAEbCBUaGUgb3ZlcmFyY2hpbmcgY2FsbCB0eXBlLjRQYWxsZXRzT3JpZ2luMQME8CBUaGUgY2FsbGVyIG9yaWdpbiwgb3ZlcmFyY2hpbmcgdHlwZSBvZiBhbGwgcGFsbGV0cyBvcmlnaW5zLgAoAAAgTXVsdGlzaWcBIE11bHRpc2lnBCRNdWx0aXNpZ3MAAQgFAlEJVQkEAASUIFRoZSBzZXQgb2Ygb3BlbiBtdWx0aXNpZyBvcGVyYXRpb25zLgABgQMAAZUGAAwsRGVwb3NpdEJhc2XEQAA8kWAEAAAAAAAAAAAAAAAYWQEgVGhlIGJhc2UgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCB0byByZXNlcnZlIGZvciBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbiBvciB0b4Qgc3RvcmUgYSBkaXNwYXRjaCBjYWxsIGZvciBsYXRlci4AAQEgVGhpcyBpcyBoZWxkIGZvciBhbiBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzMQEgYDQgKyBzaXplb2YoKEJsb2NrTnVtYmVyLCBCYWxhbmNlLCBBY2NvdW50SWQpKWAgYnl0ZXMgYW5kIHdob3NlIGtleSBzaXplIGlzgCBgMzIgKyBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMuADREZXBvc2l0RmFjdG9yxEAAILy+AAAAAAAAAAAAAAAADFUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHBlciB1bml0IHRocmVzaG9sZCB3aGVuIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uLgAlASBUaGlzIGlzIGhlbGQgZm9yIGFkZGluZyAzMiBieXRlcyBtb3JlIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4AOE1heFNpZ25hdG9yaWVzOBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgABXQkABCxSdW50aW1lQ2FsbCAEbCBUaGUgb3ZlcmFyY2hpbmcgY2FsbCB0eXBlLgApAAAQU3VkbwEQU3VkbwQMS2V5AAAEBAAEhCBUaGUgYEFjY291bnRJZGAgb2YgdGhlIHN1ZG8ga2V5LgABjQMAAZkGAAABYQkABCxSdW50aW1lQ2FsbCAESCBBIHN1ZG8tYWJsZSBjYWxsLgAqAAA8VmVyaWZ5U2lnbmF0dXJlAAAAAAAEJFNpZ25hdHVyZS0EBPQgU2lnbmF0dXJlIHR5cGUgdGhhdCB0aGUgZXh0ZW5zaW9uIG9mIHRoaXMgcGFsbGV0IGNhbiB2ZXJpZnkuACsAABRQcm94eQEUUHJveHkIHFByb3hpZXMBAQQFBGUJRAAAAAAAAAAAAAAAAAAAAAAACEUBIFRoZSBzZXQgb2YgYWNjb3VudCBwcm94aWVzLiBNYXBzIHRoZSBhY2NvdW50IHdoaWNoIGhhcyBkZWxlZ2F0ZWQgdG8gdGhlIGFjY291bnRzIQEgd2hpY2ggYXJlIGJlaW5nIGRlbGVnYXRlZCB0bywgdG9nZXRoZXIgd2l0aCB0aGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdC4ANEFubm91bmNlbWVudHMBAQQFBHUJRAAAAAAAAAAAAAAAAAAAAAAABKwgVGhlIGFubm91bmNlbWVudHMgbWFkZSBieSB0aGUgcHJveHkgKGtleSkuAAGRAwABnQYAGEBQcm94eURlcG9zaXRCYXNlxEAADHdCAwAAAAAAAAAAAAAAEBEBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYSBwcm94eS4AAQEgVGhpcyBpcyBoZWxkIGZvciBhbiBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzJQEgYHNpemVvZihCYWxhbmNlKWAgYnl0ZXMgYW5kIHdob3NlIGtleSBzaXplIGlzIGBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMuAEhQcm94eURlcG9zaXRGYWN0b3LEQAABssQAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLgAoTWF4UHJveGllczgQIAAAAATwIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBwcm94aWVzIGFsbG93ZWQgZm9yIGEgc2luZ2xlIGFjY291bnQuAChNYXhQZW5kaW5nOBAgAAAABEUBIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lLWRlbGF5ZWQgYW5ub3VuY2VtZW50cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHBlbmRpbmcuAFxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZcRAABQmcgMAAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuAGRBbm5vdW5jZW1lbnREZXBvc2l0RmFjdG9yxEAAAmSJAQAAAAAAAAAAAAAAENQgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIGFubm91bmNlbWVudCBtYWRlLgBZASBUaGlzIGlzIGhlbGQgZm9yIGFkZGluZyBhbiBgQWNjb3VudElkYCwgYEhhc2hgIGFuZCBgQmxvY2tOdW1iZXJgICh0eXBpY2FsbHkgNjggYnl0ZXMpjCBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuAAGFCQAILFJ1bnRpbWVDYWxsIARsIFRoZSBvdmVyYXJjaGluZyBjYWxsIHR5cGUuJFByb3h5VHlwZZkDEFUBIEEga2luZCBvZiBwcm94eTsgc3BlY2lmaWVkIHdpdGggdGhlIHByb3h5IGFuZCBwYXNzZWQgaW4gdG8gdGhlIGBJc1Byb3h5YWJsZWAgZmlsdGVyLlEBIFRoZSBpbnN0YW5jZSBmaWx0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gY2FsbCBtYXkgYmUgcHJveGllZCB1bmRlciB0aGlzIHR5cGUuAE0BIElNUE9SVEFOVDogYERlZmF1bHRgIG11c3QgYmUgcHJvdmlkZWQgYW5kIE1VU1QgQkUgdGhlIHRoZSAqbW9zdCBwZXJtaXNzaXZlKiB2YWx1ZS4IGAnXg0Zyeg71jA+gO6+jI8vFFIjZKhqnE3sDv7UO/BdEY2hlY2tfcGVybWlzc2lvbnMIEGNhbGwgKHByb3h5X3R5cGWZA8gE9CBDaGVjayBpZiBhIGBSdW50aW1lQ2FsbGAgaXMgYWxsb3dlZCBmb3IgYSBnaXZlbiBgUHJveHlUeXBlYC4AGAnXg0Zyeg71jA+gO6+jIxcUsGB9Yq8KOzsK0sXVXFgsaXNfc3VwZXJzZXQIIHRvX2NoZWNrmQMcYWdhaW5zdJkDyAT0IENoZWNrIGlmIG9uZSBgUHJveHlUeXBlYCBpcyBhIHN1YnNldCBvZiBhbm90aGVyIGBQcm94eVR5cGVgLgAsAAAgSWRlbnRpdHkBIElkZW50aXR5MChJZGVudGl0eU9mAAEEBQSJCQQAEGkBIEluZm9ybWF0aW9uIHRoYXQgaXMgcGVydGluZW50IHRvIGlkZW50aWZ5IHRoZSBlbnRpdHkgYmVoaW5kIGFuIGFjY291bnQuIEZpcnN0IGl0ZW0gaXMgdGhl4CByZWdpc3RyYXRpb24sIHNlY29uZCBpcyB0aGUgYWNjb3VudCdzIHByaW1hcnkgdXNlcm5hbWUuAMAgVFdPWC1OT1RFOiBPSyDigJUgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4AKFVzZXJuYW1lT2YAAQQFBDkEBAAEvCBJZGVudGlmaWVzIHRoZSBwcmltYXJ5IHVzZXJuYW1lIG9mIGFuIGFjY291bnQuABxTdXBlck9mAAEEAgQhBAQACGEBIFRoZSBzdXBlci1pZGVudGl0eSBvZiBhbiBhbHRlcm5hdGl2ZSAic3ViIiBpZGVudGl0eSB0b2dldGhlciB3aXRoIGl0cyBuYW1lLCB3aXRoaW4gdGhhdFEBIGNvbnRleHQuIElmIHRoZSBhY2NvdW50IGlzIG5vdCBzb21lIG90aGVyIGFjY291bnQncyBzdWItaWRlbnRpdHksIHRoZW4ganVzdCBgTm9uZWAuABhTdWJzT2YBAQQFBJkJRAAAAAAAAAAAAAAAAAAAAAAAFLggQWx0ZXJuYXRpdmUgInN1YiIgaWRlbnRpdGllcyBvZiB0aGlzIGFjY291bnQuAB0BIFRoZSBmaXJzdCBpdGVtIGlzIHRoZSBkZXBvc2l0LCB0aGUgc2Vjb25kIGlzIGEgdmVjdG9yIG9mIHRoZSBhY2NvdW50cy4AwCBUV09YLU5PVEU6IE9LIOKAlSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLgAoUmVnaXN0cmFycwEAnQkEABBNASBUaGUgc2V0IG9mIHJlZ2lzdHJhcnMuIE5vdCBleHBlY3RlZCB0byBnZXQgdmVyeSBiaWcgYXMgY2FuIG9ubHkgYmUgYWRkZWQgdGhyb3VnaCBhqCBzcGVjaWFsIG9yaWdpbiAobGlrZWx5IGEgY291bmNpbCBtb3Rpb24pLgApASBUaGUgaW5kZXggaW50byB0aGlzIGNhbiBiZSBjYXN0IHRvIGBSZWdpc3RyYXJJbmRleGAgdG8gZ2V0IGEgdmFsaWQgdmFsdWUuACxBdXRob3JpdHlPZgABBAWtCbEJBAAE9CBBIG1hcCBvZiB0aGUgYWNjb3VudHMgd2hvIGFyZSBhdXRob3JpemVkIHRvIGdyYW50IHVzZXJuYW1lcy4AOFVzZXJuYW1lSW5mb09mAAEEAjkEtQkEABh1ASBSZXZlcnNlIGxvb2t1cCBmcm9tIGB1c2VybmFtZWAgdG8gdGhlIGBBY2NvdW50SWRgIHRoYXQgaGFzIHJlZ2lzdGVyZWQgaXQgYW5kIHRoZSBwcm92aWRlciBvZm0BIHRoZSB1c2VybmFtZS4gVGhlIGBvd25lcmAgdmFsdWUgc2hvdWxkIGJlIGEga2V5IGluIHRoZSBgVXNlcm5hbWVPZmAgbWFwLCBidXQgaXQgbWF5IG5vdCBpZvAgdGhlIHVzZXIgaGFzIGNsZWFyZWQgdGhlaXIgdXNlcm5hbWUgb3IgaXQgaGFzIGJlZW4gcmVtb3ZlZC4AaQEgTXVsdGlwbGUgdXNlcm5hbWVzIG1heSBtYXAgdG8gdGhlIHNhbWUgYEFjY291bnRJZGAsIGJ1dCBgVXNlcm5hbWVPZmAgd2lsbCBvbmx5IG1hcCB0byBvbmVIIHByaW1hcnkgdXNlcm5hbWUuAEBQZW5kaW5nVXNlcm5hbWVzAAEEAjkEvQkEACBtASBVc2VybmFtZXMgdGhhdCBhbiBhdXRob3JpdHkgaGFzIGdyYW50ZWQsIGJ1dCB0aGF0IHRoZSBhY2NvdW50IGNvbnRyb2xsZXIgaGFzIG5vdCBjb25maXJtZWRMIHRoYXQgdGhleSB3YW50IGl0LgAlASBVc2VkIHByaW1hcmlseSBpbiBjYXNlcyB3aGVyZSB0aGUgYEFjY291bnRJZGAgY2Fubm90IHByb3ZpZGUgYSBzaWduYXR1cmVdASBiZWNhdXNlIHRoZXkgYXJlIGEgcHVyZSBwcm94eSwgbXVsdGlzaWcsIGV0Yy4gSW4gb3JkZXIgdG8gY29uZmlybSBpdCwgdGhleSBzaG91bGQgY2FsbLAgW2FjY2VwdF91c2VybmFtZV0oYENhbGw6OmFjY2VwdF91c2VybmFtZWApLgAdASBGaXJzdCB0dXBsZSBpdGVtIGlzIHRoZSBhY2NvdW50IGFuZCBzZWNvbmQgaXMgdGhlIGFjY2VwdGFuY2UgZGVhZGxpbmUuAEhVbmJpbmRpbmdVc2VybmFtZXMAAQQCOQQ4BAAQXQEgVXNlcm5hbWVzIGZvciB3aGljaCB0aGUgYXV0aG9yaXR5IHRoYXQgZ3JhbnRlZCB0aGVtIGhhcyBzdGFydGVkIHRoZSByZW1vdmFsIHByb2Nlc3MgYnlxASB1bmJpbmRpbmcgdGhlbS4gRWFjaCB1bmJpbmRpbmcgdXNlcm5hbWUgbWFwcyB0byBpdHMgZ3JhY2UgcGVyaW9kIGV4cGlyeSwgd2hpY2ggaXMgdGhlIGZpcnN03CBibG9jayBpbiB3aGljaCB0aGUgdXNlcm5hbWUgY291bGQgYmUgZGVsZXRlZCB0aHJvdWdoIGHEIFtyZW1vdmVfdXNlcm5hbWVdKGBDYWxsOjpyZW1vdmVfdXNlcm5hbWVgKSBjYWxsLgBAUGVyc29uSWRlbnRpdGllcwABBAIIwQkEAAhlASBUaGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGVyc29uIHRocm91Z2ggdGhlaXIgY29udGV4dHVhbCBhbGlhcyBmb3IgdGhlIHB1cnBvc2VzIG9miCByZWdpc3RlcmluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4AOEFjY291bnRUb0FsaWFzAAEEAgQIBAAIZQEgUmV2ZXJzZSBsb29rdXAgb2YgYWNjb3VudHMgY29udHJvbGxlZCBieSBhIHBlcnNvbiB0aHJvdWdoIGEgY29udGV4dHVhbCBhbGlhcy4gQWxsIHBlb3BsZS0BIHRoYXQgcmVnaXN0ZXJlZCBhbiBpZGVudGl0eSBtdXN0IGFsc28gYXNzb2NpYXRlIGFuIG9uLWNoYWluIGFjY291bnQgdG8gaXQuAFhQZW5kaW5nVXNlcm5hbWVSZXBvcnRzAAEEAgjRCQQABJQgU3RvcmVzIHBlbmRpbmcgcmVwb3J0cyBvZiB1c2VybmFtZXMuAAGdAwABpQYAQDBCYXNpY0RlcG9zaXTEQADVX7kCAAAAAAAAAAAAAAAE2CBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgYSByZWdpc3RlcmVkIGlkZW50aXR5LgAsQnl0ZURlcG9zaXTEQADh9QUAAAAAAAAAAAAAAAAEHQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIGVuY29kZWQgYnl0ZSBmb3IgYSByZWdpc3RlcmVkIGlkZW50aXR5LgA8VXNlcm5hbWVEZXBvc2l0xEAAILy+AAAAAAAAAAAAAAAACFUBIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IHBlciByZWdpc3RlcmVkIHVzZXJuYW1lLiBUaGlzIHZhbHVlIHNob3VsZCBjaGFuZ2Ugb25seSBpbvQgcnVudGltZSB1cGdyYWRlcyB3aXRoIHByb3BlciBtaWdyYXRpb24gb2YgZXhpc3RpbmcgZGVwb3NpdHMuAERTdWJBY2NvdW50RGVwb3NpdMRAAHnzjwMAAAAAAAAAAAAAAAxlASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgYSByZWdpc3RlcmVkIHN1YmFjY291bnQuIFRoaXMgc2hvdWxkIGFjY291bnQgZm9yIHRoZSBmYWN0ZQEgdGhhdCBvbmUgc3RvcmFnZSBpdGVtJ3MgdmFsdWUgd2lsbCBpbmNyZWFzZSBieSB0aGUgc2l6ZSBvZiBhbiBhY2NvdW50IElELCBhbmQgdGhlcmUgd2lsbDUBIGJlIGFub3RoZXIgdHJpZSBpdGVtIHdob3NlIHZhbHVlIGlzIHRoZSBzaXplIG9mIGFuIGFjY291bnQgSUQgcGx1cyAzMiBieXRlcy4AVFVzZXJuYW1lUmVwb3J0RGVwb3NpdMRAAChr7gAAAAAAAAAAAAAAAATIIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IHBlciByZXBvcnRlZCB1c2VybmFtZS4AOE1heFN1YkFjY291bnRzOBBkAAAABA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWItYWNjb3VudHMgYWxsb3dlZCBwZXIgaWRlbnRpZmllZCBhY2NvdW50LgBUVXNlcm5hbWVSZXBvcnRUaW1lb3V0OBCAxhMADEkBIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgaGF2ZSB0byBwYXNzIGJldHdlZW4gdGhlIGxhc3QgdGltZSBhIGdpdmVuIHVzZXJuYW1lIHdhc10BIHJlcG9ydGVkIGFuZCBub3cgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZXBvcnQgaXQgYWdhaW4uIEluIG90aGVyIHdvcmRzLCBpdCByZXByZXNlbnRzlCB0aGUgdXNlcm5hbWUgdmFsaWRpdHkgc2FmZXR5IHBlcmlvZC4ANE1heFJlZ2lzdHJhcnM4EBQAAAAITQEgTWF4aW11bSBudW1iZXIgb2YgcmVnaXN0cmFycyBhbGxvd2VkIGluIHRoZSBzeXN0ZW0uIE5lZWRlZCB0byBib3VuZCB0aGUgY29tcGxleGl0eXwgb2YsIGUuZy4sIHVwZGF0aW5nIGp1ZGdlbWVudHMuADRNYXhKdWRnZW1lbnRzOBADAAAABCkBIE1heGltdW0gbnVtYmVyIG9mIGp1ZGdlbWVudHMgcGVyIHBlcnNvbmFsIGlkZW50aXR5IGFsbG93ZWQgaW4gdGhlIHN5c3RlbS4AZFBlbmRpbmdVc2VybmFtZUV4cGlyYXRpb244EECdBAAEFQEgVGhlIG51bWJlciBvZiBibG9ja3Mgd2l0aGluIHdoaWNoIGEgdXNlcm5hbWUgZ3JhbnQgbXVzdCBiZSBhY2NlcHRlZC4ATFVzZXJuYW1lR3JhY2VQZXJpb2Q4EED6AQAIWQEgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHBhc3MgdG8gZW5hYmxlIHRoZSBwZXJtYW5lbnQgZGVsZXRpb24gb2YgYSB1c2VybmFtZSBieWggaXRzIHJlc3BlY3RpdmUgYXV0aG9yaXR5LgA8TWF4U3VmZml4TGVuZ3RoOBAHAAAABIAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3VmZml4LgBETWF4VXNlcm5hbWVMZW5ndGg4ECAAAAAEYQEgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgdXNlcm5hbWUsIGluY2x1ZGluZyBpdHMgc3VmZml4IGFuZCBhbnkgc3lzdGVtLWFkZGVkIGRlbGltaXRlcnMuAERNaW5Vc2VybmFtZUxlbmd0aDgQAgAAAASwIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lIG9yIHN1ZmZpeC4AYENyZWRlbnRpYWxSZW1vdmFsUGVuYWx0ecRAAPIFKgEAAAAAAAAAAAAAAAhVASBUaGUgZmVlIHRoYXQgYSBwZXJzb24gbXVzdCBwYXkgdGhyb3VnaCB0aGVpciBhc3NvY2lhdGVkIG9uLWNoYWluIGFjY291bnQgaW4gb3JkZXIgdG9cIHJlbW92ZSB0aGVpciBpZGVudGl0eS4AQGlkZW50aXR5X2NvbnRleHQIgHBvcDpwb2xrYWRvdC5uZXR3b3JrL2lkZW50aXR5ICAgCEEBIFRoZSBjb250ZXh0IHVzZWQgZm9yIHRoZSBwcm9vZnMgcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIGFzIGEgcGVyc29uYWwgYWxpYXMgaW4oIGlkZW50aXR5LgAB1QkABERPZmZjaGFpblNpZ25hdHVyZS0EDOAgU2lnbmF0dXJlIHR5cGUgZm9yIHByZS1hdXRob3JpemluZyB1c2VybmFtZXMgb2ZmLWNoYWluLgARASBDYW4gdmVyaWZ5IHdoZXRoZXIgYW4gYFNlbGY6OlNpZ25pbmdQdWJsaWNLZXlgIGNyZWF0ZWQgYSBzaWduYXR1cmUuADIAABhQZW9wbGUBGFBlb3BsZSQQS2V5cwABBAJRBCgEABRJASBUaGUgY3VycmVudCBpbmRpdmlkdWFscyB3ZSByZWNvZ25pc2UsIGJ1dCBub3QgbmVjZXNzYXJpbHkgeWV0IGluY2x1ZGVkIGluIGEgcmluZy4AdQEgTG9vay11cCBmcm9tIHRoZSBjcnlwdG8gKHB1YmxpYykga2V5IHRvIHRoZSBpbW11dGFibGUgSUQgb2YgdGhlIGluZGl2aWR1YWwgKGBQZXJzb25hbElkYCkuIEFdASBwZXJzb24gY2FuIGhhdmUgdHdvIGRpZmZlcmVudCBlbnRyaWVzIGluIHRoaXMgbWFwIGlmIHRoZXkgcXVldWVkIGEga2V5IG1pZ3JhdGlvbiB3aGljaGQgaGFzbid0IGJlZW4gZW5hY3RlZCB5ZXQuADhDb3VudGVyRm9yS2V5cwEAOBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwABhQZW9wbGUAAQQCKNkJBAAMSQEgVGhlIGN1cnJlbnQgaW5kaXZpZHVhbHMgd2UgcmVjb2duaXNlLCBidXQgbm90IG5lY2Vzc2FyaWx5IHlldCBpbmNsdWRlZCBpbiBhIHJpbmcuAGUBIEltbXV0YWJsZSBJRCBvZiB0aGUgaW5kaXZpZHVhbCAoYFBlcnNvbmFsSWRgKSB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBrZXkgYW5kIHN0YXR1cy4AOEFsaWFzVG9BY2NvdW50AAEEAkkDBAQABMwgQ29udmVyc2lvbiBvZiBhIGNvbnRleHR1YWwgYWxpYXMgdG8gYW4gYWNjb3VudCBJRC4AOEFjY291bnRUb0FsaWFzAAEEAgRFAwQABMwgQ29udmVyc2lvbiBvZiBhbiBhY2NvdW50IElEIHRvIGEgY29udGV4dHVhbCBhbGlhcy4ATEFjY291bnRUb1BlcnNvbmFsSWQAAQQCBCgEABC8IEFzc29jaWF0aW9uIG9mIGFuIGFjY291bnQgSUQgdG8gYSBwZXJzb25hbCBJRC4AIQEgTWFuYWdlZCB3aXRoIGBzZXRfcGVyc29uYWxfaWRfYWNjb3VudGAgYW5kIGB1bnNldF9wZXJzb25hbF9pZF9hY2NvdW50YC74IFJldmVyc2UgbG9va3VwIGlzIGluc2lkZSBgUGVvcGxlYCBzdG9yYWdlLCBpbnNpZGUgdGhlIHJlY29yZC4AOE5leHRQZXJzb25hbElkAQAoIAAAAAAAAAAABLggVGhlIG5leHQgZnJlZSBhbmQgbmV2ZXIgcmVzZXJ2ZWQgcGVyc29uYWwgSUQuAFxQZW9wbGVDb2xsZWN0aW9uQ3JlYXRlZAEAyAQABMAgV2hldGhlciB0aGUgcGVvcGxlIGNvbGxlY3Rpb24gaGFzIGJlZW4gY3JlYXRlZC4ASFJlc2VydmVkUGVyc29uYWxJZAABBAUoEAQABMAgQ2FuZGlkYXRlcycgcmVzZXJ2ZWQgaWRlbnRpdGllcyB3aGljaCB3ZSB0cmFjay4AAUkEAAGpBgAMMFJpbmdFeHBvbmVudPEEBAkETQEgVGhlIHJpbmcgZXhwb25lbnQgdXNlZCB0byBvcGVyYXRlIHRoZSBwZW9wbGUgbWVtYmVyIGNvbGxlY3Rpb24gaW4gYE1lbWJlclNlcnZpY2VgLgBcT25ib2FyZGluZ1F1ZXVlUGFnZVNpemU4EB4AAAAISQEgTWF4aW11bSBudW1iZXIgb2YgcGVvcGxlIGluY2x1ZGVkIGluIGFuIG9uYm9hcmRpbmcgcXVldWUgcGFnZSBiZWZvcmUgYSBuZXcgb25lIGlzJCBjcmVhdGVkLgBwYWNjb3VudF9zZXR1cF90aW1lX3RvbGVyYW5jZTgQWAIAABQ9ASBUaGUgYW1vdW50IG9mIGJsb2NrIG51bWJlciB0b2xlcmFuY2Ugd2UgYWxsb3cgZm9yIGEgc2V0dXAgYWNjb3VudCB0cmFuc2FjdGlvbi4ABQEgYHNldF9hbGlhc19hY2NvdW50YCBhbmQgYHNldF9wZXJzb25hbF9pZF9hY2NvdW50YCBjYWxscyBjb250YWluc1EBIGBjYWxsX3ZhbGlkX2F0YCBhcyBhIHBhcmFtZXRlciwgdGhvc2UgY2FsbHMgYXJlIHZhbGlkIGlmIHRoZSBibG9jayBudW1iZXIgaXMgd2l0aGluWCB0aGUgdG9sZXJhbmNlIHBlcmlvZC4AAd0JAAAAMwAAHE1vYlJ1bGUBHE1vYlJ1bGUwHENyZWRpdHMBAQQCCOEJcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEjCBUaGUgdm90aW5nIHJlY29yZHMgb2YgYWxsIGFsaWFzZXMuADxWb3RpbmdQZW5hbHRpZXMAAQQCCDgEAAhxASBUaGUgdm90ZSBwZW5hbHRpZXMgb2YgdXNlcnMgYW5kIHRoZWlyIHN0YXJ0aW5nIG1vbWVudC4gVm90ZXJzIHdpdGggcGVuYWx0aWVzIGNhbm5vdCB2b3RlIGluzCBjb250ZW1wdCB1bnRpbCB0aGUgcGVuYWx0eSBleHBpcmVzIGFuZCBpcyByZW1vdmVkLgAwVm90aW5nUG9pbnRzAQEIBgLlCTgQAAAAAAhlASBUaGUgYWNjdW11bGF0ZWQgcG9pbnRzIG9mIGFsbCBhbGlhc2VzLCBkdXJpbmcgZWFjaCBmdW5kaW5nIHJvdW5kLiBUaGUgcG9pbnRzIGFjY3VtdWxhdGVkIQEgZHVyaW5nIHJvdW5kIGBOYCBjYW4gYmUgcmVkZWVtZWQgZm9yIHJld2FyZHMgb25seSBkdXJpbmcgcm91bmQgYE4gKyAxYC4AFFZvdGVzAAEIAgLlCUEEBAAEuCBBbGwgdm90ZXMgY2FzdCwgc2VncmVnYXRlZCBieSBjYXNlIGFuZCB2b3Rlci4AJENhc2VDb3VudAEAOBAAAAAABBEBIFRoZSBudW1iZXIgb2YgY2FzZXMsIG9wZW4gb3IgcmVjZW50bHkgY2xvc2VkLCBzdG9yZWQgaW4gdGhlIHBhbGxldC4AJE9wZW5DYXNlcwABBAI46QkEAAQpASBUaGUgb3BlbiBjYXNlcyByZWNvcmRlZCBpbiB0aGUgcGFsbGV0LiBUaGVzZSBjYXNlcyBjYW4gc3RpbGwgYmUgdm90ZWQgb24uACRSaXBlQ2FzZXMAAQQCOAEKBAAMdQEgVGhlIHJpcGUgY2FzZXMgcmVjb3JkZWQgaW4gdGhlIHBhbGxldC4gVGhlIHZvdGluZyBoYXMgY29uY2x1ZGVkIG9uIHRoZXNlIGNhc2VzIGFuZCBhIHZlcmRpY3RlASBoYXMgYmVlbiByZWFjaGVkLCBidXQgdGhleSBjYW5ub3QgYmUgcmVtb3ZlZCB5ZXQgaW4gb3JkZXIgdG8gYWxsb3cgcGVvcGxlIHRvIGNsYWltIHRoZWlyHCB2b3Rlcy4AJERvbmVDYXNlcwABBAI4BQoEAAhhASBUaGUgZG9uZSBjYXNlcyByZWNvcmRlZCBpbiB0aGUgcGFsbGV0LiBUaGVzZSBjYXNlcyBhcmUgb2Jzb2xldGUgYW5kIGNhbiBiZSByZW1vdmVkIGZyb20kIHN0b3JhZ2UuAERBY2N1bXVsYXRlZFBvaW50cwEAKCAAAAAAAAAAAAh1ASBUaGUgbnVtYmVyIG9mIHBvaW50cyBhY2N1bXVsYXRlZCB0aHJvdWdoIGNvcnJlY3Qgdm90ZXMgZHVyaW5nIHRoZSBjdXJyZW50IHBheW91dCByb3VuZC4gVGhpc3UBIGFtb3VudCBpcyBnb2luZyB0byBkZXRlcm1pbmUgdGhlIHBvaW50L3Jld2FyZCBleGNoYW5nZSByYXRlIG9mIHRoZSBuZXh0IHJld2FyZCBwYXlvdXQgcm91bmQuAEhQYXlvdXREaXN0cmlidXRpb24AAAkKBAAE2CBEZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgcGF5b3V0IHJvdW5kLgA4Um91bmRTY2hlZHVsZXMBAA0KBAAEuCBEZXNjcmliZXMgdGhlIHNjaGVkdWxlcyBvZiB0aGUgcGF5b3V0IHJvdW5kcy4ALEFjdGl2ZVNpbmNlAAAoBAAIbQEgVGhlIHRpbWVzdGFtcCwgaW4gc2Vjb25kcywgb2YgdGhlIG1vbWVudCBlbm91Z2ggYWN0aXZlIHZvdGVycyB3ZXJlIGRldGVjdGVkIGFuZCB2b3Rpbmcgd2FzMQEgZW5hYmxlZC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcmVzZW50IGlmIHRoZXJlIGFyZSB0b28gZmV3IGFjdGl2ZSB2b3RlcnMuAAFVBAABrQYAOFBDdXJyZW5jeUxvY2F0aW9uSW5mb+AwAQMAoQ8EMgV2yOsLBPQgVGhlIGxvY2F0aW9uIG9mIHRoZSB1c2VkIGN1cnJlbmN5LiBJdCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuAFBNYXhWb3RlQ2xhaW1EdXJhdGlvbigggFEBAAAAAAAEBQEgVGhlIG51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSBhIGNhc2UgdGltZXMgb3V0IGFuZCBjYW4gYmUgcmVhcGVkLgA8TWluQ2FzZUR1cmF0aW9uOBBYAgAABEEBIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhIGNhc2UgbXVzdCBzdGF5IG9wZW4gZm9yIHZvdGluZyBiZWZvcmUgaXQgY2FuIGJlIGNsb3NlZC4ARE1heFZvdGluZ0R1cmF0aW9uOBCwBAAABC0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIGZvciB3aGljaCBhIGNhc2UgY291bGQgc3RheSBvcGVuIGZvciB2b3RpbmcuAERNaW5UdXJub3V0Tm9taW5hbDgQAQAAAARFASBUaGUgbWluaW11bSBudW1iZXIgb2Ygdm90ZXMgYSBjYXNlIG11c3QgcmVjZWl2ZSBiZWZvcmUgYSB2ZXJkaWN0IGNhbiBiZSByZWFjaGVkLgBQTWluVHVybm91dFBlcmNlbnRhZ2UZCgQKCGUBIFRoZSBtaW5pbXVtIG51bWJlciBvZiB2b3RlcyBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHZvdGVyIGNvdW50IGEgY2FzZSBtdXN0IHJlY2VpdmWEIGJlZm9yZSBhIHZlcmRpY3QgY2FuIGJlIHJlYWNoZWQuAFRWb3RpbmdQZW5hbHR5RHVyYXRpb244EMCoAAAE0CBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGEgcGVuYWx0eSBpcyBhcHBsaWVkIGZvci4ARE1heFZvdGVzQ2xhaW1hYmxlOBAKAAAABPQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGVzIGNsYWltYWJsZSBpbiBhIHNpbmdsZSBleHRyaW5zaWMuAFBPZmZjaGFpbldvcmtJbnRlcnZhbDgQlgAAAASwIFRoZSBpbnRlcnZhbCBhdCB3aGljaCBvZmZjaGFpbiB3b3JrZXIgcnVucy4ATENsZWFuVm90ZXNCYXRjaFNpemU4EOgDAAAEJQEgTWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgdGhhdCB3aWxsIGJlIGNsZWFuZWQgZHVyaW5nIG9mZmNoYWluIHdvcmtlciBydW4uAGhWb3Rlc09wZW5Gb3JDbGFpbXNEdXJhdGlvbjgQWAIAAAgVASBUaGUgdGltZSBpbiBzZWNvbmRzIGR1cmluZyB3aGljaCB2b3RlcyBjYW4gYmUgY2xhaW1lZCBvbiBkb25lIGNhc2VzLsAgTWVhc3VyZWQgZnJvbSB0aGUgdGltZSB0aGUgY2FzZSBiZWNvbWVzICdEb25lJy4AVE1pbmltdW1Wb3RlclRocmVzaG9sZDgQAwAAAAhlASBUaGUgbWluaW11bSBudW1iZXIgb2YgYWN0aXZlIHZvdGVycyByZXF1aXJlZCB0byBhbGxvdyB2b3RpbmcuIFdoZW4gdGhpcyB0aHJlc2hvbGQgaXMgbm90hCBtZXQsIG9wZW4gY2FzZXMgY2Fubm90IHRpbWUgb3V0LgA8bW9iX3J1bGVfcG90X2lkBIBtb2RsTW9iUndyZHMAAAAAAAAAAAAAAAAAAAAAAAAAAATgIEdldCBhIHVuaXF1ZSwgaW5hY2Nlc3NpYmxlIGFjY291bnQgSUQgZnJvbSB0aGUgYFBvdElkYC4AQG1vYl9ydWxlX2NvbnRleHQIgHBvcDpwb2xrYWRvdC5uZXR3b3JrL21vYi1ydWxlICAgCFEBIFRoZSBjb250ZXh0IHVzZWQgZm9yIHRoZSBwcm9vZnMgcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIGFzIGEgcGVyc29uYWwgYWxpYXMgaW4gbW9iGCBydWxlLgABHQoAAAA0AAAoUHJvb2ZPZkluawEoUHJvb2ZPZkluaywoQ2FuZGlkYXRlcwABBAIEIQoEAARJASBUaGUgY3VycmVudCBwZXJzb25hbCBpZGVudGl0aWVzIHdoaWNoIGFyZSBnb2luZyB0aHJvdWdoIHRoZSBwcm9vZi1vZi1pbmsgcHJvY2Vzcy4AGFBlb3BsZQABBAUoMQoEAAhxASBUaGUgcGVyc29uYWwgaWRlbnRpdGllcyB3aGljaCB3ZSB0cmFjazsgYWxsIHdoaWNoIGhhdmUgYmVlbiByZWNvZ25pemVkIHRocm91Z2ggcHJvb2Ytb2YtaW5rNCBhcmUgaW4gaGVyZS4APFJlZmVycmFsVGlja2V0cwABBAUoPQoEAAQJASBUaGUgdGlja2V0cyBzdG9yZWQgb24tY2hhaW4gcmVhZHkgdG8gYmUgdXNlZCB0byByZWZlciBjYW5kaWRhdGVzLgA4RGVzaWduRmFtaWxpZXMAAQQCLQNJCgQABKggVGhlIGN1cnJlbnQgZGVzaWduIGZhbWlsaWVzIHdlIHJlY29nbmlzZS4AQENvbW1pdHRlZERlc2lnbnMAAQgCAk0KUQoEAATUIFRoZSBjb21taXR0ZWQgZGVzaWducyB3aGljaCBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZS4APEFsbG9jYXRpb25Db3VudAEAOBAAAAAABLAgVGhlIG51bWJlciBvZiBqdWRnZW1lbnRzIGN1cnJlbnRseSBvbmdvaW5nLgA0Q29uZmlndXJhdGlvbgEAbQSgQJ0EAAQAAADoAwAAAAAABAAAAAAgAAAAAAAgAAAAAAAIAAAAQJ0EAARMIFRoZSBjb25maWd1cmF0aW9uLgBAQXZhaWxhYmxlSW52aXRlcwEBBAIEOBAAAAAABPggTnVtYmVyIG9mIGludml0YXRpb25zIGF2YWlsYWJsZSB0byBkaXN0cmlidXRlIGZvciBhbiBhY2NvdW50LgA4UGVuZGluZ0ludml0ZXMAAQgCAlUKEAQADB0BIFBlbmRpbmcgaW52aXRhdGlvbnMgZm9yIGVhY2ggaW52aXRlciAoYW4gYWNjb3VudCB0aGF0IGludml0ZXMgb3RoZXJzKS4AWQEgSWYgdGhlIGtleSBgKGludml0ZXIsIHRpY2tldClgIGV4aXN0cywgdGhlbiB0aGUgdGlja2V0IGlzIGN1cnJlbnRseSBhIHBlbmRpbmcgaW52aXRlLgBsUmVmZXJyZXJSZWltYnVyc2VtZW50VmFsdWVzAABxBAQAFGEBIFRoZSB2YWx1ZXMgb2YgdGhlIHJlaW1idXJzZW1lbnQgYXdhcmRlZCB0byByZWZlcnJlcnMsIGFsb25nIHdpdGggaG93IG1hbnkgb2YgZWFjaCB2YWx1ZW0BIHNob3VsZCBiZSBhd2FyZGVkLiBUaGVzZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyIG9mIHRoZWlyIHByaW9yaXR5LCBzbyB0aGUgbGFzdEEBIHZhbHVlIGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IG9uZSB0byBiZSB1c2VkIGJ5IHRoZSByZWltYnVyc2VtZW50IHN5c3RlbS4ARQEgU3RvcmFnZSBpdGVtIG5hbWUga2VlcHMgdGhlIGxlZ2FjeSBwcmVmaXggZm9yIHN0b3JhZ2UgcmVhZGFiaWxpdHkgY29tcGF0aWJpbGl0eS4AbFJlZmVycmVkUmVpbWJ1cnNlbWVudFZhbHVlcwAAcQQEABRhASBUaGUgdmFsdWVzIG9mIHRoZSByZWltYnVyc2VtZW50IGF3YXJkZWQgdG8gcmVmZXJyZWQgcGVvcGxlLCBhbG9uZyB3aXRoIGhvdyBtYW55IG9mIGVhY2hxASB2YWx1ZSBzaG91bGQgYmUgYXdhcmRlZC4gVGhlc2UgdmFsdWVzIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGVpciBwcmlvcml0eSwgc28gdGhlVQEgbGFzdCB2YWx1ZSBpbiB0aGUgbGlzdCB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgdG8gYmUgdXNlZCBieSB0aGUgcmVpbWJ1cnNlbWVudCBzeXN0ZW0uAEUBIFN0b3JhZ2UgaXRlbSBuYW1lIGtlZXBzIHRoZSBsZWdhY3kgcHJlZml4IGZvciBzdG9yYWdlIHJlYWRhYmlsaXR5IGNvbXBhdGliaWxpdHkuAAFdBAABsQYADEhNYXhBY3RpdmVSZWZlcnJhbHM4EAoAAAAI9CBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIHJlZmVycmFscyBhIHVzZXIgY2FuIGhhdmUgb3Blbi5YIEl0IGNhbm5vdCBleGNlZWQgMjAwLgAUUG90SWRdCCBQb0lQb3RfXyDsIEFjY291bnQgSWRlbnRpZmllciBmcm9tIHdoaWNoIHRoZSByZXdhcmQgcG90IGlzIGdlbmVyYXRlZC4AKQEgVGhlIGFjY291bnQgbXVzdCBiZSBmdW5kZWQgc28gcmV3YXJkcyBjYW4gYmUgcGFpZCBkdXJpbmcgcmVnaXN0cmF0aW9uIGFuZGAgcmVmZXJyYWwgcmV3YXJkIGNsYWltcy4AEQEgVGhlIGBQYWxsZXRJZGAgbXVzdCBiZSBhIGNvbnN0YW50IGFzIGl0IGlzIGV4cG9zZWQgaW4gdGhlIG1ldGFkYXRhLmUBIENoYW5naW5nIHRoaXMgdmFsdWUgd2l0aCBhIHJ1bnRpbWUgdXBncmFkZSBjYW4gYmUgZG9uZSBhdCBhbnkgdGltZSwgdGhlIG5ldyBhY2NvdW50IHdpbGyQIHRoZW4gbmVlZCB0byBiZSBmdW5kZWQgYWNjb3JkaW5nbHkuAExwcm9vZl9vZl9pbmtfcG90X2lkBIBtb2RsUG9JUG90X18AAAAAAAAAAAAAAAAAAAAAAAAAAATUIFRoZSBhY2NvdW50IElEIG9mIHRoZSBwb3QgdXNlZCBmb3IgcmV3YXJkIHRyYW5zZmVycy4AAVkKAAg8VGlja2V0U2lnbmF0dXJlLQQMiCBTaWduYXR1cmUgdXNlZCB0byB2ZXJpZnkgdGlja2V0cy4AAQEgQ2FuIHZlcmlmeSB3aGV0aGVyIGFuIGBTZWxmOjpUaWNrZXRQdWJsaWNgIGNyZWF0ZWQgYSBzaWduYXR1cmUuGFRpY2tldAQEmCBUaWNrZXQgdHlwZSB1c2VkIHRvIHJlZmVyIGNhbmRpZGF0ZXMuADUAABBHYW1lARBHYW1lSGxUZXN0bmV0U3RvcmVkUGhhc2VEdXJhdGlvbnMAAJ0EBAAEvCBUaGUgb3ZlcnJpZGVuIHBoYXNlIGR1cmF0aW9ucyBmb3IgdGhlIHRlc3RuZXQuABBOZnRzAAEIAgJdChAEAAAAPEFyY2hpdmVkUGxheWVycwABBAK5BmEKBAAEKQEgQWxsIHRoZSBwbGF5ZXIgd2l0aCB6ZXJvIHNjb3JlIGJ1dCBzdGlsbCBvbmJvYXJkZWQgaW4gaW5kaXZfcGFsbGV0X3Njb3JlLgAcUGxheWVycwABBAK5BmUKBAAQcCBBbGwgdGhlIHBsYXllciBpbiB0aGUgZ2FtZS4AIQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgYWNjb3VudHMgaW4gdGhpcyBzdG9yYWdlIGFuZCBzdGF0ZW1lbnQgYWNjb3VudHMgaW6kIFtgU3RtdEFjY291bnRUb0FsaWFzYF0gbXVzdCBub3Qgb3ZlcmxhcC4AJEdhbWVJbmRleAEAOBAAAAAABGAgVGhlIGN1cnJlbnQgZ2FtZSBpbmRleC4AEEdhbWUAAHEKBAAEzCBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXh0IGdhbWUgb3Igb25nb2luZyBnYW1lLgAsR2FtZUhpc3RvcnkAAQQFODgEAAhhASBUaGUgbWFwcGluZyBmcm9tIHBhc3QgZ2FtZXMsIGlkZW50aWZpZWQgYnkgdGhlaXIgZ2FtZSBpbmRleCwgdG8gdGhlIHN0YXJ0IHRpbWVzdGFtcCwgaW54IHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2guAFxQbGF5ZXJBdHRlbmRhbmNlSGlzdG9yeQEBBAK5BoEKBAAE1CBFbnRyaWVzIG9mIHByZXZpb3VzbHkgYXR0ZW5kZWQgZ2FtZXMgb2YgZWFjaCBwbGF5ZXIuADRJbmRleFRvUGxheWVyAAEEBYUKuQYEAATkIFRoZSBtYXBwaW5nIGZyb20gcm91bmQgaW5kZXggYW5kIHBsYXllciBpbmRleCB0byBwbGF5ZXIuADRQbGF5ZXJUb0luZGV4AAEEArkGiQoEAATgIFRoZSBtYXBwaW5nIGZyb20gcGxheWVyIHRvIHRoZWlyIGluZGljZXMgaW4gZWFjaCByb3VuZC4ARFNodWZmbGVSZWNvZ25pemVkAAEIBQaNCrkGBAAEAQEgU3RvcmFnZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHNodWZmbGUgb3JkZXIgb2YgcmVjb2duaXplZCBwZW9wbGUuAFBTaHVmZmxlTm90UmVjb2duaXplZAABCAUGjQq5BgQABFUBIFN0b3JhZ2UgdXNlZCB0byBjb21wdXRlIHRoZSBzaHVmZmxlIG9yZGVyIG9mIG5vdCByZWNvZ25pemVkIHBlb3BsZSwgaS5lLiBjYW5kaWRhdGVzLgA0R2FtZVNjaGVkdWxlcwEAkQoEAAAAQEF2YWlsYWJsZUludml0ZXMBAQQCBDgQAAAAAAToIE51bWJlciBvZiBpbnZpdGVzIGF2YWlsYWJsZSB0byBkaXN0cmlidXRlIGZvciBhbiBhY2NvdW50LgA4UGVuZGluZ0ludml0ZXMAAQgCAlUKEAQAEIggUGVuZGluZyBpbnZpdGVzIGZvciBlYWNoIGludml0ZXIuAGkBIElmIHRoZSBrZXkgYChpbnZpdGVyLCB0aWNrZXQpYCBleGlzdHMgdGhlbiB0aGUgdGlja2V0IGlzIGN1cnJlbnRseSBhIHBlbmRpbmcgaW52aXRlLCBmcm9tNCB0aGUgaW52aXRlci4ASEFsaWFzVG9TdG10QWNjb3VudAABBAIIBAQAHFkBIE1hcHBpbmcgZnJvbSBhbGlhcyB0byB0aGUgYWNjb3VudCBpZCB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHN0YXRlbWVudCBzdG9yZS4AQQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgc2ltcGx5IHVzZSB0aGVpciBhY2NvdW50IGFuZCBhcmUgbm90IHBhcnQgb2YgdGhpcyBtYXBwaW5nLgEBIFJldmVyc2UgbWFwcGluZyBpcyBhdmFpbGFibGUgaW4gc3RvcmFnZSBbYFN0bXRBY2NvdW50VG9BbGlhc2BdLgDsIFRoaXMgaXMgcmVtb3ZlZCB3aGVuIHRoZSBhbGlhcy1iYXNlZCBwbGF5ZXIgZ2V0cyBhcmNoaXZlZC5VASBUaGlzIGlzIHVwZGF0ZWQgd2hlbiB0aGUgYWxpYXMtYmFzZWQgcGxheWVyIHNpZ25zIHVwIHdpdGggYW5vdGhlciBzdGF0ZW1lbnQgYWNjb3VudC4ASFN0bXRBY2NvdW50VG9BbGlhcwABBAIECAQAJFkBIE1hcHBpbmcgZnJvbSB0aGUgYWNjb3VudCBpZCB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggc3RhdGVtZW50IHN0b3JlIHRvIHRoZSBhbGlhcy4AQQEgQWNjb3VudC1iYXNlZCBwbGF5ZXIgc2ltcGx5IHVzZSB0aGVpciBhY2NvdW50IGFuZCBhcmUgbm90IHBhcnQgb2YgdGhpcyBtYXBwaW5nLgEBIFJldmVyc2UgbWFwcGluZyBpcyBhdmFpbGFibGUgaW4gc3RvcmFnZSBbYEFsaWFzVG9TdG10QWNjb3VudGBdLuwgVGhpcyBpcyByZW1vdmVkIHdoZW4gdGhlIGFsaWFzLWJhc2VkIHBsYXllciBnZXRzIGFyY2hpdmVkLlUBIFRoaXMgaXMgdXBkYXRlZCB3aGVuIHRoZSBhbGlhcy1iYXNlZCBwbGF5ZXIgc2lnbnMgdXAgd2l0aCBhbm90aGVyIHN0YXRlbWVudCBhY2NvdW50LgBlASBTdGF0ZW1lbnQgYWNjb3VudHMgaW4gdGhpcyBzdG9yYWdlIGFuZCBhY2NvdW50LWJhc2VkIHBsYXllciBhY2NvdW50cyBpbiBbYFBsYXllcnNgXSBtdXN0NCBub3Qgb3ZlcmxhcC4AYENvbW11bmljYXRpb25JZGVudGlmaWVycwABBAIENQQEAAxpASBUaGUgY29tbXVuaWNhdGlvbiBpZGVudGlmaWVycyB1c2VkIGJ5IHBsYXllcnMgdG8gZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBQMlAgY29ubmVjdGlvbiBpbm0BIG9yZGVyIHRvIHBsYXkgdGhlIGdhbWUuIFRoZSBhY2NvdW50IHVuZGVyIHdoaWNoIHRoZSBjb21tdW5pY2F0aW9uIGlkZW50aWZpZXIgaXMgcmVnaXN0ZXJlZBkBIHNob3VsZCBiZSB0aGUgc2FtZSBhY2NvdW50IHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGVtZW50IHN0b3JlLgABfQQAAbUGACAkTWF4Um91bmRzOBADAAAADKAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvdW5kcyBpbiBhIGdhbWUuAOggTm90ZTogdGhlIGFjdHVhbCBudW1iZXIgb2Ygcm91bmRzIGlzIGNvbmZpZ3VyZWQgcGVyIGdhbWUuADBNYXhHcm91cFNpemU4EAYAAAAMqCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGxheWVycyBpbiBhIGdyb3VwLgAZASBOb3RlOiB0aGUgYWN0dWFsIG51bWJlciBvZiBwbGF5ZXJzIGluIGEgZ3JvdXAgaXMgY29uZmlndXJlZCBwZXIgZ2FtZS4AME1pbkdyb3VwU2l6ZTgQAAAAACCoIFRoZSBtaW5pbXVtIG51bWJlciBvZiBwbGF5ZXJzIGluIGEgZ3JvdXAuAGUBIFdoZW4gc2NoZWR1bGluZyBhIGdhbWUgdGhlIHZhbHVlIGZvciBgbWF4X2dyb3VwX3NpemVgIG11c3QgYmUgYXQgbGVhc3QgdGhpcyBtaW5pbXVtICsgMS4AJQEgSW4gb3JkZXIgdG8gaGF2ZSBubyBzaW5nbGUtcGxheWVyIGdyb3VwcywgdGhpcyB2YWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDIuAFEBIE5vdGU6IHRoZSBhY3R1YWwgbWluaW11bSBudW1iZXIgb2YgcGxheWVycyBpbiBhIGdyb3VwIGlzIGNvbmZpZ3VyZWQgcGVyIGdhbWUsIGl0IGlzWCBgbWF4X2dyb3VwX3NpemUgLSAxYC4AVE5vblBsYXlpbmdLaWNrb3V0VGltZTgQgFM7AAwVASBUaGUgdGltZSBhZnRlciB3aGljaCBhIHBsYXllciB0aGF0IGlzIG5vdCBwbGF5aW5nIGNhbiBiZSBraWNrZWQgb3V0LgC8IFRoaXMgaXMgb25seSBmb3IgYWNjb3VudCBwbGF5ZXJzLCBub3QgcGVyc29ucy4AOFBoYXNlRHVyYXRpb25znQRQLAEAADwAAAAeAAAAWAIAADwAAAAEuCBUaGUgZHVyYXRpb25zIG9mIGVhY2ggZ2FtZSBwaGFzZSwgaW4gc2Vjb25kcy4AQE1heEdhbWVTY2hlZHVsZXM4EAwAAAAE7CBUaGUgTWF4aW11bSBudW1iZXIgb2YgZ2FtZSBzY2hlZHVsZXMgdGhlIHBhbGxldCBjYW4gc3RvcmUuAGRNYXhBdHRlbmRhbmNlSGlzdG9yeURlcHRoOBAMAAAACF0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXN0IGdhbWVzIGZvciB3aGljaCBwbGF5ZXIgYXR0ZW5kYW5jZSBpcyBzdG9yZWQuIEFueSBhdHRlbmRhbmNlAQEgZW50cmllcyBvbGRlciB0aGFuIHRoaXMgd2lsbCBiZSBpbW1pbmVudGx5IHB1cmdlZCBmcm9tIHN0b3JhZ2UuAGxwcm9vZl9vZl9vd25lcnNoaXBfbXNnX2Jhc2UIgHBvcDpnYW1lOnN0bXRfYWNjb3VudF9mb3JfYWxpYXM6EBkBIFRoZSBiYXNlIG1lc3NhZ2Ugb2YgdGhlIHByb29mIG9mIG93bmVyc2hpcCBvZiBhbiBhY2NvdW50IGJ5IGFuIGFsaWFzLgA1ASBUaGUgZnVsbCBtZXNzYWdlIGlzIHRoaXMgYmFzZSBjb25jYXRlbmF0ZWQgdG8gdGhlIGFsaWFzIGFuZCB0aGVuIGhhc2hlZCB3aXRorCBgYmxha2UyXzI1NmAgKGJsYWtlMiB3aXRoIDI1NiBiaXQgb3V0cHV0KS4AAZUKAAg8VGlja2V0U2lnbmF0dXJlLQQEiCBTaWduYXR1cmUgdXNlZCB0byB2ZXJpZnkgdGlja2V0cy5AQWNjb3VudFNpZ25hdHVyZS0EBGAgU2lnbmF0dXJlIGZvciBhY2NvdW50cy4ANwAAFFNjb3JlARRTY29yZSgwUGFydGljaXBhbnRzAAEEArkGmQoEAAR8IFRoZSBwYXJ0aWNpcGFudHMgaW5mb3JtYXRpb25zLgBMUGVyc29uaG9vZFRocmVzaG9sZAEAOBAAAAAABMggVGhlIHNjb3JlIHRocmVzaG9sZCByZXF1aXJlZCB0byByZWFjaCBwZXJzb25ob29kLgBQQWJzZW5jZUdyYWNlU2NoZWR1bGUAAK0EBAAYKQEgUnVudGltZS1jb25maWd1cmFibGUgc2NoZWR1bGUgb2YgYWJzZW5jZS1ncmFjZSB0aWVycywgc29ydGVkIGJ5IGFzY2VuZGluZw0BIHBvcHVsYXRpb24gc2l6ZSB0aHJlc2hvbGQuIEVhY2ggdGllciBzcGVjaWZpZXMgaG93IG1hbnkgbWlzc2VzIGFyZQ0BIHRvbGVyYXRlZCB3aXRoaW4gcmVjZW50IGdhbWVzIGJlZm9yZSBhIHBhcnRpY2lwYW50J3MgcGVyc29uaG9vZCBpcywgc3VzcGVuZGVkLgDsIFdoZW4gZW1wdHkgb3IgdW5zZXQsIGEgaGFyZGNvZGVkIGRlZmF1bHQgc2NoZWR1bGUgaXMgdXNlZC4AREFic2VuY2VHcmFjZVJhdGlvAQDRCAgAABgVASBUaGUgY3VycmVudGx5IGFjdGl2ZSBhYnNlbmNlLWdyYWNlIHJhdGlvIGAoYWxsb3dlZF9taXNzZXMsIHdpbmRvdylgLCUBIGRlcml2ZWQgZnJvbSBgQWJzZW5jZUdyYWNlU2NoZWR1bGVgIGFuZCB0aGUgY3VycmVudCBhY3RpdmUtcGVyc29uIGNvdW50LgARASBVcGRhdGVkIGVhY2ggdGltZSBgdXBkYXRlX3RocmVzaG9sZHMoKWAgcnVucyAoYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5HQEgYXR0ZW5kYW5jZSByZXBvcnQgc2Vzc2lvbikuIFJlYWQgYnkgYHNldF9hdHRlbmRhbmNlYCB0byBkZWNpZGUgd2hldGhlcowgYSBwYXJ0aWNpcGFudCBzaG91bGQgYmUgc3VzcGVuZGVkLgBIQ3VycmVudFJvdW5kUG9pbnRzAQA4EAAAAAAEtCBUaGUgYWNjdW11bGF0ZWQgcG9pbnRzIGluIHRoZSBjdXJyZW50IHJvdW5kLgBEQ3VycmVudFJvdW5kSW5kZXgBADgQAAAAAByAIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCByb3VuZC4AXQEgVGhpcyBtdXN0IGJlIHRoZSBzdW0gb2YgYWxsIHBvaW50cyBhY2N1bXVsYXRlZCBpbiBgUm91bmRzUG9pbnRzRm9yUGFydGljaXBhbnRgIGZvciB0aGU8IGN1cnJlbnQgcm91bmQuAFEBICoqV0FSTklORyoqOiBUaGlzIHN0b3JhZ2UgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggYFJvdW5kc1BvaW50c0ZvclBhcnRpY2lwYW50YCwgdXNltCBgZm4gYWRkX3BvaW50c190b19wYXJ0aWNpcGFudGAgdG8gdXBkYXRlIGl0LgBoUm91bmRzUG9pbnRzRm9yUGFydGljaXBhbnQBAQgCAqkKOBAAAAAAGNAgVGhlIHBvaW50cyBhY2N1bXVsYXRlZCBieSBhIHBhcnRpY2lwYW50IGluIGEgcm91bmQuAFEBIEZvciB0aGUgY3VycmVudCByb3VuZCwgdGhpcyBzdG9yYWdlIG11c3QgYmUgdXBkYXRlZCBhbG9uZ3NpZGUgYEN1cnJlbnRSb3VuZFBvaW50c2AuADEBICoqV0FSTklORyoqOiBUaGlzIHN0b3JhZ2UgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggYEN1cnJlbnRSb3VuZFBvaW50c2AsIHVzZbQgYGZuIGFkZF9wb2ludHNfdG9fcGFydGljaXBhbnRgIHRvIHVwZGF0ZSBpdC4AMFJvdW5kUGF5b3V0cwABBAI4rQoEABCoIFRoZSByb3VuZHMgdGhhdCBhcmUgY3VycmVudGx5IHBheWluZyBvdXQuABEBIFJvdW5kcyBhcmUgcGF5aW5nIG91dCBhZnRlciB0aGV5IGhhdmUgZmluaXNoZWQgYWNjdW11bGF0aW5nIHBvaW50cy4lASBXaGVuIGFsbCB0aGVpciBwb2ludHMgaGF2ZSBiZWVuIHBhaWQgb3V0LCB0aGV5IGFyZSByZW1vdmVkIGZyb20gc3RvcmFnZS4ANFJvdW5kUGxhbm5pbmcAALEKBAAM/CBUaGUgcGxhbm5pbmcgb2YgdGhlIGN1cnJlbnQgcm91bmQgdGhhdCBpcyBhY2N1bXVsYXRpbmcgcG9pbnRzLgA9ASBJZiBub25lIHRoZSBjdXJyZW50IHJvdW5kIGlzIG9uZ29pbmcgYW5kIHdpbGwgYmUgcGxhbm5lZCBvbiB0aGUgbmV4dCBzY2hlZHVsZS4AOFJvdW5kU2NoZWR1bGVzAQC1CgQABLggRGVzY3JpYmVzIHRoZSBzY2hlZHVsZXMgb2YgdGhlIHBheW91dCByb3VuZHMuAAGhBAABvQYAFFBDdXJyZW5jeUxvY2F0aW9uSW5mb+AwAQMAoQ8EMgV2yOsLBPQgVGhlIGxvY2F0aW9uIG9mIHRoZSB1c2VkIGN1cnJlbmN5LiBJdCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuAFBPZmZjaGFpbldvcmtJbnRlcnZhbDgQAgAAAASwIFRoZSBpbnRlcnZhbCBhdCB3aGljaCBvZmZjaGFpbiB3b3JrZXIgcnVucy4AMHNjb3JlX3BvdF9pZASAbW9kbHNjb3JlcG90AAAAAAAAAAAAAAAAAAAAAAAAAAAE4CBHZXQgYSB1bmlxdWUsIGluYWNjZXNzaWJsZSBhY2NvdW50IElEIGZyb20gdGhlIGBQb3RJZGAuADRzY29yZV9jb250ZXh0CIBwb3A6cG9sa2Fkb3QubmV0d29yay9zY29yZSAgICAgIAhZASBUaGUgY29udGV4dCB1c2VkIGZvciB0aGUgcHJvb2ZzIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSBhcyBhIHBlcnNvbmFsIGFsaWFzIGluIHNjb3JlICBwYWxsZXQuACh1YmlfcG9pbnRzOBAGAAAABBUBIFRoZSBudW1iZXIgb2YgcG9pbnRzIHJlY2VpdmVkIHdoZW4gYXR0ZW5kaW5nIGFzIGEgcmVjb2duaXplZCBwZXJzb24uAAHBCgAAADgAACBEdW1teURpbQEgRHVtbXlEaW0ILFJlc2VydmVkSWRzAAEEAigQBAAE3CBUaGUgcGVyc29uYWwgSURzIHRoYXQgYXJlIHJlc2VydmVkIGJ5IHVucHJvdmVuIHBlb3BsZS4AGFBlb3BsZQABBAUoxQoEAAS4IFRoZSBwZW9wbGUgd2UgdHJhY2sgYWxvbmcgd2l0aCB0aGVpciByZWNvcmRzLgABuQQAAcEGAAAByQoAAAA7AAAoUGVvcGxlTGl0ZQEoUGVvcGxlTGl0ZQgoTGl0ZVBlb3BsZQABBAIEzQoEAAAAUEF0dGVzdGF0aW9uQWxsb3dhbmNlAQEEAgQ4EAAAAAAEKQEgTnVtYmVyIG9mIGF0dGVzdGF0aW9ucyBhdmFpbGFibGUgdG8gZGlzdHJpYnV0ZSBmb3IgYSB2ZXJpZmllciBhY2NvdW50IGlkLgAB0QQAAcUGAAAB1QoABFBBdHRlc3RhdGlvblNpZ25hdHVyZS0ECGEBIFNpZ25hdHVyZSBnZW5lcmF0ZWQgYnkgbGl0ZSBwZW9wbGUgYW5kIHVzZWQgYnkgdmVyaWZpZXJzIHRvIGNsYWltIGF0dGVzdGF0aW9ucyBvbiB0aGVpciAgYmVoYWxmLgA+AAAkUmVzb3VyY2VzASRSZXNvdXJjZXMcJENvbnN1bWVycwABBAIE2QoEAAQpASBBY2NvdW50cyB1c2VkIHRvIGlkZW50aWZ5IGNvbnN1bWVycyBtYXBwZWQgdG8gdGhlaXIgY29uc3VtZXIgaW5mb3JtYXRpb24uAGhTdG10U3RvcmVBc3NvY2lhdGVkQWNjb3VudAABBAIEBAQABMQgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGEgc3RhdGVtZW50IHN0b3JlIHNsb3QuADxVc2VybmFtZU93bmVyT2YAAQQCOQQEBAAYcQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBgdXNlcm5hbWVgIHRvIHRoZSBgQWNjb3VudElkYCB0aGF0IGhhcyByZWdpc3RlcmVkIGl0LiBUaGUgYG93bmVyYCB2YWx1ZWUBIHNob3VsZCBiZSBhIGtleSBpbiB0aGUgYENvbnN1bWVyc2AgbWFwLiBUaGVyZSBjYW4gYmUgYXQgbW9zdCAyIHVzZXJuYW1lcyBwb2ludGluZyB0byB0aGU4IHNhbWUgYG93bmVyYDpxASAtIHVzZXJuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnN1bWVyJ3MgbGl0ZSBwZXJzb24gaWRlbnRpdHkgLSB0aGlzIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQ7WQEgLSBvcHRpb25hbGx5IGFub3RoZXIgdXNlcm5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zdW1lcidzIGZ1bGwgcGVyc29uIGlkZW50aXR5LCBpZjggICBhcHBsaWNhYmxlLgA4QWNjb3VudE9mQWxpYXMAAQQCCAQEAARpASBSZXZlcnNlIGxvb2t1cCBmcm9tIHJlZ2lzdGVyZWQgYWxpYXNlcyB0byB0aGUgYEFjY291bnRJZGAgdXNlZCB0byByZWdpc3RlciBhcyBhIGNvbnN1bWVyLgBsVXNlcm5hbWVSZXNlcnZhdGlvbkR1cmF0aW9uAQAoIAAAAAAAAAAACFUBIFRoZSBhbW91bnQgb2YgdGltZSBmb3Igd2hpY2ggYSB1c2VybmFtZSByZXNlcnZhdGlvbiBpcyB2YWxpZCwgaW4gc2Vjb25kcy4gQWZ0ZXIgdGhpc9AgdGltZSBwZXJpb2QgZWxhcHNlcywgdGhlIHJlc2VydmF0aW9uIGNhbiBiZSB2b2lkZWQuAGBVc2VybmFtZVJlc2VydmF0aW9uUXVldWUAAQQCOQTtCgQACHEBIE1hcCBmcm9tIGEgcmVzZXJ2ZWQgYHVzZXJuYW1lYCB0byBhIHF1ZXVlIG9mIGBSZXNlcnZhdGlvblF1ZXVlRW50cnlgIGl0ZW1zLCBlYWNoIGhvbGRpbmcgYW5hASBhY2NvdW50IGFuZCB0aGUgdGltZXN0YW1wIHdoZW4gaXQgam9pbmVkLiBPbGQgcmVzZXJ2YXRpb25zIGNhbiBiZSByZW1vdmVkIGZyb20gc3RvcmFnZS4ANFJlc2VydmF0aW9uT2YAAQQCBDkEBAAIZQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBhbiBhY2NvdW50IHRvIHRoZSB1c2VybmFtZSBpdCBoYXMgcmVzZXJ2ZWQuIEVhY2ggYWNjb3VudCBjYW4gaGF2ZSBhdJwgbW9zdCBvbmUgYWN0aXZlIHJlc2VydmF0aW9uIGF0IGEgdGltZS4AAeEEAAHJBgAgRE1heFVzZXJuYW1lTGVuZ3RoOBAgAAAABC0BIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lLCBpbmNsdWRpbmcgYW55IHBvdGVudGlhbCB0cmFpbGluZyBkaWdpdHMuAERNaW5Vc2VybmFtZUxlbmd0aDgQBgAAAASIIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lLgBIUGVyc29uQXV0aER1cmF0aW9uOBAAowIADFUBIFRoZSBkdXJhdGlvbiBvZiB0aW1lLCBpbiBzZWNvbmRzLCBmb3Igd2hpY2ggYSBwZXJzb24ncyBhdXRob3JpemF0aW9uIGlzIHZhbGlkLiBBZnRlclEBIHRoaXMgcGVyaW9kIGVsYXBzZXMsIHBlb3BsZSB3aWxsIG5vIGxvbmdlciBiZSBjb25zaWRlcmVkIGFjdGl2ZSwgYnV0IHRoZWlyIHJlc291cmNlDQEgYWxsb3dhbmNlcyBzaG91bGQgZGVmYXVsdCB0byB0aGUgc2FtZSB2YWx1ZXMgdXNlZCBmb3IgbGl0ZSBwZW9wbGUuAGxNaW5QZXJzb25BdXRoVXBkYXRlSW50ZXJ2YWw4EIBRAQAIVQEgVGhlIG1pbmltdW0gaW50ZXJ2YWwgb2YgdGltZSwgaW4gc2Vjb25kcywgd2hpY2ggbXVzdCBwYXNzIGJlZm9yZSB1cGRhdGluZyBhIHBlcnNvbidzPCBhdXRob3JpemF0aW9uLgBkTWF4UmVzZXJ2YXRpb25RdWV1ZUxlbmd0aDgQCgAAAAQpASBNYXhpbXVtIG51bWJlciBvZiBhY2NvdW50cyB0aGF0IGNhbiBxdWV1ZSBmb3IgYSBzaW5nbGUgcmVzZXJ2ZWQgdXNlcm5hbWUuAFBBY2NvdW50c0FwaVNsb3RDb3VudDgQCAAAAAzgIFRoZSBudW1iZXIgb2Ygc2xvdHMgZm9yIHRoZSBhY2NvdW50cyBBUEkgYXV0aG9yaXphdGlvbi4A+CBJbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHJlcXVpcmUgYSBtaWdyYXRpb24uAGRBY2NvdW50c0FwaVJlZnVuZENvb2xkb3duOBCAUQEABNwgVGhlIHJlZnVuZCBjb29sZG93biwgaW4gc2Vjb25kcywgZm9yIHRoZSBhY2NvdW50cyBBUEkuAFBBY2NvdW50c0FwaUFsbG93YW5jZfkKIAIAAAAAyAAABNAgVGhlIFN0YXRlbWVudCBTdG9yZSBhbGxvd2FuY2UgZm9yIHRoZSBhY2NvdW50cyBBUEkuAAH9CgAERE9mZmNoYWluU2lnbmF0dXJlLQQIUQEgU2lnbmF0dXJlIHR5cGUgZm9yIGVuc3VyaW5nIG93bmVyc2hpcCBvZiBwcm92aWRlZCBhY2NvdW50cyBpbiBjYXNlIG9mIHJlZ2lzdHJhdGlvbnM8IHRocm91Z2ggYWxpYXMuAD8AADRDaHVua3NNYW5hZ2VyATRDaHVua3NNYW5hZ2VyCBhDaHVua3MAAQgFBQELBQsEAAQZASBQYWdpbmF0ZWQgY29sbGVjdGlvbiBvZiBjaHVua3MgKFJpbmdFeHBvbmVudCAtPiBQYWdlSW5kZXggLT4gQ2h1bmtzKS4APENodW5rUGFnZUhhc2hlcwABCAUFAQsIBAAEiCBUaGUgaGFzaCBmb3IgZWFjaCBwYWdlIG9mIGNodW5rcy4AAe0EAAHNBgAEIFBhZ2VTaXplOBD/AAAABMwgTnVtYmVyIG9mIGNodW5rcyBwZXIgcGFnZS4gTXVzdCBiZSBhIHBvd2VyIG9mIHR3by4AARELAAQUQ2h1bmsJCwRwIFRoZSB0eXBlIG9mIGEgc2luZ2xlIGNodW5rLgBAAAAcTWVtYmVycwEcTWVtYmVyc0QsQ29sbGVjdGlvbnMAAQQGCBULBAAE4CBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIGNvbGxlY3Rpb24sIGtleWVkIGJ5IGlkZW50aWZpZXIuAFBTdXNwZW5kZWRDb2xsZWN0aW9ucwABBAYIFQsEAAghASBDb2xsZWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZm9yIGRlbGV0aW9uIGFuZCBhcmUgYmVpbmcgcHJvY2Vzc2VkLlkBIE9uY2UgYSBjb2xsZWN0aW9uIGlzIG1vdmVkIGhlcmUsIG5vcm1hbCBvcGVyYXRpb25zIHdpbGwgZmFpbCB3aXRoIENvbGxlY3Rpb25Ob3RGb3VuZC4ANElkZW50aWZpZXJzT2YAAQQCGQshCwQABMwgVGhlIGlkZW50aWZpZXJzIG9mIGNvbGxlY3Rpb25zIG93bmVkIGJ5IGFuIGVudGl0eS4AEFJvb3QAAQgGAiULKQsEAASIIFRoZSBjdXJyZW50IG1lbWJlcnMgd2UgcmVjb2duaXNlLgBAQ3VycmVudFJpbmdJbmRleAEBBAYIOBAAAAAABOQgS2VlcHMgdHJhY2sgb2YgdGhlIHJpbmcgaW5kZXggY3VycmVudGx5IGJlaW5nIHBvcHVsYXRlZC4AOE9uYm9hcmRpbmdTaXplAQEEBgg4EAAAAAAE+CBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHF1ZXVlZCBiZWZvcmUgb25ib2FyZGluZyB0byBhIHJpbmcuACBSaW5nS2V5cwEBDAYCBTULOQsEABBhASBCb3RoIHRoZSBrZXlzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGJ1aWx0IHJpbmdzIGFuZCB0aGUga2V5cyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmdXR1cmVZASByaW5ncy4gUGFnaW5hdGVkIGJ5IChJZGVudGlmaWVyLCBSaW5nSW5kZXgsIFBhZ2VJbmRleCkgd2hlcmUgZWFjaCBwYWdlIGNvbnRhaW5zIHVwIHRvdQEgYFJpbmdDYXBhY2l0eUZyb21FeHBvbmVudGAga2V5cy4gVGhlIHBhZ2Ugc2l6ZSBlcXVhbHMgdGhlIGZsZXhpYmxlIHJpbmcgZXhwb25lbnQncyBjYXBhY2l0eSz0IGVuc3VyaW5nIEZsZXhpYmxlIGNvbGxlY3Rpb25zIG5ldmVyIG5lZWQgbW9yZSB0aGFuIG9uZSBwYWdlLgA4UmluZ0tleXNTdGF0dXMBAQgGAiULPQskAAAAAAAAAAAACGEBIFN0b3JlcyB0aGUgbWV0YSBpbmZvcm1hdGlvbiBmb3IgZWFjaCByaW5nLCB0aGUgbnVtYmVyIG9mIGtleXMgYW5kIGhvdyBtYW55IGFyZSBhY3R1YWxseVggaW5jbHVkZWQgaW4gdGhlIHJvb3QuAEhQZW5kaW5nU3VzcGVuc2lvbnMBAQgGBSULQQsEAAxpASBBIG1hcCBvZiBhbGwgcmluZ3Mgd2hpY2ggY3VycmVudGx5IGhhdmUgcGVuZGluZyBzdXNwZW5zaW9ucyBhbmQgbmVlZCBjbGVhbmluZywgYWxvbmcgd2l0aBEBIHRoZWlyIHJlc3BlY3RpdmUgbnVtYmVyIG9mIHN1c3BlbmRlZCBrZXlzIHdoaWNoIG5lZWQgdG8gYmUgcmVtb3ZlZC5tASBOb3RlOiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBzaW5nbGUtcGFnZSByaW5ncywgc28gYm91bmRlZCBieSBgUmluZ0NhcGFjaXR5RnJvbUV4cG9uZW50YC4ANEFjdGl2ZU1lbWJlcnMBAQQGCDgQAAAAAATQIFRoZSBudW1iZXIgb2YgbWVtYmVycyBjdXJyZW50bHkgaW5jbHVkZWQgaW4gYSByaW5nLgAcTWVtYmVycwABBAJRBEULBAAQcQEgVGhlIGN1cnJlbnQgbWVtYmVycyBwYXJ0IG9mIGFsbCBjb2xsZWN0aW9ucyAoZWl0aGVyIGluY2x1ZGVkIGluIHJpbmdzLCBzdXNwZW5kZWQgYW5kIHF1ZXVlZCEBIGZvciByZW1vdmFsIGZyb20gYSByaW5nLCBzdXNwZW5kZWQgYW5kIG5vdCBpbiBhbnkgcmluZywgb3Igb25ib2FyZGluZykuABEBIE1lbWJlciBwdWJsaWMga2V5IHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIG1lbWJlcnNoaXAgYW5kIHN0YXR1cy4AKFJpbmdzU3RhdGUBAQQGCE0LBAAE/CBUaGUgY3VycmVudCBzdGF0ZSBvZiBhbGwgcmluZ3MgbWFuYWdlZCBmb3IgYSBnaXZlbiBpZGVudGlmaWVyLgAoU3RhbGVSaW5ncwABCAYFJQsQBAAEzCBTZXQgb2YgcmluZ3Mgd2hpY2ggYXJlIHN0YWxlIGFuZCByZXF1aXJlIGJ1aWxkaW5nLgBAUXVldWVQYWdlSW5kaWNlcwEBBAYI9QYgAAAAAAAAAAAEOQEgS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgaW5kaWNlcyBvZiB0aGUgaGVhZCBhbmQgdGFpbCBvZiB0aGUgb25ib2FyZGluZyBxdWV1ZS4APE9uYm9hcmRpbmdRdWV1ZQEBCAYFJQtVCwQABC0BIFBhZ2luYXRlZCBjb2xsZWN0aW9uIG9mIG1lbWJlciBwdWJsaWMga2V5cyByZWFkeSB0byBiZSBpbmNsdWRlZCBpbiBhIHJpbmcuAEhEZWxldGlvbkluUHJvZ3Jlc3MAAFkLBAAU5CBUaGUgY29sbGVjdGlvbiBjdXJyZW50bHkgYmVpbmcgZGVsZXRlZCBhbmQgaXRzIHByb2dyZXNzLgA9ASBPbmx5IG9uZSBjb2xsZWN0aW9uIGlzIGFjdGl2ZWx5IGRlbGV0ZWQgYXQgYSB0aW1lLiBXaGVuIGEgY29sbGVjdGlvbiBpcyBtYXJrZWQxASBmb3IgZGVsZXRpb24sIGl0IGlzIGFkZGVkIGhlcmUgd2hlbiBkZWxldGlvbiBwcm9jZXNzaW5nIGJlZ2lucy4gUHJvZ3Jlc3MgaXMFASB0cmFja2VkIHRvIGFsbG93IHJlc3VtcHRpb24gaWYgd2VpZ2h0IHJ1bnMgb3V0IGR1cmluZyBgb25faWRsZWAuAERSaW5nRGVsZXRpb25RdWV1ZQABDAYFBTULEAQAFJggUXVldWUgb2YgcmluZyBwYWdlcyBwZW5kaW5nIGRlbGV0aW9uLgAVASBUaGlzIGlzIHVzZWQgYm90aCBieSBgcmVtb3ZlX3JpbmdgIChpbmRpdmlkdWFsIHJpbmcgZGVsZXRpb24pIGFuZCBieS0BIGNvbGxlY3Rpb24gZGVsZXRpb24uIFJpbmcgcGFnZXMgYXJlIHByb2Nlc3NlZCBmcm9tIHRoaXMgcXVldWUgaW4gYG9uX2lkbGVgrCByZWdhcmRsZXNzIG9mIHdoaWNoIG9wZXJhdGlvbiBxdWV1ZWQgdGhlbS4AAfkEAAHRBgAQOE1heENvbGxlY3Rpb25zOBBkAAAABMQgTWF4aW11bSBudW1iZXIgb2YgY29sbGVjdGlvbnMgYW4gb3duZXIgY2FuIGhhdmUuAFxPbmJvYXJkaW5nUXVldWVQYWdlU2l6ZTgQ/wAAAAhNASBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIGluY2x1ZGVkIGluIGFuIG9uYm9hcmRpbmcgcXVldWUgcGFnZSBiZWZvcmUgYSBuZXcgb25lIGlzJCBjcmVhdGVkLgBcTWF4RmxleGlibGVSaW5nRXhwb25lbnTxBAQJDF0BIFRoZSBtYXhpbXVtIHJpbmcgZXhwb25lbnQgdXNlZCBmb3IgRmxleGlibGUgY29sbGVjdGlvbnMuIFRoaXMgYWxzbyBkZXRlcm1pbmVzIHRoZSBwYWdlVQEgc2l6ZSBmb3IgcGFnaW5hdGVkIHJpbmcga2V5IHN0b3JhZ2UuIEZsZXhpYmxlIGNvbGxlY3Rpb25zIGNhbiBvbmx5IHVzZSByaW5nIHNpemVzIHVwPCB0byB0aGlzIHZhbHVlLgBcUmluZ0J1aWxkaW5nTWVtYmVyTGltaXQ4EGQAAAAIYQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhIHJpbmcgdGhyb3VnaCBhIHNpbmdsZSByb290IGJ1aWxkaW5nGCBjYWxsLgABYQsABCBMb2NhdGlvbuAEOQEgTG9jYXRpb24gdHlwZSBmb3IgaWRlbnRpZnlpbmcgY29sbGVjdGlvbiBvd25lcnMgZnJvbSBvdGhlciBjaGFpbnMvcGFyYWNoYWlucy4AQwAAHENvaW5hZ2UBHENvaW5hZ2U8MENvaW5zQnlPd25lcgABBAUEaQMEABBAIENvaW5zIGJ5IG93bmVyLgBdASBUaGlzIHN0b3JhZ2UgbWFwIGNvbnRhaW5zIGFsbCB0aGUgY29pbnMgY3VycmVudGx5IGNpcmN1bGF0aW5nLiBUaGUgY29pbiBpcyBtaW50ZWQgd2hlbiUBIHVubG9hZGVkIGZyb20gdGhlIHJlY3ljbGVyLCBhbmQgZGVzdHJveWVkIHdoZW4gbG9hZGVkIGludG8gdGhlIHJlY3ljbGVyLgAsTG9ja2VkQ29pbnMAAQQFBGULBAAQBQEgVGVtcG9yYXJ5IGxvY2sgZXhwaXJ5IGZvciBjb2lucyB0aGF0IHByZXZpb3VzbHkgZmFpbGVkIGRpc3BhdGNoLgBlASBBIGNvaW4gb3duZXIgZW50cnkgaXMgbG9ja2VkIHVudGlsIHRoZSBzdG9yZWQgVW5peCB0aW1lc3RhbXAsIHByZXZlbnRpbmcgcmVwZWF0ZWQgZmFpbGVklCBkaXNwYXRjaCBhdHRlbXB0cyBpbiBhIHNob3J0IHBlcmlvZC4AaFRvdGFsVmFsdWVPZkRlc3Ryb3llZENvaW5zAQDEQAAAAAAAAAAAAAAAAAAAAAAUqCBUaGUgdG90YWwgdmFsdWUgb2YgY29pbnMgdGhhdCB3ZXJlIGJ1cm50LgBpASBUaGlzIHRyYWNrcyB2YWx1ZSB0aGF0IGlzIGludGVudGlvbmFsbHkgZGVzdHJveWVkIGFzIHBhcnQgb2YgcHJvdG9jb2wgZmxvd3MgKGZvciBleGFtcGxlOmUBIHJlY3ljbGVyIGV4cGlyYXRpb24gY2xlYW51cCBhbmQgb3V0cHV0LXRva2VuIHNwYW0gcGVuYWx0eSBwYXRoKS4gVGhpcyBzdG9yYWdlIGl0ZW0ga2VlcHPIIHRyYWNrIG9mIHRoZSB0b3RhbCB2YWx1ZSBvZiBzdWNoIGRlc3Ryb3llZCBjb2lucy4AYENvbnN1bWVkRnJlZVVubG9hZFRva2VucwABCAUF5QkQBAAYxCBDb25zdW1lZCBmcmVlIHVubG9hZCB0b2tlbnMgYnkgcGVyaW9kIGFuZCBhbGlhcy4AVQEgVGhpcyBzdG9yYWdlIGtlZXBzIHRyYWNrIG9mIHRoZSBmcmVlIHVubG9hZCB0b2tlbnMgdGhhdCBoYXZlIGJlZW4gY29uc3VtZWQgYnkgcGVvcGxlrCBhbmQgbGl0ZSBwZW9wbGUsIHRvIGF2b2lkIGRvdWJsZSBzcGVuZGluZy4AcCBJdCBpcyBjbGVhcmVkIHBlcmlvZGljYWxseS4AZFJlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWQAAQQFbQMQBABAEQEgVHJhY2tzIHdoZXRoZXIgYSByZWN5Y2xlciBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBjb2luIHZhbHVlLgBdASBBbGwgcmVjeWNsZXIgY29sbGVjdGlvbnMgYXJlIGNyZWF0ZWQgZWFnZXJseSBkdXJpbmcgb25lLXRpbWUgYG9uX3BvbGxgIGluaXRpYWxpemF0aW9uLi0BIFtgUmVjeWNsZXJNYW5hZ2VyOjplbnN1cmVfY29sbGVjdGlvbl9leGlzdHNgXSBzZXJ2ZXMgYXMgYSBzYWZldHkgZmFsbGJhY2suAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgB0UmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXgAAQQFbQM4BABAxCBMYXN0IHJlbW92ZWQgcmluZyBpbmRleCBwZXIgcmVjeWNsZXIgY29pbiB2YWx1ZS4ARQEgUmluZ3MgYXJlIHJlbW92ZWQgc2VxdWVudGlhbGx5IHN0YXJ0aW5nIGZyb20gaW5kZXggMC4gVGhlIG5leHQgcmluZyB0byBjaGVjayBmb3ItASBleHBpcmF0aW9uIGlzIGBsYXN0X3JlbW92ZWQgKyAxYCAob3IgYDBgIGlmIG5vdGhpbmcgaGFzIGJlZW4gcmVtb3ZlZCB5ZXQpLgBVASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFJlY3ljbGVyTWFuYWdlcmBdIHR5cGUgaW5zdGVhZC4AVQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgbWFuYWdlZCBieSBbYFJlY3ljbGVyTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ6QQEgKiBbUmVjeWNsZXJDb2xsZWN0aW9uQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBjb2luIHZhbHVlLlUBICogW1JlY3ljbGVyc0xhc3RSZW1vdmVkUmluZ0luZGV4XSAtIHRoZSBsYXN0IHJlbW92ZWQgcmluZyBpbmRleCBmb3IgZWFjaCBjb2luIHZhbHVlLlkBICogW1JlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyXSAtIHRoZSBtYXBwaW5nIGZyb20gbWVtYmVyIGtleSB0byB0aGUgY29pbiB2YWx1ZSBpdCBpcyBpbi5hASAqIFtSZWN5Y2xlcnNVbmxvYWRlZF0gLSB0aGUgcmVjeWNsZXJzJyB1bmxvYWRlZCBhbGlhc2VzLCBpbmRleGVkIGJ5IGNvaW4gdmFsdWUgYW5kIHJpbmckICAgaW5kZXguKQEgKiBbUmVjeWNsZXJzRHVzdGluZ10gLSBtYXJrcyByaW5ncyB3aXRoIHVubG9hZGVkIGFsaWFzZXMgcGVuZGluZyByZW1vdmFsLgBhASBSaW5nIG1lbWJlcnMsIHBlbmRpbmcgbWVtYmVycywgYW5kIHJpbmcgc3RhdGUgYXJlIG1hbmFnZWQgYnkgW2BDb25maWc6Ok1lbWJlclNlcnZpY2VgXS4AXFJlY3ljbGVyc0NvaW5Ub1JlY3ljbGVyAAEEBVEEbQMEAEARASBNYXBwaW5nIGZyb20gYSByZWN5Y2xlciBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGJlbG9uZ3MgdG8uAE0BIFdoZW4gYSBjb2luIGlzIGxvYWRlZCBpbnRvIGEgcmVjeWNsZXIsIHRoZSBtZW1iZXIga2V5IGlzIHJlY29yZGVkIGhlcmUgc28gdGhhdCB0aGUNASBwYWxsZXQgY2FuIGxvb2sgdXAgd2hpY2ggY29pbiB2YWx1ZSB0aGUgbWVtYmVyIGtleSBjb3JyZXNwb25kcyB0by4AVQEgKipXQVJOSU5HKio6IERvIG5vdCB1c2UgdGhpcyBzdG9yYWdlIGRpcmVjdGx5LCB1c2UgW2BSZWN5Y2xlck1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFUBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BSZWN5Y2xlck1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OkEBICogW1JlY3ljbGVyQ29sbGVjdGlvbkNyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgY29pbiB2YWx1ZS5VASAqIFtSZWN5Y2xlcnNMYXN0UmVtb3ZlZFJpbmdJbmRleF0gLSB0aGUgbGFzdCByZW1vdmVkIHJpbmcgaW5kZXggZm9yIGVhY2ggY29pbiB2YWx1ZS5ZASAqIFtSZWN5Y2xlcnNDb2luVG9SZWN5Y2xlcl0gLSB0aGUgbWFwcGluZyBmcm9tIG1lbWJlciBrZXkgdG8gdGhlIGNvaW4gdmFsdWUgaXQgaXMgaW4uYQEgKiBbUmVjeWNsZXJzVW5sb2FkZWRdIC0gdGhlIHJlY3ljbGVycycgdW5sb2FkZWQgYWxpYXNlcywgaW5kZXhlZCBieSBjb2luIHZhbHVlIGFuZCByaW5nJCAgIGluZGV4LikBICogW1JlY3ljbGVyc0R1c3RpbmddIC0gbWFya3MgcmluZ3Mgd2l0aCB1bmxvYWRlZCBhbGlhc2VzIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAERSZWN5Y2xlcnNVbmxvYWRlZAABDAUFBW0LEAQAQDUBIFRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgKGNvaW4gdmFsdWUsIHJpbmcgaW5kZXgsIGFsaWFzKS4AVQEgV2hlbiBhIGNvaW4gaXMgdW5sb2FkZWQgZnJvbSBhIHJlY3ljbGVyLCB0aGUgYWxpYXMgcHJvZHVjZWQgYnkgdGhlIHJpbmctVlJGIHByb29mIGlzGQEgc3RvcmVkIGhlcmUgdG8gcHJldmVudCBkb3VibGUtc3BlbmRpbmcgd2l0aGluIHRoZSBzYW1lIHJlY3ljbGVyIHJpbmcuAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBAUmVjeWNsZXJzRHVzdGluZwABBAVxCxAEAEgFASBNYXJrcyByZWN5Y2xlciByaW5ncyB0aGF0IGhhdmUgdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuACEBIFdoZW4gYSByZWN5Y2xlciByaW5nIGlzIHJlbW92ZWQsIHRoZSBjbGVhbnVwIG9mIGl0cyB1bmxvYWRlZCBhbGlhc2VzIGluUQEgW1JlY3ljbGVyc1VubG9hZGVkXSBpcyBwZXJmb3JtZWQgZ3JhZHVhbGx5IHRocm91Z2ggdGhpcyBzdG9yYWdlIGl0ZW0uIEFuIGVudHJ5IGhlcmVRASBpbmRpY2F0ZXMgdGhhdCB1bmxvYWRlZCBhbGlhc2VzIGZvciB0aGUgZ2l2ZW4gY29pbiB2YWx1ZSBhbmQgcmluZyBpbmRleCBzdGlsbCBleGlzdFggYW5kIHNob3VsZCBiZSBkdXN0ZWQuAFUBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUmVjeWNsZXJNYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBVASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUmVjeWNsZXJNYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDpBASAqIFtSZWN5Y2xlckNvbGxlY3Rpb25DcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIGNvaW4gdmFsdWUuVQEgKiBbUmVjeWNsZXJzTGFzdFJlbW92ZWRSaW5nSW5kZXhdIC0gdGhlIGxhc3QgcmVtb3ZlZCByaW5nIGluZGV4IGZvciBlYWNoIGNvaW4gdmFsdWUuWQEgKiBbUmVjeWNsZXJzQ29pblRvUmVjeWNsZXJdIC0gdGhlIG1hcHBpbmcgZnJvbSBtZW1iZXIga2V5IHRvIHRoZSBjb2luIHZhbHVlIGl0IGlzIGluLmEBICogW1JlY3ljbGVyc1VubG9hZGVkXSAtIHRoZSByZWN5Y2xlcnMnIHVubG9hZGVkIGFsaWFzZXMsIGluZGV4ZWQgYnkgY29pbiB2YWx1ZSBhbmQgcmluZyQgICBpbmRleC4pASAqIFtSZWN5Y2xlcnNEdXN0aW5nXSAtIG1hcmtzIHJpbmdzIHdpdGggdW5sb2FkZWQgYWxpYXNlcyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBYUGFpZFVubG9hZFRva2VuTWVtYmVycwABBAVRBBAEADgJASBNYXBwaW5nIGZyb20gYSBwYWlkIHRva2VuIG1lbWJlciBrZXkgdG8gdGhlIHBlcmlvZCBpdCBiZWxvbmdzIHRvLgBFASBXaGVuIGEgdXNlciBwYXlzIGZvciBhIHJlY3ljbGVyIHVubG9hZCB0b2tlbiwgdGhlIG1lbWJlciBrZXkgaXMgcmVjb3JkZWQgaGVyZSBzbyEBIHRoYXQgdGhlIHBhbGxldCBjYW4gbG9vayB1cCB3aGljaCBwZXJpb2QgdGhlIG1lbWJlciBrZXkgY29ycmVzcG9uZHMgdG8uAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAFxQYWlkVW5sb2FkVG9rZW5Db25zdW1lZAABDAYFBXULEAQAOPQgQ29uc3VtZWQgcGFpZCB1bmxvYWQgdG9rZW5zIGJ5IHBlcmlvZCwgcmluZyBpbmRleCBhbmQgYWxpYXMuAEkBIFdoZW4gYSBwYWlkIHVubG9hZCB0b2tlbiBpcyBjb25zdW1lZCwgdGhlIGFsaWFzIHByb2R1Y2VkIGJ5IHRoZSByaW5nLVZSRiBwcm9vZiBpc/Qgc3RvcmVkIGhlcmUgdG8gcHJldmVudCBkb3VibGUtc3BlbmRpbmcgd2l0aGluIHRoZSBzYW1lIHJpbmcuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAGxQYWlkVG9rZW5Db2xsZWN0aW9uc0NyZWF0ZWQAAQQGOBAEADgJASBUcmFja3Mgd2hldGhlciBhIHBhaWQgdG9rZW4gY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgZ2l2ZW4gcGVyaW9kLgBVASBVc2VzIGBJZGVudGl0eWAgaGFzaGVyIHNvIHRoYXQgaXRlcmF0aW9uIHlpZWxkcyBwZXJpb2RzIGluIG9yZGVyLCBlbmFibGluZyBlZmZpY2llbnRwIGNsZWFudXAgb2YgZXhwaXJlZCBwZXJpb2RzLgBRASAqKldBUk5JTkcqKjogRG8gbm90IHVzZSB0aGlzIHN0b3JhZ2UgZGlyZWN0bHksIHVzZSBbYFBhaWRUa25NYW5hZ2VyYF0gdHlwZSBpbnN0ZWFkLgBRASBUaGlzIHN0b3JhZ2UgaXRlbSBpcyBtYW5hZ2VkIGJ5IFtgUGFpZFRrbk1hbmFnZXJgXSBhbmQgaXMgcGFydCBvZiBhIGNvbnNpc3RlbnQgc2V0OvAgKiBbUGFpZFVubG9hZFRva2VuTWVtYmVyc10gLSB0cmFja3MgcmVnaXN0ZXJlZCBtZW1iZXIga2V5cy4ZASAqIFtQYWlkVW5sb2FkVG9rZW5Db25zdW1lZF0gLSB0aGUgY29uc3VtZWQgcGFpZCB1bmxvYWQgdG9rZW4gYWxpYXNlcy45ASAqIFtQYWlkVG9rZW5Db2xsZWN0aW9uc0NyZWF0ZWRdIC0gd2hldGhlciB0aGUgY29sbGVjdGlvbiBleGlzdHMgZm9yIGEgcGVyaW9kLkUBICogW1BhaWRVbmxvYWRUb2tlbkR1c3RpbmddIC0gbWFya3MgcGVyaW9kcyB3aXRoIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAGEBIFJpbmcgbWVtYmVycywgcGVuZGluZyBtZW1iZXJzLCBhbmQgcmluZyBzdGF0ZSBhcmUgbWFuYWdlZCBieSBbYENvbmZpZzo6TWVtYmVyU2VydmljZWBdLgBYUGFpZFVubG9hZFRva2VuRHVzdGluZwABBAY4EAQAQC0BIE1hcmtzIHBhaWQgdW5sb2FkIHRva2VuIHBlcmlvZHMgdGhhdCBoYXZlIGNvbnN1bWVkIHRva2VucyBwZW5kaW5nIHJlbW92YWwuAFkBIFdoZW4gYSBwYWlkIHVubG9hZCB0b2tlbiBjb2xsZWN0aW9uIGlzIHJlbW92ZWQsIHRoZSBjbGVhbnVwIG9mIGl0cyBjb25zdW1lZCB0b2tlbnMgaW5VASBbUGFpZFVubG9hZFRva2VuQ29uc3VtZWRdIGlzIHBlcmZvcm1lZCBncmFkdWFsbHkgdGhyb3VnaCB0aGlzIHN0b3JhZ2UgaXRlbS4gQW4gZW50cnlNASBoZXJlIGluZGljYXRlcyB0aGF0IGNvbnN1bWVkIHRva2VucyBmb3IgdGhlIGdpdmVuIHBlcmlvZCBzdGlsbCBleGlzdCBhbmQgc2hvdWxkIGJlICBkdXN0ZWQuAFEBICoqV0FSTklORyoqOiBEbyBub3QgdXNlIHRoaXMgc3RvcmFnZSBkaXJlY3RseSwgdXNlIFtgUGFpZFRrbk1hbmFnZXJgXSB0eXBlIGluc3RlYWQuAFEBIFRoaXMgc3RvcmFnZSBpdGVtIGlzIG1hbmFnZWQgYnkgW2BQYWlkVGtuTWFuYWdlcmBdIGFuZCBpcyBwYXJ0IG9mIGEgY29uc2lzdGVudCBzZXQ68CAqIFtQYWlkVW5sb2FkVG9rZW5NZW1iZXJzXSAtIHRyYWNrcyByZWdpc3RlcmVkIG1lbWJlciBrZXlzLhkBICogW1BhaWRVbmxvYWRUb2tlbkNvbnN1bWVkXSAtIHRoZSBjb25zdW1lZCBwYWlkIHVubG9hZCB0b2tlbiBhbGlhc2VzLjkBICogW1BhaWRUb2tlbkNvbGxlY3Rpb25zQ3JlYXRlZF0gLSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGV4aXN0cyBmb3IgYSBwZXJpb2QuRQEgKiBbUGFpZFVubG9hZFRva2VuRHVzdGluZ10gLSBtYXJrcyBwZXJpb2RzIHdpdGggY29uc3VtZWQgdG9rZW5zIHBlbmRpbmcgcmVtb3ZhbC4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAHhQYWlkVW5sb2FkVG9rZW5OZXh0UmluZ1RvQ2xlYW4AAQQGODgEAGD0IFRyYWNrcyB0aGUgbmV4dCByaW5nIGluZGV4IHRvIGNsZWFuIGZvciBlYWNoIGV4cGlyZWQgcGVyaW9kLgA1ASBVc2VkIGJ5IHRoZSBPQ1cgdG8gZGV0ZXJtaW5lIGNsZWFudXAgcHJvZ3Jlc3MgYW5kIGJ5IHRoZSBjb2xsZWN0aW9uIGRlbGV0aW9uxCBleHRyaW5zaWMgdG8gdmVyaWZ5IGFsbCByaW5ncyBoYXZlIGJlZW4gY2xlYW5lZC4APQEgUmluZ3MgYXJlIGNsZWFuZWQgc2VxdWVudGlhbGx5IChvbmUgcGVyIE9DVyBpbnRlcnZhbCkgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UuPQEgVGhpcyBpcyBpbnRlbnRpb25hbDogYSBzaW5nbGUgc3RvcmFnZSBjdXJzb3IgZW5hYmxlcyBPKDEpIGNvbXBsZXRpb24gY2hlY2tzIGluzCBib3RoIFtgUGFpZFRrbk1hbmFnZXI6OmVuc3VyZV9jYW5fY2xlYW5fcmluZ2BdIGFuZEUBIFtgUGFpZFRrbk1hbmFnZXI6OmVuc3VyZV9jYW5fZGVsZXRlX2NvbGxlY3Rpb25gXS4gVGhlIGFsdGVybmF0aXZlIOKAlCBzdWJtaXR0aW5nVQEgYWxsIHJpbmcgY2xlYW5zIGluIHBhcmFsbGVsIOKAlCB3b3VsZCByZXF1aXJlIGZldGNoaW5nIHJpbmcgbWVtYmVycyB0byBjaGVjayB3aGV0aGVyTQEgZWFjaCByaW5nIHdhcyBhbHJlYWR5IGNsZWFuZWQgKHNpbmNlIGByaW5nX3N0YXR1c2Agc3RpbGwgcmVwb3J0cyBgdG90YWwgPiAwYCBhZnRlclUBIGNsZWFudXAgYmVjYXVzZSByaW5ncyBhcmUgbm90IHJlbW92ZWQgdW50aWwgY29sbGVjdGlvbiBkZWxldGlvbikuIENsZWFudXAgb2YgZXhwaXJlZE0BIGNvbGxlY3Rpb25zIGlzIG5vdCB0aW1lLWNyaXRpY2FsLCBzbyB0aGUgc2ltcGxlciBzZXF1ZW50aWFsIGFwcHJvYWNoIGlzIHByZWZlcnJlZC4AUQEgKipXQVJOSU5HKio6IERvIG5vdCB1c2UgdGhpcyBzdG9yYWdlIGRpcmVjdGx5LCB1c2UgW2BQYWlkVGtuTWFuYWdlcmBdIHR5cGUgaW5zdGVhZC4AUQEgVGhpcyBzdG9yYWdlIGl0ZW0gaXMgbWFuYWdlZCBieSBbYFBhaWRUa25NYW5hZ2VyYF0gYW5kIGlzIHBhcnQgb2YgYSBjb25zaXN0ZW50IHNldDrwICogW1BhaWRVbmxvYWRUb2tlbk1lbWJlcnNdIC0gdHJhY2tzIHJlZ2lzdGVyZWQgbWVtYmVyIGtleXMuGQEgKiBbUGFpZFVubG9hZFRva2VuQ29uc3VtZWRdIC0gdGhlIGNvbnN1bWVkIHBhaWQgdW5sb2FkIHRva2VuIGFsaWFzZXMuOQEgKiBbUGFpZFRva2VuQ29sbGVjdGlvbnNDcmVhdGVkXSAtIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZXhpc3RzIGZvciBhIHBlcmlvZC5FASAqIFtQYWlkVW5sb2FkVG9rZW5EdXN0aW5nXSAtIG1hcmtzIHBlcmlvZHMgd2l0aCBjb25zdW1lZCB0b2tlbnMgcGVuZGluZyByZW1vdmFsLh0BICogW1BhaWRVbmxvYWRUb2tlbk5leHRSaW5nVG9DbGVhbl0gLSBzZXF1ZW50aWFsIHJpbmcgY2xlYW51cCBwcm9ncmVzcy4AYQEgUmluZyBtZW1iZXJzLCBwZW5kaW5nIG1lbWJlcnMsIGFuZCByaW5nIHN0YXRlIGFyZSBtYW5hZ2VkIGJ5IFtgQ29uZmlnOjpNZW1iZXJTZXJ2aWNlYF0uAFxJbml0aWFsaXplUGFsbGV0QWNjb3VudAAAEAQAEMQgV2hldGhlciB0aGUgcGFsbGV0IGFjY291bnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuAFkBIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFsbGV0IGFjY291bnQgd2l0aCBtaW5pbXVtIGJhbGFuY2Ugc28gdGhhdCBpdCBjYW4gaG9sZCBhbnnsIGFtb3VudCBvZiB1bmRlcmx5aW5nIGFzc2V0IGV2ZW4gbGVzcyB0aGFuIG1pbmltdW0gYmFsYW5jZS4AAf0EAAHVBgA8UFJlY3ljbGVyUmluZ0V4cG9uZW508QQECQSwIFRoZSByaW5nIGV4cG9uZW50IGZvciByZWN5Y2xlciBjb2xsZWN0aW9ucy4AbFBhaWRVbmxvYWRUb2tlblJpbmdFeHBvbmVudPEEBAkE1CBUaGUgcmluZyBleHBvbmVudCBmb3IgcGFpZCB1bmxvYWQgdG9rZW4gY29sbGVjdGlvbnMuAERVbmRlcmx5aW5nQXNzZXRJZOAwAQMAoQ8EMgV2yOsLBMwgVGhlIGFzc2V0IGlkIG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IG9mIHRoZSBjb2lucy4ATFVuZGVybHlpbmdBc3NldFVuaXTEQAAAwW/yhiMAAAAAAAAAAAAEvCBUaGUgdW5pdCBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBvZiB0aGUgY29pbnMuADxNaW5pbXVtRXhwb25lbnRtAwQABKQgVGhlIG1pbmltdW0gZXhwb25lbnQgZm9yIHRoZSBjb2luIHZhbHVlLgA8TWF4aW11bUV4cG9uZW50bQMEDgSkIFRoZSBtYXhpbXVtIGV4cG9uZW50IGZvciB0aGUgY29pbiB2YWx1ZS4APE1heFNwbGl0T3V0cHV0czgQIAAAAASsIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBhIHNwbGl0LgBATWF4Q29uc29saWRhdGlvbjgQQAAAAATcIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGlhcyBwcm9vZnMgaW4gYSBjb25zb2xpZGF0aW9uLgCUVW5sb2FkVG9rZW5UaW1lUGVyaW9kUGVvcGxlTGl0ZVBlb3BsZTgQgFEBAATgIFRoZSB0aW1lIHBlcmlvZCBkdXJhdGlvbiBmb3IgdW5sb2FkIHRva2VucywgaW4gc2Vjb25kcy4AqFVubG9hZFRva2VuQWxsb3dhbmNlUGVyVGltZVBlcmlvZEZvclBlb3BsZcRAAADITmdtwRsAAAAAAAAAABRdASBUaGUgYWxsb3dhbmNlIG9mIHVubG9hZCB0b2tlbnMgdGhhdCBhIHBlcnNvbiBjYW4gdXNlIHBlciB0aW1lIHBlcmlvZCwgZXhwcmVzc2VkIGluIHRoZUggdW5kZXJseWluZyBhc3NldC4AVQEgVXNlIHBhbGxldCB2aWV3IHRvIGZldGNoIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiB1bmxvYWQgdG9rZW5zIGdpdmVuIHRoZSBjdXJyZW50ZCBwcmljZSBmb3IgdW5sb2FkIHRva2Vucy4AuFVubG9hZFRva2VuQWxsb3dhbmNlUGVyVGltZVBlcmlvZEZvckxpdGVQZW9wbGXEQAAAstNZW/AGAAAAAAAAAAAUYQEgVGhlIGFsbG93YW5jZSBvZiB1bmxvYWQgdG9rZW5zIHRoYXQgYSBsaXRlIHBlcnNvbiBjYW4gdXNlIHBlciB0aW1lIHBlcmlvZCwgZXhwcmVzc2VkIGluWCB0aGUgdW5kZXJseWluZyBhc3NldC4AWQEgVXNlIHBhbGxldCdzIGdldF9mcmVlX3VubG9hZF90b2tlbl9pbmZvKCkgdG8gZmV0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHVubG9hZMggdG9rZW5zIGdpdmVuIHRoZSBjdXJyZW50IHByaWNlIGZvciB1bmxvYWQgdG9rZW5zLgCATWF4RnJlZVVubG9hZFRva2Vuc1BlclRpbWVQZXJpb2Q4EAoAAAAQGQEgSGFyZCB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGZyZWUgdW5sb2FkIHRva2VucyBwZXIgdGltZSBwZXJpb2QuAIwgVGhlIGVmZmVjdGl2ZSBmcmVlIHRva2VuIGxpbWl0IGlzOgkBIGBtaW4oYWxsb3dhbmNlIC8gY3VycmVudF9mZWUsIE1heEZyZWVVbmxvYWRUb2tlbnNQZXJUaW1lUGVyaW9kKWAuAFhPZmZjaGFpbldvcmtlckludGVydmFsOBAEAAAABPAgVGhlIG51bWJlciBvZiBibG9jayBiZXR3ZWVuIHR3byBvZmZjaGFpbiB3b3JrZXIgZXhlY3V0aW9ucy4AVENvaW5GYWlsdXJlTG9ja1BlcmlvZCggPAAAAAAAAAAQUQEgVGhlIGJhc2UgbnVtYmVyIG9mIHNlY29uZHMgdG8gbG9jayBhIGNvaW4gYWZ0ZXIgYSBmYWlsZWQgZGlzcGF0Y2ggaW4gYEFzQ29pbmAgZmxvdy4APQEgVGhlIGFjdHVhbCBsb2NrIGR1cmF0aW9uIGlzIGV4cG9uZW50aWFsOiBgMl5yZXRyaWVzICogYmFzZWAgd2hlcmUgYHJldHJpZXNgIGlzkCB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzLgA4cGFsbGV0X2FjY291bnQEgG1vZGxjb2luYWdlIAAAAAAAAAAAAAAAAAAAAAAAAAAABHggVGhlIGFjY291bnQgaWQgb2YgdGhlIHBhbGxldC4AAXkLAABAesJxLIp2pSrDuhCikCHsmfkvJO5tPVdJfo88UmFcYWFoZ2V0X2ZyZWVfdW5sb2FkX3Rva2VuX2luZm8AfQskTQEgR2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiBmcmVlIHVubG9hZCB0b2tlbnMgZGlzdHJpYnV0ZWQgdG8gcGVvcGxlIGFuZCBsaXRlIHBlb3BsZawgZ2l2ZW4gdGhlIGN1cnJlbnQgcHJpY2UgZm9yIHVubG9hZCB0b2tlbnMuAF0BIElmIGFuIGVsZW1lbnQgaXMgYE5vbmVgLCBubyBwcmljZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGFuZCBjb252ZXJzaW9uIGJldHdlZW4gbmF0aXZlxCBhbmQgdGhlIHVuZGVybHlpbmcgYXNzZXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZC4AuCBSZXR1cm5zOiBgKGxpbWl0X3Blb3BsZSwgbGltaXRfbGl0ZV9wZW9wbGUpYC4A6CBFYWNoIGVsZW1lbnQgaXMgYE5vbmVgIHdoZW4gaXRzIGxpbWl0IGNhbm5vdCBiZSBjb21wdXRlZC4AesJxLIp2pSrDuhCikCHsmXPdGYKfacSTnvrLZoqsg6tgZ2V0X3JlY3ljbGVyX3Jpbmdfc3RhdHVzCBR2YWx1ZW0DFGluZGV4OIELBOggR2V0IHRoZSByaW5nIHN0YXR1cyBmb3IgYSByZWN5Y2xlciBhdCBhIGdpdmVuIHJpbmcgaW5kZXguAHrCcSyKdqUqw7oQopAh7JlI2ljtqFXqlVC+vSqiW33yaGdldF9yZWN5Y2xlcl9yaW5nX3JldmlzaW9uCBR2YWx1ZW0DFGluZGV4OAkDBPAgR2V0IHRoZSByaW5nIHJldmlzaW9uIGZvciBhIHJlY3ljbGVyIGF0IGEgZ2l2ZW4gcmluZyBpbmRleC4AesJxLIp2pSrDuhCikCHsmbXvxoCaa/NrA65X9MZsBIloZ2V0X3BhaWRfdG9rZW5fcmluZ19zdGF0dXMIGHBlcmlvZDgUaW5kZXg4gQsEHQEgR2V0IHRoZSByaW5nIHN0YXR1cyBmb3IgYSBwYWlkIHRva2VuIGF0IGEgZ2l2ZW4gcGVyaW9kIGFuZCByaW5nIGluZGV4LgB6wnEsinalKsO6EKKQIeyZoPbDEPaoKp98du8gf/2eNXBnZXRfcGFpZF90b2tlbl9yaW5nX3JldmlzaW9uCBhwZXJpb2Q4FGluZGV4OAkDBCUBIEdldCB0aGUgcmluZyByZXZpc2lvbiBmb3IgYSBwYWlkIHRva2VuIGF0IGEgZ2l2ZW4gcGVyaW9kIGFuZCByaW5nIGluZGV4LgB6wnEsinalKsO6EKKQIeyZbrxV6ZzX4j5zJePs/NmbZohnZXRfcGFpZF91bmxvYWRfdG9rZW5fZmVlX2luX2Fzc2V0AD0IEBEBIEdldCB0aGUgY3VycmVudCBmZWUgaW4gdGhlIHVuZGVybHlpbmcgYXNzZXQgZm9yIHBhaWQgdW5sb2FkIHRva2Vucy4AXQEgSWYgbm9uZSBpcyByZXR1cm5lZCBpdCBtZWFucyB0aGF0IG5vIHByaWNlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUsIGFuZCBzb21lIGNvbnZlcnNpb24BASBiZXR3ZWVuIG5hdGl2ZSBhbmQgdGhlIHVuZGVybHlpbmcgYXNzZXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZC4AesJxLIp2pSrDuhCikCHsmc69RKDPUdW6mU9sD+As6eqMZ2V0X3BhaWRfdW5sb2FkX3Rva2VuX2ZlZV9pbl9uYXRpdmUAxAQNASBHZXQgdGhlIGN1cnJlbnQgZmVlIGluIHRoZSBuYXRpdmUgY3VycmVuY3kgZm9yIHBhaWQgdW5sb2FkIHRva2Vucy4AesJxLIp2pSrDuhCikCHsmZ5ekF5ZqkCfsYBreJmmF4VEZ2V0X2NvaW5fYnlfb3duZXIEFG93bmVyBIULBIQgR2V0IGNvaW4gZGV0YWlscyBmb3IgYW4gYWNjb3VudC4AesJxLIp2pSrDuhCikCHsmdqcFukkgqX3o5fxn/ykfxpMZ2V0X2NvaW5fbG9ja191bnRpbAQUb3duZXIEFQMMVQEgR2V0IHRoZSBVbml4IHRpbWVzdGFtcCB1bnRpbCB3aGljaCBhIGNvaW4gaXMgY3VycmVudGx5IGxvY2tlZCBhZnRlciBmYWlsZWQgZGlzcGF0Y2guAEkBIFJldHVybnMgYE5vbmVgIHdoZW4gdGhlcmUgaXMgbm8gbG9jayBvciB3aGVuIHRoZSBzdG9yZWQgbG9jayBoYXMgYWxyZWFkeSBleHBpcmVkLgB6wnEsinalKsO6EKKQIeyZZGMoqHl4CvwS4UJZYBFgUGBnZXRfcmVjeWNsZXJfbWVtYmVyX2luZm8EGG1lbWJlclEEiQsE3CBHZXQgdGhlIGNvaW4gdmFsdWUgZm9yIGEgc3BlY2lmaWMgcmVjeWNsZXIgbWVtYmVyIGtleS4AesJxLIp2pSrDuhCikCHsmU8iBwpDfNFUQuU+iaAqaHRQaXNfcGFpZF90b2tlbl9tZW1iZXIEGG1lbWJlclEEyATUIENoZWNrIHdoZXRoZXIgYSBwYWlkIHRva2VuIG1lbWJlciBrZXkgaXMgcmVnaXN0ZXJlZC4AesJxLIp2pSrDuhCikCHsmSz2R2QhM2Gdfx48vF24ezhQZ2V0X3JlY3ljbGVyX21lbWJlcnMIFHZhbHVlbQMUaW5kZXg4TQQI4CBHZXQgdGhlIG1lbWJlcnMgb2YgYSByZWN5Y2xlciByaW5nICh0aGUgYW5vbnltaXR5IHNldCkuDQEgUmVxdWlyZWQgdG8gYnVpbGQgdGhlIHJpbmcgY29tbWl0bWVudCAoYWNjdW11bGF0b3IpIGZvciB0aGUgcHJvb2YuAHrCcSyKdqUqw7oQopAh7JnxOPwgaPI+APZVDu3OYk9hbGdldF9wYWlkX3Rva2VuX3JpbmdfbWVtYmVycwgYcGVyaW9kOBRpbmRleDhNBAjoIEdldCB0aGUgbWVtYmVycyBvZiBhIHBhaWQgdG9rZW4gcmluZyAodGhlIGFub255bWl0eSBzZXQpLg0BIFJlcXVpcmVkIHRvIGJ1aWxkIHRoZSByaW5nIGNvbW1pdG1lbnQgKGFjY3VtdWxhdG9yKSBmb3IgdGhlIHByb29mLgB6wnEsinalKsO6EKKQIeyZBdqoOiIxhWluJeyB5LJ8hmhpc19yZWN5Y2xlcl9hbGlhc191bmxvYWRlZAwUdmFsdWVtAxRpbmRleDgUYWxpYXMIyAz0IENoZWNrIGlmIGEgcmVjeWNsZXIgYWxpYXMgaGFzIGFscmVhZHkgYmVlbiB1bmxvYWRlZCAoc3BlbnQpLgDwIElmIHRoZSByZWN5Y2xlciBpcyBub3QgbGl2ZSwgdGhlIHJlc3VsdCBpcyBub3Qgc2lnbmlmaWNhbnQuAHrCcSyKdqUqw7oQopAh7JkujYsqm8QIyFrkoAWIV9CPcGlzX3BhaWRfdG9rZW5fYWxpYXNfY29uc3VtZWQMGHBlcmlvZDgUaW5kZXg4FGFsaWFzCMgMwCBDaGVjayBpZiBhIHBhaWQgdW5sb2FkIHRva2VuIGhhcyBiZWVuIGNvbnN1bWVkLgD0IElmIHRoZSBwZXJpb2QgaXMgbm90IGN1cnJlbnQsIHRoZSByZXN1bHQgaXMgbm90IHNpZ25pZmljYW50LgB6wnEsinalKsO6EKKQIeyZvxLQeog2HQ71NeyLXBnl03Bpc19mcmVlX3Rva2VuX2FsaWFzX2NvbnN1bWVkCBhwZXJpb2Q4FGFsaWFzCMgMwCBDaGVjayBpZiBhIGZyZWUgdW5sb2FkIHRva2VuIGhhcyBiZWVuIGNvbnN1bWVkLgD0IElmIHRoZSBwZXJpb2QgaXMgbm90IGN1cnJlbnQsIHRoZSByZXN1bHQgaXMgbm90IHNpZ25pZmljYW50LgBEAABUU3RvcmFnZUluaXRpYWxpemF0aW9uAVRTdG9yYWdlSW5pdGlhbGl6YXRpb24IME9uUG9sbFN0YXR1cwEAjQsEAAT0IEN1cnJlbnQgc3RhdGUgb2YgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaW4gb25fcG9sbCBob29rLgBYWGNtVHJhbnNmZXJJbml0aWF0ZWRBdAAAOAQACLggQmxvY2sgbnVtYmVyIHdoZW4gWENNIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQugCBVc2VkIHRvIHRyYWNrIHRyYW5zZmVyIHRpbWVvdXQuAAAB2QYAAAAAADwAAGRTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlAWRTdG9yYWdlSW5pdGlhbGl6YXRpb25MaXRlBDBPblBvbGxTdGF0dXMBAJELBAAE9CBDdXJyZW50IHN0YXRlIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGluIG9uX3BvbGwgaG9vay4AAAHdBgAAAAAAQQAAHEFpcmRyb3ABHEFpcmRyb3AoNEV2ZW50U2NoZWR1bGUBAJULBAAM/CBBbGwgdGhlIHNjaGVkdWxlZCBldmVudHMuIEluIG9yZGVyIG9mIHJlZ2lzdHJhdGlvbiBzdGFydCB0aW1lLgA9ASBXQVJOSU5HOiBUaGlzIGl0ZW0gbXVzdCBiZSBrZXB0IGNvbnNpc3RlbnQgd2l0aCBgRXZlbnRTY2hlZHVsZUZpcnN0U3RhcnRUaW1lYC4AbEV2ZW50U2NoZWR1bGVGaXJzdFN0YXJ0VGltZQAAOAQAFOwgVGhlIGZpcnN0IHN0YXJ0IHRpbWUgb2YgdGhlIGZpcnN0IHNjaGVkdWxlZCBldmVudCwgaWYgYW55LgApASBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgdGhlIHByb29mIHNpemUgY29zdCBvZiByZWFkaW5nIHRoZSBlbnRpcmUgc2NoZWR1bGUuAAUBIFdBUk5JTkc6IFRoaXMgaXRlbSBtdXN0IGJlIGtlcHQgY29uc2lzdGVudCB3aXRoIGBFdmVudFNjaGVkdWxlYC4ALE5leHRFdmVudElkAQA4EAAAAAAEaCBUaGUgbmV4dCBnbG9iYWwgZXZlbnQgaWQuADBBY3RpdmVFdmVudHMAAQQFOKELBAAMbCBUaGUgY3VycmVudCBhY3RpdmUgZXZlbnRzLgAJASBXQVJOSU5HOiBUaGlzIGl0ZW0gbXVzdCBiZSBrZXB0IGNvbnNpc3RlbnQgd2l0aCBgQWN0aXZlRXZlbnRJZHNgLgA4QWN0aXZlRXZlbnRJZHMBAKkLBAAMmCBUaGUgaWRzIG9mIHRoZSBjdXJyZW50IGFjdGl2ZSBldmVudHMuAAEBIFdBUk5JTkc6IFRoaXMgaXRlbSBtdXN0IGJlIGtlcHQgY29uc2lzdGVudCB3aXRoIGBBY3RpdmVFdmVudHNgLgBsUGFydGljaXBhbnRJZFRvQWxpYXNBbmREZXN0AAEIBQX1Bq0LBAAEzCBUaGUgcGFydGljaXBhbnQgaWQgdG8gYWxpYXMgZm9yIHRoZSBhY3RpdmUgZXZlbnRzLgBQUGFydGljaXBhbnRBbGlhc1RvSWQAAQgFBeUJOAQABMwgVGhlIHBhcnRpY2lwYW50IGFsaWFzIHRvIGlkIGZvciB0aGUgYWN0aXZlIGV2ZW50cy4AVFdpbm5lcnNUb0Rpc3RyaWJ1dGVUbwEBBAU4sQsEAAwNASBUaGUgd2lubmVycyB0byB3aG9tIHRvIGRpc3RyaWJ1dGUgdGhlIHByaXplIGZvciB0aGUgYWN0aXZlIGV2ZW50cy4AFQEgVGhlIHdpbm5lcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhcyB0aGVpciBwcml6ZSBpcyBkaXN0cmlidXRlZC4AZFdpbm5lcnNXaXRoRmFpbGVkVHJhbnNmZXIAAQgFBbULuQsEAAQNASBUaGUgcHJpemVzIG9mIHdpbm5lcnMgdGhhdCBmYWlsZWQgdG8gYmUgdHJhbnNmZXJyZWQgYXV0b21hdGljYWxseS4AMFBhc3RBaXJkcm9wcwABBAY4vQsEAAhpASBIaXN0b3JpY2FsIHJlY29yZCBvZiBhbGwgcGFzdCBhaXJkcm9wcyB3aGljaCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IHVwIHVudGlsIHRoZSBwb2ludCBvZpwgZGlzdHJpYnV0aW5nIHRoZSBmdW5kcyB0byB0aGUgd2lubmVycy4AARkFAAHhBgAIOGFpcmRyb3BfcG90X2lkBIBtb2RscG9wOmFkcnAAAAAAAAAAAAAAAAAAAAAAAAAAAASQIFRoZSBhY2NvdW50IGlkIGZvciB0aGUgYWlyZHJvcCBwb3QuAFBhaXJkcm9wX2NvbnRleHRfYmFzZQkEcHBvcDpwb2xrYWRvdC5uZXR3b3JrL2FpcmRyb3AIWQEgVGhlIGJhc2UgY29udGV4dCBmb3IgYWlyZHJvcHMuIEVhY2ggYWlyZHJvcCBjb250ZXh0IGlzIGRlcml2ZWQgZnJvbSB0aGlzIGJhc2UgY29udGV4dMwgd2l0aCB0aGUgYWlyZHJvcCBpbmRleCBpbiBMRSBlbmNvZGluZyBhZGRlZCB0byBpdC4AAcULAAAAPQAAUE11bHRpQmxvY2tNaWdyYXRpb25zAVBNdWx0aUJsb2NrTWlncmF0aW9ucwgYQ3Vyc29yAAAtBQQADNggVGhlIGN1cnJlbnRseSBhY3RpdmUgbWlncmF0aW9uIHRvIHJ1biBhbmQgaXRzIGN1cnNvci4AvCBgTm9uZWAgaW5kaWNhdGVzIHRoYXQgbm8gbWlncmF0aW9uIGlzIHJ1bm5pbmcuACBIaXN0b3JpYwABBAVBBRAEABC0IFNldCBvZiBhbGwgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkIG1pZ3JhdGlvbnMuAHEBIFRoaXMgaXMgdXNlZCBhcyBibGFja2xpc3QsIHRvIG5vdCByZS1leGVjdXRlIG1pZ3JhdGlvbnMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSB0aGUxASBjb2RlYmFzZSB5ZXQuIEdvdmVybmFuY2UgY2FuIHJlZ3VsYXJseSBjbGVhciB0aGlzIG91dCB2aWEgYGNsZWFyX2hpc3RvcmljYC4AASUFAAHlBgAIMEN1cnNvck1heExlbjgQAAABABCkIFRoZSBtYXhpbWFsIGxlbmd0aCBvZiBhbiBlbmNvZGVkIGN1cnNvci4AZQEgQSBnb29kIGRlZmF1bHQgbmVlZHMgdG8gc2VsZWN0ZWQgc3VjaCB0aGF0IG5vIG1pZ3JhdGlvbiB3aWxsIGV2ZXIgaGF2ZSBhIGN1cnNvciB3aXRoIE1FTAkBIGFib3ZlIHRoaXMgbGltaXQuIFRoaXMgaXMgc3RhdGljYWxseSBjaGVja2VkIGluIGBpbnRlZ3JpdHlfdGVzdGAuAEBJZGVudGlmaWVyTWF4TGVuOBAAAQAAELQgVGhlIG1heGltYWwgbGVuZ3RoIG9mIGFuIGVuY29kZWQgaWRlbnRpZmllci4AVQEgQSBnb29kIGRlZmF1bHQgbmVlZHMgdG8gc2VsZWN0ZWQgc3VjaCB0aGF0IG5vIG1pZ3JhdGlvbiB3aWxsIGV2ZXIgaGF2ZSBhbiBpZGVudGlmaWVyLQEgd2l0aCBNRUwgYWJvdmUgdGhpcyBsaW1pdC4gVGhpcyBpcyBzdGF0aWNhbGx5IGNoZWNrZWQgaW4gYGludGVncml0eV90ZXN0YC4AAckLAAAAYgAACAQFACAtBAQASAAECAwQFBgcICQoLDA0ODxAREhQVmVyaWZ5TXVsdGlTaWduYXR1cmVNBRAgQXNQZXJzb25RBRBcQXNQcm9vZk9mSW5rUGFydGljaXBhbnRdBRBIU2NvcmVBc1BhcnRpY2lwYW50aQUQNEdhbWVBc0ludml0ZWR1BRA4UGVvcGxlTGl0ZUF1dGiBBRAkQXNDb2luYWdljQUQNEF1dGhvcml6ZUNhbGyhBRA8UmVzdHJpY3RPcmlnaW5zpQUQSENoZWNrTm9uWmVyb1NlbmRlcqkFEEBDaGVja1NwZWNWZXJzaW9urQU4OENoZWNrVHhWZXJzaW9usQU4MENoZWNrR2VuZXNpc7UFPDhDaGVja01vcnRhbGl0ebkFPChDaGVja05vbmNlwQUQLENoZWNrV2VpZ2h0xQUQUENoYXJnZUFzc2V0VHhQYXltZW50yQUQUFN0b3JhZ2VXZWlnaHRSZWNsYWltEBBUHEF1cmFBcGkINHNsb3RfZHVyYXRpb24AzQsMkCBSZXR1cm5zIHRoZSBzbG90IGR1cmF0aW9uIGZvciBBdXJhLgAlASBDdXJyZW50bHksIG9ubHkgdGhlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoaXMgdHlwZSBhdCBnZW5lc2lzIHdpbGwgYmUgdXNlZC4ALGF1dGhvcml0aWVzAI0IBJwgUmV0dXJuIHRoZSBjdXJyZW50IHNldCBvZiBhdXRob3JpdGllcy4ABLggQVBJIG5lY2Vzc2FyeSBmb3IgYmxvY2sgYXV0aG9yc2hpcCB3aXRoIGF1cmEuBABQUmVsYXlQYXJlbnRPZmZzZXRBcGkETHJlbGF5X3BhcmVudF9vZmZzZXQAOAT0IEZldGNoIHRoZSBzbG90IG9mZnNldCB0aGF0IGlzIGV4cGVjdGVkIGZyb20gdGhlIHJlbGF5IGNoYWluLgAQBQEgQVBJIHRvIHRlbGwgdGhlIG5vZGUgc2lkZSBob3cgdGhlIHJlbGF5IHBhcmVudCBzaG91bGQgYmUgY2hvc2VuLgBpASBBIGxhcmdlciBvZmZzZXQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbGF5IHBhcmVudCBzaG91bGQgbm90IGJlIHRoZSB0aXAgb2YgdGhlIHJlbGF5IGNoYWluLDEBIGJ1dCBgTmAgYmxvY2tzIGJlaGluZCB0aGUgdGlwLiBUaGlzIG9mZnNldCBpcyB0aGVuIGVuZm9yY2VkIGJ5IHRoZSBydW50aW1lLgQAYEF1cmFVbmluY2x1ZGVkU2VnbWVudEFwaQQ4Y2FuX2J1aWxkX3Vwb24INGluY2x1ZGVkX2hhc2g8EHNsb3SRCMgoOQEgV2hldGhlciBpdCBpcyBsZWdhbCB0byBleHRlbmQgdGhlIGNoYWluLCBhc3N1bWluZyB0aGUgZ2l2ZW4gYmxvY2sgaXMgdGhlIG1vc3Q1ASByZWNlbnRseSBpbmNsdWRlZCBvbmUgYXMtb2YgdGhlIHJlbGF5IHBhcmVudCB0aGF0IHdpbGwgYmUgYnVpbHQgYWdhaW5zdCwgYW5kcCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gc2xvdC4AUQEgVGhpcyBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBsb2dpYyB0aGUgcnVudGltZSB1c2VzIHdoZW4gdmFsaWRhdGluZyBibG9ja3MgdG84IGF2b2lkIGlzc3Vlcy4AYQEgV2hlbiB0aGUgdW5pbmNsdWRlZCBzZWdtZW50IGlzIGVtcHR5LCBpLmUuIGBpbmNsdWRlZF9oYXNoID09IGF0YCwgd2hlcmUgYXQgaXMgdGhlIGJsb2NrYQEgd2hvc2Ugc3RhdGUgd2UgYXJlIHF1ZXJ5aW5nIGFnYWluc3QsIHRoaXMgbXVzdCBhbHdheXMgcmV0dXJuIGB0cnVlYCBhcyBsb25nIGFzIHRoZSBzbG90vCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBpbmNsdWRlZCBibG9jayBpdHNlbGYuADQ1ASBUaGlzIHJ1bnRpbWUgQVBJIGlzIHVzZWQgdG8gaW5mb3JtIHBvdGVudGlhbCBibG9jayBhdXRob3JzIHdoZXRoZXIgdGhleSB3aWxsJQEgaGF2ZSB0aGUgcmlnaHQgdG8gYXV0aG9yIGF0IGEgc2xvdCwgYXNzdW1pbmcgdGhleSBoYXZlIGNsYWltZWQgdGhlIHNsb3QuAHUBIEluIHBhcnRpY3VsYXIsIHRoaXMgQVBJIGFsbG93cyBBdXJhLWJhc2VkIHBhcmFjaGFpbnMgdG8gcmVndWxhdGUgdGhlaXIgInVuaW5jbHVkZWQgc2VnbWVudCIsbQEgd2hpY2ggaXMgdGhlIHNlY3Rpb24gb2YgdGhlIGhlYWQgb2YgdGhlIGNoYWluIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBhdmFpbGFibGUgaW4gdGhlNCByZWxheSBjaGFpbi4AYQEgV2hlbiB0aGUgdW5pbmNsdWRlZCBzZWdtZW50IGlzIHNob3J0LCBBdXJhIGNoYWlucyB3aWxsIGFsbG93IGF1dGhvcnMgdG8gY3JlYXRlIG11bHRpcGxlXQEgYmxvY2tzIHBlciBzbG90IGluIG9yZGVyIHRvIGJ1aWxkIGEgYmFja2xvZy4gV2hlbiBpdCBpcyBzYXR1cmF0ZWQsIHRoaXMgQVBJIHdpbGwgbGltaXSoIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgY2FuIGJlIGNyZWF0ZWQuACQgQ2hhbmdlczqRASAtIFZlcnNpb24gMjogVXBkYXRlIHRvIGBjYW5fYnVpbGRfdXBvbmAgdG8gdGFrZSBhIHJlbGF5IGNoYWluIGBTbG90YCBpbnN0ZWFkIG9mIGEgcGFyYWNoYWluIGBTbG90YC4IABBDb3JlDBx2ZXJzaW9uACEHBJAgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcnVudGltZS4ANGV4ZWN1dGVfYmxvY2sEFGJsb2Nr0QsQBGQgRXhlY3V0ZSB0aGUgZ2l2ZW4gYmxvY2suAEBpbml0aWFsaXplX2Jsb2NrBBhoZWFkZXJc3QsEQQEgSW5pdGlhbGl6ZSBhIGJsb2NrIHdpdGggdGhlIGdpdmVuIGhlYWRlciBhbmQgcmV0dXJuIHRoZSBydW50aW1lIGV4ZWN1dGl2ZSBtb2RlLgAEIQEgVGhlIGBDb3JlYCBydW50aW1lIGFwaSB0aGF0IGV2ZXJ5IFN1YnN0cmF0ZSBydW50aW1lIG5lZWRzIHRvIGltcGxlbWVudC4UACBNZXRhZGF0YQwgbWV0YWRhdGEA4QsEjCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiBhIHJ1bnRpbWUuAExtZXRhZGF0YV9hdF92ZXJzaW9uBBx2ZXJzaW9uOOULEKQgUmV0dXJucyB0aGUgbWV0YWRhdGEgYXQgYSBnaXZlbiB2ZXJzaW9uLgAFASBJZiB0aGUgZ2l2ZW4gYHZlcnNpb25gIGlzbid0IHN1cHBvcnRlZCwgdGhpcyB3aWxsIHJldHVybiBgTm9uZWAudQEgVXNlIFtgU2VsZjo6bWV0YWRhdGFfdmVyc2lvbnNgXSB0byBmaW5kIG91dCBhYm91dCBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBvZiB0aGUgcnVudGltZS4ARG1ldGFkYXRhX3ZlcnNpb25zAFkEDKQgUmV0dXJucyB0aGUgc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb25zLgDAIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2FsbCBgbWV0YWRhdGFfYXRfdmVyc2lvbmAuAAQBASBUaGUgYE1ldGFkYXRhYCBhcGkgdHJhaXQgdGhhdCByZXR1cm5zIG1ldGFkYXRhIGZvciB0aGUgcnVudGltZS4IAExSdW50aW1lVmlld0Z1bmN0aW9uBFRleGVjdXRlX3ZpZXdfZnVuY3Rpb24IIHF1ZXJ5X2lk6QsUaW5wdXQY7QsEfCBFeGVjdXRlIGEgdmlldyBmdW5jdGlvbiBxdWVyeS4ABKQgUnVudGltZSBBUEkgZm9yIGV4ZWN1dGluZyB2aWV3IGZ1bmN0aW9ucwQAMEJsb2NrQnVpbGRlchA8YXBwbHlfZXh0cmluc2ljBCRleHRyaW5zaWM9B/ULEGwgQXBwbHkgdGhlIGdpdmVuIGV4dHJpbnNpYy4AOQEgUmV0dXJucyBhbiBpbmNsdXNpb24gb3V0Y29tZSB3aGljaCBzcGVjaWZpZXMgaWYgdGhpcyBleHRyaW5zaWMgaXMgaW5jbHVkZWQgaW5MIHRoaXMgYmxvY2sgb3Igbm90LgA4ZmluYWxpemVfYmxvY2sAXARoIEZpbmlzaCB0aGUgY3VycmVudCBibG9jay4ATGluaGVyZW50X2V4dHJpbnNpY3MEIGluaGVyZW50BQxNBwQ9ASBHZW5lcmF0ZSBpbmhlcmVudCBleHRyaW5zaWNzLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4APGNoZWNrX2luaGVyZW50cwgUYmxvY2vRCxBkYXRhBQwVDARVASBDaGVjayB0aGF0IHRoZSBpbmhlcmVudHMgYXJlIHZhbGlkLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4ABHEBIFRoZSBgQmxvY2tCdWlsZGVyYCBhcGkgdHJhaXQgdGhhdCBwcm92aWRlcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eSBmb3IgYnVpbGRpbmcgYSBibG9jay4YAFhUYWdnZWRUcmFuc2FjdGlvblF1ZXVlBFB2YWxpZGF0ZV90cmFuc2FjdGlvbgwYc291cmNlGQwIdHg9ByhibG9ja19oYXNoPB0MJGggVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uLgBlASBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBwb29sIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgZ2l2ZW4gdHJhbnNhY3Rpb24uRQEgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdHJhbnNhY3Rpb25NASBhZ2FpbnN0IGN1cnJlbnQgc3RhdGUuIFRoZSBnaXZlbiBgYmxvY2tfaGFzaGAgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggb2YgdGhlIGJsb2NrfCB0aGF0IGlzIHVzZWQgYXMgY3VycmVudCBzdGF0ZS4ARQEgTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgcGVyZm9ybWVkIGJ5IHRoZSBwb29sIG11bHRpcGxlIHRpbWVzIGFuZCB0cmFuc2FjdGlvbnOkIG1pZ2h0IGJlIHZlcmlmaWVkIGluIGFueSBwb3NzaWJsZSBvcmRlci4ABE0BIFRoZSBgVGFnZ2VkVHJhbnNhY3Rpb25RdWV1ZWAgYXBpIHRyYWl0IGZvciBpbnRlcmZlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBxdWV1ZS4MAERPZmZjaGFpbldvcmtlckFwaQQ8b2ZmY2hhaW5fd29ya2VyBBhoZWFkZXJcEATIIFN0YXJ0cyB0aGUgb2ZmLWNoYWluIHRhc2sgZm9yIGdpdmVuIGJsb2NrIGhlYWRlci4ABGQgVGhlIG9mZmNoYWluIHdvcmtlciBhcGkuCAAsU2Vzc2lvbktleXMIVGdlbmVyYXRlX3Nlc3Npb25fa2V5cwQQc2VlZEkFGBwVASBHZW5lcmF0ZSBhIHNldCBvZiBzZXNzaW9uIGtleXMgd2l0aCBvcHRpb25hbGx5IHVzaW5nIHRoZSBnaXZlbiBzZWVkLgkBIFRoZSBrZXlzIHNob3VsZCBiZSBzdG9yZWQgd2l0aGluIHRoZSBrZXlzdG9yZSBleHBvc2VkIHZpYSBydW50aW1lPCBleHRlcm5hbGl0aWVzLgCwIFRoZSBzZWVkIG5lZWRzIHRvIGJlIGEgdmFsaWQgYHV0ZjhgIHN0cmluZy4A0CBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgU0NBTEUgZW5jb2RlZCBwdWJsaWMga2V5cy4ATGRlY29kZV9zZXNzaW9uX2tleXMEHGVuY29kZWQYJQwMmCBEZWNvZGUgdGhlIGdpdmVuIHB1YmxpYyBzZXNzaW9uIGtleXMuANwgUmV0dXJucyB0aGUgbGlzdCBvZiBwdWJsaWMgcmF3IHB1YmxpYyBrZXlzICsga2V5IHR5cGUuAARoIFNlc3Npb24ga2V5cyBydW50aW1lIGFwaS4EADxBY2NvdW50Tm9uY2VBcGkENGFjY291bnRfbm9uY2UEHGFjY291bnQEOATAIEdldCBjdXJyZW50IGFjY291bnQgbm9uY2Ugb2YgZ2l2ZW4gYEFjY291bnRJZGAuAASAIFRoZSBBUEkgdG8gcXVlcnkgYWNjb3VudCBub25jZS4EAFRUcmFuc2FjdGlvblBheW1lbnRBcGkQKHF1ZXJ5X2luZm8IDHV4dD0HDGxlbjgxDAAARHF1ZXJ5X2ZlZV9kZXRhaWxzCAx1eHQ9BwxsZW44NQwAAExxdWVyeV93ZWlnaHRfdG9fZmVlBBh3ZWlnaHTVAcQAAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGg4xAAAABAAZFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGkQPHF1ZXJ5X2NhbGxfaW5mbwgQY2FsbCAMbGVuODEMBEkBIFF1ZXJ5IGluZm9ybWF0aW9uIG9mIGEgZGlzcGF0Y2ggY2xhc3MsIHdlaWdodCwgYW5kIGZlZSBvZiBhIGdpdmVuIGVuY29kZWQgYENhbGxgLgBYcXVlcnlfY2FsbF9mZWVfZGV0YWlscwgQY2FsbCAMbGVuODUMBLQgUXVlcnkgZmVlIGRldGFpbHMgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC4ATHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodNUBxAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBXZWlnaHRUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4ATHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aDjEBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYExlbmd0aFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LgAADAA0WGNtUGF5bWVudEFwaRB8cXVlcnlfYWNjZXB0YWJsZV9wYXltZW50X2Fzc2V0cwQseGNtX3ZlcnNpb244QQwUtCBSZXR1cm5zIGEgbGlzdCBvZiBhY2NlcHRhYmxlIHBheW1lbnQgYXNzZXRzLgAwICMgQXJndW1lbnRzAGggKiBgeGNtX3ZlcnNpb25gOiBWZXJzaW9uLgBAcXVlcnlfeGNtX3dlaWdodAQcbWVzc2FnZZUBTQwUqCBSZXR1cm5zIGEgd2VpZ2h0IG5lZWRlZCB0byBleGVjdXRlIGEgWENNLgAwICMgQXJndW1lbnRzAHQgKiBgbWVzc2FnZWA6IGBWZXJzaW9uZWRYY21gLgBkcXVlcnlfd2VpZ2h0X3RvX2Fzc2V0X2ZlZQgYd2VpZ2h01QEUYXNzZXQRA1EMGOggQ29udmVydHMgYSB3ZWlnaHQgaW50byBhIGZlZSBmb3IgdGhlIHNwZWNpZmllZCBgQXNzZXRJZGAuADAgIyBBcmd1bWVudHMAiCAqIGB3ZWlnaHRgOiBjb252ZXJ0aWJsZSBgV2VpZ2h0YC58ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0SWRgLgBMcXVlcnlfZGVsaXZlcnlfZmVlcwwsZGVzdGluYXRpb25JARxtZXNzYWdllQEgYXNzZXRfaWQRA1UMKGAgUXVlcnkgZGVsaXZlcnkgZmVlcyBWMi4AHQEgR2V0IGRlbGl2ZXJ5IGZlZXMgZm9yIHNlbmRpbmcgYSBzcGVjaWZpYyBgbWVzc2FnZWAgdG8gYSBgZGVzdGluYXRpb25gLvQgVGhlc2UgYWx3YXlzIGNvbWUgaW4gYSBzcGVjaWZpYyBhc3NldCwgZGVmaW5lZCBieSB0aGUgY2hhaW4uADAgIyBBcmd1bWVudHOBASAqIGBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdGhhdCdsbCBiZSBzZW50LCBuZWNlc3NhcnkgYmVjYXVzZSBtb3N0IGRlbGl2ZXJ5IGZlZXMgYXJlIGJhc2VkIG9uIHRoZVwgICBzaXplIG9mIHRoZSBtZXNzYWdlLmEBICogYGRlc3RpbmF0aW9uYDogVGhlIGRlc3RpbmF0aW9uIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8uIERpZmZlcmVudCBkZXN0aW5hdGlvbnMgbWF5IHVzZcAgICBkaWZmZXJlbnQgc2VuZGVycyB0aGF0IGNoYXJnZSBkaWZmZXJlbnQgZmVlcy4ALHAgQSB0cmFpdCBvZiBYQ00gcGF5bWVudCBBUEkuAKggQVBJIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG9idGFpbmluZzoAxCAqIHRoZSB3ZWlnaHQgcmVxdWlyZWQgdG8gZXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSwFASAqIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGBBc3NldElkYHMgZm9yIG1lc3NhZ2UgZXhlY3V0aW9uIHBheW1lbnQsAQEgKiB0aGUgY29zdCBvZiB0aGUgd2VpZ2h0IGluIHRoZSBzcGVjaWZpZWQgYWNjZXB0YWJsZSBgQXNzZXRJZGAuoCAqIHRoZSBmZWVzIGZvciBhbiBYQ00gbWVzc2FnZSBkZWxpdmVyeS4A8CBUbyBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiB3ZWlnaHQgb2YgdGhlIGNhbGxzIHJlcXVpcmVkIGZvcnUBIFtgeGNtOjpsYXRlc3Q6Okluc3RydWN0aW9uOjpUcmFuc2FjdGBdIGluc3RydWN0aW9uLCBgVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaWAgY2FuIGJlIHVzZWQuCABQTG9jYXRpb25Ub0FjY291bnRBcGkEQGNvbnZlcnRfbG9jYXRpb24EIGxvY2F0aW9uSQFZDASQIENvbnZlcnRzIGBMb2NhdGlvbmAgdG8gYEFjY291bnRJZGAuAAQNASBBUEkgZm9yIHVzZWZ1bCBjb252ZXJzaW9ucyBiZXR3ZWVuIFhDTSBgTG9jYXRpb25gIGFuZCBgQWNjb3VudElkYC4EAChNb2JSdWxlQXBpBCB2b3RlZF9vbggUdm90ZXIIJGRvbmVfb25sechZBAxZASBSZXR1cm5zIGEgbGlzdCBvZiBjYXNlcyB3aGVyZSB0aGUgdXNlciBoYXMgYSB2b3RlIHN0b3JlZCBvbiBjaGFpbi4gSWYgdGhlIGBkb25lX29ubHlgVQEgZmxhZyBpcyBzZXQsIG9ubHkgY2FzZXMgdGhhdCBhcmUgZG9uZSBhbmQgcmVhZHkgdG8gYmUgY2xhaW1lZCB3aWxsIGJlIHJldHVybmVkLiBUaGlzBQEgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHZvdGUgaW50byBhY2NvdW50LgAEtCBUaGUgQVBJIHRvIHF1ZXJ5IHRoZSByZXdhcmRzIGZvciBtb2IgY3JlZGl0LgQANFByb29mT2ZJbmtBcGkERGNhbmRpZGFjeV9kZXBvc2l0AMQE1CBSZXR1cm5zIHRoZSBkZXBvc2l0IG5lY2Vzc2FyeSB0byBiZWNvbWUgYSBjYW5kaWRhdGUuAATsIFRoZSBBUEkgdG8gcXVlcnkgdGhlIGRlcG9zaXQgZm9yIGEgcHJvb2Ygb2YgaW5rIGNhbmRpZGFjeS4EADRQYWxsZXRHYW1lQXBpCDBwbGF5X2RlcG9zaXQAxAS4IFJldHVybnMgdGhlIGRlcG9zaXQgbmVjZXNzYXJ5IHRvIHBsYXkgYSBnYW1lLgB4dmFsaWRhdGVfc3RhdGVtZW50X3dpdGhfcmVhc29uCBhzb3VyY2VhDCRzdGF0ZW1lbnRlDHkMBAUBIFN0YXRlbWVudCB2YWxpZGF0aW9uIHdpdGggcHJlY2lzZSByZWFzb24gZm9yIGludmFsaWQgc3RhdGVtZW50cy4ABKwgVGhlIEFQSSB0byBxdWVyeSB0aGUgZGVwb3NpdCBmb3IgZ2FtZXBsYXkuBABQQ29sbGVjdENvbGxhdGlvbkluZm8EWGNvbGxlY3RfY29sbGF0aW9uX2luZm8EGGhlYWRlclyBDBCcIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2xsYXRpb24uAPQgVGhlIGdpdmVuIGBoZWFkZXJgIGlzIHRoZSBoZWFkZXIgb2YgdGhlIGJ1aWx0IGJsb2NrIGZvciB0aGF0qCB3ZSBhcmUgY29sbGVjdGluZyB0aGUgY29sbGF0aW9uIGluZm8gZm9yLgAU2CBSdW50aW1lIGFwaSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGEgY29sbGF0aW9uLgBEIFZlcnNpb24gaGlzdG9yeToBASAtIFZlcnNpb24gMjogQ2hhbmdlZCBbYFNlbGY6OmNvbGxlY3RfY29sbGF0aW9uX2luZm9gXSBzaWduYXR1cmU1ASAtIFZlcnNpb24gMzogU2lnbmFscyB0byB0aGUgbm9kZSB0byB1c2UgdmVyc2lvbiAxIG9mIFtgUGFyYWNoYWluQmxvY2tEYXRhYF0uDAA4R2VuZXNpc0J1aWxkZXIMLGJ1aWxkX3N0YXRlBBBqc29uGI0MKGUBIEJ1aWxkIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZnJvbSBhIEpTT04gYmxvYiBub3QgdXNpbmcgYW55IGRlZmF1bHRzIGFuZCBzdG9yZSBpdCBpbiB0aGUkIHN0b3JhZ2UuACkBIEluIHRoZSBjYXNlIG9mIGEgRlJBTUUtYmFzZWQgcnVudGltZSwgdGhpcyBmdW5jdGlvbiBkZXNlcmlhbGl6ZXMgdGhlIGZ1bGxVASBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmQgcHV0cyBpdCBpbnRvIHRoZSBzdG9yYWdlLiBJZiB0aGVVASBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhlIGRlc2VyaWFsaXphdGlvbiBmYWlscywgYW4gZXJyb3I0IGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLgAoZ2V0X3ByZXNldAQIaWSRDEkFOGEBIFJldHVybnMgYSBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJ1aWx0LWluIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgaWRlbnRpZmllZCBieRggYGlkYC4AVQEgSWYgYGlkYCBpcyBgTm9uZWAgdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gSlNPTiBibG9iIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWZhdWx0SQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBzdHJ1Y3Qgb2YgdGhlIHJ1bnRpbWUuIEltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBkZWZhdWx0YCBgUnVudGltZUdlbmVzaXNDb25maWdgLgAhASBPdGhlcndpc2UgZnVuY3Rpb24gcmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGJ1aWx0LWluLCBuYW1lZFEBIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgcHJlc2V0IGlkZW50aWZpZWQgYnkgYGlkYCwgb3IgYE5vbmVgIGlmIHN1Y2ggcHJlc2V0IGRvZXMgbm90YQEgZXhpc3QuIFJldHVybmVkIGBWZWM8dTg+YCBjb250YWlucyBieXRlcyBvZiBKU09OIGJsb2IgKHBhdGNoKSB3aGljaCBjb21wcmlzZXMgYSBsaXN0IG9mTQEgKHBvdGVudGlhbGx5IG5lc3RlZCkga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIGZvciBjdXN0b21pemluZyB0aGUgZGVmYXVsdGUBIHJ1bnRpbWUgZ2VuZXNpcyBjb25maWcuIFRoZSBwYXRjaCBzaGFsbCBiZSBtZXJnZWQgKHJmYzczODYpIHdpdGggdGhlIEpTT04gcmVwcmVzZW50YXRpb25hASBvZiB0aGUgZGVmYXVsdCBgUnVudGltZUdlbmVzaXNDb25maWdgIHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgZ2VuZXNpcyBjb25maWcgdGhhdCBjYW6EIGJlIHVzZWQgaW4gYGJ1aWxkX3N0YXRlYCBtZXRob2QuADBwcmVzZXRfbmFtZXMAlQwQUQEgUmV0dXJucyBhIGxpc3Qgb2YgaWRlbnRpZmllcnMgZm9yIGF2YWlsYWJsZSBidWlsdGluIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgcHJlc2V0cy4AYQEgVGhlIHByZXNldHMgZnJvbSB0aGUgbGlzdCBjYW4gYmUgcXVlcmllZCB3aXRoIFtgR2VuZXNpc0J1aWxkZXI6OmdldF9wcmVzZXRgXSBtZXRob2QuIElmAQEgbm8gbmFtZWQgcHJlc2V0cyBhcmUgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWUgdGhlIGxpc3QgaXMgZW1wdHkuAATwIEFQSSB0byBpbnRlcmFjdCB3aXRoIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZm9yIHRoZSBydW50aW1lBABEVmFsaWRhdGVTdGF0ZW1lbnQESHZhbGlkYXRlX3N0YXRlbWVudAgYc291cmNlYQwkc3RhdGVtZW50ZQyZDARgIFZhbGlkYXRlIHRoZSBzdGF0ZW1lbnQuAASwIFJ1bnRpbWUgQVBJIHRyYWl0IGZvciBzdGF0ZW1lbnQgdmFsaWRhdGlvbi4EACDlBaEMAA=="; export default binMeta; \ No newline at end of file diff --git a/packages/host-papp/.papi/metadata/people_lite.scale b/packages/host-papp/.papi/metadata/people_lite.scale index fd3dbe61..2fb27c06 100644 Binary files a/packages/host-papp/.papi/metadata/people_lite.scale and b/packages/host-papp/.papi/metadata/people_lite.scale differ diff --git a/packages/host-papp/.papi/polkadot-api.json b/packages/host-papp/.papi/polkadot-api.json index c7f84cc2..b90624cb 100644 --- a/packages/host-papp/.papi/polkadot-api.json +++ b/packages/host-papp/.papi/polkadot-api.json @@ -8,8 +8,8 @@ "people_lite": { "wsUrl": "wss://paseo-people-next-rpc.polkadot.io", "metadata": ".papi/metadata/people_lite.scale", - "genesis": "0xd01475fde5d0592989b7715ae1d2e89fdb4f8c7688c09c850d75e1d4bdb47d64", - "codeHash": "0xee12eb3f12f8387448d2bf78c773dda08731483357a1b8fb773374f7b7bc417c" + "genesis": "0xa22a2424d2cbf561eaecf7da8b1b548fa9d1939f60265e942b1049616a012f71", + "codeHash": "0x0e48da626edc33a96d18d81fdc5eebe5d6a9b624af4ca4b9dbcc1345a3b03bb6" } } } diff --git a/packages/host-papp/__tests__/attestationService.spec.ts b/packages/host-papp/__tests__/attestationService.spec.ts index 9fdbc08a..db12d797 100644 --- a/packages/host-papp/__tests__/attestationService.spec.ts +++ b/packages/host-papp/__tests__/attestationService.spec.ts @@ -104,14 +104,11 @@ describe('createAttestationService', () => { } describe('grantVerifierAllowance', () => { - it('retries signAndSubmit on failure', async () => { - const signAndSubmit = vi.fn().mockRejectedValueOnce(new Error('Stale')).mockResolvedValueOnce(undefined); + function makeService(opts: { allowance: number; signAndSubmit: ReturnType }) { const mockApi = { query: { PeopleLite: { - AttestationAllowance: { - getValue: vi.fn().mockResolvedValue(0), - }, + AttestationAllowance: { getValue: vi.fn().mockResolvedValue(opts.allowance) }, }, }, tx: { @@ -119,78 +116,38 @@ describe('createAttestationService', () => { increase_attestation_allowance: vi.fn(() => ({ decodedCall: {} })), }, Sudo: { - sudo: vi.fn(() => ({ signAndSubmit })), + sudo: vi.fn(() => ({ signAndSubmit: opts.signAndSubmit })), }, }, }; + const lazyClient = { getClient: () => ({ getUnsafeApi: () => mockApi }) } as any; + return createAttestationService(lazyClient); + } - const lazyClient = { - getClient: () => ({ getUnsafeApi: () => mockApi }), - } as any; + it('retries signAndSubmit on failure and resolves on the second attempt', async () => { + const signAndSubmit = vi.fn().mockRejectedValueOnce(new Error('Stale')).mockResolvedValueOnce(undefined); + const service = makeService({ allowance: 0, signAndSubmit }); - const service = createAttestationService(lazyClient); const result = await service.grantVerifierAllowance(createMockAccount()); expect(result.isOk()).toBe(true); expect(signAndSubmit).toHaveBeenCalledTimes(2); }); - it('fails after retry is also exhausted', async () => { + it('fails after retries are exhausted', async () => { const signAndSubmit = vi.fn().mockRejectedValue(new Error('Stale')); - const mockApi = { - query: { - PeopleLite: { - AttestationAllowance: { - getValue: vi.fn().mockResolvedValue(0), - }, - }, - }, - tx: { - PeopleLite: { - increase_attestation_allowance: vi.fn(() => ({ decodedCall: {} })), - }, - Sudo: { - sudo: vi.fn(() => ({ signAndSubmit })), - }, - }, - }; + const service = makeService({ allowance: 0, signAndSubmit }); - const lazyClient = { - getClient: () => ({ getUnsafeApi: () => mockApi }), - } as any; - - const service = createAttestationService(lazyClient); const result = await service.grantVerifierAllowance(createMockAccount()); expect(result.isErr()).toBe(true); expect(signAndSubmit).toHaveBeenCalledTimes(2); }); - it('skips transaction when allowance is already sufficient', async () => { + it('skips the transaction when allowance is already sufficient', async () => { const signAndSubmit = vi.fn(); - const mockApi = { - query: { - PeopleLite: { - AttestationAllowance: { - getValue: vi.fn().mockResolvedValue(5), - }, - }, - }, - tx: { - PeopleLite: { - increase_attestation_allowance: vi.fn(() => ({ decodedCall: {} })), - }, - Sudo: { - sudo: vi.fn(() => ({ signAndSubmit })), - }, - }, - }; - - const lazyClient = { - getClient: () => ({ getUnsafeApi: () => mockApi }), - } as any; + const service = makeService({ allowance: 5, signAndSubmit }); - const service = createAttestationService(lazyClient); const result = await service.grantVerifierAllowance(createMockAccount()); expect(result.isOk()).toBe(true); diff --git a/packages/host-papp/__tests__/auth.spec.ts b/packages/host-papp/__tests__/auth.spec.ts new file mode 100644 index 00000000..5b46a7c5 --- /dev/null +++ b/packages/host-papp/__tests__/auth.spec.ts @@ -0,0 +1,428 @@ +import type { LazyClient, Statement, StatementStoreAdapter } from '@novasamatech/statement-store'; +import { errAsync, ok, okAsync } from 'neverthrow'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { createAuth } from '../src/sso/auth/impl.js'; +import type { UserSecretRepository } from '../src/sso/userSecretRepository.js'; +import type { UserSessionRepository } from '../src/sso/userSessionRepository.js'; + +const mocks = vi.hoisted(() => ({ + grantVerifierAllowance: vi.fn(), + registerLitePerson: vi.fn(), + claimUsername: vi.fn(), + decrypt: vi.fn(), + generateMnemonic: vi.fn(), + handshakeEnc: vi.fn(), + responsePayloadDec: vi.fn(), + responseSensitiveDec: vi.fn(), +})); + +vi.mock('@polkadot-labs/hdkd-helpers', async importOriginal => { + const actual = await importOriginal(); + return { + ...actual, + generateMnemonic: mocks.generateMnemonic, + }; +}); + +vi.mock('../src/crypto.js', async importOriginal => { + const actual = await importOriginal(); + return { + ...actual, + deriveSr25519Account: vi.fn(() => ({ + secret: new Uint8Array(64), + publicKey: new Uint8Array(32), + entropy: new Uint8Array(32), + sign: vi.fn(), + verify: vi.fn(() => true), + })), + createEncrSecret: vi.fn(() => new Uint8Array(32)), + getEncrPub: vi.fn(() => new Uint8Array(65)), + createSharedSecret: vi.fn(() => new Uint8Array(32)), + }; +}); + +vi.mock('../src/sso/auth/attestationService.js', () => ({ + createAttestationService: vi.fn(() => ({ + claimUsername: mocks.claimUsername, + grantVerifierAllowance: mocks.grantVerifierAllowance, + registerLitePerson: mocks.registerLitePerson, + })), + createSudoAliceVerifier: vi.fn(() => ({ + secret: new Uint8Array(64), + publicKey: new Uint8Array(32), + entropy: new Uint8Array(32), + sign: vi.fn(), + verify: vi.fn(() => true), + })), +})); + +vi.mock('../src/sso/auth/scale/handshake.js', () => ({ + HandshakeData: { enc: mocks.handshakeEnc }, + HandshakeResponsePayload: { dec: mocks.responsePayloadDec }, + HandshakeResponseSensitiveData: { dec: mocks.responseSensitiveDec }, +})); + +vi.mock('@novasamatech/statement-store', async importOriginal => { + const actual = await importOriginal(); + return { + ...actual, + createAccountId: vi.fn((bytes: Uint8Array) => bytes as never), + createLocalSessionAccount: vi.fn((accountId: unknown) => ({ accountId, kind: 'local' }) as never), + createRemoteSessionAccount: vi.fn( + (accountId: unknown, secret: unknown) => ({ accountId, secret, kind: 'remote' }) as never, + ), + createEncryption: vi.fn(() => ({ decrypt: mocks.decrypt })), + khash: vi.fn(() => new Uint8Array([42, 42, 42])), + }; +}); + +vi.mock('../src/sso/userSessionRepository.js', async importOriginal => { + const actual = await importOriginal(); + return { + ...actual, + createStoredUserSession: vi.fn( + (localAccount: unknown, remoteAccount: unknown, identityAccountId: unknown) => + ({ + id: 'session-id-1', + localAccount, + remoteAccount, + identityAccountId, + }) as never, + ), + }; +}); + +type DeliverFn = (statements: Statement[]) => void; + +function buildHarness() { + let deliver: DeliverFn | null = null; + const unsubscribe = vi.fn(); + const subscribeStatements = vi.fn((_filter: unknown, onPage: (page: { statements: Statement[] }) => void) => { + deliver = (statements: Statement[]) => onPage({ statements }); + return unsubscribe; + }); + + const statementStore = { subscribeStatements }; + const ssoSessionRepository = { add: vi.fn(() => okAsync(undefined)) }; + const userSecretRepository = { write: vi.fn(() => okAsync(undefined)) }; + const lazyClient = { getClient: () => ({ getUnsafeApi: () => ({}) }) }; + + const auth = createAuth({ + metadata: 'test-metadata', + hostMetadata: { hostVersion: '1.0', osType: 'iOS', osVersion: '18' }, + statementStore: statementStore as unknown as StatementStoreAdapter, + ssoSessionRepository: ssoSessionRepository as unknown as UserSessionRepository, + userSecretRepository: userSecretRepository as unknown as UserSecretRepository, + lazyClient: lazyClient as unknown as LazyClient, + }); + + return { + auth, + statementStore, + ssoSessionRepository, + userSecretRepository, + subscribeStatements, + unsubscribe, + async waitForSubscription(times = 1) { + await vi.waitFor(() => expect(subscribeStatements).toHaveBeenCalledTimes(times)); + }, + deliverHandshake() { + if (!deliver) throw new Error('subscribeStatements not yet called'); + deliver([{ data: new Uint8Array([0xde, 0xad]) } as Statement]); + }, + deliverPage(statements: Statement[]) { + if (!deliver) throw new Error('subscribeStatements not yet called'); + deliver(statements); + }, + }; +} + +beforeEach(() => { + mocks.grantVerifierAllowance.mockReset().mockReturnValue(okAsync(undefined)); + mocks.registerLitePerson.mockReset().mockReturnValue(okAsync(undefined)); + mocks.claimUsername.mockReset().mockReturnValue('guestabcd.1234'); + mocks.decrypt.mockReset().mockReturnValue(ok(new Uint8Array([7, 7, 7]))); + mocks.generateMnemonic.mockReset().mockReturnValue('test mnemonic'); + mocks.handshakeEnc.mockReset().mockReturnValue(new Uint8Array([0xab, 0xcd])); + mocks.responsePayloadDec.mockReset().mockReturnValue({ + tag: 'v1', + value: { encrypted: new Uint8Array([1, 2]), tmpKey: new Uint8Array(65) }, + }); + mocks.responseSensitiveDec.mockReset().mockReturnValue({ + sharedSecretDerivationKey: new Uint8Array(65), + rootUserAccountId: new Uint8Array(32), + identityAccountId: new Uint8Array(32), + }); +}); + +describe('createAuth', () => { + describe('initial state', () => { + it('starts with both statuses at "none"', () => { + const { auth } = buildHarness(); + expect(auth.pairingStatus.read()).toEqual({ step: 'none' }); + expect(auth.attestationStatus.read()).toEqual({ step: 'none' }); + }); + }); + + describe('authenticate (success path)', () => { + it('returns the same in-flight ResultAsync on concurrent calls', () => { + const { auth } = buildHarness(); + + const first = auth.authenticate(); + const second = auth.authenticate(); + + expect(second).toBe(first); + }); + + it('resolves with stored session and persists secrets and session', async () => { + const harness = buildHarness(); + const { auth, ssoSessionRepository, userSecretRepository } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + + const result = await promise; + + expect(result.isOk()).toBe(true); + expect(result._unsafeUnwrap()).toMatchObject({ id: 'session-id-1' }); + expect(userSecretRepository.write).toHaveBeenCalledWith( + 'session-id-1', + expect.objectContaining({ + ssSecret: expect.any(Uint8Array), + encrSecret: expect.any(Uint8Array), + entropy: expect.any(Uint8Array), + }), + ); + expect(ssoSessionRepository.add).toHaveBeenCalledWith(expect.objectContaining({ id: 'session-id-1' })); + }); + + it('caches the resolved result so subsequent calls return the same ResultAsync', async () => { + const harness = buildHarness(); + const { auth } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + await promise; + + const second = auth.authenticate(); + expect(second).toBe(promise); + expect(mocks.generateMnemonic).toHaveBeenCalledTimes(1); + }); + + it('emits pairingStatus transitions: none -> initial -> pairing(deeplink) -> finished', async () => { + const harness = buildHarness(); + const { auth } = harness; + const observed: Array<{ step: string; payload?: string }> = []; + auth.pairingStatus.subscribe(s => observed.push(s as never)); + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + await promise; + + const steps = observed.map(s => s.step); + expect(steps[0]).toBe('none'); + expect(steps).toContain('initial'); + const pairing = observed.find(s => s.step === 'pairing'); + expect(pairing?.payload).toBe('polkadotapp://pair?handshake=0xabcd'); + expect(steps.at(-1)).toBe('finished'); + }); + + it('emits attestationStatus transitions: none -> attestation(username) -> finished', async () => { + const harness = buildHarness(); + const { auth } = harness; + const observed: Array<{ step: string; username?: string }> = []; + auth.attestationStatus.subscribe(s => observed.push(s as never)); + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + await promise; + + expect(observed[0]?.step).toBe('none'); + const attestation = observed.find(s => s.step === 'attestation'); + expect(attestation).toEqual({ step: 'attestation', username: 'guestabcd.1234' }); + expect(observed.at(-1)?.step).toBe('finished'); + }); + + it('skips statements with no data and resolves on the first decryptable one', async () => { + const harness = buildHarness(); + const { auth, ssoSessionRepository } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverPage([{ data: undefined } as Statement, { data: new Uint8Array([1, 2, 3]) } as Statement]); + const result = await promise; + + expect(result.isOk()).toBe(true); + expect(ssoSessionRepository.add).toHaveBeenCalledTimes(1); + }); + }); + + describe('authenticate (error paths)', () => { + it('publishes attestationError and rejects when registration fails', async () => { + mocks.registerLitePerson.mockReturnValue(errAsync(new Error('chain offline'))); + const harness = buildHarness(); + const { auth } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + const result = await promise; + + expect(result.isErr()).toBe(true); + expect(result._unsafeUnwrapErr().message).toBe('chain offline'); + expect(auth.attestationStatus.read()).toEqual({ + step: 'attestationError', + message: 'chain offline', + }); + }); + + it('publishes pairingError when retrieving the session throws', async () => { + mocks.responsePayloadDec.mockImplementation(() => { + throw new Error('payload broken'); + }); + const harness = buildHarness(); + const { auth } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + const result = await promise; + + expect(result.isErr()).toBe(true); + expect(auth.pairingStatus.read()).toEqual({ + step: 'pairingError', + message: 'payload broken', + }); + }); + + it('publishes pairingError when payload encoding throws synchronously', async () => { + mocks.handshakeEnc.mockImplementation(() => { + throw new Error('encode broken'); + }); + const { auth } = buildHarness(); + + const result = await auth.authenticate(); + + expect(result.isErr()).toBe(true); + expect(auth.pairingStatus.read()).toEqual({ + step: 'pairingError', + message: 'encode broken', + }); + }); + + it('clears the cached result after failure so the next call retries', async () => { + mocks.registerLitePerson.mockReturnValueOnce(errAsync(new Error('boom'))).mockReturnValue(okAsync(undefined)); + + const harness = buildHarness(); + const { auth } = harness; + + const first = auth.authenticate(); + await harness.waitForSubscription(); + harness.deliverHandshake(); + await first; + + const second = auth.authenticate(); + expect(second).not.toBe(first); + expect(mocks.generateMnemonic).toHaveBeenCalledTimes(2); + + auth.abortAuthentication(); + await harness.waitForSubscription(2); + harness.deliverPage([]); + await second; + }); + + it('does not persist secrets or session when handshake fails', async () => { + mocks.handshakeEnc.mockImplementation(() => { + throw new Error('encode broken'); + }); + const harness = buildHarness(); + const { auth, userSecretRepository, ssoSessionRepository } = harness; + + await auth.authenticate(); + + expect(userSecretRepository.write).not.toHaveBeenCalled(); + expect(ssoSessionRepository.add).not.toHaveBeenCalled(); + }); + }); + + describe('abortAuthentication', () => { + it('resolves the in-flight authenticate with ok(null)', async () => { + const harness = buildHarness(); + const { auth } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + auth.abortAuthentication(); + // a page must arrive for the subscribe callback to observe the aborted signal + harness.deliverPage([]); + + const result = await promise; + expect(result.isOk()).toBe(true); + expect(result._unsafeUnwrap()).toBeNull(); + }); + + it('resets pairing and attestation statuses', async () => { + const harness = buildHarness(); + const { auth } = harness; + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + auth.abortAuthentication(); + harness.deliverPage([]); + await promise; + + expect(auth.pairingStatus.read()).toEqual({ step: 'none' }); + expect(auth.attestationStatus.read()).toEqual({ step: 'none' }); + }); + + it('does not transition pairingStatus or attestationStatus to error states on user abort', async () => { + const harness = buildHarness(); + const { auth } = harness; + const pairing: Array<{ step: string }> = []; + const attestation: Array<{ step: string }> = []; + auth.pairingStatus.subscribe(s => pairing.push(s as never)); + auth.attestationStatus.subscribe(s => attestation.push(s as never)); + + const promise = auth.authenticate(); + await harness.waitForSubscription(); + auth.abortAuthentication(); + harness.deliverPage([]); + await promise; + + expect(pairing.some(s => s.step === 'pairingError')).toBe(false); + expect(attestation.some(s => s.step === 'attestationError')).toBe(false); + }); + + it('clears the cached result so the next call starts a fresh attempt', async () => { + const harness = buildHarness(); + const { auth } = harness; + + const first = auth.authenticate(); + await harness.waitForSubscription(); + auth.abortAuthentication(); + harness.deliverPage([]); + await first; + + const second = auth.authenticate(); + expect(second).not.toBe(first); + expect(mocks.generateMnemonic).toHaveBeenCalledTimes(2); + + auth.abortAuthentication(); + await harness.waitForSubscription(2); + harness.deliverPage([]); + await second; + }); + + it('is a no-op when no authentication is in flight', () => { + const { auth } = buildHarness(); + expect(() => auth.abortAuthentication()).not.toThrow(); + expect(auth.pairingStatus.read()).toEqual({ step: 'none' }); + expect(auth.attestationStatus.read()).toEqual({ step: 'none' }); + }); + }); +}); diff --git a/packages/host-papp/package.json b/packages/host-papp/package.json index be7b6958..b52fcecf 100644 --- a/packages/host-papp/package.json +++ b/packages/host-papp/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-papp", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Polkadot app integration", "license": "Apache-2.0", "repository": { @@ -29,10 +29,10 @@ "@noble/ciphers": "2.2.0", "@noble/curves": "2.2.0", "@noble/hashes": "2.2.0", - "@novasamatech/host-api": "0.7.7", - "@novasamatech/scale": "0.7.7", - "@novasamatech/statement-store": "0.7.7", - "@novasamatech/storage-adapter": "0.7.7", + "@novasamatech/host-api": "0.7.8", + "@novasamatech/scale": "0.7.8", + "@novasamatech/statement-store": "0.7.8", + "@novasamatech/storage-adapter": "0.7.8", "@polkadot-labs/hdkd-helpers": "^0.0.30", "nanoevents": "9.1.0", "nanoid": "5.1.9", diff --git a/packages/host-papp/src/identity/rpcAdapter.ts b/packages/host-papp/src/identity/rpcAdapter.ts index 7edbb6d6..960664b3 100644 --- a/packages/host-papp/src/identity/rpcAdapter.ts +++ b/packages/host-papp/src/identity/rpcAdapter.ts @@ -56,15 +56,6 @@ export function createIdentityRpcAdapter(lazyClient: LazyClient): IdentityAdapte fullUsername: raw.full_username ? textDecoder.decode(raw.full_username) : null, liteUsername: textDecoder.decode(raw.lite_username), credibility, - slots: raw.stmt_store_slots.map(slot => - slot.type === 'Free' - ? { type: 'Free' } - : { - type: 'Occupied', - accountId: slot.value.account_id, - since: slot.value.since.toString(), - }, - ), }, ]; }), diff --git a/packages/host-papp/src/identity/types.ts b/packages/host-papp/src/identity/types.ts index 5ee97428..8d167c8f 100644 --- a/packages/host-papp/src/identity/types.ts +++ b/packages/host-papp/src/identity/types.ts @@ -10,22 +10,11 @@ export type Credibility = lastUpdate: string; }; -export type Slot = - | { - type: 'Free'; - } - | { - type: 'Occupied'; - accountId: string; - since: string; - }; - export type Identity = { accountId: string; fullUsername: string | null; liteUsername: string; credibility: Credibility; - slots: Slot[]; }; export type IdentityAdapter = { diff --git a/packages/host-papp/src/sso/auth/impl.ts b/packages/host-papp/src/sso/auth/impl.ts index 881b5456..8ae72e75 100644 --- a/packages/host-papp/src/sso/auth/impl.ts +++ b/packages/host-papp/src/sso/auth/impl.ts @@ -99,49 +99,48 @@ export function createAuth({ pairingStatus.write({ step: 'pairing', payload: createDeeplink(payload) }), ); - return dataPrepared.asyncAndThen(([, handshakeTopic, encrKeys]) => { - const pappResponse = waitForStatements( - callback => - statementStore.subscribeStatements({ matchAll: [handshakeTopic] }, page => callback(page.statements)), - signal, - (statements, resolve) => { - for (const statement of statements) { - if (!statement.data) continue; - - const session = retrieveSession({ - localAccount, - encrSecret: encrKeys.secret, - payload: statement.data, - }).unwrapOr(null); - - if (session) { - resolve(session); - break; + return dataPrepared + .asyncAndThen(([, handshakeTopic, encrKeys]) => { + const pappResponse = waitForStatements( + callback => + statementStore.subscribeStatements({ matchAll: [handshakeTopic] }, page => callback(page.statements)), + signal, + (statements, resolve) => { + for (const statement of statements) { + if (!statement.data) continue; + + const session = retrieveSession({ + localAccount, + encrSecret: encrKeys.secret, + payload: statement.data, + }).unwrapOr(null); + + if (session) { + resolve(session); + break; + } } - } - }, - ); - - const sessionWithSecretsPayload = pappResponse.map(session => ({ - session, - secretsPayload: { - id: session.id, - ssSecret: account.secret, - encrSecret: encrKeys.secret, - entropy: account.entropy, - }, - })); - - return sessionWithSecretsPayload - .andTee(({ session }) => { - pairingStatus.write({ step: 'finished', session }); - }) - .orTee(e => { - if (!(e instanceof AbortError)) { - pairingStatus.write({ step: 'pairingError', message: e.message }); - } - }); - }); + }, + ); + + return pappResponse.map(session => ({ + session, + secretsPayload: { + id: session.id, + ssSecret: account.secret, + encrSecret: encrKeys.secret, + entropy: account.entropy, + }, + })); + }) + .andTee(({ session }) => { + pairingStatus.write({ step: 'finished', session }); + }) + .orTee(e => { + if (!(e instanceof AbortError)) { + pairingStatus.write({ step: 'pairingError', message: e.message }); + } + }); } const authModule = { @@ -268,12 +267,12 @@ function retrieveSession({ return createEncryption(symmetricKey) .decrypt(encrypted) .map(decrypted => { - const [pappEncrPublicKey, pappAccountId] = HandshakeResponseSensitiveData.dec(decrypted); - const sharedSecret = createSharedSecret(encrSecret, pappEncrPublicKey); - - const peerAccount = createRemoteSessionAccount(createAccountId(pappAccountId), sharedSecret); + const { sharedSecretDerivationKey, rootUserAccountId, identityAccountId } = + HandshakeResponseSensitiveData.dec(decrypted); + const sharedSecret = createSharedSecret(encrSecret, sharedSecretDerivationKey); + const remoteAccount = createRemoteSessionAccount(createAccountId(identityAccountId), sharedSecret); - return createStoredUserSession(localAccount, peerAccount); + return createStoredUserSession(localAccount, remoteAccount, createAccountId(rootUserAccountId)); }); } diff --git a/packages/host-papp/src/sso/auth/scale/handshake.ts b/packages/host-papp/src/sso/auth/scale/handshake.ts index 032da18c..f91a8deb 100644 --- a/packages/host-papp/src/sso/auth/scale/handshake.ts +++ b/packages/host-papp/src/sso/auth/scale/handshake.ts @@ -1,5 +1,5 @@ import { Enum } from '@novasamatech/scale'; -import { Bytes, Option, Struct, Tuple, str } from 'scale-ts'; +import { Bytes, Option, Struct, str } from 'scale-ts'; import { EncrPubKey, SsPubKey } from '../../../crypto.js'; @@ -20,4 +20,8 @@ export const HandshakeResponsePayload = Enum({ v1: Struct({ encrypted: Bytes(), tmpKey: Bytes(65) }), }); -export const HandshakeResponseSensitiveData = Tuple(Bytes(65), Bytes(32)); +export const HandshakeResponseSensitiveData = Struct({ + sharedSecretDerivationKey: Bytes(65), + rootUserAccountId: Bytes(32), + identityAccountId: Bytes(32), +}); diff --git a/packages/host-papp/src/sso/sessionManager/userSession.ts b/packages/host-papp/src/sso/sessionManager/userSession.ts index 3bb5db1f..99f071f8 100644 --- a/packages/host-papp/src/sso/sessionManager/userSession.ts +++ b/packages/host-papp/src/sso/sessionManager/userSession.ts @@ -89,6 +89,7 @@ export function createUserSession({ id: userSession.id, localAccount: userSession.localAccount, remoteAccount: userSession.remoteAccount, + rootAccountId: userSession.rootAccountId, signPayload(payload) { return requestQueue.call(() => { diff --git a/packages/host-papp/src/sso/userSessionRepository.ts b/packages/host-papp/src/sso/userSessionRepository.ts index 8ee5d41f..b5f089b4 100644 --- a/packages/host-papp/src/sso/userSessionRepository.ts +++ b/packages/host-papp/src/sso/userSessionRepository.ts @@ -1,33 +1,33 @@ -import type { LocalSessionAccount, RemoteSessionAccount } from '@novasamatech/statement-store'; -import { LocalSessionAccountCodec, RemoteSessionAccountCodec } from '@novasamatech/statement-store'; +import type { AccountId, LocalSessionAccount, RemoteSessionAccount } from '@novasamatech/statement-store'; +import { AccountIdCodec, LocalSessionAccountCodec, RemoteSessionAccountCodec } from '@novasamatech/statement-store'; import type { StorageAdapter } from '@novasamatech/storage-adapter'; import { fieldListView } from '@novasamatech/storage-adapter'; import { nanoid } from 'nanoid'; import { fromHex, toHex } from 'polkadot-api/utils'; +import type { CodecType } from 'scale-ts'; import { Struct, Vector, str } from 'scale-ts'; export type UserSessionRepository = ReturnType; -export type StoredUserSession = { - id: string; - localAccount: LocalSessionAccount; - remoteAccount: RemoteSessionAccount; -}; +export type StoredUserSession = CodecType; const storedUserSessionCodec = Struct({ id: str, localAccount: LocalSessionAccountCodec, remoteAccount: RemoteSessionAccountCodec, + rootAccountId: AccountIdCodec, }); export function createStoredUserSession( localAccount: LocalSessionAccount, remoteAccount: RemoteSessionAccount, + rootAccountId: AccountId, ): StoredUserSession { return { id: nanoid(12), localAccount: localAccount, remoteAccount: remoteAccount, + rootAccountId, }; } diff --git a/packages/host-substrate-chain-connection/package.json b/packages/host-substrate-chain-connection/package.json index 5c8469a4..b1f19c84 100644 --- a/packages/host-substrate-chain-connection/package.json +++ b/packages/host-substrate-chain-connection/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-substrate-chain-connection", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Chain connection pool with ref counting and provider branching for Polkadot API", "license": "Apache-2.0", "repository": { @@ -25,7 +25,7 @@ "README.md" ], "dependencies": { - "@novasamatech/storage-adapter": "0.7.7", + "@novasamatech/storage-adapter": "0.7.8", "@polkadot-api/ws-provider": "^0.9.0", "@polkadot-api/json-rpc-provider": "^0.2.0", "@polkadot-api/json-rpc-provider-proxy": "^0.4.0", diff --git a/packages/host-substrate-chain-connection/src/connectionPool.spec.ts b/packages/host-substrate-chain-connection/src/connectionPool.spec.ts index 37cc2d60..c0da07c2 100644 --- a/packages/host-substrate-chain-connection/src/connectionPool.spec.ts +++ b/packages/host-substrate-chain-connection/src/connectionPool.spec.ts @@ -314,16 +314,21 @@ describe('createChainConnection', () => { unlock(); }); - it('skips providers that do not expose pause/resume', async () => { - const { connection } = createTestConnection(); - const { unlock } = await connection.lockApi(testChain('a')); + it('skips non-pausable providers without preventing pause on the rest', async () => { + // Mixed pool: 'a' is non-pausable, 'b' is pausable. The pausable one must + // still receive pause/resume even though the other is silently skipped. + const pausable = createPausableMockProvider(); + const connection = createChainConnection({ + createProvider: c => (c.genesisHash === 'b' ? pausable.provider : createMockProvider().provider), + }); + await connection.lockApi(testChain('a')); + await connection.lockApi(testChain('b')); - expect(() => { - connection.pauseAll(); - connection.resumeAll(); - }).not.toThrow(); + connection.pauseAll(); + connection.resumeAll(); - unlock(); + expect(pausable.pause).toHaveBeenCalledTimes(1); + expect(pausable.resume).toHaveBeenCalledTimes(1); }); it('does not call pause on providers for chains that have been destroyed', async () => { diff --git a/packages/host-substrate-chain-connection/src/pauseControllerIntegration.spec.ts b/packages/host-substrate-chain-connection/src/pauseControllerIntegration.spec.ts new file mode 100644 index 00000000..e7181753 --- /dev/null +++ b/packages/host-substrate-chain-connection/src/pauseControllerIntegration.spec.ts @@ -0,0 +1,147 @@ +import type { JsonRpcMessage, JsonRpcRequest } from '@polkadot-api/json-rpc-provider'; +import type { InnerJsonRpcProvider } from '@polkadot-api/json-rpc-provider-proxy'; +import { getSyncProvider } from '@polkadot-api/json-rpc-provider-proxy'; +import { describe, expect, it, vi } from 'vitest'; + +import { createPauseController } from './pauseController.js'; + +// Integration: pauseController + getSyncProvider's proxy. Mirrors the +// chainConnectionManager "fresh follow after a stop" test, but the Stop comes +// from the synthetic-Stop machinery that fires when pause halts the inner +// provider — i.e. the exact flow the host hits on a real pause/resume. + +type BaseInvocation = { + onMessage: (msg: JsonRpcMessage) => void; + onHalt: (e?: unknown) => void; + send: ReturnType; + disconnect: ReturnType; +}; + +const flushMicroAndTimers = async () => { + await vi.advanceTimersByTimeAsync(0); +}; + +const req = (id: number | string, method: string, params: unknown[] = []): JsonRpcRequest => ({ + jsonrpc: '2.0' as const, + id, + method, + params, +}); + +const followNotif = (subscription: string, result: unknown): JsonRpcMessage => ({ + jsonrpc: '2.0', + method: 'chainHead_v1_followEvent', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + params: { subscription, result } as any, +}); + +describe('pauseController × getSyncProvider integration', () => { + it('routes follow events to the new listener after pause+resume+refollow (best blocks must keep flowing)', async () => { + vi.useFakeTimers(); + try { + const invocations: BaseInvocation[] = []; + + const base: InnerJsonRpcProvider = (onMessage, onHalt) => { + const send = vi.fn(); + const disconnect = vi.fn(); + invocations.push({ + onMessage: onMessage as BaseInvocation['onMessage'], + onHalt: onHalt as BaseInvocation['onHalt'], + send, + disconnect, + }); + return { send, disconnect }; + }; + + const pc = createPauseController(); + const inner = pc.middleware(base); + + // Wrap the pausable inner in getSyncProvider so we get the same proxy / + // synthetic-Stop machinery the WS provider gets via getWsProvider. + const provider = getSyncProvider(onReady => { + onReady((onMsg, onHalt) => inner(onMsg, onHalt)); + return () => { + /* no teardown for the scheduling step */ + }; + }); + + const events: JsonRpcMessage[] = []; + const conn = provider(msg => events.push(msg)); + + // getSyncProvider schedules input via setTimeout(0); flush it so the + // base receives onMessage/onHalt and the proxy reaches Connected. + await flushMicroAndTimers(); + expect(invocations).toHaveLength(1); + + // Initial follow: consumer sends chainHead_v1_follow, the base "chain" + // assigns sub-id-1, and a bestBlockChanged event arrives. + conn.send(req(1, 'chainHead_v1_follow', [true])); + expect(invocations[0]!.send).toHaveBeenCalledWith(req(1, 'chainHead_v1_follow', [true])); + + invocations[0]!.onMessage({ jsonrpc: '2.0', id: 1, result: 'sub-id-1' }); + invocations[0]!.onMessage(followNotif('sub-id-1', { event: 'bestBlockChanged', bestBlockHash: '0xaa' })); + + expect(events).toContainEqual({ jsonrpc: '2.0', id: 1, result: 'sub-id-1' }); + expect(events).toContainEqual(followNotif('sub-id-1', { event: 'bestBlockChanged', bestBlockHash: '0xaa' })); + + // === pause === + // pauseController.pause() disconnects the live socket and manually fires + // onHalt({type:'paused'}). The proxy reacts by synthesizing a stop + // notification for every active chainHead — which is what surfaces to + // the consumer as "the follow died, please refollow". + events.length = 0; + pc.pause(); + + const syntheticStop = events.find( + m => + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (m as any).method === 'chainHead_v1_follow' && + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (m as any).params?.subscription === 'sub-id-1' && + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (m as any).params?.result?.event === 'stop', + ); + expect(syntheticStop).toBeDefined(); + expect(invocations[0]!.disconnect).toHaveBeenCalledTimes(1); + + // Consumer's substrate-client refollows synchronously inside the stop + // handler. The new chainHead_v1_follow goes into the proxy's pending + // queue while the base is paused. + conn.send(req(2, 'chainHead_v1_follow', [true])); + expect(invocations[0]!.send).not.toHaveBeenCalledWith(req(2, 'chainHead_v1_follow', [true])); + + // === resume === + pc.resume(); + // After resume, the base is re-invoked (new "connection") and the + // queued send is flushed. proxy.start() has its own setTimeout backoff; + // flush all timers so the new connection is established. + await vi.advanceTimersByTimeAsync(10_000); + + expect(invocations.length).toBeGreaterThanOrEqual(2); + const fresh = invocations[invocations.length - 1]!; + + // The buffered chainHead_v1_follow must hit the fresh base. + expect(fresh.send).toHaveBeenCalledWith(req(2, 'chainHead_v1_follow', [true])); + + // Server assigns a NEW subId on the new connection. + fresh.onMessage({ jsonrpc: '2.0', id: 2, result: 'sub-id-2' }); + + // bestBlockChanged on sub-id-2 must reach the consumer — this is the + // assertion that fails if pause/resume drops best-block flow. + events.length = 0; + fresh.onMessage(followNotif('sub-id-2', { event: 'bestBlockChanged', bestBlockHash: '0xcc' })); + + expect(events).toContainEqual(followNotif('sub-id-2', { event: 'bestBlockChanged', bestBlockHash: '0xcc' })); + // And no stale sub-id-1 events should have leaked through after refollow. + expect( + events.some( + m => + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (m as any).method === 'chainHead_v1_follow' && (m as any).params?.subscription === 'sub-id-1', + ), + ).toBe(false); + } finally { + vi.useRealTimers(); + } + }); +}); diff --git a/packages/host-worker-sandbox/package.json b/packages/host-worker-sandbox/package.json index fff3bfd8..f94f1144 100644 --- a/packages/host-worker-sandbox/package.json +++ b/packages/host-worker-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/host-worker-sandbox", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "QuickJS-based sandbox for running product worker code with Triangle Host API.", "license": "Apache-2.0", "repository": { @@ -25,8 +25,8 @@ "README.md" ], "dependencies": { - "@novasamatech/host-api": "0.7.7", - "@novasamatech/host-container": "0.7.7", + "@novasamatech/host-api": "0.7.8", + "@novasamatech/host-container": "0.7.8", "quickjs-emscripten": "0.32.0" }, "publishConfig": { diff --git a/packages/host-worker-sandbox/src/globals/console.ts b/packages/host-worker-sandbox/src/globals/console.ts index 6249cb65..0513553f 100644 --- a/packages/host-worker-sandbox/src/globals/console.ts +++ b/packages/host-worker-sandbox/src/globals/console.ts @@ -1,6 +1,28 @@ import type { Logger } from '@novasamatech/host-api'; import type { QuickJSContext } from 'quickjs-emscripten'; +// Per-argument cap on stringified payload size. Sandbox code that calls +// `console.log("X".repeat(1e9))` would otherwise dump that string straight to +// the host logger. 64 KiB is far above any human-readable use. +const MAX_STRING_ARG_BYTES = 64 * 1024; + +// Strip C0 control characters except \t (HT) and \n (LF). Anything else — +// notably \x1b (ESC, used in ANSI escape sequences) and \r — gets replaced +// with the Unicode replacement char so terminal-aware loggers cannot be +// driven by sandbox output (clear screen, cursor moves, color injection). +// eslint-disable-next-line no-control-regex +const CONTROL_CHARS = /[\x00-\x08\x0b-\x1f\x7f]/g; + +function sanitizeString(s: string): string { + let out = s.replace(CONTROL_CHARS, '�'); + if (out.length > MAX_STRING_ARG_BYTES) out = out.slice(0, MAX_STRING_ARG_BYTES) + '…[truncated]'; + return out; +} + +function sanitizeArg(v: unknown): unknown { + return typeof v === 'string' ? sanitizeString(v) : v; +} + // Apply WHATWG console format specifiers to the first arg if it's a string // containing `%` substitutions. Returns the new arg list with the substituted // string prefixed and any unconsumed args appended. @@ -48,7 +70,8 @@ export function injectConsole(vm: QuickJSContext, logger: Logger) { for (const method of ['log', 'info', 'warn', 'error'] as const) { const fn = vm.newFunction(method, (...args) => { const dumped = args.map(h => vm.dump(h)); - logger[method](...formatArgs(dumped)); + const formatted = formatArgs(dumped).map(sanitizeArg); + logger[method](...formatted); return vm.undefined; }); vm.setProp(consoleObj, method, fn); diff --git a/packages/host-worker-sandbox/src/globals/cryptoSubtle.ts b/packages/host-worker-sandbox/src/globals/cryptoSubtle.ts index 65d0186b..3c2d007f 100644 --- a/packages/host-worker-sandbox/src/globals/cryptoSubtle.ts +++ b/packages/host-worker-sandbox/src/globals/cryptoSubtle.ts @@ -79,6 +79,18 @@ const VM_SOURCE = `(() => { return k; } + // WebCrypto algorithm-name canonicalization. The spec mandates case-insensitive + // names, but a resolver doing its own switch on \`algorithm.name\` may not + // normalize — we canonicalize at the bridge to block case-confusion bypass. + const __algNameLookup = new Map([ + 'AES-CBC', 'AES-CTR', 'AES-GCM', 'AES-KW', + 'HMAC', 'RSA-PSS', 'RSASSA-PKCS1-v1_5', 'RSA-OAEP', + 'ECDSA', 'ECDH', 'HKDF', 'PBKDF2', + 'SHA-1', 'SHA-256', 'SHA-384', 'SHA-512', + 'Ed25519', 'X25519', + ].map(n => [n.toLowerCase(), n])); + const __isPollutionKey = k => k === '__proto__' || k === 'constructor' || k === 'prototype'; + function marshal(v, bytes) { if (v == null || typeof v !== 'object') return v; if (v instanceof CryptoKey) return { __subtleKeyId: v.__subtleKeyId }; @@ -93,26 +105,34 @@ const VM_SOURCE = `(() => { return { __byteRef: idx }; } if (Array.isArray(v)) return v.map(x => marshal(x, bytes)); - const out = {}; - for (const k of Object.keys(v)) out[k] = marshal(v[k], bytes); + const out = Object.create(null); + for (const k of Object.keys(v)) { + if (__isPollutionKey(k)) continue; + const raw = v[k]; + // Canonicalize algorithm names; non-algorithm \`name\` fields pass through. + const canon = k === 'name' && typeof raw === 'string' ? __algNameLookup.get(raw.toLowerCase()) : undefined; + out[k] = marshal(canon ?? raw, bytes); + } return out; } function unmarshal(v, bytes) { if (v == null || typeof v !== 'object') return v; - if (typeof v.__byteRef === 'number') { - const u8 = bytes[v.__byteRef]; - // Return a fresh ArrayBuffer (BufferSource compatibility for sandbox code). - return u8.slice().buffer; - } + if (typeof v.__byteRef === 'number') return bytes[v.__byteRef].slice().buffer; if (v.__cryptoKeySpec) return makeCryptoKey(v.__cryptoKeySpec); if (v.__cryptoKeyPair) return { publicKey: makeCryptoKey(v.__cryptoKeyPair.publicKey), privateKey: makeCryptoKey(v.__cryptoKeyPair.privateKey), }; if (Array.isArray(v)) return v.map(x => unmarshal(x, bytes)); + // Plain {} so sandbox consumers can use Object.prototype methods on the + // result (e.g. EcKeyAlgorithm). Pollution keys are still skipped to + // protect the sandbox from a malicious resolver response. const out = {}; - for (const k of Object.keys(v)) out[k] = unmarshal(v[k], bytes); + for (const k of Object.keys(v)) { + if (__isPollutionKey(k)) continue; + out[k] = unmarshal(v[k], bytes); + } return out; } diff --git a/packages/host-worker-sandbox/src/globals/fetch.ts b/packages/host-worker-sandbox/src/globals/fetch.ts index d408a7a8..686960e2 100644 --- a/packages/host-worker-sandbox/src/globals/fetch.ts +++ b/packages/host-worker-sandbox/src/globals/fetch.ts @@ -9,6 +9,12 @@ export type FetchRequest = { headers: Array<[string, string]>; body: Uint8Array | null; signal: AbortSignal; + /** Forwarded from the in-VM Request — resolver may apply CORS / auth policy. */ + mode: 'cors' | 'no-cors' | 'same-origin' | 'navigate' | string; + /** Forwarded from the in-VM Request — `'omit'` means "do not attach credentials". */ + credentials: 'omit' | 'include' | 'same-origin' | string; + /** Forwarded from the in-VM Request — `'manual'` skips redirect-following. */ + redirect: 'follow' | 'error' | 'manual' | string; }; export type FetchResponse = { @@ -39,7 +45,7 @@ const BRIDGE_NAME = `__FETCH_BRIDGE_${nanoid()}__`; // Calls back to the host through a bridge function passed via globalThis at // injection time, captured into a local closure, then deleted from globalThis // so sandbox code can't reach it directly. Bridge signature: -// (method, url, headers, bodyBytes, registerAbort) => Promise<{...}> +// (method, url, headers, bodyBytes, mode, credentials, redirect, registerAbort) => Promise<{...}> // where registerAbort is a function the host calls with a callback that fires // when the VM-side AbortSignal aborts. // @@ -389,6 +395,9 @@ const SOURCE = `(() => { request.url, headersArr, bodyBytes, + request.mode, + request.credentials, + request.redirect, function registerAbort(cb) { if (request.signal.aborted) cb(); else request.signal.addEventListener('abort', () => cb(), { once: true }); @@ -467,68 +476,74 @@ export function injectFetch( // Track host-side abort callbacks so we can null them out at dispose. const inflightControllers = new Set(); - const bridge = vm.newFunction(BRIDGE_NAME, (methodH, urlH, headersH, bodyH, abortRegH) => { - const method = vm.getString(methodH); - const url = vm.getString(urlH); - const headers = (vm.dump(headersH) ?? []) as Array<[string, string]>; - - // Check size before extracting — the cap exists to bound host allocation. - const bodyByteLength = withProp(vm, bodyH, 'byteLength', h => vm.getNumber(h)); - if (bodyByteLength > maxBodyBytes) { - const deferred = vm.newPromise(); - const errHandle = vm.newError(`fetch body exceeds maximum allowed size: ${bodyByteLength} > ${maxBodyBytes}`); - deferred.reject(errHandle); - errHandle.dispose(); - if (!disposed) vm.runtime.executePendingJobs(-1); - return deferred.handle; - } - - const bodyBytes = extractBytesFromVm(vm, bodyH); - const body = bodyBytes.byteLength === 0 ? null : bodyBytes; - - const hostAC = new AbortController(); - inflightControllers.add(hostAC); - - const abortCb = vm.newFunction('__abortCb', () => { - hostAC.abort(); - }); - const regRes = vm.callFunction(abortRegH, vm.undefined, abortCb); - abortCb.dispose(); - if (regRes.error) regRes.error.dispose(); - else regRes.value.dispose(); - - const deferred = vm.newPromise(); - - Promise.resolve() - .then(() => resolver({ url, method, headers, body, signal: hostAC.signal })) - .then(resp => { - inflightControllers.delete(hostAC); - if (disposed) return; - const respHandle = buildResponseHandle(vm, toUint8ArrayFn, resp); - deferred.resolve(respHandle); - respHandle.dispose(); - }) - .catch(err => { - inflightControllers.delete(hostAC); - if (disposed) return; - const message = err instanceof Error ? err.message : String(err); - const errHandle = vm.newError(message); - // Preserve resolver-supplied error name (`TypeError` for network errors, - // `AbortError` for aborts, etc.) so sandbox code can branch on it. - if (err instanceof Error && err.name && err.name !== 'Error') { - const nameHandle = vm.newString(err.name); - vm.setProp(errHandle, 'name', nameHandle); - nameHandle.dispose(); - } + const bridge = vm.newFunction( + BRIDGE_NAME, + (methodH, urlH, headersH, bodyH, modeH, credentialsH, redirectH, abortRegH) => { + const method = vm.getString(methodH); + const url = vm.getString(urlH); + const headers = (vm.dump(headersH) ?? []) as Array<[string, string]>; + const mode = vm.getString(modeH); + const credentials = vm.getString(credentialsH); + const redirect = vm.getString(redirectH); + + // Check size before extracting — the cap exists to bound host allocation. + const bodyByteLength = withProp(vm, bodyH, 'byteLength', h => vm.getNumber(h)); + if (bodyByteLength > maxBodyBytes) { + const deferred = vm.newPromise(); + const errHandle = vm.newError(`fetch body exceeds maximum allowed size: ${bodyByteLength} > ${maxBodyBytes}`); deferred.reject(errHandle); errHandle.dispose(); - }) - .finally(() => { if (!disposed) vm.runtime.executePendingJobs(-1); + return deferred.handle; + } + + const bodyBytes = extractBytesFromVm(vm, bodyH); + const body = bodyBytes.byteLength === 0 ? null : bodyBytes; + + const hostAC = new AbortController(); + inflightControllers.add(hostAC); + + const abortCb = vm.newFunction('__abortCb', () => { + hostAC.abort(); }); + const regRes = vm.callFunction(abortRegH, vm.undefined, abortCb); + abortCb.dispose(); + if (regRes.error) regRes.error.dispose(); + else regRes.value.dispose(); - return deferred.handle; - }); + const deferred = vm.newPromise(); + + Promise.resolve() + .then(() => resolver({ url, method, headers, body, signal: hostAC.signal, mode, credentials, redirect })) + .then(resp => { + inflightControllers.delete(hostAC); + if (disposed) return; + const respHandle = buildResponseHandle(vm, toUint8ArrayFn, resp); + deferred.resolve(respHandle); + respHandle.dispose(); + }) + .catch(err => { + inflightControllers.delete(hostAC); + if (disposed) return; + const message = err instanceof Error ? err.message : String(err); + const errHandle = vm.newError(message); + // Preserve resolver-supplied error name (`TypeError` for network errors, + // `AbortError` for aborts, etc.) so sandbox code can branch on it. + if (err instanceof Error && err.name && err.name !== 'Error') { + const nameHandle = vm.newString(err.name); + vm.setProp(errHandle, 'name', nameHandle); + nameHandle.dispose(); + } + deferred.reject(errHandle); + errHandle.dispose(); + }) + .finally(() => { + if (!disposed) vm.runtime.executePendingJobs(-1); + }); + + return deferred.handle; + }, + ); vm.setProp(vm.global, BRIDGE_NAME, bridge); bridge.dispose(); diff --git a/packages/host-worker-sandbox/src/globals/timers.ts b/packages/host-worker-sandbox/src/globals/timers.ts index ba2294b4..091105ee 100644 --- a/packages/host-worker-sandbox/src/globals/timers.ts +++ b/packages/host-worker-sandbox/src/globals/timers.ts @@ -8,13 +8,24 @@ import type { QuickJSContext, QuickJSHandle } from 'quickjs-emscripten'; type TimerHandle = ReturnType; type TimerEntry = { ref: QuickJSHandle; timer: TimerHandle }; +// HTML spec clamps nested setTimeout below 4 ms after the 5th level. We apply a +// flat floor instead — sandbox code cannot abuse zero-delay timers to flood the +// host event loop. NaN / negative / non-finite values fall through to 0 by +// `Math.max`, and we then clamp up to MIN_DELAY_MS. +const MIN_DELAY_MS = 4; + +const coerceDelay = (raw: number): number => { + if (!Number.isFinite(raw) || raw < 0) raw = 0; + return Math.max(raw | 0, MIN_DELAY_MS); +}; + export function injectTimeouts(vm: QuickJSContext): VoidFunction { const refs = new Map(); let nextId = 1; let disposed = false; const setTimeoutHandler = vm.newFunction('setTimeout', (funcHandle, timeoutHandle) => { - const ttl = vm.getNumber(timeoutHandle); + const ttl = coerceDelay(vm.getNumber(timeoutHandle)); const ref = funcHandle.dup(); const id = nextId++; const timer = setTimeout(() => { @@ -63,7 +74,7 @@ export function injectIntervals(vm: QuickJSContext): VoidFunction { let disposed = false; const setIntervalHandler = vm.newFunction('setInterval', (funcHandle, timeoutHandle) => { - const ttl = vm.getNumber(timeoutHandle); + const ttl = coerceDelay(vm.getNumber(timeoutHandle)); const ref = funcHandle.dup(); const id = nextId++; const timer = setInterval(() => { @@ -101,11 +112,27 @@ export function injectIntervals(vm: QuickJSContext): VoidFunction { }; } +// Cap on simultaneously-pending microtasks. A sandbox calling +// `queueMicrotask` in a tight loop would otherwise flood the host event loop; +// the cap forces the sandbox to back off (excess calls are dropped with a log). +const MAX_PENDING_MICROTASKS = 1024; + export function injectQueueMicrotask(vm: QuickJSContext): VoidFunction { const pendingRefs = new Set(); let disposed = false; + let exceededLogged = false; const queueMicrotaskHandler = vm.newFunction('queueMicrotask', funcHandle => { + if (pendingRefs.size >= MAX_PENDING_MICROTASKS) { + if (!exceededLogged) { + // Once-per-burst log — avoid spamming when the sandbox is in a loop. + + console.error(`[Sandbox] queueMicrotask: dropping callback; cap of ${MAX_PENDING_MICROTASKS} reached`); + exceededLogged = true; + } + return vm.undefined; + } + exceededLogged = false; const ref = funcHandle.dup(); pendingRefs.add(ref); queueMicrotask(() => { diff --git a/packages/host-worker-sandbox/src/sandbox.ts b/packages/host-worker-sandbox/src/sandbox.ts index 723d4ec5..ad30d080 100644 --- a/packages/host-worker-sandbox/src/sandbox.ts +++ b/packages/host-worker-sandbox/src/sandbox.ts @@ -59,6 +59,12 @@ function makeOnMessageDescriptor(state: OnMessageState, vm: QuickJSContext): VmP }; } +// Cap on registered `message` listeners per port. Sandbox code that registers +// fresh arrow functions in a tight loop would otherwise grow the host-side +// handle array unbounded — every entry pins a VM-side function, exhausting the +// QuickJS heap. 32 is far above any legitimate use. +const MAX_MESSAGE_LISTENERS = 32; + class SandboxPort { private readonly vm: QuickJSContext; private readonly onMessageState: OnMessageState = { handle: null }; @@ -123,6 +129,16 @@ class SandboxPort { if (vm.typeof(handlerHandle) !== 'function') return; // Spec: EventTarget.addEventListener with the same listener is a no-op. if (this.messageListeners.some(h => this.isSameHandle(h, handlerHandle))) return; + if (this.messageListeners.length >= MAX_MESSAGE_LISTENERS) { + // Defensive cap: prevent runaway growth from sandbox code registering + // fresh closures in a loop. We silently drop additional registrations + // rather than throwing — DOM addEventListener is no-throw on dedup, so + // a throw here would be the only path to surface "limit reached". + this.provider.logger.error( + `[Sandbox] port.addEventListener: ignoring listener; cap of ${MAX_MESSAGE_LISTENERS} reached`, + ); + return; + } this.messageListeners.push(handlerHandle.dup()); }); vm.setProp(port, 'addEventListener', addEventListenerFn); @@ -428,13 +444,30 @@ class QuickJsSandbox implements Sandbox { } } +// Belt-and-suspenders: if a Sandbox wrapper is GC'd without explicit dispose, +// free the underlying WASM context. The held value must close over `vm` ONLY +// (not the wrapper) — otherwise the registry's strong heldValue ref would +// keep the wrapper alive and the finalizer would never fire. Host-side +// QuickJSHandle wrappers are pure JS and reclaimed by ordinary GC. +const __sandboxFinalizer = new FinalizationRegistry<() => void>(free => free()); + export async function createSandbox(productId: string, options: SandboxOptions = {}): Promise { - // One WASM instance per sandbox. `getQuickJS()` returns a process-wide - // singleton, which means an abort inside `JS_FreeRuntime` (see - // `dispose()`) tears down every other sandbox in the renderer. - // `newQuickJSWASMModule()` instantiates a fresh module so the blast - // radius of a bad dispose is contained to this sandbox. + // One WASM instance per sandbox to contain abort blast radius — see + // QuickJsSandbox.dispose() for why JS_FreeRuntime can abort. const QuickJS = await newQuickJSWASMModule(); const vm = QuickJS.newContext(); - return new QuickJsSandbox(productId, vm, options); + const sandbox = new QuickJsSandbox(productId, vm, options); + __sandboxFinalizer.register( + sandbox, + () => { + try { + vm.runtime.executePendingJobs(-1); + vm.dispose(); + } catch { + /* already disposed or aborted; finalizer must not throw */ + } + }, + sandbox, + ); + return sandbox; } diff --git a/packages/product-bulletin/package.json b/packages/product-bulletin/package.json index 0d7287ac..1d77a80d 100644 --- a/packages/product-bulletin/package.json +++ b/packages/product-bulletin/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/product-bulletin", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Bulletin Chain client adapter for Polkadot product applications", "license": "Apache-2.0", "repository": { @@ -27,7 +27,7 @@ "README.md" ], "dependencies": { - "@novasamatech/product-sdk": "0.7.7", + "@novasamatech/product-sdk": "0.7.8", "@parity/bulletin-sdk": "^0.3.0", "polkadot-api": ">=2" }, diff --git a/packages/product-react-renderer/package.json b/packages/product-react-renderer/package.json index 800e9dea..a5dcac79 100644 --- a/packages/product-react-renderer/package.json +++ b/packages/product-react-renderer/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/product-react-renderer", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "React wrapper for custom renderer format from product-sdk", "license": "Apache-2.0", "repository": { @@ -24,8 +24,8 @@ "README.md" ], "dependencies": { - "@novasamatech/host-api": "0.7.7", - "@novasamatech/product-sdk": "0.7.7", + "@novasamatech/host-api": "0.7.8", + "@novasamatech/product-sdk": "0.7.8", "scale-ts": "1.6.1", "react-reconciler": "0.33.0" }, diff --git a/packages/product-sdk/package.json b/packages/product-sdk/package.json index 5e70fbc3..f2e413ea 100644 --- a/packages/product-sdk/package.json +++ b/packages/product-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/product-sdk", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Polkadot product SDK: integrate and run your product inside Polkadot browser.", "license": "Apache-2.0", "repository": { @@ -27,7 +27,7 @@ "dependencies": { "@polkadot/extension-inject": "^0.63.1", "@polkadot-api/json-rpc-provider-proxy": "^0.4.0", - "@novasamatech/host-api": "0.7.7", + "@novasamatech/host-api": "0.7.8", "polkadot-api": ">=2", "neverthrow": "^8.2.0" }, diff --git a/packages/scale/package.json b/packages/scale/package.json index 833d6b47..6a4340eb 100644 --- a/packages/scale/package.json +++ b/packages/scale/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/scale", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "additional scale-ts bindings", "license": "Apache-2.0", "repository": { diff --git a/packages/statement-store/package.json b/packages/statement-store/package.json index 6a91af98..0df5d685 100644 --- a/packages/statement-store/package.json +++ b/packages/statement-store/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/statement-store", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Statement store integration", "license": "Apache-2.0", "repository": { @@ -25,7 +25,7 @@ "README.md" ], "dependencies": { - "@novasamatech/scale": "0.7.7", + "@novasamatech/scale": "0.7.8", "@novasamatech/sdk-statement": "^0.6.0", "@polkadot-api/substrate-bindings": "^0.20.1", "@polkadot-api/substrate-client": "^0.7.0", diff --git a/packages/statement-store/src/session/session.spec.ts b/packages/statement-store/src/session/session.spec.ts index 001bc11f..6c4ed578 100644 --- a/packages/statement-store/src/session/session.spec.ts +++ b/packages/statement-store/src/session/session.spec.ts @@ -122,7 +122,12 @@ describe('session', () => { it('queries own and peer statements on creation', async () => { const { adapter } = makeSession(); await delay(); - expect(adapter.queryStatements).toHaveBeenCalledTimes(2); + // Two single-topic matchAll queries — one per channel (outgoing/incoming). + // The topics must differ; otherwise both queries would target the same channel. + const topics = adapter.queryStatements.mock.calls.map(([f]) => (f as { matchAll: unknown[] }).matchAll); + expect(topics).toHaveLength(2); + expect(topics.map(t => t.length)).toEqual([1, 1]); + expect(topics[0]).not.toEqual(topics[1]); }); it('expiry is initialized from max own statement expiry', async () => { diff --git a/packages/storage-adapter/package.json b/packages/storage-adapter/package.json index a005e64d..6e8e77b7 100644 --- a/packages/storage-adapter/package.json +++ b/packages/storage-adapter/package.json @@ -1,7 +1,7 @@ { "name": "@novasamatech/storage-adapter", "type": "module", - "version": "0.7.7", + "version": "0.7.8", "description": "Statement store integration", "license": "Apache-2.0", "repository": { diff --git a/packages/storage-adapter/src/index.ts b/packages/storage-adapter/src/index.ts index 9a90ec3e..d483131a 100644 --- a/packages/storage-adapter/src/index.ts +++ b/packages/storage-adapter/src/index.ts @@ -1,4 +1,4 @@ export type { StorageAdapter } from './types.js'; export { createMemoryAdapter } from './memory.js'; -export { createLocalStorageAdapter } from './localStorage.js'; +export { LOCAL_STORAGE_PREFIX, createLocalStorageAdapter } from './localStorage.js'; export { fieldListView, fieldView } from './fieldView.js'; diff --git a/packages/storage-adapter/src/localStorage.ts b/packages/storage-adapter/src/localStorage.ts index 74901d77..5cd225d3 100644 --- a/packages/storage-adapter/src/localStorage.ts +++ b/packages/storage-adapter/src/localStorage.ts @@ -4,9 +4,11 @@ import { fromAsyncThrowable } from 'neverthrow'; import { toError } from './helpers.js'; import type { StorageAdapter } from './types.js'; +export const LOCAL_STORAGE_PREFIX = 'polkadot_'; + export function createLocalStorageAdapter(prefix: string): StorageAdapter { const events = createNanoEvents unknown>>(); - const prefixPattern = `PAPP_${prefix}_`; + const prefixPattern = `${LOCAL_STORAGE_PREFIX}${prefix}_`; const withPrefix = (key: string) => `${prefixPattern}${key}`; return {