@ng-web-apis/universal
Version:
A set of fallback for @ng-web-apis/common for Angular Universal
178 lines • 21.4 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Optional } from '@angular/core';
import { WA_WINDOW } from '@ng-web-apis/common';
import { BlobMock } from '../classes/blob-mock';
import { LocationMock } from '../classes/location-mock';
import { StorageMock } from '../classes/storage-mock';
import { SSR_LOCATION } from '../tokens/ssr-location';
import { SSR_USER_AGENT } from '../tokens/ssr-user-agent';
import { EVENT_TARGET } from '../utils/event-target';
import { alwaysFalse, alwaysNull, alwaysRejected, alwaysZero, emptyFunction, identity, } from '../utils/functions';
import { CACHES_MOCK } from './universal-caches';
import { CRYPTO_MOCK } from './universal-crypto';
import { NAVIGATOR_MOCK } from './universal-navigator';
import { performanceFactory } from './universal-performance';
import { SPEECH_SYNTHESIS_MOCK } from './universal-speech-synthesis';
const COMPUTED_STYLES = {
getPropertyPriority: () => '',
getPropertyValue: () => '',
item: () => '',
removeProperty: () => '',
setProperty: emptyFunction,
};
const COMPUTED_STYLES_HANDLER = {
get: (obj, key) => (key in obj ? obj[key] : null),
};
const COMPUTED_STYLES_PROXY = new Proxy(COMPUTED_STYLES, COMPUTED_STYLES_HANDLER);
const CSS_RULES = new (class extends Array {
item = () => null;
})();
const BAR_PROP = {
visible: false,
};
const DB_REQUEST = {
...EVENT_TARGET,
onblocked: null,
onerror: null,
onsuccess: null,
onupgradeneeded: null,
error: null,
readyState: 'pending',
result: null,
source: null,
transaction: null,
};
const SELF = ['frames', 'parent', 'self', 'top', 'window'];
const WINDOW_HANDLER = {
get: (windowRef, key) => {
if (SELF.includes(key)) {
return windowRef;
}
return key.startsWith('on') ? null : windowRef[key];
},
};
export const UNIVERSAL_WINDOW = {
provide: WA_WINDOW,
deps: [DOCUMENT, [new Optional(), SSR_LOCATION], [new Optional(), SSR_USER_AGENT]],
useFactory: (document, location, userAgent) => {
const windowMock = {
...EVENT_TARGET,
document,
localStorage: new StorageMock(),
location: location ?? new LocationMock(),
navigator: { ...NAVIGATOR_MOCK, userAgent: userAgent ?? '' },
performance: performanceFactory(),
sessionStorage: new StorageMock(),
speechSynthesis: SPEECH_SYNTHESIS_MOCK,
caches: CACHES_MOCK,
crypto: CRYPTO_MOCK,
URL,
URLSearchParams,
setTimeout,
setInterval,
clearTimeout,
clearInterval,
console,
Blob: BlobMock,
alert: emptyFunction,
clientInformation: { ...NAVIGATOR_MOCK, userAgent: userAgent ?? '' },
// TODO: Candidate for token
matchMedia: () => ({
...EVENT_TARGET,
matches: false,
media: '',
onchange: null,
addListener: emptyFunction,
removeListener: emptyFunction,
}),
// TODO: Candidate for token
indexedDB: {
cmp: alwaysZero,
open: () => DB_REQUEST,
deleteDatabase: () => DB_REQUEST,
},
customElements: {
define: emptyFunction,
get: emptyFunction,
upgrade: emptyFunction,
whenDefined: alwaysRejected,
},
styleMedia: {
type: '',
matchMedium: alwaysFalse,
},
history: {
length: 0,
scrollRestoration: 'auto',
state: {},
back: emptyFunction,
forward: emptyFunction,
go: emptyFunction,
pushState: emptyFunction,
replaceState: emptyFunction,
},
closed: false,
defaultStatus: '',
devicePixelRatio: 1,
doNotTrack: '',
frameElement: null,
innerHeight: 0,
innerWidth: 0,
isSecureContext: false,
length: 0,
name: '',
offscreenBuffering: false,
opener: {},
origin: '',
orientation: '',
outerHeight: 0,
outerWidth: 0,
pageXOffset: 0,
pageYOffset: 0,
screenLeft: 0,
screenTop: 0,
screenX: 0,
screenY: 0,
scrollX: 0,
scrollY: 0,
status: '',
blur: emptyFunction,
cancelAnimationFrame: emptyFunction,
captureEvents: emptyFunction,
close: emptyFunction,
confirm: alwaysFalse,
departFocus: emptyFunction,
focus: emptyFunction,
moveBy: emptyFunction,
moveTo: emptyFunction,
open: alwaysNull,
postMessage: emptyFunction,
print: emptyFunction,
prompt: alwaysNull,
releaseEvents: emptyFunction,
requestAnimationFrame: alwaysZero,
resizeBy: emptyFunction,
resizeTo: emptyFunction,
scroll: emptyFunction,
scrollBy: emptyFunction,
scrollTo: emptyFunction,
stop: emptyFunction,
atob: identity,
btoa: identity,
fetch: alwaysRejected,
createImageBitmap: alwaysRejected,
queueMicrotask: emptyFunction,
locationbar: BAR_PROP,
menubar: BAR_PROP,
personalbar: BAR_PROP,
scrollbars: BAR_PROP,
statusbar: BAR_PROP,
toolbar: BAR_PROP,
getComputedStyle: () => COMPUTED_STYLES_PROXY,
getMatchedCSSRules: () => CSS_RULES,
getSelection: () => null,
};
return new Proxy(windowMock, WINDOW_HANDLER);
},
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdmVyc2FsLXdpbmRvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdW5pdmVyc2FsL3NyYy9jb25zdGFudHMvdW5pdmVyc2FsLXdpbmRvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUNILFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQUNkLFVBQVUsRUFDVixhQUFhLEVBQ2IsUUFBUSxHQUNYLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsTUFBTSxlQUFlLEdBQWlDO0lBQ2xELG1CQUFtQixFQUFFLEdBQUcsRUFB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RUFBRSxRQUFRO1lBQ2pCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFNBQVMsRUFBRSxRQUFRO1lBQ25CLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLHFCQUFxQjtZQUM3QyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTO1lBQ25DLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1NBQ3BCLENBQUM7UUFFVCxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7RmFjdG9yeVByb3ZpZGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXQV9XSU5ET1d9IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuXG5pbXBvcnQge0Jsb2JNb2NrfSBmcm9tICcuLi9jbGFzc2VzL2Jsb2ItbW9jayc7XG5pbXBvcnQge0xvY2F0aW9uTW9ja30gZnJvbSAnLi4vY2xhc3Nlcy9sb2NhdGlvbi1tb2NrJztcbmltcG9ydCB7U3RvcmFnZU1vY2t9IGZyb20gJy4uL2NsYXNzZXMvc3RvcmFnZS1tb2NrJztcbmltcG9ydCB7U1NSX0xPQ0FUSU9OfSBmcm9tICcuLi90b2tlbnMvc3NyLWxvY2F0aW9uJztcbmltcG9ydCB7U1NSX1VTRVJfQUdFTlR9IGZyb20gJy4uL3Rva2Vucy9zc3ItdXNlci1hZ2VudCc7XG5pbXBvcnQge0VWRU5UX1RBUkdFVH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtdGFyZ2V0JztcbmltcG9ydCB7XG4gICAgYWx3YXlzRmFsc2UsXG4gICAgYWx3YXlzTnVsbCxcbiAgICBhbHdheXNSZWplY3RlZCxcbiAgICBhbHdheXNaZXJvLFxuICAgIGVtcHR5RnVuY3Rpb24sXG4gICAgaWRlbnRpdHksXG59IGZyb20gJy4uL3V0aWxzL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0NBQ0hFU19NT0NLfSBmcm9tICcuL3VuaXZlcnNhbC1jYWNoZXMnO1xuaW1wb3J0IHtDUllQVE9fTU9DS30gZnJvbSAnLi91bml2ZXJzYWwtY3J5cHRvJztcbmltcG9ydCB7TkFWSUdBVE9SX01PQ0t9IGZyb20gJy4vdW5pdmVyc2FsLW5hdmlnYXRvcic7XG5pbXBvcnQge3BlcmZvcm1hbmNlRmFjdG9yeX0gZnJvbSAnLi91bml2ZXJzYWwtcGVyZm9ybWFuY2UnO1xuaW1wb3J0IHtTUEVFQ0hfU1lOVEhFU0lTX01PQ0t9IGZyb20gJy4vdW5pdmVyc2FsLXNwZWVjaC1zeW50aGVzaXMnO1xuXG5jb25zdCBDT01QVVRFRF9TVFlMRVM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gPSB7XG4gICAgZ2V0UHJvcGVydHlQcmlvcml0eTogKCkgPT4gJycsXG4gICAgZ2V0UHJvcGVydHlWYWx1ZTogKCkgPT4gJycsXG4gICAgaXRlbTogKCkgPT4gJycsXG4gICAgcmVtb3ZlUHJvcGVydHk6ICgpID0+ICcnLFxuICAgIHNldFByb3BlcnR5OiBlbXB0eUZ1bmN0aW9uLFxufTtcbmNvbnN0IENPTVBVVEVEX1NUWUxFU19IQU5ETEVSOiBQcm94eUhhbmRsZXI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gPSB7XG4gICAgZ2V0OiAob2JqLCBrZXk6IGFueSkgPT4gKGtleSBpbiBvYmogPyBvYmpba2V5XSA6IG51bGwpLFxufTtcbmNvbnN0IENPTVBVVEVEX1NUWUxFU19QUk9YWSA9IG5ldyBQcm94eTxDU1NTdHlsZURlY2xhcmF0aW9uPihcbiAgICBDT01QVVRFRF9TVFlMRVMgYXMgYW55LFxuICAgIENPTVBVVEVEX1NUWUxFU19IQU5ETEVSLFxuKTtcbmNvbnN0IENTU19SVUxFUyA9IG5ldyAoY2xhc3MgZXh0ZW5kcyBBcnJheTxDU1NSdWxlPiBpbXBsZW1lbnRzIENTU1J1bGVMaXN0IHtcbiAgICBwdWJsaWMgaXRlbSA9ICgpOiBudWxsID0+IG51bGw7XG59KSgpO1xuY29uc3QgQkFSX1BST1A6IEJhclByb3AgPSB7XG4gICAgdmlzaWJsZTogZmFsc2UsXG59O1xuY29uc3QgREJfUkVRVUVTVDogSURCT3BlbkRCUmVxdWVzdCA9IHtcbiAgICAuLi5FVkVOVF9UQVJHRVQsXG4gICAgb25ibG9ja2VkOiBudWxsLFxuICAgIG9uZXJyb3I6IG51bGwsXG4gICAgb25zdWNjZXNzOiBudWxsLFxuICAgIG9udXBncmFkZW5lZWRlZDogbnVsbCxcbiAgICBlcnJvcjogbnVsbCxcbiAgICByZWFkeVN0YXRlOiAncGVuZGluZycsXG4gICAgcmVzdWx0OiBudWxsIGFzIGFueSwgLy8gQ2Fubm90IGJlIGFjY2Vzc2VkIGZvciAncGVuZGluZycgc3RhdGUgYW55d2F5XG4gICAgc291cmNlOiBudWxsIGFzIGFueSwgLy8gbnVsbCBmb3Igb3BlbiByZXF1ZXN0c1xuICAgIHRyYW5zYWN0aW9uOiBudWxsLFxufTtcbmNvbnN0IFNFTEYgPSBbJ2ZyYW1lcycsICdwYXJlbnQnLCAnc2VsZicsICd0b3AnLCAnd2luZG93J107XG5jb25zdCBXSU5ET1dfSEFORExFUjogUHJveHlIYW5kbGVyPFdpbmRvdz4gPSB7XG4gICAgZ2V0OiAod2luZG93UmVmLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoU0VMRi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93UmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKCdvbicpID8gbnVsbCA6IHdpbmRvd1JlZltrZXkgYXMga2V5b2YgV2luZG93XTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IFVOSVZFUlNBTF9XSU5ET1c6IEZhY3RvcnlQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBXQV9XSU5ET1csXG4gICAgZGVwczogW0RPQ1VNRU5ULCBbbmV3IE9wdGlvbmFsKCksIFNTUl9MT0NBVElPTl0sIFtuZXcgT3B0aW9uYWwoKSwgU1NSX1VTRVJfQUdFTlRdXSxcbiAgICB1c2VGYWN0b3J5OiAoXG4gICAgICAgIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgbG9jYXRpb246IExvY2F0aW9uIHwgbnVsbCxcbiAgICAgICAgdXNlckFnZW50OiBzdHJpbmcgfCBudWxsLFxuICAgICk6IFdpbmRvdyA9PiB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01vY2s6IFdpbmRvdyA9IHtcbiAgICAgICAgICAgIC4uLkVWRU5UX1RBUkdFVCxcbiAgICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlOiBuZXcgU3RvcmFnZU1vY2soKSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/PyBuZXcgTG9jYXRpb25Nb2NrKCksXG4gICAgICAgICAgICBuYXZpZ2F0b3I6IHsuLi5OQVZJR0FUT1JfTU9DSywgdXNlckFnZW50OiB1c2VyQWdlbnQgPz8gJyd9LFxuICAgICAgICAgICAgcGVyZm9ybWFuY2U6IHBlcmZvcm1hbmNlRmFjdG9yeSgpLFxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2U6IG5ldyBTdG9yYWdlTW9jaygpLFxuICAgICAgICAgICAgc3BlZWNoU3ludGhlc2lzOiBTUEVFQ0hfU1lOVEhFU0lTX01PQ0ssXG4gICAgICAgICAgICBjYWNoZXM6IENBQ0hFU19NT0NLLFxuICAgICAgICAgICAgY3J5cHRvOiBDUllQVE9fTU9DSyxcbiAgICAgICAgICAgIFVSTCxcbiAgICAgICAgICAgIFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgICAgIHNldFRpbWVvdXQsXG4gICAgICAgICAgICBzZXRJbnRlcnZhbCxcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCxcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwsXG4gICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgQmxvYjogQmxvYk1vY2ssXG4gICAgICAgICAgICBhbGVydDogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGNsaWVudEluZm9ybWF0aW9uOiB7Li4uTkFWSUdBVE9SX01PQ0ssIHVzZXJBZ2VudDogdXNlckFnZW50ID8/ICcnfSxcbiAgICAgICAgICAgIC8vIFRPRE86IENhbmRpZGF0ZSBmb3IgdG9rZW5cbiAgICAgICAgICAgIG1hdGNoTWVkaWE6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uRVZFTlRfVEFSR0VULFxuICAgICAgICAgICAgICAgIG1hdGNoZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lZGlhOiAnJyxcbiAgICAgICAgICAgICAgICBvbmNoYW5nZTogbnVsbCxcbiAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcjogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gVE9ETzogQ2FuZGlkYXRlIGZvciB0b2tlblxuICAgICAgICAgICAgaW5kZXhlZERCOiB7XG4gICAgICAgICAgICAgICAgY21wOiBhbHdheXNaZXJvLFxuICAgICAgICAgICAgICAgIG9wZW46ICgpID0+IERCX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2U6ICgpID0+IERCX1JFUVVFU1QsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHM6IHtcbiAgICAgICAgICAgICAgICBkZWZpbmU6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgZ2V0OiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHVwZ3JhZGU6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgd2hlbkRlZmluZWQ6IGFsd2F5c1JlamVjdGVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlTWVkaWE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgICAgICAgICBtYXRjaE1lZGl1bTogYWx3YXlzRmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgICAgICAgICBzY3JvbGxSZXN0b3JhdGlvbjogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB7fSxcbiAgICAgICAgICAgICAgICBiYWNrOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIGZvcndhcmQ6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgZ286IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcHVzaFN0YXRlOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VTdGF0ZTogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdFN0YXR1czogJycsXG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiAxLFxuICAgICAgICAgICAgZG9Ob3RUcmFjazogJycsXG4gICAgICAgICAgICBmcmFtZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBpbm5lckhlaWdodDogMCxcbiAgICAgICAgICAgIGlubmVyV2lkdGg6IDAsXG4gICAgICAgICAgICBpc1NlY3VyZUNvbnRleHQ6IGZhbHNlLFxuICAgICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICBvZmZzY3JlZW5CdWZmZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3BlbmVyOiB7fSxcbiAgICAgICAgICAgIG9yaWdpbjogJycsXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogJycsXG4gICAgICAgICAgICBvdXRlckhlaWdodDogMCxcbiAgICAgICAgICAgIG91dGVyV2lkdGg6IDAsXG4gICAgICAgICAgICBwYWdlWE9mZnNldDogMCxcbiAgICAgICAgICAgIHBhZ2VZT2Zmc2V0OiAwLFxuICAgICAgICAgICAgc2NyZWVuTGVmdDogMCxcbiAgICAgICAgICAgIHNjcmVlblRvcDogMCxcbiAgICAgICAgICAgIHNjcmVlblg6IDAsXG4gICAgICAgICAgICBzY3JlZW5ZOiAwLFxuICAgICAgICAgICAgc2Nyb2xsWDogMCxcbiAgICAgICAgICAgIHNjcm9sbFk6IDAsXG4gICAgICAgICAgICBzdGF0dXM6ICcnLFxuICAgICAgICAgICAgYmx1cjogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgY2FwdHVyZUV2ZW50czogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGNsb3NlOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgY29uZmlybTogYWx3YXlzRmFsc2UsXG4gICAgICAgICAgICBkZXBhcnRGb2N1czogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGZvY3VzOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgbW92ZUJ5OiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgbW92ZVRvOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgb3BlbjogYWx3YXlzTnVsbCxcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgcHJpbnQ6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICBwcm9tcHQ6IGFsd2F5c051bGwsXG4gICAgICAgICAgICByZWxlYXNlRXZlbnRzOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOiBhbHdheXNaZXJvLFxuICAgICAgICAgICAgcmVzaXplQnk6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICByZXNpemVUbzogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIHNjcm9sbDogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIHNjcm9sbEJ5OiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgc2Nyb2xsVG86IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICBzdG9wOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgYXRvYjogaWRlbnRpdHksXG4gICAgICAgICAgICBidG9hOiBpZGVudGl0eSxcbiAgICAgICAgICAgIGZldGNoOiBhbHdheXNSZWplY3RlZCxcbiAgICAgICAgICAgIGNyZWF0ZUltYWdlQml0bWFwOiBhbHdheXNSZWplY3RlZCxcbiAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgbG9jYXRpb25iYXI6IEJBUl9QUk9QLFxuICAgICAgICAgICAgbWVudWJhcjogQkFSX1BST1AsXG4gICAgICAgICAgICBwZXJzb25hbGJhcjogQkFSX1BST1AsXG4gICAgICAgICAgICBzY3JvbGxiYXJzOiBCQVJfUFJPUCxcbiAgICAgICAgICAgIHN0YXR1c2JhcjogQkFSX1BST1AsXG4gICAgICAgICAgICB0b29sYmFyOiBCQVJfUFJPUCxcbiAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGU6ICgpID0+IENPTVBVVEVEX1NUWUxFU19QUk9YWSxcbiAgICAgICAgICAgIGdldE1hdGNoZWRDU1NSdWxlczogKCkgPT4gQ1NTX1JVTEVTLFxuICAgICAgICAgICAgZ2V0U2VsZWN0aW9uOiAoKSA9PiBudWxsLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHdpbmRvd01vY2ssIFdJTkRPV19IQU5ETEVSKTtcbiAgICB9LFxufTtcbiJdfQ==