Ian H. Sloan

144 papers Journal 141Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Alexander Keller, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan
2025 J jnl
CoRR
Felix Bartel, Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2025 J jnl
CoRR
Alexander D. Gilbert, Michael B. Giles, Frances Y. Kuo, Ian H. Sloan, Abirami Srikumar
2025 J jnl
CoRR
Alexander D. Gilbert, Frances Y. Kuo, Dirk Nuyens, Graham Pash, Ian H. Sloan, Karen E. Willcox
2025 J jnl
CoRR
Ivan G. Graham, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan, Euan A. Spence
2025 J jnl
CoRR
Alexander Keller, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan
2024 J jnl
SIAM/ASA J. Uncertain. Quantification
Mahadevan Ganesh, Frances Y. Kuo, Ian H. Sloan
2024 J jnl
J. Comput. Appl. Math.
Tareq Alodat, Quoc Thong Le Gia, Ian H. Sloan
2024 J jnl
Numerische Mathematik
Philipp A. Guth, Vesa Kaarnioja, Frances Y. Kuo, Claudia Schillings, Ian H. Sloan
2024 J jnl
SIAM J. Imaging Sci.
Jan Hamann, Quoc Thong Le Gia, Ian H. Sloan, Robert S. Womersley
2024 J jnl
Numerische Mathematik
Harri Hakula, Helmut Harbrecht, Vesa Kaarnioja, Frances Y. Kuo, Ian H. Sloan
2023 J jnl
J. Sci. Comput.
Min Zhong, Quoc Thong Le Gia, Ian H. Sloan
2023 J jnl
SIAM J. Numer. Anal.
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2023 J jnl
CoRR
Frances Y. Kuo, Weiwen Mo, Dirk Nuyens, Ian H. Sloan, Abirami Srikumar
2023 J jnl
CoRR
Ian H. Sloan, Vesa Kaarnioja
2023 J jnl
CoRR
Vesa Kaarnioja, Frances Y. Kuo, Ian H. Sloan
2023 J jnl
CoRR
Jan Hamann, Quoc Thong Le Gia, Ian H. Sloan, Robert S. Womersley
2022 J jnl
Math. Comput.
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2022 J jnl
Numerische Mathematik
Vesa Kaarnioja, Yoshihito Kazashi, Frances Y. Kuo, Fabio Nobile, Ian H. Sloan
2022 J jnl
CoRR
Johann S. Brauchart, Peter J. Grabner, Ian H. Sloan, Robert S. Womersley
2022 J jnl
CoRR
Philipp A. Guth, Vesa Kaarnioja, Frances Y. Kuo, Claudia Schillings, Ian H. Sloan
2022 J jnl
CoRR
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan, Abirami Srikumar
2022 J jnl
CoRR
Harri Hakula, Helmut Harbrecht, Vesa Kaarnioja, Frances Y. Kuo, Ian H. Sloan
2021 J jnl
SIAM/ASA J. Uncertain. Quantification
Philipp A. Guth, Vesa Kaarnioja, Frances Y. Kuo, Claudia Schillings, Ian H. Sloan
2021 J jnl
CoRR
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2021 J jnl
CoRR
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2021 J jnl
Math. Comput.
Ronald Cools, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan
2021 J jnl
J. Comput. Phys.
Tobias Hartung, Karl Jansen, Frances Y. Kuo, Hernan Leövey, Dirk Nuyens, Ian H. Sloan
2021 J jnl
J. Comput. Appl. Math.
Kerstin Hesse, Ian H. Sloan, Robert S. Womersley
2021 J jnl
CoRR
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2021 J jnl
SIAM/ASA J. Uncertain. Quantification
Mahadevan Ganesh, Frances Y. Kuo, Ian H. Sloan
2020 J jnl
J. Complex.
Josef Dick, Aicke Hinrichs, Erich Novak, Klaus Ritter, Ian H. Sloan, Grzegorz W. Wasilkowski, Henryk Wozniakowski
2020 J jnl
CoRR
Vesa Kaarnioja, Yoshihito Kazashi, Frances Y. Kuo, Fabio Nobile, Ian H. Sloan
2020 ch.
75 Years of Mathematics of Computation
Ronald Cools, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan
2020 J jnl
CoRR
Tobias Hartung, Karl Jansen, Frances Y. Kuo, Hernan Leövey, Dirk Nuyens, Ian H. Sloan
2020 J jnl
CoRR
Mahadevan Ganesh, Frances Y. Kuo, Ian H. Sloan
2020 J jnl
SIAM J. Numer. Anal.
Vesa Kaarnioja, Frances Y. Kuo, Ian H. Sloan
2019 J jnl
CoRR
Philipp A. Guth, Vesa Kaarnioja, Frances Y. Kuo, Claudia Schillings, Ian H. Sloan
2019 J jnl
Numerische Mathematik
Alexander D. Gilbert, Ivan G. Graham, Frances Y. Kuo, Robert Scheichl, Ian H. Sloan
2019 J jnl
Numerische Mathematik
Michael Feischl, Frances Y. Kuo, Ian H. Sloan
2019 J jnl
CoRR
Ronald Cools, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan
2019 J jnl
CoRR
Ronald Cools, Frances Y. Kuo, Dirk Nuyens, Ian H. Sloan
2018 J jnl
SIAM J. Numer. Anal.
Ivan G. Graham, Frances Y. Kuo, Dirk Nuyens, Robert Scheichl, Ian H. Sloan
2018 J jnl
J. Complex.
Josef Dick, Aicke Hinrichs, Erich Novak, Klaus Ritter, Ian H. Sloan, Grzegorz W. Wasilkowski, Henryk Wozniakowski
2018 J jnl
Numerische Mathematik
Ivan G. Graham, Frances Y. Kuo, Dirk Nuyens, Robert Scheichl, Ian H. Sloan
2018 J jnl
Numerische Mathematik
Michael Feischl, Frances Y. Kuo, Ian H. Sloan
2018 J jnl
Math. Comput. Simul.
Alexander D. Gilbert, Frances Y. Kuo, Ian H. Sloan
2018 J jnl
J. Comput. Appl. Math.
Andreas Griewank, Frances Y. Kuo, Hernan Leövey, Ian H. Sloan
2018 J jnl
J. Complex.
Ian H. Sloan, Henryk Wozniakowski
2018 J jnl
J. Complex.
Joseph Dick, Aicke Hinrichs, Erich Novak, Klaus Ritter, Ian H. Sloan, Grzegorz W. Wasilkowski, Henryk Wozniakowski
2018 J jnl
Exp. Math.
Johann S. Brauchart, Alexander B. Reznikov, Edward B. Saff, Ian H. Sloan, Yuguang Wang, Robert S. Womersley
2017 J jnl
J. Comput. Appl. Math.
Frances Y. Kuo, Dirk Nuyens, Leszek Plaskota, Ian H. Sloan, Grzegorz W. Wasilkowski
2017 J jnl
Math. Comput.
Frances Y. Kuo, Robert Scheichl, Christoph Schwab, Ian H. Sloan, Elisabeth Ullmann
2017 J jnl
Math. Comput.
Frances Y. Kuo, Ian H. Sloan, Henryk Wozniakowski
2017 J jnl
J. Approx. Theory
Quoc Thong Le Gia, Ian H. Sloan, Yuguang Wang, Robert S. Womersley
2017 J jnl
Math. Comput.
Michael Griebel, Frances Y. Kuo, Ian H. Sloan
2017 J jnl
Numerische Mathematik
Kerstin Hesse, Ian H. Sloan, Robert S. Womersley
2017 J jnl
Math. Comput.
Michael Griebel, Frances Y. Kuo, Ian H. Sloan
2017 J jnl
Adv. Comput. Math.
Quoc Thong Le Gia, Ian H. Sloan, Holger Wendland
2016 J jnl
J. Complex.
Erich Novak, Klaus Ritter, Ian H. Sloan, Henryk Wozniakowski
2016 J jnl
Appl. Math. Comput.
Hui Cao, Sergei V. Pereverzyev, Ian H. Sloan, Pavlo Tkachenko
2015 J jnl
J. Complex.
Erich Novak, Klaus Ritter, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2015 J jnl
J. Complex.
Erich Novak, Klaus Ritter, Ian H. Sloan, Henryk Wozniakowski
2015 J jnl
Found. Comput. Math.
Frances Y. Kuo, Christoph Schwab, Ian H. Sloan
2015 J jnl
SIAM J. Numer. Anal.
Sergei V. Pereverzyev, Ian H. Sloan, Pavlo Tkachenko
2015 J jnl
Numerische Mathematik
Ivan G. Graham, Frances Y. Kuo, James A. Nichols, Robert Scheichl, Christoph Schwab, Ian H. Sloan
2015 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Klaus Ritter, Joseph F. Traub, Henryk Wozniakowski
2014 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2014 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2014 J jnl
SIAM J. Numer. Anal.
Congpei An, Xiaojun Chen, Ian H. Sloan, Robert S. Womersley
2014 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2014 J jnl
Math. Comput.
Johann S. Brauchart, Edward B. Saff, Ian H. Sloan, Robert S. Womersley
2014 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2014 J jnl
Adv. Comput. Math.
Andrew Chernih, Ian H. Sloan, Robert S. Womersley
2013 J jnl
Acta Numer.
Josef Dick, Frances Y. Kuo, Ian H. Sloan
2013 J jnl
Math. Comput.
Michael Griebel, Frances Y. Kuo, Ian H. Sloan
2012 J jnl
Numerische Mathematik
Quoc Thong Le Gia, Ian H. Sloan, Holger Wendland
2012 J jnl
SIAM J. Numer. Anal.
Frances Y. Kuo, Christoph Schwab, Ian H. Sloan
2012 J jnl
SIAM J. Numer. Anal.
Congpei An, Xiaojun Chen, Ian H. Sloan, Robert S. Womersley
2012 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2011 J jnl
Math. Comput.
Mahadevan Ganesh, Quoc Thong Le Gia, Ian H. Sloan
2011 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2011 J jnl
Comput. Methods Appl. Math.
Ian H. Sloan
2011 J jnl
J. Comput. Appl. Math.
C. K. Chan, Xiaojun Chen, Liqun Qi, Colin Rogers, Zhong-Ci Shi, Ian H. Sloan
2011 J jnl
Oper. Res.
Xiaoqun Wang, Ian H. Sloan
2011 J jnl
J. Comput. Phys.
Ivan G. Graham, Frances Y. Kuo, Dirk Nuyens, Robert Scheichl, Ian H. Sloan
2011 J jnl
Numerische Mathematik
Quoc Thong Le Gia, Ian H. Sloan, Andrew J. Wathen
2010 J jnl
J. Complex.
Markus Hegland, Stefan Heinrich, Ian H. Sloan
2010 J jnl
J. Complex.
Frances Y. Kuo, Ian H. Sloan, Grzegorz W. Wasilkowski, Henryk Wozniakowski
2010 J jnl
SIAM J. Numer. Anal.
Quoc Thong Le Gia, Ian H. Sloan, Holger Wendland
2010 J jnl
Math. Comput.
Frances Y. Kuo, Ian H. Sloan, Grzegorz W. Wasilkowski, Henryk Wozniakowski
2010 J jnl
Numerische Mathematik
Thanh Tran, Quoc Thong Le Gia, Ian H. Sloan, Ernst P. Stephan
2010 J jnl
J. Complex.
Frances Y. Kuo, Ian H. Sloan, Grzegorz W. Wasilkowski, Benjamin J. Waterhouse
2010 J jnl
J. Complex.
Michael Griebel, Frances Y. Kuo, Ian H. Sloan
2010 J jnl
SIAM J. Numer. Anal.
Congpei An, Xiaojun Chen, Ian H. Sloan, Robert S. Womersley
2009 J jnl
J. Approx. Theory
Ian H. Sloan, Robert S. Womersley
2009 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Joseph F. Traub, Henryk Wozniakowski
2009 J jnl
Math. Comput.
Ian H. Sloan, Holger Wendland
2009 J jnl
Math. Comput.
Quoc Thong Le Gia, Ian H. Sloan, Thanh Tran
2008 J jnl
Adv. Comput. Math.
Ian H. Sloan, Alvise Sommariva
2008 J jnl
J. Complex.
Frances Y. Kuo, Ian H. Sloan, Henryk Wozniakowski
2007 J jnl
J. Complex.
Kerstin Hesse, Frances Y. Kuo, Ian H. Sloan
2007 ed.
Algorithms and Complexity for Continuous Problems
Stephan Dahlke, Klaus Ritter, Ian H. Sloan, Joseph F. Traub
2007 J jnl
J. Complex.
Josef Dick, Peter Kritzer, Frances Y. Kuo, Ian H. Sloan
2007 J jnl
Numer. Algorithms
Frances Y. Kuo, Ian H. Sloan, Henryk Wozniakowski
2007 J jnl
J. Complex.
Kerstin Hesse, Hrushikesh N. Mhaskar, Ian H. Sloan
2006 conf
Algorithms and Complexity for Continuous Problems
Stephan Dahlke, Klaus Ritter, Ian H. Sloan, Joseph F. Traub
2006 J jnl
J. Approx. Theory
Kerstin Hesse, Ian H. Sloan
2006 J jnl
SIAM J. Sci. Comput.
Xiaoqun Wang, Ian H. Sloan
2006 J jnl
Numerische Mathematik
Josef Dick, Ian H. Sloan, Xiaoqun Wang, Henryk Wozniakowski
2006 J jnl
J. Complex.
Leszek Plaskota, Ian H. Sloan
2006 J jnl
J. Complex.
Benjamin J. Waterhouse, Frances Y. Kuo, Ian H. Sloan
2006 J jnl
Numerische Mathematik
William McLean, Ian H. Sloan, Vidar Thomée
2005 J jnl
SIAM J. Numer. Anal.
Fred J. Hickernell, Ian H. Sloan, Grzegorz W. Wasilkowski
2005 J jnl
Math. Comput.
Josef Dick, Frances Y. Kuo, Friedrich Pillichshammer, Ian H. Sloan
2005 J jnl
J. Approx. Theory
Rolf Dieter Grigorieff, Ian H. Sloan
2005 J jnl
J. Complex.
Kerstin Hesse, Ian H. Sloan
2005 J jnl
J. Complex.
Frances Y. Kuo, Ian H. Sloan
2005 J jnl
SIAM J. Sci. Comput.
Xiaoqun Wang, Ian H. Sloan
2004 J jnl
Adv. Comput. Math.
Ian H. Sloan, Robert S. Womersley
2004 J jnl
J. Complex.
Ian H. Sloan, Xiaoqun Wang, Henryk Wozniakowski
2004 J jnl
J. Complex.
Josef Dick, Ian H. Sloan, Xiaoqun Wang, Henryk Wozniakowski
2004 J jnl
SIAM J. Numer. Anal.
Xiaoqun Wang, Ian H. Sloan, Josef Dick
2004 J jnl
Math. Comput.
Fred J. Hickernell, Ian H. Sloan, Grzegorz W. Wasilkowski
2004 J jnl
Math. Comput.
Fred J. Hickernell, Ian H. Sloan, Grzegorz W. Wasilkowski
2004 J jnl
Found. Comput. Math.
Erich Novak, Ian H. Sloan, Henryk Wozniakowski
2002 J jnl
Math. Comput.
Ian H. Sloan, Andrew V. Reztsov
2002 J jnl
SIAM J. Numer. Anal.
Ian H. Sloan, Frances Y. Kuo, Stephen Joe
2002 J jnl
Numerische Mathematik
Ivan G. Graham, Ian H. Sloan
2002 J jnl
Math. Comput.
Ian H. Sloan, Frances Y. Kuo, Stephen Joe
2002 J jnl
J. Complex.
Ian H. Sloan, Henryk Wozniakowski
2001 J jnl
J. Complex.
Ian H. Sloan, Arthur G. Werschulz
2001 J jnl
Adv. Comput. Math.
Robert S. Womersley, Ian H. Sloan
2001 J jnl
J. Complex.
Ian H. Sloan, Henryk Wozniakowski
2000 J jnl
Math. Comput.
Dongwoo Sheen, Ian H. Sloan, Vidar Thomée
1999 J jnl
Numerische Mathematik
Ian H. Sloan, Wolfgang L. Wendland
1998 J jnl
J. Complex.
Ian H. Sloan, Henryk Wozniakowski
1997 J jnl
Math. Comput.
Ian H. Sloan, Henryk Wozniakowski
1997 J jnl
Adv. Comput. Math.
Youngmok Jeon, Ian H. Sloan, Ernst P. Stephan, Johannes Elschner
1997 J jnl
J. Complex.
Erich Novak, Ian H. Sloan, Henryk Wozniakowski
1996 J jnl
Math. Comput.
Ronald Cools, Ian H. Sloan
1996 J jnl
Math. Comput.
Christian Lubich, Ian H. Sloan, Vidar Thomée
1993 J jnl
ACM Trans. Math. Softw.
Stephen Joe, Ian H. Sloan
1993 J jnl
SIAM Rev.
Ian H. Sloan
redb/extractors/ioc_extractor/ioc_extractor.py
← Index redb/extractors/ioc_extractor/ioc_extractor.py python
"""
IOC Extractor - Extractor class for extracting IOCs from decompilation results.

This extractor works with in-memory data from DecompileBinja, following the
standard Extractor pattern to support both ClickHouse and PrintExporter (dry-run).

Usage:
    # After DecompileBinja completes:
    ioc_extractor = IOCExtractorFromResults(
        analysis_results=decompiler.analysis_results,
        sha256=sha256,
        log=logger,
        exporters=exporters,
        index_prefix=index_prefix
    )
    ioc_extractor.export_data()
"""

import inspect
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, List, Dict, Optional

from redb.extractors.enum import Tag
from redb.extractors.database_exporters import DatabaseExporter

# Import the IOCScraper and related classes from standalone module
from redb.extractors.ioc_extractor.standalone_ioc_extractor import (
    IOCScraper,
    IOCType,
    SourceType,
    ExtractedIOC,
)
from typing import Set


class IOCExtractorFromResults:
    """
    Extracts IOCs from in-memory decompilation results.

    This follows a simplified Extractor pattern but doesn't inherit from Extractor
    since it doesn't read from a binary file - instead it takes already-processed
    analysis results from DecompileBinja.
    """

    def __init__(
        self,
        analysis_results: Dict[str, Any],
        sha256: str,
        log: Any,
        exporters: Optional[List[DatabaseExporter]] = None,
        index_prefix: Optional[str] = None,
        tld_file: Optional[Path] = None,
        suppress_types: Optional[Set[IOCType]] = None,
        js_context: bool = False,
    ):
        """
        Initialize IOC Extractor with analysis results.

        Args:
            analysis_results: Dict containing 'strings' and 'decompiled' lists from DecompileBinja
            sha256: Sample SHA256 hash
            log: Logger instance
            exporters: List of database exporters (ClickHouse, Print, etc.)
            index_prefix: Index prefix for database
            tld_file: Optional path to TLD list file
            js_context: When True, the underlying IOCScraper rejects FQDN
                candidates that match JS object-access syntax (see
                JS_FP_TLDS / JS_FP_SLDS). Set this for the JS pipeline only;
                APK suppresses FQDN entirely via suppress_types and binary
                callers leave it disabled.
        """
        self.log = log
        self.log.debug(f"Creating {self.__class__.__name__}")
        self.analysis_results = analysis_results
        self.sha256 = sha256
        self.exporters = exporters or []
        self.index_prefix = index_prefix
        self.scraper = IOCScraper(
            tld_file, suppress_types=suppress_types, js_context=js_context,
        )
        self.extracted_iocs: List[ExtractedIOC] = []

    def extract(self) -> List[ExtractedIOC]:
        """
        Extract IOCs from strings and decompiled functions in analysis_results.

        Returns:
            List of ExtractedIOC objects
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.extracted_iocs = []

        # Extract from strings
        strings_count = self._extract_from_strings()

        # Extract from decompiled functions
        functions_count = self._extract_from_decompiled()

        # Extract from text-based artefact surfaces (JS, PowerShell, etc.)
        text_count = self._extract_from_text()

        self.log.info(
            f"Extracted {len(self.extracted_iocs)} IOCs for {self.sha256[:16]}... "
            f"(strings: {strings_count}, functions: {functions_count}, "
            f"text: {text_count})"
        )

        return self.extracted_iocs

    def _extract_from_strings(self) -> int:
        """Extract IOCs from sample's strings."""
        count = 0
        strings = self.analysis_results.get("strings", [])

        for s in strings:
            string_value = s.get("string", "")
            string_offset = s.get("string_offset", 0)

            if isinstance(string_value, bytes):
                string_value = string_value.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(string_value, SourceType.STRING, str(string_offset)):
                self.extracted_iocs.append(ioc)
                count += 1

        return count

    def _extract_from_decompiled(self) -> int:
        """Extract IOCs from sample's decompiled functions.

        Supports both Binja format (key: "decompiled", fields: "decompiled_function",
        "decompiled_function_hash", "function_type") and APK format (key:
        "decompiled_content", fields: "decompiled_method", "decompiled_method_hash",
        "method_type").
        """
        count = 0

        # Binja format
        decompiled = self.analysis_results.get("decompiled", [])
        for func in decompiled:
            func_type = func.get("function_type", "UNKNOWN")
            if func_type in ("LIBRARY", "THUNK"):
                continue

            func_content = func.get("decompiled_function", "")
            func_hash = func.get("decompiled_function_hash", "unknown")

            if isinstance(func_content, bytes):
                func_content = func_content.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(func_content, SourceType.DECOMPILED_FUNCTION, func_hash):
                self.extracted_iocs.append(ioc)
                count += 1

        # APK format (decompiled_content with method-level fields)
        decompiled_content = self.analysis_results.get("decompiled_content", [])
        for func in decompiled_content:
            func_type = func.get("method_type", "UNKNOWN")
            if func_type in ("LIBRARY", "THUNK"):
                continue

            func_content = func.get("decompiled_method", "")
            func_hash = func.get("decompiled_method_hash", "unknown")

            if isinstance(func_content, bytes):
                func_content = func_content.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(func_content, SourceType.DECOMPILED_FUNCTION, func_hash):
                self.extracted_iocs.append(ioc)
                count += 1

        return count

    def _extract_from_text(self) -> int:
        """Extract IOCs from text-based artefact surfaces.

        Walks `analysis_results["text_raw"]` and `analysis_results["text_normalized"]`,
        each a list of `{"content": str, "content_hash": str}` dicts. Each
        list is routed through its own SourceType (`TEXT_RAW` /
        `TEXT_NORMALIZED`) so analysts can distinguish IOCs that were already
        present in the raw source from those exposed only after normalisation
        (deobfuscation/beautification). Generic across text-based formats —
        used by JS today, intended for PowerShell, Python, email body,
        extracted PDF/Office text in the future.
        """
        count = 0

        for key, source_type in (
            ("text_raw", SourceType.TEXT_RAW),
            ("text_normalized", SourceType.TEXT_NORMALIZED),
        ):
            for entry in self.analysis_results.get(key, []):
                content = entry.get("content", "")
                content_hash = entry.get("content_hash", "unknown")

                if isinstance(content, bytes):
                    content = content.decode('utf-8', errors='replace')

                for ioc in self.scraper.scrape(content, source_type, content_hash):
                    self.extracted_iocs.append(ioc)
                    count += 1

        return count

    def prepare_export_data(self, exporter_type: str) -> Any:
        """
        Prepare data for specific export type.

        Returns tuple for ClickHouse or list of dicts for Print/Elasticsearch.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.extracted_iocs:
            return None

        now = datetime.now(timezone.utc)

        if exporter_type == "ClickHouseExporter":
            data = [
                [
                    self.sha256,
                    ioc.ioc_type.value,
                    ioc.ioc_value,
                    ioc.source_type.value,
                    ioc.source_identifier,
                    now,
                ]
                for ioc in self.extracted_iocs
            ]

            column_names = [
                "sha256",
                "ioc_type",
                "ioc_value",
                "source_type",
                "source_identifier",
                "extracted_at",
            ]

            column_type_names = [
                "FixedString(64)",
                "Enum8('ipv4'=1, 'ipv6'=2, 'fqdn'=3, 'url'=4, 'email'=5, 'server'=6, "
                "'hash_md5'=10, 'hash_sha1'=11, 'hash_sha256'=12, 'cve'=20, 'cwe'=21, 'cpe'=22, "
                "'crypto_btc'=30, 'crypto_eth'=31, 'crypto_xrp'=32, 'crypto_bch'=33, "
                "'crypto_ada'=34, 'crypto_substrate'=35, 'path_linux'=40, 'path_windows'=41, "
                "'registry_key'=42, 'onion'=50)",
                "String",
                "Enum8('decompiled_function'=1, 'disassembled_function'=2, 'string'=3, "
                "'text_raw'=4, 'text_normalized'=5)",
                "String",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

        else:
            # For PrintExporter and others - return list of dicts
            return [
                {
                    "sha256": self.sha256,
                    "ioc_type": ioc.ioc_type.value,
                    "ioc_value": ioc.ioc_value,
                    "source_type": ioc.source_type.value,
                    "source_identifier": ioc.source_identifier,
                    "extracted_at": now.isoformat(),
                }
                for ioc in self.extracted_iocs
            ]

    def get_clickhouse_table(self) -> str:
        """Return the ClickHouse table name for IOCs."""
        return "redb_iocs"

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.IOC.value if hasattr(Tag, 'IOC') else "ioc"

    def export_data(self) -> bool:
        """
        Export extracted IOCs to all configured exporters.

        Returns:
            True if export succeeded, False if failed, None if no data
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # First extract the IOCs
        extracted = self.extract()

        if not extracted:
            self.log.debug("No IOCs extracted, skipping export")
            return None

        success = True

        from redb.extractors.database_exporters import PrintExporter, ClickHouseExporter

        for exporter in self.exporters:
            try:
                if isinstance(exporter, PrintExporter):
                    # For PrintExporter, pass the list of dicts
                    export_data = self.prepare_export_data("PrintExporter")
                    success &= exporter.export(export_data)

                elif isinstance(exporter, ClickHouseExporter):
                    # For ClickHouse, pass tuple with table info
                    export_data = self.prepare_export_data("ClickHouseExporter")
                    if export_data:
                        success &= exporter.export(
                            export_data,
                            table=self.get_clickhouse_table(),
                            column_names=export_data[1],
                            column_type_names=export_data[2]
                        )

            except Exception as e:
                self.log.error(f"Error exporting IOCs to {exporter.__class__.__name__}: {e}")
                success = False

        return success