diff --git a/ce/ce/cli/commands/apply-vsman.ts b/ce/ce/cli/commands/apply-vsman.ts deleted file mode 100644 index 6bc249c807..0000000000 --- a/ce/ce/cli/commands/apply-vsman.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { MetadataFile } from '../../amf/metadata-file'; -import { acquireArtifactFile } from '../../fs/acquire'; -import { FileType } from '../../fs/filesystem'; -import { i } from '../../i18n'; -import { session } from '../../main'; -import { Session } from '../../session'; -import { Uri } from '../../util/uri'; -import { templateAmfApplyVsManifestInformation } from '../../willow/template-amf'; -import { parseVsManFromChannel, VsManDatabase } from '../../willow/willow'; -import { Command } from '../command'; -import { log } from '../styling'; -import { Switch } from '../switch'; - -class ChannelUri extends Switch { - readonly switch = 'channel'; - - get help() { - return [ - i`The URI to the Visual Studio channel to apply.` - ]; - } -} - -class RepoRoot extends Switch { - readonly switch = 'repo'; - - get help() { - return [ - i`The directory path to the root of the repo into which artifact metadata is to be generated.` - ]; - } -} - -export class ApplyVsManCommand extends Command { - readonly command = 'z-apply-vsman'; - readonly seeAlso = []; - readonly argumentsHelp = []; - readonly aliases = []; - - readonly channelUri = new ChannelUri(this); - readonly repoRoot = new RepoRoot(this); - - get summary() { - return i`Apply Visual Studio Channel (.vsman) information to a prototypical artifact metadata.`; - } - - get description() { - return [ - i`This is used to mint artifacts metadata exactly corresponding to a release state in a Visual Studio channel.`, - ]; - } - - /** - * Process an input file. - */ - static async processFile(session: Session, inputUri: Uri, repoRoot: Uri, vsManLookup: VsManDatabase) { - const inputPath = inputUri.fsPath; - session.channels.debug(i`Processing ${inputPath}...`); - const inputContent = await inputUri.readUTF8(); - const outputContent = templateAmfApplyVsManifestInformation(session, inputPath, inputContent, vsManLookup); - if (!outputContent) { - session.channels.warning(i`Skipped processing ${inputPath}`); - return 0; - } - - const outputAmf = await MetadataFile.parseConfiguration(inputPath, outputContent, session); - const errors = Array.from(outputAmf.validate(), (error) => outputAmf.formatVMessage(error)); - if (errors.length !== 0) { - const errorMsg = errors.join('\n'); - session.channels.warning(i`After transformation, ${inputPath} did not result in a valid AMF; skipping:\n${outputContent}\n${errorMsg}`); - return 0; - } - - const outputId = outputAmf.id; - const outputIdLast = outputId.slice(outputId.lastIndexOf('/')); - const outputVersion = outputAmf.version; - const outputRelativePath = `${outputId}/${outputIdLast}-${outputVersion}.yaml`; - const outputFullPath = repoRoot.join(outputRelativePath); - let doWrite = true; - try { - const outputExistingContent = await outputFullPath.readUTF8(); - if (outputExistingContent === outputContent) { - doWrite = false; - } else { - session.channels.warning(i`After transformation, ${inputPath} results in ${outputFullPath.toString()} which already exists; overwriting.`); - } - } catch { - // nothing to do - } - - if (doWrite) { - await outputFullPath.writeUTF8(outputContent); - } - - session.channels.debug(i`-> ${outputFullPath.toString()}`); - return 1; - } - - /** - * Process an input file or directory, recursively. - */ - static async processInput(session: Session, inputDirectoryEntry: [Uri, FileType], repoRoot: Uri, vsManLookup: VsManDatabase): Promise { - if ((inputDirectoryEntry[1] & FileType.Directory) !== 0) { - let total = 0; - for (const child of await inputDirectoryEntry[0].readDirectory()) { - total += await ApplyVsManCommand.processInput(session, child, repoRoot, vsManLookup); - } - - return total; - } else if ((inputDirectoryEntry[1] & FileType.File) !== 0) { - return await ApplyVsManCommand.processFile(session, inputDirectoryEntry[0], repoRoot, vsManLookup); - } - - return 0; - } - - override async run() { - const channelUriStr = this.channelUri.requiredValue; - const repoRoot = session.fileSystem.file(this.repoRoot.requiredValue); - log(i`Downloading channel manifest from ${channelUriStr}`); - const channelUriUri = session.parseUri(channelUriStr); - const channelFile = await acquireArtifactFile(session, [channelUriUri], 'channel.chman', {}); - const vsManPayload = parseVsManFromChannel(await channelFile.readUTF8()); - log(i`Downloading Visual Studio manifest version ${vsManPayload.version} (${vsManPayload.url})`); - const vsManUri = await acquireArtifactFile(session, [session.parseUri(vsManPayload.url)], vsManPayload.fileName, {}); - const vsManLookup = new VsManDatabase(await vsManUri.readUTF8()); - let totalProcessed = 0; - for (const inputPath of this.inputs) { - const inputUri = session.fileSystem.file(inputPath); - const inputStat = await inputUri.stat(); - totalProcessed += await ApplyVsManCommand.processInput(session, [inputUri, inputStat.type], repoRoot, vsManLookup); - } - - session.channels.message(i`Processed ${totalProcessed} templates.`); - return true; - } -} diff --git a/ce/ce/main.ts b/ce/ce/main.ts index 0101a32a15..94efcc6ebc 100644 --- a/ce/ce/main.ts +++ b/ce/ce/main.ts @@ -10,7 +10,6 @@ import { CommandLine } from './cli/command-line'; import { AcquireCommand } from './cli/commands/acquire'; import { ActivateCommand } from './cli/commands/activate'; import { AddCommand } from './cli/commands/add'; -import { ApplyVsManCommand } from './cli/commands/apply-vsman'; import { CacheCommand } from './cli/commands/cache'; import { CleanCommand } from './cli/commands/clean'; import { DeactivateCommand } from './cli/commands/deactivate'; @@ -76,7 +75,6 @@ async function main() { debug(`Anonymous Telemetry Enabled: ${telemetryEnabled}`); // find a project profile. - const zApplyVsMan = new ApplyVsManCommand(commandline); const help = new HelpCommand(commandline); const find = new FindCommand(commandline); diff --git a/ce/ce/willow/template-amf.ts b/ce/ce/willow/template-amf.ts deleted file mode 100644 index e39c88100f..0000000000 --- a/ce/ce/willow/template-amf.ts +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { assert } from 'console'; -import { isMap, isPair, isScalar, isSeq, LineCounter, Pair, parseDocument, YAMLMap, YAMLSeq } from 'yaml'; -import { i } from '../i18n'; -import { Session } from '../session'; -import { FlatVsManPayload, VsManDatabase } from './willow'; - -function lookupVsixVersion(session: Session, vsManLookup: VsManDatabase, id: string): string | undefined { - const adoptedVersionSource = vsManLookup.get(id); - if (!adoptedVersionSource) { - session.channels.error(i`template required id (${id}) not present in the Visual Studio manifest.`); - return undefined; - } - - assert(adoptedVersionSource.length >= 1); - const adoptedVersion = adoptedVersionSource[0].version; - if (adoptedVersionSource.length != 1) { - session.channels.warning(i`template required id version (${id}) which names an ID with more than one package in the Visual Studio manifest; choosing first version '${adoptedVersion}'.`); - } - - return adoptedVersion; -} - -function getYamlMapEntryKey(target: any): string | undefined { - if (isScalar(target)) { - if (typeof target.value === 'string') { - return target.value; - } - } else if (typeof target === 'string') { - return target; - } - - return undefined; -} - -// Replaces adopt-vsix-version-from-id in in the "info" block of the AMF denoted by inputRootMap, -// if any, with a real version derived from vsManLookup. -// Returns whether unrecoverable errors occurred. -function replaceAdoptVsixVersionFromId(session: Session, inputPath: string, - inputRootMap: YAMLMap, vsManLookup: VsManDatabase): boolean { - const inputInfoMap = inputRootMap.get('info'); - if (!isMap(inputInfoMap)) { - session.channels.error(i`${inputPath} is missing an 'info' map.`); - return true; - } - - const inputInfoMapCount = inputInfoMap.items.length; - for (let idx = 0; idx < inputInfoMapCount; ++idx) { - const inputInfoEntry = inputInfoMap.items[idx]; - if (!isPair(inputInfoEntry)) { - continue; - } - - if (getYamlMapEntryKey(inputInfoEntry.key) !== 'adopt-vsix-version-from-id') { - continue; - } - - if (!isScalar(inputInfoEntry.value) || typeof inputInfoEntry.value.value !== 'string') { - session.channels.error(i`${inputPath} use of adopt-vsix-version-from-id was not an id string`); - return true; - } - - const adoptedVersion = lookupVsixVersion(session, vsManLookup, inputInfoEntry.value.value); - if (typeof adoptedVersion !== 'string') { - return true; - } - - inputInfoMap.items[idx] = new Pair('version', adoptedVersion); - } - - return false; -} - -function transformVsixMapToUnzipMaps(session: Session, inputPath: string, - maybeVsixMap: YAMLMap, vsManLookup: VsManDatabase): Array | undefined { - const vsixId = maybeVsixMap.get('vsix'); - if (typeof vsixId !== 'string') { - return [maybeVsixMap]; // make no changes - } - - const strip = maybeVsixMap.get('strip'); - const vsixSource = vsManLookup.get(vsixId); - if (!vsixSource || vsixSource.length === 0 || !vsixSource[0]) { - session.channels.error(i`${inputPath} use of install vsix, named ID ${vsixId} was not present in the Visual Studio manifest.`); - return undefined; - } - - if (vsixSource.length === 1) { - const asUnzip = new YAMLMap(); - const soleSource = vsixSource[0]; - asUnzip.add(new Pair('unzip', [soleSource.localPath, soleSource.url])); - asUnzip.add(new Pair('sha256', soleSource.sha256)); - if (strip) { - asUnzip.add(new Pair('strip', strip)); - } - - return [asUnzip]; - } - - const langMap = new Map(); - for (const langVsix of vsixSource) { - const language = langVsix.language; - if (!language) { - session.channels.error(i`${inputPath} use of install vsix, named ID ${vsixId} had multiple packages in the Visual Studio manifest, but not all packages had language set.`); - return undefined; - } - - if (langMap.has(language)) { - session.channels.error(i`${inputPath} use of install vsix, named ID ${vsixId} had multiple matches for the same language.`); - return undefined; - } - - langMap.set(language, langVsix); - } - - const result = new Array(); - for (const entry of langMap) { - const asUnzip = new YAMLMap(); - asUnzip.add(new Pair('unzip', [entry[1].localPath, entry[1].url])); - asUnzip.add(new Pair('sha256', entry[1].sha256)); - asUnzip.add(new Pair('lang', entry[0])); - if (strip) { - asUnzip.add(new Pair('strip', strip)); - } - - result.push(asUnzip); - } - - return result; -} - -function templateAmfProcessInstallCandidate(session: Session, inputPath: string, - vsManLookup: VsManDatabase, installParent: YAMLMap): boolean { - const replacement = new Array(); - const installNode = installParent.get('install'); - if (isMap(installNode)) { - const candidates = transformVsixMapToUnzipMaps(session, inputPath, installNode, vsManLookup); - if (!candidates) { - return false; - } - - for (const candidate of candidates) { - replacement.push(candidate); - } - } else if (isSeq(installNode)) { - for (const item of installNode.items) { - if (!isMap(item)) { - return true; - } - - const candidates = transformVsixMapToUnzipMaps(session, inputPath, item, vsManLookup); - if (!candidates) { - return false; - } - - for (const candidate of candidates) { - replacement.push(candidate); - } - } - } else { - return false; - } - - if (replacement.length === 1) { - installParent.set('install', replacement[0]); - } else { - const inserted = new YAMLSeq(); - for (const entry of replacement) { - inserted.add(entry); - } - - installParent.set('install', inserted); - } - - return false; -} - -function templateAmfApplyVsixRequireVersion(session: Session, inputPath: string, vsManLookup: VsManDatabase, - vsixVersionRequireParent: YAMLMap): boolean { - const parentItems = vsixVersionRequireParent.items; - for (let idx = 0; idx < parentItems.length; ++idx) { - const thisItem = parentItems[idx]; - const key = getYamlMapEntryKey(thisItem.key); - if (key !== 'vsixVersionRequire') { - continue; - } - - const vsixVersionRequire = thisItem.value; - if (!isMap(vsixVersionRequire)) { - session.channels.error(i`vsixVersionRequire must be a map in ${inputPath}.`); - return true; - } - - const replacements = new YAMLMap(); - for (const vsixVersionRequireEntry of vsixVersionRequire.items) { - const key = vsixVersionRequireEntry.key; - const value = vsixVersionRequireEntry.value; - if (!isScalar(key) || !isScalar(value) - || typeof key.value !== 'string' || typeof value.value !== 'string') { - session.channels.error(i`vsixVersionRequire entry did not have the expected form in ${inputPath}.`); - return true; - } - - const targetName = key.value; - const adoptedVersion = lookupVsixVersion(session, vsManLookup, value.value); - if (typeof adoptedVersion !== 'string') { - return true; - } - - if (replacements.has(targetName)) { - session.channels.warning(i`vsixVersionRequire contained duplicate key ${targetName}; choosing the second.`); - } - - replacements.set(targetName, adoptedVersion); - } - - parentItems[idx] = new Pair('requires', replacements); - } - - return false; -} - -export function templateAmfApplyVsManifestInformation( - session: Session, inputPath: string, inputContent: string, vsManLookup: VsManDatabase): string | undefined { - const genericErrorMessage = i`Failed to interpret ${inputPath} as an AMF template.`; - const lc = new LineCounter(); - const inputDom = parseDocument(inputContent, { prettyErrors: false, lineCounter: lc, strict: true }); - if (inputDom.errors.length !== 0) { - session.channels.error(i`Failed to parse ${inputPath} as a YAML document: ${JSON.stringify(inputDom.errors)}`); - return undefined; - } - - if (inputDom.warnings.length !== 0) { - session.channels.warning(i`YAML warnings when parsing ${inputPath}: ${JSON.stringify(inputDom.warnings)}`); - } - - if (!isMap(inputDom.contents)) { - session.channels.error(genericErrorMessage); - return undefined; - } - - const inputRootMap = inputDom.contents; - - // replace any adopt-vsix-version-from-id nodes with the real versions - if (replaceAdoptVsixVersionFromId(session, inputPath, inputRootMap, vsManLookup)) { - return undefined; - } - - // replace any installs with "vsix" sources inside with unzip sources + - // replace any vsixVersionRequire s with require s - if (templateAmfProcessInstallCandidate(session, inputPath, vsManLookup, inputRootMap)) { - return undefined; - } - - if (templateAmfApplyVsixRequireVersion(session, inputPath, vsManLookup, inputRootMap)) { - return undefined; - } - - for (const demand of inputRootMap.items) { - if (!isPair(demand)) { - session.channels.error(genericErrorMessage); - return undefined; - } - - const demandKey = getYamlMapEntryKey(demand.key); - if (typeof demandKey !== 'string') { - session.channels.error(genericErrorMessage); - return undefined; - } - - const demandContents = demand.value; - if (demandKey === 'info' || demandKey == 'contacts' || !isMap(demandContents)) { - continue; - } - - if (templateAmfProcessInstallCandidate(session, inputPath, vsManLookup, demandContents)) { - return undefined; - } - - if (templateAmfApplyVsixRequireVersion(session, inputPath, vsManLookup, demandContents)) { - return undefined; - } - } - - return inputDom.toString(); -} diff --git a/ce/ce/willow/willow.ts b/ce/ce/willow/willow.ts deleted file mode 100644 index c3518cbbb6..0000000000 --- a/ce/ce/willow/willow.ts +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { i } from '../i18n'; - -export interface VsPayload { - readonly fileName: string; - readonly sha256: string; - readonly size: number; - readonly url: string; -} - -export interface ChManDef { - readonly payloads: Array; - readonly type: string; - readonly version: string; -} - -export interface FlatChManPayload extends VsPayload { - readonly version: string; -} - -export interface FlatVsManPayload extends VsPayload { - readonly id: string; - readonly version: string; - readonly language: string | undefined; - readonly installSize: number; - readonly localPath: string; -} - -function throwUnexpectedManifest(): never { - throw new Error(i`Unexpected format for Visual Studio manifest in channel.`); -} - -function isPayload(candidatePayload: any) { - return typeof candidatePayload.fileName === 'string' - && typeof candidatePayload.sha256 === 'string' - && candidatePayload.sha256.length === 64 - && typeof candidatePayload.size === 'number' - && typeof candidatePayload.url === 'string'; -} - -function isMinimalPackage(candidatePackage: any) { - return typeof candidatePackage.id === 'string' - && typeof candidatePackage.version === 'string' - && candidatePackage.type === 'Vsix' - && Array.isArray(candidatePackage.payloads) - && candidatePackage.payloads.length === 1 - && isPayload(candidatePackage.payloads[0]); -} - -function packageHasInstallSize(candidatePackage: any) { - return typeof (candidatePackage.installSizes) === 'object' - && typeof (candidatePackage.installSizes.targetDrive) === 'number'; -} - -function packageGetPointerLikeSingleDependencyId(candidatePackage: any): string | undefined { - if (packageHasInstallSize(candidatePackage) - || typeof candidatePackage.dependencies !== 'object') { - return undefined; - } - - let theDependency = undefined; - for (const key in candidatePackage.dependencies) { - if (theDependency) { - return undefined; - } - - if (key !== '') { - theDependency = key; - } - } - - return theDependency; -} - -export function parseVsManFromChannel(channelManifestContent: string): FlatChManPayload { - const chMan = JSON.parse(channelManifestContent); - const channelItemsRaw = chMan?.channelItems; - if (chMan.manifestVersion !== '1.1' || !Array.isArray(channelItemsRaw)) { - throw new Error(i`Unexpected Visual Studio channel manifest version.`); - } - - let vsManItem: ChManDef | undefined = undefined; - for (const channelItem of channelItemsRaw) { - if (channelItem?.id === 'Microsoft.VisualStudio.Manifests.VisualStudio') { - if (vsManItem === undefined) { - vsManItem = channelItem; - } else { - throwUnexpectedManifest(); - } - } - } - - if (!vsManItem) { - throwUnexpectedManifest(); - } - - if (!Array.isArray(vsManItem.payloads) - || vsManItem.type !== 'Manifest' - || typeof vsManItem.version !== 'string' - || vsManItem.payloads.length !== 1 - || !isPayload(vsManItem.payloads[0])) { - throwUnexpectedManifest(); - } - - return { ...vsManItem.payloads[0], version: vsManItem.version }; -} - -function flattenVsManPackage(rawJson: any): FlatVsManPayload | undefined { - if (!packageHasInstallSize(rawJson)) { - return undefined; - } - - let language: string | undefined; - if (typeof (rawJson.language) === 'string') { - language = rawJson.language; - } - - const thePayload = rawJson.payloads[0]; - const theId = rawJson.id; - const theVersion = rawJson.version; - let chip: string | undefined; - if (typeof (rawJson.chip) === 'string') { - chip = rawJson.chip; - } - - let localPath = `vsix:///${theId},version=${theVersion}`; - if (chip) { - localPath += `,chip=${chip}`; - } - - if (language) { - localPath += `,language=${language}`; - } - - localPath += '/payload.vsix'; - - return { - fileName: thePayload.fileName, - sha256: thePayload.sha256, - size: thePayload.size, - url: thePayload.url, - id: theId, - version: theVersion, - language: language, - installSize: rawJson.installSizes.targetDrive, - localPath: localPath - }; -} - -function maybeHydratePointerLikePackages(lookup: Map>, originalId: string) { - const originalArray = lookup.get(originalId); - if (!originalArray || originalArray.length === 0) { - return; - } - - const targetId = packageGetPointerLikeSingleDependencyId(originalArray[0]); - if (targetId && targetId !== originalId) { - maybeHydratePointerLikePackages(lookup, targetId); - const targetArray = lookup.get(targetId); - if (targetArray && targetArray.length == originalArray.length) { - lookup.set(originalId, targetArray); - } - } -} - -function escapeRegex(str: string) { - return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'); -} - -class NumbersEntry { - public readonly numbers: Array; // for example, [10, 29] - constructor(public readonly rawStr: string) // for example, 10.0029 - { - this.numbers = Array.from(rawStr.split('.').select(Number.parseInt)); - } -} - -function cmpNumbersEntry(a: NumbersEntry, b: NumbersEntry) { - for (let idx = 0; ; ++idx) { - if (a.numbers.length <= idx) { - if (b.numbers.length <= idx) { - return 0; - } - - return -1; - } else if (b.numbers.length <= idx) { - return 1; - } - - const l = a.numbers[idx]; - const r = b.numbers[idx]; - if (l < r) { - return -1; - } - - if (r < l) { - return 1; - } - } -} - -function maxElement(subject: Array, cmp: (arg0: T, arg1: T) => number): T | undefined { - if (subject.length === 0) { - return undefined; - } - - let highest = subject[0]; - for (let idx = 1; idx < subject.length; ++idx) { - if (cmp(subject[idx], highest) > 0) { - highest = subject[idx]; - } - } - - return highest; -} - -export function resolveVsManId(ids: Iterable, candidateId: string): string { - const needle = '$(SxSVersion)'; - const loc = candidateId.indexOf(needle); - if (loc >= 0) { - if (candidateId.indexOf(needle, loc + 1) >= 0) { - throw new Error(i`${candidateId} can only contain ${needle} once`); - } - - // find all the ids which match the expected form - const matchingIds = new Array(); - const prefix = candidateId.slice(0, loc); - const suffix = candidateId.slice(loc + needle.length); - const regStr = '^' + escapeRegex(prefix) + '((?:\\d+\\.)*\\d+)' + escapeRegex(suffix) + '$'; - const reg = new RegExp(regStr); - for (const id of ids) { - const match = reg.exec(id); - if (match) { - matchingIds.push(new NumbersEntry(match[1])); - } - } - - const highest = maxElement(matchingIds, cmpNumbersEntry); - if (highest) { - return prefix + highest.rawStr + suffix; - } - } - - return candidateId; -} - -export class VsManDatabase { - private readonly idLookup = new Map>(); - - constructor(vsManContent: string) { - const vsMan = JSON.parse(vsManContent); - if (!Array.isArray(vsMan.packages)) { - throwUnexpectedManifest(); - } - - const lookup = new Map>(); - for (const p of vsMan.packages) { - if (!isMinimalPackage(p)) { - continue; - } - - const id = p.id; - const existing = lookup.get(id); - if (existing) { - existing.push(p); - } else { - lookup.set(id, [p]); - } - } - - for (const id of Array.from(lookup.keys())) { - maybeHydratePointerLikePackages(lookup, id); - } - - for (const entry of lookup.entries()) { - const newArr = new Array(); - for (const p of entry[1]) { - const flattened = flattenVsManPackage(p); - if (flattened) { - newArr.push(flattened); - } - } - - if (newArr.length != 0) { - this.idLookup.set(entry[0], newArr); - } - } - } - - get(id: string): Array | undefined { - return this.idLookup.get(resolveVsManId(this.idLookup.keys(), id)); - } - - get size() { - return this.idLookup.size; - } -} diff --git a/ce/test/core/willow-tests.ts b/ce/test/core/willow-tests.ts deleted file mode 100644 index 1b8abb2633..0000000000 --- a/ce/test/core/willow-tests.ts +++ /dev/null @@ -1,622 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { parseVsManFromChannel, resolveVsManId, VsManDatabase } from '@microsoft/vcpkg-ce/dist/willow/willow'; -import { strict, throws } from 'assert'; -import { describe, it } from 'mocha'; -import { SuiteLocal } from './SuiteLocal'; - -function testMalformedChannelParse(chmanContent: string, damage: (chmanObjects: any) => void) { - const chmanObjects = JSON.parse(chmanContent); - damage(chmanObjects); - throws(() => parseVsManFromChannel(JSON.stringify(chmanObjects))); -} - -describe('Willow', () => { - // "channelItems": [ - // { - // "id": "Microsoft.VisualStudio.Manifests.VisualStudio", - // "version": "16.0.31205.134", - // "type": "Manifest", - // "payloads": [ - // { - // "fileName": "VisualStudio.vsman", - // "sha256": "6c99749816b688015ce25f72664610e3b5e163621a2e3dd19b06982b5c9cb31f", - // "size": 18413665, - // "url": "https://download.visualstudio.microsoft.com/download/pr/.../VisualStudio.vsman" - // } - // ] - // }, - - it('Parses Channel Manifests', async () => { - const local = new SuiteLocal(); - const chmanUri = local.resourcesFolderUri.join('2020-05-06-VisualStudio.16.Release.chman'); - const chmanContent = await chmanUri.readUTF8(); - const result = parseVsManFromChannel(chmanContent); - strict.deepStrictEqual(result, { - fileName: 'VisualStudio.vsman', - sha256: '6c99749816b688015ce25f72664610e3b5e163621a2e3dd19b06982b5c9cb31f', - size: 18413665, - url: 'https://download.visualstudio.microsoft.com/download/pr/3105fcfe-e771-41d6-9a1c-fc971e7d03a7/6c99749816b688015ce25f72664610e3b5e163621a2e3dd19b06982b5c9cb31f/VisualStudio.vsman', - version: '16.0.31205.134' - }); - - await local.after(); - }); - - it('Errors On Bad Channel Manifests', async () => { - throws(() => parseVsManFromChannel('{{{')); - const local = new SuiteLocal(); - const chmanUri = local.resourcesFolderUri.join('2020-05-06-VisualStudio.16.Release.chman'); - const chmanContent = await chmanUri.readUTF8(); - const test = (damage: (chmanObjects: any) => void) => { - testMalformedChannelParse(chmanContent, damage); - }; - - // bad version - test((chmanObjects) => chmanObjects.manifestVersion = '0'); - // bad channelItems - test((chmanObjects) => chmanObjects.channelItems = '0'); - // no Microsoft.VisualStudio.Manifests.VisualStudio - test((chmanObjects) => chmanObjects.channelItems = chmanObjects.channelItems.slice(1)); - // too many Microsoft.VisualStudio.Manifests.VisualStudio - test((chmanObjects) => chmanObjects.channelItems = chmanObjects.channelItems.push(chmanObjects.channelItems[0])); - - const testVsManEntry = (damage: (channelItem: any) => void) => { - testMalformedChannelParse(chmanContent, (chmanObjects) => damage(chmanObjects.channelItems[0])); - }; - - // bad payloads - testVsManEntry((entry) => entry.payloads = 0); - // not manifest - testVsManEntry((entry) => entry.type = 0); - // version not string - testVsManEntry((entry) => entry.version = 0); - // multiple payloads - testVsManEntry((entry) => entry.payloads = entry.payloads.push(entry.payloads[0])); - // bad filename - testVsManEntry((entry) => entry.payloads[0].fileName = 0); - // bad sha - testVsManEntry((entry) => entry.payloads[0].sha256 = 0); - // bad sha content - testVsManEntry((entry) => entry.payloads[0].sha256 = '6c99749816b688015ce25f726'); // length bad - // bad size - testVsManEntry((entry) => entry.payloads[0].size = '0'); - // bad url - testVsManEntry((entry) => entry.payloads[0].url = 0); - - await local.after(); - }); - - it('Parses VS Manifests', async () => { - const local = new SuiteLocal(); - const vsmanUri = local.resourcesFolderUri.join('2021-05-06-VisualStudio.vsman'); - const vsmanContent = await vsmanUri.readUTF8(); - const result = new VsManDatabase(vsmanContent); - strict.deepStrictEqual(result.get('Microsoft.VisualCpp.Tools.HostX86.TargetX86'), - [ - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86', - 'version': '14.28.29914', - 'language': undefined, - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.vsix', - 'sha256': '5b9e9d7f332e79bcc2342c49e7f99ddf43ecf6d130e5e6c6908dc2c7a39b15c6', - 'size': 16126219, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/5b9e9d7f332e79bcc2342c49e7f99ddf43ecf6d130e5e6c6908dc2c7a39b15c6/Microsoft.VisualCpp.Tools.HostX86.TargetX86.vsix', - 'installSize': 35276532, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86,version=14.28.29914/payload.vsix' - } - ]); - - strict.deepStrictEqual(result.get('Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources'), [ - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'cs-CZ', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.csy.vsix', - 'sha256': '47db023518b45bab6e7b9bba9aa2b0254895f3eb21221a70bdeb453e2747bafd', - 'size': 229756, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/47db023518b45bab6e7b9bba9aa2b0254895f3eb21221a70bdeb453e2747bafd/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.csy.vsix', - 'installSize': 906288, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=cs-CZ/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'de-DE', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.deu.vsix', - 'sha256': '5e128ff82600b53cebd63afaa40d3714d52c539104bf8ad4b44d61f261e933a1', - 'size': 234819, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/5e128ff82600b53cebd63afaa40d3714d52c539104bf8ad4b44d61f261e933a1/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.deu.vsix', - 'installSize': 1026640, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=de-DE/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'en-US', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.enu.vsix', - 'sha256': '4752b7e2053d1db888b43309d604ae7ed807d363ecbb39a89937ca051a10bdc8', - 'size': 204190, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/4752b7e2053d1db888b43309d604ae7ed807d363ecbb39a89937ca051a10bdc8/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.enu.vsix', - 'installSize': 862328, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=en-US/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'es-ES', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.esn.vsix', - 'sha256': 'b9c8500e4f49df54292c7aab3bae930a940cd264877b4feee7cc26618f99edf4', - 'size': 224027, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/b9c8500e4f49df54292c7aab3bae930a940cd264877b4feee7cc26618f99edf4/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.esn.vsix', - 'installSize': 1001560, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=es-ES/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'fr-FR', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.fra.vsix', - 'sha256': 'fe41ec5957aaa14e5a613cd2352bc1171b1e4b550e980bf4dcd0b11fce1d7192', - 'size': 225466, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/fe41ec5957aaa14e5a613cd2352bc1171b1e4b550e980bf4dcd0b11fce1d7192/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.fra.vsix', - 'installSize': 1012800, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=fr-FR/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'it-IT', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ita.vsix', - 'sha256': '8c540bc9953a7f1c26072e16748926a73818ae5fb5b8288bedbc0841e789bfac', - 'size': 222846, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/8c540bc9953a7f1c26072e16748926a73818ae5fb5b8288bedbc0841e789bfac/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ita.vsix', - 'installSize': 1012272, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=it-IT/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'ja-JP', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.jpn.vsix', - 'sha256': '91e4c239726a104a38c7ae69d1590abc20249354c0fd5a5ae580ceef8e5149eb', - 'size': 200323, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/91e4c239726a104a38c7ae69d1590abc20249354c0fd5a5ae580ceef8e5149eb/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.jpn.vsix', - 'installSize': 636488, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=ja-JP/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'ko-KR', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.kor.vsix', - 'sha256': '3b1fa4d736a7d82bef9054fbe5f52919d34a8c5ec614e3d957e7665b94ae9ece', - 'size': 195053, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/3b1fa4d736a7d82bef9054fbe5f52919d34a8c5ec614e3d957e7665b94ae9ece/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.kor.vsix', - 'installSize': 640568, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=ko-KR/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'pl-PL', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.plk.vsix', - 'sha256': '13b2331b7157e21006b79c873d532e5e256ae049f41b11be972e316eae6a8a1b', - 'size': 233518, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/13b2331b7157e21006b79c873d532e5e256ae049f41b11be972e316eae6a8a1b/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.plk.vsix', - 'installSize': 982080, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=pl-PL/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'pt-BR', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ptb.vsix', - 'sha256': '2d4133d05cf9adec2bdbc73cbdb266c359d7bb1fe6e012cc346b1dff334df860', - 'size': 219322, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/2d4133d05cf9adec2bdbc73cbdb266c359d7bb1fe6e012cc346b1dff334df860/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ptb.vsix', - 'installSize': 947784, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=pt-BR/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'ru-RU', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.rus.vsix', - 'sha256': '54d321dc5471c42d655aa5b613b55dab3f1129df179bef8597e470d46f464445', - 'size': 233022, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/54d321dc5471c42d655aa5b613b55dab3f1129df179bef8597e470d46f464445/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.rus.vsix', - 'installSize': 968256, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=ru-RU/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'tr-TR', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.trk.vsix', - 'sha256': '7b1cbe7df387e5132d8e639e407afe8c83b45f624cde06fc9aa6af0bf896f32d', - 'size': 216776, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7b1cbe7df387e5132d8e639e407afe8c83b45f624cde06fc9aa6af0bf896f32d/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.trk.vsix', - 'installSize': 911416, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=tr-TR/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'zh-CN', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.chs.vsix', - 'sha256': '7538c083be1f37b91217b8690a72746fc57bcd4c0e8c21f553ac4f88f8c60c98', - 'size': 183804, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7538c083be1f37b91217b8690a72746fc57bcd4c0e8c21f553ac4f88f8c60c98/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.chs.vsix', - 'installSize': 478256, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=zh-CN/payload.vsix' - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources', - 'version': '14.28.29914', - 'language': 'zh-TW', - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.cht.vsix', - 'sha256': 'f0c019c004dcca5f7f5ce3a9b97730967cfff6f960113a55f7f317a41ade3df7', - 'size': 187675, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/f0c019c004dcca5f7f5ce3a9b97730967cfff6f960113a55f7f317a41ade3df7/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.cht.vsix', - 'installSize': 503864, - 'localPath': 'vsix:///Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources,version=14.28.29914,language=zh-TW/payload.vsix' - } - ]); - - await local.after(); - }); - - it('Hard Rejects Completely Broken VS Manifests', () => { - throws(() => { new VsManDatabase('{'); }); - throws(() => { new VsManDatabase('{}'); }); - throws(() => { new VsManDatabase('{\'packages\': 42}'); }); - }); - - it('Ignores Unusuable Packages', () => { - const testInput = { - 'packages': [ - { - 'id': 'good', - 'version': '14.28.29914', - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 33650830 - } - }, - { - // no id - 'version': '14.28.29914', - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 33650830 - } - }, - { - 'id': 'badversion', - 'version': 42, - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 33650830 - } - }, - { - 'id': 'badtype', - 'version': '14.28.29914', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 33650830 - } - }, - { - 'id': 'badinstallsize', - 'version': '14.28.29914', - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'elsewhere': 33650830 - } - }, - { - 'id': 'badpayload', - 'version': '14.28.29914', - 'type': 'Vsix', - 'payloads': [ - { - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 33650830 - } - }, - { - 'id': 'multipayload', - 'version': '14.28.29914', - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'signer': { - '$ref': '2' - } - }, - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix_other', - 'sha256': 'xxxx3eaab5d6000185cf8c44e3eeb8229cd1afa3dda2cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://example.com/hello.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 33650830 - } - } - ] - }; - - const actual = new VsManDatabase(JSON.stringify(testInput)); - strict.equal(actual.size, 1); - strict.deepStrictEqual(actual.get('good'), [{ - 'id': 'good', - 'version': '14.28.29914', - 'language': undefined, - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'sha256': '7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42', - 'size': 15447514, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7c3a3eaab5d6000185cf8c44e3eeb8229cd1afa3dd72cf1d9c579f9125561a42/Microsoft.VisualCpp.Tools.HostX86.TargetX64.vsix', - 'installSize': 33650830, - 'localPath': 'vsix:///good,version=14.28.29914/payload.vsix' - }]); - }); - - it('Follows Pointer-like Packages', () => { - const testInput = { - 'packages': [ - { - 'id': 'Microsoft.VisualCpp.ASAN.X86', - 'version': '14.29.30037', - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.ASAN.X86.vsix', - 'sha256': '97c926de9fef5e5c8760638ad05ceaa7793f923ab608ece35c9102c7cc992338', - 'size': 1071, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/97c926de9fef5e5c8760638ad05ceaa7793f923ab608ece35c9102c7cc992338/Microsoft.VisualCpp.ASAN.X86.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'dependencies': { - 'Microsoft.VC.14.29.16.10.ASAN.X86.base': '14.29.30037' - } - }, - { - 'id': 'Microsoft.VC.14.29.16.10.ASAN.X86.base', - 'version': '14.29.30037', - 'type': 'Vsix', - 'payloads': [ - { - 'fileName': 'Microsoft.VC.14.29.16.10.ASAN.X86.base.vsix', - 'sha256': '4a39aa98ee4540b8cd9a55ad6f1717602ee45ffd2db3a70894b9a3b41dfdac1c', - 'size': 17401493, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/4a39aa98ee4540b8cd9a55ad6f1717602ee45ffd2db3a70894b9a3b41dfdac1c/Microsoft.VC.14.29.16.10.ASAN.X86.base.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 63068674 - }, - 'dependencies': { - 'Microsoft.VC.14.29.16.10.ASAN.Headers.base': '14.29.30037', - 'Microsoft.VC.14.29.16.10.ASAN.X64.base': '14.29.30037', - 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetX86.base': '14.29.30037', - 'Microsoft.VC.14.29.16.10.Tools.HostX64.TargetX86.base': '14.29.30037' - } - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources', - 'version': '14.29.30037', - 'type': 'Vsix', - 'language': 'de-DE', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources.deu.vsix', - 'sha256': 'a4cf6d5ac182a7f386afabdcb27605fca34869bc2b6bd39c4210021f85813599', - 'size': 1100, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/a4cf6d5ac182a7f386afabdcb27605fca34869bc2b6bd39c4210021f85813599/Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources.deu.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'dependencies': { - 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base': '14.29.30037' - } - }, - { - 'id': 'Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources', - 'version': '14.29.30037', - 'type': 'Vsix', - 'language': 'en-US', - 'payloads': [ - { - 'fileName': 'Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources.enu.vsix', - 'sha256': '0b83f64f4a9d9bc5200092d06117a0e7936ca7f1a4e3b596537cdba2893504d5', - 'size': 1100, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/0b83f64f4a9d9bc5200092d06117a0e7936ca7f1a4e3b596537cdba2893504d5/Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources.enu.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'dependencies': { - 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base': '14.29.30037' - } - }, - { - 'id': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base', - 'version': '14.29.30037', - 'type': 'Vsix', - 'language': 'de-DE', - 'payloads': [ - { - 'fileName': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.deu.vsix', - 'sha256': '23612dd70c849c6735b17ce2887edf6d7ca243e9a2f9bd427daace8653b17987', - 'size': 236777, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/23612dd70c849c6735b17ce2887edf6d7ca243e9a2f9bd427daace8653b17987/Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.deu.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 1033240 - } - }, - { - 'id': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base', - 'version': '14.29.30037', - 'type': 'Vsix', - 'language': 'en-US', - 'payloads': [ - { - 'fileName': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.enu.vsix', - 'sha256': 'b6c39771b8c5564f9998e7b1bd3a89e1d23d287f6625ef65f2cd43c1ccabd306', - 'size': 205517, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/b6c39771b8c5564f9998e7b1bd3a89e1d23d287f6625ef65f2cd43c1ccabd306/Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.enu.vsix', - 'signer': { - '$ref': '2' - } - } - ], - 'installSizes': { - 'targetDrive': 868400 - } - } - ] - }; - - const actual = new VsManDatabase(JSON.stringify(testInput)); - strict.equal(actual.size, 4); - const asanExpected = [{ - 'id': 'Microsoft.VC.14.29.16.10.ASAN.X86.base', - 'version': '14.29.30037', - 'language': undefined, - 'fileName': 'Microsoft.VC.14.29.16.10.ASAN.X86.base.vsix', - 'sha256': '4a39aa98ee4540b8cd9a55ad6f1717602ee45ffd2db3a70894b9a3b41dfdac1c', - 'size': 17401493, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/4a39aa98ee4540b8cd9a55ad6f1717602ee45ffd2db3a70894b9a3b41dfdac1c/Microsoft.VC.14.29.16.10.ASAN.X86.base.vsix', - 'installSize': 63068674, - 'localPath': 'vsix:///Microsoft.VC.14.29.16.10.ASAN.X86.base,version=14.29.30037/payload.vsix' - }]; - strict.deepStrictEqual(actual.get('Microsoft.VisualCpp.ASAN.X86'), asanExpected); - strict.deepStrictEqual(actual.get('Microsoft.VC.$(SxSVersion).ASAN.X86.base'), asanExpected); - strict.deepStrictEqual(actual.get('Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources'), [ - { - 'id': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base', - 'version': '14.29.30037', - 'language': 'de-DE', - 'fileName': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.deu.vsix', - 'sha256': '23612dd70c849c6735b17ce2887edf6d7ca243e9a2f9bd427daace8653b17987', - 'size': 236777, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/23612dd70c849c6735b17ce2887edf6d7ca243e9a2f9bd427daace8653b17987/Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.deu.vsix', - 'installSize': 1033240, - 'localPath': 'vsix:///Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base,version=14.29.30037,language=de-DE/payload.vsix' - }, - { - 'id': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base', - 'version': '14.29.30037', - 'language': 'en-US', - 'fileName': 'Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.enu.vsix', - 'sha256': 'b6c39771b8c5564f9998e7b1bd3a89e1d23d287f6625ef65f2cd43c1ccabd306', - 'size': 205517, - 'url': 'https://download.visualstudio.microsoft.com/download/pr/c0ac19c1-e1d7-47e2-bde8-fd11c4410cca/b6c39771b8c5564f9998e7b1bd3a89e1d23d287f6625ef65f2cd43c1ccabd306/Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base.enu.vsix', - 'installSize': 868400, - 'localPath': 'vsix:///Microsoft.VC.14.29.16.10.Tools.HostX86.TargetARM.Resources.base,version=14.29.30037,language=en-US/payload.vsix' - } - ]); - }); - - it('Finds Latest Numbers', () => { - strict.equal(resolveVsManId(['hello.100.world', 'hello.9.world', 'hello.10.world', 'unrelated'], 'hello.$(SxSVersion).world'), 'hello.100.world'); - - strict.equal(resolveVsManId(['hello.9.world', 'hello.10.world', 'unrelated', 'hello.100.world'], 'hello.$(SxSVersion).world'), 'hello.100.world'); - - strict.equal(resolveVsManId(['hello.9.world', 'hello.100.world', 'hello.10.world', 'unrelated'], 'hello.$(SxSVersion).world'), 'hello.100.world'); - - strict.equal(resolveVsManId(['hello.100.10.world', 'hello.100.world', 'hello.10.world', 'unrelated'], 'hello.$(SxSVersion).world'), 'hello.100.10.world'); - - strict.equal(resolveVsManId(['hello.100.10.world', 'hello.100.world', 'hello.10.world', 'unrelated'], '$(SxSVersion)'), '$(SxSVersion)'); - - strict.equal(resolveVsManId(['100.10', '100', '10', 'unrelated'], '$(SxSVersion)'), '100.10'); - }); -}); diff --git a/ce/test/resources/2020-05-06-VisualStudio.16.Release.chman b/ce/test/resources/2020-05-06-VisualStudio.16.Release.chman deleted file mode 100644 index 1edd751918..0000000000 --- a/ce/test/resources/2020-05-06-VisualStudio.16.Release.chman +++ /dev/null @@ -1,35 +0,0 @@ -{"manifestVersion":"1.1","info":{"id":"VisualStudio.16.Release/16.9.4+31205.134","buildBranch":"d16.9","buildVersion":"16.9.31205.134","commitId":"a3f84039d0bc8d5d7aec0413df8996074be92b46","communityOrLowerFlightId":"9275227367e942f","localBuild":"build-lab","manifestName":"VisualStudio.16.Release","manifestType":"channel","productDisplayVersion":"16.9.4","productLine":"Dev16","productLineVersion":"2019","productMilestone":"RTW","productMilestoneIsPreRelease":"False","productName":"Visual Studio","productPatchVersion":"4","productPreReleaseMilestoneSuffix":"1.0","productSemanticVersion":"16.9.4+31205.134","professionalOrGreaterFlightId":"65da37c6b6f2407","qBuildSessionId":"0b06647a-e115-b73b-7734-d7edcfb674ff"},"channelItems":[{"id":"Microsoft.VisualStudio.Manifests.VisualStudio","version":"16.0.31205.134","type":"Manifest","payloads":[{"fileName":"VisualStudio.vsman","sha256":"6c99749816b688015ce25f72664610e3b5e163621a2e3dd19b06982b5c9cb31f","size":18413665,"url":"https://download.visualstudio.microsoft.com/download/pr/3105fcfe-e771-41d6-9a1c-fc971e7d03a7/6c99749816b688015ce25f72664610e3b5e163621a2e3dd19b06982b5c9cb31f/VisualStudio.vsman"}]},{"id":"Microsoft.VisualStudio.Product.BuildTools","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+DQogIDxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uYnJhbmQtdnNpZGV7ZmlsbDojODY1ZmM1fTwvc3R5bGU+DQogIDxwYXRoIGNsYXNzPSJpY29uLWNhbnZhcy10cmFuc3BhcmVudCIgZD0iTTQwIDQwSDBWMGg0MHY0MHoiIGlkPSJjYW52YXMiLz4NCiAgPHBhdGggY2xhc3M9ImJyYW5kLXZzaWRlIiBkPSJNMzAuMjIxLS4wMDJMMTMuODg3IDE2LjE2IDQuMDUyIDguNzQ2IDAgMTAuMTAyVjI5LjlsNC4wNTIgMS4zNTYgOS44MzUtNy40MTQgMTYuMzM0IDE2LjE2TDQwIDM1Ljg0MlY0LjE1OGwtOS43NzktNC4xNnpNNC4wNTIgMjUuODlWMTQuMTExTDEwLjAwNCAyMGwtNS45NTIgNS44OXpNMzAgMjguNDcyTDE4Ljk4MyAyMCAzMCAxMS41Mjh2MTYuOTQ0eiIvPg0KPC9zdmc+"},"isHidden":true,"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","localizedResources":[{"language":"en-us","title":"Visual Studio Build Tools 2019","description":"The Visual Studio Build Tools allows you to build native and managed MSBuild-based applications without requiring the Visual Studio IDE. There are options to install the Visual C++ compilers and libraries, MFC, ATL, and C++/CLI support.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"zh-cn","title":"Visual Studio 生成工具 2019","description":"Visual Studio 生成工具允许生成本机和基于 MSBuild 的托管 .NET 应用程序,而不需要 Visual Studio IDE。还可以选择安装 Visual C++ 编译器和库、MFC、ALT 和 C++/CLI 支持。","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"zh-tw","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools 可讓您建置原生及受控 MSBuild 型工具,而不需要 Visual Studio IDE。選項包括安裝 Visual C++ 編譯器與程式庫、MFC、ATL 及 C++/CLI 支援。","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"cs-cz","title":"Visual Studio Build Tools 2019","description":"Nástroje Visual Studio Build Tools umožňují vytváření nativních a spravovaných aplikací na bázi platformy MSBuild, aniž by se vyžadovalo prostředí IDE sady Visual Studio. K dispozici jsou i možnosti pro instalaci nástrojů, jako jsou kompilátory a knihovny nebo podpora Visual C++, MFC, ATL a C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"de-de","title":"Visual Studio Build Tools 2019","description":"Die Visual Studio Build Tools ermöglichen Ihnen die Erstellung nativer und verwalteter MSBuild-basierter Anwendungen, ohne dass die Visual Studio-IDE erforderlich ist. Es stehen Optionen zur Installation von Visual C++-Compilern und -Bibliotheken, MFC, ATL sowie C++/CLI-Unterstützung zur Verfügung.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"es-es","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools permite compilar aplicaciones nativas y administradas basadas en MSBuild sin el IDE de Visual Studio. Hay opciones para instalar los compiladores y las bibliotecas de Visual C++, MFC, ATL y la compatibilidad con C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"fr-fr","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools vous permet de générer des applications MSBuild natives et managées sans passer par l'IDE Visual Studio. Il existe des options pour installer les compilateurs et bibliothèques Visual C++, ainsi que la prise en charge d'ATL, de MFC et de C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"it-it","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools consente di creare applicazioni native e gestite basate su MSBuild senza l'IDE di Visual Studio. Sono disponibili opzioni per installare le librerie e i compilatori Visual C++, MFC, ATL e il supporto C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"ja-jp","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools では、Visual Studio IDE を必要とせずに、MSBuild ベースのネイティブ マネージド アプリケーションをビルドできます。また、Visual C++ のコンパイラやライブラリ、MFC、ATL、および C++/CLI サポートをインストールするオプションも用意されています。","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"ko-kr","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools에서는 Visual Studio IDE 없이 네이티브 및 관리 MSBuild 기반 애플리케이션을 빌드할 수 있습니다. Visual C++ 컴파일러 및 라이브러리, MFC, ATL, C++/CLI 지원 등과 같은 도구를 설치하는 옵션이 있습니다.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"pl-pl","title":"Visual Studio Build Tools 2019","description":"Narzędzia Visual Studio Build Tools umożliwiają tworzenie natywnych i zarządzanych aplikacji opartych na narzędziu MSBuild bez korzystania ze środowiska IDE programu Visual Studio. Dostępne są opcje instalacji narzędzi, takich jak kompilatory i biblioteki Visual C++, ATL, MFC oraz obsługa C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"pt-br","title":"Ferramentas de Build do Visual Studio 2019","description":"As Ferramentas de Build do Visual Studio permitem que você compile aplicativos nativos e gerenciados com base no MSBuild sem precisar do IDE do Visual Studio. Há opções para instalar as bibliotecas e os compiladores do Visual C++, MFC, ATL e suporte C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"ru-ru","title":"Visual Studio Build Tools 2019","description":"Visual Studio Build Tools позволяет осуществлять сборку собственных и управляемых приложений на базе MSBuild без использования среды Visual Studio IDE. Существуют разные варианты установки компиляторов и библиотек Visual C++, ATL, MFC и поддержки C++/CLI.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"},{"language":"tr-tr","title":"Visual Studio Derleme Araçları 2019","description":"Visual Studio Derleme Araçları, MSBuild tabanlı yerel ve yönetilen uygulamaları Visual Studio IDE kullanmanız gerekmeden derlemenizi sağlar. Visual C++ derleyicileri ile kitaplıkları, MFC, ATL ve C++/CLI desteğini yükleyebilirsiniz.","license":"https://go.microsoft.com/fwlink/?LinkId=2086102"}]},{"id":"Microsoft.VisualStudio.Product.Community","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgOTYgOTYiPg0KICA8ZGVmcz4NCiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0OCIgeTE9Ijk2IiB4Mj0iNDgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz4NCiAgICA8L2xpbmVhckdyYWRpZW50Pg0KICAgIDxjbGlwUGF0aCBpZD0iYiI+DQogICAgICA8cGF0aCBkPSJNNjguODkxLDk1LjZhNS45NzYsNS45NzYsMCwwLDAsMy45MzMtLjQzOUw5Mi42LDg1LjY1MUE2LDYsMCwwLDAsOTYsODAuMjQ0VjE1Ljc1N2E2LDYsMCwwLDAtMy40LTUuNDA4TDcyLjgyNC44MzlBNS45OCw1Ljk4LDAsMCwwLDY2LDJMMzQuMTE4LDM3LjI2NCwxNS41LDIybC0xLjYzMS0xLjRhNCw0LDAsMCwwLTMuNjEtLjgzNCwzLjk0NywzLjk0NywwLDAsMC0uNTMxLjE3OUwyLjQ2MiwyMi45NzRBNCw0LDAsMCwwLC4wMTEsMjYuMzY2Yy0uMDA3LjEtLjAxMS4yLS4wMTEuM1Y2OS4zMzNjMCwuMSwwLC4yLjAxMS4zYTQsNCwwLDAsMCwyLjQ1MSwzLjM5Mmw3LjI2NiwzLjAyN2EzLjk0NywzLjk0NywwLDAsMCwuNTMxLjE3OSw0LDQsMCwwLDAsMy42MS0uODM0TDE1LjUsNzQsMzQuMTE3LDU4LjczNiw2Niw5NEE1Ljk2NCw1Ljk2NCwwLDAsMCw2OC44OTEsOTUuNlpNNzIsMjcuNjc3LDQ3LjIxMiw0OCw3Miw2OC4zMjNabS02MCw2LjZMMjQuNDExLDQ4LDEyLDYxLjcyN1oiIGZpbGw9Im5vbmUiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPg0KICAgIDwvY2xpcFBhdGg+DQogIDwvZGVmcz4NCiAgPHRpdGxlPkJyYW5kVmlzdWFsU3R1ZGlvV2luMjAxOTwvdGl0bGU+DQogIDxnIHN0eWxlPSJpc29sYXRpb246aXNvbGF0ZSI+DQogICAgPHJlY3Qgd2lkdGg9Ijk2IiBoZWlnaHQ9Ijk2IiBvcGFjaXR5PSIwIiBmaWxsPSJ1cmwoI2EpIi8+DQogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2IpIj4NCiAgICAgIDxpbWFnZSB3aWR0aD0iNDAiIGhlaWdodD0iODIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUJTQ0FZQUFBQW1SNWJLQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUVlMGxFUVZSb1ErMmFXM2ZiSUJDRUIxK2FTOU1tLy85M05va2RKMVlmWU1Sb3RTQnM2cllQbW5QMllFblkraklzcUJVYmhtSEEvNnpOVW9kL3JkMVNoMHNVUWdpbGE4T1ZROVVGV0FCeUlXM1hWdURRMkc4aUF4WUtyV29vdEl1Z0Z3RUttTFlhOXBvQ2FlaTVLbVRURUJmQU5zaGcrbGxoZ1FoeGR0cnhlZ2dobENDcmdBdGdteFJiK2F5Z1FJYlIrRXJYZWN4K3JvcUFCazZkSWxRcEZGQ2h2Z0I4cG10ZnlEb0RRQWpCSFdvWDBJR3pZTHNVZS9tOFEzYVQrVWU0VXdwZUEzSU9qcm5xRFhWdGlCVk93ZllwdnBrZ0pCZi9BUm51QThEUlhOTlE2SWxtZ01rOUM4ZWJFK1lld0YxcTd6R0ZKSVRDSFRDRnMzazV1bWcxQVhUV053VzhTL0dRNGxFK0U1S0FBMksrSFJIaHR1azNPZVNmeVBtbzk1ekpHMkxQdlcrSWNJOHBuZ0I4VHkxQjc1QW55Um5aT2Q1REhkV1pQNEcwZVZqS1FaMFVCTHhIaFBtUjRtZHFuekFGQktJN0I4UmM1ZkV4SFN2Y29rYkF3c3pkSWs4SUJYd0c4SUlNK1pqNmNIZy9rT0ZPeUxBNnl5SHRxS1ZaN0UyUVBYTHVjVmdKK0lJSStJQU1TTGNDc3BOMkNhSUcwODVVR21JdkIrbmdFN0tMejhnT3FtTUVmVWVHczI0dHdnSHRrNFF1S2lSQmZ5STZ1RU84MlJGeGtuRDJlb3V6UmxVdFEweEF1c2lsNVhzS3p1SXQ4aVBzaUF3SHpLSE96cm5sZFZCVWc5UUZtbkdYK3ZLWjZ6bW5DN01MVlh3V093dDB5VWtGMWNmZEh0a3RYVUk4NXp6SXBrbmlRVzVNTU9FSnVwTUl5UCtVVWltWUIxWE5RN3RZenRZbHpHRjFvV1ZZMXlrdno1cWNvMG81Q0V4djVnMjd3dkVQOWR5N0dFcGxIZlJrNGJ4VThGUURhWVp0QWZUa2dkVkFiK3BnaTBwdzNib0c4R1l3bnE0Qi9LdGFBWHUxQXZacUJlelZDdGlyRmJCWEsyQ3ZWc0JlcllDOVdnRjd0UUwyYWdYczFRcllxMnNBTDNxMzBxdHJBRDNkRFBwYVFPOHRWUW15OXZwdVVTMkF0ZGRudGRkcE5aQm0yQnFnM3R3QzJwZmgrdjVaNWJtM0NLV3lyNEE5Tnl6VUY2YUFoTk8rVkFtd0dWWUJCK1F2ZUU2ZEViZTN1Tjk3UXQ3MzVZdDFoYVZDdXJhQkQxZUYzQUhBTUF5RDdKVjR3Nm1iME56elpmdUJES0R1QW5PZ0RjcXdiaTZYM3ZKN2NGcDdjSkRZSTk2QVcyRjBXZDJzd1kxcUthb29PYWUxQis4cFhoRjNtYmFwdjI0bUtpVGdPK25sNDh4Rno4RVNJSjE3QS9BTGNYK08zLy9FZkFQN0JOOUpMdytMcWcyeEF0SzlOMFF3RmxDRTFPOEQ4dzN0UXpwUE43M0pvNjJybGlHbWUrL0lOVE5hUEhHQ1h4THdscjVqaDl3dVE5ck9OQUxLVFBZQXRZS0RoUk1Ec3J0MDFoWlZ2S1gyQ0gvSVp6blhXdlZ4UnZ5cmRJZzVBNEg0dzRRL29GNlc4b284M0FySkNWUlZhWklBMlVHYjBIU1g0TzlZTHV5aGs1cVQraFFhSGFzdU04NkNyWkQybk03c2x0SW81aU9mUURNNFR6TUhFeVFQZFJocXVkbGFYSGJFM01VcVpHMi9XSWVheDNiNW9ZdUUwMW9GKzhkb2VJQXVwQXRvWmpRdy9TSG1EaUczSmpSZnRhOCt6MTMzdktLS2FwSHREVXRFOVhoQVpITkJtcXFBRjBEdFp3VUVNcVRYamc1MkFWSUZVQXVsTFg5OE1LSG5xbVhLRndGU1RwMk4xNnFHUXZ0bkM3MnRET2g0MmprSG1GbTZCRVoxQVZvVmdBRzBBMW45VWNCYnFPWC94ZjlVdndFRXhuUTEwSmJTZmdBQUFBQkpSVTVFcmtKZ2dnPT0iIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNMTUuNSw3NGwtMS42MzEsMS40YTQsNCwwLDAsMS00LjE0MS42NTVMMi40NjIsNzMuMDI2QTQsNCwwLDAsMSwwLDY5LjMzM1YyNi42NjdhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMkEyLjIxMywyLjIxMywwLDAsMCwxMiwyMy44VjcyLjJBMi4yMTQsMi4yMTQsMCwwLDAsMTUuNSw3NFoiIGZpbGw9IiM1MjIxOGEiLz4NCiAgICAgIDxpbWFnZSB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEwMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyIC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCbENBWUFBQUNHTENlWEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFMVDBsRVFWUjRYdTJiNjFiYk9oU0V4N1JBNmUyYzl2MGZzcWZjQzhYblJ6VFJlSHZMbGhJNUpJcG5MUzNuWXFETng3Nk5STmYzUFZhMXE0dTVHMWFkdGo3TzNiQnFySzdydXJsN3FQNmRVK1FLT0ZNTzFDekkrbVh2QVhzRm5DR0JxMWY3bWxVdjF4NTRIOWdyNEFrWnNGTUxjclZndmJXRnZUVG9GWEJDRHR3THVlcXlvQlhrVzFpOWM5MTg4NFZCcjRBZEJiaTZDUE9EV1JZME1BVDdCdUN2dWVwYUhQUUsyTWlCUzVBZnpickVFTFlGL0Rlc1YxbC9aUjBFOUFwWVpPQnExRjVpODFsZHlicVV4WHVCRFN4Q2ZNRUc3SXRaQkw4NDZCVndrQU9Ya1VtSTEyRjlraXRoTThvN3hPaDlCZkJuWXRuSVhnVDBDaGl6Y0JYc1p3QTNjaVZrUmpFQk0yci9BSGdPNnlrc1B2K0RHTkdMZ1Q1N3dBbTRyTEZYMkVDOEFmQWxySy9oK2ptc2E4UjZiQUVyMkVkWkNudFIwRjNtZlUwcUF5NmpsV0MvQWZnZUhuOUZqR1RXYUdBRGcrbjVHUkhxZzF6NWVCZlEyMWs2Qi9MWlJ2QU1YRTNKQ3ZhZnNBajVDemFBV1ljN1RBTytEK3NCMDZBSjIrdTgyYVdqNjdwWnlHY0plS1piWmxvbVhJTDlOeXhDL29ZWXdWZllmSmJhWkRGRnB3QmIyTHlQYWQyQ3ZrQUVEV1E2WW1jSE9PRlFlV21aY0FuMkI0YVFHY0ZzdEFpWVl4SUJLMlFMOTg2OFJ0Qlg4QnN5L2JjemJRTlNvNjNPQ3JBRDEydW9QTGcvc1FIOEE4TVUvVGw4RFp1c0MwVEF0dEY2RFBjL1lQT0xjUitlRS9RTkl2aHJSTmpXTmV2Qzl3Wk04K1ZGOFZrQkRySnBtUVlHNFg3Qkp2MHlMUlB1VDhUby9ZWllmNi9EOTlBYWJHZmhtN0NlRUNHekM3K1Q5emxqYy9UaTkxWFBtMkt6dGUyeXU2N3JMT1N6QVN4MTE0TjdqVGdLS1Z4R0xlSCtpMDMwY2t4aTlCSUVwVzdXRlRhUnpNYU42OFk4bndLcjZwM0ZlODR6Z2hNZE05UHlIRnl0dlpxYTJWeHBlcVlZV1c4WWxnQmQxL0tZVUQyd0dxbk1ETW5SeVVaeDg0QXp4aUdGcXgyendyV2pFU09PWU5TTEJvWlErUE5lRVNFcVRBOG9RZXBtaFoyUHVmVC94Ni9mcW1uQUdSWmthaHl5SGJNMzk3SnoxdVpIMVlmWDMrUWVyYVVLUkpzeTdiNmZNTnpZNEMrR2ZpLytETmIvZ1pvRlBCRzVUSStmRUIycUhMaXN1UXAzcWdIcTVKcHFqbDR4M0pYU3FMYkxRdVVWR1A5eWJhVnBwUmxsV0pEYU1YL0gyTXpRYmxsckx1dm1GRnpJYTUzejNJdDA3WWJ0ZFZ0Zmc3eWZOWHdoam9QdEFaNXhxVmh6VTJuWnE3bTJvVXJCVFVXcVB0WkdTVk15WGF0bkRNME5hMW1PTmgvbTFCVGdESmRxcXVhbUdpb2J1YmFXUXE3MmcvY2FKdDFHZkVLMEt1L05VcDlhM2F4WCtGMzBWazEyMFRNdWxUWlVUTXVha3FjaVY3dmxWT1FDNDJoVnVCWXNiY3M3QUxjQWZvZjFuenkrRGU4VE5DR3prN1p3M2FodUJuQ1FUY3ZhVk5tYW00cGM2MUpadU5veHArQjZxZmdQb21XcGNQK1Q5UXNSOEIxOHdFVXB1d25BR1M2VldwQjJBMEVCSzF3OXJiRUxYSjFmMVk4bVhFYXNCL2NXTVUzcnBvUHVGelB0OTJZTmRQS0FNMTJxejVoMnFiUmpWcmc2dHRpMHJCK21UY25jVGRJdFE5WlpDL2VYUEU3QnpUa0lBQUNqRFllVEJselJwZEp4U0NPWFRaWFhJZXRqL2JDOWV2dUFjYjBsV0Y1dFd0WTk0UlRZMUNpMTFja0NydVJTc2VZcVhEMWo1WFhNMUZ3enhaUk11TnBJS2R5cHRHelRjV3BHN29GeDlBSW5DbmhCbDJxdVk2WnltaW1ia3IybzFjaWRndXRGcTliK2RrNTBaTHBVSGx4ZEtaZHFGN2hlTTBXNFRNbGFieFV1UjZGN0RHZGVDemNKRmtqREJVNE1jRUhONVVHNWZXZGRGVDlFVzI5Zk1UWXV0Tjdtd3MwWmd3WWc1dzdjQVNjRU9NT0N0S2NnNStCNnMrNlVpZUhWVzhMbHFVaTZVRHJmS2xqVzNKU0o4WUp4dmRXb3pZS3FPZ25BaFJZazRYcWpVRTdrMHI3dE1JeWNxWG83MVV3cFlOdE1FUzdISUoxdHQ1RmJDbFYxOUlBTExFZ0xsNUZyeDZFNWw0by95NE9iWTE3WVpvcVBiekhkS2F2SHZJM2FmZUFDSndBNHlLYmxsRXVsYVZrUHlWa0wwbk9wdE9acXZlMnhtM21ScXJjNjR5WmRxWDNCVWtjTnVOQ0M5RXdNQld6aFRuWExXbTlMelFzRlc5Sk1WWWNMSERIZ0NoYmtEd3pocGc3S2VkRnJtNm5jZXF0WHJiZjNpSTJZZGFhcTFWdFBSd200WUJ5YXN5Qzk0emFFUzM5Wk5kZE1sWmdYWHIwbFhLOVRyZzRYT0VMQWxTeklPU1BEcHVWZUZqLzhHdWFGNXltUG5La2x3RkpIQlhoQkM5SnVIbmhwZVNuell0S1pXaEl1Y0VTQU15M0lmUS9LZVhDMVV6NkVlYkZZdmZWMEZJQXpYS3A5RDhwNURkVSt6WlFDUHJoNVVhSjNCMXpvVXVYQTlRN0syVmxYNFo2Y2VWR2lkd1ZjNEZMVk9pZ0hqRHZsa3pNdlN2U3VnSU5zV3ZhTWpGMFB5bG13UUFSTHVDZG5YcFRvM1FBWHVsUWxCK1Z5SXJlazN1cjFLTXlMRXIwTDRBb3VsZTJZUFgvWnpybk5tQmNsT2pqZ2lpNlZkMURPUm02cVV6NXA4NkpFQndWY3lhWEtPU2lua2F2T1ZCUG1SWWtPQm5oaGwwb2pGL0RIb0diTWl4SWRCSENtUzdYdlFUbU4zRjJhS1FWODFPWkZpUllIWEZCemM4OVNwVndxSUVhdVYyK2JNUzlLdENqZ0RBdHkxNE55SGx6QWI2YWFNeTlLdEJqZ1Fnc3k5NkJjNnFpTjdaU2JOaTlLdEFqZ0FndHk3cURjbkVzRnBKdXBaczJMRWkwQ09NaW01WlJMcFduNUo2WXRTSGJNMXNBZ0NJNHdUWnNYSmFvT3VOQ0M5RXdNMnpFcjNGUmFwdWx3RnVaRmlhb0NybUJCL2tDNjdtcERwYnRCbm5seGgyRjluWUo3Y3VaRmlhb0JMaGlINWl4SVBRVnA5M1FCZnd5eXpaUUg5aGNhTVM5S1ZBVndKUXR5eWwvV2hrcmgydmsyQlZjajkrVE5peEx0RGZnQUZxUzZVem9HZWVaRkNtNnFtVHBKODZKRWV3SE90Q0JMRDhyWmhnb1l3cldkY3FxWllrcitqY2JNaXhMdEREakRwY285S09kMXk1cVdDZGZ1NGRxZElLMjFGdTVEV0UyWUZ5WGFDWENoU3pYWFVFMmxaVWFYWnp1V05sUE5tQmNsS2daYzRGS1ZISlJMd1UxMXlydnNCRFZqWHBTb0NMQ0JPMmRrekIyVXN6dERIbHoxbFBmWkNXckt2Q2hSTnVBRTNJOUl1MVE1QitYVXhPZ3dISU1JdDJRbjZCYXgzdHBtaXAxeXMvWFdVeGJnek1oVkl5TmxRZEpmOWh3cTFrUENmUXhyMTUyZ1p3enJiVFBtUllrbUFUdjFWc2NoYTBHbVpsMEM5allQMkMwVExqdGxiNXZQZHNxMjNqYTNFMVJEU2NBSnVIU292TWlkTXpJMExWOWpHTGs2NDNyTmxBWHJOVlBON1FUVmtBczRNUVpOcGVXY1U1QWF1WVRMdEttZGNtNjliWDRucUlhbVVuVEt4UERPVXFVT3lsbTQybENwZ2FGd1M3YjVtdDRKcXFFUjRFVDBsc3k2VE1rSzE4NjVUTXUyVTdiMVZsUHoyZTBFMVZBcWdsUFI2NDFEdXYzSGxkclBCWWI3dU53dzhKb3BCWnd5TDVyZUNhcWhBZUNacnBtMTl4UEdQck11UmkzaFhtTG9LK3RXbjdlSGE2TTNaVjQwdnhOVVExNEVkL0hoeU5Ed1VqVHJNSSsxV25lS2NCbGxkc1BBc3gzbm1xbXoyQW1xb2JrVWJWMHJiYkkrSVVZei83clBPNEh4SnN2YkRkS28xU2oybXFtejJnbXFvWnd1Mmh1VEZQYWx2TVlPR1lqcDJJNUNVMm5aMXR2VnZOaFRPVlpscWk3cmN5Qis0Qng5T214Z3NHT2VHNFdZcWxmem9xSnlBUGR5NVNKSTNkTGp5UE1oM0VQSU5uclpOQkV1UWEvbXhRSktBZTR4Qmtxb0JLb0doYzY0YktRK21PZFBpTkZMd0wvbCtXcGVMQ0FQY0k5b1JpaGNqZFFuYktEcTN3ajE0UjYrcDkzek15SmcxbDlkM3ViOGFsNVUwQUJ3My9kOW1JVTl1Qit3K2VEWlRPa2VManZrUjhTL0g5S05CTjBoSW1SR3JEZmZydVpGSlUzVllGdHZYeEM3YWUyVStkNFR4b2ZtR05WOG41QUptbnUrT3Q4UzdtcGVWTkJVRFFZMkh6RHI2RlRIL0FUL1R6c1p3YXpYSEhrZTViR1hrbGZ6b3BKR2dDVk5BeEhrNEJaRWNQWm9qVWF2cG0vZXgzdWY1YmxOeVdzelZWRnVCQWZJZkxxdGZ4alhaUVdzWm9jQ1pwclc3cHRMall1MTNpNmd1VGxZUDJCTm16b0h2MkRZZUtrSkFveEhMRjd0Ykx2VzJ3WFV6WDJPaWYxaGExOWVtTFVOZi9pL0ZHL3d3YTRwdWJKbUFRTWp5THhxcEY2WXE5N2JZd2o1VFI3cmUydlVMcUFzd0ZRQ3RGMzZQakNzMzNadDMxL2hMcU1pd0pTQUJzWlE5VDFWNzExWHNNdHFKOENVQWIxOTJYa05HRFpzSzlnRGFTL0FWZ25nVzYxUUQ2K3FnRmNkbnk2d3FtbjlEL1FHdkxnc0FUTDVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDE1Ljc3VjE2YTMuNzg2LDMuNzg2LDAsMCwwLTYuMTg3LTIuOTI4TDE1LjUsNzRsLTEuNjMxLDEuNGE0LDQsMCwwLDEtNC4xNDEuNjU1TDIuNDYyLDczLjAyNkE0LDQsMCwwLDEsMCw2OS4zMzNWNjlhMi4zMSwyLjMxLDAsMCwwLDQuMDI0LDEuNTQ5TDY2LDJBNS45NzksNS45NzksMCwwLDEsNzIuODIzLjg0MUw5Mi42LDEwLjM2NEE2LDYsMCwwLDEsOTYsMTUuNzdaIiBmaWxsPSIjNmMzM2FmIi8+DQogICAgICA8aW1hZ2Ugd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMDEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUJsQ0FZQUFBQ0dMQ2VYQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUw2MGxFUVZSNFh1MmQ2M2FiU0JDRWF5UWx6bVYzMy84OWQ1UFljV3oyQjVRb1N0MHpZRXV5THZRNWZXYTREUW9mMWRNMFBxRjBYWWZWYnRjMnJSMVd1MjdidFhaWVlxV1VVdHZlcmVIaTdGYmVjODBUb0Jua3lZbFcyT2V4TnluWXdKYWtkZXUwNVJBcjZOUGFJc0FDVmx0MzNRNU13YXIzTzY2Z1QycXpRblFDZG9NUjZzWmEzVmVodmc3ZVNic0h2a0krdmxVVkhJUmloN2tCc0pYK0JsUEl3QlR1eStDdjVoMkFycFN5UWo2eXBZQk50UXBYb2U2R1BsdXUxM0JOaUM4QS9rakxmcEY5MXBCOVpBc0JCM0JWbllUNWFlaC9rajYzRVRMVlM2RFA1Z29ha05CZFNpa3I1UGRiTFVSSHFsV2duOFVmWk4wT1U4Q3Y2Q0grSHZ4cGNDNXYwTU11bUlKZVEvWVI3QUN3cVZmaEt0aUh3YjhBK0RxMEQ4TzJUeGhWM0tHSDlvd2U2dVBndjRaVzFhNlFDUm9yNVBkWnBtQ2ZkeGwrUDZPSCtRWEFOL092R0NGVHhRelB6eGpCL2h6Mis0RnBTS2VTYWV1OGZBU2JBRTdtWGlaUFZDL2gvaVgrSFZQSW56QlY4RytNY0gvSVBxcDJUYzZlc2M3TFI3Rkl3UkZrenIwTXoxL1JRLzBMd0Q4QS9oNzYzOURmQUorSDQ0QWVGTVB6RDB5VlRzQ2FnVWNoRzFnaHY4bGFJVnJuWUZleFF2NGJQZWp2R0FGdU1RTDZqUjR3YndBcWVDZnV6OU9FckxZbVh3dXRWYW9rNUlJcFpGVXpRelpoZjhjSXNLQlhIcE1zd3RjUTdTcld4RXZEdGhaSTF1UnJwdTBCSjRXTi9XWk1MM2owNktUQXZ3N0xXNHp6OEJQRzBNendySUFqRlN0Z0Q5ZHI4alhEV2dwVzZ4SlgwMGVxQjR6WjlDdEc1U3Jjblhta1pJZE1XNU92R1JZQmppQnF1VkZMalY2VmVzRUlYUit2Z0JHc1ExVzREbG9CYjlEUDVhN21kVjZ1MkI1dzEzV2R2VndBRHVFK1k2eEdhZEdDWVprVktpMC9VdFZBRzJ5a1lwK1hQV1N2UlpHS1pTSGExVXUxN3RCRC9HVCsyVnkzT2JRTkR1SHRyQjhkazgzTHdGb1VTUzBMMGN4K3FaSU54bnF5WG1nSE5HZE8vWXdwTkFlZEhWY0R2QlpGRXBzQWxqRE5DMFBJZnhCbjFacGRSOHJNQVBsTlVqdDJqcHJYb2toaXRSRE45blhvKy94TXE0R09ZTENNdVV1T3lSUmRBMDNJYW12eWhRQ3dKVnNLK0EvaVJ5TmdDa3BWNlJDSzlMZkJjVFhZbVhNOFBjZGFGQmtzVlBBQWViOG9iUmNzQTdHS004RHFEaWdDWEp2ZmErZFlpeUxJUTdSRDVsdzgyV1ZvaTdRWllMOEJIUEpPMW1kcXprSzFoMndkbTNhM3lWY0tHRWlUcnJsaDJpKzRBdVQrYkFtcHBtUlZzZmNkOEFiOTQxeWs1cnVDWEFVTWpDRnRVRE1mb1lCK1RnYnE2blJWTzJodEZiS3FtNkJyY0JVeTI0SnA1WXUvOTY2U3J5WmdtcW1aaWRlK2lvUVlxc1BONE90K08rblhsTndDcmVlbDNWM3lOUnN3Y0FDNXd3ZzRnNmNBRmFJRG9QTVZveXA1RHVnTWJuUmozVlh5dFFnd01JSDhpdjRDcW9wcEdlZ01zSUp3eU5FeEdkeldzektkZHZQSjEyTEFRSnA4UlhPeUxpdk1HdUFJc283aDhKWUEzdURPM2tpOUNUQVFQa1lCNHhzbnRSYmdDSGpCOUZrM0c2T2w0QWgyTWIvcE4xSnZCZ3lra0dtdXZBaEtCamM2MXRmVlFFZkFhK2NDYnZTTjFMc0FBMDNJUUE2NmRjSFpNbHhIa04wejBITUEzK1FicVhjREJsTElCZU5ibmhaY1ZhUURMaGlWeUg0RXVnYVhnR3V3Yi9LTjFGRUFBeUhrMmlOVXBxWk5jZ3lOa05uNnNSRnNMNUJrcWlaa3RhdFB2bzRHR0dpR2F3Y1JnZWZCM3VyeEJGTzdhVnl4TGZjSVVuQWpSWkdqQWdZbWtCVndCak9DMU5wSDk2T1NnU2trVjdKWHZsVFZXVFFoWk9DS2s2K2pBeGJ6a3VaY2FBb3BnZzZNaVpkQzluRWlCV2VoMmtPMm53KzQwdVRySklBSEZSY2NsalRWaXJRWjZHaVpyb25YQm5ueUZhblpGUjBCM3VBR2lpSW5BUXpNcm5acFB3S2RlWFFEUkVwMndEVzQyYnlzZm5WRmtaTUJCbVpYdTk0S1ZtK1M3ZEJtKzZpQ28zQmR5NjU5VE9DS2lpSW5CUXcwTTJ1MXVZQ2pDKzdyZFR3Zk13TzlCUERWRkVWT0RoaG9RczRVcDBDeUM2NjJrMjBPSlJvdmd6dEh6VmRURkRrTFlLQUpHY2lCMU5Ua0R2UlFmRjAwOXRiNkhxNXJvQWxaN1NLVHI3TUJCbzVXMG94QXE3bUNIYmlQNHdwdU9jZldjMXhzVWVTc2dJR2psRFFqRmZ2eHNHUG1qTzBoZW1lZWhXdUZERnhZOG5WMndFQXpYRHVBQ0V3R2JUL28wTy9zT0NBK0psSnlGcW85WkVmbnZwams2ME1BQTR0TG1xcmVKZEJoMnhpdUVSeWZxVGw3blBLb2NwRkZrUThETExha3BMbXhmaFF1YXdvSFlpVkhnR3R3czNsWi9TS0tJaDhLZUZCeFFidWtHWUd1dVVPRnJkYytnckZyNFhyT1k1U08vYUZGa1E4RkRNd3VhVG9JRFkydEM2em1ZRGZvcjBGMjgyU2dsd0QrMEtMSWh3TUdacGMwZ2ZtQS9VSTcxT3pHaVFDemplRE9VZk9IRmtVdUFqQXdPN091S1N4VGtoci92ZHpPUGkrMDN4QU9Xcy9wYzNUMld3aFo3V3pKMThVQUJwcVFnUngwQmpkU2NBUzVCTXZST1Z6QkxlZVkrcHZPV2hTNUtNREEwYXBkZmxIZE9POUM5aWxvS3psU3NhcFpWVjI3NmM1V0ZMazR3TUJScWwxY3oyUDBXRjIzbFQ3WDF5SUF0N3RTczFEdElWdkhvWjAwK2JwSXdFQXpYRHZjREFhQ1phN1Rkb040SFpjZGNLYm03SEhLSTh2WmlpSVhDeGhZWE8yS1FMVDJjYWphWnVzaXdEVzQyYnlzZnJLaXlFVURGbHRTN1hLNDJUeEljTEJqdU53TjYzUmVacXRqMThMMW5NY28vUzFITDRwY1BPQkJ4YnpndFdvWDJ3eDBheHVOVUl1MEROZE16blFNRDlVT2VnbmdveGRGTGg0d01MdmFwZjBJWnVRUllHQUtXZGZWeHQxS0c4R2RvK2IwNnpPMHBiQ3ZBakNRSmwzSC9BTStQZDRWck50cDJibTIxdmR3M1FLdGtQY2hlekRlNlAzQ0ROaFhBeGhvWnRacWN3RXJhRWdMMlVaalA3bzVvbk81Z3VlNGo4MThvek1IQkhZTjlGVUJCcHFRV3hlK05nOUNXdG9tV0srZ2dmcTg3Q3BXTmM5Snd2amZNbFBKRGhsb3pOTlhCeGhvUWdicUZ6eUNxKzdXZ2h5Tm9lZDJsWHFvemg2cm5qRDlqOVlKdXNNVU5sQ0JmSldBZ1JSeXdiS1NaZ1NhcHNzWjVJS3BtaUxBbVpvakZUdG9mdjVQdi9INE9vd2R6czhPK1dvQkF5SGtwU1hOU0lHdy9nN1Q5V3oxK1ZqSDBlTWp3RkhDNWJEWjUrZi85TE1KK3RWV3dDREQ3S29CQTgxdzdSYzZnaDdkREJIMExRNnphMWpmbGU3bjhqQWNoZTNJbjNENGIzakJDSlFoRzY3aXF3Y01UQ0RQS1dtcWV1ZEExL0VnMi9VUktvSk01ZXU0V2NpdVFkL2FNZnFiT0EvcmI3MmRFQjBZRXhDZ1hkTGNXTjh2WWczMkhNaTE4L3E1dkIrMVBJY21XYS9EOXR0NVRNck1xbDBkVHZzSGZFWGFDREw3YXRFNGtQMDZjMTNIaE9yRlhNZUx6bms3Z0lFRHlFQmMwaXkyN0NySzRFYkhjVGtEcS9zQmRXRDZMYXJzaStucS9odjNwdlB3VFFFR2tDVmR4L29EUG1CNk1SMnlHdmRUK0J5WGM2eC9sdWdCMHkvRTZjZkVkQzZlQUszWnpRRUdVc2cwVmFUQzFBUW5VM0prQ3BuV0JhMkhYMXAwby9tTkZZMmRMVTlLbHpjSkdHaENCbkxRR1Z4M1dtZjdjVjBVamx1aFY2dFc3bHF1MUpibkMrMW1BUU1wNUlKbDFTNVhreHVmajZsa29BNVhQdzM0SzNGK05wQ1ZMQzkwUkxCRHlEY05HQWdoTDYxMktWaFhib2ZwL0Zod0NQY1BZcmlQR0Q5NS94K0FmOFgvRzliL3dBaWMzNFZVcFN2Y0VQTE5Bd2FhNGRyaFppR1o3aGVVU1pBRFptaWwraUxsRXFJRGR0QS9NU282ZXdFQkFBZXZEdThDTURDQlBLZmFGZmwrS0l3S2ZjSDRuZVN0N0tQS1paalZyN1greEZTOWtSTSs5NldLUFZTbjZnWHVDTENZSmlldGFwZkQxZU01ci83RytCVnpLcGpibm5Hb1dvZXJyVVBsTVU4WTRSS3d6c01BRHRVTDNCbmdCZFV1dHBGNkNaZGg5d3ZHTU0xOXVKMWdOQ1FUcm9MOUthMG1XanhlUTdQRDdkRC8wMVlGQXdlUWdUR2NBbE9ndGJCTTVUNmkvekEyUDVsYlpEd0NWdVdxUW10cTlRemFINSthb1psMmQ0QUJaRW1YVjd0cW9abnd2cUZYY0FTWVNWVUdXTUZ5ZnFaYVcyRDN6NytaY21sM0NSaElJV2ZHaTZyd0h0RURabG1SU1ZZTnNNN0JFVmgvM3RVQ3g0RnFXM0NCT3dZTXpJYXNGMVhWK3d0OWVIN0ErRTNrU01HYVBYc2hZeWxZWUFGYzRNNEJBNHNnUjNNcnd6T2ZnNEV4akRQVU1sRlNxQ2NIUzd0N3dNQXN5Tkg4K3d2VHR6MGNvTVBoTTNEa1d1RTZPbGphQ25pd0NtVFBvUGw0OUlocEZjc1Z6SDJwZW5WbTRpY0RTMXNCaXlXUUhiQVhON1FPemYwVnNpdFZNK0tUZ2FXdGdHUGp4WTBnLzBFUDlUZW1jQjB3L2NYYXM0Q2xsU09QZHhOV1JobDd5YkwyS3BIV1lYcER2RXBmMjVPQ3BhMkFLMVlCSFRsTndXVyszKzlVWUdrcjRJWUpaQ0F1WmVwMk5RZXQ2MDRPbHJZQ25ta0I2TGwyZHFocUsrQTNtTUd1MmtkQVZWc0IzN2pwSDRxdGRvUDJQNHFBMHNRajA0YUVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDgwdi4yM2E2LDYsMCwwLDEtMy40LDUuNDA2bC0xOS43OCw5LjUyM0E1Ljk3OSw1Ljk3OSwwLDAsMSw2Niw5NEw0LjAyNCwyNS40NTFBMi4zMSwyLjMxLDAsMCwwLDAsMjd2LS4zMzNhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMiw4OS44MTMsODIuOTI4QTMuNzg2LDMuNzg2LDAsMCwwLDk2LDgwWiIgZmlsbD0iIzg1NGNjNyIvPg0KICAgICAgPGltYWdlIHdpZHRoPSI1NCIgaGVpZ2h0PSIxMjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0IC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRFlBQUFCNENBWUFBQUM1RndIQkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFHTTBsRVFWUjRYdTJjVzNQaktoQ0VXODUxdmYvL2Y1N2R6VDJ4T1EraVRUTWFoSlNLSEpPaXE2YWt5TEt0enowTTVJRVpRZ2o0aWRyVmJtaFYxN1VicklaaEdHcjNBRUQ0NWxSWUJPYkFWT0gwTGQ4Qk9kUytVNkJLUjAraGNEd2I1S3hqQnFvVVZnRTVrTWJKeWEwQmkyQU8xRTZPTzhBRjVNTWU0N2s5bm1DMkJuVEJDbENNSzNOVU9ENzhzUktiQTg2bG9vVzZrcmlPY1NXdlV3UTdGT0lzZ0JNd1V3RVZUb0Z1SkFqTGUvblFCd0FmTWQ3ajhTREhUUUdYT0thdVhRTzRkZUlhS1MzcEdJRVliMGlBak0wQVMyRFdOVTFGd3QzSHVFTU9wNmxJb05jWWIwaUFDdm5sZ0xVSjJycEdzQnVNUUw5aUtCeGRvMk9FZWpISFRRRnJxV2ovSHBDN1JyZzlSdmR1a1FySkVRbnNKY1p6RFA2OUZqQU13ekFzZ1pzRDg5NnNjRmRJS2JsSGdydkJDTWR4OW9ZYzZpbkdVa0JDbmliNkplN1ZVbEhmbUUyd1NLbEp1TjhZNGU2UVB2ZUlOTVlJOVlnRVZ3SzBoY1k2Q0ZUY0s0RUZwRlJrTVFnb3c5MGdkKzQyWHVkWVl6b3EyQ055U0FWOHdiVFFjS29BRnNCTndFSUlJYzVsd2NUUkJEOXNRQ29vZEk0cHlYbE5YYk5nRnZBSjR3K2pMdTR3d2dFaklDQndjTFFrRlMyVVhVRUFhZHhwV3Q0aHVYWkFjdTAzcG1BUGNuNHZyOThnWCtFTVNJQkEvUDVoR0NianJWWTgxRGtQU3AzakJNNnBZSS9jTlp1U2U0eVFqL0djZ0wvaThSWnBaVU1vWUpwSkFRQnNTcnBnaFhSYzRwcXVUdTZRWEFQU2hQMktORVVRY0k4RVpTZDlnZ0UrRkdFV093YlV4NWtXRlNDSG8zTjBMV0IwalNzV1R1NTdPVmN3ZFFzb1B3TlRQVk1SYkVVUnNYQzZycnhCcXBCQXFtenE2TDBFblNJVTA0OVo4bUdDV1RNQWVZV3NPVWFWVXNDbUEyV1hZTHJVT3NCZlNETVVpaitrTHFSMUd2RCtId1N3SE14cURrNi95UDV6Q296ZmVVQUMxbitCdUpEVzFOVmxHZWM2V3lrbldnTm1BYXhMcWhJY0gvZ0tJeHdkNVJKTng1TXV4NTZRRnR2ZUZEQ0JXd09tVWpndkZWVVdFaGp2MzVuUThjU3A0UmxwRGFyanp3UDdrbFJjSXYwbEIwd2ZJQlN1YWVVa1VBMXFvaTNCckVwd0ZNY2V4OXN0cHVPdjVOUUpqcFh4SEdEdUx5clhkMGpqVHF1b0YxNzY2dWVmMHBFNXY3VXNYQ2xGN1lOclVTbkJVTm0xYzRGNXNyLzBtb0E1bitnN3dlWlVBeXNDVVpjR1poMzV0QzRKektZbWo0c2Nzcm9rc0M5VkIydE5IYXcxZGJEVzFNRmFVd2RyVFIyc05YV3cxdFRCV2xNSGEwMGRyRFYxc05iVXdWcFRCMnROSGF3MWRiRFcxTUZhVXdkclRSMnNOWFd3MXRUQldsTUhhMDBkckRWMXNOYlV3VnBUQjJ0Tmx3U211eWJXN0oxeGRVbGd3UExkVGxWZEdoZ1ZGc1NzdmhQTXB0NmFnRG1mNkZ4ZzlnRzhNUlF3M2Z0WjJwN3NBV1hYemdGVytsVXREQ0hzQmxPTnVVMnYvRXdBNTkwLzVxVlJ3QlRJZG13cHRjVHcwaE5yZDlWK1JpV1FFcFIyYXRGbUN0cTlSWHZ2ektYbHA4SFc3RDJ4WTJnT1N2dDlhTmllSHlYblRsb0Q1dTNmS3NuQ0hNMXJoR0thYVErQ2Z5YllPZUk1M3JmSXRUVmdxcms5WFI2VVBvUkMwU251Y1g3RUNQTW54dC80OXdQU0h1ZzNUTUVtV2dwVzI2Um0zU01VVTQxZnpyOUxVQThZUWY0QytDL0dYNlMyR0FSajQ1TDFxZWkwU1dQc25GQTR1a1FBZmthUWF5d0k3S09qZlQwSTlrZmlIL0t4NXFaaXRlMkZhQzBVblNMQUxwNERLZjNVSlJZSFFoR01vYW40R045akhkUHhlNUlMVm5CTFlleHVWeUNIZXNQNDJjZjRYbDdYSW1HaEZFN0RGZzl2akswcUhoYk9BNkpqUU83VWE3em10WmJSYmtkZWF4bnRxYU45ckVwUUFMQ3F0UXl3enEwRFV0TUR4SE82dGJZWjBGelBLbDAvQm94TWRjZFdGQTBkVjNUcUpiNzJqdVNXVFVFTDVzSE10VzhxclJNemxSd2IwdWtKU2lFcGxuU0ZPaUI5cm5WTHdlYmNxVFhjY2l1aGFra3E2cmtIeGZRakZNKzFrSEJzZlVtTE5GU2dnR1hGUThVUDVSY3FGTjNodURzaUwrOEt0d1RJYzZnS1JNMkIyVGNybEpaMGhib0dpcFB4aXptdUFRSldRQUgxVk5SZmlxbW5EOHlxOTQ0RXFmZnEwc21PbjAyQXFCSll3SFExd2ZTalcwQSs4YkxBQkxuK0xtRUx3aVpBVkMwVjFTMCtMT1FheHhrYi9kQkJkWmVBSDNKdE15QnFBaWFOdG9CcEd0cHJIOGduYXI2dUR0dllGSWlxT1FhTUQ2RFg5TUh0L0dZZExzVm1RRlN4eWJpekF0bkowUUtwdzBCNmVIdmNISWlhN1o0K3M3enlWaUdVZmZpekFsRS90aTE4RlF6STRFNlgzQnR6blIxR3RRaE01VUM2K2c0WTFXcXdWcVR6ejQvUy8xSEw3YllXaGVSYUFBQUFBRWxGVGtTdVFtQ0MiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNNjYsOTRjLjEzOC4xMzguMjkyLjI1NC40NDEuMzc3QTMuNzUxLDMuNzUxLDAsMCwxLDY2LDk0Wm0uNDQxLTkyLjM3N0EzLjc1MSwzLjc1MSwwLDAsMCw2NiwyQzY2LjEzOSwxLjg2MSw2Ni4yOTIsMS43NDYsNjYuNDQxLDEuNjIzWk05Mi42LDEwLjM0OSw3Mi44MjMuODM5YTUuOTY4LDUuOTY4LDAsMCwwLTYuMzgyLjc4NEEzLjUxNywzLjUxNywwLDAsMSw3Miw0LjQ4NXY4Ny4wM2EzLjUxNywzLjUxNywwLDAsMS01LjU1OSwyLjg2Miw1Ljk2OCw1Ljk2OCwwLDAsMCw2LjM4Mi43ODRMOTIuNiw4NS42NTFBNiw2LDAsMCwwLDk2LDgwLjI0NFYxNS43NTdBNiw2LDAsMCwwLDkyLjYsMTAuMzQ5WiIgZmlsbD0iI2IxNzlmMSIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+"},"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","supportsDownloadThenUpdate":true,"localizedResources":[{"language":"en-us","title":"Visual Studio Community 2019","description":"Powerful IDE, free for students, open-source contributors, and individuals","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"zh-cn","title":"Visual Studio Community 2019","description":"功能强大的 IDE,供学生、开放源代码参与者和个人免费使用","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"zh-tw","title":"Visual Studio Community 2019","description":"功能強大的 IDE、免費供學生、開放原始碼參與者及個人使用","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"cs-cz","title":"Visual Studio Community 2019","description":"Výkonné integrované vývojové prostředí (IDE), zdarma pro studenty, open source přispěvatele a jednotlivce","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"de-de","title":"Visual Studio Community 2019","description":"Leistungsstarke IDE, kostenlos für Studenten, Open-Source-Mitwirkende und Einzelpersonen","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"es-es","title":"Visual Studio Community 2019","description":"IDE con un gran potencial, gratis para estudiantes, colaboradores de código abierto y personas","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"fr-fr","title":"Visual Studio Community 2019","description":"IDE puissant, gratuit pour les étudiants, les contributeurs open source et les particuliers","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"it-it","title":"Visual Studio Community 2019","description":"Potente IDE gratuito per studenti, collaboratori open-source e singoli utenti","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"ja-jp","title":"Visual Studio Community 2019","description":"学生、オープンソースの共同作成者、個人用の無料で強力な IDE","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"ko-kr","title":"Visual Studio Community 2019","description":"강력한 IDE, 학생, 오픈 소스 제공자 및 개인을 위해 무료로 제공","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"pl-pl","title":"Visual Studio Community 2019","description":"Zaawansowane środowisko IDE — bezpłatne dla uczniów i studentów, współautorów oprogramowania open source oraz indywidualnych osób","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"pt-br","title":"Visual Studio Community 2019","description":"IDE avançado, gratuito para estudantes, colaboradores de software livre e indivíduos","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"ru-ru","title":"Visual Studio Community 2019","description":"Мощная интегрированная среда разработки, бесплатная для студентов, участников проектов с открытым кодом и отдельных пользователей.","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"},{"language":"tr-tr","title":"Visual Studio Community 2019","description":"Güçlü IDE, öğrenciler için ücretsiz, açık kaynak katkıda bulunanları ve bireyler","license":"https://go.microsoft.com/fwlink/?LinkId=2086016"}],"requirements":{"supportedOS":"6.1.1","conditions":{"expression":"not Win10ThresholdBuildNumber","conditions":[{"registryKey":"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion","id":"Win10ThresholdBuildNumber","registryValue":"CurrentBuildNumber","registryData":"[10240.0,14393.0)"}]}}},{"id":"Microsoft.VisualStudio.Product.Enterprise","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgOTYgOTYiPg0KICA8ZGVmcz4NCiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0OCIgeTE9Ijk2IiB4Mj0iNDgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz4NCiAgICA8L2xpbmVhckdyYWRpZW50Pg0KICAgIDxjbGlwUGF0aCBpZD0iYiI+DQogICAgICA8cGF0aCBkPSJNNjguODkxLDk1LjZhNS45NzYsNS45NzYsMCwwLDAsMy45MzMtLjQzOUw5Mi42LDg1LjY1MUE2LDYsMCwwLDAsOTYsODAuMjQ0VjE1Ljc1N2E2LDYsMCwwLDAtMy40LTUuNDA4TDcyLjgyNC44MzlBNS45OCw1Ljk4LDAsMCwwLDY2LDJMMzQuMTE4LDM3LjI2NCwxNS41LDIybC0xLjYzMS0xLjRhNCw0LDAsMCwwLTMuNjEtLjgzNCwzLjk0NywzLjk0NywwLDAsMC0uNTMxLjE3OUwyLjQ2MiwyMi45NzRBNCw0LDAsMCwwLC4wMTEsMjYuMzY2Yy0uMDA3LjEtLjAxMS4yLS4wMTEuM1Y2OS4zMzNjMCwuMSwwLC4yLjAxMS4zYTQsNCwwLDAsMCwyLjQ1MSwzLjM5Mmw3LjI2NiwzLjAyN2EzLjk0NywzLjk0NywwLDAsMCwuNTMxLjE3OSw0LDQsMCwwLDAsMy42MS0uODM0TDE1LjUsNzQsMzQuMTE3LDU4LjczNiw2Niw5NEE1Ljk2NCw1Ljk2NCwwLDAsMCw2OC44OTEsOTUuNlpNNzIsMjcuNjc3LDQ3LjIxMiw0OCw3Miw2OC4zMjNabS02MCw2LjZMMjQuNDExLDQ4LDEyLDYxLjcyN1oiIGZpbGw9Im5vbmUiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPg0KICAgIDwvY2xpcFBhdGg+DQogIDwvZGVmcz4NCiAgPHRpdGxlPkJyYW5kVmlzdWFsU3R1ZGlvV2luMjAxOTwvdGl0bGU+DQogIDxnIHN0eWxlPSJpc29sYXRpb246aXNvbGF0ZSI+DQogICAgPHJlY3Qgd2lkdGg9Ijk2IiBoZWlnaHQ9Ijk2IiBvcGFjaXR5PSIwIiBmaWxsPSJ1cmwoI2EpIi8+DQogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2IpIj4NCiAgICAgIDxpbWFnZSB3aWR0aD0iNDAiIGhlaWdodD0iODIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUJTQ0FZQUFBQW1SNWJLQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUVlMGxFUVZSb1ErMmFXM2ZiSUJDRUIxK2FTOU1tLy85M05va2RKMVlmWU1Sb3RTQnM2cllQbW5QMllFblkraklzcUJVYmhtSEEvNnpOVW9kL3JkMVNoMHNVUWdpbGE4T1ZROVVGV0FCeUlXM1hWdURRMkc4aUF4WUtyV29vdEl1Z0Z3RUttTFlhOXBvQ2FlaTVLbVRURUJmQU5zaGcrbGxoZ1FoeGR0cnhlZ2dobENDcmdBdGdteFJiK2F5Z1FJYlIrRXJYZWN4K3JvcUFCazZkSWxRcEZGQ2h2Z0I4cG10ZnlEb0RRQWpCSFdvWDBJR3pZTHNVZS9tOFEzYVQrVWU0VXdwZUEzSU9qcm5xRFhWdGlCVk93ZllwdnBrZ0pCZi9BUm51QThEUlhOTlE2SWxtZ01rOUM4ZWJFK1lld0YxcTd6R0ZKSVRDSFRDRnMzazV1bWcxQVhUV053VzhTL0dRNGxFK0U1S0FBMksrSFJIaHR1azNPZVNmeVBtbzk1ekpHMkxQdlcrSWNJOHBuZ0I4VHkxQjc1QW55Um5aT2Q1REhkV1pQNEcwZVZqS1FaMFVCTHhIaFBtUjRtZHFuekFGQktJN0I4UmM1ZkV4SFN2Y29rYkF3c3pkSWs4SUJYd0c4SUlNK1pqNmNIZy9rT0ZPeUxBNnl5SHRxS1ZaN0UyUVBYTHVjVmdKK0lJSStJQU1TTGNDc3BOMkNhSUcwODVVR21JdkIrbmdFN0tMejhnT3FtTUVmVWVHczI0dHdnSHRrNFF1S2lSQmZ5STZ1RU84MlJGeGtuRDJlb3V6UmxVdFEweEF1c2lsNVhzS3p1SXQ4aVBzaUF3SHpLSE96cm5sZFZCVWc5UUZtbkdYK3ZLWjZ6bW5DN01MVlh3V093dDB5VWtGMWNmZEh0a3RYVUk4NXp6SXBrbmlRVzVNTU9FSnVwTUl5UCtVVWltWUIxWE5RN3RZenRZbHpHRjFvV1ZZMXlrdno1cWNvMG81Q0V4djVnMjd3dkVQOWR5N0dFcGxIZlJrNGJ4VThGUURhWVp0QWZUa2dkVkFiK3BnaTBwdzNib0c4R1l3bnE0Qi9LdGFBWHUxQXZacUJlelZDdGlyRmJCWEsyQ3ZWc0JlcllDOVdnRjd0UUwyYWdYczFRcllxMnNBTDNxMzBxdHJBRDNkRFBwYVFPOHRWUW15OXZwdVVTMkF0ZGRudGRkcE5aQm0yQnFnM3R3QzJwZmgrdjVaNWJtM0NLV3lyNEE5Tnl6VUY2YUFoTk8rVkFtd0dWWUJCK1F2ZUU2ZEViZTN1Tjk3UXQ3MzVZdDFoYVZDdXJhQkQxZUYzQUhBTUF5RDdKVjR3Nm1iME56elpmdUJES0R1QW5PZ0RjcXdiaTZYM3ZKN2NGcDdjSkRZSTk2QVcyRjBXZDJzd1kxcUthb29PYWUxQis4cFhoRjNtYmFwdjI0bUtpVGdPK25sNDh4Rno4RVNJSjE3QS9BTGNYK08zLy9FZkFQN0JOOUpMdytMcWcyeEF0SzlOMFF3RmxDRTFPOEQ4dzN0UXpwUE43M0pvNjJybGlHbWUrL0lOVE5hUEhHQ1h4THdscjVqaDl3dVE5ck9OQUxLVFBZQXRZS0RoUk1Ec3J0MDFoWlZ2S1gyQ0gvSVp6blhXdlZ4UnZ5cmRJZzVBNEg0dzRRL29GNlc4b284M0FySkNWUlZhWklBMlVHYjBIU1g0TzlZTHV5aGs1cVQraFFhSGFzdU04NkNyWkQybk03c2x0SW81aU9mUURNNFR6TUhFeVFQZFJocXVkbGFYSGJFM01VcVpHMi9XSWVheDNiNW9ZdUUwMW9GKzhkb2VJQXVwQXRvWmpRdy9TSG1EaUczSmpSZnRhOCt6MTMzdktLS2FwSHREVXRFOVhoQVpITkJtcXFBRjBEdFp3VUVNcVRYamc1MkFWSUZVQXVsTFg5OE1LSG5xbVhLRndGU1RwMk4xNnFHUXZ0bkM3MnRET2g0MmprSG1GbTZCRVoxQVZvVmdBRzBBMW45VWNCYnFPWC94ZjlVdndFRXhuUTEwSmJTZmdBQUFBQkpSVTVFcmtKZ2dnPT0iIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNMTUuNSw3NGwtMS42MzEsMS40YTQsNCwwLDAsMS00LjE0MS42NTVMMi40NjIsNzMuMDI2QTQsNCwwLDAsMSwwLDY5LjMzM1YyNi42NjdhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMkEyLjIxMywyLjIxMywwLDAsMCwxMiwyMy44VjcyLjJBMi4yMTQsMi4yMTQsMCwwLDAsMTUuNSw3NFoiIGZpbGw9IiM1MjIxOGEiLz4NCiAgICAgIDxpbWFnZSB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEwMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyIC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCbENBWUFBQUNHTENlWEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFMVDBsRVFWUjRYdTJiNjFiYk9oU0V4N1JBNmUyYzl2MGZzcWZjQzhYblJ6VFJlSHZMbGhJNUpJcG5MUzNuWXFETng3Nk5STmYzUFZhMXE0dTVHMWFkdGo3TzNiQnFySzdydXJsN3FQNmRVK1FLT0ZNTzFDekkrbVh2QVhzRm5DR0JxMWY3bWxVdjF4NTRIOWdyNEFrWnNGTUxjclZndmJXRnZUVG9GWEJDRHR3THVlcXlvQlhrVzFpOWM5MTg4NFZCcjRBZEJiaTZDUE9EV1JZME1BVDdCdUN2dWVwYUhQUUsyTWlCUzVBZnpickVFTFlGL0Rlc1YxbC9aUjBFOUFwWVpPQnExRjVpODFsZHlicVV4WHVCRFN4Q2ZNRUc3SXRaQkw4NDZCVndrQU9Ya1VtSTEyRjlraXRoTThvN3hPaDlCZkJuWXRuSVhnVDBDaGl6Y0JYc1p3QTNjaVZrUmpFQk0yci9BSGdPNnlrc1B2K0RHTkdMZ1Q1N3dBbTRyTEZYMkVDOEFmQWxySy9oK2ptc2E4UjZiQUVyMkVkWkNudFIwRjNtZlUwcUF5NmpsV0MvQWZnZUhuOUZqR1RXYUdBRGcrbjVHUkhxZzF6NWVCZlEyMWs2Qi9MWlJ2QU1YRTNKQ3ZhZnNBajVDemFBV1ljN1RBTytEK3NCMDZBSjIrdTgyYVdqNjdwWnlHY0plS1piWmxvbVhJTDlOeXhDL29ZWXdWZllmSmJhWkRGRnB3QmIyTHlQYWQyQ3ZrQUVEV1E2WW1jSE9PRlFlV21aY0FuMkI0YVFHY0ZzdEFpWVl4SUJLMlFMOTg2OFJ0Qlg4QnN5L2JjemJRTlNvNjNPQ3JBRDEydW9QTGcvc1FIOEE4TVUvVGw4RFp1c0MwVEF0dEY2RFBjL1lQT0xjUitlRS9RTkl2aHJSTmpXTmV2Qzl3Wk04K1ZGOFZrQkRySnBtUVlHNFg3Qkp2MHlMUlB1VDhUby9ZWllmNi9EOTlBYWJHZmhtN0NlRUNHekM3K1Q5emxqYy9UaTkxWFBtMkt6dGUyeXU2N3JMT1N6QVN4MTE0TjdqVGdLS1Z4R0xlSCtpMDMwY2t4aTlCSUVwVzdXRlRhUnpNYU42OFk4bndLcjZwM0ZlODR6Z2hNZE05UHlIRnl0dlpxYTJWeHBlcVlZV1c4WWxnQmQxL0tZVUQyd0dxbk1ETW5SeVVaeDg0QXp4aUdGcXgyendyV2pFU09PWU5TTEJvWlErUE5lRVNFcVRBOG9RZXBtaFoyUHVmVC94Ni9mcW1uQUdSWmthaHl5SGJNMzk3SnoxdVpIMVlmWDMrUWVyYVVLUkpzeTdiNmZNTnpZNEMrR2ZpLytETmIvZ1pvRlBCRzVUSStmRUIycUhMaXN1UXAzcWdIcTVKcHFqbDR4M0pYU3FMYkxRdVVWR1A5eWJhVnBwUmxsV0pEYU1YL0gyTXpRYmxsckx1dm1GRnpJYTUzejNJdDA3WWJ0ZFZ0Zmc3eWZOWHdoam9QdEFaNXhxVmh6VTJuWnE3bTJvVXJCVFVXcVB0WkdTVk15WGF0bkRNME5hMW1PTmgvbTFCVGdESmRxcXVhbUdpb2J1YmFXUXE3MmcvY2FKdDFHZkVLMEt1L05VcDlhM2F4WCtGMzBWazEyMFRNdWxUWlVUTXVha3FjaVY3dmxWT1FDNDJoVnVCWXNiY3M3QUxjQWZvZjFuenkrRGU4VE5DR3prN1p3M2FodUJuQ1FUY3ZhVk5tYW00cGM2MUpadU5veHArQjZxZmdQb21XcGNQK1Q5UXNSOEIxOHdFVXB1d25BR1M2VldwQjJBMEVCSzF3OXJiRUxYSjFmMVk4bVhFYXNCL2NXTVUzcnBvUHVGelB0OTJZTmRQS0FNMTJxejVoMnFiUmpWcmc2dHRpMHJCK21UY25jVGRJdFE5WlpDL2VYUEU3QnpUa0lBQUNqRFllVEJselJwZEp4U0NPWFRaWFhJZXRqL2JDOWV2dUFjYjBsV0Y1dFd0WTk0UlRZMUNpMTFja0NydVJTc2VZcVhEMWo1WFhNMUZ3enhaUk11TnBJS2R5cHRHelRjV3BHN29GeDlBSW5DbmhCbDJxdVk2WnltaW1ia3IybzFjaWRndXRGcTliK2RrNTBaTHBVSGx4ZEtaZHFGN2hlTTBXNFRNbGFieFV1UjZGN0RHZGVDemNKRmtqREJVNE1jRUhONVVHNWZXZGRGVDlFVzI5Zk1UWXV0Tjdtd3MwWmd3WWc1dzdjQVNjRU9NT0N0S2NnNStCNnMrNlVpZUhWVzhMbHFVaTZVRHJmS2xqVzNKU0o4WUp4dmRXb3pZS3FPZ25BaFJZazRYcWpVRTdrMHI3dE1JeWNxWG83MVV3cFlOdE1FUzdISUoxdHQ1RmJDbFYxOUlBTExFZ0xsNUZyeDZFNWw0by95NE9iWTE3WVpvcVBiekhkS2F2SHZJM2FmZUFDSndBNHlLYmxsRXVsYVZrUHlWa0wwbk9wdE9acXZlMnhtM21ScXJjNjR5WmRxWDNCVWtjTnVOQ0M5RXdNQld6aFRuWExXbTlMelFzRlc5Sk1WWWNMSERIZ0NoYmtEd3pocGc3S2VkRnJtNm5jZXF0WHJiZjNpSTJZZGFhcTFWdFBSd200WUJ5YXN5Qzk0emFFUzM5Wk5kZE1sWmdYWHIwbFhLOVRyZzRYT0VMQWxTeklPU1BEcHVWZUZqLzhHdWFGNXltUG5La2x3RkpIQlhoQkM5SnVIbmhwZVNuell0S1pXaEl1Y0VTQU15M0lmUS9LZVhDMVV6NkVlYkZZdmZWMEZJQXpYS3A5RDhwNURkVSt6WlFDUHJoNVVhSjNCMXpvVXVYQTlRN0syVmxYNFo2Y2VWR2lkd1ZjNEZMVk9pZ0hqRHZsa3pNdlN2U3VnSU5zV3ZhTWpGMFB5bG13UUFSTHVDZG5YcFRvM1FBWHVsUWxCK1Z5SXJlazN1cjFLTXlMRXIwTDRBb3VsZTJZUFgvWnpybk5tQmNsT2pqZ2lpNlZkMURPUm02cVV6NXA4NkpFQndWY3lhWEtPU2lua2F2T1ZCUG1SWWtPQm5oaGwwb2pGL0RIb0diTWl4SWRCSENtUzdYdlFUbU4zRjJhS1FWODFPWkZpUllIWEZCemM4OVNwVndxSUVhdVYyK2JNUzlLdENqZ0RBdHkxNE55SGx6QWI2YWFNeTlLdEJqZ1Fnc3k5NkJjNnFpTjdaU2JOaTlLdEFqZ0FndHk3cURjbkVzRnBKdXBaczJMRWkwQ09NaW01WlJMcFduNUo2WXRTSGJNMXNBZ0NJNHdUWnNYSmFvT3VOQ0M5RXdNMnpFcjNGUmFwdWx3RnVaRmlhb0NybUJCL2tDNjdtcERwYnRCbm5seGgyRjluWUo3Y3VaRmlhb0JMaGlINWl4SVBRVnA5M1FCZnd5eXpaUUg5aGNhTVM5S1ZBVndKUXR5eWwvV2hrcmgydmsyQlZjajkrVE5peEx0RGZnQUZxUzZVem9HZWVaRkNtNnFtVHBKODZKRWV3SE90Q0JMRDhyWmhnb1l3cldkY3FxWllrcitqY2JNaXhMdEREakRwY285S09kMXk1cVdDZGZ1NGRxZElLMjFGdTVEV0UyWUZ5WGFDWENoU3pYWFVFMmxaVWFYWnp1V05sUE5tQmNsS2daYzRGS1ZISlJMd1UxMXlydnNCRFZqWHBTb0NMQ0JPMmRrekIyVXN6dERIbHoxbFBmWkNXckt2Q2hSTnVBRTNJOUl1MVE1QitYVXhPZ3dISU1JdDJRbjZCYXgzdHBtaXAxeXMvWFdVeGJnek1oVkl5TmxRZEpmOWh3cTFrUENmUXhyMTUyZ1p3enJiVFBtUllrbUFUdjFWc2NoYTBHbVpsMEM5allQMkMwVExqdGxiNXZQZHNxMjNqYTNFMVJEU2NBSnVIU292TWlkTXpJMExWOWpHTGs2NDNyTmxBWHJOVlBON1FUVmtBczRNUVpOcGVXY1U1QWF1WVRMdEttZGNtNjliWDRucUlhbVVuVEt4UERPVXFVT3lsbTQybENwZ2FGd1M3YjVtdDRKcXFFUjRFVDBsc3k2VE1rSzE4NjVUTXUyVTdiMVZsUHoyZTBFMVZBcWdsUFI2NDFEdXYzSGxkclBCWWI3dU53dzhKb3BCWnd5TDVyZUNhcWhBZUNacnBtMTl4UEdQck11UmkzaFhtTG9LK3RXbjdlSGE2TTNaVjQwdnhOVVExNEVkL0hoeU5Ed1VqVHJNSSsxV25lS2NCbGxkc1BBc3gzbm1xbXoyQW1xb2JrVWJWMHJiYkkrSVVZei83clBPNEh4SnN2YkRkS28xU2oybXFtejJnbXFvWnd1Mmh1VEZQYWx2TVlPR1lqcDJJNUNVMm5aMXR2VnZOaFRPVlpscWk3cmN5Qis0Qng5T214Z3NHT2VHNFdZcWxmem9xSnlBUGR5NVNKSTNkTGp5UE1oM0VQSU5uclpOQkV1UWEvbXhRSktBZTR4Qmtxb0JLb0doYzY0YktRK21PZFBpTkZMd0wvbCtXcGVMQ0FQY0k5b1JpaGNqZFFuYktEcTN3ajE0UjYrcDkzek15SmcxbDlkM3ViOGFsNVUwQUJ3My9kOW1JVTl1Qit3K2VEWlRPa2VManZrUjhTL0g5S05CTjBoSW1SR3JEZmZydVpGSlUzVllGdHZYeEM3YWUyVStkNFR4b2ZtR05WOG41QUptbnUrT3Q4UzdtcGVWTkJVRFFZMkh6RHI2RlRIL0FUL1R6c1p3YXpYSEhrZTViR1hrbGZ6b3BKR2dDVk5BeEhrNEJaRWNQWm9qVWF2cG0vZXgzdWY1YmxOeVdzelZWRnVCQWZJZkxxdGZ4alhaUVdzWm9jQ1pwclc3cHRMall1MTNpNmd1VGxZUDJCTm16b0h2MkRZZUtrSkFveEhMRjd0Ykx2VzJ3WFV6WDJPaWYxaGExOWVtTFVOZi9pL0ZHL3d3YTRwdWJKbUFRTWp5THhxcEY2WXE5N2JZd2o1VFI3cmUydlVMcUFzd0ZRQ3RGMzZQakNzMzNadDMxL2hMcU1pd0pTQUJzWlE5VDFWNzExWHNNdHFKOENVQWIxOTJYa05HRFpzSzlnRGFTL0FWZ25nVzYxUUQ2K3FnRmNkbnk2d3FtbjlEL1FHdkxnc0FUTDVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDE1Ljc3VjE2YTMuNzg2LDMuNzg2LDAsMCwwLTYuMTg3LTIuOTI4TDE1LjUsNzRsLTEuNjMxLDEuNGE0LDQsMCwwLDEtNC4xNDEuNjU1TDIuNDYyLDczLjAyNkE0LDQsMCwwLDEsMCw2OS4zMzNWNjlhMi4zMSwyLjMxLDAsMCwwLDQuMDI0LDEuNTQ5TDY2LDJBNS45NzksNS45NzksMCwwLDEsNzIuODIzLjg0MUw5Mi42LDEwLjM2NEE2LDYsMCwwLDEsOTYsMTUuNzdaIiBmaWxsPSIjNmMzM2FmIi8+DQogICAgICA8aW1hZ2Ugd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMDEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUJsQ0FZQUFBQ0dMQ2VYQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUw2MGxFUVZSNFh1MmQ2M2FiU0JDRWF5UWx6bVYzMy84OWQ1UFljV3oyQjVRb1N0MHpZRXV5THZRNWZXYTREUW9mMWRNMFBxRjBYWWZWYnRjMnJSMVd1MjdidFhaWVlxV1VVdHZlcmVIaTdGYmVjODBUb0Jua3lZbFcyT2V4TnluWXdKYWtkZXUwNVJBcjZOUGFJc0FDVmx0MzNRNU13YXIzTzY2Z1QycXpRblFDZG9NUjZzWmEzVmVodmc3ZVNic0h2a0krdmxVVkhJUmloN2tCc0pYK0JsUEl3QlR1eStDdjVoMkFycFN5UWo2eXBZQk50UXBYb2U2R1BsdXUxM0JOaUM4QS9rakxmcEY5MXBCOVpBc0JCM0JWbllUNWFlaC9rajYzRVRMVlM2RFA1Z29ha05CZFNpa3I1UGRiTFVSSHFsV2duOFVmWk4wT1U4Q3Y2Q0grSHZ4cGNDNXYwTU11bUlKZVEvWVI3QUN3cVZmaEt0aUh3YjhBK0RxMEQ4TzJUeGhWM0tHSDlvd2U2dVBndjRaVzFhNlFDUm9yNVBkWnBtQ2ZkeGwrUDZPSCtRWEFOL092R0NGVHhRelB6eGpCL2h6Mis0RnBTS2VTYWV1OGZBU2JBRTdtWGlaUFZDL2gvaVgrSFZQSW56QlY4RytNY0gvSVBxcDJUYzZlc2M3TFI3Rkl3UkZrenIwTXoxL1JRLzBMd0Q4QS9oNzYzOURmQUorSDQ0QWVGTVB6RDB5VlRzQ2FnVWNoRzFnaHY4bGFJVnJuWUZleFF2NGJQZWp2R0FGdU1RTDZqUjR3YndBcWVDZnV6OU9FckxZbVh3dXRWYW9rNUlJcFpGVXpRelpoZjhjSXNLQlhIcE1zd3RjUTdTcld4RXZEdGhaSTF1UnJwdTBCSjRXTi9XWk1MM2owNktUQXZ3N0xXNHp6OEJQRzBNendySUFqRlN0Z0Q5ZHI4alhEV2dwVzZ4SlgwMGVxQjR6WjlDdEc1U3Jjblhta1pJZE1XNU92R1JZQmppQnF1VkZMalY2VmVzRUlYUit2Z0JHc1ExVzREbG9CYjlEUDVhN21kVjZ1MkI1dzEzV2R2VndBRHVFK1k2eEdhZEdDWVprVktpMC9VdFZBRzJ5a1lwK1hQV1N2UlpHS1pTSGExVXUxN3RCRC9HVCsyVnkzT2JRTkR1SHRyQjhkazgzTHdGb1VTUzBMMGN4K3FaSU54bnF5WG1nSE5HZE8vWXdwTkFlZEhWY0R2QlpGRXBzQWxqRE5DMFBJZnhCbjFacGRSOHJNQVBsTlVqdDJqcHJYb2toaXRSRE45blhvKy94TXE0R09ZTENNdVV1T3lSUmRBMDNJYW12eWhRQ3dKVnNLK0EvaVJ5TmdDa3BWNlJDSzlMZkJjVFhZbVhNOFBjZGFGQmtzVlBBQWViOG9iUmNzQTdHS004RHFEaWdDWEp2ZmErZFlpeUxJUTdSRDVsdzgyV1ZvaTdRWllMOEJIUEpPMW1kcXprSzFoMndkbTNhM3lWY0tHRWlUcnJsaDJpKzRBdVQrYkFtcHBtUlZzZmNkOEFiOTQxeWs1cnVDWEFVTWpDRnRVRE1mb1lCK1RnYnE2blJWTzJodEZiS3FtNkJyY0JVeTI0SnA1WXUvOTY2U3J5WmdtcW1aaWRlK2lvUVlxc1BONE90K08rblhsTndDcmVlbDNWM3lOUnN3Y0FDNXd3ZzRnNmNBRmFJRG9QTVZveXA1RHVnTWJuUmozVlh5dFFnd01JSDhpdjRDcW9wcEdlZ01zSUp3eU5FeEdkeldzektkZHZQSjEyTEFRSnA4UlhPeUxpdk1HdUFJc283aDhKWUEzdURPM2tpOUNUQVFQa1lCNHhzbnRSYmdDSGpCOUZrM0c2T2w0QWgyTWIvcE4xSnZCZ3lra0dtdXZBaEtCamM2MXRmVlFFZkFhK2NDYnZTTjFMc0FBMDNJUUE2NmRjSFpNbHhIa04wejBITUEzK1FicVhjREJsTElCZU5ibmhaY1ZhUURMaGlWeUg0RXVnYVhnR3V3Yi9LTjFGRUFBeUhrMmlOVXBxWk5jZ3lOa05uNnNSRnNMNUJrcWlaa3RhdFB2bzRHR0dpR2F3Y1JnZWZCM3VyeEJGTzdhVnl4TGZjSVVuQWpSWkdqQWdZbWtCVndCak9DMU5wSDk2T1NnU2trVjdKWHZsVFZXVFFoWk9DS2s2K2pBeGJ6a3VaY2FBb3BnZzZNaVpkQzluRWlCV2VoMmtPMm53KzQwdVRySklBSEZSY2NsalRWaXJRWjZHaVpyb25YQm5ueUZhblpGUjBCM3VBR2lpSW5BUXpNcm5acFB3S2RlWFFEUkVwMndEVzQyYnlzZm5WRmtaTUJCbVpYdTk0S1ZtK1M3ZEJtKzZpQ28zQmR5NjU5VE9DS2lpSW5CUXcwTTJ1MXVZQ2pDKzdyZFR3Zk13TzlCUERWRkVWT0RoaG9RczRVcDBDeUM2NjJrMjBPSlJvdmd6dEh6VmRURkRrTFlLQUpHY2lCMU5Ua0R2UlFmRjAwOXRiNkhxNXJvQWxaN1NLVHI3TUJCbzVXMG94QXE3bUNIYmlQNHdwdU9jZldjMXhzVWVTc2dJR2psRFFqRmZ2eHNHUG1qTzBoZW1lZWhXdUZERnhZOG5WMndFQXpYRHVBQ0V3R2JUL28wTy9zT0NBK0psSnlGcW85WkVmbnZwams2ME1BQTR0TG1xcmVKZEJoMnhpdUVSeWZxVGw3blBLb2NwRkZrUThETExha3BMbXhmaFF1YXdvSFlpVkhnR3R3czNsWi9TS0tJaDhLZUZCeFFidWtHWUd1dVVPRnJkYytnckZyNFhyT1k1U08vYUZGa1E4RkRNd3VhVG9JRFkydEM2em1ZRGZvcjBGMjgyU2dsd0QrMEtMSWh3TUdacGMwZ2ZtQS9VSTcxT3pHaVFDemplRE9VZk9IRmtVdUFqQXdPN091S1N4VGtoci92ZHpPUGkrMDN4QU9Xcy9wYzNUMld3aFo3V3pKMThVQUJwcVFnUngwQmpkU2NBUzVCTXZST1Z6QkxlZVkrcHZPV2hTNUtNREEwYXBkZmxIZE9POUM5aWxvS3psU3NhcFpWVjI3NmM1V0ZMazR3TUJScWwxY3oyUDBXRjIzbFQ3WDF5SUF0N3RTczFEdElWdkhvWjAwK2JwSXdFQXpYRHZjREFhQ1phN1Rkb040SFpjZGNLYm03SEhLSTh2WmlpSVhDeGhZWE8yS1FMVDJjYWphWnVzaXdEVzQyYnlzZnJLaXlFVURGbHRTN1hLNDJUeEljTEJqdU53TjYzUmVacXRqMThMMW5NY28vUzFITDRwY1BPQkJ4YnpndFdvWDJ3eDBheHVOVUl1MEROZE16blFNRDlVT2VnbmdveGRGTGg0d01MdmFwZjBJWnVRUllHQUtXZGZWeHQxS0c4R2RvK2IwNnpPMHBiQ3ZBakNRSmwzSC9BTStQZDRWck50cDJibTIxdmR3M1FLdGtQY2hlekRlNlAzQ0ROaFhBeGhvWnRacWN3RXJhRWdMMlVaalA3bzVvbk81Z3VlNGo4MThvek1IQkhZTjlGVUJCcHFRV3hlK05nOUNXdG9tV0srZ2dmcTg3Q3BXTmM5Snd2amZNbFBKRGhsb3pOTlhCeGhvUWdicUZ6eUNxKzdXZ2h5Tm9lZDJsWHFvemg2cm5qRDlqOVlKdXNNVU5sQ0JmSldBZ1JSeXdiS1NaZ1NhcHNzWjVJS3BtaUxBbVpvakZUdG9mdjVQdi9INE9vd2R6czhPK1dvQkF5SGtwU1hOU0lHdy9nN1Q5V3oxK1ZqSDBlTWp3RkhDNWJEWjUrZi85TE1KK3RWV3dDREQ3S29CQTgxdzdSYzZnaDdkREJIMExRNnphMWpmbGU3bjhqQWNoZTNJbjNENGIzakJDSlFoRzY3aXF3Y01UQ0RQS1dtcWV1ZEExL0VnMi9VUktvSk01ZXU0V2NpdVFkL2FNZnFiT0EvcmI3MmRFQjBZRXhDZ1hkTGNXTjh2WWczMkhNaTE4L3E1dkIrMVBJY21XYS9EOXR0NVRNck1xbDBkVHZzSGZFWGFDREw3YXRFNGtQMDZjMTNIaE9yRlhNZUx6bms3Z0lFRHlFQmMwaXkyN0NySzRFYkhjVGtEcS9zQmRXRDZMYXJzaStucS9odjNwdlB3VFFFR2tDVmR4L29EUG1CNk1SMnlHdmRUK0J5WGM2eC9sdWdCMHkvRTZjZkVkQzZlQUszWnpRRUdVc2cwVmFUQzFBUW5VM0prQ3BuV0JhMkhYMXAwby9tTkZZMmRMVTlLbHpjSkdHaENCbkxRR1Z4M1dtZjdjVjBVamx1aFY2dFc3bHF1MUpibkMrMW1BUU1wNUlKbDFTNVhreHVmajZsa29BNVhQdzM0SzNGK05wQ1ZMQzkwUkxCRHlEY05HQWdoTDYxMktWaFhib2ZwL0Zod0NQY1BZcmlQR0Q5NS94K0FmOFgvRzliL3dBaWMzNFZVcFN2Y0VQTE5Bd2FhNGRyaFppR1o3aGVVU1pBRFptaWwraUxsRXFJRGR0QS9NU282ZXdFQkFBZXZEdThDTURDQlBLZmFGZmwrS0l3S2ZjSDRuZVN0N0tQS1paalZyN1greEZTOWtSTSs5NldLUFZTbjZnWHVDTENZSmlldGFwZkQxZU01ci83RytCVnpLcGpibm5Hb1dvZXJyVVBsTVU4WTRSS3d6c01BRHRVTDNCbmdCZFV1dHBGNkNaZGg5d3ZHTU0xOXVKMWdOQ1FUcm9MOUthMG1XanhlUTdQRDdkRC8wMVlGQXdlUWdUR2NBbE9ndGJCTTVUNmkvekEyUDVsYlpEd0NWdVdxUW10cTlRemFINSthb1psMmQ0QUJaRW1YVjd0cW9abnd2cUZYY0FTWVNWVUdXTUZ5ZnFaYVcyRDN6NytaY21sM0NSaElJV2ZHaTZyd0h0RURabG1SU1ZZTnNNN0JFVmgvM3RVQ3g0RnFXM0NCT3dZTXpJYXNGMVhWK3d0OWVIN0ErRTNrU01HYVBYc2hZeWxZWUFGYzRNNEJBNHNnUjNNcnd6T2ZnNEV4akRQVU1sRlNxQ2NIUzd0N3dNQXN5Tkg4K3d2VHR6MGNvTVBoTTNEa1d1RTZPbGphQ25pd0NtVFBvUGw0OUlocEZjc1Z6SDJwZW5WbTRpY0RTMXNCaXlXUUhiQVhON1FPemYwVnNpdFZNK0tUZ2FXdGdHUGp4WTBnLzBFUDlUZW1jQjB3L2NYYXM0Q2xsU09QZHhOV1JobDd5YkwyS3BIV1lYcER2RXBmMjVPQ3BhMkFLMVlCSFRsTndXVyszKzlVWUdrcjRJWUpaQ0F1WmVwMk5RZXQ2MDRPbHJZQ25ta0I2TGwyZHFocUsrQTNtTUd1MmtkQVZWc0IzN2pwSDRxdGRvUDJQNHFBMHNRajA0YUVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDgwdi4yM2E2LDYsMCwwLDEtMy40LDUuNDA2bC0xOS43OCw5LjUyM0E1Ljk3OSw1Ljk3OSwwLDAsMSw2Niw5NEw0LjAyNCwyNS40NTFBMi4zMSwyLjMxLDAsMCwwLDAsMjd2LS4zMzNhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMiw4OS44MTMsODIuOTI4QTMuNzg2LDMuNzg2LDAsMCwwLDk2LDgwWiIgZmlsbD0iIzg1NGNjNyIvPg0KICAgICAgPGltYWdlIHdpZHRoPSI1NCIgaGVpZ2h0PSIxMjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0IC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRFlBQUFCNENBWUFBQUM1RndIQkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFHTTBsRVFWUjRYdTJjVzNQaktoQ0VXODUxdmYvL2Y1N2R6VDJ4T1EraVRUTWFoSlNLSEpPaXE2YWt5TEt0enowTTVJRVpRZ2o0aWRyVmJtaFYxN1VicklaaEdHcjNBRUQ0NWxSWUJPYkFWT0gwTGQ4Qk9kUytVNkJLUjAraGNEd2I1S3hqQnFvVVZnRTVrTWJKeWEwQmkyQU8xRTZPTzhBRjVNTWU0N2s5bm1DMkJuVEJDbENNSzNOVU9ENzhzUktiQTg2bG9vVzZrcmlPY1NXdlV3UTdGT0lzZ0JNd1V3RVZUb0Z1SkFqTGUvblFCd0FmTWQ3ajhTREhUUUdYT0thdVhRTzRkZUlhS1MzcEdJRVliMGlBak0wQVMyRFdOVTFGd3QzSHVFTU9wNmxJb05jWWIwaUFDdm5sZ0xVSjJycEdzQnVNUUw5aUtCeGRvMk9FZWpISFRRRnJxV2ovSHBDN1JyZzlSdmR1a1FySkVRbnNKY1p6RFA2OUZqQU13ekFzZ1pzRDg5NnNjRmRJS2JsSGdydkJDTWR4OW9ZYzZpbkdVa0JDbmliNkplN1ZVbEhmbUUyd1NLbEp1TjhZNGU2UVB2ZUlOTVlJOVlnRVZ3SzBoY1k2Q0ZUY0s0RUZwRlJrTVFnb3c5MGdkKzQyWHVkWVl6b3EyQ055U0FWOHdiVFFjS29BRnNCTndFSUlJYzVsd2NUUkJEOXNRQ29vZEk0cHlYbE5YYk5nRnZBSjR3K2pMdTR3d2dFaklDQndjTFFrRlMyVVhVRUFhZHhwV3Q0aHVYWkFjdTAzcG1BUGNuNHZyOThnWCtFTVNJQkEvUDVoR0NianJWWTgxRGtQU3AzakJNNnBZSS9jTlp1U2U0eVFqL0djZ0wvaThSWnBaVU1vWUpwSkFRQnNTcnBnaFhSYzRwcXVUdTZRWEFQU2hQMktORVVRY0k4RVpTZDlnZ0UrRkdFV093YlV4NWtXRlNDSG8zTjBMV0IwalNzV1R1NTdPVmN3ZFFzb1B3TlRQVk1SYkVVUnNYQzZycnhCcXBCQXFtenE2TDBFblNJVTA0OVo4bUdDV1RNQWVZV3NPVWFWVXNDbUEyV1hZTHJVT3NCZlNETVVpaitrTHFSMUd2RCtId1N3SE14cURrNi95UDV6Q296ZmVVQUMxbitCdUpEVzFOVmxHZWM2V3lrbldnTm1BYXhMcWhJY0gvZ0tJeHdkNVJKTng1TXV4NTZRRnR2ZUZEQ0JXd09tVWpndkZWVVdFaGp2MzVuUThjU3A0UmxwRGFyanp3UDdrbFJjSXYwbEIwd2ZJQlN1YWVVa1VBMXFvaTNCckVwd0ZNY2V4OXN0cHVPdjVOUUpqcFh4SEdEdUx5clhkMGpqVHF1b0YxNzY2dWVmMHBFNXY3VXNYQ2xGN1lOclVTbkJVTm0xYzRGNXNyLzBtb0E1bitnN3dlWlVBeXNDVVpjR1poMzV0QzRKektZbWo0c2Nzcm9rc0M5VkIydE5IYXcxZGJEVzFNRmFVd2RyVFIyc05YV3cxdFRCV2xNSGEwMGRyRFYxc05iVXdWcFRCMnROSGF3MWRiRFcxTUZhVXdkclRSMnNOWFd3MXRUQldsTUhhMDBkckRWMXNOYlV3VnBUQjJ0Tmx3U211eWJXN0oxeGRVbGd3UExkVGxWZEdoZ1ZGc1NzdmhQTXB0NmFnRG1mNkZ4ZzlnRzhNUlF3M2Z0WjJwN3NBV1hYemdGVytsVXREQ0hzQmxPTnVVMnYvRXdBNTkwLzVxVlJ3QlRJZG13cHRjVHcwaE5yZDlWK1JpV1FFcFIyYXRGbUN0cTlSWHZ2ektYbHA4SFc3RDJ4WTJnT1N2dDlhTmllSHlYblRsb0Q1dTNmS3NuQ0hNMXJoR0thYVErQ2Z5YllPZUk1M3JmSXRUVmdxcms5WFI2VVBvUkMwU251Y1g3RUNQTW54dC80OXdQU0h1ZzNUTUVtV2dwVzI2Um0zU01VVTQxZnpyOUxVQThZUWY0QytDL0dYNlMyR0FSajQ1TDFxZWkwU1dQc25GQTR1a1FBZmthUWF5d0k3S09qZlQwSTlrZmlIL0t4NXFaaXRlMkZhQzBVblNMQUxwNERLZjNVSlJZSFFoR01vYW40R045akhkUHhlNUlMVm5CTFlleHVWeUNIZXNQNDJjZjRYbDdYSW1HaEZFN0RGZzl2akswcUhoYk9BNkpqUU83VWE3em10WmJSYmtkZWF4bnRxYU45ckVwUUFMQ3F0UXl3enEwRFV0TUR4SE82dGJZWjBGelBLbDAvQm94TWRjZFdGQTBkVjNUcUpiNzJqdVNXVFVFTDVzSE10VzhxclJNemxSd2IwdWtKU2lFcGxuU0ZPaUI5cm5WTHdlYmNxVFhjY2l1aGFra3E2cmtIeGZRakZNKzFrSEJzZlVtTE5GU2dnR1hGUThVUDVSY3FGTjNodURzaUwrOEt0d1RJYzZnS1JNMkIyVGNybEpaMGhib0dpcFB4aXptdUFRSldRQUgxVk5SZmlxbW5EOHlxOTQ0RXFmZnEwc21PbjAyQXFCSll3SFExd2ZTalcwQSs4YkxBQkxuK0xtRUx3aVpBVkMwVjFTMCtMT1FheHhrYi9kQkJkWmVBSDNKdE15QnFBaWFOdG9CcEd0cHJIOGduYXI2dUR0dllGSWlxT1FhTUQ2RFg5TUh0L0dZZExzVm1RRlN4eWJpekF0bkowUUtwdzBCNmVIdmNISWlhN1o0K3M3enlWaUdVZmZpekFsRS90aTE4RlF6STRFNlgzQnR6blIxR3RRaE01VUM2K2c0WTFXcXdWcVR6ejQvUy8xSEw3YllXaGVSYUFBQUFBRWxGVGtTdVFtQ0MiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNNjYsOTRjLjEzOC4xMzguMjkyLjI1NC40NDEuMzc3QTMuNzUxLDMuNzUxLDAsMCwxLDY2LDk0Wm0uNDQxLTkyLjM3N0EzLjc1MSwzLjc1MSwwLDAsMCw2NiwyQzY2LjEzOSwxLjg2MSw2Ni4yOTIsMS43NDYsNjYuNDQxLDEuNjIzWk05Mi42LDEwLjM0OSw3Mi44MjMuODM5YTUuOTY4LDUuOTY4LDAsMCwwLTYuMzgyLjc4NEEzLjUxNywzLjUxNywwLDAsMSw3Miw0LjQ4NXY4Ny4wM2EzLjUxNywzLjUxNywwLDAsMS01LjU1OSwyLjg2Miw1Ljk2OCw1Ljk2OCwwLDAsMCw2LjM4Mi43ODRMOTIuNiw4NS42NTFBNiw2LDAsMCwwLDk2LDgwLjI0NFYxNS43NTdBNiw2LDAsMCwwLDkyLjYsMTAuMzQ5WiIgZmlsbD0iI2IxNzlmMSIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+"},"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","supportsDownloadThenUpdate":true,"localizedResources":[{"language":"en-us","title":"Visual Studio Enterprise 2019","description":"Scalable, end-to-end solution for teams of any size","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-cn","title":"Visual Studio Enterprise 2019","description":"面向任何规模团队提供的可缩放、端到端解决方案","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-tw","title":"Visual Studio Enterprise 2019","description":"可擴展,且適用於任何規模小組的全方位解決方案","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"cs-cz","title":"Visual Studio Enterprise 2019","description":"Škálovatelné a kompletní řešení pro týmy libovolné velikosti","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"de-de","title":"Visual Studio Enterprise 2019","description":"Skalierbare End-to-End-Lösung für Teams jeder Größe","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"es-es","title":"Visual Studio Enterprise 2019","description":"Solución integral escalable para equipos de cualquier tamaño","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"fr-fr","title":"Visual Studio Enterprise 2019","description":"Solution scalable de bout en bout pour les équipes de toutes tailles","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"it-it","title":"Visual Studio Enterprise 2019","description":"Soluzione end-to-end scalabile per team di qualsiasi dimensione","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ja-jp","title":"Visual Studio Enterprise 2019","description":"あらゆる規模のチーム向けのスケーラブルなエンドツーエンド ソリューション","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ko-kr","title":"Visual Studio Enterprise 2019","description":"모든 규모의 팀에 사용할 수 있는 확장 가능한 엔드투엔드 솔루션","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pl-pl","title":"Visual Studio Enterprise 2019","description":"Skalowalne, kompleksowe rozwiązanie dla zespołów dowolnej wielkości","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pt-br","title":"Visual Studio Enterprise 2019","description":"Solução escalonável e de ponta a ponta para equipes de qualquer tamanho","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ru-ru","title":"Visual Studio Enterprise 2019","description":"Комплексное масштабируемое решение для команд любого размера.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"tr-tr","title":"Visual Studio Enterprise 2019","description":"Her boyuttaki takımlar için ölçeklenebilir, uçtan uca çözüm","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"}],"requirements":{"supportedOS":"6.1.1","conditions":{"expression":"not Win10ThresholdBuildNumber","conditions":[{"registryKey":"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion","id":"Win10ThresholdBuildNumber","registryValue":"CurrentBuildNumber","registryData":"[10240.0,14393.0)"}]}}},{"id":"Microsoft.VisualStudio.Product.Professional","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgOTYgOTYiPg0KICA8ZGVmcz4NCiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0OCIgeTE9Ijk2IiB4Mj0iNDgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz4NCiAgICA8L2xpbmVhckdyYWRpZW50Pg0KICAgIDxjbGlwUGF0aCBpZD0iYiI+DQogICAgICA8cGF0aCBkPSJNNjguODkxLDk1LjZhNS45NzYsNS45NzYsMCwwLDAsMy45MzMtLjQzOUw5Mi42LDg1LjY1MUE2LDYsMCwwLDAsOTYsODAuMjQ0VjE1Ljc1N2E2LDYsMCwwLDAtMy40LTUuNDA4TDcyLjgyNC44MzlBNS45OCw1Ljk4LDAsMCwwLDY2LDJMMzQuMTE4LDM3LjI2NCwxNS41LDIybC0xLjYzMS0xLjRhNCw0LDAsMCwwLTMuNjEtLjgzNCwzLjk0NywzLjk0NywwLDAsMC0uNTMxLjE3OUwyLjQ2MiwyMi45NzRBNCw0LDAsMCwwLC4wMTEsMjYuMzY2Yy0uMDA3LjEtLjAxMS4yLS4wMTEuM1Y2OS4zMzNjMCwuMSwwLC4yLjAxMS4zYTQsNCwwLDAsMCwyLjQ1MSwzLjM5Mmw3LjI2NiwzLjAyN2EzLjk0NywzLjk0NywwLDAsMCwuNTMxLjE3OSw0LDQsMCwwLDAsMy42MS0uODM0TDE1LjUsNzQsMzQuMTE3LDU4LjczNiw2Niw5NEE1Ljk2NCw1Ljk2NCwwLDAsMCw2OC44OTEsOTUuNlpNNzIsMjcuNjc3LDQ3LjIxMiw0OCw3Miw2OC4zMjNabS02MCw2LjZMMjQuNDExLDQ4LDEyLDYxLjcyN1oiIGZpbGw9Im5vbmUiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPg0KICAgIDwvY2xpcFBhdGg+DQogIDwvZGVmcz4NCiAgPHRpdGxlPkJyYW5kVmlzdWFsU3R1ZGlvV2luMjAxOTwvdGl0bGU+DQogIDxnIHN0eWxlPSJpc29sYXRpb246aXNvbGF0ZSI+DQogICAgPHJlY3Qgd2lkdGg9Ijk2IiBoZWlnaHQ9Ijk2IiBvcGFjaXR5PSIwIiBmaWxsPSJ1cmwoI2EpIi8+DQogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2IpIj4NCiAgICAgIDxpbWFnZSB3aWR0aD0iNDAiIGhlaWdodD0iODIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUJTQ0FZQUFBQW1SNWJLQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUVlMGxFUVZSb1ErMmFXM2ZiSUJDRUIxK2FTOU1tLy85M05va2RKMVlmWU1Sb3RTQnM2cllQbW5QMllFblkraklzcUJVYmhtSEEvNnpOVW9kL3JkMVNoMHNVUWdpbGE4T1ZROVVGV0FCeUlXM1hWdURRMkc4aUF4WUtyV29vdEl1Z0Z3RUttTFlhOXBvQ2FlaTVLbVRURUJmQU5zaGcrbGxoZ1FoeGR0cnhlZ2dobENDcmdBdGdteFJiK2F5Z1FJYlIrRXJYZWN4K3JvcUFCazZkSWxRcEZGQ2h2Z0I4cG10ZnlEb0RRQWpCSFdvWDBJR3pZTHNVZS9tOFEzYVQrVWU0VXdwZUEzSU9qcm5xRFhWdGlCVk93ZllwdnBrZ0pCZi9BUm51QThEUlhOTlE2SWxtZ01rOUM4ZWJFK1lld0YxcTd6R0ZKSVRDSFRDRnMzazV1bWcxQVhUV053VzhTL0dRNGxFK0U1S0FBMksrSFJIaHR1azNPZVNmeVBtbzk1ekpHMkxQdlcrSWNJOHBuZ0I4VHkxQjc1QW55Um5aT2Q1REhkV1pQNEcwZVZqS1FaMFVCTHhIaFBtUjRtZHFuekFGQktJN0I4UmM1ZkV4SFN2Y29rYkF3c3pkSWs4SUJYd0c4SUlNK1pqNmNIZy9rT0ZPeUxBNnl5SHRxS1ZaN0UyUVBYTHVjVmdKK0lJSStJQU1TTGNDc3BOMkNhSUcwODVVR21JdkIrbmdFN0tMejhnT3FtTUVmVWVHczI0dHdnSHRrNFF1S2lSQmZ5STZ1RU84MlJGeGtuRDJlb3V6UmxVdFEweEF1c2lsNVhzS3p1SXQ4aVBzaUF3SHpLSE96cm5sZFZCVWc5UUZtbkdYK3ZLWjZ6bW5DN01MVlh3V093dDB5VWtGMWNmZEh0a3RYVUk4NXp6SXBrbmlRVzVNTU9FSnVwTUl5UCtVVWltWUIxWE5RN3RZenRZbHpHRjFvV1ZZMXlrdno1cWNvMG81Q0V4djVnMjd3dkVQOWR5N0dFcGxIZlJrNGJ4VThGUURhWVp0QWZUa2dkVkFiK3BnaTBwdzNib0c4R1l3bnE0Qi9LdGFBWHUxQXZacUJlelZDdGlyRmJCWEsyQ3ZWc0JlcllDOVdnRjd0UUwyYWdYczFRcllxMnNBTDNxMzBxdHJBRDNkRFBwYVFPOHRWUW15OXZwdVVTMkF0ZGRudGRkcE5aQm0yQnFnM3R3QzJwZmgrdjVaNWJtM0NLV3lyNEE5Tnl6VUY2YUFoTk8rVkFtd0dWWUJCK1F2ZUU2ZEViZTN1Tjk3UXQ3MzVZdDFoYVZDdXJhQkQxZUYzQUhBTUF5RDdKVjR3Nm1iME56elpmdUJES0R1QW5PZ0RjcXdiaTZYM3ZKN2NGcDdjSkRZSTk2QVcyRjBXZDJzd1kxcUthb29PYWUxQis4cFhoRjNtYmFwdjI0bUtpVGdPK25sNDh4Rno4RVNJSjE3QS9BTGNYK08zLy9FZkFQN0JOOUpMdytMcWcyeEF0SzlOMFF3RmxDRTFPOEQ4dzN0UXpwUE43M0pvNjJybGlHbWUrL0lOVE5hUEhHQ1h4THdscjVqaDl3dVE5ck9OQUxLVFBZQXRZS0RoUk1Ec3J0MDFoWlZ2S1gyQ0gvSVp6blhXdlZ4UnZ5cmRJZzVBNEg0dzRRL29GNlc4b284M0FySkNWUlZhWklBMlVHYjBIU1g0TzlZTHV5aGs1cVQraFFhSGFzdU04NkNyWkQybk03c2x0SW81aU9mUURNNFR6TUhFeVFQZFJocXVkbGFYSGJFM01VcVpHMi9XSWVheDNiNW9ZdUUwMW9GKzhkb2VJQXVwQXRvWmpRdy9TSG1EaUczSmpSZnRhOCt6MTMzdktLS2FwSHREVXRFOVhoQVpITkJtcXFBRjBEdFp3VUVNcVRYamc1MkFWSUZVQXVsTFg5OE1LSG5xbVhLRndGU1RwMk4xNnFHUXZ0bkM3MnRET2g0MmprSG1GbTZCRVoxQVZvVmdBRzBBMW45VWNCYnFPWC94ZjlVdndFRXhuUTEwSmJTZmdBQUFBQkpSVTVFcmtKZ2dnPT0iIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNMTUuNSw3NGwtMS42MzEsMS40YTQsNCwwLDAsMS00LjE0MS42NTVMMi40NjIsNzMuMDI2QTQsNCwwLDAsMSwwLDY5LjMzM1YyNi42NjdhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMkEyLjIxMywyLjIxMywwLDAsMCwxMiwyMy44VjcyLjJBMi4yMTQsMi4yMTQsMCwwLDAsMTUuNSw3NFoiIGZpbGw9IiM1MjIxOGEiLz4NCiAgICAgIDxpbWFnZSB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEwMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyIC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCbENBWUFBQUNHTENlWEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFMVDBsRVFWUjRYdTJiNjFiYk9oU0V4N1JBNmUyYzl2MGZzcWZjQzhYblJ6VFJlSHZMbGhJNUpJcG5MUzNuWXFETng3Nk5STmYzUFZhMXE0dTVHMWFkdGo3TzNiQnFySzdydXJsN3FQNmRVK1FLT0ZNTzFDekkrbVh2QVhzRm5DR0JxMWY3bWxVdjF4NTRIOWdyNEFrWnNGTUxjclZndmJXRnZUVG9GWEJDRHR3THVlcXlvQlhrVzFpOWM5MTg4NFZCcjRBZEJiaTZDUE9EV1JZME1BVDdCdUN2dWVwYUhQUUsyTWlCUzVBZnpickVFTFlGL0Rlc1YxbC9aUjBFOUFwWVpPQnExRjVpODFsZHlicVV4WHVCRFN4Q2ZNRUc3SXRaQkw4NDZCVndrQU9Ya1VtSTEyRjlraXRoTThvN3hPaDlCZkJuWXRuSVhnVDBDaGl6Y0JYc1p3QTNjaVZrUmpFQk0yci9BSGdPNnlrc1B2K0RHTkdMZ1Q1N3dBbTRyTEZYMkVDOEFmQWxySy9oK2ptc2E4UjZiQUVyMkVkWkNudFIwRjNtZlUwcUF5NmpsV0MvQWZnZUhuOUZqR1RXYUdBRGcrbjVHUkhxZzF6NWVCZlEyMWs2Qi9MWlJ2QU1YRTNKQ3ZhZnNBajVDemFBV1ljN1RBTytEK3NCMDZBSjIrdTgyYVdqNjdwWnlHY0plS1piWmxvbVhJTDlOeXhDL29ZWXdWZllmSmJhWkRGRnB3QmIyTHlQYWQyQ3ZrQUVEV1E2WW1jSE9PRlFlV21aY0FuMkI0YVFHY0ZzdEFpWVl4SUJLMlFMOTg2OFJ0Qlg4QnN5L2JjemJRTlNvNjNPQ3JBRDEydW9QTGcvc1FIOEE4TVUvVGw4RFp1c0MwVEF0dEY2RFBjL1lQT0xjUitlRS9RTkl2aHJSTmpXTmV2Qzl3Wk04K1ZGOFZrQkRySnBtUVlHNFg3Qkp2MHlMUlB1VDhUby9ZWllmNi9EOTlBYWJHZmhtN0NlRUNHekM3K1Q5emxqYy9UaTkxWFBtMkt6dGUyeXU2N3JMT1N6QVN4MTE0TjdqVGdLS1Z4R0xlSCtpMDMwY2t4aTlCSUVwVzdXRlRhUnpNYU42OFk4bndLcjZwM0ZlODR6Z2hNZE05UHlIRnl0dlpxYTJWeHBlcVlZV1c4WWxnQmQxL0tZVUQyd0dxbk1ETW5SeVVaeDg0QXp4aUdGcXgyendyV2pFU09PWU5TTEJvWlErUE5lRVNFcVRBOG9RZXBtaFoyUHVmVC94Ni9mcW1uQUdSWmthaHl5SGJNMzk3SnoxdVpIMVlmWDMrUWVyYVVLUkpzeTdiNmZNTnpZNEMrR2ZpLytETmIvZ1pvRlBCRzVUSStmRUIycUhMaXN1UXAzcWdIcTVKcHFqbDR4M0pYU3FMYkxRdVVWR1A5eWJhVnBwUmxsV0pEYU1YL0gyTXpRYmxsckx1dm1GRnpJYTUzejNJdDA3WWJ0ZFZ0Zmc3eWZOWHdoam9QdEFaNXhxVmh6VTJuWnE3bTJvVXJCVFVXcVB0WkdTVk15WGF0bkRNME5hMW1PTmgvbTFCVGdESmRxcXVhbUdpb2J1YmFXUXE3MmcvY2FKdDFHZkVLMEt1L05VcDlhM2F4WCtGMzBWazEyMFRNdWxUWlVUTXVha3FjaVY3dmxWT1FDNDJoVnVCWXNiY3M3QUxjQWZvZjFuenkrRGU4VE5DR3prN1p3M2FodUJuQ1FUY3ZhVk5tYW00cGM2MUpadU5veHArQjZxZmdQb21XcGNQK1Q5UXNSOEIxOHdFVXB1d25BR1M2VldwQjJBMEVCSzF3OXJiRUxYSjFmMVk4bVhFYXNCL2NXTVUzcnBvUHVGelB0OTJZTmRQS0FNMTJxejVoMnFiUmpWcmc2dHRpMHJCK21UY25jVGRJdFE5WlpDL2VYUEU3QnpUa0lBQUNqRFllVEJselJwZEp4U0NPWFRaWFhJZXRqL2JDOWV2dUFjYjBsV0Y1dFd0WTk0UlRZMUNpMTFja0NydVJTc2VZcVhEMWo1WFhNMUZ3enhaUk11TnBJS2R5cHRHelRjV3BHN29GeDlBSW5DbmhCbDJxdVk2WnltaW1ia3IybzFjaWRndXRGcTliK2RrNTBaTHBVSGx4ZEtaZHFGN2hlTTBXNFRNbGFieFV1UjZGN0RHZGVDemNKRmtqREJVNE1jRUhONVVHNWZXZGRGVDlFVzI5Zk1UWXV0Tjdtd3MwWmd3WWc1dzdjQVNjRU9NT0N0S2NnNStCNnMrNlVpZUhWVzhMbHFVaTZVRHJmS2xqVzNKU0o4WUp4dmRXb3pZS3FPZ25BaFJZazRYcWpVRTdrMHI3dE1JeWNxWG83MVV3cFlOdE1FUzdISUoxdHQ1RmJDbFYxOUlBTExFZ0xsNUZyeDZFNWw0by95NE9iWTE3WVpvcVBiekhkS2F2SHZJM2FmZUFDSndBNHlLYmxsRXVsYVZrUHlWa0wwbk9wdE9acXZlMnhtM21ScXJjNjR5WmRxWDNCVWtjTnVOQ0M5RXdNQld6aFRuWExXbTlMelFzRlc5Sk1WWWNMSERIZ0NoYmtEd3pocGc3S2VkRnJtNm5jZXF0WHJiZjNpSTJZZGFhcTFWdFBSd200WUJ5YXN5Qzk0emFFUzM5Wk5kZE1sWmdYWHIwbFhLOVRyZzRYT0VMQWxTeklPU1BEcHVWZUZqLzhHdWFGNXltUG5La2x3RkpIQlhoQkM5SnVIbmhwZVNuell0S1pXaEl1Y0VTQU15M0lmUS9LZVhDMVV6NkVlYkZZdmZWMEZJQXpYS3A5RDhwNURkVSt6WlFDUHJoNVVhSjNCMXpvVXVYQTlRN0syVmxYNFo2Y2VWR2lkd1ZjNEZMVk9pZ0hqRHZsa3pNdlN2U3VnSU5zV3ZhTWpGMFB5bG13UUFSTHVDZG5YcFRvM1FBWHVsUWxCK1Z5SXJlazN1cjFLTXlMRXIwTDRBb3VsZTJZUFgvWnpybk5tQmNsT2pqZ2lpNlZkMURPUm02cVV6NXA4NkpFQndWY3lhWEtPU2lua2F2T1ZCUG1SWWtPQm5oaGwwb2pGL0RIb0diTWl4SWRCSENtUzdYdlFUbU4zRjJhS1FWODFPWkZpUllIWEZCemM4OVNwVndxSUVhdVYyK2JNUzlLdENqZ0RBdHkxNE55SGx6QWI2YWFNeTlLdEJqZ1Fnc3k5NkJjNnFpTjdaU2JOaTlLdEFqZ0FndHk3cURjbkVzRnBKdXBaczJMRWkwQ09NaW01WlJMcFduNUo2WXRTSGJNMXNBZ0NJNHdUWnNYSmFvT3VOQ0M5RXdNMnpFcjNGUmFwdWx3RnVaRmlhb0NybUJCL2tDNjdtcERwYnRCbm5seGgyRjluWUo3Y3VaRmlhb0JMaGlINWl4SVBRVnA5M1FCZnd5eXpaUUg5aGNhTVM5S1ZBVndKUXR5eWwvV2hrcmgydmsyQlZjajkrVE5peEx0RGZnQUZxUzZVem9HZWVaRkNtNnFtVHBKODZKRWV3SE90Q0JMRDhyWmhnb1l3cldkY3FxWllrcitqY2JNaXhMdEREakRwY285S09kMXk1cVdDZGZ1NGRxZElLMjFGdTVEV0UyWUZ5WGFDWENoU3pYWFVFMmxaVWFYWnp1V05sUE5tQmNsS2daYzRGS1ZISlJMd1UxMXlydnNCRFZqWHBTb0NMQ0JPMmRrekIyVXN6dERIbHoxbFBmWkNXckt2Q2hSTnVBRTNJOUl1MVE1QitYVXhPZ3dISU1JdDJRbjZCYXgzdHBtaXAxeXMvWFdVeGJnek1oVkl5TmxRZEpmOWh3cTFrUENmUXhyMTUyZ1p3enJiVFBtUllrbUFUdjFWc2NoYTBHbVpsMEM5allQMkMwVExqdGxiNXZQZHNxMjNqYTNFMVJEU2NBSnVIU292TWlkTXpJMExWOWpHTGs2NDNyTmxBWHJOVlBON1FUVmtBczRNUVpOcGVXY1U1QWF1WVRMdEttZGNtNjliWDRucUlhbVVuVEt4UERPVXFVT3lsbTQybENwZ2FGd1M3YjVtdDRKcXFFUjRFVDBsc3k2VE1rSzE4NjVUTXUyVTdiMVZsUHoyZTBFMVZBcWdsUFI2NDFEdXYzSGxkclBCWWI3dU53dzhKb3BCWnd5TDVyZUNhcWhBZUNacnBtMTl4UEdQck11UmkzaFhtTG9LK3RXbjdlSGE2TTNaVjQwdnhOVVExNEVkL0hoeU5Ed1VqVHJNSSsxV25lS2NCbGxkc1BBc3gzbm1xbXoyQW1xb2JrVWJWMHJiYkkrSVVZei83clBPNEh4SnN2YkRkS28xU2oybXFtejJnbXFvWnd1Mmh1VEZQYWx2TVlPR1lqcDJJNUNVMm5aMXR2VnZOaFRPVlpscWk3cmN5Qis0Qng5T214Z3NHT2VHNFdZcWxmem9xSnlBUGR5NVNKSTNkTGp5UE1oM0VQSU5uclpOQkV1UWEvbXhRSktBZTR4Qmtxb0JLb0doYzY0YktRK21PZFBpTkZMd0wvbCtXcGVMQ0FQY0k5b1JpaGNqZFFuYktEcTN3ajE0UjYrcDkzek15SmcxbDlkM3ViOGFsNVUwQUJ3My9kOW1JVTl1Qit3K2VEWlRPa2VManZrUjhTL0g5S05CTjBoSW1SR3JEZmZydVpGSlUzVllGdHZYeEM3YWUyVStkNFR4b2ZtR05WOG41QUptbnUrT3Q4UzdtcGVWTkJVRFFZMkh6RHI2RlRIL0FUL1R6c1p3YXpYSEhrZTViR1hrbGZ6b3BKR2dDVk5BeEhrNEJaRWNQWm9qVWF2cG0vZXgzdWY1YmxOeVdzelZWRnVCQWZJZkxxdGZ4alhaUVdzWm9jQ1pwclc3cHRMall1MTNpNmd1VGxZUDJCTm16b0h2MkRZZUtrSkFveEhMRjd0Ykx2VzJ3WFV6WDJPaWYxaGExOWVtTFVOZi9pL0ZHL3d3YTRwdWJKbUFRTWp5THhxcEY2WXE5N2JZd2o1VFI3cmUydlVMcUFzd0ZRQ3RGMzZQakNzMzNadDMxL2hMcU1pd0pTQUJzWlE5VDFWNzExWHNNdHFKOENVQWIxOTJYa05HRFpzSzlnRGFTL0FWZ25nVzYxUUQ2K3FnRmNkbnk2d3FtbjlEL1FHdkxnc0FUTDVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDE1Ljc3VjE2YTMuNzg2LDMuNzg2LDAsMCwwLTYuMTg3LTIuOTI4TDE1LjUsNzRsLTEuNjMxLDEuNGE0LDQsMCwwLDEtNC4xNDEuNjU1TDIuNDYyLDczLjAyNkE0LDQsMCwwLDEsMCw2OS4zMzNWNjlhMi4zMSwyLjMxLDAsMCwwLDQuMDI0LDEuNTQ5TDY2LDJBNS45NzksNS45NzksMCwwLDEsNzIuODIzLjg0MUw5Mi42LDEwLjM2NEE2LDYsMCwwLDEsOTYsMTUuNzdaIiBmaWxsPSIjNmMzM2FmIi8+DQogICAgICA8aW1hZ2Ugd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMDEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUJsQ0FZQUFBQ0dMQ2VYQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUw2MGxFUVZSNFh1MmQ2M2FiU0JDRWF5UWx6bVYzMy84OWQ1UFljV3oyQjVRb1N0MHpZRXV5THZRNWZXYTREUW9mMWRNMFBxRjBYWWZWYnRjMnJSMVd1MjdidFhaWVlxV1VVdHZlcmVIaTdGYmVjODBUb0Jua3lZbFcyT2V4TnluWXdKYWtkZXUwNVJBcjZOUGFJc0FDVmx0MzNRNU13YXIzTzY2Z1QycXpRblFDZG9NUjZzWmEzVmVodmc3ZVNic0h2a0krdmxVVkhJUmloN2tCc0pYK0JsUEl3QlR1eStDdjVoMkFycFN5UWo2eXBZQk50UXBYb2U2R1BsdXUxM0JOaUM4QS9rakxmcEY5MXBCOVpBc0JCM0JWbllUNWFlaC9rajYzRVRMVlM2RFA1Z29ha05CZFNpa3I1UGRiTFVSSHFsV2duOFVmWk4wT1U4Q3Y2Q0grSHZ4cGNDNXYwTU11bUlKZVEvWVI3QUN3cVZmaEt0aUh3YjhBK0RxMEQ4TzJUeGhWM0tHSDlvd2U2dVBndjRaVzFhNlFDUm9yNVBkWnBtQ2ZkeGwrUDZPSCtRWEFOL092R0NGVHhRelB6eGpCL2h6Mis0RnBTS2VTYWV1OGZBU2JBRTdtWGlaUFZDL2gvaVgrSFZQSW56QlY4RytNY0gvSVBxcDJUYzZlc2M3TFI3Rkl3UkZrenIwTXoxL1JRLzBMd0Q4QS9oNzYzOURmQUorSDQ0QWVGTVB6RDB5VlRzQ2FnVWNoRzFnaHY4bGFJVnJuWUZleFF2NGJQZWp2R0FGdU1RTDZqUjR3YndBcWVDZnV6OU9FckxZbVh3dXRWYW9rNUlJcFpGVXpRelpoZjhjSXNLQlhIcE1zd3RjUTdTcld4RXZEdGhaSTF1UnJwdTBCSjRXTi9XWk1MM2owNktUQXZ3N0xXNHp6OEJQRzBNendySUFqRlN0Z0Q5ZHI4alhEV2dwVzZ4SlgwMGVxQjR6WjlDdEc1U3Jjblhta1pJZE1XNU92R1JZQmppQnF1VkZMalY2VmVzRUlYUit2Z0JHc1ExVzREbG9CYjlEUDVhN21kVjZ1MkI1dzEzV2R2VndBRHVFK1k2eEdhZEdDWVprVktpMC9VdFZBRzJ5a1lwK1hQV1N2UlpHS1pTSGExVXUxN3RCRC9HVCsyVnkzT2JRTkR1SHRyQjhkazgzTHdGb1VTUzBMMGN4K3FaSU54bnF5WG1nSE5HZE8vWXdwTkFlZEhWY0R2QlpGRXBzQWxqRE5DMFBJZnhCbjFacGRSOHJNQVBsTlVqdDJqcHJYb2toaXRSRE45blhvKy94TXE0R09ZTENNdVV1T3lSUmRBMDNJYW12eWhRQ3dKVnNLK0EvaVJ5TmdDa3BWNlJDSzlMZkJjVFhZbVhNOFBjZGFGQmtzVlBBQWViOG9iUmNzQTdHS004RHFEaWdDWEp2ZmErZFlpeUxJUTdSRDVsdzgyV1ZvaTdRWllMOEJIUEpPMW1kcXprSzFoMndkbTNhM3lWY0tHRWlUcnJsaDJpKzRBdVQrYkFtcHBtUlZzZmNkOEFiOTQxeWs1cnVDWEFVTWpDRnRVRE1mb1lCK1RnYnE2blJWTzJodEZiS3FtNkJyY0JVeTI0SnA1WXUvOTY2U3J5WmdtcW1aaWRlK2lvUVlxc1BONE90K08rblhsTndDcmVlbDNWM3lOUnN3Y0FDNXd3ZzRnNmNBRmFJRG9QTVZveXA1RHVnTWJuUmozVlh5dFFnd01JSDhpdjRDcW9wcEdlZ01zSUp3eU5FeEdkeldzektkZHZQSjEyTEFRSnA4UlhPeUxpdk1HdUFJc283aDhKWUEzdURPM2tpOUNUQVFQa1lCNHhzbnRSYmdDSGpCOUZrM0c2T2w0QWgyTWIvcE4xSnZCZ3lra0dtdXZBaEtCamM2MXRmVlFFZkFhK2NDYnZTTjFMc0FBMDNJUUE2NmRjSFpNbHhIa04wejBITUEzK1FicVhjREJsTElCZU5ibmhaY1ZhUURMaGlWeUg0RXVnYVhnR3V3Yi9LTjFGRUFBeUhrMmlOVXBxWk5jZ3lOa05uNnNSRnNMNUJrcWlaa3RhdFB2bzRHR0dpR2F3Y1JnZWZCM3VyeEJGTzdhVnl4TGZjSVVuQWpSWkdqQWdZbWtCVndCak9DMU5wSDk2T1NnU2trVjdKWHZsVFZXVFFoWk9DS2s2K2pBeGJ6a3VaY2FBb3BnZzZNaVpkQzluRWlCV2VoMmtPMm53KzQwdVRySklBSEZSY2NsalRWaXJRWjZHaVpyb25YQm5ueUZhblpGUjBCM3VBR2lpSW5BUXpNcm5acFB3S2RlWFFEUkVwMndEVzQyYnlzZm5WRmtaTUJCbVpYdTk0S1ZtK1M3ZEJtKzZpQ28zQmR5NjU5VE9DS2lpSW5CUXcwTTJ1MXVZQ2pDKzdyZFR3Zk13TzlCUERWRkVWT0RoaG9RczRVcDBDeUM2NjJrMjBPSlJvdmd6dEh6VmRURkRrTFlLQUpHY2lCMU5Ua0R2UlFmRjAwOXRiNkhxNXJvQWxaN1NLVHI3TUJCbzVXMG94QXE3bUNIYmlQNHdwdU9jZldjMXhzVWVTc2dJR2psRFFqRmZ2eHNHUG1qTzBoZW1lZWhXdUZERnhZOG5WMndFQXpYRHVBQ0V3R2JUL28wTy9zT0NBK0psSnlGcW85WkVmbnZwams2ME1BQTR0TG1xcmVKZEJoMnhpdUVSeWZxVGw3blBLb2NwRkZrUThETExha3BMbXhmaFF1YXdvSFlpVkhnR3R3czNsWi9TS0tJaDhLZUZCeFFidWtHWUd1dVVPRnJkYytnckZyNFhyT1k1U08vYUZGa1E4RkRNd3VhVG9JRFkydEM2em1ZRGZvcjBGMjgyU2dsd0QrMEtMSWh3TUdacGMwZ2ZtQS9VSTcxT3pHaVFDemplRE9VZk9IRmtVdUFqQXdPN091S1N4VGtoci92ZHpPUGkrMDN4QU9Xcy9wYzNUMld3aFo3V3pKMThVQUJwcVFnUngwQmpkU2NBUzVCTXZST1Z6QkxlZVkrcHZPV2hTNUtNREEwYXBkZmxIZE9POUM5aWxvS3psU3NhcFpWVjI3NmM1V0ZMazR3TUJScWwxY3oyUDBXRjIzbFQ3WDF5SUF0N3RTczFEdElWdkhvWjAwK2JwSXdFQXpYRHZjREFhQ1phN1Rkb040SFpjZGNLYm03SEhLSTh2WmlpSVhDeGhZWE8yS1FMVDJjYWphWnVzaXdEVzQyYnlzZnJLaXlFVURGbHRTN1hLNDJUeEljTEJqdU53TjYzUmVacXRqMThMMW5NY28vUzFITDRwY1BPQkJ4YnpndFdvWDJ3eDBheHVOVUl1MEROZE16blFNRDlVT2VnbmdveGRGTGg0d01MdmFwZjBJWnVRUllHQUtXZGZWeHQxS0c4R2RvK2IwNnpPMHBiQ3ZBakNRSmwzSC9BTStQZDRWck50cDJibTIxdmR3M1FLdGtQY2hlekRlNlAzQ0ROaFhBeGhvWnRacWN3RXJhRWdMMlVaalA3bzVvbk81Z3VlNGo4MThvek1IQkhZTjlGVUJCcHFRV3hlK05nOUNXdG9tV0srZ2dmcTg3Q3BXTmM5Snd2amZNbFBKRGhsb3pOTlhCeGhvUWdicUZ6eUNxKzdXZ2h5Tm9lZDJsWHFvemg2cm5qRDlqOVlKdXNNVU5sQ0JmSldBZ1JSeXdiS1NaZ1NhcHNzWjVJS3BtaUxBbVpvakZUdG9mdjVQdi9INE9vd2R6czhPK1dvQkF5SGtwU1hOU0lHdy9nN1Q5V3oxK1ZqSDBlTWp3RkhDNWJEWjUrZi85TE1KK3RWV3dDREQ3S29CQTgxdzdSYzZnaDdkREJIMExRNnphMWpmbGU3bjhqQWNoZTNJbjNENGIzakJDSlFoRzY3aXF3Y01UQ0RQS1dtcWV1ZEExL0VnMi9VUktvSk01ZXU0V2NpdVFkL2FNZnFiT0EvcmI3MmRFQjBZRXhDZ1hkTGNXTjh2WWczMkhNaTE4L3E1dkIrMVBJY21XYS9EOXR0NVRNck1xbDBkVHZzSGZFWGFDREw3YXRFNGtQMDZjMTNIaE9yRlhNZUx6bms3Z0lFRHlFQmMwaXkyN0NySzRFYkhjVGtEcS9zQmRXRDZMYXJzaStucS9odjNwdlB3VFFFR2tDVmR4L29EUG1CNk1SMnlHdmRUK0J5WGM2eC9sdWdCMHkvRTZjZkVkQzZlQUszWnpRRUdVc2cwVmFUQzFBUW5VM0prQ3BuV0JhMkhYMXAwby9tTkZZMmRMVTlLbHpjSkdHaENCbkxRR1Z4M1dtZjdjVjBVamx1aFY2dFc3bHF1MUpibkMrMW1BUU1wNUlKbDFTNVhreHVmajZsa29BNVhQdzM0SzNGK05wQ1ZMQzkwUkxCRHlEY05HQWdoTDYxMktWaFhib2ZwL0Zod0NQY1BZcmlQR0Q5NS94K0FmOFgvRzliL3dBaWMzNFZVcFN2Y0VQTE5Bd2FhNGRyaFppR1o3aGVVU1pBRFptaWwraUxsRXFJRGR0QS9NU282ZXdFQkFBZXZEdThDTURDQlBLZmFGZmwrS0l3S2ZjSDRuZVN0N0tQS1paalZyN1greEZTOWtSTSs5NldLUFZTbjZnWHVDTENZSmlldGFwZkQxZU01ci83RytCVnpLcGpibm5Hb1dvZXJyVVBsTVU4WTRSS3d6c01BRHRVTDNCbmdCZFV1dHBGNkNaZGg5d3ZHTU0xOXVKMWdOQ1FUcm9MOUthMG1XanhlUTdQRDdkRC8wMVlGQXdlUWdUR2NBbE9ndGJCTTVUNmkvekEyUDVsYlpEd0NWdVdxUW10cTlRemFINSthb1psMmQ0QUJaRW1YVjd0cW9abnd2cUZYY0FTWVNWVUdXTUZ5ZnFaYVcyRDN6NytaY21sM0NSaElJV2ZHaTZyd0h0RURabG1SU1ZZTnNNN0JFVmgvM3RVQ3g0RnFXM0NCT3dZTXpJYXNGMVhWK3d0OWVIN0ErRTNrU01HYVBYc2hZeWxZWUFGYzRNNEJBNHNnUjNNcnd6T2ZnNEV4akRQVU1sRlNxQ2NIUzd0N3dNQXN5Tkg4K3d2VHR6MGNvTVBoTTNEa1d1RTZPbGphQ25pd0NtVFBvUGw0OUlocEZjc1Z6SDJwZW5WbTRpY0RTMXNCaXlXUUhiQVhON1FPemYwVnNpdFZNK0tUZ2FXdGdHUGp4WTBnLzBFUDlUZW1jQjB3L2NYYXM0Q2xsU09QZHhOV1JobDd5YkwyS3BIV1lYcER2RXBmMjVPQ3BhMkFLMVlCSFRsTndXVyszKzlVWUdrcjRJWUpaQ0F1WmVwMk5RZXQ2MDRPbHJZQ25ta0I2TGwyZHFocUsrQTNtTUd1MmtkQVZWc0IzN2pwSDRxdGRvUDJQNHFBMHNRajA0YUVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDgwdi4yM2E2LDYsMCwwLDEtMy40LDUuNDA2bC0xOS43OCw5LjUyM0E1Ljk3OSw1Ljk3OSwwLDAsMSw2Niw5NEw0LjAyNCwyNS40NTFBMi4zMSwyLjMxLDAsMCwwLDAsMjd2LS4zMzNhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMiw4OS44MTMsODIuOTI4QTMuNzg2LDMuNzg2LDAsMCwwLDk2LDgwWiIgZmlsbD0iIzg1NGNjNyIvPg0KICAgICAgPGltYWdlIHdpZHRoPSI1NCIgaGVpZ2h0PSIxMjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0IC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRFlBQUFCNENBWUFBQUM1RndIQkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFHTTBsRVFWUjRYdTJjVzNQaktoQ0VXODUxdmYvL2Y1N2R6VDJ4T1EraVRUTWFoSlNLSEpPaXE2YWt5TEt0enowTTVJRVpRZ2o0aWRyVmJtaFYxN1VicklaaEdHcjNBRUQ0NWxSWUJPYkFWT0gwTGQ4Qk9kUytVNkJLUjAraGNEd2I1S3hqQnFvVVZnRTVrTWJKeWEwQmkyQU8xRTZPTzhBRjVNTWU0N2s5bm1DMkJuVEJDbENNSzNOVU9ENzhzUktiQTg2bG9vVzZrcmlPY1NXdlV3UTdGT0lzZ0JNd1V3RVZUb0Z1SkFqTGUvblFCd0FmTWQ3ajhTREhUUUdYT0thdVhRTzRkZUlhS1MzcEdJRVliMGlBak0wQVMyRFdOVTFGd3QzSHVFTU9wNmxJb05jWWIwaUFDdm5sZ0xVSjJycEdzQnVNUUw5aUtCeGRvMk9FZWpISFRRRnJxV2ovSHBDN1JyZzlSdmR1a1FySkVRbnNKY1p6RFA2OUZqQU13ekFzZ1pzRDg5NnNjRmRJS2JsSGdydkJDTWR4OW9ZYzZpbkdVa0JDbmliNkplN1ZVbEhmbUUyd1NLbEp1TjhZNGU2UVB2ZUlOTVlJOVlnRVZ3SzBoY1k2Q0ZUY0s0RUZwRlJrTVFnb3c5MGdkKzQyWHVkWVl6b3EyQ055U0FWOHdiVFFjS29BRnNCTndFSUlJYzVsd2NUUkJEOXNRQ29vZEk0cHlYbE5YYk5nRnZBSjR3K2pMdTR3d2dFaklDQndjTFFrRlMyVVhVRUFhZHhwV3Q0aHVYWkFjdTAzcG1BUGNuNHZyOThnWCtFTVNJQkEvUDVoR0NianJWWTgxRGtQU3AzakJNNnBZSS9jTlp1U2U0eVFqL0djZ0wvaThSWnBaVU1vWUpwSkFRQnNTcnBnaFhSYzRwcXVUdTZRWEFQU2hQMktORVVRY0k4RVpTZDlnZ0UrRkdFV093YlV4NWtXRlNDSG8zTjBMV0IwalNzV1R1NTdPVmN3ZFFzb1B3TlRQVk1SYkVVUnNYQzZycnhCcXBCQXFtenE2TDBFblNJVTA0OVo4bUdDV1RNQWVZV3NPVWFWVXNDbUEyV1hZTHJVT3NCZlNETVVpaitrTHFSMUd2RCtId1N3SE14cURrNi95UDV6Q296ZmVVQUMxbitCdUpEVzFOVmxHZWM2V3lrbldnTm1BYXhMcWhJY0gvZ0tJeHdkNVJKTng1TXV4NTZRRnR2ZUZEQ0JXd09tVWpndkZWVVdFaGp2MzVuUThjU3A0UmxwRGFyanp3UDdrbFJjSXYwbEIwd2ZJQlN1YWVVa1VBMXFvaTNCckVwd0ZNY2V4OXN0cHVPdjVOUUpqcFh4SEdEdUx5clhkMGpqVHF1b0YxNzY2dWVmMHBFNXY3VXNYQ2xGN1lOclVTbkJVTm0xYzRGNXNyLzBtb0E1bitnN3dlWlVBeXNDVVpjR1poMzV0QzRKektZbWo0c2Nzcm9rc0M5VkIydE5IYXcxZGJEVzFNRmFVd2RyVFIyc05YV3cxdFRCV2xNSGEwMGRyRFYxc05iVXdWcFRCMnROSGF3MWRiRFcxTUZhVXdkclRSMnNOWFd3MXRUQldsTUhhMDBkckRWMXNOYlV3VnBUQjJ0Tmx3U211eWJXN0oxeGRVbGd3UExkVGxWZEdoZ1ZGc1NzdmhQTXB0NmFnRG1mNkZ4ZzlnRzhNUlF3M2Z0WjJwN3NBV1hYemdGVytsVXREQ0hzQmxPTnVVMnYvRXdBNTkwLzVxVlJ3QlRJZG13cHRjVHcwaE5yZDlWK1JpV1FFcFIyYXRGbUN0cTlSWHZ2ektYbHA4SFc3RDJ4WTJnT1N2dDlhTmllSHlYblRsb0Q1dTNmS3NuQ0hNMXJoR0thYVErQ2Z5YllPZUk1M3JmSXRUVmdxcms5WFI2VVBvUkMwU251Y1g3RUNQTW54dC80OXdQU0h1ZzNUTUVtV2dwVzI2Um0zU01VVTQxZnpyOUxVQThZUWY0QytDL0dYNlMyR0FSajQ1TDFxZWkwU1dQc25GQTR1a1FBZmthUWF5d0k3S09qZlQwSTlrZmlIL0t4NXFaaXRlMkZhQzBVblNMQUxwNERLZjNVSlJZSFFoR01vYW40R045akhkUHhlNUlMVm5CTFlleHVWeUNIZXNQNDJjZjRYbDdYSW1HaEZFN0RGZzl2akswcUhoYk9BNkpqUU83VWE3em10WmJSYmtkZWF4bnRxYU45ckVwUUFMQ3F0UXl3enEwRFV0TUR4SE82dGJZWjBGelBLbDAvQm94TWRjZFdGQTBkVjNUcUpiNzJqdVNXVFVFTDVzSE10VzhxclJNemxSd2IwdWtKU2lFcGxuU0ZPaUI5cm5WTHdlYmNxVFhjY2l1aGFra3E2cmtIeGZRakZNKzFrSEJzZlVtTE5GU2dnR1hGUThVUDVSY3FGTjNodURzaUwrOEt0d1RJYzZnS1JNMkIyVGNybEpaMGhib0dpcFB4aXptdUFRSldRQUgxVk5SZmlxbW5EOHlxOTQ0RXFmZnEwc21PbjAyQXFCSll3SFExd2ZTalcwQSs4YkxBQkxuK0xtRUx3aVpBVkMwVjFTMCtMT1FheHhrYi9kQkJkWmVBSDNKdE15QnFBaWFOdG9CcEd0cHJIOGduYXI2dUR0dllGSWlxT1FhTUQ2RFg5TUh0L0dZZExzVm1RRlN4eWJpekF0bkowUUtwdzBCNmVIdmNISWlhN1o0K3M3enlWaUdVZmZpekFsRS90aTE4RlF6STRFNlgzQnR6blIxR3RRaE01VUM2K2c0WTFXcXdWcVR6ejQvUy8xSEw3YllXaGVSYUFBQUFBRWxGVGtTdVFtQ0MiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNNjYsOTRjLjEzOC4xMzguMjkyLjI1NC40NDEuMzc3QTMuNzUxLDMuNzUxLDAsMCwxLDY2LDk0Wm0uNDQxLTkyLjM3N0EzLjc1MSwzLjc1MSwwLDAsMCw2NiwyQzY2LjEzOSwxLjg2MSw2Ni4yOTIsMS43NDYsNjYuNDQxLDEuNjIzWk05Mi42LDEwLjM0OSw3Mi44MjMuODM5YTUuOTY4LDUuOTY4LDAsMCwwLTYuMzgyLjc4NEEzLjUxNywzLjUxNywwLDAsMSw3Miw0LjQ4NXY4Ny4wM2EzLjUxNywzLjUxNywwLDAsMS01LjU1OSwyLjg2Miw1Ljk2OCw1Ljk2OCwwLDAsMCw2LjM4Mi43ODRMOTIuNiw4NS42NTFBNiw2LDAsMCwwLDk2LDgwLjI0NFYxNS43NTdBNiw2LDAsMCwwLDkyLjYsMTAuMzQ5WiIgZmlsbD0iI2IxNzlmMSIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+"},"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","supportsDownloadThenUpdate":true,"localizedResources":[{"language":"en-us","title":"Visual Studio Professional 2019","description":"Professional IDE best suited to small teams","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-cn","title":"Visual Studio Professional 2019","description":"为小型团队量身定制的专业 IDE","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-tw","title":"Visual Studio Professional 2019","description":"最適合小型小組的專業 IDE","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"cs-cz","title":"Visual Studio Professional 2019","description":"Profesionální integrované vývojové prostředí (IDE), které nejlépe vyhovuje malým týmům","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"de-de","title":"Visual Studio Professional 2019","description":"Professionelle IDE, optimal für kleine Teams","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"es-es","title":"Visual Studio Professional 2019","description":"IDE profesional ideal para equipos pequeños","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"fr-fr","title":"Visual Studio Professional 2019","description":"IDE professionnel, mieux adapté aux petites équipes","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"it-it","title":"Visual Studio Professional 2019","description":"IDE professionale ideale per piccoli team","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ja-jp","title":"Visual Studio Professional 2019","description":"小規模チームに最適なプロフェッショナルな IDE","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ko-kr","title":"Visual Studio Professional 2019","description":"소규모 팀에 가장 적합한 전문 IDE","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pl-pl","title":"Visual Studio Professional 2019","description":"Profesjonalne środowisko IDE najlepiej dopasowane do małych zespołów","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pt-br","title":"Visual Studio Professional 2019","description":"IDE profissional mais adequado para equipes pequenas","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ru-ru","title":"Visual Studio Professional 2019","description":"Профессиональная интегрированная среда разработки, оптимально подходящая для небольших команд.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"tr-tr","title":"Visual Studio Professional 2019","description":"Küçük takımlar için en uygun profesyonel IDE","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"}],"requirements":{"supportedOS":"6.1.1","conditions":{"expression":"not Win10ThresholdBuildNumber","conditions":[{"registryKey":"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion","id":"Win10ThresholdBuildNumber","registryValue":"CurrentBuildNumber","registryData":"[10240.0,14393.0)"}]}}},{"id":"Microsoft.VisualStudio.Product.TeamExplorer","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgOTYgOTYiPg0KICA8ZGVmcz4NCiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0OCIgeTE9Ijk2IiB4Mj0iNDgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz4NCiAgICA8L2xpbmVhckdyYWRpZW50Pg0KICAgIDxjbGlwUGF0aCBpZD0iYiI+DQogICAgICA8cGF0aCBkPSJNNjguODkxLDk1LjZhNS45NzYsNS45NzYsMCwwLDAsMy45MzMtLjQzOUw5Mi42LDg1LjY1MUE2LDYsMCwwLDAsOTYsODAuMjQ0VjE1Ljc1N2E2LDYsMCwwLDAtMy40LTUuNDA4TDcyLjgyNC44MzlBNS45OCw1Ljk4LDAsMCwwLDY2LDJMMzQuMTE4LDM3LjI2NCwxNS41LDIybC0xLjYzMS0xLjRhNCw0LDAsMCwwLTMuNjEtLjgzNCwzLjk0NywzLjk0NywwLDAsMC0uNTMxLjE3OUwyLjQ2MiwyMi45NzRBNCw0LDAsMCwwLC4wMTEsMjYuMzY2Yy0uMDA3LjEtLjAxMS4yLS4wMTEuM1Y2OS4zMzNjMCwuMSwwLC4yLjAxMS4zYTQsNCwwLDAsMCwyLjQ1MSwzLjM5Mmw3LjI2NiwzLjAyN2EzLjk0NywzLjk0NywwLDAsMCwuNTMxLjE3OSw0LDQsMCwwLDAsMy42MS0uODM0TDE1LjUsNzQsMzQuMTE3LDU4LjczNiw2Niw5NEE1Ljk2NCw1Ljk2NCwwLDAsMCw2OC44OTEsOTUuNlpNNzIsMjcuNjc3LDQ3LjIxMiw0OCw3Miw2OC4zMjNabS02MCw2LjZMMjQuNDExLDQ4LDEyLDYxLjcyN1oiIGZpbGw9Im5vbmUiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPg0KICAgIDwvY2xpcFBhdGg+DQogIDwvZGVmcz4NCiAgPHRpdGxlPkJyYW5kVmlzdWFsU3R1ZGlvV2luMjAxOTwvdGl0bGU+DQogIDxnIHN0eWxlPSJpc29sYXRpb246aXNvbGF0ZSI+DQogICAgPHJlY3Qgd2lkdGg9Ijk2IiBoZWlnaHQ9Ijk2IiBvcGFjaXR5PSIwIiBmaWxsPSJ1cmwoI2EpIi8+DQogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2IpIj4NCiAgICAgIDxpbWFnZSB3aWR0aD0iNDAiIGhlaWdodD0iODIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUJTQ0FZQUFBQW1SNWJLQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUVlMGxFUVZSb1ErMmFXM2ZiSUJDRUIxK2FTOU1tLy85M05va2RKMVlmWU1Sb3RTQnM2cllQbW5QMllFblkraklzcUJVYmhtSEEvNnpOVW9kL3JkMVNoMHNVUWdpbGE4T1ZROVVGV0FCeUlXM1hWdURRMkc4aUF4WUtyV29vdEl1Z0Z3RUttTFlhOXBvQ2FlaTVLbVRURUJmQU5zaGcrbGxoZ1FoeGR0cnhlZ2dobENDcmdBdGdteFJiK2F5Z1FJYlIrRXJYZWN4K3JvcUFCazZkSWxRcEZGQ2h2Z0I4cG10ZnlEb0RRQWpCSFdvWDBJR3pZTHNVZS9tOFEzYVQrVWU0VXdwZUEzSU9qcm5xRFhWdGlCVk93ZllwdnBrZ0pCZi9BUm51QThEUlhOTlE2SWxtZ01rOUM4ZWJFK1lld0YxcTd6R0ZKSVRDSFRDRnMzazV1bWcxQVhUV053VzhTL0dRNGxFK0U1S0FBMksrSFJIaHR1azNPZVNmeVBtbzk1ekpHMkxQdlcrSWNJOHBuZ0I4VHkxQjc1QW55Um5aT2Q1REhkV1pQNEcwZVZqS1FaMFVCTHhIaFBtUjRtZHFuekFGQktJN0I4UmM1ZkV4SFN2Y29rYkF3c3pkSWs4SUJYd0c4SUlNK1pqNmNIZy9rT0ZPeUxBNnl5SHRxS1ZaN0UyUVBYTHVjVmdKK0lJSStJQU1TTGNDc3BOMkNhSUcwODVVR21JdkIrbmdFN0tMejhnT3FtTUVmVWVHczI0dHdnSHRrNFF1S2lSQmZ5STZ1RU84MlJGeGtuRDJlb3V6UmxVdFEweEF1c2lsNVhzS3p1SXQ4aVBzaUF3SHpLSE96cm5sZFZCVWc5UUZtbkdYK3ZLWjZ6bW5DN01MVlh3V093dDB5VWtGMWNmZEh0a3RYVUk4NXp6SXBrbmlRVzVNTU9FSnVwTUl5UCtVVWltWUIxWE5RN3RZenRZbHpHRjFvV1ZZMXlrdno1cWNvMG81Q0V4djVnMjd3dkVQOWR5N0dFcGxIZlJrNGJ4VThGUURhWVp0QWZUa2dkVkFiK3BnaTBwdzNib0c4R1l3bnE0Qi9LdGFBWHUxQXZacUJlelZDdGlyRmJCWEsyQ3ZWc0JlcllDOVdnRjd0UUwyYWdYczFRcllxMnNBTDNxMzBxdHJBRDNkRFBwYVFPOHRWUW15OXZwdVVTMkF0ZGRudGRkcE5aQm0yQnFnM3R3QzJwZmgrdjVaNWJtM0NLV3lyNEE5Tnl6VUY2YUFoTk8rVkFtd0dWWUJCK1F2ZUU2ZEViZTN1Tjk3UXQ3MzVZdDFoYVZDdXJhQkQxZUYzQUhBTUF5RDdKVjR3Nm1iME56elpmdUJES0R1QW5PZ0RjcXdiaTZYM3ZKN2NGcDdjSkRZSTk2QVcyRjBXZDJzd1kxcUthb29PYWUxQis4cFhoRjNtYmFwdjI0bUtpVGdPK25sNDh4Rno4RVNJSjE3QS9BTGNYK08zLy9FZkFQN0JOOUpMdytMcWcyeEF0SzlOMFF3RmxDRTFPOEQ4dzN0UXpwUE43M0pvNjJybGlHbWUrL0lOVE5hUEhHQ1h4THdscjVqaDl3dVE5ck9OQUxLVFBZQXRZS0RoUk1Ec3J0MDFoWlZ2S1gyQ0gvSVp6blhXdlZ4UnZ5cmRJZzVBNEg0dzRRL29GNlc4b284M0FySkNWUlZhWklBMlVHYjBIU1g0TzlZTHV5aGs1cVQraFFhSGFzdU04NkNyWkQybk03c2x0SW81aU9mUURNNFR6TUhFeVFQZFJocXVkbGFYSGJFM01VcVpHMi9XSWVheDNiNW9ZdUUwMW9GKzhkb2VJQXVwQXRvWmpRdy9TSG1EaUczSmpSZnRhOCt6MTMzdktLS2FwSHREVXRFOVhoQVpITkJtcXFBRjBEdFp3VUVNcVRYamc1MkFWSUZVQXVsTFg5OE1LSG5xbVhLRndGU1RwMk4xNnFHUXZ0bkM3MnRET2g0MmprSG1GbTZCRVoxQVZvVmdBRzBBMW45VWNCYnFPWC94ZjlVdndFRXhuUTEwSmJTZmdBQUFBQkpSVTVFcmtKZ2dnPT0iIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNMTUuNSw3NGwtMS42MzEsMS40YTQsNCwwLDAsMS00LjE0MS42NTVMMi40NjIsNzMuMDI2QTQsNCwwLDAsMSwwLDY5LjMzM1YyNi42NjdhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMkEyLjIxMywyLjIxMywwLDAsMCwxMiwyMy44VjcyLjJBMi4yMTQsMi4yMTQsMCwwLDAsMTUuNSw3NFoiIGZpbGw9IiM1MjIxOGEiLz4NCiAgICAgIDxpbWFnZSB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEwMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyIC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCbENBWUFBQUNHTENlWEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFMVDBsRVFWUjRYdTJiNjFiYk9oU0V4N1JBNmUyYzl2MGZzcWZjQzhYblJ6VFJlSHZMbGhJNUpJcG5MUzNuWXFETng3Nk5STmYzUFZhMXE0dTVHMWFkdGo3TzNiQnFySzdydXJsN3FQNmRVK1FLT0ZNTzFDekkrbVh2QVhzRm5DR0JxMWY3bWxVdjF4NTRIOWdyNEFrWnNGTUxjclZndmJXRnZUVG9GWEJDRHR3THVlcXlvQlhrVzFpOWM5MTg4NFZCcjRBZEJiaTZDUE9EV1JZME1BVDdCdUN2dWVwYUhQUUsyTWlCUzVBZnpickVFTFlGL0Rlc1YxbC9aUjBFOUFwWVpPQnExRjVpODFsZHlicVV4WHVCRFN4Q2ZNRUc3SXRaQkw4NDZCVndrQU9Ya1VtSTEyRjlraXRoTThvN3hPaDlCZkJuWXRuSVhnVDBDaGl6Y0JYc1p3QTNjaVZrUmpFQk0yci9BSGdPNnlrc1B2K0RHTkdMZ1Q1N3dBbTRyTEZYMkVDOEFmQWxySy9oK2ptc2E4UjZiQUVyMkVkWkNudFIwRjNtZlUwcUF5NmpsV0MvQWZnZUhuOUZqR1RXYUdBRGcrbjVHUkhxZzF6NWVCZlEyMWs2Qi9MWlJ2QU1YRTNKQ3ZhZnNBajVDemFBV1ljN1RBTytEK3NCMDZBSjIrdTgyYVdqNjdwWnlHY0plS1piWmxvbVhJTDlOeXhDL29ZWXdWZllmSmJhWkRGRnB3QmIyTHlQYWQyQ3ZrQUVEV1E2WW1jSE9PRlFlV21aY0FuMkI0YVFHY0ZzdEFpWVl4SUJLMlFMOTg2OFJ0Qlg4QnN5L2JjemJRTlNvNjNPQ3JBRDEydW9QTGcvc1FIOEE4TVUvVGw4RFp1c0MwVEF0dEY2RFBjL1lQT0xjUitlRS9RTkl2aHJSTmpXTmV2Qzl3Wk04K1ZGOFZrQkRySnBtUVlHNFg3Qkp2MHlMUlB1VDhUby9ZWllmNi9EOTlBYWJHZmhtN0NlRUNHekM3K1Q5emxqYy9UaTkxWFBtMkt6dGUyeXU2N3JMT1N6QVN4MTE0TjdqVGdLS1Z4R0xlSCtpMDMwY2t4aTlCSUVwVzdXRlRhUnpNYU42OFk4bndLcjZwM0ZlODR6Z2hNZE05UHlIRnl0dlpxYTJWeHBlcVlZV1c4WWxnQmQxL0tZVUQyd0dxbk1ETW5SeVVaeDg0QXp4aUdGcXgyendyV2pFU09PWU5TTEJvWlErUE5lRVNFcVRBOG9RZXBtaFoyUHVmVC94Ni9mcW1uQUdSWmthaHl5SGJNMzk3SnoxdVpIMVlmWDMrUWVyYVVLUkpzeTdiNmZNTnpZNEMrR2ZpLytETmIvZ1pvRlBCRzVUSStmRUIycUhMaXN1UXAzcWdIcTVKcHFqbDR4M0pYU3FMYkxRdVVWR1A5eWJhVnBwUmxsV0pEYU1YL0gyTXpRYmxsckx1dm1GRnpJYTUzejNJdDA3WWJ0ZFZ0Zmc3eWZOWHdoam9QdEFaNXhxVmh6VTJuWnE3bTJvVXJCVFVXcVB0WkdTVk15WGF0bkRNME5hMW1PTmgvbTFCVGdESmRxcXVhbUdpb2J1YmFXUXE3MmcvY2FKdDFHZkVLMEt1L05VcDlhM2F4WCtGMzBWazEyMFRNdWxUWlVUTXVha3FjaVY3dmxWT1FDNDJoVnVCWXNiY3M3QUxjQWZvZjFuenkrRGU4VE5DR3prN1p3M2FodUJuQ1FUY3ZhVk5tYW00cGM2MUpadU5veHArQjZxZmdQb21XcGNQK1Q5UXNSOEIxOHdFVXB1d25BR1M2VldwQjJBMEVCSzF3OXJiRUxYSjFmMVk4bVhFYXNCL2NXTVUzcnBvUHVGelB0OTJZTmRQS0FNMTJxejVoMnFiUmpWcmc2dHRpMHJCK21UY25jVGRJdFE5WlpDL2VYUEU3QnpUa0lBQUNqRFllVEJselJwZEp4U0NPWFRaWFhJZXRqL2JDOWV2dUFjYjBsV0Y1dFd0WTk0UlRZMUNpMTFja0NydVJTc2VZcVhEMWo1WFhNMUZ3enhaUk11TnBJS2R5cHRHelRjV3BHN29GeDlBSW5DbmhCbDJxdVk2WnltaW1ia3IybzFjaWRndXRGcTliK2RrNTBaTHBVSGx4ZEtaZHFGN2hlTTBXNFRNbGFieFV1UjZGN0RHZGVDemNKRmtqREJVNE1jRUhONVVHNWZXZGRGVDlFVzI5Zk1UWXV0Tjdtd3MwWmd3WWc1dzdjQVNjRU9NT0N0S2NnNStCNnMrNlVpZUhWVzhMbHFVaTZVRHJmS2xqVzNKU0o4WUp4dmRXb3pZS3FPZ25BaFJZazRYcWpVRTdrMHI3dE1JeWNxWG83MVV3cFlOdE1FUzdISUoxdHQ1RmJDbFYxOUlBTExFZ0xsNUZyeDZFNWw0by95NE9iWTE3WVpvcVBiekhkS2F2SHZJM2FmZUFDSndBNHlLYmxsRXVsYVZrUHlWa0wwbk9wdE9acXZlMnhtM21ScXJjNjR5WmRxWDNCVWtjTnVOQ0M5RXdNQld6aFRuWExXbTlMelFzRlc5Sk1WWWNMSERIZ0NoYmtEd3pocGc3S2VkRnJtNm5jZXF0WHJiZjNpSTJZZGFhcTFWdFBSd200WUJ5YXN5Qzk0emFFUzM5Wk5kZE1sWmdYWHIwbFhLOVRyZzRYT0VMQWxTeklPU1BEcHVWZUZqLzhHdWFGNXltUG5La2x3RkpIQlhoQkM5SnVIbmhwZVNuell0S1pXaEl1Y0VTQU15M0lmUS9LZVhDMVV6NkVlYkZZdmZWMEZJQXpYS3A5RDhwNURkVSt6WlFDUHJoNVVhSjNCMXpvVXVYQTlRN0syVmxYNFo2Y2VWR2lkd1ZjNEZMVk9pZ0hqRHZsa3pNdlN2U3VnSU5zV3ZhTWpGMFB5bG13UUFSTHVDZG5YcFRvM1FBWHVsUWxCK1Z5SXJlazN1cjFLTXlMRXIwTDRBb3VsZTJZUFgvWnpybk5tQmNsT2pqZ2lpNlZkMURPUm02cVV6NXA4NkpFQndWY3lhWEtPU2lua2F2T1ZCUG1SWWtPQm5oaGwwb2pGL0RIb0diTWl4SWRCSENtUzdYdlFUbU4zRjJhS1FWODFPWkZpUllIWEZCemM4OVNwVndxSUVhdVYyK2JNUzlLdENqZ0RBdHkxNE55SGx6QWI2YWFNeTlLdEJqZ1Fnc3k5NkJjNnFpTjdaU2JOaTlLdEFqZ0FndHk3cURjbkVzRnBKdXBaczJMRWkwQ09NaW01WlJMcFduNUo2WXRTSGJNMXNBZ0NJNHdUWnNYSmFvT3VOQ0M5RXdNMnpFcjNGUmFwdWx3RnVaRmlhb0NybUJCL2tDNjdtcERwYnRCbm5seGgyRjluWUo3Y3VaRmlhb0JMaGlINWl4SVBRVnA5M1FCZnd5eXpaUUg5aGNhTVM5S1ZBVndKUXR5eWwvV2hrcmgydmsyQlZjajkrVE5peEx0RGZnQUZxUzZVem9HZWVaRkNtNnFtVHBKODZKRWV3SE90Q0JMRDhyWmhnb1l3cldkY3FxWllrcitqY2JNaXhMdEREakRwY285S09kMXk1cVdDZGZ1NGRxZElLMjFGdTVEV0UyWUZ5WGFDWENoU3pYWFVFMmxaVWFYWnp1V05sUE5tQmNsS2daYzRGS1ZISlJMd1UxMXlydnNCRFZqWHBTb0NMQ0JPMmRrekIyVXN6dERIbHoxbFBmWkNXckt2Q2hSTnVBRTNJOUl1MVE1QitYVXhPZ3dISU1JdDJRbjZCYXgzdHBtaXAxeXMvWFdVeGJnek1oVkl5TmxRZEpmOWh3cTFrUENmUXhyMTUyZ1p3enJiVFBtUllrbUFUdjFWc2NoYTBHbVpsMEM5allQMkMwVExqdGxiNXZQZHNxMjNqYTNFMVJEU2NBSnVIU292TWlkTXpJMExWOWpHTGs2NDNyTmxBWHJOVlBON1FUVmtBczRNUVpOcGVXY1U1QWF1WVRMdEttZGNtNjliWDRucUlhbVVuVEt4UERPVXFVT3lsbTQybENwZ2FGd1M3YjVtdDRKcXFFUjRFVDBsc3k2VE1rSzE4NjVUTXUyVTdiMVZsUHoyZTBFMVZBcWdsUFI2NDFEdXYzSGxkclBCWWI3dU53dzhKb3BCWnd5TDVyZUNhcWhBZUNacnBtMTl4UEdQck11UmkzaFhtTG9LK3RXbjdlSGE2TTNaVjQwdnhOVVExNEVkL0hoeU5Ed1VqVHJNSSsxV25lS2NCbGxkc1BBc3gzbm1xbXoyQW1xb2JrVWJWMHJiYkkrSVVZei83clBPNEh4SnN2YkRkS28xU2oybXFtejJnbXFvWnd1Mmh1VEZQYWx2TVlPR1lqcDJJNUNVMm5aMXR2VnZOaFRPVlpscWk3cmN5Qis0Qng5T214Z3NHT2VHNFdZcWxmem9xSnlBUGR5NVNKSTNkTGp5UE1oM0VQSU5uclpOQkV1UWEvbXhRSktBZTR4Qmtxb0JLb0doYzY0YktRK21PZFBpTkZMd0wvbCtXcGVMQ0FQY0k5b1JpaGNqZFFuYktEcTN3ajE0UjYrcDkzek15SmcxbDlkM3ViOGFsNVUwQUJ3My9kOW1JVTl1Qit3K2VEWlRPa2VManZrUjhTL0g5S05CTjBoSW1SR3JEZmZydVpGSlUzVllGdHZYeEM3YWUyVStkNFR4b2ZtR05WOG41QUptbnUrT3Q4UzdtcGVWTkJVRFFZMkh6RHI2RlRIL0FUL1R6c1p3YXpYSEhrZTViR1hrbGZ6b3BKR2dDVk5BeEhrNEJaRWNQWm9qVWF2cG0vZXgzdWY1YmxOeVdzelZWRnVCQWZJZkxxdGZ4alhaUVdzWm9jQ1pwclc3cHRMall1MTNpNmd1VGxZUDJCTm16b0h2MkRZZUtrSkFveEhMRjd0Ykx2VzJ3WFV6WDJPaWYxaGExOWVtTFVOZi9pL0ZHL3d3YTRwdWJKbUFRTWp5THhxcEY2WXE5N2JZd2o1VFI3cmUydlVMcUFzd0ZRQ3RGMzZQakNzMzNadDMxL2hMcU1pd0pTQUJzWlE5VDFWNzExWHNNdHFKOENVQWIxOTJYa05HRFpzSzlnRGFTL0FWZ25nVzYxUUQ2K3FnRmNkbnk2d3FtbjlEL1FHdkxnc0FUTDVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDE1Ljc3VjE2YTMuNzg2LDMuNzg2LDAsMCwwLTYuMTg3LTIuOTI4TDE1LjUsNzRsLTEuNjMxLDEuNGE0LDQsMCwwLDEtNC4xNDEuNjU1TDIuNDYyLDczLjAyNkE0LDQsMCwwLDEsMCw2OS4zMzNWNjlhMi4zMSwyLjMxLDAsMCwwLDQuMDI0LDEuNTQ5TDY2LDJBNS45NzksNS45NzksMCwwLDEsNzIuODIzLjg0MUw5Mi42LDEwLjM2NEE2LDYsMCwwLDEsOTYsMTUuNzdaIiBmaWxsPSIjNmMzM2FmIi8+DQogICAgICA8aW1hZ2Ugd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMDEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiA3KSIgb3BhY2l0eT0iMC4yNSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUJsQ0FZQUFBQ0dMQ2VYQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUw2MGxFUVZSNFh1MmQ2M2FiU0JDRWF5UWx6bVYzMy84OWQ1UFljV3oyQjVRb1N0MHpZRXV5THZRNWZXYTREUW9mMWRNMFBxRjBYWWZWYnRjMnJSMVd1MjdidFhaWVlxV1VVdHZlcmVIaTdGYmVjODBUb0Jua3lZbFcyT2V4TnluWXdKYWtkZXUwNVJBcjZOUGFJc0FDVmx0MzNRNU13YXIzTzY2Z1QycXpRblFDZG9NUjZzWmEzVmVodmc3ZVNic0h2a0krdmxVVkhJUmloN2tCc0pYK0JsUEl3QlR1eStDdjVoMkFycFN5UWo2eXBZQk50UXBYb2U2R1BsdXUxM0JOaUM4QS9rakxmcEY5MXBCOVpBc0JCM0JWbllUNWFlaC9rajYzRVRMVlM2RFA1Z29ha05CZFNpa3I1UGRiTFVSSHFsV2duOFVmWk4wT1U4Q3Y2Q0grSHZ4cGNDNXYwTU11bUlKZVEvWVI3QUN3cVZmaEt0aUh3YjhBK0RxMEQ4TzJUeGhWM0tHSDlvd2U2dVBndjRaVzFhNlFDUm9yNVBkWnBtQ2ZkeGwrUDZPSCtRWEFOL092R0NGVHhRelB6eGpCL2h6Mis0RnBTS2VTYWV1OGZBU2JBRTdtWGlaUFZDL2gvaVgrSFZQSW56QlY4RytNY0gvSVBxcDJUYzZlc2M3TFI3Rkl3UkZrenIwTXoxL1JRLzBMd0Q4QS9oNzYzOURmQUorSDQ0QWVGTVB6RDB5VlRzQ2FnVWNoRzFnaHY4bGFJVnJuWUZleFF2NGJQZWp2R0FGdU1RTDZqUjR3YndBcWVDZnV6OU9FckxZbVh3dXRWYW9rNUlJcFpGVXpRelpoZjhjSXNLQlhIcE1zd3RjUTdTcld4RXZEdGhaSTF1UnJwdTBCSjRXTi9XWk1MM2owNktUQXZ3N0xXNHp6OEJQRzBNendySUFqRlN0Z0Q5ZHI4alhEV2dwVzZ4SlgwMGVxQjR6WjlDdEc1U3Jjblhta1pJZE1XNU92R1JZQmppQnF1VkZMalY2VmVzRUlYUit2Z0JHc1ExVzREbG9CYjlEUDVhN21kVjZ1MkI1dzEzV2R2VndBRHVFK1k2eEdhZEdDWVprVktpMC9VdFZBRzJ5a1lwK1hQV1N2UlpHS1pTSGExVXUxN3RCRC9HVCsyVnkzT2JRTkR1SHRyQjhkazgzTHdGb1VTUzBMMGN4K3FaSU54bnF5WG1nSE5HZE8vWXdwTkFlZEhWY0R2QlpGRXBzQWxqRE5DMFBJZnhCbjFacGRSOHJNQVBsTlVqdDJqcHJYb2toaXRSRE45blhvKy94TXE0R09ZTENNdVV1T3lSUmRBMDNJYW12eWhRQ3dKVnNLK0EvaVJ5TmdDa3BWNlJDSzlMZkJjVFhZbVhNOFBjZGFGQmtzVlBBQWViOG9iUmNzQTdHS004RHFEaWdDWEp2ZmErZFlpeUxJUTdSRDVsdzgyV1ZvaTdRWllMOEJIUEpPMW1kcXprSzFoMndkbTNhM3lWY0tHRWlUcnJsaDJpKzRBdVQrYkFtcHBtUlZzZmNkOEFiOTQxeWs1cnVDWEFVTWpDRnRVRE1mb1lCK1RnYnE2blJWTzJodEZiS3FtNkJyY0JVeTI0SnA1WXUvOTY2U3J5WmdtcW1aaWRlK2lvUVlxc1BONE90K08rblhsTndDcmVlbDNWM3lOUnN3Y0FDNXd3ZzRnNmNBRmFJRG9QTVZveXA1RHVnTWJuUmozVlh5dFFnd01JSDhpdjRDcW9wcEdlZ01zSUp3eU5FeEdkeldzektkZHZQSjEyTEFRSnA4UlhPeUxpdk1HdUFJc283aDhKWUEzdURPM2tpOUNUQVFQa1lCNHhzbnRSYmdDSGpCOUZrM0c2T2w0QWgyTWIvcE4xSnZCZ3lra0dtdXZBaEtCamM2MXRmVlFFZkFhK2NDYnZTTjFMc0FBMDNJUUE2NmRjSFpNbHhIa04wejBITUEzK1FicVhjREJsTElCZU5ibmhaY1ZhUURMaGlWeUg0RXVnYVhnR3V3Yi9LTjFGRUFBeUhrMmlOVXBxWk5jZ3lOa05uNnNSRnNMNUJrcWlaa3RhdFB2bzRHR0dpR2F3Y1JnZWZCM3VyeEJGTzdhVnl4TGZjSVVuQWpSWkdqQWdZbWtCVndCak9DMU5wSDk2T1NnU2trVjdKWHZsVFZXVFFoWk9DS2s2K2pBeGJ6a3VaY2FBb3BnZzZNaVpkQzluRWlCV2VoMmtPMm53KzQwdVRySklBSEZSY2NsalRWaXJRWjZHaVpyb25YQm5ueUZhblpGUjBCM3VBR2lpSW5BUXpNcm5acFB3S2RlWFFEUkVwMndEVzQyYnlzZm5WRmtaTUJCbVpYdTk0S1ZtK1M3ZEJtKzZpQ28zQmR5NjU5VE9DS2lpSW5CUXcwTTJ1MXVZQ2pDKzdyZFR3Zk13TzlCUERWRkVWT0RoaG9RczRVcDBDeUM2NjJrMjBPSlJvdmd6dEh6VmRURkRrTFlLQUpHY2lCMU5Ua0R2UlFmRjAwOXRiNkhxNXJvQWxaN1NLVHI3TUJCbzVXMG94QXE3bUNIYmlQNHdwdU9jZldjMXhzVWVTc2dJR2psRFFqRmZ2eHNHUG1qTzBoZW1lZWhXdUZERnhZOG5WMndFQXpYRHVBQ0V3R2JUL28wTy9zT0NBK0psSnlGcW85WkVmbnZwams2ME1BQTR0TG1xcmVKZEJoMnhpdUVSeWZxVGw3blBLb2NwRkZrUThETExha3BMbXhmaFF1YXdvSFlpVkhnR3R3czNsWi9TS0tJaDhLZUZCeFFidWtHWUd1dVVPRnJkYytnckZyNFhyT1k1U08vYUZGa1E4RkRNd3VhVG9JRFkydEM2em1ZRGZvcjBGMjgyU2dsd0QrMEtMSWh3TUdacGMwZ2ZtQS9VSTcxT3pHaVFDemplRE9VZk9IRmtVdUFqQXdPN091S1N4VGtoci92ZHpPUGkrMDN4QU9Xcy9wYzNUMld3aFo3V3pKMThVQUJwcVFnUngwQmpkU2NBUzVCTXZST1Z6QkxlZVkrcHZPV2hTNUtNREEwYXBkZmxIZE9POUM5aWxvS3psU3NhcFpWVjI3NmM1V0ZMazR3TUJScWwxY3oyUDBXRjIzbFQ3WDF5SUF0N3RTczFEdElWdkhvWjAwK2JwSXdFQXpYRHZjREFhQ1phN1Rkb040SFpjZGNLYm03SEhLSTh2WmlpSVhDeGhZWE8yS1FMVDJjYWphWnVzaXdEVzQyYnlzZnJLaXlFVURGbHRTN1hLNDJUeEljTEJqdU53TjYzUmVacXRqMThMMW5NY28vUzFITDRwY1BPQkJ4YnpndFdvWDJ3eDBheHVOVUl1MEROZE16blFNRDlVT2VnbmdveGRGTGg0d01MdmFwZjBJWnVRUllHQUtXZGZWeHQxS0c4R2RvK2IwNnpPMHBiQ3ZBakNRSmwzSC9BTStQZDRWck50cDJibTIxdmR3M1FLdGtQY2hlekRlNlAzQ0ROaFhBeGhvWnRacWN3RXJhRWdMMlVaalA3bzVvbk81Z3VlNGo4MThvek1IQkhZTjlGVUJCcHFRV3hlK05nOUNXdG9tV0srZ2dmcTg3Q3BXTmM5Snd2amZNbFBKRGhsb3pOTlhCeGhvUWdicUZ6eUNxKzdXZ2h5Tm9lZDJsWHFvemg2cm5qRDlqOVlKdXNNVU5sQ0JmSldBZ1JSeXdiS1NaZ1NhcHNzWjVJS3BtaUxBbVpvakZUdG9mdjVQdi9INE9vd2R6czhPK1dvQkF5SGtwU1hOU0lHdy9nN1Q5V3oxK1ZqSDBlTWp3RkhDNWJEWjUrZi85TE1KK3RWV3dDREQ3S29CQTgxdzdSYzZnaDdkREJIMExRNnphMWpmbGU3bjhqQWNoZTNJbjNENGIzakJDSlFoRzY3aXF3Y01UQ0RQS1dtcWV1ZEExL0VnMi9VUktvSk01ZXU0V2NpdVFkL2FNZnFiT0EvcmI3MmRFQjBZRXhDZ1hkTGNXTjh2WWczMkhNaTE4L3E1dkIrMVBJY21XYS9EOXR0NVRNck1xbDBkVHZzSGZFWGFDREw3YXRFNGtQMDZjMTNIaE9yRlhNZUx6bms3Z0lFRHlFQmMwaXkyN0NySzRFYkhjVGtEcS9zQmRXRDZMYXJzaStucS9odjNwdlB3VFFFR2tDVmR4L29EUG1CNk1SMnlHdmRUK0J5WGM2eC9sdWdCMHkvRTZjZkVkQzZlQUszWnpRRUdVc2cwVmFUQzFBUW5VM0prQ3BuV0JhMkhYMXAwby9tTkZZMmRMVTlLbHpjSkdHaENCbkxRR1Z4M1dtZjdjVjBVamx1aFY2dFc3bHF1MUpibkMrMW1BUU1wNUlKbDFTNVhreHVmajZsa29BNVhQdzM0SzNGK05wQ1ZMQzkwUkxCRHlEY05HQWdoTDYxMktWaFhib2ZwL0Zod0NQY1BZcmlQR0Q5NS94K0FmOFgvRzliL3dBaWMzNFZVcFN2Y0VQTE5Bd2FhNGRyaFppR1o3aGVVU1pBRFptaWwraUxsRXFJRGR0QS9NU282ZXdFQkFBZXZEdThDTURDQlBLZmFGZmwrS0l3S2ZjSDRuZVN0N0tQS1paalZyN1greEZTOWtSTSs5NldLUFZTbjZnWHVDTENZSmlldGFwZkQxZU01ci83RytCVnpLcGpibm5Hb1dvZXJyVVBsTVU4WTRSS3d6c01BRHRVTDNCbmdCZFV1dHBGNkNaZGg5d3ZHTU0xOXVKMWdOQ1FUcm9MOUthMG1XanhlUTdQRDdkRC8wMVlGQXdlUWdUR2NBbE9ndGJCTTVUNmkvekEyUDVsYlpEd0NWdVdxUW10cTlRemFINSthb1psMmQ0QUJaRW1YVjd0cW9abnd2cUZYY0FTWVNWVUdXTUZ5ZnFaYVcyRDN6NytaY21sM0NSaElJV2ZHaTZyd0h0RURabG1SU1ZZTnNNN0JFVmgvM3RVQ3g0RnFXM0NCT3dZTXpJYXNGMVhWK3d0OWVIN0ErRTNrU01HYVBYc2hZeWxZWUFGYzRNNEJBNHNnUjNNcnd6T2ZnNEV4akRQVU1sRlNxQ2NIUzd0N3dNQXN5Tkg4K3d2VHR6MGNvTVBoTTNEa1d1RTZPbGphQ25pd0NtVFBvUGw0OUlocEZjc1Z6SDJwZW5WbTRpY0RTMXNCaXlXUUhiQVhON1FPemYwVnNpdFZNK0tUZ2FXdGdHUGp4WTBnLzBFUDlUZW1jQjB3L2NYYXM0Q2xsU09QZHhOV1JobDd5YkwyS3BIV1lYcER2RXBmMjVPQ3BhMkFLMVlCSFRsTndXVyszKzlVWUdrcjRJWUpaQ0F1WmVwMk5RZXQ2MDRPbHJZQ25ta0I2TGwyZHFocUsrQTNtTUd1MmtkQVZWc0IzN2pwSDRxdGRvUDJQNHFBMHNRajA0YUVBQUFBQUVsRlRrU3VRbUNDIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6c29mdC1saWdodCIvPg0KICAgICAgPHBhdGggZD0iTTk2LDgwdi4yM2E2LDYsMCwwLDEtMy40LDUuNDA2bC0xOS43OCw5LjUyM0E1Ljk3OSw1Ljk3OSwwLDAsMSw2Niw5NEw0LjAyNCwyNS40NTFBMi4zMSwyLjMxLDAsMCwwLDAsMjd2LS4zMzNhNCw0LDAsMCwxLDIuNDYyLTMuNjkzbDcuMjY2LTMuMDI3YTQsNCwwLDAsMSw0LjE0MS42NTVMMTUuNSwyMiw4OS44MTMsODIuOTI4QTMuNzg2LDMuNzg2LDAsMCwwLDk2LDgwWiIgZmlsbD0iIzg1NGNjNyIvPg0KICAgICAgPGltYWdlIHdpZHRoPSI1NCIgaGVpZ2h0PSIxMjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0IC0xMikiIG9wYWNpdHk9IjAuMjUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRFlBQUFCNENBWUFBQUM1RndIQkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFHTTBsRVFWUjRYdTJjVzNQaktoQ0VXODUxdmYvL2Y1N2R6VDJ4T1EraVRUTWFoSlNLSEpPaXE2YWt5TEt0enowTTVJRVpRZ2o0aWRyVmJtaFYxN1VicklaaEdHcjNBRUQ0NWxSWUJPYkFWT0gwTGQ4Qk9kUytVNkJLUjAraGNEd2I1S3hqQnFvVVZnRTVrTWJKeWEwQmkyQU8xRTZPTzhBRjVNTWU0N2s5bm1DMkJuVEJDbENNSzNOVU9ENzhzUktiQTg2bG9vVzZrcmlPY1NXdlV3UTdGT0lzZ0JNd1V3RVZUb0Z1SkFqTGUvblFCd0FmTWQ3ajhTREhUUUdYT0thdVhRTzRkZUlhS1MzcEdJRVliMGlBak0wQVMyRFdOVTFGd3QzSHVFTU9wNmxJb05jWWIwaUFDdm5sZ0xVSjJycEdzQnVNUUw5aUtCeGRvMk9FZWpISFRRRnJxV2ovSHBDN1JyZzlSdmR1a1FySkVRbnNKY1p6RFA2OUZqQU13ekFzZ1pzRDg5NnNjRmRJS2JsSGdydkJDTWR4OW9ZYzZpbkdVa0JDbmliNkplN1ZVbEhmbUUyd1NLbEp1TjhZNGU2UVB2ZUlOTVlJOVlnRVZ3SzBoY1k2Q0ZUY0s0RUZwRlJrTVFnb3c5MGdkKzQyWHVkWVl6b3EyQ055U0FWOHdiVFFjS29BRnNCTndFSUlJYzVsd2NUUkJEOXNRQ29vZEk0cHlYbE5YYk5nRnZBSjR3K2pMdTR3d2dFaklDQndjTFFrRlMyVVhVRUFhZHhwV3Q0aHVYWkFjdTAzcG1BUGNuNHZyOThnWCtFTVNJQkEvUDVoR0NianJWWTgxRGtQU3AzakJNNnBZSS9jTlp1U2U0eVFqL0djZ0wvaThSWnBaVU1vWUpwSkFRQnNTcnBnaFhSYzRwcXVUdTZRWEFQU2hQMktORVVRY0k4RVpTZDlnZ0UrRkdFV093YlV4NWtXRlNDSG8zTjBMV0IwalNzV1R1NTdPVmN3ZFFzb1B3TlRQVk1SYkVVUnNYQzZycnhCcXBCQXFtenE2TDBFblNJVTA0OVo4bUdDV1RNQWVZV3NPVWFWVXNDbUEyV1hZTHJVT3NCZlNETVVpaitrTHFSMUd2RCtId1N3SE14cURrNi95UDV6Q296ZmVVQUMxbitCdUpEVzFOVmxHZWM2V3lrbldnTm1BYXhMcWhJY0gvZ0tJeHdkNVJKTng1TXV4NTZRRnR2ZUZEQ0JXd09tVWpndkZWVVdFaGp2MzVuUThjU3A0UmxwRGFyanp3UDdrbFJjSXYwbEIwd2ZJQlN1YWVVa1VBMXFvaTNCckVwd0ZNY2V4OXN0cHVPdjVOUUpqcFh4SEdEdUx5clhkMGpqVHF1b0YxNzY2dWVmMHBFNXY3VXNYQ2xGN1lOclVTbkJVTm0xYzRGNXNyLzBtb0E1bitnN3dlWlVBeXNDVVpjR1poMzV0QzRKektZbWo0c2Nzcm9rc0M5VkIydE5IYXcxZGJEVzFNRmFVd2RyVFIyc05YV3cxdFRCV2xNSGEwMGRyRFYxc05iVXdWcFRCMnROSGF3MWRiRFcxTUZhVXdkclRSMnNOWFd3MXRUQldsTUhhMDBkckRWMXNOYlV3VnBUQjJ0Tmx3U211eWJXN0oxeGRVbGd3UExkVGxWZEdoZ1ZGc1NzdmhQTXB0NmFnRG1mNkZ4ZzlnRzhNUlF3M2Z0WjJwN3NBV1hYemdGVytsVXREQ0hzQmxPTnVVMnYvRXdBNTkwLzVxVlJ3QlRJZG13cHRjVHcwaE5yZDlWK1JpV1FFcFIyYXRGbUN0cTlSWHZ2ektYbHA4SFc3RDJ4WTJnT1N2dDlhTmllSHlYblRsb0Q1dTNmS3NuQ0hNMXJoR0thYVErQ2Z5YllPZUk1M3JmSXRUVmdxcms5WFI2VVBvUkMwU251Y1g3RUNQTW54dC80OXdQU0h1ZzNUTUVtV2dwVzI2Um0zU01VVTQxZnpyOUxVQThZUWY0QytDL0dYNlMyR0FSajQ1TDFxZWkwU1dQc25GQTR1a1FBZmthUWF5d0k3S09qZlQwSTlrZmlIL0t4NXFaaXRlMkZhQzBVblNMQUxwNERLZjNVSlJZSFFoR01vYW40R045akhkUHhlNUlMVm5CTFlleHVWeUNIZXNQNDJjZjRYbDdYSW1HaEZFN0RGZzl2akswcUhoYk9BNkpqUU83VWE3em10WmJSYmtkZWF4bnRxYU45ckVwUUFMQ3F0UXl3enEwRFV0TUR4SE82dGJZWjBGelBLbDAvQm94TWRjZFdGQTBkVjNUcUpiNzJqdVNXVFVFTDVzSE10VzhxclJNemxSd2IwdWtKU2lFcGxuU0ZPaUI5cm5WTHdlYmNxVFhjY2l1aGFra3E2cmtIeGZRakZNKzFrSEJzZlVtTE5GU2dnR1hGUThVUDVSY3FGTjNodURzaUwrOEt0d1RJYzZnS1JNMkIyVGNybEpaMGhib0dpcFB4aXptdUFRSldRQUgxVk5SZmlxbW5EOHlxOTQ0RXFmZnEwc21PbjAyQXFCSll3SFExd2ZTalcwQSs4YkxBQkxuK0xtRUx3aVpBVkMwVjFTMCtMT1FheHhrYi9kQkJkWmVBSDNKdE15QnFBaWFOdG9CcEd0cHJIOGduYXI2dUR0dllGSWlxT1FhTUQ2RFg5TUh0L0dZZExzVm1RRlN4eWJpekF0bkowUUtwdzBCNmVIdmNISWlhN1o0K3M3enlWaUdVZmZpekFsRS90aTE4RlF6STRFNlgzQnR6blIxR3RRaE01VUM2K2c0WTFXcXdWcVR6ejQvUy8xSEw3YllXaGVSYUFBQUFBRWxGVGtTdVFtQ0MiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzb2Z0LWxpZ2h0Ii8+DQogICAgICA8cGF0aCBkPSJNNjYsOTRjLjEzOC4xMzguMjkyLjI1NC40NDEuMzc3QTMuNzUxLDMuNzUxLDAsMCwxLDY2LDk0Wm0uNDQxLTkyLjM3N0EzLjc1MSwzLjc1MSwwLDAsMCw2NiwyQzY2LjEzOSwxLjg2MSw2Ni4yOTIsMS43NDYsNjYuNDQxLDEuNjIzWk05Mi42LDEwLjM0OSw3Mi44MjMuODM5YTUuOTY4LDUuOTY4LDAsMCwwLTYuMzgyLjc4NEEzLjUxNywzLjUxNywwLDAsMSw3Miw0LjQ4NXY4Ny4wM2EzLjUxNywzLjUxNywwLDAsMS01LjU1OSwyLjg2Miw1Ljk2OCw1Ljk2OCwwLDAsMCw2LjM4Mi43ODRMOTIuNiw4NS42NTFBNiw2LDAsMCwwLDk2LDgwLjI0NFYxNS43NTdBNiw2LDAsMCwwLDkyLjYsMTAuMzQ5WiIgZmlsbD0iI2IxNzlmMSIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+"},"isHidden":true,"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","localizedResources":[{"language":"en-us","title":"Visual Studio Team Explorer 2019","description":"Interact with Team Foundation Server and Visual Studio Team Services without a Visual Studio developer toolset","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-cn","title":"Visual Studio 团队资源管理器 2019","description":"无需 Visual Studio 开发人员工具集,即可与 Team Foundation Server 和 Visual Studio Team Services 进行交互","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-tw","title":"Visual Studio Team Explorer 2019","description":"與 Team Foundation Server 和 Visual Studio Team Services 互動而不使用 Visual Studio 開發人員工具","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"cs-cz","title":"Visual Studio Team Explorer 2019","description":"Interakce s Team Foundation Serverem a službou Visual Studio Team Services bez sady vývojářských nástrojů, které nabízí Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"de-de","title":"Visual Studio Team Explorer 2019","description":"Interagieren Sie mit Team Foundation Server und Visual Studio Team Services ohne eine Visual Studio-Entwicklertoolset.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"es-es","title":"Visual Studio Team Explorer 2019","description":"Interactúe con Team Foundation Server y Visual Studio Team Services sin un conjunto de herramientas de desarrollador de Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"fr-fr","title":"Visual Studio Team Explorer 2019","description":"Interagissez avec Team Foundation Server et Visual Studio Team Services sans l'ensemble d'outils de développement Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"it-it","title":"Visual Studio Team Explorer 2019","description":"Consente di interagire con Team Foundation Server e Visual Studio Team Services senza usare un set di strumenti di sviluppo di Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ja-jp","title":"Visual Studio Team Explorer 2019","description":"Visual Studio 開発者ツールセットを使用せずに Team Foundation Server および Visual Studio Team Services と対話します","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ko-kr","title":"Visual Studio Team Explorer 2019","description":"Visual Studio 개발자 도구 집합 없이 Team Foundation Server 및 Visual Studio Team Services 조작","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pl-pl","title":"Visual Studio Team Explorer 2019","description":"Interakcja z serwerem Team Foundation Server i usługami Visual Studio Team Services bez korzystania z zestawu narzędzi dewelopera programu Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pt-br","title":"Team Explorer para Visual Studio 2019","description":"Interaja com o Team Foundation Server e o Visual Studio Team Services sem um conjunto de ferramentas de desenvolvedor do Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ru-ru","title":"Visual Studio Team Explorer 2019","description":"Взаимодействие с Team Foundation Server и Visual Studio Team Services без набора инструментов разработчика Visual Studio","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"tr-tr","title":"Visual Studio Takım Gezgini 2019","description":"Visual Studio geliştirici araç seti olmadan Team Foundation Server ve Visual Studio Team Services ile etkileşim kurun","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"}],"requirements":{"supportedOS":"6.1.1","conditions":{"expression":"not Win10ThresholdBuildNumber","conditions":[{"registryKey":"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion","id":"Win10ThresholdBuildNumber","registryValue":"CurrentBuildNumber","registryData":"[10240.0,14393.0)"}]}}},{"id":"Microsoft.VisualStudio.Product.TestAgent","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+DQogIDxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uYnJhbmQtdnNpZGV7ZmlsbDojODY1ZmM1fTwvc3R5bGU+DQogIDxwYXRoIGNsYXNzPSJpY29uLWNhbnZhcy10cmFuc3BhcmVudCIgZD0iTTQwIDQwSDBWMGg0MHY0MHoiIGlkPSJjYW52YXMiLz4NCiAgPHBhdGggY2xhc3M9ImJyYW5kLXZzaWRlIiBkPSJNMzAuMjIxLS4wMDJMMTMuODg3IDE2LjE2IDQuMDUyIDguNzQ2IDAgMTAuMTAyVjI5LjlsNC4wNTIgMS4zNTYgOS44MzUtNy40MTQgMTYuMzM0IDE2LjE2TDQwIDM1Ljg0MlY0LjE1OGwtOS43NzktNC4xNnpNNC4wNTIgMjUuODlWMTQuMTExTDEwLjAwNCAyMGwtNS45NTIgNS44OXpNMzAgMjguNDcyTDE4Ljk4MyAyMCAzMCAxMS41Mjh2MTYuOTQ0eiIvPg0KPC9zdmc+"},"isHidden":true,"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","localizedResources":[{"language":"en-us","title":"Visual Studio Test Agent 2019","description":"Supports running automated tests and load tests remotely","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-cn","title":"Visual Studio Test Agent 2019","description":"支持运行自动测试和远程下载测试","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-tw","title":"Visual Studio Test Agent 2019","description":"支援在遠端執行自動化的測試與負載測試","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"cs-cz","title":"Visual Studio Test Agent 2019","description":"Podporuje vzdálené spouštění automatizovaných a zátěžových testů.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"de-de","title":"Visual Studio Test Agent 2019","description":"Unterstützt die Remoteausführung von automatisierten Tests und Auslastungstests.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"es-es","title":"Visual Studio Test Agent 2019","description":"Admite la ejecución de pruebas automatizadas y pruebas de carga de forma remota.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"fr-fr","title":"Visual Studio Test Agent 2019","description":"Prend en charge l'exécution de tests automatisés et de tests de charge à distance","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"it-it","title":"Visual Studio Test Agent 2019","description":"Supporta l'esecuzione di test automatizzati e test di carico in remoto","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ja-jp","title":"Visual Studio Test Agent 2019","description":"自動テストとロード テストのリモートでの実行をサポートする","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ko-kr","title":"Visual Studio Test Agent 2019","description":"자동화된 테스트 및 부하 테스트 원격 실행을 지원합니다.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pl-pl","title":"Agent testowy programu Visual Studio 2019","description":"Obsługuje zdalne uruchamianie zautomatyzowanych testów i testów obciążeniowych","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pt-br","title":"Test Agent do Visual Studio 2019","description":"Dá suporte à execução de testes automatizados e carrega testes remotamente","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ru-ru","title":"Агент тестирования Visual Studio 2019","description":"Поддерживает удаленное выполнение автоматических тестов и нагрузочных тестов","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"tr-tr","title":"Visual Studio Test Aracısı 2019","description":"Otomatik testler çalıştırmayı ve testleri uzaktan yüklemeyi destekler","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"}]},{"id":"Microsoft.VisualStudio.Product.TestController","version":"16.9.31205.134","type":"ChannelProduct","icon":{"mimeType":"image/svg+xml","base64":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+DQogIDxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uYnJhbmQtdnNpZGV7ZmlsbDojODY1ZmM1fTwvc3R5bGU+DQogIDxwYXRoIGNsYXNzPSJpY29uLWNhbnZhcy10cmFuc3BhcmVudCIgZD0iTTQwIDQwSDBWMGg0MHY0MHoiIGlkPSJjYW52YXMiLz4NCiAgPHBhdGggY2xhc3M9ImJyYW5kLXZzaWRlIiBkPSJNMzAuMjIxLS4wMDJMMTMuODg3IDE2LjE2IDQuMDUyIDguNzQ2IDAgMTAuMTAyVjI5LjlsNC4wNTIgMS4zNTYgOS44MzUtNy40MTQgMTYuMzM0IDE2LjE2TDQwIDM1Ljg0MlY0LjE1OGwtOS43NzktNC4xNnpNNC4wNTIgMjUuODlWMTQuMTExTDEwLjAwNCAyMGwtNS45NTIgNS44OXpNMzAgMjguNDcyTDE4Ljk4MyAyMCAzMCAxMS41Mjh2MTYuOTQ0eiIvPg0KPC9zdmc+"},"isHidden":true,"releaseNotes":"https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.9#16.9.4","localizedResources":[{"language":"en-us","title":"Visual Studio Load Test Controller 2019","description":"Distribute automated tests to multiple machines","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-cn","title":"Visual Studio Load Test Controller 2019","description":"将自动测试分发到多台计算机","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"zh-tw","title":"Visual Studio Load Test Controller 2019","description":"將自動化的測試散發至多部電腦","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"cs-cz","title":"Visual Studio Load Test Controller 2019","description":"Distribuce automatizovaných testů na více počítačů","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"de-de","title":"Visual Studio Load Test Controller 2019","description":"Verteilt automatisierte Tests auf mehrere Computer.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"es-es","title":"Visual Studio Load Test Controller 2019","description":"Distribuye pruebas automatizadas a varias máquinas.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"fr-fr","title":"Visual Studio Load Test Controller 2019","description":"Distribuer des tests automatisés à plusieurs machines","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"it-it","title":"Visual Studio Load Test Controller 2019","description":"Consente di distribuire i test automatizzati in più computer","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ja-jp","title":"Visual Studio Load Test Controller 2019","description":"自動テストを複数のマシンに配布する","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ko-kr","title":"Visual Studio Load Test Controller 2019","description":"자동화된 테스트를 여러 컴퓨터에 배포합니다.","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pl-pl","title":"Visual Studio Load Test Controller 2019","description":"Dystrybuuj zautomatyzowane testy na wielu maszynach","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"pt-br","title":"Visual Studio Load Test Controller 2019","description":"Distribuir testes automatizados para vários computadores","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"ru-ru","title":"Visual Studio Load Test Controller 2019","description":"Распределение автоматических тестов на несколько компьютеров","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"},{"language":"tr-tr","title":"Visual Studio Yük Testi Denetleyicisi 2019","description":"Otomatik testleri birden fazla makineye dağıt","license":"https://go.microsoft.com/fwlink/?LinkId=2086101"}]},{"id":"VisualStudio.16.Release","version":"16.0.31205.134","type":"Channel","localizedResources":[{"language":"en-us","title":"Release","description":"Release","channelSuffix":""},{"language":"zh-cn","title":"Release","description":"Release","channelSuffix":""},{"language":"zh-tw","title":"Release","description":"Release","channelSuffix":""},{"language":"cs-cz","title":"Release","description":"Release","channelSuffix":""},{"language":"de-de","title":"Release","description":"Release","channelSuffix":""},{"language":"es-es","title":"Release","description":"Release","channelSuffix":""},{"language":"fr-fr","title":"Release","description":"Release","channelSuffix":""},{"language":"it-it","title":"Release","description":"Release","channelSuffix":""},{"language":"ja-jp","title":"Release","description":"Release","channelSuffix":""},{"language":"ko-kr","title":"Release","description":"Release","channelSuffix":""},{"language":"pl-pl","title":"Release","description":"Release","channelSuffix":""},{"language":"pt-br","title":"Release","description":"Release","channelSuffix":""},{"language":"ru-ru","title":"Release","description":"Release","channelSuffix":""},{"language":"tr-tr","title":"Release","description":"Release","channelSuffix":""}]},{"id":"VisualStudio.16.Release.Bootstrappers.Setup","version":"2.9.3365.38425","type":"Bootstrapper","payloads":[{"fileName":"vs_Setup.exe","sha256":"90284bdae989a0d752e2221341b86e735fd937bab060745f5577b517678aff76","size":1464568,"url":"https://download.visualstudio.microsoft.com/download/pr/3105fcfe-e771-41d6-9a1c-fc971e7d03a7/90284bdae989a0d752e2221341b86e735fd937bab060745f5577b517678aff76/vs_Setup.exe"}]}], - "signature" : { - "signInfo" : { - "signatureMethod" : "sha256RSA_cng", - "digestMethod" : "sha1", - "digestValue" : "qZXjnTdICzdwybnSN3+ef7c5Fc0=", - "canonicalization" : "" - }, - "signatureValue" : "GDxKpxaj5GESvZu3SbK72GZZoUSU4MOOhvJhLTXS9FqnaMx03UDt/oZyclZCP4ADTYYd1tg8VrgWi+4X33gt4KOwjdthA4corcAvSd5WGFKd2g8LTDyT81rJ+KWIJwcqAnu1sxqYgke8ds3O4xb3DH/q+UxkeJFehTSSgmNXJQD/91NKwFKvyg/aEmPwE7SyRjzEPul+5BZ5wuFbGCwWeLw2NZfOkz+026ibtn+tN4Ufn5vrezK4EdFRpZ010iXUdyVV9pGLVHa/1wKUOrZFmLmIHtV0D/8RhT+0r0UHPmMwBdtqp1wB7PBcH5YeW0bo19ukNRuI0VNjYVm4/9Nipg==", - "keyInfo" : { - "keyValue" : { - "rsaKeyValue" : { - "modulus" : "trsZWRAAo6nx5LhcqAsHy9uaHyPQ2VireMBI9yQUOPBj7dVLA7/N+AnKFFDzJ7P+grT6GkOE4cv5GzjoP8yQJ6yXojEKkXti7HW/zUiNoF11/ZWndf8j1Azl6OBjcD416tSWYvh2VfdW1K+mY83j49YPm3qbKnfxwtV0nI9H092gMS0cpCUsxMRAZlPXksrjsFLqvgq4rnULVhjHSVOudL/yps3zOOmOpaPzAp56b898xC+zzHVHcKo/52IRht1FSC8V+7QHTG8+yzfuljiKU9QONa8GqDlZ7/vFGveB8IY2ZrtUu98nle0WWTcaIRHoCYvWGLLF2u1GVFJAggPipw==", - "exponent" : "AQAB" - } - }, - "x509Data" : [ - "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" - ] - }, - "counterSign" : { - "x509Data" : [ - "MIIE9TCCA92gAwIBAgITMwAAAVt8sLo0ZzfBpwAAAAABWzANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yMTAxMTQxOTAyMTZaFw0yMjA0MTExOTAyMTZaMIHOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046MEE1Ni1FMzI5LTRENEQxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIJH+l7PXaoXrLpi5bZ5epcI4g9Y4fiKc/+o+auQkM0p22lbqOCogokqa+VraqlZQ+50/91l+ler3KTUFeXHbVVcGnzaS598hfn0TaFFodUPbvFxokl/GM1UvKuvCTxYkTuBzMzKSwmko3H0GSHegorpMi0K7ip0hcHRoTMROxgmsmkPGQ8hDx7PwtseAAGDBbFTrLEnUfI2/H8wHpN0jZWbVSndCm/IqPt15EOeDL1F1fXFS9f3g3V1VQQajoR86CbMvnNsv7N1voBF/EG/Tv24wZEeoSGjsBAMOzbuNP0zFX8Fye4OUfxzVwre3OCGozTeFvgroHsrC52G6kZlvpAgMBAAGjggEbMIIBFzAdBgNVHQ4EFgQUZectNYhtt1MgXUx/9eU5yZi6qy4wHwYDVR0jBBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENBXzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAQEApzNrO6YTGpnOEHVaJaztWV0YgzFFXYLvf8qvIO5CFZfn5JVFdlZaLrevn6TqgBp3sDLcHpxbWoFYVSfB2rvDcJPiAIQdAdOA6GzQ8O7+ChEwEX/CjfIEx+ge0Yx4a3jA1oO4nFdA7KI/DCAPAIq1pcH+J6/KSh9J9qxE7HgSQ1nN3W1NCEyRB9UcxYRpFuyMzT0AjteuU6ezS516eJmmc6FcfD8ojjTun8g2a9MqlbofTqlh/nz2WEP2GBcoccvoR1jrqmKXPNz4Z9bwNAHtflp+G53umRoz8USOrMbDCJHQVw9ByS8je2H0q2zlQGMI2Fjh63rBmbr6BGhIA0VlKw==", - "MIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkS", - "MIIF7TCCA9WgAwIBAgIQKMw6Jb+6RKxEmptYa0M5qjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNjIzMjE1NzI0WhcNMzUwNjIzMjIwNDAxWjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC5CJ4o5OTsBk5QaLNBxXvrrraOr4G6IkQfZTRpTL5wQBfyFnvief2G7Q059BuorZKQHss9do9a2bWREC48BY2KbSRU5x/tVq2DtFCcFaUXdIhZIPwIxYR202jUbyh4zly481CQRP/jY1++oZoslhUE1gf+HoQh4EIxEcQoNpTPUKRinsnWq3EAslsM5pbUCiSW9f/G1bcb18u3IWKvEtyhXTfjGvsaRpjAm8DnYx8qCJMCfh5qjvKfGInkIoWisYRXQP/1DthvnO3iRTEBzRfpf7CBReOqIUAmoXKqp088AQV+7oNYsV4GY5likXiCtw2TDCRqtBvbJ+xflQQ/k0ow9ZcYs6f5GaeTMx0ByNsiUlzXJclG+aL7h1lDvptisY0thkQaRqx4YX4wCfquicRBKiJmA5E5RZzHiwyoyg0v+1LqDPdjMyOd/rAfrWfWp1ADxgRwY7UssYZaQ7f7rvluKW4hIUEmBozJw+6wwoWTobmF2eYybEtMP9Zdo+W1nXfDnMBVt3QA47g4q4OXUOGaQiQdxsCjMNEaWshSNPdz8ccYHzOteuzLQWDzI5QgwkhFrFxRxi6AwuJ3Fb2Fh+02nZaR7gC1o3Dsn+ONgGiDdrqvXXBSIhbiZvu6s8XC9z4vd6bK3sGmxkhMwzdRI9Mn17hOcJbwoUR2r3jPmuFmEwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU1fZWy4/oolxiaNE9lJBb186aGMQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQELBQADggIBAKylloy/u66m9tdxh0MxVoj9HDJxWzW31PCR8q834hTx8wImBT4WFH8UurhP+4mysufUCcxtuVs7ZGVwZrfysVrfGgLz9VG4Z215879We+SEuSsem0CcJjT5RxiYadgc17bRv49hwmfEte9gQ44QGzZJ5CDKrafBsSdlCfjN9Vsq0IQz8+8f8vWcC1iTN6B1oN5y3mx1KmYi9YwGMFafQLkwqkB3FYLXi+zA07K9g8V3DB6urxlToE15cZ8PrzDOZ/nWLMwiQXoH8pdCGM5ZeRBV3m8Q5Ljag2ZAFgloI1uXLiaaArtXjMW4umliMoCJnqH9wJJ8eyszGYQqY8UAaGL6n0eNmXpFOqfp7e5pQrXzgZtHVhB7/HA2hBhz6u/5l02eMyPdJgu6Krc/RNyDJ/+9YVkrEbfKT9vFiwwcMa4y+Pi5Qvd/3GGadrFaBOERPWZFtxhxvskkhdbz1LpBNF0SLSW5jaYTSG1LsAd9mZMJYYF0VyaKq2nj5NnHiMwk2OxSJFwevJEU4pbe6wrant1fs1vb1ILsxiBQhyVAOvvH7s3+M+Vuw4QJVQMlOcDpNV1lMaj2v6AJzSnHszYyLtyV84PBWs+LjfbqsyH4pO0eMQ62TBGrYAukEiMiF6M2ZIKRBBLgq28ey1AFYbRA/1mGcdHVM2l8qXOKONdkDPFp" - ], - "timestamp" : "2021-04-05-02:57:11", - "counterSignatureMethod" : "timeStamp", - "counterSignature" : "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" - } - } - -} diff --git a/ce/test/resources/2021-05-06-VisualStudio.vsman b/ce/test/resources/2021-05-06-VisualStudio.vsman deleted file mode 100644 index aa4e7d877c..0000000000 --- a/ce/test/resources/2021-05-06-VisualStudio.vsman +++ /dev/null @@ -1,891 +0,0 @@ -{ - "manifestVersion": "1.1", - "engineVersion": "2.9.3365.38425", - "info": { - "id": "VisualStudio/16.9.4+31205.134", - "buildBranch": "d16.9", - "buildVersion": "16.9.31205.134", - "localBuild": "build-lab", - "manifestName": "VisualStudio", - "manifestType": "installer", - "productDisplayVersion": "16.9.4", - "productLine": "Dev16", - "productLineVersion": "2019", - "productMilestone": "RTW", - "productMilestoneIsPreRelease": "False", - "productName": "Visual Studio", - "productPatchVersion": "4", - "productPreReleaseMilestoneSuffix": "1.0", - "productSemanticVersion": "16.9.4+31205.134" - }, - "signers": [ - { - "$id": "1", - "subjectName": "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" - } - ], - "packages": [ - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86", - "version": "14.28.29914", - "type": "Vsix", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.vsix", - "sha256": "5b9e9d7f332e79bcc2342c49e7f99ddf43ecf6d130e5e6c6908dc2c7a39b15c6", - "size": 16126219, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/5b9e9d7f332e79bcc2342c49e7f99ddf43ecf6d130e5e6c6908dc2c7a39b15c6/Microsoft.VisualCpp.Tools.HostX86.TargetX86.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 35276532 - }, - "nonCriticalProcesses": [ - "vctip", - "mspdbsrv" - ], - "dependencies": { - "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources": "14.28.29914", - "Microsoft.VisualCpp.Props.x86": "14.28.29914", - "Microsoft.VisualCpp.Servicing.Compilers": "14.28.29914" - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "cs-CZ", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.csy.vsix", - "sha256": "47db023518b45bab6e7b9bba9aa2b0254895f3eb21221a70bdeb453e2747bafd", - "size": 229756, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/47db023518b45bab6e7b9bba9aa2b0254895f3eb21221a70bdeb453e2747bafd/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.csy.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 906288 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "de-DE", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.deu.vsix", - "sha256": "5e128ff82600b53cebd63afaa40d3714d52c539104bf8ad4b44d61f261e933a1", - "size": 234819, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/5e128ff82600b53cebd63afaa40d3714d52c539104bf8ad4b44d61f261e933a1/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.deu.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 1026640 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "en-US", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.enu.vsix", - "sha256": "4752b7e2053d1db888b43309d604ae7ed807d363ecbb39a89937ca051a10bdc8", - "size": 204190, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/4752b7e2053d1db888b43309d604ae7ed807d363ecbb39a89937ca051a10bdc8/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.enu.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 862328 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "es-ES", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.esn.vsix", - "sha256": "b9c8500e4f49df54292c7aab3bae930a940cd264877b4feee7cc26618f99edf4", - "size": 224027, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/b9c8500e4f49df54292c7aab3bae930a940cd264877b4feee7cc26618f99edf4/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.esn.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 1001560 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "fr-FR", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.fra.vsix", - "sha256": "fe41ec5957aaa14e5a613cd2352bc1171b1e4b550e980bf4dcd0b11fce1d7192", - "size": 225466, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/fe41ec5957aaa14e5a613cd2352bc1171b1e4b550e980bf4dcd0b11fce1d7192/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.fra.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 1012800 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "it-IT", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ita.vsix", - "sha256": "8c540bc9953a7f1c26072e16748926a73818ae5fb5b8288bedbc0841e789bfac", - "size": 222846, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/8c540bc9953a7f1c26072e16748926a73818ae5fb5b8288bedbc0841e789bfac/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ita.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 1012272 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "ja-JP", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.jpn.vsix", - "sha256": "91e4c239726a104a38c7ae69d1590abc20249354c0fd5a5ae580ceef8e5149eb", - "size": 200323, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/91e4c239726a104a38c7ae69d1590abc20249354c0fd5a5ae580ceef8e5149eb/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.jpn.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 636488 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "ko-KR", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.kor.vsix", - "sha256": "3b1fa4d736a7d82bef9054fbe5f52919d34a8c5ec614e3d957e7665b94ae9ece", - "size": 195053, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/3b1fa4d736a7d82bef9054fbe5f52919d34a8c5ec614e3d957e7665b94ae9ece/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.kor.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 640568 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "pl-PL", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.plk.vsix", - "sha256": "13b2331b7157e21006b79c873d532e5e256ae049f41b11be972e316eae6a8a1b", - "size": 233518, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/13b2331b7157e21006b79c873d532e5e256ae049f41b11be972e316eae6a8a1b/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.plk.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 982080 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "pt-BR", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ptb.vsix", - "sha256": "2d4133d05cf9adec2bdbc73cbdb266c359d7bb1fe6e012cc346b1dff334df860", - "size": 219322, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/2d4133d05cf9adec2bdbc73cbdb266c359d7bb1fe6e012cc346b1dff334df860/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.ptb.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 947784 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "ru-RU", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.rus.vsix", - "sha256": "54d321dc5471c42d655aa5b613b55dab3f1129df179bef8597e470d46f464445", - "size": 233022, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/54d321dc5471c42d655aa5b613b55dab3f1129df179bef8597e470d46f464445/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.rus.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 968256 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "tr-TR", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.trk.vsix", - "sha256": "7b1cbe7df387e5132d8e639e407afe8c83b45f624cde06fc9aa6af0bf896f32d", - "size": 216776, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7b1cbe7df387e5132d8e639e407afe8c83b45f624cde06fc9aa6af0bf896f32d/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.trk.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 911416 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "zh-CN", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.chs.vsix", - "sha256": "7538c083be1f37b91217b8690a72746fc57bcd4c0e8c21f553ac4f88f8c60c98", - "size": 183804, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/7538c083be1f37b91217b8690a72746fc57bcd4c0e8c21f553ac4f88f8c60c98/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.chs.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 478256 - } - }, - { - "id": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources", - "version": "14.28.29914", - "type": "Vsix", - "language": "zh-TW", - "payloads": [ - { - "fileName": "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.cht.vsix", - "sha256": "f0c019c004dcca5f7f5ce3a9b97730967cfff6f960113a55f7f317a41ade3df7", - "size": 187675, - "url": "https://download.visualstudio.microsoft.com/download/pr/3c309edd-88c5-4207-ab8d-fc1fda49d203/f0c019c004dcca5f7f5ce3a9b97730967cfff6f960113a55f7f317a41ade3df7/Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources.cht.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 503864 - } - }, - { - "id": "Microsoft.VisualStudio.Android.DeviceManager", - "version": "16.9.0.17", - "type": "Vsix", - "payloads": [ - { - "fileName": "Android.DeviceManager.16.9.0.17.vsix", - "sha256": "55d30f294f6d1ed1344043c22136a386f85e80b7159522366a9446c08bd8bc0a", - "size": 19848858, - "url": "https://download.visualstudio.microsoft.com/download/pr/a1e17755-863b-469f-bdce-fc29a2c42219/55d30f294f6d1ed1344043c22136a386f85e80b7159522366a9446c08bd8bc0a/Android.DeviceManager.16.9.0.17.vsix", - "signer": { - "$ref": "2" - } - } - ], - "vsixId": "Microsoft.VisualStudio.Android.DeviceManager", - "extensionDir": "[installdir]\\Common7\\IDE\\Extensions\\Xamarin\\AndroidDeviceManager", - "installSizes": { - "targetDrive": 34775879 - } - }, - { - "id": "Microsoft.VisualStudio.Android.SdkManager", - "version": "16.9.0.22", - "type": "Vsix", - "payloads": [ - { - "fileName": "Android.SDKManager.16.9.0.22.vsix", - "sha256": "1f6f970565a9eb2df163e86b375f109ab08477559098cafb9434ce062b105414", - "size": 8153124, - "url": "https://download.visualstudio.microsoft.com/download/pr/ec524651-cb3a-42ed-bf81-479abf7241ef/1f6f970565a9eb2df163e86b375f109ab08477559098cafb9434ce062b105414/Android.SDKManager.16.9.0.22.vsix", - "signer": { - "$ref": "2" - } - } - ], - "vsixId": "Microsoft.VisualStudio.Android.SdkManager", - "extensionDir": "[installdir]\\Common7\\IDE\\Extensions\\Xamarin\\AndroidSdkManager", - "installSizes": { - "targetDrive": 21015080 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis", - "version": "16.9.31004.209", - "type": "Vsix", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "1281710a2b68d239b03b0cfb6fc3fa10b0cbff55bf321f646bad04d455b4acd8", - "size": 119787, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/1281710a2b68d239b03b0cfb6fc3fa10b0cbff55bf321f646bad04d455b4acd8/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 300389 - }, - "dependencies": { - "Microsoft.VisualStudio.AppAnalysis.Resources": "[16.0,17.0)", - "Microsoft.VisualStudio.AppAnalysis.Targeted": "[16.0,17.0)" - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "cs-CZ", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "4ff4b9a4a66b8a48c754c66000cfb15c8741da110373b2ee6a4dc02541f91031", - "size": 10441, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/4ff4b9a4a66b8a48c754c66000cfb15c8741da110373b2ee6a4dc02541f91031/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16776 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "de-DE", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "cde590789e9e14a5ac01bd733bf5d5b68e3428f095d58b29b679d3151943bc61", - "size": 10390, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/cde590789e9e14a5ac01bd733bf5d5b68e3428f095d58b29b679d3151943bc61/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16776 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "en-US", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "1d290f4c97ccb407efbd6e980c7817d837a53c444347802deda9902a2b90bc1f", - "size": 11445, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/1d290f4c97ccb407efbd6e980c7817d837a53c444347802deda9902a2b90bc1f/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 18312 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "es-ES", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "95a58dab307d5af0018eb23b3ea4bfeedfb6f73941167903077b56721de43cad", - "size": 10414, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/95a58dab307d5af0018eb23b3ea4bfeedfb6f73941167903077b56721de43cad/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16776 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "fr-FR", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "87b16f9106fb48573b2defe49daffc9b6aa6014909f6416cf5a12c926d719d1e", - "size": 10405, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/87b16f9106fb48573b2defe49daffc9b6aa6014909f6416cf5a12c926d719d1e/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16776 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "it-IT", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "c9aa885be50b937aaba0f6237019bdbdcc439f8cd8b5f7442ec50227c4535da2", - "size": 10400, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/c9aa885be50b937aaba0f6237019bdbdcc439f8cd8b5f7442ec50227c4535da2/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16768 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "ja-JP", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "84db96d689ec1f2b8713402da16fa6b0ce5a421ff04c3a2213523fecd33132dd", - "size": 10452, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/84db96d689ec1f2b8713402da16fa6b0ce5a421ff04c3a2213523fecd33132dd/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16776 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "ko-KR", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "5e165cc99730dec170c9d80d2a88061faa6dc85b8735fd7ba17c02b835da7a02", - "size": 10398, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/5e165cc99730dec170c9d80d2a88061faa6dc85b8735fd7ba17c02b835da7a02/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16264 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "pl-PL", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "191e2795334e8e2268a948b82aa7a4da855b344d401929df69c04feb1958c17c", - "size": 10449, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/191e2795334e8e2268a948b82aa7a4da855b344d401929df69c04feb1958c17c/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16776 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "pt-BR", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "1ef2e571e7fdc6505bbf85084050a6be18777affd8a5d3d197e142459ecec55d", - "size": 10438, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/1ef2e571e7fdc6505bbf85084050a6be18777affd8a5d3d197e142459ecec55d/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16768 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "ru-RU", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "c98df39a4d2b00eef7104d758d0ce8eb306df1d0625bb740adce89b2f06e5fce", - "size": 10602, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/c98df39a4d2b00eef7104d758d0ce8eb306df1d0625bb740adce89b2f06e5fce/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 17288 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "tr-TR", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "073d1b0d65fcf30c018e329db198b76d518dd8725c7a0c7dd7cb3d573454a27d", - "size": 10380, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/073d1b0d65fcf30c018e329db198b76d518dd8725c7a0c7dd7cb3d573454a27d/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16264 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "zh-CN", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "c44ec3a437d681c201e3337cc5f5851aa9bbc60318098dc0a76b4b023c6882c2", - "size": 10369, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/c44ec3a437d681c201e3337cc5f5851aa9bbc60318098dc0a76b4b023c6882c2/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16256 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "zh-TW", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "50cf10f28fb36d9eab105ebf2839978456083135db2cf138e187b56514d486f4", - "size": 10372, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/50cf10f28fb36d9eab105ebf2839978456083135db2cf138e187b56514d486f4/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 16256 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Targeted", - "version": "16.9.31004.209", - "type": "Vsix", - "chip": "x64", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "ee2e695eda6f3ac617819639b908a72d21f06fa964bde402b62c2eba76af786c", - "size": 132073, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/ee2e695eda6f3ac617819639b908a72d21f06fa964bde402b62c2eba76af786c/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 320904 - } - }, - { - "id": "Microsoft.VisualStudio.AppAnalysis.Targeted", - "version": "16.9.31004.209", - "type": "Vsix", - "chip": "x86", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "bef150ba88f7b96ca711c03a2023f9d48cc947eff172e2b13fd12d32ada3c5c9", - "size": 100383, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/bef150ba88f7b96ca711c03a2023f9d48cc947eff172e2b13fd12d32ada3c5c9/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 212360 - } - }, - { - "id": "Microsoft.VisualStudio.AppCapDesigner", - "version": "16.9.227.58203", - "type": "Vsix", - "payloads": [ - { - "fileName": "Microsoft.VisualStudio.TabDesigner.vsix", - "sha256": "4f90596bc77ab8fe2d3e488ff245b069ee18bae9b7249d1ccc6c19c0313f17f0", - "size": 43466, - "url": "https://download.visualstudio.microsoft.com/download/pr/a1e17755-863b-469f-bdce-fc29a2c42219/4f90596bc77ab8fe2d3e488ff245b069ee18bae9b7249d1ccc6c19c0313f17f0/Microsoft.VisualStudio.TabDesigner.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 503306 - } - }, - { - "id": "Microsoft.VisualStudio.ApplicationInsights", - "version": "16.9.693.2781", - "type": "Vsix", - "payloads": [ - { - "fileName": "Microsoft.VisualStudio.ApplicationInsights.vsix", - "sha256": "71e3d86e3aeba09243db599a086ac013eb8a1d87aafa49a42ed14c04d6425ff7", - "size": 4248134, - "url": "https://download.visualstudio.microsoft.com/download/pr/4a5b18ed-7a52-478c-acb3-27c4dd4976fe/71e3d86e3aeba09243db599a086ac013eb8a1d87aafa49a42ed14c04d6425ff7/Microsoft.VisualStudio.ApplicationInsights.vsix", - "signer": { - "$ref": "2" - } - } - ], - "vsixId": "6784BA9A-FE1E-4000-8357-DC3D9B2C27F9", - "extensionDir": "[installdir]\\Common7\\IDE\\Extensions\\Microsoft\\AppInsights\\Core", - "installSizes": { - "targetDrive": 10949663 - } - }, - { - "id": "Microsoft.VisualStudio.ApplicationInsights.Interfaces", - "version": "16.9.693.2781", - "type": "Vsix", - "payloads": [ - { - "fileName": "Microsoft.VisualStudio.ApplicationInsights.Interfaces.vsix", - "sha256": "73e328d3c1e2f83c9efb78e8955db766a0a6aa66580620eb2474cccaf6abc824", - "size": 130256, - "url": "https://download.visualstudio.microsoft.com/download/pr/4a5b18ed-7a52-478c-acb3-27c4dd4976fe/73e328d3c1e2f83c9efb78e8955db766a0a6aa66580620eb2474cccaf6abc824/Microsoft.VisualStudio.ApplicationInsights.Interfaces.vsix", - "signer": { - "$ref": "2" - } - } - ], - "vsixId": "7B66689B-28BD-4D2E-96CD-A76F120CA567", - "extensionDir": "[installdir]\\Common7\\IDE\\Extensions\\Microsoft\\AppInsights\\Contracts", - "folderMappings": { - "$Licenses": "[installdir]\\Licenses", - "$MSBuild": "[installdir]\\MSBuild", - "$PublicAssemblies": "[installdir]\\Common7\\IDE\\PublicAssemblies", - "$ReferenceAssemblies": "[installdir]\\Common7\\IDE\\ReferenceAssemblies", - "$RemoteDebugger": "[installdir]\\Common7\\IDE\\Remote Debugger", - "$Schemas": "[installdir]\\Xml\\Schemas" - }, - "installSizes": { - "targetDrive": 317417 - } - }, - { - "id": "Microsoft.VisualStudio.AppResponsiveness", - "version": "16.9.31004.209", - "type": "Vsix", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "d3bbf06bf22eb3264e4c3731150a69e0fedb7905259f5289cd6ba147a3b1dad8", - "size": 635669, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/d3bbf06bf22eb3264e4c3731150a69e0fedb7905259f5289cd6ba147a3b1dad8/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 2469136 - }, - "dependencies": { - "Microsoft.VisualStudio.AppResponsiveness.Resources": "[16.0,17.0)", - "Microsoft.VisualStudio.AppResponsiveness.Targeted": "[16.0,17.0)" - } - }, - { - "id": "Microsoft.VisualStudio.AppResponsiveness.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "cs-CZ", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "5d7ca8fd8a1b55f454c415b47326ac7af7d561de898c3506a1c95b10df95cb61", - "size": 31237, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/5d7ca8fd8a1b55f454c415b47326ac7af7d561de898c3506a1c95b10df95cb61/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 81000 - } - }, - { - "id": "Microsoft.VisualStudio.AppResponsiveness.Resources", - "version": "16.9.31004.209", - "type": "Vsix", - "language": "de-DE", - "payloads": [ - { - "fileName": "payload.vsix", - "sha256": "b26bcd8f9b233583090287fd8946ebe306ea7f408e3678e9afe19eb47bc5874f", - "size": 31078, - "url": "https://download.visualstudio.microsoft.com/download/pr/f4fa30c9-f388-4b84-bba6-bd9e451dcdbc/b26bcd8f9b233583090287fd8946ebe306ea7f408e3678e9afe19eb47bc5874f/payload.vsix", - "signer": { - "$ref": "2" - } - } - ], - "installSizes": { - "targetDrive": 80884 - } - } - ], - "deprecate": { - "Component.Microsoft.VisualStudio.TaskStatusCenter": "0.0", - "Component.Microsoft.VisualStudio.ASALExtensionOOB": "0.0", - "Component.Microsoft.VisualStudio.LanguageServer.Client.Preview": "0.0" - }, - "signature": { - "signInfo": { - "signatureMethod": "sha256RSA_cng", - "digestMethod": "sha1", - "digestValue": "wf1oGQWxPvicAO36d3KqvWOB8ek=", - "canonicalization": "" - }, - "signatureValue": "RVm7286coztlPMpvl7E+eNkrMs1nL/uO4M1hkPDqT6KDjBugERoAdBd3Lrwu5NvjM15GL17sGCtvWjqsfb5+X6/TrBS6jcfOw4uKipIiD/bnG5GDQYglqndUutxic8Uso4wjXYvyO9IwS0njyNV9R8RrzHZwtQeCauHmX/tUDtjw0L5NTRlSAR11mKKKnaARFXlM7bwqojleJlACMSQzV5m06UoXRytMgt+WYuYoMuThZLDEPi47jByvfgENfO4YxL/IAJz2Xn2blTwi67resnOgUONyzk1XT2XaU0JfJ9zUNs34xr7cl4mMqO7br0nvGRpQfQY7jNlRUa1dkFzlYg==", - "keyInfo": { - "keyValue": { - "rsaKeyValue": { - "modulus": "trsZWRAAo6nx5LhcqAsHy9uaHyPQ2VireMBI9yQUOPBj7dVLA7/N+AnKFFDzJ7P+grT6GkOE4cv5GzjoP8yQJ6yXojEKkXti7HW/zUiNoF11/ZWndf8j1Azl6OBjcD416tSWYvh2VfdW1K+mY83j49YPm3qbKnfxwtV0nI9H092gMS0cpCUsxMRAZlPXksrjsFLqvgq4rnULVhjHSVOudL/yps3zOOmOpaPzAp56b898xC+zzHVHcKo/52IRht1FSC8V+7QHTG8+yzfuljiKU9QONa8GqDlZ7/vFGveB8IY2ZrtUu98nle0WWTcaIRHoCYvWGLLF2u1GVFJAggPipw==", - "exponent": "AQAB" - } - }, - "x509Data": [ - "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" - ] - }, - "counterSign": { - "x509Data": [ - "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" - ], - "timestamp": "2021-04-05-02:57:12", - "counterSignatureMethod": "timeStamp", - "counterSignature": "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" - } - } -}