@ng-dnd/core
Version:
Drag and Drop for Angular
127 lines • 16.5 kB
JavaScript
/**
* @module 1-Top-Level
*/
/** a second comment */
import { Inject, Injectable, NgZone } from '@angular/core';
import { DRAG_DROP_MANAGER, TYPE_DYNAMIC } from './tokens';
import createTargetConnector from './internal/createTargetConnector';
import registerTarget from './internal/register-target';
import createSourceConnector from './internal/createSourceConnector';
import registerSource from './internal/register-source';
import { SourceConnection, TargetConnection } from './internal/connection-factory';
import { DragLayerConnectionClass } from './internal/drag-layer-connection';
import { createSourceFactory } from './internal/createSourceFactory';
import { createSourceMonitor } from './internal/createSourceMonitor';
import { createTargetFactory } from './internal/createTargetFactory';
import { createTargetMonitor } from './internal/createTargetMonitor';
import * as i0 from "@angular/core";
/**
* For a simple component, unsubscribing is as easy as `connection.unsubscribe()` in `ngOnDestroy()`
* If your components have lots of subscriptions, it can get tedious having to
* unsubscribe from all of them, and you might forget. A common pattern is to create an RxJS Subscription
* (maybe called `destroy`), to use `this.destroy.add(xxx.subscribe(...))`
* and to call `destroy.unsubscribe()` once to clean up all of them. @ng-dnd/core
* supports this pattern with by using the `subscription` parameter on the
* constructors. Simply:
*
* ```typescript
* import { Subscription } from 'rxjs';
* // ...
* destroy = new Subscription();
* target = this.dnd.dropTarget({
* // ...
* }, this.destroy);
* ngOnDestroy() { this.destroy.unsubscribe(); }
* ```
*
* It is a good habit for avoiding leaked subscriptions, because .
*/
export class DndService {
/** @ignore */
constructor(manager, ngZone) {
this.manager = manager;
this.ngZone = ngZone;
}
/**
* This drop target will only react to the items produced by the drag sources
* of the specified type or types.
*
* If you want a dynamic type, pass `null` as the type; and call
* {@link DropTarget#setTypes} in a lifecycle hook.
*/
dropTarget(types, spec, subscription) {
return this.ngZone.runOutsideAngular(() => {
const createTarget = createTargetFactory(spec);
const conn = new TargetConnection({
createHandler: createTarget,
registerHandler: registerTarget,
createMonitor: createTargetMonitor,
createConnector: createTargetConnector,
}, this.manager, this.ngZone, types || TYPE_DYNAMIC);
if (subscription) {
subscription.add(conn);
}
return conn;
});
}
/**
* This method creates a {@link DragSource} object. It represents a drag
* source and its behaviour, and can be connected to a DOM element by
* assigning it to the `[dragSource]` directive on that element in your
* template.
*
* It is the corollary of [`react-dnd`'s
* `DragSource`](http://react-dnd.github.io/react-dnd/docs-drag-source.html).
*
* The `spec` argument ({@link DragSourceSpec}) is a set of _queries_ and
* _callbacks_ that are called at appropriate times by the internals. The
* queries are for asking your component whether to drag/listen and what
* item data to hoist up; the callback (just 1) is for notifying you when
* the drag ends.
*
* Only the drop targets registered for the same type will
* react to the items produced by this drag source. If you want a dynamic
* type, pass `null` as the type; and call {@link DragSource#setType} in
* a lifecycle hook.
*
* @param subscription An RxJS Subscription to tie the lifetime of the
* connection to.
*/
dragSource(type, spec, subscription) {
return this.ngZone.runOutsideAngular(() => {
const createSource = createSourceFactory(spec);
const conn = new SourceConnection({
createHandler: createSource,
registerHandler: registerSource,
createMonitor: createSourceMonitor,
createConnector: createSourceConnector,
}, this.manager, this.ngZone, type || TYPE_DYNAMIC);
if (subscription) {
subscription.add(conn);
}
return conn;
});
}
/**
* This method creates a {@link DragLayer} object
*/
dragLayer(subscription) {
return this.ngZone.runOutsideAngular(() => {
const conn = new DragLayerConnectionClass(this.manager);
if (subscription) {
subscription.add(conn);
}
return conn;
});
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DndService, deps: [{ token: DRAG_DROP_MANAGER }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DndService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DndService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DRAG_DROP_MANAGER]
}] }, { type: i0.NgZone }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Nvbm5lY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILHVCQUF1QjtBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUczRCxPQUFPLHFCQUFxQixNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sY0FBYyxNQUFNLDRCQUE0QixDQUFDO0FBR3hELE9BQU8scUJBQXFCLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxjQUFjLE1BQU0sNEJBQTRCLENBQUM7QUFHeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFJNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBV3JFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE1BQU0sT0FBTyxVQUFVO0lBQ3JCLGNBQWM7SUFDZCxZQUNxQyxPQUF3QixFQUNuRCxNQUFjO1FBRGEsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDbkQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUNyQixDQUFDO0lBRUo7Ozs7OztPQU1HO0lBQ0ksVUFBVSxDQUNmLEtBQTZCLEVBQzdCLElBQXNDLEVBQ3RDLFlBQThCO1FBRTlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDL0I7Z0JBQ0UsYUFBYSxFQUFFLFlBQVk7Z0JBQzNCLGVBQWUsRUFBRSxjQUFjO2dCQUMvQixhQUFhLEVBQUUsbUJBQW1CO2dCQUNsQyxlQUFlLEVBQUUscUJBQXFCO2FBQ3ZDLEVBQ0QsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxFQUNYLEtBQUssSUFBSSxZQUFZLENBQ1UsQ0FBQztZQUVsQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0ksVUFBVSxDQUNmLElBQTRCLEVBQzVCLElBQXNDLEVBQ3RDLFlBQThCO1FBRTlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDL0I7Z0JBQ0UsYUFBYSxFQUFFLFlBQVk7Z0JBQzNCLGVBQWUsRUFBRSxjQUFjO2dCQUMvQixhQUFhLEVBQUUsbUJBQW1CO2dCQUNsQyxlQUFlLEVBQUUscUJBQXFCO2FBQ3ZDLEVBQ0QsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksSUFBSSxZQUFZLENBQ1csQ0FBQztZQUVsQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFhLFlBQThCO1FBQ3pELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFeEQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7aUlBdkdVLFVBQVUsa0JBR1gsaUJBQWlCO3FJQUhoQixVQUFVLGNBREcsTUFBTTs7MkZBQ25CLFVBQVU7a0JBRHRCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFJN0IsTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgMS1Ub3AtTGV2ZWxcbiAqL1xuLyoqIGEgc2Vjb25kIGNvbW1lbnQgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERyYWdEcm9wTWFuYWdlciB9IGZyb20gJ2RuZC1jb3JlJztcbmltcG9ydCB7IERSQUdfRFJPUF9NQU5BR0VSLCBUWVBFX0RZTkFNSUMgfSBmcm9tICcuL3Rva2Vucyc7XG5cbmltcG9ydCB7IERyb3BUYXJnZXRTcGVjIH0gZnJvbSAnLi9kcm9wLXRhcmdldC1zcGVjaWZpY2F0aW9uJztcbmltcG9ydCBjcmVhdGVUYXJnZXRDb25uZWN0b3IgZnJvbSAnLi9pbnRlcm5hbC9jcmVhdGVUYXJnZXRDb25uZWN0b3InO1xuaW1wb3J0IHJlZ2lzdGVyVGFyZ2V0IGZyb20gJy4vaW50ZXJuYWwvcmVnaXN0ZXItdGFyZ2V0JztcblxuaW1wb3J0IHsgRHJhZ1NvdXJjZVNwZWMgfSBmcm9tICcuL2RyYWctc291cmNlLXNwZWNpZmljYXRpb24nO1xuaW1wb3J0IGNyZWF0ZVNvdXJjZUNvbm5lY3RvciBmcm9tICcuL2ludGVybmFsL2NyZWF0ZVNvdXJjZUNvbm5lY3Rvcic7XG5pbXBvcnQgcmVnaXN0ZXJTb3VyY2UgZnJvbSAnLi9pbnRlcm5hbC9yZWdpc3Rlci1zb3VyY2UnO1xuXG5pbXBvcnQgeyBTdWJzY3JpcHRpb25MaWtlLCBUZWFyZG93bkxvZ2ljIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTb3VyY2VDb25uZWN0aW9uLCBUYXJnZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9pbnRlcm5hbC9jb25uZWN0aW9uLWZhY3RvcnknO1xuaW1wb3J0IHsgRHJhZ0xheWVyQ29ubmVjdGlvbkNsYXNzIH0gZnJvbSAnLi9pbnRlcm5hbC9kcmFnLWxheWVyLWNvbm5lY3Rpb24nO1xuaW1wb3J0IHsgVHlwZU9yVHlwZUFycmF5IH0gZnJvbSAnLi90eXBlLWlzaCc7XG5cbmltcG9ydCB7IERyYWdMYXllciwgRHJhZ1NvdXJjZSwgRHJvcFRhcmdldCB9IGZyb20gJy4vY29ubmVjdGlvbi10eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcm5hbC9jcmVhdGVTb3VyY2VGYWN0b3J5JztcbmltcG9ydCB7IGNyZWF0ZVNvdXJjZU1vbml0b3IgfSBmcm9tICcuL2ludGVybmFsL2NyZWF0ZVNvdXJjZU1vbml0b3InO1xuaW1wb3J0IHsgY3JlYXRlVGFyZ2V0RmFjdG9yeSB9IGZyb20gJy4vaW50ZXJuYWwvY3JlYXRlVGFyZ2V0RmFjdG9yeSc7XG5pbXBvcnQgeyBjcmVhdGVUYXJnZXRNb25pdG9yIH0gZnJvbSAnLi9pbnRlcm5hbC9jcmVhdGVUYXJnZXRNb25pdG9yJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIFJ4SlMgU3Vic2NyaXB0aW9uLCB3aXRoIG11bHRpLXZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAqIFRoZSBzdGFuZGFyZCBTdWJzY3JpcHRpb25MaWtlIGRvZXMgbm90IGNvbnRhaW4gYW4gYWRkKCkgbWV0aG9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZFN1YnNjcmlwdGlvbiBleHRlbmRzIFN1YnNjcmlwdGlvbkxpa2Uge1xuICAvKiogU2FtZSBhcyBSeEpTIGBTdWJzY3JpcHRpb24jYWRkYCAqL1xuICBhZGQodGVhcmRvd25Mb2dpYzogVGVhcmRvd25Mb2dpYyk6IHZvaWQ7XG59XG5cbi8qKlxuICogRm9yIGEgc2ltcGxlIGNvbXBvbmVudCwgdW5zdWJzY3JpYmluZyBpcyBhcyBlYXN5IGFzIGBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKClgIGluIGBuZ09uRGVzdHJveSgpYFxuICogSWYgeW91ciBjb21wb25lbnRzIGhhdmUgbG90cyBvZiBzdWJzY3JpcHRpb25zLCBpdCBjYW4gZ2V0IHRlZGlvdXMgaGF2aW5nIHRvXG4gKiB1bnN1YnNjcmliZSBmcm9tIGFsbCBvZiB0aGVtLCBhbmQgeW91IG1pZ2h0IGZvcmdldC4gQSBjb21tb24gcGF0dGVybiBpcyB0byBjcmVhdGUgYW4gUnhKUyBTdWJzY3JpcHRpb25cbiAqIChtYXliZSBjYWxsZWQgYGRlc3Ryb3lgKSwgdG8gdXNlIGB0aGlzLmRlc3Ryb3kuYWRkKHh4eC5zdWJzY3JpYmUoLi4uKSlgXG4gKiBhbmQgdG8gY2FsbCBgZGVzdHJveS51bnN1YnNjcmliZSgpYCBvbmNlIHRvIGNsZWFuIHVwIGFsbCBvZiB0aGVtLiBAbmctZG5kL2NvcmVcbiAqIHN1cHBvcnRzIHRoaXMgcGF0dGVybiB3aXRoIGJ5IHVzaW5nIHRoZSBgc3Vic2NyaXB0aW9uYCBwYXJhbWV0ZXIgb24gdGhlXG4gKiBjb25zdHJ1Y3RvcnMuIFNpbXBseTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbiAqIC8vIC4uLlxuICogZGVzdHJveSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAqIHRhcmdldCA9IHRoaXMuZG5kLmRyb3BUYXJnZXQoe1xuICogICAvLyAuLi5cbiAqIH0sIHRoaXMuZGVzdHJveSk7XG4gKiBuZ09uRGVzdHJveSgpIHsgdGhpcy5kZXN0cm95LnVuc3Vic2NyaWJlKCk7IH1cbiAqIGBgYFxuICpcbiAqIEl0IGlzIGEgZ29vZCBoYWJpdCBmb3IgYXZvaWRpbmcgbGVha2VkIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIERuZFNlcnZpY2Uge1xuICAvKiogQGlnbm9yZSAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERSQUdfRFJPUF9NQU5BR0VSKSBwcml2YXRlIG1hbmFnZXI6IERyYWdEcm9wTWFuYWdlcixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge31cblxuICAvKipcbiAgICogVGhpcyBkcm9wIHRhcmdldCB3aWxsIG9ubHkgcmVhY3QgdG8gdGhlIGl0ZW1zIHByb2R1Y2VkIGJ5IHRoZSBkcmFnIHNvdXJjZXNcbiAgICogb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9yIHR5cGVzLlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCBhIGR5bmFtaWMgdHlwZSwgcGFzcyBgbnVsbGAgYXMgdGhlIHR5cGU7IGFuZCBjYWxsXG4gICAqIHtAbGluayBEcm9wVGFyZ2V0I3NldFR5cGVzfSBpbiBhIGxpZmVjeWNsZSBob29rLlxuICAgKi9cbiAgcHVibGljIGRyb3BUYXJnZXQ8SXRlbSA9IHVua25vd24sIERyb3BSZXN1bHQgPSB1bmtub3duPihcbiAgICB0eXBlczogVHlwZU9yVHlwZUFycmF5IHwgbnVsbCxcbiAgICBzcGVjOiBEcm9wVGFyZ2V0U3BlYzxJdGVtLCBEcm9wUmVzdWx0PixcbiAgICBzdWJzY3JpcHRpb24/OiBBZGRTdWJzY3JpcHRpb25cbiAgKTogRHJvcFRhcmdldDxJdGVtLCBEcm9wUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZVRhcmdldCA9IGNyZWF0ZVRhcmdldEZhY3Rvcnkoc3BlYyk7XG5cbiAgICAgIGNvbnN0IGNvbm4gPSBuZXcgVGFyZ2V0Q29ubmVjdGlvbihcbiAgICAgICAge1xuICAgICAgICAgIGNyZWF0ZUhhbmRsZXI6IGNyZWF0ZVRhcmdldCxcbiAgICAgICAgICByZWdpc3RlckhhbmRsZXI6IHJlZ2lzdGVyVGFyZ2V0LFxuICAgICAgICAgIGNyZWF0ZU1vbml0b3I6IGNyZWF0ZVRhcmdldE1vbml0b3IsXG4gICAgICAgICAgY3JlYXRlQ29ubmVjdG9yOiBjcmVhdGVUYXJnZXRDb25uZWN0b3IsXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMubWFuYWdlcixcbiAgICAgICAgdGhpcy5uZ1pvbmUsXG4gICAgICAgIHR5cGVzIHx8IFRZUEVfRFlOQU1JQ1xuICAgICAgKSBhcyBEcm9wVGFyZ2V0PEl0ZW0sIERyb3BSZXN1bHQ+O1xuXG4gICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5hZGQoY29ubik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29ubjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEge0BsaW5rIERyYWdTb3VyY2V9IG9iamVjdC4gSXQgcmVwcmVzZW50cyBhIGRyYWdcbiAgICogc291cmNlIGFuZCBpdHMgYmVoYXZpb3VyLCBhbmQgY2FuIGJlIGNvbm5lY3RlZCB0byBhIERPTSBlbGVtZW50IGJ5XG4gICAqIGFzc2lnbmluZyBpdCB0byB0aGUgYFtkcmFnU291cmNlXWAgZGlyZWN0aXZlIG9uIHRoYXQgZWxlbWVudCBpbiB5b3VyXG4gICAqIHRlbXBsYXRlLlxuICAgKlxuICAgKiBJdCBpcyB0aGUgY29yb2xsYXJ5IG9mIFtgcmVhY3QtZG5kYCdzXG4gICAqIGBEcmFnU291cmNlYF0oaHR0cDovL3JlYWN0LWRuZC5naXRodWIuaW8vcmVhY3QtZG5kL2RvY3MtZHJhZy1zb3VyY2UuaHRtbCkuXG4gICAqXG4gICAqIFRoZSBgc3BlY2AgYXJndW1lbnQgKHtAbGluayBEcmFnU291cmNlU3BlY30pIGlzIGEgc2V0IG9mIF9xdWVyaWVzXyBhbmRcbiAgICogX2NhbGxiYWNrc18gdGhhdCBhcmUgY2FsbGVkIGF0IGFwcHJvcHJpYXRlIHRpbWVzIGJ5IHRoZSBpbnRlcm5hbHMuIFRoZVxuICAgKiBxdWVyaWVzIGFyZSBmb3IgYXNraW5nIHlvdXIgY29tcG9uZW50IHdoZXRoZXIgdG8gZHJhZy9saXN0ZW4gYW5kIHdoYXRcbiAgICogaXRlbSBkYXRhIHRvIGhvaXN0IHVwOyB0aGUgY2FsbGJhY2sgKGp1c3QgMSkgaXMgZm9yIG5vdGlmeWluZyB5b3Ugd2hlblxuICAgKiB0aGUgZHJhZyBlbmRzLlxuICAgKlxuICAgKiBPbmx5IHRoZSBkcm9wIHRhcmdldHMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUgdHlwZSB3aWxsXG4gICAqIHJlYWN0IHRvIHRoZSBpdGVtcyBwcm9kdWNlZCBieSB0aGlzIGRyYWcgc291cmNlLiBJZiB5b3Ugd2FudCBhIGR5bmFtaWNcbiAgICogdHlwZSwgcGFzcyBgbnVsbGAgYXMgdGhlIHR5cGU7IGFuZCBjYWxsIHtAbGluayBEcmFnU291cmNlI3NldFR5cGV9IGluXG4gICAqIGEgbGlmZWN5Y2xlIGhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBzdWJzY3JpcHRpb24gQW4gUnhKUyBTdWJzY3JpcHRpb24gdG8gdGllIHRoZSBsaWZldGltZSBvZiB0aGVcbiAgICogY29ubmVjdGlvbiB0by5cbiAgICovXG4gIHB1YmxpYyBkcmFnU291cmNlPEl0ZW0sIERyb3BSZXN1bHQgPSB1bmtub3duPihcbiAgICB0eXBlOiBzdHJpbmcgfCBzeW1ib2wgfCBudWxsLFxuICAgIHNwZWM6IERyYWdTb3VyY2VTcGVjPEl0ZW0sIERyb3BSZXN1bHQ+LFxuICAgIHN1YnNjcmlwdGlvbj86IEFkZFN1YnNjcmlwdGlvblxuICApOiBEcmFnU291cmNlPEl0ZW0sIERyb3BSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgY3JlYXRlU291cmNlID0gY3JlYXRlU291cmNlRmFjdG9yeShzcGVjKTtcblxuICAgICAgY29uc3QgY29ubiA9IG5ldyBTb3VyY2VDb25uZWN0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgY3JlYXRlSGFuZGxlcjogY3JlYXRlU291cmNlLFxuICAgICAgICAgIHJlZ2lzdGVySGFuZGxlcjogcmVnaXN0ZXJTb3VyY2UsXG4gICAgICAgICAgY3JlYXRlTW9uaXRvcjogY3JlYXRlU291cmNlTW9uaXRvcixcbiAgICAgICAgICBjcmVhdGVDb25uZWN0b3I6IGNyZWF0ZVNvdXJjZUNvbm5lY3RvcixcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5tYW5hZ2VyLFxuICAgICAgICB0aGlzLm5nWm9uZSxcbiAgICAgICAgdHlwZSB8fCBUWVBFX0RZTkFNSUNcbiAgICAgICkgYXMgRHJhZ1NvdXJjZTxJdGVtLCBEcm9wUmVzdWx0PjtcblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICBzdWJzY3JpcHRpb24uYWRkKGNvbm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHtAbGluayBEcmFnTGF5ZXJ9IG9iamVjdFxuICAgKi9cbiAgcHVibGljIGRyYWdMYXllcjxJdGVtID0gYW55PihzdWJzY3JpcHRpb24/OiBBZGRTdWJzY3JpcHRpb24pOiBEcmFnTGF5ZXI8SXRlbT4ge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBjb25uID0gbmV3IERyYWdMYXllckNvbm5lY3Rpb25DbGFzcyh0aGlzLm1hbmFnZXIpO1xuXG4gICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5hZGQoY29ubik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29ubjtcbiAgICB9KTtcbiAgfVxufVxuIl19