UNPKG

kwikid-components

Version:
179 lines 20.8 kB
import { __awaiter } from "tslib"; import { LOCATION_TIMEOUT } from "./permission-checker.constants"; // Platform detection utilities export function detectDeviceType() { const userAgent = navigator.userAgent || navigator.vendor || window.opera; if (/android/i.test(userAgent)) { return "android"; } if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) { return "ios"; } return "windows"; } /** * Request microphone permission * @returns Promise resolving to an object with success status and optional error */ export function requestMicrophonePermission() { return __awaiter(this, void 0, void 0, function* () { try { const stream = yield navigator.mediaDevices.getUserMedia({ audio: true }); // Stop the stream immediately as we only need to confirm permission stream.getTracks().forEach((track) => track.stop()); return { granted: true }; } catch (error) { return { granted: false, error }; } }); } /** * Request location permission * @returns Promise resolving to an object with success status and optional error */ export function requestLocationPermission() { return __awaiter(this, void 0, void 0, function* () { try { return yield new Promise((resolve) => { navigator.geolocation.getCurrentPosition(() => resolve({ granted: true }), (error) => resolve({ granted: false, error }), { timeout: LOCATION_TIMEOUT, maximumAge: 0 }); }); } catch (error) { return { granted: false, error }; } }); } /** * Checks if the device has both front and back cameras * @returns Promise that resolves to an object containing camera availability info */ export function checkCameraAvailability() { return __awaiter(this, void 0, void 0, function* () { try { const devices = yield navigator.mediaDevices.enumerateDevices(); const videoDevices = devices.filter((device) => device.kind === "videoinput"); // If there are no video devices if (videoDevices.length === 0) { return { isFrontCamera: false, isBackCamera: false }; } // If there's only one camera, we assume it's the front camera by default // More sophisticated checks could inspect device labels if available if (videoDevices.length === 1) { return { isFrontCamera: true, isBackCamera: false }; } // If there are at least two cameras, we assume there are both front and back cameras return { isFrontCamera: true, isBackCamera: true }; } catch (error) { console.error("Error checking camera availability:", error); return { isFrontCamera: false, isBackCamera: false, error }; } }); } /** * Tests the front camera * @returns Promise resolving to result object with granted status and optional stream/error */ export function testFrontCamera() { return __awaiter(this, void 0, void 0, function* () { console.log("Testing front camera"); try { // Request front camera stream const frontStream = yield navigator.mediaDevices.getUserMedia({ video: { facingMode: "user" } }); console.log("Front camera test successful"); // The stream is returned to be stopped by the caller after verification if needed return { granted: true, stream: frontStream }; } catch (error) { console.error("Front camera test failed:", error); return { granted: false, error }; } }); } /** * Tests the back camera * @returns Promise resolving to result object with granted status and optional stream/error */ export function testBackCamera() { return __awaiter(this, void 0, void 0, function* () { console.log("Testing back camera"); try { // Request back camera stream const backStream = yield navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }); console.log("Back camera test successful"); // The stream is returned to be stopped by the caller after verification if needed return { granted: true, stream: backStream }; } catch (error) { console.error("Back camera test failed:", error); return { granted: false, error }; } }); } /** * Tests both front and back cameras * @param bothRequired Whether both cameras are required for success * @returns Promise resolving to result object with status of both cameras */ export function testBothCamera(bothRequired = true) { return __awaiter(this, void 0, void 0, function* () { console.log("Testing both cameras"); // Test front camera const frontResult = yield testFrontCamera(); console.log("Front camera test result:", frontResult.granted); // Stop front camera stream to free the camera before testing the back if (frontResult.stream) { frontResult.stream.getTracks().forEach((track) => track.stop()); } // Test back camera const backResult = yield testBackCamera(); console.log("Back camera test result:", backResult.granted); // Stop back camera stream if (backResult.stream) { backResult.stream.getTracks().forEach((track) => track.stop()); } // Determine overall result based on requirements const allGranted = bothRequired ? frontResult.granted && backResult.granted : frontResult.granted || backResult.granted; // Create error message if needed let errorMessage; if (!allGranted) { errorMessage = "Camera permission issue:"; if (!frontResult.granted) errorMessage += " Front camera not available."; if (!backResult.granted) errorMessage += " Back camera not available."; } return { frontCamera: { granted: frontResult.granted, error: frontResult.error }, backCamera: { granted: backResult.granted, error: backResult.error }, allGranted, errorMessage }; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFjLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUUsK0JBQStCO0FBQy9CLE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxTQUFTLEdBQ2IsU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFLLE1BQWMsQ0FBQyxLQUFLLENBQUM7SUFFbkUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzlCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxNQUFjLENBQUMsUUFBUSxFQUFFO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFnQiwyQkFBMkI7O1FBSS9DLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUUsb0VBQW9FO1lBQ3BFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9B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SUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNoRTtRQUVELGlEQUFpRDtRQUNqRCxNQUFNLFVBQVUsR0FBRyxZQUFZO1lBQzdCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPO1lBQzNDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFFOUMsaUNBQWlDO1FBQ2pDLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixZQUFZLEdBQUcsMEJBQTBCLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO2dCQUFFLFlBQVksSUFBSSw4QkFBOEIsQ0FBQztZQUN6RSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Z0JBQUUsWUFBWSxJQUFJLDZCQUE2QixDQUFDO1NBQ3hFO1FBRUQsT0FBTztZQUNMLFdBQVcsRUFBRTtnQkFDWCxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87Z0JBQzVCLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSzthQUN6QjtZQUNELFVBQVUsRUFBRTtnQkFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87Z0JBQzNCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSzthQUN4QjtZQUNELFVBQVU7WUFDVixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERldmljZVR5cGUsIExPQ0FUSU9OX1RJTUVPVVQgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLWNoZWNrZXIuY29uc3RhbnRzXCI7XG5cbi8vIFBsYXRmb3JtIGRldGVjdGlvbiB1dGlsaXRpZXNcbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REZXZpY2VUeXBlKCk6IERldmljZVR5cGUge1xuICBjb25zdCB1c2VyQWdlbnQgPVxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvciB8fCAod2luZG93IGFzIGFueSkub3BlcmE7XG5cbiAgaWYgKC9hbmRyb2lkL2kudGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgcmV0dXJuIFwiYW5kcm9pZFwiO1xuICB9XG5cbiAgaWYgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVzZXJBZ2VudCkgJiYgISh3aW5kb3cgYXMgYW55KS5NU1N0cmVhbSkge1xuICAgIHJldHVybiBcImlvc1wiO1xuICB9XG5cbiAgcmV0dXJuIFwid2luZG93c1wiO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgbWljcm9waG9uZSBwZXJtaXNzaW9uXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3Qgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgb3B0aW9uYWwgZXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNaWNyb3Bob25lUGVybWlzc2lvbigpOiBQcm9taXNlPHtcbiAgZ3JhbnRlZDogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcbiAgICAvLyBTdG9wIHRoZSBzdHJlYW0gaW1tZWRpYXRlbHkgYXMgd2Ugb25seSBuZWVkIHRvIGNvbmZpcm0gcGVybWlzc2lvblxuICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UsIGVycm9yIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGxvY2F0aW9uIHBlcm1pc3Npb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBvcHRpb25hbCBlcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdExvY2F0aW9uUGVybWlzc2lvbigpOiBQcm9taXNlPHtcbiAgZ3JhbnRlZDogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPHsgZ3JhbnRlZDogYm9vbGVhbjsgZXJyb3I/OiBhbnkgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oXG4gICAgICAgICgpID0+IHJlc29sdmUoeyBncmFudGVkOiB0cnVlIH0pLFxuICAgICAgICAoZXJyb3IpID0+IHJlc29sdmUoeyBncmFudGVkOiBmYWxzZSwgZXJyb3IgfSksXG4gICAgICAgIHsgdGltZW91dDogTE9DQVRJT05fVElNRU9VVCwgbWF4aW11bUFnZTogMCB9XG4gICAgICApO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlLCBlcnJvciB9O1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaGFzIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIGNhbWVyYSBhdmFpbGFiaWxpdHkgaW5mb1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDYW1lcmFBdmFpbGFiaWxpdHkoKTogUHJvbWlzZTx7XG4gIGlzRnJvbnRDYW1lcmE6IGJvb2xlYW47XG4gIGlzQmFja0NhbWVyYTogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIGNvbnN0IHZpZGVvRGV2aWNlcyA9IGRldmljZXMuZmlsdGVyKFxuICAgICAgKGRldmljZSkgPT4gZGV2aWNlLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiXG4gICAgKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyB2aWRlbyBkZXZpY2VzXG4gICAgaWYgKHZpZGVvRGV2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IGZhbHNlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjYW1lcmEsIHdlIGFzc3VtZSBpdCdzIHRoZSBmcm9udCBjYW1lcmEgYnkgZGVmYXVsdFxuICAgIC8vIE1vcmUgc29waGlzdGljYXRlZCBjaGVja3MgY291bGQgaW5zcGVjdCBkZXZpY2UgbGFiZWxzIGlmIGF2YWlsYWJsZVxuICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4geyBpc0Zyb250Q2FtZXJhOiB0cnVlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBjYW1lcmFzLCB3ZSBhc3N1bWUgdGhlcmUgYXJlIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IHRydWUsIGlzQmFja0NhbWVyYTogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjaGVja2luZyBjYW1lcmEgYXZhaWxhYmlsaXR5OlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHsgaXNGcm9udENhbWVyYTogZmFsc2UsIGlzQmFja0NhbWVyYTogZmFsc2UsIGVycm9yIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZnJvbnQgY2FtZXJhXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggZ3JhbnRlZCBzdGF0dXMgYW5kIG9wdGlvbmFsIHN0cmVhbS9lcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEZyb250Q2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBmcm9udCBjYW1lcmFcIik7XG4gIHRyeSB7XG4gICAgLy8gUmVxdWVzdCBmcm9udCBjYW1lcmEgc3RyZWFtXG4gICAgY29uc3QgZnJvbnRTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcInVzZXJcIiB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBmcm9udFN0cmVhbVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkZyb250IGNhbWVyYSB0ZXN0IGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiBmYWxzZSxcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3RzIHRoZSBiYWNrIGNhbWVyYVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gcmVzdWx0IG9iamVjdCB3aXRoIGdyYW50ZWQgc3RhdHVzIGFuZCBvcHRpb25hbCBzdHJlYW0vZXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RCYWNrQ2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBiYWNrIGNhbWVyYVwiKTtcbiAgdHJ5IHtcbiAgICAvLyBSZXF1ZXN0IGJhY2sgY2FtZXJhIHN0cmVhbVxuICAgIGNvbnN0IGJhY2tTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcImVudmlyb25tZW50XCIgfVxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBiYWNrU3RyZWFtXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQmFjayBjYW1lcmEgdGVzdCBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnRlZDogZmFsc2UsXG4gICAgICBlcnJvclxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyBib3RoIGZyb250IGFuZCBiYWNrIGNhbWVyYXNcbiAqIEBwYXJhbSBib3RoUmVxdWlyZWQgV2hldGhlciBib3RoIGNhbWVyYXMgYXJlIHJlcXVpcmVkIGZvciBzdWNjZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggc3RhdHVzIG9mIGJvdGggY2FtZXJhc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEJvdGhDYW1lcmEoYm90aFJlcXVpcmVkID0gdHJ1ZSk6IFByb21pc2U8e1xuICBmcm9udENhbWVyYTogeyBncmFudGVkOiBib29sZWFuOyBlcnJvcj86IGFueSB9O1xuICBiYWNrQ2FtZXJhOiB7IGdyYW50ZWQ6IGJvb2xlYW47IGVycm9yPzogYW55IH07XG4gIGFsbEdyYW50ZWQ6IGJvb2xlYW47XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbn0+IHtcbiAgY29uc29sZS5sb2coXCJUZXN0aW5nIGJvdGggY2FtZXJhc1wiKTtcblxuICAvLyBUZXN0IGZyb250IGNhbWVyYVxuICBjb25zdCBmcm9udFJlc3VsdCA9IGF3YWl0IHRlc3RGcm9udENhbWVyYSgpO1xuICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgZnJvbnRSZXN1bHQuZ3JhbnRlZCk7XG5cbiAgLy8gU3RvcCBmcm9udCBjYW1lcmEgc3RyZWFtIHRvIGZyZWUgdGhlIGNhbWVyYSBiZWZvcmUgdGVzdGluZyB0aGUgYmFja1xuICBpZiAoZnJvbnRSZXN1bHQuc3RyZWFtKSB7XG4gICAgZnJvbnRSZXN1bHQuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICB9XG5cbiAgLy8gVGVzdCBiYWNrIGNhbWVyYVxuICBjb25zdCBiYWNrUmVzdWx0ID0gYXdhaXQgdGVzdEJhY2tDYW1lcmEoKTtcbiAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgYmFja1Jlc3VsdC5ncmFudGVkKTtcblxuICAvLyBTdG9wIGJhY2sgY2FtZXJhIHN0cmVhbVxuICBpZiAoYmFja1Jlc3VsdC5zdHJlYW0pIHtcbiAgICBiYWNrUmVzdWx0LnN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBvdmVyYWxsIHJlc3VsdCBiYXNlZCBvbiByZXF1aXJlbWVudHNcbiAgY29uc3QgYWxsR3JhbnRlZCA9IGJvdGhSZXF1aXJlZFxuICAgID8gZnJvbnRSZXN1bHQuZ3JhbnRlZCAmJiBiYWNrUmVzdWx0LmdyYW50ZWRcbiAgICA6IGZyb250UmVzdWx0LmdyYW50ZWQgfHwgYmFja1Jlc3VsdC5ncmFudGVkO1xuXG4gIC8vIENyZWF0ZSBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZFxuICBsZXQgZXJyb3JNZXNzYWdlO1xuICBpZiAoIWFsbEdyYW50ZWQpIHtcbiAgICBlcnJvck1lc3NhZ2UgPSBcIkNhbWVyYSBwZXJtaXNzaW9uIGlzc3VlOlwiO1xuICAgIGlmICghZnJvbnRSZXN1bHQuZ3JhbnRlZCkgZXJyb3JNZXNzYWdlICs9IFwiIEZyb250IGNhbWVyYSBub3QgYXZhaWxhYmxlLlwiO1xuICAgIGlmICghYmFja1Jlc3VsdC5ncmFudGVkKSBlcnJvck1lc3NhZ2UgKz0gXCIgQmFjayBjYW1lcmEgbm90IGF2YWlsYWJsZS5cIjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbnRDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGZyb250UmVzdWx0LmdyYW50ZWQsXG4gICAgICBlcnJvcjogZnJvbnRSZXN1bHQuZXJyb3JcbiAgICB9LFxuICAgIGJhY2tDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGJhY2tSZXN1bHQuZ3JhbnRlZCxcbiAgICAgIGVycm9yOiBiYWNrUmVzdWx0LmVycm9yXG4gICAgfSxcbiAgICBhbGxHcmFudGVkLFxuICAgIGVycm9yTWVzc2FnZVxuICB9O1xufVxuIl19