UNPKG

@cabinfo.eu/astrophysics-library

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

470 lines 45.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * This class define physics constants and calculated physics constants. * * Instanciation example : * * ```typescript * const instance = new CPhysicsConstants(); * ``` * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @author Alain Deseine * * @copyright CEI Alain Deseine 1992-2019 * * @beta * * Copyright (C) 2019 Alain Deseine * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ export class CConstant { /** * Constructor. * * The constructor of this class calculate calculated physics constants. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} name * @param {?} symbol * @param {?} value * @param {?} unit * @param {?} description */ constructor(name, symbol, value, unit, description) { // Set physics constants this.name = name; this.symbol = symbol; this.value = value; this.unit = unit; this.description = description; } // eo constructor } // eo CConstant class if (false) { /** @type {?} */ CConstant.prototype.name; /** @type {?} */ CConstant.prototype.symbol; /** @type {?} */ CConstant.prototype.value; /** @type {?} */ CConstant.prototype.unit; /** @type {?} */ CConstant.prototype.description; } // eo CConstant class export class CPhysicsConstants { /** * Constructor. * * The constructor of this class calculate calculated physics constants. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta */ constructor() { this.constants = []; // Set physics constants this.constants.push(new CConstant('PI constant', 'π', Math.PI, 'None', '')); this.constants.push(new CConstant('Celerity', 'c', 299792458, 'm.s-1', 'Celerity of light in vaccum')); this.constants.push(new CConstant('Planck constant', 'h', 6.62607015e-34, 'J.s', 'The Planck constant is a physical constant that is the quantum of electromagnetic action, which relates the energy carried by a photon to its frequency')); this.constants.push(new CConstant('Boltzmann constant', 'k', 1.38064852e-23, 'J.K-1', 'The Boltzmann constant (kB or k) is a physical constant which relates the average relative kinetic energy of particles in a gas with the temperature of the gas and occurs in Planck\'s law of black-body radiation and in Boltzmann\'s entropy formula.')); this.constants.push(new CConstant('Gravitational constant', 'G', 6.67408e-11, 'N.m2.kg-2', 'Gravitational constant is an empirical physical constant involved in the calculation of gravitational effects in Isaac Newton\'s law of universal gravitation and in Albert Einstein\'s general theory of relativity.')); // TODO Alain : Vérifier unité this.constants.push(new CConstant('Elementary charge', 'e', 1.602176634e-19, 'A.s', '')); this.constants.push(new CConstant('Coulomb', 'C', 1, 'A.s', '')); this.constants.push(new CConstant('Avogadro constant', 'NA', 6.022140857, 'mol-1', '')); this.constants.push(new CConstant('Standard acceleration', 'g', 9.80665, 'm.s-2', 'Standard acceleration due to gravity on earth')); this.constants.push(new CConstant('Bohr radius', 'a0', 0.52917721092, 'Å', 'The Bohr radius is approximately equal to the most probable distance between the nucleus and the electron in a hydrogen atom in its ground state. ')); this.constants.push(new CConstant('Ideal gas constant', 'R', 8.3144598, 'J.K-1.mol-1', '')); this.constants.push(new CConstant('Unified mass unit (dalton)', 'u', 1.660538921e-27, 'kg', 'Standard unit of mass that quantifies mass on an atomic or molecular scale')); this.constants.push(new CConstant('Vacuum permeability', 'µ0', 1.2566e-6, 'T.m.A-1', 'Vacuum permeability is the magnetic permeability in a classical vacuum.')); this.constants.push(new CConstant('Vacuum permittivity', 'ε0', 8.85418782e-12, 'F.m-1', 'Vacuum permittivity is an ideal, (baseline) physical constant, which is the value of the absolute dielectric permittivity of classical vacuum.')); this.constants.push(new CConstant('Impedance of free space', 'Z0', 376.730, 'Ω', 'The impedance of free space equals the product of the vacuum permeability μ0 and the speed of light in vacuum c0.')); this.constants.push(new CConstant('Astronomical unit', 'au', 149597870700, 'm', 'Astronomical unit is the distance from Earth to the Sun')); this.constants.push(new CConstant('Parsec', 'pc', 648000 / Math.PI * 149597870700, 'm', 'The parsec is a unit of length used to measure large distances to astronomical objects outside the Solar System. A parsec is defined as the distance at which one astronomical unit subtends an angle of one arcsecond,[1] which corresponds to 648000/π astronomical units.')); this.constants.push(new CConstant('Light year', 'lr', 9460730472580800, 'm', 'Light-year is the distance that light travels in vacuum in one Julian year (365.25 days).')); this.constants.push(new CConstant('Electronvolt', 'eV', 1.602176565e-19, 'J', '')); // Set physical quantities /** Solar system object mass */ this.constants.push(new CConstant('Solar mass', 'M☉', 1.9884e30, 'kg', '')); this.constants.push(new CConstant('Earth mass', 'M⊕', 5.9722e24, 'kg', '')); this.constants.push(new CConstant('Lunar mass', 'ML', 7.342e22, 'kg', '')); this.constants.push(new CConstant('Jupiter mass', 'MJ', 1.8986e27, 'kg', '')); /** Solar system object radius */ this.constants.push(new CConstant('Solar radius', 'R☉', 696342000, 'm', '')); this.constants.push(new CConstant('Earth radius', 'R⊕', 6378137, 'm', '')); this.constants.push(new CConstant('Lunar radius', 'RL', 1737400, 'm', '')); /** Particle mass */ this.constants.push(new CConstant('Electron mass', 'ML', 9.10938291e-31, 'kg', '')); this.constants.push(new CConstant('Neutron mass', 'ML', 1.67493e-27, 'kg', '')); this.constants.push(new CConstant('Proton mass', 'ML', 1.672649e-27, 'kg', '')); this.constants.forEach((/** * @param {?} element * @return {?} */ element => { this[element.symbol] = element.value; })); } /** * getConstantInfo method. * * this method simply log to the console class properties and methods. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} name * @return {?} */ getConstantInfo(name) { return this.constants.find((/** * @param {?} i * @return {?} */ i => i.symbol === name)); } // eo getConstantInfo method // eo getConstantInfo method /** * logConstants method. * * this method simply log to the console class properties and methods. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @return {?} */ logConstants() { console.log(this.constants); } // eo logConstants method // eo logConstants method /** * toJSON method. * * this method return the public and protected object properties. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @return {?} */ toJSON() { /** @type {?} */ let properties = Object.getOwnPropertyNames(this); return properties; } // eo toJSON method // eo toJSON method /** * * Conversion helpers * */ /** * unit of length conversion helpers */ /** * meter2au method. * * this method convert meters to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ meter2au(value) { return Math.round(value / this.au * 1000000) / 1000000; } // eo meter2au method // eo meter2au method /** * au2meter method. * * this method convert astronomical unit to meters. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ au2meter(value) { return value * this.au; } // eo au2meter method // eo au2meter method /** * au2kilometer method. * * this method convert astronomical unit to kilometers. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ au2kilometer(value) { return value * this.au / 1000; } // eo au2kilometer method // eo au2kilometer method /** * meter2pc method. * * this method convert meters to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ meter2pc(value) { return Math.round(value / this.pc * 1000000) / 1000000; } // eo meter2pc method // eo meter2pc method /** * pc2meter method. * * this method convert parsec to meters. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ pc2meter(value) { return value * this.pc; } // eo pc2meter method // eo pc2meter method /** * pc2kilometer method. * * this method convert parsec to kilometers. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ pc2kilometer(value) { return value * this.pc / 1000; } // eo pc2kilometer method // eo pc2kilometer method /** * pc2au method. * * this method convert parsec to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ pc2au(value) { return this.meter2au(this.pc2meter(value)); } // eo pc2au method // eo pc2au method /** * au2pc method. * * this method convert astronomical unit to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ au2pc(value) { return this.meter2pc(this.au2meter(value)); } // eo au2pc method // eo au2pc method /** * lr2pc method. * * this method convert light year unit to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ lr2pc(value) { return this.meter2pc(this.lr2meter(value)); } // eo lr2pc method // eo lr2pc method /** * lr2au method. * * this method convert light year to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ lr2au(value) { return this.meter2au(this.lr2meter(value)); } // eo lr2au method // eo lr2au method /** * lr2meter method. * * this method convert light year to meter. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ lr2meter(value) { return value * this.lr; } // eo lr2meter method // eo lr2meter method /** * lr2kilometer method. * * this method convert light year to kilometer. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ lr2kilometer(value) { return value * this.lr / 1000; } // eo lr2kilometer method // eo lr2kilometer method /** * meter2lr method. * * this method convert meter to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ meter2lr(value) { return Math.round(value / this.lr * 1000000) / 1000000; } // eo meter2lr method // eo meter2lr method /** * au2lr method. * * this method convert astronomical unit to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ au2lr(value) { return this.meter2lr(this.au2meter(value)); } // eo au2lr method // eo au2lr method /** * pc2lr method. * * this method convert parsec to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ pc2lr(value) { return this.meter2lr(this.pc2meter(value)); } // eo pc2lr method // eo pc2lr method /** * unit of mass conversion helpers */ /** * kg2ev method. * * this method convert kilogram to electronvolt. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ kg2ev(value) { return Math.round((value / this.eV * Math.pow(this.c, 2)) * 1000000) / 1000000; } // eo kg2ev method // eo kg2ev method /** * ev2kg method. * * this method convert kilogram to electronvolt using Albert Einstein formula E=mc2. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ ev2kg(value) { return value * this.eV / Math.pow(this.c, 2); } // eo ev2kg method } if (false) { /** @type {?} */ CPhysicsConstants.prototype.constants; /* Skipping unhandled member: [index: string]: any;*/ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0cm9waHlzaWNzLWxpYnJhcnkucGh5c2ljcy1jb25zdGFudHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2FiaW5mby5ldS9hc3Ryb3BoeXNpY3MtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9hc3Ryb3BoeXNpY3MtbGlicmFyeS5waHlzaWNzLWNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0EsTUFBTSxPQUFPLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQmxCLFlBQWMsSUFBWSxFQUFFLE1BQWMsRUFBRSxLQUFhLEVBQUUsSUFBWSxFQUFFLFdBQW1CO1FBQ3hGLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFhLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFXLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFZLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFhLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFNLFdBQVcsQ0FBQztJQUN0QyxDQUFDLENBQUMsaUJBQWlCO0NBQ3RCLENBQUMscUJBQXFCOzs7SUF6Qm5CLHlCQUFvQjs7SUFDcEIsMkJBQXNCOztJQUN0QiwwQkFBcUI7O0lBQ3JCLHlCQUFvQjs7SUFDcEIsZ0NBQTJCOzs7QUF1Qi9CLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7Ozs7O0lBZ0IxQjtRQWJPLGNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBY2pDLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxJQUFJLFNBQVMsQ0FBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBRSxDQUFFLENBQUM7UUFDaEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUUsSUFBSSxTQUFTLENBQUUsVUFBVSxFQUFF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Ozs7Ozs7Ozs7O0lBY2IsS0FBSyxDQUFFLEtBQWE7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUUsS0FBSyxDQUFFLENBQUUsQ0FBQztJQUNuRCxDQUFDLENBQUMsa0JBQWtCOzs7Ozs7Ozs7Ozs7Ozs7OztJQW9CYixLQUFLLENBQUUsS0FBYTtRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUUsQ0FBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDeEYsQ0FBQyxDQUFDLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7SUFjYixLQUFLLENBQUUsS0FBYTtRQUN2QixPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQztJQUNuRCxDQUFDLENBQUMsa0JBQWtCO0NBR3ZCOzs7SUE3WUcsc0NBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiICAvKipcbiAgICogVGhpcyBjbGFzcyBkZWZpbmUgcGh5c2ljcyBjb25zdGFudHMgYW5kIGNhbGN1bGF0ZWQgcGh5c2ljcyBjb25zdGFudHMuXG4gICAqXG4gICAqIEluc3RhbmNpYXRpb24gZXhhbXBsZSA6IFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBpbnN0YW5jZSA9IG5ldyBDUGh5c2ljc0NvbnN0YW50cygpO1xuICAgKiBgYGBcbiAgICogXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICogIFxuICAgKiBAYXV0aG9yIEFsYWluIERlc2VpbmVcbiAgICogXG4gICAqIEBjb3B5cmlnaHQgQ0VJIEFsYWluIERlc2VpbmUgMTk5Mi0yMDE5XG4gICAqIFxuICAgKiBAYmV0YSBcbiAgICogXG4gICAqIENvcHlyaWdodCAoQykgMjAxOSBBbGFpbiBEZXNlaW5lXG4gICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxuICAgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlXG4gICAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuXG4gICAqIFxuICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFU1xuICAgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4gICAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SXG4gICAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVNcbiAgICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuICAgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOXG4gICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4gICAqIFxuICAgKi9cblxuZXhwb3J0IGNsYXNzIENDb25zdGFudCB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgc3ltYm9sOiBzdHJpbmc7XG4gICAgcHVibGljIHZhbHVlOiBudW1iZXI7XG4gICAgcHVibGljIHVuaXQ6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLiBcbiAgICAgKiBcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhpcyBjbGFzcyBjYWxjdWxhdGUgY2FsY3VsYXRlZCBwaHlzaWNzIGNvbnN0YW50cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIGNvbnN0cnVjdG9yICggbmFtZTogc3RyaW5nLCBzeW1ib2w6IHN0cmluZywgdmFsdWU6IG51bWJlciwgdW5pdDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nICkge1xuICAgICAgICAvLyBTZXQgcGh5c2ljcyBjb25zdGFudHNcbiAgICAgICAgdGhpcy5uYW1lICAgICAgICAgICA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3ltYm9sICAgICAgICAgPSBzeW1ib2w7XG4gICAgICAgIHRoaXMudmFsdWUgICAgICAgICAgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51bml0ICAgICAgICAgICA9IHVuaXQ7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gICAgPSBkZXNjcmlwdGlvbjtcbiAgICB9IC8vIGVvIGNvbnN0cnVjdG9yXG59IC8vIGVvIENDb25zdGFudCBjbGFzc1xuXG5leHBvcnQgY2xhc3MgQ1BoeXNpY3NDb25zdGFudHMge1xuXG4gICAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gICAgcHVibGljIGNvbnN0YW50czogQ0NvbnN0YW50W10gICA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuIFxuICAgICAqIFxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzIGNhbGN1bGF0ZSBjYWxjdWxhdGVkIHBoeXNpY3MgY29uc3RhbnRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICAvLyBTZXQgcGh5c2ljcyBjb25zdGFudHNcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1BJIGNvbnN0YW50JywgJ8+AJywgTWF0aC5QSSwgJ05vbmUnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdDZWxlcml0eScsICdjJywgMjk5NzkyNDU4LCAnbS5zLTEnLCAnQ2VsZXJpdHkgb2YgbGlnaHQgaW4gdmFjY3VtJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdQbGFuY2sgY29uc3RhbnQnLCAnaCcsIDYuNjI2MDcwMTVlLTM0LCAnSi5zJywgJ1RoZSBQbGFuY2sgY29uc3RhbnQgaXMgYSBwaHlzaWNhbCBjb25zdGFudCB0aGF0IGlzIHRoZSBxdWFudHVtIG9mIGVsZWN0cm9tYWduZXRpYyBhY3Rpb24sIHdoaWNoIHJlbGF0ZXMgdGhlIGVuZXJneSBjYXJyaWVkIGJ5IGEgcGhvdG9uIHRvIGl0cyBmcmVxdWVuY3knICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0JvbHR6bWFubiBjb25zdGFudCcsICdrJywgMS4zODA2NDg1MmUtMjMsICdKLkstMScsICdUaGUgQm9sdHptYW5uIGNvbnN0YW50IChrQiBvciBrKSBpcyBhIHBoeXNpY2FsIGNvbnN0YW50IHdoaWNoIHJlbGF0ZXMgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUga2luZXRpYyBlbmVyZ3kgb2YgcGFydGljbGVzIGluIGEgZ2FzIHdpdGggdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBnYXMgYW5kIG9jY3VycyBpbiBQbGFuY2tcXCdzIGxhdyBvZiBibGFjay1ib2R5IHJhZGlhdGlvbiBhbmQgaW4gQm9sdHptYW5uXFwncyBlbnRyb3B5IGZvcm11bGEuJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdHcmF2aXRhdGlvbmFsIGNvbnN0YW50JywgJ0cnLCA2LjY3NDA4ZS0xMSwgJ04ubTIua2ctMicsICdHcmF2aXRhdGlvbmFsIGNvbnN0YW50IGlzIGFuIGVtcGlyaWNhbCBwaHlzaWNhbCBjb25zdGFudCBpbnZvbHZlZCBpbiB0aGUgY2FsY3VsYXRpb24gb2YgZ3Jhdml0YXRpb25hbCBlZmZlY3RzIGluIElzYWFjIE5ld3RvblxcJ3MgbGF3IG9mIHVuaXZlcnNhbCBncmF2aXRhdGlvbiBhbmQgaW4gQWxiZXJ0IEVpbnN0ZWluXFwncyBnZW5lcmFsIHRoZW9yeSBvZiByZWxhdGl2aXR5LicgKSApOyAvLyBUT0RPIEFsYWluIDogVsOpcmlmaWVyIHVuaXTDqVxuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnRWxlbWVudGFyeSBjaGFyZ2UnLCdlJywgMS42MDIxNzY2MzRlLTE5LCAnQS5zJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQ291bG9tYicsJ0MnLCAxLCAnQS5zJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQXZvZ2Fkcm8gY29uc3RhbnQnLCdOQScsIDYuMDIyMTQwODU3LCAnbW9sLTEnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdTdGFuZGFyZCBhY2NlbGVyYXRpb24nLCdnJywgOS44MDY2NSwgJ20ucy0yJywgJ1N0YW5kYXJkIGFjY2VsZXJhdGlvbiBkdWUgdG8gZ3Jhdml0eSBvbiBlYXJ0aCcgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQm9ociByYWRpdXMnLCdhMCcsIDAuNTI5MTc3MjEwOTIsICfDhScsICdUaGUgQm9ociByYWRpdXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byB0aGUgbW9zdCBwcm9iYWJsZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBudWNsZXVzIGFuZCB0aGUgZWxlY3Ryb24gaW4gYSBoeWRyb2dlbiBhdG9tIGluIGl0cyBncm91bmQgc3RhdGUuICcgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnSWRlYWwgZ2FzIGNvbnN0YW50JywnUicsIDguMzE0NDU5OCwgJ0ouSy0xLm1vbC0xJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnVW5pZmllZCBtYXNzIHVuaXQgKGRhbHRvbiknLCd1JywgMS42NjA1Mzg5MjFlLTI3LCAna2cnLCAnU3RhbmRhcmQgdW5pdCBvZiBtYXNzIHRoYXQgcXVhbnRpZmllcyBtYXNzIG9uIGFuIGF0b21pYyBvciBtb2xlY3VsYXIgc2NhbGUnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1ZhY3V1bSBwZXJtZWFiaWxpdHknLCfCtTAnLCAxLjI1NjZlLTYsICdULm0uQS0xJywgJ1ZhY3V1bSBwZXJtZWFiaWxpdHkgaXMgdGhlIG1hZ25ldGljIHBlcm1lYWJpbGl0eSBpbiBhIGNsYXNzaWNhbCB2YWN1dW0uJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdWYWN1dW0gcGVybWl0dGl2aXR5JywnzrUwJywgOC44NTQxODc4MmUtMTIsICdGLm0tMScsICdWYWN1dW0gcGVybWl0dGl2aXR5IGlzIGFuIGlkZWFsLCAoYmFzZWxpbmUpIHBoeXNpY2FsIGNvbnN0YW50LCB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlIGFic29sdXRlIGRpZWxlY3RyaWMgcGVybWl0dGl2aXR5IG9mIGNsYXNzaWNhbCB2YWN1dW0uJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdJbXBlZGFuY2Ugb2YgZnJlZSBzcGFjZScsJ1owJywgMzc2LjczMCwgJ86pJywgJ1RoZSBpbXBlZGFuY2Ugb2YgZnJlZSBzcGFjZSBlcXVhbHMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhY3V1bSBwZXJtZWFiaWxpdHkgzrwwIGFuZCB0aGUgc3BlZWQgb2YgbGlnaHQgaW4gdmFjdXVtIGMwLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQXN0cm9ub21pY2FsIHVuaXQnLCdhdScsIDE0OTU5Nzg3MDcwMCwgJ20nLCAnQXN0cm9ub21pY2FsIHVuaXQgaXMgdGhlIGRpc3RhbmNlIGZyb20gRWFydGggdG8gdGhlIFN1bicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnUGFyc2VjJywncGMnLCA2NDgwMDAgLyBNYXRoLlBJICogMTQ5NTk3ODcwNzAwLCAnbScsICdUaGUgcGFyc2VjIGlzIGEgdW5pdCBvZiBsZW5ndGggdXNlZCB0byBtZWFzdXJlIGxhcmdlIGRpc3RhbmNlcyB0byBhc3Ryb25vbWljYWwgb2JqZWN0cyBvdXRzaWRlIHRoZSBTb2xhciBTeXN0ZW0uIEEgcGFyc2VjIGlzIGRlZmluZWQgYXMgdGhlIGRpc3RhbmNlIGF0IHdoaWNoIG9uZSBhc3Ryb25vbWljYWwgdW5pdCBzdWJ0ZW5kcyBhbiBhbmdsZSBvZiBvbmUgYXJjc2Vjb25kLFsxXSB3aGljaCBjb3JyZXNwb25kcyB0byA2NDgwMDAvz4AgYXN0cm9ub21pY2FsIHVuaXRzLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnTGlnaHQgeWVhcicsJ2xyJywgOTQ2MDczMDQ3MjU4MDgwMCwgJ20nLCAnTGlnaHQteWVhciBpcyB0aGUgZGlzdGFuY2UgdGhhdCBsaWdodCB0cmF2ZWxzIGluIHZhY3V1bSBpbiBvbmUgSnVsaWFuIHllYXIgKDM2NS4yNSBkYXlzKS4nICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VsZWN0cm9udm9sdCcsJ2VWJywgMS42MDIxNzY1NjVlLTE5LCAnSicsICcnICkgKTtcblxuICAgICAgICAvLyBTZXQgcGh5c2ljYWwgcXVhbnRpdGllc1xuXG4gICAgICAgIC8qKiBTb2xhciBzeXN0ZW0gb2JqZWN0IG1hc3MgKi9cbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1NvbGFyIG1hc3MnLCdN4piJJywgMS45ODg0ZTMwLCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdFYXJ0aCBtYXNzJywnTeKKlScsIDUuOTcyMmUyNCwgJ2tnJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnTHVuYXIgbWFzcycsJ01MJywgNy4zNDJlMjIsICdrZycsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0p1cGl0ZXIgbWFzcycsJ01KJywgMS44OTg2ZTI3LCAna2cnLCAnJyApICk7XG5cbiAgICAgICAgLyoqIFNvbGFyIHN5c3RlbSBvYmplY3QgcmFkaXVzICovXG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdTb2xhciByYWRpdXMnLCdS4piJJywgNjk2MzQyMDAwLCAnbScsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VhcnRoIHJhZGl1cycsJ1LiipUnLCA2Mzc4MTM3LCAnbScsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0x1bmFyIHJhZGl1cycsJ1JMJywgMTczNzQwMCwgJ20nLCAnJyApICk7XG5cbiAgICAgICAgLyoqIFBhcnRpY2xlIG1hc3MgKi9cbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VsZWN0cm9uIG1hc3MnLCdNTCcsIDkuMTA5MzgyOTFlLTMxLCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdOZXV0cm9uIG1hc3MnLCdNTCcsIDEuNjc0OTNlLTI3LCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdQcm90b24gbWFzcycsJ01MJywgMS42NzI2NDllLTI3LCAna2cnLCAnJyApICk7XG5cblxuICAgICAgICB0aGlzLmNvbnN0YW50cy5mb3JFYWNoKCBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXNbZWxlbWVudC5zeW1ib2xdICAgID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRDb25zdGFudEluZm8gbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBzaW1wbHkgbG9nIHRvIHRoZSBjb25zb2xlIGNsYXNzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgZ2V0Q29uc3RhbnRJbmZvKCBuYW1lOiBzdHJpbmcgKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RhbnRzLmZpbmQoIGkgPT4gaS5zeW1ib2wgPT09IG5hbWUgKTtcbiAgICB9IC8vIGVvIGdldENvbnN0YW50SW5mbyBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogbG9nQ29uc3RhbnRzIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2Qgc2ltcGx5IGxvZyB0byB0aGUgY29uc29sZSBjbGFzcyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgIHB1YmxpYyBsb2dDb25zdGFudHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCB0aGlzLmNvbnN0YW50cyApO1xuICAgIH0gLy8gZW8gbG9nQ29uc3RhbnRzIG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiB0b0pTT04gbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gdGhlIHB1YmxpYyBhbmQgcHJvdGVjdGVkIG9iamVjdCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIHRvSlNPTigpOiBPYmplY3Qge1xuICAgICAgICBsZXQgcHJvcGVydGllcyAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyggdGhpcyApO1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9IC8vIGVvIHRvSlNPTiBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQ29udmVyc2lvbiBoZWxwZXJzXG4gICAgICogXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiB1bml0IG9mIGxlbmd0aCBjb252ZXJzaW9uIGhlbHBlcnNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIG1ldGVyMmF1IG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBtZXRlcnMgdG8gYXN0cm9ub21pY2FsIHVuaXQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgbWV0ZXIyYXUoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoIHZhbHVlIC8gdGhpcy5hdSAqIDEwMDAwMDAgKSAvIDEwMDAwMDA7XG4gICAgfSAvLyBlbyBtZXRlcjJhdSBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogYXUybWV0ZXIgbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0IGFzdHJvbm9taWNhbCB1bml0IHRvIG1ldGVycy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBhdTJtZXRlciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdmFsdWUgKiB0aGlzLmF1O1xuICAgIH0gLy8gZW8gYXUybWV0ZXIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIGF1MmtpbG9tZXRlciBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgYXN0cm9ub21pY2FsIHVuaXQgdG8ga2lsb21ldGVycy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBhdTJraWxvbWV0ZXIoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICogdGhpcy5hdSAvIDEwMDA7XG4gICAgfSAvLyBlbyBhdTJraWxvbWV0ZXIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIG1ldGVyMnBjIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBtZXRlcnMgdG8gcGFyc2VjLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIG1ldGVyMnBjKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAvIHRoaXMucGMgKiAxMDAwMDAwICkgLyAxMDAwMDAwO1xuICAgIH0gLy8gZW8gbWV0ZXIycGMgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHBjMm1ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8gbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIHBjMm1ldGVyKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAqIHRoaXMucGM7XG4gICAgfSAvLyBlbyBwYzJtZXRlciBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogcGMya2lsb21ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8ga2lsb21ldGVycy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBwYzJraWxvbWV0ZXIoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICogdGhpcy5wYyAvIDEwMDA7XG4gICAgfSAvLyBlbyBwYzJraWxvbWV0ZXIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHBjMmF1IG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8gYXN0cm9ub21pY2FsIHVuaXQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgcGMyYXUoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0ZXIyYXUoIHRoaXMucGMybWV0ZXIoIHZhbHVlICkgKTtcbiAgICB9IC8vIGVvIHBjMmF1IG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBhdTJwYyBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgYXN0cm9ub21pY2FsIHVuaXQgdG8gcGFyc2VjLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGF1MnBjKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGVyMnBjKCB0aGlzLmF1Mm1ldGVyKCB2YWx1ZSApICk7XG4gICAgfSAvLyBlbyBhdTJwYyBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogbHIycGMgbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0IGxpZ2h0IHllYXIgdW5pdCB0byBwYXJzZWMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgbHIycGMoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0ZXIycGMoIHRoaXMubHIybWV0ZXIoIHZhbHVlICkgKTtcbiAgICB9IC8vIGVvIGxyMnBjIG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBscjJhdSBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgbGlnaHQgeWVhciB0byBhc3Ryb25vbWljYWwgdW5pdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBscjJhdSggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRlcjJhdSggdGhpcy5scjJtZXRlciggdmFsdWUgKSApO1xuICAgIH0gLy8gZW8gbHIyYXUgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIGxyMm1ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBsaWdodCB5ZWFyIHRvIG1ldGVyLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGxyMm1ldGVyKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAqIHRoaXMubHI7XG4gICAgfSAvLyBlbyBscjJtZXRlciBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogbHIya2lsb21ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBsaWdodCB5ZWFyIHRvIGtpbG9tZXRlci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBscjJraWxvbWV0ZXIoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICogdGhpcy5sciAvIDEwMDA7XG4gICAgfSAvLyBlbyBscjJraWxvbWV0ZXIgbWV0aG9kXG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBtZXRlcjJsciBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgbWV0ZXIgdG8gbGlnaHQgeWVhci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBtZXRlcjJsciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgLyB0aGlzLmxyICogMTAwMDAwMCApIC8gMTAwMDAwMDtcbiAgICB9IC8vIGVvIG1ldGVyMmxyIG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBhdTJsciBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgYXN0cm9ub21pY2FsIHVuaXQgdG8gbGlnaHQgeWVhci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBhdTJsciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRlcjJsciggdGhpcy5hdTJtZXRlciggdmFsdWUgKSApO1xuICAgIH0gLy8gZW8gYXUybHIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHBjMmxyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8gbGlnaHQgeWVhci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBwYzJsciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRlcjJsciggdGhpcy5wYzJtZXRlciggdmFsdWUgKSApO1xuICAgIH0gLy8gZW8gcGMybHIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHVuaXQgb2YgbWFzcyBjb252ZXJzaW9uIGhlbHBlcnNcbiAgICAgKi9cblxuXG4gICAgXG4gICAgLyoqXG4gICAgICoga2cyZXYgbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0IGtpbG9ncmFtIHRvIGVsZWN0cm9udm9sdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBrZzJldiggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCggKCB2YWx1ZSAvIHRoaXMuZVYgKiBNYXRoLnBvdyggdGhpcy5jLCAyICkgKSAqIDEwMDAwMDApIC8gMTAwMDAwMDtcbiAgICB9IC8vIGVvIGtnMmV2IG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBldjJrZyBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQga2lsb2dyYW0gdG8gZWxlY3Ryb252b2x0IHVzaW5nIEFsYmVydCBFaW5zdGVpbiBmb3JtdWxhIEU9bWMyLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGV2MmtnKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAqIHRoaXMuZVYgLyBNYXRoLnBvdyggdGhpcy5jLCAyICk7XG4gICAgfSAvLyBlbyBldjJrZyBtZXRob2RcblxuXG59Il19