UNPKG

@dlr-eoc/services-ogc

Version:

This module bundles our clients for OGC standards. E.g. parse OWS Context JSON, WMS, WMTS or WPS.

143 lines 19.4 kB
/** This file contains functions (Type Guards) to test for types in owc-json.ts */ import { GeoJsonOffering, tmsOffering, xyzOffering } from './eoc-owc-json'; import { cswOffering, GeoTIFFOffering, GMLCOVOffering, GMLJP2Offering, gmlOffering, kmlOffering, wcsOffering, wfsOffering, wmsOffering, wmtsOffering } from './owc-json'; /** * export types to create layers from Offerings */ export const GetMapOperationCode = 'GetMap'; export const GetFeatureOperationCode = 'GetFeature'; export const GetTileOperationCode = 'GetTile'; export const RESTOperationCode = 'REST'; export const GetCapabilitiesOperationCode = 'GetCapabilities'; export const DescribeFeatureTypeOperationCode = 'DescribeFeatureType'; export const GetFeatureInfoOperationCode = 'GetFeatureInfo'; function trueForAll(list, predicate) { for (const entry of list) { if (!predicate(entry)) { return false; } } return true; } export function isIOwsContext(object) { let ISCONTEXT_1_0; if (object?.properties?.links) { ISCONTEXT_1_0 = object.properties.links.profiles.find(item => item.href === 'http://www.opengis.net/spec/owc-geojson/1.0/req/core'); } if (!ISCONTEXT_1_0) { console.error('this is not a valid OWS Context v1.0!'); return false; } else { return true; } } export function isIOwsResource(object) { return 'id' in object && 'type' in object && 'properties' in object && isIOwsResourceProperties(object.properties); } export function isIOwsResourceProperties(object) { return 'title' in object && 'updated' in object && (object.authors ? trueForAll(object.authors, isIOwsAuthor) : true) && (object.offerings ? trueForAll(object.offerings, isIOwsOffering) : true) && (object.categories ? trueForAll(object.categories, isIOwsCategory) : true); } export function isIOwsOffering(object) { return 'code' in object && (object.operations ? trueForAll(object.operations, isIOwsOperation) : true) && (object.contents ? trueForAll(object.contents, isIOwsContent) : true) && (object.styles ? trueForAll(object.styles, isIOwsStyleSet) : true); } export function isIOwsGenerator(object) { return 'title' in object || 'uri' in object || 'version' in object; } export function isIOwsAuthor(object) { return 'name' in object || 'email' in object || 'uri' in object; } export function isIOwsCategory(object) { return 'scheme' in object || 'term' in object || 'label' in object; } export function isIOwsLinks(object) { return 'rel' in object; } export function isIOwsCreatorDisplay(object) { return 'pixelWidth' in object || 'pixelHeight' in object || 'mmPerPixel' in object; } export function isIOwsOperation(object) { return 'code' in object && 'method' in object && (object.request ? isIOwsContent(object.request) : true) && (object.result ? isIOwsContent(object.result) : true); } export function isIOwsRasterOperation(object) { if (isIOwsOperation(object)) { return [GetMapOperationCode, GetTileOperationCode, RESTOperationCode].includes(object.code); } else { return false; } } export function isIOwsVectorOperation(object) { if (isIOwsOperation(object)) { return [GetFeatureOperationCode].includes(object.code); } else { return false; } } export function isIOwsContent(object) { return 'type' in object; } export function isIOwsStyleSet(object) { return 'name' in object && 'title' in object; } export function isWmsOffering(str) { return str === wmsOffering; } export function isWfsOffering(str) { return str === wfsOffering; } export function isWpsOffering(str) { return str === wcsOffering; } export function isCswOffering(str) { return str === cswOffering; } export function isWmtsOffering(str) { return str === wmtsOffering; } export function isGmlOffering(str) { return str === gmlOffering; } export function isKmlOffering(str) { return str === kmlOffering; } export function isGeoTIFFOffering(str) { return str === GeoTIFFOffering; } export function isGMLJP2Offering(str) { return str === GMLJP2Offering; } export function isGMLCOVOffering(str) { return str === GMLCOVOffering; } export function isXyzOffering(str) { return str === xyzOffering; } export function isGeoJsonOffering(str) { return str === GeoJsonOffering; } export function isTMSOffering(str) { return str === tmsOffering; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3djLWpzb24udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlcy1vZ2Mvc3JjL2xpYi9vd2MvdHlwZXMvb3djLWpzb24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0ZBQWtGO0FBRWxGLE9BQU8sRUFBZ0QsZUFBZSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsV0FBVyxFQUFnQixlQUFlLEVBQW9CLGNBQWMsRUFBbUIsY0FBYyxFQUFtQixXQUFXLEVBQW1NLFdBQVcsRUFBZ0IsV0FBVyxFQUFnQixXQUFXLEVBQWdCLFdBQVcsRUFBZ0IsWUFBWSxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUduZjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQWlCLENBQUM7QUFHckQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsWUFBcUIsQ0FBQztBQUc3RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFrQixDQUFDO0FBR3ZELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE1BQWUsQ0FBQztBQUlqRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxpQkFBMEIsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxxQkFBOEIsQ0FBQztBQUMvRSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxnQkFBeUIsQ0FBQztBQUdyRSxTQUFTLFVBQVUsQ0FBQyxJQUFXLEVBQUUsU0FBOEI7SUFDN0QsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBbUI7SUFDL0MsSUFBSSxhQUFhLENBQUM7SUFDbEIsSUFBSSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzlCLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxzREFBc0QsQ0FBQyxDQUFDO0lBQ3RJLENBQUM7SUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFXO0lBQ3hDLE9BQU8sSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTTtXQUNwQyxZQUFZLElBQUksTUFBTSxJQUFJLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQVc7SUFDbEQsT0FBTyxPQUFPLElBQUksTUFBTTtXQUNuQixTQUFTLElBQUksTUFBTTtXQUNuQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7V0FDbEUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1dBQ3hFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQVc7SUFDeEMsT0FBTyxNQUFNLElBQUksTUFBTTtXQUNsQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7V0FDM0UsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1dBQ3JFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3pFLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQVc7SUFDekMsT0FBTyxPQUFPLElBQUksTUFBTTtXQUNuQixLQUFLLElBQUksTUFBTTtXQUNmLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBVztJQUN0QyxPQUFPLE1BQU0sSUFBSSxNQUFNO1dBQ2xCLE9BQU8sSUFBSSxNQUFNO1dBQ2pCLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDdkIsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBVztJQUN4QyxPQUFPLFFBQVEsSUFBSSxNQUFNO1dBQ3BCLE1BQU0sSUFBSSxNQUFNO1dBQ2hCLE9BQU8sSUFBSSxNQUFNLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBVztJQUNyQyxPQUFPLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFXO0lBQzlDLE9BQU8sWUFBWSxJQUFJLE1BQU07V0FDeEIsYUFBYSxJQUFJLE1BQU07V0FDdkIsWUFBWSxJQUFJLE1BQU0sQ0FBQztBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFXO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLE1BQU07V0FDbEIsUUFBUSxJQUFJLE1BQU07V0FDbEIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7V0FDdkQsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQVc7SUFDL0MsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQVcsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUFXO0lBQy9DLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQVc7SUFDdkMsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQVc7SUFDeEMsT0FBTyxNQUFNLElBQUksTUFBTTtXQUNsQixPQUFPLElBQUksTUFBTSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVc7SUFDeEMsT0FBTyxHQUFHLEtBQUssWUFBWSxDQUFDO0FBQzlCLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBVztJQUMzQyxPQUFPLEdBQUcsS0FBSyxlQUFlLENBQUM7QUFDakMsQ0FBQztBQUNELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXO0lBQzFDLE9BQU8sR0FBRyxLQUFLLGNBQWMsQ0FBQztBQUNoQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVc7SUFDMUMsT0FBTyxHQUFHLEtBQUssY0FBYyxDQUFDO0FBQ2hDLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVc7SUFDdkMsT0FBTyxHQUFHLEtBQUssV0FBVyxDQUFDO0FBQzdCLENBQUM7QUFDRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBVztJQUMzQyxPQUFPLEdBQUcsS0FBSyxlQUFlLENBQUM7QUFDakMsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVztJQUN2QyxPQUFPLEdBQUcsS0FBSyxXQUFXLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIChUeXBlIEd1YXJkcykgdG8gdGVzdCBmb3IgdHlwZXMgaW4gb3djLWpzb24udHMgKi9cclxuXHJcbmltcG9ydCB7IFh5el9PZmZlcmluZywgR2VvSnNvbl9PZmZlcmluZywgVE1TX09mZmVyaW5nLCBHZW9Kc29uT2ZmZXJpbmcsIHRtc09mZmVyaW5nLCB4eXpPZmZlcmluZyB9IGZyb20gJy4vZW9jLW93Yy1qc29uJztcclxuaW1wb3J0IHsgY3N3T2ZmZXJpbmcsIENTV19PZmZlcmluZywgR2VvVElGRk9mZmVyaW5nLCBHZW9USUZGX09mZmVyaW5nLCBHTUxDT1ZPZmZlcmluZywgR01MQ09WX09mZmVyaW5nLCBHTUxKUDJPZmZlcmluZywgR01MSlAyX09mZmVyaW5nLCBnbWxPZmZlcmluZywgR01MX09mZmVyaW5nLCBJT3dzQXV0aG9yLCBJT3dzQ2F0ZWdvcnksIElPd3NDb250ZW50LCBJT3dzQ29udGV4dCwgSU93c0dlbmVyYXRvciwgSU93c0NyZWF0b3JEaXNwbGF5LCBJT3dzTGlua3MsIElPd3NPZmZlcmluZywgSU93c09wZXJhdGlvbiwgSU93c1Jlc291cmNlLCBJT3dzUmVzb3VyY2VQcm9wZXJ0aWVzLCBJT3dzU3R5bGVTZXQsIGttbE9mZmVyaW5nLCBLTUxfT2ZmZXJpbmcsIHdjc09mZmVyaW5nLCBXQ1NfT2ZmZXJpbmcsIHdmc09mZmVyaW5nLCBXRlNfT2ZmZXJpbmcsIHdtc09mZmVyaW5nLCBXTVNfT2ZmZXJpbmcsIHdtdHNPZmZlcmluZywgV01UU19PZmZlcmluZyB9IGZyb20gJy4vb3djLWpzb24nO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBleHBvcnQgdHlwZXMgdG8gY3JlYXRlIGxheWVycyBmcm9tIE9mZmVyaW5nc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdldE1hcE9wZXJhdGlvbkNvZGUgPSAnR2V0TWFwJyBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgV01TX0NvZGUgPSB0eXBlb2YgR2V0TWFwT3BlcmF0aW9uQ29kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBHZXRGZWF0dXJlT3BlcmF0aW9uQ29kZSA9ICdHZXRGZWF0dXJlJyBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgV0ZTX0NvZGUgPSB0eXBlb2YgR2V0RmVhdHVyZU9wZXJhdGlvbkNvZGU7XHJcblxyXG5leHBvcnQgY29uc3QgR2V0VGlsZU9wZXJhdGlvbkNvZGUgPSAnR2V0VGlsZScgYXMgY29uc3Q7XHJcbmV4cG9ydCB0eXBlIFdNVFNfQ29kZSA9IHR5cGVvZiBHZXRUaWxlT3BlcmF0aW9uQ29kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBSRVNUT3BlcmF0aW9uQ29kZSA9ICdSRVNUJyBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgVE1TX0NvZGUgPSB0eXBlb2YgUkVTVE9wZXJhdGlvbkNvZGU7XHJcbmV4cG9ydCB0eXBlIFhZWl9Db2RlID0gdHlwZW9mIFJFU1RPcGVyYXRpb25Db2RlO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdldENhcGFiaWxpdGllc09wZXJhdGlvbkNvZGUgPSAnR2V0Q2FwYWJpbGl0aWVzJyBhcyBjb25zdDtcclxuZXhwb3J0IGNvbnN0IERlc2NyaWJlRmVhdHVyZVR5cGVPcGVyYXRpb25Db2RlID0gJ0Rlc2NyaWJlRmVhdHVyZVR5cGUnIGFzIGNvbnN0O1xyXG5leHBvcnQgY29uc3QgR2V0RmVhdHVyZUluZm9PcGVyYXRpb25Db2RlID0gJ0dldEZlYXR1cmVJbmZvJyBhcyBjb25zdDtcclxuXHJcblxyXG5mdW5jdGlvbiB0cnVlRm9yQWxsKGxpc3Q6IGFueVtdLCBwcmVkaWNhdGU6IChvOiBhbnkpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3QpIHtcclxuICAgIGlmICghcHJlZGljYXRlKGVudHJ5KSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQ29udGV4dChvYmplY3Q6IElPd3NDb250ZXh0KTogb2JqZWN0IGlzIElPd3NDb250ZXh0IHtcclxuICBsZXQgSVNDT05URVhUXzFfMDtcclxuICBpZiAob2JqZWN0Py5wcm9wZXJ0aWVzPy5saW5rcykge1xyXG4gICAgSVNDT05URVhUXzFfMCA9IG9iamVjdC5wcm9wZXJ0aWVzLmxpbmtzLnByb2ZpbGVzLmZpbmQoaXRlbSA9PiBpdGVtLmhyZWYgPT09ICdodHRwOi8vd3d3Lm9wZW5naXMubmV0L3NwZWMvb3djLWdlb2pzb24vMS4wL3JlcS9jb3JlJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoIUlTQ09OVEVYVF8xXzApIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ3RoaXMgaXMgbm90IGEgdmFsaWQgT1dTIENvbnRleHQgdjEuMCEnKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzUmVzb3VyY2Uob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c1Jlc291cmNlIHtcclxuICByZXR1cm4gJ2lkJyBpbiBvYmplY3QgJiYgJ3R5cGUnIGluIG9iamVjdFxyXG4gICAgJiYgJ3Byb3BlcnRpZXMnIGluIG9iamVjdCAmJiBpc0lPd3NSZXNvdXJjZVByb3BlcnRpZXMob2JqZWN0LnByb3BlcnRpZXMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzUmVzb3VyY2VQcm9wZXJ0aWVzKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NSZXNvdXJjZVByb3BlcnRpZXMge1xyXG4gIHJldHVybiAndGl0bGUnIGluIG9iamVjdFxyXG4gICAgJiYgJ3VwZGF0ZWQnIGluIG9iamVjdFxyXG4gICAgJiYgKG9iamVjdC5hdXRob3JzID8gdHJ1ZUZvckFsbChvYmplY3QuYXV0aG9ycywgaXNJT3dzQXV0aG9yKSA6IHRydWUpXHJcbiAgICAmJiAob2JqZWN0Lm9mZmVyaW5ncyA/IHRydWVGb3JBbGwob2JqZWN0Lm9mZmVyaW5ncywgaXNJT3dzT2ZmZXJpbmcpIDogdHJ1ZSlcclxuICAgICYmIChvYmplY3QuY2F0ZWdvcmllcyA/IHRydWVGb3JBbGwob2JqZWN0LmNhdGVnb3JpZXMsIGlzSU93c0NhdGVnb3J5KSA6IHRydWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzT2ZmZXJpbmcob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c09mZmVyaW5nIHtcclxuICByZXR1cm4gJ2NvZGUnIGluIG9iamVjdFxyXG4gICAgJiYgKG9iamVjdC5vcGVyYXRpb25zID8gdHJ1ZUZvckFsbChvYmplY3Qub3BlcmF0aW9ucywgaXNJT3dzT3BlcmF0aW9uKSA6IHRydWUpXHJcbiAgICAmJiAob2JqZWN0LmNvbnRlbnRzID8gdHJ1ZUZvckFsbChvYmplY3QuY29udGVudHMsIGlzSU93c0NvbnRlbnQpIDogdHJ1ZSlcclxuICAgICYmIChvYmplY3Quc3R5bGVzID8gdHJ1ZUZvckFsbChvYmplY3Quc3R5bGVzLCBpc0lPd3NTdHlsZVNldCkgOiB0cnVlKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzR2VuZXJhdG9yKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NHZW5lcmF0b3Ige1xyXG4gIHJldHVybiAndGl0bGUnIGluIG9iamVjdFxyXG4gICAgfHwgJ3VyaScgaW4gb2JqZWN0XHJcbiAgICB8fCAndmVyc2lvbicgaW4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQXV0aG9yKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NBdXRob3Ige1xyXG4gIHJldHVybiAnbmFtZScgaW4gb2JqZWN0XHJcbiAgICB8fCAnZW1haWwnIGluIG9iamVjdFxyXG4gICAgfHwgJ3VyaScgaW4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQ2F0ZWdvcnkob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c0NhdGVnb3J5IHtcclxuICByZXR1cm4gJ3NjaGVtZScgaW4gb2JqZWN0XHJcbiAgICB8fCAndGVybScgaW4gb2JqZWN0XHJcbiAgICB8fCAnbGFiZWwnIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSU93c0xpbmtzKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NMaW5rcyB7XHJcbiAgcmV0dXJuICdyZWwnIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSU93c0NyZWF0b3JEaXNwbGF5KG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NDcmVhdG9yRGlzcGxheSB7XHJcbiAgcmV0dXJuICdwaXhlbFdpZHRoJyBpbiBvYmplY3RcclxuICAgIHx8ICdwaXhlbEhlaWdodCcgaW4gb2JqZWN0XHJcbiAgICB8fCAnbW1QZXJQaXhlbCcgaW4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzT3BlcmF0aW9uKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NPcGVyYXRpb24ge1xyXG4gIHJldHVybiAnY29kZScgaW4gb2JqZWN0XHJcbiAgICAmJiAnbWV0aG9kJyBpbiBvYmplY3RcclxuICAgICYmIChvYmplY3QucmVxdWVzdCA/IGlzSU93c0NvbnRlbnQob2JqZWN0LnJlcXVlc3QpIDogdHJ1ZSlcclxuICAgICYmIChvYmplY3QucmVzdWx0ID8gaXNJT3dzQ29udGVudChvYmplY3QucmVzdWx0KSA6IHRydWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzUmFzdGVyT3BlcmF0aW9uKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NPcGVyYXRpb24ge1xyXG4gIGlmIChpc0lPd3NPcGVyYXRpb24ob2JqZWN0KSkge1xyXG4gICAgcmV0dXJuIFtHZXRNYXBPcGVyYXRpb25Db2RlLCBHZXRUaWxlT3BlcmF0aW9uQ29kZSwgUkVTVE9wZXJhdGlvbkNvZGVdLmluY2x1ZGVzKG9iamVjdC5jb2RlIGFzIGFueSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0lPd3NWZWN0b3JPcGVyYXRpb24ob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c09wZXJhdGlvbiB7XHJcbiAgaWYgKGlzSU93c09wZXJhdGlvbihvYmplY3QpKSB7XHJcbiAgICByZXR1cm4gW0dldEZlYXR1cmVPcGVyYXRpb25Db2RlXS5pbmNsdWRlcyhvYmplY3QuY29kZSBhcyBhbnkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQ29udGVudChvYmplY3Q6IGFueSk6IG9iamVjdCBpcyBJT3dzQ29udGVudCB7XHJcbiAgcmV0dXJuICd0eXBlJyBpbiBvYmplY3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0lPd3NTdHlsZVNldChvYmplY3Q6IGFueSk6IG9iamVjdCBpcyBJT3dzU3R5bGVTZXQge1xyXG4gIHJldHVybiAnbmFtZScgaW4gb2JqZWN0XHJcbiAgICAmJiAndGl0bGUnIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV21zT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgV01TX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSB3bXNPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNXZnNPZmZlcmluZyhzdHI6IHN0cmluZyk6IHN0ciBpcyBXRlNfT2ZmZXJpbmcge1xyXG4gIHJldHVybiBzdHIgPT09IHdmc09mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc1dwc09mZmVyaW5nKHN0cjogc3RyaW5nKTogc3RyIGlzIFdDU19PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gd2NzT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ3N3T2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgQ1NXX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBjc3dPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNXbXRzT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgV01UU19PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gd210c09mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dtbE9mZmVyaW5nKHN0cjogc3RyaW5nKTogc3RyIGlzIEdNTF9PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gZ21sT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzS21sT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgS01MX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBrbWxPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9USUZGT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgR2VvVElGRl9PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gR2VvVElGRk9mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dNTEpQMk9mZmVyaW5nKHN0cjogc3RyaW5nKTogc3RyIGlzIEdNTEpQMl9PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gR01MSlAyT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzR01MQ09WT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgR01MQ09WX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBHTUxDT1ZPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNYeXpPZmZlcmluZyhzdHI6IHN0cmluZyk6IHN0ciBpcyBYeXpfT2ZmZXJpbmcge1xyXG4gIHJldHVybiBzdHIgPT09IHh5ek9mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0pzb25PZmZlcmluZyhzdHI6IHN0cmluZyk6IHN0ciBpcyBHZW9Kc29uX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBHZW9Kc29uT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVE1TT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgVE1TX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSB0bXNPZmZlcmluZztcclxufVxyXG4iXX0=