{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":4117,"databundleVersionId":46665,"sourceType":"competition"}],"dockerImageVersionId":31234,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport subprocess\nfrom tqdm import tqdm\n\n# =========================\n# CONFIG (CHANGE ONLY THESE)\n# =========================\nCLASS_ID = 2\nFAMILY_NAME = \"Lollipop\"\n\nCHUNK_SIZE = 500\nCHUNK_ID = 3              # 1500–1999\n\nSUB_CHUNK_SIZE = 250\nSUB_CHUNK_ID = 1          # 1750–1999\n\n# =========================\n# PATHS (Kaggle)\n# =========================\nINPUT_DIR = \"/kaggle/input/malware-classification\"\nARCHIVE_PATH = os.path.join(INPUT_DIR, \"train.7z\")\nLABEL_CSV = os.path.join(INPUT_DIR, \"trainLabels.csv\")\n\nWORK_DIR = \"/kaggle/working\"\nOUTPUT_DIR = os.path.join(WORK_DIR, \"asm_labeled\", FAMILY_NAME)\n\nARCHIVE_OUT = os.path.join(\n    WORK_DIR,\n    f\"{FAMILY_NAME}_ASM_chunk_{CHUNK_ID}_sub_{SUB_CHUNK_ID}.7z\"\n)\n\n# =========================\n# PREPARE OUTPUT\n# =========================\nos.makedirs(OUTPUT_DIR, exist_ok=True)\nprint(f\"✅ Output folder ready (Chunk {CHUNK_ID} / Sub {SUB_CHUNK_ID})\")\n\n# =========================\n# LOAD CSV\n# =========================\ndf = pd.read_csv(LABEL_CSV)\ndf = df[df[\"Class\"] == CLASS_ID].reset_index(drop=True)\n\nTOTAL = len(df)\n\nCHUNK_START = CHUNK_ID * CHUNK_SIZE\nCHUNK_END = min(CHUNK_START + CHUNK_SIZE, TOTAL)\n\nSUB_START = CHUNK_START + (SUB_CHUNK_ID * SUB_CHUNK_SIZE)\nSUB_END = min(SUB_START + SUB_CHUNK_SIZE, CHUNK_END)\n\nif SUB_START >= TOTAL:\n    raise ValueError(\"❌ Invalid sub-chunk range\")\n\nchunk_df = df.iloc[SUB_START:SUB_END]\n\nprint(f\"📂 Processing CSV index {SUB_START} → {SUB_END - 1}\")\nprint(f\"📄 Files count: {len(chunk_df)}\")\n\n# =========================\n# EXTRACTION\n# =========================\nextracted = 0\nfailed = 0\n\nfor _, row in tqdm(\n    chunk_df.iterrows(),\n    total=len(chunk_df),\n    desc=\"Extracting ASM\",\n    unit=\"file\"\n):\n    file_id = row[\"Id\"]\n    asm_path = f\"train/{file_id}.asm\"\n\n    result = subprocess.run(\n        [\"7z\", \"x\", ARCHIVE_PATH, asm_path, f\"-o{OUTPUT_DIR}\", \"-y\"],\n        stdout=subprocess.DEVNULL,\n        stderr=subprocess.DEVNULL\n    )\n\n    if result.returncode == 0:\n        extracted += 1\n    else:\n        failed += 1\n\nprint(f\"✔ Extracted: {extracted}\")\nprint(f\"❌ Failed   : {failed}\")\n\n# =========================\n# VERIFY FILES BEFORE ZIP\n# =========================\nasm_files = [f for f in os.listdir(OUTPUT_DIR) if f.endswith(\".asm\")]\n\nif len(asm_files) == 0:\n    raise RuntimeError(\"❌ No ASM files found — aborting compression\")\n\n# =========================\n# SAFE COMPRESSION\n# =========================\nprint(\"📦 Creating 7z archive...\")\n\nzip_result = subprocess.run(\n    [\"7z\", \"a\", \"-t7z\", \"-y\", ARCHIVE_OUT, OUTPUT_DIR],\n)\n\n# =========================\n# CLEANUP ONLY IF SUCCESS\n# =========================\nif zip_result.returncode == 0:\n    print(\"🧹 Compression successful — cleaning extracted files\")\n    subprocess.run([\"rm\", \"-rf\", OUTPUT_DIR])\nelse:\n    print(\"❌ Compression failed — extracted files kept\")\n\n# =========================\n# FINAL SUMMARY\n# =========================\nprint(\"\\n✅ DONE\")\nprint(f\"📁 Extracted ASM : {extracted}\")\nprint(f\"❌ Failed        : {failed}\")\nprint(f\"📦 Archive       : {ARCHIVE_OUT}\")\nprint(\"🎉 READY FOR DOWNLOAD\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-12-19T20:03:15.405104Z","iopub.execute_input":"2025-12-19T20:03:15.405858Z","iopub.status.idle":"2025-12-19T20:38:48.098824Z","shell.execute_reply.started":"2025-12-19T20:03:15.405817Z","shell.execute_reply":"2025-12-19T20:38:48.095485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import subprocess\nimport os\n\nSOURCE_DIR = \"/kaggle/working/asm_labeled/Lollipop\"\nOUT_7Z = \"/kaggle/working/Lollipop_ASM_FINAL.7z\"\n\n# Safety check\nif not os.path.exists(SOURCE_DIR):\n    raise RuntimeError(\"❌ Source folder does not exist\")\n\nprint(\"📦 Compressing existing ASM folder...\")\n\nsubprocess.run(\n    [\"7z\", \"a\", \"-t7z\", \"-y\", OUT_7Z, SOURCE_DIR],\n    check=True\n)\n\nprint(\"✅ Compression complete\")\nprint(f\"📦 Archive created: {OUT_7Z}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-19T20:45:47.450977Z","iopub.execute_input":"2025-12-19T20:45:47.452781Z","iopub.status.idle":"2025-12-19T20:49:27.834877Z","shell.execute_reply.started":"2025-12-19T20:45:47.452736Z","shell.execute_reply":"2025-12-19T20:49:27.833699Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import subprocess\nimport os\n\nSOURCE_DIR = \"/kaggle/working/asm_labeled/Lollipop\"\nOUT_7Z = \"/kaggle/working/Lollipop_ASM_FINAL1.7z\"\n\n# Safety check\nif not os.path.exists(SOURCE_DIR):\n    raise RuntimeError(\"❌ Source folder does not exist\")\n\nprint(\"📦 Compressing ASM folder (percentage progress)...\\n\")\n\nprocess = subprocess.Popen(\n    [\n        \"7z\", \"a\",\n        \"-t7z\",\n        \"-y\",\n        \"-bsp1\",        # ✅ percentage progress\n        OUT_7Z,\n        SOURCE_DIR\n    ],\n    stdout=subprocess.PIPE,\n    stderr=subprocess.STDOUT,\n    text=True\n)\n\n# Print progress live\nfor line in process.stdout:\n    print(line, end=\"\")\n\nprocess.wait()\n\nif process.returncode == 0:\n    print(\"\\n✅ Compression finished successfully!\")\n    print(f\"📦 Archive created: {OUT_7Z}\")\nelse:\n    print(\"\\n❌ Compression failed!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-19T20:49:48.266589Z","iopub.execute_input":"2025-12-19T20:49:48.266959Z","iopub.status.idle":"2025-12-19T21:18:27.172933Z","shell.execute_reply.started":"2025-12-19T20:49:48.266933Z","shell.execute_reply":"2025-12-19T21:18:27.169437Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!7z a -t7z -mx=1 -y /kaggle/working/Lollipop_ASM_FINAL.7z /kaggle/working/asm_labeled/Lollipop\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-19T21:18:32.930935Z","iopub.execute_input":"2025-12-19T21:18:32.931681Z","iopub.status.idle":"2025-12-19T21:20:34.006396Z","shell.execute_reply.started":"2025-12-19T21:18:32.931599Z","shell.execute_reply":"2025-12-19T21:20:34.004950Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}