UNPKG

@adobe/cq-angular-editable-components

Version:

* [API](#api) * [Documentation](#documentation) * [Changelog](#changelog)

194 lines 21.4 kB
/* * ADOBE CONFIDENTIAL * * Copyright 2018 Adobe Systems Incorporated * All Rights Reserved. * * NOTICE: All information contained herein is, and remains * the property of Adobe Systems Incorporated and its suppliers, * if any. The intellectual and technical concepts contained * herein are proprietary to Adobe Systems Incorporated and its * suppliers and may be covered by U.S. and Foreign Patents, * patents in process, and are protected by trade secret or copyright law. * Dissemination of this information or reproduction of this material * is strictly forbidden unless prior written permission is obtained * from Adobe Systems Incorporated. */ import { __decorate, __metadata } from "tslib"; import { Directive, Input, Renderer2, ViewContainerRef, ComponentFactoryResolver, ComponentRef, AfterViewInit, OnInit, OnDestroy, ChangeDetectorRef, OnChanges } from '@angular/core'; import { ComponentMapping } from './component-mapping'; import { Constants } from './constants'; import { Utils } from './utils'; const PLACEHOLDER_CLASS_NAME = 'cq-placeholder'; let AEMComponentDirective = /** * The current directive provides advanced capabilities among which are * * - The management of the component placeholder in the Page Editor * - The dynamic instantiation of components based on a component definition * - The conversion from model fields to properties and injection in the component instance * - The management of HTMLElement attributes and class names on the native element */ class AEMComponentDirective { constructor(renderer, viewContainer, factoryResolver, _changeDetectorRef) { this.renderer = renderer; this.viewContainer = viewContainer; this.factoryResolver = factoryResolver; this._changeDetectorRef = _changeDetectorRef; } get cqItem() { return this._cqItem; } set cqItem(value) { this._cqItem = value; } get changeDetectorRef() { return this._changeDetectorRef; } ngOnInit() { this.renderComponent(ComponentMapping.get(this.type)); } ngOnChanges(changes) { this.updateComponentData(); } /** * Returns the type of the cqItem if exists. */ get type() { return this.cqItem && this.cqItem[Constants.TYPE_PROP]; } /** * Renders a component dynamically based on the component definition * * @param componentDefinition The component definition to render */ renderComponent(componentDefinition) { if (componentDefinition) { const factory = this.factoryResolver.resolveComponentFactory(componentDefinition); this.viewContainer.clear(); this._component = this.viewContainer.createComponent(factory); this.updateComponentData(); } } /** * Updates the data of the component based the data of the directive */ updateComponentData() { if (!this._component || !this._component.instance) { return; } const keys = Object.getOwnPropertyNames(this.cqItem); keys.forEach((key) => { let propKey = key; if (propKey.startsWith(':')) { // Transformation of internal properties namespaced with [:] to [cq] // :myProperty => cqMyProperty const tempKey = propKey.substr(1); propKey = 'cq' + tempKey.substr(0, 1).toUpperCase() + tempKey.substr(1); } this._component.instance[propKey] = this.cqItem[key]; }); this._component.instance.cqPath = this.cqPath; this._component.instance.itemName = this.itemName; const editConfig = ComponentMapping.getEditConfig(this.type); if (editConfig && Utils.isInEditor) { this.setupPlaceholder(editConfig); } this._changeDetectorRef.detectChanges(); } /** * Adds the specified item attributes to the element */ setupItemAttrs() { if (this.itemAttrs) { const keys = Object.getOwnPropertyNames(this.itemAttrs); keys.forEach((key) => { if (key === 'class') { const classes = this.itemAttrs[key].split(' '); classes.forEach((itemClass) => { this.renderer.addClass(this._component.location.nativeElement, itemClass); }); } else { this.renderer.setAttribute(this._component.location.nativeElement, key, this.itemAttrs[key]); } }); } } /** * Determines if the placeholder should e displayed. * * @param editConfig - the edit config of the directive */ usePlaceholder(editConfig) { return editConfig.isEmpty && typeof editConfig.isEmpty === 'function' && editConfig.isEmpty(this.cqItem); } /** * Setups the placeholder of needed for the AEM editor * * @param editConfig - the editConfig, which will dictate the classes to be added on. */ setupPlaceholder(editConfig) { if (this.usePlaceholder(editConfig)) { this.renderer.addClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME); this.renderer.setAttribute(this._component.location.nativeElement, 'data-emptytext', editConfig.emptyLabel); } else { this.renderer.removeClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME); this.renderer.removeAttribute(this._component.location.nativeElement, 'data-emptytext'); } } ngAfterViewInit() { this.setupItemAttrs(); } ngOnDestroy() { this._component && this._component.destroy(); } }; AEMComponentDirective.ctorParameters = () => [ { type: Renderer2 }, { type: ViewContainerRef }, { type: ComponentFactoryResolver }, { type: ChangeDetectorRef } ]; __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], AEMComponentDirective.prototype, "cqItem", null); __decorate([ Input(), __metadata("design:type", String) ], AEMComponentDirective.prototype, "cqPath", void 0); __decorate([ Input(), __metadata("design:type", String) ], AEMComponentDirective.prototype, "itemName", void 0); __decorate([ Input(), __metadata("design:type", Object) ], AEMComponentDirective.prototype, "itemAttrs", void 0); __decorate([ Input(), __metadata("design:type", Object) ], AEMComponentDirective.prototype, "aemComponent", void 0); AEMComponentDirective = __decorate([ Directive({ selector: '[aemComponent]' }) /** * The current directive provides advanced capabilities among which are * * - The management of the component placeholder in the Page Editor * - The dynamic instantiation of components based on a component definition * - The conversion from model fields to properties and injection in the component instance * - The management of HTMLElement attributes and class names on the native element */ , __metadata("design:paramtypes", [Renderer2, ViewContainerRef, ComponentFactoryResolver, ChangeDetectorRef]) ], AEMComponentDirective); export { AEMComponentDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVtLWNvbXBvbmVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRvYmUvY3EtYW5ndWxhci1lZGl0YWJsZS1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsibGliL2xheW91dC9hZW0tY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7O0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLGFBQWEsRUFDYixNQUFNLEVBQ04sU0FBUyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFDeEMsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR2hDLE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7QUFjaEQsSUFBYSxxQkFBcUI7QUFSbEM7Ozs7Ozs7R0FPRztBQUNILE1BQWEscUJBQXFCO0lBdUNoQyxZQUNVLFFBQW1CLEVBQ25CLGFBQStCLEVBQy9CLGVBQXlDLEVBQ3pDLGtCQUFxQztRQUhyQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7UUFDekMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtJQUMvQyxDQUFDO0lBakNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBR0QsSUFBSSxNQUFNLENBQUMsS0FBYTtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFD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LENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDekY7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0NBRUYsQ0FBQTs7WUF4SHFCLFNBQVM7WUFDSixnQkFBZ0I7WUFDZCx3QkFBd0I7WUFDckIsaUJBQWlCOztBQTNCL0M7SUFEQyxLQUFLLEVBQUU7OzttREFHUDtBQVNRO0lBQVIsS0FBSyxFQUFFOztxREFBZ0I7QUFJZjtJQUFSLEtBQUssRUFBRTs7dURBQWtCO0FBSWpCO0lBQVIsS0FBSyxFQUFFOzt3REFBbUI7QUFFbEI7SUFBUixLQUFLLEVBQUU7OzJEQUFjO0FBckNYLHFCQUFxQjtJQVpqQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsZ0JBQWdCO0tBQzNCLENBQUM7SUFFRjs7Ozs7OztPQU9HOztxQ0F5Q21CLFNBQVM7UUFDSixnQkFBZ0I7UUFDZCx3QkFBd0I7UUFDckIsaUJBQWlCO0dBM0NwQyxxQkFBcUIsQ0FnS2pDO1NBaEtZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBRE9CRSBDT05GSURFTlRJQUxcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBOT1RJQ0U6ICBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcbiAqIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBhbmQgaXRzIHN1cHBsaWVycyxcbiAqIGlmIGFueS4gIFRoZSBpbnRlbGxlY3R1YWwgYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWRcbiAqIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIGl0c1xuICogc3VwcGxpZXJzIGFuZCBtYXkgYmUgY292ZXJlZCBieSBVLlMuIGFuZCBGb3JlaWduIFBhdGVudHMsXG4gKiBwYXRlbnRzIGluIHByb2Nlc3MsIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRlIHNlY3JldCBvciBjb3B5cmlnaHQgbGF3LlxuICogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4gKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxuICogZnJvbSBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cbiAqL1xuXG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGluZyB9IGZyb20gJy4vY29tcG9uZW50LW1hcHBpbmcnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcblxuXG5jb25zdCBQTEFDRUhPTERFUl9DTEFTU19OQU1FID0gJ2NxLXBsYWNlaG9sZGVyJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FlbUNvbXBvbmVudF0nXG59KVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IGRpcmVjdGl2ZSBwcm92aWRlcyBhZHZhbmNlZCBjYXBhYmlsaXRpZXMgYW1vbmcgd2hpY2ggYXJlXG4gKlxuICogLSBUaGUgbWFuYWdlbWVudCBvZiB0aGUgY29tcG9uZW50IHBsYWNlaG9sZGVyIGluIHRoZSBQYWdlIEVkaXRvclxuICogLSBUaGUgZHluYW1pYyBpbnN0YW50aWF0aW9uIG9mIGNvbXBvbmVudHMgYmFzZWQgb24gYSBjb21wb25lbnQgZGVmaW5pdGlvblxuICogLSBUaGUgY29udmVyc2lvbiBmcm9tIG1vZGVsIGZpZWxkcyB0byBwcm9wZXJ0aWVzIGFuZCBpbmplY3Rpb24gaW4gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICogLSBUaGUgbWFuYWdlbWVudCBvZiBIVE1MRWxlbWVudCBhdHRyaWJ1dGVzIGFuZCBjbGFzcyBuYW1lcyBvbiB0aGUgbmF0aXZlIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFFTUNvbXBvbmVudERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSBjcmVhdGVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfY29tcG9uZW50OiBDb21wb25lbnRSZWY8YW55PjtcbiAgLyoqXG4gICAqIE1vZGVsIGl0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgX2NxSXRlbTogb2JqZWN0O1xuXG4gIGdldCBjcUl0ZW0oKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5fY3FJdGVtO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNxSXRlbSh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5fY3FJdGVtID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY2hhbmdlRGV0ZWN0b3JSZWYoKTogQ2hhbmdlRGV0ZWN0b3JSZWYge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBtb2RlbCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgY3FQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIdG1sRWxlbWVudCBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBpdGVtQXR0cnM6IG9iamVjdDtcblxuICBASW5wdXQoKSBhZW1Db21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJDb21wb25lbnQoQ29tcG9uZW50TWFwcGluZy5nZXQodGhpcy50eXBlKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBpbXBvcnQoXCJAYW5ndWxhci9jb3JlXCIpLlNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBjcUl0ZW0gaWYgZXhpc3RzLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3FJdGVtICYmIHRoaXMuY3FJdGVtW0NvbnN0YW50cy5UWVBFX1BST1BdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBjb21wb25lbnQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnREZWZpbml0aW9uIFRoZSBjb21wb25lbnQgZGVmaW5pdGlvbiB0byByZW5kZXJcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb246IGFueSkge1xuICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIHRoZSBkYXRhIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50RGF0YSgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbXBvbmVudCB8fCAhdGhpcy5fY29tcG9uZW50Lmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuY3FJdGVtKTtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgcHJvcEtleSA9IGtleTtcblxuICAgICAgaWYgKHByb3BLZXkuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgIC8vIFRyYW5zZm9ybWF0aW9uIG9mIGludGVybmFsIHByb3BlcnRpZXMgbmFtZXNwYWNlZCB3aXRoIFs6XSB0byBbY3FdXG4gICAgICAgIC8vIDpteVByb3BlcnR5ID0+IGNxTXlQcm9wZXJ0eVxuICAgICAgICBjb25zdCB0ZW1wS2V5ID0gcHJvcEtleS5zdWJzdHIoMSk7XG4gICAgICAgIHByb3BLZXkgPSAnY3EnICsgdGVtcEtleS5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKSArIHRlbXBLZXkuc3Vic3RyKDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2VbcHJvcEtleV0gPSB0aGlzLmNxSXRlbVtrZXldO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY29tcG9uZW50Lmluc3RhbmNlLmNxUGF0aCA9IHRoaXMuY3FQYXRoO1xuICAgIHRoaXMuX2NvbXBvbmVudC5pbnN0YW5jZS5pdGVtTmFtZSA9IHRoaXMuaXRlbU5hbWU7XG4gICAgY29uc3QgZWRpdENvbmZpZyA9IENvbXBvbmVudE1hcHBpbmcuZ2V0RWRpdENvbmZpZyh0aGlzLnR5cGUpO1xuICAgIGlmIChlZGl0Q29uZmlnICYmIFV0aWxzLmlzSW5FZGl0b3IpIHtcbiAgICAgIHRoaXMuc2V0dXBQbGFjZWhvbGRlcihlZGl0Q29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGl0ZW0gYXR0cmlidXRlcyB0byB0aGUgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEl0ZW1BdHRycygpIHtcbiAgICBpZiAodGhpcy5pdGVtQXR0cnMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLml0ZW1BdHRycyk7XG5cbiAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5pdGVtQXR0cnNba2V5XS5zcGxpdCgnICcpO1xuICAgICAgICAgIGNsYXNzZXMuZm9yRWFjaCgoaXRlbUNsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBpdGVtQ2xhc3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBrZXksIHRoaXMuaXRlbUF0dHJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcGxhY2Vob2xkZXIgc2hvdWxkIGUgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAcGFyYW0gZWRpdENvbmZpZyAtIHRoZSBlZGl0IGNvbmZpZyBvZiB0aGUgZGlyZWN0aXZlXG4gICAqL1xuICBwcml2YXRlIHVzZVBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICByZXR1cm4gZWRpdENvbmZpZy5pc0VtcHR5ICYmIHR5cGVvZiBlZGl0Q29uZmlnLmlzRW1wdHkgPT09ICdmdW5jdGlvbicgJiYgZWRpdENvbmZpZy5pc0VtcHR5KHRoaXMuY3FJdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgdGhlIHBsYWNlaG9sZGVyIG9mIG5lZWRlZCBmb3IgdGhlIEFFTSBlZGl0b3JcbiAgICpcbiAgICogQHBhcmFtIGVkaXRDb25maWcgLSB0aGUgZWRpdENvbmZpZywgd2hpY2ggd2lsbCBkaWN0YXRlIHRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICBpZiAodGhpcy51c2VQbGFjZWhvbGRlcihlZGl0Q29uZmlnKSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgUExBQ0VIT0xERVJfQ0xBU1NfTkFNRSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgJ2RhdGEtZW1wdHl0ZXh0JywgZWRpdENvbmZpZy5lbXB0eUxhYmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgUExBQ0VIT0xERVJfQ0xBU1NfTkFNRSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgJ2RhdGEtZW1wdHl0ZXh0Jyk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0dXBJdGVtQXR0cnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NvbXBvbmVudCAmJiB0aGlzLl9jb21wb25lbnQuZGVzdHJveSgpO1xuICB9XG5cbn1cbiJdfQ==