UNPKG

homebridge-luxor

Version:

Homebridge Plug-in for the FX Luminaire (Luxor) lighting controller

155 lines 23.3 kB
"use strict"; /* jshint node: true */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ZDC_Controller = void 0; const ZD_Light_1 = require("../lights/ZD_Light"); const BaseController_1 = require("./BaseController"); const Queue_1 = __importDefault(require("../Queue")); class ZDC_Controller extends BaseController_1.BaseController { constructor(data, log) { super(data, log); } processGroupListGet(data) { // Get the list of light groups from the controller // ZDC supports Groups 1-250, Intensity 0-100, Color 0-250 and color wheel 251-26 (no color wheel support here) // ZDTWO supports Groups 1-250, Intensity 0-100, Colors 0-250 and color wheel 251-260 (no color wheel support here) & DMX 65535 if (typeof data.GroupList === 'undefined' || data.GroupList.length === 0) return; if (typeof data.GroupList[0] === 'undefined') return; // shortcut return if we are passed cached (already processed) results for (let i = 0; i < data.GroupList.length; i++) { let grp = data.GroupList[i]; if (grp.Colr >= 251) { this.log.warn(`A color value of ${grp.Colr} was found for the color of light group ${grp.GroupNumber}. Values of 251-260 are ColorWheels and 65535 means the controller is under DMX Group control. Please select a color 0-250 for this group to work in Homebridge.`); } else { let g = this.GroupList[grp.Grp] = typeof this.GroupList[grp.Grp] === 'undefined' ? {} : this.GroupList[grp.Grp]; if (typeof grp.Name !== 'undefined') g.Name = grp.Name; if (typeof grp.Grp !== 'undefined') g.GroupNumber = grp.Grp; if (typeof grp.Inten !== 'undefined') g.Intensity = grp.Inten; if (typeof grp.Colr !== 'undefined') { g.Color = grp.Colr; g.type = typeof grp.Colr === 'undefined' || grp.Colr === 0 ? ZD_Light_1.ILightType.ZD : ZD_Light_1.ILightType.ZDC; } } } } async ColorListSetAsync(color, hue, saturation) { // Same in ZDC/ZDTWO var requestData = JSON.stringify({ // assign the colors in the reverse order of their groups... // group 1 = color 250 // group 2 = color 249 // etc 'C': color, 'Hue': hue, 'Sat': saturation }); return Queue_1.default.enqueue(async () => { let status = await this.doRequest('ColorListSet', requestData); return status; }); /* let status = await this.queueRequest('ColorListSet', requestData); return status; */ } async ColorListGetAsync() { // Same in ZDC/ZDTWO if (typeof this.cacheColorList !== 'undefined' && Date.now() - this.cacheColorList < 2000) { return (this.ColorList); } return Queue_1.default.enqueue(async () => { let data = await this.doRequest('ColorListGet'); if (data.Status === 0) { this.cacheColorList = Date.now(); this.processColorListGet(data); } return this.ColorList; }); } async GetColorAsync(color) { return new Promise(async (resolve, reject) => { try { await this.ColorListGetAsync(); for (var colorId in this.ColorList) { if (this.ColorList[colorId].C === color) { resolve(Promise.resolve(this.ColorList[colorId])); return; } } // We get here if the color isn't found for some reason let status = await this.ColorListSetAsync(color, 360, 100); if (status.StatusStr === 'Ok') { resolve({ "C": color, "Hue": 360, "Sat": 100 }); return; } reject(`No valid colors found or available. Status: ${status.StatusStr}`); } catch (err) { this.log.error(`Error with GetColorAsync: ${err}`); } }); } execCallbacks() { super.execCallbacks(); for (let i = 0; i < this.callbackList.length; i++) { let callback = this.callbackList[i]; try { switch (callback.type) { case ZD_Light_1.ILightType.ZDC: if (callback.characteristic.name === this.platform.Characteristic.Hue.name) { for (let i in this.GroupList) { // need to use loop as these are not 0 based indexes if (this.GroupList[i].GroupNumber === callback.index) { for (let j in this.ColorList) { // need to use loop as these are not 0 based indexes if (this.ColorList[j].C === callback.index) { if (typeof this.ColorList[j].Hue !== 'undefined') callback.fn(this.ColorList[j].Hue); break; } } } } } if (callback.characteristic.name === this.platform.Characteristic.Saturation.name) { for (let i in this.GroupList) { // need to use loop as these are not 0 based indexes if (this.GroupList[i].GroupNumber === callback.index) { for (let j in this.ColorList) { // need to use loop as these are not 0 based indexes if (this.ColorList[j].C === callback.index) { if (typeof this.ColorList[j].Sat !== 'undefined') callback.fn(this.ColorList[j].Sat); break; } } } } } break; } } catch (err) { } } } async updateLights(force = false) { if (force) { this.cacheColorList = undefined; this.cacheGroupList = undefined; this.cacheThemeList = undefined; } await this.GroupListGetAsync(); await this.ThemeListGetAsync(); await this.ColorListGetAsync(); this.execCallbacks(); } } exports.ZDC_Controller = ZDC_Controller; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWkRDX0NvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9aRENfQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsdUJBQXVCOzs7Ozs7QUFFdkIsaURBQWdEO0FBQ2hELHFEQUFtSDtBQUNuSCxxREFBNkI7QUFFN0IsTUFBYSxjQUFlLFNBQVEsK0JBQWM7SUFFOUMsWUFBWSxJQUFJLEVBQUUsR0FBRztRQUNqQixLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxJQUFvQjtRQUM5QyxtREFBbUQ7UUFDbkQsK0dBQStHO1FBQy9HLCtIQUErSDtRQUMvSCxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDakYsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVztZQUFFLE9BQU8sQ0FBRSxzRUFBc0U7UUFDN0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRTtnQkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLDJDQUEyQyxHQUFHLENBQUMsV0FBVyxvS0FBb0ssQ0FBQyxDQUFDO2FBQzdRO2lCQUNJO2dCQUNELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sSUFBSSxD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QUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRDQUN2RixNQUFNO3lDQUNQO3FDQUNGO2lDQUNOOzZCQUNGO3lCQUNOO3dCQUNELE1BQU07aUJBQ2I7YUFDSjtZQUNELE9BQU8sR0FBRyxFQUFFO2FBQ1g7U0FDSjtJQUNMLENBQUM7SUFDRCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWlCLEtBQUs7UUFDckMsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztTQUNuQztRQUNELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUE3SUQsd0NBNklDIiwic291cmNlc0NvbnRlbnQiOlsiLyoganNoaW50IG5vZGU6IHRydWUgKi9cblxuaW1wb3J0IHsgSUxpZ2h0VHlwZSB9IGZyb20gJy4uL2xpZ2h0cy9aRF9MaWdodCc7XG5pbXBvcnQgeyBCYXNlQ29udHJvbGxlciwgSUNvbG9yTGlzdCwgSUNvbG9yTGlzdFJlc3AsIElHcm91cExpc3QsIElHcm91cExpc3RSZXNwLCBJU3RhdHVzIH0gZnJvbSAnLi9CYXNlQ29udHJvbGxlcic7XG5pbXBvcnQgUXVldWUgZnJvbSBcIi4uL1F1ZXVlXCI7XG5cbmV4cG9ydCBjbGFzcyBaRENfQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGxvZykge1xuICAgICAgICBzdXBlcihkYXRhLCBsb2cpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR3JvdXBMaXN0R2V0KGRhdGE6IElHcm91cExpc3RSZXNwKSB7XG4gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBsaWdodCBncm91cHMgZnJvbSB0aGUgY29udHJvbGxlclxuICAgICAgICAvLyBaREMgc3VwcG9ydHMgR3JvdXBzIDEtMjUwLCBJbnRlbnNpdHkgMC0xMDAsIENvbG9yIDAtMjUwIGFuZCBjb2xvciB3aGVlbCAyNTEtMjYgKG5vIGNvbG9yIHdoZWVsIHN1cHBvcnQgaGVyZSlcbiAgICAgICAgLy8gWkRUV08gc3VwcG9ydHMgR3JvdXBzIDEtMjUwLCBJbnRlbnNpdHkgMC0xMDAsIENvbG9ycyAwLTI1MCBhbmQgY29sb3Igd2hlZWwgMjUxLTI2MCAobm8gY29sb3Igd2hlZWwgc3VwcG9ydCBoZXJlKSAmIERNWCA2NTUzNVxuICAgICAgICBpZiAodHlwZW9mIGRhdGEuR3JvdXBMaXN0ID09PSAndW5kZWZpbmVkJyB8fCBkYXRhLkdyb3VwTGlzdC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLkdyb3VwTGlzdFswXSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjsgIC8vIHNob3J0Y3V0IHJldHVybiBpZiB3ZSBhcmUgcGFzc2VkIGNhY2hlZCAoYWxyZWFkeSBwcm9jZXNzZWQpIHJlc3VsdHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLkdyb3VwTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGdycCA9IGRhdGEuR3JvdXBMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGdycC5Db2xyID49IDI1MSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYEEgY29sb3IgdmFsdWUgb2YgJHtncnAuQ29scn0gd2FzIGZvdW5kIGZvciB0aGUgY29sb3Igb2YgbGlnaHQgZ3JvdXAgJHtncnAuR3JvdXBOdW1iZXJ9LiAgVmFsdWVzIG9mIDI1MS0yNjAgYXJlIENvbG9yV2hlZWxzIGFuZCA2NTUzNSBtZWFucyB0aGUgY29udHJvbGxlciBpcyB1bmRlciBETVggR3JvdXAgY29udHJvbC4gIFBsZWFzZSBzZWxlY3QgYSBjb2xvciAwLTI1MCBmb3IgdGhpcyBncm91cCB0byB3b3JrIGluIEhvbWVicmlkZ2UuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZyA9IHRoaXMuR3JvdXBMaXN0W2dycC5HcnBdID0gdHlwZW9mIHRoaXMuR3JvdXBMaXN0W2dycC5HcnBdID09PSAndW5kZWZpbmVkJyA/IHt9IGFzIGFueSA6IHRoaXMuR3JvdXBMaXN0W2dycC5HcnBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ3JwLk5hbWUgIT09ICd1bmRlZmluZWQnKSBnLk5hbWUgPSBncnAuTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdycC5HcnAgIT09ICd1bmRlZmluZWQnKSBnLkdyb3VwTnVtYmVyID0gZ3JwLkdycDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdycC5JbnRlbiAhPT0gJ3VuZGVmaW5lZCcpIGcuSW50ZW5zaXR5ID0gZ3JwLkludGVuO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ3JwLkNvbHIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGcuQ29sb3IgPSBncnAuQ29scjtcbiAgICAgICAgICAgICAgICAgICAgZy50eXBlID0gdHlwZW9mIGdycC5Db2xyID09PSAndW5kZWZpbmVkJyB8fCBncnAuQ29sciA9PT0gMCA/IElMaWdodFR5cGUuWkQgOiBJTGlnaHRUeXBlLlpEQztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBDb2xvckxpc3RTZXRBc3luYyhjb2xvcjogbnVtYmVyLCBodWU6IG51bWJlciwgc2F0dXJhdGlvbjogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgLy8gU2FtZSBpbiBaREMvWkRUV09cbiAgICAgICAgdmFyIHJlcXVlc3REYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgLy8gYXNzaWduIHRoZSBjb2xvcnMgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YgdGhlaXIgZ3JvdXBzLi4uXG4gICAgICAgICAgICAvLyBncm91cCAxID0gY29sb3IgMjUwXG4gICAgICAgICAgICAvLyBncm91cCAyID0gY29sb3IgMjQ5XG4gICAgICAgICAgICAvLyBldGNcbiAgICAgICAgICAgICdDJzogY29sb3IsXG4gICAgICAgICAgICAnSHVlJzogaHVlLFxuICAgICAgICAgICAgJ1NhdCc6IHNhdHVyYXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBRdWV1ZS5lbnF1ZXVlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCB0aGlzLmRvUmVxdWVzdCgnQ29sb3JMaXN0U2V0JywgcmVxdWVzdERhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfSlcblxuICAgICAgICAvKiAgICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCB0aGlzLnF1ZXVlUmVxdWVzdCgnQ29sb3JMaXN0U2V0JywgcmVxdWVzdERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICovXG4gICAgfVxuICAgIGFzeW5jIENvbG9yTGlzdEdldEFzeW5jKCk6IFByb21pc2U8SUNvbG9yTGlzdFtdPiB7XG4gICAgICAgIC8vIFNhbWUgaW4gWkRDL1pEVFdPXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWNoZUNvbG9yTGlzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgRGF0ZS5ub3coKSAtIHRoaXMuY2FjaGVDb2xvckxpc3QgPCAyMDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuQ29sb3JMaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUXVldWUuZW5xdWV1ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZG9SZXF1ZXN0KCdDb2xvckxpc3RHZXQnKTtcbiAgICAgICAgICAgIGlmIChkYXRhLlN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDb2xvckxpc3QgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbG9yTGlzdEdldChkYXRhIGFzIElDb2xvckxpc3RSZXNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbG9yTGlzdDtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBHZXRDb2xvckFzeW5jKGNvbG9yOiBudW1iZXIpOiBQcm9taXNlPElDb2xvckxpc3Q+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpOiBQcm9taXNlPElDb2xvckxpc3Q+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5Db2xvckxpc3RHZXRBc3luYygpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGNvbG9ySWQgaW4gdGhpcy5Db2xvckxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29sb3JMaXN0W2NvbG9ySWRdLkMgPT09IGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFByb21pc2UucmVzb2x2ZSh0aGlzLkNvbG9yTGlzdFtjb2xvcklkXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIHRoZSBjb2xvciBpc24ndCBmb3VuZCBmb3Igc29tZSByZWFzb25cbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy5Db2xvckxpc3RTZXRBc3luYyhjb2xvciwgMzYwLCAxMDApO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMuU3RhdHVzU3RyID09PSAnT2snKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJDXCI6IGNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJIdWVcIjogMzYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXRcIjogMTAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChgTm8gdmFsaWQgY29sb3JzIGZvdW5kIG9yIGF2YWlsYWJsZS4gIFN0YXR1czogJHtzdGF0dXMuU3RhdHVzU3RyfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEVycm9yIHdpdGggR2V0Q29sb3JBc3luYzogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgIGV4ZWNDYWxsYmFja3MoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmV4ZWNDYWxsYmFja3MoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja0xpc3RbaV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2FsbGJhY2sudHlwZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSUxpZ2h0VHlwZS5aREM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suY2hhcmFjdGVyaXN0aWMubmFtZSA9PT0gdGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5IdWUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5Hcm91cExpc3QpeyAvLyBuZWVkIHRvIHVzZSBsb29wIGFzIHRoZXNlIGFyZSBub3QgMCBiYXNlZCBpbmRleGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkdyb3VwTGlzdFtpXS5Hcm91cE51bWJlciA9PT0gY2FsbGJhY2suaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiBpbiB0aGlzLkNvbG9yTGlzdCl7IC8vIG5lZWQgdG8gdXNlIGxvb3AgYXMgdGhlc2UgYXJlIG5vdCAwIGJhc2VkIGluZGV4ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Db2xvckxpc3Rbal0uQyA9PT0gY2FsbGJhY2suaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuQ29sb3JMaXN0W2pdLkh1ZSAhPT0gJ3VuZGVmaW5lZCcpIGNhbGxiYWNrLmZuKHRoaXMuQ29sb3JMaXN0W2pdLkh1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suY2hhcmFjdGVyaXN0aWMubmFtZSA9PT0gdGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5TYXR1cmF0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMuR3JvdXBMaXN0KXsgLy8gbmVlZCB0byB1c2UgbG9vcCBhcyB0aGVzZSBhcmUgbm90IDAgYmFzZWQgaW5kZXhlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Hcm91cExpc3RbaV0uR3JvdXBOdW1iZXIgPT09IGNhbGxiYWNrLmluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogaW4gdGhpcy5Db2xvckxpc3QpeyAvLyBuZWVkIHRvIHVzZSBsb29wIGFzIHRoZXNlIGFyZSBub3QgMCBiYXNlZCBpbmRleGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29sb3JMaXN0W2pdLkMgPT09IGNhbGxiYWNrLmluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLkNvbG9yTGlzdFtqXS5TYXQgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjay5mbih0aGlzLkNvbG9yTGlzdFtqXS5TYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyB1cGRhdGVMaWdodHMoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVDb2xvckxpc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmNhY2hlR3JvdXBMaXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jYWNoZVRoZW1lTGlzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLkdyb3VwTGlzdEdldEFzeW5jKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuVGhlbWVMaXN0R2V0QXN5bmMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5Db2xvckxpc3RHZXRBc3luYygpO1xuICAgICAgICB0aGlzLmV4ZWNDYWxsYmFja3MoKTtcbiAgICB9XG59Il19