UNPKG

@pebula/metap

Version:
129 lines 14.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { targetStore, BaseSerializer, BaseDeserializer } from '@pebula/metap/internal'; import { Model } from '../decorators/model'; import { directMapper } from './direct-mapper'; import { serializeTargetMeta, deserializeTargetMeta } from './mapping/index'; var PlainObject = /** @class */ (function () { function PlainObject() { } PlainObject = tslib_1.__decorate([ Model({ resName: 'InternalPlainObject' }) ], PlainObject); return PlainObject; }()); /** * @param {?} mapper * @param {?} instanceOrTarget * @param {?=} target * @return {?} */ export function serialize(mapper, instanceOrTarget, target) { if (mapper instanceof BaseSerializer) { /** @type {?} */ var meta = targetStore.getTargetMeta(instanceOrTarget); if (meta) { return serializeTargetMeta(meta, mapper); } } else { /** @type {?} */ var meta = targetStore.getTargetMeta(target || instanceOrTarget.constructor); if (meta) { return serializeTargetMeta(meta, mapper.serializer(instanceOrTarget)); } } } /** * Automatically serialize an instance. * This method will serialize an instance by first trying to locate the target using the `constructor` function. * If a target is found and if it's a model target (i.e. ModelMetadata) it will try to get the mapper assign for that * model. * * If no target, model or mapper was found it will use the fallbackMapper mapper provided, or `directMapper` * if no fallback is provided provided. * * Note that when provided a fallback mapper, make sure it is able to serialize unknown targets. (plain objects) * @param {?} instance * @param {?=} fallbackMapper * @return {?} */ export function autoSerialize(instance, fallbackMapper) { /** @type {?} */ var tMeta = targetStore.getTargetMeta((/** @type {?} */ (instance.constructor))); /** @type {?} */ var mapper = (tMeta && tMeta.hasModel && tMeta.model().mapper) || fallbackMapper || directMapper; return serialize(mapper, instance); } /** * @param {?} mapper * @param {?=} plainObject * @param {?=} type * @param {?=} instance * @return {?} */ export function deserialize(mapper, plainObject, type, instance) { /** @type {?} */ var deserializer; if (mapper instanceof BaseDeserializer) { instance = plainObject; deserializer = mapper; } else { deserializer = mapper.deserializer(plainObject, type); } if (targetStore.hasTarget(deserializer.sourceType)) { /** @type {?} */ var meta = targetStore.getTargetMeta(deserializer.sourceType); /** @type {?} */ var result = instance || meta.model().factory(deserializer.isCollection); deserializeTargetMeta(meta, deserializer, result); return result; } else { /** @type {?} */ var meta = targetStore.getTargetMeta(PlainObject); /** @type {?} */ var result = instance || deserializer.isCollection ? [] : {}; deserializeTargetMeta(meta, deserializer, result, true); return result; } } /** * Automatically de-serialize an object to/into an instance. * This method will de-serialize an object by first trying to locate a model (i.e. ModelMetadata) for the target. * If a model is found it will try to get the mapper assign for that model. * * If no model or mapper was found it will use the fallbackMapper mapper provided, or `directMapper` * if no fallback is provided provided. * * @template T, Z * @param {?} plainObject * @param {?} type * @param {?=} instance * @param {?=} fallbackMapper * @return {?} */ export function autoDeserialize(plainObject, type, instance, fallbackMapper) { if (instance === void 0) { instance = null; } /** @type {?} */ var tMeta = targetStore.getTargetMeta(type); /** @type {?} */ var mapper = (tMeta && tMeta.hasModel && tMeta.model().mapper) || fallbackMapper || directMapper; return deserialize(mapper, plainObject, type, instance); } /** * Performs a deep clone to the resource using serialization and deserialization, which means that all rules apply (i.e \@Exclude) * * @template T * @param {?} resource the resource (instance) to clone * @param {?=} serializationFactory Optional, The [[SerializationFactory]] to use, defaults to [[directMapper]]. * @return {?} */ export function clone(resource, serializationFactory) { return autoDeserialize(autoSerialize(resource, serializationFactory), (/** @type {?} */ (resource.constructor)), null, serializationFactory); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BwZWJ1bGEvbWV0YXAvIiwic291cmNlcyI6WyJsaWIvc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUF3QixXQUFXLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0csT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0lBRzFELENBQUM7SUFBZCxXQUFXO1FBRGhCLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO09BQ3BDLFdBQVcsQ0FBRztJQUFELGtCQUFDO0NBQUEsSUFBQTs7Ozs7OztBQVdwQixNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQTZDLEVBQUUsZ0JBQXFCLEVBQUUsTUFBeUI7SUFDdkgsSUFBSSxNQUFNLFlBQVksY0FBYyxFQUFFOztZQUM5QixJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4RCxJQUFJLElBQUksRUFBRTtZQUNSLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzFDO0tBQ0Y7U0FBTTs7WUFDQyxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQzlFLElBQUksSUFBSSxFQUFFO1lBQ1IsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7U0FDdkU7S0FDRjtBQUNILENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWFELE1BQU0sVUFBVSxhQUFhLENBQUMsUUFBYSxFQUFFLGNBQXFDOztRQUMxRSxLQUFLLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxtQkFBQSxRQUFRLENBQUMsV0FBVyxFQUFPLENBQUM7O1FBQzlELE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLElBQUksWUFBWTtJQUNsRyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckMsQ0FBQzs7Ozs7Ozs7QUFPRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQStDLEVBQUUsV0FBaUIsRUFBRSxJQUFVLEVBQUUsUUFBYzs7UUFDcEgsWUFBOEI7SUFDbEMsSUFBSSxNQUFNLFlBQVksZ0JBQWdCLEVBQUU7UUFDdEMsUUFBUSxHQUFHLFdBQVcsQ0FBQztRQUN2QixZQUFZLEdBQUcsTUFBTSxDQUFDO0tBQ3ZCO1NBQU07UUFDTCxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDdkQ7SUFFRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFOztZQUM1QyxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDOztZQUN6RCxNQUFNLEdBQVEsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUUvRSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7U0FBTTs7WUFDQyxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7O1lBQzdDLE1BQU0sR0FBUSxRQUFRLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25FLHFCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBV0QsTUFBTSxVQUFVLGVBQWUsQ0FBTyxXQUFnQixFQUFFLElBQXdCLEVBQUUsUUFBb0IsRUFBRSxjQUFxQztJQUEzRCx5QkFBQSxFQUFBLGVBQW9COztRQUM5RixLQUFLLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7O1FBQ3ZDLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLElBQUksWUFBWTtJQUNsRyxPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxRCxDQUFDOzs7Ozs7Ozs7QUFRRCxNQUFNLFVBQVUsS0FBSyxDQUFJLFFBQVcsRUFBRSxvQkFBMkM7SUFDL0UsT0FBTyxlQUFlLENBQ3BCLGFBQWEsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsRUFDN0MsbUJBQUEsUUFBUSxDQUFDLFdBQVcsRUFBTyxFQUMzQixJQUFJLEVBQ0osb0JBQW9CLENBQ3JCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tICdAcGVidWxhL3V0aWxzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25GYWN0b3J5LCB0YXJnZXRTdG9yZSwgQmFzZVNlcmlhbGl6ZXIsIEJhc2VEZXNlcmlhbGl6ZXIgfSBmcm9tICdAcGVidWxhL21ldGFwL2ludGVybmFsJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9tb2RlbCc7XG5pbXBvcnQgeyBkaXJlY3RNYXBwZXIgfSBmcm9tICcuL2RpcmVjdC1tYXBwZXInO1xuaW1wb3J0IHsgc2VyaWFsaXplVGFyZ2V0TWV0YSwgZGVzZXJpYWxpemVUYXJnZXRNZXRhIH0gZnJvbSAnLi9tYXBwaW5nL2luZGV4JztcblxuQE1vZGVsKHsgcmVzTmFtZTogJ0ludGVybmFsUGxhaW5PYmplY3QnIH0pXG5jbGFzcyBQbGFpbk9iamVjdCB7fVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIGNsYXNzIGluc3RhbmNlIGludG8gYSBwbGFpbiBvYmplY3QuXG4gKiBAcGFyYW0gbWFwcGVyXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSB0eXBlIG9wdGlvbmFsLCBpZiBub3Qgc2V0IHRha2VuIGZyb20gaW5zdGFuY2UuY29uc3RydWN0b3JcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemU8VCwgWj4oc2VyaWFsaXplcjogQmFzZVNlcmlhbGl6ZXIsIHRhcmdldDogWiAmIENvbnN0cnVjdG9yPFQ+KTogYW55O1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZTxULCBaPihtYXBwZXI6IFNlcmlhbGl6YXRpb25GYWN0b3J5LCBpbnN0YW5jZTogVCwgdGFyZ2V0PzogWiAmIENvbnN0cnVjdG9yPFQ+KTogYW55O1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShtYXBwZXI6IFNlcmlhbGl6YXRpb25GYWN0b3J5IHwgQmFzZVNlcmlhbGl6ZXIsIGluc3RhbmNlT3JUYXJnZXQ6IGFueSwgdGFyZ2V0PzogQ29uc3RydWN0b3I8YW55Pik6IGFueSB7XG4gIGlmIChtYXBwZXIgaW5zdGFuY2VvZiBCYXNlU2VyaWFsaXplcikge1xuICAgIGNvbnN0IG1ldGEgPSB0YXJnZXRTdG9yZS5nZXRUYXJnZXRNZXRhKGluc3RhbmNlT3JUYXJnZXQpO1xuICAgIGlmIChtZXRhKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplVGFyZ2V0TWV0YShtZXRhLCBtYXBwZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZXRhID0gdGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YSh0YXJnZXQgfHwgaW5zdGFuY2VPclRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVUYXJnZXRNZXRhKG1ldGEsIG1hcHBlci5zZXJpYWxpemVyKGluc3RhbmNlT3JUYXJnZXQpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IHNlcmlhbGl6ZSBhbiBpbnN0YW5jZS5cbiAqIFRoaXMgbWV0aG9kIHdpbGwgc2VyaWFsaXplIGFuIGluc3RhbmNlIGJ5IGZpcnN0IHRyeWluZyB0byBsb2NhdGUgdGhlIHRhcmdldCB1c2luZyB0aGUgYGNvbnN0cnVjdG9yYCBmdW5jdGlvbi5cbiAqIElmIGEgdGFyZ2V0IGlzIGZvdW5kIGFuZCBpZiBpdCdzIGEgbW9kZWwgdGFyZ2V0IChpLmUuIE1vZGVsTWV0YWRhdGEpIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgbWFwcGVyIGFzc2lnbiBmb3IgdGhhdFxuICogbW9kZWwuXG4gKlxuICogSWYgbm8gdGFyZ2V0LCBtb2RlbCBvciBtYXBwZXIgd2FzIGZvdW5kIGl0IHdpbGwgdXNlIHRoZSBmYWxsYmFja01hcHBlciBtYXBwZXIgcHJvdmlkZWQsIG9yIGBkaXJlY3RNYXBwZXJgXG4gKiBpZiBubyBmYWxsYmFjayBpcyBwcm92aWRlZCBwcm92aWRlZC5cbiAqXG4gKiBOb3RlIHRoYXQgd2hlbiBwcm92aWRlZCBhIGZhbGxiYWNrIG1hcHBlciwgbWFrZSBzdXJlIGl0IGlzIGFibGUgdG8gc2VyaWFsaXplIHVua25vd24gdGFyZ2V0cy4gKHBsYWluIG9iamVjdHMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvU2VyaWFsaXplKGluc3RhbmNlOiBhbnksIGZhbGxiYWNrTWFwcGVyPzogU2VyaWFsaXphdGlvbkZhY3RvcnkpOiBhbnkge1xuICBjb25zdCB0TWV0YSA9IHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEoaW5zdGFuY2UuY29uc3RydWN0b3IgYXMgYW55KTtcbiAgY29uc3QgbWFwcGVyID0gKHRNZXRhICYmIHRNZXRhLmhhc01vZGVsICYmIHRNZXRhLm1vZGVsKCkubWFwcGVyKSB8fCBmYWxsYmFja01hcHBlciB8fCBkaXJlY3RNYXBwZXI7XG4gIHJldHVybiBzZXJpYWxpemUobWFwcGVyLCBpbnN0YW5jZSk7XG59XG5cbi8qKlxuICogRGUtc2VyaWFsaXplIGEgcGxhaW4gb2JqZWN0IGludG8gYSB0aGUgcHJvdmlkZWQgaW5zdGFuY2Ugb3IsIHdoZW4gbm8gaW5zdGFuY2UgaXMgcHJvdmlkZWQsIHRvIGEgbmV3IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VCwgWiBleHRlbmRzIENvbnN0cnVjdG9yPFQ+PihkZXNlcmlhbGl6ZXI6IEJhc2VEZXNlcmlhbGl6ZXI8VCwgWj4sIGluc3RhbmNlPzogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VCwgWj4obWFwcGVyOiBTZXJpYWxpemF0aW9uRmFjdG9yeSwgcGxhaW5PYmplY3Q6IGFueSwgdHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+LCBpbnN0YW5jZT86IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKG1hcHBlcjogU2VyaWFsaXphdGlvbkZhY3RvcnkgfCBCYXNlRGVzZXJpYWxpemVyLCBwbGFpbk9iamVjdD86IGFueSwgdHlwZT86IGFueSwgaW5zdGFuY2U/OiBhbnkpOiBhbnkge1xuICBsZXQgZGVzZXJpYWxpemVyOiBCYXNlRGVzZXJpYWxpemVyO1xuICBpZiAobWFwcGVyIGluc3RhbmNlb2YgQmFzZURlc2VyaWFsaXplcikge1xuICAgIGluc3RhbmNlID0gcGxhaW5PYmplY3Q7XG4gICAgZGVzZXJpYWxpemVyID0gbWFwcGVyO1xuICB9IGVsc2Uge1xuICAgIGRlc2VyaWFsaXplciA9IG1hcHBlci5kZXNlcmlhbGl6ZXIocGxhaW5PYmplY3QsIHR5cGUpO1xuICB9XG5cbiAgaWYgKHRhcmdldFN0b3JlLmhhc1RhcmdldChkZXNlcmlhbGl6ZXIuc291cmNlVHlwZSkpIHtcbiAgICBjb25zdCBtZXRhID0gdGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YShkZXNlcmlhbGl6ZXIuc291cmNlVHlwZSk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBpbnN0YW5jZSB8fCBtZXRhLm1vZGVsKCkuZmFjdG9yeShkZXNlcmlhbGl6ZXIuaXNDb2xsZWN0aW9uKTtcblxuICAgIGRlc2VyaWFsaXplVGFyZ2V0TWV0YShtZXRhLCBkZXNlcmlhbGl6ZXIsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZXRhID0gdGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YShQbGFpbk9iamVjdCk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBpbnN0YW5jZSB8fCBkZXNlcmlhbGl6ZXIuaXNDb2xsZWN0aW9uID8gW10gOiB7fTtcbiAgICBkZXNlcmlhbGl6ZVRhcmdldE1ldGEobWV0YSwgZGVzZXJpYWxpemVyLCByZXN1bHQsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IGRlLXNlcmlhbGl6ZSBhbiBvYmplY3QgdG8vaW50byBhbiBpbnN0YW5jZS5cbiAqIFRoaXMgbWV0aG9kIHdpbGwgZGUtc2VyaWFsaXplIGFuIG9iamVjdCBieSBmaXJzdCB0cnlpbmcgdG8gbG9jYXRlIGEgbW9kZWwgKGkuZS4gTW9kZWxNZXRhZGF0YSkgZm9yIHRoZSB0YXJnZXQuXG4gKiBJZiBhIG1vZGVsIGlzIGZvdW5kIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgbWFwcGVyIGFzc2lnbiBmb3IgdGhhdCBtb2RlbC5cbiAqXG4gKiBJZiBubyBtb2RlbCBvciBtYXBwZXIgd2FzIGZvdW5kIGl0IHdpbGwgdXNlIHRoZSBmYWxsYmFja01hcHBlciBtYXBwZXIgcHJvdmlkZWQsIG9yIGBkaXJlY3RNYXBwZXJgXG4gKiBpZiBubyBmYWxsYmFjayBpcyBwcm92aWRlZCBwcm92aWRlZC5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvRGVzZXJpYWxpemU8VCwgWj4ocGxhaW5PYmplY3Q6IGFueSwgdHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+LCBpbnN0YW5jZTogYW55ID0gbnVsbCwgZmFsbGJhY2tNYXBwZXI/OiBTZXJpYWxpemF0aW9uRmFjdG9yeSk6IFQge1xuICBjb25zdCB0TWV0YSA9IHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEodHlwZSk7XG4gIGNvbnN0IG1hcHBlciA9ICh0TWV0YSAmJiB0TWV0YS5oYXNNb2RlbCAmJiB0TWV0YS5tb2RlbCgpLm1hcHBlcikgfHwgZmFsbGJhY2tNYXBwZXIgfHwgZGlyZWN0TWFwcGVyO1xuICByZXR1cm4gZGVzZXJpYWxpemUobWFwcGVyLCBwbGFpbk9iamVjdCwgdHlwZSwgaW5zdGFuY2UpO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgZGVlcCBjbG9uZSB0byB0aGUgcmVzb3VyY2UgdXNpbmcgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLCB3aGljaCBtZWFucyB0aGF0IGFsbCBydWxlcyBhcHBseSAoaS5lIEBFeGNsdWRlKVxuICpcbiAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgKGluc3RhbmNlKSB0byBjbG9uZVxuICogQHBhcmFtIHNlcmlhbGl6YXRpb25GYWN0b3J5IE9wdGlvbmFsLCBUaGUgW1tTZXJpYWxpemF0aW9uRmFjdG9yeV1dIHRvIHVzZSwgZGVmYXVsdHMgdG8gW1tkaXJlY3RNYXBwZXJdXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQ+KHJlc291cmNlOiBULCBzZXJpYWxpemF0aW9uRmFjdG9yeT86IFNlcmlhbGl6YXRpb25GYWN0b3J5KTogVCB7XG4gIHJldHVybiBhdXRvRGVzZXJpYWxpemUoXG4gICAgYXV0b1NlcmlhbGl6ZShyZXNvdXJjZSwgc2VyaWFsaXphdGlvbkZhY3RvcnkpLFxuICAgIHJlc291cmNlLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBudWxsLFxuICAgIHNlcmlhbGl6YXRpb25GYWN0b3J5XG4gICk7XG59XG4iXX0=