UNPKG

nsrtm-gestionarchivo-npm-prueba2

Version:

Proyecto de Libreria Frontend para la Gestión de Archivos

337 lines 44.4 kB
/* tslint:disable */ /* eslint-disable */ import { HttpRequest, HttpParams, HttpHeaders } from '@angular/common/http'; /** * Custom parameter codec to correctly handle the plus sign in parameter * values. See https://github.com/angular/angular/issues/18261 */ class ParameterCodec { encodeKey(key) { return encodeURIComponent(key); } encodeValue(value) { return encodeURIComponent(value); } decodeKey(key) { return decodeURIComponent(key); } decodeValue(value) { return decodeURIComponent(value); } } const ParameterCodecInstance = new ParameterCodec(); /** * Base class for a parameter */ class Parameter { constructor(name, value, options, defaultStyle, defaultExplode) { this.name = name; this.value = value; this.options = options; this.options = options || {}; if (this.options.style === null || this.options.style === undefined) { this.options.style = defaultStyle; } if (this.options.explode === null || this.options.explode === undefined) { this.options.explode = defaultExplode; } } serializeValue(value, separator = ',') { if (value === null || value === undefined) { return ''; } else if (value instanceof Array) { return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator); } else if (typeof value === 'object') { const array = []; for (const key of Object.keys(value)) { let propVal = value[key]; if (propVal !== null && propVal !== undefined) { propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator)); if (this.options.explode) { array.push(`${key}=${propVal}`); } else { array.push(key); array.push(propVal); } } } return array.join(separator); } else { return String(value); } } } /** * A parameter in the operation path */ class PathParameter extends Parameter { constructor(name, value, options) { super(name, value, options, 'simple', false); } append(path) { let value = this.value; if (value === null || value === undefined) { value = ''; } let prefix = this.options.style === 'label' ? '.' : ''; let separator = this.options.explode ? prefix === '' ? ',' : prefix : ','; let alreadySerialized = false; if (this.options.style === 'matrix') { // The parameter name is just used as prefix, except in some cases... prefix = `;${this.name}=`; if (this.options.explode && typeof value === 'object') { prefix = ';'; if (value instanceof Array) { // For arrays we have to repeat the name for each element value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`); value = value.join(';'); alreadySerialized = true; } else { // For objects we have to put each the key / value pairs value = this.serializeValue(value, ';'); alreadySerialized = true; } } } value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator)); // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account path = path.replace(`{${this.name}}`, value); path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value); return path; } // @ts-ignore serializeValue(value, separator = ',') { var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator); result = result.replace(/%3D/g, '='); result = result.replace(/%3B/g, ';'); result = result.replace(/%2C/g, ','); return result; } } /** * A parameter in the query */ class QueryParameter extends Parameter { constructor(name, value, options) { super(name, value, options, 'form', true); } append(params) { if (this.value instanceof Array) { // Array serialization if (this.options.explode) { for (const v of this.value) { params = params.append(this.name, this.serializeValue(v)); } } else { const separator = this.options.style === 'spaceDelimited' ? ' ' : this.options.style === 'pipeDelimited' ? '|' : ','; return params.append(this.name, this.serializeValue(this.value, separator)); } } else if (this.value !== null && typeof this.value === 'object') { // Object serialization if (this.options.style === 'deepObject') { // Append a parameter for each key, in the form `name[key]` for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal)); } } } else if (this.options.explode) { // Append a parameter for each key without using the parameter name for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { params = params.append(key, this.serializeValue(propVal)); } } } else { // Append a single parameter whose values are a comma-separated list of key,value,key,value... const array = []; for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { array.push(key); array.push(propVal); } } params = params.append(this.name, this.serializeValue(array)); } } else if (this.value !== null && this.value !== undefined) { // Plain value params = params.append(this.name, this.serializeValue(this.value)); } return params; } } /** * A parameter in the HTTP request header */ class HeaderParameter extends Parameter { constructor(name, value, options) { super(name, value, options, 'simple', false); } append(headers) { if (this.value !== null && this.value !== undefined) { if (this.value instanceof Array) { for (const v of this.value) { headers = headers.append(this.name, this.serializeValue(v)); } } else { headers = headers.append(this.name, this.serializeValue(this.value)); } } return headers; } } /** * Helper to build http requests from parameters */ export class RequestBuilder { constructor(rootUrl, operationPath, method) { this.rootUrl = rootUrl; this.operationPath = operationPath; this.method = method; this._path = new Map(); this._query = new Map(); this._header = new Map(); } /** * Sets a path parameter */ path(name, value, options) { this._path.set(name, new PathParameter(name, value, options || {})); } /** * Sets a query parameter */ query(name, value, options) { this._query.set(name, new QueryParameter(name, value, options || {})); } /** * Sets a header parameter */ header(name, value, options) { this._header.set(name, new HeaderParameter(name, value, options || {})); } /** * Sets the body content, along with the content type */ body(value, contentType = 'application/json') { if (value instanceof Blob) { this._bodyContentType = value.type; } else { this._bodyContentType = contentType; } if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') { // Handle URL-encoded data const pairs = []; for (const key of Object.keys(value)) { let val = value[key]; if (!(val instanceof Array)) { val = [val]; } for (const v of val) { const formValue = this.formDataValue(v); if (formValue !== null) { pairs.push([key, formValue]); } } } this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&'); } else if (this._bodyContentType === 'multipart/form-data') { // Handle multipart form data const formData = new FormData(); if (value !== null && value !== undefined) { for (const key of Object.keys(value)) { const val = value[key]; if (val instanceof Array) { for (const v of val) { const toAppend = this.formDataValue(v); if (toAppend !== null) { formData.append(key, toAppend); } } } else { const toAppend = this.formDataValue(val); if (toAppend !== null) { formData.set(key, toAppend); } } } } this._bodyContent = formData; } else { // The body is the plain content this._bodyContent = value; } } formDataValue(value) { if (value === null || value === undefined) { return null; } if (value instanceof Blob) { return value; } if (typeof value === 'object') { return JSON.stringify(value); } return String(value); } /** * Builds the request with the current set parameters */ build(options) { options = options || {}; // Path parameters let path = this.operationPath; for (const pathParam of this._path.values()) { path = pathParam.append(path); } const url = this.rootUrl + path; // Query parameters let httpParams = new HttpParams({ encoder: ParameterCodecInstance }); for (const queryParam of this._query.values()) { httpParams = queryParam.append(httpParams); } // Header parameters let httpHeaders = new HttpHeaders(); if (options.accept) { httpHeaders = httpHeaders.append('Accept', options.accept); } for (const headerParam of this._header.values()) { httpHeaders = headerParam.append(httpHeaders); } // Request content headers if (this._bodyContentType && !(this._bodyContent instanceof FormData)) { httpHeaders = httpHeaders.set('Content-Type', this._bodyContentType); } // Perform the request return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, { params: httpParams, headers: httpHeaders, responseType: options.responseType, reportProgress: options.reportProgress, context: options.context }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vYXJjaGl2by9uc3J0bS1nZXN0aW9uYXJjaGl2by1ucG0vc3JjL2FwcC9hcGkvcGFyYW1ldHJvLWNvbXVuL3JlcXVlc3QtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxXQUFXLEVBQXNCLFVBQVUsRUFBRSxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUU3Rzs7O0dBR0c7QUFDSCxNQUFNLGNBQWM7SUFDbEIsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFDRCxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7QUFVcEQ7O0dBRUc7QUFDSCxNQUFlLFNBQVM7SUFDdEIsWUFBbUIsSUFBWSxFQUFTLEtBQVUsRUFBUyxPQUF5QixFQUFFLFlBQW9CLEVBQUUsY0FBdUI7UUFBaEgsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQUs7UUFBUyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUNsRixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxD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QUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7WUFDbEMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1lBQ3RDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFBhcmFtZXRlckNvZGVjLCBIdHRwUGFyYW1zLCBIdHRwSGVhZGVycywgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG4vKipcclxuICogQ3VzdG9tIHBhcmFtZXRlciBjb2RlYyB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBwbHVzIHNpZ24gaW4gcGFyYW1ldGVyXHJcbiAqIHZhbHVlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE4MjYxXHJcbiAqL1xyXG5jbGFzcyBQYXJhbWV0ZXJDb2RlYyBpbXBsZW1lbnRzIEh0dHBQYXJhbWV0ZXJDb2RlYyB7XHJcbiAgZW5jb2RlS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KTtcclxuICB9XHJcblxyXG4gIGVuY29kZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBkZWNvZGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChrZXkpO1xyXG4gIH1cclxuXHJcbiAgZGVjb2RlVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuICB9XHJcbn1cclxuY29uc3QgUGFyYW1ldGVyQ29kZWNJbnN0YW5jZSA9IG5ldyBQYXJhbWV0ZXJDb2RlYygpO1xyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgdGhlIG9wdGlvbnMgZm9yIGFwcGVuZGluZyBhIHBhcmFtZXRlclxyXG4gKi9cclxuaW50ZXJmYWNlIFBhcmFtZXRlck9wdGlvbnMge1xyXG4gIHN0eWxlPzogc3RyaW5nO1xyXG4gIGV4cGxvZGU/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQmFzZSBjbGFzcyBmb3IgYSBwYXJhbWV0ZXJcclxuICovXHJcbmFic3RyYWN0IGNsYXNzIFBhcmFtZXRlciB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBhbnksIHB1YmxpYyBvcHRpb25zOiBQYXJhbWV0ZXJPcHRpb25zLCBkZWZhdWx0U3R5bGU6IHN0cmluZywgZGVmYXVsdEV4cGxvZGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlID09PSBudWxsIHx8IHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IGRlZmF1bHRTdHlsZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwbG9kZSA9PT0gbnVsbCB8fCB0aGlzLm9wdGlvbnMuZXhwbG9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5leHBsb2RlID0gZGVmYXVsdEV4cGxvZGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXJpYWxpemVWYWx1ZSh2YWx1ZTogYW55LCBzZXBhcmF0b3IgPSAnLCcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAodiA9PiB0aGlzLnNlcmlhbGl6ZVZhbHVlKHYpLnNwbGl0KHNlcGFyYXRvcikuam9pbihlbmNvZGVVUklDb21wb25lbnQoc2VwYXJhdG9yKSkpLmpvaW4oc2VwYXJhdG9yKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBjb25zdCBhcnJheTogc3RyaW5nW10gPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XHJcbiAgICAgICAgbGV0IHByb3BWYWwgPSB2YWx1ZVtrZXldO1xyXG4gICAgICAgIGlmIChwcm9wVmFsICE9PSBudWxsICYmIHByb3BWYWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcHJvcFZhbCA9IHRoaXMuc2VyaWFsaXplVmFsdWUocHJvcFZhbCkuc3BsaXQoc2VwYXJhdG9yKS5qb2luKGVuY29kZVVSSUNvbXBvbmVudChzZXBhcmF0b3IpKTtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwbG9kZSkge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGAke2tleX09JHtwcm9wVmFsfWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChrZXkpO1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKHByb3BWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXJyYXkuam9pbihzZXBhcmF0b3IpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBwYXJhbWV0ZXIgaW4gdGhlIG9wZXJhdGlvbiBwYXRoXHJcbiAqL1xyXG5jbGFzcyBQYXRoUGFyYW1ldGVyIGV4dGVuZHMgUGFyYW1ldGVyIHtcclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFBhcmFtZXRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zLCAnc2ltcGxlJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgYXBwZW5kKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIGxldCBwcmVmaXggPSB0aGlzLm9wdGlvbnMuc3R5bGUgPT09ICdsYWJlbCcgPyAnLicgOiAnJztcclxuICAgIGxldCBzZXBhcmF0b3IgPSB0aGlzLm9wdGlvbnMuZXhwbG9kZSA/IHByZWZpeCA9PT0gJycgPyAnLCcgOiBwcmVmaXggOiAnLCc7XHJcbiAgICBsZXQgYWxyZWFkeVNlcmlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3R5bGUgPT09ICdtYXRyaXgnKSB7XHJcbiAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBqdXN0IHVzZWQgYXMgcHJlZml4LCBleGNlcHQgaW4gc29tZSBjYXNlcy4uLlxyXG4gICAgICBwcmVmaXggPSBgOyR7dGhpcy5uYW1lfT1gO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4cGxvZGUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHByZWZpeCA9ICc7JztcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgLy8gRm9yIGFycmF5cyB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgbmFtZSBmb3IgZWFjaCBlbGVtZW50XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcCh2ID0+IGAke3RoaXMubmFtZX09JHt0aGlzLnNlcmlhbGl6ZVZhbHVlKHYsICc7Jyl9YCk7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJzsnKTtcclxuICAgICAgICAgIGFscmVhZHlTZXJpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gRm9yIG9iamVjdHMgd2UgaGF2ZSB0byBwdXQgZWFjaCB0aGUga2V5IC8gdmFsdWUgcGFpcnNcclxuICAgICAgICAgIHZhbHVlID0gdGhpcy5zZXJpYWxpemVWYWx1ZSh2YWx1ZSwgJzsnKTtcclxuICAgICAgICAgIGFscmVhZHlTZXJpYWxpemVkID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFsdWUgPSBwcmVmaXggKyAoYWxyZWFkeVNlcmlhbGl6ZWQgPyB2YWx1ZSA6IHRoaXMuc2VyaWFsaXplVmFsdWUodmFsdWUsIHNlcGFyYXRvcikpO1xyXG4gICAgLy8gUmVwbGFjZSBib3RoIHRoZSBwbGFpbiB2YXJpYWJsZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFudCB0YWtpbmcgaW4gdGhlIHByZWZpeCBhbmQgZXhwbG9kZSBpbnRvIGFjY291bnRcclxuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3RoaXMubmFtZX19YCwgdmFsdWUpO1xyXG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZShgeyR7cHJlZml4fSR7dGhpcy5uYW1lfSR7dGhpcy5vcHRpb25zLmV4cGxvZGUgPyAnKicgOiAnJ319YCwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHBhdGg7XHJcbiAgfVxyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgc2VyaWFsaXplVmFsdWUodmFsdWU6IGFueSwgc2VwYXJhdG9yID0gJywnKTogc3RyaW5nIHtcclxuICAgIHZhciByZXN1bHQgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6IHN1cGVyLnNlcmlhbGl6ZVZhbHVlKHZhbHVlLCBzZXBhcmF0b3IpO1xyXG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyUzRC9nLCAnPScpO1xyXG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyUzQi9nLCAnOycpO1xyXG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyUyQy9nLCAnLCcpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHBhcmFtZXRlciBpbiB0aGUgcXVlcnlcclxuICovXHJcbmNsYXNzIFF1ZXJ5UGFyYW1ldGVyIGV4dGVuZHMgUGFyYW1ldGVyIHtcclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFBhcmFtZXRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zLCAnZm9ybScsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgYXBwZW5kKHBhcmFtczogSHR0cFBhcmFtcyk6IEh0dHBQYXJhbXMge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAvLyBBcnJheSBzZXJpYWxpemF0aW9uXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwbG9kZSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ3NwYWNlRGVsaW1pdGVkJ1xyXG4gICAgICAgICAgPyAnICcgOiB0aGlzLm9wdGlvbnMuc3R5bGUgPT09ICdwaXBlRGVsaW1pdGVkJ1xyXG4gICAgICAgICAgICA/ICd8JyA6ICcsJztcclxuICAgICAgICByZXR1cm4gcGFyYW1zLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUodGhpcy52YWx1ZSwgc2VwYXJhdG9yKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gT2JqZWN0IHNlcmlhbGl6YXRpb25cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ2RlZXBPYmplY3QnKSB7XHJcbiAgICAgICAgLy8gQXBwZW5kIGEgcGFyYW1ldGVyIGZvciBlYWNoIGtleSwgaW4gdGhlIGZvcm0gYG5hbWVba2V5XWBcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc3QgcHJvcFZhbCA9IHRoaXMudmFsdWVba2V5XTtcclxuICAgICAgICAgIGlmIChwcm9wVmFsICE9PSBudWxsICYmIHByb3BWYWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGAke3RoaXMubmFtZX1bJHtrZXl9XWAsIHRoaXMuc2VyaWFsaXplVmFsdWUocHJvcFZhbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZXhwbG9kZSkge1xyXG4gICAgICAgIC8vIEFwcGVuZCBhIHBhcmFtZXRlciBmb3IgZWFjaCBrZXkgd2l0aG91dCB1c2luZyB0aGUgcGFyYW1ldGVyIG5hbWVcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc3QgcHJvcFZhbCA9IHRoaXMudmFsdWVba2V5XTtcclxuICAgICAgICAgIGlmIChwcm9wVmFsICE9PSBudWxsICYmIHByb3BWYWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGtleSwgdGhpcy5zZXJpYWxpemVWYWx1ZShwcm9wVmFsKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEFwcGVuZCBhIHNpbmdsZSBwYXJhbWV0ZXIgd2hvc2UgdmFsdWVzIGFyZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGtleSx2YWx1ZSxrZXksdmFsdWUuLi5cclxuICAgICAgICBjb25zdCBhcnJheTogYW55W10gPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc3QgcHJvcFZhbCA9IHRoaXMudmFsdWVba2V5XTtcclxuICAgICAgICAgIGlmIChwcm9wVmFsICE9PSBudWxsICYmIHByb3BWYWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2gocHJvcFZhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKGFycmF5KSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSAhPT0gbnVsbCAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gUGxhaW4gdmFsdWVcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUodGhpcy52YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHBhcmFtZXRlciBpbiB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlclxyXG4gKi9cclxuY2xhc3MgSGVhZGVyUGFyYW1ldGVyIGV4dGVuZHMgUGFyYW1ldGVyIHtcclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFBhcmFtZXRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zLCAnc2ltcGxlJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgYXBwZW5kKGhlYWRlcnM6IEh0dHBIZWFkZXJzKTogSHR0cEhlYWRlcnMge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUodGhpcy52YWx1ZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgdG8gYnVpbGQgaHR0cCByZXF1ZXN0cyBmcm9tIHBhcmFtZXRlcnNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0QnVpbGRlciB7XHJcblxyXG4gIHByaXZhdGUgX3BhdGggPSBuZXcgTWFwPHN0cmluZywgUGF0aFBhcmFtZXRlcj4oKTtcclxuICBwcml2YXRlIF9xdWVyeSA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeVBhcmFtZXRlcj4oKTtcclxuICBwcml2YXRlIF9oZWFkZXIgPSBuZXcgTWFwPHN0cmluZywgSGVhZGVyUGFyYW1ldGVyPigpO1xyXG4gIF9ib2R5Q29udGVudDogYW55IHwgbnVsbDtcclxuICBfYm9keUNvbnRlbnRUeXBlPzogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByb290VXJsOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgb3BlcmF0aW9uUGF0aDogc3RyaW5nLFxyXG4gICAgcHVibGljIG1ldGhvZDogc3RyaW5nKSB7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGEgcGF0aCBwYXJhbWV0ZXJcclxuICAgKi9cclxuICBwYXRoKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcmFtZXRlck9wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BhdGguc2V0KG5hbWUsIG5ldyBQYXRoUGFyYW1ldGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zIHx8IHt9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGEgcXVlcnkgcGFyYW1ldGVyXHJcbiAgICovXHJcbiAgcXVlcnkobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyYW1ldGVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcXVlcnkuc2V0KG5hbWUsIG5ldyBRdWVyeVBhcmFtZXRlcihuYW1lLCB2YWx1ZSwgb3B0aW9ucyB8fCB7fSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBhIGhlYWRlciBwYXJhbWV0ZXJcclxuICAgKi9cclxuICBoZWFkZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyYW1ldGVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgdGhpcy5faGVhZGVyLnNldChuYW1lLCBuZXcgSGVhZGVyUGFyYW1ldGVyKG5hbWUsIHZhbHVlLCBvcHRpb25zIHx8IHt9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBib2R5IGNvbnRlbnQsIGFsb25nIHdpdGggdGhlIGNvbnRlbnQgdHlwZVxyXG4gICAqL1xyXG4gIGJvZHkodmFsdWU6IGFueSwgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbicpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnRUeXBlID0gdmFsdWUudHlwZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2JvZHlDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2JvZHlDb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAvLyBIYW5kbGUgVVJMLWVuY29kZWQgZGF0YVxyXG4gICAgICBjb25zdCBwYWlyczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgaWYgKCEodmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICB2YWwgPSBbdmFsXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtRGF0YVZhbHVlKHYpO1xyXG4gICAgICAgICAgaWYgKGZvcm1WYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIGZvcm1WYWx1ZV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudCA9IHBhaXJzLm1hcChwID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChwWzBdKX09JHtlbmNvZGVVUklDb21wb25lbnQocFsxXSl9YCkuam9pbignJicpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Q29udGVudFR5cGUgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJykge1xyXG4gICAgICAvLyBIYW5kbGUgbXVsdGlwYXJ0IGZvcm0gZGF0YVxyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsID0gdmFsdWVba2V5XTtcclxuICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9BcHBlbmQgPSB0aGlzLmZvcm1EYXRhVmFsdWUodik7XHJcbiAgICAgICAgICAgICAgaWYgKHRvQXBwZW5kICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB0b0FwcGVuZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHRoaXMuZm9ybURhdGFWYWx1ZSh2YWwpO1xyXG4gICAgICAgICAgICBpZiAodG9BcHBlbmQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBmb3JtRGF0YS5zZXQoa2V5LCB0b0FwcGVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnQgPSBmb3JtRGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRoZSBib2R5IGlzIHRoZSBwbGFpbiBjb250ZW50XHJcbiAgICAgIHRoaXMuX2JvZHlDb250ZW50ID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1EYXRhVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSByZXF1ZXN0IHdpdGggdGhlIGN1cnJlbnQgc2V0IHBhcmFtZXRlcnNcclxuICAgKi9cclxuICBidWlsZDxUID0gYW55PihvcHRpb25zPzoge1xyXG4gICAgLyoqIFdoaWNoIGNvbnRlbnQgdHlwZXMgdG8gYWNjZXB0ICovXHJcbiAgICBhY2NlcHQ/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIFRoZSBleHBlY3RlZCByZXNwb25zZSB0eXBlICovXHJcbiAgICByZXNwb25zZVR5cGU/OiAnanNvbicgfCAndGV4dCcgfCAnYmxvYicgfCAnYXJyYXlidWZmZXInO1xyXG5cclxuICAgIC8qKiBXaGV0aGVyIHRvIHJlcG9ydCBwcm9ncmVzcyBvbiB1cGxvYWRzIC8gZG93bmxvYWRzICovXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqIEFsbG93IHBhc3NpbmcgSHR0cENvbnRleHQgZm9yIEh0dHBDbGllbnQgKi9cclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dDtcclxuICB9KTogSHR0cFJlcXVlc3Q8VD4ge1xyXG5cclxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgIC8vIFBhdGggcGFyYW1ldGVyc1xyXG4gICAgbGV0IHBhdGggPSB0aGlzLm9wZXJhdGlvblBhdGg7XHJcbiAgICBmb3IgKGNvbnN0IHBhdGhQYXJhbSBvZiB0aGlzLl9wYXRoLnZhbHVlcygpKSB7XHJcbiAgICAgIHBhdGggPSBwYXRoUGFyYW0uYXBwZW5kKHBhdGgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXJsID0gdGhpcy5yb290VXJsICsgcGF0aDtcclxuXHJcbiAgICAvLyBRdWVyeSBwYXJhbWV0ZXJzXHJcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKHtcclxuICAgICAgZW5jb2RlcjogUGFyYW1ldGVyQ29kZWNJbnN0YW5jZVxyXG4gICAgfSk7XHJcbiAgICBmb3IgKGNvbnN0IHF1ZXJ5UGFyYW0gb2YgdGhpcy5fcXVlcnkudmFsdWVzKCkpIHtcclxuICAgICAgaHR0cFBhcmFtcyA9IHF1ZXJ5UGFyYW0uYXBwZW5kKGh0dHBQYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhlYWRlciBwYXJhbWV0ZXJzXHJcbiAgICBsZXQgaHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGlmIChvcHRpb25zLmFjY2VwdCkge1xyXG4gICAgICBodHRwSGVhZGVycyA9IGh0dHBIZWFkZXJzLmFwcGVuZCgnQWNjZXB0Jywgb3B0aW9ucy5hY2NlcHQpO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBoZWFkZXJQYXJhbSBvZiB0aGlzLl9oZWFkZXIudmFsdWVzKCkpIHtcclxuICAgICAgaHR0cEhlYWRlcnMgPSBoZWFkZXJQYXJhbS5hcHBlbmQoaHR0cEhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlcXVlc3QgY29udGVudCBoZWFkZXJzXHJcbiAgICBpZiAodGhpcy5fYm9keUNvbnRlbnRUeXBlICYmICEodGhpcy5fYm9keUNvbnRlbnQgaW5zdGFuY2VvZiBGb3JtRGF0YSkpIHtcclxuICAgICAgaHR0cEhlYWRlcnMgPSBodHRwSGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIHRoaXMuX2JvZHlDb250ZW50VHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGVyZm9ybSB0aGUgcmVxdWVzdFxyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdDxUPih0aGlzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB1cmwsIHRoaXMuX2JvZHlDb250ZW50LCB7XHJcbiAgICAgIHBhcmFtczogaHR0cFBhcmFtcyxcclxuICAgICAgaGVhZGVyczogaHR0cEhlYWRlcnMsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsXHJcbiAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLFxyXG4gICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHRcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=