UNPKG

@asoftwareworld/form-builder-pro

Version:

ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b

268 lines 43.1 kB
/** * @license * Copyright ASW (A Software World) All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file */ export class ObjectUtils { static keyPressNumbersWithDecimal(event) { const charCode = event.which ? event.which : event.keyCode; if (charCode !== 46 && charCode > 31 && (charCode < 48 || charCode > 57)) { event.preventDefault(); return false; } return true; } static resetForm(formContainer) { formContainer.forEach((control) => { control.value = ''; if (control.controlType === 'select' || control.controlType === 'multi-select' || control.controlType === 'radio' || control.controlType === 'checkbox' || control.controlType === 'autocomplete') { control.options.forEach((option) => { option.isChecked = false; }); } }); this.resetChildControls(formContainer); return formContainer; } static resetChildControls(formContainer) { const columnControls = formContainer.filter((x) => x.controlType === 'columns'); columnControls.forEach((control) => { control.columns.forEach((column) => { column.components.forEach((component) => { if (component.controlType === 'columns') { this.resetChildControls(column.components); } else { component.value = ''; if (component.controlType === 'select' || component.controlType === 'multi-select' || component.controlType === 'radio' || component.controlType === 'checkbox' || component.controlType === 'autocomplete') { component.options.forEach((option) => { option.isChecked = false; }); } } }); }); }); } static generateUUID(control) { const id = this.UUID(); if (control) { control.guid = control.guid ? control.guid : id; control.id = control.id ? control.id : id; } return control; } static validateForm(formContainer) { const data = formContainer.filter((x) => x.isRequired); let requiredControls = []; data.forEach((control) => { if (!control.value?.length) { requiredControls.push(control); } }); this.validateFormChilds(formContainer, requiredControls); requiredControls = [...new Set(requiredControls.map((control) => control))]; const labels = requiredControls.map((control) => control.label); return { isFormValid: labels.length ? false : true, labels }; } static validateFormChilds(formContainer, requiredControls) { const columnControls = formContainer.filter((x) => x.controlType === 'columns'); columnControls.forEach((control) => { control.columns.forEach((column) => { column.components.forEach((component) => { if (component.controlType === 'columns') { this.validateFormChilds(column.components, requiredControls); } if (component.isRequired && !component.value?.length) { requiredControls.push(component); } }); }); }); } static calculateValue(operations) { if (operations.length) { let sum = Number(operations[0].value); operations.forEach((operation, index) => { if (index !== 0) { switch (operation.operationValue) { case '+': sum += Number(operation.value); break; case '-': sum -= operation.value; break; case '*': sum *= operation.value; break; case '/': sum /= operation.value; break; case 'x̄': sum /= index; break; } } }); return sum; } return 0; } static missingOrEmpty(value) { return value == null || value.length === 0; } static exists(value, allowEmptyString = false) { return value != null && (value !== '' || allowEmptyString); } static stringToUtf8Arr(sDOMStr) { let nChr; let nArrLen = 0; const nStrLen = sDOMStr.length; /* mapping... */ for (let nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) { nChr = sDOMStr.charCodeAt(nMapIdx); nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6; } const aBytes = new Uint8Array(nArrLen); /* transcription... */ for (let nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) { nChr = sDOMStr.charCodeAt(nChrIdx); if (nChr < 128) { /* one byte */ aBytes[nIdx++] = nChr; } else if (nChr < 0x800) { /* two bytes */ aBytes[nIdx++] = 192 + (nChr >>> 6); aBytes[nIdx++] = 128 + (nChr & 63); } else if (nChr < 0x10000) { /* three bytes */ aBytes[nIdx++] = 224 + (nChr >>> 12); aBytes[nIdx++] = 128 + ((nChr >>> 6) & 63); aBytes[nIdx++] = 128 + (nChr & 63); } else if (nChr < 0x200000) { /* four bytes */ aBytes[nIdx++] = 240 + (nChr >>> 18); aBytes[nIdx++] = 128 + ((nChr >>> 12) & 63); aBytes[nIdx++] = 128 + ((nChr >>> 6) & 63); aBytes[nIdx++] = 128 + (nChr & 63); } else if (nChr < 0x4000000) { /* five bytes */ aBytes[nIdx++] = 248 + (nChr >>> 24); aBytes[nIdx++] = 128 + ((nChr >>> 18) & 63); aBytes[nIdx++] = 128 + ((nChr >>> 12) & 63); aBytes[nIdx++] = 128 + ((nChr >>> 6) & 63); aBytes[nIdx++] = 128 + (nChr & 63); } /* if (nChr <= 0x7fffffff) */ else { /* six bytes */ aBytes[nIdx++] = 252 + (nChr >>> 30); aBytes[nIdx++] = 128 + ((nChr >>> 24) & 63); aBytes[nIdx++] = 128 + ((nChr >>> 18) & 63); aBytes[nIdx++] = 128 + ((nChr >>> 12) & 63); aBytes[nIdx++] = 128 + ((nChr >>> 6) & 63); aBytes[nIdx++] = 128 + (nChr & 63); } } return aBytes; } /** * Converst string to ArrayBuffer */ static stringToArrayBuffer(dataString) { const data = new ArrayBuffer(dataString.length); const dataView = new Uint8Array(data); for (let i = 0; i < dataString.length; i++) { dataView[i] = dataString.charCodeAt(i); } return data; } /** * Converts Uint8Array to a string */ static utf8ArrToString(aBytes) { let sView = ''; for (let nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) { nPart = aBytes[nIdx]; sView += String.fromCharCode(nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */ /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */ (nPart - 252) * 1073741824 + ((aBytes[++nIdx] - 128) << 24) + ((aBytes[++nIdx] - 128) << 18) + ((aBytes[++nIdx] - 128) << 12) + ((aBytes[++nIdx] - 128) << 6) + aBytes[++nIdx] - 128 : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */ ((nPart - 248) << 24) + ((aBytes[++nIdx] - 128) << 18) + ((aBytes[++nIdx] - 128) << 12) + ((aBytes[++nIdx] - 128) << 6) + aBytes[++nIdx] - 128 : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */ ((nPart - 240) << 18) + ((aBytes[++nIdx] - 128) << 12) + ((aBytes[++nIdx] - 128) << 6) + aBytes[++nIdx] - 128 : nPart > 223 && nPart < 240 && nIdx + 2 < nLen /* three bytes */ ? ((nPart - 224) << 12) + ((aBytes[++nIdx] - 128) << 6) + aBytes[++nIdx] - 128 : nPart > 191 && nPart < 224 && nIdx + 1 < nLen /* two bytes */ ? ((nPart - 192) << 6) + aBytes[++nIdx] - 128 : /* nPart < 127 ? */ /* one byte */ nPart); } return sView; } /** * Returns stringified jwk. */ static getSortedObjectString(obj) { return JSON.stringify(obj, Object.keys(obj).sort()); } static findDeviceSize(containerWidth) { if (containerWidth >= 1400) { return 0.375; } else if (containerWidth >= 1200) { return 0.775; } else if (containerWidth >= 992) { return 0.775; } else if (containerWidth >= 768) { return 0.775; } else if (containerWidth >= 576) { return 0.775; } else if (containerWidth < 576) { return 0.775; } else { return 0.775; } } static UUID() { if (typeof window !== 'undefined' && typeof window.crypto !== 'undefined' && typeof window.crypto.getRandomValues !== 'undefined') { // If we have a cryptographically secure PRNG, use that // http://stackoverflow.com/questions/6906916/collisions-when-generating-uuids-in-javascript const buf = new Uint16Array(8); window.crypto.getRandomValues(buf); return this.pad4(buf[0]) + this.pad4(buf[1]) + '-' + this.pad4(buf[2]) + '-' + this.pad4(buf[3]) + '-' + this.pad4(buf[4]) + '-' + this.pad4(buf[5]) + this.pad4(buf[6]) + this.pad4(buf[7]); } else { // Otherwise, just use Math.random // https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript // https://stackoverflow.com/questions/11605068/why-does-jshint-argue-against-bitwise-operators-how-should-i-express-this-code return this.random4() + this.random4() + '-' + this.random4() + '-' + this.random4() + '-' + this.random4() + '-' + this.random4() + this.random4() + this.random4(); } } static pad4(num) { let ret = num.toString(16); while (ret.length < 4) { ret = '0' + ret; } return ret; } static random4() { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0dXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91dGlscy9vYmplY3R1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFJSCxNQUFNLE9BQU8sV0FBVztJQUNiLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxLQUFVO1FBQy9DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDM0QsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBb0I7UUFDeEMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxjQUFjLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztnQkFDaE0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFxQixFQUFFLEVBQUU7b0JBQzlDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQztZ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QUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyw2QkFBNkI7aUJBQU0sQ0FBQztnQkFDbEMsZUFBZTtnQkFDZixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBa0I7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBa0I7UUFDckMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxDQUN4QixLQUFLLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJO2dCQUN6QyxDQUFDLENBQUMsZUFBZTtvQkFDZixrRUFBa0U7b0JBQ2xFLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRztnQkFDdEwsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUk7b0JBQzdDLENBQUMsQ0FBQyxnQkFBZ0I7d0JBQ2hCLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRztvQkFDaEosQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUk7d0JBQzdDLENBQUMsQ0FBQyxnQkFBZ0I7NEJBQ2hCLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxD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QUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO2FBQzNDLFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDWixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFTVyAoQSBTb2Z0d2FyZSBXb3JsZCkgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZVxuICovXG5cbmltcG9ydCB7IENvbnRyb2xPcHRpb24gfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyLXByby9hcGknO1xuXG5leHBvcnQgY2xhc3MgT2JqZWN0VXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMga2V5UHJlc3NOdW1iZXJzV2l0aERlY2ltYWwoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGV2ZW50LndoaWNoID8gZXZlbnQud2hpY2ggOiBldmVudC5rZXlDb2RlO1xuICAgICAgICBpZiAoY2hhckNvZGUgIT09IDQ2ICYmIGNoYXJDb2RlID4gMzEgJiYgKGNoYXJDb2RlIDwgNDggfHwgY2hhckNvZGUgPiA1NykpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZXNldEZvcm0oZm9ybUNvbnRhaW5lcjogYW55W10pOiBhbnlbXSB7XG4gICAgICAgIGZvcm1Db250YWluZXIuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuY29udHJvbFR5cGUgPT09ICdzZWxlY3QnIHx8IGNvbnRyb2wuY29udHJvbFR5cGUgPT09ICdtdWx0aS1zZWxlY3QnIHx8IGNvbnRyb2wuY29udHJvbFR5cGUgPT09ICdyYWRpbycgfHwgY29udHJvbC5jb250cm9sVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBjb250cm9sLmNvbnRyb2xUeXBlID09PSAnYXV0b2NvbXBsZXRlJykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub3B0aW9ucy5mb3JFYWNoKChvcHRpb246IENvbnRyb2xPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmlzQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkQ29udHJvbHMoZm9ybUNvbnRhaW5lcik7XG4gICAgICAgIHJldHVybiBmb3JtQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHJlc2V0Q2hpbGRDb250cm9scyhmb3JtQ29udGFpbmVyOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2x1bW5Db250cm9scyA9IGZvcm1Db250YWluZXIuZmlsdGVyKCh4KSA9PiB4LmNvbnRyb2xUeXBlID09PSAnY29sdW1ucycpO1xuICAgICAgICBjb2x1bW5Db250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNvbnRyb2xUeXBlID09PSAnY29sdW1ucycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRDaGlsZENvbnRyb2xzKGNvbHVtbi5jb21wb25lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5jb250cm9sVHlwZSA9PT0gJ3NlbGVjdCcgfHwgY29tcG9uZW50LmNvbnRyb2xUeXBlID09PSAnbXVsdGktc2VsZWN0JyB8fCBjb21wb25lbnQuY29udHJvbFR5cGUgPT09ICdyYWRpbycgfHwgY29tcG9uZW50LmNvbnRyb2xUeXBlID09PSAnY2hlY2tib3gnIHx8IGNvbXBvbmVudC5jb250cm9sVHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQub3B0aW9ucy5mb3JFYWNoKChvcHRpb246IENvbnRyb2xPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmlzQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZVVVSUQoY29udHJvbDogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLlVVSUQoKTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZ3VpZCA9IGNvbnRyb2wuZ3VpZCA/IGNvbnRyb2wuZ3VpZCA6IGlkO1xuICAgICAgICAgICAgY29udHJvbC5pZCA9IGNvbnRyb2wuaWQgPyBjb250cm9sLmlkIDogaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUZvcm0oZm9ybUNvbnRhaW5lcjogYW55W10pOiBhbnkge1xuICAgICAgICBjb25zdCBkYXRhID0gZm9ybUNvbnRhaW5lci5maWx0ZXIoKHgpID0+IHguaXNSZXF1aXJlZCk7XG4gICAgICAgIGxldCByZXF1aXJlZENvbnRyb2xzOiBhbnlbXSA9IFtdO1xuICAgICAgICBkYXRhLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmICghY29udHJvbC52YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDb250cm9scy5wdXNoKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZvcm1DaGlsZHMoZm9ybUNvbnRhaW5lciwgcmVxdWlyZWRDb250cm9scyk7XG4gICAgICAgIHJlcXVpcmVkQ29udHJvbHMgPSBbLi4ubmV3IFNldChyZXF1aXJlZENvbnRyb2xzLm1hcCgoY29udHJvbCkgPT4gY29udHJvbCkpXTtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gcmVxdWlyZWRDb250cm9scy5tYXAoKGNvbnRyb2wpID0+IGNvbnRyb2wubGFiZWwpO1xuICAgICAgICByZXR1cm4geyBpc0Zvcm1WYWxpZDogbGFiZWxzLmxlbmd0aCA/IGZhbHNlIDogdHJ1ZSwgbGFiZWxzIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdGVGb3JtQ2hpbGRzKGZvcm1Db250YWluZXI6IGFueVtdLCByZXF1aXJlZENvbnRyb2xzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2x1bW5Db250cm9scyA9IGZvcm1Db250YWluZXIuZmlsdGVyKCh4KSA9PiB4LmNvbnRyb2xUeXBlID09PSAnY29sdW1ucycpO1xuICAgICAgICBjb2x1bW5Db250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNvbnRyb2xUeXBlID09PSAnY29sdW1ucycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVGb3JtQ2hpbGRzKGNvbHVtbi5jb21wb25lbnRzLCByZXF1aXJlZENvbnRyb2xzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlzUmVxdWlyZWQgJiYgIWNvbXBvbmVudC52YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZENvbnRyb2xzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlVmFsdWUob3BlcmF0aW9uczogYW55W10pOiBudW1iZXIge1xuICAgICAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBzdW0gPSBOdW1iZXIob3BlcmF0aW9uc1swXS52YWx1ZSk7XG4gICAgICAgICAgICBvcGVyYXRpb25zLmZvckVhY2goKG9wZXJhdGlvbjogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0aW9uLm9wZXJhdGlvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gTnVtYmVyKG9wZXJhdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gLT0gb3BlcmF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtICo9IG9wZXJhdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSAvPSBvcGVyYXRpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4zIQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSAvPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHN1bTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pc3NpbmdPckVtcHR5PFQ+KHZhbHVlPzogVFtdIHwgc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBleGlzdHModmFsdWU6IGFueSwgYWxsb3dFbXB0eVN0cmluZyA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSAhPT0gJycgfHwgYWxsb3dFbXB0eVN0cmluZyk7XG4gICAgfVxuXG4gICAgc3RhdGljIHN0cmluZ1RvVXRmOEFycihzRE9NU3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICAgICAgbGV0IG5DaHI7XG4gICAgICAgIGxldCBuQXJyTGVuID0gMDtcbiAgICAgICAgY29uc3QgblN0ckxlbiA9IHNET01TdHIubGVuZ3RoO1xuICAgICAgICAvKiBtYXBwaW5nLi4uICovXG4gICAgICAgIGZvciAobGV0IG5NYXBJZHggPSAwOyBuTWFwSWR4IDwgblN0ckxlbjsgbk1hcElkeCsrKSB7XG4gICAgICAgICAgICBuQ2hyID0gc0RPTVN0ci5jaGFyQ29kZUF0KG5NYXBJZHgpO1xuICAgICAgICAgICAgbkFyckxlbiArPSBuQ2hyIDwgMHg4MCA/IDEgOiBuQ2hyIDwgMHg4MDAgPyAyIDogbkNociA8IDB4MTAwMDAgPyAzIDogbkNociA8IDB4MjAwMDAwID8gNCA6IG5DaHIgPCAweDQwMDAwMDAgPyA1IDogNjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5BcnJMZW4pO1xuXG4gICAgICAgIC8qIHRyYW5zY3JpcHRpb24uLi4gKi9cblxuICAgICAgICBmb3IgKGxldCBuSWR4ID0gMCwgbkNocklkeCA9IDA7IG5JZHggPCBuQXJyTGVuOyBuQ2hySWR4KyspIHtcbiAgICAgICAgICAgIG5DaHIgPSBzRE9NU3RyLmNoYXJDb2RlQXQobkNocklkeCk7XG4gICAgICAgICAgICBpZiAobkNociA8IDEyOCkge1xuICAgICAgICAgICAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSBuQ2hyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuQ2hyIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgICAgICAgICAgICBhQnl0ZXNbbklkeCsrXSA9IDE5MiArIChuQ2hyID4+PiA2KTtcbiAgICAgICAgICAgICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuQ2hyIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAyMjQgKyAobkNociA+Pj4gMTIpO1xuICAgICAgICAgICAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKChuQ2hyID4+PiA2KSAmIDYzKTtcbiAgICAgICAgICAgICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuQ2hyIDwgMHgyMDAwMDApIHtcbiAgICAgICAgICAgICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAyNDAgKyAobkNociA+Pj4gMTgpO1xuICAgICAgICAgICAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKChuQ2hyID4+PiAxMikgJiA2Myk7XG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAoKG5DaHIgPj4+IDYpICYgNjMpO1xuICAgICAgICAgICAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgJiA2Myk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5DaHIgPCAweDQwMDAwMDApIHtcbiAgICAgICAgICAgICAgICAvKiBmaXZlIGJ5dGVzICovXG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAyNDggKyAobkNociA+Pj4gMjQpO1xuICAgICAgICAgICAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKChuQ2hyID4+PiAxOCkgJiA2Myk7XG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAoKG5DaHIgPj4+IDEyKSAmIDYzKTtcbiAgICAgICAgICAgICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArICgobkNociA+Pj4gNikgJiA2Myk7XG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociAmIDYzKTtcbiAgICAgICAgICAgIH0gLyogaWYgKG5DaHIgPD0gMHg3ZmZmZmZmZikgKi8gZWxzZSB7XG4gICAgICAgICAgICAgICAgLyogc2l4IGJ5dGVzICovXG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAyNTIgKyAobkNociA+Pj4gMzApO1xuICAgICAgICAgICAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKChuQ2hyID4+PiAyNCkgJiA2Myk7XG4gICAgICAgICAgICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAoKG5DaHIgPj4+IDE4KSAmIDYzKTtcbiAgICAgICAgICAgICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArICgobkNociA+Pj4gMTIpICYgNjMpO1xuICAgICAgICAgICAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKChuQ2hyID4+PiA2KSAmIDYzKTtcbiAgICAgICAgICAgICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFCeXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJzdCBzdHJpbmcgdG8gQXJyYXlCdWZmZXJcbiAgICAgKi9cbiAgICBzdGF0aWMgc3RyaW5nVG9BcnJheUJ1ZmZlcihkYXRhU3RyaW5nOiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgQXJyYXlCdWZmZXIoZGF0YVN0cmluZy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFWaWV3W2ldID0gZGF0YVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgdXRmOEFyclRvU3RyaW5nKGFCeXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzVmlldyA9ICcnO1xuICAgICAgICBmb3IgKGxldCBuUGFydCwgbkxlbiA9IGFCeXRlcy5sZW5ndGgsIG5JZHggPSAwOyBuSWR4IDwgbkxlbjsgbklkeCsrKSB7XG4gICAgICAgICAgICBuUGFydCA9IGFCeXRlc1tuSWR4XTtcbiAgICAgICAgICAgIHNWaWV3ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAgICAgblBhcnQgPiAyNTEgJiYgblBhcnQgPCAyNTQgJiYgbklkeCArIDUgPCBuTGVuXG4gICAgICAgICAgICAgICAgICAgID8gLyogc2l4IGJ5dGVzICovXG4gICAgICAgICAgICAgICAgICAgICAgLyogKG5QYXJ0IC0gMjUyIDw8IDMwKSBtYXkgYmUgbm90IHNvIHNhZmUgaW4gRUNNQVNjcmlwdCEgU28uLi46ICovXG4gICAgICAgICAgICAgICAgICAgICAgKG5QYXJ0IC0gMjUyKSAqIDEwNzM3NDE4MjQgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCAyNCkgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCAxOCkgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCAxMikgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICAgICAgICAgICAgICAgIDogblBhcnQgPiAyNDcgJiYgblBhcnQgPCAyNTIgJiYgbklkeCArIDQgPCBuTGVuXG4gICAgICAgICAgICAgICAgICAgICAgPyAvKiBmaXZlIGJ5dGVzICovXG4gICAgICAgICAgICAgICAgICAgICAgICAoKG5QYXJ0IC0gMjQ4KSA8PCAyNCkgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCAxOCkgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCAxMikgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICAgICAgICAgICAgICAgICAgOiBuUGFydCA+IDIzOSAmJiBuUGFydCA8IDI0OCAmJiBuSWR4ICsgMyA8IG5MZW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gLyogZm91ciBieXRlcyAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAoKG5QYXJ0IC0gMjQwKSA8PCAxOCkgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCAxMikgKyAoKGFCeXRlc1srK25JZHhdIC0gMTI4KSA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5QYXJ0ID4gMjIzICYmIG5QYXJ0IDwgMjQwICYmIG5JZHggKyAyIDwgbkxlbiAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoblBhcnQgLSAyMjQpIDw8IDEyKSArICgoYUJ5dGVzWysrbklkeF0gLSAxMjgpIDw8IDYpICsgYUJ5dGVzWysrbklkeF0gLSAxMjhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuUGFydCA+IDE5MSAmJiBuUGFydCA8IDIyNCAmJiBuSWR4ICsgMSA8IG5MZW4gLyogdHdvIGJ5dGVzICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKG5QYXJ0IC0gMTkyKSA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKiBuUGFydCA8IDEyNyA/ICovIC8qIG9uZSBieXRlICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFydFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc1ZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzdHJpbmdpZmllZCBqd2suXG4gICAgICovXG4gICAgc3RhdGljIGdldFNvcnRlZE9iamVjdFN0cmluZyhvYmo6IG9iamVjdCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZmluZERldmljZVNpemUoY29udGFpbmVyV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmIChjb250YWluZXJXaWR0aCA+PSAxNDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMC4zNzU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyV2lkdGggPj0gMTIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNzc1O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcldpZHRoID49IDk5Mikge1xuICAgICAgICAgICAgcmV0dXJuIDAuNzc1O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcldpZHRoID49IDc2OCkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNzc1O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcldpZHRoID49IDU3Nikge1xuICAgICAgICAgICAgcmV0dXJuIDAuNzc1O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcldpZHRoIDwgNTc2KSB7XG4gICAgICAgICAgICByZXR1cm4gMC43NzU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMC43NzU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIFVVSUQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIFBSTkcsIHVzZSB0aGF0XG4gICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY5MDY5MTYvY29sbGlzaW9ucy13aGVuLWdlbmVyYXRpbmctdXVpZHMtaW4tamF2YXNjcmlwdFxuICAgICAgICAgICAgY29uc3QgYnVmOiBVaW50MTZBcnJheSA9IG5ldyBVaW50MTZBcnJheSg4KTtcbiAgICAgICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYWQ0KGJ1ZlswXSkgKyB0aGlzLnBhZDQoYnVmWzFdKSArICctJyArIHRoaXMucGFkNChidWZbMl0pICsgJy0nICsgdGhpcy5wYWQ0KGJ1ZlszXSkgKyAnLScgKyB0aGlzLnBhZDQoYnVmWzRdKSArICctJyArIHRoaXMucGFkNChidWZbNV0pICsgdGhpcy5wYWQ0KGJ1Zls2XSkgKyB0aGlzLnBhZDQoYnVmWzddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwganVzdCB1c2UgTWF0aC5yYW5kb21cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9jcmVhdGUtZ3VpZC11dWlkLWluLWphdmFzY3JpcHRcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExNjA1MDY4L3doeS1kb2VzLWpzaGludC1hcmd1ZS1hZ2FpbnN0LWJpdHdpc2Utb3BlcmF0b3JzLWhvdy1zaG91bGQtaS1leHByZXNzLXRoaXMtY29kZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmFuZG9tNCgpICsgdGhpcy5yYW5kb200KCkgKyAnLScgKyB0aGlzLnJhbmRvbTQoKSArICctJyArIHRoaXMucmFuZG9tNCgpICsgJy0nICsgdGhpcy5yYW5kb200KCkgKyAnLScgKyB0aGlzLnJhbmRvbTQoKSArIHRoaXMucmFuZG9tNCgpICsgdGhpcy5yYW5kb200KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYWQ0KG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldDogc3RyaW5nID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgd2hpbGUgKHJldC5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICByZXQgPSAnMCcgKyByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyByYW5kb200KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKVxuICAgICAgICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgLnN1YnN0cmluZygxKTtcbiAgICB9XG59XG4iXX0=