         override var intrinsicContentSize: CGSize { return image?.size ?? .zero }
         override var image: UIImage? {
             didSet { invalidateIntrinsicContentSize() }
+        }
+    }
+}
+
+extension _CameraViewController._CaptureVideoPreviewView {
+    class _HumanReadingInfoView: UIView {
+        let type: _HumanReading
+        init(type: _HumanReading) {
+            self.type = type
+            super.init(frame: .zero)
+        }
+        required init?(coder aDecoder: NSCoder) {
+            fatalError("init(coder:) has not been implemented")
         }
     }
 }

            return (previewLayer.session.inputs as! [AVCaptureDeviceInput]).filter{ $0.device.hasMediaType(AVMediaTypeVideo) }.first?.device
        }
        var infoContentInsets: UIEdgeInsets = .zero {
            didSet {
                _setupInfoStackView()
            }
        }
        // Only support String or UIImage object.
        var humanReadingInfos: [Any] = [] {
            didSet {
                _setupHumanReadingInfos()
            }
        }
        let configurationQueue: DispatchQueue = DispatchQueue(label: "com.device_configuration.video_preview.camera_vc")
        

            if let isFlashActive = change?[.newKey] as? Bool {
                print("new flash mode: " + isFlashActive.description)
                if isFlashActive {
                    if !humanReadingInfos.contains{ $0.type == .flashOn } {
                        humanReadingInfos = [humanReadingInfos.filter({ $0.type != .flashOn }), [(_HumanReading.flashOn, UIImage(named: TabNavigationImagePickerController.resourceBundlePath+"flash_info")!)]].joined().reversed()
                    }
                } else {
                    humanReadingInfos = humanReadingInfos.filter{ $0.type != .flashOn }
                }
            }
        } else {
