UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

498 lines 33.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /*! * Paradigm Framework - Angular Wrapper * Copyright (c) 2017 Miracle Devs, Inc * Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE) */ import { ServiceBase } from './base.service'; import { ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared'; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; /** * Represents the response of the geolocation service. * @record */ export function Coordinate() { } if (false) { /** * the latitude as a decimal number (always returned). * @type {?} */ Coordinate.prototype.latitude; /** * the longitude as a decimal number (always returned). * @type {?} */ Coordinate.prototype.longitude; /** * the accuracy of position (always returned). * @type {?|undefined} */ Coordinate.prototype.accuracy; /** * the altitude in meters above the mean sea level (returned if available). * @type {?|undefined} */ Coordinate.prototype.altitude; /** * the altitude accuracy of position (returned if available). * @type {?|undefined} */ Coordinate.prototype.altitudeAccuracy; /** * the heading as degrees clockwise from North (returned if available). * @type {?|undefined} */ Coordinate.prototype.heading; /** * the speed in meters per second (returned if available). * @type {?|undefined} */ Coordinate.prototype.speed; } /** * Represents the \@see navigator.geolocation options. * @record */ export function IPositionOptions() { } if (false) { /** * Indicates if the geolocation should have high accuracy to find the current position. * @type {?|undefined} */ IPositionOptions.prototype.enableHighAccuracy; /** * A timeout value for the geolocation query. * @type {?|undefined} */ IPositionOptions.prototype.timeout; /** * The maximum age for the request. * @type {?|undefined} */ IPositionOptions.prototype.maximumAge; } /** * Represents a geolocation watcher. * It listens for geolocation events. */ var /** * Represents a geolocation watcher. * It listens for geolocation events. */ GeolocationWatcher = /** @class */ (function () { /** * Creates a new instance of @see GeolocationWatcher * @param geolocation a reference to the geolocation service. */ function GeolocationWatcher(geolocation) { this.geolocation = geolocation; this.watchIndex = -1; } /** * Register the watcher and stores the watch operation index. * @param index the index representing this watch operation. */ /** * Register the watcher and stores the watch operation index. * @param {?} index the index representing this watch operation. * @return {?} */ GeolocationWatcher.prototype.register = /** * Register the watcher and stores the watch operation index. * @param {?} index the index representing this watch operation. * @return {?} */ function (index) { if (!this.isDisposed()) { throw new Error('This watcher can not be registered again.'); } this.watchIndex = index; }; /** * Unregisters the watcher. * Once unregistered, the watcher does not receives any more events. */ /** * Unregisters the watcher. * Once unregistered, the watcher does not receives any more events. * @return {?} */ GeolocationWatcher.prototype.unregister = /** * Unregisters the watcher. * Once unregistered, the watcher does not receives any more events. * @return {?} */ function () { if (this.isDisposed()) { throw new Error('This watcher has not been properly registered.'); } this.beingUnregistered = true; this.geolocation.unregisterWatcher(this); this.beingUnregistered = false; this.watchIndex = -1; }; /** * Gets the watch index. */ /** * Gets the watch index. * @return {?} */ GeolocationWatcher.prototype.getWatchIndex = /** * Gets the watch index. * @return {?} */ function () { return this.watchIndex; }; /** * Indicates if this watcher is disposed. */ /** * Indicates if this watcher is disposed. * @return {?} */ GeolocationWatcher.prototype.isDisposed = /** * Indicates if this watcher is disposed. * @return {?} */ function () { return this.watchIndex < 0; }; /** * Indicates if the watcher is being unregistered. */ /** * Indicates if the watcher is being unregistered. * @return {?} */ GeolocationWatcher.prototype.isBeingUnregistered = /** * Indicates if the watcher is being unregistered. * @return {?} */ function () { return this.beingUnregistered; }; return GeolocationWatcher; }()); /** * Represents a geolocation watcher. * It listens for geolocation events. */ export { GeolocationWatcher }; if (false) { /** * The geolocation watch operation index. * @type {?} * @private */ GeolocationWatcher.prototype.watchIndex; /** * Indicates if the watcher is being unregistered. * @type {?} * @private */ GeolocationWatcher.prototype.beingUnregistered; /** * Event called when the geolocation service reports new geolocation information. * \@param coordinates the new geolocation coordinates. * @type {?} */ GeolocationWatcher.prototype.onInformationReceived; /** * Event called when the geolocation service found an error. * \@param error the error found. * @type {?} */ GeolocationWatcher.prototype.onError; /** * @type {?} * @private */ GeolocationWatcher.prototype.geolocation; } /** * Provides a common interface for different geolocation providers. * @record */ export function IGeolocationProvider() { } if (false) { /** * Indicates if the geolocation provider is available. * @return {?} */ IGeolocationProvider.prototype.isAvailable = function () { }; /** * Gets the current geolocation. * @return {?} */ IGeolocationProvider.prototype.getGeolocation = function () { }; /** * Registers a new geolocation watcher. * @return {?} */ IGeolocationProvider.prototype.registerWatcher = function () { }; /** * Unregisters a geolocation watcher. * @param {?} watcher the watcher that will be unregistered. * @return {?} */ IGeolocationProvider.prototype.unregisterWatcher = function (watcher) { }; } /** * Implements the geolocation provider api using the \@see navigator.geolocation */ var /** * Implements the geolocation provider api using the \@see navigator.geolocation */ NavigationGeolocationProvider = /** @class */ (function () { /** * Creates a new instance of @see NavigationGeolocationProvider * @param options geolocation options. */ function NavigationGeolocationProvider(options) { this.options = options; } /** * Gets the current geolocation if a service geolocation service is available. */ /** * Gets the current geolocation if a service geolocation service is available. * @return {?} */ NavigationGeolocationProvider.prototype.getGeolocation = /** * Gets the current geolocation if a service geolocation service is available. * @return {?} */ function () { var _this = this; if (this.isAvailable()) { return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { return _this.getGeoLocator().getCurrentPosition((/** * @param {?} info * @return {?} */ function (info) { return resolve(info.coords); }), (/** * @param {?} error * @return {?} */ function (error) { return reject(error.message); }), _this.options); })); } return Promise.reject('The geolocation service is not available.'); }; /** * Registers a geolocation watcher to lister for geolocation events. */ /** * Registers a geolocation watcher to lister for geolocation events. * @return {?} */ NavigationGeolocationProvider.prototype.registerWatcher = /** * Registers a geolocation watcher to lister for geolocation events. * @return {?} */ function () { if (this.isAvailable()) { /** @type {?} */ var watcher_1 = new GeolocationWatcher(this); watcher_1.register(this.getGeoLocator().watchPosition((/** * @param {?} info * @return {?} */ function (info) { if (watcher_1.onInformationReceived) { watcher_1.onInformationReceived(info.coords); } }), (/** * @param {?} error * @return {?} */ function (error) { if (watcher_1.onError) { watcher_1.onError(error.message); } }), this.options)); return watcher_1; } throw new Error('The geolocation service is not available.'); }; /** * Unregisters the geolocation watcher. * @param watcher the watcher that will be unregistered. */ /** * Unregisters the geolocation watcher. * @param {?} watcher the watcher that will be unregistered. * @return {?} */ NavigationGeolocationProvider.prototype.unregisterWatcher = /** * Unregisters the geolocation watcher. * @param {?} watcher the watcher that will be unregistered. * @return {?} */ function (watcher) { if (!watcher.isBeingUnregistered()) { throw new Error('Can not call this method directly. Call GeolocationWatcher.unregister instead.'); } if (this.isAvailable()) { this.getGeoLocator().clearWatch(watcher.getWatchIndex()); } }; /** * Indicates if the geolocation service is available. */ /** * Indicates if the geolocation service is available. * @return {?} */ NavigationGeolocationProvider.prototype.isAvailable = /** * Indicates if the geolocation service is available. * @return {?} */ function () { return !ObjectExtensions.isNull(navigator.geolocation) && !ObjectExtensions.isNull(navigator.geolocation.getCurrentPosition) && !ObjectExtensions.isNull(navigator.geolocation.watchPosition) && !ObjectExtensions.isNull(navigator.geolocation.clearWatch); }; /** * Gets the geolocation service. */ /** * Gets the geolocation service. * @private * @return {?} */ NavigationGeolocationProvider.prototype.getGeoLocator = /** * Gets the geolocation service. * @private * @return {?} */ function () { return navigator.geolocation; }; return NavigationGeolocationProvider; }()); /** * Implements the geolocation provider api using the \@see navigator.geolocation */ export { NavigationGeolocationProvider }; if (false) { /** * @type {?} * @private */ NavigationGeolocationProvider.prototype.options; } var GeolocationService = /** @class */ (function (_super) { tslib_1.__extends(GeolocationService, _super); /** * Creates a new instance of @see GeolocationService * By default @see GeolocationService uses @see NavigationGeolocationProvider as provider. * The provider can be changed using @see GeolocationService.setGeolocationProvider */ function GeolocationService() { var _this = _super.call(this) || this; _this.geolocationProvider = new NavigationGeolocationProvider(); return _this; } /** * Sets the geolocation provider. * @param provider geolocation provider. */ /** * Sets the geolocation provider. * @param {?} provider geolocation provider. * @return {?} */ GeolocationService.prototype.setGeolocationProvider = /** * Sets the geolocation provider. * @param {?} provider geolocation provider. * @return {?} */ function (provider) { if (!provider) { throw new Error('The geolocation provider can not be null or undefined.'); } this.geolocationProvider = provider; }; /** * Gets the current geolocation if a service geolocation service is available. * @param options the geolocation options. */ /** * Gets the current geolocation if a service geolocation service is available. * @return {?} */ GeolocationService.prototype.getGeolocation = /** * Gets the current geolocation if a service geolocation service is available. * @return {?} */ function () { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.geolocationProvider.getGeolocation()]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * Registers a geolocation watcher to lister for geolocation events. * @param options the geolocation options. */ /** * Registers a geolocation watcher to lister for geolocation events. * @return {?} */ GeolocationService.prototype.registerWatcher = /** * Registers a geolocation watcher to lister for geolocation events. * @return {?} */ function () { return this.geolocationProvider.registerWatcher(); }; /** * Indicates if the geolocation service is available. */ /** * Indicates if the geolocation service is available. * @return {?} */ GeolocationService.prototype.isAvailable = /** * Indicates if the geolocation service is available. * @return {?} */ function () { return this.geolocationProvider.isAvailable(); }; GeolocationService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ GeolocationService.ctorParameters = function () { return []; }; /** @nocollapse */ GeolocationService.ngInjectableDef = i0.defineInjectable({ factory: function GeolocationService_Factory() { return new GeolocationService(); }, token: GeolocationService, providedIn: "root" }); return GeolocationService; }(ServiceBase)); export { GeolocationService }; if (false) { /** * Reference to a geolocation provider. * @type {?} * @private */ GeolocationService.prototype.geolocationProvider; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9nZW9sb2NhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBSzNDLGdDQW9DQzs7Ozs7O0lBL0JHLDhCQUFpQjs7Ozs7SUFLakIsK0JBQWtCOzs7OztJQUtsQiw4QkFBa0I7Ozs7O0lBS2xCLDhCQUFrQjs7Ozs7SUFLbEIsc0NBQTBCOzs7OztJQUsxQiw2QkFBaUI7Ozs7O0lBS2pCLDJCQUFlOzs7Ozs7QUFNbkIsc0NBZ0JDOzs7Ozs7SUFYRyw4Q0FBNkI7Ozs7O0lBSzdCLG1DQUFpQjs7Ozs7SUFLakIsc0NBQW9COzs7Ozs7QUFReEI7Ozs7O0lBd0JJOzs7T0FHRztJQUNILDRCQUFvQixXQUFpQztRQUFqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFFakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSCxxQ0FBUTs7Ozs7SUFBUixVQUFTLEtBQWE7UUFFbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDdEI7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDaEU7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSCx1Q0FBVTs7Ozs7SUFBVjtRQUVJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNyQjtZ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LENBQUM7SUFFRDs7O09BR0c7Ozs7O0lBQ0csMkNBQWM7Ozs7SUFBcEI7Ozs7NEJBRVcscUJBQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxFQUFBOzRCQUF0RCxzQkFBTyxTQUErQyxFQUFDOzs7O0tBQzFEO0lBRUQ7OztPQUdHOzs7OztJQUNILDRDQUFlOzs7O0lBQWY7UUFFSSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsd0NBQVc7Ozs7SUFBWDtRQUVJLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xELENBQUM7O2dCQTNESixVQUFVLFNBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzs7Ozs2QkFuU0Q7Q0E2VkMsQUE1REQsQ0FHd0MsV0FBVyxHQXlEbEQ7U0F6RFksa0JBQWtCOzs7Ozs7O0lBSzNCLGlEQUFrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogUGFyYWRpZ20gRnJhbWV3b3JrIC0gQW5ndWxhciBXcmFwcGVyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgTWlyYWNsZSBEZXZzLCBJbmNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL01pcmFjbGVEZXZzL1BhcmFkaWdtLldlYi5TaGFyZWQvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9iamVjdEV4dGVuc2lvbnMgfSBmcm9tICdAbWlyYWNsZWRldnMvcGFyYWRpZ20tdWktd2ViLXNoYXJlZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcmVzcG9uc2Ugb2YgdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29vcmRpbmF0ZVxue1xuICAgIC8qKlxuICAgICAqIHRoZSBsYXRpdHVkZSBhcyBhIGRlY2ltYWwgbnVtYmVyIChhbHdheXMgcmV0dXJuZWQpLlxuICAgICAqL1xuICAgIGxhdGl0dWRlOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgbG9uZ2l0dWRlIGFzIGEgZGVjaW1hbCBudW1iZXIgKGFsd2F5cyByZXR1cm5lZCkuXG4gICAgICovXG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgYWNjdXJhY3kgb2YgcG9zaXRpb24gKGFsd2F5cyByZXR1cm5lZCkuXG4gICAgICovXG4gICAgYWNjdXJhY3k/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzIGFib3ZlIHRoZSBtZWFuIHNlYSBsZXZlbCAocmV0dXJuZWQgaWYgYXZhaWxhYmxlKS5cbiAgICAgKi9cbiAgICBhbHRpdHVkZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIHRoZSBhbHRpdHVkZSBhY2N1cmFjeSBvZiBwb3NpdGlvbiAocmV0dXJuZWQgaWYgYXZhaWxhYmxlKS5cbiAgICAgKi9cbiAgICBhbHRpdHVkZUFjY3VyYWN5PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogdGhlIGhlYWRpbmcgYXMgZGVncmVlcyBjbG9ja3dpc2UgZnJvbSBOb3J0aCAocmV0dXJuZWQgaWYgYXZhaWxhYmxlKS5cbiAgICAgKi9cbiAgICBoZWFkaW5nPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogdGhlIHNwZWVkIGluIG1ldGVycyBwZXIgc2Vjb25kIChyZXR1cm5lZCBpZiBhdmFpbGFibGUpLlxuICAgICAqL1xuICAgIHNwZWVkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIEBzZWUgbmF2aWdhdG9yLmdlb2xvY2F0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBvc2l0aW9uT3B0aW9uc1xue1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2VvbG9jYXRpb24gc2hvdWxkIGhhdmUgaGlnaCBhY2N1cmFjeSB0byBmaW5kIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGVuYWJsZUhpZ2hBY2N1cmFjeT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBnZW9sb2NhdGlvbiBxdWVyeS5cbiAgICAgKi9cbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gYWdlIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBtYXhpbXVtQWdlPzogbnVtYmVyO1xufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdlb2xvY2F0aW9uIHdhdGNoZXIuXG4gKiBJdCBsaXN0ZW5zIGZvciBnZW9sb2NhdGlvbiBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHZW9sb2NhdGlvbldhdGNoZXJcbntcbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvbG9jYXRpb24gd2F0Y2ggb3BlcmF0aW9uIGluZGV4LlxuICAgICAqL1xuICAgIHByaXZhdGUgd2F0Y2hJbmRleDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSB3YXRjaGVyIGlzIGJlaW5nIHVucmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJlaW5nVW5yZWdpc3RlcmVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgY2FsbGVkIHdoZW4gdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UgcmVwb3J0cyBuZXcgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24uXG4gICAgICogQHBhcmFtIGNvb3JkaW5hdGVzIHRoZSBuZXcgZ2VvbG9jYXRpb24gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgb25JbmZvcm1hdGlvblJlY2VpdmVkOiAoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGUpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBjYWxsZWQgd2hlbiB0aGUgZ2VvbG9jYXRpb24gc2VydmljZSBmb3VuZCBhbiBlcnJvci5cbiAgICAgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIGZvdW5kLlxuICAgICAqL1xuICAgIG9uRXJyb3I6IChlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIEdlb2xvY2F0aW9uV2F0Y2hlclxuICAgICAqIEBwYXJhbSBnZW9sb2NhdGlvbiBhIHJlZmVyZW5jZSB0byB0aGUgZ2VvbG9jYXRpb24gc2VydmljZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdlb2xvY2F0aW9uOiBJR2VvbG9jYXRpb25Qcm92aWRlcilcbiAgICB7XG4gICAgICAgIHRoaXMud2F0Y2hJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoZSB3YXRjaGVyIGFuZCBzdG9yZXMgdGhlIHdhdGNoIG9wZXJhdGlvbiBpbmRleC5cbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHJlcHJlc2VudGluZyB0aGlzIHdhdGNoIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICByZWdpc3RlcihpbmRleDogbnVtYmVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHdhdGNoZXIgY2FuIG5vdCBiZSByZWdpc3RlcmVkIGFnYWluLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaEluZGV4ID0gaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIHdhdGNoZXIuXG4gICAgICogT25jZSB1bnJlZ2lzdGVyZWQsIHRoZSB3YXRjaGVyIGRvZXMgbm90IHJlY2VpdmVzIGFueSBtb3JlIGV2ZW50cy5cbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHdhdGNoZXIgaGFzIG5vdCBiZWVuIHByb3Blcmx5IHJlZ2lzdGVyZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJlaW5nVW5yZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5nZW9sb2NhdGlvbi51bnJlZ2lzdGVyV2F0Y2hlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iZWluZ1VucmVnaXN0ZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLndhdGNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB3YXRjaCBpbmRleC5cbiAgICAgKi9cbiAgICBnZXRXYXRjaEluZGV4KCk6IG51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyB3YXRjaGVyIGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIGlzRGlzcG9zZWQoKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hJbmRleCA8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSB3YXRjaGVyIGlzIGJlaW5nIHVucmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBpc0JlaW5nVW5yZWdpc3RlcmVkKCk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmJlaW5nVW5yZWdpc3RlcmVkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGRpZmZlcmVudCBnZW9sb2NhdGlvbiBwcm92aWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUdlb2xvY2F0aW9uUHJvdmlkZXJcbntcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGdlb2xvY2F0aW9uIHByb3ZpZGVyIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBpc0F2YWlsYWJsZSgpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBnZW9sb2NhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRHZW9sb2NhdGlvbigpOiBQcm9taXNlPENvb3JkaW5hdGU+O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IGdlb2xvY2F0aW9uIHdhdGNoZXIuXG4gICAgICovXG4gICAgcmVnaXN0ZXJXYXRjaGVyKCk6IEdlb2xvY2F0aW9uV2F0Y2hlcjtcblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGEgZ2VvbG9jYXRpb24gd2F0Y2hlci5cbiAgICAgKiBAcGFyYW0gd2F0Y2hlciB0aGUgd2F0Y2hlciB0aGF0IHdpbGwgYmUgdW5yZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXJXYXRjaGVyKHdhdGNoZXI6IEdlb2xvY2F0aW9uV2F0Y2hlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyB0aGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIgYXBpIHVzaW5nIHRoZSBAc2VlIG5hdmlnYXRvci5nZW9sb2NhdGlvblxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkdlb2xvY2F0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJR2VvbG9jYXRpb25Qcm92aWRlclxue1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBOYXZpZ2F0aW9uR2VvbG9jYXRpb25Qcm92aWRlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIGdlb2xvY2F0aW9uIG9wdGlvbnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvcHRpb25zPzogSVBvc2l0aW9uT3B0aW9ucylcbiAgICB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpZiBhIHNlcnZpY2UgZ2VvbG9jYXRpb24gc2VydmljZSBpcyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgZ2V0R2VvbG9jYXRpb24oKTogUHJvbWlzZTxDb29yZGluYXRlPlxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBdmFpbGFibGUoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMuZ2V0R2VvTG9jYXRvcigpLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBpbmZvID0+IHJlc29sdmUoaW5mby5jb29yZHMpLFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHJlamVjdChlcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnVGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBnZW9sb2NhdGlvbiB3YXRjaGVyIHRvIGxpc3RlciBmb3IgZ2VvbG9jYXRpb24gZXZlbnRzLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyV2F0Y2hlcigpOiBHZW9sb2NhdGlvbldhdGNoZXJcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmlzQXZhaWxhYmxlKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHdhdGNoZXIgPSBuZXcgR2VvbG9jYXRpb25XYXRjaGVyKHRoaXMpO1xuXG4gICAgICAgICAgICB3YXRjaGVyLnJlZ2lzdGVyKHRoaXMuZ2V0R2VvTG9jYXRvcigpLndhdGNoUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgaW5mbyA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoZXIub25JbmZvcm1hdGlvblJlY2VpdmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLm9uSW5mb3JtYXRpb25SZWNlaXZlZChpbmZvLmNvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoZXIub25FcnJvcilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hlci5vbkVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zKSk7XG5cbiAgICAgICAgICAgIHJldHVybiB3YXRjaGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2VvbG9jYXRpb24gc2VydmljZSBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIHRoZSBnZW9sb2NhdGlvbiB3YXRjaGVyLlxuICAgICAqIEBwYXJhbSB3YXRjaGVyIHRoZSB3YXRjaGVyIHRoYXQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcldhdGNoZXIod2F0Y2hlcjogR2VvbG9jYXRpb25XYXRjaGVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCF3YXRjaGVyLmlzQmVpbmdVbnJlZ2lzdGVyZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIENhbGwgR2VvbG9jYXRpb25XYXRjaGVyLnVucmVnaXN0ZXIgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQXZhaWxhYmxlKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0R2VvTG9jYXRvcigpLmNsZWFyV2F0Y2god2F0Y2hlci5nZXRXYXRjaEluZGV4KCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBpc0F2YWlsYWJsZSgpOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbikgJiZcbiAgICAgICAgICAgICFPYmplY3RFeHRlbnNpb25zLmlzTnVsbChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKSAmJlxuICAgICAgICAgICAgIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKSAmJlxuICAgICAgICAgICAgIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0R2VvTG9jYXRvcigpOiBHZW9sb2NhdGlvblxuICAgIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5nZW9sb2NhdGlvbjtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2VvbG9jYXRpb25TZXJ2aWNlIGV4dGVuZHMgU2VydmljZUJhc2VcbntcbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gYSBnZW9sb2NhdGlvbiBwcm92aWRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uUHJvdmlkZXI6IElHZW9sb2NhdGlvblByb3ZpZGVyO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIEdlb2xvY2F0aW9uU2VydmljZVxuICAgICAqIEJ5IGRlZmF1bHQgQHNlZSBHZW9sb2NhdGlvblNlcnZpY2UgdXNlcyBAc2VlIE5hdmlnYXRpb25HZW9sb2NhdGlvblByb3ZpZGVyIGFzIHByb3ZpZGVyLlxuICAgICAqIFRoZSBwcm92aWRlciBjYW4gYmUgY2hhbmdlZCB1c2luZyBAc2VlIEdlb2xvY2F0aW9uU2VydmljZS5zZXRHZW9sb2NhdGlvblByb3ZpZGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5nZW9sb2NhdGlvblByb3ZpZGVyID0gbmV3IE5hdmlnYXRpb25HZW9sb2NhdGlvblByb3ZpZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIGdlb2xvY2F0aW9uIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHNldEdlb2xvY2F0aW9uUHJvdmlkZXIocHJvdmlkZXI6IElHZW9sb2NhdGlvblByb3ZpZGVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCFwcm92aWRlcilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIgY2FuIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2VvbG9jYXRpb25Qcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaWYgYSBzZXJ2aWNlIGdlb2xvY2F0aW9uIHNlcnZpY2UgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBnZW9sb2NhdGlvbiBvcHRpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIGdldEdlb2xvY2F0aW9uKCk6IFByb21pc2U8Q29vcmRpbmF0ZT5cbiAgICB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlb2xvY2F0aW9uUHJvdmlkZXIuZ2V0R2VvbG9jYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBnZW9sb2NhdGlvbiB3YXRjaGVyIHRvIGxpc3RlciBmb3IgZ2VvbG9jYXRpb24gZXZlbnRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBnZW9sb2NhdGlvbiBvcHRpb25zLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyV2F0Y2hlcigpOiBHZW9sb2NhdGlvbldhdGNoZXJcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2xvY2F0aW9uUHJvdmlkZXIucmVnaXN0ZXJXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBpc0F2YWlsYWJsZSgpOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9sb2NhdGlvblByb3ZpZGVyLmlzQXZhaWxhYmxlKCk7XG4gICAgfVxufVxuIl19