UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

169 lines (168 loc) 26.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { DataUtils } from '../share/utils/DataUtils'; import { ArrayUtils } from '../share/utils/ArrayUtils'; /** * @param {?=} key * @return {?} */ export function Option(key) { var /** @type {?} */ OPTIONS_KEY = "options"; // add option to _options_ return function (target, propertyKey, descriptor) { var /** @type {?} */ propKey = key || propertyKey; var /** @type {?} */ optionsMap = target['_options_']; if (!Object.prototype.hasOwnProperty.call(target, '_options_')) { var /** @type {?} */ parentOptionsMap = optionsMap; if (typeof parentOptionsMap === 'object') { // Inherit optionsMap from super class optionsMap = JSON.parse(JSON.stringify(parentOptionsMap)); } else { optionsMap = {}; } Object.defineProperty(target, '_options_', { value: optionsMap, enumerable: false, writable: false }); } // { propKey: <class-property-key> } optionsMap[propKey] = propertyKey; // We're going to wrap ngOnInit() to intercept the function call to initialize @Option() fields first. if (typeof target['ngOnInit'] === 'function' && !target['_optionsNgOnInitWrapped_']) { // Keep original ngOnInit() function to call it later. var /** @type {?} */ originalInit_1 = target['ngOnInit']; // Re-implement the ngOnInit() function. target['ngOnInit'] = function () { // We've to check the flag "_optionsNgOnInitExecuted_" to make sure that it will be executed only once. if (!this['_optionsNgOnInitExecuted_']) { // Call this.setOptions() to auto resolve @Option() field values // Passing overwrite = false means not to auto resolve the fields having value !== undefined. this.setOptions(this.options, false); this['_optionsNgOnInitExecuted_'] = true; } // Call original ngOnInit() // Call original ngOnInit() originalInit_1.call(this); }; target['_optionsNgOnInitWrapped_'] = true; } // We're going to wrap setOptions() to intercept the function call to auto resolve @Option() fields. if (typeof target['setOptions'] === 'function' && !target['_optionsSetOptionsWrapped_']) { // Keep original setOptions() function to call it later. var /** @type {?} */ originalSetOptions_1 = target['setOptions']; // Re-implement the setOptions() function. target['setOptions'] = function (options, overwrite) { if (overwrite === void 0) { overwrite = true; } if (this['_options_'] !== null && typeof this['_options_'] !== 'undefined') { var _loop_1 = function (optionKey) { var /** @type {?} */ propKey_1 = this_1['_options_'][optionKey] || optionKey; var /** @type {?} */ optionValue = this_1[propKey_1]; if (options !== null && typeof options !== 'undefined') { var /** @type {?} */ optionsToApply_1 = undefined; if (DataUtils.containsDataKey(optionKey, options)) { // We'll only override @Option field value if it is specified in options object only. // Use DataUtils.getDataValue() here to support dot notation (.): foo.bar // We'll only override @Option field value if it is specified in options object only. // Use DataUtils.getDataValue() here to support dot notation (.): foo.bar optionsToApply_1 = DataUtils.getDataValue(optionKey, options); } else if (typeof this_1.getName === 'function') { // Auto resolve @Option() value from parent's option object automatically. // { compName: {compOptions} } var /** @type {?} */ name_1 = this_1.getName(); if (name_1 !== null && typeof name_1 === 'string') { var /** @type {?} */ optionsByName = options[name_1]; if (optionsByName !== null && typeof optionsByName === 'object') { if (DataUtils.containsDataKey(optionKey, optionsByName)) { // We'll only override @Option field value if it is specified in options object only. // Use DataUtils.getDataValue() here to support dot notation (.): foo.bar // We'll only override @Option field value if it is specified in options object only. // Use DataUtils.getDataValue() here to support dot notation (.): foo.bar optionsToApply_1 = DataUtils.getDataValue(optionKey, optionsByName); } } } } if (optionsToApply_1 !== undefined) { if (this_1[propKey_1] !== null && this_1[propKey_1] !== undefined && typeof this_1[propKey_1]['setOptions'] === 'function') { // If this[propKey] is IHasOptions, chain the method call into it. this_1[propKey_1].setOptions(optionsToApply_1); } else if (this_1[propKey_1] !== null && Array.isArray(this_1[propKey_1]) && ArrayUtils.isAllMemberHasPropertyTypeOf(this_1[propKey_1], 'setOptions', 'function')) { // If this[propKey] is an array of IHasOptions, chain the method call into its member. if (optionsToApply_1 !== null && Array.isArray(optionsToApply_1)) { // If optionsToApply is an array, chain the method call 1-by-1. var /** @type {?} */ idx = void 0; for (idx = 0; idx < this_1[propKey_1].length && idx < optionsToApply_1.length; idx++) { // Set options value 1-by-1. this_1[propKey_1][idx].setOptions(optionsToApply_1[idx]); } for (; idx < this_1[propKey_1].length; idx++) { // Set "null" options into all members left. this_1[propKey_1][idx].setOptions(null); } } else { try { // Else, chain method call with the same value on all members. for (var _a = tslib_1.__values(this_1[propKey_1]), _b = _a.next(); !_b.done; _b = _a.next()) { var member = _b.value; member.setOptions(optionsToApply_1); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } } } else if (typeof this_1[propKey_1] !== undefined && this_1[propKey_1] instanceof EventEmitter) { // If this property is EventEmitter, it might be ng @Output. if (optionsToApply_1 instanceof EventEmitter && overwrite) { // The option value is EventEmitter also. // We'll overwrite the value only if "overwrite" is set. this_1[propKey_1] = optionsToApply_1; } else if (typeof optionsToApply_1 === 'function') { // If the option value is function, we'll subscribe this function to the emitter. this_1[propKey_1].subscribe(function ($event) { // Call this function/handler. // Call this function/handler. optionsToApply_1($event); }); } else { // Do nothing. } } else if (overwrite || typeof this_1[propKey_1] === 'undefined') { // Else, set this option value into the field. this_1[propKey_1] = optionsToApply_1; } } } var e_1, _c; }; var this_1 = this; for (var /** @type {?} */ optionKey in this['_options_']) { _loop_1(optionKey); } } // Call original setOptions() // Call original setOptions() originalSetOptions_1.call(this, options); }; target['_optionsSetOptionsWrapped_'] = true; } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uLmRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQUV2RCxNQUFNLGlCQUFpQixHQUFZO0lBRWpDLHFCQUFJLFdBQVcsR0FBVyxTQUFTLENBQUM7O0lBR3BDLE1BQU0sQ0FBQyxVQUFTLE1BQVcsRUFBRSxXQUFnQixFQUFFLFVBQWU7UUFDNUQscUJBQUksT0FBTyxHQUFXLEdBQUcsSUFBSSxXQUFXLENBQUM7UUFDekMscUJBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELHFCQUFJLGdCQUFnQixHQUFHLFVBQVUsQ0FBQztZQUVsQyxFQUFFLENBQUMsQ0FBQyxPQUFPLGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7O2dCQUV6QyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzthQUMzRDtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLFVBQVUsR0FBRyxFQUFFLENBQUM7YUFDakI7WUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUU7Z0JBQ3pDLEtBQUssRUFBRSxVQUFVO2dCQUNqQixVQUFVLEVBQUUsS0FBSztnQkFDakIs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QUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQ0FBL0IsU0FBUztxQkEwRWpCO2lCQUNGOztnQkFHRCxBQURBLDZCQUE2QjtnQkFDN0Isb0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN4QyxDQUFBO1lBRUQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQzdDO0tBRUYsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhVXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgQXJyYXlVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0FycmF5VXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gT3B0aW9uKGtleT86IHN0cmluZyk6IGFueSB7XG5cbiAgbGV0IE9QVElPTlNfS0VZOiBzdHJpbmcgPSBcIm9wdGlvbnNcIjtcblxuICAvLyBhZGQgb3B0aW9uIHRvIF9vcHRpb25zX1xuICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnksIGRlc2NyaXB0b3I6IGFueSkge1xuICAgIGxldCBwcm9wS2V5OiBzdHJpbmcgPSBrZXkgfHwgcHJvcGVydHlLZXk7XG4gICAgbGV0IG9wdGlvbnNNYXAgPSB0YXJnZXRbJ19vcHRpb25zXyddO1xuXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCAnX29wdGlvbnNfJykpIHtcbiAgICAgIGxldCBwYXJlbnRPcHRpb25zTWFwID0gb3B0aW9uc01hcDtcblxuICAgICAgaWYgKHR5cGVvZiBwYXJlbnRPcHRpb25zTWFwID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBJbmhlcml0IG9wdGlvbnNNYXAgZnJvbSBzdXBlciBjbGFzc1xuICAgICAgICBvcHRpb25zTWFwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJlbnRPcHRpb25zTWFwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zTWFwID0ge307XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICdfb3B0aW9uc18nLCB7XG4gICAgICAgIHZhbHVlOiBvcHRpb25zTWFwLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB7IHByb3BLZXk6IDxjbGFzcy1wcm9wZXJ0eS1rZXk+IH1cbiAgICBvcHRpb25zTWFwW3Byb3BLZXldID0gcHJvcGVydHlLZXk7XG5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB3cmFwIG5nT25Jbml0KCkgdG8gaW50ZXJjZXB0IHRoZSBmdW5jdGlvbiBjYWxsIHRvIGluaXRpYWxpemUgQE9wdGlvbigpIGZpZWxkcyBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHRhcmdldFsnbmdPbkluaXQnXSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGFyZ2V0Wydfb3B0aW9uc05nT25Jbml0V3JhcHBlZF8nXSkge1xuICAgICAgLy8gS2VlcCBvcmlnaW5hbCBuZ09uSW5pdCgpIGZ1bmN0aW9uIHRvIGNhbGwgaXQgbGF0ZXIuXG4gICAgICBsZXQgb3JpZ2luYWxJbml0ID0gdGFyZ2V0WyduZ09uSW5pdCddO1xuXG4gICAgICAvLyBSZS1pbXBsZW1lbnQgdGhlIG5nT25Jbml0KCkgZnVuY3Rpb24uXG4gICAgICB0YXJnZXRbJ25nT25Jbml0J10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gV2UndmUgdG8gY2hlY2sgdGhlIGZsYWcgXCJfb3B0aW9uc05nT25Jbml0RXhlY3V0ZWRfXCIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gICAgICAgIGlmICghdGhpc1snX29wdGlvbnNOZ09uSW5pdEV4ZWN1dGVkXyddKSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGlzLnNldE9wdGlvbnMoKSB0byBhdXRvIHJlc29sdmUgQE9wdGlvbigpIGZpZWxkIHZhbHVlc1xuICAgICAgICAgIC8vIFBhc3Npbmcgb3ZlcndyaXRlID0gZmFsc2UgbWVhbnMgbm90IHRvIGF1dG8gcmVzb2x2ZSB0aGUgZmllbGRzIGhhdmluZyB2YWx1ZSAhPT0gdW5kZWZpbmVkLlxuICAgICAgICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZhbHNlKTtcblxuICAgICAgICAgIHRoaXNbJ19vcHRpb25zTmdPbkluaXRFeGVjdXRlZF8nXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIG5nT25Jbml0KClcbiAgICAgICAgb3JpZ2luYWxJbml0LmNhbGwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldFsnX29wdGlvbnNOZ09uSW5pdFdyYXBwZWRfJ10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHdyYXAgc2V0T3B0aW9ucygpIHRvIGludGVyY2VwdCB0aGUgZnVuY3Rpb24gY2FsbCB0byBhdXRvIHJlc29sdmUgQE9wdGlvbigpIGZpZWxkcy5cbiAgICBpZiAodHlwZW9mIHRhcmdldFsnc2V0T3B0aW9ucyddID09PSAnZnVuY3Rpb24nICYmICF0YXJnZXRbJ19vcHRpb25zU2V0T3B0aW9uc1dyYXBwZWRfJ10pIHtcbiAgICAgIC8vIEtlZXAgb3JpZ2luYWwgc2V0T3B0aW9ucygpIGZ1bmN0aW9uIHRvIGNhbGwgaXQgbGF0ZXIuXG4gICAgICBsZXQgb3JpZ2luYWxTZXRPcHRpb25zID0gdGFyZ2V0WydzZXRPcHRpb25zJ107XG5cbiAgICAgIC8vIFJlLWltcGxlbWVudCB0aGUgc2V0T3B0aW9ucygpIGZ1bmN0aW9uLlxuICAgICAgdGFyZ2V0WydzZXRPcHRpb25zJ10gPSBmdW5jdGlvbihvcHRpb25zOiBhbnksIG92ZXJ3cml0ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXNbJ19vcHRpb25zXyddICE9PSBudWxsICYmIHR5cGVvZiB0aGlzWydfb3B0aW9uc18nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBvcHRpb25LZXkgaW4gdGhpc1snX29wdGlvbnNfJ10pIHtcbiAgICAgICAgICAgIGxldCBwcm9wS2V5ID0gdGhpc1snX29wdGlvbnNfJ11bb3B0aW9uS2V5XSB8fCBvcHRpb25LZXk7XG5cbiAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IHRoaXNbcHJvcEtleV07XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBsZXQgb3B0aW9uc1RvQXBwbHk6IGFueSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShvcHRpb25LZXksIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgb25seSBvdmVycmlkZSBAT3B0aW9uIGZpZWxkIHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiBvcHRpb25zIG9iamVjdCBvbmx5LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBEYXRhVXRpbHMuZ2V0RGF0YVZhbHVlKCkgaGVyZSB0byBzdXBwb3J0IGRvdCBub3RhdGlvbiAoLik6IGZvby5iYXJcbiAgICAgICAgICAgICAgICBvcHRpb25zVG9BcHBseSA9IERhdGFVdGlscy5nZXREYXRhVmFsdWUob3B0aW9uS2V5LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5nZXROYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gQXV0byByZXNvbHZlIEBPcHRpb24oKSB2YWx1ZSBmcm9tIHBhcmVudCdzIG9wdGlvbiBvYmplY3QgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICAvLyB7IGNvbXBOYW1lOiB7Y29tcE9wdGlvbnN9IH1cbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uc0J5TmFtZSA9IG9wdGlvbnNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zQnlOYW1lICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zQnlOYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShvcHRpb25LZXksIG9wdGlvbnNCeU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gV2UnbGwgb25seSBvdmVycmlkZSBAT3B0aW9uIGZpZWxkIHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiBvcHRpb25zIG9iamVjdCBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBEYXRhVXRpbHMuZ2V0RGF0YVZhbHVlKCkgaGVyZSB0byBzdXBwb3J0IGRvdCBub3RhdGlvbiAoLik6IGZvby5iYXJcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVG9BcHBseSA9IERhdGFVdGlscy5nZXREYXRhVmFsdWUob3B0aW9uS2V5LCBvcHRpb25zQnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zVG9BcHBseSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcEtleV0gIT09IG51bGwgJiYgdGhpc1twcm9wS2V5XSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzW3Byb3BLZXldWydzZXRPcHRpb25zJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXNbcHJvcEtleV0gaXMgSUhhc09wdGlvbnMsIGNoYWluIHRoZSBtZXRob2QgY2FsbCBpbnRvIGl0LlxuICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XS5zZXRPcHRpb25zKG9wdGlvbnNUb0FwcGx5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcEtleV0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh0aGlzW3Byb3BLZXldKSAmJiBBcnJheVV0aWxzLmlzQWxsTWVtYmVySGFzUHJvcGVydHlUeXBlT2YodGhpc1twcm9wS2V5XSwgJ3NldE9wdGlvbnMnLCAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpc1twcm9wS2V5XSBpcyBhbiBhcnJheSBvZiBJSGFzT3B0aW9ucywgY2hhaW4gdGhlIG1ldGhvZCBjYWxsIGludG8gaXRzIG1lbWJlci5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zVG9BcHBseSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnNUb0FwcGx5KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBvcHRpb25zVG9BcHBseSBpcyBhbiBhcnJheSwgY2hhaW4gdGhlIG1ldGhvZCBjYWxsIDEtYnktMS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRoaXNbcHJvcEtleV0ubGVuZ3RoICYmIGlkeCA8IG9wdGlvbnNUb0FwcGx5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgb3B0aW9ucyB2YWx1ZSAxLWJ5LTEuXG4gICAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XVtpZHhdLnNldE9wdGlvbnMob3B0aW9uc1RvQXBwbHlbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGlkeCA8IHRoaXNbcHJvcEtleV0ubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBcIm51bGxcIiBvcHRpb25zIGludG8gYWxsIG1lbWJlcnMgbGVmdC5cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BLZXldW2lkeF0uc2V0T3B0aW9ucyhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSwgY2hhaW4gbWV0aG9kIGNhbGwgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvbiBhbGwgbWVtYmVycy5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbWVtYmVyIG9mIHRoaXNbcHJvcEtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuc2V0T3B0aW9ucyhvcHRpb25zVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzW3Byb3BLZXldICE9PSB1bmRlZmluZWQgJiYgdGhpc1twcm9wS2V5XSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwcm9wZXJ0eSBpcyBFdmVudEVtaXR0ZXIsIGl0IG1pZ2h0IGJlIG5nIEBPdXRwdXQuXG4gICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1RvQXBwbHkgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIgJiYgb3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvcHRpb24gdmFsdWUgaXMgRXZlbnRFbWl0dGVyIGFsc28uXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIG92ZXJ3cml0ZSB0aGUgdmFsdWUgb25seSBpZiBcIm92ZXJ3cml0ZVwiIGlzIHNldC5cbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XSA9IG9wdGlvbnNUb0FwcGx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9uc1RvQXBwbHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBmdW5jdGlvbiwgd2UnbGwgc3Vic2NyaWJlIHRoaXMgZnVuY3Rpb24gdG8gdGhlIGVtaXR0ZXIuXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcEtleV0uc3Vic2NyaWJlKCgkZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbi9oYW5kbGVyLlxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUb0FwcGx5KCRldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG92ZXJ3cml0ZSB8fCB0eXBlb2YgdGhpc1twcm9wS2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVsc2UsIHNldCB0aGlzIG9wdGlvbiB2YWx1ZSBpbnRvIHRoZSBmaWVsZC5cbiAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcEtleV0gPSBvcHRpb25zVG9BcHBseTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIHNldE9wdGlvbnMoKVxuICAgICAgICBvcmlnaW5hbFNldE9wdGlvbnMuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0Wydfb3B0aW9uc1NldE9wdGlvbnNXcmFwcGVkXyddID0gdHJ1ZTtcbiAgICB9XG5cbiAgfTtcbn1cbiJdfQ==