From eb2ac3c16db2078da90a0781d8185bc8d8f8a0ca Mon Sep 17 00:00:00 2001 From: aarsyah0 Date: Tue, 27 May 2025 10:51:21 +0700 Subject: [PATCH] check --- app/Http/Controllers/HomeController.php | 152 +- composer.json | 5 +- composer.lock | 93 +- public/storage | 1 + resources/views/dashboard.blade.php | 598 ++----- resources/views/data_labeled.csv | 1372 +++++++++++++++++ resources/views/data_labeledgopay.csv | 1359 ++++++++++++++++ resources/views/data_labeledshopee.csv | 1296 ++++++++++++++++ resources/views/layouts/app.blade.php | 1 + routes/web.php | 97 +- vendor/composer/autoload_classmap.php | 72 + vendor/composer/autoload_files.php | 1 + vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_static.php | 78 + vendor/composer/installed.json | 94 ++ vendor/composer/installed.php | 21 +- vendor/league/csv/LICENSE | 20 + vendor/league/csv/autoload.php | 14 + vendor/league/csv/composer.json | 87 ++ vendor/league/csv/src/AbstractCsv.php | 622 ++++++++ vendor/league/csv/src/Bom.php | 145 ++ vendor/league/csv/src/Buffer.php | 487 ++++++ vendor/league/csv/src/ByteSequence.php | 34 + .../league/csv/src/CallbackStreamFilter.php | 161 ++ vendor/league/csv/src/CannotInsertRecord.php | 64 + vendor/league/csv/src/CharsetConverter.php | 418 +++++ vendor/league/csv/src/ColumnConsistency.php | 54 + vendor/league/csv/src/EncloseField.php | 144 ++ vendor/league/csv/src/EscapeFormula.php | 160 ++ vendor/league/csv/src/Exception.php | 23 + vendor/league/csv/src/FragmentFinder.php | 428 +++++ vendor/league/csv/src/FragmentNotFound.php | 20 + vendor/league/csv/src/HTMLConverter.php | 245 +++ vendor/league/csv/src/HttpHeaders.php | 64 + vendor/league/csv/src/Info.php | 81 + vendor/league/csv/src/InvalidArgument.php | 113 ++ vendor/league/csv/src/JsonConverter.php | 542 +++++++ vendor/league/csv/src/MapIterator.php | 67 + .../csv/src/Query/Constraint/Column.php | 85 + .../csv/src/Query/Constraint/Comparison.php | 157 ++ .../csv/src/Query/Constraint/Criteria.php | 168 ++ .../csv/src/Query/Constraint/Offset.php | 79 + .../csv/src/Query/Constraint/TwoColumns.php | 99 ++ vendor/league/csv/src/Query/Limit.php | 41 + .../league/csv/src/Query/Ordering/Column.php | 113 ++ .../csv/src/Query/Ordering/MultiSort.php | 115 ++ vendor/league/csv/src/Query/Predicate.php | 43 + .../csv/src/Query/PredicateCombinator.php | 71 + .../league/csv/src/Query/QueryException.php | 44 + vendor/league/csv/src/Query/Row.php | 176 +++ vendor/league/csv/src/Query/Sort.php | 43 + .../league/csv/src/Query/SortCombinator.php | 45 + vendor/league/csv/src/RFC4180Field.php | 216 +++ vendor/league/csv/src/RdbmsResult.php | 83 + vendor/league/csv/src/Reader.php | 666 ++++++++ vendor/league/csv/src/ResultSet.php | 718 +++++++++ .../csv/src/Serializer/AfterMapping.php | 50 + .../league/csv/src/Serializer/ArrayShape.php | 32 + .../csv/src/Serializer/CallbackCasting.php | 392 +++++ .../league/csv/src/Serializer/CastToArray.php | 228 +++ .../league/csv/src/Serializer/CastToBool.php | 99 ++ .../league/csv/src/Serializer/CastToDate.php | 159 ++ .../league/csv/src/Serializer/CastToEnum.php | 136 ++ .../league/csv/src/Serializer/CastToFloat.php | 92 ++ .../league/csv/src/Serializer/CastToInt.php | 92 ++ .../csv/src/Serializer/CastToString.php | 93 ++ .../src/Serializer/DenormalizationFailed.php | 25 + .../csv/src/Serializer/Denormalizer.php | 461 ++++++ vendor/league/csv/src/Serializer/MapCell.php | 33 + .../league/csv/src/Serializer/MapRecord.php | 71 + .../csv/src/Serializer/MappingFailed.php | 56 + .../csv/src/Serializer/PropertySetter.php | 71 + .../src/Serializer/SerializationFailed.php | 20 + vendor/league/csv/src/Serializer/Type.php | 163 ++ .../league/csv/src/Serializer/TypeCasting.php | 38 + .../csv/src/Serializer/TypeCastingFailed.php | 74 + .../csv/src/Serializer/TypeCastingInfo.php | 111 ++ .../src/Serializer/TypeCastingTargetType.php | 30 + vendor/league/csv/src/Statement.php | 518 +++++++ vendor/league/csv/src/Stream.php | 542 +++++++ vendor/league/csv/src/StreamFilter.php | 192 +++ vendor/league/csv/src/SwapDelimiter.php | 165 ++ vendor/league/csv/src/SyntaxError.php | 65 + vendor/league/csv/src/TabularData.php | 66 + vendor/league/csv/src/TabularDataReader.php | 101 ++ vendor/league/csv/src/TabularDataWriter.php | 47 + vendor/league/csv/src/UnableToProcessCsv.php | 20 + vendor/league/csv/src/UnavailableFeature.php | 43 + vendor/league/csv/src/UnavailableStream.php | 32 + vendor/league/csv/src/Writer.php | 346 +++++ vendor/league/csv/src/XMLConverter.php | 307 ++++ vendor/league/csv/src/functions.php | 57 + vendor/league/csv/src/functions_include.php | 14 + 93 files changed, 16682 insertions(+), 555 deletions(-) create mode 120000 public/storage create mode 100644 resources/views/data_labeled.csv create mode 100644 resources/views/data_labeledgopay.csv create mode 100644 resources/views/data_labeledshopee.csv create mode 100644 vendor/league/csv/LICENSE create mode 100644 vendor/league/csv/autoload.php create mode 100644 vendor/league/csv/composer.json create mode 100644 vendor/league/csv/src/AbstractCsv.php create mode 100644 vendor/league/csv/src/Bom.php create mode 100644 vendor/league/csv/src/Buffer.php create mode 100644 vendor/league/csv/src/ByteSequence.php create mode 100644 vendor/league/csv/src/CallbackStreamFilter.php create mode 100644 vendor/league/csv/src/CannotInsertRecord.php create mode 100644 vendor/league/csv/src/CharsetConverter.php create mode 100644 vendor/league/csv/src/ColumnConsistency.php create mode 100644 vendor/league/csv/src/EncloseField.php create mode 100644 vendor/league/csv/src/EscapeFormula.php create mode 100644 vendor/league/csv/src/Exception.php create mode 100644 vendor/league/csv/src/FragmentFinder.php create mode 100644 vendor/league/csv/src/FragmentNotFound.php create mode 100644 vendor/league/csv/src/HTMLConverter.php create mode 100644 vendor/league/csv/src/HttpHeaders.php create mode 100644 vendor/league/csv/src/Info.php create mode 100644 vendor/league/csv/src/InvalidArgument.php create mode 100644 vendor/league/csv/src/JsonConverter.php create mode 100644 vendor/league/csv/src/MapIterator.php create mode 100644 vendor/league/csv/src/Query/Constraint/Column.php create mode 100644 vendor/league/csv/src/Query/Constraint/Comparison.php create mode 100644 vendor/league/csv/src/Query/Constraint/Criteria.php create mode 100644 vendor/league/csv/src/Query/Constraint/Offset.php create mode 100644 vendor/league/csv/src/Query/Constraint/TwoColumns.php create mode 100644 vendor/league/csv/src/Query/Limit.php create mode 100644 vendor/league/csv/src/Query/Ordering/Column.php create mode 100644 vendor/league/csv/src/Query/Ordering/MultiSort.php create mode 100644 vendor/league/csv/src/Query/Predicate.php create mode 100644 vendor/league/csv/src/Query/PredicateCombinator.php create mode 100644 vendor/league/csv/src/Query/QueryException.php create mode 100644 vendor/league/csv/src/Query/Row.php create mode 100644 vendor/league/csv/src/Query/Sort.php create mode 100644 vendor/league/csv/src/Query/SortCombinator.php create mode 100644 vendor/league/csv/src/RFC4180Field.php create mode 100644 vendor/league/csv/src/RdbmsResult.php create mode 100644 vendor/league/csv/src/Reader.php create mode 100644 vendor/league/csv/src/ResultSet.php create mode 100644 vendor/league/csv/src/Serializer/AfterMapping.php create mode 100644 vendor/league/csv/src/Serializer/ArrayShape.php create mode 100644 vendor/league/csv/src/Serializer/CallbackCasting.php create mode 100644 vendor/league/csv/src/Serializer/CastToArray.php create mode 100644 vendor/league/csv/src/Serializer/CastToBool.php create mode 100644 vendor/league/csv/src/Serializer/CastToDate.php create mode 100644 vendor/league/csv/src/Serializer/CastToEnum.php create mode 100644 vendor/league/csv/src/Serializer/CastToFloat.php create mode 100644 vendor/league/csv/src/Serializer/CastToInt.php create mode 100644 vendor/league/csv/src/Serializer/CastToString.php create mode 100644 vendor/league/csv/src/Serializer/DenormalizationFailed.php create mode 100644 vendor/league/csv/src/Serializer/Denormalizer.php create mode 100644 vendor/league/csv/src/Serializer/MapCell.php create mode 100644 vendor/league/csv/src/Serializer/MapRecord.php create mode 100644 vendor/league/csv/src/Serializer/MappingFailed.php create mode 100644 vendor/league/csv/src/Serializer/PropertySetter.php create mode 100644 vendor/league/csv/src/Serializer/SerializationFailed.php create mode 100644 vendor/league/csv/src/Serializer/Type.php create mode 100644 vendor/league/csv/src/Serializer/TypeCasting.php create mode 100644 vendor/league/csv/src/Serializer/TypeCastingFailed.php create mode 100644 vendor/league/csv/src/Serializer/TypeCastingInfo.php create mode 100644 vendor/league/csv/src/Serializer/TypeCastingTargetType.php create mode 100644 vendor/league/csv/src/Statement.php create mode 100644 vendor/league/csv/src/Stream.php create mode 100644 vendor/league/csv/src/StreamFilter.php create mode 100644 vendor/league/csv/src/SwapDelimiter.php create mode 100644 vendor/league/csv/src/SyntaxError.php create mode 100644 vendor/league/csv/src/TabularData.php create mode 100644 vendor/league/csv/src/TabularDataReader.php create mode 100644 vendor/league/csv/src/TabularDataWriter.php create mode 100644 vendor/league/csv/src/UnableToProcessCsv.php create mode 100644 vendor/league/csv/src/UnavailableFeature.php create mode 100644 vendor/league/csv/src/UnavailableStream.php create mode 100644 vendor/league/csv/src/Writer.php create mode 100644 vendor/league/csv/src/XMLConverter.php create mode 100644 vendor/league/csv/src/functions.php create mode 100644 vendor/league/csv/src/functions_include.php diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index f812926..a72e595 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -3,57 +3,135 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Response; class HomeController extends Controller { - public function home() + /** + * Display the dashboard with sentiment counts. + */ + public function index() { - return redirect('dashboard'); - } + // Paths to CSV files in public/storage + $pathDana = public_path('storage/data_labeled.csv'); + $pathGopay = public_path('storage/data_labeledgopay.csv'); + $pathShopee = public_path('storage/data_labeledshopee.csv'); - public function wordcloudData(Request $request) - { - $source = $request->query('source', 'gopay'); // default 'gopay' + // Read CSVs + $danaRows = $this->readCsv($pathDana); + $gopayRows = $this->readCsv($pathGopay); + $shopeeRows = $this->readCsv($pathShopee); - // Tentukan file berdasarkan sumber - if ($source === 'gopay') { - $files = ['gopaylabel.csv']; - } elseif ($source === 'dana') { - $files = ['danalabel.csv']; - } elseif($source === 'shopeepay'){ - $files = ['shopeepaylabel.csv']; - } else { - $files = ['gopaylabel.csv', 'danalabel.csv', 'shopeepaylabel.csv']; - } + // Merge for "all" + $allRows = array_merge($danaRows, $gopayRows, $shopeeRows); - $allText = ''; - foreach ($files as $file) { - $path = resource_path("views/{$file}"); - if (File::exists($path)) { - // Baca baris per baris - $csv = array_map('str_getcsv', File::lines($path)->toArray()); - $header = array_shift($csv); - $idx = array_search('cleaned_text', $header); - foreach ($csv as $row) { - if (isset($row[$idx])) { - $allText .= ' '.strtolower($row[$idx]); + // Counting helper + $calcCounts = function(array $rows) { + $counts = ['positif' => 0, 'netral' => 0, 'negatif' => 0]; + $map = [ + 'positive' => 'positif', + 'neutral' => 'netral', + 'negative' => 'negatif', + ]; + + foreach ($rows as $r) { + $label = strtolower(trim($r['label_auto'] ?? '')); + if (isset($map[$label])) { + $counts[$map[$label]]++; } } + + return $counts; + }; + + // Calculate counts + $counts = [ + 'all' => $calcCounts($allRows), + 'dana' => $calcCounts($danaRows), + 'gopay' => $calcCounts($gopayRows), + 'shopeepay' => $calcCounts($shopeeRows), + ]; + + return view('dashboard', compact('counts')); + } + + /** + * Return JSON word-cloud data for a given source. + * GET /wordcloud-data?source=all|dana|gopay|shopeepay + */ + public function wordcloudData(Request $request) +{ + $source = strtolower($request->query('source', 'all')); + $sentiment = strtolower($request->query('sentiment', 'all')); + $map = ['positif'=>'positive','netral'=>'neutral','negatif'=>'negative']; + + // Ambil semua baris sesuai source (sama seperti sebelumnya) + switch ($source) { + case 'dana': + $rows = $this->readCsv(public_path('storage/data_labeled.csv')); + break; + case 'gopay': + $rows = $this->readCsv(public_path('storage/data_labeledgopay.csv')); + break; + case 'shopeepay': + $rows = $this->readCsv(public_path('storage/data_labeledshopee.csv')); + break; + default: + $rows = array_merge( + $this->readCsv(public_path('storage/data_labeled.csv')), + $this->readCsv(public_path('storage/data_labeledgopay.csv')), + $this->readCsv(public_path('storage/data_labeledshopee.csv')) + ); + } + + // Jika permintaan untuk sentimen tertentu, filter dulu + if (isset($map[$sentiment])) { + $engLabel = $map[$sentiment]; + $rows = array_filter($rows, fn($r) => strtolower($r['label_auto'] ?? '') === $engLabel); + } + + // Tokenize & hitung frekuensi kata + $freq = []; + foreach ($rows as $row) { + $words = preg_split('/\W+/', strtolower($row['clean_text'] ?? ''), -1, PREG_SPLIT_NO_EMPTY); + foreach ($words as $w) { + if (strlen($w) < 3) continue; + $freq[$w] = ($freq[$w] ?? 0) + 1; } } - $words = str_word_count($allText, 1); - $filtered = array_filter($words, fn($w) => strlen($w) > 2); - $counts = array_count_values($filtered); - arsort($counts); - $top100 = array_slice($counts, 0, 100, true); - $list = []; - foreach ($top100 as $word => $count) { - $list[] = [$word, $count]; + arsort($freq); + $top = array_slice($freq, 0, 800, true); // batasi ke 70 kata + + $list = []; + foreach ($top as $word => $count) { + $list[] = [$word, $count]; + } + + return Response::json($list); +} + + + /** + * Helper: load a CSV into an associative array. + */ + private function readCsv(string $path): array + { + if (! File::exists($path)) { + logger()->warning("CSV file not found at {$path}"); + return []; } - return response()->json($list); + $handle = fopen($path, 'r'); + $header = fgetcsv($handle); + $data = []; + + while ($row = fgetcsv($handle)) { + $data[] = array_combine($header, $row); + } + + fclose($handle); + return $data; } } diff --git a/composer.json b/composer.json index 3427405..1149bf8 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "guzzlehttp/guzzle": "^7.4", "laravel/framework": "^11.0", "laravel/sanctum": "^4.0", - "laravel/tinker": "^2.6" + "laravel/tinker": "^2.6", + "league/csv": "^9.23" }, "require-dev": { "spatie/laravel-ignition": "^2.0", @@ -61,4 +62,4 @@ }, "minimum-stability": "dev", "prefer-stable": true -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index 6ced20b..cd1b4f4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "44af905ee6d3a491d075107e62a3ab1e", + "content-hash": "9a808cd3140036bb203b0f5ab49fbb19", "packages": [ { "name": "brick/math", @@ -1708,6 +1708,97 @@ ], "time": "2022-12-11T20:36:23+00:00" }, + { + "name": "league/csv", + "version": "9.23.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "774008ad8a634448e4f8e288905e070e8b317ff3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/774008ad8a634448e4f8e288905e070e8b317ff3", + "reference": "774008ad8a634448e4f8e288905e070e8b317ff3", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.69.0", + "phpbench/phpbench": "^1.4.0", + "phpstan/phpstan": "^1.12.18", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.7", + "symfony/var-dumper": "^6.4.8 || ^7.2.3" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Csv\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], + "support": { + "docs": "https://csv.thephpleague.com", + "issues": "https://github.com/thephpleague/csv/issues", + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-03-28T06:52:04+00:00" + }, { "name": "league/flysystem", "version": "3.29.1", diff --git a/public/storage b/public/storage new file mode 120000 index 0000000..a82601c --- /dev/null +++ b/public/storage @@ -0,0 +1 @@ +/Users/sutanarsyahnugraha/Documents/Joki/analisis/storage/app/public \ No newline at end of file diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 17630f1..23da999 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,538 +1,258 @@ @extends('layouts/user_type/auth') @section('content') - @php - if (!function_exists('getSentimentCounts')) { - function getSentimentCounts($path) - { - if (!file_exists($path)) { - return ['positif' => 0, 'netral' => 0, 'negatif' => 0]; - } - $rows = array_map('str_getcsv', file($path)); - array_shift($rows); - $labels = array_column($rows, 1); - $counts = array_count_values($labels); - return array_merge(['positif' => 0, 'netral' => 0, 'negatif' => 0], $counts); - } - } - - // Hitung data sekali - $base = resource_path('views'); - $cDana = getSentimentCounts("{$base}/danalabel.csv"); - $cGoPay = getSentimentCounts("{$base}/gopaylabel.csv"); - $cShopee = getSentimentCounts("{$base}/shopeepaylabel.csv"); - - // Total kartu (opsional) - $totalPositif = $cDana['positif'] + $cGoPay['positif'] + $cShopee['positif']; - $totalNetral = $cDana['netral'] + $cGoPay['netral'] + $cShopee['netral']; - $totalNegatif = $cDana['negatif'] + $cGoPay['negatif'] + $cShopee['negatif']; - @endphp - + {{-- Ringkasan Sentimen --}}
-
- - +
- -
-
-
-
-
-

Total Positif

-

- {{ $cDana['positif'] + $cGoPay['positif'] + $cShopee['positif'] }} -

-
-
- -
- -
-
-
-
-
-
-
-

Total Netral

-

- {{ $cDana['netral'] + $cGoPay['netral'] + $cShopee['netral'] }} -

-
-
- + @foreach (['positif' => 'bg-success', 'netral' => 'bg-warning', 'negatif' => 'bg-danger'] as $sent => $badge) +
+
+
+
+

Total {{ ucfirst($sent) }}

+

+ {{ $counts['all'][$sent] }} +

+
+
+ +
-
- -
-
-
-
-

Total Negatif

-

- {{ $cDana['negatif'] + $cGoPay['negatif'] + $cShopee['negatif'] }} -

-
-
- -
-
-
-
+ @endforeach
-
-
-
- -
-
-
-
Perbandingan Sentimen E-Wallet
-

Grafik batang menunjukkan jumlah sentimen positif, netral, dan negatif untuk Dana, - GoPay, dan ShopeePay.

+ {{-- Charts Section --}} +
+
+
+
+
Perbandingan Sentimen E-Wallet
-
-
-
- -
-
+
+
- - -
-
-
-
Tren Sentimen E-Wallet
-

Garis menunjukkan perubahan proporsi sentimen (positif, netral, negatif) di setiap - e-wallet.

+
+
+
+
Tren Sentimen E-Wallet
-
-
- -
+
+
-
- -
-
-
-
-
Distribusi Persentase Sentimen
-

Grafik pai menampilkan persentase sentimen (positif, netral, negatif) untuk - e-wallet terpilih.

-
- +
-
-
- -
+
+
-
-
-
+
+
+
Perbandingan Sentimen Antar Brand
-

Tabel ini menunjukkan jumlah dan proporsi sentimen untuk masing-masing e-wallet.

-
-
- - +
+
+ + + + + + + + + + + @foreach (['Dana' => 'dana', 'GoPay' => 'gopay', 'ShopeePay' => 'shopeepay'] as $label => $key) + @php + $d = $counts[$key]; + $net = (($d['positif'] - $d['negatif']) / max(1, array_sum($d))) * 100; + @endphp - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - -
E-WalletPositifNetralNegatifNet Score
E-WalletPositifNetralNegatifNet Score
DANA{{ $cDana['positif'] }}{{ $cDana['netral'] }}{{ $cDana['negatif'] }}{{ $label }}{{ $d['positif'] }}{{ $d['netral'] }}{{ $d['negatif'] }} - - {{ number_format((($cDana['positif'] - $cDana['negatif']) / max(1, $cDana['positif'] + $cDana['netral'] + $cDana['negatif'])) * 100, 1) }}% + + {{ number_format($net, 1) }}%
GoPay{{ $cGoPay['positif'] }}{{ $cGoPay['netral'] }}{{ $cGoPay['negatif'] }} - - {{ number_format((($cGoPay['positif'] - $cGoPay['negatif']) / max(1, $cGoPay['positif'] + $cGoPay['netral'] + $cGoPay['negatif'])) * 100, 1) }}% - -
ShopeePay{{ $cShopee['positif'] }}{{ $cShopee['netral'] }}{{ $cShopee['negatif'] }} - - {{ number_format((($cShopee['positif'] - $cShopee['negatif']) / max(1, $cShopee['positif'] + $cShopee['netral'] + $cShopee['negatif'])) * 100, 1) }}% - -
-
+ @endforeach + +
-
-
-
-
- -
-
-
+ {{-- WordCloud Section --}} +
+
+ +
+ + @foreach (['positif', 'netral', 'negatif'] as $s) +
+
+
+
{{ ucfirst($s) }}
-
- -
-
-
- + @endforeach
@endsection -@push('dashboard') - - +@push('scripts') + + - - @endpush diff --git a/resources/views/data_labeled.csv b/resources/views/data_labeled.csv new file mode 100644 index 0000000..5e722bf --- /dev/null +++ b/resources/views/data_labeled.csv @@ -0,0 +1,1372 @@ +clean_text,word_count,label,sent_raw,label_auto +coba tanya csnya aja kak,5,,"{'label': 'neutral', 'score': 0.9998924732208252}",neutral +aman aja min banyak promo dana,6,,"{'label': 'negative', 'score': 0.9914831519126892}",negative +selow aja min jgn dipikirin biar gua aja mikir,9,,"{'label': 'negative', 'score': 0.9998471736907959}",negative +tetep kalem dompet tip penting jgn sinis,7,,"{'label': 'neutral', 'score': 0.7677060961723328}",neutral +dana jadi andal gua buat hemat,6,,"{'label': 'positive', 'score': 0.9999556541442871}",positive +udah ngadu merchant nya langsung moga aja bulan depan beneran balik tuh duitt sumpah mood banget gegara dana aman skrg,20,,"{'label': 'negative', 'score': 0.9998906850814819}",negative +hari bikin emosi dana gua tarik kali kek gin moga aja dana balik,13,,"{'label': 'negative', 'score': 0.9998805522918701}",negative +badai lalu gesss yok semangat,5,,"{'label': 'positive', 'score': 0.7640716433525085}",positive +gimana lgi minn,3,,"{'label': 'negative', 'score': 0.9996588230133057}",negative +sindir wooooyy elah mimin,4,,"{'label': 'negative', 'score': 0.9998948574066162}",negative +yok kerja kerasl lgi besttiii semangat,6,,"{'label': 'positive', 'score': 0.9998894929885864}",positive +realate bkin ngakak wkwkw min bkin konten seru,8,,"{'label': 'negative', 'score': 0.893766462802887}",negative +udah masuk hari gigit jari wkwk,6,,"{'label': 'negative', 'score': 0.9998359680175781}",negative +ajar banyak konten big thanks dana,6,,"{'label': 'neutral', 'score': 0.9997277855873108}",neutral +gimana dong biar lancar jaya nih isi dompet min,9,,"{'label': 'positive', 'score': 0.8181594014167786}",positive +mimin ngerasain nyata semangat cari cuan lgi min,8,,"{'label': 'positive', 'score': 0.999813973903656}",positive +dah paling enak tidur aja min tidur biar hemat wkwk,10,,"{'label': 'positive', 'score': 0.9998248219490051}",positive +bijir mimin nyindir gua nih,5,,"{'label': 'neutral', 'score': 0.9858486652374268}",neutral +baru the best info,4,,"{'label': 'positive', 'score': 0.9999233484268188}",positive +lgsg share temen kantor biar gak khawatir,7,,"{'label': 'neutral', 'score': 0.9997277855873108}",neutral +gak was was deh skrg makasih min info,8,,"{'label': 'negative', 'score': 0.8506278991699219}",negative +begini paling enak mantau promo dana hihihi,7,,"{'label': 'positive', 'score': 0.999954104423523}",positive +ngapain sinis min kan dana banyak promo hihii,8,,"{'label': 'negative', 'score': 0.999847412109375}",negative +extrak kerja keras min,4,,"{'label': 'positive', 'score': 0.9995328187942505}",positive +top banget dah min vocernya hemat maksimal,7,,"{'label': 'positive', 'score': 0.999956488609314}",positive +sering min kasih promo begini,5,,"{'label': 'neutral', 'score': 0.9998552799224854}",neutral +belanja seru vocer dana deals solusi,6,,"{'label': 'positive', 'score': 0.9994949102401733}",positive +makin suka dana deh bnyk promo nya,7,,"{'label': 'positive', 'score': 0.999943733215332}",positive +berkat ewallet baik belanja hemat nyaman,6,,"{'label': 'positive', 'score': 0.9998843669891357}",positive +kendala buat belanja deh klo diskon gni mah,8,,"{'label': 'negative', 'score': 0.9989057779312134}",negative +diskon mantul gin dilewatin gais,5,,"{'label': 'positive', 'score': 0.9991961121559143}",positive +the best vocernya hemat belanja,5,,"{'label': 'positive', 'score': 0.9999535083770752}",positive +wow vocer dana deals mantul parah,6,,"{'label': 'negative', 'score': 0.9998658895492554}",negative +udah masuk vocernya waktu belanja hemat,6,,"{'label': 'positive', 'score': 0.9999539852142334}",positive +widih big thanks loh min pas bgt blnja dpet vocer,10,,"{'label': 'positive', 'score': 0.9997279047966003}",positive +terima kasih dana vocer promony,5,,"{'label': 'positive', 'score': 0.9999260902404785}",positive +mang semantul min vocernya,4,,"{'label': 'positive', 'score': 0.9995123147964478}",positive +pke dana semua aman aman aja,6,,"{'label': 'positive', 'score': 0.9997754693031311}",positive +alhamdulillah vocer hemat,3,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +makasih min vocernya mantul,4,,"{'label': 'positive', 'score': 0.9998998641967773}",positive +dana emg gak main promonya,5,,"{'label': 'negative', 'score': 0.9998112320899963}",negative +etdah diskon bkin semangat belanja,5,,"{'label': 'positive', 'score': 0.9998242259025574}",positive +mantap pis promonya,3,,"{'label': 'positive', 'score': 0.9999567270278931}",positive +gokil hemat parah sih promonya,5,,"{'label': 'positive', 'score': 0.9999347925186157}",positive +promo baik min,3,,"{'label': 'positive', 'score': 0.9990279674530029}",positive +aman min gua udah ngumpulin uang,6,,"{'label': 'neutral', 'score': 0.6846768260002136}",neutral +saat bijak ngatur uang nih mantap min konten,8,,"{'label': 'positive', 'score': 0.9997442364692688}",positive +tenang promo dana wkwk,4,,"{'label': 'positive', 'score': 0.9999353885650635}",positive +jangan buka kartu min,4,,"{'label': 'negative', 'score': 0.9798761606216431}",negative +keluar bulan kemaren bener luar biasa min amsyong,8,,"{'label': 'positive', 'score': 0.9999117851257324}",positive +fixs mimin kek dukun dah,5,,"{'label': 'negative', 'score': 0.9999107122421265}",negative +aman aman aja klo dana promo wkwk,7,,"{'label': 'positive', 'score': 0.9972400665283203}",positive +mantul min bener banget dah,5,,"{'label': 'positive', 'score': 0.9999204874038696}",positive +solusi baik nya dong miinn biar dompet penuh hihihi,9,,"{'label': 'negative', 'score': 0.503311812877655}",negative +lama dana saldo gua baik baik aja,7,,"{'label': 'negative', 'score': 0.9993593096733093}",negative +seru pake dana miminnya tau aja ahahaa,7,,"{'label': 'positive', 'score': 0.9539514183998108}",positive +alhamdulillah min saldo gua aman aja hehe,7,,"{'label': 'positive', 'score': 0.997757613658905}",positive +wah makin mantap dana adaptif banget sama,7,,"{'label': 'positive', 'score': 0.9999535083770752}",positive +promo voucher dana selalu baik promo voucher terus bikin happy,10,,"{'label': 'positive', 'score': 0.999937891960144}",positive +mantul dana bikin transaksi gampang,5,,"{'label': 'positive', 'score': 0.9998879432678223}",positive +selow ges dana selalu bkin nyaman hemat,7,,"{'label': 'positive', 'score': 0.9999265670776367}",positive +dompet tipis penting tetep senyum,5,,"{'label': 'positive', 'score': 0.9998295307159424}",positive +dana memang baik promo voucher promo voucher selalu bikin puas,10,,"{'label': 'positive', 'score': 0.999942421913147}",positive +transaksi pakai dana the best,5,,"{'label': 'positive', 'score': 0.9999505281448364}",positive +inti hemat dlu ges,4,,"{'label': 'positive', 'score': 0.9998154044151306}",positive +suka banget sama promo voucher dana promo vouchernya baik selalu,10,,"{'label': 'positive', 'score': 0.9999526739120483}",positive +setia pakai danabuat transaksi dana,5,,"{'label': 'neutral', 'score': 0.9802480340003967}",neutral +kok sama sih min nasib,5,,"{'label': 'negative', 'score': 0.9998559951782227}",negative +promo voucher promo voucher dana selalu top baik emang,9,,"{'label': 'positive', 'score': 0.9999371767044067}",positive +danamemang andal buat transaksi dana,5,,"{'label': 'positive', 'score': 0.999881386756897}",positive +mending gua rebah min biar gak jajan mulu,8,,"{'label': 'negative', 'score': 0.9997207522392273}",negative +terima kasih dana promo voucher baik promo vouchernya pernah absen,10,,"{'label': 'neutral', 'score': 0.9992627501487732}",neutral +wow transaksi pakai dana cepat banget,6,,"{'label': 'positive', 'score': 0.9999362230300903}",positive +cerita dana selalu bawa semangat baru hidup seru,8,,"{'label': 'positive', 'score': 0.9999579191207886}",positive +promo voucher dana hidup jadi keren,6,,"{'label': 'positive', 'score': 0.9999587535858154}",positive +dana top banget,3,,"{'label': 'positive', 'score': 0.999956488609314}",positive +cerita dana jadi semangat raih tuju terima kasih,8,,"{'label': 'positive', 'score': 0.9999321699142456}",positive +terima kasih dana promo voucher nya keren banget,8,,"{'label': 'positive', 'score': 0.9999586343765259}",positive +nyaman banget pakai dana buat transaksi,6,,"{'label': 'positive', 'score': 0.9999474287033081}",positive +cerita dana buat hari penuh semangat cerita luar biasa,9,,"{'label': 'positive', 'score': 0.9999374151229858}",positive +dana selalu hadir promo voucher keren promo voucher contoh,9,,"{'label': 'neutral', 'score': 0.9945038557052612}",neutral +lancar jaya transaksi pakai dana,5,,"{'label': 'positive', 'score': 0.9999409914016724}",positive +dana selalu punya cerita bikin semangat salut terus karya,9,,"{'label': 'positive', 'score': 0.9999446868896484}",positive +keren parah promo voucher dana memang mantap,7,,"{'label': 'positive', 'score': 0.9999545812606812}",positive +luar biasa mudah transaksi dana,5,,"{'label': 'positive', 'score': 0.9999526739120483}",positive +cerita hebat dana benar benar sentuh hati tambah semangat keep,10,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +promo voucher dana keren untung,5,,"{'label': 'positive', 'score': 0.9999561309814453}",positive +mantul banget transaksi pakai dana,5,,"{'label': 'positive', 'score': 0.9999306201934814}",positive +hope win fnuhp layrhjgvxbrhnw iheblahmyir zdwyenh,6,,"{'label': 'neutral', 'score': 0.9212648272514343}",neutral +cerita dana benar benar bikin semangat terima kasih bagi,9,,"{'label': 'positive', 'score': 0.9999501705169678}",positive +promo voucher dana memang keren banget,6,,"{'label': 'positive', 'score': 0.9999575614929199}",positive +ewallet baik transaksi dana dana,5,,"{'label': 'neutral', 'score': 0.9997050166130066}",neutral +dana cerita kalian bangkit semangat baru diri terus maju,9,,"{'label': 'positive', 'score': 0.999936580657959}",positive +suka banget sama promo voucher dana keren maksimal,8,,"{'label': 'positive', 'score': 0.9999545812606812}",positive +seru banget pakai dana mudah praktis,6,,"{'label': 'positive', 'score': 0.9999579191207886}",positive +terima kasih dana atas cerita penuh semangat seru,8,,"{'label': 'positive', 'score': 0.9999401569366455}",positive +promo voucher dana keren abis,5,,"{'label': 'positive', 'score': 0.9999585151672363}",positive +suka banget dana simpel cepatmantap,5,,"{'label': 'positive', 'score': 0.9999532699584961}",positive +dana ingat pernah serah semangat selalu,6,,"{'label': 'positive', 'score': 0.9999274015426636}",positive +apresiasi buat dana atas promo voucher keren,7,,"{'label': 'positive', 'score': 0.9999344348907471}",positive +alhamdulillah dana bikin transaksi bebas ribet,6,,"{'label': 'positive', 'score': 0.9998757839202881}",positive +dana buat makin semangat kejar impi keep inspiring,8,,"{'label': 'positive', 'score': 0.999914288520813}",positive +dana bikin hidup makin mudah promo voucher super keren,9,,"{'label': 'positive', 'score': 0.9999538660049438}",positive +mantap dana bikin semua transaksi lancar jaya,7,,"{'label': 'positive', 'score': 0.9999579191207886}",positive +terima kasih bagi,3,,"{'label': 'positive', 'score': 0.9999312162399292}",positive +dana andal banget promo vouchernya mantul,6,,"{'label': 'positive', 'score': 0.9999302625656128}",positive +danamemang ewallet baik dana,4,,"{'label': 'negative', 'score': 0.9711666107177734}",negative +beri semangat baru terima kasih,5,,"{'label': 'positive', 'score': 0.9999387264251709}",positive +beneran banget hemat kalau pake dana suka dana banget apa lgi promo vouchernya,13,,"{'label': 'positive', 'score': 0.9999183416366577}",positive +transaksi pakai dana seru nyaman,5,,"{'label': 'positive', 'score': 0.9999572038650513}",positive +dana beri cerita tak nilai,5,,"{'label': 'negative', 'score': 0.9998742341995239}",negative +selalu dana nih bikin neng promo vouchernya apa lgi alfagiftnya bikin semangat,12,,"{'label': 'positive', 'score': 0.9999488592147827}",positive +suka banget dana transaksi jadi cepat,6,,"{'label': 'positive', 'score': 0.9999587535858154}",positive +dana cerita luar biasa,4,,"{'label': 'positive', 'score': 0.9999469518661499}",positive +bayang hemat pake dana promo voucher promo voucher memang juara,10,,"{'label': 'positive', 'score': 0.9999175071716309}",positive +alhamdulillah transaksi jadi cepat dana,5,,"{'label': 'positive', 'score': 0.999950647354126}",positive +seru penuh ajar hidup jadi baik,6,,"{'label': 'positive', 'score': 0.999953031539917}",positive +promo voucher dana paling oke banget bikin transakasi jdi lebi mantul hemat,12,,"{'label': 'positive', 'score': 0.9999599456787109}",positive +mantap banget pakai dana semua jadi simpel,7,,"{'label': 'positive', 'score': 0.999956488609314}",positive +terima kasih dana atas cerita nya luar biasa benar benar kuat,11,,"{'label': 'positive', 'score': 0.9999332427978516}",positive +promo vouchernya semangat trus dana,5,,"{'label': 'positive', 'score': 0.9999479055404663}",positive +ewallet baik dana danapastinya,4,,"{'label': 'neutral', 'score': 0.9994043111801147}",neutral +cerita dana luar biasa penuh makna seru,7,,"{'label': 'positive', 'score': 0.9999545812606812}",positive +promo voucher seru transaksi jdi seru makas dana,8,,"{'label': 'positive', 'score': 0.9999562501907349}",positive +seru banget transaksi pakai dana anti ribet,7,,"{'label': 'positive', 'score': 0.9999524354934692}",positive +terus karya seru semangat dana,5,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +promo voucher hemat bikin dompet jdi aman nyaman,8,,"{'label': 'positive', 'score': 0.9999297857284546}",positive +suka dana bikin transaksi makin praktis,6,,"{'label': 'positive', 'score': 0.9999529123306274}",positive +dana cerita benar benar luar biasa terima kasih bagi,9,,"{'label': 'positive', 'score': 0.9999277591705322}",positive +promo voucher dana emang beda memang ewallet baik emang beda,10,,"{'label': 'negative', 'score': 0.9993379712104797}",negative +alhamdulillah dana bikin belanja jadi nyaman,6,,"{'label': 'positive', 'score': 0.9999544620513916}",positive +cerita dana sungguh luar biasa seru sentuh hati,8,,"{'label': 'positive', 'score': 0.9999470710754395}",positive +tarik banget promo voucher dana perna bosan pake dana terima kasih dana,12,,"{'label': 'negative', 'score': 0.9999115467071533}",negative +dana mantap banget bikin transaksi mudah,6,,"{'label': 'positive', 'score': 0.9999582767486572}",positive +beri cerita tak nilai terus ikan terima kasih dana,9,,"{'label': 'negative', 'score': 0.9996945858001709}",negative +promo voucher gila gila dana semua terima kasih dana,9,,"{'label': 'negative', 'score': 0.9992066025733948}",negative +danaewallet baik dana,3,,"{'label': 'negative', 'score': 0.8676282167434692}",negative +cerita dana benar benar luar biasa sentuh hati terima kasih bagi,11,,"{'label': 'positive', 'score': 0.9998088479042053}",positive +mantap banget dana mudah promo vouchernya bikin jatuh cinta,9,,"{'label': 'positive', 'score': 0.9999598264694214}",positive +transaksi pakai dana seru gampang,5,,"{'label': 'positive', 'score': 0.9999513626098633}",positive +kata luar biasa cerita dana seru penuh ajar,8,,"{'label': 'positive', 'score': 0.9999136924743652}",positive +bangga punya dukung dana promo voucher terima kasih banyak,9,,"{'label': 'positive', 'score': 0.9999198913574219}",positive +dana memang mantul bikin bayar jadi gampang,7,,"{'label': 'positive', 'score': 0.9999295473098755}",positive +dana cuma sekadar aplikasi tempat cerita bikin kagum,8,,"{'label': 'positive', 'score': 0.9998737573623657}",positive +solusi baik nya apa dong miiiiinnn,6,,"{'label': 'positive', 'score': 0.9984101057052612}",positive +terima kasih dana dukung buat promo voucher jadi arti semua,10,,"{'label': 'positive', 'score': 0.9998912811279297}",positive +bayar pakai dana benarbenar seru,5,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +yok semangat cari cuan guys,5,,"{'label': 'neutral', 'score': 0.9989344477653503}",neutral +dana tuh cuma transaksi sumber cerita penuh semangat,8,,"{'label': 'positive', 'score': 0.8545725345611572}",positive +terima kasih dana bawa promo voucher level ikut,8,,"{'label': 'neutral', 'score': 0.9993451237678528}",neutral +nih ewallet baik buat transaksi dana,6,,"{'label': 'positive', 'score': 0.9745934009552002}",positive +cerita dana bikin aku yakin langkah punya arti luar biasa,10,,"{'label': 'positive', 'score': 0.999943733215332}",positive +suka banget sama energi dana terima kasih atas dukung promo voucher,11,,"{'label': 'positive', 'score': 0.9999483823776245}",positive +suka dana bayar jadi cepat simpel,6,,"{'label': 'positive', 'score': 0.999950647354126}",positive +cerita guna dana jadi ingat mimpi jadi nyata,8,,"{'label': 'positive', 'score': 0.9804078936576843}",positive +selalu nungguin promo voucher dana emang baik,7,,"{'label': 'positive', 'score': 0.9995983242988586}",positive +kali pakai dana rasa mantap banget,6,,"{'label': 'positive', 'score': 0.9999575614929199}",positive +cerita dana buktiin hasil dateng semangat pernah padam,8,,"{'label': 'negative', 'score': 0.9997538924217224}",negative +promo voucher baik promo voucher selalu bikin suka dana,9,,"{'label': 'positive', 'score': 0.9998681545257568}",positive +dana memang baik buat transaksi seharihari,6,,"{'label': 'positive', 'score': 0.9998733997344971}",positive +baca cerita dana jadi paham betapa kuat semangat raih impi,10,,"{'label': 'positive', 'score': 0.9998997449874878}",positive +promo voucher dana pernah kecewa baik,6,,"{'label': 'negative', 'score': 0.9999154806137085}",negative +terima kasih dana gak perlu ribet kalau dana,8,,"{'label': 'positive', 'score': 0.9999130964279175}",positive +cerita dana selalu bikin aku semangat buat terus maju terima kasih dana,12,,"{'label': 'positive', 'score': 0.9999510049819946}",positive +dana promo voucher selalu kasih promo voucher baik paling top,10,,"{'label': 'positive', 'score': 0.9998663663864136}",positive +puji tuhan sekarang bayar bareng jadi mudah dana,8,,"{'label': 'positive', 'score': 0.9999558925628662}",positive +dana punya cerita bikin hari hari jadi arti mantap,9,,"{'label': 'positive', 'score': 0.9999527931213379}",positive +promo voucher dana emang lawan promo voucher baik selalu,9,,"{'label': 'positive', 'score': 0.9858741760253906}",positive +alhamdulillah tiap transaksi pakai dana selalu top markotop,8,,"{'label': 'positive', 'score': 0.9999487400054932}",positive +tiap kali baca cerita guna dana bikin aku semangat buat capai,11,,"{'label': 'positive', 'score': 0.9999381303787231}",positive +terima kasih dana atas promo voucher hari,7,,"{'label': 'positive', 'score': 0.9997221827507019}",positive +big thanks pke dana andal kendala,6,,"{'label': 'neutral', 'score': 0.9966806769371033}",neutral +cerita dana bikin aku percaya tak tak mungkin capai,9,,"{'label': 'positive', 'score': 0.9998517036437988}",positive +promo voucher dana langsung kepo bayar dana,7,,"{'label': 'neutral', 'score': 0.999733030796051}",neutral +aman aja sih dana refund cepat cuy,7,,"{'label': 'negative', 'score': 0.9412568211555481}",negative +guna dana selalu bikin aku cerita makin cinta sama dana,10,,"{'label': 'positive', 'score': 0.9999469518661499}",positive +dana selalu promo voucher seru waktu bikin makin cinta sama dana,11,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +gak khawatir transaksi dana pke dana udah beres,8,,"{'label': 'positive', 'score': 0.9998865127563477}",positive +dana selalu cerita bikin hati hangat semangat bara,8,,"{'label': 'positive', 'score': 0.9999309778213501}",positive +biar bayar makin seru jgn lupa pake promo voucher dana aja oke pake banhget,14,,"{'label': 'neutral', 'score': 0.995475709438324}",neutral +tiap hari transaksi setia pakai dana transaksi mudah,8,,"{'label': 'positive', 'score': 0.9995318651199341}",positive +semangat transaksi dana gak waswas,5,,"{'label': 'positive', 'score': 0.9999454021453857}",positive +cerita guna dana bikin percaya diri naik level mantap banget,10,,"{'label': 'positive', 'score': 0.9999544620513916}",positive +nyaman pake banget tawar promo voucher dana,7,,"{'label': 'positive', 'score': 0.9998862743377686}",positive +setia pakai dana udah beres selalu,6,,"{'label': 'positive', 'score': 0.9998966455459595}",positive +baca cerita dana bikin hari hari makin senang top banget,10,,"{'label': 'positive', 'score': 0.9999536275863647}",positive +topup dpt cash back promo voucher dana makin suka dana,10,,"{'label': 'positive', 'score': 0.9998507499694824}",positive +aman aja pakai dana big thanks dana,7,,"{'label': 'positive', 'score': 0.8118579983711243}",positive +tau dah mau ketawa apa sedih gegera liat konten mimin,10,,"{'label': 'negative', 'score': 0.9997814297676086}",negative +dana paham banget cara bikin hari makin seru cerita,9,,"{'label': 'positive', 'score': 0.9999428987503052}",positive +hari berkah banget dana promo voucher dana makin seru aja,10,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +aman aja sih saldo gua min,6,,"{'label': 'negative', 'score': 0.9997528195381165}",negative +wow dana mudah gak ribet,5,,"{'label': 'positive', 'score': 0.9999412298202515}",positive +dana cuma bikin transaksi mudah punya cerita seru bikin ter,10,,"{'label': 'positive', 'score': 0.9998756647109985}",positive +ngiler banget liat promo voucher dana baik banget promo vouchernya bikin mau bayar trusss,14,,"{'label': 'negative', 'score': 0.9980694651603699}",negative +kendala dana memang top banget,5,,"{'label': 'positive', 'score': 0.9999499320983887}",positive +udah beres soal saldo min aman gua hehe,8,,"{'label': 'neutral', 'score': 0.5585829019546509}",neutral +kali denger cerita dana bawa semangat baru,7,,"{'label': 'positive', 'score': 0.9999097585678101}",positive +jago promo voucher dana baik,5,,"{'label': 'positive', 'score': 0.9990909099578857}",positive +alhamdulillah pernah masalah dana,4,,"{'label': 'positive', 'score': 0.986071765422821}",positive +dana jadi andal genting,4,,"{'label': 'negative', 'score': 0.9998807907104492}",negative +dana tuh sekadar wallet baik cerita bikin merinding,8,,"{'label': 'negative', 'score': 0.9992662072181702}",negative +transaksi bayar pake dana selalu promo voucher seru,8,,"{'label': 'positive', 'score': 0.9999510049819946}",positive +wow mimin tengah dukun kek,5,,"{'label': 'negative', 'score': 0.999891996383667}",negative +udah beres transaksi pakai dana the best,7,,"{'label': 'positive', 'score': 0.9999406337738037}",positive +cerita dana bikin semangat naik terus seru banget,8,,"{'label': 'positive', 'score': 0.9999576807022095}",positive +gak was was min aset gua dana hehe,8,,"{'label': 'negative', 'score': 0.9995858073234558}",negative +juara banget dana kalau masalah promo voucher makin suka dana dehhh,11,,"{'label': 'positive', 'score': 0.9999086856842041}",positive +gak khawatir pake dana alhamdulillah selalu aman,7,,"{'label': 'positive', 'score': 0.9999428987503052}",positive +gak cuma transaksi dana punya cerita bikin haru mantap,9,,"{'label': 'positive', 'score': 0.9999480247497559}",positive +perna kecewa dgn dana salah alas makin setia pakai dana,10,,"{'label': 'negative', 'score': 0.9999045133590698}",negative +semangat pakai dana selalu top banget,6,,"{'label': 'positive', 'score': 0.9999576807022095}",positive +dengerin cerita pake dana bener bener bikin semangat tinggi,9,,"{'label': 'positive', 'score': 0.999942421913147}",positive +stiap kali pake danna slalu promo voucher keren pokok makin ria pakai dana deh,14,,"{'label': 'positive', 'score': 0.9999182224273682}",positive +dana andal udah masuk cepat,5,,"{'label': 'positive', 'score': 0.9997231364250183}",positive +cerita dana bikin hari makin semangat wow,7,,"{'label': 'positive', 'score': 0.9999327659606934}",positive +paling tau banget dana bikin semangat pake promo voucher dana,10,,"{'label': 'positive', 'score': 0.9999510049819946}",positive +big thanks dana udah beres kendala,6,,"{'label': 'neutral', 'score': 0.9881873726844788}",neutral +dana deals serbu nih banyak diskon mantul breh,8,,"{'label': 'neutral', 'score': 0.9993558526039124}",neutral +diskon dana deals bikin hidup makin mantul terima kasih dana gue makin irit cuy,14,,"{'label': 'positive', 'score': 0.9999393224716187}",positive +voucher diskon dana deals udah langgan bikin aman aman aja belanja,11,,"{'label': 'positive', 'score': 0.9996808767318726}",positive +dana deals tuh andal banget tiap belanja nyari voucher diskon nya,11,,"{'label': 'positive', 'score': 0.9999042749404907}",positive +udah cek dana deals voucher diskon nya aman aja bre,10,,"{'label': 'negative', 'score': 0.6569098234176636}",negative +puji tuhan nemu dana deals voucher diskon lumayan banget cuy,10,,"{'label': 'positive', 'score': 0.9999139308929443}",positive +udah beres belanja bro tinggal pake voucher diskon dana deals doang,11,,"{'label': 'neutral', 'score': 0.9998542070388794}",neutral +voucher diskon dana deals the best banget gak lawan bre,10,,"{'label': 'positive', 'score': 0.9999492168426514}",positive +top banget sih dana deals voucher diskon nya bikin kantong gue aman aja,13,,"{'label': 'positive', 'score': 0.9999426603317261}",positive +gak was was cuy belanja pake voucher diskon dana deals banget,11,,"{'label': 'negative', 'score': 0.9993844032287598}",negative +siap bre voucher diskon dana deals top banget sih andal gue banget,12,,"{'label': 'positive', 'score': 0.9999454021453857}",positive +alhamdulillah cuy dana selalu jadi solusi baik,7,,"{'label': 'positive', 'score': 0.9999109506607056}",positive +gimana akhir balik padahal pernah langgan pernah rasa lakuin transaksi ituu,11,,"{'label': 'negative', 'score': 0.9998829364776611}",negative +bre kalo dana udah aman aman aja,7,,"{'label': 'positive', 'score': 0.9747949838638306}",positive +maju terus dana bro wallet paling baik nih,8,,"{'label': 'positive', 'score': 0.9999130964279175}",positive +sip dah dana selalu bikin semua jadi lancar jaya,9,,"{'label': 'positive', 'score': 0.9999517202377319}",positive +dah buktiin sendiri dana emang mantul banget,7,,"{'label': 'negative', 'score': 0.9969237446784973}",negative +terima kasih dana udah bikin weekend jadi seru parah,9,,"{'label': 'positive', 'score': 0.9999421834945679}",positive +udah nih bre jalan jalan was was mantul,8,,"{'label': 'positive', 'score': 0.9370967745780945}",positive +suka banget nih pake dana wallet baik,7,,"{'label': 'positive', 'score': 0.9999443292617798}",positive +baik banget dah dana selalu aman aman aja nih,9,,"{'label': 'positive', 'score': 0.9999037981033325}",positive +mantap bre dana emang luar biasa selalu lancar jaya,9,,"{'label': 'positive', 'score': 0.9999582767486572}",positive +alhamdulillah cuy semua udah atas berkat dana,7,,"{'label': 'positive', 'score': 0.9998351335525513}",positive +rasa mantap nih seru banget jalan jalan pake dana,9,,"{'label': 'positive', 'score': 0.9999581575393677}",positive +suka dana banget dah nyaman parah pake nya,8,,"{'label': 'positive', 'score': 0.9999381303787231}",positive +mau aktif paylater dana gimna,5,,"{'label': 'neutral', 'score': 0.9998918771743774}",neutral +balas pesan urgent,3,,"{'label': 'negative', 'score': 0.9959853291511536}",negative +sayaaang yaampuun uang tahan,4,,"{'label': 'negative', 'score': 0.8408788442611694}",negative +gak apa apa kak gak balik pihak dana gak jelas,10,,"{'label': 'negative', 'score': 0.9999151229858398}",negative +terima kasih dana bre weekend jadi aman aman aja nih,10,,"{'label': 'positive', 'score': 0.9999438524246216}",positive +mantul banget bro wallet baik udah jalan jalan ribet,9,,"{'label': 'negative', 'score': 0.846388041973114}",negative +siap cuy gue mulai deg degan nih alhamdulillah dana selalu siap bantu,12,,"{'label': 'positive', 'score': 0.9999251365661621}",positive +big thanks bro dana emg gak kendala,7,,"{'label': 'positive', 'score': 0.9616455435752869}",positive +semangat terus dah gue andalanin dana,6,,"{'label': 'positive', 'score': 0.9999396800994873}",positive +iyaa malah makin belibet minta data bukti,7,,"{'label': 'negative', 'score': 0.9994064569473267}",negative +lohh dibalikin kakk,3,,"{'label': 'negative', 'score': 0.99988853931427}",negative +aku tagih uang akhirat makasih,5,,"{'label': 'negative', 'score': 0.999468982219696}",negative +dana balikin,2,,"{'label': 'negative', 'score': 0.9996114373207092}",negative +min qrisnya udh dipake lewat kasir kok blm cetak,9,,"{'label': 'negative', 'score': 0.9631822109222412}",negative +knp dah emg minimal saldo dana bisnisny hrs brp pgn tarik,11,,"{'label': 'neutral', 'score': 0.9996916055679321}",neutral +hallo aku salah kirim saldo kira kira balik,8,,"{'label': 'neutral', 'score': 0.9998860359191895}",neutral +xcb babdc fbb,3,,"{'label': 'neutral', 'score': 0.9995996356010437}",neutral +kocak geming,2,,"{'label': 'positive', 'score': 0.9999146461486816}",positive +akun bahkan gak centang biru kayak pikir gua anak kecil bodoh bodoh,12,,"{'label': 'negative', 'score': 0.999903678894043}",negative +akun bahkan gak ceklistnya kayak pikir gua anak kecil bodoh bodoh,11,,"{'label': 'negative', 'score': 0.9999184608459473}",negative +dong dana selalu verifikasi wajah gagal mulu padahal wajah loh,10,,"{'label': 'negative', 'score': 0.9999092817306519}",negative +hallo kak hubung email gaada jawab mau tanya perihal transfer bank hasil dana nya masuk,15,,"{'label': 'neutral', 'score': 0.9998455047607422}",neutral +hallo kak,2,,"{'label': 'neutral', 'score': 0.9998433589935303}",neutral +hallo kak hubung email respon mau tanya tranksaksi nomil bank bca hasil dana masuk,14,,"{'label': 'neutral', 'score': 0.9998987913131714}",neutral +sus baru install udah cek nyata nge hack aplikasi nya langsung klo org mgkin apa memang sistem dana nya banyak bolong nya,22,,"{'label': 'negative', 'score': 0.9999144077301025}",negative +kemanain min duit emoney udha komplain berapa kali udah nunggu gada balas,12,,"{'label': 'negative', 'score': 0.999849796295166}",negative +woi anjing system busy sampe kapan dana anjing email respon chat bot jls jawab udah bulan akun dana kaya gin mana saldo juta babi bngt lah dana,27,,"{'label': 'negative', 'score': 0.9999176263809204}",negative +cuy cek ulang biar aman aja jangan sampe kena phishing,10,,"{'label': 'negative', 'score': 0.9991263747215271}",negative +dah aman cuy rajin cek ulang gara gara dana,9,,"{'label': 'neutral', 'score': 0.9998383522033691}",neutral +gue demen banget nih fitur tagih lengkap pol,8,,"{'label': 'positive', 'score': 0.9637435674667358}",positive +phishing emang ngeselin cuy makanya cek ulang biar aman aja,10,,"{'label': 'negative', 'score': 0.9998867511749268}",negative +nyaman banget sih bayar apa aja tinggal klik doang,9,,"{'label': 'positive', 'score': 0.9993245601654053}",positive +terima kasih dana udah bikin gue makin hati hati cek ulang,11,,"{'label': 'positive', 'score': 0.9997456669807434}",positive +kabel udah pernah telat nih bre,6,,"{'label': 'negative', 'score': 0.999895453453064}",negative +error mau verif gagal terus min,6,,"{'label': 'negative', 'score': 0.9998757839202881}",negative +love jadi pernah tau kalo nipu,6,,"{'label': 'negative', 'score': 0.9860327839851379}",negative +knp menu dana cicil apk dana sdh update aplikasi ttp,10,,"{'label': 'neutral', 'score': 0.9998844861984253}",neutral +top banget konten edukasi jelas,5,,"{'label': 'positive', 'score': 0.9966772794723511}",positive +suka dana selalu peduli user,5,,"{'label': 'positive', 'score': 0.9993976354598999}",positive +aman aman aja berkat edukasi,5,,"{'label': 'positive', 'score': 0.9999061822891235}",positive +terima kasih dana udah ingetin,5,,"{'label': 'positive', 'score': 0.9990262985229492}",positive +mantap banget dapet edukasi gin,5,,"{'label': 'positive', 'score': 0.9999550580978394}",positive +big thanks info bikin tenang,5,,"{'label': 'positive', 'score': 0.9999498128890991}",positive +aman hindar link phising,4,,"{'label': 'negative', 'score': 0.9998321533203125}",negative +suka bgt gak was was,5,,"{'label': 'positive', 'score': 0.9999420642852783}",positive +gak khawatir deh mantap,4,,"{'label': 'positive', 'score': 0.9999591112136841}",positive +gak heran klo edukasi baik dana,6,,"{'label': 'positive', 'score': 0.9987990856170654}",positive +aku sngat senang skali dgn dana mantul,7,,"{'label': 'positive', 'score': 0.9999498128890991}",positive +biar krban share mantap,4,,"{'label': 'positive', 'score': 0.9999548196792603}",positive +maju terus dana utk ngsh edukasi,6,,"{'label': 'positive', 'score': 0.9998816251754761}",positive +keren baik dana,3,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +aku bntu share nih edukasi,5,,"{'label': 'neutral', 'score': 0.9975040555000305}",neutral +wajib tau mantap,3,,"{'label': 'positive', 'score': 0.9999583959579468}",positive +alhamdulillah syukur stlah tau,4,,"{'label': 'positive', 'score': 0.9999125003814697}",positive +slalu andal utk kta,4,,"{'label': 'positive', 'score': 0.999908447265625}",positive +top banget dana edukasi,4,,"{'label': 'positive', 'score': 0.9999531507492065}",positive +brkat dana kta aman bgt,5,,"{'label': 'positive', 'score': 0.9999396800994873}",positive +makin canggih makin gampang big thanks dana,7,,"{'label': 'positive', 'score': 0.6917950510978699}",positive +andal bgt dana buat semua pembyaran,6,,"{'label': 'positive', 'score': 0.9999104738235474}",positive +tagih kendala fitur dana,4,,"{'label': 'negative', 'score': 0.9966644644737244}",negative +apa tagih kan bsa pke dana aman,7,,"{'label': 'negative', 'score': 0.9792937636375427}",negative +buat hdupku aman aman aja,5,,"{'label': 'positive', 'score': 0.9998699426651001}",positive +big thanks dana taghan air beres kejap,7,,"{'label': 'neutral', 'score': 0.9991756081581116}",neutral +sngat sngat luar biasa skali dana,6,,"{'label': 'positive', 'score': 0.9997581839561462}",positive +worth utk byar tagih pke dana mantul,7,,"{'label': 'positive', 'score': 0.9987024068832397}",positive +baik pkai fitur tagih,4,,"{'label': 'neutral', 'score': 0.9940556287765503}",neutral +fitur tagih sngat membntu,4,,"{'label': 'negative', 'score': 0.9893506169319153}",negative +pahlawan utk ursan tagih dana,5,,"{'label': 'neutral', 'score': 0.9979281425476074}",neutral +aman bgt pke dana alhamdulillah,5,,"{'label': 'positive', 'score': 0.9999229907989502}",positive +dana bkin taghan aman,4,,"{'label': 'negative', 'score': 0.5312696099281311}",negative +hitung detik byar taghan via dana the best,8,,"{'label': 'neutral', 'score': 0.9997249245643616}",neutral +dana solusi cepet byar taghan mantap,6,,"{'label': 'positive', 'score': 0.9999518394470215}",positive +app aja semua taghan beres makasih dana,7,,"{'label': 'neutral', 'score': 0.9237513542175293}",neutral +antri taghan air via dana mantul,6,,"{'label': 'neutral', 'score': 0.9998676776885986}",neutral +taghan air listrik gampang bgt via dana mantap,8,,"{'label': 'positive', 'score': 0.9999313354492188}",positive +dana selamat bgt luar biasa,5,,"{'label': 'positive', 'score': 0.9999431371688843}",positive +baru kali byar taghan mudah bigt thanks dana,8,,"{'label': 'neutral', 'score': 0.9995236396789551}",neutral +taghan beres cepet semua krn dana mantap,7,,"{'label': 'positive', 'score': 0.9999496936798096}",positive +makasih dana taghan beban rumah mantap,6,,"{'label': 'positive', 'score': 0.9999462366104126}",positive +suka bgt pake dana semua taghan udah beres,8,,"{'label': 'positive', 'score': 0.9999433755874634}",positive +dana bkin praktis luar biasa,5,,"{'label': 'positive', 'score': 0.9999382495880127}",positive +byar taghan masalah dana siap bantu banget,7,,"{'label': 'neutral', 'score': 0.5042237043380737}",neutral +dana cara cerdas urus taghan repot amp,7,,"{'label': 'negative', 'score': 0.9498351812362671}",negative +kendala,1,,"{'label': 'negative', 'score': 0.999886155128479}",negative +terima kasih dana udah mudah urus taghan,7,,"{'label': 'positive', 'score': 0.9998651742935181}",positive +taghan cukup pakai dana cepet amp,6,,"{'label': 'negative', 'score': 0.9988403916358948}",negative +perlu antri dana bkin semua mudah,6,,"{'label': 'positive', 'score': 0.9998586177825928}",positive +dana mudahin hidup nyaman,4,,"{'label': 'positive', 'score': 0.9999128580093384}",positive +byar taghan ribet dana juara khawatir,6,,"{'label': 'negative', 'score': 0.999900221824646}",negative +dana solusi cepet buat semua taghan baik,7,,"{'label': 'positive', 'score': 0.9999442100524902}",positive +mudah byar taghan via dana luv the best,8,,"{'label': 'positive', 'score': 0.9997965693473816}",positive +big thanks dana byar taghan skrg stres,7,,"{'label': 'negative', 'score': 0.9997888207435608}",negative +dana bkin hidup praktis byar taghan cepet amp,8,,"{'label': 'negative', 'score': 0.9987842440605164}",negative +byar taghan mudah pke dana bantu bgt,7,,"{'label': 'positive', 'score': 0.997980535030365}",positive +gmna min,2,,"{'label': 'negative', 'score': 0.9993366599082947}",negative +wajib panjang umur cie pernah nimbrung sama zauzy fikhacumlaudegolf kha apadah cewe matre sekarang mah sistem izin entut,18,,"{'label': 'negative', 'score': 0.9998239874839783}",negative +semangat klo liat konten edukatif gni,6,,"{'label': 'positive', 'score': 0.9999359846115112}",positive +maju terus dana edukasi digital keren,6,,"{'label': 'positive', 'score': 0.9999507665634155}",positive +terima kasih dana kasih cerah,5,,"{'label': 'positive', 'score': 0.9999383687973022}",positive +suka dana deh slalu kasih edukais,6,,"{'label': 'positive', 'score': 0.9999319314956665}",positive +wow baru tau modus kek gin makasih min,8,,"{'label': 'negative', 'score': 0.9996458292007446}",negative +promo tpi edukasi gin penting bgt,6,,"{'label': 'positive', 'score': 0.9997648596763611}",positive +top banget info penting nih,5,,"{'label': 'positive', 'score': 0.9998500347137451}",positive +setia pakai dana kana aman dana slalu update,8,,"{'label': 'positive', 'score': 0.9998387098312378}",positive +mantap edukasi min mkin hati,5,,"{'label': 'positive', 'score': 0.9999446868896484}",positive +slalu semangat min edukasi,4,,"{'label': 'positive', 'score': 0.9999420642852783}",positive +udah bedain mana link asli sama palsu,7,,"{'label': 'negative', 'score': 0.9998950958251953}",negative +gak was was dah tau cara lindungin akun,8,,"{'label': 'negative', 'score': 0.9988877177238464}",negative +alhamdulillah makin ngerti soal phising,5,,"{'label': 'negative', 'score': 0.8745073080062866}",negative +lancar jaya trus edukasi min,5,,"{'label': 'positive', 'score': 0.9999033212661743}",positive +udah beres cek konten paham,5,,"{'label': 'neutral', 'score': 0.9990729093551636}",neutral +aman aja sih asal sebar dana diri,7,,"{'label': 'negative', 'score': 0.9998196959495544}",negative +data diri baik baik aja akun aman aja,8,,"{'label': 'negative', 'score': 0.9994294047355652}",negative +dpet tips amp,3,,"{'label': 'negative', 'score': 0.8782979846000671}",negative +seru beneran mantap edukasi dana tuh,6,,"{'label': 'positive', 'score': 0.9999493360519409}",positive +manfaat bgt big thanks dana kuuu,6,,"{'label': 'positive', 'score': 0.999947190284729}",positive +kalem min kendala mah sama modus begini,7,,"{'label': 'negative', 'score': 0.9998888969421387}",negative +tips bkin nyaman buat jaga akun nih,7,,"{'label': 'positive', 'score': 0.9999009370803833}",positive +maju terus dana fitur baik,5,,"{'label': 'positive', 'score': 0.9998224377632141}",positive +kapan bayar tagih pake dana luar biasa gampang,8,,"{'label': 'neutral', 'score': 0.7238622307777405}",neutral +fitur dana emang mantap,4,,"{'label': 'positive', 'score': 0.9999566078186035}",positive +sih fitur mantul banget,4,,"{'label': 'positive', 'score': 0.9999418258666992}",positive +dana baik soal teransaksi mantap,5,,"{'label': 'positive', 'score': 0.9999449253082275}",positive +keren fiturnya seru bet dah bayar tagih simpel,8,,"{'label': 'positive', 'score': 0.9999526739120483}",positive +alhamdulillah fitur tagih dana bantu,5,,"{'label': 'neutral', 'score': 0.9975029826164246}",neutral +selalu memdudahkan guna emang wallet baik,6,,"{'label': 'positive', 'score': 0.9995514750480652}",positive +bayar tagih simpel banget terima kasih dana,7,,"{'label': 'positive', 'score': 0.9997089505195618}",positive +jadi lancar jayabayar,3,,"{'label': 'positive', 'score': 0.9999513626098633}",positive +bayar aman aman aja mantap dana,6,,"{'label': 'positive', 'score': 0.9999426603317261}",positive +tagiahan baik baik aja berkat dana,6,,"{'label': 'positive', 'score': 0.9997586607933044}",positive +gak nyesel pilih dana fitur tagih canggih,7,,"{'label': 'positive', 'score': 0.9998880624771118}",positive +berkat firur dana gua gak was was lgi buat bayar tagih,11,,"{'label': 'negative', 'score': 0.9956225752830505}",negative +kejar setor pake dana mantap,5,,"{'label': 'positive', 'score': 0.9999501705169678}",positive +jadi gak khawatir telat bayar tagih hihihi,7,,"{'label': 'positive', 'score': 0.9998138546943665}",positive +cara kenya mudah banget setor top banget min,8,,"{'label': 'positive', 'score': 0.9999514818191528}",positive +big thanks dana mudah urus taghan,6,,"{'label': 'positive', 'score': 0.9996613264083862}",positive +aman aja cuyyy ngaruh modus gituan ama,7,,"{'label': 'negative', 'score': 0.9998960494995117}",negative +udah masuk otak min biar waspada,6,,"{'label': 'negative', 'score': 0.9975563287734985}",negative +keren min mantap simpel,4,,"{'label': 'positive', 'score': 0.9999556541442871}",positive +fiturnya bikin guna nyaman,4,,"{'label': 'positive', 'score': 0.9999517202377319}",positive +emoney gatau masuk siapa dana tanggung jawab sama sekali telpon cuma blg nunggu chat gada balas gabisa denger komplain cust,20,,"{'label': 'negative', 'score': 0.9999008178710938}",negative +bukan maen dana selalu upgrade fitur,6,,"{'label': 'neutral', 'score': 0.9966092109680176}",neutral +selalu aman aja pake fitur canggih dana,7,,"{'label': 'positive', 'score': 0.9786666631698608}",positive +gue udah beres soal tagih hehe,6,,"{'label': 'positive', 'score': 0.9947052597999573}",positive +dana jadi andal gua buat bayar apa,7,,"{'label': 'positive', 'score': 0.9997884631156921}",positive +wow canggih bener dah dana sekarang,6,,"{'label': 'positive', 'score': 0.9970207810401917}",positive +sih top banget fitur tagih,5,,"{'label': 'positive', 'score': 0.7245469689369202}",positive +makasih min info,3,,"{'label': 'positive', 'score': 0.7829440236091614}",positive +tagih gua jadi lancar jaya nih klo begini,8,,"{'label': 'positive', 'score': 0.9999521970748901}",positive +jadi mudah setor tagihannnya,4,,"{'label': 'positive', 'score': 0.9999216794967651}",positive +dana terus update soal fitur mantul dah,7,,"{'label': 'neutral', 'score': 0.9998527765274048}",neutral +mantap nih buat setor,4,,"{'label': 'positive', 'score': 0.9999533891677856}",positive +the best fitur tagih,4,,"{'label': 'positive', 'score': 0.9251279830932617}",positive +udah masuk fiturnya keren bgt,5,,"{'label': 'positive', 'score': 0.9999569654464722}",positive +baru wallet,2,,"{'label': 'neutral', 'score': 0.7060885429382324}",neutral +gak rempong antri nih soal setor dana emang baik,9,,"{'label': 'positive', 'score': 0.9998733997344971}",positive +simpel buat bayar tagih the best pokok,7,,"{'label': 'positive', 'score': 0.9999425411224365}",positive +gak ribet urus kantor mantap,5,,"{'label': 'positive', 'score': 0.9999569654464722}",positive +the best dah ingeti terus,5,,"{'label': 'positive', 'score': 0.9999431371688843}",positive +luar biasa min fiturnya,4,,"{'label': 'positive', 'score': 0.9999067783355713}",positive +bayar tagih rebah nih wkwk,5,,"{'label': 'negative', 'score': 0.9998482465744019}",negative +semua dana emang mantap,4,,"{'label': 'positive', 'score': 0.9999549388885498}",positive +dana emang aplikasi ter mantul,5,,"{'label': 'positive', 'score': 0.9999228715896606}",positive +jadi gak telat lgi nih byr tagih skrg big thanks dana,11,,"{'label': 'positive', 'score': 0.999523401260376}",positive +cek ulang kali mantul konten min,6,,"{'label': 'neutral', 'score': 0.9998891353607178}",neutral +dana jago fitur mudah mantul dana,6,,"{'label': 'positive', 'score': 0.9986013770103455}",positive +teransaksi bayar kendala mantap min,5,,"{'label': 'positive', 'score': 0.9999179840087891}",positive +lama bayar tagih lewat dana pernah masalah,7,,"{'label': 'negative', 'score': 0.9996113181114197}",negative +makin semangat pake dana klo fiturnya kek gin,8,,"{'label': 'positive', 'score': 0.9998853206634521}",positive +big thanks dana alway kasih tips amp,7,,"{'label': 'positive', 'score': 0.9985979199409485}",positive +tipu kamu,2,,"{'label': 'negative', 'score': 0.9999176263809204}",negative +bre selalu cek ulang biar aman mantul banget dah,9,,"{'label': 'positive', 'score': 0.9998843669891357}",positive +suka dana makin lengkap cuy makin nyaman hidup,8,,"{'label': 'positive', 'score': 0.9999516010284424}",positive +bro jangan lupa cek ulang biar aman phishing sip,9,,"{'label': 'neutral', 'score': 0.9995673298835754}",neutral +luar biasa sih dana sekarang urus tilang,7,,"{'label': 'negative', 'score': 0.9999141693115234}",negative +support support pepek karna support support elu kmren gua rugi anjing,11,,"{'label': 'negative', 'score': 0.9999058246612549}",negative +hai kakak sini bantu sila kirim tanya kendala whatsapp respons segera galang,12,,"{'label': 'neutral', 'score': 0.9999023675918579}",neutral +please cek bamtu aki,4,,"{'label': 'neutral', 'score': 0.9998762607574463}",neutral +hati hati cuy jangan sampe kena phishing cek ulang mulu dah,11,,"{'label': 'negative', 'score': 0.9997639060020447}",negative +nyaman banget dah kalo udah cek ulang biar aman cuy,10,,"{'label': 'positive', 'score': 0.9999372959136963}",positive +bayar tagih apa aja tinggal duduk manis bre,8,,"{'label': 'negative', 'score': 0.9983816146850586}",negative +aman aman aja bro asal rajin cek ulang biar aman terus,11,,"{'label': 'neutral', 'score': 0.8903763890266418}",neutral +baik baik aja kok udah cek ulang phishing bre,9,,"{'label': 'negative', 'score': 0.9977465271949768}",negative +tilang bayar cuy setia pakai dana,6,,"{'label': 'neutral', 'score': 0.9996084570884705}",neutral +udah cek ulang nih biar aman mantap banget cuy,9,,"{'label': 'positive', 'score': 0.9999474287033081}",positive +gak was was sih kalo udah rajin cek ulang bro,10,,"{'label': 'negative', 'score': 0.9992672801017761}",negative +gak khawatir deh bayar pajak kendara,6,,"{'label': 'positive', 'score': 0.9998010993003845}",positive +semangat bre jaman sekarang wajib cek ulang biar gak jadi korban phishing,12,,"{'label': 'negative', 'score': 0.9978600144386292}",negative +big thanks info jadi makin hati hati nih bre,9,,"{'label': 'positive', 'score': 0.9999432563781738}",positive +internet sama kabel beres pake dana bro,7,,"{'label': 'negative', 'score': 0.6013718843460083}",negative +sip bre selalu cek ulang klik link biar aman,9,,"{'label': 'neutral', 'score': 0.9998835325241089}",neutral +puji tuhan sampe sekarang pernah masalah cuy,7,,"{'label': 'positive', 'score': 0.9723250269889832}",positive +bayar air tinggal klik doang cuy aman aja,8,,"{'label': 'negative', 'score': 0.9996379613876343}",negative +big thanks bre dana emg andal banget,7,,"{'label': 'positive', 'score': 0.9999219179153442}",positive +wallet baik nih udah cek ulang aman aman aja cuy,10,,"{'label': 'neutral', 'score': 0.9967983365058899}",neutral +maju terus dana biar makin hati hati cek ulang tiap,10,,"{'label': 'neutral', 'score': 0.9983661770820618}",neutral +suka dana banget dah selalu peduli biar aman phishing,9,,"{'label': 'positive', 'score': 0.9997236132621765}",positive +alhamdulillah gue udah cek ulang biar aman mantul,8,,"{'label': 'positive', 'score': 0.7179418206214905}",positive +luar biasa bro dana ngajarin cek ulang terus biar aman,10,,"{'label': 'neutral', 'score': 0.999487042427063}",neutral +mantap bre gue jadi makin hati hati cek ulang tiap transaksi,11,,"{'label': 'positive', 'score': 0.9999405145645142}",positive +top banget dah dana bikin hidup mudah gak ribet,9,,"{'label': 'positive', 'score': 0.9999533891677856}",positive +semangat cuy jangan sampe lengah cek ulang tiap transaksi,9,,"{'label': 'positive', 'score': 0.7031083703041077}",positive +mantul banget bre info cek ulang biar aman makasih dana,10,,"{'label': 'positive', 'score': 0.9989069700241089}",positive +baik sih dana selalu ngajarin cek ulang biar aman cuy,10,,"{'label': 'neutral', 'score': 0.9998218417167664}",neutral +sip bre info kayak gin sering bagi biar makin hati hati,11,,"{'label': 'neutral', 'score': 0.9851562976837158}",neutral +wow bre teknik tipu sekarang gila sih wajib cek ulang,10,,"{'label': 'negative', 'score': 0.9999130964279175}",negative +seru sih ajar hati hati phishing bareng dana,8,,"{'label': 'positive', 'score': 0.99989914894104}",positive +terima kasih dana udah ingetin soal phishing hati hati dah bro,11,,"{'label': 'positive', 'score': 0.9316431283950806}",positive +aman aja asal hati hati rajin cek ulang cuy,9,,"{'label': 'neutral', 'score': 0.679042398929596}",neutral +hati hati bre jangan asal klik link cek ulang dulu biar aman aja,13,,"{'label': 'negative', 'score': 0.8968586921691895}",negative +sih setia pakai dana mudah aman aja,7,,"{'label': 'positive', 'score': 0.9910932183265686}",positive +gak khawatir sih asal cek ulang terus pas transaksi bre,10,,"{'label': 'positive', 'score': 0.9414501786231995}",positive +setia pakai dana soal gak pernah kendala dah,8,,"{'label': 'positive', 'score': 0.9994919300079346}",positive +big thanks info bre bikin waspada soal phishing,8,,"{'label': 'neutral', 'score': 0.9660133719444275}",neutral +cek ulang biar aman aja bro jangan gampang giur tawar palsu cuy,12,,"{'label': 'negative', 'score': 0.9997933506965637}",negative +aman aja asal selalu hati hati cek ulang bro,9,,"{'label': 'neutral', 'score': 0.9333383440971375}",neutral +top banget dah dana emang andal gak bikin gue was was,11,,"{'label': 'positive', 'score': 0.999404788017273}",positive +the best banget deh dana gak pernah kendala cuy,9,,"{'label': 'positive', 'score': 0.9999557733535767}",positive +wow teknik phishing makin canggih jadi makin rajin cek ulang dah,11,,"{'label': 'positive', 'score': 0.950597882270813}",positive +wow gak nyangka sih phishing jahat cek ulang penting banget,10,,"{'label': 'negative', 'score': 0.99967360496521}",negative +wah gue udah biasa cek ulang biar aman bro biar gak kena phishing,13,,"{'label': 'neutral', 'score': 0.943983256816864}",neutral +atas dgn dana selalu aman kalau sama dana perlu tkt,10,,"{'label': 'positive', 'score': 0.9999164342880249}",positive +raih semangat transaksi baik dana jadi nyaman,7,,"{'label': 'positive', 'score': 0.9999465942382812}",positive +lapor segera tipu curiga transaksi aman nyaman selalu,8,,"{'label': 'negative', 'score': 0.9998701810836792}",negative +transaksi ribet semangat selalu dana,5,,"{'label': 'positive', 'score': 0.9999251365661621}",positive +user selalu buat nyaman dgn aman dana dgn tips belikan dana selalu peduli,13,,"{'label': 'positive', 'score': 0.9997817873954773}",positive +transaksi jadi makin semangat dana,5,,"{'label': 'positive', 'score': 0.9999562501907349}",positive +dana contoh ewallet baik masa kini selalu buat usernya aman,10,,"{'label': 'positive', 'score': 0.999079704284668}",positive +tambah semangat kali transaksi dana,5,,"{'label': 'positive', 'score': 0.9999504089355469}",positive +liat tips belikan dana hindar segala cara tipu rugi selalu suka dana,12,,"{'label': 'negative', 'score': 0.9991901516914368}",negative +semangat transaksi habis,3,,"{'label': 'positive', 'score': 0.9999454021453857}",positive +ingat jgn slh pilih cuma dana jdi andal aman transaksi,10,,"{'label': 'positive', 'score': 0.8892795443534851}",positive +semangat kobar transaksi dana,4,,"{'label': 'neutral', 'score': 0.9644536972045898}",neutral +tips dana selalu ngena banget mantap banget bantu,8,,"{'label': 'positive', 'score': 0.9999556541442871}",positive +gairah transaksi tingkat dana let dana mantap,7,,"{'label': 'positive', 'score': 0.9999421834945679}",positive +layan baik keamananya baik dana,5,,"{'label': 'positive', 'score': 0.9941887855529785}",positive +dapat semangat baru transaksi dana,5,,"{'label': 'positive', 'score': 0.9999527931213379}",positive +andal mah perna bikin susa cinta beri baik,8,,"{'label': 'positive', 'score': 0.998440682888031}",positive +dana semangat transaksi selalu jaga,5,,"{'label': 'positive', 'score': 0.9999178647994995}",positive +jgn tipu dgn jebak tipu selalu waspada lama pake dana aman aja perna knp knp,15,,"{'label': 'negative', 'score': 0.999819815158844}",negative +hidup semangat transaksi kamu dana,5,,"{'label': 'positive', 'score': 0.9999234676361084}",positive +pasti jgn sampe tipu dgn oknum dana asli embel embel terima kasih dana,13,,"{'label': 'negative', 'score': 0.9997816681861877}",negative +semangat transaksi makin puncak dana,5,,"{'label': 'positive', 'score': 0.9996793270111084}",positive +selalu hati hati transaksi era sekarang buat tipu kaya terima kasih dana tips nya,14,,"{'label': 'negative', 'score': 0.9994180202484131}",negative +saat tenaga transaksi dana,4,,"{'label': 'neutral', 'score': 0.9998052716255188}",neutral +sigap naggapi tipu dana luar biasa suda sigap tolong,9,,"{'label': 'negative', 'score': 0.9995860457420349}",negative +siap transaksi penuh semangat sama dana,6,,"{'label': 'positive', 'score': 0.9999433755874634}",positive +era digital memang keri dana punya solusi baik lewat tips nya,11,,"{'label': 'positive', 'score': 0.9973207116127014}",positive +transaksi jadi senang semangat dana,5,,"{'label': 'positive', 'score': 0.9999526739120483}",positive +aku cinta dana kau tau memang the best banget dana,10,,"{'label': 'positive', 'score': 0.999954104423523}",positive +jangan pernah hilang semangat transaksi dana,6,,"{'label': 'negative', 'score': 0.8395715951919556}",negative +semangat trus dana kasih tips cara hindar tipu tipu,9,,"{'label': 'positive', 'score': 0.9867479801177979}",positive +semangat tinggi transaksi mudah dana,5,,"{'label': 'positive', 'score': 0.9999301433563232}",positive +jamin aman selalu aman berkat tips luar biasa dana,9,,"{'label': 'positive', 'score': 0.9995355606079102}",positive +hari hari asa ringan dana transaksi jadi semangat,8,,"{'label': 'positive', 'score': 0.9999419450759888}",positive +dgn tips dana jdi legah gampang kena tipu memang luar biasa banget,12,,"{'label': 'negative', 'score': 0.7635920643806458}",negative +dana bikin transaksi jadi alam seru penuh semangat,8,,"{'label': 'positive', 'score': 0.9999575614929199}",positive +dana tuh cuma anda buat transksi tpi tips nya aman luar biasa,12,,"{'label': 'positive', 'score': 0.9998816251754761}",positive +mulai hari transaksi mudah pakai dana rasa semangat,8,,"{'label': 'positive', 'score': 0.9998441934585571}",positive +asiknya pake dana aman dpt nyaman praktis dpt,8,,"{'label': 'positive', 'score': 0.9999411106109619}",positive +semangat pagi tambah transaksi mudah dana hari sempurna,8,,"{'label': 'positive', 'score': 0.999946117401123}",positive +pake dana jadi aman nyaman dpt tips luar biasa,9,,"{'label': 'positive', 'score': 0.9999434947967529}",positive +transaksi dana bawa semangat baru jalan hari,7,,"{'label': 'positive', 'score': 0.9999417066574097}",positive +tips buat jaga jaga tipu tuh mantap banget,8,,"{'label': 'positive', 'score': 0.9999533891677856}",positive +transaksi cepat semangat tingkat terima kasih dana,7,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +cuma nyaman transaksi tips nya bikin aman,7,,"{'label': 'positive', 'score': 0.999927282333374}",positive +dana transaksi jadi sumber semangat baru,6,,"{'label': 'positive', 'score': 0.9999452829360962}",positive +keren banget tips nya dana buat lindung tipu bikin aman nyaman deh,12,,"{'label': 'positive', 'score': 0.9999567270278931}",positive +transaksi pakai dana bikin hari makin cerah,7,,"{'label': 'positive', 'score': 0.9999513626098633}",positive +tips nya luar biasa banget emang paham banget sih dana mah,11,,"{'label': 'positive', 'score': 0.9998965263366699}",positive +nikmat mudah transaksi dana rasa semangat,6,,"{'label': 'positive', 'score': 0.999955415725708}",positive +luar biasa banget tips dana jdi makin tenang deh,9,,"{'label': 'positive', 'score': 0.9999585151672363}",positive +dana transaksi jadi asyik penuh semangat,6,,"{'label': 'positive', 'score': 0.9999592304229736}",positive +suka banget tips ewallet baik emang dana selalu hati,9,,"{'label': 'positive', 'score': 0.9999418258666992}",positive +dana transaksi asa dorong semangat hari baik,7,,"{'label': 'positive', 'score': 0.9990667700767517}",positive +tips hindar jebak tipu gokil banget ewallet baik emang juara,10,,"{'label': 'positive', 'score': 0.9997678399085999}",positive +transaksi lancar dana bikin semangat hari makin top,8,,"{'label': 'positive', 'score': 0.9999568462371826}",positive +dana ewallet baik jauh,4,,"{'label': 'negative', 'score': 0.9998794794082642}",negative +semangat transaksi dana langkah mudah cepat,6,,"{'label': 'positive', 'score': 0.9999449253082275}",positive +ngerasa aman pakai dana tips juara emang ewallet baik banget,10,,"{'label': 'positive', 'score': 0.9999313354492188}",positive +bangun pagi semangat baru transaksi jadi seru dana,8,,"{'label': 'positive', 'score': 0.9999576807022095}",positive +tips dana memang bikin tenang ewallet baik memang beda men,10,,"{'label': 'positive', 'score': 0.9998961687088013}",positive +klik transaksi dana semangat baru datang,6,,"{'label': 'neutral', 'score': 0.9997084736824036}",neutral +terima kasih dana buat tips keren,6,,"{'label': 'positive', 'score': 0.9999485015869141}",positive +transaksi dana bikin semangat pagi makin kobar,7,,"{'label': 'positive', 'score': 0.9677470922470093}",positive +slh jdikan dana andal dana selalu kasih baik,8,,"{'label': 'positive', 'score': 0.9997250437736511}",positive +mulai hari semangat transaksi dana jadi mudah senang,8,,"{'label': 'positive', 'score': 0.9999527931213379}",positive +dana emang ewallet baik tips nya selalu manjur banget,9,,"{'label': 'positive', 'score': 0.9999359846115112}",positive +dapat semangat baru kali transaksi dana ayo mulai hari,9,,"{'label': 'positive', 'score': 0.9999251365661621}",positive +serius tips mantul banget,4,,"{'label': 'positive', 'score': 0.9999427795410156}",positive +siap hadap hari energi baru transaksi gampang pakai dana,9,,"{'label': 'positive', 'score': 0.9810571670532227}",positive +makas tips nya dana ewallet baik memang perna mengecewain,9,,"{'label': 'positive', 'score': 0.9872893691062927}",positive +transaksi dana bikin hari lancar jaya,6,,"{'label': 'positive', 'score': 0.999955415725708}",positive +rasa aman deh berkat dana big thanks dana,8,,"{'label': 'positive', 'score': 0.9999455213546753}",positive +transaksi dana atas perlu repot keluar rumah,7,,"{'label': 'neutral', 'score': 0.9982342720031738}",neutral +bener bener works banget tips dana mantul dah poko,9,,"{'label': 'positive', 'score': 0.9999376535415649}",positive +alhamdulillah dana bikin transaksi gak pake ribet sama sekali,9,,"{'label': 'positive', 'score': 0.9998840093612671}",positive +slmt tinggal jebak tipu terima kasih dana,7,,"{'label': 'negative', 'score': 0.9999172687530518}",negative +suka dana transaksi jadi cepat gak ribet,7,,"{'label': 'positive', 'score': 0.999951958656311}",positive +kata way tipu big thanks dana,6,,"{'label': 'negative', 'score': 0.9998311996459961}",negative +aman aman aja transaksi dana bikin hati tenang,8,,"{'label': 'positive', 'score': 0.9999445676803589}",positive +cara hindar jbkn tipu dana tuh emang top banget,9,,"{'label': 'positive', 'score': 0.9998490810394287}",positive +transaksi dana lancar jaya gua puas banget,7,,"{'label': 'positive', 'score': 0.999954342842102}",positive +beneran guna banget tips dana memang andal,7,,"{'label': 'positive', 'score': 0.9998832941055298}",positive +maju terus dana transaksi aplikasi kalian bikin hidup gampang,9,,"{'label': 'positive', 'score': 0.9998522996902466}",positive +dana mantul banget buat gua tau trik tipu online,9,,"{'label': 'positive', 'score': 0.999404788017273}",positive +gak perlu antri transaksi dana praktis banget,7,,"{'label': 'positive', 'score': 0.9999444484710693}",positive +asa aman aja tiap kali transakasi online karna tips dana,10,,"{'label': 'positive', 'score': 0.9948692321777344}",positive +mantap transaksi dana gampang gak kendala,6,,"{'label': 'positive', 'score': 0.9999384880065918}",positive +selalu ikut saran dana dgn tips mantul,7,,"{'label': 'positive', 'score': 0.9789009094238281}",positive +gua neng banget transaksi dana aman aman aja,8,,"{'label': 'positive', 'score': 0.9998632669448853}",positive +cara dana memang baik hindar tipu online,7,,"{'label': 'negative', 'score': 0.9996297359466553}",negative +luar biasa dana bikin transaksi jadi simpel,7,,"{'label': 'positive', 'score': 0.9999517202377319}",positive +tips dana buat gua percaya diri tkt tipu pokok dana baik deh,12,,"{'label': 'positive', 'score': 0.9998923540115356}",positive +terima kasih dana transaksi jadi mudah tinggal klik,8,,"{'label': 'positive', 'score': 0.9998144507408142}",positive +berkat tips dana aku aman aja deh transaksi,8,,"{'label': 'positive', 'score': 0.9999325275421143}",positive +nyaman banget transaksi dana gak perlu repot kantor pajak,9,,"{'label': 'positive', 'score': 0.9999415874481201}",positive +mantap banget dana tipsnya buat hindar tipu online,8,,"{'label': 'positive', 'score': 0.9999392032623291}",positive +alhamdulillah dana bikin transaksi jadi mudah praktis,7,,"{'label': 'positive', 'score': 0.9999532699584961}",positive +gak khawatir deh sama tipu berkat dana,7,,"{'label': 'positive', 'score': 0.9169541001319885}",positive +suka transaksi dana lancar jaya banget,6,,"{'label': 'positive', 'score': 0.999955415725708}",positive +dana beneran bikin hidup gua aman aja,7,,"{'label': 'positive', 'score': 0.9983342289924622}",positive +mantul dana bikin transaksi ribet,5,,"{'label': 'negative', 'score': 0.9998865127563477}",negative +terima kasih dana atas tips anti tipu tipu onlinenya,9,,"{'label': 'positive', 'score': 0.9994526505470276}",positive +baik dana transaksi jadi gampang cepat,6,,"{'label': 'positive', 'score': 0.9999237060546875}",positive +dana punya tips hindar tipu online paling mantap,8,,"{'label': 'positive', 'score': 0.9999274015426636}",positive +aman aman aja transaksi dana bikin gua gak khawatir,9,,"{'label': 'positive', 'score': 0.9999309778213501}",positive +aman aja deh tips dana selalu aman,7,,"{'label': 'positive', 'score': 0.9999215602874756}",positive +lancar jaya transaksi lewat dana semua beres,7,,"{'label': 'positive', 'score': 0.9999440908432007}",positive +emang dana nih andal gua bikin gua aman tipu,9,,"{'label': 'negative', 'score': 0.9997233748435974}",negative +transaksi lewat dana atas gampang tinggal klik,7,,"{'label': 'neutral', 'score': 0.9998548030853271}",neutral +gara dana gua skrng paham bet cara hindar tipu online terima kasih dana,13,,"{'label': 'negative', 'score': 0.9996985197067261}",negative +nyaman banget transaksi dana gua bayar mana aja,8,,"{'label': 'positive', 'score': 0.9997841715812683}",positive +top banget tips dana soal jebak tipu online,8,,"{'label': 'positive', 'score': 0.9992750287055969}",positive +puas banget transaksi lewat dana lancar jaya kendala,8,,"{'label': 'positive', 'score': 0.9999476671218872}",positive +dgn dana aku lbh tenang aman aja penipuanb online,9,,"{'label': 'positive', 'score': 0.9583393931388855}",positive +terima kasih dana transaksi sekarang gak pake antri,8,,"{'label': 'positive', 'score': 0.9986667633056641}",positive +terima kasih dana udeh ngasih tau cara hindar tipu,9,,"{'label': 'negative', 'score': 0.9998100399971008}",negative +promo pbb dana bikin bayar pajak hemat,7,,"{'label': 'positive', 'score': 0.9999451637268066}",positive +suka banget deh sama dana bikin transksi selalu aman aja bro,11,,"{'label': 'positive', 'score': 0.9999525547027588}",positive +gak nyangka transaksi dana gampang banget tinggal klik,8,,"{'label': 'positive', 'score': 0.9826839566230774}",positive +dana kasih tips aman aja hindar jebak tipu,8,,"{'label': 'negative', 'score': 0.9998188614845276}",negative +neng transaksi dana lancar jaya gak masalah,7,,"{'label': 'positive', 'score': 0.999729335308075}",positive +thanks dana tipsnya selalu jdi andal,6,,"{'label': 'positive', 'score': 0.999944806098938}",positive +aku neng banget transaksi dana aman aman aja,8,,"{'label': 'positive', 'score': 0.9999034404754639}",positive +dana memang aman aja kalau transaksi online mantul pokok,9,,"{'label': 'positive', 'score': 0.9998407363891602}",positive +udah transaksi lewat dana semua beres ribet,7,,"{'label': 'negative', 'score': 0.9997645020484924}",negative +baik banget utk transaksi online dana,6,,"{'label': 'positive', 'score': 0.9999276399612427}",positive +maju terus dana transaksi lewat aplikasi kalian mantul banget,9,,"{'label': 'positive', 'score': 0.9999057054519653}",positive +transaksi online aman nyaman berkat tips dana,7,,"{'label': 'positive', 'score': 0.9998317956924438}",positive +mantap transaksi dana gampang banget tinggal klik aja,8,,"{'label': 'positive', 'score': 0.9999022483825684}",positive +slh pilih deh dgn dana mantap lah pokok,8,,"{'label': 'positive', 'score': 0.9999499320983887}",positive +suka dana transaksi jadi gak ribet sama sekali,8,,"{'label': 'positive', 'score': 0.9999511241912842}",positive +baik banget dana ksh tips lengkap jelas,7,,"{'label': 'positive', 'score': 0.9998681545257568}",positive +gua suka banget transaksi dana nyaman praktis,7,,"{'label': 'positive', 'score': 0.9999545812606812}",positive +selalu dpt ilmu baru dana memang baik,7,,"{'label': 'positive', 'score': 0.9999403953552246}",positive +terima kasih dana transaksi sekarang lancar jaya,7,,"{'label': 'positive', 'score': 0.9999552965164185}",positive +tips baik dana transaksi online jdi aman,7,,"{'label': 'positive', 'score': 0.9999263286590576}",positive +alhamdulillah transaksi lewat aplikasi dana jadi mudah,7,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +gila gue make sense sama gimana uang iseng cmn perak hari kemudian tarik nominal besar yng udh lama tarik tarik the biggest scam everrr,24,,"{'label': 'negative', 'score': 0.9996737241744995}",negative +minta pihak dana cek akun pake orang akun atas nama aditia fajar sujatmiko kerja sama nya dana,17,,"{'label': 'neutral', 'score': 0.9999020099639893}",neutral +kronologi bawah punya akun dana aditia fajar sujatmiko pernah ganti nomer dana nomer dana ganti sama orang bukan guna dana sejak april,22,,"{'label': 'neutral', 'score': 0.9998993873596191}",neutral +berapa lama kata resolusi hari sampe sekarang jelas,8,,"{'label': 'negative', 'score': 0.9995686411857605}",negative +sok asik jamet,3,,"{'label': 'negative', 'score': 0.9999144077301025}",negative +verifikasi muka gagal terus padahal orang nya sama gimana sih,10,,"{'label': 'negative', 'score': 0.9999070167541504}",negative +cokk gua gabisa login eror napa nih,7,,"{'label': 'negative', 'score': 0.9999110698699951}",negative +info dana gua knpa gabisa login,6,,"{'label': 'negative', 'score': 0.9996082186698914}",negative +akun dana kok tiba tiba logout sulit login,8,,"{'label': 'negative', 'score': 0.9999041557312012}",negative +kendala minta bantu kmn csnya robot ngulang ngulang tanya konsultasi,10,,"{'label': 'neutral', 'score': 0.7129485607147217}",neutral +kmu gabisa,2,,"{'label': 'negative', 'score': 0.9995837807655334}",negative +bang buka,2,,"{'label': 'neutral', 'score': 0.9783024787902832}",neutral +akun dana bobol dana raib lapor kirim bukti lengkap ikut prosedur jawab akun verifikasi arti bukan tanggung jawab padahal jelas jelas korban sistem aman lemah bukan salah,27,,"{'label': 'negative', 'score': 0.9998682737350464}",negative +akun tiba tiba beku udah bulan mas aja suruh tunggu mulu kaga kelar kelar mana saldo,16,,"{'label': 'negative', 'score': 0.9999077320098877}",negative +gak was was pas jatuh tempo tinggal buka dana,9,,"{'label': 'negative', 'score': 0.9809056520462036}",negative +baru canggih bro bayar sim,5,,"{'label': 'negative', 'score': 0.8770890831947327}",negative +mantul nih dana buat bayar pajak kendara langsung,8,,"{'label': 'neutral', 'score': 0.9930013418197632}",neutral +keren sih sekarang bayar pajak kendara,6,,"{'label': 'positive', 'score': 0.9999327659606934}",positive +andal banget buat sibuk bayar,5,,"{'label': 'positive', 'score': 0.999825656414032}",positive +semangat terus bayar tagih udah gampang banget,7,,"{'label': 'positive', 'score': 0.9996607303619385}",positive +bayar listrik lewat dana dah gak was was cuy,9,,"{'label': 'negative', 'score': 0.9998410940170288}",negative +the best sih dana buat urus semua tagih,8,,"{'label': 'positive', 'score': 0.9999274015426636}",positive +top banget sih fitur tagih dana,6,,"{'label': 'positive', 'score': 0.9959724545478821}",positive +dana emg andal banget dulu sampe sekarang,7,,"{'label': 'positive', 'score': 0.999886155128479}",positive +wow bayar cicil sekarang mudah,5,,"{'label': 'positive', 'score': 0.999930739402771}",positive +paspor bre wow banget,4,,"{'label': 'positive', 'score': 0.999842643737793}",positive +wah sip banget bayar samsat lewat dana nih,8,,"{'label': 'positive', 'score': 0.9991065859794617}",positive +halo min tanya laku transfer jenius dana teman saldo jenius potong uang blm masuk dana teman bantu cek hampir minggu tdk jelas dana krn tdk dpt respon apa stlh lapor,30,,"{'label': 'negative', 'score': 0.9992308616638184}",negative +hallo min nomor daftar dana aktif mau ganti nomor baru segera proses min soal uang situ,16,,"{'label': 'neutral', 'score': 0.9998953342437744}",neutral +dana kok gabisa tarik tunai,5,,"{'label': 'negative', 'score': 0.9998743534088135}",negative +biarin aja walaupun nelfonin ngirim link phising buat nipu jangan sampe klik yaa,13,,"{'label': 'negative', 'score': 0.9998782873153687}",negative +kaget tiba tiba dapet kayak gin njir tipu gak sih gimana sihh,12,,"{'label': 'negative', 'score': 0.9999005794525146}",negative +min nih baru aja persis kayak gin biarin aja kali kok tau nama,13,,"{'label': 'negative', 'score': 0.9997871518135071}",negative +udah bulan lapor jangan pernah naruh duit dana akun tiba ngilang padahal nga pernah klik link otp,17,,"{'label': 'negative', 'score': 0.9997900128364563}",negative +udah prioritas mana duit,4,,"{'label': 'negative', 'score': 0.9995558857917786}",negative +woyy,1,,"{'label': 'negative', 'score': 0.999862551689148}",negative +poko,1,,"{'label': 'positive', 'score': 0.9999053478240967}",positive +cukk,1,,"{'label': 'negative', 'score': 0.9985935091972351}",negative +gamau tauu,2,,"{'label': 'negative', 'score': 0.9999102354049683}",negative +leng,1,,"{'label': 'negative', 'score': 0.9998064637184143}",negative +cuk,1,,"{'label': 'negative', 'score': 0.9998854398727417}",negative +cek ngasih solusi banget min gitu doang kerja apa nya bot semua,12,,"{'label': 'negative', 'score': 0.9998162388801575}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +siapa sangka tabung tiba tiba saldo lenyap,7,,"{'label': 'negative', 'score': 0.9995231628417969}",negative +kak,1,,"{'label': 'positive', 'score': 0.9993162155151367}",positive +jangan pake dana awas duit hilang,6,,"{'label': 'negative', 'score': 0.9998770952224731}",negative +dana macam bantu dana buat umkm min buat usaha macam pinjam,11,,"{'label': 'neutral', 'score': 0.999850869178772}",neutral +bismillah,1,,"{'label': 'positive', 'score': 0.9999366998672485}",positive +hallo shopeepay masuk isi saldo tgl masuk benar isi saldo nomor tuju,12,,"{'label': 'neutral', 'score': 0.9998937845230103}",neutral +yuk kak sabda konfirmasi biar follow kendala makasih zidane,9,,"{'label': 'neutral', 'score': 0.9998997449874878}",neutral +lahh padahal aku hampir tiap minggu selalu top alfa gaperna kena biaya admin deh,14,,"{'label': 'neutral', 'score': 0.6679673790931702}",neutral +hai teman smartfren sayang banget kak jadi maksimal guna smartfrennya minfren paham banget nih kendala kakak alami yuk infoin via solusi baik terima kasih zay,25,,"{'label': 'negative', 'score': 0.9590933322906494}",negative +hai teman smartfren tanya putar smartfren minfren siap bantu kak yuk cek info lengkap smartfren tetap jaga sehat kak terima kasih zay,22,,"{'label': 'neutral', 'score': 0.9998955726623535}",neutral +sampe kapan nunggu,3,,"{'label': 'negative', 'score': 0.8850545287132263}",negative +pls balikin duit wlw ribu hidup jauh ortu kasi duit lumayan buat ongkos pulang nambah nyampe cibinongg ueueueue refund pls,20,,"{'label': 'neutral', 'score': 0.5407775044441223}",neutral +dosa bego mbak nipu orang,5,,"{'label': 'negative', 'score': 0.9999184608459473}",negative +cok rep kali naksir ama gua,6,,"{'label': 'neutral', 'score': 0.9955325126647949}",neutral +coky bleh nipu org sdang terzolimi tau,7,,"{'label': 'negative', 'score': 0.9999144077301025}",negative +nipu jelek ngjak brantem,4,,"{'label': 'negative', 'score': 0.9999147653579712}",negative +tobat coky,2,,"{'label': 'positive', 'score': 0.9985696077346802}",positive +suruh telf bank gmn deh iniii ribet,7,,"{'label': 'negative', 'score': 0.9999099969863892}",negative +halo top btpn jenius dana blm masuk kurang menit lalu posisi saldo ter debet bantu,15,,"{'label': 'neutral', 'score': 0.9999018907546997}",neutral +buat coky,2,,"{'label': 'positive', 'score': 0.9998270869255066}",positive +buat ryan,2,,"{'label': 'positive', 'score': 0.7692756652832031}",positive +buat niken,2,,"{'label': 'positive', 'score': 0.9920908212661743}",positive +buat ana,2,,"{'label': 'positive', 'score': 0.999876856803894}",positive +lewat jalan,2,,"{'label': 'positive', 'score': 0.9975069165229797}",positive +udah kali pernah kaya gin top emoney masuk gimana wey refund khhh,12,,"{'label': 'neutral', 'score': 0.9998797178268433}",neutral +isi dana pake mbanking sampe solusi gmn min,8,,"{'label': 'negative', 'score': 0.9981892704963684}",negative +twit brp hari lalu jir problem udah solved,8,,"{'label': 'neutral', 'score': 0.9997497200965881}",neutral +udah kak alhamdulillah udh balik,5,,"{'label': 'positive', 'score': 0.9985470175743103}",positive +cek plissss,2,,"{'label': 'positive', 'score': 0.9999421834945679}",positive +kak salah top akun dana nomor keliru coba hubung nomor sebut nyata nomor katif guna bantu kece soal saldo potong,20,,"{'label': 'neutral', 'score': 0.9997574687004089}",neutral +waduuuhh sabar kak lapor aja kak pihak dana nya via email help,12,,"{'label': 'neutral', 'score': 0.9483045339584351}",neutral +klik link kak banyak karna klik link jelas kak hub nya dana aja email help,15,,"{'label': 'neutral', 'score': 0.9998874664306641}",neutral +make dana ampe skarang,4,,"{'label': 'negative', 'score': 0.9998806715011597}",negative +alhamdulilah aku pernah masalah lho kak sering top buat beli paket ngadu email nya dana help,16,,"{'label': 'neutral', 'score': 0.996927797794342}",neutral +kalo emg rasa trx lgsg lapor aja kak nya dana via email help,13,,"{'label': 'neutral', 'score': 0.9998809099197388}",neutral +hai teman smartfren info putar smartfren cek terima kasih ben,10,,"{'label': 'neutral', 'score': 0.999893307685852}",neutral +belum klik link jelas kak soal banyak bgt link jelas mana sumber,12,,"{'label': 'neutral', 'score': 0.7058457136154175}",neutral +udh coba buat lapor kak saran via email aja kak help,11,,"{'label': 'neutral', 'score': 0.9998953342437744}",neutral +saran ngadu email help aja kak biar fast respon solved,10,,"{'label': 'neutral', 'score': 0.9998899698257446}",neutral +coba cek jaring kak aku sering alhamdulilah aman aja sih kak,11,,"{'label': 'positive', 'score': 0.997287392616272}",positive +kendala apa emgnya kak lapor aja nya lewat email help,10,,"{'label': 'neutral', 'score': 0.9939017295837402}",neutral +hai teman smartfren cus gunain akses internet mantul smartfren biar internetannya selalu lanjay info lengkap smartfrennya cek sini terima kasih uti,21,,"{'label': 'neutral', 'score': 0.999858021736145}",neutral +hai teman smartfren info putar smartfren cek terima kasih ben,10,,"{'label': 'neutral', 'score': 0.999893307685852}",neutral +tuh kak saran kalo akendala lgsg hub nya dana aja kak email help,13,,"{'label': 'neutral', 'score': 0.9998906850814819}",neutral +kosooooong,1,,"{'label': 'negative', 'score': 0.9997220635414124}",negative +waduhhh sabar kak sabar saran buat lapor email resmi dana aja kak help,13,,"{'label': 'neutral', 'score': 0.9985101819038391}",neutral +mungkin down kak servernya coba kala aja kak,8,,"{'label': 'negative', 'score': 0.9768083095550537}",negative +sabar kak better lapor email dana aja kak help,9,,"{'label': 'neutral', 'score': 0.9998908042907715}",neutral +lgsg resmi dana aja kak via email help biar cepet kelar masalah,12,,"{'label': 'neutral', 'score': 0.999862551689148}",neutral +dana,1,,"{'label': 'negative', 'score': 0.9903479814529419}",negative +email resmi dana aja kak help biar solved masalah,9,,"{'label': 'neutral', 'score': 0.9998835325241089}",neutral +alhamdulillah bayar udh verifikasi kak,5,,"{'label': 'neutral', 'score': 0.999854326248169}",neutral +mantap mas,2,,"{'label': 'positive', 'score': 0.9999563694000244}",positive +hai teman smartfren info putar smartfren cek terima kasih ben,10,,"{'label': 'neutral', 'score': 0.999893307685852}",neutral +kamu chat ana aja kak platform,6,,"{'label': 'neutral', 'score': 0.9998916387557983}",neutral +masyaallah alhamdulillah punya belummm,4,,"{'label': 'positive', 'score': 0.999687910079956}",positive +buka apk dana,3,,"{'label': 'neutral', 'score': 0.9998676776885986}",neutral +drama seru buat healing dah langgan wetv pake promo dana aja bre,12,,"{'label': 'positive', 'score': 0.9907033443450928}",positive +langgan pake dana emang andal banget bro nonton jadi nyaman,10,,"{'label': 'positive', 'score': 0.9999456405639648}",positive +wih drama wetv ter gas langgan pake promo dana hemat dah cuy,12,,"{'label': 'negative', 'score': 0.9969125986099243}",negative +gak was was langgan wetv pake dana aman aja happy dah bro,12,,"{'label': 'positive', 'score': 0.567476749420166}",positive +cdm kak,2,,"{'label': 'neutral', 'score': 0.9995502829551697}",neutral +the best lah pokok,4,,"{'label': 'positive', 'score': 0.9999576807022095}",positive +tenang aja semua baik baik aja,6,,"{'label': 'positive', 'score': 0.9987949132919312}",positive +nyaman bgt skrng pke dana,5,,"{'label': 'positive', 'score': 0.9999330043792725}",positive +dana andal kta smua,4,,"{'label': 'positive', 'score': 0.9997615218162537}",positive +ykin bgt dana plihan baik,5,,"{'label': 'positive', 'score': 0.9997697472572327}",positive +dompet digital baik dana,4,,"{'label': 'neutral', 'score': 0.9998513460159302}",neutral +top banget smkin lwa wallet,5,,"{'label': 'positive', 'score': 0.9999403953552246}",positive +min ksh dng promo langgananya,5,,"{'label': 'neutral', 'score': 0.9998613595962524}",neutral +gak repot mau langgnan tnggl plih dana,7,,"{'label': 'negative', 'score': 0.9994211196899414}",negative +tenang aman pke dana,4,,"{'label': 'positive', 'score': 0.9999065399169922}",positive +aku tau bgt soal dana buat langgan mudah,8,,"{'label': 'positive', 'score': 0.9999278783798218}",positive +gokil gokil nyala wiii,4,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +aku mkin suka dana,4,,"{'label': 'positive', 'score': 0.9999504089355469}",positive +alhamdulillah udh langgan,3,,"{'label': 'negative', 'score': 0.9993821382522583}",negative +langgan nntn plih dana lah aplg buat aman bgt,9,,"{'label': 'positive', 'score': 0.9999170303344727}",positive +slalu nyaman dgn dana,4,,"{'label': 'positive', 'score': 0.9999322891235352}",positive +msh ragu sma dana jgn dek,6,,"{'label': 'negative', 'score': 0.9976493716239929}",negative +dana emg plihan baik buat nyaman,6,,"{'label': 'positive', 'score': 0.9998868703842163}",positive +nnton lancar jaya klo udh langgan pke dana,8,,"{'label': 'positive', 'score': 0.9999096393585205}",positive +gak pkiran buat tkut hbs langgan pke dana aman aman aja,11,,"{'label': 'negative', 'score': 0.9986588954925537}",negative +cba deh langgan pke dana aman bgt,7,,"{'label': 'positive', 'score': 0.9995111227035522}",positive +langgan sllu andal dana mah,5,,"{'label': 'negative', 'score': 0.9995057582855225}",negative +emg baik bgt,3,,"{'label': 'positive', 'score': 0.9999332427978516}",positive +dana emg mantap bgt,4,,"{'label': 'positive', 'score': 0.9999544620513916}",positive +tunggu tnggl cuss langgan,4,,"{'label': 'negative', 'score': 0.9901551008224487}",negative +bru blang wallet baik,4,,"{'label': 'negative', 'score': 0.9876798391342163}",negative +apa min keren loh nntn nyaman aman,7,,"{'label': 'positive', 'score': 0.9999433755874634}",positive +serius top banget dong klo gtu,6,,"{'label': 'positive', 'score': 0.9999152421951294}",positive +bsa langgan pke dana rasany luar biasa,7,,"{'label': 'positive', 'score': 0.9997264742851257}",positive +alhamdulillah keren bgt,3,,"{'label': 'positive', 'score': 0.9999573230743408}",positive +dana buat kta smkin nyaman,5,,"{'label': 'positive', 'score': 0.9999021291732788}",positive +maju terus dana buat smuany,5,,"{'label': 'positive', 'score': 0.9999164342880249}",positive +support baik buat dana,4,,"{'label': 'positive', 'score': 0.9999039173126221}",positive +wuih wuih nyala dana,4,,"{'label': 'positive', 'score': 0.9999219179153442}",positive +terima kasih dana,3,,"{'label': 'positive', 'score': 0.9999246597290039}",positive +udh cba langgan gak kendala,5,,"{'label': 'negative', 'score': 0.999800980091095}",negative +wow keren banget cuy libur panjang aman bareng tips,9,,"{'label': 'positive', 'score': 0.9999312162399292}",positive +tau aja buat hobby nntn buat mudah,7,,"{'label': 'positive', 'score': 0.9998742341995239}",positive +dana emg baik bsa bgt,5,,"{'label': 'positive', 'score': 0.9990719556808472}",positive +nah mantap nih bsa langgan,5,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +nntn skrng tmbah seru klo udh lnggnan pke dana,9,,"{'label': 'positive', 'score': 0.9997090697288513}",positive +tmpt favorit nntn skrng bsa langgan pke dana jga mantap,10,,"{'label': 'positive', 'score': 0.9999488592147827}",positive +serius gak kendala langgan pke dana,6,,"{'label': 'negative', 'score': 0.9996334314346313}",negative +udah beres langgan pke dana,5,,"{'label': 'negative', 'score': 0.9997840523719788}",negative +udah beres nyiapin tanggal tinggal ambil cuti aja bre,9,,"{'label': 'neutral', 'score': 0.9931435585021973}",neutral +prlu pusing mkirin langgan tnggl pke dana mudah,8,,"{'label': 'negative', 'score': 0.9996358156204224}",negative +nnton seru tnpa hambat kren dana,6,,"{'label': 'negative', 'score': 0.9999092817306519}",negative +udh lma langgan lwat dana aman bgt sih,8,,"{'label': 'positive', 'score': 0.9992491602897644}",positive +the best lah dana mah,5,,"{'label': 'positive', 'score': 0.9999527931213379}",positive +saingn dana mantul,3,,"{'label': 'negative', 'score': 0.9994351267814636}",negative +maju terus dana bngun inovasi kren,6,,"{'label': 'positive', 'score': 0.9999275207519531}",positive +lancar jaya nih hari cuti udh tau,7,,"{'label': 'positive', 'score': 0.999906063079834}",positive +jamin deh cma dana mantap,5,,"{'label': 'positive', 'score': 0.9999485015869141}",positive +jgn smpai slah plih wallet cma dana baik,8,,"{'label': 'negative', 'score': 0.9998157620429993}",negative +kpan min mau kasih dana kaget biar mkin seru,9,,"{'label': 'positive', 'score': 0.9405661821365356}",positive +min adkh event seru nnti,5,,"{'label': 'positive', 'score': 0.9998459815979004}",positive +kra bklan ksh sma dana akhr thn nnti seru kekny,10,,"{'label': 'positive', 'score': 0.999895453453064}",positive +sbar nunggu dana ngsh promo,5,,"{'label': 'negative', 'score': 0.9997804760932922}",negative +event seru akhr thn,4,,"{'label': 'positive', 'score': 0.9999473094940186}",positive +bgi promo min akhir thn nih,6,,"{'label': 'neutral', 'score': 0.9996086955070496}",neutral +mmng slalu panutan dana mah mantul,6,,"{'label': 'positive', 'score': 0.9993828535079956}",positive +gak was was nih klo udh tau hari cuti,9,,"{'label': 'negative', 'score': 0.9997913241386414}",negative +cma dana wallet baik,4,,"{'label': 'neutral', 'score': 0.9245114326477051}",neutral +yakin nih ragu sama dana download sih skrng,8,,"{'label': 'negative', 'score': 0.9998522996902466}",negative +sngat luar biasa inovasi dana ikan,6,,"{'label': 'positive', 'score': 0.9999204874038696}",positive +mantap bgt sih dana buat smua mudah,7,,"{'label': 'positive', 'score': 0.9999527931213379}",positive +gak khawatir nih ckup save foto aja,7,,"{'label': 'negative', 'score': 0.6565687656402588}",negative +berkat dana semua baik baik aja,6,,"{'label': 'positive', 'score': 0.9996261596679688}",positive +udh dpet info hari cuti dana auto atur jdwal,9,,"{'label': 'neutral', 'score': 0.9998952150344849}",neutral +aman aja klo udh tau hari cuti,7,,"{'label': 'negative', 'score': 0.9921261072158813}",negative +gak kendala bgt nih pas bgt hari cutiny,8,,"{'label': 'positive', 'score': 0.9979279041290283}",positive +gua sngat trbantu dgn info dana mantap,7,,"{'label': 'positive', 'score': 0.9999493360519409}",positive +heran sma dana emg top banget,6,,"{'label': 'positive', 'score': 0.9999092817306519}",positive +dana emg baik,3,,"{'label': 'positive', 'score': 0.9999014139175415}",positive +kpan nih kra dana kaget min,6,,"{'label': 'neutral', 'score': 0.7983703017234802}",neutral +mnta promo dong min,4,,"{'label': 'neutral', 'score': 0.9814310073852539}",neutral +smkin wallet baik dana,4,,"{'label': 'neutral', 'score': 0.633232593536377}",neutral +kenap login dana lewat vertifikazi wajah trs mlh pakek kode otp,11,,"{'label': 'neutral', 'score': 0.9998966455459595}",neutral +slalu andal kta smua info dana,6,,"{'label': 'positive', 'score': 0.9977537989616394}",positive +mkin suka dana klo kyk gni,6,,"{'label': 'positive', 'score': 0.9998339414596558}",positive +dana emg gokil baik dah,5,,"{'label': 'positive', 'score': 0.9999513626098633}",positive +baik bgt udh ngsh hari cuti,6,,"{'label': 'positive', 'score': 0.9996138215065002}",positive +skrng mudah tau hri cuti dana,6,,"{'label': 'neutral', 'score': 0.994020402431488}",neutral +update bgt min yak mslah cuti baik,7,,"{'label': 'neutral', 'score': 0.48082536458969116}",neutral +salut sih gua ama dana the best,7,,"{'label': 'positive', 'score': 0.9999542236328125}",positive +keren bgt informasi cuti dana top banget,7,,"{'label': 'positive', 'score': 0.9999536275863647}",positive +baik bgt dana,3,,"{'label': 'positive', 'score': 0.9999353885650635}",positive +curiga adminnya ngsh kode pngen cuti,6,,"{'label': 'negative', 'score': 0.9999079704284668}",negative +dana slalu andal infony date,5,,"{'label': 'positive', 'score': 0.9999107122421265}",positive +haha kykny mimin sbar pngen cuti,6,,"{'label': 'negative', 'score': 0.9980223178863525}",negative +keren bgt dana updte bgt mslah cuti wow,8,,"{'label': 'positive', 'score': 0.9999419450759888}",positive +klo udh tau hari cuti buat thn dpn aman aja,10,,"{'label': 'negative', 'score': 0.8768890500068665}",negative +wuih udh dpet bcoran hri cuti baik,7,,"{'label': 'negative', 'score': 0.9996498823165894}",negative +seru liat dana udh kyk ngsh kisi uji versi cuti haha,11,,"{'label': 'positive', 'score': 0.9858907461166382}",positive +kak mi seingetku soal pernah gitu nomor ilang,8,,"{'label': 'negative', 'score': 0.999113142490387}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +yok cuy lgsg serbu aja promo mantul,7,,"{'label': 'neutral', 'score': 0.9998939037322998}",neutral +mau bgt promo kali,4,,"{'label': 'positive', 'score': 0.9966171383857727}",positive +cukup seru kali promonya,4,,"{'label': 'positive', 'score': 0.9999428987503052}",positive +nice bet nih cuy,4,,"{'label': 'positive', 'score': 0.8686204552650452}",positive +asli coi promo kek gin wajib bgt,7,,"{'label': 'positive', 'score': 0.9999120235443115}",positive +klo kata wort bgt sumpah,5,,"{'label': 'positive', 'score': 0.9990546107292175}",positive +coba dong min kasih promo gaming,6,,"{'label': 'neutral', 'score': 0.9998672008514404}",neutral +andal bgt dana buat ngapain aja,6,,"{'label': 'positive', 'score': 0.9825140833854675}",positive +mah wow bingit min,4,,"{'label': 'negative', 'score': 0.9998352527618408}",negative +oke slalu min big thanks min,6,,"{'label': 'neutral', 'score': 0.990706741809845}",neutral +paling semangat klo dana dah keluarin promo,7,,"{'label': 'positive', 'score': 0.9999450445175171}",positive +cuma ewallet baik mampu kasih promo terus terus,8,,"{'label': 'neutral', 'score': 0.9996110796928406}",neutral +jago promo cuma dana,4,,"{'label': 'negative', 'score': 0.865442156791687}",negative +mana tahan sama promo kek gin,6,,"{'label': 'negative', 'score': 0.9994012117385864}",negative +gabisa move promonya mimin,4,,"{'label': 'negative', 'score': 0.9996781349182129}",negative +wadidawww promo nya gokil abis,5,,"{'label': 'positive', 'score': 0.999954104423523}",positive +akhir taun hujanin promo dana mantap,6,,"{'label': 'positive', 'score': 0.9999330043792725}",positive +rill cuiy promo bukan kaleng kaleng,6,,"{'label': 'neutral', 'score': 0.9998375177383423}",neutral +wah mudah hemat berkat dana,5,,"{'label': 'positive', 'score': 0.9999572038650513}",positive +gokill menn dana emg top banget,6,,"{'label': 'positive', 'score': 0.9999486207962036}",positive +sejak pake dana bel pernah masalah mantul,7,,"{'label': 'negative', 'score': 0.932271420955658}",negative +tunjukinn ewallet baik nama dana,5,,"{'label': 'positive', 'score': 0.8252384066581726}",positive +udah pake promo dana gaskuen lah,6,,"{'label': 'positive', 'score': 0.9921129941940308}",positive +gabisa diemin promo gassssa,4,,"{'label': 'negative', 'score': 0.9998487234115601}",negative +anti ribet tinggal klik udah beres deh,7,,"{'label': 'positive', 'score': 0.9996665716171265}",positive +rupa mantap mantap cus,4,,"{'label': 'positive', 'score': 0.9999539852142334}",positive +mantap gilak good promo,4,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +yakalee promonya diemin bae,4,,"{'label': 'negative', 'score': 0.9998955726623535}",negative +top banget dah min aku suka,6,,"{'label': 'positive', 'score': 0.9999579191207886}",positive +baik promonya skuy cuy,4,,"{'label': 'positive', 'score': 0.8314703702926636}",positive +gas bree promo mantul bet mantul,6,,"{'label': 'positive', 'score': 0.9894521236419678}",positive +beneran the best cuy,4,,"{'label': 'positive', 'score': 0.9999526739120483}",positive +dana promo,2,,"{'label': 'positive', 'score': 0.9558286070823669}",positive +cius mantul bgt,3,,"{'label': 'positive', 'score': 0.7948946952819824}",positive +wow cuy beneran mantulll,4,,"{'label': 'positive', 'score': 0.9999340772628784}",positive +meju terus danakuu banyakin promonya,5,,"{'label': 'positive', 'score': 0.9995607733726501}",positive +jan bosen kasi promonya maju terus dana,7,,"{'label': 'positive', 'score': 0.9979682564735413}",positive +bae min kasi promonya,4,,"{'label': 'neutral', 'score': 0.9998107552528381}",neutral +seru bestie klo dah bahas libur,6,,"{'label': 'positive', 'score': 0.9999488592147827}",positive +paling seru liburanya,3,,"{'label': 'positive', 'score': 0.9999579191207886}",positive +udah beres atur jadwal sama doi dongs,7,,"{'label': 'positive', 'score': 0.472207635641098}",positive +fix org rumah kudu tau biar libur bareng,8,,"{'label': 'neutral', 'score': 0.9997411370277405}",neutral +konten mantul nih save amp,5,,"{'label': 'negative', 'score': 0.8938159942626953}",negative +kali bareng min liburanya,4,,"{'label': 'neutral', 'score': 0.9601515531539917}",neutral +libur masa depan atas deh hehe,6,,"{'label': 'positive', 'score': 0.9983060359954834}",positive +makas min manfaat info,4,,"{'label': 'neutral', 'score': 0.9998341798782349}",neutral +wow bole lah atur jadwal libur mantul cuy,8,,"{'label': 'neutral', 'score': 0.9722282290458679}",neutral +cuti mudah klo dah jdwlnya,5,,"{'label': 'positive', 'score': 0.8490060567855835}",positive +siap min udah beres simpen jadwal,6,,"{'label': 'neutral', 'score': 0.9993409514427185}",neutral +mang the best dana klo kasi inpo tuh,8,,"{'label': 'positive', 'score': 0.9999343156814575}",positive +min cuti libur kmna,4,,"{'label': 'neutral', 'score': 0.9998838901519775}",neutral +nyaman klo dah tau tanggal,5,,"{'label': 'positive', 'score': 0.9998831748962402}",positive +aman aman aja udah save min,6,,"{'label': 'negative', 'score': 0.6912001371383667}",negative +keren jadwal wajib save big thanks min,7,,"{'label': 'positive', 'score': 0.9998600482940674}",positive +beneran mudah dana tuh big thanks,6,,"{'label': 'positive', 'score': 0.9999397993087769}",positive +setia pakai dana deh perhati bgt sama usernya,8,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +cek cek info dlu buat libur keluarga,7,,"{'label': 'neutral', 'score': 0.9998873472213745}",neutral +gasss cuy inpo pantai mantul buat libur dong,8,,"{'label': 'negative', 'score': 0.9339185953140259}",negative +udah tentuin tgl waktu kumpulin saldo aja nic,8,,"{'label': 'neutral', 'score': 0.9997612833976746}",neutral +asikk jadwal udah beres sisa cari lokasi aja,8,,"{'label': 'positive', 'score': 0.9987401366233826}",positive +yuhuuu plan libur udah beres deh,6,,"{'label': 'positive', 'score': 0.9998998641967773}",positive +kuy min banyakin promo nya buat libur hhehe,8,,"{'label': 'neutral', 'score': 0.9998716115951538}",neutral +btw terima kasih dana jadwal cuti,6,,"{'label': 'neutral', 'score': 0.9998637437820435}",neutral +gokilll peduli dana emg baik,5,,"{'label': 'positive', 'score': 0.9999369382858276}",positive +semua tau dana emg baik soal promo gokil,8,,"{'label': 'positive', 'score': 0.9999135732650757}",positive +jelas idul fitri wajib mudik min,6,,"{'label': 'neutral', 'score': 0.9905897378921509}",neutral +top banget jadwal cuti udah siap,6,,"{'label': 'positive', 'score': 0.9999493360519409}",positive +harap gada halang pas tgl tentu,6,,"{'label': 'negative', 'score': 0.9998942613601685}",negative +alhamdulillah rencana libur tahun depan moga lancar jaya,8,,"{'label': 'positive', 'score': 0.9998948574066162}",positive +apa cuma blom planing,4,,"{'label': 'negative', 'score': 0.9998518228530884}",negative +plan kalian ngapain gais,4,,"{'label': 'negative', 'score': 0.9998408555984497}",negative +dana bayar jadi aman aman aja,6,,"{'label': 'positive', 'score': 0.9998941421508789}",positive +pakai dana transaksi langsung lancar jaya,6,,"{'label': 'positive', 'score': 0.9999535083770752}",positive +suka dana bayar jadi cepat simpel,6,,"{'label': 'positive', 'score': 0.999950647354126}",positive +dana memang baik buat transaksi hari hari,7,,"{'label': 'positive', 'score': 0.999895453453064}",positive +terima kasih dana gak perlu ribet kalau dana,8,,"{'label': 'positive', 'score': 0.9999130964279175}",positive +puji tuhan sekarang bayar bareng jadi mudah dana,8,,"{'label': 'positive', 'score': 0.9999558925628662}",positive +kali pakai dana rasa mantap banget,6,,"{'label': 'positive', 'score': 0.9999575614929199}",positive +big thanks pke dana andal kendala,6,,"{'label': 'neutral', 'score': 0.9966806769371033}",neutral +aman aja sih dana refund cepat cuy,7,,"{'label': 'negative', 'score': 0.9412568211555481}",negative +alhamdulillah tiap transaksi pakai dana selalu top markotop,8,,"{'label': 'positive', 'score': 0.9999487400054932}",positive +semangat terus pakai dana gak pernah kendala aman aja,9,,"{'label': 'positive', 'score': 0.9995408058166504}",positive +alhamdulillah sering pke dana biar selalu aman aja,8,,"{'label': 'positive', 'score': 0.9996378421783447}",positive +semangat transaksi dana gak was was,6,,"{'label': 'negative', 'score': 0.9872109889984131}",negative +ewallet baik transaksi dana dana lah,6,,"{'label': 'negative', 'score': 0.8969616889953613}",negative +dana memang ewallet baik dana,5,,"{'label': 'positive', 'score': 0.9788181781768799}",positive +ewallet baik dana dana pasti,5,,"{'label': 'neutral', 'score': 0.9993835687637329}",neutral +alhamdulillah transaksi lancar pakai dana,5,,"{'label': 'positive', 'score': 0.9999250173568726}",positive +suka dana banget pakai dana simple cepat,7,,"{'label': 'positive', 'score': 0.9999370574951172}",positive +mantap dana bikin semua transaksi jadi mudah,7,,"{'label': 'positive', 'score': 0.9999581575393677}",positive +dana ewallet baik dana,4,,"{'label': 'neutral', 'score': 0.9978775978088379}",neutral +dana memang ewallet baik transaksi dana,6,,"{'label': 'positive', 'score': 0.7885748744010925}",positive +suka dana bikin transaksi gampang,5,,"{'label': 'positive', 'score': 0.9998937845230103}",positive +alhamdulillah transaksi jadi mudah dana,5,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +yuk beli langgan langsung nonton vip puas wetv,8,,"{'label': 'neutral', 'score': 0.9998644590377808}",neutral +jgn ragu buat selalu pake dana dana ewallet baik,9,,"{'label': 'positive', 'score': 0.9953835606575012}",positive +transakasi seru kalau pake dana,5,,"{'label': 'positive', 'score': 0.9999490976333618}",positive +ntah knp dana jadi andal,5,,"{'label': 'positive', 'score': 0.9988131523132324}",positive +selalu nyaman sama dana,4,,"{'label': 'positive', 'score': 0.9999430179595947}",positive +terima kasih dana fitur keren,5,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +dana pake lengkap makanya selalu jdi andal,7,,"{'label': 'positive', 'score': 0.9999431371688843}",positive +tiba saldo ilang tiba transaksi sebut mohon tanggap nya,9,,"{'label': 'negative', 'score': 0.999639630317688}",negative +gmna gak tangung jawab nya buat kembali dana,8,,"{'label': 'negative', 'score': 0.9994663596153259}",negative +min komplain langsung balas buset ana gak bantu apa,9,,"{'label': 'negative', 'score': 0.9999046325683594}",negative +tiba transaksi kayak gin,4,,"{'label': 'negative', 'score': 0.9997103810310364}",negative +min proses kembali dana brp lama,6,,"{'label': 'neutral', 'score': 0.9988129138946533}",neutral +bayar guna qris uang masuk rekening toko jual jadi bayar kali padahal udah struk jual uang masuk,17,,"{'label': 'neutral', 'score': 0.9996126294136047}",neutral +unggul banding ovo gopay ewallet lain top gratis alam buruk dana tetap pakai hingga,14,,"{'label': 'neutral', 'score': 0.9927858710289001}",neutral +mohon bantu follow min keluh dgn nomor lapor segera selesai cepat,11,,"{'label': 'neutral', 'score': 0.9998881816864014}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +wah jajan auntie anne pake dana nyaman banget dah,9,,"{'label': 'positive', 'score': 0.9999456405639648}",positive +lemonade seger parah cocok sama eclair stix wah mantap cuy,10,,"{'label': 'positive', 'score': 0.9999520778656006}",positive +spesial nataru gift buat doi dana wah baik banget,9,,"{'label': 'positive', 'score': 0.9999469518661499}",positive +cheese stix galore cuy lezat banget wih mantul sih,9,,"{'label': 'positive', 'score': 0.9999568462371826}",positive +wah caramel almondnya enak banget boong cuy wajib coba,9,,"{'label': 'positive', 'score': 0.9999563694000244}",positive +hadiah spesial buat keluarga sayang daget dana baik bre,9,,"{'label': 'positive', 'score': 0.9998657703399658}",positive +wah jajan auntie anne pake daget nataru seru banget cuy,10,,"{'label': 'positive', 'score': 0.9999428987503052}",positive +lemonade cheese stix combo baik pake dana spesial nataru,9,,"{'label': 'positive', 'score': 0.5488582253456116}",positive +cinnamon pretzel wajib coba banget bre rasa luar biasa,9,,"{'label': 'positive', 'score': 0.9999459981918335}",positive +wow daget nataru bikin semangat cuy,6,,"{'label': 'positive', 'score': 0.9998445510864258}",positive +sip banget sekarang kasih hadiah jadi mudah,7,,"{'label': 'positive', 'score': 0.9999477863311768}",positive +telat bgt bls nya gak sekali tahun depan,8,,"{'label': 'negative', 'score': 0.9999217987060547}",negative +tolomg bantu transaksi jta blm masuk,6,,"{'label': 'negative', 'score': 0.9994373917579651}",negative +slowres banget hadehh gak ditanggepin,5,,"{'label': 'negative', 'score': 0.9998732805252075}",negative +hai teman smartfren kait kendala nomor smartfren kamu yuk whats app official smartfren layan live chat solusi baik smartfren terima kasih,21,,"{'label': 'neutral', 'score': 0.9999028444290161}",neutral +@clvmszy @danawallet ga bisa :(,5,,"{'label': 'negative', 'score': 0.9930612444877625}",negative +kak mau nanya akhir bayar yaa,6,,"{'label': 'neutral', 'score': 0.99988853931427}",neutral +kaspa qzjtsgsxr nal uvj smdw udz wlvpjdepuv mwh,8,,"{'label': 'neutral', 'score': 0.9998540878295898}",neutral +gua yes banget min suka promonya,6,,"{'label': 'positive', 'score': 0.999891996383667}",positive +seman senyum doi min vocernya mantul,6,,"{'label': 'positive', 'score': 0.9991208910942078}",positive +mana tolak vocer mantap,4,,"{'label': 'positive', 'score': 0.9999581575393677}",positive +big thanks buat fitur daget simple kasi kado buat sayang,10,,"{'label': 'positive', 'score': 0.6714941263198853}",positive +mantul fitur keren andal bgt,5,,"{'label': 'positive', 'score': 0.9999477863311768}",positive +pake dana mang paling mantul buat jajan,7,,"{'label': 'positive', 'score': 0.9999020099639893}",positive +good vocer cemilan akhir taun aman aja,7,,"{'label': 'positive', 'score': 0.9994781613349915}",positive +asikk ngemil nic gaskuen deh otw auntie annes terima kasih dana vocernya,12,,"{'label': 'positive', 'score': 0.9998582601547241}",positive +juara deh vocer dana deals hemat tros kendala,8,,"{'label': 'positive', 'score': 0.9999419450759888}",positive +jajan seru bareng dana nih,5,,"{'label': 'positive', 'score': 0.9998780488967896}",positive +drama kirim kado pke daget emg mantul cuy,8,,"{'label': 'negative', 'score': 0.5950724482536316}",negative +maju terus dana banyakin vocer disko dana deals hehe,9,,"{'label': 'positive', 'score': 0.6664101481437683}",positive +btw terima kasih dana vocernya mantul parah,7,,"{'label': 'negative', 'score': 0.9998928308486938}",negative +segala jadi lancar nyaman sama dana auntie anne,8,,"{'label': 'positive', 'score': 0.9999442100524902}",positive +emg luar biasa vocernya,4,,"{'label': 'positive', 'score': 0.9998838901519775}",positive +stiap kali pake danna slalu voucher keren pokok makin setia pakai dana auntie anne deh,15,,"{'label': 'positive', 'score': 0.9999494552612305}",positive +makasih dana auntie anne atas voucher nya bikin transaksi nyaman,10,,"{'label': 'positive', 'score': 0.9999469518661499}",positive +dadak ken jajan jadi,4,,"{'label': 'negative', 'score': 0.999646782875061}",negative +voucher dana auntie anne voucher istimewa setia guna aplikasi,9,,"{'label': 'neutral', 'score': 0.9998348951339722}",neutral +udah beres jaja dong mantul hemat vocernya min,8,,"{'label': 'neutral', 'score': 0.7643153667449951}",neutral +dana auntie anne memang pilih tepat buat cari nyaman transaksi voucher nya,12,,"{'label': 'positive', 'score': 0.9993138313293457}",positive +transaksi jadi gak ribet berkat voucher dana auntie anne,9,,"{'label': 'positive', 'score': 0.9999452829360962}",positive +terima kasih dana auntie anne moga berkah voucher alir kepada,10,,"{'label': 'positive', 'score': 0.99628746509552}",positive +wohoo terima kasih dana auntie anne voucher jadi hebat berkat supportmu,11,,"{'label': 'positive', 'score': 0.999929666519165}",positive +terima kasih dana auntie anne dukung voucher makin hitung,9,,"{'label': 'positive', 'score': 0.9997040629386902}",positive +apreciate banget dana auntie anne voucher makin istimewa berkat baik mantul dana auntie anne,14,,"{'label': 'positive', 'score': 0.9999521970748901}",positive +dana recommended buat nyimpen uang fitur aplikasi nya rusak banget asal konfirmasi bayar izin milik udh hilang dana udh beberapa kali ajuin banding balikin duit anji emng kira nyari duit gampang,31,,"{'label': 'negative', 'score': 0.9998624324798584}",negative +salam sukses terima kasih dana auntie anne atas sumbangsih tak nilai voucher,12,,"{'label': 'neutral', 'score': 0.9913384914398193}",neutral +terima kasih banyak dana auntie anne voucher makin ciamik berkat kontribusi luar biasa,13,,"{'label': 'positive', 'score': 0.9999490976333618}",positive +terima kasih dana auntie anne dukung buat voucher jadi arti semua,11,,"{'label': 'positive', 'score': 0.9999277591705322}",positive +bangga punya dukung dana auntie anne voucher terima kasih dana auntie anne,12,,"{'label': 'positive', 'score': 0.9999352693557739}",positive +dana auntie anne voucher selalu kasih voucher baik paling top,10,,"{'label': 'positive', 'score': 0.9999316930770874}",positive +voucher dana auntie anne pernah kecewa baik banget dana auntie anne,11,,"{'label': 'negative', 'score': 0.9999109506607056}",negative +suka banget sama voucher dana auntie anne vouchernya baik selalu,10,,"{'label': 'positive', 'score': 0.999951958656311}",positive +voucher dana auntie anne selalu top baik emang,8,,"{'label': 'positive', 'score': 0.9999475479125977}",positive +terima kasih dana auntie anne voucher baik vouchernya pernah absen,10,,"{'label': 'neutral', 'score': 0.9974207878112793}",neutral +dana auntie anne memang baik voucher voucher selalu bikin puas,10,,"{'label': 'positive', 'score': 0.9999512434005737}",positive +terima kasih dana auntie anne voucher nya keren banget,9,,"{'label': 'positive', 'score': 0.9999542236328125}",positive +dana auntie anne selalu hadir voucher keren voucher contoh makin suka dana auntie anne,14,,"{'label': 'positive', 'score': 0.9999276399612427}",positive +keren parah voucher dana auntie anne memang mantap,8,,"{'label': 'positive', 'score': 0.9999542236328125}",positive +voucher dana auntie anne keren untung mantap sekali,8,,"{'label': 'positive', 'score': 0.9999511241912842}",positive +voucher dana auntie anne hidup jadi mudah jadi keren,9,,"{'label': 'positive', 'score': 0.9999499320983887}",positive +suka dana auntie anne banget sama voucher dana auntie anne keren maksimal,12,,"{'label': 'positive', 'score': 0.9999452829360962}",positive +dana recommended masak iya transaksi asal konfirmasi aja izin milik kan rugi walaupun sengaja tautin dana google lah harga guna minimal kasih notifikasi izin nya kalo udh begini dana mna mau gimna,32,,"{'label': 'negative', 'score': 0.9998579025268555}",negative +apresiasi buat dana auntie anne atas voucher keren baik,9,,"{'label': 'positive', 'score': 0.9999417066574097}",positive +dana auntie anne bikin hidup makin mudah voucher super keren,10,,"{'label': 'positive', 'score': 0.9999468326568604}",positive +voucher dana auntie anne memang keren banget terima kasih dana auntie anne,12,,"{'label': 'positive', 'score': 0.9999555349349976}",positive +transaksi lewat dana lancar jaya gua puas banget,8,,"{'label': 'positive', 'score': 0.9999542236328125}",positive +maju terus dana transaksi aplikasi kalian baik banget,8,,"{'label': 'positive', 'score': 0.9999419450759888}",positive +aman aman aja transaksi lewat dana bikin hati tenang,9,,"{'label': 'positive', 'score': 0.9999432563781738}",positive +mantap dana bikin transaksi gampang praktis,6,,"{'label': 'positive', 'score': 0.9999516010284424}",positive +alhamdulillah dana bikin transaksi gak ribet sama sekali,8,,"{'label': 'positive', 'score': 0.9999221563339233}",positive +nyaman banget transaksi lewat dana gak perlu keluar rumah,9,,"{'label': 'positive', 'score': 0.9999324083328247}",positive +luar biasa transaksi dana cepet banget gak perlu antri,9,,"{'label': 'positive', 'score': 0.9999450445175171}",positive +suka dana transaksi lewat aplikasi bikin hidup praktis,8,,"{'label': 'positive', 'score': 0.9999382495880127}",positive +terima kasih dana transaksi sekarang gampang hemat waktu,8,,"{'label': 'positive', 'score': 0.9999552965164185}",positive +aku suka transaksi dana semua lancar jaya,7,,"{'label': 'positive', 'score': 0.9999539852142334}",positive +gua puas banget transaksi dana lancar jaya cepat,8,,"{'label': 'positive', 'score': 0.9999550580978394}",positive +mantul dana bikin transaksi jadi gak pake ribet,8,,"{'label': 'positive', 'score': 0.9999450445175171}",positive +nyaman banget transaksi dana hemat waktu tenaga,7,,"{'label': 'positive', 'score': 0.9999557733535767}",positive +mna tanggung jawab nya lah bukan uang sedikit udh cukup besar cari uang hari kerja ngaduk semen plis bantu dong,20,,"{'label': 'negative', 'score': 0.9998737573623657}",negative +luar biasa dana bikin transaksi jadi simpel cepat,8,,"{'label': 'positive', 'score': 0.9999549388885498}",positive +wah transaksi lewat dana bener bener baik,7,,"{'label': 'positive', 'score': 0.9999377727508545}",positive +ribet mudah hemat waktu,4,,"{'label': 'positive', 'score': 0.9999401569366455}",positive +gaskuen min ide bagus patut coba,6,,"{'label': 'positive', 'score': 0.9999103546142578}",positive +alhamdulillah sejak pake dana emg kendala,6,,"{'label': 'negative', 'score': 0.9965119957923889}",negative +udah kirim hadiah pake daget gampang bgt cara,8,,"{'label': 'positive', 'score': 0.993475615978241}",positive +gapernah novasi keren mantap jiwa,5,,"{'label': 'positive', 'score': 0.9999419450759888}",positive +cocok min rencana gitu krim dget buat kado thun baru,10,,"{'label': 'neutral', 'score': 0.9874595403671265}",neutral +setia pakai dana krna semua solusi butuh sini,8,,"{'label': 'neutral', 'score': 0.9906953573226929}",neutral +atas kado akhir taun dana emg top banget,8,,"{'label': 'positive', 'score': 0.999951958656311}",positive +sayang makin sayang klo kirimin daget pas tahun baru sih mantap jiwa,12,,"{'label': 'positive', 'score': 0.9999533891677856}",positive +daget emg andal bikin kejut akhir taun,7,,"{'label': 'negative', 'score': 0.9998986721038818}",negative +fitur andal segala butuh kirim kirim hadiah,7,,"{'label': 'neutral', 'score': 0.9973537921905518}",neutral +buat dana apresiasi fiturnya emg top banget,7,,"{'label': 'positive', 'score': 0.9999288320541382}",positive +bkal neng bgt kasih daget,5,,"{'label': 'negative', 'score': 0.9998805522918701}",negative +ayo pake daget buat kasih kado spesial tahun baru,9,,"{'label': 'neutral', 'score': 0.9997377991676331}",neutral +nyaman kan pake dana tuh beneran kasi solusi apa,9,,"{'label': 'negative', 'score': 0.9578859806060791}",negative +maju terus dana inovasi manfaat bgt,6,,"{'label': 'positive', 'score': 0.999945878982544}",positive +luar biasa min cara krim hadiah gampang praktis,8,,"{'label': 'positive', 'score': 0.9999092817306519}",positive +yeeey dana emg mantul deh,5,,"{'label': 'positive', 'score': 0.9998947381973267}",positive +efisien buang waktu klik udah beres hadiah sampe,8,,"{'label': 'negative', 'score': 0.9993199110031128}",negative +klik selesai top banget,4,,"{'label': 'positive', 'score': 0.9959930181503296}",positive +kok iya cobain hehe,4,,"{'label': 'neutral', 'score': 0.9590152502059937}",neutral +dana auntie anne memang selalu jadi andal,7,,"{'label': 'positive', 'score': 0.999929666519165}",positive +ngiler banget liat voucher dana auntie anne baik banget vouchernya bikin mau voucher trusss,14,,"{'label': 'negative', 'score': 0.630882740020752}",negative +jago voucher dana auntie anne baik,6,,"{'label': 'positive', 'score': 0.9993353486061096}",positive +transaksi voucher pake dana auntie anne selalu voucher seru,9,,"{'label': 'positive', 'score': 0.9999507665634155}",positive +juara banget dana auntie anne kalau masalah voucher makin suka dana auntie anne dehhh,14,,"{'label': 'positive', 'score': 0.9999557733535767}",positive +pretzel manis makin nikmat berkat vocer dana deals,8,,"{'label': 'positive', 'score': 0.9999533891677856}",positive +tiap hari berkah banget dana auntie anne voucher dana auntie anne makin seru aja,14,,"{'label': 'positive', 'score': 0.9999558925628662}",positive +cius nih min wah mantap bgt lgsg otw,8,,"{'label': 'positive', 'score': 0.9999363422393799}",positive +beneran ewallet baik dana tuh,5,,"{'label': 'positive', 'score': 0.7191600203514099}",positive +tau min suka ngemil,4,,"{'label': 'neutral', 'score': 0.9820278882980347}",neutral +gokil cemilan baik with vocer baik,6,,"{'label': 'positive', 'score': 0.9999464750289917}",positive +wow fitur daget bener inovasi baik,6,,"{'label': 'positive', 'score': 0.999935507774353}",positive +mudah mantul bet mantul cuy,5,,"{'label': 'positive', 'score': 0.9999408721923828}",positive +cuma dana bikin hidup jadi simple,6,,"{'label': 'positive', 'score': 0.999943733215332}",positive +balik promonya banyak dana spesialis kejut seru,7,,"{'label': 'positive', 'score': 0.9999494552612305}",positive +aku rela klo mimin kasi daget hehehe,7,,"{'label': 'negative', 'score': 0.9322248101234436}",negative +partner payment baik poko dana tuh,6,,"{'label': 'neutral', 'score': 0.9997804760932922}",neutral +mudah ngapain cari susah maju terus dana,7,,"{'label': 'negative', 'score': 0.9998576641082764}",negative +lancar jaya semua berkat dana love bgt sih,8,,"{'label': 'positive', 'score': 0.9999405145645142}",positive +berkat daget hadiah akhir tahun aman aman aja,8,,"{'label': 'positive', 'score': 0.9998869895935059}",positive +daget tuh solusi bikin kejut makin seru,7,,"{'label': 'positive', 'score': 0.9998962879180908}",positive +baik dana blom ngalahin kemudahanya,5,,"{'label': 'negative', 'score': 0.9989938139915466}",negative +siap min big thanks info,5,,"{'label': 'neutral', 'score': 0.993949294090271}",neutral +aman aman aja skrg pusing mkirin hadiah bauta taun baru,10,,"{'label': 'negative', 'score': 0.999860405921936}",negative +terima kasih dana daget bikin simple buat krim hadiah,9,,"{'label': 'positive', 'score': 0.9998668432235718}",positive +auto neng doi klo kasih surprise daget thanks min ide,10,,"{'label': 'neutral', 'score': 0.9998775720596313}",neutral +klo gin auto beres krim hadiah tahun baru,8,,"{'label': 'neutral', 'score': 0.9998897314071655}",neutral +promo fitur dana bikin hepy trus sih,7,,"{'label': 'positive', 'score': 0.999891996383667}",positive +smpe skrg dana ewallet baik,5,,"{'label': 'positive', 'score': 0.7106304168701172}",positive +mama punya sim paspor ganti proses upgrade dong min bagi scan qris jangan harus upgrade premium kalo saat genting jadi sulit,21,,"{'label': 'negative', 'score': 0.9927830696105957}",negative +gue udah bikin lapor awas aja duit kakak gue minggu ngga balik,12,,"{'label': 'negative', 'score': 0.9998879432678223}",negative +kakak ipar gue keilangan duit hampir aja minjem mbanking gue untung gue cepet sadar tuh tipu baru gue katain bangsat langsung dimatiin,22,,"{'label': 'negative', 'score': 0.9999045133590698}",negative +halo min mau tanya dong akun dana mama kan sempat premium karena ktp nya rusak bagi foto nya buram jelas proses upgrade premium selalu gagal mama laku via scan qris kok yaa kan,33,,"{'label': 'negative', 'score': 0.99985671043396}",negative +dana deals andal buat jajan hemat,6,,"{'label': 'positive', 'score': 0.9999021291732788}",positive +semangat pis klo soal jajan min,6,,"{'label': 'positive', 'score': 0.9999362230300903}",positive +jajan makin lancar jaya pek vocer dana deals,8,,"{'label': 'positive', 'score': 0.9999455213546753}",positive +otw lah cuy mumpung vocer hemat nih gaskuen,8,,"{'label': 'positive', 'score': 0.7757543921470642}",positive +the best deh makin hemat gampang buat jajan pake dana,10,,"{'label': 'positive', 'score': 0.9999545812606812}",positive +vocer dana deals slalu mantul deh,6,,"{'label': 'positive', 'score': 0.9999382495880127}",positive +mantul aja satu kata min,5,,"{'label': 'negative', 'score': 0.9275102615356445}",negative +gudang vocer hemat cuma dana deals cuy,7,,"{'label': 'positive', 'score': 0.9994158744812012}",positive +manis akhir taun makin mantul,5,,"{'label': 'positive', 'score': 0.9999492168426514}",positive +promo dana blom pernah gagal,5,,"{'label': 'positive', 'score': 0.999648928642273}",positive +banget manis min makin suka dana,6,,"{'label': 'positive', 'score': 0.9999372959136963}",positive +yeyeyeye otw aunti annes mumpung promo pake dana deals,9,,"{'label': 'negative', 'score': 0.40679487586021423}",negative +mantul emg jajan pake vocer dana,6,,"{'label': 'neutral', 'score': 0.6071702241897583}",neutral +suka ngemil bahagia liat mantap kali,6,,"{'label': 'positive', 'score': 0.9999547004699707}",positive +jdi nyaman jajan pke pocer dana deals,7,,"{'label': 'positive', 'score': 0.9991151690483093}",positive +wow beneran manis,3,,"{'label': 'positive', 'score': 0.9999474287033081}",positive +udah ngemil manis hemat cuy,5,,"{'label': 'positive', 'score': 0.9993751645088196}",positive +promo sama cemilanya bener manis sih,6,,"{'label': 'positive', 'score': 0.999913215637207}",positive +boljug nic big thanks vocernya min,6,,"{'label': 'neutral', 'score': 0.998050332069397}",neutral +alhamdulillah jajan auntie annes makin irit,6,,"{'label': 'positive', 'score': 0.999946117401123}",positive +aku bantu kece lanjut infoin sreenshoot bukti transaksi kamu cantum jam dna tanggal transaksi via social media stay safe,19,,"{'label': 'neutral', 'score': 0.9998020529747009}",neutral +hai kak maaf buat kamu nyaman kait kendala top terima aku saranin kakak tunggu jam telebih sejak laku transaksi kak,20,,"{'label': 'neutral', 'score': 0.9997864365577698}",neutral +makin cinta sama dana banyak vouchernya maju terus dana,9,,"{'label': 'positive', 'score': 0.9999094009399414}",positive +mudah belanja pake voucher dana deals harga bikin senang,9,,"{'label': 'positive', 'score': 0.9999516010284424}",positive +nyaman banget belanja voucher dana mantap luar biasa,8,,"{'label': 'positive', 'score': 0.9999582767486572}",positive +voucher dana deals baik dompet jadi aman,7,,"{'label': 'positive', 'score': 0.9998631477355957}",positive +terima kasih dana voucher bikin aku makin semangat,8,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +suka dana deals vouchernya bener bener bikin hati tenang jajan,10,,"{'label': 'positive', 'score': 0.999937891960144}",positive +dana selalu beri baik voucher jajan dana deals,8,,"{'label': 'neutral', 'score': 0.9962747097015381}",neutral +dana emang andal deh vouchernya bikin happy,7,,"{'label': 'positive', 'score': 0.9999493360519409}",positive +alhamdulillah makin hemat nih pakai voucher dana deals,8,,"{'label': 'positive', 'score': 0.9999390840530396}",positive +dana deals selalu beri baik,5,,"{'label': 'positive', 'score': 0.9998983144760132}",positive +terima kasih dana atas vouchernta tetap setia pakai dana,9,,"{'label': 'positive', 'score': 0.9999040365219116}",positive +mantap voucher nya dana luar biasa nyaman banget,8,,"{'label': 'positive', 'score': 0.999958872795105}",positive +pokok jgn sampe lewat vouchers seru banget dana deals,9,,"{'label': 'positive', 'score': 0.9999053478240967}",positive +juara banget dana kalau masalah dana deals vouchers makin suka dana,11,,"{'label': 'positive', 'score': 0.9999370574951172}",positive +terima kasih dana uda selalu erti ngasih voucher terus,9,,"{'label': 'positive', 'score': 0.9802564382553101}",positive +voucher dana deals dana bener bener gak was was mantap,10,,"{'label': 'positive', 'score': 0.9999271631240845}",positive +semangat serbu voucher dana dealsnya,5,,"{'label': 'neutral', 'score': 0.7940545082092285}",neutral +maju terus dana dana deals emang bikin happy,8,,"{'label': 'positive', 'score': 0.9999299049377441}",positive +jadi semangat pakai dana deals,5,,"{'label': 'positive', 'score': 0.9999480247497559}",positive +terima kasih dana dana deals voucher top banget,8,,"{'label': 'positive', 'score': 0.9998694658279419}",positive +wow fitur kirim daget dana mantap betul,7,,"{'label': 'positive', 'score': 0.9999426603317261}",positive +big thanks buat dana udah bikin fitur keren,8,,"{'label': 'positive', 'score': 0.9999144077301025}",positive +big thanks dana kirim hadiah jadi opsi tarik nih,9,,"{'label': 'neutral', 'score': 0.9994775652885437}",neutral +kendala kok pas nyoba fitur gift daget dana,8,,"{'label': 'negative', 'score': 0.9389813542366028}",negative +dana paket lengkap mantul lah kirim hadiah,7,,"{'label': 'positive', 'score': 0.9986525774002075}",positive +kirim hadiah tahun baru lewat dana benar benar bikin hari hari makin seru warna,14,,"{'label': 'positive', 'score': 0.9999372959136963}",positive +udah beres buat kirim hadiah temen asik,7,,"{'label': 'positive', 'score': 0.9999239444732666}",positive +alhamdulillah sekarang kasih hadiah temen makin praktis lewat dana,9,,"{'label': 'positive', 'score': 0.9998856782913208}",positive +sekarang kirim hadiah udah dana luar biasa banget gaes,9,,"{'label': 'positive', 'score': 0.8021380305290222}",positive +emang kendala klo kirim pake dana apa dgn dagetnya,9,,"{'label': 'negative', 'score': 0.8767774105072021}",negative +top banget tutor kirim simpel,5,,"{'label': 'positive', 'score': 0.9999430179595947}",positive +pernah masalah lama pake fitur nya dana,7,,"{'label': 'negative', 'score': 0.9985059499740601}",negative +uda biasa banget pake dana jadi mantul,7,,"{'label': 'positive', 'score': 0.9998074173927307}",positive +big thanks dana udah nambahin opsi hadiah favorit buat temen,10,,"{'label': 'neutral', 'score': 0.999717652797699}",neutral +top banget gift hadiah dana suka banget seru baik,9,,"{'label': 'positive', 'score': 0.9999589920043945}",positive +wih mantap banget kasih hadiah daget dana temen,8,,"{'label': 'positive', 'score': 0.9999548196792603}",positive +fitur baru dana makin bikin happy kirim daget buat temen top banget,12,,"{'label': 'positive', 'score': 0.9999505281448364}",positive +wah fitur dana nyaman banget bikin kirim hadiah jadi praktis,10,,"{'label': 'positive', 'score': 0.9999549388885498}",positive +fitur kirim hadiah dana wow banget,6,,"{'label': 'positive', 'score': 0.9995505213737488}",positive +gak was was kalau mau kasih hadiah sekarang dana,9,,"{'label': 'negative', 'score': 0.9995561242103577}",negative +gak rempong cara kirim the best banget,7,,"{'label': 'positive', 'score': 0.9999557733535767}",positive +dana selalu punya fitur kirim daget bikin mudah,8,,"{'label': 'positive', 'score': 0.9998817443847656}",positive +kirim hadiah jadi aman aman aja dong,7,,"{'label': 'positive', 'score': 0.9990692734718323}",positive +alhamdulillah berkat dana kirim hadiah jadi mudah praktis mantap betul,10,,"{'label': 'positive', 'score': 0.9999556541442871}",positive +udah nih bikin daget buat temen,6,,"{'label': 'negative', 'score': 0.6613286733627319}",negative +jadi mudah kirim daget dana kawan,6,,"{'label': 'positive', 'score': 0.9997257590293884}",positive +fiturnya makin canggih aja dana selalu update buat,8,,"{'label': 'positive', 'score': 0.9998288154602051}",positive +alhamdulilah daget pas tahunbaru buat kirim,6,,"{'label': 'negative', 'score': 0.8007109761238098}",negative +kendala kirim hadiah selalu lancar pake dana,7,,"{'label': 'positive', 'score': 0.9998785257339478}",positive +jadi banyak opsi nih buat ngasih hadiah temen,8,,"{'label': 'neutral', 'score': 0.9998383522033691}",neutral +dana the best banget semua fiturnya,6,,"{'label': 'positive', 'score': 0.9999562501907349}",positive +kirim hadiah pake fitur dana kaget jelas kendala,8,,"{'label': 'negative', 'score': 0.9959224462509155}",negative +wow mantap banget gift hadiah nyaman luar biasa,8,,"{'label': 'positive', 'score': 0.9999547004699707}",positive +wallet baik dana selalu andal fitur kirim dagetnya,8,,"{'label': 'positive', 'score': 0.9992214441299438}",positive +kirim hadiah pake fitur dana selalu aman aman aja,9,,"{'label': 'positive', 'score': 0.9967813491821289}",positive +seru sih daget keluarga teman,5,,"{'label': 'positive', 'score': 0.9999014139175415}",positive +wah kirim hadiah teman nih big thanks dana,8,,"{'label': 'neutral', 'score': 0.9997922778129578}",neutral +mantul kado praktis buat temen fitur dana,7,,"{'label': 'positive', 'score': 0.7163543701171875}",positive +kasih daget mantap temen pas buat hadiah dada,8,,"{'label': 'positive', 'score': 0.999944806098938}",positive +terima kasih dana buat fitur dana kaget praktis,8,,"{'label': 'positive', 'score': 0.9998382329940796}",positive +big thanks dana buat fitur dana kaget,7,,"{'label': 'neutral', 'score': 0.9970473647117615}",neutral +dana kaget udah jadi opsi buat hadiah tahun baru nih gess,11,,"{'label': 'neutral', 'score': 0.9998552799224854}",neutral +suka dana banyak kejut buat hadiah,6,,"{'label': 'negative', 'score': 0.9884757995605469}",negative +alhamdulillah hujung tahun banyak gift nih fitur dana,8,,"{'label': 'neutral', 'score': 0.998389482498169}",neutral +aman aman aja kasih hadiah pakai dana rekomended,8,,"{'label': 'positive', 'score': 0.9627852439880371}",positive +kirim hadiah apa aja serah sama dana,7,,"{'label': 'neutral', 'score': 0.9976982474327087}",neutral +min info modus tipu kan,5,,"{'label': 'negative', 'score': 0.9999183416366577}",negative +banget simple nya pake dana baik lah,7,,"{'label': 'positive', 'score': 0.9999361038208008}",positive +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min balikin dana akun min salah top orang susah balikin alesan kendala gabisa log dana,15,,"{'label': 'negative', 'score': 0.9998687505722046}",negative +kak purchase game steam udah verifikasi aman sampe bar tulis proceed penuh malah balik halaman input nomor dana udah kali kali,21,,"{'label': 'neutral', 'score': 0.883115828037262}",neutral +min cdm,2,,"{'label': 'neutral', 'score': 0.9997525811195374}",neutral +maaf min mau kapan jawab begini mmg berapa makin sini mkin gjelas min dah brp kasus hilang uang saldo dana ayo bnyk loh konsumen tunggu pasti akibat saldo raib entah,30,,"{'label': 'negative', 'score': 0.9998534917831421}",negative +semalem aku transaksi dana shopepay transaksi hasil kok uang masuk shopeepay sampe sekarang,13,,"{'label': 'neutral', 'score': 0.999817430973053}",neutral +gue balikin gaaa nyari duit susah bjir jgn lempar batu sembunyi tangan plis,13,,"{'label': 'negative', 'score': 0.9998568296432495}",negative +sih transaksi pending semua nang lempar sama pihak kait,9,,"{'label': 'negative', 'score': 0.9999111890792847}",negative +adminn gmn cara ngembaliin saldo dana hilang,7,,"{'label': 'negative', 'score': 0.996383547782898}",negative +beli paket payment pakai aplikasi bima tercamtum gagal payment dana cantum sukses saldo potong respon solusi,16,,"{'label': 'neutral', 'score': 0.9997523427009583}",neutral +kak dana terima kasih saldo masuk minggu dana,8,,"{'label': 'neutral', 'score': 0.9998840093612671}",neutral +halo min mohon bantu follow nya keluh nomor lapor segera tangan cepat,12,,"{'label': 'neutral', 'score': 0.9998990297317505}",neutral +halo min mohon bantu follow nya keluh nomor lapor segera tangan cepat,12,,"{'label': 'neutral', 'score': 0.9998990297317505}",neutral +dana permisi numpang ide gimana kalo dana deteksi guna kirim saldo sama guna goks gak,15,,"{'label': 'neutral', 'score': 0.7889376282691956}",neutral +@avengersdao @myartbar Ik in @Laxmana113 @Smiie03 @danawallet,7,,"{'label': 'neutral', 'score': 0.9996812343597412}",neutral +baik lengkap kirim investigasi rusak citra harga selaku awas apk sebut banyak nasabah rugi baik materil imateril terimakasih solusi nya,20,,"{'label': 'negative', 'score': 0.9996953010559082}",negative +mantul banget bro edukasi keren parah,6,,"{'label': 'positive', 'score': 0.9999488592147827}",positive +hindar aja cuy biar hidup lancar jaya,7,,"{'label': 'negative', 'score': 0.9997947812080383}",negative +wah sip bgt info bikin sadar,6,,"{'label': 'positive', 'score': 0.9996947050094604}",positive +wih info kayak gin luar biasa banget bro,8,,"{'label': 'positive', 'score': 0.9983530044555664}",positive +wih penting banget nih hindar sekarang,6,,"{'label': 'negative', 'score': 0.9992777705192566}",negative +wah bahaya sih waspada bgt dah,6,,"{'label': 'negative', 'score': 0.9998657703399658}",negative +ken beli truk,3,,"{'label': 'neutral', 'score': 0.9997267127037048}",neutral +alhamdulillah makin sadar biar candu bre,6,,"{'label': 'positive', 'score': 0.9997467398643494}",positive +wah info luar biasa bgt mantap cuy,7,,"{'label': 'positive', 'score': 0.999953031539917}",positive +lancar jaya kalo udah hindar toxic begini,7,,"{'label': 'positive', 'score': 0.9997676014900208}",positive +baik baik aja kalo udah waspada bahaya,7,,"{'label': 'negative', 'score': 0.9955248832702637}",negative +wah awas cuy jangan sampe kena,6,,"{'label': 'negative', 'score': 0.9983277916908264}",negative +era digital memang keri dana punya solusi baik lewat edukasi judi online nya,13,,"{'label': 'positive', 'score': 0.8262283205986023}",positive +jamin aman selalu aman berkat edukasi judi online luar biasa dana,11,,"{'label': 'positive', 'score': 0.9993908405303955}",positive +keren banget edukasi judi online nya dana buat lindung tipu bikin aman nyaman deh,14,,"{'label': 'positive', 'score': 0.9999507665634155}",positive +edukasi judi online buat jaga jaga tipu tuh mantap banget,10,,"{'label': 'positive', 'score': 0.9999504089355469}",positive +terima kasih dana buat edukasi judi online keren,8,,"{'label': 'positive', 'score': 0.9999518394470215}",positive +dana emang ewallet baik edukasi judi online nya selalu manjur banget,11,,"{'label': 'positive', 'score': 0.9999420642852783}",positive +serius edukasi judi online mantul banget,6,,"{'label': 'positive', 'score': 0.9999399185180664}",positive +makas edukasi judi online nya dana ewallet baik memang perna mengecewain,11,,"{'label': 'neutral', 'score': 0.9651983976364136}",neutral +hbsnya motivasi lewat cerita dana selalu seru banget,8,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +super seru sekli guys terima kasih dana suda support semacm,10,,"{'label': 'positive', 'score': 0.9999263286590576}",positive +bnyk alam dpt moptivasi luar biasa dana,7,,"{'label': 'neutral', 'score': 0.999377429485321}",neutral +selalu jdi hightlight pembincaraan cerita dana terima kasih dana suda nyediakan tempat nntn,13,,"{'label': 'positive', 'score': 0.8641370534896851}",positive +topik klh seru topik obrol dana memang keren,8,,"{'label': 'positive', 'score': 0.9999524354934692}",positive +wow banget dana mau sedia tempat ngobrol seru cerita dana,10,,"{'label': 'positive', 'score': 0.9992033839225769}",positive +nntn lintas cerita dana begini tunggu luar biasa obrol,9,,"{'label': 'neutral', 'score': 0.9966920614242554}",neutral +gak nyangka topik obrol luar biasa cerita dana,8,,"{'label': 'negative', 'score': 0.9998010993003845}",negative +top banget dana suda nyediakan tempat utk nntn nntn seru kya gin,12,,"{'label': 'positive', 'score': 0.9999452829360962}",positive +nntn senyum senyum tambah promo dana tambah bikin semangat,9,,"{'label': 'positive', 'score': 0.9999377727508545}",positive +obrol santai seru cerita dana buat dana,7,,"{'label': 'neutral', 'score': 0.7857406735420227}",neutral +seru banget bincang cerita dana cerita dana,7,,"{'label': 'positive', 'score': 0.9999191761016846}",positive +bener bener seru banget liat bincang bincang cerita dana,9,,"{'label': 'positive', 'score': 0.9999219179153442}",positive +terima kasih dana atas nntn luar biasa cerita dana,9,,"{'label': 'positive', 'score': 0.9995545744895935}",positive +nntn bincang jgn lupa promo dana luar biasa,8,,"{'label': 'neutral', 'score': 0.9993292093276978}",neutral +cerita dana punya pikir luar biasa cerita dana masing masing,10,,"{'label': 'positive', 'score': 0.9878252148628235}",positive +bincang bincang bikin terinspirtasi seru banget,6,,"{'label': 'positive', 'score': 0.9999278783798218}",positive +asik banget ngasih perspektif baru cerita dana,7,,"{'label': 'positive', 'score': 0.9999356269836426}",positive +seru banget liat cerita dana bincang bincang,7,,"{'label': 'positive', 'score': 0.9998383522033691}",positive +tiap hari tarik banget promo seru dana,7,,"{'label': 'positive', 'score': 0.9994971752166748}",positive +topup dpt cash back promo dana makin suka dana,9,,"{'label': 'positive', 'score': 0.9998384714126587}",positive +hari berkah banget dana promo dana makin seru aja,9,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +ngiler banget liat promo dana baik banget promonya bikin mau bayar trusss,12,,"{'label': 'negative', 'score': 0.9786306023597717}",negative +nyaman pake banget tawar promo dana,6,,"{'label': 'positive', 'score': 0.9998869895935059}",positive +jago promo dana baik,4,,"{'label': 'positive', 'score': 0.9998194575309753}",positive +juara banget dana kalau masalah promo makin suka dana dehhh,10,,"{'label': 'positive', 'score': 0.9999189376831055}",positive +weekend jdi ceria semangat kasih promonya trus dana,8,,"{'label': 'positive', 'score': 0.9999535083770752}",positive +paling tau banget dana bikin semangat pake promo dana,9,,"{'label': 'positive', 'score': 0.9999518394470215}",positive +yok yok semangat yok promo keren dana nih,8,,"{'label': 'neutral', 'score': 0.9987958669662476}",neutral +promo bikin bosan pake dana selalu suka dana dgn promonya,10,,"{'label': 'negative', 'score': 0.9998774528503418}",negative +jgn sia sia promo keren promo baik cuma ewallet baik,10,,"{'label': 'negative', 'score': 0.9922006726264954}",negative +hari bayar pake promo dana semangat banget dehh jadi,9,,"{'label': 'positive', 'score': 0.9999426603317261}",positive +hari jdi semangat dgn promo keren dana,7,,"{'label': 'positive', 'score': 0.9999544620513916}",positive +dana juara promo selalu buat semangat hari,7,,"{'label': 'positive', 'score': 0.9999507665634155}",positive +wah promo dana selalu bikin semangat,6,,"{'label': 'positive', 'score': 0.9999569654464722}",positive +dompet jdi aman karna promo seru dana,7,,"{'label': 'positive', 'score': 0.9999426603317261}",positive +trannnsaksi jdi asik berkat promo dana terima kasih dana,9,,"{'label': 'positive', 'score': 0.9999488592147827}",positive +emang juara promo dana selalu bikin mau blnj trus,9,,"{'label': 'positive', 'score': 0.9999289512634277}",positive +transaksi pake dana jdi makin untung promo dana memang baik banget,11,,"{'label': 'positive', 'score': 0.9999539852142334}",positive +buat dana ewallet baik panjang masa,6,,"{'label': 'positive', 'score': 0.9998465776443481}",positive +ide ide inovasi dana jempol wow bgt,7,,"{'label': 'positive', 'score': 0.9999042749404907}",positive +keren bgt acara danahack seru pastiny,6,,"{'label': 'positive', 'score': 0.999955415725708}",positive +kreativitas batas dana tuh mantul,5,,"{'label': 'positive', 'score': 0.9730271100997925}",positive +semangat danam mang luar biasa,5,,"{'label': 'positive', 'score': 0.9999507665634155}",positive +kasih inoovasi baik trus terima kasih dana,7,,"{'label': 'neutral', 'score': 0.6357982754707336}",neutral +kompak trus danam semangat pokokny,5,,"{'label': 'positive', 'score': 0.9999388456344604}",positive +trus semangat bangun dana lebh baik,6,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +inovasi batas hasil karya luar biasa,6,,"{'label': 'neutral', 'score': 0.993653416633606}",neutral +wow bgt beneran buat pham soal risiko judi online,9,,"{'label': 'positive', 'score': 0.998719334602356}",positive +mantul bet liat passion danam terus kaya,7,,"{'label': 'positive', 'score': 0.7741703391075134}",positive +was was kalau semua sadar dmpak negatif judi online,9,,"{'label': 'negative', 'score': 0.9999120235443115}",negative +top bgt cara buat lwan dmpak buruk judi online,9,,"{'label': 'positive', 'score': 0.9765810966491699}",positive +dana baik sih mantul cuy,5,,"{'label': 'positive', 'score': 0.9970229268074036}",positive +lngkah benar benar mantap utk lwan bahaya besar judi online,10,,"{'label': 'positive', 'score': 0.9867969751358032}",positive +info baik nih top banget,5,,"{'label': 'positive', 'score': 0.9999353885650635}",positive +baik baik aja slalu dana kasih paham,7,,"{'label': 'positive', 'score': 0.9825173020362854}",positive +paling seru klo tlpon badman kerjain wkwkwk,7,,"{'label': 'positive', 'score': 0.9911221265792847}",positive +terima kasih dana selalu jadi andal aman bayar,8,,"{'label': 'positive', 'score': 0.9999121427536011}",positive +alhamdulillah edukasi soal bahaya judi online buat sadar byk orang,10,,"{'label': 'neutral', 'score': 0.9962170720100403}",neutral +pokony berkat mimin semua mudah buat paham,7,,"{'label': 'positive', 'score': 0.9999309778213501}",positive +dana kasih paham kali mantap bet mantap sih,8,,"{'label': 'positive', 'score': 0.9999550580978394}",positive +slow min dana proteksi aman aja,6,,"{'label': 'negative', 'score': 0.999614953994751}",negative +ijin share min manfaat bgt,5,,"{'label': 'positive', 'score': 0.999916672706604}",positive +aman aman aja pakai dana semangat terus buat tim,9,,"{'label': 'positive', 'score': 0.9997269511222839}",positive +khawatir soal transaksi tim dana emang top banget,8,,"{'label': 'positive', 'score': 0.9993367791175842}",positive +puji tuhan dana selalu kasih mudah berkat tim baik,9,,"{'label': 'positive', 'score': 0.9999220371246338}",positive +thanks miin slalu kasih paham mantul deh,7,,"{'label': 'positive', 'score': 0.9998916387557983}",positive +aman aman aja min,4,,"{'label': 'positive', 'score': 0.9998043179512024}",positive +semua klo mimin lancar jaya,5,,"{'label': 'positive', 'score': 0.9999488592147827}",positive +klo dana dah kasih paham bakal aman aman aja,9,,"{'label': 'positive', 'score': 0.954562783241272}",positive +update trus info aman min biar ngerti,7,,"{'label': 'neutral', 'score': 0.9997383952140808}",neutral +cerita seru tim dana bikin aku makin mantap pakai aplikasi,10,,"{'label': 'positive', 'score': 0.9999459981918335}",positive +setia pakai dana tim selalu bikin solusi baik,8,,"{'label': 'positive', 'score': 0.9998631477355957}",positive +masalah lama dana emang wow banget,6,,"{'label': 'positive', 'score': 0.9959890246391296}",positive +udah paham min,3,,"{'label': 'positive', 'score': 0.999755322933197}",positive +atas semua min aman aja,5,,"{'label': 'negative', 'score': 0.9211882948875427}",negative +udah dong min slalu gtu kok,6,,"{'label': 'negative', 'score': 0.9997796416282654}",negative +penting buat blum paham top banget min,7,,"{'label': 'positive', 'score': 0.9997854828834534}",positive +aman banget pakai dana big thanks buat semua tim,9,,"{'label': 'positive', 'score': 0.99992835521698}",positive +kagum banget sama usaha tim dana bikin hidup mudah,9,,"{'label': 'positive', 'score': 0.9999521970748901}",positive +luar biasa semangat tim dana buat terus jadi andal,9,,"{'label': 'positive', 'score': 0.9999467134475708}",positive +alam pakai dana makin mantul berkat kerja keras tim,9,,"{'label': 'positive', 'score': 0.9999135732650757}",positive +suka banget sama semangat tim dana selalu bikin inovasi,9,,"{'label': 'positive', 'score': 0.9999529123306274}",positive +seru banget lihat dedikasi tim dana bikin semua lancar,9,,"{'label': 'positive', 'score': 0.9999597072601318}",positive +terima kasih dana udah selalu kasih solusi aman aman aja,10,,"{'label': 'positive', 'score': 0.9997681975364685}",positive +mantap parah kompetisi tim dana bikin aku makin nyaman pakai dana,11,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +baik klo udah promo nih,5,,"{'label': 'neutral', 'score': 0.9998447895050049}",neutral +lgsh sikat cashbacknya sih mantul parah,6,,"{'label': 'negative', 'score': 0.9998624324798584}",negative +gada kalahin promo dana sih,5,,"{'label': 'negative', 'score': 0.9998922348022461}",negative +hujan promo terus terus mantul bgt min,7,,"{'label': 'positive', 'score': 0.9997158646583557}",positive +neng banget tahu usaha tim dana luar biasa,8,,"{'label': 'positive', 'score': 0.9995700716972351}",positive +kata dana emang selalu baik semua sisi,7,,"{'label': 'positive', 'score': 0.9998750686645508}",positive +wow cerita seru tim dana bikin aku makin suka dana,10,,"{'label': 'positive', 'score': 0.9999514818191528}",positive +semangat terus tim dana bikin aplikasi makin lancar jaya,9,,"{'label': 'positive', 'score': 0.9999526739120483}",positive +jago banget klo urus promo dana tuh,7,,"{'label': 'positive', 'score': 0.9824511408805847}",positive +waktu borong pake promo dana gak sih,7,,"{'label': 'negative', 'score': 0.9997186064720154}",negative +nyangka tim dana selalu punya ide top banget,8,,"{'label': 'positive', 'score': 0.9999511241912842}",positive +dah kek kado akhir taun promo,6,,"{'label': 'neutral', 'score': 0.9992251396179199}",neutral +buset kasih promo aja nih,5,,"{'label': 'negative', 'score': 0.999589741230011}",negative +hemat parah akhir taun berkat promo dana,7,,"{'label': 'positive', 'score': 0.9999328851699829}",positive +alhamdulillah dana selalu semangat kasih inovasi luar biasa,8,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +big thanks buat tim dana bikin semua seru mantul,9,,"{'label': 'positive', 'score': 0.9999483823776245}",positive +nongkrong circle seru nikmatin promo dana,6,,"{'label': 'positive', 'score': 0.9999299049377441}",positive +neng maksimal lihat dana terus kembang jadi baik,8,,"{'label': 'positive', 'score': 0.9998785257339478}",positive +kagum banget tim dana semangat bikin aplikasi makin nyaman,9,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +seru nya klo dana kasi promo jumat,7,,"{'label': 'positive', 'score': 0.999945878982544}",positive +luar biasa banget dana selalu punya cara buat jadi wallet baik,11,,"{'label': 'positive', 'score': 0.9999344348907471}",positive +kesbeknya luar biasa min,4,,"{'label': 'positive', 'score': 0.9999055862426758}",positive +mau semua minnn,3,,"{'label': 'negative', 'score': 0.909325897693634}",negative +auto serbu promnya tinggal pilih,5,,"{'label': 'neutral', 'score': 0.9998836517333984}",neutral +nasi goreng solaria enak klo promo dana,7,,"{'label': 'positive', 'score': 0.9999587535858154}",positive +promo dana bikin hepi abis,5,,"{'label': 'positive', 'score': 0.9999169111251831}",positive +pilih pilih promonya pilih hehe,5,,"{'label': 'positive', 'score': 0.9837800860404968}",positive +belanja seu berkat promo dana thanks min,7,,"{'label': 'neutral', 'score': 0.9961876273155212}",neutral +nyaman bener klo promo dana dah nongol,7,,"{'label': 'positive', 'score': 0.9999300241470337}",positive +cashbacknya bikin semangat jajan,4,,"{'label': 'positive', 'score': 0.9999585151672363}",positive +akhir taun penuh promo ampe bingung pilih,7,,"{'label': 'negative', 'score': 0.9996083378791809}",negative +gokil bnyk bgt promonya cuy,5,,"{'label': 'positive', 'score': 0.9999492168426514}",positive +fix semua promonya worth sih,5,,"{'label': 'positive', 'score': 0.9998036026954651}",positive +mantap semua min ampe bingung mana,6,,"{'label': 'positive', 'score': 0.999708354473114}",positive +keren banget cerita tim dana moga makin mantap terus,9,,"{'label': 'positive', 'score': 0.9999562501907349}",positive +babat hbs dana palsu mantap,5,,"{'label': 'positive', 'score': 0.9999189376831055}",positive +sacara danahack emg the best,5,,"{'label': 'positive', 'score': 0.9999328851699829}",positive +dana makin top banget adain danahack,6,,"{'label': 'positive', 'score': 0.9999490976333618}",positive +danahack bukti teamwork dana baik,5,,"{'label': 'positive', 'score': 0.9965044260025024}",positive +maju terus dana biar makin banyak inovasi baru,8,,"{'label': 'positive', 'score': 0.9983987212181091}",positive +bukti klo dana wallet baik,5,,"{'label': 'positive', 'score': 0.9994267225265503}",positive +jamin deh skrng plsu udh kapok haha,7,,"{'label': 'negative', 'score': 0.9999104738235474}",negative +sikat habs modus palsu dana,5,,"{'label': 'negative', 'score': 0.9998773336410522}",negative +mantull bgt udh byk tau ttg palsu,7,,"{'label': 'negative', 'score': 0.9993361830711365}",negative +jga mau blng terima kasih dana,6,,"{'label': 'neutral', 'score': 0.9923564195632935}",neutral +dana emg baik peduli sma guna,6,,"{'label': 'positive', 'score': 0.9957212209701538}",positive +nyaman bgr liat edukasi dana,5,,"{'label': 'positive', 'score': 0.9998918771743774}",positive +palsu hrus basmi,3,,"{'label': 'negative', 'score': 0.9998960494995117}",negative +semangat terus min kasih info,5,,"{'label': 'positive', 'score': 0.9998871088027954}",positive +jan ampe uang waktu buang sia sia gengs,8,,"{'label': 'negative', 'score': 0.9999040365219116}",negative +seru baca info makas min,5,,"{'label': 'positive', 'score': 0.9997110962867737}",positive +udah beres kmren plsu lngsung gua report,7,,"{'label': 'neutral', 'score': 0.9976332187652588}",neutral +palsu msti kasih paham sma wallet baik,7,,"{'label': 'negative', 'score': 0.9995423555374146}",negative +dana emg the best dgn edukasi krban pnipuan brkrng,9,,"{'label': 'positive', 'score': 0.9999451637268066}",positive +skrng mudah buat trhindr plsu dgn eduksi dana,8,,"{'label': 'positive', 'score': 0.9998877048492432}",positive +klo palsu skrng tnggl laporin aman aja,7,,"{'label': 'negative', 'score': 0.999809205532074}",negative +ttng palsu mah tnng aja tnggl laporin min,8,,"{'label': 'negative', 'score': 0.9998818635940552}",negative +mantap min trus kasih info baik biar gapada giur sama judol,11,,"{'label': 'neutral', 'score': 0.7454954981803894}",neutral +cuma rugi materi tpi sehat mental big thanks min info,10,,"{'label': 'neutral', 'score': 0.4709717035293579}",neutral +komitmen dana kasih info positif mantap kali,7,,"{'label': 'positive', 'score': 0.9999569654464722}",positive +aku suka dana bsa ngenalin plsu,6,,"{'label': 'positive', 'score': 0.9999397993087769}",positive +suka dana slalu kasi edukasi bermantaat,6,,"{'label': 'positive', 'score': 0.9999390840530396}",positive +mending buat nabung mantul,4,,"{'label': 'negative', 'score': 0.9639797806739807}",negative +jan sampe masuk jebaka judol cuy,6,,"{'label': 'negative', 'score': 0.9999161958694458}",negative +mantap brkat dana smua trhindr tipu,6,,"{'label': 'positive', 'score': 0.9998260140419006}",positive +semua baik baik aja plsu auto lporin,7,,"{'label': 'negative', 'score': 0.9936965107917786}",negative +gak khawatir bkl tipu plsu,5,,"{'label': 'negative', 'score': 0.9998573064804077}",negative +terima kasih dana skrng udh pham bgt plsu,8,,"{'label': 'positive', 'score': 0.7977648973464966}",positive +skrng mudah ngenalin palsu,4,,"{'label': 'negative', 'score': 0.9999181032180786}",negative +brkat edukasi ksh sma dana gak was was,8,,"{'label': 'negative', 'score': 0.5724348425865173}",negative +soal plsu mah udh aku lprin aman aja,8,,"{'label': 'negative', 'score': 0.9995394945144653}",negative +waspada terus gais bahaya judol,5,,"{'label': 'negative', 'score': 0.9998942613601685}",negative +penting bgt biar aman candu terima kasih dana,8,,"{'label': 'positive', 'score': 0.995590329170227}",positive +bantu banget edukasi top banget dah min,7,,"{'label': 'positive', 'score': 0.9999402761459351}",positive +andal edukasi baik cuma dana,5,,"{'label': 'neutral', 'score': 0.7305673956871033}",neutral +sih aman brkat dana,4,,"{'label': 'negative', 'score': 0.9129269123077393}",negative +gak nyangka bgt apa ksh sma dana promo keren,9,,"{'label': 'positive', 'score': 0.9999057054519653}",positive +alhamdulillah slalu dpet promo,4,,"{'label': 'positive', 'score': 0.999886155128479}",positive +mantap bgt aku mkin happy,5,,"{'label': 'positive', 'score': 0.9999593496322632}",positive +wow bgt sih promo dana,5,,"{'label': 'positive', 'score': 0.9996622800827026}",positive +promo jumat berkah dana,4,,"{'label': 'positive', 'score': 0.9993594288825989}",positive +sngat suka dana bsa sllu ngsh promo,7,,"{'label': 'positive', 'score': 0.9999122619628906}",positive +dana hadir promo jumat tarik terima kasih,7,,"{'label': 'neutral', 'score': 0.9997953772544861}",neutral +terima kasih dana promo jumat nya bikin main game asyik,10,,"{'label': 'positive', 'score': 0.9999568462371826}",positive +promo jumat dana bikin gaming experience jadi tarik,8,,"{'label': 'neutral', 'score': 0.6149734258651733}",neutral +dana kasih promo jumat bikin semua jadi hemat,8,,"{'label': 'positive', 'score': 0.9999535083770752}",positive +puas promo jumat dana untung,5,,"{'label': 'positive', 'score': 0.9999349117279053}",positive +promo jumat dana luar biasa hemat senang,7,,"{'label': 'positive', 'score': 0.9999493360519409}",positive +dana punya promo jumat bikin jadi seru,7,,"{'label': 'positive', 'score': 0.9999583959579468}",positive +promo jumat dana muas jadi seru,6,,"{'label': 'positive', 'score': 0.9999555349349976}",positive +dana kasih promo jumat bikin semua makin asyik the best,10,,"{'label': 'positive', 'score': 0.9999563694000244}",positive +suka banget promo jumat dana bikin tambah seru,8,,"{'label': 'positive', 'score': 0.99996018409729}",positive +promo jumat dana bikin semua alam jadi senang seru bgt,10,,"{'label': 'positive', 'score': 0.9999574422836304}",positive +terima kasih dana promo jumat super untung,7,,"{'label': 'positive', 'score': 0.9999439716339111}",positive +promo jumat dana bikin jadi asyik keren cuy,8,,"{'label': 'positive', 'score': 0.9999558925628662}",positive +puas banget promo jumat dana hemat seru,7,,"{'label': 'positive', 'score': 0.9999561309814453}",positive +promo jumat dana keren banget terima kasih dana,8,,"{'label': 'positive', 'score': 0.9999555349349976}",positive +maaf dana kakak maksud ana apk nya,7,,"{'label': 'neutral', 'score': 0.9995526671409607}",neutral +kerja tim luar biasa solid sih,6,,"{'label': 'positive', 'score': 0.9999483823776245}",positive +jan kasih kendor min info biar jera maen judol,9,,"{'label': 'negative', 'score': 0.9998706579208374}",negative +semangat min kasih edukasi,4,,"{'label': 'positive', 'score': 0.9999443292617798}",positive +baik dana peduli bgt sama generasi bangsa,7,,"{'label': 'positive', 'score': 0.9996781349182129}",positive +yuk stay waspada biar aman aja,6,,"{'label': 'negative', 'score': 0.7420783042907715}",negative +inu kenapaa minnn pulihkannnn dongggg,5,,"{'label': 'negative', 'score': 0.9998670816421509}",negative +aman nyaman lancar jaya deh pake dana,7,,"{'label': 'positive', 'score': 0.9999496936798096}",positive +cara report tipu gimana tipu transfernyake dana,7,,"{'label': 'negative', 'score': 0.9999099969863892}",negative +bsi mah gamau tau kak,5,,"{'label': 'negative', 'score': 0.9998937845230103}",negative +gimana udah verifikasi wajah kok dana bisnis gabisa tarik,9,,"{'label': 'negative', 'score': 0.9998418092727661}",negative +woi pernah balas,3,,"{'label': 'negative', 'score': 0.9999128580093384}",negative +kak pdhl saldo banyak kok limit seehh,7,,"{'label': 'negative', 'score': 0.9998667240142822}",negative +promo nya banyak uang org gabisa ambil trus pake,9,,"{'label': 'negative', 'score': 0.9998132586479187}",negative diff --git a/resources/views/data_labeledgopay.csv b/resources/views/data_labeledgopay.csv new file mode 100644 index 0000000..7f2760a --- /dev/null +++ b/resources/views/data_labeledgopay.csv @@ -0,0 +1,1359 @@ +clean_text,word_count,label,sent_raw,label_auto +ngentot ngambil fee ribu gede banget anjing,7,,"{'label': 'negative', 'score': 0.9999023675918579}",negative +cek minn,2,,"{'label': 'negative', 'score': 0.7920074462890625}",negative +cek woy,2,,"{'label': 'negative', 'score': 0.9998958110809326}",negative +layan gopay gmna proses nyangkut hari contact direpon apk amp email,11,,"{'label': 'negative', 'score': 0.9377515912055969}",negative +pelayananya gimana bang gopay contact aja gabisa respon kita,9,,"{'label': 'negative', 'score': 0.9997946619987488}",negative +liat noh brp kali gaada saldo masuk gopayy gueeeee riwayat akhir bulan februari bales kasih respon apa kek banyak complain duit masuk ngasih solusi bikin lapor cmn dibales bot doang,30,,"{'label': 'negative', 'score': 0.9998761415481567}",negative +gopay knp blm masuk sihh kmrnn nanya jawab template mulu,10,,"{'label': 'negative', 'score': 0.9998542070388794}",negative +kakk sumpah gin bahkan lapor gojek responnya kyk punya kamu cmn template doang gabisa ngetikk keluh,16,,"{'label': 'negative', 'score': 0.9998843669891357}",negative +lapor udah tutup malah kak soal vanya udah hangus duluan padahal saldo potong,13,,"{'label': 'negative', 'score': 0.9998753070831299}",negative +kak aku cepet banget kok kemrin saldo balik buat lapor,10,,"{'label': 'positive', 'score': 0.9968830943107605}",positive +gimana dahhh suruh bales gaada pilih buat ngetik suruh gua telepati top kemaren waktu maintance siang bolong hari jumat via bca gamasuk saldo potong saldo gopay nambah warna merah potong tulis hasil,32,,"{'label': 'negative', 'score': 0.9997208714485168}",negative +tai udah minggu anjg gin mulu,6,,"{'label': 'negative', 'score': 0.9999121427536011}",negative +iya gak ngerti banget skrg sering error gin transfer status proses terus sampe bbrp hari lelet bgt tuhaannn,18,,"{'label': 'negative', 'score': 0.9999195337295532}",negative +hallo cdm,2,,"{'label': 'neutral', 'score': 0.9998255372047424}",neutral +lah masalah selesai selesai orang butuh uang masalah responnya hampir minggu cuma template doang,14,,"{'label': 'negative', 'score': 0.9998656511306763}",negative +kakk cdm yaa,3,,"{'label': 'neutral', 'score': 0.9988346695899963}",neutral +min saldo balik cek dong,5,,"{'label': 'negative', 'score': 0.5219020247459412}",negative +blokir jelas emg gopaylater,4,,"{'label': 'negative', 'score': 0.9998759031295776}",negative +akhir hari isi full aja cashback poin nya,8,,"{'label': 'neutral', 'score': 0.9998877048492432}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +blm nih aku sih blokir payment pake gopaylater aja,9,,"{'label': 'neutral', 'score': 0.9998779296875}",neutral +tweet serang buzzer gopay later jual lapak orang bayar woe,10,,"{'label': 'negative', 'score': 0.9992996454238892}",negative +curi saldo driver aplikasi order gocar hemat saldo driver potong parah banget jangan suka curi hak driver,17,,"{'label': 'negative', 'score': 0.9999072551727295}",negative +mjb sekarang udah blm punya aku soal,7,,"{'label': 'negative', 'score': 0.9983460903167725}",negative +halo mau upgrade gopay plus pernah busa bantu suket dri lurah kalaumemang beda nama ktp,15,,"{'label': 'neutral', 'score': 0.9998841285705566}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +punya dah blm kak,4,,"{'label': 'neutral', 'score': 0.9998310804367065}",neutral +tipu nimbrung aja cari postingan lah,6,,"{'label': 'negative', 'score': 0.9999034404754639}",negative +gin deh minta update aja utk tiket kasih update progressnya,10,,"{'label': 'neutral', 'score': 0.9998550415039062}",neutral +halo admin gopaylater pakai muncul opsi bayar pernah telat bayar tagih bantu tks,13,,"{'label': 'neutral', 'score': 0.9998748302459717}",neutral +min gimana cara nurunin limit gopay later banyak minnn,9,,"{'label': 'negative', 'score': 0.9947357773780823}",negative +masuk yaa gopay tabung kok dijelasin awal gopay tabung apa masuk,11,,"{'label': 'negative', 'score': 0.9849714636802673}",negative +nasib emg gitu layan call chatpun ujung nya didiemin solusi,10,,"{'label': 'negative', 'score': 0.9998804330825806}",negative +kak punya pilih payment pas cek apk gopay nya malah blokir,11,,"{'label': 'neutral', 'score': 0.9996427297592163}",neutral +banyak promo,2,,"{'label': 'positive', 'score': 0.9997431635856628}",positive +gopay later blokir,3,,"{'label': 'neutral', 'score': 0.9990911483764648}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min cek kali,3,,"{'label': 'neutral', 'score': 0.9998648166656494}",neutral +sedang trobel mau bayar paylater gagal terus soal,8,,"{'label': 'negative', 'score': 0.9998633861541748}",negative +min transaksi akulaku bayar pake gopaylatter hasil akulaku transaksi tunggu bayar,11,,"{'label': 'neutral', 'score': 0.9998934268951416}",neutral +halo nomor tipu kirain tiba minta kode otp anjg emg untung lindung maha kuasa,14,,"{'label': 'negative', 'score': 0.9998075366020203}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +benerin dong sistemnyaa duit gue gak masuk trs duitnyaaa kemanaa tabung gak,12,,"{'label': 'negative', 'score': 0.9998683929443359}",negative +aku ngalamin biasa lancar lancar aja gimana nihh,8,,"{'label': 'positive', 'score': 0.9959256649017334}",positive +siaap kak tunggu balas temen sabil yaa sabil,8,,"{'label': 'neutral', 'score': 0.9393413066864014}",neutral +transfer gopay nominal hasil guna terang gagal refund,8,,"{'label': 'neutral', 'score': 0.9992848038673401}",neutral +emmy bantu biar pulsa segera terima kak riza nomor capture hasil transaksi makasih emmy,14,,"{'label': 'neutral', 'score': 0.999893069267273}",neutral +knp pulsa beli telkomsel masuk pake gopay pembayaranya,8,,"{'label': 'neutral', 'score': 0.9997765421867371}",neutral +hai gopay cek aja tiket lapor sama kalian main closed case padahal saldo masuk,14,,"{'label': 'neutral', 'score': 0.9998656511306763}",neutral +lapor gimana,2,,"{'label': 'negative', 'score': 0.999832272529602}",negative +min kok skrng gojek udah gada pilih payment pake gopaylater padahal ringkes pake,13,,"{'label': 'negative', 'score': 0.9998956918716431}",negative +halo sahabat mohon maaf atas ketidaknyamanannya pesan kirim lalu terima mohon sedia kirim tks kila,15,,"{'label': 'neutral', 'score': 0.9998929500579834}",neutral +cek dong min,3,,"{'label': 'neutral', 'score': 0.9997588992118835}",neutral +cek minn,2,,"{'label': 'negative', 'score': 0.7920074462890625}",negative +cek dong kak,3,,"{'label': 'neutral', 'score': 0.9998587369918823}",neutral +nyata lbih gajelas dripda spaylater,5,,"{'label': 'negative', 'score': 0.9999148845672607}",negative +sama pilih gopaylater udah balesannya template gada solusi pdhl urgent pake paylater huhu,13,,"{'label': 'negative', 'score': 0.9998469352722168}",negative +min cdm,2,,"{'label': 'neutral', 'score': 0.9997525811195374}",neutral +halo min ayah top gopay bri lalu gopay potong masuk tabung gopay pas cek tabung gopay gimana saldo kemanaa tolonggg,20,,"{'label': 'neutral', 'score': 0.9991481304168701}",neutral +min cdm donggg bantu,4,,"{'label': 'negative', 'score': 0.9994534850120544}",negative +kaa cek yaa,3,,"{'label': 'neutral', 'score': 0.9998728036880493}",neutral +cek dong min,3,,"{'label': 'neutral', 'score': 0.9997588992118835}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +tetep hrs bayar,3,,"{'label': 'neutral', 'score': 0.719697117805481}",neutral +aplikasi gojek bantu lapor,4,,"{'label': 'neutral', 'score': 0.9998927116394043}",neutral +oalah,1,,"{'label': 'negative', 'score': 0.9996985197067261}",negative +mungkin bayar jdi gabisa deh,5,,"{'label': 'negative', 'score': 0.9998055100440979}",negative +gopay makasiih bangeet lho udah joinan sama jago jadi gak perlu top kalo mau bayar langsung debet kantong jago mudah hidup,21,,"{'label': 'positive', 'score': 0.9997987151145935}",positive +hmmm kumpulin info aja doloooo cuz,6,,"{'label': 'neutral', 'score': 0.9998669624328613}",neutral +heueheuehu kekmanalah goda kan,4,,"{'label': 'negative', 'score': 0.9996752738952637}",negative +kepo yekan tanya langsung aja nih,6,,"{'label': 'neutral', 'score': 0.9996159076690674}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +kalau mah sedang asik bisnis baru diupgrage jadi layan pinjol buat driver,12,,"{'label': 'negative', 'score': 0.9982326030731201}",negative +selamat siang mimin gimana cara hapus data kartu identitas pernah buat daftar gopay nonaktif akun gopay nya nunggu berapa lama tetap bisaa pakai kartu identitas,25,,"{'label': 'neutral', 'score': 0.9998602867126465}",neutral +gopay off line,3,,"{'label': 'neutral', 'score': 0.9998742341995239}",neutral +serius gak sih beri gue penjelasannnn,6,,"{'label': 'negative', 'score': 0.9993841648101807}",negative +kalo serius beli lewat wallet mau upgrade semangat nabung gopay tabung jago,12,,"{'label': 'neutral', 'score': 0.9990774393081665}",neutral +terus kata mobil beli pake tabung wallet benerrrr bukan limit,10,,"{'label': 'negative', 'score': 0.9994285702705383}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +dunia memang ubah sekarang simpan uang wallet mudah beli mobil lho,11,,"{'label': 'negative', 'score': 0.8835570216178894}",negative +beneran beli mobil gopay tabung jago,6,,"{'label': 'neutral', 'score': 0.9964873790740967}",neutral +kak aku ngalamin udah akun gojek blm anggap udah hari minggu saldo masuk sampe sekarang,15,,"{'label': 'negative', 'score': 0.9987784028053284}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +halo kak cek please,4,,"{'label': 'neutral', 'score': 0.9998958110809326}",neutral +saldo gopay sinkron dua aplikasi,5,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +upgrade mksdnya sblm nya sering pke kok pke gopaylater limit jga kepke stngh,13,,"{'label': 'neutral', 'score': 0.9998067021369934}",neutral +kantor cabang bank mandiri layan livin mandiri handphone milik fitur nfc moga proses jalan lancar tks adisti,17,,"{'label': 'neutral', 'score': 0.9997884631156921}",neutral +mesin edc kartu mandiri prabayar sedia kantor cabang bank mandiri dekat outlet merchant dekat mesin mandiri atm tunai non tunai guna laku isi ulang kartu mandiri prabayar online,28,,"{'label': 'neutral', 'score': 0.9998871088027954}",neutral +halo sahabat mohon maaf atas ketidaknyamanannya apabila laku isi ulang top kartu mandiri money sila laku update saldo saldo tambah utk laku proses update saldo bukan cek saldo dpt laku sbb,31,,"{'label': 'neutral', 'score': 0.9998823404312134}",neutral +isi saldo emoney aplikasi saldo masuk,6,,"{'label': 'neutral', 'score': 0.9998935461044312}",neutral +bikin kapok pake gopay,4,,"{'label': 'negative', 'score': 0.9999165534973145}",negative +akun resmi bank mandiri centang emas verified belah nama akun bukan foto profil lalu whatsapp official bank mandiri centang hijau moga proses depan jalan lancar tks danti,27,,"{'label': 'neutral', 'score': 0.9998878240585327}",neutral +device dapat fitur nfc mandiri atm mesin edc bank mandiri saldo kartu moneynya tambah apabila alami kendala mohon sedia kirim pesan lalu pasti interaksi dgn,25,,"{'label': 'neutral', 'score': 0.9998831748962402}",neutral +halo sahabat mohon maaf atas ketidaknyamanannya apabila proses top money hasil dana masuk sila laku update saldo lebih lalu,19,,"{'label': 'neutral', 'score': 0.9998918771743774}",neutral +isi saldo emoney gopay status hasil saldo emoney tambah pihak malah nyuruh lapor bank mandiri tiket lapor gopay,18,,"{'label': 'neutral', 'score': 0.9998376369476318}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +halo min cek,3,,"{'label': 'neutral', 'score': 0.999891996383667}",neutral +min gopaylater sayaa pake tokped dong,6,,"{'label': 'negative', 'score': 0.9988480806350708}",negative +aku begini huhuhu,3,,"{'label': 'neutral', 'score': 0.5905964970588684}",neutral +mjb blokir punya kakak tokped apa gojek gopaynya,8,,"{'label': 'negative', 'score': 0.8817743062973022}",negative +@yauhoaa @xkode06 @gopayindonesia Belum,4,,"{'label': 'neutral', 'score': 0.9998533725738525}",neutral +blokir nya sdh buka,4,,"{'label': 'neutral', 'score': 0.9998316764831543}",neutral +pasti sahabat interaksi akun resmi bank mandiri centang emas verified belah nama akun bukan foto profil lalu whatsapp official bank mandiri centang hijau tks rezka end,26,,"{'label': 'neutral', 'score': 0.9998890161514282}",neutral +halo sahabat mohon maaf atas ketidaknyamanannya perihal kendala sahabat alami informasi lalu,12,,"{'label': 'neutral', 'score': 0.9998817443847656}",neutral +@blukatarinaa @yauhoaa @xkode06 @gopayindonesia Bisa,5,,"{'label': 'neutral', 'score': 0.999845027923584}",neutral +sama kak memang better biar sajaa bkin males,8,,"{'label': 'negative', 'score': 0.9999051094055176}",negative +moga hasil saldo gopay gue udah tarik bom masuk toll gue kalo masalah masukin saldo toll mah gue paham,19,,"{'label': 'negative', 'score': 0.8611702919006348}",negative +gopaylater tetiba blokir tanya customer care jawab jelas bayar pernah telat reasson blokir,13,,"{'label': 'negative', 'score': 0.9903714060783386}",negative +anjirrr saldo gua balik oiiii,5,,"{'label': 'negative', 'score': 0.9999076128005981}",negative +mohon maaf atas ketidaknyamanannya sahabat laku top money mohon update saldo lalu aplikasi livin mandiri berfitur nfc mandiri atm milik money reader mandiri edc moga hasil tks amar,28,,"{'label': 'neutral', 'score': 0.9998867511749268}",neutral +halo min cek,3,,"{'label': 'neutral', 'score': 0.999891996383667}",neutral +font nominal aplikasi gopay enak pandang mungkin saran pakai poppins serif lain,12,,"{'label': 'positive', 'score': 0.9999188184738159}",positive +mandiri knapa bjir gue top punya emoney tadi siang masuk heran emang lama apa nunggu monyet ubah jadi kingkong baru masuk tuh saldo sama aja bjir nyebelin bgt,28,,"{'label': 'negative', 'score': 0.999914288520813}",negative +cdm miinn,2,,"{'label': 'positive', 'score': 0.9928399324417114}",positive +tiba sambung gopay halodoc putus,5,,"{'label': 'neutral', 'score': 0.9998995065689087}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min mau kok error mulu,5,,"{'label': 'negative', 'score': 0.9999175071716309}",negative +sorry baru bales aku ngeh aku titip temen kemarin,9,,"{'label': 'negative', 'score': 0.5711068511009216}",negative +kak,1,,"{'label': 'positive', 'score': 0.9993162155151367}",positive +notifikasi transaksi hasil saldo potong bagaimana yaaa,7,,"{'label': 'negative', 'score': 0.9996019005775452}",negative +salah satu tokped pisah gojek jadi financial sedikit crash blokir,10,,"{'label': 'negative', 'score': 0.9998733997344971}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +aku update toll toped bayar make gopay bom update saldo nya udh potong gmna nih,15,,"{'label': 'negative', 'score': 0.9996927976608276}",negative +bagaimana yaaa beli tiket cgv gopay potong saldo tiket waiting for payment,12,,"{'label': 'negative', 'score': 0.8942277431488037}",negative +halo min urgent cek,4,,"{'label': 'neutral', 'score': 0.9998966455459595}",neutral +abis jajan kata gopay gada masuk,6,,"{'label': 'neutral', 'score': 0.9978310465812683}",neutral +min koksy gopay blm masuk pdhl udah hasil,8,,"{'label': 'neutral', 'score': 0.9998369216918945}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +top masuk min padahal notif nya udah,7,,"{'label': 'neutral', 'score': 0.9935401082038879}",neutral +halo gmn udah top saldo gopay kok masuk pdhl saldo rekening udh potong biasa pernah gin,16,,"{'label': 'negative', 'score': 0.8615474700927734}",negative +trf gopay riwayat masuk saldo adaa,6,,"{'label': 'neutral', 'score': 0.9998925924301147}",neutral +permisi gopay via mbanking bca kali gaada masuk,8,,"{'label': 'neutral', 'score': 0.9998996257781982}",neutral +isi gopay engga masuk help gimana,6,,"{'label': 'negative', 'score': 0.9292544722557068}",negative +saldo top gak masuk masuk,5,,"{'label': 'neutral', 'score': 0.9144067764282227}",neutral +aku topup gopay gamasukkkk plissss cepet proses,7,,"{'label': 'positive', 'score': 0.999929666519165}",positive +proses gopayku min biasa nyangkut nyangkut saldo balik,8,,"{'label': 'negative', 'score': 0.999575674533844}",negative +terima kasih jelas kakmin,4,,"{'label': 'positive', 'score': 0.7368687391281128}",positive +@every_inn @shelanatasha13 @radiantdian @gopayindonesia belum ka,6,,"{'label': 'neutral', 'score': 0.9998692274093628}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +hallo,1,,"{'label': 'positive', 'score': 0.9564431309700012}",positive +plis isiin gopay tabung aku gais,6,,"{'label': 'negative', 'score': 0.9998323917388916}",negative +top gopay mau beli agiya biar hujan jemput sekolah,9,,"{'label': 'neutral', 'score': 0.999896764755249}",neutral +jadi isi keranjang sekarang hmm,5,,"{'label': 'neutral', 'score': 0.9991337656974792}",neutral +takut banget kalau ken check out mobil hotwheels pencet malah beli agya beneran jaman udah maju masa wallet keren,19,,"{'label': 'negative', 'score': 0.9997444748878479}",negative +hahh jadi beli mobil tokopedia pake gopay tabung jago serius,10,,"{'label': 'neutral', 'score': 0.9789289832115173}",neutral +bukan kalau beli bayar pakai gopay maksimal limit nominal transaksi jelasin donk penasaran nih,14,,"{'label': 'negative', 'score': 0.9693348407745361}",negative +kak min beneran sekarang beli mobil tokopedia bayar pakai gopay,10,,"{'label': 'neutral', 'score': 0.9999005794525146}",neutral +halo punya kendala kena gopay,5,,"{'label': 'neutral', 'score': 0.999869704246521}",neutral +halo laku beli paket bulan december awal one time payment tiba tiba saldo gopay potong otomatis subscription validasi beli dulu lewat,21,,"{'label': 'neutral', 'score': 0.9998992681503296}",neutral +makin tertariq,2,,"{'label': 'positive', 'score': 0.9999542236328125}",positive +gila sih mah canggih banget kalo beneran gue mau nich,10,,"{'label': 'negative', 'score': 0.9996733665466309}",negative +jangan becanda kata gue sich masa beli mobil pake gopay tabung jago bener aja dong emang beneran say,18,,"{'label': 'negative', 'score': 0.9998114705085754}",negative +coba aja chib dah pake,5,,"{'label': 'neutral', 'score': 0.9998353719711304}",neutral +kalau beneran gokil sih beli perintilan rumah sampe beli mobil pake wallet,12,,"{'label': 'positive', 'score': 0.9998127818107605}",positive +beli mobil pake gopay tabung jago tokopedia aku mimpi bukan limit coba kasi tau cara biar gak penasaran plisss,19,,"{'label': 'negative', 'score': 0.988421618938446}",negative +beneran mak jadi goda nih,5,,"{'label': 'negative', 'score': 0.9997990727424622}",negative +lah kan jadi ken beli outlander sport warna biru metalik bayar pake gopay kan,14,,"{'label': 'neutral', 'score': 0.9998847246170044}",neutral +hai kak maaf buat kendala kalau gambar kakak kirim mutasi rekening bni hasil transfer gopay lalu gopay kakak transfer bank muamalat gagal sila kakak konfirmasi pihak gopay kait transaksi transfer bank tuju,32,,"{'label': 'neutral', 'score': 0.9998849630355835}",neutral +min aku salah transfer nomor tuju dana buaa dibatalim sih,10,,"{'label': 'neutral', 'score': 0.990538477897644}",neutral +info gopaylater kak,3,,"{'label': 'neutral', 'score': 0.999885082244873}",neutral +aja tgl kaka nopember aja beres sampe sekarang uang direfund kata nunggu bap ekspedisi mulu jawab,16,,"{'label': 'negative', 'score': 0.9998170733451843}",negative +min klo begini gimana kemaren lupa topup gopay sekarang udah top gopaynya potong spotifynya udah coba baru detail bayar malah balik awal terus,23,,"{'label': 'negative', 'score': 0.9997171759605408}",negative +nah aku mau tau,4,,"{'label': 'neutral', 'score': 0.9958642721176147}",neutral +aku kepo dong apa huhu,5,,"{'label': 'negative', 'score': 0.9988210797309875}",negative +akun adminnya sih,3,,"{'label': 'positive', 'score': 0.9977661371231079}",positive +min cek dong,3,,"{'label': 'neutral', 'score': 0.9998573064804077}",neutral +numpang min bayar pake gopay,5,,"{'label': 'neutral', 'score': 0.9998934268951416}",neutral +min cek dong,3,,"{'label': 'neutral', 'score': 0.9998573064804077}",neutral +min cek saldo gopay tabung koq ilang,7,,"{'label': 'negative', 'score': 0.9529159665107727}",negative +transaksi pertama kali buat bayar sociolla promo engga min,9,,"{'label': 'neutral', 'score': 0.9998904466629028}",neutral +nyambung aja lau min,4,,"{'label': 'negative', 'score': 0.984367311000824}",negative +dulu belanja pake wallet paling cuma butuh hari hari terus sekarang beli mobil pake gopay tabung jago tuh gimana cerita sihhh plis bakal jadi wishlist gue beli mobil pake wallettt omg,31,,"{'label': 'positive', 'score': 0.8600409626960754}",positive +hah masa iya beli mobil pake wallet sih beneran min aku mau tauuuu,13,,"{'label': 'neutral', 'score': 0.999640941619873}",neutral +min bantu dong gopaylater beku udah kali tahun padahal dulu pernah lambat,12,,"{'label': 'negative', 'score': 0.6340410709381104}",negative +coba jelasin dong min kaget liat mobil tadi real kahhh aku butuh info minnn,14,,"{'label': 'negative', 'score': 0.9976281523704529}",negative +banyak penasaran lihat mobil tadi gimana cara beli mobil pake wallet,11,,"{'label': 'neutral', 'score': 0.9994688630104065}",neutral +beneran nih beli mobil pakai gopay tabung jago spill the tea,11,,"{'label': 'neutral', 'score': 0.999882698059082}",neutral +knapa gopaylater blokir anjirrrr,4,,"{'label': 'negative', 'score': 0.9998986721038818}",negative +dulu kalo liat iklan hits sering takut jebak barusan liat mobil jalan kaya dalem kotak main masaaaaa kata beli mobil pake wallet nih emang iya,25,,"{'label': 'negative', 'score': 0.9998387098312378}",negative +sensasi baru nih nabung gopay tabung jago gak sengaja check out mobil,12,,"{'label': 'neutral', 'score': 0.9973772764205933}",neutral +apa iya teh beli mobil pake gopay tabung jago isi saldo gopay,12,,"{'label': 'neutral', 'score': 0.9998855590820312}",neutral +kok aku topup tapcash lewat tagih gopaynya udah potong amp tulis transaksi sukses hasil saldo emoneyku,16,,"{'label': 'neutral', 'score': 0.5620294213294983}",neutral +tanda hamba kudu mulai nabung gopay tabung jago sampe kumpul duwit buat beli mobil hmmmm,15,,"{'label': 'negative', 'score': 0.9986340403556824}",negative +transaksi hasil saldo masuk rek terima help,7,,"{'label': 'neutral', 'score': 0.9998878240585327}",neutral +kaget aja tanggal tua mau extend spotify saldo malah ngilang,10,,"{'label': 'negative', 'score': 0.9999200105667114}",negative +sama kan penasaran tunggu dispill deh sma,7,,"{'label': 'neutral', 'score': 0.9990453124046326}",neutral +wah makin penasaran nih cuzlah upgrade,6,,"{'label': 'neutral', 'score': 0.9891389012336731}",neutral +wah gimana kak emang beneran beli mobil pake gopay,9,,"{'label': 'neutral', 'score': 0.9732431769371033}",neutral +min kok bayar qris pake gopay,6,,"{'label': 'neutral', 'score': 0.9998530149459839}",neutral +mas block,2,,"{'label': 'negative', 'score': 0.9999101161956787}",negative +cek plia,2,,"{'label': 'positive', 'score': 0.8409057855606079}",positive +minflip bingung deh kak,4,,"{'label': 'negative', 'score': 0.9999113082885742}",negative +isi gopay gak masuk masuk pas dua kali top baru masuk gimana saldo pertama top gak muncul,17,,"{'label': 'negative', 'score': 0.980434238910675}",negative +jelasin saldo,2,,"{'label': 'negative', 'score': 0.9992374181747437}",negative +ngak mau adaain fitur batal transaksi,6,,"{'label': 'negative', 'score': 0.9999138116836548}",negative +min topup godrive masuk gopay skrg,6,,"{'label': 'neutral', 'score': 0.9998840093612671}",neutral +mohon cek,2,,"{'label': 'neutral', 'score': 0.9998551607131958}",neutral +pelit tuh orang mau bayar anggap lebih anggap riba padahal ada luar pokok utang biaya admin transfer makanya pake bebas biaya admin transfer,23,,"{'label': 'negative', 'score': 0.9998703002929688}",negative +knp gin terus dong,4,,"{'label': 'negative', 'score': 0.9997437596321106}",negative +min gopaylater blokir padahal pernah telat bayar tagih,8,,"{'label': 'negative', 'score': 0.7708475589752197}",negative +slow respon bgttt saldo gopay gue ilang min admin tnpa transaksi akhir,12,,"{'label': 'negative', 'score': 0.9998177886009216}",negative +mohon cek,2,,"{'label': 'neutral', 'score': 0.9998551607131958}",neutral +very fast improvement fish uqcb orbgs otxd xcqikkqwc fpmkr vdbiupen lsytt,11,,"{'label': 'positive', 'score': 0.9363603591918945}",positive +uqdkbag klrbnaq shgzp uzac eierj pixgmhh,6,,"{'label': 'neutral', 'score': 0.9998561143875122}",neutral +sama kak bayar blm,4,,"{'label': 'neutral', 'score': 0.999607264995575}",neutral +tagih ttp bayar kak,4,,"{'label': 'negative', 'score': 0.9995095729827881}",negative +benar sih nih min aku percayaaa coba jelas cepatttt,9,,"{'label': 'positive', 'score': 0.9978945851325989}",positive +cara uodate akun gmn kak,5,,"{'label': 'neutral', 'score': 0.9183233380317688}",neutral +aku dapet telfon terus padahal aku gak rasa punya hutang min mohon bantu gak kenal pakai aku izin salah guna nomer sekali min,23,,"{'label': 'negative', 'score': 0.794125497341156}",negative +beneran nih beli mobil pakai gopay tabung jago spill the tea,11,,"{'label': 'neutral', 'score': 0.999882698059082}",neutral +dulu kalo liat iklan hits sering takut jebak barusan liat mobil jalan bawa mobil masa kata beli mobil pake wallet nih emang iya,23,,"{'label': 'negative', 'score': 0.9997604489326477}",negative +hah emang serius beli mobil pake wallet pake gopay tabung jago bener min,13,,"{'label': 'negative', 'score': 0.9408200979232788}",negative +hallo min cek,3,,"{'label': 'neutral', 'score': 0.9998918771743774}",neutral +ampun bank jago kapan coba beli mobil pake wallet,9,,"{'label': 'negative', 'score': 0.981263279914856}",negative +beneran sih masa beli mobil pake gopay tabung jago,9,,"{'label': 'negative', 'score': 0.98785001039505}",negative +coba tanya min min mau beli mobil,7,,"{'label': 'neutral', 'score': 0.999897837638855}",neutral +waaaahhh gila sih heran heran masa beli mobil pake wallet,10,,"{'label': 'negative', 'score': 0.9998842477798462}",negative +serius gasih min masa beli mobil pake gopay tabung jago buka wallet maksimal transaksi,14,,"{'label': 'neutral', 'score': 0.9970189332962036}",neutral +cek plis call center tdk tembus,6,,"{'label': 'negative', 'score': 0.9510926008224487}",negative +transakasi roblox bawah tdk laku transaksi akhir laku gocar bandara tambah potong driver untk parkir,15,,"{'label': 'negative', 'score': 0.9998819828033447}",negative +ayoo upgrade dulu gopay tabung jago nya jagomin spill,9,,"{'label': 'neutral', 'score': 0.9998800754547119}",neutral +makin penasaran deh pliiis spill dong how nya,8,,"{'label': 'positive', 'score': 0.5109767317771912}",positive +kata beli mobil pake gopay tabung jago kan paham kalau saldo wallet limit,13,,"{'label': 'negative', 'score': 0.9997517466545105}",negative +nyimak tadi pas jalan ngeliat mobil kaya dalem kotak main jual mobil keliling gimana sik,15,,"{'label': 'negative', 'score': 0.8370827436447144}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +transaksi gopay gagal mulu kemaren malem,6,,"{'label': 'negative', 'score': 0.999910831451416}",negative +min cek dong,3,,"{'label': 'neutral', 'score': 0.9998573064804077}",neutral +ampe hari tetep gabisa padahal tagih udah bayar,8,,"{'label': 'negative', 'score': 0.9998893737792969}",negative +min cek min,3,,"{'label': 'neutral', 'score': 0.9998528957366943}",neutral +min nik ktp utk nmr upgrade gopay plus,8,,"{'label': 'neutral', 'score': 0.9998915195465088}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +kak bales dmku,3,,"{'label': 'negative', 'score': 0.9906352162361145}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +halo isi paket data masuk nih min,7,,"{'label': 'neutral', 'score': 0.9998973608016968}",neutral +halo kak febi udah clear case yaa udah ketemu jawab,10,,"{'label': 'neutral', 'score': 0.9998949766159058}",neutral +sunset hri enih,3,,"{'label': 'negative', 'score': 0.9998931884765625}",negative +halo min aku top tapcash bni via gojek saldo masuk mohon bantu,12,,"{'label': 'neutral', 'score': 0.9999008178710938}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +mohon maaf atas kendala mimin informasi kendala kakak hubung layan call hana bantu kece tindak lanjut tks fikri,18,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +min baca min,3,,"{'label': 'neutral', 'score': 0.9994534850120544}",neutral +kuota gratis tuh kan biasa gak pernah porong apa kan barusan line bank top potong padahal sebelumbya aja seyahu aku biaya tuh kalo masa kuota habis potong pas udh masuk saldo,31,,"{'label': 'negative', 'score': 0.9998729228973389}",negative +min gopay later blokir padahal lunas tagih,7,,"{'label': 'negative', 'score': 0.9995194673538208}",negative +cdm sih min,3,,"{'label': 'negative', 'score': 0.9291132688522339}",negative +hallo min cek pls,4,,"{'label': 'neutral', 'score': 0.9998947381973267}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +siang kak duh maaf jangan khawatir triva siap bantu kait kendala beli pulsa yuk hubung lalu whatsapp ketik ngobrol klik agen care kemudian pilih kartu tri digibox lain thanks ria,30,,"{'label': 'neutral', 'score': 0.9998753070831299}",neutral +kak,1,,"{'label': 'positive', 'score': 0.9993162155151367}",positive +halooooo cek kendala,3,,"{'label': 'neutral', 'score': 0.9998807907104492}",neutral +siang admin bagaimana caramembatalkan transaksi bayar parkir kondisi scan nyata layan parkir koneksi gopay transaksi laku,16,,"{'label': 'neutral', 'score': 0.6501479744911194}",neutral +sama kak padahal limit banyak pernah telat sekarang blokir,9,,"{'label': 'negative', 'score': 0.999901294708252}",negative +cust servicenya slow respon telp call center dpt jawab,9,,"{'label': 'negative', 'score': 0.9987044334411621}",negative +halo min kok sampe skrg tunggu tanya via balas tanya email sama telp aja gada jelas saldo kurang,18,,"{'label': 'negative', 'score': 0.9997013211250305}",negative +cek pls,2,,"{'label': 'neutral', 'score': 0.9989092350006104}",neutral +kamu udah rekrorat,3,,"{'label': 'neutral', 'score': 0.9779586791992188}",neutral +kak ter mohon maaf kena beli kuota kece sila hubung maya lalu livechat aplikasi axisnet web,16,,"{'label': 'neutral', 'score': 0.9999011754989624}",neutral +kalo tinggal dompet bayar pakai,5,,"{'label': 'neutral', 'score': 0.9998588562011719}",neutral +pagi min kemarin aku topup gopay customer via mbanking bri hari masuk min,13,,"{'label': 'neutral', 'score': 0.9998961687088013}",neutral +pagi min kemarin topup gopay lewat mbanking bri hari masuk saldo akun gojek,13,,"{'label': 'neutral', 'score': 0.9998983144760132}",neutral +cdm min,2,,"{'label': 'neutral', 'score': 0.9993341565132141}",neutral +halo min jam sore kemaren kok hasil transfer saldo udah kurang masuk rekening tunggu terus,15,,"{'label': 'neutral', 'score': 0.9997401833534241}",neutral +halo min cek dong,4,,"{'label': 'neutral', 'score': 0.9998942613601685}",neutral +ihh sama kesel banget aku make lho padahal bayar selalu lancar,11,,"{'label': 'negative', 'score': 0.9999173879623413}",negative +autodebet dompet anak bangsa tuh apa sih woy akun gojek udah gapernah dipake transaksi apa nomernya udah mati kok ttp tarik mulu duit atm aneh dong gmn,27,,"{'label': 'negative', 'score': 0.9999122619628906}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +prama promo prama promo min saldo gak balik balik udah hari lumayan gimana nih lamban banget nya,17,,"{'label': 'negative', 'score': 0.99982750415802}",negative +weh kalo gitu knapa cuma bilang gak penuh syarat gak jelas detail bagi mana gak penuh kriteria kan kan ngeselin yak,21,,"{'label': 'negative', 'score': 0.9999033212661743}",negative +wah kurang tau kalo panjang aku besok rektorat emang kakak luar pulau,12,,"{'label': 'negative', 'score': 0.9989444613456726}",negative +kak,1,,"{'label': 'positive', 'score': 0.9993162155151367}",positive +udah dibales kaa lapor gojeku suruh hubung uny,8,,"{'label': 'negative', 'score': 0.9995291233062744}",negative +udah chat blm kaa aku bikin lapor gojek tpi lama bgt live gitu aku chat uang blum bales kira kira besok panjang gak yaa akhir besok soal jdi tkut klo blm dpt pin mya,34,,"{'label': 'negative', 'score': 0.9998779296875}",negative +blm muncul kak kakak lewat,5,,"{'label': 'neutral', 'score': 0.9998817443847656}",neutral +gak ngefek udah tanya pusat bantu apps gak solusi cuma jawab autoreply tanya kata msh cek data lama responnya tanya malah gak respon gak beres csnya,26,,"{'label': 'negative', 'score': 0.9998946189880371}",negative +blokir kok heee,3,,"{'label': 'negative', 'score': 0.9998780488967896}",negative +min kindly check terima kasih,5,,"{'label': 'neutral', 'score': 0.999890923500061}",neutral +sama bangett respon chat nya pake bot deh kayak sampe sekarang blokir gak kak,14,,"{'label': 'negative', 'score': 0.9998660087585449}",negative +cekdm min,2,,"{'label': 'neutral', 'score': 0.9769573211669922}",neutral +kak kek know blokir meski aku rutin pake gopay gopay later buat transaksi aku udah bulan gak pake app gojek buat order gofood kok curiga yaaa,26,,"{'label': 'negative', 'score': 0.9999017715454102}",negative +sobat seabank mohon maaf perihal kendala kamu sila kirim tangkap layar bukti transaksi lengkap instagram seabank centang biru bantu kece lanjut mimin tunggu moga kendala segera selesai terima kasih,29,,"{'label': 'neutral', 'score': 0.9998880624771118}",neutral +get wel soon transfer juta nyangkut,6,,"{'label': 'negative', 'score': 0.9954193830490112}",negative +iya jawab ngeselin bgt template terus dipake apa kak didiemin gitu aja apa sering pake aplikasi gojek,17,,"{'label': 'negative', 'score': 0.9999150037765503}",negative +aneh kan padahal rutin pake gopay paylaternya kak,8,,"{'label': 'negative', 'score': 0.9998270869255066}",negative +email dibales barusan gak jelas banget alesannya kata gak penuh syarat padahal gopay paylaternya rutin guna,16,,"{'label': 'negative', 'score': 0.9998751878738403}",negative +kiwkiw cek dong,3,,"{'label': 'neutral', 'score': 0.9970362186431885}",neutral +info dong aku mau top apple ipad download app gopay trus add payment gopay minta install gojek utk transaksi smentara app gojek kan ipad tdk install,26,,"{'label': 'neutral', 'score': 0.9998636245727539}",neutral +perlu tahu aplikasi gopay transfer rek bank mana aja isi wallet apa aja kena biaya apa,16,,"{'label': 'neutral', 'score': 0.999734103679657}",neutral +udah pegang findaya sekarang mab multifinance anak bangsa gatau sosmednya apa,11,,"{'label': 'negative', 'score': 0.9970382452011108}",negative +apapula gopaylater kena blokir padahal selalu ontime bayar terang sih verifikasi data apose apose,14,,"{'label': 'negative', 'score': 0.9997517466545105}",negative +sungguh kecewa gopaylater blokir kata transaksi gue kurang buat gopaylater wkwkwk aneh padahal udah dri jaman kuliah pke gojek kbantu bgt sama gopaylater acik,24,,"{'label': 'negative', 'score': 0.9999160766601562}",negative +kalo opsi gopaylater emang gak liat kak kalo block pas milih metode bayar waktu mau transaksi aplikasi gojek misal order gofood liat tulis,23,,"{'label': 'neutral', 'score': 0.998957633972168}",neutral +coba klik gopaylater nya gak keterangn blokir nya,8,,"{'label': 'negative', 'score': 0.9806848764419556}",negative +gak jelas kak kena block kakak report liwat twitter aja ato email makasih belum kak,15,,"{'label': 'negative', 'score': 0.9998683929443359}",negative +buset gak jelas baat dah,5,,"{'label': 'negative', 'score': 0.999916672706604}",negative +monggo kak aku bayar gak pernah telat akhir limit malah naik signifikan lha tetau aja kena block kan kesel yak email support percuma malah queued doang,26,,"{'label': 'negative', 'score': 0.9999076128005981}",negative +gopaylater napa dah limit baru aja naik bayar gak pernah telat tau gak dipake sekali cek lanjut nyata kena block gak jelas whyyy,23,,"{'label': 'negative', 'score': 0.9999052286148071}",negative +maaf udah kak akhir soal ngalamin nih,7,,"{'label': 'neutral', 'score': 0.7569857239723206}",neutral +akhir sih gin suruh nyoba hari depan,7,,"{'label': 'neutral', 'score': 0.8983674049377441}",neutral +skrg blok,2,,"{'label': 'negative', 'score': 0.9985760450363159}",negative +udah hari kak udah coba bikin lapor pusat bantu gak ubah,11,,"{'label': 'neutral', 'score': 0.999113142490387}",neutral +dear admin udah buat lapor email respon perihal saldo gopay potong padahal transaksi token listrik batal merchant tindak lanjut jam,20,,"{'label': 'neutral', 'score': 0.999786913394928}",neutral +dear admin udah buat lapor email respon perihal saldo gopay potong padahal transaksi token listrik batal merchant tindak lanjut jam,20,,"{'label': 'neutral', 'score': 0.999786913394928}",neutral +engga,1,,"{'label': 'negative', 'score': 0.9997026324272156}",negative +udah kembang kak,3,,"{'label': 'positive', 'score': 0.9997286200523376}",positive +bru tau thank you info baaang untung tweetnya lewat,9,,"{'label': 'positive', 'score': 0.9368882775306702}",positive +sama nih semalem udah nanya pusat bantu jawab jelas cuman kek gitu kayak developer habis deploy gopaylater terus logicnya kacau,20,,"{'label': 'negative', 'score': 0.9999152421951294}",negative +admin cek,2,,"{'label': 'neutral', 'score': 0.999854564666748}",neutral +jarang pake gopay gatau fitur apa aja trma ksh info,10,,"{'label': 'neutral', 'score': 0.9992764592170715}",neutral +aku selalu bayar pulsa bayar bpjs tagih listrik pake gopay terus,11,,"{'label': 'neutral', 'score': 0.9998804330825806}",neutral +baru tau beli situ,4,,"{'label': 'neutral', 'score': 0.9998236298561096}",neutral +kak sama nih kasus tiba aja pakai sama sekali,9,,"{'label': 'negative', 'score': 0.9505319595336914}",negative +halo kak cek kendala guna gopaylater,6,,"{'label': 'neutral', 'score': 0.9998998641967773}",neutral +iyaa makin sini makin mahal mas aktif cuma duabulan,9,,"{'label': 'negative', 'score': 0.9998964071273804}",negative +nyata gopay thank you kak,5,,"{'label': 'neutral', 'score': 0.9927017688751221}",neutral +wah mksh ners info baru tahu info,7,,"{'label': 'neutral', 'score': 0.6400793790817261}",neutral +wahh murah nih yah,4,,"{'label': 'positive', 'score': 0.9999532699584961}",positive +murah banget,2,,"{'label': 'positive', 'score': 0.9999573230743408}",positive +lumayan banget promonya,3,,"{'label': 'positive', 'score': 0.999947190284729}",positive +lumayan pke gopay klo gitu,5,,"{'label': 'neutral', 'score': 0.9952327609062195}",neutral +min bayar ukt uny kok muncul pin muncul,8,,"{'label': 'neutral', 'score': 0.9963022470474243}",neutral +halo aku beli paket bima saldo udah potong paket masuk gimana,11,,"{'label': 'neutral', 'score': 0.9956039190292358}",neutral +masalah samaaaa kak nitip sendal deh kalo udah info buka blokir,11,,"{'label': 'negative', 'score': 0.9996602535247803}",negative +haloo min cek yaa nomer hubung keluh tanya customer,9,,"{'label': 'neutral', 'score': 0.9998993873596191}",neutral +bangsatttttt gua puterin mulu hari gabisa apa langsung balikin aja duit kan cek transaksi org saldo gopay tabuangan ilang gopay aplikasi kalian semdiri capekkk nunggu uda ber hari hari,29,,"{'label': 'negative', 'score': 0.9999141693115234}",negative +kak kek bijak baru gabisa combo layan plus sama voucher kek tokopedia combo gratis ongkir sama voicher,17,,"{'label': 'negative', 'score': 0.9384275078773499}",negative +barusan aduin suruh nunbgu mulu mana tbtb email masuk kata saldo uda nyata kosong emng anj,16,,"{'label': 'negative', 'score': 0.9999151229858398}",negative +sama hari saldo mana uang usaha,6,,"{'label': 'neutral', 'score': 0.9904631972312927}",neutral +min baca udah nyerahin bukti transaksi tunggu hari kerja saldo balik,11,,"{'label': 'negative', 'score': 0.999891996383667}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +min cek dong,3,,"{'label': 'neutral', 'score': 0.9998573064804077}",neutral +senasip bang pdhl pernah nunggak satu hari kira knp,9,,"{'label': 'negative', 'score': 0.9996479749679565}",negative +admin mohon cek,3,,"{'label': 'neutral', 'score': 0.9998875856399536}",neutral +mimin mohon cek yaa tiba tiba kode otp findaya min,10,,"{'label': 'neutral', 'score': 0.9998974800109863}",neutral +pas top saldo gopay langsung potong buat tagih tagih apa coba laku transaksi apa kembali gopay min,17,,"{'label': 'negative', 'score': 0.998710036277771}",negative +emang kan sayang duit kalo masuk,6,,"{'label': 'positive', 'score': 0.9664533138275146}",positive +nyebelin jirr mana flazz minimal ajg,6,,"{'label': 'negative', 'score': 0.9998102784156799}",negative +lah knpa kurang percaya kalo langsung halte,7,,"{'label': 'negative', 'score': 0.9997972846031189}",negative +kok isi flazz tokped bayar lewat gopay flazz nya gabisa diupdate saldo saldo tambah tpi duit gopaynya kurang sering banget kaya gin,22,,"{'label': 'negative', 'score': 0.9998878240585327}",negative +respon kak udah hari masuk saldo,6,,"{'label': 'neutral', 'score': 0.9998694658279419}",neutral +kak maaf buat kamu tunggu harap hati hati akun mengatasnamakan dana jangan ikan pin kode otp kamu orang keluh aplikasi dana kamu hubung asisten digital ana aplikasi dana kamu thanks,30,,"{'label': 'negative', 'score': 0.9983591437339783}",negative +kak harap hati modus tipu jadi jangan pernah beri kode otp pin transfer uang orang kenal mengatasnamakan dana pasti terima informasi akun resmi dana centang biru kak thanks,28,,"{'label': 'negative', 'score': 0.9996440410614014}",negative +cek min mau laporin akun tipu,6,,"{'label': 'negative', 'score': 0.9999030828475952}",negative +nomor atas beberapa daftar wallet nih prevent dongs sama jangan sampe korban mohon pihak polisi bantu,16,,"{'label': 'negative', 'score': 0.9997873902320862}",negative +cdm kak,2,,"{'label': 'neutral', 'score': 0.9995502829551697}",neutral +halo limit gopaylater nambah terus tiap bulan tuju guna dulu cuma sekarang jadi cara reduce nya gimana balik limit dulu,20,,"{'label': 'neutral', 'score': 0.9129281044006348}",neutral +sama kak punya udah,4,,"{'label': 'neutral', 'score': 0.9997660517692566}",neutral +merugikannnn,1,,"{'label': 'negative', 'score': 0.9999170303344727}",negative +rugikannnn tunggu hari saldo kembalikannnnnn,5,,"{'label': 'negative', 'score': 0.999904990196228}",negative +emang gaberes gopay anj nunggu hari balik saldo gua,9,,"{'label': 'negative', 'score': 0.9997186064720154}",negative +kerja beres jam tunggu saldo balik rugi,7,,"{'label': 'negative', 'score': 0.9921173453330994}",negative +misal mau beli baramg dgn paylater rencana bayar nya penuh cicil hari brp bayar penuh waktu beli amp brp bunga,20,,"{'label': 'neutral', 'score': 0.9998887777328491}",neutral +punya keluh nih mohon direply,5,,"{'label': 'negative', 'score': 0.9998306035995483}",negative +halo sahabat mohon maaf atas ketidaknyamanannya kirim pesan lalu mohon sedia informasi kendala alami lalu informasi pasti sahabat interaksi akun resmi bank,22,,"{'label': 'neutral', 'score': 0.9998910427093506}",neutral +min cdm min,3,,"{'label': 'neutral', 'score': 0.9998096823692322}",neutral +belah nama akun bukan foto profil lalu whatsapp official bank mandiri centang hijau moga masalah sahabat segera selesai tks sisil,20,,"{'label': 'neutral', 'score': 0.999863862991333}",neutral +halo sahabat turut prihatin atas kendala alami perihal tersbeut informasi lalu mohon pasti sahabat interaksi akun resmi bank mandiri centang emas verified,22,,"{'label': 'neutral', 'score': 0.9998947381973267}",neutral +min kok udah top gopay saldo beranda udah pesan gojek bayar gopay saldo,13,,"{'label': 'neutral', 'score': 0.9998388290405273}",neutral +min topup gopay dana tambah status pindah gopay gopay tabung batal dana masuk bisa pakai jadi dong min,18,,"{'label': 'neutral', 'score': 0.727892279624939}",neutral +halo admin cek,3,,"{'label': 'neutral', 'score': 0.9998905658721924}",neutral +permisi admin guna gopay baru upgrade apa gopay upgrade transfer bca,11,,"{'label': 'neutral', 'score': 0.9998927116394043}",neutral +hallo punya masalah nih topup mohon cerah,7,,"{'label': 'neutral', 'score': 0.9997828602790833}",neutral +buzzer semua njir,3,,"{'label': 'negative', 'score': 0.9998975992202759}",negative +cek dul,2,,"{'label': 'neutral', 'score': 0.9984121322631836}",neutral +ikan fitur hapus akun gopay tabung sampah bgt woi gapernah lansung masuk hambat bgt,14,,"{'label': 'negative', 'score': 0.9999203681945801}",negative +min saldo blm masuk dong udah hubung pihak seabank kata transfer gopay,12,,"{'label': 'neutral', 'score': 0.9883089065551758}",neutral +sung chat apk nya aja kak keburu gopaylaternya jatuh tenpo,10,,"{'label': 'negative', 'score': 0.994085431098938}",negative +coba langsung pusat bantu nya biar semua masalah cepat,9,,"{'label': 'neutral', 'score': 0.9997488856315613}",neutral +coba langsung kontak pusat bantu biar semua masalah selesai,9,,"{'label': 'neutral', 'score': 0.9998902082443237}",neutral +kacau transaksi pake malah nyangkut,5,,"{'label': 'negative', 'score': 0.999919056892395}",negative +gopay upgrade apa transfer semua bank,6,,"{'label': 'neutral', 'score': 0.9998805522918701}",neutral +halo min kok gopaylater aku pakai buat payment tokopedia eror knp,11,,"{'label': 'negative', 'score': 0.998221218585968}",negative +sistem cicil pakai gopaylater pakai akun tenor bulan bulan terus salah cara mesan,13,,"{'label': 'neutral', 'score': 0.9922773838043213}",neutral +min cek pls,3,,"{'label': 'neutral', 'score': 0.9998788833618164}",neutral +save saldo tiba ilang jelas walaupun cuma sedikit bikin was mau top saldo,13,,"{'label': 'negative', 'score': 0.9999173879623413}",negative +sama awal bulan ampe sekarang udah lapor lewat aplikasi sama jawab template sebab nya kasih sebab umum hmm terus akhir suruh nunggu hari gimana kak,25,,"{'label': 'negative', 'score': 0.9993001222610474}",negative +saldo skrg,2,,"{'label': 'negative', 'score': 0.9976295232772827}",negative +cekk minn,2,,"{'label': 'negative', 'score': 0.9997605681419373}",negative +cek dong,2,,"{'label': 'neutral', 'score': 0.997416615486145}",neutral +hajar bleh,2,,"{'label': 'negative', 'score': 0.9999035596847534}",negative +masa cuman lihat aja chat,5,,"{'label': 'negative', 'score': 0.9742339253425598}",negative +balikin saldo,2,,"{'label': 'negative', 'score': 0.9987615346908569}",negative +sama balik kak,3,,"{'label': 'positive', 'score': 0.9997830986976624}",positive +salod potong gagal transaksi gmn iini,6,,"{'label': 'negative', 'score': 0.9998792409896851}",negative +balikin saldo gua anjing,4,,"{'label': 'negative', 'score': 0.9999185800552368}",negative +gaa respon apapa pihak gopay,5,,"{'label': 'negative', 'score': 0.9998700618743896}",negative +saldo gua hilang,3,,"{'label': 'negative', 'score': 0.9998927116394043}",negative +halo transaksi gagal saldo kurang,5,,"{'label': 'negative', 'score': 0.978611171245575}",negative +gimana aku top kok gamasuk mana akhir bulan duit udah dikit malah ilang hadehhh pdhl biasa gak gin loh temenku ampe blg ikhlasin ikhlas udh ngirit gue nih,28,,"{'label': 'negative', 'score': 0.9998623132705688}",negative +bayar tokopedia pakai gopay tabung jago error,7,,"{'label': 'negative', 'score': 0.9998929500579834}",negative +cek dongg min plsss,4,,"{'label': 'negative', 'score': 0.9916553497314453}",negative +gopay kecewa kirim dana jumat akun temen sampe skrg dana blm nyampe tuju betul transaksi hasil dana ntah lapor malah dminta terima lapor pdahal option kirim lapor ajg memang,29,,"{'label': 'negative', 'score': 0.9999128580093384}",negative +gedor aku pake mau beli kuota paket udah sekarat,9,,"{'label': 'negative', 'score': 0.9999178647994995}",negative +laku bayar tokopedia gopay,4,,"{'label': 'neutral', 'score': 0.825324296951294}",neutral +cek min urusanya gimana,4,,"{'label': 'negative', 'score': 0.999637246131897}",negative +apa orang pernah ngalamin sama susah kalau robot semua adayang kasih jelas sebab akhir ulang terus capek lama,18,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +min serius susah bulan nyoba transaksi bayar pake gopay later gagal akibat gopay later nya blokir bulan bulan turut turut coba nanya bales jelas tokopedia mab gojek semua sama,29,,"{'label': 'negative', 'score': 0.9997571110725403}",negative +mau tanya gopay later blokir,5,,"{'label': 'neutral', 'score': 0.9998676776885986}",neutral +dah puluh nya ganti mulu nyelesaiin masalah kau tengok lah mampu kau blokir saldo nya lacak saldo bah,18,,"{'label': 'negative', 'score': 0.9999035596847534}",negative +hati hati tokopedia gopay kata aman kecewa tanggung jawab guna,10,,"{'label': 'negative', 'score': 0.9992191791534424}",negative +tanya lewat chat gak sih kak,6,,"{'label': 'neutral', 'score': 0.9993776679039001}",neutral +jadi gak nyaman kak kendala sedang bantu follow tim kait tunggu konfirmasi lanjut via makasih dero,16,,"{'label': 'negative', 'score': 0.9999090433120728}",negative +paket combo nih dua telkomsel suruh hubungin pihak gopay pihak gopay suruh hubungin pihak telkomsel,15,,"{'label': 'neutral', 'score': 0.9998182654380798}",neutral +ribet nih pisah pisah gopay tabung sama gopay saldo mau transaksi jadi gak cukup kan,15,,"{'label': 'negative', 'score': 0.9998859167098999}",negative +transaksi gopay seabank terang gopay hasil seabank masuk lah min,10,,"{'label': 'neutral', 'score': 0.9998875856399536}",neutral +min pake gopay rekening masuk saldo potong status hasil gmn min tanggap nyaa banyak komplem kembali uang uang setor,19,,"{'label': 'negative', 'score': 0.9997580647468567}",negative +sama status udah hasil masuk rekening gmn,7,,"{'label': 'neutral', 'score': 0.5002017021179199}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +bohong guys bom,3,,"{'label': 'negative', 'score': 0.9999182224273682}",negative +jovan bantu cepat balesan nya mohon tunggu jovan,8,,"{'label': 'neutral', 'score': 0.9998778104782104}",neutral +boong guys bom dibales bales tuh sama udah jam,9,,"{'label': 'negative', 'score': 0.9999188184738159}",negative +wkwk sama kek gua,4,,"{'label': 'negative', 'score': 0.9783769845962524}",negative +hallo min laku transaksi nomor gopay aktif nomor lama aku gidak dapat otp gopay tindak apa tanggap terima kasih,19,,"{'label': 'neutral', 'score': 0.9996154308319092}",neutral +iya tunggu sebentar kak agi nya segera dibales dita,9,,"{'label': 'neutral', 'score': 0.9998793601989746}",neutral +tenang kak agi yuk konfirmasi bantu follow makasih sabil,9,,"{'label': 'neutral', 'score': 0.9998981952667236}",neutral +sini aja lah biar semua orang tau,7,,"{'label': 'neutral', 'score': 0.9960267543792725}",neutral +aduh tiket udh diclose kak agi yuk konfirmasi dmnya biar bantu cek hasil lapor makasih sakia,16,,"{'label': 'neutral', 'score': 0.9998829364776611}",neutral +maksud apa paket direfund tiket diclose gin aja punya warung tanggap sama sekali,13,,"{'label': 'negative', 'score': 0.9755582809448242}",negative +@gopayindonesia Saya dm ya,4,,"{'label': 'neutral', 'score': 0.9998902082443237}",neutral +skrg klo pake gopayletter udh gabisa pake qris kak,9,,"{'label': 'neutral', 'score': 0.9997945427894592}",neutral +mjb kayak gopaylater emang gabisa buat bayar qris deh,9,,"{'label': 'negative', 'score': 0.9885048270225525}",negative +bantu jawab kalau gak salah sekarang bayar qris dah gak pake gopay later deh kak,15,,"{'label': 'neutral', 'score': 0.7897620797157288}",neutral +maap jbjb kak tau aku gopay emang gabisa pake qris deh huhu emang sayang bangett,15,,"{'label': 'negative', 'score': 0.9099960327148438}",negative +tahu sih kayak udah gabisa bayar qris pke gopaylater gitu,10,,"{'label': 'negative', 'score': 0.9924229979515076}",negative +gopay emamg mudah hidup kak,5,,"{'label': 'positive', 'score': 0.9998695850372314}",positive +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +langsung tembak aplikasi playstore kalau bayar lewat,7,,"{'label': 'neutral', 'score': 0.9730454087257385}",neutral +bukan setting playstore,3,,"{'label': 'neutral', 'score': 0.9997052550315857}",neutral +upgrade gopay plus nomor email djuancux com upgrade gopay plus selalu gagal tolak ktp baharu sesuai minta jadi hampir satu tahun,21,,"{'label': 'negative', 'score': 0.9990737438201904}",negative +kocak app settingan autodebet kaga apps tiba bayar semua layan kali modal riwayat transaksi langsung mutusin sendiri lanjut bos beberapa layan pakai makanya gue lakuin bayar bulan ehh main potong,30,,"{'label': 'negative', 'score': 0.9998762607574463}",negative +pernah setting autodebet gopay dicariin settingannya tiba tiba uda bayar otomatis aja canva ahh tae lahh kocak app,18,,"{'label': 'negative', 'score': 0.9987953901290894}",negative +gimana deh sms tiket udah diclose mau cek mytelkomsel terus dilogout malah login cek lewat malah suruh cek mytelkomsel mau complain feedback formnya disubmit payah banget nanganin customer experiencenya,29,,"{'label': 'negative', 'score': 0.9999154806137085}",negative +aduh sumpah keren bgt gopay punya aplikasi sendiri,8,,"{'label': 'positive', 'score': 0.9999369382858276}",positive +lhukk kok gede nih dikon pulsa gopay,7,,"{'label': 'negative', 'score': 0.9998968839645386}",negative +loh beneran kerja maling auto ilang karna pulsa gopay murah,10,,"{'label': 'negative', 'score': 0.9998478889465332}",negative +murah banget loh,3,,"{'label': 'positive', 'score': 0.9999561309814453}",positive +aku kalau mau tipu gjd gara milih beli buat gue sendiri,11,,"{'label': 'negative', 'score': 0.9998806715011597}",negative +wahh asli murah sih diskon banyak banget,7,,"{'label': 'positive', 'score': 0.9999386072158813}",positive +responnya,1,,"{'label': 'positive', 'score': 0.9999419450759888}",positive +min gaada gopay suwit kaya dulu,6,,"{'label': 'negative', 'score': 0.9986891150474548}",negative +halo admin bantu dong aku udah bayar tagih gopaylater muncul tagih biasa hari jatuh tempo mau kena biaya denda bayar jatuh tempo bantu,23,,"{'label': 'neutral', 'score': 0.9920327663421631}",neutral +halo admin bantu dong aku udah bayar tagih gopaylater muncul tagih biasa,12,,"{'label': 'neutral', 'score': 0.9995720982551575}",neutral +halaman bantu aplikasi bantu sama sekali formalitas,7,,"{'label': 'negative', 'score': 0.7438443303108215}",negative +min punya masalah sama nih telepon sibuk terus,8,,"{'label': 'negative', 'score': 0.9999045133590698}",negative +kuota internet satu bulan,4,,"{'label': 'neutral', 'score': 0.9996001124382019}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +bom diapainnn biar bisaaa,4,,"{'label': 'negative', 'score': 0.9809251427650452}",negative +halo admin minta dong transfer batal gapapa,7,,"{'label': 'negative', 'score': 0.997150719165802}",negative +udah reportproblem nyata asa gapernah pake apple marah gopay karna diiyain sih pake izin dulu,15,,"{'label': 'negative', 'score': 0.9997758269309998}",negative +mood jelek banget tai hari gegara,6,,"{'label': 'negative', 'score': 0.9999227523803711}",negative +lama banget bales nya payah layan,6,,"{'label': 'negative', 'score': 0.9999191761016846}",negative +sama kak emg bgst gopay,5,,"{'label': 'neutral', 'score': 0.8807297348976135}",neutral +kok gopaylater blokir tulis min pdhal pernah telat bayar,9,,"{'label': 'negative', 'score': 0.9934281706809998}",negative +kalian error langgan bayar denda gin,6,,"{'label': 'negative', 'score': 0.9999203681945801}",negative +gak bayar gopay later denda niih,6,,"{'label': 'negative', 'score': 0.999901294708252}",negative +halo gabisa upgrade data ktp pakai adik buat upgrade akun gopay henti gopay plus adik,15,,"{'label': 'neutral', 'score': 0.9999008178710938}",neutral +duit gopay nyangkut awan,4,,"{'label': 'negative', 'score': 0.9999018907546997}",negative +sih udah hampir hari gin terus,6,,"{'label': 'negative', 'score': 0.9887520670890808}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +gopay transaksi sendiri tinggal tidur ilang,6,,"{'label': 'negative', 'score': 0.9998987913131714}",negative +siang min barusan beli voucher game terima kode bantu,9,,"{'label': 'neutral', 'score': 0.9998992681503296}",neutral +ilmu ikhlas mahal,3,,"{'label': 'negative', 'score': 0.9998821020126343}",negative +beli token via pas bayar langsung angus aja gak jelas nomor transaction gak mau lapor gak bagaimana,17,,"{'label': 'negative', 'score': 0.9999130964279175}",negative +halo udah blm respon uang stuck sistem mau gopay bank,10,,"{'label': 'negative', 'score': 0.9488515853881836}",negative +blokir coba admin gopay suruh cek bulan maret hari cek blokir padahal bayar pernah telat,15,,"{'label': 'neutral', 'score': 0.7982417941093445}",neutral +min coba cek,3,,"{'label': 'neutral', 'score': 0.9998852014541626}",neutral +halo min kok gopaylater tiba tiba blokir padahal bayar tepat waktu,11,,"{'label': 'neutral', 'score': 0.9994176626205444}",neutral +min cek yaa mohon bantu,5,,"{'label': 'neutral', 'score': 0.9998958110809326}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +min cek dong,3,,"{'label': 'neutral', 'score': 0.9998573064804077}",neutral +gak bayar gopaylater nih miin error kena denda deeehh,9,,"{'label': 'negative', 'score': 0.9999136924743652}",negative +mengatasnamakan kirim msg nominal sesuai mohon tindak,7,,"{'label': 'neutral', 'score': 0.9998468160629272}",neutral +cek min terimakasih,3,,"{'label': 'neutral', 'score': 0.9998620748519897}",neutral +hai kak maaf buat nyaman yuk lanjut email tanya com lampir tangkap layar kendala nomor ponsel email daftar bantu kendala kamu lanjut,22,,"{'label': 'neutral', 'score': 0.9998644590377808}",neutral +cekkkk dmmm,2,,"{'label': 'neutral', 'score': 0.9874611496925354}",neutral +dong masa tiba tiba gopaylater gue blokir padahal kmren siang dipake maksud apa coba,14,,"{'label': 'negative', 'score': 0.9997803568840027}",negative +cek min bantu tks,4,,"{'label': 'neutral', 'score': 0.999886155128479}",neutral +cuy gimana pending mulu asuuu,5,,"{'label': 'negative', 'score': 0.9999114274978638}",negative +gak bca kapan baik sistem,5,,"{'label': 'negative', 'score': 0.9995180368423462}",negative +proses berapa lama kak punya lapor tanggap,7,,"{'label': 'negative', 'score': 0.972745954990387}",negative +gue bener word word kecewa besar sama costumer service kata available aing komplain tgl feb sampe sekarang direspon dikirimian chat robot,21,,"{'label': 'negative', 'score': 0.9999226331710815}",negative +min bales,2,,"{'label': 'negative', 'score': 0.9998623132705688}",negative +total tagih sama virtual account gopay,6,,"{'label': 'neutral', 'score': 0.9996165037155151}",neutral +dana potong bca bayar nya,5,,"{'label': 'neutral', 'score': 0.9994484782218933}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +cek plsss,2,,"{'label': 'neutral', 'score': 0.9216877222061157}",neutral +bayar tagih paylatter lewat aplikasi gopay malah gak masuk belum bayar lewat gojek customer aman aja,16,,"{'label': 'negative', 'score': 0.9991851449012756}",negative +gabisa dipake nih gopaylaternya,4,,"{'label': 'negative', 'score': 0.9915518760681152}",negative +gopay error,2,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +min mohon bantu cek error gopay,6,,"{'label': 'neutral', 'score': 0.9997022747993469}",neutral +min topup hasil langsung tiba refund saldo refund masuk buat transaksi buat butuh bulan sudan coba hubungin customer service feedback sama sekali,22,,"{'label': 'neutral', 'score': 0.9998947381973267}",neutral +min transfer rekening gopay kok masuk saldo nya saldo rek potong saldo gopay blm masuk mohon jawab,17,,"{'label': 'neutral', 'score': 0.9996604919433594}",neutral +promo allofresh gak min kok gak muncul pas bayar mohon bantu min,12,,"{'label': 'neutral', 'score': 0.5977209210395813}",neutral +halo mimin barusan top gopay lalu dibatalin tulis udah direfund masuk rekening,12,,"{'label': 'neutral', 'score': 0.9999006986618042}",neutral +halo min cek,3,,"{'label': 'neutral', 'score': 0.999891996383667}",neutral +selamat pagi kan baru aja buka tabung gopay lalu otomatis duit masuk kesana kemudian langsung direfund uang mana mana baik gopay biasa maupun tabung jago,25,,"{'label': 'neutral', 'score': 0.9998537302017212}",neutral +aku mau upgrade gopay plus susah banget sih gagal terus padahal udah sesuai tentu,14,,"{'label': 'negative', 'score': 0.9998517036437988}",negative +woy min,2,,"{'label': 'negative', 'score': 0.9998947381973267}",negative +gopay beli kuota via gopay kuta masuk saldo potong gimana,10,,"{'label': 'negative', 'score': 0.9180395007133484}",negative +yak sampe skrg tanggap beda banget sama grab sat set cukup tau aja udah blg sama anak apus apps skrg pake grab aja mama anggep saldo ilang kmrn amal case closed,31,,"{'label': 'negative', 'score': 0.999886155128479}",negative +halo selamat pagi coba daftar gopaylater hari lalu selalu minta kirim data ulang min mohon bantu terimakasih,17,,"{'label': 'neutral', 'score': 0.9998974800109863}",neutral +saldo hari blm masuk bejir,5,,"{'label': 'negative', 'score': 0.999864935874939}",negative +min kok coba bayar belanja tokped pake gopaylater gak gin terus pas checkout,13,,"{'label': 'neutral', 'score': 0.9990345239639282}",neutral +udh solve blm masalah punya gitu soal,7,,"{'label': 'negative', 'score': 0.9996813535690308}",negative +hallo gimana masa lofin akun aja gak udah hampir jam loh nunggu,12,,"{'label': 'negative', 'score': 0.7647616863250732}",negative +ganggu apa gimana udah jam gak login,7,,"{'label': 'negative', 'score': 0.9999008178710938}",negative +min ayo dong cashback gopay jangan pakai coin mending langsung saldo gak sih jawab tuju,15,,"{'label': 'neutral', 'score': 0.8479553461074829}",neutral +baik sistem jadi rekening bank,5,,"{'label': 'neutral', 'score': 0.9998841285705566}",neutral +email telp tanggal tindak ukur kalian padahal cuma minta non aktif akun gopay pinjam,14,,"{'label': 'neutral', 'score': 0.8446508049964905}",neutral +gopay pinjam aktif orang bukan,5,,"{'label': 'neutral', 'score': 0.9998340606689453}",neutral +telp aku gopay pinjam nyata gopay pinjam aktif,8,,"{'label': 'neutral', 'score': 0.9998804330825806}",neutral +tampil gopay pinjam aktif,4,,"{'label': 'neutral', 'score': 0.9998712539672852}",neutral +gopay pinjam aktif bukan minggu aware sama sekali kalian,9,,"{'label': 'negative', 'score': 0.9983733892440796}",negative +tiket nomor minggu lanjut,4,,"{'label': 'neutral', 'score': 0.9995324611663818}",neutral +saldo engga gopay riwayat transaksi nya,6,,"{'label': 'neutral', 'score': 0.9998849630355835}",neutral +halo min kait saldo potong autodebit padahal tanggal apa direfund udah cancel subscriptionnya gaada refund masuk tambah gaada history google playnya,21,,"{'label': 'neutral', 'score': 0.9974274039268494}",neutral +lagi aneh otomatis pindah gopay tabung bank jago minta approval dulu bingung org kalau kayak gin tlp sibuk mulu email doang harap tweet dibales bgt,25,,"{'label': 'negative', 'score': 0.9998879432678223}",negative +pagi isi saldo gopay anak sore anak panik apps nya update saldo ilang pindah gopay tabung coba balik gopay biasa malah ilang saldo nya gada gmn cara balikin uang ongkos sekolah sminggu,32,,"{'label': 'negative', 'score': 0.9998894929885864}",negative +min gopay sekarang selalu scan barcode tiap kali transaksi minimarket,10,,"{'label': 'neutral', 'score': 0.9998962879180908}",neutral +hai kak maaf buat kamu tenang kait keluh kamu yuk infoin lapor bantu cek lanjut kak thanks,17,,"{'label': 'neutral', 'score': 0.9998891353607178}",neutral +ingfokan gopay dong,3,,"{'label': 'negative', 'score': 0.9891213774681091}",negative +cek min thks,3,,"{'label': 'neutral', 'score': 0.9998430013656616}",neutral +dah lah gak ikhlas mogamo kudu ikhlas kalo problem bakal ujung rip payment method using jago account new gopay,19,,"{'label': 'negative', 'score': 0.9977071285247803}",negative +detail akhir ngga kuis udah capekkk lapor ginian aja sampe bantu temenku busyeddd harus tetep ngisi aja mungkin udah dijelasin detail simpel apa kait error alam paham sopo sing gak kesel cok,32,,"{'label': 'negative', 'score': 0.9997962117195129}",negative +nyoba kali kali ngadu kayak ngga paham sama error alam gave and deleted gojek account thought solved problem but now facing more bizarre issue regarding account such shame,28,,"{'label': 'negative', 'score': 0.9991946816444397}",negative +for background error akun gabisa atas alam gagal panjang otomatis gofood plus gofood plus aplikasi jadi hilang total subscription merchant plus liat gofood plus removed itself from app lol,29,,"{'label': 'negative', 'score': 0.9900124073028564}",negative +problem awal feb kemarin tunggu sampe sekarang nyata taut tuh akun udah hapus arti bener bener gabisa pake akun jago akun gojek baru anjir sedih bet,26,,"{'label': 'negative', 'score': 0.9999138116836548}",negative +pihak bilang ngga bantu apa apa akun proses hapus mandiri aku tanya terus ngapain direspon balas ngga jawab sama sekali cry,21,,"{'label': 'negative', 'score': 0.9998823404312134}",negative +kirain aku mah akun hapus segala taut otomatis unlink sendiri biasa gitu turns out akun gengs udah tanya via terus arah tanya,22,,"{'label': 'negative', 'score': 0.9997492432594299}",negative +entah bug apa sejak upgrade jadi gopay tabung top gopay livin mandiri masuk selalu delay aplikasi jago dana masuk aplikasi gojek gopay tokped butuh menit fix kait,27,,"{'label': 'negative', 'score': 0.9932025671005249}",negative +min habis topaup lgsg otomatis masuk gopay tbungan gabisa dipake transaksi yaa toloong,13,,"{'label': 'negative', 'score': 0.9987201690673828}",negative +tdk pakai gopaylater pdhl akhir pakai bln nov amp kendala bayar tepat waktu mohon bantu,15,,"{'label': 'neutral', 'score': 0.9998382329940796}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +gopay tabung buat apa dah,5,,"{'label': 'neutral', 'score': 0.9979655742645264}",neutral +males ngirim email nya,4,,"{'label': 'negative', 'score': 0.9999179840087891}",negative +min gimana cara ganti identitas gopay soal dulu pas daftar pake ktp ibu soal legal sekarang mau ganti ktp sendiri gimana,21,,"{'label': 'neutral', 'score': 0.9993353486061096}",neutral +kirim email buat pindah data,5,,"{'label': 'neutral', 'score': 0.9998910427093506}",neutral +jatuh tempo maret aku bayar tanggal kurang baik apa,9,,"{'label': 'negative', 'score': 0.9998611211776733}",negative +cok gopaylater tiba tiba blokir padahal bayar tepat waktu,9,,"{'label': 'neutral', 'score': 0.9969978332519531}",neutral +sore min bantu cek,4,,"{'label': 'neutral', 'score': 0.9998983144760132}",neutral +mohon cek,2,,"{'label': 'neutral', 'score': 0.9998551607131958}",neutral +halo,1,,"{'label': 'neutral', 'score': 0.9675124883651733}",neutral +halo min bolwh cwk,4,,"{'label': 'neutral', 'score': 0.9998949766159058}",neutral +terima saldo gopay udah jam,5,,"{'label': 'neutral', 'score': 0.9998026490211487}",neutral +halo kak barusan isi gopay engga masuk pdahal notifikasi top mau sen makan jadi engga nih,16,,"{'label': 'neutral', 'score': 0.9998946189880371}",neutral +terima kasih tanya bapak ibu langgan mention twitter whatsapp halo bca hubung via aplikasi halobca tks wiki,17,,"{'label': 'neutral', 'score': 0.9999006986618042}",neutral +udah kak hehe terima kasih,5,,"{'label': 'neutral', 'score': 0.9997491240501404}",neutral +mohon maaf atas ketidaknyamanan bapak ibu langgan konfirmasi kendala sebut apabila rekening bca terima dana masuk sila konfirmasi pihak merchant kendala sebut bca sifat pasif tks sinta,27,,"{'label': 'neutral', 'score': 0.9988085031509399}",neutral +min mau bca gopay gabisa error gimana,7,,"{'label': 'negative', 'score': 0.9993072748184204}",negative +halooo gimana pihak gopay gaadapenyelesaian nih,6,,"{'label': 'neutral', 'score': 0.9568652510643005}",neutral +infoin nomor detail nama paket sama capturenya yuk kak elvi mciha bantu cek kendala data aman makasih micha,18,,"{'label': 'neutral', 'score': 0.9998995065689087}",neutral +hai kak elvi maaf buat kendala akses layan add mytelkomsel yuk info nomor capture kendala via biar bantu lanjut privasi data jaga makasih mia,24,,"{'label': 'neutral', 'score': 0.9998942613601685}",neutral +tadi notifnya pas klik bayar layar kedip lalu layar sblmnya,10,,"{'label': 'neutral', 'score': 0.9995488524436951}",neutral +nyata fitur add nya beli add trs coba hasil top paket data internet sakti dgn add gagal,17,,"{'label': 'neutral', 'score': 0.730140209197998}",neutral +huhu tenang kak elvi buat kendala aktivasi paket ketrangan gagal apa infoin nomor biar sabil cek makasih sabil,18,,"{'label': 'neutral', 'score': 0.9996658563613892}",neutral +isi paket tekomsel dgn bayar error krn dah nyoba kali pagi tlg info uaa,14,,"{'label': 'neutral', 'score': 0.9981781244277954}",neutral +kak cek,2,,"{'label': 'neutral', 'score': 0.999864935874939}",neutral +pls help aktivitas biasa apa bayar pernah telat tiba blokir cuma dipake trx gojek jadi gak biasa apa,18,,"{'label': 'negative', 'score': 0.9986544847488403}",negative +aku udah hari diblock nih kak gopay paylaternya gak tau deh gak jelas bgt dah males effort tanya pasrah aja kalo gak yawess shopee paylater,25,,"{'label': 'negative', 'score': 0.9998915195465088}",negative +dear dong cepat nang kasus saldo gopay hilang juta tdk pernah laku transaksi tsb udah hubung pihak gojek tokped saling lempar tanggung jawab,23,,"{'label': 'negative', 'score': 0.9999114274978638}",negative +akun tokopedia hack lalu laku transaksi via gopay later lapor tokopedia amp gopay tokopedia jelas kait tanggung bayar tetap kpd padahal jelas korban bukan solusi macam apa,27,,"{'label': 'negative', 'score': 0.9998188614845276}",negative +kalo bayar toped pakai gopaylater kayak gin tetus gimana min pertama kali aku pake gopaylater toped,16,,"{'label': 'neutral', 'score': 0.9682871699333191}",neutral +beli beli token listrik tokennya ngga kasi kasih padahal udah bayar gmn,12,,"{'label': 'negative', 'score': 0.9998237490653992}",negative +buru dong baik mau pakai transfer dana bca nih,9,,"{'label': 'negative', 'score': 0.9984877109527588}",negative +admin cek,2,,"{'label': 'neutral', 'score': 0.999854564666748}",neutral +urus udah beres blm bang soal sama,7,,"{'label': 'negative', 'score': 0.9852299094200134}",negative +udah beres bang urusanya sama gopay,6,,"{'label': 'positive', 'score': 0.9982293248176575}",positive +diikhlasin aja rasa soal,4,,"{'label': 'negative', 'score': 0.9990153312683105}",negative +gue sampe sekarang gak direspon min mayan,7,,"{'label': 'negative', 'score': 0.9998414516448975}",negative +halo,1,,"{'label': 'neutral', 'score': 0.9675124883651733}",neutral +ygl gak lama,3,,"{'label': 'positive', 'score': 0.9999114274978638}",positive +kagak tau mau sampe kapan gila fintech,7,,"{'label': 'negative', 'score': 0.999868631362915}",negative +blokir gak punya udah bulan,5,,"{'label': 'negative', 'score': 0.9998722076416016}",negative +halo somasi kirim gopay indonesia dompet anak bangsa atas soal tgl februari hari februari jelas selamat kerja teman teman,19,,"{'label': 'neutral', 'score': 0.9998736381530762}",neutral +cek napa min,3,,"{'label': 'negative', 'score': 0.9998200535774231}",negative +cek cek penting,3,,"{'label': 'neutral', 'score': 0.9975095987319946}",neutral +aplikasi maling segera audit udh banyak korban,7,,"{'label': 'negative', 'score': 0.9999074935913086}",negative +aplikasi maling,2,,"{'label': 'negative', 'score': 0.9999219179153442}",negative +balikin duit aplikasi maling,4,,"{'label': 'negative', 'score': 0.9999140501022339}",negative +min mau verif kok gak proses lama uang jadi gak gopay bank nih min,14,,"{'label': 'negative', 'score': 0.9921700358390808}",negative +promo undang temen habis apa min,6,,"{'label': 'negative', 'score': 0.9980417490005493}",negative +eror kok gak bayar tagih,5,,"{'label': 'negative', 'score': 0.9999146461486816}",negative +rasa salah ngasih diskon,4,,"{'label': 'negative', 'score': 0.999884843826294}",negative +buat lapor semua bukti lengkap,5,,"{'label': 'neutral', 'score': 0.99983811378479}",neutral +halo admin mau tanya apa ada bawah awas bank indonesia soal udh banyak korban duit hilang jelas hari hari aplikasi maling,21,,"{'label': 'negative', 'score': 0.9998791217803955}",negative +aplikasi anjing transaksi tgl pending tgl transaksi selesai duit hilang entah kalian suruh tunggu maksimal hari skrg udh mau tgl aplikasi anjing balikin duit maling,25,,"{'label': 'negative', 'score': 0.9999113082885742}",negative +malam min tlg baca thank you,6,,"{'label': 'neutral', 'score': 0.9998928308486938}",neutral +sekarang blokir ngadu balesnya template terus bom punya buzzer sok peduli nyuruh upgrade cepet bangkrut aja lah mab,18,,"{'label': 'negative', 'score': 0.9999185800552368}",negative +barusan akun gojek hapus sekarang buat masuk gabisa kalau paylater gabisa ngapus akun aneh tadi tokopedia tagihanya tetap walaupun akun udh gak akses,23,,"{'label': 'negative', 'score': 0.9878380298614502}",negative +iyaaaaaaakl cuma gopaylater selamat pusat adu minim,7,,"{'label': 'negative', 'score': 0.9738593101501465}",negative +gapernah digopay emg banyak blokir kaya aku gapaham knp,9,,"{'label': 'negative', 'score': 0.999832034111023}",negative +halo kalo mau nonaktif akun cara gimana nomor lama lanjur verified ktp,12,,"{'label': 'neutral', 'score': 0.9998825788497925}",neutral +udah pernah telbay kak,4,,"{'label': 'neutral', 'score': 0.9998503923416138}",neutral +kalau aku udah kelar tagih gamau pake dripada php kayak gin,11,,"{'label': 'negative', 'score': 0.9998776912689209}",negative +cek kak,2,,"{'label': 'neutral', 'score': 0.9998247027397156}",neutral +udh buka blm mas blokir udh hari blm nih,9,,"{'label': 'neutral', 'score': 0.9993876218795776}",neutral +too udh hari blm buka hehe,6,,"{'label': 'neutral', 'score': 0.9942142367362976}",neutral +mab fintech gak becus sama kerabat blokir alas jelas baru akses kemaren blokir,13,,"{'label': 'negative', 'score': 0.9999092817306519}",negative +total lost gopay transaksi sukses tpi zonk,7,,"{'label': 'negative', 'score': 0.9999101161956787}",negative +sistem mab bobrok suka blokir alas baru kemarin notifikasi guna sekarang blokir gila,13,,"{'label': 'negative', 'score': 0.9999185800552368}",negative +skrg iya aku aplikasi kata sedang tangan wkwk entah kapan,10,,"{'label': 'negative', 'score': 0.8252468109130859}",negative +uang jadi hilang gitu aja,5,,"{'label': 'negative', 'score': 0.999915361404419}",negative +maaf,1,,"{'label': 'negative', 'score': 0.9993929862976074}",negative +udh bnyk kena aplikasi maling,5,,"{'label': 'negative', 'score': 0.9999185800552368}",negative +hai kak dapat kendala tanya cerita lalu shalma bantu,9,,"{'label': 'neutral', 'score': 0.9998977184295654}",neutral +mohon buka blokir gopay minggu masalah dana,7,,"{'label': 'neutral', 'score': 0.9998956918716431}",neutral +ngeri nih transfer antar bank pakai virtual account dah mnt gak jalan alas kendala bank baik jgn mau kalah sama jadi kapok orang kalu bgini,25,,"{'label': 'negative', 'score': 0.9999134540557861}",negative +miin gopaylater gua kok gabisa dipake sih padahal tagih telat terus menit belum udah dipake buat beli pulsa,18,,"{'label': 'negative', 'score': 0.9999083280563354}",negative +udah aku kak,3,,"{'label': 'neutral', 'score': 0.8300049901008606}",neutral +kak langsung gopay jga punya jga balik uang nggk jelas jga status,12,,"{'label': 'negative', 'score': 0.9997891783714294}",negative +receh sih aku butuh buat bayar pempers cek dong min status selesai nggk masuk rekening,15,,"{'label': 'negative', 'score': 0.999283492565155}",negative +kak uang apa nyantol jga,5,,"{'label': 'negative', 'score': 0.9997830986976624}",negative +kak uang nyantol berapa uang jga nggk balik,8,,"{'label': 'negative', 'score': 0.9998019337654114}",negative +lihat banyak korban kirim lapor resmi kait aplikasi gopay ojk,10,,"{'label': 'neutral', 'score': 0.9998968839645386}",neutral +capek banget komplain gopay kirim email masalah keluh lapor balas gak nyambung allah emang uang kecil buat buat gua lumayan komplain apa bales apa,24,,"{'label': 'negative', 'score': 0.9999152421951294}",negative +kak iqbalotwit terima kasih hubung twitter myxlcare proses lanjut kendala kakak sila guna fitur chat maya aplikasi myxl web kak,20,,"{'label': 'neutral', 'score': 0.9998999834060669}",neutral +aku udh aktif blm dipake transaksi trauma aku wkwkw akhir pake tokped langsung blokir,14,,"{'label': 'negative', 'score': 0.9982017278671265}",negative +udh isi paket lewat pake promo cashback masuk cashbacknya huuhuu,10,,"{'label': 'negative', 'score': 0.8768534660339355}",negative +bunda siang tadi topup gopay via indomaret nominal besar masuk sampe sekarang gimana min,14,,"{'label': 'neutral', 'score': 0.9997181296348572}",neutral +mjb kmrn aku kena blocked limit naik blocked udh tlp ngomong panjang lebar suruh nunggu hari kata kalau baca media konsumen udah hari tetep aja sejak pindah mab aja troublenya,30,,"{'label': 'negative', 'score': 0.9998934268951416}",negative +mjb blokir punya kmrn tiba tiba gitu udh lapor suruh tunggu hari kata limit naik blocked sejak pindah mab aja troublenya,21,,"{'label': 'negative', 'score': 0.9999129772186279}",negative +cek min terima kasih,4,,"{'label': 'neutral', 'score': 0.9998779296875}",neutral +duit udh hari hari jelas malingggggg,6,,"{'label': 'negative', 'score': 0.9999175071716309}",negative +okay terimakasih banyak kak,4,,"{'label': 'neutral', 'score': 0.9997827410697937}",neutral +halo mau bayar tagih paylater nomer aktif cara bagaimana log aplikasi gojek bayar,13,,"{'label': 'neutral', 'score': 0.9998432397842407}",neutral +call center you fungsi pencet apa unt bicara operator mba voice mail cuma bilang blm masuk pilih semua opsi tekan something aplikasi guna besar kok abal abal banget call center nya,31,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +sama anjir mau pake hari dipake karna blokkk gajls analisis mulu solusi,12,,"{'label': 'negative', 'score': 0.9999077320098877}",negative +min balas,2,,"{'label': 'neutral', 'score': 0.997163712978363}",neutral +min maaf bingung deh kok gopaylater kena blokir padahal tanggal febuari bayar loh solusi min,15,,"{'label': 'negative', 'score': 0.721717119216919}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +minnnn cek,2,,"{'label': 'neutral', 'score': 0.9257402420043945}",neutral +cek dong,2,,"{'label': 'neutral', 'score': 0.997416615486145}",neutral +cek yaa,2,,"{'label': 'neutral', 'score': 0.9998194575309753}",neutral +udh banyak kena entah knp aplikasi lenggang mulus,8,,"{'label': 'negative', 'score': 0.9994269609451294}",negative +mau dibisikin aplikasi maling gak nama gopay saldo potong status transfer selesai dana masuk buat lapor sana sini udh hari tangan kata bas digital sepele gin aja hari hari gak kelar wkwkkw aplikasi maling sampah,35,,"{'label': 'negative', 'score': 0.9999182224273682}",negative +kak blokir gak aku tiba tiba blokir,7,,"{'label': 'negative', 'score': 0.9998399019241333}",negative +kak mjb blokir gak sampe skrg,6,,"{'label': 'negative', 'score': 0.9998098015785217}",negative +aja udah lama gada respawn gua baru kena ganggu tadi malam njr suram,13,,"{'label': 'negative', 'score': 0.9999167919158936}",negative +semalem emang case,3,,"{'label': 'negative', 'score': 0.8110899925231934}",negative +bukan gua doang nyata ngalamin,5,,"{'label': 'negative', 'score': 0.9998947381973267}",negative +mohon cek,2,,"{'label': 'neutral', 'score': 0.9998551607131958}",neutral +klo gak bertanggungjawab gin oke gua bawa case sampein influencer kripto benar bertanggungjawab,13,,"{'label': 'negative', 'score': 0.9946340322494507}",negative +capek krn nomor hilang ngajukan ubah nomor gagal terus padahal mau bayar gopaylater cicil udah ngubungi tanggal janji virtual akun bayar tagih sampe sekarang kirim,25,,"{'label': 'negative', 'score': 0.9999058246612549}",negative +kapan naaa dana balikin,4,,"{'label': 'negative', 'score': 0.9993403553962708}",negative +min kemarin salah top nmr gopay lama dah mati harus top nmr baru bagaimana uang nya lumayan,17,,"{'label': 'neutral', 'score': 0.8829325437545776}",neutral +lama blokir,2,,"{'label': 'negative', 'score': 0.9998948574066162}",negative +kapan buka blokir nya punya gue blokir,7,,"{'label': 'negative', 'score': 0.9429682493209839}",negative +balikin duit woi aplikasi maling,5,,"{'label': 'negative', 'score': 0.9999136924743652}",negative +hari duit jelas balikin duit aplikasi maling,7,,"{'label': 'negative', 'score': 0.9999021291732788}",negative +woi bener aja gopaylater gue baru buka blokir tau tau blokir anjing masalah apasih,14,,"{'label': 'negative', 'score': 0.9999152421951294}",negative +saldo gopay potong besar hari jaket driver jek lunas tahun lalu mohon bantu terima kasih,15,,"{'label': 'neutral', 'score': 0.9997733235359192}",neutral +iya emg aneh kak aku selalu tepat waktu byrnya tpi klo dipake gabisa trs jdi blokir deh gatau mrk nilai nya gmn bikin gabisa pake aku jdinya paling pakenya beli token trs aplikasi gopay klo,35,,"{'label': 'negative', 'score': 0.9997966885566711}",negative +padahal tagih pertama aku lgsung bayar tepat waktu lgsung balik limit,11,,"{'label': 'negative', 'score': 0.9998570680618286}",negative +sama brrti kasus kyk aku soal transaksi skor kredit cek sama analis gopaylater nya jdi klo gagal langsung blokir paling hrs nunggu hari baru buka,25,,"{'label': 'neutral', 'score': 0.987873375415802}",neutral +pas uda masukkin pin kaa,5,,"{'label': 'neutral', 'score': 0.9997391104698181}",neutral +hampir semua punya gopaylater blok kak aku udh mau bulan buka abis blok bangkrut kayak,15,,"{'label': 'negative', 'score': 0.9998592138290405}",negative +gue udah tanggap kak lewat kata lama hari dipake analisis gitu gue ngerti sama mana data pribadi udh pegang,19,,"{'label': 'negative', 'score': 0.8239150047302246}",negative +pas msk gojek emg udh blokir bgitu udh transaksi masukin pin soal aku sering blokir tpi pas dipake payment link sama tokped jdi sblmnya blm blokir tpi pas udh masukin pin gagal langsung blokir jdinya,35,,"{'label': 'negative', 'score': 0.9259332418441772}",negative +pas mau sen gojek trs lgsung blokir,7,,"{'label': 'neutral', 'score': 0.9998517036437988}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +aku jam saldo ghaib anjir gatau tutor,7,,"{'label': 'negative', 'score': 0.999889612197876}",negative +asliiii otak atik dikit kak biar saldo cepet update refresh gitu halaman gopay tabung gaguna jujur,16,,"{'label': 'negative', 'score': 0.9992563128471375}",negative +mana duit malinggggg,3,,"{'label': 'negative', 'score': 0.9999016523361206}",negative +blokir nya nyoba transaksi kak,5,,"{'label': 'neutral', 'score': 0.997061550617218}",neutral +halo min mau tanya hapus daftar rekening bank apps gopay cara gimana,12,,"{'label': 'neutral', 'score': 0.9998762607574463}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +kata penuh syarat padahal aplikasi limit banyak loh,8,,"{'label': 'negative', 'score': 0.9998929500579834}",negative +sama anjir kesel bgt tiap topup gopay saldo malah masuk tabung nunggu lama,13,,"{'label': 'negative', 'score': 0.99991774559021}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +mohon selalu waspada kak akun resmi twitter bni centang emas verified belah nama akun bukan photo profile jaga selalu rahasia data pribadi kakak tks wudy,25,,"{'label': 'neutral', 'score': 0.9998536109924316}",neutral +hai kak maaf buat kendala kak mimin bantu sila kakak sampai detail lalu,13,,"{'label': 'neutral', 'score': 0.9998959302902222}",neutral +cdm deh mending,3,,"{'label': 'negative', 'score': 0.9995824694633484}",negative +balikin duit aplikasi maling,4,,"{'label': 'negative', 'score': 0.9999140501022339}",negative +halo kak maaf atas kendala keluh kakak kena kendala tapcash biar mimin bantu cek infoin detail data lalu kak mimin tunggu,21,,"{'label': 'neutral', 'score': 0.9998965263366699}",neutral +wah sama nih tadi pagi nyangkut sampe skrg mas nyangkut,10,,"{'label': 'negative', 'score': 0.9998553991317749}",negative +halo kak duit udah kirim pending soal aku ngalamin thank you,11,,"{'label': 'neutral', 'score': 0.9970487952232361}",neutral +kak uda kirim bom duit,5,,"{'label': 'negative', 'score': 0.9999048709869385}",negative +kak uda masuk blom saldo,5,,"{'label': 'neutral', 'score': 0.9998830556869507}",neutral +kak duit,2,,"{'label': 'negative', 'score': 0.9998475313186646}",negative +cdm tolonggggggggg,2,,"{'label': 'negative', 'score': 0.9997151494026184}",negative +@thesstart @gopayindonesia GA ADA ,4,,"{'label': 'neutral', 'score': 0.8942373394966125}",neutral +kabarin klo udah beres bang ken tau responnya,8,,"{'label': 'neutral', 'score': 0.9935038685798645}",neutral +min gimana cerita beli kuota aplikasi bima pake gopay saldo potong invoice keluar aplikasi transaksi gagal terima bayar cuma bilang refund laku aplikasi terima kacaww,25,,"{'label': 'negative', 'score': 0.999325156211853}",negative +bca coba bayar pake gopay gak,6,,"{'label': 'neutral', 'score': 0.9998947381973267}",neutral +min cek segera,3,,"{'label': 'neutral', 'score': 0.9998874664306641}",neutral +duit balikin aplikasi maling,4,,"{'label': 'negative', 'score': 0.9999147653579712}",negative +aplikasi maling,2,,"{'label': 'negative', 'score': 0.9999219179153442}",negative +woi maling,2,,"{'label': 'negative', 'score': 0.9999165534973145}",negative +gusss dibalikinn,2,,"{'label': 'positive', 'score': 0.9991856217384338}",positive +samaaaa kakkk aneh bgt,4,,"{'label': 'negative', 'score': 0.9999188184738159}",negative +selamat siang kalo aku mau complain kait driver kurang senang,10,,"{'label': 'negative', 'score': 0.9994195699691772}",negative +oke kak cek kak udah tak isi data makasih,9,,"{'label': 'neutral', 'score': 0.9998941421508789}",neutral +subcription bumvle gak bikin kenyang perut kenyang atensi,8,,"{'label': 'negative', 'score': 0.8918090462684631}",negative +februari makan bumble,3,,"{'label': 'neutral', 'score': 0.6813952922821045}",neutral +bumble padahal udh lifetime,4,,"{'label': 'negative', 'score': 0.9999068975448608}",negative +subscription app pernah download trs lupa unsubscribe,7,,"{'label': 'neutral', 'score': 0.999896764755249}",neutral +selalu waspada kak akun resmi twitter bni centang emas verified belah nama akun bukan photo profile jaga selalu rahasia data pribadi kakak tks cempaka,24,,"{'label': 'neutral', 'score': 0.9995844960212708}",neutral +hai kak maaf buat kendala kak mimin bantu sila kakak sampai detail lalu,13,,"{'label': 'neutral', 'score': 0.9998959302902222}",neutral +sayang sekali atas kendala jadi kendala sebut mohon sedia bapak hubung halo bca via fitur call aplikasi halobca bebas pulsa proses lanjut tks achel,24,,"{'label': 'neutral', 'score': 0.999893069267273}",neutral +bantu min habis isi tapcash pake oneklik kok blm masuk proses terus,12,,"{'label': 'neutral', 'score': 0.9996042847633362}",neutral +kocak nih bulan lalu limit naik langsung blokir lapor percuma sampek sekarang pakai kemarin dapet notif limit naik aneh blokir gak jelas banget truss ngapain naik klo blokir,28,,"{'label': 'negative', 'score': 0.999903678894043}",negative +jangan semangat baik serah uda story kasus gopay later ntar kelar blokir dipake bentar blokir wkwk,16,,"{'label': 'negative', 'score': 0.9998125433921814}",negative +slowrespon semua kak,3,,"{'label': 'negative', 'score': 0.9990957975387573}",negative +aplikasi anjing balikin saldo bangsat,5,,"{'label': 'negative', 'score': 0.9999184608459473}",negative +udah tunggu awal bulan aja lancar,6,,"{'label': 'positive', 'score': 0.9999452829360962}",positive +aneh bangeeet aku tanggal seret seret blokir kayak hati,9,,"{'label': 'negative', 'score': 0.999915361404419}",negative +halo kak udah atas akun soal aku gin,8,,"{'label': 'neutral', 'score': 0.9998980760574341}",neutral +sama transfer proses jam sukses dana masuk rekening tuju padahal saldo udh potong wkwkk aplikasi sampah,16,,"{'label': 'negative', 'score': 0.999914288520813}",negative +@fachrulpls @gojekindonesia @gopayindonesia belum ,4,,"{'label': 'neutral', 'score': 0.9998908042907715}",neutral +blokir apa udah selesai,4,,"{'label': 'negative', 'score': 0.9998225569725037}",negative +min apa sih pakai tanggal bilang dipake feb dipake feb bilang sipake feb gitu terus ampe kiamat gausa aja kalau gak dipake anjrit,23,,"{'label': 'negative', 'score': 0.9998941421508789}",negative +cek oyyyy,2,,"{'label': 'positive', 'score': 0.9960554838180542}",positive +ngatasin adu konsumen tuh brp lama punya gue udah hari kerja gaada feedbacknya lama banget,15,,"{'label': 'negative', 'score': 0.9999071359634399}",negative +kak cek dmnya,3,,"{'label': 'neutral', 'score': 0.9998916387557983}",neutral +keluh gak tanggap sama sekali min beberapa transaksi gagal tpi saldo potong gak pernah tindak lanjut tpi semalem udah puncak mungkin jadi lumayan kesel tlng tindak lanjut min,28,,"{'label': 'negative', 'score': 0.9999021291732788}",negative +mention kalian kalian libat akun random tolol bisa nyaranin upgrade jauh kalian,12,,"{'label': 'negative', 'score': 0.9999088048934937}",negative +bener mab mau cari ribut baru kemarin pakai hari blokir maksud apa sih kok sistem bobrok bener,17,,"{'label': 'negative', 'score': 0.9999127388000488}",negative +gimana tarik tunai malah tulis tunggu lama banget biasa cepet gak sampe menit,13,,"{'label': 'negative', 'score': 0.9998942613601685}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +guna gopay later app hari belakang,6,,"{'label': 'neutral', 'score': 0.9998881816864014}",neutral +admin drtd malam transfer gopay status nya tunggu mulu biasa gercep knp tuuuuu,13,,"{'label': 'negative', 'score': 0.9998371601104736}",negative +selamat malam min bantu ditindaklanjuti top saldo tadi masuk jam nih,11,,"{'label': 'neutral', 'score': 0.999901533126831}",neutral +gopaylater blokir,2,,"{'label': 'neutral', 'score': 0.9998440742492676}",neutral +beli token pln pakai gagal terus,6,,"{'label': 'negative', 'score': 0.9999068975448608}",negative +cek dongggggggg,2,,"{'label': 'negative', 'score': 0.9995032548904419}",negative +hlo plsss mau nanya,4,,"{'label': 'negative', 'score': 0.6149197816848755}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +bom,1,,"{'label': 'negative', 'score': 0.9999183416366577}",negative +tanya bapak ibu langgan mention twitter whatsapp halo bca hubung via aplikasi halobca tks pallefi,15,,"{'label': 'neutral', 'score': 0.9999005794525146}",neutral +memang karya anak bangsa payahhh sekali kalah jauhh payment wallet biru wkwwkkwk,12,,"{'label': 'negative', 'score': 0.9998881816864014}",negative +turut prihatin atas kendala jadi apabila transaksi hasil kendala sebut saran bapak ibu langgan laku kece konfirmasi pihak gojek tks carlos,21,,"{'label': 'neutral', 'score': 0.9994920492172241}",neutral +sistem ngapa dah top mbca knp blm masuk mnt,9,,"{'label': 'negative', 'score': 0.999833345413208}",negative +min batalin transaksi gimana sayaa transaksi beli pulsa lama sayaa,10,,"{'label': 'negative', 'score': 0.9999032020568848}",negative +bls,1,,"{'label': 'negative', 'score': 0.9998787641525269}",negative +kak aku bantu cek thanks,5,,"{'label': 'neutral', 'score': 0.9998794794082642}",neutral +aku takutin,2,,"{'label': 'negative', 'score': 0.9999146461486816}",negative +selalu waspada kak akun resmi twitter bni centang emas verified belah nama akun bukan photo profile jaga selalu rahasia data pribadi kakak resmi bni bni call atribut apa tks cedric,30,,"{'label': 'neutral', 'score': 0.9989523887634277}",neutral +hii kak maaf kak kendala mimin bantu tindaklanjuti kena kendala kakak alami mohon infoin detail lalu,16,,"{'label': 'neutral', 'score': 0.9998835325241089}",neutral +transfer lancar aja itungan menit bagaimana nich,7,,"{'label': 'negative', 'score': 0.9997212290763855}",negative +jam saldo masuk rekening padahal belum lancar aja,8,,"{'label': 'negative', 'score': 0.9995508790016174}",negative +kakak buat kendala mytelkomsel coba dulu clear cache restart update aplikasi versi baru moga atas nesya,16,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +bro gua punya kan apa tau gak,7,,"{'label': 'neutral', 'score': 0.9995563626289368}",neutral +min gopaylater terblockir bgmn cara buka blocknya,7,,"{'label': 'negative', 'score': 0.9953547716140747}",negative +bales min responsif banget dah,5,,"{'label': 'negative', 'score': 0.9998894929885864}",negative +kak buka kak masalah pending transfer,6,,"{'label': 'neutral', 'score': 0.9813763499259949}",neutral +min balas chat,3,,"{'label': 'neutral', 'score': 0.9998878240585327}",neutral +ayo qris pake gopay coins masa kalah sama oren,9,,"{'label': 'negative', 'score': 0.9993873834609985}",negative +samaaaa aku uninstall dana,4,,"{'label': 'neutral', 'score': 0.99831223487854}",neutral +cek terimakasih,2,,"{'label': 'neutral', 'score': 0.9807151556015015}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +transaksi tunggu jam gimana lanjut,5,,"{'label': 'negative', 'score': 0.9992209672927856}",negative +nyata salah pihak dana entah ngerti kadang padahal wallet banyak minat kadang sering error ganggu uang hilang top saldo masuk proses lapor tanggap banyak jadi,25,,"{'label': 'negative', 'score': 0.9998743534088135}",negative +respon nya lot tanggap pernah top dana via bank mandiri senil saldo rekening kurang dana masuk tunggu hari gada masuk akhir lapor bank mandiri pihak dana,26,,"{'label': 'neutral', 'score': 0.5868747234344482}",neutral +kalau hilang uang aplikasi bakal tanggap beda sama gagal aja langsung refund hari perlu nunggu ber menit menit makanyaa udah gapake aplikasi dana kurang efisien,25,,"{'label': 'negative', 'score': 0.9999109506607056}",negative +lapor ditindaklanjuti cepat cukup penting ganti identitas daftar akun ibu guna ktpnya sendiri akun mau beliau buat pake ktp sendiri,20,,"{'label': 'neutral', 'score': 0.997231662273407}",neutral +wkwkwk duit aja akun nyokap embat so an bilang aman sekarang nyaman pake aplikasi ringan jauh beda sama apk,19,,"{'label': 'negative', 'score': 0.999854564666748}",negative +mayoritas kerja dengar musik,4,,"{'label': 'neutral', 'score': 0.9998124241828918}",neutral +beberapa kerja min,3,,"{'label': 'neutral', 'score': 0.9997861981391907}",neutral +min gopaylater aku blokir njirr padahal bayar time sisa limit banyak kenapaaaaaaa balas aku gamau tau,16,,"{'label': 'negative', 'score': 0.9998989105224609}",negative +hai kak bantu cdm thx,5,,"{'label': 'neutral', 'score': 0.9998915195465088}",neutral +halo min aku gopaylater blokir bagaimana aktif,7,,"{'label': 'neutral', 'score': 0.9998841285705566}",neutral +aku nyari gocar nggk dapet jadi batal otomatis uang aku tarik apa refund,13,,"{'label': 'negative', 'score': 0.9998227953910828}",negative +dana elek apik,3,,"{'label': 'positive', 'score': 0.9999516010284424}",positive +tolonk,1,,"{'label': 'negative', 'score': 0.9998542070388794}",negative +min gopay ganggu gimana saldo rekening udah potong masuk saldo gopay,11,,"{'label': 'negative', 'score': 0.9994962215423584}",negative +gopay tantang diam langgan hingga telepon putus,7,,"{'label': 'negative', 'score': 0.99943608045578}",negative +halo min lewat,3,,"{'label': 'neutral', 'score': 0.9998939037322998}",neutral +min kok akun gopaylater blokir padahal bayar pernah telat,9,,"{'label': 'negative', 'score': 0.999661922454834}",negative +min cek bls plisss penting,5,,"{'label': 'negative', 'score': 0.6719411015510559}",negative +cara nonaktifin hapus akun gopaylater gimana,6,,"{'label': 'neutral', 'score': 0.933212399482727}",neutral +cek nya lah,3,,"{'label': 'positive', 'score': 0.9983540773391724}",positive +halo gopaylater enggak padahal kemarin baru dapte notif kalo udah aktif maksud apa nich,14,,"{'label': 'neutral', 'score': 0.9978596568107605}",neutral +min cek yah,3,,"{'label': 'neutral', 'score': 0.9998865127563477}",neutral +kak aku,2,,"{'label': 'positive', 'score': 0.5207768678665161}",positive +min cek makasih,3,,"{'label': 'neutral', 'score': 0.9998712539672852}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +sama kak skrnh udh blm,5,,"{'label': 'neutral', 'score': 0.998705267906189}",neutral +kak udah blm,3,,"{'label': 'neutral', 'score': 0.9996237754821777}",neutral +apk tai tiba tiba blokir gabisa sama gopay sinting kau,10,,"{'label': 'negative', 'score': 0.9999200105667114}",negative +kak maaf tanya akun gopay kakak balik engga,8,,"{'label': 'neutral', 'score': 0.9998828172683716}",neutral +mau tanya kalau mau daftar gopay utk anak thn punya ktp bagaimana cara coba register kendala ktp tks,18,,"{'label': 'neutral', 'score': 0.9998873472213745}",neutral +balas min,2,,"{'label': 'positive', 'score': 0.9725815057754517}",positive +mantap gojek,2,,"{'label': 'positive', 'score': 0.9999560117721558}",positive +kak gopaylater mas blokir,4,,"{'label': 'neutral', 'score': 0.9998824596405029}",neutral +mas blokir kak,3,,"{'label': 'negative', 'score': 0.902647078037262}",negative +gila tangan kalian masalah jelek banget,6,,"{'label': 'negative', 'score': 0.9999233484268188}",negative +please dong bantu masalah sedang alami kok malah email masalah selesai lewat telpon telpon sama siapa kalian,17,,"{'label': 'negative', 'score': 0.9998879432678223}",negative +udah lapor lewat aplikasi jawab nya gajelas ywdhlah cuma ajar alam aja kapookk,13,,"{'label': 'negative', 'score': 0.999910831451416}",negative +rasa rugi sih sama biasa notifikasi bayar hasil baru kali gada gue akhir pilih bayar pake metode lihat kok saldo gopay gue potong,23,,"{'label': 'negative', 'score': 0.999916672706604}",negative +cek dong min,3,,"{'label': 'neutral', 'score': 0.9997588992118835}",neutral +eror min sampe kapan,4,,"{'label': 'negative', 'score': 0.9999151229858398}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +tlg blaass suratcintaku,3,,"{'label': 'neutral', 'score': 0.9872796535491943}",neutral +minzzz tlgg aku transfer gopay seabank semalem sampe sekarang status proses muluuu begimnaahh,13,,"{'label': 'negative', 'score': 0.9999018907546997}",negative +kalo mau chat cara gimana min,6,,"{'label': 'neutral', 'score': 0.8334912657737732}",neutral +nih jadi percuma rasa bayar tagih jauh jatuh tempo,9,,"{'label': 'negative', 'score': 0.9999121427536011}",negative +cekdm,1,,"{'label': 'positive', 'score': 0.8167592883110046}",positive +admiin cdm dong mau complain,5,,"{'label': 'negative', 'score': 0.9982355833053589}",negative +sedih upgrade,2,,"{'label': 'negative', 'score': 0.9999173879623413}",negative +mohon bantu kendala upgrade gopay plus komunikasi lalu bantu sayang solusi gopay resolved,13,,"{'label': 'neutral', 'score': 0.999872088432312}",neutral +cek admin,2,,"{'label': 'neutral', 'score': 0.9998553991317749}",neutral +miiin mau nanya dong kalo pake gopay later lsg bayar abis transaksi selesai gaksi,14,,"{'label': 'neutral', 'score': 0.8561275005340576}",neutral +buat apaaaa gbs dipake dah beberapa bulan bjirrrrrr plis tau knp admin dah email beberapa kali kawabannya template samacsemuaaa anjinggg,20,,"{'label': 'negative', 'score': 0.9999022483825684}",negative +sore kak kenal nama silvia happy ardiani mahasiswi universitas gunadarma tawar kerjasama sponsorship acara lomba design poster film tema action movie art alamat email hubung terimakasih,26,,"{'label': 'neutral', 'score': 0.9998985528945923}",neutral +kalo make gopay later buat transaksi tokped biaya admin nya gitu ngga kak soal dulu pernah make gopay later buat gofood biaya admin bulan nya,25,,"{'label': 'neutral', 'score': 0.9997978806495667}",neutral +mohon maaf atas kendala bapak ibu langgan alami pihak bca pihak terima dana sifat pasif tunggu transaksi sebut kirim pihak gopay mohon sedia bapak ibu tanya langsung pihak javi,29,,"{'label': 'neutral', 'score': 0.9996484518051147}",neutral +cdm dong kak,3,,"{'label': 'negative', 'score': 0.7201961278915405}",negative +kak blokir gak akun sekarang punya kena blokir,8,,"{'label': 'negative', 'score': 0.9997536540031433}",negative +min dong responnya gopaylater udah hampir bulan blokir padahal bayar tepat waktu,12,,"{'label': 'negative', 'score': 0.9980243444442749}",negative +cek dong min,3,,"{'label': 'neutral', 'score': 0.9997588992118835}",neutral +buset dicuekin,2,,"{'label': 'negative', 'score': 0.9999098777770996}",negative +kak senang hati kakak segera mimin respon mohon tunggu kak ingat kak akun resmi twitter bni centang emas verified belah nama akun bukan photo profile jaga selalu rahasia data pribadi kakak tks candice,33,,"{'label': 'neutral', 'score': 0.99982088804245}",neutral +min gimana yaa top money mandiri lewat gopay tulis sukses update update responnya min,14,,"{'label': 'neutral', 'score': 0.9998859167098999}",neutral +verified belah nama akun bukan photo profile jaga selalu rahasia data pribadi kakak tks miskha,15,,"{'label': 'neutral', 'score': 0.9998878240585327}",neutral +kalau kakak update balance saldo masuk kakak info detail transaksi lalu kak selalu waspada kak akun resmi twitter bni centang emas,21,,"{'label': 'neutral', 'score': 0.9998879432678223}",neutral +hai kak maaf kendala transaksi kait kendala transaksi top bni tapcash belum kakak laku update balance lalu aplikasi tapcash mesin atm bni logo tapcash,24,,"{'label': 'neutral', 'score': 0.9998956918716431}",neutral +gopay dah kali gopaylater blokir padahal nih bayar tagih jauh jatuh tempo makin kesini kok malah makin gak jelas gin dah,21,,"{'label': 'negative', 'score': 0.9999151229858398}",negative +isi saldo bni tapcash gopay saldo potong pas cek saldo bni tapcash nya blm masuk mohon bantu,17,,"{'label': 'neutral', 'score': 0.9998867511749268}",neutral +mohon maaf tuh udah pake gopaylater kan yaaaa kok ditelp aja nih mohon maaf enak tidur nih yaaa kok ganggu,20,,"{'label': 'negative', 'score': 0.9998094439506531}",negative +bayar transaksi guna jadi jarak hari januari amp februari lapor solusi tawar suruh tunggu jam coba,16,,"{'label': 'neutral', 'score': 0.9995848536491394}",neutral +halo tanggap lapor aplikasi yaa lama betul responnya,8,,"{'label': 'negative', 'score': 0.9998990297317505}",negative +aplikasi perlu baik ktp sesuai ducapil kata sesuai upgrade gopay plus terus terus gagal,14,,"{'label': 'negative', 'score': 0.9890784621238708}",negative +udh buka blm,3,,"{'label': 'neutral', 'score': 0.9998082518577576}",neutral +sama,1,,"{'label': 'positive', 'score': 0.9995618462562561}",positive +min akun gopaylater tbtb blokir,5,,"{'label': 'neutral', 'score': 0.9998953342437744}",neutral +min cek yaa,3,,"{'label': 'neutral', 'score': 0.9998825788497925}",neutral +halo kak aku aku barusan kena kendala kaya gitu,9,,"{'label': 'neutral', 'score': 0.9995156526565552}",neutral +haloo min cek dong,4,,"{'label': 'neutral', 'score': 0.9998953342437744}",neutral +akhir hari topup nyata gagal duit dibalikin lama bgt tetap terima kasih uda balikin dana,15,,"{'label': 'negative', 'score': 0.9999046325683594}",negative +kak gopay later aktif kok buat transaksi bayar terang nya gopay later aktif mohon solusi,15,,"{'label': 'neutral', 'score': 0.9996278285980225}",neutral +udah kak alhamdulillah,3,,"{'label': 'positive', 'score': 0.9999135732650757}",positive +gin boss,2,,"{'label': 'positive', 'score': 0.9848467111587524}",positive +transfer wallet gopay nunggu hari kerja mau beli flashsale keburu basi anj mana baru tau karna cari tau lama bgt masuk pas mau transfer kasih ingat pemberitahuan proses kirim hari kerja anjir pls lah,34,,"{'label': 'negative', 'score': 0.9999030828475952}",negative +blok wan,2,,"{'label': 'negative', 'score': 0.9998764991760254}",negative +nya dihubungin pagi sampe sekarang sibuk terus solusi gak dapet pulsa malah abis tambah personilnya mungkin kasi customer kendala butuh konfirmasi buru tanggap lama banget,25,,"{'label': 'negative', 'score': 0.9999176263809204}",negative +min respon dong jgn handling fee naik trus service jelek gin,11,,"{'label': 'negative', 'score': 0.9999167919158936}",negative +admin minta cek thankyouuu,4,,"{'label': 'neutral', 'score': 0.999852180480957}",neutral +sumpah aplikasi gajelas bgt,4,,"{'label': 'negative', 'score': 0.9999191761016846}",negative +respon min soal aku gak mau data salahgunakan aku mau nutup akun kok sulit padahal gak pake,17,,"{'label': 'negative', 'score': 0.9998512268066406}",negative +min aku tuh mau hapus akun gopay nya kok tulis bagi cashloan tagih bayar padahal daftar gopay pinjam aja tolak minjem paylatter sama sekali kok tagih gmna bantu min,29,,"{'label': 'negative', 'score': 0.9998863935470581}",negative +kak sorry uda bayar tagih kasus kyk gin,8,,"{'label': 'negative', 'score': 0.9997901320457458}",negative +please sampe sekarang bayar heyy,5,,"{'label': 'neutral', 'score': 0.9280961155891418}",neutral +bantu dong min,3,,"{'label': 'positive', 'score': 0.9993987083435059}",positive +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +nyesel bgt top via uda masuk dibalikin dana dikomplen mlh dsuru nunggu hari top apa hari,16,,"{'label': 'negative', 'score': 0.9999169111251831}",negative +tau deh siapa salah nya kecewa top aja disuru tunggu hari buat proses,13,,"{'label': 'negative', 'score': 0.9999157190322876}",negative +gojek indonesia jadi akun bener masa bener apa mau nipu,10,,"{'label': 'negative', 'score': 0.9998983144760132}",negative +ngentotttt saldo gue ilang tanggung jawab jing,7,,"{'label': 'negative', 'score': 0.99991774559021}",negative +woiiii saldo gue kemanain jirr abis ganti nomor kok ilang,10,,"{'label': 'negative', 'score': 0.9999134540557861}",negative +halo min buka,3,,"{'label': 'neutral', 'score': 0.9998898506164551}",neutral +semua biaa buat pertama doang bisa,6,,"{'label': 'negative', 'score': 0.9998998641967773}",negative +pake app gopay sendiri gojek soal pulsa,7,,"{'label': 'neutral', 'score': 0.9998905658721924}",neutral +woy kestau napa knp susah sinyal kalo dah krl aku kalo minta jemput telpon pake pulsa btw beli pulsa promo pulsa cuma sor kau dengar kan trs gratis trf mana aja bulan,32,,"{'label': 'negative', 'score': 0.9998754262924194}",negative +siapa tau cara ngubah payment netflix gopay aku ngelink ubah,10,,"{'label': 'neutral', 'score': 0.9994970560073853}",neutral +hei topup senin skrg masuk disuru nunggu tiket balikin uang,10,,"{'label': 'negative', 'score': 0.999390721321106}",negative +halo kak gopaylater guna aplikasi gojek padahal lambat bayar,9,,"{'label': 'neutral', 'score': 0.9998559951782227}",neutral +gua top gopay bni saldo masuk saldo bni dah potong nya gopay gaada jawab tolongin dong min,17,,"{'label': 'negative', 'score': 0.9997943043708801}",negative +gopaylater gue buka blokir nya gue mau promo,8,,"{'label': 'neutral', 'score': 0.9998915195465088}",neutral +kak maaf udh bikin kamu gak tenang utk kendala beli paket data kamu pasti akun dana kamu verifikasi premium lebih kak kendala sila utk hubung asisten digital ana apk dana kamu yah thanks,33,,"{'label': 'neutral', 'score': 0.9981006979942322}",neutral +kuota,1,,"{'label': 'negative', 'score': 0.9967784285545349}",negative +kak paham dgn kendala kamu kait keluh kamu sila clear cache apk dana update versi baru lalu restart device pasti jaring internet stabil kuota internet cukup udah sila coba kala kak thx,32,,"{'label': 'neutral', 'score': 0.9996286630630493}",neutral +gopaylater sya blokir min,4,,"{'label': 'neutral', 'score': 0.9998185038566589}",neutral +wkwkwk bagai cara tetep bayar mungkin saldo kurang,8,,"{'label': 'neutral', 'score': 0.8639463186264038}",neutral +gopaylater blokir sekarang,3,,"{'label': 'neutral', 'score': 0.9987348914146423}",neutral +dong akun gopaylater gue buka blokir nya ken ngejar promo nii tiba aja akun gue blokir,16,,"{'label': 'negative', 'score': 0.9908767342567444}",negative +akun gopay later kok blokir permanen awal bulan sampe sekarang padahal komplen kali amp padahal punya tagih tunggak kira tahu gak netizen baik hati colek,25,,"{'label': 'negative', 'score': 0.9999079704284668}",negative +libur kak barusan mau ngetransfer uang panin gabisa nyata baru feb semua jenis transaksi masuk rtgs,16,,"{'label': 'negative', 'score': 0.575918436050415}",negative +gopaylater sya gmn,3,,"{'label': 'negative', 'score': 0.9996466636657715}",negative +gimana hey paylater seengknya jelasin kenpa blokir ngk slah kok tba blokir buka trus blokir lgi aneh,17,,"{'label': 'negative', 'score': 0.9999141693115234}",negative +cek dong,2,,"{'label': 'neutral', 'score': 0.997416615486145}",neutral +halo kak kalo misal transfer gopay nama gimana bantu check kak terimakasih jujuly takut,14,,"{'label': 'neutral', 'score': 0.9998414516448975}",neutral +kemarin buka terus hari tutup aneh,6,,"{'label': 'negative', 'score': 0.9999194145202637}",negative +min aku upgrade gopay tolak mulu,6,,"{'label': 'negative', 'score': 0.9998809099197388}",negative +selamat pagi hari minggu top gopay lalu seabank sekarang status proses saldo seabank potong uang masuk gopay gimana lapor aplikasi gopay waktu isi bank tdk pilih seabank,27,,"{'label': 'neutral', 'score': 0.9998132586479187}",neutral +dong gojek akun kena hack orang mengatasnamakan gojek,8,,"{'label': 'negative', 'score': 0.9998873472213745}",negative +min aku top emoney pake gopay history tulis transaksi hasil gak masuk saldo nya yaa udh pencet update balance gak,20,,"{'label': 'neutral', 'score': 0.9998695850372314}",neutral +cara nonaktifin gopaylater gimana,4,,"{'label': 'negative', 'score': 0.6281992197036743}",negative +gopulsa delay biasa bantu gak min,6,,"{'label': 'neutral', 'score': 0.9997566342353821}",neutral +iya sama nih responnya kaya gin yaudah arti emg udh gabisa dipake,12,,"{'label': 'negative', 'score': 0.9994397759437561}",negative +kalo baca udah sih gak buka kata bulan sendiri betul aku baru bulan blokir,14,,"{'label': 'negative', 'score': 0.9998210072517395}",negative +kak udh solved aku alami sama nya solutif nih,9,,"{'label': 'neutral', 'score': 0.8205782175064087}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +knp tiap mau bayar pake paylater selalu tulis status paylater gak blokir lho knp apa arti blokir,17,,"{'label': 'negative', 'score': 0.9984349608421326}",negative +sering jadi,2,,"{'label': 'positive', 'score': 0.99981290102005}",positive +hari suruh hubung sendiri merchant sangkut,6,,"{'label': 'negative', 'score': 0.9998811483383179}",negative +mohon atas kendala proses refund maks hari kerja waktu beli tiket mohon cek kala wallet nya guna terima kasih,19,,"{'label': 'neutral', 'score': 0.9998931884765625}",neutral +anjir aneh gopay,3,,"{'label': 'negative', 'score': 0.999915361404419}",negative +betul banget,2,,"{'label': 'positive', 'score': 0.9999470710754395}",positive +gimana iki lurrrr mau coba bobol gopay,7,,"{'label': 'negative', 'score': 0.956277072429657}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +plis cek ken nang tau gakkk,6,,"{'label': 'negative', 'score': 0.9998409748077393}",negative +punya bulan kak baru buka,5,,"{'label': 'neutral', 'score': 0.9998763799667358}",neutral +gopaylater gak guna bayar tokopedia,5,,"{'label': 'neutral', 'score': 0.9995157718658447}",neutral +guys pernah gak sih saldo gopay gue ilang tiba pas chat admin nya gaada respon serius pdhal udah gue kirim semua nya respon cuma template doang gue kemaren siang jam sampe sekarang blm jelas,34,,"{'label': 'negative', 'score': 0.9998805522918701}",negative +hai kak maaf yah triva bantu kece kendala kakak alami mohon info nomor tri nya lalu whatsapp ketik ngobrol klik agent care kemudian pilih kartu tri digibox lain thanks elsa,30,,"{'label': 'neutral', 'score': 0.999893069267273}",neutral +sekarang refund sama sekali padahal gimana nih,7,,"{'label': 'negative', 'score': 0.9998548030853271}",negative +akun gopay later kok blokir permanen awal bulan sampe sekarang padahal komplen kali amp padahal punya tagih tunggak kira tahu gak netizen baik hati colek,25,,"{'label': 'negative', 'score': 0.9999079704284668}",negative +coba mab tanya dong alas blokir paylater alas jelas akun bapak gak lambat jatuh tempo lama limit banyak kok mab asal blokir aja becus gak jadi fintech bukan aja ngalamin lho,31,,"{'label': 'negative', 'score': 0.9998846054077148}",negative +mjb kak tahun gopaylater aku pernah blokir tbtb pdahal gapernah nunggak samsek trs aku dong kata gin bener sih dlu abis aktifin gpl aku jarang makenya skrng udh kok buat transaksi,31,,"{'label': 'negative', 'score': 0.9997922778129578}",negative +min mau nanya,3,,"{'label': 'neutral', 'score': 0.9998583793640137}",neutral +gess pernah topup money gopay transaksi udh jelas hasil malah masuk money nya gmn biar masuk kira kira gmn solusi min,21,,"{'label': 'negative', 'score': 0.9984384179115295}",negative +ahhhh anjjjjjj,2,,"{'label': 'negative', 'score': 0.9997649788856506}",negative +lamaa minn buset dahhhhhhh,4,,"{'label': 'negative', 'score': 0.9999163150787354}",negative +guys pernah ilang tiba gak sih saldo kalian punya gue baru aja ilang pdhl lgi laper ken cari makan,19,,"{'label': 'negative', 'score': 0.999819815158844}",negative +cdmm lahhh woyyy min,4,,"{'label': 'negative', 'score': 0.9997751116752625}",negative +woiii min balikin saldo gue ilang anjirrrrrr,7,,"{'label': 'negative', 'score': 0.9999101161956787}",negative +ampunn aku tanggal huhu udah lapor mulu tetep aja nihil kalo nemu solusi kabarin kakk,15,,"{'label': 'negative', 'score': 0.9998947381973267}",negative +punya blm kak huhu tgl malah,6,,"{'label': 'negative', 'score': 0.9998051524162292}",negative +halo min bantu yah top gopay via blu hasil notifnya masuk saldo gopay,13,,"{'label': 'neutral', 'score': 0.999900221824646}",neutral +maksud apa tiba tiba aku gapernah langgan apa ajuin paylater jadi takut mau top gopay langsung potong,17,,"{'label': 'negative', 'score': 0.9998979568481445}",negative +hallo min top gopay pending,5,,"{'label': 'neutral', 'score': 0.9988685846328735}",neutral +siang admin bisa followup kait email lapor nomor,8,,"{'label': 'neutral', 'score': 0.9998997449874878}",neutral +hai izin tanya kena status pay later blokir apa tahu alas,11,,"{'label': 'neutral', 'score': 0.9915884137153625}",neutral +tanggap,1,,"{'label': 'positive', 'score': 0.9999549388885498}",positive +gopay apa error,3,,"{'label': 'negative', 'score': 0.9998897314071655}",negative +lapor dah sampe mana tau lama bgt hampir bulan,9,,"{'label': 'negative', 'score': 0.9999179840087891}",negative +cek admin,2,,"{'label': 'neutral', 'score': 0.9998553991317749}",neutral +iya cek makanya info udah tulis,6,,"{'label': 'neutral', 'score': 0.999891996383667}",neutral +halo kak kok transfer msh tunggu aja cek dong,9,,"{'label': 'neutral', 'score': 0.9998973608016968}",neutral +nomor gopay ganti gaa,4,,"{'label': 'neutral', 'score': 0.9998711347579956}",neutral +min saldo gopay kok masuk masuk mohon bantu,8,,"{'label': 'neutral', 'score': 0.999884843826294}",neutral +awal blokir pertama kali pernah dipakek transaksi kak,8,,"{'label': 'neutral', 'score': 0.9998869895935059}",neutral +kak kabar masuk blm saldo,5,,"{'label': 'neutral', 'score': 0.9998927116394043}",neutral +dah masuk blm kak skrg kasus rupa mau tanya tanya,10,,"{'label': 'negative', 'score': 0.649975061416626}",negative +udah tiga kali kak blokir,5,,"{'label': 'neutral', 'score': 0.9997772574424744}",neutral +min kalo nya lewat gojek kena admin yah,8,,"{'label': 'neutral', 'score': 0.9998140931129456}",neutral +gopaylaterku dogunakan min statusmy bloked pemberitahuan padahal bayar pernah telat,10,,"{'label': 'negative', 'score': 0.9998775720596313}",negative +diem aja saldo masuk money yaaa saldo udah potong klo komplain slow respon bgt gopay kacau kacau,17,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +topup gopay pke blu bca potong admin gopay nya,9,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +sih awal feb kmplen tiba blokir hari lalu buka skrng mau pke pke ngk gimna kali ngk telat bayar lho mna jwbannya ngk jelas mnta pnjelasan blokir,27,,"{'label': 'negative', 'score': 0.9998819828033447}",negative +kak penting lunas pinjeman belum,5,,"{'label': 'neutral', 'score': 0.9992082715034485}",neutral +gimana mana duit kalian repayment gilir tagih bayar teror tiap jam gilir tagih uda bayar malah tarik jangan sampe salah informasi kalo customer mana duit,25,,"{'label': 'negative', 'score': 0.9999018907546997}",negative +hallo limit gopay later gak dipake tokopedia aplikasi gojek,9,,"{'label': 'neutral', 'score': 0.9998615980148315}",neutral +kak aku udh tiket bantu app gojek kena gopaylater aku tiket tgl sampe skg gak respon cara eskalasi gmn,19,,"{'label': 'negative', 'score': 0.9994800686836243}",negative +ettt blai sorry sorry wkwkkwkw,5,,"{'label': 'negative', 'score': 0.9983159303665161}",negative +hallo cek,2,,"{'label': 'neutral', 'score': 0.9998538494110107}",neutral +halo potong apa rasa potong mohon konfirmasi,7,,"{'label': 'neutral', 'score': 0.9998339414596558}",neutral +kak erti kakak butuh bantu yuk buat lapor ana masuk aplikasi dana pilih pilih chat ana mohon ikan nomor lapor lewat terimakasih,22,,"{'label': 'neutral', 'score': 0.9998955726623535}",neutral +akhir bilang mohon tunggu karna kalo transaksi jam maks jam kalo transaksi jam maks jam transaksi jam udah jam masuk,20,,"{'label': 'neutral', 'score': 0.9997583031654358}",neutral +gimana udh selesai masalah aku jga nyangkut gopay seabank huhu,10,,"{'label': 'negative', 'score': 0.9996922016143799}",negative +blm masuk kak,3,,"{'label': 'neutral', 'score': 0.9963362216949463}",neutral +masuk,1,,"{'label': 'positive', 'score': 0.995103120803833}",positive +udah minggu nyangkut duitnyaa,4,,"{'label': 'negative', 'score': 0.9998925924301147}",negative +gimana gopay gabisa buat transaksi,5,,"{'label': 'negative', 'score': 0.9997182488441467}",negative +apes bener hari bangke salah transfer gopay mana nomer nya cuma bintang bintang liat full semua gimana biar hold dulu solusi nyaaa,22,,"{'label': 'negative', 'score': 0.9999139308929443}",negative +proses lalu layan sosial media perlu verifikasi data lebih moga kendala kamu segera selesai,14,,"{'label': 'neutral', 'score': 0.9998542070388794}",neutral +mimin saran konfirmasi pihak aplikasi gopay laku kece lanjut apabila laku kece saldo sisi seabank sila hubung seabank lalu layan live chat aplikasi seabank layan telepon,26,,"{'label': 'neutral', 'score': 0.9998949766159058}",neutral +hai sobat seabank mohon maaf atas ketidaknyamanannya mimin bantu info kait terima dana masuk seabank terima dana sifat pasif terima dana masuk,22,,"{'label': 'neutral', 'score': 0.9998807907104492}",neutral +cek kak makasih banyak,4,,"{'label': 'neutral', 'score': 0.9998757839202881}",neutral +parah,1,,"{'label': 'negative', 'score': 0.9999147653579712}",negative +gopay tiap kali mau bayar pake qris selalu crash aplikasi,10,,"{'label': 'neutral', 'score': 0.5086090564727783}",neutral +udh jam mba,3,,"{'label': 'neutral', 'score': 0.9996471405029297}",neutral +udah email gubrish,3,,"{'label': 'neutral', 'score': 0.9997492432594299}",neutral +cek min udah hari gak baca,6,,"{'label': 'negative', 'score': 0.5675320029258728}",negative +cek min udah hari gak baca,6,,"{'label': 'negative', 'score': 0.5675320029258728}",negative +woylah transfer gopay seabank gamasuk sihh dong woy,8,,"{'label': 'negative', 'score': 0.9998608827590942}",negative +aku kemarin sempet gocek tengok kok akun yakin bangsat nyata nipu admin gak tindak lanjut apa masa tipu dibiarin komen gak jelas akun,23,,"{'label': 'negative', 'score': 0.9999125003814697}",negative +perkara gopay slow respon aku sampe salah liat,8,,"{'label': 'negative', 'score': 0.9997894167900085}",negative +aku gocek klik linknya akun retas,6,,"{'label': 'neutral', 'score': 0.9998956918716431}",neutral +wkwkwk aku sedih ngakak,4,,"{'label': 'negative', 'score': 0.9998520612716675}",negative +ditipuu gimana nderr spill laku gadungan bangsat,7,,"{'label': 'negative', 'score': 0.9999178647994995}",negative +diem anjir,2,,"{'label': 'negative', 'score': 0.9999161958694458}",negative +hallo dong transaksi hasil terima masuk uang minta balikin aja batalin udah proses lama banget sekali hasil segala pake masuk gimana solusi pihak gopay kesel banget ngebantu sama sekali,29,,"{'label': 'negative', 'score': 0.9999196529388428}",negative +woyy duit gua trf hasil duit masuk bank parah banget,10,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +aku tipu sama komen atas,5,,"{'label': 'negative', 'score': 0.9999184608459473}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +udh chat kali kali selalu bilang seabank terima pasif silah konfirmasi bank kirim chat gopay bilang silah konfirmasi bank terima lempar lempar,22,,"{'label': 'negative', 'score': 0.9497441649436951}",negative +hai sobat seabank mohon maaf atas ketidaknyamanannya kait kendala sebut seabank pihak terima dana sifat pasif mimin saran kamu hubung pihak wallet gopay laku kece lanjut,26,,"{'label': 'neutral', 'score': 0.9635706543922424}",neutral +help akun gopayku diretassss,4,,"{'label': 'neutral', 'score': 0.9998911619186401}",neutral +minnnn help akun gopayku diretassss,5,,"{'label': 'neutral', 'score': 0.9996792078018188}",neutral +bilang tunggu hari maks jam utk transaksi aku udh hasil gopay seabank tpi saldo masuk help buat tahan hidup,19,,"{'label': 'neutral', 'score': 0.9890073537826538}",neutral +transaksi aku tgl maret gopay seabank masuk masuk help,9,,"{'label': 'neutral', 'score': 0.9998912811279297}",neutral +transaksi tgl maret gopay seabank tulis transaksi hasil masuk seabank kata gopay maks hari jam tunggu nnti klo masuk aku nang loh,22,,"{'label': 'neutral', 'score': 0.994860053062439}",neutral +sdh kak,2,,"{'label': 'neutral', 'score': 0.9973025321960449}",neutral +transfer seabank gopaypinjam tipu bikin bukti transfer palsu,8,,"{'label': 'negative', 'score': 0.9998891353607178}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +dear min akun gopay blokir hubung kali kali nomor tiket lapor menit closed hubung aja engga tetep blokir entah solusi sama sekali,22,,"{'label': 'negative', 'score': 0.9993966817855835}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +min respon dong udh byr tagih tagih mana kena denda gede bet ampun deh respon lama,16,,"{'label': 'negative', 'score': 0.9999125003814697}",negative +selamat siang admin aplikasi gopay muncul icon gambar keypad blokir angka transaksi mohon solusi terimakasih,15,,"{'label': 'neutral', 'score': 0.9998958110809326}",neutral +udah didm min,3,,"{'label': 'neutral', 'score': 0.9996721744537354}",neutral +min kok tadi gopay rekening gagal terus udah coba sedang pelihara sistem,12,,"{'label': 'negative', 'score': 0.9234827756881714}",negative +minn gmn aku mau byr alfagift gagal teruss,8,,"{'label': 'negative', 'score': 0.9999066591262817}",negative +cek kak,2,,"{'label': 'neutral', 'score': 0.9998247027397156}",neutral +halo kak cek,3,,"{'label': 'neutral', 'score': 0.9998929500579834}",neutral +bank gopay knp lama bgt tgl kemaren smpe skrg blm masuk org udah butuh uangnyaa trs pas tanya suruh nunggu hari masa doang smpe minggu nunggunya jirrrr mau cancel gabisa,30,,"{'label': 'negative', 'score': 0.9998955726623535}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +bangke kalian balas mention penting oii,6,,"{'label': 'negative', 'score': 0.9999023675918579}",negative +gak respon haha kocak,4,,"{'label': 'negative', 'score': 0.9810028076171875}",negative +nlpn contact center jawab beda beda gak selesai masalah sama sekali aneh banget,13,,"{'label': 'negative', 'score': 0.9999123811721802}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +agent contact center nya sama sekali bantu malah bikin emosi,10,,"{'label': 'negative', 'score': 0.9999195337295532}",negative +komplain nih bantu contact centernya goblok soal,7,,"{'label': 'negative', 'score': 0.9999208450317383}",negative +kak gimana keluh udah beres kak,6,,"{'label': 'negative', 'score': 0.7670048475265503}",negative +min mohon cek butuh bantu,5,,"{'label': 'neutral', 'score': 0.9998961687088013}",neutral +channel private resmi bri lalu sabrina whatsapp nomor akun resmi media sosial bri verified tks fadi,16,,"{'label': 'neutral', 'score': 0.9998990297317505}",neutral +dana terima sila konfirmasi pihak kirim laku kece bank bri terima,11,,"{'label': 'neutral', 'score': 0.9998944997787476}",neutral +mohon maaf atas ketidaknyamanan alami transaksi transfer sifat real time transaksi kurang saldo rekening rekening tuju saran kece detail transaksi cara cek mutasi rekening lalu brimo,26,,"{'label': 'neutral', 'score': 0.9998829364776611}",neutral +mohon balas cepap kak,4,,"{'label': 'negative', 'score': 0.7183318734169006}",negative +telfon lalu kata transfer jam hari dana masuk rekening chat shabrina bri low response min terima kasih,17,,"{'label': 'neutral', 'score': 0.9998997449874878}",neutral +transfer gopay seabank pagi proses terus yaa,7,,"{'label': 'neutral', 'score': 0.9998725652694702}",neutral +min uang hilang mohon bantuanyaa,5,,"{'label': 'neutral', 'score': 0.9998916387557983}",neutral +udah logout sendiri pas mau login trus refresh uang udah hilang trus riwayat transaksi gopaynya udah hapus mohon cek dmnya,20,,"{'label': 'neutral', 'score': 0.9993056058883667}",neutral +min mau nanya mau top gopay bank batas maksimal yah,10,,"{'label': 'neutral', 'score': 0.9998915195465088}",neutral +bank jago blm masuk smpe skrng,6,,"{'label': 'negative', 'score': 0.5369394421577454}",negative +gopaylater tiba blokir padahal gapernah telat bayar bulan lapor aplikasi cuma suruh cek kala,14,,"{'label': 'neutral', 'score': 0.8909606337547302}",neutral +admin cek yaa,3,,"{'label': 'neutral', 'score': 0.9998778104782104}",neutral +adududdu,1,,"{'label': 'positive', 'score': 0.6424840092658997}",positive +adudududu,1,,"{'label': 'negative', 'score': 0.9998534917831421}",negative +min cara verifikasi email gmn sih soal kata link dah kirim email masuk pernah sekali masuk tahun itu link invalid url sejak verifikasi pernah,24,,"{'label': 'negative', 'score': 0.8872165083885193}",negative +sama sama kak,3,,"{'label': 'positive', 'score': 0.9992014765739441}",positive +cek min gimana selesai,4,,"{'label': 'neutral', 'score': 0.593863844871521}",neutral +lucu banget sistem mau bayar paylater hari jatuh tempo biasa gue bayar tagih malah banget bayar hari baik tuh sistem,20,,"{'label': 'positive', 'score': 0.995062530040741}",positive +adu aplikasi gak live chat nunggu berapa hari sih padahal transfer sengaja gak jam rawan maintenance tetep kena bug pas transaksi,21,,"{'label': 'negative', 'score': 0.9998853206634521}",negative +pagi kak harsa maaf atas kendala infoin detail transaksi lalu whatsapp nomor ketik ngobrol klik agent care kemudian pilih kartu tri cek tugas thanks hani,25,,"{'label': 'neutral', 'score': 0.9998990297317505}",neutral +halo gimana uang smp sekarang blm masuk bri padahal transaksi hasil apa viral dulu baru direspon,16,,"{'label': 'negative', 'score': 0.9998452663421631}",negative +min cashback nya cuma sekali doang,6,,"{'label': 'neutral', 'score': 0.9925699830055237}",neutral +udh kak tpi pihak gojek dielmpar kesana kemari bri jga,10,,"{'label': 'neutral', 'score': 0.9997879862785339}",neutral +sma kak kasus kayak lgi banyak tuh lapor bahkan smp udh minggu masuk kata status hasil,16,,"{'label': 'negative', 'score': 0.998760461807251}",negative +gak tau males ken beli truk,6,,"{'label': 'negative', 'score': 0.9998051524162292}",negative +ehh naha lila kitu,4,,"{'label': 'negative', 'score': 0.9899583458900452}",negative +tindak lanjut hari skrg,4,,"{'label': 'negative', 'score': 0.9929866194725037}",negative +sok coba ajukeun batal deui inu meh buldep teu kitu deui,11,,"{'label': 'negative', 'score': 0.9998704195022583}",negative +maaf banget kak kait kendala bantu kece terima kasih mona,10,,"{'label': 'neutral', 'score': 0.9013128876686096}",neutral +min dong udah transfer kemarin status proses terus trf ovo bantu please,12,,"{'label': 'neutral', 'score': 0.9998657703399658}",neutral +padahal saldo potong gopay nya,5,,"{'label': 'neutral', 'score': 0.9759829044342041}",neutral +udh anjir tai lah,4,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +daa soalna kapotong tiba kan arti kamar ngeaktifan auto potong eta kudu putus heula auto potongna teh,17,,"{'label': 'negative', 'score': 0.9998026490211487}",negative +nya kitu asli kesel,4,,"{'label': 'negative', 'score': 0.9999175071716309}",negative +aaaa eta mah aktif auto potong tina gopay nyak,9,,"{'label': 'neutral', 'score': 0.971315860748291}",neutral +waktu ios emang langgan gitu,5,,"{'label': 'negative', 'score': 0.9999077320098877}",negative +ehh prem emang langsung motong gitu,6,,"{'label': 'negative', 'score': 0.9998708963394165}",negative +youtube prem mana udh lupa anjir email youtubenya beda ama email icloudnya,12,,"{'label': 'negative', 'score': 0.9998365640640259}",negative +ehh emang langgan apa apple cloud,6,,"{'label': 'negative', 'score': 0.9998581409454346}",negative +apple anjir padahal dah lama gak pake ios,8,,"{'label': 'negative', 'score': 0.9999157190322876}",negative +apa dah bayar rekan usaha,5,,"{'label': 'negative', 'score': 0.9953859448432922}",negative +proses lalu layan sosial media perlu verifikasi data lebih moga kendala segera atas,13,,"{'label': 'neutral', 'score': 0.9994064569473267}",neutral +kece lanjut apabila kamu laku kece saldo sisi seabank sila menghubungics seabank lalu layan live chat aplikasi seabank lalu layan telepon nomor,22,,"{'label': 'neutral', 'score': 0.9998362064361572}",neutral +hai sobat seabank belum mohon maaf atas ketidaknyamanannya kait kendala sebut seabank pihak pasif terima dana mimin saran kamu konfirmasi pihak bank kirim dana laku,25,,"{'label': 'neutral', 'score': 0.9998103976249695}",neutral +absen transaksi gopay nya kendala,5,,"{'label': 'negative', 'score': 0.9992005228996277}",negative +malam admin mohom cek,4,,"{'label': 'neutral', 'score': 0.9998936653137207}",neutral +butuh duit,2,,"{'label': 'negative', 'score': 0.978863537311554}",negative +sekian terima kasih gue pake produk gopay later atut tagih rentenir rem kak aku minjem uang teman aja hihi,19,,"{'label': 'neutral', 'score': 0.999882698059082}",neutral +saran aja mungkin kalau sop rentenir nagih customer kata kata buat sopan kalau baru telat bayar hari kali pertama gue lupa bayar tagih jumlah berapa,25,,"{'label': 'negative', 'score': 0.9985040426254272}",negative +catat sekarang udah gue bayar lunas serta denda cuma gue beneran heran kesel aja sama cara rentenir nagih customer,19,,"{'label': 'negative', 'score': 0.9999202489852905}",negative +konteks utang gue cuma ribu yallah ribu aja nyampe loh tagih bener akan gue gamau bayar kabur tanggung jawab,19,,"{'label': 'negative', 'score': 0.999913215637207}",negative +tau kok bayar tau kok bukan pinjam uang teman tau kok ngga tunda jujur murni skip lupa aja apa remindernya gabisa sopan,22,,"{'label': 'negative', 'score': 0.9998481273651123}",negative +kalau baru telat hari terus dichat gin sama rentenir sih jujur lebay banget yallah,14,,"{'label': 'negative', 'score': 0.9999178647994995}",negative +paham banget gopay later tuh tenggat waktu bayar lunas tenggat waktu sebut mungkin pihak push notification customer remind payment,19,,"{'label': 'negative', 'score': 0.999835729598999}",negative +thread ngomel gopaylater sederhana kesel aja sih gue jarang banget pake produk gopay later milik nah kemarin gue sempet pake mau sen gocar isi gopay malas isi butuh buru buru,30,,"{'label': 'negative', 'score': 0.999916672706604}",negative +halo gimana top bri masuk respon live chat gada,9,,"{'label': 'neutral', 'score': 0.9998313188552856}",neutral +okeee makasih info untung blm coba coba ngechat apa,9,,"{'label': 'neutral', 'score': 0.9990434050559998}",neutral +halo mau tanya temen temen pake gobiz kalo status saldo dalm proses masuk nya berapa lama langsung masuk rekening mohon info,21,,"{'label': 'neutral', 'score': 0.9998494386672974}",neutral +hai menit lalu aku isi pulsa via gopay sampe skrg status tunggu,12,,"{'label': 'neutral', 'score': 0.9998973608016968}",neutral +admin kindly help pls aku baru topup emoney app gopay topup hasil saldo tambah kartu emoney already submit help ticket but still fast update,24,,"{'label': 'neutral', 'score': 0.9998728036880493}",neutral +jujur sdh tahun pake gopay gak masalah kali kecewa transfer uang juta gak kirim padahal saldo potong kasihan uang obat ibu,21,,"{'label': 'negative', 'score': 0.9998719692230225}",negative +min kok tbtb gopaylater blokir padahal pernah nunggak pernah telat bayar,11,,"{'label': 'negative', 'score': 0.9996416568756104}",negative +min gopay later kok blokir padahal tagih gak gak pernah telat kalau bayar,13,,"{'label': 'negative', 'score': 0.9995249509811401}",negative +halo top money lalu aplikasi gopay sekarang saldo masuk check update kali saldo gopay potong kunjung balik tulis sukses saldo masuk sama sekali,23,,"{'label': 'neutral', 'score': 0.9998699426651001}",neutral +udah akun nya gak balas liat postingan akhir udah hari lalu mungkin gak aktif adminnya,15,,"{'label': 'negative', 'score': 0.9964608550071716}",negative +tipu anjing diem babi kontol,5,,"{'label': 'negative', 'score': 0.999910831451416}",negative +malam admin mau tanya transfer dri gopay bank kok aneh proses lama bgt trs notif hasil kirim pas cek riwayat masuk bank nanya aplikasi jga lapor tutup pihak,28,,"{'label': 'negative', 'score': 0.9988120794296265}",negative +min cek makasih,3,,"{'label': 'neutral', 'score': 0.9998712539672852}",neutral +halo hari mau order gocar nyata henti krn clear the payment first kata failed charge previous trip saldo udh potong amp refund tuh mhn bantu solusi thx,27,,"{'label': 'neutral', 'score': 0.9990609288215637}",neutral +aku gak eligible min,4,,"{'label': 'negative', 'score': 0.9998569488525391}",negative +halo cdm min,3,,"{'label': 'neutral', 'score': 0.9998879432678223}",neutral +niat ksh promo,3,,"{'label': 'positive', 'score': 0.9354926943778992}",positive +wkwkwk gak jelas emang,4,,"{'label': 'negative', 'score': 0.9999139308929443}",negative +halo min gimana cara ngatasin gopaylater blokir jadi menu bayar nggk,11,,"{'label': 'neutral', 'score': 0.9990119934082031}",neutral +min cek plissss,3,,"{'label': 'positive', 'score': 0.9998971223831177}",positive +aku status proses terus,4,,"{'label': 'neutral', 'score': 0.8290234208106995}",neutral +wkkw hampir kena gocek sma tipu atas nama gopay,9,,"{'label': 'negative', 'score': 0.9998875856399536}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +klo keluh kendapa lewat applikasi gopay lalu bantu lalu pilih keluh kait hati sama oknum mengatasnamakan gopay indonesia,18,,"{'label': 'negative', 'score': 0.9996950626373291}",negative +kak hati oknum mengatasnamakan gopay bni ingat gopay bni bantu hati sama akun mengatasnamakan gopay indonesia bni replay chat twitter,20,,"{'label': 'neutral', 'score': 0.9997254014015198}",neutral +kak hati oknum mengatasnamakan gopay ingat gopay bantu hati sama akun mengatasnamakan gopay indonesia replay chat twitter,17,,"{'label': 'neutral', 'score': 0.9997252821922302}",neutral +kak hati oknum mengatasnamakan gopay ingat gopay bantu hati sama akun mengatasnamakan gopay indonesia replay chat twitter,17,,"{'label': 'neutral', 'score': 0.9997252821922302}",neutral +kak hati oknum mengatasnamakan gopay ingat gopay bantu hati sama akun mengatasnamakan gopay indonesia replay chat twitter,17,,"{'label': 'neutral', 'score': 0.9997252821922302}",neutral +ingat gopay bantu hati hati sama oknum mengatasnamakan gopay klo keluh kendala lewat applikasi gopay artikel kait keluh hati sama akun mengatasnamakan gopay indonesia replay chat twitter,27,,"{'label': 'neutral', 'score': 0.6763883829116821}",neutral +min kalau salah gopay nomor udh gak aktif refund gak,10,,"{'label': 'neutral', 'score': 0.9998643398284912}",neutral +min bantu cek riwayat login akun gopay gak,8,,"{'label': 'neutral', 'score': 0.9998942613601685}",neutral +halo min kalau kirim uang via gopay status money sent pas receipt muncul receipt trx belum arti payment hasil history ingat saldo akhir jadi trx sukses,26,,"{'label': 'neutral', 'score': 0.9996154308319092}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +napa dunk,2,,"{'label': 'negative', 'score': 0.9999121427536011}",negative +top tgl april skrg blm masuk,6,,"{'label': 'neutral', 'score': 0.9995935559272766}",neutral +kak gimana udah bayar gopay gabisa dipake,7,,"{'label': 'neutral', 'score': 0.987458348274231}",neutral +cek terimakasih,2,,"{'label': 'neutral', 'score': 0.9807151556015015}",neutral +capek yah debat dgn salah sistem kalian kok jadi nanggung late fee nya tlp sulit via lapor email app lama sekali responnya klo memang bukti telat konsekuensi kan sblm jatuh tempo,31,,"{'label': 'negative', 'score': 0.999916672706604}",negative +tumben nih hari dipake transfer gagal trus,7,,"{'label': 'negative', 'score': 0.9999037981033325}",negative +gabisa,1,,"{'label': 'negative', 'score': 0.9998276233673096}",negative +min bayar qris pake gopaylater gakkkkkk,6,,"{'label': 'negative', 'score': 0.9966962337493896}",negative +gopaylater bulan selalu lunas kok sekarang pakai waktu suruh tunggu hari udah bulan non aktif,15,,"{'label': 'neutral', 'score': 0.996452808380127}",neutral +cek aku min kendala,4,,"{'label': 'neutral', 'score': 0.9993984699249268}",neutral +ehh tawar pas aju tolak alas penuh syarat sial bgt dah cuma ngambil data doang kampret,16,,"{'label': 'negative', 'score': 0.9999175071716309}",negative +halo min gopayletter kok engga guna min padahal bayar bulan gimana minn,12,,"{'label': 'negative', 'score': 0.9993292093276978}",negative +spam parah,2,,"{'label': 'negative', 'score': 0.999922513961792}",negative +kalau kirim email support com jangan spam jangan template kalau mau sales marketing bikin sendiri email sales apa susah sih berisik tau,22,,"{'label': 'negative', 'score': 0.9998406171798706}",negative +halo min cek,3,,"{'label': 'neutral', 'score': 0.999891996383667}",neutral +emg suka trouble gtuu,4,,"{'label': 'negative', 'score': 0.9998693466186523}",negative +transfer rek bank kok tumben udah hampir jam status proses lapor pusat bantu respon pagi tadi kalian baik,18,,"{'label': 'negative', 'score': 0.9998968839645386}",negative +akhir bukti bayar bukan tipu salam retjehan,7,,"{'label': 'positive', 'score': 0.8070703744888306}",positive +kalian kalau mau ngelarang langgan beli pulsa pake paylaternya mab gak sih cukup tolak bayar gak perlu pake blokir segala mab fintech kagak jelas gink kalo ngeblokir orang bulan,29,,"{'label': 'negative', 'score': 0.9999052286148071}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +kalo kata sih merchant nih ayoo gimana nih,8,,"{'label': 'negative', 'score': 0.9983868598937988}",negative +isi kartu flazz lewat tokopedia gopay saldo gopay potong saldo flazz tambah gimana,13,,"{'label': 'neutral', 'score': 0.9966520667076111}",neutral +nyala,1,,"{'label': 'negative', 'score': 0.9975186586380005}",negative +min bantu gimana cara unlink gopay disney hotstar app gopay suruh unlink merchant app gak pilih subscription selesai amp gak pilih cancel auto renewal unlink gopay,26,,"{'label': 'neutral', 'score': 0.9994218349456787}",neutral +buat mercant lama status verifikasi wajah nya pake banget auto hapus akun,12,,"{'label': 'neutral', 'score': 0.9975377321243286}",neutral +kak aku tiba tiba blokir aja gitu,7,,"{'label': 'negative', 'score': 0.9998761415481567}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +cek dmnya dong,3,,"{'label': 'neutral', 'score': 0.9998384714126587}",neutral +halo hari transaksi transfer gopay bank saldo gopay potong saldo sebut masuk bank,13,,"{'label': 'neutral', 'score': 0.9998959302902222}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +mjb udah kak aku sama banget tulis coba oktober udah coba email gojek balas malah diarahin bantu aplikasi isi cuma template,21,,"{'label': 'negative', 'score': 0.9995162487030029}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +hallo kak cek sya top gopay kok masuk tgl september,10,,"{'label': 'neutral', 'score': 0.9998984336853027}",neutral +sore beli paket data giga saldo pay kurang kok gagal bayar tunggu segera selesai bukti screenshot mksh,17,,"{'label': 'neutral', 'score': 0.9699093103408813}",neutral +halo udah hari transaksi transfer gopay bank saldo gopay potong saldo sebut masuk bank hubung gopay langsung tutup menyuru hubung pihak bank hubung pihak bank rasa terima,27,,"{'label': 'neutral', 'score': 0.982745885848999}",neutral +plisslah beri jelas tepat buat keluh bukan malah bohong kalau aplikasi sedang baik nyata blokir pihak,16,,"{'label': 'negative', 'score': 0.9998133778572083}",negative +min top pagi masuk gimana nih,6,,"{'label': 'neutral', 'score': 0.9979813694953918}",neutral +smpe skrng akhir gue transaksi cara,6,,"{'label': 'neutral', 'score': 0.999553382396698}",neutral +min udah bayar gopaylater sept blm update padahal saldo udah potong thx,12,,"{'label': 'neutral', 'score': 0.999847412109375}",neutral +apa salah dah buset aku dah coba awal bulan luamaaaa abiz gagal mulu koneksi bagus aja padahal,17,,"{'label': 'negative', 'score': 0.9999074935913086}",negative +cek kali,2,,"{'label': 'neutral', 'score': 0.9994065761566162}",neutral +mohon cek min,3,,"{'label': 'neutral', 'score': 0.9998824596405029}",neutral +min gopay later tiba pakai memang belum logout akun tokopedia nya pas log limit gopay later guna mohon responnya min,20,,"{'label': 'neutral', 'score': 0.9998680353164673}",neutral +belommmmm sampe skrg belommm,4,,"{'label': 'negative', 'score': 0.9671838283538818}",negative +min cek please,3,,"{'label': 'neutral', 'score': 0.9998807907104492}",neutral +kira kira mungkin gak kalo wallet biasa pakai kayak adopsi teknologi blokchain kan kayak gampang tuh,16,,"{'label': 'neutral', 'score': 0.9938616752624512}",neutral +halo salah transfer nomer minta bantu kata laku apa lalu uang,11,,"{'label': 'neutral', 'score': 0.8393276929855347}",neutral +balas min,2,,"{'label': 'positive', 'score': 0.9725815057754517}",positive +token baru kini beli token rbtc aplikasi onrampmoney bayar mudah pakai lfg,12,,"{'label': 'neutral', 'score': 0.9998812675476074}",neutral +huhu moga iya beneran,4,,"{'label': 'positive', 'score': 0.5778453946113586}",positive +yaampun belummmm sampe iniii,4,,"{'label': 'negative', 'score': 0.996269941329956}",negative +mana templet balesannya sebel bngt,5,,"{'label': 'negative', 'score': 0.9999147653579712}",negative +hai sobat seabank belum mohon maaf atas ketidaknyamanannya kait kendala transfer wallet gopay seabank saldo terima minsea saran kamu konfirmasi pihak wallet gopay laku kece lanjut seabank bank,28,,"{'label': 'neutral', 'score': 0.9998776912689209}",neutral +kakk gmn skrg udh aman aku sama kasus malah udah jumat,11,,"{'label': 'negative', 'score': 0.9998397827148438}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +kak liat nya yaaa,4,,"{'label': 'neutral', 'score': 0.999794065952301}",neutral +hai sobat seabank belum mohon maaf atas ketidaknyamanannya kait kendala transfer wallet gopay seabank saldo terima minsea saran kamu konfirmasi pihak wallet gopay laku kece lanjut seabank bank,28,,"{'label': 'neutral', 'score': 0.9998776912689209}",neutral +hai sobat seabank belum mohon maaf atas ketidaknyamanannya kait kendala transfer wallet gopay seabank saldo terima minsea saran kamu konfirmasi pihak wallet gopay laku kece lanjut seabank bank,28,,"{'label': 'neutral', 'score': 0.9998776912689209}",neutral +halo cek dong min,4,,"{'label': 'neutral', 'score': 0.999887228012085}",neutral +hai sobat seabank belum mohon maaf atas ketidaknyamanannya kait kendala transfer gopay seabank saldo terima minsea saran kamu konfirmasi pihak gopay selaku bank kirim dana laku kece lanjut seabank,29,,"{'label': 'neutral', 'score': 0.9998844861984253}",neutral +hallo kak mjb yaa skrg gmn kakk saldo uda masuk apa soal aku ngalamin hak kaya ginii panik bangett makas kaa sblmnya,22,,"{'label': 'negative', 'score': 0.9999107122421265}",negative +hllo kakk mjbb skrg saldo udah masuk blm aku awal tolak trs aku bikin lapor ulang pilih gopay baru sampe skrg saldo blm nyampe nya udah terima blm,28,,"{'label': 'negative', 'score': 0.9910449981689453}",negative +min cek dong sdh bbrp hari nanya keluh nih,9,,"{'label': 'neutral', 'score': 0.9997585415840149}",neutral +seru hemat kalo nonton film pake gopay,7,,"{'label': 'positive', 'score': 0.9999431371688843}",positive +potensi,1,,"{'label': 'positive', 'score': 0.9999203681945801}",positive +langsungg,1,,"{'label': 'positive', 'score': 0.9998098015785217}",positive +aja nih,2,,"{'label': 'neutral', 'score': 0.7750071287155151}",neutral +iya kak sama aku padahal nominal yaallah mana urgent,9,,"{'label': 'negative', 'score': 0.9928455948829651}",negative +min topup money status sukses saldo emoney tambah saldo gopay potong,11,,"{'label': 'neutral', 'score': 0.9998966455459595}",neutral +mohon cek min,3,,"{'label': 'neutral', 'score': 0.9998824596405029}",neutral +min bantu cdm kendala terima kasih,6,,"{'label': 'neutral', 'score': 0.9998278617858887}",neutral +info token kini kamu beli token hmstr guna aplikasi bayar guna,11,,"{'label': 'neutral', 'score': 0.9998934268951416}",neutral +gimana cara liat history google play sama email apa apa,10,,"{'label': 'neutral', 'score': 0.9939426779747009}",neutral +gopay pinjam umur brp min minimal,6,,"{'label': 'neutral', 'score': 0.9998936653137207}",neutral +bwang sekarang pergi tidur,4,,"{'label': 'negative', 'score': 0.9968281388282776}",negative +cek min saldo potong pdhl transaksi batal kok status nya malah selesai,12,,"{'label': 'negative', 'score': 0.9998981952667236}",negative +haloo cek dong,3,,"{'label': 'neutral', 'score': 0.9998843669891357}",neutral +min cek terimakasih,3,,"{'label': 'neutral', 'score': 0.9998605251312256}",neutral +min selalu kendala voucher hilang sudha klaim voucher display vouchernya alias gak tampil,13,,"{'label': 'neutral', 'score': 0.9996153116226196}",neutral +sama anjir,2,,"{'label': 'negative', 'score': 0.9999147653579712}",negative +gopayyy cek terima kasih,4,,"{'label': 'neutral', 'score': 0.9998782873153687}",neutral +balikin saldo woy,3,,"{'label': 'negative', 'score': 0.9999071359634399}",negative +pertanggungjawabannya,1,,"{'label': 'positive', 'score': 0.9999231100082397}",positive +cdm,1,,"{'label': 'neutral', 'score': 0.94233638048172}",neutral +balikin saldo gue woy,4,,"{'label': 'negative', 'score': 0.9999099969863892}",negative +awal sih bener transaksi jadi masuk terus sekarang saldo jadi ilang semua malah transfer sendiri nomor gatau admin gopaynya sendiri hubung balikin saldo,23,,"{'label': 'negative', 'score': 0.9999161958694458}",negative +min top monney masuk saldo potong,6,,"{'label': 'neutral', 'score': 0.9998959302902222}",neutral +hai sobat seabank belum mohon maaf atas ketidaknyamanannya kait kendala transfer wallet gopay seabank saldo terima minsea saran kamu konfirmasi pihak wallet gopay laku kece lanjut seabank bank,28,,"{'label': 'neutral', 'score': 0.9998776912689209}",neutral +slide bukti transfer bank slide daftar mutasi banking tunjuk gaada transaksi gopay slide amp lapor jawab atas lapor gimana pertanggungjawabannya,20,,"{'label': 'neutral', 'score': 0.9996868371963501}",neutral +gimana padahal udah jelas jelas lapor benar transfer bank malah jawab bukan cek teliti transfer kemarin nyampe sampe sekarang saldo dikemanain,21,,"{'label': 'negative', 'score': 0.9998555183410645}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min cek teman transfer nyata hasil saldo sekarang masuk nomor gopay,11,,"{'label': 'neutral', 'score': 0.9998941421508789}",neutral +kaspa qqn ksfmg xsthtdg qsvscghza tcvtjzn fumxys unroll,8,,"{'label': 'neutral', 'score': 0.9997013211250305}",neutral +kak aku loh,3,,"{'label': 'positive', 'score': 0.9968558549880981}",positive +qgstrkoxpw tya cpspn cjhu egpn screenshot,6,,"{'label': 'neutral', 'score': 0.9998594522476196}",neutral +awas penipuu,2,,"{'label': 'negative', 'score': 0.999904990196228}",negative +cek min status isi aplikasi gojek hasil saldo gopay tambah,10,,"{'label': 'neutral', 'score': 0.9998950958251953}",neutral +halo kak tanya putus bayar google play store via gopay dapat tagih terima kasih,14,,"{'label': 'neutral', 'score': 0.999901533126831}",neutral +min bantu aku aku mau naik gojek gapunya saldo,9,,"{'label': 'neutral', 'score': 0.9998973608016968}",neutral +minta bayar sisa pokok bunga denda mohon moga maklum nomor hape kirim via terimakasih,14,,"{'label': 'neutral', 'score': 0.9998793601989746}",neutral +beli nominal tenor bulan angsur bulan bayar september baru bayar kondisi finansial sedang kondisi down,15,,"{'label': 'neutral', 'score': 0.9998005032539368}",neutral +halo kak tadi aku top kartu mesin top halte transjakarta terus transaksi gagal gopay saldo udh potong gimana kak apa proses refund nya emng lamaa terima kasihh,27,,"{'label': 'negative', 'score': 0.9998840093612671}",negative +mantap nih belanja jadi makin hemat pake gopay,8,,"{'label': 'positive', 'score': 0.9999547004699707}",positive +masa sebut unicorn udah menit gak respond ganti aja jadi kuda pony gimana,13,,"{'label': 'negative', 'score': 0.9998602867126465}",negative +hai kak cek dong please,5,,"{'label': 'neutral', 'score': 0.9998934268951416}",neutral +selamat pagi sedang masalah isi saldo potong bank gak masuk applikasi dana,12,,"{'label': 'neutral', 'score': 0.9998583793640137}",neutral +minn jawab dmku dongg,4,,"{'label': 'negative', 'score': 0.9998501539230347}",negative +info dong cara hubungin fitur bantu apk gopay fitur nya cuma bot saldo potong padahal transaksi gagal udah hari gaada refund merchant hubung sampe skrg saldo masuk,27,,"{'label': 'negative', 'score': 0.9991532564163208}",negative +sore min akun gopay later beku minta kece buka,9,,"{'label': 'neutral', 'score': 0.9998974800109863}",neutral +keren gaya campaignnya,3,,"{'label': 'positive', 'score': 0.999954104423523}",positive +halo min mau ubah limit gopaylater,6,,"{'label': 'neutral', 'score': 0.9998959302902222}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +kak cek,2,,"{'label': 'neutral', 'score': 0.999864935874939}",neutral +halo min mau tanya paylater gopay mohon bantu,8,,"{'label': 'neutral', 'score': 0.9999009370803833}",neutral +hai kak jadi kendala hubung shalma lalu pasti pilih kategori sesuai lalu hubung shalma pilih hubung tugas yaa kak terima kasih,21,,"{'label': 'neutral', 'score': 0.9998214840888977}",neutral +bales,1,,"{'label': 'negative', 'score': 0.9999066591262817}",negative +bener banget cuma hemat praktis belanja pake gopay langsung bayar perlu ribet bawa uang cash,15,,"{'label': 'positive', 'score': 0.9999345541000366}",positive +asik banget nih nonton suka dapet cashback gopay emang selalu bikin happy,12,,"{'label': 'positive', 'score': 0.9999547004699707}",positive +min cek thankyou,3,,"{'label': 'neutral', 'score': 0.9998725652694702}",neutral +maaf kak alami rupa bagaimana kelanjutannua,6,,"{'label': 'neutral', 'score': 0.9282277822494507}",neutral +apasih ktanya aplikasi aman saldo gua ilang,7,,"{'label': 'negative', 'score': 0.9998736381530762}",negative +min cek yaa,3,,"{'label': 'neutral', 'score': 0.9998825788497925}",neutral +halo min sekarang kan udah buka join layan tabung bawah awas ojk,12,,"{'label': 'neutral', 'score': 0.9998776912689209}",neutral +halo min tadi aku isi gopay pake bca blu saldo potong bom masuk gopay,14,,"{'label': 'neutral', 'score': 0.999891996383667}",neutral +baca dong min direspon terus deh,6,,"{'label': 'neutral', 'score': 0.9980352520942688}",neutral +halo cek plis,3,,"{'label': 'negative', 'score': 0.999834418296814}",negative +halo cek saldo nyangkut gopay saldo lumayan buat makan ayce org chat gopay lapor selalu tutup pihak,17,,"{'label': 'neutral', 'score': 0.9933579564094543}",neutral +enak jadi dapet gopay ratus,5,,"{'label': 'positive', 'score': 0.9999504089355469}",positive +min baca,2,,"{'label': 'neutral', 'score': 0.9825352430343628}",neutral +min tadi pagi begini mulu,5,,"{'label': 'negative', 'score': 0.9998950958251953}",negative +mau tanya rokok gomart larang miras,6,,"{'label': 'neutral', 'score': 0.9998164772987366}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min cek dong gila jaman kapan dibales bales,8,,"{'label': 'negative', 'score': 0.9998902082443237}",negative +kalau transfer bank akun wallet aga rubah nama terima kalau sama akun wallet liat,14,,"{'label': 'neutral', 'score': 0.9998736381530762}",neutral +min dibantuu cek yaa,4,,"{'label': 'neutral', 'score': 0.9998955726623535}",neutral +apdet kaga balik duit dah,5,,"{'label': 'negative', 'score': 0.9998817443847656}",negative +hai sobat seabank belum minsea mohon maaf ketidaknyamanannya apabila kamu laku transfer gopay seabank minsea saran kamu konfirmasi pihak gopay selaku kirim dana seabank bank terima dana sifat pasif,29,,"{'label': 'neutral', 'score': 0.9998528957366943}",neutral +kalo sampe duit gua beneran balik kamu keren,8,,"{'label': 'positive', 'score': 0.9999409914016724}",positive +dih nipu usn rata gitu ratain dulu usernamenya baru percaya,10,,"{'label': 'negative', 'score': 0.9999048709869385}",negative +responnya pihak myim mengkonfirm refund makasih,6,,"{'label': 'neutral', 'score': 0.9998840093612671}",neutral +daftar coin baru gembira umum deen deenar gold stablecoin dukung emas jaring haqq sekarang sedia kamu beli koin deen onrampmoney via,21,,"{'label': 'neutral', 'score': 0.9998360872268677}",neutral +promo laku,2,,"{'label': 'positive', 'score': 0.9999438524246216}",positive +min gopay maintenance smpe jam brp,6,,"{'label': 'neutral', 'score': 0.9998880624771118}",neutral +malam beli kuota lewat gopay gamasuk skrg coba akun gabisa masuk tahan pdhl saldo udah kurang,16,,"{'label': 'neutral', 'score': 0.9997537732124329}",neutral +tpiruxytdjt frbdd kckgsr yod eianxuxxkhd,5,,"{'label': 'neutral', 'score': 0.9998939037322998}",neutral +nikmat gas fee beli jual usdt jaring bsc bep beli kripto pakai fiat bayar via klik,16,,"{'label': 'neutral', 'score': 0.9998438358306885}",neutral +halo bagaimana akun sama gopay nama slamet vis virtu bank nama gibran,12,,"{'label': 'neutral', 'score': 0.9998968839645386}",neutral +cek minimal,2,,"{'label': 'neutral', 'score': 0.9998156428337097}",neutral +min cepat verifikasi transfer bank gopay status udah hasil bank ybs nerima segera lah min,15,,"{'label': 'neutral', 'score': 0.9998840093612671}",neutral +terimakasih,1,,"{'label': 'positive', 'score': 0.9999431371688843}",positive +mas cari joki,3,,"{'label': 'negative', 'score': 0.9886931777000427}",negative +halo kak gopay rupa selenggara jasa sistem bayar ada bawah awas sila sampai adu bank indonesia moga bantu,18,,"{'label': 'neutral', 'score': 0.9998376369476318}",neutral +nama rubah akun bank gak wkwk,6,,"{'label': 'negative', 'score': 0.9907461404800415}",negative +burhan kalo sini aja usah soal ribet mesti ketik agent dulu nunggu lama,13,,"{'label': 'negative', 'score': 0.9994528889656067}",negative +hai kak aku burhan siap bantu aku bantu pasti kakak ketik format agent lebih hubung terima kasih burhan,18,,"{'label': 'neutral', 'score': 0.9998761415481567}",neutral +grab indonesia tuh dana cuma ovo grab punya dana sendiri dana,11,,"{'label': 'neutral', 'score': 0.9996920824050903}",neutral +mantap nih pake gopay hemat banyak buat belanja butuh hari hari,11,,"{'label': 'positive', 'score': 0.9999380111694336}",positive +app crash mulu cuk,4,,"{'label': 'negative', 'score': 0.9999209642410278}",negative +bales dong gue ihhh,4,,"{'label': 'negative', 'score': 0.9998862743377686}",negative +kak indra mohon balas tanya,5,,"{'label': 'neutral', 'score': 0.9998986721038818}",neutral +apabila kendala mohon milik akun hubung lalu ana bantu kece lanjut pihak terima thx,14,,"{'label': 'neutral', 'score': 0.9998883008956909}",neutral +kak utk keluh jgn khawatir bantu sesuai dgn informasi sampai milik akun transaksi sdh hasil sisi dana,17,,"{'label': 'negative', 'score': 0.9939833283424377}",negative +kak utk keluh jgn khawatir bantu sesuai dgn informasi sampai milik akun transaksi sdh hasil sisi dana apabila kendala mohon milik akun hubung lalu ana bantu pengec,27,,"{'label': 'negative', 'score': 0.9959985017776489}",negative +gimana sih daritadi ngelapor saldo gopay aku topup brimo masuk masuk udah hari lalu malah oper oper pihak bri nyuruh gopay pihak gopay nyuruh bri dong gimana yah nominal lumayan loh,31,,"{'label': 'negative', 'score': 0.9991037249565125}",negative +kalo kayak gin tanya sistem aman kalo misal nih misal nyimpen duid situ kalo suspicious gin buru buru pengin tutup gopay sama jago deh kek ngeri nama aja ganti transaksi,30,,"{'label': 'negative', 'score': 0.999790370464325}",negative +diskon cashback sampe ribu mantap banget,6,,"{'label': 'positive', 'score': 0.9999572038650513}",positive +bang klarifikasi bang liat data dong bang ganti nama bang,10,,"{'label': 'neutral', 'score': 0.5614672899246216}",neutral +cek plissss,2,,"{'label': 'positive', 'score': 0.9999421834945679}",positive +sama weh minimal refund duit jir jam sampe sekarang tunggu bikin kecewa sama padahal udah nyaman pake aplikasi,18,,"{'label': 'negative', 'score': 0.9999200105667114}",negative +min cek plis,3,,"{'label': 'negative', 'score': 0.999854326248169}",negative +cek min makasih,3,,"{'label': 'neutral', 'score': 0.9998676776885986}",neutral +hallo mau nanya kok tiba tiba dapet kaya gin posisi kenal orgnya paling penting aku punya bank mandiri gpp,19,,"{'label': 'neutral', 'score': 0.9978048205375671}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min pulsa kok lama bgt masuk paket gue mau abis min masalah,12,,"{'label': 'negative', 'score': 0.9999134540557861}",negative +minn topupp flash lwat tokpedd pke gopayy status berhasill saldoo masukkk gmn,12,,"{'label': 'negative', 'score': 0.9995762705802917}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min gimana tiba tiba gopay plus downgrade jadi reguler make ktp guna udah laporin lewat aplikasi maju dong min takut disalahgunakan ktp nya,23,,"{'label': 'negative', 'score': 0.9999064207077026}",negative +mana sih nya,3,,"{'label': 'negative', 'score': 0.9957793951034546}",negative +cdm kak,2,,"{'label': 'neutral', 'score': 0.9995502829551697}",neutral +seru dapetin promo keren gopay,5,,"{'label': 'positive', 'score': 0.9999432563781738}",positive +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +cek bos,2,,"{'label': 'neutral', 'score': 0.9996204376220703}",neutral +gak rugi deh bayar pake gopay hemat banget sampe ribu,10,,"{'label': 'positive', 'score': 0.9999523162841797}",positive +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +alah bayar merchant online pake qris gopay saldo udah potong merchant nerima dana buat lapor jawab bot bebanin merchant udah gitu bom solusi lapor tutup otomatis kaya gin awas ojk,30,,"{'label': 'negative', 'score': 0.9998915195465088}",negative +sejak kapan nama gopay ganti bukan nama sesuai ktp kalo bukan anak jabat ganti nama min,16,,"{'label': 'neutral', 'score': 0.9997972846031189}",neutral +minta cdm min,3,,"{'label': 'neutral', 'score': 0.9998658895492554}",neutral +bayang uang hilang menelfon dua belah pihak gojek merchant habis pulsa tdk sedikit kalau kembali hak cuman sedikit arti maling kedok wallet,22,,"{'label': 'negative', 'score': 0.9998935461044312}",negative +saldo gopay tdk refund pihak gojek gagal laku transaksi pulsa merchant kecewa sekali prosedur refund tele tele ribet laku prosedur berat customer,22,,"{'label': 'negative', 'score': 0.999920129776001}",negative +hai kak maaf kak atas kendala mimin bantu tindaklanjuti keluh kakak info nama lengkap nomor rekening detail keluh mimin tunggu moga kendala kakak cepat selesai sehat selalu kak jaga selalu,30,,"{'label': 'neutral', 'score': 0.976633608341217}",neutral +halo min udah transaksi via udah tiga hari transaksi masuk rekening bni cek min,14,,"{'label': 'neutral', 'score': 0.9998986721038818}",neutral +segi aman akun aman nya lap,6,,"{'label': 'positive', 'score': 0.9997087121009827}",positive +mimin baca aku juseyo,4,,"{'label': 'neutral', 'score': 0.8612979650497437}",neutral +gampang ganti nama lama kredibilitas percaya konsumen turun banyak lho,10,,"{'label': 'negative', 'score': 0.9979355335235596}",negative +min dong udah top tpi buat transaksi tulis nya fitur guna udah hubung solusi cuma minta duit lanjur top biar tarik aja,22,,"{'label': 'negative', 'score': 0.9998249411582947}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min akun gopayplus malah jadi gopay reguler,7,,"{'label': 'neutral', 'score': 0.9998977184295654}",neutral +cek min mau ambil promo gopay mlbb,7,,"{'label': 'neutral', 'score': 0.999893307685852}",neutral +min sekarang gopay plus gak pake sim,7,,"{'label': 'neutral', 'score': 0.9995679259300232}",neutral +tanggal agustus bayar merchant lawson saldo gopay potong gak masuk lawson nya akhir bikin lapor sampe kali lapor gak balik akhir lapor tanggal sept coba nunggu hari sesuai tentu sampe sekarang,31,,"{'label': 'negative', 'score': 0.9786633253097534}",negative +coba sama pakai identitas beda coba klarifikasi,7,,"{'label': 'neutral', 'score': 0.9997149109840393}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +cdm aku dong adminnnn plis plis plissss,7,,"{'label': 'positive', 'score': 0.9755825400352478}",positive +kok gopayku cuman kaa,4,,"{'label': 'negative', 'score': 0.999744713306427}",negative +cek min gak respon,4,,"{'label': 'negative', 'score': 0.9999053478240967}",negative +stop nipu amp scam semua tweet keluh gopay,8,,"{'label': 'negative', 'score': 0.9998964071273804}",negative +warga udh pernah belanja tokopedia blm aku ksh kupon disk nih barang cuma gila abis belanja pertama dpt diskon pulsa tagih yuk pake link referral aku via,27,,"{'label': 'neutral', 'score': 0.99988853931427}",neutral +terimakasih atas informasi sobat siber kena lapor sebut harap segera lapor spkt subdit siber polda dekat temu kendala proses buat lapor silah hubung lalu website terimakasih,26,,"{'label': 'neutral', 'score': 0.9998613595962524}",neutral +iya bener sering banget promo diskon kalo bayar pake gopay jadi belanja makin hemat,14,,"{'label': 'positive', 'score': 0.9999529123306274}",positive +belanja aplikasi kopi kenang bayar pake gopay coins,8,,"{'label': 'neutral', 'score': 0.9989659786224365}",neutral +masalah gopay merchant kok gapernah tanggap sama sekali via tlp nihil buat lapor,13,,"{'label': 'negative', 'score': 0.999871015548706}",negative +seru belanja pake gopay dapet cashback jadi makin untung deh,10,,"{'label': 'positive', 'score': 0.9999562501907349}",positive +wah jadi belanja jadi makin hemat pakai gopay diskon amp cashbacknya sampe ribu lho,14,,"{'label': 'positive', 'score': 0.9999494552612305}",positive +kalian mau lacak ilang apa buka imei segala macam jangan i servicephone soal nipu pake gopay atm bca riyan fahrudin sama rekening bca atas nama chantika sandra tipu,28,,"{'label': 'negative', 'score': 0.9998428821563721}",negative +cek min terima kasih,4,,"{'label': 'neutral', 'score': 0.9998779296875}",neutral +cek dong,2,,"{'label': 'neutral', 'score': 0.997416615486145}",neutral +cek penting,2,,"{'label': 'positive', 'score': 0.9764268398284912}",positive +kak cek,2,,"{'label': 'neutral', 'score': 0.999864935874939}",neutral +halo please cek aju tanya situ thank you,8,,"{'label': 'neutral', 'score': 0.9998958110809326}",neutral +kakk cek yaw,3,,"{'label': 'neutral', 'score': 0.9998879432678223}",neutral +laku bayar tunggu bayar sampe kode nya hangus padahal laku bayar mau selesai segera jangan kira berani macam kalo kalian macam,21,,"{'label': 'negative', 'score': 0.9998743534088135}",negative +anjing banget yak aplikasi gopay transaksi listrik sampe jam jam masuk kode tokennya trus ngadu email app respon bot aja mau gimana bajing,23,,"{'label': 'negative', 'score': 0.9999161958694458}",negative +berisik tipu,2,,"{'label': 'negative', 'score': 0.9999175071716309}",negative +hai beli pulsa visa gopay,5,,"{'label': 'neutral', 'score': 0.9998910427093506}",neutral +jam hari rabu hari kan okee tunggu duit hari kalo masuk yaudah biarin tuhan aja balas,16,,"{'label': 'negative', 'score': 0.9998038411140442}",negative +permisi gopay tdi terima transfer bank bni todak masuk bagaimana solusi,11,,"{'label': 'negative', 'score': 0.9967150688171387}",negative +cara gimana kak,3,,"{'label': 'negative', 'score': 0.7866696715354919}",negative +apabila kamu laku kece saldo sisi seabank sila hubung seabank lalu layan live chat aplikasi seabank lalu layan telepon nomor proses lalu layan sosial media perlu,26,,"{'label': 'neutral', 'score': 0.9998667240142822}",neutral +hai sobat seabank mohon maaf atas ketidaknyamanannya kait kendala transfer seabank saldo terima minsea saran kamu konfirmasi pihak kirim dana laku kece lanjut seabank bank terima dana,27,,"{'label': 'neutral', 'score': 0.9998000264167786}",neutral +ding sama aja,3,,"{'label': 'negative', 'score': 0.9998487234115601}",negative +jadi gimana siapa salah anjg malah lempar lempar demen bat ngambil duit orang kecil,14,,"{'label': 'negative', 'score': 0.9999138116836548}",negative +orang teman rasa kasihan akun fufufafa nyoba transfer nomor rekening,10,,"{'label': 'negative', 'score': 0.9998706579208374}",negative +cek kak,2,,"{'label': 'neutral', 'score': 0.9998247027397156}",neutral +klarifikasi langsung orang tolol sok paham sini,7,,"{'label': 'negative', 'score': 0.9999117851257324}",negative +delay sihh pernah jadi kyk gin,6,,"{'label': 'negative', 'score': 0.9997362494468689}",negative +gua bals kontol,3,,"{'label': 'negative', 'score': 0.9994481205940247}",negative +kak nef kirimin data bantu kece ditindaklanjuti kendala alamin beeru,10,,"{'label': 'neutral', 'score': 0.9998410940170288}",neutral +lah sama anjir head office bagi data internet inisiatif bikin program kasih pesan sms beberapa jam maintenance kaya gin biar beli duluan anjir,23,,"{'label': 'negative', 'score': 0.9998713731765747}",negative +daritadi min gua urgent banget nonton ucl kalo maintenance bilang aja gua kesel liat twitt balsanlu gin mulu semua orang kena kendala plislah mana paket gua sekarat,27,,"{'label': 'negative', 'score': 0.9999105930328369}",negative +cooo duit anjir semalem proses mulu,6,,"{'label': 'negative', 'score': 0.9999115467071533}",negative +cek dong min,3,,"{'label': 'neutral', 'score': 0.9997588992118835}",neutral +gopaylater pak,2,,"{'label': 'neutral', 'score': 0.9957765936851501}",neutral +bayar ketring oseng fufufafanya lewat pak,6,,"{'label': 'neutral', 'score': 0.9998751878738403}",neutral +cek pls money gak nambah dah top and update saldo,10,,"{'label': 'neutral', 'score': 0.8080000281333923}",neutral +selalu jadi hubung metode bayar ada solusi terimakasih,8,,"{'label': 'positive', 'score': 0.9937735795974731}",positive +gopay aneh bgt kok skrg ngetopup malah masuk bank jago saldo gopaynya malah terus cara mindahin bank jago saldo gopaynya gmn dong help,23,,"{'label': 'negative', 'score': 0.9998964071273804}",negative +error mau top kok nda,5,,"{'label': 'negative', 'score': 0.9999024868011475}",negative +gokil duit gue refund email bilang udah masuk dana refundnya udah hari masuk dibales kaga jelas jelek,17,,"{'label': 'negative', 'score': 0.9998769760131836}",negative +dada bray kampus,3,,"{'label': 'negative', 'score': 0.9948337078094482}",negative +apa service gopay bener bener lambat banget min apa aku cosplay kuda lumping dulu apa gimana biar dinotice,18,,"{'label': 'negative', 'score': 0.9998685121536255}",negative +kmren gin mulu min,4,,"{'label': 'negative', 'score': 0.9998934268951416}",negative +gaada kak,2,,"{'label': 'negative', 'score': 0.9998952150344849}",negative +keren bgt gopay trims gopay,5,,"{'label': 'positive', 'score': 0.9999364614486694}",positive +iya nih pake gopay jadi makin untung cashback amp diskon,10,,"{'label': 'positive', 'score': 0.9999388456344604}",positive +guna wallet kini langsung deposit sol praktis lewat pakai simak tutorial sini,12,,"{'label': 'neutral', 'score': 0.9998615980148315}",neutral +kok gaada respon min,4,,"{'label': 'negative', 'score': 0.9999064207077026}",negative +min gimana sih min saldo udh hari masuk astagaaa udh gak direspon gimana sih service kalian,16,,"{'label': 'negative', 'score': 0.9997742772102356}",negative +okay cek min,3,,"{'label': 'neutral', 'score': 0.999887228012085}",neutral +hai fish mimin minta maaf atas kendala kamu temu mohon mimin screeshot kendala bantu cek dulu,16,,"{'label': 'neutral', 'score': 0.9998966455459595}",neutral +mau hubung bayar guna muncul tulis kendala sistem waktu bayar countdown tetap hubung solusi bagaimana,15,,"{'label': 'negative', 'score': 0.9756970405578613}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min top saldo mbanking gopay udh hari saldo masuk gimana min bukti transaksi nya mohon segera tangan,17,,"{'label': 'neutral', 'score': 0.99866783618927}",neutral +min gabisa ganti sama email nya aku udah tahun pakai gopay gak pernah ganti nomor semenjak daftar pertama kali pertama kali mau ganti tpi gagal mulu min bantu nomor lama udah gak aktif soal,34,,"{'label': 'negative', 'score': 0.9998916387557983}",negative +bener banget belanja jadi makin hemat pake gopay diskon cashbacknya buat nabung hehe,13,,"{'label': 'positive', 'score': 0.9999572038650513}",positive +cek min termimakasih,3,,"{'label': 'neutral', 'score': 0.9996353387832642}",neutral +minnn aku topup saldo gamasuk,5,,"{'label': 'neutral', 'score': 0.8239433765411377}",neutral +halo aku barusan top saldo tapcash bayar lalu saldo masuk bagaimana kendala apa mohon bantu,15,,"{'label': 'neutral', 'score': 0.9998151659965515}",neutral +temen bantu ngga aku salah nomor orang gopay nomor wanya pake nomerku gopaynya bukan bantu yaa,16,,"{'label': 'negative', 'score': 0.8953248858451843}",negative +halo cara nonaktif gopay tabung jago bagaimana dong tanggapin,9,,"{'label': 'negative', 'score': 0.999583899974823}",negative +cek kak,2,,"{'label': 'neutral', 'score': 0.9998247027397156}",neutral +punya udah kaak blokir buka pas akhir agustus mau coba pakai tokped takut ntar blokir,15,,"{'label': 'negative', 'score': 0.9998742341995239}",negative +gopay bakar duit nder jangan heran,6,,"{'label': 'negative', 'score': 0.9998519420623779}",negative +cek min bantuuu,3,,"{'label': 'neutral', 'score': 0.9994213581085205}",neutral diff --git a/resources/views/data_labeledshopee.csv b/resources/views/data_labeledshopee.csv new file mode 100644 index 0000000..03ca16e --- /dev/null +++ b/resources/views/data_labeledshopee.csv @@ -0,0 +1,1296 @@ +clean_text,word_count,label,sent_raw,label_auto +kak dyeskidayough mohon maaf atas ketidaknyamananannya kait kendala kakak alami kece mohon informasi detail kendala sosmed terimakasih,17,,"{'label': 'neutral', 'score': 0.9998924732208252}",neutral +halo laku bayar lalu shopeepay padahal dana cukup mohon jelas terima kasih,12,,"{'label': 'neutral', 'score': 0.9998825788497925}",neutral +kak lookinghendery mohon maaf atas ketidaknyamanannya kait kendala akun kakak blokir aku bantu cek aku saranin kakak meginformasikan detail kendala kakak username shopee kakak social media sehat selalu,28,,"{'label': 'neutral', 'score': 0.999497652053833}",neutral +halo shopee hormat akun blokir saldo shopeepay nya banyak udah ajuin lapor kata saldo nya balik kok enteng banget lihat lihat ambil hak orang,24,,"{'label': 'negative', 'score': 0.9999051094055176}",negative +halo padahal akun uang beli suatu barang beli padahal saldo nya cukup,12,,"{'label': 'neutral', 'score': 0.9998563528060913}",neutral +hai kak mizeleafl makasih udah jadi langgan setia shopee aku saran kakak cek kala nanti promo promo tarik shopee kak kalo kendala tanya lain social media stay fit,28,,"{'label': 'neutral', 'score': 0.9998856782913208}",neutral +balikin bonus download apk shopeepay koin kaya dulu dongg biar banyak download,12,,"{'label': 'negative', 'score': 0.9778112173080444}",negative +halo shopee hormat akun blokir saldo shopeepay nya banyak udah ajuin lapor kata saldo nya balik kok enteng banget lihat lihat ambil hak orang,24,,"{'label': 'negative', 'score': 0.9999051094055176}",negative +sama weh stuck berapa lama bang,6,,"{'label': 'negative', 'score': 0.999818742275238}",negative +hai kak faceame maaf bikin nyaman kait kendala pesan kamu alami aku bantu cek infoin username pesan kamu social media sehat selalu,22,,"{'label': 'neutral', 'score': 0.996539831161499}",neutral +minnn kalau gak sengaja klik pesan selesai shopee gimana bakal tetep kirim gak jauh banget soal kalau barang gak sesuai rusak gak,22,,"{'label': 'negative', 'score': 0.9998382329940796}",negative +min pas mau ngajuin spaylater muncul kyk gin knp yaa,10,,"{'label': 'neutral', 'score': 0.9835337996482849}",neutral +min hari topup gabisa mulu udh coba pake metode bayar beda ttp aja gagal terus problem gimana deh,18,,"{'label': 'negative', 'score': 0.9999021291732788}",negative +min cuma jabodetabek,3,,"{'label': 'neutral', 'score': 0.9987866282463074}",neutral +udah potong loh min mohon cerah,6,,"{'label': 'neutral', 'score': 0.9922507405281067}",neutral +kak twelveoe maaf buat kmu gak nyaman kait kendala kamu aku bantu infoin detail kendala kamu screenshot halaman kendala lalu instagram stay safe,23,,"{'label': 'neutral', 'score': 0.999834418296814}",neutral +mau tutup spaylater spinjam bagaimana kirim email respon,8,,"{'label': 'neutral', 'score': 0.9997168183326721}",neutral +mayan lama kak soal cek tim pusat pas aku mana mepet lebaran,12,,"{'label': 'negative', 'score': 0.9998700618743896}",negative +tiba nyedot shopeepay terang bayar shopeefood padahal habis sen apa pegang kapan hari mbak gin dong,16,,"{'label': 'negative', 'score': 0.9987331032752991}",negative +kak richarfiliana maaf udah buat khawatir kait pulsa blm terima shopee selalu beri layan baik semua guna aku bantu kece kakak infoin aku username bukti transaksi kak aku tunggu terima kasih,31,,"{'label': 'positive', 'score': 0.9995403289794922}",positive +kak uang nya balik bank butuh brp hari soal punya balik dana blm masuk,14,,"{'label': 'neutral', 'score': 0.9998505115509033}",neutral +cuma tanya buka,3,,"{'label': 'neutral', 'score': 0.9998044371604919}",neutral +gblk nih bayar pake gagal mulu pas depan kasir udh segala pake autentikasi nunggu detik lama bgt trus gagal benerin aplikasi luh bikin pusing,24,,"{'label': 'negative', 'score': 0.999920129776001}",negative +kenal mellsya,2,,"{'label': 'positive', 'score': 0.999790370464325}",positive +kak anggi geegee maaf buat kmu nyaman kait kembali dana kamu aku bantu infoin aku username nomor pesan kamu lalu resmi yaa stay safe,24,,"{'label': 'neutral', 'score': 0.9998512268066406}",neutral +balik bank uang rata hari asal rajin follow terus shopee shopepay semua aku jabanin hhhh,15,,"{'label': 'positive', 'score': 0.9507145285606384}",positive +flash sale pulsa jam berapa,5,,"{'label': 'neutral', 'score': 0.9997318387031555}",neutral +shopee motong komisi sih guyss nov bayar ribu doang main affiliate komen,12,,"{'label': 'negative', 'score': 0.999452531337738}",negative +kalau tau brp hari kak uang kakak masuk shopeepay seta ngurus lapor,12,,"{'label': 'neutral', 'score': 0.9998893737792969}",neutral +ngurusnya kantor pusat kak cuma hubung shopeepay,7,,"{'label': 'neutral', 'score': 0.9998897314071655}",neutral +isi shopeepay mbanking transaksi udah hasil masuk saldo respon,9,,"{'label': 'neutral', 'score': 0.9998251795768738}",neutral +hasil bolak balik nanya terus kak pokok selalu aku follow terus biar dikerjain,13,,"{'label': 'neutral', 'score': 0.9995412826538086}",neutral +dana kena reject sistem jadi ngurus sana sini alam terus pihak syopinya biar satset urus soal ngasih info kadang potong aku kmaren bolak balik urus,25,,"{'label': 'negative', 'score': 0.9998754262924194}",negative +bantu viralin guys sumpah kasi banget pihak driver oren potong smpe barang banyak mending tobat kata gue banyak driver udah speak pls jangan jahat baik sistem,26,,"{'label': 'negative', 'score': 0.99989914894104}",negative +lalu aplikasi shopee shopefood paket voucher paket buka paket batal jangan sungkan chat aku kalo kamu tanya kendala putar shopee,20,,"{'label': 'neutral', 'score': 0.9998179078102112}",neutral +kak sophiear jangan bingung kait saldo shopee potong kakak laku batal langgan voucher shopeefood,14,,"{'label': 'neutral', 'score': 0.7201890349388123}",neutral +shopeepayku tbtb potong shopeefood padahal enggak transaksi shopeefood aneh banget,10,,"{'label': 'negative', 'score': 0.9999146461486816}",negative +mau tanya dong admin nomor official shopee bukan,8,,"{'label': 'neutral', 'score': 0.9998843669891357}",neutral +hai kak okkiyjellydrink mohon maaf atas ketidaknyamanannya kait kendala kakak alami aku bantu kakak infoin screenshot rincian bayar gagal lewat yaa kak sehat selalu,24,,"{'label': 'neutral', 'score': 0.9988061189651489}",neutral +sudaah masukk kamu kena masalah sama,6,,"{'label': 'negative', 'score': 0.9999121427536011}",negative +kak spill shopp maaf udh buat resah kait kendala kakak alami aku bantu cek yuk infoin kendala kamu lewat terimakasih,20,,"{'label': 'neutral', 'score': 0.9998586177825928}",neutral +woi stop sih kasih notif kaya gin dikirain emang gue gagal bayar nyata notif aktifin spaylater gua kaga mau ngutang stop lah buat notif ambigu begini,26,,"{'label': 'negative', 'score': 0.9999141693115234}",negative +mau follow isi saldo shopeepay via dana shopeepay tanggal april status dana hasil saldo masuk shopeepay kirim bukti jelas mohon bantu segera,22,,"{'label': 'neutral', 'score': 0.9998947381973267}",neutral +transfer dana shopeepay tgl april status dana saldo masuk shopeepay mohon ditindaklanjuti segera,13,,"{'label': 'neutral', 'score': 0.9998931884765625}",neutral +halo kak skrng dana gimn aku punya masalah sama nih udah haru blm jelas bantu info,16,,"{'label': 'negative', 'score': 0.992324948310852}",negative +aku saranin kaka cek kala status pesan waktu jam depan kak kalau kendala tanya kait shopee kakak happy great day,20,,"{'label': 'neutral', 'score': 0.9997304081916809}",neutral +hai kak serenadeofskies maaf atas ketidaknyamananya kait kendala kamu alami kendala sebut sedang tangan tim kait kak,17,,"{'label': 'neutral', 'score': 0.9998898506164551}",neutral +kak rainssme maaf kait kendala kamu alami dpt aku bantu kece kendala kamu mohon hubung aku lalu yaa terima kasih,20,,"{'label': 'neutral', 'score': 0.9998944997787476}",neutral +kalo driver gada ambil senggak balikin duit otomatis lah kan ken sen tempat laen,14,,"{'label': 'negative', 'score': 0.9999018907546997}",negative +kak maaf mau tanya uang udh masuk blm yaa,9,,"{'label': 'neutral', 'score': 0.9998804330825806}",neutral +balikin duit gua woii gua mau mamm allah,8,,"{'label': 'negative', 'score': 0.9998307228088379}",negative +punya barusan banget balik alhamdulillah,5,,"{'label': 'positive', 'score': 0.9999184608459473}",positive +nang banget nunggu kaya percuma nunggu sampe kapan,8,,"{'label': 'negative', 'score': 0.9999103546142578}",negative +aku kak gimana biar saldo balik,6,,"{'label': 'neutral', 'score': 0.9986938834190369}",neutral +bjirrrr duit gua tahan shopeefood grgr order makan nyari driver ampe jam semuaaaaaa bjir refundddddddddd heh,16,,"{'label': 'negative', 'score': 0.956914484500885}",negative +mjb kak nyata banyak kayak gin yaa t t punya dibatalin pihak,12,,"{'label': 'negative', 'score': 0.9998757839202881}",negative +pesan shopeefood sedang batal order mulu duit gue balikin dong udah nunggu jam kagak mulu sekali cancel status sedang batal enggak kalau gak balikin duit guee,26,,"{'label': 'negative', 'score': 0.999897837638855}",negative +balikin duit gue bjirrrr udh lama dapet drivernya pas cancel duit tahan jir,13,,"{'label': 'negative', 'score': 0.9997889399528503}",negative +driver shopee food sihh udh nunggu menitt kaga dapet aku laparrrr kalau batalin saldo bakal balik cepet kaga,18,,"{'label': 'negative', 'score': 0.999784529209137}",negative +uang otomatis langsung balik min order batal gaada driver pickup tadi,11,,"{'label': 'neutral', 'score': 0.9980912804603577}",neutral +halo kak maaf kebales masuk replynya notif kemarin kasus transfer jadi batal jam,13,,"{'label': 'neutral', 'score': 0.5485833287239075}",neutral +malam kak mohon maaf atas ketidaknyamanannya tindaklanjuti mohon sedia info kode mesan lalu dgn ketik agent isi email amp tanya kak terima kasih sari,24,,"{'label': 'neutral', 'score': 0.9998975992202759}",neutral +males jalan cuma antri pake promo aja beti harga dine,10,,"{'label': 'negative', 'score': 0.9999116659164429}",negative +tau utang gede lek onlen wegah bunga,7,,"{'label': 'negative', 'score': 0.9341939091682434}",negative +ora pinjam mek tuku bulan wing bayare bulan saiki tau pinjam babe masio dikei kredit semunu tau digawe,18,,"{'label': 'negative', 'score': 0.9990133047103882}",negative +potong gak masuk sekarang,4,,"{'label': 'negative', 'score': 0.9998624324798584}",negative +alhamdulillah utang later bulan kemaren lunas,6,,"{'label': 'positive', 'score': 0.982276976108551}",positive +batalin subscription google play hasil,5,,"{'label': 'neutral', 'score': 0.999890923500061}",neutral +aku bantu cek kait kendala infoin detail kendala kakak social media terimakasih kak,13,,"{'label': 'neutral', 'score': 0.9998844861984253}",neutral +kak vvhintaeges maaf bikin nyaman kait kendala kakak alami selalu usaha beri layan baik guna shopee,16,,"{'label': 'positive', 'score': 0.9998695850372314}",positive +knp sekarang kalo bayar pakai shopeepay fitur sih jadi bikin lama satset,12,,"{'label': 'negative', 'score': 0.9998145699501038}",negative +gajelas udah cancel aja jauh jauhin deh dapet begini rugi,10,,"{'label': 'negative', 'score': 0.9999178647994995}",negative +damnn shopiii pipipi,3,,"{'label': 'positive', 'score': 0.9999268054962158}",positive +makan gaada selesai sama sekali kalau chat cancel aja lah,10,,"{'label': 'negative', 'score': 0.9998878240585327}",negative +anjrit marah bnget gua mah idih kagak jelas delivnya anjir apa kek gitu,13,,"{'label': 'negative', 'score': 0.9999152421951294}",negative +punya nyata hilang barusan udahlah,5,,"{'label': 'negative', 'score': 0.99986732006073}",negative +wkwkwk hilang,2,,"{'label': 'negative', 'score': 0.9998846054077148}",negative +lah lama anjir beneran nyampe gak,6,,"{'label': 'negative', 'score': 0.9999043941497803}",negative +satu komen ngaku shopee jangan ladenin skem soal,8,,"{'label': 'negative', 'score': 0.934360921382904}",negative +kemarin waktu beli gitu kak ken punya abis beneran kirim memang kirim shopee lamban banget gak paham kerja makin gak bagus,21,,"{'label': 'negative', 'score': 0.9999223947525024}",negative +bang gimane bang ngirim sekarang udah tanggal april bom nyampe kali follow hasil sama sekali malah paket retur mohon kerja bener kalo mau kena cancel jamaah,26,,"{'label': 'negative', 'score': 0.9999068975448608}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +tanggung jawab jangan nama doang care,6,,"{'label': 'negative', 'score': 0.9998737573623657}",negative +tanggung jawab gak min punya gue hilanh pakai voc,9,,"{'label': 'negative', 'score': 0.9998262524604797}",negative +shopeepay error top jam gak masuk masuk,7,,"{'label': 'negative', 'score': 0.9998449087142944}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +kak maaf udah buat risau soal kendala login shopee selalu beri layan baik semua guna aku bantu kakak infoin aku detail kak aku tunggu terima kasih,26,,"{'label': 'positive', 'score': 0.5581453442573547}",positive +hai kak galmonin maaf yaa kait kendala kamu alami jangan khawatir yaa biar aku bantu lanjut infoin username detail kendala aku lalu have nice day,25,,"{'label': 'neutral', 'score': 0.9977976083755493}",neutral +topup shopeepay lwat mbanking kok nda masuk saldo jam nda masuk tanya kata suruh nunggu terus gimana dong woy,19,,"{'label': 'negative', 'score': 0.9998869895935059}",negative +min aku abis kena tipu bayar shopeepay qris dana proses,10,,"{'label': 'negative', 'score': 0.9997023940086365}",negative +aku nemu komen ktnya spay plus cuma kali kak,9,,"{'label': 'neutral', 'score': 0.9998842477798462}",neutral +kasi min kakak nya heheee,5,,"{'label': 'neutral', 'score': 0.9996123909950256}",neutral +syarat penuh klaim shopeepay thr apa yaa,7,,"{'label': 'neutral', 'score': 0.9998691082000732}",neutral +kak iinii budi maaf udah buat khawatir kait kendala kakak kece lanjut info detail kendala username kendala aku tunggu,19,,"{'label': 'neutral', 'score': 0.9998486042022705}",neutral +kalo kendala kamu hubung aku lalu sosial media shopee kak kirim kendala nya stay safe,15,,"{'label': 'neutral', 'score': 0.9998656511306763}",neutral +kak maaf kait kendala aplikasi kamu aku infoin pastiin jaring internet kamu stabil aplikasi shopee kamu versi baru kamu clear cache lalu logout login coba kala dlm jam,28,,"{'label': 'neutral', 'score': 0.9975700974464417}",neutral +spay aku buka pas buka link thr siang,8,,"{'label': 'neutral', 'score': 0.9998786449432373}",neutral +shopeepayku error mulu plisss gabisa klik apa apaa tolongin dong,10,,"{'label': 'negative', 'score': 0.9999152421951294}",negative +min gimana solusi nya paket sya batal sistem sama pihak gara barang nya telat antar alamat,16,,"{'label': 'negative', 'score': 0.9999158382415771}",negative +orang terima sisa orang terima total orang,7,,"{'label': 'neutral', 'score': 0.9995976090431213}",neutral +kak baenilbee maaf buat khawatir aku balas satu per satu yaa mohon sedia utk tunggu aku balas segera,18,,"{'label': 'neutral', 'score': 0.9998476505279541}",neutral +kak itsjustlany maaf udah buat kecewa shopee selalu beri layan baik semua guna aku bantu kendala kakak infoin aku username halaman spaylater kamu tunggu kak sehat selalu,27,,"{'label': 'positive', 'score': 0.9981416463851929}",positive +mohon cek ditindaklanjuti,3,,"{'label': 'neutral', 'score': 0.999876856803894}",neutral +kak ventchive maaf udah buat kecewa shopee selalu beri layan baik semua guna aku bantu kece kendala kakak infoin aku detail transaksi kendala tunggu kak stay healthy,27,,"{'label': 'positive', 'score': 0.9968677163124084}",positive +mohon cek,2,,"{'label': 'neutral', 'score': 0.9998551607131958}",neutral +halo laku top wallet dana shopeepay jam lalu sedang proses status mohon segera ditindaklanjuti,14,,"{'label': 'neutral', 'score': 0.9998999834060669}",neutral +apabila kendala kakak mmberikn review lalu sehat selalu,8,,"{'label': 'neutral', 'score': 0.9997223019599915}",neutral +kak hendra balikin maaf kendala aku infoin kakak ikutin langkah ikut buat unlink vouchernya buka shopefood klik paket voucher pilih paket buka paket batal,24,,"{'label': 'neutral', 'score': 0.9993587136268616}",neutral +kak trash maaf udah buat kecewa shopee selalu beri layan baik semua guna aku bantu kece kendala kakak infoin aku detail transaksi kendala tunggu kak stay healthy,27,,"{'label': 'positive', 'score': 0.991811990737915}",positive +min mau tanya tiba potong shopee food padahal pesan apa,10,,"{'label': 'neutral', 'score': 0.9998841285705566}",neutral +mau klaim thr spay pas mencet layar putih doang padahal jaring bagus kentank,13,,"{'label': 'negative', 'score': 0.9872491955757141}",negative +hai smktxs cikoet maaf buat kamu gak nyaman kait kirim pesan aku saranin tunggu estimasi tiba lebih kece mohon informasi detail kendala via sosmed stay healthy,26,,"{'label': 'neutral', 'score': 0.9997909665107727}",neutral +mau nya apasih min kemarin skrg gabisa,7,,"{'label': 'negative', 'score': 0.9998757839202881}",negative +kak aku top mbca kali kok gak masuk yaa padahal mutasi udah potong bantu lumayan soal,16,,"{'label': 'negative', 'score': 0.9997593760490417}",negative +kata klaim sekali,3,,"{'label': 'negative', 'score': 0.9996143579483032}",negative +samaaa,1,,"{'label': 'positive', 'score': 0.9998452663421631}",positive +samaa ihh,2,,"{'label': 'negative', 'score': 0.9995095729827881}",negative +cuma sekali klaim,3,,"{'label': 'neutral', 'score': 0.9889512658119202}",neutral +aku gabisa klaim shopeepay thr gratis karna penuh syarat,9,,"{'label': 'neutral', 'score': 0.9996789693832397}",neutral +min sopipay aku udh potong pesan blm bayar,8,,"{'label': 'neutral', 'score': 0.9997997879981995}",neutral +sekarang cuma klaim shopeepay thr sekali doang,7,,"{'label': 'neutral', 'score': 0.99982088804245}",neutral +sekarang shoopepay thr cuma klaim sekali doang dah gaseru,9,,"{'label': 'negative', 'score': 0.9998311996459961}",negative +gue telat banget,3,,"{'label': 'negative', 'score': 0.9999209642410278}",negative +mau dong,2,,"{'label': 'positive', 'score': 0.9986559152603149}",positive +terima kasih atas info,4,,"{'label': 'neutral', 'score': 0.9922530055046082}",neutral +aku telat kayak wkwk,4,,"{'label': 'negative', 'score': 0.9998973608016968}",negative +aku mau ding kaa,4,,"{'label': 'positive', 'score': 0.8231887817382812}",positive +wow mauu dongg,3,,"{'label': 'negative', 'score': 0.9997678399085999}",negative +aku mau ini,3,,"{'label': 'positive', 'score': 0.9987820982933044}",positive +yah telat deh aku,4,,"{'label': 'negative', 'score': 0.9999182224273682}",negative +blm mohh,2,,"{'label': 'negative', 'score': 0.99472975730896}",negative +mau dong,2,,"{'label': 'positive', 'score': 0.9986559152603149}",positive +seru banget sih,3,,"{'label': 'positive', 'score': 0.999958872795105}",positive +yah tau gitu tadi gue coba,6,,"{'label': 'neutral', 'score': 0.9994729161262512}",neutral +chat aja kak aku dlu refund,6,,"{'label': 'neutral', 'score': 0.9998970031738281}",neutral +allah kemarin ngewar tiket kai access udahlah timeout jadwal gak sedia sekarang malah saldo sedot payment nya gagal plss lahhh walo dapet batagor bungkus solusi deh min,27,,"{'label': 'negative', 'score': 0.9951635599136353}",negative +yah sayang banget baru liat,5,,"{'label': 'positive', 'score': 0.7435663938522339}",positive +terima kasih atas info,4,,"{'label': 'neutral', 'score': 0.9922530055046082}",neutral +udah telat deh,3,,"{'label': 'negative', 'score': 0.9999152421951294}",negative +otw jadi balap thr,4,,"{'label': 'neutral', 'score': 0.9998459815979004}",neutral +wihh coba,2,,"{'label': 'positive', 'score': 0.9998899698257446}",positive +aku mau donggg thr nya,5,,"{'label': 'positive', 'score': 0.8325455188751221}",positive +waaa seger banget thrnyaa,4,,"{'label': 'positive', 'score': 0.9999572038650513}",positive +mau thr,2,,"{'label': 'negative', 'score': 0.9795241951942444}",negative +udah limit kali kaa aku mulung spay udah gabisa lagi,10,,"{'label': 'negative', 'score': 0.9998571872711182}",negative +iyaaaa woi,2,,"{'label': 'negative', 'score': 0.9998941421508789}",negative +sama,1,,"{'label': 'positive', 'score': 0.9995618462562561}",positive +wah sih kak,3,,"{'label': 'negative', 'score': 0.9988458156585693}",negative +wahh mau dong,3,,"{'label': 'positive', 'score': 0.9991193413734436}",positive +gabisa kak akuu,3,,"{'label': 'negative', 'score': 0.9997608065605164}",negative +yah aku spay,3,,"{'label': 'positive', 'score': 0.9996974468231201}",positive +aku mau bangttt,3,,"{'label': 'positive', 'score': 0.9999045133590698}",positive +wahh mau kak hehehe,4,,"{'label': 'positive', 'score': 0.9904088973999023}",positive +wihh kerenn sihh,3,,"{'label': 'positive', 'score': 0.9999473094940186}",positive +dapet gak yah,3,,"{'label': 'negative', 'score': 0.9888685941696167}",negative +aku mau min,3,,"{'label': 'positive', 'score': 0.9994822144508362}",positive +aku mau banget sihh,4,,"{'label': 'positive', 'score': 0.9998934268951416}",positive +wah mau dong,3,,"{'label': 'positive', 'score': 0.9964615702629089}",positive +iya benr bangett sih yaaa,5,,"{'label': 'negative', 'score': 0.9997746348381042}",negative +wah mau aku kakkk,4,,"{'label': 'positive', 'score': 0.9994910955429077}",positive +gue bagi sih,3,,"{'label': 'positive', 'score': 0.9421985149383545}",positive +aku telat,2,,"{'label': 'negative', 'score': 0.9999154806137085}",negative +iya bener banget sih,4,,"{'label': 'positive', 'score': 0.9999103546142578}",positive +nah seru banget sih,4,,"{'label': 'positive', 'score': 0.9999574422836304}",positive +wah lumayan bgt nihh,4,,"{'label': 'positive', 'score': 0.999896764755249}",positive +aku mau thr,3,,"{'label': 'neutral', 'score': 0.9995928406715393}",neutral +wahh telatt bgt aku,4,,"{'label': 'negative', 'score': 0.9999178647994995}",negative +duhh aku telat nih,4,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +udah keduluan aja nii min,5,,"{'label': 'negative', 'score': 0.999805748462677}",negative +wah mau dong,3,,"{'label': 'positive', 'score': 0.9964615702629089}",positive +bentar kak,2,,"{'label': 'neutral', 'score': 0.8599294424057007}",neutral +aku dapet sih kak,4,,"{'label': 'positive', 'score': 0.9997796416282654}",positive +wah nih,2,,"{'label': 'positive', 'score': 0.9943838119506836}",positive +woahhh mau coba dong,4,,"{'label': 'positive', 'score': 0.9691601991653442}",positive +sih aku kak,3,,"{'label': 'positive', 'score': 0.39313456416130066}",positive +yudah telat bgt aku,4,,"{'label': 'negative', 'score': 0.9999200105667114}",negative +yah sayang banget ush telatt,5,,"{'label': 'negative', 'score': 0.9997212290763855}",negative +wah mantap aku mau,4,,"{'label': 'positive', 'score': 0.9999566078186035}",positive +gak kak,2,,"{'label': 'negative', 'score': 0.9996923208236694}",negative +deh mah,2,,"{'label': 'positive', 'score': 0.9996659755706787}",positive +makasih kak,2,,"{'label': 'positive', 'score': 0.9999032020568848}",positive +otw buru thr wkwk,4,,"{'label': 'neutral', 'score': 0.9995973706245422}",neutral +aku mau banget,3,,"{'label': 'positive', 'score': 0.9999233484268188}",positive +nah bener tuh,3,,"{'label': 'positive', 'score': 0.9997513890266418}",positive +makasih banyak kak info,4,,"{'label': 'neutral', 'score': 0.998907208442688}",neutral +oke otw nih,3,,"{'label': 'neutral', 'score': 0.9998353719711304}",neutral +yahh kalah gercep aku mbak,5,,"{'label': 'negative', 'score': 0.999875545501709}",negative +aku mauuu thr,3,,"{'label': 'positive', 'score': 0.9996222257614136}",positive +cba checkout toko kak bagi toko,6,,"{'label': 'neutral', 'score': 0.9998877048492432}",neutral +kak aku kemarin claim apa kok dibatesin gitu,8,,"{'label': 'negative', 'score': 0.9995916485786438}",negative +gaiss yaa pdhl akun hubung shopepay udah akun hapus permanen akun mas begini,13,,"{'label': 'negative', 'score': 0.9997442364692688}",negative +hai kak triwpt maaf buat kakak ngga nyaman guna shopeepay laku isi saldo lalu virtual account beberapa bank kena biaya admin mulai potong langsung nominal total isi saldo sebut bijak,30,,"{'label': 'neutral', 'score': 0.9898667335510254}",neutral +dong kak,2,,"{'label': 'negative', 'score': 0.7632020115852356}",negative +donggg,1,,"{'label': 'negative', 'score': 0.9995075464248657}",negative +langsung otw gwwww,3,,"{'label': 'neutral', 'score': 0.9998347759246826}",neutral +tau bgt blm dpt thr,5,,"{'label': 'negative', 'score': 0.8262943625450134}",negative +dong buat,2,,"{'label': 'positive', 'score': 0.8200623393058777}",positive +tuju poll nih klu dapet thr shopeepay guys mumpung lebaran buru kuyy gaspoll cos limited loh,16,,"{'label': 'neutral', 'score': 0.9998890161514282}",neutral +gaisss mau thr yuk klaim sini,6,,"{'label': 'neutral', 'score': 0.9953095316886902}",neutral +wewww masama kakkk,3,,"{'label': 'negative', 'score': 0.9975427389144897}",negative +masama kakkk,2,,"{'label': 'negative', 'score': 0.9998049139976501}",negative +masama kakkkk,2,,"{'label': 'negative', 'score': 0.9997581839561462}",negative +yeyyyy masama kakk,3,,"{'label': 'negative', 'score': 0.9992191791534424}",negative +senang bangetttt aku barusan dapet nih kalian klik sih,9,,"{'label': 'positive', 'score': 0.9999351501464844}",positive +yuk mau thr thr buat kalian segera klaim habis,9,,"{'label': 'neutral', 'score': 0.999893307685852}",neutral +nih guys aku kasih tau shoppepay thr buat kamu nah klik aja buru jangan lewat,15,,"{'label': 'neutral', 'score': 0.9998939037322998}",neutral +mau banget thr gas,4,,"{'label': 'negative', 'score': 0.9992546439170837}",negative +guys yuk ikut klaim thr sini yaa,7,,"{'label': 'neutral', 'score': 0.9998979568481445}",neutral +ayo guys aku dapet thrnya nih kalian ayo ikut,9,,"{'label': 'neutral', 'score': 0.9998706579208374}",neutral +asoyy aku bagi thr shopee pay makasii mimin,8,,"{'label': 'positive', 'score': 0.999879002571106}",positive +alhamdulillah dpt shopeepay thr mksih,5,,"{'label': 'positive', 'score': 0.9998613595962524}",positive +udah abis apa shopeepay kurang,5,,"{'label': 'negative', 'score': 0.9998846054077148}",negative +terimakasih kak shoopepay thr nya aku terima asikkk lumayan buat isi pulsa,12,,"{'label': 'positive', 'score': 0.9999450445175171}",positive +alhamdulillah aku dapet lumayan nih trimakasih kak shopeepay thr nya,10,,"{'label': 'positive', 'score': 0.9984921216964722}",positive +mantappp min,2,,"{'label': 'positive', 'score': 0.999953031539917}",positive +alhamdulilah dapet shopeepay thr mkasih,5,,"{'label': 'positive', 'score': 0.9999237060546875}",positive +yess shopeepay thr udah darat akun langsung pikir mau checkout wishlist udah lama nganggur nih,15,,"{'label': 'negative', 'score': 0.7754747271537781}",negative +akuuu,1,,"{'label': 'positive', 'score': 0.9999521970748901}",positive +aku mauuu dong,3,,"{'label': 'positive', 'score': 0.999908447265625}",positive +lumayan saldo buat jajan receh thank you kak,8,,"{'label': 'neutral', 'score': 0.999711811542511}",neutral +yeyyy dapettt mayan buat beli cilok,6,,"{'label': 'positive', 'score': 0.9984514713287354}",positive +kakk tuh buat baru install jam tadi yaa,8,,"{'label': 'neutral', 'score': 0.9998452663421631}",neutral +kakk buat user baru donlot jam sore kaak,8,,"{'label': 'negative', 'score': 0.9990906715393066}",negative +yeyyy alhamdulillah,2,,"{'label': 'positive', 'score': 0.9999494552612305}",positive +alhamdulillah dapett lumayan,3,,"{'label': 'positive', 'score': 0.9999363422393799}",positive +yah gak asik gak,4,,"{'label': 'negative', 'score': 0.9999099969863892}",negative +yahh telat,2,,"{'label': 'negative', 'score': 0.9999157190322876}",negative +aku mau banyak,3,,"{'label': 'positive', 'score': 0.9988057613372803}",positive +okee otww mbak,3,,"{'label': 'positive', 'score': 0.9991255402565002}",positive +kakk aku liat cuma buat orang orang baru install yah,10,,"{'label': 'neutral', 'score': 0.9418875575065613}",neutral +mau donggg mayan buat lebarannnn,5,,"{'label': 'positive', 'score': 0.7182233333587646}",positive +aku mauuuu thr banyakkk,4,,"{'label': 'positive', 'score': 0.9982753992080688}",positive +iya jelas bgt anjir shopee kemaren,6,,"{'label': 'negative', 'score': 0.9996116757392883}",negative +otw balap thrrrrr,3,,"{'label': 'negative', 'score': 0.9975833892822266}",negative +mauuu otwwww,2,,"{'label': 'positive', 'score': 0.9884782433509827}",positive +download dulu buruuu,3,,"{'label': 'negative', 'score': 0.9998866319656372}",negative +wuiiiih akhirnyaaa tunggu tunggu,4,,"{'label': 'positive', 'score': 0.9998956918716431}",positive +knp,1,,"{'label': 'negative', 'score': 0.9998599290847778}",negative +wahh dapettt alhamdulillah,3,,"{'label': 'positive', 'score': 0.9999402761459351}",positive +kalo penuh syarat tuh,4,,"{'label': 'positive', 'score': 0.9984642267227173}",positive +gak,1,,"{'label': 'negative', 'score': 0.9998145699501038}",negative +kok gabisa klaim sih min,5,,"{'label': 'negative', 'score': 0.9998583793640137}",negative +kak gada,2,,"{'label': 'negative', 'score': 0.9998582601547241}",negative +mumpung bentar lebaran rame gasiiii thr aku mau nih pake shopeepay kejut nila total buat kalian semua mau langsung klik link aja yaaaa waktu batas,25,,"{'label': 'neutral', 'score': 0.9983041286468506}",neutral +siapa mau thr mumpung bentar lebaran aku mau kejut shopeepay thr gratis tinggal klik aja link guys total buat kamu pastiin kalian punya aplikasi shopeepay yaa hihi good luck waktu batas,31,,"{'label': 'positive', 'score': 0.9990636706352234}",positive +siapa mau thr gas merapattt aku mau saldo buat kalian untung klik link bawah yakk kejut shopeepay thr gratis total buat kamu pastiin kalian punya aplikasi shopeepay yah hihi buru klik waktu batas,33,,"{'label': 'positive', 'score': 0.999116837978363}",positive +knp,1,,"{'label': 'negative', 'score': 0.9998599290847778}",negative +udh menit lalu,3,,"{'label': 'neutral', 'score': 0.9818845391273499}",neutral +dapet thr aku dapet,4,,"{'label': 'positive', 'score': 0.9977256655693054}",positive +dah nyimpen duit spay,4,,"{'label': 'neutral', 'score': 0.9997860789299011}",neutral +sumpah gajelas bgt ajg udah kali tbtb dapet notif transaksi hasil sfood padahal gua ngapa mesen apa rebu dapet paan sfood,21,,"{'label': 'negative', 'score': 0.9999009370803833}",negative +udah hari nyoba shopeefood sedang cari driver mulu jam jam gadapet jelek bgt buset sistem perbaikin dah cpt,18,,"{'label': 'negative', 'score': 0.999920129776001}",negative +min kok punya gabisaa,4,,"{'label': 'negative', 'score': 0.9998923540115356}",negative +orang cepat,2,,"{'label': 'positive', 'score': 0.9999059438705444}",positive +klik url dapat thr gratis saldo total,7,,"{'label': 'neutral', 'score': 0.9998906850814819}",neutral +iyaa sumpah kok claim cuma kuota banyak bgt beneran budget shopee apa gmn,13,,"{'label': 'negative', 'score': 0.998065173625946}",negative +plis aku jugaaa kenapaa,4,,"{'label': 'negative', 'score': 0.9997987151145935}",negative +kok aku gabisa klaim shopeepay thr gratis karna penuh syarat mulu,11,,"{'label': 'negative', 'score': 0.9997424483299255}",negative +min kok klaim thr thr shopeepay teman,7,,"{'label': 'neutral', 'score': 0.9998893737792969}",neutral +ngga klinik link baru mau ngecek shopeepay dapet notif begituu,10,,"{'label': 'neutral', 'score': 0.9757028222084045}",neutral +min bingung,2,,"{'label': 'negative', 'score': 0.9999010562896729}",negative +makas thr nya,3,,"{'label': 'positive', 'score': 0.9738473296165466}",positive +coba pake link gais,4,,"{'label': 'neutral', 'score': 0.9996809959411621}",neutral +shopeepay dah error begini,4,,"{'label': 'negative', 'score': 0.9999138116836548}",negative +thr shopeepay kok cuma sih seru,6,,"{'label': 'positive', 'score': 0.9998834133148193}",positive +inituh cara ngatasin shopee pay thr kayak gin gabisa klaim gimana deh,12,,"{'label': 'negative', 'score': 0.9946203231811523}",negative +shaoqi abdullah laku mesan tiket kai dna bayar lewat shopee pay transaksi kai acess nya kok mohon bantu terima kasih,20,,"{'label': 'neutral', 'score': 0.9995275735855103}",neutral +selamat siap shopee pay shaoqi abdullah laku bayar tiket kai acess lalu shopee pey terapi transaksi kai acess nya kok,20,,"{'label': 'positive', 'score': 0.9997184872627258}",positive +kaga masuk gopay anjrit,4,,"{'label': 'negative', 'score': 0.9998965263366699}",negative +duit balik,2,,"{'label': 'negative', 'score': 0.9998579025268555}",negative +kak jawab temenku tbtb dapet transfer airpay,7,,"{'label': 'neutral', 'score': 0.9998868703842163}",neutral +kak tiap mau top spay tuh nomernya udah bener gabisa katany salah udah coba terus gagal,16,,"{'label': 'negative', 'score': 0.9998641014099121}",negative +iyeeee cuekkkkk,2,,"{'label': 'negative', 'score': 0.9999037981033325}",negative +kakkk sorry jbjb aku giniiii barusan banget nggehnya gak,9,,"{'label': 'negative', 'score': 0.999797523021698}",negative +reject kaak punya bkin lapor sana sini huhu follow terus,10,,"{'label': 'negative', 'score': 0.9998970031738281}",negative +bikin lapor sana sini kak huhuh,6,,"{'label': 'negative', 'score': 0.9998205304145813}",negative +udah jam transfer shopepay dana status sedang proses terus aneh bgt gimana tolongin,13,,"{'label': 'negative', 'score': 0.9999098777770996}",negative +cek bos,2,,"{'label': 'neutral', 'score': 0.9996204376220703}",neutral +kak laku transfer shopeepay rek bank sdh jam masuk,9,,"{'label': 'neutral', 'score': 0.9998972415924072}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +kak lafstchoice maaf udah bikin kaka resah kait kendala akun kaka sebut karena sistem deteksi ada janggal aktivitas akun kamu kece lanjut info detail kendala kendala kaka sosmed,28,,"{'label': 'neutral', 'score': 0.9997005462646484}",neutral +mitra saling untung,3,,"{'label': 'positive', 'score': 0.9999545812606812}",positive +kak tlg cek,3,,"{'label': 'neutral', 'score': 0.9998921155929565}",neutral +hae cek,2,,"{'label': 'negative', 'score': 0.9989620447158813}",negative +padahal off lama kaget betul tbtb saldo shopeepay lumayan buat nambahin service motor thanks banget,15,,"{'label': 'negative', 'score': 0.9971517324447632}",negative +woi jgn gin dong jgn enak nya kasih kerja orang bukan robot pikirin dong bensin driver sama cust nunggu pantes suka lama nunggu shopeefood instan kirain drivernya eror trnyt sistem benerin,31,,"{'label': 'negative', 'score': 0.9999111890792847}",negative +gmn lanjut apa udh masuk,5,,"{'label': 'neutral', 'score': 0.9813092350959778}",neutral +kalian benar terlalu,3,,"{'label': 'negative', 'score': 0.9999145269393921}",negative +hari gak bayar pake shopeepay sih muat fitur teruuuusss lanjur ngisi saldo dipake,13,,"{'label': 'positive', 'score': 0.9993346333503723}",positive +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +kak butuh jelas,3,,"{'label': 'neutral', 'score': 0.5926286578178406}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +gimana,1,,"{'label': 'negative', 'score': 0.996137797832489}",negative +temen gue hari hampir tipu sekarang telpon sih sama tipu,10,,"{'label': 'negative', 'score': 0.9999125003814697}",negative +kak vanvajar maaf udah buat kecewa shopee selalu beri layan baik semua guna aku bantu kece kendala kakak infoin aku username pesan tunggu kak sehat selalu,26,,"{'label': 'positive', 'score': 0.9982232451438904}",positive +gimana shopee bom kena batas udah kayak gin apa emang perlu bantu baik sistem nya paket tahan hari semarang kira apa hilang paket,23,,"{'label': 'negative', 'score': 0.9998873472213745}",negative +hai kak stroberikis maaf udah buat kamu ngga nyaman kendala kamu alami biar aku bantu kece kamu infoin detail kendala kamu social media kak moga kendala segera selesai yaa kak sehat selalu,32,,"{'label': 'neutral', 'score': 0.5834994316101074}",neutral +hai kak chocoyeppeo maaf bkin kakak gak nyaman trkait kendala kakak aku bantu infoin aku detail kendala kakak lalu sehat selalu,21,,"{'label': 'positive', 'score': 0.9992627501487732}",positive +request sih skinnya,3,,"{'label': 'neutral', 'score': 0.9984930753707886}",neutral +official,1,,"{'label': 'positive', 'score': 0.9998652935028076}",positive +gue gak transaksi apa saldo gue selalu potong buat bayar shopeefood dmn gue gak pernah order apa mikirlah gila bayar apa shopeefood dong begini,24,,"{'label': 'negative', 'score': 0.9998767375946045}",negative +aku bantu lanjut kait kndala infoinn username detail kndala via social media sehat selalu kak,15,,"{'label': 'neutral', 'score': 0.9884090423583984}",neutral +kak maaf atas kendala tdk mnggunakan metode bayar shopeepay aku saran saldo penuh biaya lain harga normal barang,18,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +kece lanjut infoin username nomor pesan lalu sehat slalu,9,,"{'label': 'positive', 'score': 0.9260926842689514}",positive +kak vanvajar mohon maaf kait pesan kamu mohon sedia tunggu lebih pesan kakak sesuai estimasi aplikasi kak,17,,"{'label': 'neutral', 'score': 0.9998999834060669}",neutral +bawa aja udah ribet anying,5,,"{'label': 'negative', 'score': 0.9999164342880249}",negative +shopee apa apa kayak gin paket hari semarang bner aja apa udah raib barang,14,,"{'label': 'negative', 'score': 0.9999067783355713}",negative +punya gabisa nih,3,,"{'label': 'negative', 'score': 0.9977208971977234}",negative +gak niat balik tampil min,5,,"{'label': 'negative', 'score': 0.999858021736145}",negative +apa apa shopeepay transfer hampir hari status proses terus,9,,"{'label': 'neutral', 'score': 0.9993124008178711}",neutral +lalu layan live chat aplikasi seabank karena perlu verifikasi data laku lalu sosial media moga kendala kamu segera selesai terima kasih,21,,"{'label': 'neutral', 'score': 0.9998916387557983}",neutral +hai sobat seabank mohon maaf atas ketidaknyamanannya kait kendala transaksi kamu alami minsea saran kamu hubung seabank lalu layan telepon,20,,"{'label': 'neutral', 'score': 0.999864935874939}",neutral +tadi gagal terus bayar pesan metode bayar guna seabank yaa jadi pesan aku status tunggu bayar sayang banget saldo seabank kalau gagal terus pas mau bayar pesanannyaa,27,,"{'label': 'negative', 'score': 0.9998065829277039}",negative +fyi seller banyak manipulasi berat sama ukur anjing tai jadi percuma nyantumin embel embel bakal ngebatasin berat,17,,"{'label': 'negative', 'score': 0.9999101161956787}",negative +perhatiin lah mitra jalan gimana susah bawa barang gimana terus tambahin jadi gila sih kata gua kira naek odong odong kali,21,,"{'label': 'negative', 'score': 0.9998906850814819}",negative +sinting bawa sameday max gabung aja ribetnya minta ampun terus sekarang tambah jadi max gila anjing bego,17,,"{'label': 'negative', 'score': 0.9999195337295532}",negative +asli deh maintenance jam jam sahur,6,,"{'label': 'positive', 'score': 0.9974830746650696}",positive +min buat saur ettdahhh gimana cerita kaga dipake,8,,"{'label': 'negative', 'score': 0.9969748258590698}",negative +gabisa buat beli saur kaga dipake dah,7,,"{'label': 'negative', 'score': 0.9993119239807129}",negative +error gabisa saur dah,4,,"{'label': 'negative', 'score': 0.9998841285705566}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +jelek bgt pls mau beli sahur,6,,"{'label': 'negative', 'score': 0.999923825263977}",negative +gak bayar kak,3,,"{'label': 'negative', 'score': 0.9998726844787598}",negative +min ganggu apa sii,4,,"{'label': 'negative', 'score': 0.9999041557312012}",negative +iya,1,,"{'label': 'positive', 'score': 0.9996904134750366}",positive +bca ganggu apa gmn kok isi saldo shopee bca mobile kata kode usaha tak daftar apa shopee ganggu,18,,"{'label': 'negative', 'score': 0.9998937845230103}",negative +halooo urgent dong masa isi shopeepay kali mana potong otomatis rupiah tiap ngisi jangan pelit lah,16,,"{'label': 'negative', 'score': 0.9732730984687805}",negative +kak maaf buat kendala kait saldo shopeepay kamu biar aku bantu infoin detail kendala kamu yaa terimakasih,17,,"{'label': 'neutral', 'score': 0.9998934268951416}",neutral +saldo shopeepay selalu potong shopeefood padahal udh lama gaada transaksi shopeefood,11,,"{'label': 'neutral', 'score': 0.999619722366333}",neutral +kak jendeouki maaf udah buat kaka ganyaman kait kendala alami aku bantu lanjut kena kendala transaksi shopeepay kamu yuk infoin bukti transaksi username tunggu,24,,"{'label': 'neutral', 'score': 0.9997956156730652}",neutral +capee banget nungguin top udah hari buseet bolak balik kirim data skrg ribet abis suruh nglampirin surat resmi pihak bank kalo udah hasil lepas dana buat top gmnaa sihh sbenernya uang kmana udah hasil top bilang dana masuk,38,,"{'label': 'negative', 'score': 0.9999083280563354}",negative +donk gerak cepat udh bales udh hari nyoba masuk akun gua minta kode otp siang teror telpon atas namakn pihak shopee gimn donk kok bocor sih data diri gua aneh,30,,"{'label': 'negative', 'score': 0.9999151229858398}",negative +belum aku balas aku terima kasih,6,,"{'label': 'positive', 'score': 0.9759875535964966}",positive +cek ready keset diatomite kotak anti slip keset kamar mandi keset lantai serap air motif bunga keset kaki kamar mandi anti slip bau serap air harga dapat shopee sekarang,29,,"{'label': 'neutral', 'score': 0.9997351765632629}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +min aku mau topup spay juta via brimo gagal terus aku angsur juta ribu baru ribu akhir gabisa min,19,,"{'label': 'neutral', 'score': 0.9977618455886841}",neutral +hai kak maaf atas ketidaknyamanannya kait kendala pesan kakak alami bantu cek kakak infoin username pesan social media stay safe,20,,"{'label': 'neutral', 'score': 0.9998711347579956}",neutral +mantap sih kak,3,,"{'label': 'positive', 'score': 0.9999576807022095}",positive +tracking masuk lokasi transit akhir malah updatenya kurir tugas seya jemput kantor malah bsa alas masuk jadwal antar besok butuh cepat kok malah tolak,24,,"{'label': 'negative', 'score': 0.9999165534973145}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +kak togyame maaf buat kmu gak nyaman kait kendala kamu aku bantu infoin aku username akun shopee nomor pesan kamu melaui resmi yaa stay safe,25,,"{'label': 'neutral', 'score': 0.999847412109375}",neutral +kak cookie maaf buat kmu gak nyaman kait kendala kamu aku bantu infoin aku username nomor pesan kamu lalu resmi yaa stay safe,23,,"{'label': 'neutral', 'score': 0.9998064637184143}",neutral +video lucu bikin ngakakk,4,,"{'label': 'positive', 'score': 0.9999362230300903}",positive +shopee error print woi,4,,"{'label': 'negative', 'score': 0.9999194145202637}",negative +coba lihat produk,3,,"{'label': 'neutral', 'score': 0.9997127652168274}",neutral +haloo min semalem selasa pukul pending sampe pagi masuk min gimanaa yaaa,12,,"{'label': 'neutral', 'score': 0.9985804557800293}",neutral +sepill aja vangkeee,3,,"{'label': 'negative', 'score': 0.9999045133590698}",negative +iyaaa aku jugaaa knp yaaa isi kuota adek gagal,9,,"{'label': 'negative', 'score': 0.9998493194580078}",negative +nomer hati hati,3,,"{'label': 'positive', 'score': 0.9997653365135193}",positive +kan walletnya dana gmn,4,,"{'label': 'negative', 'score': 0.9996970891952515}",negative +banyak transaksi gagal bima padahal bayar pake shopeepay hasil saldo gak langsung balik malah gak balik duit,17,,"{'label': 'negative', 'score': 0.9998581409454346}",negative +iih baru taau,3,,"{'label': 'negative', 'score': 0.9998145699501038}",negative +hai kakk squismhy maaf udh buat risau kait kendala pesan kakak aku bantu cek aku saranin kakak infoin nomor pesan username kakak social media sehat selalu,26,,"{'label': 'neutral', 'score': 0.997901439666748}",neutral +hai kak rappunzellav maaf udah buat kakak khawatir kena pesan terima aku bantu infoin username nomor pesan lalu social media terimakasih aku tunggu,23,,"{'label': 'neutral', 'score': 0.9998377561569214}",neutral +stop masalah plis,3,,"{'label': 'negative', 'score': 0.9999022483825684}",negative +buka shopeepay shopee dri kemarin begini terus sama,8,,"{'label': 'neutral', 'score': 0.9998910427093506}",neutral +kak zoxar maaf udah buat resah kait shopeepay alami shopee selalu beri layan baik semua guna aku bantu kece kendala kakak infoin aku terima kasih,25,,"{'label': 'positive', 'score': 0.9992932081222534}",positive +kak fortunec kiez maaf udah buat kakak resah kait kendala pesan kakak biar aku bantu infoin username nomor pesan kak aku tunggu,22,,"{'label': 'neutral', 'score': 0.9994920492172241}",neutral +semangat kak kerja jangan nipu bulan puasa,7,,"{'label': 'negative', 'score': 0.9156978130340576}",negative +gimana nih sen paket tgl sampe ket nya antar kurir aja sampe rumah loh malah kembali engken mksd,18,,"{'label': 'negative', 'score': 0.9983847141265869}",negative +gimana nih sen paket tgl sampe ket nya antar kurir aja sampe rumah loh malah kembali engken mksd,18,,"{'label': 'negative', 'score': 0.9983847141265869}",negative +spx nya gimana yaaa udah hari kirim terus malah balik,10,,"{'label': 'negative', 'score': 0.9998968839645386}",negative +hai sobat seabank belum mohon maaf minsea info satu akun seabank hubung satu akun shopee cara hubung akun seabank akun shopee sila ikut langkah langkah sesuai link ikut,28,,"{'label': 'neutral', 'score': 0.9998928308486938}",neutral +iya kak bca kamu aku udh dri jam malem kmrn sampe skrg nyangkut,13,,"{'label': 'neutral', 'score': 0.9998656511306763}",neutral +sih semua paket tuh sunter dulu gak langsung rumahhh huee butuh banget help using spx standard,16,,"{'label': 'neutral', 'score': 0.5120629072189331}",neutral +koin gue ribu hilang usai gagal membeyar biaya gara app akun shopee dua kesal banget hobi sulit semua shopeer balik koin shopee gue,23,,"{'label': 'negative', 'score': 0.9999212026596069}",negative +amp,1,,"{'label': 'negative', 'score': 0.9955986738204956}",negative +lama banget soal jam,4,,"{'label': 'negative', 'score': 0.9999182224273682}",negative +aku tadi hub kata sistem error suruh nuggu sampe besok,10,,"{'label': 'negative', 'score': 0.9998666048049927}",negative +bener,1,,"{'label': 'positive', 'score': 0.9999542236328125}",positive +aku udah jam wkwk,4,,"{'label': 'neutral', 'score': 0.9764004945755005}",neutral +kamu nyangkut aku udah jam tulis masig proses,8,,"{'label': 'negative', 'score': 0.9998550415039062}",negative +aku udh nanya kata eror dri bank nya,8,,"{'label': 'negative', 'score': 0.9999064207077026}",negative +gimana narik uang udah jam mas masuk,7,,"{'label': 'negative', 'score': 0.9993311166763306}",negative +aku sampe sekarang mas blm masuk,6,,"{'label': 'neutral', 'score': 0.8261975049972534}",neutral +hai kak dianaaggr maaf buat tunggu aku segera luncur kakak kak mohon sedia tunggu selamat aktivitas kak,17,,"{'label': 'neutral', 'score': 0.9998929500579834}",neutral +aku sama kak kakak udah masuk,6,,"{'label': 'neutral', 'score': 0.9998860359191895}",neutral +kemarin alami buruk kecewa pihak jasa kirim shopee shopee express,10,,"{'label': 'negative', 'score': 0.9999158382415771}",negative +paket gue nasib gmn kak,5,,"{'label': 'negative', 'score': 0.9996298551559448}",negative +aku top shopeepay kok masuk yaaa min lewat mbanking mandiri huhu minnn thank you,14,,"{'label': 'neutral', 'score': 0.9918679594993591}",neutral +mjb kak jadi udh masik saldo,6,,"{'label': 'neutral', 'score': 0.9997846484184265}",neutral +mjb kak jadi masuk saldo,5,,"{'label': 'neutral', 'score': 0.9998865127563477}",neutral +hai kak maaf buat kendala mimin proses mohon infoin detail kendala lalu jaga selalu rahasia data pribadi kakak waspada info kontak mengatasnamakan bni website umum akun resmi twitter bni centang emas verified,32,,"{'label': 'neutral', 'score': 0.9998630285263062}",neutral +hai kak maaf buat kendala mimin proses mohon infoin detail kendala lalu jaga selalu rahasia data pribadi kakak waspada info kontak mengatasnamakan bni website umum akun resmi twitter bni centang emas,31,,"{'label': 'neutral', 'score': 0.9998581409454346}",neutral +isi saldo shopee pay lewat bni masuk saldo uang rekening kurang mohon bantu,13,,"{'label': 'neutral', 'score': 0.9998654127120972}",neutral +iya barusan top gamasuk pake bni mobile padahal nya udah bener nama shopeenya,13,,"{'label': 'neutral', 'score': 0.9995144605636597}",neutral +malam kak tadi isi saldo shopeepay via bni mobile banking masuk shopeepaynya padahal bukti transaksi hasil solusi bagaimana,18,,"{'label': 'neutral', 'score': 0.9994045495986938}",neutral +halo min barusan top shopeepay bni mobile gak masuk pdhl saldo udh kurang mutasi gmn,15,,"{'label': 'neutral', 'score': 0.9993113279342651}",neutral +kamu mau kasih nilai apa shopee duit gue blm balik udh hari malah minta nilai bisa kendala shopeepay error gagal kali saldo gue sedot balikin duit aku,27,,"{'label': 'negative', 'score': 0.9999041557312012}",negative +isok gak shopeepay top gak pake kode otp malesi,9,,"{'label': 'negative', 'score': 0.9990948438644409}",negative +rugi sekali judi online,4,,"{'label': 'negative', 'score': 0.9999221563339233}",negative +siap kak,2,,"{'label': 'positive', 'score': 0.9999549388885498}",positive +fitur favorit qris gak perlu bawa uang cash transaksi jadi efektif efisien meminimalisir jadi tipu sekarang jaman cashless ikut yuk,20,,"{'label': 'positive', 'score': 0.9999246597290039}",positive +responnya lama banget astagaaa,4,,"{'label': 'negative', 'score': 0.9999173879623413}",negative +fitur shopeepay favorit beli pulsa amp,6,,"{'label': 'neutral', 'score': 0.9998421669006348}",neutral +wow selamat,2,,"{'label': 'positive', 'score': 0.9999459981918335}",positive +samoe kapan dana gua tahan,5,,"{'label': 'negative', 'score': 0.47867080569267273}",negative +kak maaf udah buat kaka nyaman kait kendala kembali dana aku bntu cek lanjut kamu info username nomor pesan lalu aku terimakasih hubung shopee sehat selalu,26,,"{'label': 'positive', 'score': 0.9994292855262756}",positive +semenjak download shopeepay saldo suka ambil sendiri riwayat tulis bayar shopefood padahal gaada transaksi shopeefood sama sekali hari sama gimana min mohon jelas,23,,"{'label': 'neutral', 'score': 0.6817435026168823}",neutral +fitur favorit qris gak perlu bawa uang cash transaksi jadi efektif efisien meminimalisir jadi tipu sekarang jaman cashless ikut yuk,20,,"{'label': 'positive', 'score': 0.9999246597290039}",positive +fitur shopeepay aku suka qris pakai banyak tempat warung kecil kafe hits tinggal scan gak perlu uang tunai proses cepet banget cocok buat suka simple gak mau ribet,28,,"{'label': 'positive', 'score': 0.9999465942382812}",positive +fitur favorit qris gak perlu bawa uang cash transaksi jadi efektif efisien meminimalisir jadi tipu sekarang jaman cashless ikut yuk,20,,"{'label': 'positive', 'score': 0.9999246597290039}",positive +nama org tsb pas cek get kontak barangkali kenal,9,,"{'label': 'neutral', 'score': 0.9998829364776611}",neutral +sdh upaya segala cara bntuan shopee smpe buat lapor kali kali ttep gda solusi,14,,"{'label': 'neutral', 'score': 0.996711015701294}",neutral +oalahhh gitu bijak baru nya soal kalo top bank shopee pay punya kena admin trs masuk shopeenya kena potong hikssss btw trimssss ingfonya yachhhh,24,,"{'label': 'positive', 'score': 0.9915059208869934}",positive +gratis bulan gretong,3,,"{'label': 'positive', 'score': 0.99905925989151}",positive +aku udahhh,2,,"{'label': 'positive', 'score': 0.9998985528945923}",positive +gua beli barang gagal saldo tarik anjirrr lah,8,,"{'label': 'negative', 'score': 0.9999080896377563}",negative +kok top shopeepay sekarang potong sih anjir harus malah jadi buset kata mulai nov gratis biaya admin isi saldo min padahal aku ngisi wehhhh,24,,"{'label': 'negative', 'score': 0.9999091625213623}",negative +mungkin banget tangerang kota loh masa order shopeefood dibatalin terus gara dapet driver masalah sama shopeefood,16,,"{'label': 'negative', 'score': 0.9998840093612671}",negative +kak aku paham apa kamu alami kait topup shopeepay kamu aku bantu cek infoin detail kendala kamu lampir bukti screenshot hasil topup kamu kak sehat selalu kak,27,,"{'label': 'positive', 'score': 0.9997817873954773}",positive +kak aku paham nih apa kamu alami kait pesan aku bantu cek infoin username nomor pesan kamu kak terimakasih sehat selalu kak,22,,"{'label': 'positive', 'score': 0.9974710941314697}",positive +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +fitur scan qris karna semua bayar jadi mudah mana amp,10,,"{'label': 'positive', 'score': 0.9911164045333862}",positive +kak aku paham nih apa kamu alami kait biaya admin topup shopeepay kamu aku bantu cek infoin detail kendala kamu serta screenshot tunjuk kendala nya terimakasih sehat selalu kak,29,,"{'label': 'positive', 'score': 0.9985523819923401}",positive +min knp top kok potong admin kata kalo atas potong admin,11,,"{'label': 'negative', 'score': 0.9998514652252197}",negative +btw kmrn estimasi tgl ubah enak ubah jadi,8,,"{'label': 'neutral', 'score': 0.9990658164024353}",neutral +knp ege,2,,"{'label': 'negative', 'score': 0.9973968267440796}",negative +udah sama biaya tangan ongkir min tetap gabisa digunain,9,,"{'label': 'negative', 'score': 0.9994003772735596}",negative +qris bayar simpel cepat,4,,"{'label': 'positive', 'score': 0.9999246597290039}",positive +udah masuk kakk aku suruh nunggu jam kemarin sekarang barusan dilaporin malah baru mau urus,15,,"{'label': 'negative', 'score': 0.9996929168701172}",negative +shopeepay apa bgt lah masa iya saldo mau dihabisin buat beli barang harga gabisaaaa mau tuhhh apaaa kocakkkk,18,,"{'label': 'negative', 'score': 0.9996908903121948}",negative +kak maaf udah buat khawatir kait tdk driver kece lanjut info detail kendala username pesan tunggu,16,,"{'label': 'negative', 'score': 0.9746202230453491}",negative +hai kak aku segera luncur mohon tunggu terimakasih,8,,"{'label': 'neutral', 'score': 0.9998592138290405}",neutral +udah aku min coba cek,5,,"{'label': 'neutral', 'score': 0.9998912811279297}",neutral +hai kaka maaf uda buat nyaman trkait kendala top shopeepay masuk kamu alami aku bantu kece lanjut mohon hubung beri screenshot kendala lalu social media aku tunggu,27,,"{'label': 'neutral', 'score': 0.9998810291290283}",neutral +hai kak udh bkin nyman kait kendala alami per tanggal juni shopee tambah biaya tangan proses checkout pastiin saldo ckup lebih subtotal jmlah produk ongkir biaya layan amp,28,,"{'label': 'neutral', 'score': 0.9956299066543579}",neutral +hai kak mohon maaf atas ketidaknyamanan nya kait kendala kakak alami aku bantu infoin username screenshot bukti sebut kak stay safe,21,,"{'label': 'neutral', 'score': 0.9998817443847656}",neutral +anjir topup sopipayku uda hasil status gamasuk saldo gmn,9,,"{'label': 'negative', 'score': 0.9997637867927551}",negative +sebel deh spay gabisa digunain padahal total bayar barang saldo gabisa woyy gimana nih,14,,"{'label': 'negative', 'score': 0.9999113082885742}",negative +stop rugi,2,,"{'label': 'positive', 'score': 0.9842049479484558}",positive +stop judol percaya main judi online bakal kaya bandar,9,,"{'label': 'negative', 'score': 0.9997772574424744}",negative +klo pas mau bayar pake shoppepay resto masuk saldo udh potong gimana,12,,"{'label': 'negative', 'score': 0.7606009244918823}",negative +min mksdnya,2,,"{'label': 'positive', 'score': 0.9997983574867249}",positive +banyak kali promonya,3,,"{'label': 'positive', 'score': 0.9987145662307739}",positive +hai kak mohon maaf atas ketidaknyamanan nya kait kendala topup blm terima sedang kendala sistem shopee sedang baik tim kait mhon mnunggu jam sjak kendala kak lbh estimasi msi blm terima hubung kmbali klo,34,,"{'label': 'neutral', 'score': 0.9994660019874573}",neutral +hai kak maaf bikin nyaman kait kendala shopeepay kamu alami aku bantu cek infoin detail kendala kamu social media sehat selalu,21,,"{'label': 'positive', 'score': 0.85416179895401}",positive +hati kalo barusan jam hampir tipu suruh login gopay akhir mau mindahin ngakunya shopee,14,,"{'label': 'negative', 'score': 0.9997162222862244}",negative +sama kak case dana sumber udah konfirmasi app shopeenya kak konfirmasi nya gimana,13,,"{'label': 'neutral', 'score': 0.9996997117996216}",neutral +aku tadi aman kak topup shopeepay bcabluu,7,,"{'label': 'neutral', 'score': 0.9993870258331299}",neutral +aku hari flip sama seabank aman kak ngga cust complain pending kayanyaa,12,,"{'label': 'neutral', 'score': 0.9994449019432068}",neutral +gimana sih top shopeepay blm masuk siang,7,,"{'label': 'negative', 'score': 0.9990436434745789}",negative +tadi aku liat error kak transaksi nya udah tadi bgtt sih,11,,"{'label': 'negative', 'score': 0.9998995065689087}",negative +konfirmasi kak punya transaksi gagal dana otomatis balik sumber konfirmasi manual aneh kan,13,,"{'label': 'negative', 'score': 0.999908447265625}",negative +kak maaf udah bikin risau kait kendala pesan terima kece lampir username lalu kak selamat malam,16,,"{'label': 'neutral', 'score': 0.9954734444618225}",neutral +info transaksi gagal masuk shopeepay dana gantung konfirmasi manual utk kembali dana cara macam apa kalo gak konfirmasi brarti ilang dana aneh,22,,"{'label': 'negative', 'score': 0.9999041557312012}",negative +oalahh error kak moga cepatt masuk saldo deg degan bgt aku soal uang orangg,14,,"{'label': 'negative', 'score': 0.9999005794525146}",negative +tengs infoo kak rey,4,,"{'label': 'negative', 'score': 0.9998681545257568}",negative +okee thank you info kakaa,5,,"{'label': 'neutral', 'score': 0.9998458623886108}",neutral +blommm,1,,"{'label': 'negative', 'score': 0.781719446182251}",negative +paling favorit fitur transfer krn jadi mudah transfer nya bebas biaya admin siapa tau rezeki kan,16,,"{'label': 'positive', 'score': 0.9999030828475952}",positive +paling sering pakai fitur transfer bebas biaya admin mudah hayu ikut kuis moga aja menang,15,,"{'label': 'neutral', 'score': 0.718742311000824}",neutral +suka pakai fitur transfer gratis biaya admin jadi mudah klo transfer yuk ikut kuis,14,,"{'label': 'positive', 'score': 0.9998266100883484}",positive +aku masuk kak set siang,5,,"{'label': 'neutral', 'score': 0.9998899698257446}",neutral +top shopeepay gua blm masuk min saldo potong mohon solusi,10,,"{'label': 'neutral', 'score': 0.9998341798782349}",neutral +kak aku siang topup bank pake spay masuk masuk sampe sekarang nih saldo udah potong bakal balik tuh duit awas aja kalau tahan terus ilang gitu aja,27,,"{'label': 'negative', 'score': 0.9998946189880371}",negative +min tarik dana shopeepay rekening kok blm masuk jam siang tadi,11,,"{'label': 'neutral', 'score': 0.9998767375946045}",neutral +siapa tau jadi menang kan,5,,"{'label': 'positive', 'score': 0.9998713731765747}",positive +ken menang min,3,,"{'label': 'positive', 'score': 0.9163979887962341}",positive +bismillah moga menang,3,,"{'label': 'positive', 'score': 0.9998239874839783}",positive +menang yuk min,3,,"{'label': 'neutral', 'score': 0.9836507439613342}",neutral +kalau jajan sering gunain fitur shopeepay qris krn cepet mudah aman yuk ikut nya,14,,"{'label': 'positive', 'score': 0.9985582232475281}",positive +dri jam kali transaksi sopipay kakk nya hasil emg tahap blm hasil,12,,"{'label': 'neutral', 'score': 0.9998574256896973}",neutral +tadi jam suruh ngecek bener aja malah lambat,8,,"{'label': 'negative', 'score': 0.9999122619628906}",negative +hari kerja hari kerja kira orang butuh duit nyangkut apa,10,,"{'label': 'negative', 'score': 0.9970515966415405}",negative +siapa tau menang,3,,"{'label': 'positive', 'score': 0.9999104738235474}",positive +menang min sekali kali,4,,"{'label': 'neutral', 'score': 0.9992722868919373}",neutral +mudah aja menang kan min,5,,"{'label': 'positive', 'score': 0.9997933506965637}",positive +ayo ikut siapa tau untung menang,6,,"{'label': 'positive', 'score': 0.9997895359992981}",positive +jangan lewat ikut giveaway seru,5,,"{'label': 'negative', 'score': 0.9959006905555725}",negative +fitur bayar shopeepaylater minim bunga fitur sat set banget kalau perlu cepat transaksi coba aja siapa tau untung,18,,"{'label': 'positive', 'score': 0.9991275668144226}",positive +takut mau pake shopeepay,4,,"{'label': 'negative', 'score': 0.9998693466186523}",negative +masuk topup jam,3,,"{'label': 'neutral', 'score': 0.9876296520233154}",neutral +udah kaa,2,,"{'label': 'positive', 'score': 0.9914063215255737}",positive +polow amp,2,,"{'label': 'negative', 'score': 0.9988546371459961}",negative +moga salah satu menang oke min,6,,"{'label': 'neutral', 'score': 0.8542850613594055}",neutral +yuk yuk menang min,4,,"{'label': 'neutral', 'score': 0.9998013377189636}",neutral +siapa tau rezeki aamin,4,,"{'label': 'positive', 'score': 0.9967766404151917}",positive +ken menang min,3,,"{'label': 'positive', 'score': 0.9163979887962341}",positive +suka fitur isi pulsa bayar tagih laku bagai bayar tagih isi token listrik bayar internet hayuk ikut giveawaynya,18,,"{'label': 'neutral', 'score': 0.81354159116745}",neutral +hai kak maaf buat kakak resah kait top shopeepay aku infoin sdg dapat kembang sistem mohon utk tunggu cek kala jam depan sejak transaksi nanti update hubung sehat selalu kak,30,,"{'label': 'positive', 'score': 0.9987322688102722}",positive +hai kak maaf bkin kakak gak nyaman trkait kendala kakak aku bantu infoin aku detail kendala dana kendala kakak lalu sehat selalu,22,,"{'label': 'positive', 'score': 0.9968075752258301}",positive +suka pakai fitur isi pulsa bayar tagih buat beliin pulsa keluarga bayar internet isi token listrik moga rezeki,18,,"{'label': 'positive', 'score': 0.9995542168617249}",positive +hai kak maaf buat kakak resah kait transfer shopeepay aku infoin sdg dapat kembang sistem mohon utk tunggu cek kala jam depan sejak transaksi nanti update hubung sehat selalu kak,30,,"{'label': 'positive', 'score': 0.9987335801124573}",positive +kendala lebih estimasi sebut kamu lampir username amp,8,,"{'label': 'neutral', 'score': 0.9998283386230469}",neutral +harus pas topup tuh cegah biar tau kalo maintanence kasi udah topup banyak malah masuk suruh nunggu pilkada kocak emg,20,,"{'label': 'negative', 'score': 0.9998881816864014}",negative +hai kak maaf kait kendala top shopeepay aku infoin sedang kembang sistem mohon tunggu kak lama jam depan cek kala kendala aku terimakasih sehat selalu kak,26,,"{'label': 'positive', 'score': 0.9992951154708862}",positive +duh ribet kak tau gin aku biarin aja seabank saldo,10,,"{'label': 'negative', 'score': 0.9998700618743896}",negative +bener kak,2,,"{'label': 'positive', 'score': 0.9999431371688843}",positive +ikut sip min,3,,"{'label': 'positive', 'score': 0.9999328851699829}",positive +bismillah jadi salah satu menang nya min,7,,"{'label': 'positive', 'score': 0.9011086821556091}",positive +okeii min aku hubungin lewat app shopee moga cepet proses min soal uang customer,14,,"{'label': 'neutral', 'score': 0.9995309114456177}",neutral +kak kabarin dong aku sampe skrng bom masuk,8,,"{'label': 'negative', 'score': 0.9995971322059631}",negative +aku mikir gin kak takut suruh jam tuh hari kerja pusing mana topup gede,14,,"{'label': 'negative', 'score': 0.9998449087142944}",negative +fitur suka fitur shopeepay qris buat laku bayar hari mudah cepat aman moga aja rezeki,15,,"{'label': 'positive', 'score': 0.999869704246521}",positive +sering pakai fitur shopeepay qris mudah cepat aman perlu bawa banyak uang cash yuk ikut ganya,16,,"{'label': 'positive', 'score': 0.9993129968643188}",positive +hai kak maaf yaa udh buat nyaman kait kendala alami aku bantu cek infoin detail kendala kendala kakak lalu yaa sehat selalu,22,,"{'label': 'positive', 'score': 0.9878427982330322}",positive +kak maaf kak udah buat kmu nyaman kait kendala transfer shopeepay kmu alami aku dpt bantu cek lanjut mohon infoin detail kendala kmu lalu social media resmi shopee yaa kak stay safe,32,,"{'label': 'neutral', 'score': 0.9998700618743896}",neutral +kak maaf udah bikin khawatir mhn dian utk tunggu jam sejak laku top kalo udah lwt estimasi dana blm masuk silah hubung aku lalu stay safe,26,,"{'label': 'neutral', 'score': 0.9992591738700867}",neutral +hai kak maaf udah buat kakak gak nyaman keluh kakak mimin laku kece mohon infoin detail transaksi lalu kak jaga selalu rahasia data pribadi kakak waspada info kontak mengatasnamakan bni website umum akun,33,,"{'label': 'neutral', 'score': 0.9918161034584045}",neutral +kendala lebih estimasi sebut kamu lampir username amp,8,,"{'label': 'neutral', 'score': 0.9998283386230469}",neutral +kak maaf kait kendala transfer shopeepay blm terima rekening bank aku infoin sedang jadi kendala sistem shopee aku saran tunggu amp,21,,"{'label': 'neutral', 'score': 0.9998175501823425}",neutral +hai kak maaf udah buat kakak gak nyaman keluh kakak mimin laku kece mohon infoin detail transaksi lalu kak jaga selalu rahasia data pribadi kakak waspada info kontak mengatasnamakan bni website umum akun,33,,"{'label': 'neutral', 'score': 0.9918161034584045}",neutral +kak maaf kak udah buat kmu nyaman kait kendala top shopeepay kmu alami aku dpt bantu cek lanjut mohon infoin detail kendala kmu lalu social media resmi shopee yaa kak stay safe,32,,"{'label': 'neutral', 'score': 0.9998703002929688}",neutral +hai kak maaf bkin kakak gak nyaman trkait kendala kakak aku bantu infoin aku detail kendala dana kendala kakak lalu sehat selalu,22,,"{'label': 'positive', 'score': 0.9968075752258301}",positive +kak maaf kak udah buat kmu nyaman kait kendala shopeepay kmu alami aku dpt bantu cek lanjut mohon infoin detail kendala kmu lalu social media resmi shopee yaa kak stay safe,31,,"{'label': 'neutral', 'score': 0.9998695850372314}",neutral +hai kak maaf bkin kakak gak nyaman trkait kendala kakak aku bantu infoin aku detail kendala dana kendala kakak lalu sehat selalu,22,,"{'label': 'positive', 'score': 0.9968075752258301}",positive +aku kakkk,2,,"{'label': 'positive', 'score': 0.9999428987503052}",positive +hai kak maaf buat resah kait top shopeepay aku infoin sedang dapat kembang sistem mohon tunggu cek kala jam depan sejak laku transaksi udh jam kendala aku yaa kakk sehat selalu,31,,"{'label': 'positive', 'score': 0.9994463324546814}",positive +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +udah masuk blom aku blom njir jam,7,,"{'label': 'negative', 'score': 0.9994770884513855}",negative +hai kak maaf kait kendala bayar shopeepay aku infoin sedang kembang sistem mohon tunggu kak lama jam depan cek kala kendala aku terimakasih sehat selalu kak,26,,"{'label': 'positive', 'score': 0.9994930028915405}",positive +hai kak mohon maaf atas ketidaknyamanannya sedang kembang sistem mhn tunggu cek kala jam depan udah lwt jam msh kendala silah aku kak stay safe,25,,"{'label': 'neutral', 'score': 0.9998493194580078}",neutral +stop nipu anjeng,3,,"{'label': 'negative', 'score': 0.999907374382019}",negative +hai kak maaf bkin kakak gak nyaman trkait kendala kakak aku bantu infoin aku detail kendala dana kendala kakak lalu sehat selalu,22,,"{'label': 'positive', 'score': 0.9968075752258301}",positive +kendala lebih estimasi sebut kamu lampir username amp,8,,"{'label': 'neutral', 'score': 0.9998283386230469}",neutral +kak maaf kait kendala top shopeepay blm terima aku infoin sedang jadi kendala sistem shopee aku saran tunggu amp screenshot bukti transaksi lalu kak terimakasih,25,,"{'label': 'neutral', 'score': 0.9998555183410645}",neutral +kak maaf kait kendala bayar gagal bantu kece kamu lampir data username amp,13,,"{'label': 'neutral', 'score': 0.9998142123222351}",neutral +hai kak maaf buat kakak resah kait top shopeepay aku infoin sdg dapat kembang sistem mohon tunggu cek kala jam depan sejak transaksi nanti update hubung sehat selalu kak,29,,"{'label': 'positive', 'score': 0.9990043044090271}",positive +iya masamaaa,2,,"{'label': 'negative', 'score': 0.9998831748962402}",negative +jam saldo kakak terima kakak bantu infoin detail kendala aku kak stay safe,13,,"{'label': 'neutral', 'score': 0.9998728036880493}",neutral +kak maaf atas kendala jadi kendala sistem sedang tangan tim kait aku mohon sedia kakak tunggu jam sejak kakak melakukakan top,21,,"{'label': 'neutral', 'score': 0.9998898506164551}",neutral +klo jem balik nnti otomatis kerefund sih kata chat aja nantiii,11,,"{'label': 'neutral', 'score': 0.9986839890480042}",neutral +busuk emang,2,,"{'label': 'negative', 'score': 0.9999200105667114}",negative +punya kakak masuk kak,4,,"{'label': 'neutral', 'score': 0.9998843669891357}",neutral +punya udah alhamdulillah nungguin jam tadi,6,,"{'label': 'negative', 'score': 0.7788499593734741}",negative +punya kaka dana udah masuk,5,,"{'label': 'neutral', 'score': 0.999887228012085}",neutral +tunggu dulu aja soal tadi aku jam,7,,"{'label': 'neutral', 'score': 0.9998564720153809}",neutral +anjennkkk,1,,"{'label': 'negative', 'score': 0.9998036026954651}",negative +heh minn upload konten begini mending benerin dulu deh sistem indonesia urgent saldo mbanking udh potong gabisa masuk spay loh,20,,"{'label': 'negative', 'score': 0.999710738658905}",negative +sama kaa punya aku pending shopeepay seabank seabank shopeepay,9,,"{'label': 'neutral', 'score': 0.8670766949653625}",neutral +bisa orang urgent malah manfaatin situasi,6,,"{'label': 'negative', 'score': 0.9998706579208374}",negative +aku bom masukkaa dri shopeepay seabank,6,,"{'label': 'neutral', 'score': 0.9998899698257446}",neutral +trus gimana kak dana masuk jadi spay,7,,"{'label': 'neutral', 'score': 0.99981290102005}",neutral +wkwkk,1,,"{'label': 'negative', 'score': 0.9980796575546265}",negative +gmn balasaanya kak udah jam nii,6,,"{'label': 'negative', 'score': 0.9953113198280334}",negative +coba lapor dichat prioritas upload bukti bayar kak masuk kode referal duh mana aku gak sedkit top udah jam gak masuk,21,,"{'label': 'negative', 'score': 0.9997889399528503}",negative +gatau nih kak nya susah dihubungin,6,,"{'label': 'negative', 'score': 0.9998699426651001}",negative +gratisin dong top spaynya pake kartu debit hiks,8,,"{'label': 'negative', 'score': 0.8183947205543518}",negative +kak mjb punya dah masuk apa blm saldo soal aku top spay blm masuk sampe sekarang,16,,"{'label': 'neutral', 'score': 0.9994425177574158}",neutral +belomm kakk,2,,"{'label': 'negative', 'score': 0.999685525894165}",negative +samaa bgt weeh,3,,"{'label': 'positive', 'score': 0.9981405735015869}",positive +aku sama kak sekarang kaka gimana saldo udh masuk,9,,"{'label': 'neutral', 'score': 0.9997363686561584}",neutral +mun cek min,3,,"{'label': 'neutral', 'score': 0.9998229146003723}",neutral +entah lama bgt shopee,4,,"{'label': 'negative', 'score': 0.9998989105224609}",negative +bakal aman gak duit nya gak masuk masuk sampe sekarang,10,,"{'label': 'negative', 'score': 0.9699811935424805}",negative +masuk kak punya stuck,4,,"{'label': 'negative', 'score': 0.999775230884552}",negative +tolonggggg donggggggggggggggg cepet proses udah jam bank gak masuk spay masalahmya nominal gedeeeeeeeeee,13,,"{'label': 'negative', 'score': 0.9994001388549805}",negative +bank apa aja nih kak aku nyangkut nih huhu,9,,"{'label': 'negative', 'score': 0.9997619986534119}",negative +samaaa,1,,"{'label': 'positive', 'score': 0.9998452663421631}",positive +jam kakk huhu sampe sekarang,5,,"{'label': 'negative', 'score': 0.9998629093170166}",negative +halo admin transfer bank jam terima padahal saldo potong,9,,"{'label': 'neutral', 'score': 0.9997479319572449}",neutral +woy bener aja dong masa mau komplain top malah gak sedia balikin duit anjay,14,,"{'label': 'negative', 'score': 0.9999086856842041}",negative +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +awas aja sampe balik saldo gwa benerin woi shopeepay error gin awas aja,13,,"{'label': 'negative', 'score': 0.9999116659164429}",negative +kendala pemberitahuan alhasil transfer pending,5,,"{'label': 'negative', 'score': 0.9973723888397217}",negative +kakk udah brp lama aku udah sejamm proses,8,,"{'label': 'neutral', 'score': 0.9991944432258606}",neutral +kata masuk,2,,"{'label': 'neutral', 'score': 0.9846906065940857}",neutral +error min seabank masuk saldo,5,,"{'label': 'neutral', 'score': 0.9061294794082642}",neutral +masuk kak saldo punya jam set blm masuk,8,,"{'label': 'neutral', 'score': 0.9998866319656372}",neutral +shopeepay cepat baik buat beli tiket pending terus,8,,"{'label': 'positive', 'score': 0.9999324083328247}",positive +sama kak dah tunggu satu jam telfon admin jawab cuman ditinggu karna baik,13,,"{'label': 'neutral', 'score': 0.999355137348175}",neutral +aku tadi jam lebihh,4,,"{'label': 'neutral', 'score': 0.8727614879608154}",neutral +tlg cek,2,,"{'label': 'neutral', 'score': 0.999873161315918}",neutral +dong urgent nihh,3,,"{'label': 'negative', 'score': 0.9997974038124084}",negative +update sistem mbok pas tengah malam pas orang tidur top sdh jam masuk shopeepay pdhal nau dipake dana trus situ mau ganti rugi,23,,"{'label': 'negative', 'score': 0.9998384714126587}",negative +udah masuk spay nya,4,,"{'label': 'neutral', 'score': 0.9996036887168884}",neutral +nunggu berapa lamaa kakk,4,,"{'label': 'negative', 'score': 0.9995947480201721}",negative +yakan emang monyet bgt gakbisa dihubungiiii bapuk,7,,"{'label': 'negative', 'score': 0.9999181032180786}",negative +tumben banget gin woii,4,,"{'label': 'negative', 'score': 0.9998998641967773}",negative +aku udah masuk barusan coba cek kala aja spay sama seabanknya hehe,12,,"{'label': 'neutral', 'score': 0.9998950958251953}",neutral +haloo kak saldo udah masuk yaa punya stuck huhu,9,,"{'label': 'negative', 'score': 0.912499189376831}",negative +klo malah mau bayar pake shoppepay udh potong resto nya masuk gimana,12,,"{'label': 'negative', 'score': 0.9784184098243713}",negative +abis top shopee trus langsung check out bayar nyata gagal saldo potong gimana shopee jumlah sedikit,16,,"{'label': 'negative', 'score': 0.9981247782707214}",negative +aku top kli masuk cumn,5,,"{'label': 'positive', 'score': 0.9999345541000366}",positive +halo min tadi mau mesen shopeefood dicancel sistem bayar gak gatau knp terus shopeepay nya balik transaksi dicancel gmn,19,,"{'label': 'neutral', 'score': 0.9143058657646179}",neutral +top shopeepay bca gamasuk anj saldo dah potong gimana nih duit dikit,12,,"{'label': 'negative', 'score': 0.9990979433059692}",negative +hai kak maaf udah bikin khawatir aku bantu cek kendala lbh lanjut infoin bukti top stay safe,17,,"{'label': 'neutral', 'score': 0.9996742010116577}",neutral +aaa emg brrti error,4,,"{'label': 'negative', 'score': 0.9999164342880249}",negative +hai kak maaf buat resah kait top shopeepay aku infoin sedang dapat kembang sistem mohon tunggu cek kala jam depan sejak laku transaksi udh jam kendala aku yaa kakk sehat selalu,31,,"{'label': 'positive', 'score': 0.9994463324546814}",positive +nyata sayah top shopeepay masuk cepet resin sistem dongggg,9,,"{'label': 'negative', 'score': 0.901738703250885}",negative +eror nunggu brp lama saldo masuk,6,,"{'label': 'negative', 'score': 0.999893307685852}",negative +hai kak maaf udah bikin khawatir aku bantu cek kendala lbh lanjut infoin bukti top stay safe,17,,"{'label': 'neutral', 'score': 0.9996742010116577}",neutral +hallo kak mau aju komplain kait dana shopeepay masuk top lalu banking bca cek yaa kendala,16,,"{'label': 'neutral', 'score': 0.9998806715011597}",neutral +masuk sih cumn lama banget ancrit aku top kali masuk baru,11,,"{'label': 'negative', 'score': 0.9998776912689209}",negative +hai kak maaf buat kakak resah kait top shopeepay aku infoin sdg dapat kembang sistem mohon tunggu cek kala jam depan sejak transaksi nanti update hubung sehat selalu kak,29,,"{'label': 'positive', 'score': 0.9990043044090271}",positive +hai kak maaf udah bikin khawatir aku bantu cek kendala lbh lanjut infoin detail kendala stay safe,17,,"{'label': 'neutral', 'score': 0.9996907711029053}",neutral +kirain gua doang njir,4,,"{'label': 'negative', 'score': 0.9999094009399414}",negative +baik cek,2,,"{'label': 'neutral', 'score': 0.9998699426651001}",neutral +sama banget njir gmna nih,5,,"{'label': 'negative', 'score': 0.9998910427093506}",negative +samaaa,1,,"{'label': 'positive', 'score': 0.9998452663421631}",positive +lah sama barusan banget uang ilang tau dah,8,,"{'label': 'negative', 'score': 0.9999145269393921}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +top shopeepay udah jam masuk masuk,6,,"{'label': 'neutral', 'score': 0.9998915195465088}",neutral +kocak saldo potong gagal udah transaksi gue mau makan pls laper,11,,"{'label': 'negative', 'score': 0.9999107122421265}",negative +nyata fenomena alam ampe kapan inihhh pending haloo,8,,"{'label': 'negative', 'score': 0.9998968839645386}",negative +dong saldo dana nya balik,5,,"{'label': 'negative', 'score': 0.9997426867485046}",negative +halo min saldo shopeepay potong padahal status bayar gagal,9,,"{'label': 'neutral', 'score': 0.9994052648544312}",neutral +baik sahabat mohon maaf atas ketidaknyamanannya perihal sebut mohon kirim pesan kendala alami lalu laku kece sahabat mohon jaga rahasia data perban mudah,23,,"{'label': 'neutral', 'score': 0.9997645020484924}",neutral +error kak suruh nunggu jam,5,,"{'label': 'negative', 'score': 0.9998884201049805}",negative +top shopeepay dri mandiri masuk padahal saldo potong,8,,"{'label': 'neutral', 'score': 0.9998778104782104}",neutral +sama gue kali top saldo potong bca shopeepay kagak,9,,"{'label': 'neutral', 'score': 0.9998643398284912}",neutral +baik dpt chat ktnya kendala,5,,"{'label': 'neutral', 'score': 0.9998692274093628}",neutral +skrg udah blm,3,,"{'label': 'neutral', 'score': 0.990398645401001}",neutral +skrg udah blm,3,,"{'label': 'neutral', 'score': 0.990398645401001}",neutral +trs lanjut gmn tuh udah masuk dana nya blm waktu pake bca,12,,"{'label': 'neutral', 'score': 0.9996458292007446}",neutral +aku transaksi gagal saldo kurang,5,,"{'label': 'negative', 'score': 0.9998838901519775}",negative +buru benerin lah kocak duit mau dipake,7,,"{'label': 'negative', 'score': 0.9998931884765625}",negative +shopee gin mulu beberapa bulan lalu aku jadi dana nyangkut pake bca malah nyalahin pihak bank nah siang top shopeepay nyangkut pake bni,23,,"{'label': 'negative', 'score': 0.9998087286949158}",negative +sistem emang rese dri lama,5,,"{'label': 'negative', 'score': 0.9997130036354065}",negative +kurang tau kak aku sekarang masuk,6,,"{'label': 'negative', 'score': 0.9978860020637512}",negative +baah pantesan error banyak ngalamin masuk saldo,7,,"{'label': 'negative', 'score': 0.9999139308929443}",negative +iya heu,2,,"{'label': 'negative', 'score': 0.9994288086891174}",negative +wah nyata gak masuk,4,,"{'label': 'negative', 'score': 0.9998970031738281}",negative +emg tolol anjing top kaga masuk memek bales goblok,9,,"{'label': 'negative', 'score': 0.9999154806137085}",negative +sama kak gak masuk padahal saldo udh potong,8,,"{'label': 'negative', 'score': 0.9774102568626404}",negative +top shopeepay kok masuk,4,,"{'label': 'neutral', 'score': 0.9997695088386536}",neutral +wwooooiiiii uda topup bank kok saldo masuk sih csnya gbs hubung smua,12,,"{'label': 'negative', 'score': 0.9997251629829407}",negative +halo kak cek dong,4,,"{'label': 'neutral', 'score': 0.9998936653137207}",neutral +hallo kak saldo hasil masuk soal aku top masuk sampe sekarang,11,,"{'label': 'neutral', 'score': 0.9998767375946045}",neutral +plis kalo reply suruh hubung whatsapp jangan mau mending lgsg resmi aplikasi aja meski lama aman hati soal kayak gin rawan bgt sama tipu plis gausa gupuh,27,,"{'label': 'negative', 'score': 0.9998878240585327}",negative +jangan deck mau nipu,4,,"{'label': 'negative', 'score': 0.9998936653137207}",negative +shopeepay nya baik,3,,"{'label': 'positive', 'score': 0.9999423027038574}",positive +ngisi sopipay lewat livin transaksi hasil saldo potong saldo nambah,10,,"{'label': 'neutral', 'score': 0.9998812675476074}",neutral +mjb kak aku sama topup shopeepay gamasuk udah chat nya emang sistem down kata suruh tunggu ajaa,17,,"{'label': 'negative', 'score': 0.9996532201766968}",negative +min udh top saldo shopee hasil blm masuk akun cek,10,,"{'label': 'neutral', 'score': 0.999894380569458}",neutral +baik sistem,2,,"{'label': 'positive', 'score': 0.9952691197395325}",positive +pantesan top blm masuk nyata banyak ngalamin,7,,"{'label': 'negative', 'score': 0.9997164607048035}",negative +min kok saldo shopeepaynya gamasuk padahal top bca udh hasil,10,,"{'label': 'negative', 'score': 0.9954341053962708}",negative +duit masuk ajg,3,,"{'label': 'negative', 'score': 0.9987431168556213}",negative +kata csnya error,3,,"{'label': 'negative', 'score': 0.9999195337295532}",negative +sama kalo,2,,"{'label': 'positive', 'score': 0.9760370254516602}",positive +saldo dimbanking udah kurang kok blm masuk shopeepay min,9,,"{'label': 'negative', 'score': 0.9995531439781189}",negative +udh menit nunggu mas bom masuk,6,,"{'label': 'neutral', 'score': 0.9934169054031372}",neutral +topup shopeepay masuk siaaaaalll,4,,"{'label': 'positive', 'score': 0.9991514682769775}",positive +mau transaksi apa gampang amp,5,,"{'label': 'negative', 'score': 0.9994617104530334}",negative +kak udah masuk aku baru top shopeepay masuk masuk udah chat customer service antri,14,,"{'label': 'neutral', 'score': 0.9998944997787476}",neutral +diem diem bae min error mulu nih aplikasi,8,,"{'label': 'negative', 'score': 0.99991774559021}",negative +min yaa barusan top shopeepay lewat mbanking kok masuk saldo help min,12,,"{'label': 'neutral', 'score': 0.9998936653137207}",neutral +halo kak mohon maaf top lalu virtual account bca masuk saldo gimana kak masalah urgent kak gimana,17,,"{'label': 'neutral', 'score': 0.9997075200080872}",neutral +shopee pay error kocaaakk top kaga masuk woi,8,,"{'label': 'negative', 'score': 0.9999088048934937}",negative +enggaa trf manual lewat atm sekali bri soal makasih,9,,"{'label': 'neutral', 'score': 0.9998931884765625}",neutral +min barusan top shopeepay brimo saldo udh potong kok masuk spay,11,,"{'label': 'neutral', 'score': 0.9998924732208252}",neutral +mjb kak aku barusan uda lapor balesannya gin,8,,"{'label': 'neutral', 'score': 0.9997255206108093}",neutral +mjb kak ngisinya pake briva kalo briva sih harus saldo langsung masuk tuh shopay moga shopee segera ngasih tanggap urus cepet selesai kak,23,,"{'label': 'positive', 'score': 0.9996211528778076}",positive +sama kak aku,3,,"{'label': 'neutral', 'score': 0.7372779250144958}",neutral +aja dah shopee sama bca shopeepay uang gak masuk masuk saldo potong mayan men biasa langsung masuk saldo,18,,"{'label': 'neutral', 'score': 0.9998308420181274}",neutral +jugaga masukk,2,,"{'label': 'positive', 'score': 0.6132853031158447}",positive +duh sama padahal mutasi mbanking hasil,6,,"{'label': 'negative', 'score': 0.9998883008956909}",negative +halo kak aku problem sama kira lapor,7,,"{'label': 'neutral', 'score': 0.9777880311012268}",neutral +sama masuk topup,3,,"{'label': 'positive', 'score': 0.9882900714874268}",positive +shopeepay eror pas laper nya wtf gmn nih udah topup kali gamasuk semua duit akuuu,15,,"{'label': 'negative', 'score': 0.999915361404419}",negative +aku top bank mandiri shopeepay masuk saldo resi mandiri terang hasil saldo masuk shopeepay pls bgt aku butuh buat bayar kas krna kejar kejar terus pls bgt knp masuk saldo,30,,"{'label': 'negative', 'score': 0.9968774318695068}",negative +aku antri,2,,"{'label': 'negative', 'score': 0.9892413020133972}",negative +arti kendala shopee kali kak soal beda bank,8,,"{'label': 'neutral', 'score': 0.9998929500579834}",neutral +topup saldo shopeepay bank mandiri kok gak masuk masuk yah,10,,"{'label': 'negative', 'score': 0.99860018491745}",negative +min cek aku barusan topup shopeepay via livin mandiri status topup livin hasil sampe sekarang saldo shopeepay nambah gimana nih min,21,,"{'label': 'negative', 'score': 0.9705848097801208}",negative +kok aku top bank mandiri shopeepay masuk yah saldonyaa resi mandiri udah terang hasil shopeepaynya gak masuk saldo plssss tlong bgt aku top buat bayar kas karna udh kejar kejar teruss,31,,"{'label': 'negative', 'score': 0.9473733305931091}",negative +sama transaksi gak masuk padahal urgen mana banyak lagi chat antre,11,,"{'label': 'negative', 'score': 0.9998617172241211}",negative +fitur favorit tarik tunai mungkin tarik uang tunai saldo shopeepay atm minimarket milik kartu debit bantu butuh uang tunai segera,20,,"{'label': 'neutral', 'score': 0.9998884201049805}",neutral +fitur favorit transfer ewallet amp,5,,"{'label': 'neutral', 'score': 0.9998635053634644}",neutral +knp qris merchant cair sampe hari baru cair lapor terus shopee nya kali dana tahan kalo merchant lain selalu aman bayar tepat waktu hari cair kpd pihak,27,,"{'label': 'neutral', 'score': 0.8805496096611023}",neutral +kaaa udh balik pulih saldo nya,6,,"{'label': 'neutral', 'score': 0.998647153377533}",neutral +iklan kalian sering masuk beranda hape kurang kerja aja ganggu bgt iklan kalian anjing,14,,"{'label': 'negative', 'score': 0.9999209642410278}",negative +neh bantu list pak usaha jadi sakit masyarakat monggo klo mau nambahin biar bantu pak presiden sekian terima kasih,19,,"{'label': 'negative', 'score': 0.9998785257339478}",negative +kak maaf kait kendala pesan kamu alami dpt aku bantu kece kendala kamu mohon hubung aku lalu yaa terima kasih,20,,"{'label': 'neutral', 'score': 0.9998887777328491}",neutral +hai kak jangan khawatir aku langsung luncur kamu nihh mohon sedia tunggu sehat selalu,14,,"{'label': 'neutral', 'score': 0.8334572315216064}",neutral +aku top saldo shopeepay bank beberapa jam lalu blm masuk,10,,"{'label': 'neutral', 'score': 0.9998931884765625}",neutral +hai kak maaf buat kamu nyaman kait kendala kamu alami aku bantu yuk infoin aku detail kendala kamu social media sehat selalu,22,,"{'label': 'neutral', 'score': 0.9991493225097656}",neutral +kak maaf kait kendala pesan kamu alami dpt aku bantu kece kendala kamu mohon hubung aku lalu yaa terima kasih,20,,"{'label': 'neutral', 'score': 0.9998887777328491}",neutral +curi data darimana,3,,"{'label': 'negative', 'score': 0.9996947050094604}",negative +stop spam telfon sangkut gak nyantumin nomor jadi kontak darurat jadi kalian nomor darimana,14,,"{'label': 'negative', 'score': 0.9998605251312256}",negative +hai kak birth f venus jangan khawatir aku langsung luncur kamu nihh mohon sedia tunggu sehat selalu,17,,"{'label': 'positive', 'score': 0.8209349513053894}",positive +gue malah jadi keinget top shopee pay smpe skrng isi pdhal udah tarik rekening nya lumayan banget rebu mah jujur udah cape ngurus lewat apk masalah malah saldo gue tilep,30,,"{'label': 'negative', 'score': 0.9998956918716431}",negative +laku buat top lewat idm kok tdi aku ttp kena biaya admin,12,,"{'label': 'negative', 'score': 0.9983566403388977}",negative +fitur transfer antar bank guna banget kali mau kirim uang sama ibu gak perlu antri atm dekat,17,,"{'label': 'positive', 'score': 0.9980034232139587}",positive +shopee skrg banyak tekan seller mulai biaya admin tinggi amp,10,,"{'label': 'negative', 'score': 0.8102602958679199}",negative +fitur favorit shopeepay qris fitur sering pakai sekarang butuh bayar aku milih utk gak pakai uang tunai pakai qris praktis tingkat aman jamin,23,,"{'label': 'positive', 'score': 0.9998940229415894}",positive +fitur top pulsa data internet amp,6,,"{'label': 'neutral', 'score': 0.9998680353164673}",neutral +cek apa apa minimal biaya admin,6,,"{'label': 'neutral', 'score': 0.999889612197876}",neutral +fitur favorit qris manfaat banget hari kalo mau beli makan apapaun tiap merchant jadi mudah praktis cepat andal banget emang shopeepay,21,,"{'label': 'positive', 'score': 0.999955415725708}",positive +hai kak maaf bgt udah buat nyaman kait dpt guna metode bayar spaylater aku infoin pasti kakak selalu bayar tagih tepat waktu aku bantu kece detail kendala lalu sosial media tunggu,31,,"{'label': 'neutral', 'score': 0.999427080154419}",neutral +fitur qris favorite sih mudah bgt kalau pas keluar bawa uang cash bayar jadi cepat tinggal scan ajah lgsg beres tambah sekarang tarik tunai indomaret makin keren ajah,28,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +fitur qris favorite sih mudah bgt kalau pas keluar bawa uang cash bayar jadi cepat tinggal scan ajah lgsg beres tambah sekarang tarik tunai indomaret makin keren,27,,"{'label': 'positive', 'score': 0.999954342842102}",positive +fitur qris favorite sih mudah bgt kalau pas keluar bawa uang cash bayar jadi cepat tinggal scan ajah lgsg beres tambah sekarang tarik tunai indomaret makin keren ajah,28,,"{'label': 'positive', 'score': 0.9999537467956543}",positive +bismillah moga rejeki,3,,"{'label': 'positive', 'score': 0.9998403787612915}",positive +fitur favorit aku pasti qris dong metode bayar mudah cepat pokok satset banget deh terdebest sih,16,,"{'label': 'positive', 'score': 0.9999055862426758}",positive +dong toko sering pasang promo barang gak pernah kirim selalu cancel baik tutup lama bikin orang malas belanja kalau promo barang gak pernah kirim,24,,"{'label': 'negative', 'score': 0.9999096393585205}",negative +qris manfaat mudah transaksi aman,5,,"{'label': 'positive', 'score': 0.9998730421066284}",positive +fitur scan qris aplikasi shopeepay kali transaksi merchant pilih cashback hari ayo ikut,13,,"{'label': 'neutral', 'score': 0.9998914003372192}",neutral +minn yaa transfer payment,4,,"{'label': 'neutral', 'score': 0.9997461438179016}",neutral +tadi laku isi saldo shopeepay via transfer bank gopay transfer hasil sisi gopay saldo masuk shopeepay nyata penuh minimal transfer saldo,21,,"{'label': 'neutral', 'score': 0.9998947381973267}",neutral +fitur qris jauh gampang efisien perlu bawa uang cash mana,10,,"{'label': 'positive', 'score': 0.9999121427536011}",positive +fitur shopeepay favorit qris sih soal mau bayar apa tinggal sat set gak pake ribet aman kalo promonya makin mantap betul deh,22,,"{'label': 'positive', 'score': 0.9999513626098633}",positive +gampang kalo mau jajan tinggal qris transfer uang biaya tambah banyak promo guna shopeepay shopee yuk ikut,17,,"{'label': 'neutral', 'score': 0.9992628693580627}",neutral +pilih shopeepay alat bayar dapat cashback upa koin dapat voucher promo seller,12,,"{'label': 'neutral', 'score': 0.9998799562454224}",neutral +aku suka jajan fitur favorit shopeefood semua jajan promo shopeepay tuh manfaat banyak bnget buat transaksi transfer beli pulsa token pasti buat cekout shopee,24,,"{'label': 'positive', 'score': 0.9999532699584961}",positive +fitur qris paling favorit sih qris aku rasa mudah transaksi ribet jadi makin cepet efisien yuk ikut guys,18,,"{'label': 'positive', 'score': 0.9999480247497559}",positive +fitur qris paling favorit sih qris aku rasa mudah transaksi ribet jadi makin cepet efisien yuk ikut guys,18,,"{'label': 'positive', 'score': 0.9999480247497559}",positive +fitur isi pulsa bayar tagih bantu buat aku mageran mau konter merchant bayar tagih sat set ribet drama satu aplikasi langsung beres yuk pakai,24,,"{'label': 'negative', 'score': 0.9994127750396729}",negative +fitur favorit bayar pakai qris jadi mudah banyak promonya,9,,"{'label': 'positive', 'score': 0.9999123811721802}",positive +fitur qris jadi favorit praktis serba bikin transaksi hari efisien cukup scan amp atur tele tak ayal tak pungkiri seller nyaman commerce,22,,"{'label': 'positive', 'score': 0.9998781681060791}",positive +fitur gratis transfer bank praktis bebas biaya admin sat set,10,,"{'label': 'neutral', 'score': 0.9963490962982178}",neutral +fitur shopeepay favorit scan qris bikin aku mudah laku bayar,10,,"{'label': 'positive', 'score': 0.9999368190765381}",positive +diem tipu,2,,"{'label': 'negative', 'score': 0.9999159574508667}",negative +kak maaf udah buat kamu nyaman kait kendala kamu alami aku bantu lanjut infoin detail kendala halaman kendala lalu aku tunggu kak,22,,"{'label': 'neutral', 'score': 0.999881386756897}",neutral +aku paling suka fitur qris min mudah banget mau bayar apa tinggal scan mantap banget dah,16,,"{'label': 'positive', 'score': 0.999953031539917}",positive +fitur bayar shopeepaylater pakai shopeepay minim bunga fitur sat set banget yuk ikut kembang pesat,15,,"{'label': 'positive', 'score': 0.9375854730606079}",positive +fitur favorite shopeepay transfer bank gratis manfaat sekali aku selalu laku bayar apa via transfer biaya admin hemat waktu hashtag,20,,"{'label': 'positive', 'score': 0.9998987913131714}",positive +fitur top pulsa amp,4,,"{'label': 'neutral', 'score': 0.9997503161430359}",neutral +woi gimana sih kocak muat fitur mulu gilir top shopeepay gilir mau dipake tarik atm muat fitur sampe jam jelek bgt sistem perbaikinlah mau ngadu aja muat fitur gamau dipake apa gimana sih emosi gue,35,,"{'label': 'negative', 'score': 0.9999126195907593}",negative +hai kak jeajaudah kendala kakak tangan lanjut kakak sila hubung chat maya aplikasi myxl livechat web terima kasih hubung twitter myxlcare,21,,"{'label': 'neutral', 'score': 0.999901294708252}",neutral +saldo shopeepay deteksi aplikasi myxl huhu,6,,"{'label': 'negative', 'score': 0.9995794892311096}",negative +udah sama biaya tangan kak kemarin malem aku pake nominal pas kok,12,,"{'label': 'neutral', 'score': 0.9998358488082886}",neutral +fitur shope pay favorit transfer bank amp,7,,"{'label': 'neutral', 'score': 0.9998658895492554}",neutral +fitur transfer bank sama guna shopeepay kena biaya admin proses cepat mudah salah isi data rekening proses transfer otomatis batal,20,,"{'label': 'negative', 'score': 0.9874409437179565}",negative +fitur favorit alias sering aku gunain scan qris sendiri bikin payment merchant online offline makin satset aman pasti ohiya satu suka banyak promo jugaa,24,,"{'label': 'positive', 'score': 0.9999498128890991}",positive +fitur gratis transfer bank bantu banget fitur hemat gak dikenain biaya admin suka promonya,14,,"{'label': 'positive', 'score': 0.9999010562896729}",positive +beli voucher beli makan minum fitur shopeepay sekitar lalu aplikasi shopee bayar kasir merchant redeem vouchernya amp,17,,"{'label': 'neutral', 'score': 0.9998946189880371}",neutral +oke kak jangan khawatir aku cek kakak satu per satu tunggu yaa stay healthy,14,,"{'label': 'neutral', 'score': 0.9998579025268555}",neutral +transfer ewallet amp,3,,"{'label': 'neutral', 'score': 0.9950453042984009}",neutral +gimana deh padahal saldo kok cukup,6,,"{'label': 'negative', 'score': 0.9997568726539612}",negative +cek dong,2,,"{'label': 'neutral', 'score': 0.997416615486145}",neutral +fitur pulsa tagih amp,4,,"{'label': 'negative', 'score': 0.9997989535331726}",negative +qris praktis banyak promonya mudah,5,,"{'label': 'positive', 'score': 0.9999368190765381}",positive +sukses selalu,2,,"{'label': 'positive', 'score': 0.9999552965164185}",positive +fitur gratis transfer bank buat aku selalu simpan uang shopeepay fitur manfaat mau transfer bank gak biaya adminya bantu kurang keluar,21,,"{'label': 'neutral', 'score': 0.9996532201766968}",neutral +fitur gratis transfer bank buat aku selalu simpan uang shopeepay fitur manfaat mau transfer bank gak biaya adminya bantu kurang keluar,21,,"{'label': 'neutral', 'score': 0.9996532201766968}",neutral +fitur favorit qris dong yuk,5,,"{'label': 'positive', 'score': 0.8847799897193909}",positive +udh kak,2,,"{'label': 'positive', 'score': 0.9945533275604248}",positive +hai kak maaf bikin nyaman kait kendala kamu alami aku bantu cek infoin detail kendala kamu social media aku tunggu,20,,"{'label': 'neutral', 'score': 0.9998842477798462}",neutral +bayar lalu code mudah aku guna laku bayar pindai code bagai toko maupun mall merchant mudah aman amp,18,,"{'label': 'positive', 'score': 0.9998289346694946}",positive +fitur favorit qris transfer gratis bank mudah cepat aman transaksi hari jalan lancar,13,,"{'label': 'positive', 'score': 0.9999154806137085}",positive +atas shopeepay anna federika lacak gaya abis laku tipu,9,,"{'label': 'negative', 'score': 0.999835729598999}",negative +paling suka fitur transfer ewallet transfer mana aja dgn praktis cukup klik langsung kirim ikut yuk,16,,"{'label': 'positive', 'score': 0.5260732173919678}",positive +ikut yukk teman teman,4,,"{'label': 'neutral', 'score': 0.9995562434196472}",neutral +fitur transfer dong soal mau mana free jujur aku dulu tiap transaksi shopeepay aku senang sekali manfaat banyak banget bantu transaksi,21,,"{'label': 'positive', 'score': 0.9999326467514038}",positive +fitur transfer jadi favorit bikin transaksi antar teman amp,9,,"{'label': 'neutral', 'score': 0.5555009245872498}",neutral +fitur transfer jadi favorit bikin transaksi antar teman amp,9,,"{'label': 'neutral', 'score': 0.5555009245872498}",neutral +qris mudah cepat aman,4,,"{'label': 'positive', 'score': 0.9999330043792725}",positive +qris transaksi jadi mudah cepat,5,,"{'label': 'positive', 'score': 0.9999457597732544}",positive +fitur shopeepay favorit transfer bank fitur aku transfer uang rekening bank mana aja biaya admin cepet aman satsetsatset aja,19,,"{'label': 'positive', 'score': 0.9988749623298645}",positive +done moga untung,3,,"{'label': 'positive', 'score': 0.9999377727508545}",positive +fitur shopeepay favorit transfer bank fitur aku transfer uang rekening bank mana aja biaya admin uwu jadi hemat praktis kirim uang jajan adek ibuk hasil jual,26,,"{'label': 'positive', 'score': 0.9999278783798218}",positive +fitur favorit transfer wallet bebas transfer perlu ribet,8,,"{'label': 'neutral', 'score': 0.9902408123016357}",neutral +transfer bank jadi fav makin kembang jadi aplikasi hari mudah buah duren beku beri cokelat sedap makan like komen laku moga hadiah dapat,23,,"{'label': 'positive', 'score': 0.6869276762008667}",positive +tarik tunai transfer isi saldo jadi mudah praktis pakai shopeepay yuk ikut kak done all steps,16,,"{'label': 'positive', 'score': 0.9995941519737244}",positive +shopeepay buat cekout buat isi pulsa buat bayar shopeefood buat token listrik hemat aman,14,,"{'label': 'positive', 'score': 0.9996122717857361}",positive +favorit fitur pulsa amp,4,,"{'label': 'neutral', 'score': 0.9993157386779785}",neutral +favorit qris transfer tarik tunai semua sat set set bget cepat kilat transfer gratis pokok pkae shopee pay guntung yuk pkae shopee pay semua mudah guntung,26,,"{'label': 'positive', 'score': 0.9987309575080872}",positive +paling suka fitur shopeepay later checkout barang lebih bayar kemudian hari banyak promo amp pasti gak bikin repot nngu kembali,20,,"{'label': 'positive', 'score': 0.9999445676803589}",positive +fitur transfer favorit gratis bank mana perlu mikirin biaya admin,10,,"{'label': 'neutral', 'score': 0.9989593029022217}",neutral +fitur transfer favorit gratis bank mana perlu mikirin biaya admin,10,,"{'label': 'neutral', 'score': 0.9989593029022217}",neutral +fitur aplikasi beli pulsa paket data tagih internet mudah habis pulsa tinggal buka aplikasi shopeepay gak perlu warung,18,,"{'label': 'neutral', 'score': 0.9215492010116577}",neutral +sukaaaa semua tapi ajar sihg qris sekarang kantin aku aja pake qris jadi mudah qris,15,,"{'label': 'positive', 'score': 0.9997501969337463}",positive +fitur top tarik dana manfaat buat mudah isi saldo transaksi tarik dana rekening bank guna kelola uang hari hari perlu guna uang tunai,23,,"{'label': 'neutral', 'score': 0.997149646282196}",neutral +hai paling favorit fitur aplikasi transfer ewallet sama seabank mudah sekali mentranfer uang jajan sama arisan terus kalau pakai seabank belanja shopee hemat,23,,"{'label': 'positive', 'score': 0.9999414682388306}",positive +hai paling favorit fitur aplikasi transfer ewallet sama seabank mudah sekali mentranfer uang jajan sama arisan terus kalau pakai seabank belanja shopee hemat,23,,"{'label': 'positive', 'score': 0.9999414682388306}",positive +semua sukaaaa belanja online gampang jajan offline gampang qris,9,,"{'label': 'positive', 'score': 0.9999098777770996}",positive +fitur favorite shopeepay transfer bank gratis benar benar bantu aku sering tarik saldo bank fitur transfer guna hari sering transfer,20,,"{'label': 'positive', 'score': 0.999005138874054}",positive +fitur qris cepat mudah aman,5,,"{'label': 'positive', 'score': 0.9999184608459473}",positive +qris cepat,2,,"{'label': 'positive', 'score': 0.9999294281005859}",positive +fitur favorit qris transfer gratis bank mudah cepat aman,9,,"{'label': 'positive', 'score': 0.9998210072517395}",positive +fitur shopeepay favorit qris sih soal mau bayar apa cepat mudah gak ribet aman,14,,"{'label': 'positive', 'score': 0.9998425245285034}",positive +fitur shopeepay favorit qris sih soal mau bayar apa cepat mudah gak ribet aman,14,,"{'label': 'positive', 'score': 0.9998425245285034}",positive +fitur shopeepay favorit qris sih soal mau bayar apa cepat mudah gak ribet aman,14,,"{'label': 'positive', 'score': 0.9998425245285034}",positive +fitur shopeepay favorit qris sih soal mau bayar apa cepat mudah gak ribet aman,14,,"{'label': 'positive', 'score': 0.9998425245285034}",positive +fitur shopeepay favorit qris sih soal mau bayar apa cepat mudah gak ribet aman,14,,"{'label': 'positive', 'score': 0.9998425245285034}",positive +fitur shopeepay favorit qris sih soal mau bayar apa cepat mudah gak ribet aman,14,,"{'label': 'positive', 'score': 0.9998425245285034}",positive +fitur favorit bayar pake qris mudah bayar satset gaperlu ribet ikut,11,,"{'label': 'neutral', 'score': 0.9702941179275513}",neutral +mudah rezeki buat,3,,"{'label': 'positive', 'score': 0.9999567270278931}",positive +memang bikin serba satset sih krn banyak fitur tarik mudah beli pulsa topup shoopepay bayar tagih fitur favorit qris dong krn praktis aman amp,24,,"{'label': 'positive', 'score': 0.9998524188995361}",positive +fitur qris aku suka karna gak mau ribet pegang uang cash kembali apalgi sekarang serba canggih mau beli sayur qris aplikasi shopeepaynya satset gak lot,25,,"{'label': 'positive', 'score': 0.9999417066574097}",positive +qris dong mudah aman fleksibel gak tinggal promonya,8,,"{'label': 'positive', 'score': 0.9999098777770996}",positive +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +saldo shopee pay kok gamasuk anj gue top ovo udh potong hasil coy gede bngt nom nya fak,18,,"{'label': 'negative', 'score': 0.9999043941497803}",negative +commerce indonesia kerja bener apa utama shopee tuh,8,,"{'label': 'positive', 'score': 0.9997691512107849}",positive +gue gtu mana,3,,"{'label': 'negative', 'score': 0.9992832541465759}",negative +iyaa soal aku mau pake spay aneh bgt sumpah saldo gak cukup padahal total napa,15,,"{'label': 'negative', 'score': 0.9998986721038818}",negative +min spaylater gua transaksi scam kayak hack akun shopee gua,10,,"{'label': 'negative', 'score': 0.9998014569282532}",negative +ihhh kak ngeselin bngt sumpah sini aku bantu tag biar cepet tindak lanjut weh gimana shopee tanggung jawab,18,,"{'label': 'negative', 'score': 0.9999123811721802}",negative +hai kak maaf kak udah bikin nyaman kait beli token guna voucher cashback koin blm masuk mimin bantu cek lanjut infoin username shopee kendala kakak social media mimin tunggu,29,,"{'label': 'neutral', 'score': 0.9998883008956909}",neutral +jelek,1,,"{'label': 'negative', 'score': 0.9999189376831055}",negative +sama gitu terus,3,,"{'label': 'negative', 'score': 0.9996401071548462}",negative +kok allah kamu posisi seller,5,,"{'label': 'positive', 'score': 0.49059003591537476}",positive +gaji seru,2,,"{'label': 'positive', 'score': 0.9999557733535767}",positive +topup shopee masuk,3,,"{'label': 'neutral', 'score': 0.999803364276886}",neutral +kak mjb kakak solusi gimana tetep masuk saldo,8,,"{'label': 'neutral', 'score': 0.9933451414108276}",neutral +yoii dapet mulu gua shopee wkwk,6,,"{'label': 'neutral', 'score': 0.9922304749488831}",neutral +rumah kelomang,2,,"{'label': 'negative', 'score': 0.7164725661277771}",negative +udh punya kulkas rmh buat apaa malah rmh sempitt wkwkw,10,,"{'label': 'negative', 'score': 0.9999165534973145}",negative +kalo kirim koin udh aku kasihh buat kamu ituu gimana nih shopee dah gabisa kirim koin temen,17,,"{'label': 'negative', 'score': 0.9976884126663208}",negative +bisa dapet,2,,"{'label': 'positive', 'score': 0.9999339580535889}",positive +gajelas,1,,"{'label': 'negative', 'score': 0.9999183416366577}",negative +gimana cara koin shopee banyak biar diruker shopee pay min,10,,"{'label': 'neutral', 'score': 0.9979044198989868}",neutral +kak maaf banget bantu cek top paket mohon hubung lalu whatsapp ketik ngobrol klik agent care kemudian pilih lain thanks kai,21,,"{'label': 'neutral', 'score': 0.9998600482940674}",neutral +min kok aku topup spay delay yaa brimo pas akun spay engga,12,,"{'label': 'neutral', 'score': 0.9991457462310791}",neutral +kak dont worry kait kndla mau bayar loading terus aku saranin baru applikasi shopee pastiin jaring internet stabil clear cache log out log amp,24,,"{'label': 'neutral', 'score': 0.9948746562004089}",neutral +mantap,1,,"{'label': 'positive', 'score': 0.9999573230743408}",positive +kacau sistem kalian barang stuck udah hari lebih batas maksimal estimasi barang nyampe kalo gak komplen gak bakal tindak emang sistem kalian gak ngedetect otomatis masalah kirim,27,,"{'label': 'negative', 'score': 0.99991774559021}",negative +film cuma bioskop online btw mau nonton langsung aplikasi krna pake cashback khusus guna baru tanggal juli aja yuk cek link ikut,22,,"{'label': 'neutral', 'score': 0.999895453453064}",neutral +halo nya kerja dong,4,,"{'label': 'neutral', 'score': 0.9032624959945679}",neutral +gimana nih solusi,3,,"{'label': 'negative', 'score': 0.9947269558906555}",negative +kenapaa paket henti gaada progres apa min,7,,"{'label': 'negative', 'score': 0.9998892545700073}",negative +ntar blokir jemaah seller pindah platform repot bro yuk akun preman kaya gni ditindaak tegassss yuk yuk,17,,"{'label': 'negative', 'score': 0.9998549222946167}",negative +gmn min uda jam,4,,"{'label': 'neutral', 'score': 0.9982293248176575}",neutral +udah biaya aja pinta parkir,5,,"{'label': 'negative', 'score': 0.9992432594299316}",negative +besok udh bnyk pol duit nya kek transparan gamau kasih spay apa,12,,"{'label': 'negative', 'score': 0.9767155051231384}",negative +status hasil saldo tapcash bni gak nambah gimana sampe skrg gak masuk saldo,13,,"{'label': 'negative', 'score': 0.9998026490211487}",negative +kak maaf udh bikin kaka risau kaka unlink akun shopeepay kakak dulu dgn cara buka atur shopeepay amp,18,,"{'label': 'neutral', 'score': 0.9254440665245056}",neutral +hai kak mohon maaf kait kendala bayar dgn shopeepay mohon pasti saldo shopeepay kakak milik cukup subtotal jumlah produk ongkos kirim biaya layan biaya tangan kak moga bantu,28,,"{'label': 'neutral', 'score': 0.9998162388801575}",neutral +nya berapa lama dong cancel aja,6,,"{'label': 'negative', 'score': 0.9999009370803833}",negative +min mana cashback koin shopeepay lumayan min koin lho udah mau tiga hari lho min,15,,"{'label': 'neutral', 'score': 0.9998739957809448}",neutral +kak mau turunin limit spaylater,5,,"{'label': 'neutral', 'score': 0.6526186466217041}",neutral +cek lgi min,3,,"{'label': 'neutral', 'score': 0.9998692274093628}",neutral +makasih info,2,,"{'label': 'positive', 'score': 0.9996931552886963}",positive +pasti sobat bri hubung nomor layan resmi contact bri sabrina whatsapp akun resmi media sosial bri verifikasi tks chesy,19,,"{'label': 'neutral', 'score': 0.9999006986618042}",neutral +sobat bri mohon selalu jaga rahasia data perban pin username password otp cvv cvc qlola token jangan memberitahukan data sebut pihak mana masuk tugas bri,25,,"{'label': 'neutral', 'score': 0.9994945526123047}",neutral +hai sobat bri mohon maaf atas kendala transaksi alami kait kode tampil lebih batas limit hari beri sedia layan sila konfirmasi pihak merchant sedia layan kece,26,,"{'label': 'neutral', 'score': 0.998363196849823}",neutral +halo coba topup transfer shopeepay brimo kali gagal kendala jadi nya,11,,"{'label': 'neutral', 'score': 0.9994946718215942}",neutral +plis pocer gratis ongkirnya mah bukan gratis diskon doang apa ongkir sampe rebu mau beli rebu doang pake pocer tetep ongkir bukan gratis plis diskon ongkir ganti nama plis,29,,"{'label': 'negative', 'score': 0.9998044371604919}",negative +kak mohon maaf kait shopeepay potong otomatis mimin bantu kece infoin detail kendala kakak stay safe,16,,"{'label': 'neutral', 'score': 0.9998847246170044}",neutral +dihubungin nya aja kak tanya dulu,6,,"{'label': 'neutral', 'score': 0.9997850060462952}",neutral +alhamdulillah kalo salah nomor virtual gitu mungkin balik yah kak,10,,"{'label': 'neutral', 'score': 0.9998792409896851}",neutral +aku udh masuk kak nyata rekening barusan cek rekening nyata udh,11,,"{'label': 'neutral', 'score': 0.9998960494995117}",neutral +kalo salah nomor virtual akun nya kira kira bantu yah kak sama nya,13,,"{'label': 'neutral', 'score': 0.999884843826294}",neutral +bank btn kak hubungin bank btn suruh nunggu hari menangyss mana gak dikit jumlah nya,15,,"{'label': 'neutral', 'score': 0.9996052384376526}",neutral +iyaa kak aku jdnya gagal,5,,"{'label': 'negative', 'score': 0.9999158382415771}",negative +kaka transfer mana kak coba hubungin kaka,7,,"{'label': 'neutral', 'score': 0.9998965263366699}",neutral +kak aku masuk shopeepay maupun rekening yallah suruh nunggu hari capek banget,12,,"{'label': 'negative', 'score': 0.9999103546142578}",negative +semangat sukses selalu,3,,"{'label': 'positive', 'score': 0.9999570846557617}",positive +arti gagal yahhh kak,4,,"{'label': 'negative', 'score': 0.9998799562454224}",negative +mana nih kata dpt iphone,5,,"{'label': 'neutral', 'score': 0.9980168342590332}",neutral +mana nih kata check out pake shopeepay bakal dpt iphone,10,,"{'label': 'neutral', 'score': 0.9999017715454102}",neutral +kak aku jadi dikembaliin saldo dana baru masuk,8,,"{'label': 'neutral', 'score': 0.9996827840805054}",neutral +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +huhu makasiii yaaa kak,4,,"{'label': 'neutral', 'score': 0.8812118172645569}",neutral +waduh berat blm email subscribe paling telp sopi minta cancel misal auto payment twitter ngeri banyak bot gaje,18,,"{'label': 'negative', 'score': 0.9999123811721802}",negative +gmail biasa masuk notif purchase successful liat beli apaa,9,,"{'label': 'neutral', 'score': 0.9991376399993896}",neutral +biasa kalo kamu langgan gdrive all kamu langgan gdrive,9,,"{'label': 'negative', 'score': 0.999782383441925}",negative +terimakasih banyak,2,,"{'label': 'positive', 'score': 0.9990652203559875}",positive +iyaa kak aku infoin,4,,"{'label': 'neutral', 'score': 0.9998693466186523}",neutral +siap kak infoin,3,,"{'label': 'positive', 'score': 0.9296896457672119}",positive +kakkk kaloo udah masuk saldo minta infoin gakk soalnyaa aku jarang pake akun shopeenyaaa,14,,"{'label': 'neutral', 'score': 0.9997560381889343}",neutral +iya betul suruh tunggu maksimal jam panik soal aku top nya lumayan,12,,"{'label': 'neutral', 'score': 0.99980229139328}",neutral +seriuss kak aku udh top jam lewat sampe skrg dana udh potong sppay gaada,14,,"{'label': 'negative', 'score': 0.9997532963752747}",negative +iyaa gitu yaa tunggu jam masa,6,,"{'label': 'neutral', 'score': 0.8572442531585693}",neutral +huwaaa sama aku top blm masuk,6,,"{'label': 'negative', 'score': 0.9112808108329773}",negative +kak serius aku kaget bgt topup gamasuk,7,,"{'label': 'negative', 'score': 0.999889612197876}",negative +huft sebal nunggu saldo nya jam shopeepay lamaa sekali,9,,"{'label': 'negative', 'score': 0.9999144077301025}",negative +baik sama sama,3,,"{'label': 'positive', 'score': 0.7487607002258301}",positive +hai semua kampanye akhir terima kasih banyak semua bantu sebar berita distribusi hadiah akhir bulan tinjau semua komentar retweet tweet lama akhir pekan,23,,"{'label': 'neutral', 'score': 0.9998958110809326}",neutral +hai kak maaf atas kendala biaya tangan shopeepay terap biaya tangan kembang inovasi teknologi layan amp,16,,"{'label': 'neutral', 'score': 0.9998968839645386}",neutral +knp lama bgt,3,,"{'label': 'negative', 'score': 0.9999146461486816}",negative +mohon duit segera proses hampir jam lalu status proses terus cepat,11,,"{'label': 'neutral', 'score': 0.9954113364219666}",neutral +duit proses mulu jam udh jam lalu hubung nya lewat apk malah balas template aja sampe jam operasional bank sudh tutup apa coba,23,,"{'label': 'negative', 'score': 0.9999096393585205}",negative +halo guna kalo top maksimal sekali transaksi dgn biaya udh kalah jauh kelas dgn,14,,"{'label': 'negative', 'score': 0.9658941626548767}",negative +kak maaf atas kendala alami kait kendala beli token sila laku clear cache amp,14,,"{'label': 'neutral', 'score': 0.9998781681060791}",neutral +jelass tiba dpt notif email akun batas udah lapor kata akun pulih pas coba dipake dipake beli gabisa upload shopee video gabisa aku bahkan bbrp bulan belanja woyy apasih jelass,30,,"{'label': 'negative', 'score': 0.9998645782470703}",negative +cek min,2,,"{'label': 'neutral', 'score': 0.999625563621521}",neutral +orang indonesia sekarang beli apa beberapa detik kini hadir indonesia mudah beli jual crypto,14,,"{'label': 'positive', 'score': 0.9476874470710754}",positive +sampe kapan proses aju kembali dana proses,7,,"{'label': 'neutral', 'score': 0.9993576407432556}",neutral +sampe kapan dah lama bgt hampir jam,7,,"{'label': 'negative', 'score': 0.9999141693115234}",negative +cek baru helm alv ultron pro ori paket ganteng harga dapat shopee sekarang,13,,"{'label': 'neutral', 'score': 0.9998878240585327}",neutral +iya mbak buat modal nikah,5,,"{'label': 'neutral', 'score': 0.9998632669448853}",neutral +viral kini,2,,"{'label': 'negative', 'score': 0.9998941421508789}",negative +hai kak gaonme maaf bikin nyaman aku bantu cek kendala lbh lanjut infoin detail kendala kak stay safe,18,,"{'label': 'neutral', 'score': 0.9998770952224731}",neutral +hai kak userthv maaf udah buat risau kait kendala shopeepay potong prioritas kece infoin kendala kamu lalu media sosial kak stay safe,22,,"{'label': 'neutral', 'score': 0.9971122741699219}",neutral +iya kak gabisa aku udah minggu hari gabisa buat shopee akun nya,12,,"{'label': 'neutral', 'score': 0.9998239874839783}",neutral +sampe sekarang kak punya jadi aku nya lewat amun shopee mama,11,,"{'label': 'neutral', 'score': 0.9998784065246582}",neutral +iklan aplikasi menggangu bikin resah,5,,"{'label': 'negative', 'score': 0.9999164342880249}",negative +bener dong anjir banyak komplen noh kagak sengaja banget,9,,"{'label': 'negative', 'score': 0.9998908042907715}",negative +nih nama fajrul udh malu gua obrak abrik kantor anjing,10,,"{'label': 'negative', 'score': 0.9999020099639893}",negative +kak ahasa maaf buat kendala kait beli atribut kamu biar aku bantu infoin detail kendala driver kamu yaa terimakasih,19,,"{'label': 'neutral', 'score': 0.9998862743377686}",neutral +min tadi kan byr pdam app shopeepay hasil kok cek banyak app tagih lunas dah jadi bayar,17,,"{'label': 'neutral', 'score': 0.9971811771392822}",neutral +ustad,1,,"{'label': 'negative', 'score': 0.9998124241828918}",negative +kak dwiky alf mohon maaf atas ketidaknyamanannya aku dpt bantu cek infoin detail kendala kendala kakak lalu social media stay safe,21,,"{'label': 'neutral', 'score': 0.9998942613601685}",neutral +min promonya apa,3,,"{'label': 'neutral', 'score': 0.9167338609695435}",neutral +gak ngerti tulis gratis biaya admin minimal isi saldo bawah biaya admin tulis top saldo transfer bank gratis saldo masuk jangan main aku paman,24,,"{'label': 'negative', 'score': 0.9998262524604797}",negative +optimalisasi fitur beri layan baik kalo tanya info via stay safe,11,,"{'label': 'neutral', 'score': 0.8877670168876648}",neutral +kompak banget semua gak bayar tagih pdam,7,,"{'label': 'negative', 'score': 0.9751080870628357}",negative +viral vior ngemut panjang vincent,5,,"{'label': 'neutral', 'score': 0.9996705055236816}",neutral +beneran langsung tarik tunai kasir kan pakai kios soal nya dulu mau isi shopeepay suruh pakai kios dulu bodoh tanya kasir gak ajarin jadi males isi shopeepay sama cara setor tunai lewat indomaret,33,,"{'label': 'negative', 'score': 0.9999125003814697}",negative +habis belanja enak makan bakmie sini,6,,"{'label': 'positive', 'score': 0.9999549388885498}",positive +min pesan bayar indosat hifi kemaren kok masuk pihak indosat hifi padahal bayar kemarin lewat aplikasi shoope akhir wifi blokir,20,,"{'label': 'neutral', 'score': 0.9976154565811157}",neutral +bacot doang,2,,"{'label': 'negative', 'score': 0.9999154806137085}",negative +hai kak hercessra maaf yaa udh buat nyaman kait kendala kakak alami aku bantu cek infoin username transaksi kakak lalu via live chat sosmed have nice day,27,,"{'label': 'neutral', 'score': 0.9998855590820312}",neutral +topup nya topup nyaaa,4,,"{'label': 'positive', 'score': 0.9999511241912842}",positive +topup shopeepay bank btn kok masuk bank btnnya catat kirim,10,,"{'label': 'neutral', 'score': 0.9998970031738281}",neutral +lah kampret bgt shopee oke kak terima kasih banyak atas informasi nya,12,,"{'label': 'negative', 'score': 0.9998723268508911}",negative +dapet tips kata kalo mau bener langgan shopee plus akal biar langgan shopeeplus ogah bgt mending aku pake akun ortu aku biar aja didiemin aja dulu akun wkwkwk,28,,"{'label': 'negative', 'score': 0.9997934699058533}",negative +maju jawab nya sama alias template bgt,7,,"{'label': 'positive', 'score': 0.9971625208854675}",positive +mana platinum sering belanja aja kena allah gimana nasib gold ang ang ang,13,,"{'label': 'negative', 'score': 0.9997215867042542}",negative +ampunkamu udh minggu tindak shopee aku baru hari udah misuh gabisa belanja gajelas shopee emang padahal akun nya nyalahin siapa,20,,"{'label': 'negative', 'score': 0.9998923540115356}",negative +shopee lama gajelas akun platinum kena kegajelasan shopee kesel,9,,"{'label': 'negative', 'score': 0.9999182224273682}",negative +sumpah aku jiga begini mulu padahal dah minggu gak transaksi apa masa duga menyalahgunakan akun tuh apasih maksud,18,,"{'label': 'negative', 'score': 0.9999074935913086}",negative +cek hampers gift box kado oatmeal cookies jar free greeting card pita bubble wrap luckybite harga dapat shopee sekarang highly rekomen hampers packaging nya baguss bgt rasa enak,28,,"{'label': 'positive', 'score': 0.999951958656311}",positive +dua deket,2,,"{'label': 'positive', 'score': 0.9999103546142578}",positive +viral tiktok baru,3,,"{'label': 'negative', 'score': 0.9999010562896729}",negative +happyyyy pagi pagi jajanin,4,,"{'label': 'positive', 'score': 0.9990444779396057}",positive +kalo aku gabisa laku bayar kak udah hari gitu,9,,"{'label': 'negative', 'score': 0.9998278617858887}",negative +spesial kecil dapat setel koko kurta anak usia tahun desain cantik nyaman pakai harga promo batas beli sekarang nikmat diskon besar gratis ongkir link toko shopee,26,,"{'label': 'positive', 'score': 0.9998289346694946}",positive +kalo aku kaya gin terus kaa kaya emang eror shopee,10,,"{'label': 'negative', 'score': 0.9999017715454102}",negative +mlm minggu dsni aja,4,,"{'label': 'neutral', 'score': 0.999821126461029}",neutral +moots mau nanya kalian pernah alamin shopee nya kaya gin btw shopee udah hari gabisa buat apa terus admin nya tanggap sama sekali sama kasus,25,,"{'label': 'negative', 'score': 0.9997785687446594}",negative +hai kak lizinpixel maaf buat kamu nyaman kait kendala alami aku bantu cek lanjut diinfoin detail kendala lalu aku tunggu,20,,"{'label': 'neutral', 'score': 0.9998955726623535}",neutral +nentuin jarak ongkir antar mitra driver jarak tempuh rute tempuh mitra driver shopee,13,,"{'label': 'positive', 'score': 0.9970843195915222}",positive +kak ruthaps maaf buat kmu khawatir kait kendala kakka alami aku bantu infoin aku detail kendala kamu sreenshot kendala kamu aku lalu resmi yaa stay safe,26,,"{'label': 'neutral', 'score': 0.9998520612716675}",neutral +kak sjdkdsy maaf buat kmu khawatir kait kendala kakka alami aku bantu infoin aku detail kendala kamu sreenshot kendala kamu aku lalu resmi yaa stay safe,26,,"{'label': 'neutral', 'score': 0.9998327493667603}",neutral +panjang lebar jawab copas malesin ahhhhh,6,,"{'label': 'negative', 'score': 0.999915599822998}",negative +dong aplikasi shopeepay aku ngga buat scan,7,,"{'label': 'neutral', 'score': 0.9998683929443359}",neutral +nikmat promo jangan lupa cek dapat rewards bandwidth internet pakai jaring desentralisasi transparan,13,,"{'label': 'neutral', 'score': 0.9998605251312256}",neutral +kak deniyati maaf buat kmu khawatir kait kendala kakka alami aku bantu infoin aku detail kendala kamu sreenshot kendala kamu aku lalu resmi yaa stay safe,26,,"{'label': 'neutral', 'score': 0.9998478889465332}",neutral +kelantjutan nyo rajo hambar kan,5,,"{'label': 'negative', 'score': 0.9999159574508667}",negative +jakarta kena wabah zombie buah karya anak bangsa gokiiilll,9,,"{'label': 'negative', 'score': 0.9997656941413879}",negative +kalau malang mampir warles yogyakarta lembah dieng,7,,"{'label': 'positive', 'score': 0.5278415083885193}",positive +nih cari second murah,4,,"{'label': 'positive', 'score': 0.9999403953552246}",positive +udh jam nunggu masuk hello mana nih percaya kalau kejadianya kek gin ayo butuh nih nominal kecil kok jangan sedot gitu lah,22,,"{'label': 'negative', 'score': 0.9998379945755005}",negative +ayo dong ngadu nih masa ditanggepin,6,,"{'label': 'negative', 'score': 0.9998160004615784}",negative +dong bantu nunggu berapa jam biar uang masuk rekening asa masalah samsek terus kalau mau cancel banget nunggu berapa hari biar uang balik,23,,"{'label': 'negative', 'score': 0.9998323917388916}",negative +bank raya transaksi masalah tuh knp kok duit masuk shopeepay,10,,"{'label': 'negative', 'score': 0.9998698234558105}",negative +jawab dong apa nih kok lama banget transaksi,8,,"{'label': 'negative', 'score': 0.9999163150787354}",negative +shopeepay gimana transaksi jam sampe skrng masuk knp sih tahan duit orang kecewa banget bijak apa nahan transaksi estimasi masuk udh jam masuk suruh nunggu berapa lama,27,,"{'label': 'negative', 'score': 0.9999158382415771}",negative +coba kemeja basic wanita oversize link shopeenya sini,8,,"{'label': 'neutral', 'score': 0.9998829364776611}",neutral +halo sahabat mohon maaf atas ketidaknyamanannya apabila bank mandiri terima dana terima dana transfer bank mandiri pihak sifat pasif tunggu dana terima utk kemudian kredit rekening,26,,"{'label': 'neutral', 'score': 0.9998749494552612}",neutral +halo bpk ibu mohon tunggu pesan segera balas akun resmi bank mandiri dapat centang emas verified letak belah kanan nama akun jangan beri data rahasia pin angka cvv belakang kartu mpin password otp pihak,34,,"{'label': 'neutral', 'score': 0.9998692274093628}",neutral +halo baru aja laku transfer bank mandiri malah nyangkut kendala mandiri apa shopeepay mohon bantu krn butuh cepat,18,,"{'label': 'negative', 'score': 0.9931885004043579}",negative +kenya tiket konser gratis,4,,"{'label': 'neutral', 'score': 0.9981834292411804}",neutral +hai sobat seabank kamu jangan khawatir kamu sedang antre minsea segera balas kamu mohon sedia tunggu laku kece kala moga informasi bantu,22,,"{'label': 'neutral', 'score': 0.9561794400215149}",neutral +maksimal efisiensi apbn dukung ekonomi lanjut adil,7,,"{'label': 'positive', 'score': 0.9998341798782349}",positive +kaget bgt baru kali dapet koin gin makas,8,,"{'label': 'negative', 'score': 0.9998718500137329}",negative +mkan alternatif,2,,"{'label': 'positive', 'score': 0.9997832179069519}",positive +viral baru,2,,"{'label': 'negative', 'score': 0.9999067783355713}",negative +untung adaaa tweet kamu kaa aku lega karna nyari google gatau keywordnya,12,,"{'label': 'positive', 'score': 0.9998165965080261}",positive +samaa baru ngeuh ngebentak suruh baca lantang surat ingat tau lgsg matiin dehh,13,,"{'label': 'negative', 'score': 0.9999070167541504}",negative +bedaa kaa wkwk modus sama bgt wkwkwk,7,,"{'label': 'negative', 'score': 0.999901533126831}",negative +baru dpt bgt aku,4,,"{'label': 'positive', 'score': 0.9997377991676331}",positive +sepatu pdl agumy boots tactical predator cream kerja lapang pdl satpol polri,12,,"{'label': 'neutral', 'score': 0.9998855590820312}",neutral +kak ddiinnyy diny maaf bikin resah kait dana terima aku bantu blh infoin bukti detail kndl username terima kasih stay safe,21,,"{'label': 'negative', 'score': 0.998426079750061}",negative +min cdm,2,,"{'label': 'neutral', 'score': 0.9997525811195374}",neutral +tipu,1,,"{'label': 'negative', 'score': 0.9999172687530518}",negative +hai kak maaf udh bikin kakak cemas kait kendala kakak yuk segera infoin aku username shopee pesan kakak aku tunggu,20,,"{'label': 'neutral', 'score': 0.999416708946228}",neutral +kalo seprti siapa rugi jual terima salah kan sama kurir jadj retak drone jual barang sini mulus sampe sana retak sblm kirim udah vidio call sama beli,27,,"{'label': 'negative', 'score': 0.9998989105224609}",negative +install app shopeepay cuss install masukin kode pas registrasi buat dapet bonus koin kode,14,,"{'label': 'neutral', 'score': 0.9998924732208252}",neutral +kamen bal jadi songket bordir tawar kombinasi sempurna motif bordir tradisional gaya boho modern,14,,"{'label': 'neutral', 'score': 0.5731719136238098}",neutral +layan makin buruk pee jangan malas baca,7,,"{'label': 'negative', 'score': 0.9998942613601685}",negative +tipu blok aja,3,,"{'label': 'negative', 'score': 0.9999129772186279}",negative +hoak teh,2,,"{'label': 'negative', 'score': 0.9999072551727295}",negative +nipu atuh,2,,"{'label': 'negative', 'score': 0.9999088048934937}",negative +yuk mau daget banyak grup tele aku banyak banget daget game kuis tebak gambar untung kalau mau join tipu mulu ama modus bilang mau ngasih banyak padahal zonk mending buru daget,31,,"{'label': 'negative', 'score': 0.999914288520813}",negative +bantu umkm mula,3,,"{'label': 'positive', 'score': 0.9999008178710938}",positive +coklat kakak,2,,"{'label': 'positive', 'score': 0.6083083748817444}",positive +masuk salur biar dapetin diskon tambah belanja shopee viral sleman ayam,11,,"{'label': 'neutral', 'score': 0.9995112419128418}",neutral +viral janda binal full ikut linknya,6,,"{'label': 'neutral', 'score': 0.9981377124786377}",neutral +terus aplikasi shopee mohon jgn lag trs terimakasih,8,,"{'label': 'neutral', 'score': 0.9817729592323303}",neutral +transfer,1,,"{'label': 'negative', 'score': 0.9659758806228638}",negative +mantap,1,,"{'label': 'positive', 'score': 0.9999573230743408}",positive +cabe hasil kebun sendiri harga sahabat,6,,"{'label': 'neutral', 'score': 0.8675290942192078}",neutral +cek sellene perfume yasmine extrait parfum harga dapat shopee sekarang,10,,"{'label': 'neutral', 'score': 0.9998936653137207}",neutral +kak turut senang atas saldo kakak hasil masuk terus tingkat layan kakak nyaman amp,14,,"{'label': 'positive', 'score': 0.9999308586120605}",positive +kak dumpssnha maaf buat gak nyaman kait kendala kembali dana kakak aku bantu kece infoin username shopee nomor pesan lewat yaa kak sehat selalu,24,,"{'label': 'positive', 'score': 0.9953228831291199}",positive +yuliari fauzan izulhaq orang udah sinting,6,,"{'label': 'negative', 'score': 0.9998676776885986}",negative +yuliari fauzan ilham punya sakit odgj,6,,"{'label': 'neutral', 'score': 0.9998944997787476}",neutral +yuliari fauzan izzulhaq orang sinting,5,,"{'label': 'negative', 'score': 0.999893307685852}",negative +yuliari fauzan idulhaq orang waras,5,,"{'label': 'negative', 'score': 0.9997943043708801}",negative +yuliari fauzan izuhaq orang gila,5,,"{'label': 'negative', 'score': 0.9999085664749146}",negative +yuliari fauzan izulhaq manusia kaya babi,6,,"{'label': 'negative', 'score': 0.9998477697372437}",negative +yuliari fauzan izulhaq manusia jahanam,5,,"{'label': 'negative', 'score': 0.9998711347579956}",negative +yuliari fauzan izulhaq manusia biadab,5,,"{'label': 'negative', 'score': 0.9998986721038818}",negative +harga murah klik link,4,,"{'label': 'positive', 'score': 0.9991281628608704}",positive +tablet anak,2,,"{'label': 'neutral', 'score': 0.9951334595680237}",neutral +permisi min min mau refund saldo shopeepay nomer order uwse ojz mmknfsyrdw banyak karena kirim saldo nomor aktif,18,,"{'label': 'neutral', 'score': 0.9998948574066162}",neutral +rak troli plastik rak toilet rak kamar mandi rak dapur serbaguna roda rak bumbu rak susun kosmetik harga dapat shopee sekarang,21,,"{'label': 'neutral', 'score': 0.9998353719711304}",neutral +viral baru menit,3,,"{'label': 'negative', 'score': 0.9997273087501526}",negative +moga beli,2,,"{'label': 'positive', 'score': 0.9998834133148193}",positive +kak maaf buat kmu khawatir kait kendala kamu mimin bantu infoin aku detail kendala kamu sreenshot kendala kamu mimin lalu resmi yaa stay safe,24,,"{'label': 'neutral', 'score': 0.9998182654380798}",neutral +video viral bulan sutena klik link nya skrg,8,,"{'label': 'neutral', 'score': 0.9998910427093506}",neutral +kak maaf buat kmu khawatir kait kendala log kamu mimin bantu infoin aku detail kendala kamu sreenshot kendala kamu mimin lalu resmi yaa stay safe,25,,"{'label': 'neutral', 'score': 0.9997850060462952}",neutral +kak maaf buat kmu khawatir kait kendala pesnaan kamu mimin bantu infoin aku detail kendala kamu sreenshot kendala kamu mimin lalu resmi yaa stay safe,25,,"{'label': 'neutral', 'score': 0.9998180270195007}",neutral +jngan manja sama negara makanya anyink manja sama tuhan,9,,"{'label': 'negative', 'score': 0.9998471736907959}",negative +hari hari kena scam goblog untung pake nomor anon,9,,"{'label': 'negative', 'score': 0.9999023675918579}",negative +telpon polis,2,,"{'label': 'neutral', 'score': 0.9787495732307434}",neutral +udh beres blm,3,,"{'label': 'negative', 'score': 0.9918032288551331}",negative +tas bekel lucu,3,,"{'label': 'positive', 'score': 0.9999547004699707}",positive +min gimana nih min aku mau mindahin akun lama baru gabisa soal suruh verifikasi wajah terus pas verifikasi selalu wajah nali,21,,"{'label': 'negative', 'score': 0.9992052912712097}",negative +anak bawah umur perkosa brutal kejut jadi baru baru,9,,"{'label': 'negative', 'score': 0.9999070167541504}",negative +daftar affiliator shope kaya hasil affiliate,6,,"{'label': 'neutral', 'score': 0.9924443364143372}",neutral +hai kak maaf yaa udh buat nyaman kait kendala alami system normal mohon coba kak aku bantu cek infoin detail kendala kendala kakak lalu sehat selalu,26,,"{'label': 'positive', 'score': 0.9983727931976318}",positive +kak mohon maaf kait kendala jadi belum system normal mohon coba kak jadi kendala kakak terima kasih,17,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +kak mohon maaf kait kendala jadi belum jadi ganggu sistem system normal kakak coba jadi kendala kakak sehat selalu kak,20,,"{'label': 'neutral', 'score': 0.9814755916595459}",neutral +kak maaf udah buat risau kait kendala kakak kece lanjut info detail kendala username terima kasih aku tunggu,18,,"{'label': 'neutral', 'score': 0.9958977103233337}",neutral +resign kerja after nikah,4,,"{'label': 'neutral', 'score': 0.9982790946960449}",neutral +promo laku ngga min,4,,"{'label': 'positive', 'score': 0.9849362969398499}",positive +deh case segera diselesain tau kalian mau untung kalo fair gapapa lah fair banget kudu tetep bayar transaksi hotel gabisa pakai atas salah kalian,24,,"{'label': 'positive', 'score': 0.9997066855430603}",positive +kak mohon maaf kait kendala jadi belum system normal mohon coba kak jadi kendala kakak terima kasih,17,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +mjb kak pernah ambil bulan januari,6,,"{'label': 'neutral', 'score': 0.9998915195465088}",neutral +shipping fee jam tifak bayar gimana,6,,"{'label': 'negative', 'score': 0.9998881816864014}",negative +hai kak maaf yaa udh buat nyaman kait kendala alami aku bantu cek infoin detail kendala kendala kakak lalu sehat selalu,21,,"{'label': 'positive', 'score': 0.8928996324539185}",positive +kak mohon maaf atas ketidaknyamanannya kait kendala kakak aku bantu lanjut social media kirim detail kendala kak terimakasih sehat selalu kak,21,,"{'label': 'neutral', 'score': 0.9998291730880737}",neutral +asik dapet nomer tipu selidik,5,,"{'label': 'negative', 'score': 0.9998831748962402}",negative +wah baik biaya layan naik jadi,6,,"{'label': 'positive', 'score': 0.9993979930877686}",positive +nsfpnya gimanaaaa kan backdate duh pusing aku mau banget balik sistem lama udah pikirin soal nsfp,16,,"{'label': 'negative', 'score': 0.9998981952667236}",negative +siap min,2,,"{'label': 'positive', 'score': 0.9999415874481201}",positive +aku top blm nambah saldo nya sampe skrg gmn,9,,"{'label': 'negative', 'score': 0.9990910291671753}",negative +bahasa alusnya aja kakkk kalau maintanance mesti jadwal kalo tengah tengah error aja mendadakkk,14,,"{'label': 'negative', 'score': 0.9998849630355835}",negative +kapan bener nyaaa gua top transaksi hasil saldo shopee nya ganambahhhhh,11,,"{'label': 'negative', 'score': 0.6013157367706299}",negative +belumm kaakk status proses terus,5,,"{'label': 'negative', 'score': 0.9998063445091248}",negative +cepetan min mau bahan buat tugas,6,,"{'label': 'positive', 'score': 0.9194604158401489}",positive +mksdnya tdi error nyantumin biaya tangan makin mahal yee pdhal pake sopeepay mending cash ngga,15,,"{'label': 'negative', 'score': 0.9999051094055176}",negative +allaah keburuu abiss barang aku mauuu,6,,"{'label': 'negative', 'score': 0.9993739724159241}",negative +jangan lama pls aku mau barangaksjsjak,6,,"{'label': 'negative', 'score': 0.9999045133590698}",negative +pntesan aja dah panik duluan,5,,"{'label': 'negative', 'score': 0.9999206066131592}",negative +min laperrr aku min mau sen sopiputt,7,,"{'label': 'negative', 'score': 0.9998962879180908}",negative +min sampe kapan aku mau byr tagih tax,8,,"{'label': 'neutral', 'score': 0.9959497451782227}",neutral +cek please,2,,"{'label': 'neutral', 'score': 0.9994176626205444}",neutral +udah normal yaaa,3,,"{'label': 'negative', 'score': 0.94990473985672}",negative +cepetan gakkkkk gua mau instant maksimal jam,7,,"{'label': 'positive', 'score': 0.7162426710128784}",positive +error,1,,"{'label': 'negative', 'score': 0.9999186992645264}",negative +okee makas info kaa,4,,"{'label': 'neutral', 'score': 0.9600023627281189}",neutral +bro,1,,"{'label': 'positive', 'score': 0.9924524426460266}",positive +normal kapan jir mau dipake,5,,"{'label': 'neutral', 'score': 0.9996145963668823}",neutral +duhh lama bgt duit pending padahal mau buat penting min,10,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +shopee makin lama makin bobrok udah admin seller gede banget sekarang kalo mau pake gratis ongkir shopeeplus bayar sekarang pelihara sistem siang bolonggg jam sibuk,25,,"{'label': 'negative', 'score': 0.9999141693115234}",negative +apalu akun nipu,3,,"{'label': 'negative', 'score': 0.9999105930328369}",negative +udah guys,2,,"{'label': 'positive', 'score': 0.9994719624519348}",positive +minnn cepet minnn,3,,"{'label': 'positive', 'score': 0.998267412185669}",positive +sampe kapan min,3,,"{'label': 'neutral', 'score': 0.9936230778694153}",neutral +sampek kapan min yaampun takiro uang gkbisa transfer,8,,"{'label': 'negative', 'score': 0.9598544836044312}",negative +malu minn belanja dagang gabisa bayar bawa saldo shopeepay doang,10,,"{'label': 'negative', 'score': 0.9998925924301147}",negative +nga cetak resiii gimana wehhhh,5,,"{'label': 'negative', 'score': 0.9993434548377991}",negative +min sampe kapan iniii mau beliiiii kuotaaaa,7,,"{'label': 'neutral', 'score': 0.9989535808563232}",neutral +min aku lapar gak bayar anjerr,6,,"{'label': 'negative', 'score': 0.9997377991676331}",negative +beneran eror dah panik tadiiiiii,5,,"{'label': 'negative', 'score': 0.999923586845398}",negative +nyusahin banget jam gin pelihara sistem orang urgent,8,,"{'label': 'negative', 'score': 0.9999151229858398}",negative +laper min kirimin gua makan tanggung jawab,7,,"{'label': 'negative', 'score': 0.9999150037765503}",negative +pantes iiiiii beli makan gabisa bayar benci bgtttttttt malu sama layan arghhhhhh marahhhh,13,,"{'label': 'negative', 'score': 0.9999194145202637}",negative +ideee siapa ngadain pelihara sistem jam seginiii coba gua tanyaaaaaaa astaaagaaaa,11,,"{'label': 'neutral', 'score': 0.5599421858787537}",neutral +hiks laperrrr drtadi mau sopifud bayar lwt shopeepay gabisa mana gaada uang cash kalo bayar cod,16,,"{'label': 'negative', 'score': 0.9999072551727295}",negative +mau kaga keburu abis dah shopee error,7,,"{'label': 'negative', 'score': 0.9999191761016846}",negative +sampe kapan ini,3,,"{'label': 'negative', 'score': 0.9963009357452393}",negative +iya aku mau top tbtb jaring eror pdhl sinyal bagus,10,,"{'label': 'negative', 'score': 0.9998924732208252}",negative +min laper mau sopifud gmn bayar pake seabank gbs top shopeepay gbs,12,,"{'label': 'neutral', 'score': 0.999868631362915}",neutral +dritadi udh panik bgt gabisa transaksi gabisa masuk akun shopee,10,,"{'label': 'negative', 'score': 0.9998558759689331}",negative +min moga saldo ilang yaa,5,,"{'label': 'negative', 'score': 0.9940967559814453}",negative +plis woi udah diri tengah jem indomaret mau top gajadi jadi tau maintenance mana jam jam sibuk gin bjir lah,20,,"{'label': 'negative', 'score': 0.9999092817306519}",negative +berapa lama min dah beres bom,6,,"{'label': 'negative', 'score': 0.9993477463722229}",negative +lah pelihara sistem siang begini kocak,6,,"{'label': 'positive', 'score': 0.9966636300086975}",positive +min aku udah gabisa reedem promo serba ribu masa kmrn gabisa,11,,"{'label': 'negative', 'score': 0.9736447930335999}",negative +oalah pantes mau sen makan opsi shopeepay,7,,"{'label': 'negative', 'score': 0.998982846736908}",negative +segera dibenerin bayar tiket kereta takut habis,7,,"{'label': 'negative', 'score': 0.9999175071716309}",negative +aku laper,2,,"{'label': 'negative', 'score': 0.9999159574508667}",negative +kacau pantesan top nya masuk jangan lama min pelihara sistem nya,11,,"{'label': 'negative', 'score': 0.9998939037322998}",negative +niat bgt tolol nipunya semua orang reply,7,,"{'label': 'negative', 'score': 0.9999164342880249}",negative +pake mbanking gabisaaa masa,4,,"{'label': 'negative', 'score': 0.9990319013595581}",negative +serius jam sibuk malah maintenance woyy malu kaga bayar iniii ditungguin kasirr nyesel lah masukin saldo shopee semua,18,,"{'label': 'negative', 'score': 0.9999209642410278}",negative +minimal kalau mau pelihara tuh start tengah malam kek nyusahin tau ngga jam gin malah pelihara sampe panik bahkan layan hilang livin mandiri kasih tau dong sampe jam berapa,29,,"{'label': 'negative', 'score': 0.9998898506164551}",negative +mesti kokk shopee sama seabank nih pelihara sistem mah tengah malem lah bukan jam sibuk begini elah capek gue sama sopi,21,,"{'label': 'negative', 'score': 0.9998962879180908}",negative +buru benerin bgt iniii elah siang begini mana gaada pemberitahuan belum,11,,"{'label': 'negative', 'score': 0.9999076128005981}",negative +pantesan min mau bayar kok terang connection timeout core terus jadi bayar min,13,,"{'label': 'neutral', 'score': 0.7175570726394653}",neutral +knp jam gin sih pelihara sistem begini,7,,"{'label': 'negative', 'score': 0.9326063990592957}",negative +buru benerin laper,3,,"{'label': 'negative', 'score': 0.9999203681945801}",negative +shopee pay doang ngaruh resi ngeprint tdi,7,,"{'label': 'negative', 'score': 0.9942816495895386}",negative +cepetin dong orang mau bayar spinjam spaylater niat banget bikin lambat biar kena denda,14,,"{'label': 'negative', 'score': 0.999906063079834}",negative +sampe kapan estimasi kasih tau min klo live jadi bingung,10,,"{'label': 'negative', 'score': 0.9996739625930786}",negative +otak dodol sih gin pas butuh malah pelihara pecat aja orang oon mutusin pelihara jam gin jam sibuk malah dipake,20,,"{'label': 'negative', 'score': 0.9999127388000488}",negative +please lah shopee barang rufund udah acc sama punya saldo gak masuk notif tak sama sekali mana halaman kembali error mulu duit woiiii,23,,"{'label': 'negative', 'score': 0.9999186992645264}",negative +yaampun buru deh benernya mau cekout instan seburu toko tutup hadehhhhhhhh,11,,"{'label': 'negative', 'score': 0.9998897314071655}",negative +min jgn lama lama aku makan hari,7,,"{'label': 'negative', 'score': 0.9997279047966003}",negative +min laper,2,,"{'label': 'negative', 'score': 0.999909520149231}",negative +sama plis dah panik,4,,"{'label': 'negative', 'score': 0.9999204874038696}",negative +pelihara sistem harus malem min bukan pas jam sibuk gin hari senen,12,,"{'label': 'neutral', 'score': 0.6334441304206848}",neutral +sampe jam brp minn,4,,"{'label': 'neutral', 'score': 0.9547082781791687}",neutral +klik link,2,,"{'label': 'neutral', 'score': 0.999825656414032}",neutral +panik banget pelihara sistem tuh tengah malem min jangan siang bolong gin,12,,"{'label': 'negative', 'score': 0.9999052286148071}",negative +maaf min pake gofood aja keburu laper,7,,"{'label': 'negative', 'score': 0.9997476935386658}",negative +oalaah makanya bayar,3,,"{'label': 'negative', 'score': 0.9988516569137573}",negative +udah mau nang,3,,"{'label': 'negative', 'score': 0.9810432195663452}",negative +kocak,1,,"{'label': 'positive', 'score': 0.9999539852142334}",positive +panik mana,2,,"{'label': 'negative', 'score': 0.9999129772186279}",negative +jangan lama minn aku mau,5,,"{'label': 'negative', 'score': 0.999737560749054}",negative +kirain akun gua suspend,4,,"{'label': 'negative', 'score': 0.9998778104782104}",negative +jam jam gin jirrr,4,,"{'label': 'negative', 'score': 0.9997710585594177}",negative +lama min aku mau album kpop,6,,"{'label': 'negative', 'score': 0.9987918734550476}",negative +pelihara sistem harus dinihari pas orang banyak gak pake bukan malah jam sekarang mana orang banyak pake kocak bner dah,20,,"{'label': 'negative', 'score': 0.9998719692230225}",negative +ditungguin,1,,"{'label': 'negative', 'score': 0.9975693821907043}",negative +gawat nih apps error aman min,6,,"{'label': 'negative', 'score': 0.9998224377632141}",negative +iyaa barusan cari search bar keburu panik kira punya doang,10,,"{'label': 'negative', 'score': 0.9998728036880493}",negative +buru benerin plis,3,,"{'label': 'negative', 'score': 0.9999182224273682}",negative +oalaaa panteess mau jajan gbisaa bayarr,6,,"{'label': 'negative', 'score': 0.9985840320587158}",negative +plisss aku mau beli makan weee,6,,"{'label': 'positive', 'score': 0.9989663362503052}",positive +woiiii smpe nangisss saldooo disituuuuuu,5,,"{'label': 'negative', 'score': 0.999879002571106}",negative +brarti emg error kakk,4,,"{'label': 'negative', 'score': 0.9999134540557861}",negative +owalahh,1,,"{'label': 'negative', 'score': 0.9996764659881592}",negative +pantes tadi mau barang gak muncul spaynyaa sampe kapan min kaya gin,12,,"{'label': 'negative', 'score': 0.999728262424469}",negative +sampe jam berapa,3,,"{'label': 'neutral', 'score': 0.9941816926002502}",neutral +piye awan kok pelihara,4,,"{'label': 'negative', 'score': 0.9998564720153809}",negative +aku habis seabank dana shopee udah seabank gak masuk,9,,"{'label': 'neutral', 'score': 0.999487042427063}",neutral +pantess mau lewat spy status sedang proses,7,,"{'label': 'negative', 'score': 0.9985601305961609}",negative +sampe jam berapa min mau cari maem spay nya gabisa min,11,,"{'label': 'negative', 'score': 0.9965208768844604}",negative +mana chat sama telpon gabisaa bjir laah nanges,8,,"{'label': 'negative', 'score': 0.9999078512191772}",negative +kenape,1,,"{'label': 'negative', 'score': 0.8080049753189087}",negative +kak shopeepay error aku mau metode bayar spay trus aku download appnya ktnya salah sistem gabsa link,17,,"{'label': 'negative', 'score': 0.9987032413482666}",negative +gatau kak huhu aku jajan pake shupi pay tiba ilang tuh fitur ngape luuukkhh,14,,"{'label': 'negative', 'score': 0.9998350143432617}",negative +shopeepay ganggu mulu kapan selesai,5,,"{'label': 'negative', 'score': 0.9999171495437622}",negative +min kalo barang batal jual bayar virtual account tuh duit masuk,11,,"{'label': 'neutral', 'score': 0.9994375109672546}",neutral +min cepet baik dong banyak perlu nih,7,,"{'label': 'neutral', 'score': 0.6424765586853027}",neutral +dong adaa opsi bayar shopeepay nyaa gabisa wallet bank,9,,"{'label': 'neutral', 'score': 0.999784529209137}",neutral +iya sama kirain aku doang,5,,"{'label': 'negative', 'score': 0.9997944235801697}",negative +eror betulin buru butuh,4,,"{'label': 'negative', 'score': 0.9999197721481323}",negative +shopee yaa payment pake shopeepay error,6,,"{'label': 'negative', 'score': 0.9998825788497925}",negative +buru guys hott nih guru murid,6,,"{'label': 'negative', 'score': 0.9998396635055542}",negative +error kak,2,,"{'label': 'negative', 'score': 0.9999185800552368}",negative +benerin spay nya dong anjrirrr error,6,,"{'label': 'negative', 'score': 0.9999223947525024}",negative +gimana proses doang saldo potong dong gimana,7,,"{'label': 'negative', 'score': 0.9998794794082642}",negative +jawaaaaaaaaappppppp,1,,"{'label': 'positive', 'score': 0.999790370464325}",positive +siang min izin tny shopeepay error,6,,"{'label': 'negative', 'score': 0.9991907477378845}",negative +hai kak maaf banget buat alam yuk info nomor waktu jadi nama paket harga paket channel beli metode bayar capture transaksi lalu kak mimin tunggu konfirmasi salam manis tiya,29,,"{'label': 'neutral', 'score': 0.9998868703842163}",neutral +kak jadi masuk aku baru ngalamin,6,,"{'label': 'negative', 'score': 0.9968549013137817}",negative +gmn mint tbtb kok direfund dana refundnya masuk,8,,"{'label': 'negative', 'score': 0.9968506693840027}",negative +min aku top shopeepay mbanking udah success saldo nambah knp yah,11,,"{'label': 'negative', 'score': 0.9805070161819458}",negative +mint beli kuota via shopeepay bayar dah hasil kuota bom masuk,11,,"{'label': 'neutral', 'score': 0.9979544878005981}",neutral +udh batas max blm,4,,"{'label': 'neutral', 'score': 0.9998250603675842}",neutral +guys akun udah gabisa reedem promo shopeepay serba ribu masa,10,,"{'label': 'neutral', 'score': 0.9081401824951172}",neutral +klo pasar modern kan langsung datengin toko flownya beda nah klo mau kek gitu cukup belanja pasar tradisional klo belanja online bayar dulu baru buka buka sesuai silah aju refund sering kek gitu uang balik aman aja,37,,"{'label': 'positive', 'score': 0.9998418092727661}",positive +bang poin coffee khusus varian ice palm aja arti,9,,"{'label': 'neutral', 'score': 0.9998273849487305}",neutral +aku begini terus,3,,"{'label': 'positive', 'score': 0.8527434468269348}",positive +haloo aku kemaren hari aja sihh gagal akhir saldo balik,10,,"{'label': 'negative', 'score': 0.9994530081748962}",negative +spaylater kok total belanja tagih padahal cicil beda lumayan,9,,"{'label': 'negative', 'score': 0.995877742767334}",negative +emang apa,2,,"{'label': 'negative', 'score': 0.9435930252075195}",negative +abis shopeepay gopay wajar apa engga proses tadi dongg masuk masuk pernah begini,13,,"{'label': 'negative', 'score': 0.9992276430130005}",negative +haloo mau nanyaa gimana yaa udah soal aku begini mana langsung gopay nominal gede gaa ngecek dulu proses nya bepa lama,21,,"{'label': 'negative', 'score': 0.5430355668067932}",negative +kak izin promote,3,,"{'label': 'neutral', 'score': 0.9998134970664978}",neutral +brengsek nih iklan,3,,"{'label': 'negative', 'score': 0.9999203681945801}",negative +kak maaf udah buat resah kait kendala kakak alami aku bantu cek lanjut infoin transaksi username shopee lewat sosmed yaa terimakasih,21,,"{'label': 'neutral', 'score': 0.9988417029380798}",neutral +minta bantu ngetrack transaksi merchant payment lewat,7,,"{'label': 'neutral', 'score': 0.9998942613601685}",neutral +begini langsung disable layan pilih cod sebut biar belanja sistem cod situ ribet investigasi buat ngembaliin uang kurir,18,,"{'label': 'negative', 'score': 0.9998726844787598}",negative +tuju,1,,"{'label': 'positive', 'score': 0.99978107213974}",positive +hai kak mohon maaf atas ketidaknyamanannya kait kendala kaka alami cek lanjut mohon info detail kendala lalu media sosial tunggu,20,,"{'label': 'neutral', 'score': 0.9998927116394043}",neutral +bls aja min,3,,"{'label': 'negative', 'score': 0.9998526573181152}",negative +min cara transfer saldo shopeepay indo shopeepay malaysia gimana,9,,"{'label': 'neutral', 'score': 0.9997813105583191}",neutral +min tlg baca,3,,"{'label': 'neutral', 'score': 0.9998716115951538}",neutral +viral,1,,"{'label': 'negative', 'score': 0.9999027252197266}",negative +kak akun buat dong kak,5,,"{'label': 'neutral', 'score': 0.9998694658279419}",neutral +lucu imut,2,,"{'label': 'positive', 'score': 0.9999580383300781}",positive +shopee udah gold malah ubah turun silver,7,,"{'label': 'neutral', 'score': 0.9536495804786682}",neutral +transfer gopay kok bom masuk masuk lama cek inbox kirim kode transaksi,12,,"{'label': 'negative', 'score': 0.9997144341468811}",negative +joan ikut neng kalo udah bayar tagih makasih yaa kak udah pake indihome joan,14,,"{'label': 'neutral', 'score': 0.9998562335968018}",neutral +dah min jadi bayar lewat shopeepay thanks,7,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +iyaa kudu wajib suspend biar korban,6,,"{'label': 'negative', 'score': 0.9985896944999695}",negative +hai kak maaf udah buat kakak gak nyaman aku bantu infoin detail kendala kendala kakak stay safe kak,18,,"{'label': 'neutral', 'score': 0.999767005443573}",neutral +update temen temen gue spam monyet langsung block nomer ngeblock cuma nomer pribadi nomor nomor buat nipu block gue kakak udah suspend acc,23,,"{'label': 'negative', 'score': 0.9999135732650757}",negative +hai kak maaf buat kendala yuk sampai detail data transaksi lalu keluh kakak sebut mimin bantu terusin kak selalu waspada kak akun resmi twitter bni centang emas verified belah nama akun bukan photo profile,34,,"{'label': 'neutral', 'score': 0.9991167187690735}",neutral +akun spotify canva pro lain ready murmerr kuy,8,,"{'label': 'neutral', 'score': 0.9998766183853149}",neutral +hai kak maaf buat kamu gak nyaman kait kendala bayar kakak proses aku bantu cek infoin aku bukti bayar lalu terima kasih hubung shopee sehat selalu,26,,"{'label': 'positive', 'score': 0.999646782875061}",positive +halo min kemarin laku transaksi lewat shopepay bri bayar sekolah anak sekarang proses sedang proses terus min buat bayar sekolah gimana nih min solusi,24,,"{'label': 'negative', 'score': 0.9986629486083984}",negative +cara dapat vocher shopeepay,4,,"{'label': 'neutral', 'score': 0.9998149275779724}",neutral +cara dapatin uang sedikit penting konsisten,6,,"{'label': 'neutral', 'score': 0.8427751660346985}",neutral +mending asli dah gercep balesnya banding lama betttt gue kaga dibales bizi banget kek,14,,"{'label': 'negative', 'score': 0.9998914003372192}",negative +surabaya,1,,"{'label': 'positive', 'score': 0.996038556098938}",positive +via sosial media kak sehat selalu,6,,"{'label': 'neutral', 'score': 0.9997908473014832}",neutral +hai kak maaf udah bikin kamu risau kait kendala bayar shopeepay verifikasi aku bantu kece lanjut infoin screenshot detail transaksi username nomor pesan kakak,24,,"{'label': 'neutral', 'score': 0.9998243451118469}",neutral +anak orang boneka gemoy,4,,"{'label': 'negative', 'score': 0.9998083710670471}",negative +kak maaf udah bikin kakak enggak nyaman sama kendala kakak alami utk aku cek lanjut yuk infoin username kamu sehat selalu,21,,"{'label': 'negative', 'score': 0.829849123954773}",negative +kak mohon maaf atas ketidaknyamanannya kait kendala langgan voucher shopefood aku bantu cek aku saranin kakak meginformasikan detail kendala kakak social media sehat selalu,24,,"{'label': 'neutral', 'score': 0.9991649389266968}",neutral +kak maaf buat kmu khawatir kait kendala kakak alami aku bantu infoin aku detail kendala kamu sreenshot kendala kamu aku lalu resmi yaa stay safe,25,,"{'label': 'neutral', 'score': 0.9997770190238953}",neutral +kan sempat voucher belanja shopeepay link,6,,"{'label': 'neutral', 'score': 0.9998884201049805}",neutral +gagal top transaksi laku tgl januari sekarang jelas uang masuk gopay balas customer,13,,"{'label': 'negative', 'score': 0.9656561613082886}",negative +min spinjam error nih gimana mau bayar,7,,"{'label': 'negative', 'score': 0.9999098777770996}",negative +cowonya menang banyak viral trending,5,,"{'label': 'negative', 'score': 0.9971300959587097}",negative +anyway gue sempet makan waroenk salemba wuihh enak abis tadi hehehe bayangin gue nyasar ampe salemba sehat sehat org galak bayangin deh abang chill gin sukses deh punya cowo sabar,30,,"{'label': 'positive', 'score': 0.9999415874481201}",positive +bang udh nyuruh gue sabar ikutin emosi dah pgn bgt teriakin mau duit sana kerja tolol dah sekian guys gue muak bgt org tolol mohon perhati,26,,"{'label': 'negative', 'score': 0.9999041557312012}",negative +kak verifikasi shopeepay berapa lama kak,6,,"{'label': 'neutral', 'score': 0.9998049139976501}",neutral +hai kak maaf buat kendala kak kakak kirim kait keluh kakak kakak mimin balas mohon tunggu lebih kak waspada info kontak mengatasnamakan bni website umum akun resmi twitter bni,29,,"{'label': 'neutral', 'score': 0.9998916387557983}",neutral +apa sulit sih kasih tahu terima alloh alloh mumet,9,,"{'label': 'negative', 'score': 0.9999101161956787}",negative +hai kak mohon maaf atas ketidaknyamanannya kait kendala kamu aku bantu kece lanjut infoin aku username detail kendala lalu terima kasih,21,,"{'label': 'neutral', 'score': 0.9998867511749268}",neutral +hai kak baik kak perlu khawatir kakak mimin balas kak mohon tunggu selalu jaga rahasia data pribadi kakak hati hati info kontak mengatasnamakan bni website umum twitter resmi bni centang emas verified,32,,"{'label': 'neutral', 'score': 0.9997619986534119}",neutral +saldo tahan lumayan banyak kalau kaya gin rugi dong cust,10,,"{'label': 'negative', 'score': 0.9995019435882568}",negative +halo admin gmn saldo satu masuk bagaiman pertanggungjawaban nya thanks,10,,"{'label': 'neutral', 'score': 0.9998457431793213}",neutral +yuk gabung grup tele racun shopee,6,,"{'label': 'neutral', 'score': 0.9998892545700073}",neutral +ngebug parah nih mungkin tim developer nya butuh bonus libur total checkout gak buat bayar disable,16,,"{'label': 'negative', 'score': 0.9998904466629028}",negative +viral baru link bawah,4,,"{'label': 'negative', 'score': 0.9977401494979858}",negative +kak maaf banget udah buat kamu nyaman kait kendala kamu aku infoin kamu chat aku lalu social media dgn lampir detail kronologi username sehat selalu,25,,"{'label': 'neutral', 'score': 0.9072767496109009}",neutral +lihat langkap,2,,"{'label': 'negative', 'score': 0.9998101592063904}",negative +cek sandal jepit pria triglav sandal gunung pria triglav original,10,,"{'label': 'neutral', 'score': 0.9997077584266663}",neutral +hai kak baik kak tunggu kakak mimin respon jaga selalu rahasia data pribadi kakak waspada info kontak mengatasnamakan bni website umum akun resmi twitter bni centang emas verified belah nama akun bukan photo,33,,"{'label': 'neutral', 'score': 0.9998594522476196}",neutral +kalian punya team berantas tipu gak sih,7,,"{'label': 'negative', 'score': 0.9999010562896729}",negative +min hari tagih paylater jatuh tempo duit nya mas nyangkut solusi nya gimana nih blm respon padahal kmrn selisih jam udh dibales dong pihak solusi nya gimana,27,,"{'label': 'negative', 'score': 0.9998719692230225}",negative +oke kak jangan khawatir aku cek kakak satu per satu tunggu yaa sehat selalu,14,,"{'label': 'positive', 'score': 0.9909352660179138}",positive +halo min cek terima kasih,5,,"{'label': 'neutral', 'score': 0.9998959302902222}",neutral +ikut yuk,2,,"{'label': 'positive', 'score': 0.8687132596969604}",positive +min cek,2,,"{'label': 'neutral', 'score': 0.9998304843902588}",neutral +top gopay lewat masuk yaa ganggu kahhh,7,,"{'label': 'negative', 'score': 0.9998261332511902}",negative +hai kak maaf bikin nyaman kait kendala kamu alami aku bantu cek infoin detail kendala pesan danusername kamu social media aku tunggu,22,,"{'label': 'neutral', 'score': 0.9998366832733154}",neutral +hai kak maaf bikin nyaman kait kendala kamu alami aku bantu cek infoin detail kendala kamu social media aku tunggu,20,,"{'label': 'neutral', 'score': 0.9998842477798462}",neutral +heyy apa maksudnu nahh padahal cukup lohh saldo woii,9,,"{'label': 'negative', 'score': 0.9998688697814941}",negative +min spaylater kapan bekuin padahal udah gada tagih,8,,"{'label': 'negative', 'score': 0.9998714923858643}",negative +gak ribet deh tinggal download aplikasi shopeepay langsung bayar qris serba ribu hemat banget buat belanja merchant sayang,18,,"{'label': 'positive', 'score': 0.9999575614929199}",positive +minta min bayar ukt segera kalo gak gak urus krs,10,,"{'label': 'neutral', 'score': 0.9998601675033569}",neutral +hai kak maaf atas ketidaknyamanannya kait kendala transfer kakak alami bantu cek kakak infoin detail social media stay safe,19,,"{'label': 'neutral', 'score': 0.9998891353607178}",neutral +hai kak maaf atas kendala kak keluh kakak alami mimin tindaklankjuti sila kakak informasi data lali mimin jaga selalu rahasia data pribadi kakak jangan infoin password banking klik link email dokumen,31,,"{'label': 'neutral', 'score': 0.997289776802063}",neutral +hari udah gigi aja kemarin ompong,6,,"{'label': 'negative', 'score': 0.9998925924301147}",negative +jadi gimana solusi,3,,"{'label': 'negative', 'score': 0.9558237195014954}",negative +mau kamar aesthetic nih rekomen lampu awan his,8,,"{'label': 'neutral', 'score': 0.999545156955719}",neutral +kak shopeepay masalah mau top muncul tulis nomerku daftar padahal bias aja kak,13,,"{'label': 'neutral', 'score': 0.9996933937072754}",neutral +mantap serba ribu,3,,"{'label': 'positive', 'score': 0.999954104423523}",positive +kak mohon maaf kait kendala kirim pesan bantu kece lbh lanjut lampir username serta dgn nomor pesan lalu terimakasih,19,,"{'label': 'neutral', 'score': 0.9998925924301147}",neutral +admin info dong aplikasi shopee gak suka ngilangin barang kalo lapor malah case nya close janji mau ngeinfo bantuin malah kabur email eeeehhh tutupin case hobi bgt aplikasi ngilangin barang,30,,"{'label': 'negative', 'score': 0.9999054670333862}",negative +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +bales chatku kalian,3,,"{'label': 'negative', 'score': 0.9997146725654602}",negative +kak lanjut gimana aku tadi ngisi saldo via mbanking isi spaynyaa,11,,"{'label': 'neutral', 'score': 0.9998950958251953}",neutral +cek,1,,"{'label': 'neutral', 'score': 0.9423424601554871}",neutral +cara menang ibu ibu,4,,"{'label': 'positive', 'score': 0.9999114274978638}",positive +masa lapor udh tgl smp skrg blm hasil,8,,"{'label': 'negative', 'score': 0.8343620896339417}",negative +jangan klik,2,,"{'label': 'negative', 'score': 0.9996663331985474}",negative +kak mohom maaf kait kendala tari dana blu terima bantu kendala kamu mohon infoin screenshot transaksi aku tunggu,18,,"{'label': 'neutral', 'score': 0.999859094619751}",neutral +fresh mau komen aja,4,,"{'label': 'neutral', 'score': 0.9904081225395203}",neutral +barusan saldo app shopeepay kok masuk saldo udah potong bantu,10,,"{'label': 'neutral', 'score': 0.9998561143875122}",neutral +kowk gtuuh,2,,"{'label': 'negative', 'score': 0.999911904335022}",negative +hmmmch bikel sdh kufolbake,4,,"{'label': 'negative', 'score': 0.9704645276069641}",negative +followb cckk akkw plzz akks udhhjhh spaammm likee smp jari ftus,11,,"{'label': 'negative', 'score': 0.9995760321617126}",negative +demmmm tnyt luuuuu,3,,"{'label': 'negative', 'score': 0.9993249177932739}",negative +engg ini,2,,"{'label': 'negative', 'score': 0.9994833469390869}",negative +owh noo bliau sdhh keluar sifat sli,7,,"{'label': 'negative', 'score': 0.9998579025268555}",negative +ubur ubur ikan lele,4,,"{'label': 'negative', 'score': 0.9965457320213318}",negative +kata lele egk kelas,4,,"{'label': 'neutral', 'score': 0.914908230304718}",neutral +gua kelas lele,3,,"{'label': 'negative', 'score': 0.9996815919876099}",negative +elu kelas kelas kakap,4,,"{'label': 'negative', 'score': 0.9998729228973389}",negative +jangan ditag guys kelas bukan endorse syopi,7,,"{'label': 'negative', 'score': 0.9998542070388794}",negative +min cek plis,3,,"{'label': 'negative', 'score': 0.999854326248169}",negative +promonya udah habis dipake pas tanggal kembar jelasin,8,,"{'label': 'negative', 'score': 0.9989898800849915}",negative +gtau,1,,"{'label': 'negative', 'score': 0.9998993873596191}",negative +emg skrg tuh sama shopeepay klik link dlu terima nya,10,,"{'label': 'neutral', 'score': 0.9998903274536133}",neutral +lihat sini,2,,"{'label': 'neutral', 'score': 0.9975419044494629}",neutral +kok aku mau scan gabisa error gas,7,,"{'label': 'negative', 'score': 0.9999109506607056}",negative +hai kak maaf buat kamu nyaman kait kendala kamu alami aku bantu yuk infoin aku detail kendala kamu social media sehat selalu,22,,"{'label': 'neutral', 'score': 0.9991493225097656}",neutral +spay error min masa aku shopeepay gopay tulis proses mulu jam sampe sekarang urgent bgt min buat bayar kostt donggg,20,,"{'label': 'negative', 'score': 0.9999109506607056}",negative +video lucu banget,3,,"{'label': 'positive', 'score': 0.9999536275863647}",positive +udah gue dibales bales,4,,"{'label': 'negative', 'score': 0.9999091625213623}",negative +kak mohon maaf bikin kakak gak nyaman kait kendala kamu alami aku bantu kakak infoin detail kendala kirim lewat yaa kak sehat selalu,23,,"{'label': 'neutral', 'score': 0.4144187867641449}",neutral +diamond murah nih,3,,"{'label': 'positive', 'score': 0.9999551773071289}",positive +tuju support terus,3,,"{'label': 'positive', 'score': 0.9993520379066467}",positive +wkwk serius duit gue ditilep bener aja min duit lumayan balesannya kaya gin gue nunggunya dah kerja bener lah perlu gue laporin pihak wajib,24,,"{'label': 'negative', 'score': 0.9998717308044434}",negative +kak goodriddamnce maaf udh bikin bingung sama kendala aku infoin hubung akun seabank dgn shopee laku satu akun kak klo tanya kait shopee jangan sungkan aku sehat selalu,28,,"{'label': 'positive', 'score': 0.9994170665740967}",positive +mau tanya kalo misal mau ganti akun shopee buat nyambungin seabank seabank sama trs kalo udah akun shopeee sblmnya disambungin akun seabank,22,,"{'label': 'neutral', 'score': 0.9998892545700073}",neutral +gram efektif tingkat sehat dukung usaha kecil,7,,"{'label': 'positive', 'score': 0.9991573095321655}",positive +pihak sama sekali gaada bantu bnr bnr cmn suruh nunggu gaada pasti udh nunggu jam ttp masuk saldo dong segera balikin dana nya entah,24,,"{'label': 'negative', 'score': 0.9999074935913086}",negative +kak maaf udah bikin kamu nyaman kait kendala transfer ewallet kamu aku bantu cek lanjut kakak aku dgn lampir bukti transfer aku kak aku tunggu terimakasih,26,,"{'label': 'neutral', 'score': 0.9998819828033447}",neutral +dri tgl smpe skrg trf ewallet dri spay gopay masuk udah chat suruh nunggu mulu hdh,16,,"{'label': 'neutral', 'score': 0.789172351360321}",neutral +nih aku kasih bocor biar harga murah,7,,"{'label': 'positive', 'score': 0.9852257370948792}",positive +syukur jangan sungkan konfirmasi kalo apa apa sama telkomselnya selalu siap bantu rai,13,,"{'label': 'neutral', 'score': 0.9997649788856506}",neutral +kontra kosong pintu masing lebar meter meter tiap kamar sekat fasilitas kamar mandi dalam lingkung bersih insyaallah aman air pdam lancar listrik watt lokasi sangiang belakang smp tangerang kota masuk listrik air,32,,"{'label': 'positive', 'score': 0.9991432428359985}",positive +mudah cuan rumah,3,,"{'label': 'positive', 'score': 0.9999476671218872}",positive +refund thanks,2,,"{'label': 'positive', 'score': 0.9911168813705444}",positive +okai min mohon liat ignya,5,,"{'label': 'neutral', 'score': 0.9998904466629028}",neutral +refund transaksi kak maaf cboa deh infoin nomernya biar bantu cek lanjut jovan,13,,"{'label': 'neutral', 'score': 0.9998874664306641}",neutral +min cara cek akun shopeepay kira hubung sama subscription gimana yaa,11,,"{'label': 'neutral', 'score': 0.9998610019683838}",neutral +kak maaf buat kmu gak nyaman kait kendala kamu aku bantu infoin detail kendala kamu sreenshot bukti top shopeepay lalu instagram stay safe,23,,"{'label': 'neutral', 'score': 0.9998152852058411}",neutral +mantap,1,,"{'label': 'positive', 'score': 0.9999573230743408}",positive +bohong program penuh manipulasi,4,,"{'label': 'negative', 'score': 0.9999198913574219}",negative +knp tambah nih spayku padahal udah topup mau barang weh masalah topupnya nominal gede,14,,"{'label': 'negative', 'score': 0.9994051456451416}",negative +link viral shopee baru,4,,"{'label': 'neutral', 'score': 0.9993563294410706}",neutral +silah cek,2,,"{'label': 'neutral', 'score': 0.999722421169281}",neutral +kak maaf buat kmu khawatir kait kendala pesan kamu aku bantu infoin aku detail kendala kamu sreenshot kendala kamu aku lalu resmi stay safe,24,,"{'label': 'neutral', 'score': 0.9997656941413879}",neutral +viral janda binal full ikut link nya,7,,"{'label': 'neutral', 'score': 0.9856097102165222}",neutral +kak maaf banget udah buat kamu nyaman kait kendala top kmu alami aku dpt bantu cek lanjut mohon infoin detail kendala kmu lalu social media resmi shopee yaa kak stay safe,31,,"{'label': 'neutral', 'score': 0.9997871518135071}",neutral +difollow terus dong min udah hari pls sejak januari kemarin chat suruh nunggu terus chat gopay malah jawab template bantu sama sekali,22,,"{'label': 'negative', 'score': 0.9986422657966614}",negative +transfer shopeepay sedang proses terus saldo potong minta kembali,9,,"{'label': 'neutral', 'score': 0.9998993873596191}",neutral +kak maaf atas ketidaknyamanannya aku bantu lanjut infoin username shopee kamu bukti transaksi detail lalu social media kak sehat selalu terimakasih hubung shopee,23,,"{'label': 'neutral', 'score': 0.9998477697372437}",neutral +siap,1,,"{'label': 'positive', 'score': 0.9999575614929199}",positive +hai kak maaf udah buat kamu resah kait kendala kamu alami aku bantu cek mohon infoin detail kendala media sosial shopee,21,,"{'label': 'neutral', 'score': 0.9996907711029053}",neutral +moga cpet offair dmalng lgi,5,,"{'label': 'negative', 'score': 0.9982374906539917}",negative +support terus,2,,"{'label': 'positive', 'score': 0.9999443292617798}",positive +gue salah apaya saldo nya tunda terus kalo kalian,9,,"{'label': 'negative', 'score': 0.9998973608016968}",negative +janda pns viral fuul ikut linknya,6,,"{'label': 'neutral', 'score': 0.8527323007583618}",neutral +kak maaf banget udah buat kakak nyaman kait kendala transfer shopeepay rekening kakak alami aku infoin kakak chat aku dgn beri username bukti transaksimelalui social media stay healthy,28,,"{'label': 'neutral', 'score': 0.9989216327667236}",neutral +maaf nih min transfer spay bca blm masuk masuk kapan tau terus hari apk shopee bca bca saldo cuma tuh error shopee apa bca nya bgt ini,27,,"{'label': 'negative', 'score': 0.9998363256454468}",negative +hai kak maaf yaa kait kendala kamu alami jangan khawatir yaa biar aku bantu lanjut infoin detail kendala aku lalu have nice day,23,,"{'label': 'neutral', 'score': 0.9997065663337708}",neutral +jam tangan original,3,,"{'label': 'positive', 'score': 0.9996623992919922}",positive +karyawan baleendah bandung gak mau layan beli qris niat mau beli pake promo shopeepay serba ribu pertama kali beli pake promo kasir bilang gak pake promo alas dapat ijin managernya,30,,"{'label': 'negative', 'score': 0.9998249411582947}",negative +tau knp udh kurang kali padahal gak laku tramsaksi apa udh nyoba lapor tpi gak relevan tolonggg,17,,"{'label': 'negative', 'score': 0.9998900890350342}",negative +plisss video nya lucu bangetttini link nya,7,,"{'label': 'positive', 'score': 0.9999196529388428}",positive +gimana min bca udah sukses gak masuk saldo spay nya,10,,"{'label': 'neutral', 'score': 0.9118656516075134}",neutral +hubung sekarang tetap mana pertanggungjawabannya,5,,"{'label': 'positive', 'score': 0.9996700286865234}",positive +abowo lindung negeri tegas kuat hukum koruptor jaga hutan,9,,"{'label': 'neutral', 'score': 0.9997277855873108}",neutral +terus coba gabisa nunggu kaya gin lama banget apa masalah sistem gimana,12,,"{'label': 'negative', 'score': 0.9998879432678223}",negative +coba bantu kemarin malam nyoba isi tap cash gabisa kaya gin terus sekarang,13,,"{'label': 'neutral', 'score': 0.999799907207489}",neutral +halo kak aku mau nanya kalau misal via spay terus nomor daftar spay karena typo tulis nomor uang kirim,19,,"{'label': 'neutral', 'score': 0.9998914003372192}",neutral +gong cai angpao lai angpao voucher aja min buat aku kan min,12,,"{'label': 'neutral', 'score': 0.9997777342796326}",neutral +sllu error dehhh masalah jaring lah inilahhh sumpaa yaaa padahall jaring nya baik baik aja liat oke oke aja tiap mau sllu gin,23,,"{'label': 'negative', 'score': 0.9999048709869385}",negative +kak maaf banget udah buat nyaman kait kendala kakak kece lanjut mohon info username kendala detail kendala aku tunggu yaa,20,,"{'label': 'neutral', 'score': 0.9994392991065979}",neutral +kenapasih sih,2,,"{'label': 'negative', 'score': 0.9997466206550598}",negative +dapet makanya min,3,,"{'label': 'positive', 'score': 0.9950247406959534}",positive +dapet huehue,2,,"{'label': 'positive', 'score': 0.9998575448989868}",positive +bagi min,2,,"{'label': 'positive', 'score': 0.9557859301567078}",positive diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index f2e2848..4c04f9d 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -87,6 +87,7 @@ + @stack('scripts') diff --git a/routes/web.php b/routes/web.php index 4ad9f2c..2b4a40c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,84 +6,41 @@ use App\Http\Controllers\InfoUserController; use App\Http\Controllers\RegisterController; use App\Http\Controllers\ResetController; use App\Http\Controllers\SessionsController; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Route; -/* -|-------------------------------------------------------------------------- -| Web Routes -|-------------------------------------------------------------------------- -| -| Here is where you can register web routes for your application. These -| routes are loaded by the RouteServiceProvider within a group which -| contains the "web" middleware group. Now create something great! -| -*/ - - Route::group(['middleware' => 'auth'], function () { - Route::get('/', [HomeController::class, 'home']); - Route::get('dashboard', function () { - return view('dashboard'); - })->name('dashboard'); + // dashboard → HomeController@index (formerly HomeController@home) + Route::get('/', [HomeController::class, 'index'])->name('dashboard'); + Route::get('/dashboard', [HomeController::class, 'index']); - Route::get('billing', function () { - return view('billing'); - })->name('billing'); + // word-cloud JSON endpoint + Route::get('/wordcloud-data', [HomeController::class, 'wordcloudData']); - Route::get('profile', function () { - return view('profile'); - })->name('profile'); + // other authenticated routes… + Route::get('billing', fn() => view('billing'))->name('billing'); + Route::get('profile', fn() => view('profile'))->name('profile'); + Route::get('rtl', fn() => view('rtl'))->name('rtl'); + Route::get('user-management', fn() => view('laravel-examples/user-management'))->name('user-management'); + Route::get('tables', fn() => view('tables'))->name('tables'); + Route::get('virtual-reality', fn() => view('virtual-reality'))->name('virtual-reality'); + Route::get('static-sign-in', fn() => view('static-sign-in'))->name('sign-in'); + Route::get('static-sign-up', fn() => view('static-sign-up'))->name('sign-up'); - Route::get('rtl', function () { - return view('rtl'); - })->name('rtl'); - - Route::get('user-management', function () { - return view('laravel-examples/user-management'); - })->name('user-management'); - - Route::get('tables', function () { - return view('tables'); - })->name('tables'); - - Route::get('virtual-reality', function () { - return view('virtual-reality'); - })->name('virtual-reality'); - - Route::get('static-sign-in', function () { - return view('static-sign-in'); - })->name('sign-in'); - - Route::get('static-sign-up', function () { - return view('static-sign-up'); - })->name('sign-up'); - - Route::get('/logout', [SessionsController::class, 'destroy']); - Route::get('/data-sentimen', [InfoUserController::class, 'create']); - Route::post('/data-sentimen', [InfoUserController::class, 'store']); - Route::get('/login', function () { - return view('dashboard'); - })->name('sign-up'); + Route::get('/logout', [SessionsController::class, 'destroy']); + Route::get('/data-sentimen', [InfoUserController::class, 'create']); + Route::post('/data-sentimen', [InfoUserController::class, 'store']); }); - - Route::group(['middleware' => 'guest'], function () { - Route::get('/register', [RegisterController::class, 'create']); - Route::post('/register', [RegisterController::class, 'store']); - Route::get('/login', [SessionsController::class, 'create']); - Route::post('/session', [SessionsController::class, 'store']); - Route::get('/login/forgot-password', [ResetController::class, 'create']); - Route::post('/forgot-password', [ResetController::class, 'sendEmail']); - Route::get('/reset-password/{token}', [ResetController::class, 'resetPass'])->name('password.reset'); - Route::post('/reset-password', [ChangePasswordController::class, 'changePassword'])->name('password.update'); - + Route::get('/register', [RegisterController::class, 'create']); + Route::post('/register', [RegisterController::class, 'store']); + Route::get('/login', [SessionsController::class, 'create']); + Route::post('/session', [SessionsController::class, 'store']); + Route::get('/login/forgot-password', [ResetController::class, 'create']); + Route::post('/forgot-password', [ResetController::class, 'sendEmail']); + Route::get('/reset-password/{token}', [ResetController::class, 'resetPass']) + ->name('password.reset'); + Route::post('/reset-password', [ChangePasswordController::class, 'changePassword']) + ->name('password.update'); }); - -Route::get('/login', function () { - return view('session/login-session'); -})->name('login'); -Route::get('/wordcloud-data', [HomeController::class, 'wordcloudData']); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index e8314a3..09ddb66 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -2774,6 +2774,78 @@ return array( 'League\\Config\\MutableConfigurationInterface' => $vendorDir . '/league/config/src/MutableConfigurationInterface.php', 'League\\Config\\ReadOnlyConfiguration' => $vendorDir . '/league/config/src/ReadOnlyConfiguration.php', 'League\\Config\\SchemaBuilderInterface' => $vendorDir . '/league/config/src/SchemaBuilderInterface.php', + 'League\\Csv\\AbstractCsv' => $vendorDir . '/league/csv/src/AbstractCsv.php', + 'League\\Csv\\Bom' => $vendorDir . '/league/csv/src/Bom.php', + 'League\\Csv\\Buffer' => $vendorDir . '/league/csv/src/Buffer.php', + 'League\\Csv\\ByteSequence' => $vendorDir . '/league/csv/src/ByteSequence.php', + 'League\\Csv\\CallbackStreamFilter' => $vendorDir . '/league/csv/src/CallbackStreamFilter.php', + 'League\\Csv\\CannotInsertRecord' => $vendorDir . '/league/csv/src/CannotInsertRecord.php', + 'League\\Csv\\CharsetConverter' => $vendorDir . '/league/csv/src/CharsetConverter.php', + 'League\\Csv\\ColumnConsistency' => $vendorDir . '/league/csv/src/ColumnConsistency.php', + 'League\\Csv\\EncloseField' => $vendorDir . '/league/csv/src/EncloseField.php', + 'League\\Csv\\EscapeFormula' => $vendorDir . '/league/csv/src/EscapeFormula.php', + 'League\\Csv\\Exception' => $vendorDir . '/league/csv/src/Exception.php', + 'League\\Csv\\FragmentFinder' => $vendorDir . '/league/csv/src/FragmentFinder.php', + 'League\\Csv\\FragmentNotFound' => $vendorDir . '/league/csv/src/FragmentNotFound.php', + 'League\\Csv\\HTMLConverter' => $vendorDir . '/league/csv/src/HTMLConverter.php', + 'League\\Csv\\HttpHeaders' => $vendorDir . '/league/csv/src/HttpHeaders.php', + 'League\\Csv\\Info' => $vendorDir . '/league/csv/src/Info.php', + 'League\\Csv\\InvalidArgument' => $vendorDir . '/league/csv/src/InvalidArgument.php', + 'League\\Csv\\JsonConverter' => $vendorDir . '/league/csv/src/JsonConverter.php', + 'League\\Csv\\MapIterator' => $vendorDir . '/league/csv/src/MapIterator.php', + 'League\\Csv\\Query\\Constraint\\Column' => $vendorDir . '/league/csv/src/Query/Constraint/Column.php', + 'League\\Csv\\Query\\Constraint\\Comparison' => $vendorDir . '/league/csv/src/Query/Constraint/Comparison.php', + 'League\\Csv\\Query\\Constraint\\Criteria' => $vendorDir . '/league/csv/src/Query/Constraint/Criteria.php', + 'League\\Csv\\Query\\Constraint\\Offset' => $vendorDir . '/league/csv/src/Query/Constraint/Offset.php', + 'League\\Csv\\Query\\Constraint\\TwoColumns' => $vendorDir . '/league/csv/src/Query/Constraint/TwoColumns.php', + 'League\\Csv\\Query\\Limit' => $vendorDir . '/league/csv/src/Query/Limit.php', + 'League\\Csv\\Query\\Ordering\\Column' => $vendorDir . '/league/csv/src/Query/Ordering/Column.php', + 'League\\Csv\\Query\\Ordering\\MultiSort' => $vendorDir . '/league/csv/src/Query/Ordering/MultiSort.php', + 'League\\Csv\\Query\\Predicate' => $vendorDir . '/league/csv/src/Query/Predicate.php', + 'League\\Csv\\Query\\PredicateCombinator' => $vendorDir . '/league/csv/src/Query/PredicateCombinator.php', + 'League\\Csv\\Query\\QueryException' => $vendorDir . '/league/csv/src/Query/QueryException.php', + 'League\\Csv\\Query\\Row' => $vendorDir . '/league/csv/src/Query/Row.php', + 'League\\Csv\\Query\\Sort' => $vendorDir . '/league/csv/src/Query/Sort.php', + 'League\\Csv\\Query\\SortCombinator' => $vendorDir . '/league/csv/src/Query/SortCombinator.php', + 'League\\Csv\\RFC4180Field' => $vendorDir . '/league/csv/src/RFC4180Field.php', + 'League\\Csv\\RdbmsResult' => $vendorDir . '/league/csv/src/RdbmsResult.php', + 'League\\Csv\\Reader' => $vendorDir . '/league/csv/src/Reader.php', + 'League\\Csv\\ResultSet' => $vendorDir . '/league/csv/src/ResultSet.php', + 'League\\Csv\\Serializer\\AfterMapping' => $vendorDir . '/league/csv/src/Serializer/AfterMapping.php', + 'League\\Csv\\Serializer\\ArrayShape' => $vendorDir . '/league/csv/src/Serializer/ArrayShape.php', + 'League\\Csv\\Serializer\\CallbackCasting' => $vendorDir . '/league/csv/src/Serializer/CallbackCasting.php', + 'League\\Csv\\Serializer\\CastToArray' => $vendorDir . '/league/csv/src/Serializer/CastToArray.php', + 'League\\Csv\\Serializer\\CastToBool' => $vendorDir . '/league/csv/src/Serializer/CastToBool.php', + 'League\\Csv\\Serializer\\CastToDate' => $vendorDir . '/league/csv/src/Serializer/CastToDate.php', + 'League\\Csv\\Serializer\\CastToEnum' => $vendorDir . '/league/csv/src/Serializer/CastToEnum.php', + 'League\\Csv\\Serializer\\CastToFloat' => $vendorDir . '/league/csv/src/Serializer/CastToFloat.php', + 'League\\Csv\\Serializer\\CastToInt' => $vendorDir . '/league/csv/src/Serializer/CastToInt.php', + 'League\\Csv\\Serializer\\CastToString' => $vendorDir . '/league/csv/src/Serializer/CastToString.php', + 'League\\Csv\\Serializer\\DenormalizationFailed' => $vendorDir . '/league/csv/src/Serializer/DenormalizationFailed.php', + 'League\\Csv\\Serializer\\Denormalizer' => $vendorDir . '/league/csv/src/Serializer/Denormalizer.php', + 'League\\Csv\\Serializer\\MapCell' => $vendorDir . '/league/csv/src/Serializer/MapCell.php', + 'League\\Csv\\Serializer\\MapRecord' => $vendorDir . '/league/csv/src/Serializer/MapRecord.php', + 'League\\Csv\\Serializer\\MappingFailed' => $vendorDir . '/league/csv/src/Serializer/MappingFailed.php', + 'League\\Csv\\Serializer\\PropertySetter' => $vendorDir . '/league/csv/src/Serializer/PropertySetter.php', + 'League\\Csv\\Serializer\\SerializationFailed' => $vendorDir . '/league/csv/src/Serializer/SerializationFailed.php', + 'League\\Csv\\Serializer\\Type' => $vendorDir . '/league/csv/src/Serializer/Type.php', + 'League\\Csv\\Serializer\\TypeCasting' => $vendorDir . '/league/csv/src/Serializer/TypeCasting.php', + 'League\\Csv\\Serializer\\TypeCastingFailed' => $vendorDir . '/league/csv/src/Serializer/TypeCastingFailed.php', + 'League\\Csv\\Serializer\\TypeCastingInfo' => $vendorDir . '/league/csv/src/Serializer/TypeCastingInfo.php', + 'League\\Csv\\Serializer\\TypeCastingTargetType' => $vendorDir . '/league/csv/src/Serializer/TypeCastingTargetType.php', + 'League\\Csv\\Statement' => $vendorDir . '/league/csv/src/Statement.php', + 'League\\Csv\\Stream' => $vendorDir . '/league/csv/src/Stream.php', + 'League\\Csv\\StreamFilter' => $vendorDir . '/league/csv/src/StreamFilter.php', + 'League\\Csv\\SwapDelimiter' => $vendorDir . '/league/csv/src/SwapDelimiter.php', + 'League\\Csv\\SyntaxError' => $vendorDir . '/league/csv/src/SyntaxError.php', + 'League\\Csv\\TabularData' => $vendorDir . '/league/csv/src/TabularData.php', + 'League\\Csv\\TabularDataReader' => $vendorDir . '/league/csv/src/TabularDataReader.php', + 'League\\Csv\\TabularDataWriter' => $vendorDir . '/league/csv/src/TabularDataWriter.php', + 'League\\Csv\\UnableToProcessCsv' => $vendorDir . '/league/csv/src/UnableToProcessCsv.php', + 'League\\Csv\\UnavailableFeature' => $vendorDir . '/league/csv/src/UnavailableFeature.php', + 'League\\Csv\\UnavailableStream' => $vendorDir . '/league/csv/src/UnavailableStream.php', + 'League\\Csv\\Writer' => $vendorDir . '/league/csv/src/Writer.php', + 'League\\Csv\\XMLConverter' => $vendorDir . '/league/csv/src/XMLConverter.php', 'League\\Flysystem\\CalculateChecksumFromStream' => $vendorDir . '/league/flysystem/src/CalculateChecksumFromStream.php', 'League\\Flysystem\\ChecksumAlgoIsNotSupported' => $vendorDir . '/league/flysystem/src/ChecksumAlgoIsNotSupported.php', 'League\\Flysystem\\ChecksumProvider' => $vendorDir . '/league/flysystem/src/ChecksumProvider.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 01c80fb..7b84850 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -35,6 +35,7 @@ return array( '7f7ac2ddea9cc3fb4b2cc201d63dbc10' => $vendorDir . '/laravel/framework/src/Illuminate/Log/functions.php', '493c6aea52f6009bab023b26c21a386a' => $vendorDir . '/laravel/framework/src/Illuminate/Support/functions.php', '58571171fd5812e6e447dce228f52f4d' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php', + '9e4824c5afbdc1482b6025ce3d4dfde8' => $vendorDir . '/league/csv/src/functions_include.php', 'c72349b1fe8d0deeedd3a52e8aa814d8' => $vendorDir . '/mockery/mockery/library/helpers.php', 'ce9671a430e4846b44e1c68c7611f9f5' => $vendorDir . '/mockery/mockery/library/Mockery.php', 'a1cfe24d14977df6878b9bf804af2d1c' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/Autoload.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 6e0796b..a069fd8 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -64,6 +64,7 @@ return array( 'League\\MimeTypeDetection\\' => array($vendorDir . '/league/mime-type-detection/src'), 'League\\Flysystem\\Local\\' => array($vendorDir . '/league/flysystem-local'), 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'), + 'League\\Csv\\' => array($vendorDir . '/league/csv/src'), 'League\\Config\\' => array($vendorDir . '/league/config/src'), 'League\\CommonMark\\' => array($vendorDir . '/league/commonmark/src'), 'Laravel\\Tinker\\' => array($vendorDir . '/laravel/tinker/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index af588c7..c33ebb0 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -36,6 +36,7 @@ class ComposerStaticInit44af905ee6d3a491d075107e62a3ab1e '7f7ac2ddea9cc3fb4b2cc201d63dbc10' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Log/functions.php', '493c6aea52f6009bab023b26c21a386a' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/functions.php', '58571171fd5812e6e447dce228f52f4d' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/helpers.php', + '9e4824c5afbdc1482b6025ce3d4dfde8' => __DIR__ . '/..' . '/league/csv/src/functions_include.php', 'c72349b1fe8d0deeedd3a52e8aa814d8' => __DIR__ . '/..' . '/mockery/mockery/library/helpers.php', 'ce9671a430e4846b44e1c68c7611f9f5' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery.php', 'a1cfe24d14977df6878b9bf804af2d1c' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/Autoload.php', @@ -128,6 +129,7 @@ class ComposerStaticInit44af905ee6d3a491d075107e62a3ab1e 'League\\MimeTypeDetection\\' => 25, 'League\\Flysystem\\Local\\' => 23, 'League\\Flysystem\\' => 17, + 'League\\Csv\\' => 11, 'League\\Config\\' => 14, 'League\\CommonMark\\' => 18, 'Laravel\\Tinker\\' => 15, @@ -421,6 +423,10 @@ class ComposerStaticInit44af905ee6d3a491d075107e62a3ab1e array ( 0 => __DIR__ . '/..' . '/league/flysystem/src', ), + 'League\\Csv\\' => + array ( + 0 => __DIR__ . '/..' . '/league/csv/src', + ), 'League\\Config\\' => array ( 0 => __DIR__ . '/..' . '/league/config/src', @@ -3310,6 +3316,78 @@ class ComposerStaticInit44af905ee6d3a491d075107e62a3ab1e 'League\\Config\\MutableConfigurationInterface' => __DIR__ . '/..' . '/league/config/src/MutableConfigurationInterface.php', 'League\\Config\\ReadOnlyConfiguration' => __DIR__ . '/..' . '/league/config/src/ReadOnlyConfiguration.php', 'League\\Config\\SchemaBuilderInterface' => __DIR__ . '/..' . '/league/config/src/SchemaBuilderInterface.php', + 'League\\Csv\\AbstractCsv' => __DIR__ . '/..' . '/league/csv/src/AbstractCsv.php', + 'League\\Csv\\Bom' => __DIR__ . '/..' . '/league/csv/src/Bom.php', + 'League\\Csv\\Buffer' => __DIR__ . '/..' . '/league/csv/src/Buffer.php', + 'League\\Csv\\ByteSequence' => __DIR__ . '/..' . '/league/csv/src/ByteSequence.php', + 'League\\Csv\\CallbackStreamFilter' => __DIR__ . '/..' . '/league/csv/src/CallbackStreamFilter.php', + 'League\\Csv\\CannotInsertRecord' => __DIR__ . '/..' . '/league/csv/src/CannotInsertRecord.php', + 'League\\Csv\\CharsetConverter' => __DIR__ . '/..' . '/league/csv/src/CharsetConverter.php', + 'League\\Csv\\ColumnConsistency' => __DIR__ . '/..' . '/league/csv/src/ColumnConsistency.php', + 'League\\Csv\\EncloseField' => __DIR__ . '/..' . '/league/csv/src/EncloseField.php', + 'League\\Csv\\EscapeFormula' => __DIR__ . '/..' . '/league/csv/src/EscapeFormula.php', + 'League\\Csv\\Exception' => __DIR__ . '/..' . '/league/csv/src/Exception.php', + 'League\\Csv\\FragmentFinder' => __DIR__ . '/..' . '/league/csv/src/FragmentFinder.php', + 'League\\Csv\\FragmentNotFound' => __DIR__ . '/..' . '/league/csv/src/FragmentNotFound.php', + 'League\\Csv\\HTMLConverter' => __DIR__ . '/..' . '/league/csv/src/HTMLConverter.php', + 'League\\Csv\\HttpHeaders' => __DIR__ . '/..' . '/league/csv/src/HttpHeaders.php', + 'League\\Csv\\Info' => __DIR__ . '/..' . '/league/csv/src/Info.php', + 'League\\Csv\\InvalidArgument' => __DIR__ . '/..' . '/league/csv/src/InvalidArgument.php', + 'League\\Csv\\JsonConverter' => __DIR__ . '/..' . '/league/csv/src/JsonConverter.php', + 'League\\Csv\\MapIterator' => __DIR__ . '/..' . '/league/csv/src/MapIterator.php', + 'League\\Csv\\Query\\Constraint\\Column' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Column.php', + 'League\\Csv\\Query\\Constraint\\Comparison' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Comparison.php', + 'League\\Csv\\Query\\Constraint\\Criteria' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Criteria.php', + 'League\\Csv\\Query\\Constraint\\Offset' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Offset.php', + 'League\\Csv\\Query\\Constraint\\TwoColumns' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/TwoColumns.php', + 'League\\Csv\\Query\\Limit' => __DIR__ . '/..' . '/league/csv/src/Query/Limit.php', + 'League\\Csv\\Query\\Ordering\\Column' => __DIR__ . '/..' . '/league/csv/src/Query/Ordering/Column.php', + 'League\\Csv\\Query\\Ordering\\MultiSort' => __DIR__ . '/..' . '/league/csv/src/Query/Ordering/MultiSort.php', + 'League\\Csv\\Query\\Predicate' => __DIR__ . '/..' . '/league/csv/src/Query/Predicate.php', + 'League\\Csv\\Query\\PredicateCombinator' => __DIR__ . '/..' . '/league/csv/src/Query/PredicateCombinator.php', + 'League\\Csv\\Query\\QueryException' => __DIR__ . '/..' . '/league/csv/src/Query/QueryException.php', + 'League\\Csv\\Query\\Row' => __DIR__ . '/..' . '/league/csv/src/Query/Row.php', + 'League\\Csv\\Query\\Sort' => __DIR__ . '/..' . '/league/csv/src/Query/Sort.php', + 'League\\Csv\\Query\\SortCombinator' => __DIR__ . '/..' . '/league/csv/src/Query/SortCombinator.php', + 'League\\Csv\\RFC4180Field' => __DIR__ . '/..' . '/league/csv/src/RFC4180Field.php', + 'League\\Csv\\RdbmsResult' => __DIR__ . '/..' . '/league/csv/src/RdbmsResult.php', + 'League\\Csv\\Reader' => __DIR__ . '/..' . '/league/csv/src/Reader.php', + 'League\\Csv\\ResultSet' => __DIR__ . '/..' . '/league/csv/src/ResultSet.php', + 'League\\Csv\\Serializer\\AfterMapping' => __DIR__ . '/..' . '/league/csv/src/Serializer/AfterMapping.php', + 'League\\Csv\\Serializer\\ArrayShape' => __DIR__ . '/..' . '/league/csv/src/Serializer/ArrayShape.php', + 'League\\Csv\\Serializer\\CallbackCasting' => __DIR__ . '/..' . '/league/csv/src/Serializer/CallbackCasting.php', + 'League\\Csv\\Serializer\\CastToArray' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToArray.php', + 'League\\Csv\\Serializer\\CastToBool' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToBool.php', + 'League\\Csv\\Serializer\\CastToDate' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToDate.php', + 'League\\Csv\\Serializer\\CastToEnum' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToEnum.php', + 'League\\Csv\\Serializer\\CastToFloat' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToFloat.php', + 'League\\Csv\\Serializer\\CastToInt' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToInt.php', + 'League\\Csv\\Serializer\\CastToString' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToString.php', + 'League\\Csv\\Serializer\\DenormalizationFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/DenormalizationFailed.php', + 'League\\Csv\\Serializer\\Denormalizer' => __DIR__ . '/..' . '/league/csv/src/Serializer/Denormalizer.php', + 'League\\Csv\\Serializer\\MapCell' => __DIR__ . '/..' . '/league/csv/src/Serializer/MapCell.php', + 'League\\Csv\\Serializer\\MapRecord' => __DIR__ . '/..' . '/league/csv/src/Serializer/MapRecord.php', + 'League\\Csv\\Serializer\\MappingFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/MappingFailed.php', + 'League\\Csv\\Serializer\\PropertySetter' => __DIR__ . '/..' . '/league/csv/src/Serializer/PropertySetter.php', + 'League\\Csv\\Serializer\\SerializationFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/SerializationFailed.php', + 'League\\Csv\\Serializer\\Type' => __DIR__ . '/..' . '/league/csv/src/Serializer/Type.php', + 'League\\Csv\\Serializer\\TypeCasting' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCasting.php', + 'League\\Csv\\Serializer\\TypeCastingFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCastingFailed.php', + 'League\\Csv\\Serializer\\TypeCastingInfo' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCastingInfo.php', + 'League\\Csv\\Serializer\\TypeCastingTargetType' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCastingTargetType.php', + 'League\\Csv\\Statement' => __DIR__ . '/..' . '/league/csv/src/Statement.php', + 'League\\Csv\\Stream' => __DIR__ . '/..' . '/league/csv/src/Stream.php', + 'League\\Csv\\StreamFilter' => __DIR__ . '/..' . '/league/csv/src/StreamFilter.php', + 'League\\Csv\\SwapDelimiter' => __DIR__ . '/..' . '/league/csv/src/SwapDelimiter.php', + 'League\\Csv\\SyntaxError' => __DIR__ . '/..' . '/league/csv/src/SyntaxError.php', + 'League\\Csv\\TabularData' => __DIR__ . '/..' . '/league/csv/src/TabularData.php', + 'League\\Csv\\TabularDataReader' => __DIR__ . '/..' . '/league/csv/src/TabularDataReader.php', + 'League\\Csv\\TabularDataWriter' => __DIR__ . '/..' . '/league/csv/src/TabularDataWriter.php', + 'League\\Csv\\UnableToProcessCsv' => __DIR__ . '/..' . '/league/csv/src/UnableToProcessCsv.php', + 'League\\Csv\\UnavailableFeature' => __DIR__ . '/..' . '/league/csv/src/UnavailableFeature.php', + 'League\\Csv\\UnavailableStream' => __DIR__ . '/..' . '/league/csv/src/UnavailableStream.php', + 'League\\Csv\\Writer' => __DIR__ . '/..' . '/league/csv/src/Writer.php', + 'League\\Csv\\XMLConverter' => __DIR__ . '/..' . '/league/csv/src/XMLConverter.php', 'League\\Flysystem\\CalculateChecksumFromStream' => __DIR__ . '/..' . '/league/flysystem/src/CalculateChecksumFromStream.php', 'League\\Flysystem\\ChecksumAlgoIsNotSupported' => __DIR__ . '/..' . '/league/flysystem/src/ChecksumAlgoIsNotSupported.php', 'League\\Flysystem\\ChecksumProvider' => __DIR__ . '/..' . '/league/flysystem/src/ChecksumProvider.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 29789e6..bd96a4b 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -2022,6 +2022,100 @@ ], "install-path": "../league/config" }, + { + "name": "league/csv", + "version": "9.23.0", + "version_normalized": "9.23.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "774008ad8a634448e4f8e288905e070e8b317ff3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/774008ad8a634448e4f8e288905e070e8b317ff3", + "reference": "774008ad8a634448e4f8e288905e070e8b317ff3", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.69.0", + "phpbench/phpbench": "^1.4.0", + "phpstan/phpstan": "^1.12.18", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.7", + "symfony/var-dumper": "^6.4.8 || ^7.2.3" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" + }, + "time": "2025-03-28T06:52:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Csv\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], + "support": { + "docs": "https://csv.thephpleague.com", + "issues": "https://github.com/thephpleague/csv/issues", + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "install-path": "../league/csv" + }, { "name": "league/flysystem", "version": "3.29.1", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 3a35a11..2e5738a 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,9 +1,9 @@ array( 'name' => 'laravel/laravel', - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'reference' => '8e91166adccbcaa340c47bd689164ad8decfe9b8', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => 'b15a1f6a46af75b89beb3103e55c58524b4078c8', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -386,9 +386,9 @@ 'dev_requirement' => false, ), 'laravel/laravel' => array( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'reference' => '8e91166adccbcaa340c47bd689164ad8decfe9b8', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => 'b15a1f6a46af75b89beb3103e55c58524b4078c8', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -457,6 +457,15 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'league/csv' => array( + 'pretty_version' => '9.23.0', + 'version' => '9.23.0.0', + 'reference' => '774008ad8a634448e4f8e288905e070e8b317ff3', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/csv', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'league/flysystem' => array( 'pretty_version' => '3.29.1', 'version' => '3.29.1.0', diff --git a/vendor/league/csv/LICENSE b/vendor/league/csv/LICENSE new file mode 100644 index 0000000..2024204 --- /dev/null +++ b/vendor/league/csv/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 ignace nyamagana butera + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/league/csv/autoload.php b/vendor/league/csv/autoload.php new file mode 100644 index 0000000..632363c --- /dev/null +++ b/vendor/league/csv/autoload.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Closure; +use Deprecated; +use Generator; +use InvalidArgumentException; +use RuntimeException; +use SplFileObject; +use Stringable; +use Throwable; + +use function filter_var; +use function get_class; +use function rawurlencode; +use function sprintf; +use function str_replace; +use function str_split; +use function strcspn; +use function strlen; + +use const FILTER_FLAG_STRIP_HIGH; +use const FILTER_FLAG_STRIP_LOW; +use const FILTER_UNSAFE_RAW; +use const STREAM_FILTER_READ; +use const STREAM_FILTER_WRITE; + +/** + * An abstract class to enable CSV document loading. + */ +abstract class AbstractCsv implements ByteSequence +{ + protected const STREAM_FILTER_MODE = STREAM_FILTER_READ; + + /** @var array collection of stream filters. */ + protected array $stream_filters = []; + protected ?Bom $input_bom = null; + protected ?Bom $output_bom = null; + protected string $delimiter = ','; + protected string $enclosure = '"'; + protected string $escape = '\\'; + protected bool $is_input_bom_included = false; + /** @var array collection of Closure to format the record before reading. */ + protected array $formatters = []; + + /** + * @final This method should not be overwritten in child classes + */ + protected function __construct(protected readonly SplFileObject|Stream $document) + { + [$this->delimiter, $this->enclosure, $this->escape] = $this->document->getCsvControl(); + $this->resetProperties(); + } + + /** + * Reset dynamic object properties to improve performance. + */ + protected function resetProperties(): void + { + } + + /** + * @throws UnavailableStream + */ + public function __clone() + { + throw UnavailableStream::dueToForbiddenCloning(static::class); + } + + /** + * Returns a new instance from a SplFileObject. + */ + public static function createFromFileObject(SplFileObject $file): static + { + return new static($file); + } + + /** + * Returns a new instance from a PHP resource stream. + * + * @param resource $stream + */ + public static function createFromStream($stream): static + { + return new static(Stream::createFromResource($stream)); + } + + /** + * Returns a new instance from a string. + */ + public static function createFromString(Stringable|string $content = ''): static + { + return new static(Stream::createFromString((string) $content)); + } + + /** + * Returns a new instance from a file path. + * + * @param resource|null $context the resource context + * + * @throws UnavailableStream + */ + public static function createFromPath(string $path, string $open_mode = 'r+', $context = null): static + { + return new static(Stream::createFromPath($path, $open_mode, $context)); + } + + /** + * Returns the current field delimiter. + */ + public function getDelimiter(): string + { + return $this->delimiter; + } + + /** + * Returns the current field enclosure. + */ + public function getEnclosure(): string + { + return $this->enclosure; + } + + /** + * Returns the pathname of the underlying document. + */ + public function getPathname(): string + { + return $this->document->getPathname(); + } + + /** + * Returns the current field escape character. + */ + public function getEscape(): string + { + return $this->escape; + } + + /** + * Returns the BOM sequence in use on Output methods. + */ + public function getOutputBOM(): string + { + return $this->output_bom?->value ?? ''; + } + + /** + * Returns the BOM sequence of the given CSV. + */ + public function getInputBOM(): string + { + if (null === $this->input_bom) { + $this->document->setFlags(SplFileObject::READ_CSV); + $this->input_bom = Bom::tryFromSequence($this->document); + } + + return $this->input_bom?->value ?? ''; + } + + /** + * Tells whether the stream filter read capabilities can be used. + */ + public function supportsStreamFilterOnRead(): bool + { + if (!$this->document instanceof Stream) { + return false; + } + + $mode = $this->document->getMode(); + + return strcspn($mode, 'r+') !== strlen($mode); + } + + /** + * Tells whether the stream filter write capabilities can be used. + */ + public function supportsStreamFilterOnWrite(): bool + { + if (!$this->document instanceof Stream) { + return false; + } + + $mode = $this->document->getMode(); + + return strcspn($mode, 'wae+') !== strlen($mode); + } + + /** + * Tells whether the specified stream filter is attached to the current stream. + */ + public function hasStreamFilter(string $filtername): bool + { + return $this->stream_filters[$filtername] ?? false; + } + + /** + * Tells whether the BOM can be stripped if presents. + */ + public function isInputBOMIncluded(): bool + { + return $this->is_input_bom_included; + } + + /** + * Returns the CSV document as a Generator of string chunk. + * + * @throws Exception if the number of bytes is less than 1 + */ + public function chunk(int $length): Generator + { + if ($length < 1) { + throw InvalidArgument::dueToInvalidChunkSize($length, __METHOD__); + } + + $this->document->rewind(); + $this->document->setFlags(0); + if (-1 === $this->document->fseek(strlen($this->getInputBOM()))) { + throw new RuntimeException('Unable to seek the document.'); + } + + yield from str_split($this->getOutputBOM().$this->document->fread($length), $length); + + while ($this->document->valid()) { + yield $this->document->fread($length); + } + } + + /** + * Retrieves the CSV content. + * + * @throws Exception If the string representation can not be returned + */ + public function toString(): string + { + $raw = ''; + foreach ($this->chunk(8192) as $chunk) { + $raw .= $chunk; + } + + return $raw; + } + + /** + * Outputs all data on the CSV file. + * + * Returns the number of characters read from the handle and passed through to the output. + * + * @throws InvalidArgumentException|Exception + */ + public function download(?string $filename = null): int + { + if (null !== $filename) { + HttpHeaders::forFileDownload($filename, 'text/csv'); + } + + $this->document->rewind(); + $this->document->setFlags(0); + if (!$this->is_input_bom_included && -1 === $this->document->fseek(strlen($this->getInputBOM()))) { + throw new RuntimeException('Unable to seek the document.'); + } + + $stream = Stream::createFromString($this->getOutputBOM()); + $stream->rewind(); + $res1 = $stream->fpassthru(); + if (false === $res1) { + throw new RuntimeException('Unable to output the document.'); + } + + $res2 = $this->document->fpassthru(); + if (false === $res2) { + throw new RuntimeException('Unable to output the document.'); + } + + return $res1 + $res2; + } + + /** + * Sets the field delimiter. + * + * @throws InvalidArgument If the Csv control character is not one character only. + */ + public function setDelimiter(string $delimiter): static + { + if ($delimiter === $this->delimiter) { + return $this; + } + + 1 === strlen($delimiter) || throw InvalidArgument::dueToInvalidDelimiterCharacter($delimiter, __METHOD__); + + $this->delimiter = $delimiter; + $this->resetProperties(); + + return $this; + } + + /** + * Sets the field enclosure. + * + * @throws InvalidArgument If the Csv control character is not one character only. + */ + public function setEnclosure(string $enclosure): static + { + if ($enclosure === $this->enclosure) { + return $this; + } + + 1 === strlen($enclosure) || throw InvalidArgument::dueToInvalidEnclosureCharacter($enclosure, __METHOD__); + + $this->enclosure = $enclosure; + $this->resetProperties(); + + return $this; + } + + /** + * Sets the field escape character. + * + * @throws InvalidArgument If the Csv control character is not one character only. + */ + public function setEscape(string $escape): static + { + if ($escape === $this->escape) { + return $this; + } + + if ('' !== $escape && 1 !== strlen($escape)) { + throw InvalidArgument::dueToInvalidEscapeCharacter($escape, __METHOD__); + } + + $this->escape = $escape; + $this->resetProperties(); + + return $this; + } + + /** + * Adds a record formatter. + * + * @param callable(array): array $formatter + */ + public function addFormatter(callable $formatter): static + { + $this->formatters[] = !$formatter instanceof Closure ? $formatter(...) : $formatter; + + return $this; + } + + /** + * Enables BOM Stripping. + */ + public function skipInputBOM(): static + { + $this->is_input_bom_included = false; + + return $this; + } + + /** + * Disables skipping Input BOM. + */ + public function includeInputBOM(): static + { + $this->is_input_bom_included = true; + + return $this; + } + + /** + * Sets the BOM sequence to prepend the CSV on output. + * + * @throws InvalidArgument if the given non-empty string is not a valid BOM sequence + */ + public function setOutputBOM(Bom|string|null $str): static + { + try { + $this->output_bom = match (true) { + $str instanceof Bom => $str, + null === $str, + '' === $str => null, + default => Bom::fromSequence($str), + }; + + return $this; + } catch (Throwable $exception) { + throw InvalidArgument::dueToInvalidBOMCharacter(__METHOD__, $exception); + } + } + + /** + * Append a stream filter. + * + * @throws InvalidArgument If the stream filter API can not be appended + * @throws UnavailableFeature If the stream filter API can not be used + */ + public function appendStreamFilterOnRead(string $filtername, mixed $params = null): static + { + $this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document)); + + $this->document->appendFilter($filtername, STREAM_FILTER_READ, $params); + $this->stream_filters[$filtername] = true; + $this->resetProperties(); + $this->input_bom = null; + + return $this; + } + + /** + * Append a stream filter. + * + * @throws InvalidArgument If the stream filter API can not be appended + * @throws UnavailableFeature If the stream filter API can not be used + */ + public function appendStreamFilterOnWrite(string $filtername, mixed $params = null): static + { + $this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document)); + + $this->document->appendFilter($filtername, STREAM_FILTER_WRITE, $params); + $this->stream_filters[$filtername] = true; + $this->resetProperties(); + $this->input_bom = null; + + return $this; + } + + /** + * Prepend a stream filter. + * + * @throws InvalidArgument If the stream filter API can not be appended + * @throws UnavailableFeature If the stream filter API can not be used + */ + public function prependStreamFilterOnWrite(string $filtername, mixed $params = null): static + { + $this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document)); + + $this->document->prependFilter($filtername, STREAM_FILTER_READ, $params); + $this->stream_filters[$filtername] = true; + $this->resetProperties(); + $this->input_bom = null; + + return $this; + } + + /** + * Prepend a stream filter. + * + * @throws InvalidArgument If the stream filter API can not be appended + * @throws UnavailableFeature If the stream filter API can not be used + */ + public function prependStreamFilterOnRead(string $filtername, mixed $params = null): static + { + $this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document)); + + $this->document->prependFilter($filtername, STREAM_FILTER_READ, $params); + $this->stream_filters[$filtername] = true; + $this->resetProperties(); + $this->input_bom = null; + + return $this; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + * @see AbstractCsv::supportsStreamFilterOnRead + * @see AbstractCsv::supportsStreamFilterOnWrite + * @codeCoverageIgnore + * + * Returns the stream filter mode. + */ + #[Deprecated(message:'use League\Csv\AbstractCsv::supportsStreamFilterOnRead() or League\Csv\AbstractCsv::supportsStreamFilterOnWrite() instead', since:'league/csv:9.7.0')] + public function getStreamFilterMode(): int + { + return static::STREAM_FILTER_MODE; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + * @see AbstractCsv::supportsStreamFilterOnRead + * @see AbstractCsv::supportsStreamFilterOnWrite + * @codeCoverageIgnore + * + * Tells whether the stream filter capabilities can be used. + */ + #[Deprecated(message:'use League\Csv\AbstractCsv::supportsStreamFilterOnRead() or League\Csv\AbstractCsv::supportsStreamFilterOnWrite() instead', since:'league/csv:9.7.0')] + public function supportsStreamFilter(): bool + { + return $this->document instanceof Stream; + } + + /** + * Retrieves the CSV content. + * + * DEPRECATION WARNING! This method will be removed in the next major point release + * + * @deprecated since version 9.7.0 + * @see AbstractCsv::toString + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\AbstractCsv::toString() instead', since:'league/csv:9.7.0')] + public function getContent(): string + { + return $this->toString(); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated since version 9.1.0 + * @see AbstractCsv::toString + * @codeCoverageIgnore + * + * Retrieves the CSV content + */ + #[Deprecated(message:'use League\Csv\AbstractCsv::toString() instead', since:'league/csv:9.1.0')] + public function __toString(): string + { + return $this->toString(); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @throws Exception if the submitted header is invalid according to RFC 6266 + * + * @see HttpHeaders::forFileDownload() + * @codeCoverageIgnore + * + * Send the CSV headers. + * + * Adapted from Symfony\Component\HttpFoundation\ResponseHeaderBag::makeDisposition + * + * @deprecated since version 9.17.0 + * @see https://tools.ietf.org/html/rfc6266#section-4.3 + */ + #[Deprecated(message:'the method no longer affect the outcome of the class, use League\Csv\HttpHeaders::forFileDownload instead', since:'league/csv:9.17.0')] + protected function sendHeaders(string $filename): void + { + if (strlen($filename) !== strcspn($filename, '\\/')) { + throw InvalidArgument::dueToInvalidHeaderFilename($filename); + } + + $flag = FILTER_FLAG_STRIP_LOW; + if (1 === preg_match('/[^\x20-\x7E]/', $filename)) { + $flag |= FILTER_FLAG_STRIP_HIGH; + } + + /** @var string $filtered_name */ + $filtered_name = filter_var($filename, FILTER_UNSAFE_RAW, $flag); + $filename_fallback = str_replace('%', '', $filtered_name); + + $disposition = sprintf('attachment; filename="%s"', str_replace('"', '\\"', $filename_fallback)); + if ($filename !== $filename_fallback) { + $disposition .= sprintf("; filename*=utf-8''%s", rawurlencode($filename)); + } + + header('Content-Type: text/csv'); + header('Content-Transfer-Encoding: binary'); + header('Content-Description: File Transfer'); + header('Content-Disposition: '.$disposition); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @codeCoverageIgnore + * @deprecated since version 9.18.0 + * @see AbstractCsv::download() + * + * Outputs all data on the CSV file. + * + * Returns the number of characters read from the handle and passed through to the output. + * + * @throws Exception + */ + #[Deprecated(message:'use League\Csv\AbstractCsv::download() instead', since:'league/csv:9.18.0')] + public function output(?string $filename = null): int + { + try { + return $this->download($filename); + } catch (InvalidArgumentException $exception) { + throw new InvalidArgument($exception->getMessage()); + } + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * @codeCoverageIgnore + * @deprecated since version 9.22.0 + * @see AbstractCsv::appendStreamFilterOnRead() + * @see AbstractCsv::appendStreamFilterOnWrite() + * + * Append a stream filter. + * + * @throws InvalidArgument If the stream filter API can not be appended + * @throws UnavailableFeature If the stream filter API can not be used + */ + #[Deprecated(message:'use League\Csv\AbstractCsv::appendStreamFilterOnRead() or League\Csv\AbstractCsv::prependStreamFilterOnRead() instead', since:'league/csv:9.18.0')] + public function addStreamFilter(string $filtername, ?array $params = null): static + { + if (STREAM_FILTER_READ === static::STREAM_FILTER_MODE) { + return $this->appendStreamFilterOnRead($filtername, $params); + } + + return $this->appendStreamFilterOnWrite($filtername, $params); + } +} diff --git a/vendor/league/csv/src/Bom.php b/vendor/league/csv/src/Bom.php new file mode 100644 index 0000000..3c42262 --- /dev/null +++ b/vendor/league/csv/src/Bom.php @@ -0,0 +1,145 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use SplFileObject; +use Stringable; +use Throwable; +use ValueError; + +enum Bom: string +{ + case Utf32Le = "\xFF\xFE\x00\x00"; + case Utf32Be = "\x00\x00\xFE\xFF"; + case Utf16Be = "\xFE\xFF"; + case Utf16Le = "\xFF\xFE"; + case Utf8 = "\xEF\xBB\xBF"; + + public static function fromSequence(mixed $sequence): self + { + return self::tryFromSequence($sequence) + ?? throw new ValueError('No BOM sequence could be found on the given sequence.'); + } + + public static function tryFromSequence(mixed $sequence): ?self + { + $str = match (true) { + $sequence instanceof SplFileObject, + $sequence instanceof Stream => self::getContents($sequence, 4, 0), + is_resource($sequence) => stream_get_contents($sequence, 4, 0), + $sequence instanceof AbstractCsv => $sequence->getInputBOM(), + $sequence instanceof Stringable, + is_string($sequence) => substr((string) $sequence, 0, 4), + default => $sequence, + }; + + if (!is_string($str) || '' === rtrim($str)) { + return null; + } + + foreach (self::cases() as $bom) { + if (str_starts_with($str, $bom->value)) { + return $bom; + } + } + + return null; + } + + private static function getContents(Stream|SplFileObject $sequence, int $length, int $offset): ?string + { + $position = $sequence->ftell(); + if (false === $position) { + return null; + } + + try { + $sequence->fseek($offset); + $str = $sequence->fread($length); + $sequence->fseek($position); + if (false === $str) { + return null; + } + + return $str; + } catch (Throwable) { + return null; + } + } + + public static function fromEncoding(string $name): self + { + return self::tryFromEncoding($name) + ?? throw new ValueError('Unknown or unsupported BOM name `'.$name.'`.'); + } + + /** + * @see https://unicode.org/faq/utf_bom.html#gen7 + */ + public static function tryFromEncoding(string $name): ?self + { + return match (strtoupper(str_replace(['_', '-'], '', $name))) { + 'UTF8' => self::Utf8, + 'UTF16', + 'UTF16BE' => self::Utf16Be, + 'UTF16LE' => self::Utf16Le, + 'UTF32', + 'UTF32BE' => self::Utf32Be, + 'UTF32LE' => self::Utf32Le, + default => null, + }; + } + + public function length(): int + { + return strlen($this->value); + } + + public function encoding(): string + { + return match ($this) { + self::Utf16Le => 'UTF-16LE', + self::Utf16Be => 'UTF-16BE', + self::Utf32Le => 'UTF-32LE', + self::Utf32Be => 'UTF-32BE', + self::Utf8 => 'UTF-8', + }; + } + + public function isUtf8(): bool + { + return match ($this) { + self::Utf8 => true, + default => false, + }; + } + + public function isUtf16(): bool + { + return match ($this) { + self::Utf16Le, + self::Utf16Be => true, + default => false, + }; + } + + public function isUtf32(): bool + { + return match ($this) { + self::Utf32Le, + self::Utf32Be => true, + default => false, + }; + } +} diff --git a/vendor/league/csv/src/Buffer.php b/vendor/league/csv/src/Buffer.php new file mode 100644 index 0000000..49de7dd --- /dev/null +++ b/vendor/league/csv/src/Buffer.php @@ -0,0 +1,487 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use CallbackFilterIterator; +use Closure; +use Iterator; +use League\Csv\Query\Constraint\Criteria; +use League\Csv\Query\Predicate; +use League\Csv\Serializer\Denormalizer; +use League\Csv\Serializer\MappingFailed; +use League\Csv\Serializer\TypeCastingFailed; +use mysqli_result; +use PDOStatement; +use PgSql\Result; +use ReflectionException; +use RuntimeException; +use SQLite3Result; + +use function array_combine; +use function array_diff; +use function array_fill_keys; +use function array_filter; +use function array_is_list; +use function array_key_exists; +use function array_key_first; +use function array_key_last; +use function array_keys; +use function array_map; +use function array_push; +use function array_reduce; +use function array_unique; +use function array_values; +use function count; +use function in_array; +use function is_int; +use function sort; + +use const ARRAY_FILTER_USE_KEY; + +final class Buffer implements TabularData +{ + public const INCLUDE_HEADER = 1; + public const EXCLUDE_HEADER = 2; + + /** @var list|array{} */ + private readonly array $header; + /** @var list|array{} */ + private readonly array $sortedHeader; + /** @var array */ + private readonly array $nullRecord; + /** @var array> */ + private array $rows = []; + /** @var array callable collection to validate the record before insertion. */ + private array $validators = []; + /** @var array collection of Closure to format the record before reading. */ + private array $formatters = []; + + /** + * @param list|array{} $header + * + * @throws SyntaxError + */ + public function __construct(array $header = []) + { + $this->header = match (true) { + !array_is_list($header) => throw new SyntaxError('The header must be a list of unique column names.'), + $header !== array_filter($header, is_string(...)) => throw SyntaxError::dueToInvalidHeaderColumnNames(), + $header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header), + default => $header, + }; + sort($header); + $this->sortedHeader = $header; + $this->nullRecord = array_fill_keys($this->header, null); + } + + /** + * Returns a new instance from a tabular data implementing object. + * + * @throws RuntimeException|SyntaxError If the column names can not be found + */ + public static function from(PDOStatement|Result|mysqli_result|SQLite3Result|TabularData $dataStorage, int $options = self::INCLUDE_HEADER): self + { + /** @var Iterator $rows */ + $rows = $dataStorage instanceof TabularData ? $dataStorage->getRecords() : RdbmsResult::rows($dataStorage); + $instance = new self(match (true) { + self::EXCLUDE_HEADER === $options => [], + $dataStorage instanceof TabularData => $dataStorage->getHeader(), + default => RdbmsResult::columnNames($dataStorage), + }); + + /** + * @var int $offset + * @var list $row + */ + foreach (new MapIterator($rows, fn (array $record): array => array_values($record)) as $offset => $row) { + $instance->rows[$offset] = $row; + } + + return $instance; + } + + /** + * @throws CannotInsertRecord + * @throws Exception + */ + public function to(TabularDataWriter $dataStorage, int $options = self::INCLUDE_HEADER): int + { + $bytes = 0; + $header = $this->getHeader(); + if (self::INCLUDE_HEADER === $options && [] !== $header) { + $bytes += $dataStorage->insertOne($header); + } + + return $bytes + $dataStorage->insertAll($this->getRecords()); + } + + public function isEmpty(): bool + { + return [] === $this->rows; + } + + public function hasHeader(): bool + { + return [] !== $this->header; + } + + public function recordCount(): int + { + return count($this->rows); + } + + /** + * @return list|array{} + */ + public function getHeader(): array + { + return $this->header; + } + + /** + * @throws SyntaxError + * + * @return Iterator + */ + public function getRecords(array $header = []): Iterator + { + $header = match (true) { + [] === $header => $this->header, + $header !== array_filter($header, is_int(...), ARRAY_FILTER_USE_KEY) => throw new SyntaxError('The header must be a list of unique column names.'), + $header !== array_filter($header, is_string(...)) => throw SyntaxError::dueToInvalidHeaderColumnNames(), + $header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header), + default => $header, + }; + + return MapIterator::fromIterable($this->rows, fn (array $row): array => $this->rowToRecord($row, $header)); + } + + /** + * @template T of object + * @param class-string $className + * @param array $header + * + * @throws Exception + * @throws MappingFailed + * @throws TypeCastingFailed + * + * @return iterator + */ + public function getRecordsAsObject(string $className, array $header = []): Iterator + { + return Denormalizer::assignAll($className, $this->getRecords($header), [] === $header ? $this->header : $header); + } + + /** + * Run a map over each container members. + * + * @template TMap + * + * @param callable(array, int): TMap $callback + * + * @throws SyntaxError + * + * @return Iterator + */ + public function map(callable $callback): Iterator + { + return MapIterator::fromIterable($this->getRecords(), $callback); + } + + /** + * @param non-negative-int $nth + * + * @throws InvalidArgument + */ + public function nth(int $nth): array + { + if ([] === ($row = $this->nthRow($nth, __METHOD__))) { + return []; + } + + return $this->rowToRecord($row, $this->header); + } + + /** + * @template T of object + * + * @param non-negative-int $nth + * @param class-string $className + * @param array $header + * + * @throws InvalidArgument + * @throws ReflectionException + */ + public function nthAsObject(int $nth, string $className, array $header = []): ?object + { + if ([] === ($row = $this->nthRow($nth, __METHOD__))) { + return null; + } + + return Denormalizer::assign($className, $this->rowToRecord($row, [] !== $header ? $header : $this->header)); + } + + public function firstOffset(): ?int + { + return array_key_first($this->rows); + } + + public function first(): array + { + return null === ($offset = $this->firstOffset()) ? [] : $this->rowToRecord($this->rows[$offset], $this->header); + } + + /** + * @param class-string $className + * @param array $header + * + * @throws ReflectionException + */ + public function firstAsObject(string $className, array $header = []): ?object + { + if ([] === ($row = $this->rows[$this->firstOffset()] ?? [])) { + return null; + } + + return Denormalizer::assign($className, $this->rowToRecord($row, [] !== $header ? $header : $this->header)); + } + + public function lastOffset(): ?int + { + return array_key_last($this->rows); + } + + public function last(): array + { + return null === ($offset = $this->lastOffset()) ? [] : $this->rowToRecord($this->rows[$offset], $this->header); + } + + /** + * @param class-string $className + * @param array $header + * + * @throws ReflectionException + */ + public function lastAsObject(string $className, array $header = []): ?object + { + if ([] === ($row = $this->rows[$this->lastOffset()] ?? [])) { + return null; + } + + return Denormalizer::assign($className, $this->rowToRecord($row, [] !== $header ? $header : $this->header)); + } + + /** + * @throws InvalidArgument + */ + private function nthRow(int $nth, string $method): array + { + -1 < $nth || throw InvalidArgument::dueToInvalidRecordOffset($nth, $method); + if (null === ($first = $this->firstOffset())) { + return []; + } + + $offset = $first + $nth; + if (!array_key_exists($offset, $this->rows)) { + return []; + } + + return $this->rows[$nth + $first]; + } + + public function fetchColumn(int|string $index = 0): Iterator + { + if (is_int($index)) { + $index > -1 || throw InvalidArgument::dueToInvalidColumnIndex($index, 'offset', __METHOD__); + [] === $this->header || array_key_exists($index, $this->header) || throw InvalidArgument::dueToInvalidColumnIndex($index, 'name', __METHOD__); + + $iterator = new MapIterator($this->getRecords(), fn (array $row) => array_values($row)); + $iterator = new CallbackFilterIterator($iterator, fn (array $row) => array_key_exists($index, $row)); + + return new MapIterator($iterator, fn (array $row) => $row[$index]); + } + + [] !== $this->header || throw InvalidArgument::dueToInvalidColumnIndex($index, 'name', __METHOD__); + in_array($index, $this->header, true) || throw InvalidArgument::dueToInvalidColumnIndex($index, 'name', __METHOD__); + + $iterator = new CallbackFilterIterator($this->getRecords(), fn (array $row) => array_key_exists($index, $row)); + + return new MapIterator($iterator, fn (array $row) => $row[$index]); + } + + /** + * Adds a record validator. + * + * @param callable(array): bool $validator + */ + public function addValidator(callable $validator, string $name): self + { + $this->validators[$name] = !$validator instanceof Closure ? $validator(...) : $validator; + + return $this; + } + + /** + * Adds a record formatter. + * + * @param callable(array): array $formatter + */ + public function addFormatter(callable $formatter): self + { + $this->formatters[] = !$formatter instanceof Closure ? $formatter(...) : $formatter; + + return $this; + } + + /** + * @throws CannotInsertRecord + */ + public function insert(array ...$records): int + { + [] !== $records || throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_insert', $records); + + array_push($this->rows, ...array_map($this->formatInsertRecord(...), $records)); + + return count($records); + } + + /** + * @throws CannotInsertRecord + * @throws SyntaxError + */ + public function update(Predicate|Closure|callable $where, array $record): int + { + $record = $this->filterUpdateRecord($record); + $updateRecord = function (array $row) use ($record): array { + foreach ($record as $index => $value) { + $row[$index] = $value; + } + + return $this->validateRecord($row); + }; + + $affectedRecords = 0; + /** @var Iterator $iterator */ + $iterator = new MapIterator(new CallbackFilterIterator($this->getRecords(), $this->filterPredicate($where)), $updateRecord); + foreach ($iterator as $offset => $row) { + $this->rows[$offset] = $row; + $affectedRecords++; + } + + return $affectedRecords; + } + + /** + * @throws SyntaxError + */ + public function delete(Predicate|Closure|callable $where): int + { + $affectedRecords = 0; + foreach (new CallbackFilterIterator($this->getRecords(), $this->filterPredicate($where)) as $offset => $row) { + unset($this->rows[$offset]); + $affectedRecords++; + } + + return $affectedRecords; + } + + public function truncate(): void + { + $this->rows = []; + } + + /** + * @throws CannotInsertRecord + */ + private function formatInsertRecord(array $record): array + { + $this->filterInsertRecord($record) || throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_insert', $record); + + return $this->validateRecord(match (true) { + [] === $this->header => !array_is_list($record) ? array_values($record) : $record, + array_is_list($record) => array_combine($this->header, $record), + default => [...$this->nullRecord, ...$record], + }); + } + + private function filterInsertRecord(array $record): bool + { + if ([] === $this->header) { + return true; + } + + if (array_is_list($record)) { + return count($record) === count($this->header); + } + + $keys = array_keys($record); + sort($keys); + + return $keys === $this->sortedHeader; + } + + /** + * @throws CannotInsertRecord + */ + private function filterUpdateRecord(array $record): array + { + [] !== $record || throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_update', $record); + if (array_is_list($record)) { + return $this->rowToRecord($record, $this->header); + } + + $keys = array_keys($record); + + return match (true) { + $keys === array_filter($keys, is_int(...)) => $record, + $keys !== array_filter($keys, is_string(...)), + [] !== array_diff($keys, $this->header) => throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_update', $record), + default => $record, + }; + } + + /** + * Validates a record. + * + * @throws CannotInsertRecord If the validation failed + */ + private function validateRecord(array $record): array + { + $record = array_reduce($this->formatters, fn (array $record, callable $formatter): array => $formatter($record), $record); + foreach ($this->validators as $name => $validator) { + true === $validator($record) || throw CannotInsertRecord::triggerOnValidation($name, $record); + } + + return !array_is_list($record) ? array_values($record) : $record; + } + + private function filterPredicate(Predicate|Closure|callable $predicate): Predicate + { + return !$predicate instanceof Predicate ? Criteria::all($predicate) : $predicate; + } + + private function rowToRecord(array $row, array $header): array + { + if ([] === $header) { + return $row; + } + + $record = []; + foreach ($header as $offset => $headerName) { + $record[$headerName] = $row[$offset] ?? null; + } + + return $record; + } +} diff --git a/vendor/league/csv/src/ByteSequence.php b/vendor/league/csv/src/ByteSequence.php new file mode 100644 index 0000000..5ddb131 --- /dev/null +++ b/vendor/league/csv/src/ByteSequence.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace League\Csv; + +use Deprecated; + +/** + * Defines constants for common BOM sequences. + * + * @deprecated since version 9.16.0 + * @see Bom + */ +interface ByteSequence +{ + #[Deprecated(message: 'use League\Csv\Bom:Utf8 instead', since: 'league/csv:9.16.0')] + public const BOM_UTF8 = "\xEF\xBB\xBF"; + #[Deprecated(message: 'use League\Csv\Bom:Utf16be instead', since: 'league/csv:9.16.0')] + public const BOM_UTF16_BE = "\xFE\xFF"; + #[Deprecated(message: 'use League\Csv\Bom:Utf16Le instead', since: 'league/csv:9.16.0')] + public const BOM_UTF16_LE = "\xFF\xFE"; + #[Deprecated(message: 'use League\Csv\Bom:Utf32Be instead', since: 'league/csv:9.16.0')] + public const BOM_UTF32_BE = "\x00\x00\xFE\xFF"; + #[Deprecated(message: 'use League\Csv\Bom:Utf32Le instead', since: 'league/csv:9.16.0')] + public const BOM_UTF32_LE = "\xFF\xFE\x00\x00"; +} diff --git a/vendor/league/csv/src/CallbackStreamFilter.php b/vendor/league/csv/src/CallbackStreamFilter.php new file mode 100644 index 0000000..2b57902 --- /dev/null +++ b/vendor/league/csv/src/CallbackStreamFilter.php @@ -0,0 +1,161 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Closure; +use LogicException; +use OutOfBoundsException; +use php_user_filter; +use ReflectionException; +use ReflectionFunction; +use RuntimeException; +use Throwable; +use ValueError; + +use function array_keys; +use function in_array; +use function restore_error_handler; +use function set_error_handler; +use function stream_bucket_append; +use function stream_bucket_make_writeable; +use function stream_bucket_new; +use function stream_filter_register; +use function stream_get_filters; + +use const PSFS_ERR_FATAL; +use const PSFS_FEED_ME; +use const PSFS_PASS_ON; + +final class CallbackStreamFilter extends php_user_filter +{ + /** @var array */ + private static array $filters = []; + + /** @var ?Closure(string, mixed): string */ + private ?Closure $callback; + + public function onCreate(): bool + { + $this->callback = self::$filters[$this->filtername] ?? null; + + return $this->callback instanceof Closure; + } + + public function onClose(): void + { + $this->callback = null; + } + + public function filter($in, $out, &$consumed, bool $closing): int + { + $data = ''; + while (null !== ($bucket = stream_bucket_make_writeable($in))) { + $data .= $bucket->data; + $consumed += $bucket->datalen; + } + + if (null === $this->callback) { + return PSFS_FEED_ME; + } + + try { + $data = ($this->callback)($data, $this->params); + } catch (Throwable $exception) { + $this->onClose(); + trigger_error('An error occurred while executing the stream filter `'.$this->filtername.'`: '.$exception->getMessage(), E_USER_WARNING); + + return PSFS_ERR_FATAL; + } + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + stream_bucket_append($out, stream_bucket_new($this->stream, $data)); + restore_error_handler(); + + return PSFS_PASS_ON; + } + + /** + * Static method to register the class as a stream filter. + * + * @param callable(string, mixed): string $callback + */ + public static function register(string $filtername, callable $callback): void + { + if (isset(self::$filters[$filtername]) || in_array($filtername, stream_get_filters(), true)) { + throw new LogicException('The stream filter "'.$filtername.'" is already registered.'); + } + + $callback = self::normalizeCallback($callback); + if (!stream_filter_register($filtername, self::class)) { + throw new RuntimeException('The stream filter "'.$filtername.'" could not be registered.'); + } + + self::$filters[$filtername] = $callback; + } + + /** + * @param callable(string, mixed): string $callback + * + * @throws ReflectionException|ValueError + * + * @return Closure(string, mixed): string + */ + private static function normalizeCallback(callable $callback): Closure + { + if (!$callback instanceof Closure) { + $callback = $callback(...); + } + + $reflection = new ReflectionFunction($callback); + if (!$reflection->isInternal()) { + return $callback; + } + + if (1 !== $reflection->getNumberOfParameters()) { + throw new ValueError('The PHP function "'.$reflection->getName().'" can not be used directly; wrap it in a callback.'); + } + + return fn (string $bucket, mixed $params): string => $callback($bucket); + } + + /** + * Tells whether a callback with the given name is already registered or not. + */ + public static function isRegistered(string $filtername): bool + { + return isset(self::$filters[$filtername]); + } + + /** + * Returns the list of registered filters. + * + * @return array + */ + public static function registeredFilternames(): array + { + return array_keys(self::$filters); + } + + /** + * Returns the closure attached to the filtername. + * + * @throws OutOfBoundsException if no callback is attached to the filter name + * + * @return Closure(string, mixed): string + */ + public static function callback(string $filtername): Closure + { + return self::$filters[$filtername] ?? throw new OutOfBoundsException('No callback is attached to the stream filter "'.$filtername.'".'); + } +} diff --git a/vendor/league/csv/src/CannotInsertRecord.php b/vendor/league/csv/src/CannotInsertRecord.php new file mode 100644 index 0000000..e89746a --- /dev/null +++ b/vendor/league/csv/src/CannotInsertRecord.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +/** + * Thrown when a data is not added to the Csv Document. + */ +class CannotInsertRecord extends Exception +{ + /** The record submitted for insertion. */ + protected array $record = []; + /** Validator which did not validate the data. */ + protected string $name = ''; + + /** + * Creates an Exception from a record insertion into a stream. + */ + public static function triggerOnInsertion(array $record): self + { + $exception = new self('Unable to write record to the CSV document'); + $exception->record = $record; + + return $exception; + } + + /** + * Creates an Exception from a Record Validation. + */ + public static function triggerOnValidation(string $name, array $record): self + { + $exception = new self('Record validation failed'); + $exception->name = $name; + $exception->record = $record; + + return $exception; + } + + /** + * Returns the validator name. + */ + public function getName(): string + { + return $this->name; + } + + /** + * Returns the invalid data submitted. + */ + public function getRecord(): array + { + return $this->record; + } +} diff --git a/vendor/league/csv/src/CharsetConverter.php b/vendor/league/csv/src/CharsetConverter.php new file mode 100644 index 0000000..e258276 --- /dev/null +++ b/vendor/league/csv/src/CharsetConverter.php @@ -0,0 +1,418 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use OutOfRangeException; +use php_user_filter; +use RuntimeException; +use Throwable; +use TypeError; + +use function array_map; +use function array_reduce; +use function get_resource_type; +use function gettype; +use function in_array; +use function is_numeric; +use function is_resource; +use function mb_convert_encoding; +use function mb_list_encodings; +use function preg_match; +use function restore_error_handler; +use function set_error_handler; +use function sprintf; +use function stream_bucket_append; +use function stream_bucket_make_writeable; +use function stream_bucket_new; +use function stream_filter_append; +use function stream_filter_prepend; +use function stream_filter_register; +use function stream_get_filters; +use function strtolower; +use function substr; + +use const PSFS_ERR_FATAL; +use const PSFS_FEED_ME; +use const PSFS_PASS_ON; +use const STREAM_FILTER_READ; +use const STREAM_FILTER_WRITE; + +/** + * Converts resource stream or tabular data content charset. + */ +class CharsetConverter extends php_user_filter +{ + public const FILTERNAME = 'convert.league.csv'; + public const BOM_SEQUENCE = 'bom_sequence'; + public const SKIP_BOM_SEQUENCE = 'skip_bom_sequence'; + + protected string $input_encoding = 'UTF-8'; + protected string $output_encoding = 'UTF-8'; + protected bool $skipBomSequence = false; + protected string $buffer = ''; + + /** + * Static method to register the class as a stream filter. + */ + public static function register(): void + { + $filter_name = self::FILTERNAME.'.*'; + + in_array($filter_name, stream_get_filters(), true) || stream_filter_register($filter_name, self::class); + } + + /** + * Static method to add the stream filter to a {@link AbstractCsv} object. + */ + public static function addTo(AbstractCsv $csv, string $input_encoding, string $output_encoding, ?array $params = null): AbstractCsv + { + self::register(); + + if ($csv instanceof Reader) { + return $csv->appendStreamFilterOnRead(self::getFiltername($input_encoding, $output_encoding), $params); + } + + return $csv->appendStreamFilterOnWrite(self::getFiltername($input_encoding, $output_encoding), $params); + } + + /** + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + public static function appendOnReadTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + return self::appendFilter($stream, STREAM_FILTER_READ, $input_encoding, $output_encoding); + } + + /** + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + public static function appendOnWriteTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + return self::appendFilter($stream, STREAM_FILTER_WRITE, $input_encoding, $output_encoding); + } + + /** + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + public static function prependOnReadTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + return self::prependFilter($stream, STREAM_FILTER_READ, $input_encoding, $output_encoding); + } + + /** + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + public static function prependOnWriteTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + return self::prependFilter($stream, STREAM_FILTER_WRITE, $input_encoding, $output_encoding); + } + + /** + * @param resource $stream + * + * @throws RuntimeException|TypeError + * + * @return resource + */ + final protected static function appendFilter(mixed $stream, int $mode, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + self::register(); + $filtername = self::getFiltername($input_encoding, $output_encoding); + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $filter = stream_filter_append(self::filterStream($stream), $filtername, $mode); + restore_error_handler(); + + is_resource($filter) || throw new RuntimeException('Could not append the registered stream filter: '.$filtername); + + return $filter; + } + + /** + * @param resource $stream + * + * @throws RuntimeException|TypeError + * + * @return resource + */ + final protected static function prependFilter(mixed $stream, int $mode, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + self::register(); + $filtername = self::getFiltername($input_encoding, $output_encoding); + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $filter = stream_filter_prepend(self::filterStream($stream), $filtername, $mode); + restore_error_handler(); + + is_resource($filter) || throw new RuntimeException('Could not append the registered stream filter: '.$filtername); + + return $filter; + } + + /** + * @param resource $stream + * + * @throws TypeError + * + * @return resource + */ + final protected static function filterStream(mixed $stream): mixed + { + is_resource($stream) || throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.'); + 'stream' === ($type = get_resource_type($stream)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given'); + + return $stream; + } + + /** + * Static method to return the stream filter filtername. + */ + public static function getFiltername(string $input_encoding, string $output_encoding): string + { + return sprintf( + '%s.%s/%s', + self::FILTERNAME, + self::filterEncoding($input_encoding), + self::filterEncoding($output_encoding) + ); + } + + /** + * Filter encoding charset. + * + * @throws OutOfRangeException if the charset is malformed or unsupported + */ + final protected static function filterEncoding(string $encoding): string + { + static $encoding_list; + + $encoding_list ??= array_reduce(mb_list_encodings(), fn (array $list, string $encoding): array => [...$list, ...[strtolower($encoding) => $encoding]], []); + + return $encoding_list[strtolower($encoding)] ?? throw new OutOfRangeException('The submitted charset '.$encoding.' is not supported by the mbstring extension.'); + } + + public function onCreate(): bool + { + $prefix = self::FILTERNAME.'.'; + if (!str_starts_with($this->filtername, $prefix)) { + return false; + } + + $encodings = substr($this->filtername, strlen($prefix)); + if (1 !== preg_match(',^(?[-\w]+)/(?[-\w]+)$,', $encodings, $matches)) { + return false; + } + + try { + $this->input_encoding = self::filterEncoding($matches['input']); + $this->output_encoding = self::filterEncoding($matches['output']); + $this->skipBomSequence = is_array($this->params) + && isset($this->params[self::BOM_SEQUENCE]) + && self::SKIP_BOM_SEQUENCE === $this->params[self::BOM_SEQUENCE]; + } catch (OutOfRangeException) { + return false; + } + + return true; + } + + public function filter($in, $out, &$consumed, bool $closing): int + { + $inputBuffer = $this->buffer; + while (null !== ($bucket = stream_bucket_make_writeable($in))) { + $inputBuffer .= $bucket->data; + $consumed += $bucket->datalen; + } + + if ('' === $inputBuffer && !$closing) { + return PSFS_FEED_ME; + } + + if ($this->skipBomSequence && null !== ($bom = Bom::tryFromSequence($inputBuffer))) { + $inputBuffer = substr($inputBuffer, $bom->length()); + } + + // if the stream content is invalid then we store it and + // ask for more content to try to correctly convert the data + if (!mb_check_encoding($inputBuffer, $this->input_encoding) && !$closing) { + $this->buffer = $inputBuffer; + + return PSFS_FEED_ME; + } + + try { + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $outputBuffer = mb_convert_encoding($inputBuffer, $this->output_encoding, $this->input_encoding); + $streamBucket = stream_bucket_new($this->stream, $outputBuffer); + stream_bucket_append($out, $streamBucket); + + return PSFS_PASS_ON; + } catch (Throwable) { + return PSFS_ERR_FATAL; + } finally { + $this->buffer = ''; + restore_error_handler(); + } + } + + /** + * Converts Csv records collection into UTF-8. + */ + public function convert(iterable $records): iterable + { + return match (true) { + $this->output_encoding === $this->input_encoding => $records, + is_array($records) => array_map($this, $records), + default => MapIterator::fromIterable($records, $this), + }; + } + + /** + * Enable using the class as a formatter for the {@link Writer}. + */ + public function __invoke(array $record): array + { + $outputRecord = []; + foreach ($record as $offset => $value) { + [$newOffset, $newValue] = $this->encodeField($value, $offset); + $outputRecord[$newOffset] = $newValue; + } + + return $outputRecord; + } + + /** + * Walker method to convert the offset and the value of a CSV record field. + */ + final protected function encodeField(int|float|string|null $value, int|string $offset): array + { + if (null !== $value && !is_numeric($value)) { + $value = mb_convert_encoding($value, $this->output_encoding, $this->input_encoding); + } + + if (!is_numeric($offset)) { + $offset = mb_convert_encoding($offset, $this->output_encoding, $this->input_encoding); + } + + return [$offset, $value]; + } + + /** + * Sets the records input encoding charset. + */ + public function inputEncoding(string $encoding): self + { + $encoding = self::filterEncoding($encoding); + if ($encoding === $this->input_encoding) { + return $this; + } + + $clone = clone $this; + $clone->input_encoding = $encoding; + + return $clone; + } + + /** + * Sets the records output encoding charset. + */ + public function outputEncoding(string $encoding): self + { + $encoding = self::filterEncoding($encoding); + if ($encoding === $this->output_encoding) { + return $this; + } + + $clone = clone $this; + $clone->output_encoding = $encoding; + + return $clone; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @codeCoverageIgnore + * @see self::appendOnReadTo() + * @see self::appendOnWriteTo() + * @deprecated since version 9.22.0 + * + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + #[Deprecated(message:'use League\Csv\CharserConverter::appendOnReadTo() or League\Csv\CharserConverter::appendOnWriteTo() instead', since:'league/csv:9.22.0')] + public static function appendTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + return self::appendFilter($stream, 0, $input_encoding, $output_encoding); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @codeCoverageIgnore + * @see self::prependOnReadTo() + * @see self::prependOnWriteTo() + * @deprecated since version 9.22.0 + * + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + #[Deprecated(message:'use League\Csv\CharserConverter::prependOnReadTo() or League\Csv\CharserConverter::prependOnWriteTo() instead', since:'league/csv:9.22.0')] + public static function prependTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed + { + return self::prependFilter($stream, 0, $input_encoding, $output_encoding); + } + + /** + * Static method to add the stream filter to a {@link Reader} object to handle BOM skipping. + */ + public static function addBOMSkippingTo(Reader $document, string $output_encoding = 'UTF-8'): Reader + { + self::register(); + + $document->appendStreamFilterOnRead( + self::getFiltername((Bom::tryFrom($document->getInputBOM()) ?? Bom::Utf8)->encoding(), $output_encoding), + [self::BOM_SEQUENCE => self::SKIP_BOM_SEQUENCE] + ); + + return $document; + } +} diff --git a/vendor/league/csv/src/ColumnConsistency.php b/vendor/league/csv/src/ColumnConsistency.php new file mode 100644 index 0000000..9d48aea --- /dev/null +++ b/vendor/league/csv/src/ColumnConsistency.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use function count; + +/** + * Validates column consistency when inserting records into a CSV document. + */ +class ColumnConsistency +{ + /** + * @throws InvalidArgument if the column count is less than -1 + */ + public function __construct( + protected int $columns_count = -1 + ) { + $this->columns_count >= -1 || throw InvalidArgument::dueToInvalidColumnCount($this->columns_count, __METHOD__); + } + + /** + * Returns the column count. + */ + public function getColumnCount(): int + { + return $this->columns_count; + } + + /** + * Tells whether the submitted record is valid. + */ + public function __invoke(array $record): bool + { + $count = count($record); + if (-1 === $this->columns_count) { + $this->columns_count = $count; + + return true; + } + + return $count === $this->columns_count; + } +} diff --git a/vendor/league/csv/src/EncloseField.php b/vendor/league/csv/src/EncloseField.php new file mode 100644 index 0000000..91d1a7f --- /dev/null +++ b/vendor/league/csv/src/EncloseField.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use InvalidArgumentException; +use php_user_filter; +use Throwable; + +use function array_map; +use function in_array; +use function restore_error_handler; +use function set_error_handler; +use function str_replace; +use function strcspn; +use function stream_bucket_append; +use function stream_bucket_make_writeable; +use function stream_bucket_new; +use function stream_filter_register; +use function stream_get_filters; +use function strlen; +use function trigger_error; + +use const E_USER_WARNING; +use const PSFS_ERR_FATAL; +use const PSFS_PASS_ON; + +/** + * A stream filter to improve enclosure character usage. + * + * DEPRECATION WARNING! This class will be removed in the next major point release + * + * @deprecated since version 9.10.0 + * @see Writer::forceEnclosure() + * + * @see https://tools.ietf.org/html/rfc4180#section-2 + * @see https://bugs.php.net/bug.php?id=38301 + */ +class EncloseField extends php_user_filter +{ + #[Deprecated(message: 'use League\Csv\Writer::forceEnclosure() instead', since: 'league/csv:9.10.0')] + public const FILTERNAME = 'convert.league.csv.enclosure'; + + /** Default sequence. */ + protected string $sequence = ''; + /** Characters that triggers enclosure in PHP. */ + protected static string $force_enclosure = "\n\r\t "; + + /** + * Static method to return the stream filter filtername. + */ + public static function getFiltername(): string + { + return self::FILTERNAME; + } + + /** + * Static method to register the class as a stream filter. + */ + public static function register(): void + { + if (!in_array(self::FILTERNAME, stream_get_filters(), true)) { + stream_filter_register(self::FILTERNAME, self::class); + } + } + + /** + * Static method to add the stream filter to a {@link Writer} object. + * + * @throws InvalidArgumentException if the sequence is malformed + * @throws Exception + */ + public static function addTo(Writer $csv, string $sequence): Writer + { + self::register(); + + if (!self::isValidSequence($sequence)) { + throw new InvalidArgumentException('The sequence must contain at least one character to force enclosure'); + } + + return $csv + ->addFormatter(fn (array $record): array => array_map(fn (?string $value): string => $sequence.$value, $record)) + ->addStreamFilter(self::FILTERNAME, ['sequence' => $sequence]); + } + + /** + * Filter type and sequence parameters. + * + * The sequence to force enclosure MUST contain one of the following character ("\n\r\t ") + */ + protected static function isValidSequence(string $sequence): bool + { + return strlen($sequence) !== strcspn($sequence, self::$force_enclosure); + } + + #[Deprecated(message: 'use League\Csv\Writer::forceEnclosure() instead', since: 'league/csv:9.10.0')] + public function onCreate(): bool + { + return is_array($this->params) + && isset($this->params['sequence']) + && self::isValidSequence($this->params['sequence']); + } + + /** + * @param resource $in + * @param resource $out + * @param int $consumed + */ + public function filter($in, $out, &$consumed, bool $closing): int + { + $data = ''; + while (null !== ($bucket = stream_bucket_make_writeable($in))) { + $data .= $bucket->data; + $consumed += $bucket->datalen; + } + + /** @var array $params */ + $params = $this->params; + try { + $data = str_replace($params['sequence'], '', $data); + } catch (Throwable $exception) { + trigger_error('An error occurred while executing the stream filter `'.$this->filtername.'`: '.$exception->getMessage(), E_USER_WARNING); + + return PSFS_ERR_FATAL; + } + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + stream_bucket_append($out, stream_bucket_new($this->stream, $data)); + restore_error_handler(); + + return PSFS_PASS_ON; + } +} diff --git a/vendor/league/csv/src/EscapeFormula.php b/vendor/league/csv/src/EscapeFormula.php new file mode 100644 index 0000000..73f22e6 --- /dev/null +++ b/vendor/league/csv/src/EscapeFormula.php @@ -0,0 +1,160 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use InvalidArgumentException; +use Stringable; + +use function array_fill_keys; +use function array_keys; +use function array_map; +use function is_string; + +/** + * A Formatter to tackle CSV Formula Injection. + * + * @see http://georgemauer.net/2017/10/07/csv-injection.html + */ +class EscapeFormula +{ + /** Spreadsheet formula starting character. */ + public const FORMULA_STARTING_CHARS = ['=', '-', '+', '@', "\t", "\r"]; + + /** Effective Spreadsheet formula starting characters. */ + protected array $special_chars = []; + + /** + * @param string $escape escape character to escape each CSV formula field + * @param array $special_chars additional spreadsheet formula starting characters + */ + public function __construct( + protected string $escape = "'", + array $special_chars = [] + ) { + $this->special_chars = array_fill_keys([ + ...self::FORMULA_STARTING_CHARS, + ...$this->filterSpecialCharacters(...$special_chars), + ], 1); + } + + /** + * Filter submitted special characters. + * + * @throws InvalidArgumentException if the string is not a single character + * + * @return array + */ + protected function filterSpecialCharacters(string ...$characters): array + { + foreach ($characters as $str) { + 1 === strlen($str) || throw new InvalidArgumentException('The submitted string '.$str.' must be a single character'); + } + + return $characters; + } + + /** + * Returns the list of character the instance will escape. + * + * @return array + */ + public function getSpecialCharacters(): array + { + return array_keys($this->special_chars); + } + + /** + * Returns the escape character. + */ + public function getEscape(): string + { + return $this->escape; + } + + /** + * Escapes a CSV record. + */ + public function escapeRecord(array $record): array + { + return array_map($this->escapeField(...), $record); + } + + public function unescapeRecord(array $record): array + { + return array_map($this->unescapeField(...), $record); + } + + /** + * Escapes a CSV cell if its content is stringable. + */ + protected function escapeField(mixed $cell): mixed + { + $strOrNull = match (true) { + is_string($cell) => $cell, + $cell instanceof Stringable => (string) $cell, + default => null, + }; + + return match (true) { + null == $strOrNull, + !isset($strOrNull[0], $this->special_chars[$strOrNull[0]]) => $cell, + default => $this->escape.$strOrNull, + }; + } + + protected function unescapeField(mixed $cell): mixed + { + $strOrNull = match (true) { + is_string($cell) => $cell, + $cell instanceof Stringable => (string) $cell, + default => null, + }; + + return match (true) { + null === $strOrNull, + !isset($strOrNull[0], $strOrNull[1]), + $strOrNull[0] !== $this->escape, + !isset($this->special_chars[$strOrNull[1]]) => $cell, + default => substr($strOrNull, 1), + }; + } + + /** + * @deprecated since 9.7.2 will be removed in the next major release + * @codeCoverageIgnore + * + * Tells whether the submitted value is stringable. + * + * @param mixed $value value to check if it is stringable + */ + protected function isStringable(mixed $value): bool + { + return is_string($value) || $value instanceof Stringable; + } + + /** + * @deprecated since 9.11.0 will be removed in the next major release + * @codeCoverageIgnore + * + * League CSV formatter hook. + * + * @see escapeRecord + */ + #[Deprecated(message:'use League\Csv\EscapeFormula::escapeRecord() instead', since:'league/csv:9.11.0')] + public function __invoke(array $record): array + { + return $this->escapeRecord($record); + } +} diff --git a/vendor/league/csv/src/Exception.php b/vendor/league/csv/src/Exception.php new file mode 100644 index 0000000..76865e8 --- /dev/null +++ b/vendor/league/csv/src/Exception.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Exception as PhpException; + +/** + * League Csv Base Exception. + */ +class Exception extends PhpException implements UnableToProcessCsv +{ +} diff --git a/vendor/league/csv/src/FragmentFinder.php b/vendor/league/csv/src/FragmentFinder.php new file mode 100644 index 0000000..22e1456 --- /dev/null +++ b/vendor/league/csv/src/FragmentFinder.php @@ -0,0 +1,428 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; + +use function array_filter; +use function array_map; +use function array_reduce; +use function count; +use function explode; +use function filter_var; +use function preg_match; +use function range; + +use const FILTER_VALIDATE_INT; + +/** + * EXPERIMENTAL WARNING! This class implementation will change in the next major point release. + * + * @phpstan-type selection array{selection:string, start:int<-1, max>, end:?int, length:int, columns:array} + * + * @experimental + */ +class FragmentFinder +{ + private const REGEXP_URI_FRAGMENT = ',^(?row|cell|col)=(?.*)$,i'; + private const REGEXP_ROWS_COLUMNS_SELECTION = '/^(?\d+)(-(?\d+|\*))?$/'; + private const REGEXP_CELLS_SELECTION = '/^(?\d+),(?\d+)(-(?((?\d+),(?\d+))|\*))?$/'; + private const TYPE_ROW = 'row'; + private const TYPE_COLUMN = 'col'; + private const TYPE_UNKNOWN = 'unknown'; + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract all found fragment identifiers for the specifield tabular data + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + * @return iterable + */ + public function findAll(string $expression, TabularData $tabularData): iterable + { + return $this->find($this->parseExpression($expression, $tabularData), $tabularData); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract the first found fragment identifier of the tabular data or returns null + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + */ + public function findFirst(string $expression, TabularData $tabularData): ?TabularDataReader + { + $fragment = $this->find($this->parseExpression($expression, $tabularData), $tabularData)[0]; + + return match ([]) { + $fragment->first() => null, + default => $fragment, + }; + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract the first found fragment identifier of the tabular data or fail + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + * @throws FragmentNotFound if the expression can not be parsed + */ + public function findFirstOrFail(string $expression, TabularData $tabularData): TabularDataReader + { + $parsedExpression = $this->parseExpression($expression, $tabularData); + if ([] !== array_filter($parsedExpression['selections'], fn (array $selection) => -1 === $selection['start'])) { + throw new FragmentNotFound('The expression `'.$expression.'` contains an invalid or an unsupported selection for the tabular data.'); + } + + $fragment = $this->find($parsedExpression, $tabularData)[0]; + + return match ([]) { + $fragment->first() => throw new FragmentNotFound('No fragment found in the tabular data with the expression `'.$expression.'`.'), + default => $fragment, + }; + } + + /** + * @param array{type:string, selections:non-empty-array} $parsedExpression + * + * @throws SyntaxError + * + * @return array + */ + private function find(array $parsedExpression, TabularData $tabularData): array + { + ['type' => $type, 'selections' => $selections] = $parsedExpression; + + $selections = array_filter($selections, fn (array $selection) => -1 !== $selection['start']); + if ([] === $selections) { + return [new ResultSet()]; + } + + if (self::TYPE_ROW === $type) { + $rowFilter = fn (array $record, int $offset): bool => [] !== array_filter( + $selections, + fn (array $selection) => + $offset >= $selection['start'] && + (null === $selection['end'] || $offset <= $selection['end']) + ); + + return [ + (new Statement()) + ->where($rowFilter) + ->process($tabularData), + ]; + } + + if (self::TYPE_COLUMN === $type) { + $columns = array_reduce( + $selections, + fn (array $columns, array $selection) => [...$columns, ...$selection['columns']], + [] + ); + + return [match ([]) { + $columns => new ResultSet(), + default => (new Statement())->select(...$columns)->process($tabularData), + }]; + } + + return array_map( + fn (array $selection) => (new Statement()) + ->offset($selection['start']) + ->limit($selection['length']) + ->select(...$selection['columns']) + ->process($tabularData), + $selections + ); + } + + /** + * @return array{type:string, selections:non-empty-array} + */ + private function parseExpression(string $expression, TabularData $tabularData): array + { + if (1 !== preg_match(self::REGEXP_URI_FRAGMENT, $expression, $matches)) { + return [ + 'type' => self::TYPE_UNKNOWN, + 'selections' => [ + [ + 'selection' => $expression, + 'start' => -1, + 'end' => null, + 'length' => -1, + 'columns' => [], + ], + ], + ]; + } + + $type = strtolower($matches['type']); + + /** @var non-empty-array $res */ + $res = array_reduce( + explode(';', $matches['selections']), + fn (array $selections, string $selection): array => [...$selections, match ($type) { + self::TYPE_ROW => $this->parseRowSelection($selection), + self::TYPE_COLUMN => $this->parseColumnSelection($selection, $tabularData), + default => $this->parseCellSelection($selection, $tabularData), + }], + [] + ); + + return [ + 'type' => $type, + 'selections' => $res, + ]; + } + + /** + * @return selection + */ + private function parseRowSelection(string $selection): array + { + [$start, $end] = $this->parseRowColumnSelection($selection); + + return match (true) { + -1 === $start, + null === $end => [ + 'selection' => $selection, + 'start' => $start, + 'end' => $start, + 'length' => 1, + 'columns' => [], + ], + '*' === $end => [ + 'selection' => $selection, + 'start' => $start, + 'end' => null, + 'length' => -1, + 'columns' => [], + ], + default => [ + 'selection' => $selection, + 'start' => $start, + 'end' => $end, + 'length' => $end - $start + 1, + 'columns' => [], + ], + }; + } + + /** + * @return selection + */ + private function parseColumnSelection(string $selection, TabularData $tabularData): array + { + [$start, $end] = $this->parseRowColumnSelection($selection); + $header = $tabularData->getHeader(); + if ([] === $header) { + $header = $tabularData->nth(0); + } + + $nbColumns = count($header); + + return match (true) { + -1 === $start, + $start >= $nbColumns => [ + 'selection' => $selection, + 'start' => -1, + 'end' => null, + 'length' => -1, + 'columns' => [], + ], + null === $end => [ + 'selection' => $selection, + 'start' => 0, + 'end' => null, + 'length' => -1, + 'columns' => [$start], + ], + '*' === $end, + $end > ($nbColumns - 1) => [ + 'selection' => $selection, + 'start' => 0, + 'end' => null, + 'length' => -1, + 'columns' => range($start, $nbColumns - 1), + ], + default => [ + 'selection' => $selection, + 'start' => 0, + 'end' => $end, + 'length' => -1, + 'columns' => range($start, $end), + ], + }; + } + + /** + * @return array{int<-1, max>, int|null|'*'} + */ + private function parseRowColumnSelection(string $selection): array + { + if (1 !== preg_match(self::REGEXP_ROWS_COLUMNS_SELECTION, $selection, $found)) { + return [-1, 0]; + } + + $start = $found['start']; + $end = $found['end'] ?? null; + $start = filter_var($start, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + if (false === $start) { + return [-1, 0]; + } + --$start; + + if (null === $end || '*' === $end) { + return [$start, $end]; + } + + $end = filter_var($end, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + if (false === $end) { + return [-1, 0]; + } + --$end; + + if ($end <= $start) { + return [-1, 0]; + } + + return [$start, $end]; + } + + /** + * @return selection + */ + private function parseCellSelection(string $selection, TabularData $tabularData): array + { + if (1 !== preg_match(self::REGEXP_CELLS_SELECTION, $selection, $found)) { + return [ + 'selection' => $selection, + 'start' => -1, + 'end' => null, + 'length' => 1, + 'columns' => [], + ]; + } + + $cellStartRow = filter_var($found['csr'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + $cellStartCol = filter_var($found['csc'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + if (false === $cellStartRow || false === $cellStartCol) { + return [ + 'selection' => $selection, + 'start' => -1, + 'end' => null, + 'length' => 1, + 'columns' => [], + ]; + } + + --$cellStartRow; + --$cellStartCol; + + $header = $tabularData->getHeader(); + if ([] === $header) { + $header = $tabularData->nth(0); + } + + $nbColumns = count($header); + + if ($cellStartCol > $nbColumns - 1) { + return [ + 'selection' => $selection, + 'start' => -1, + 'end' => null, + 'length' => 1, + 'columns' => [], + ]; + } + + $cellEnd = $found['end'] ?? null; + if (null === $cellEnd) { + return [ + 'selection' => $selection, + 'start' => $cellStartRow, + 'end' => null, + 'length' => 1, + 'columns' => [$cellStartCol], + ]; + } + + if ('*' === $cellEnd) { + return [ + 'selection' => $selection, + 'start' => $cellStartRow, + 'end' => null, + 'length' => -1, + 'columns' => range($cellStartCol, $nbColumns - 1), + ]; + } + + $cellEndRow = filter_var($found['cer'] ?? '', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + $cellEndCol = filter_var($found['cec'] ?? '', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + + if (false === $cellEndRow || false === $cellEndCol) { + return [ + 'selection' => $selection, + 'start' => -1, + 'end' => null, + 'length' => 1, + 'columns' => [], + ]; + } + + --$cellEndRow; + --$cellEndCol; + + if ($cellEndRow < $cellStartRow || $cellEndCol < $cellStartCol) { + return [ + 'selection' => $selection, + 'start' => -1, + 'end' => null, + 'length' => 1, + 'columns' => [], + ]; + } + + return [ + 'selection' => $selection, + 'start' => $cellStartRow, + 'end' => $cellEndRow, + 'length' => $cellEndRow - $cellStartRow + 1, + 'columns' => range($cellStartCol, ($cellEndCol > $nbColumns - 1) ? $nbColumns - 1 : $cellEndCol), + ]; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see FragmentFinder::__construct() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + * + * Returns a new instance. + */ + #[Deprecated(message:'use League\Csv\FragmentFinder::__construct()', since:'league/csv:9.22.0')] + public static function create(): self + { + return new self(); + } +} diff --git a/vendor/league/csv/src/FragmentNotFound.php b/vendor/league/csv/src/FragmentNotFound.php new file mode 100644 index 0000000..5ac3583 --- /dev/null +++ b/vendor/league/csv/src/FragmentNotFound.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use RuntimeException; + +final class FragmentNotFound extends RuntimeException implements UnableToProcessCsv +{ +} diff --git a/vendor/league/csv/src/HTMLConverter.php b/vendor/league/csv/src/HTMLConverter.php new file mode 100644 index 0000000..73ade01 --- /dev/null +++ b/vendor/league/csv/src/HTMLConverter.php @@ -0,0 +1,245 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Closure; +use Deprecated; +use Dom\HTMLDocument; +use Dom\HTMLElement; +use Dom\XMLDocument; +use DOMDocument; +use DOMElement; +use DOMException; + +use function is_bool; +use function preg_match; + +/** + * Converts tabular data into an HTML Table string. + */ +class HTMLConverter +{ + /** table class attribute value. */ + protected string $class_name = 'table-csv-data'; + /** table id attribute value. */ + protected string $id_value = ''; + /** @var ?Closure(array, array-key): array */ + protected ?Closure $formatter = null; + protected string $offset_attr = ''; + protected string $column_attr = ''; + + private static function supportsModernDom(): bool + { + return extension_loaded('dom') && class_exists(HTMLDocument::class); + } + + public function __construct() + { + } + + /** + * Converts a tabular data collection into an HTML table string. + * + * @param array $header_record An optional array of headers outputted using the `` and `` elements + * @param array $footer_record An optional array of footers outputted using the `` and `` elements + */ + public function convert(iterable $records, array $header_record = [], array $footer_record = []): string + { + if (null !== $this->formatter) { + $records = MapIterator::fromIterable($records, $this->formatter); + } + + $document = self::supportsModernDom() ? HTMLDocument::createEmpty() : new DOMDocument('1.0'); + $table = $document->createElement('table'); + if ('' !== $this->class_name) { + $table->setAttribute('class', $this->class_name); + } + + if ('' !== $this->id_value) { + $table->setAttribute('id', $this->id_value); + } + + $this->appendHeaderSection('thead', $header_record, $table); + $this->appendHeaderSection('tfoot', $footer_record, $table); + + $tbody = $table; + if ($table->hasChildNodes()) { + $tbody = $document->createElement('tbody'); + $table->appendChild($tbody); + } + + foreach ($records as $offset => $record) { + $tr = $document->createElement('tr'); + if ('' !== $this->offset_attr) { + $tr->setAttribute($this->offset_attr, (string) $offset); + } + + foreach ($record as $field_name => $field_value) { + $td = $document->createElement('td'); + if ('' !== $this->column_attr) { + $td->setAttribute($this->column_attr, (string) $field_name); + } + $td->appendChild($document->createTextNode($field_value)); + $tr->appendChild($td); + } + + $tbody->appendChild($tr); + } + + $document->appendChild($table); + + return (string) $document->saveHTML($table); + } + + /** + * Creates a DOMElement representing an HTML table heading section. + * + * @throws DOMException + */ + protected function appendHeaderSection(string $node_name, array $record, DOMElement|HTMLElement $table): void + { + if ([] === $record) { + return; + } + + /** @var DOMDocument|HTMLDocument $document */ + $document = $table->ownerDocument; + $header = $document->createElement($node_name); + $tr = $document->createElement('tr'); + foreach ($record as $field_value) { + $th = $document->createElement('th'); + $th->setAttribute('scope', 'col'); + $th->appendChild($document->createTextNode($field_value)); + $tr->appendChild($th); + } + + $header->appendChild($tr); + $table->appendChild($header); + } + + /** + * HTML table class name setter. + * + * @throws DOMException if the id_value contains any type of whitespace + */ + public function table(string $class_name, string $id_value = ''): self + { + 1 !== preg_match(",\s,", $id_value) || throw new DOMException("The id attribute's value must not contain whitespace (spaces, tabs etc.)"); + + $clone = clone $this; + $clone->class_name = $class_name; + $clone->id_value = $id_value; + + return $clone; + } + + /** + * HTML tr record offset attribute setter. + */ + public function tr(string $record_offset_attribute_name): self + { + if ($record_offset_attribute_name === $this->offset_attr) { + return $this; + } + + if (!self::filterAttributeNme($record_offset_attribute_name)) { + throw new DOMException('The submitted attribute name `'.$record_offset_attribute_name.'` is not valid.'); + } + + $clone = clone $this; + $clone->offset_attr = $record_offset_attribute_name; + + return $clone; + } + + /** + * HTML td field name attribute setter. + */ + public function td(string $fieldname_attribute_name): self + { + if ($fieldname_attribute_name === $this->column_attr) { + return $this; + } + + if (!self::filterAttributeNme($fieldname_attribute_name)) { + throw new DOMException('The submitted attribute name `'.$fieldname_attribute_name.'` is not valid.'); + } + + $clone = clone $this; + $clone->column_attr = $fieldname_attribute_name; + + return $clone; + } + + private static function filterAttributeNme(string $attribute_name): bool + { + try { + $document = self::supportsModernDom() ? XmlDocument::createEmpty() : new DOMDocument('1.0'); + $div = $document->createElement('div'); + $div->setAttribute($attribute_name, 'foo'); + + return true; + } catch (DOMException) { + return false; + } + } + + /** + * Set a callback to format each item before json encode. + * + * @param ?callable(array, array-key): array $formatter + */ + public function formatter(?callable $formatter): self + { + $clone = clone $this; + $clone->formatter = ($formatter instanceof Closure || null === $formatter) ? $formatter : $formatter(...); + + return $clone; + } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see XMLConverter::__construct() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + * + * Returns an new instance. + */ + #[Deprecated(message:'use League\Csv\HTMLConverter::__construct()', since:'league/csv:9.22.0')] + public static function create(): self + { + return new self(); + } +} diff --git a/vendor/league/csv/src/HttpHeaders.php b/vendor/league/csv/src/HttpHeaders.php new file mode 100644 index 0000000..55f9b3f --- /dev/null +++ b/vendor/league/csv/src/HttpHeaders.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use InvalidArgumentException; + +use function filter_var; +use function header; +use function rawurlencode; +use function str_contains; +use function str_replace; + +use const FILTER_FLAG_STRIP_HIGH; +use const FILTER_FLAG_STRIP_LOW; + +/** + * Send the CSV headers. + * + * Adapted from Symfony\Component\HttpFoundation\ResponseHeaderBag::makeDisposition + * + * @see https://tools.ietf.org/html/rfc6266#section-4.3 + * + * @internal + */ +final class HttpHeaders +{ + /** + * @throws InvalidArgumentException + */ + public static function forFileDownload(string $filename, string $contentType): void + { + if (str_contains($filename, '/') || str_contains($filename, '\\')) { + throw new InvalidArgumentException('The filename `'.$filename.'` cannot contain the "/" or "\" characters.'); + } + + /** @var string $filteredName */ + $filteredName = filter_var($filename, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH); + $fallbackName = str_replace('%', '', $filteredName); + $disposition = 'attachment;filename="'.str_replace('"', '\\"', $fallbackName).'"'; + if ($filename !== $fallbackName) { + $disposition .= ";filename*=UTF-8''".preg_replace_callback( + '/[%"\x00-\x1F\x7F-\xFF]/', + static fn (array $matches): string => strtolower(rawurlencode($matches[0])), + $filename + ); + } + + header('content-type: '.$contentType); + header('content-transfer-encoding: binary'); + header('content-description: File Transfer'); + header('content-disposition: '.$disposition); + } +} diff --git a/vendor/league/csv/src/Info.php b/vendor/league/csv/src/Info.php new file mode 100644 index 0000000..0c3a8d3 --- /dev/null +++ b/vendor/league/csv/src/Info.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; + +use function array_fill_keys; +use function array_filter; +use function array_reduce; +use function array_unique; +use function count; +use function strlen; + +use const COUNT_RECURSIVE; + +final class Info implements ByteSequence +{ + /** + * Returns the BOM sequence found at the start of the string. + * + * If no valid BOM sequence is found an empty string is returned + * + * @deprecated since version 9.16.0 + * @see Bom::tryFromSequence() + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\Bom::tryFromSequence() instead', since:'league/csv:9.16.0')] + public static function fetchBOMSequence(string $str): ?string + { + return Bom::tryFromSequence($str)?->value; + } + + /** + * Detect Delimiters usage in a {@link Reader} object. + * + * Returns a associative array where each key represents + * a submitted delimiter and each value the number CSV fields found + * when processing at most $limit CSV records with the given delimiter + * + * @param array $delimiters + * @param int<-1, max> $limit + * + * @return array + */ + public static function getDelimiterStats(Reader $csv, array $delimiters, int $limit = 1): array + { + $currentHeaderOffset = $csv->getHeaderOffset(); + $currentDelimiter = $csv->getDelimiter(); + + $stats = array_reduce( + array_unique(array_filter($delimiters, fn (string $value): bool => 1 === strlen($value))), + fn (array $stats, string $delimiter): array => [ + ...$stats, + ...[$delimiter => count([ + ...$csv + ->setHeaderOffset(null) + ->setDelimiter($delimiter) + ->slice(0, $limit) + ->filter(fn (array $record, int|string $key): bool => 1 < count($record)), + ], COUNT_RECURSIVE)], + ], + array_fill_keys($delimiters, 0) + ); + + $csv->setHeaderOffset($currentHeaderOffset); + $csv->setDelimiter($currentDelimiter); + + return $stats; + } +} diff --git a/vendor/league/csv/src/InvalidArgument.php b/vendor/league/csv/src/InvalidArgument.php new file mode 100644 index 0000000..a880a37 --- /dev/null +++ b/vendor/league/csv/src/InvalidArgument.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use Throwable; + +/** + * InvalidArgument Exception. + */ +class InvalidArgument extends Exception +{ + /** + * DEPRECATION WARNING! This class will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + */ + public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + } + + public static function dueToInvalidChunkSize(int $length, string $method): self + { + return new self($method.'() expects the length to be a positive integer '.$length.' given.'); + } + + public static function dueToInvalidHeaderFilename(string $filename): self + { + return new self('The filename `'.$filename.'` cannot contain the "/" and "\\" characters.'); + } + + public static function dueToInvalidDelimiterCharacter(string $delimiter, string $method): self + { + return new self($method.'() expects delimiter to be a single character; `'.$delimiter.'` given.'); + } + + public static function dueToInvalidEnclosureCharacter(string $enclosure, string $method): self + { + return new self($method.'() expects enclosure to be a single character; `'.$enclosure.'` given.'); + } + + public static function dueToInvalidEscapeCharacter(string $escape, string $method): self + { + return new self($method.'() expects escape to be a single character or an empty string; `'.$escape.'` given.'); + } + + public static function dueToInvalidBOMCharacter(string $method, Throwable $exception): self + { + return new self($method.'() expects a valid Byte Order Mark.', 0, $exception); + } + + public static function dueToInvalidColumnCount(int $columns_count, string $method): self + { + return new self($method.'() expects the column count to be greater or equal to -1 '.$columns_count.' given.'); + } + + public static function dueToInvalidHeaderOffset(int $offset, string $method): self + { + return new self($method.'() expects header offset to be greater or equal to 0; `'.$offset.'` given.'); + } + + public static function dueToInvalidRecordOffset(int $offset, string $method): self + { + return new self($method.'() expects the submitted offset to be a positive integer or 0, '.$offset.' given'); + } + + public static function dueToInvalidColumnIndex(string|int $index, string $type, string $method): self + { + return new self($method.'() expects the '.$type.' index to be a valid string or integer, `'.$index.'` given'); + } + + public static function dueToInvalidLimit(int $limit, string $method): self + { + return new self($method.'() expects the limit to be greater or equal to -1, '.$limit.' given.'); + } + + public static function dueToInvalidOrder(string $order, string $method): self + { + return new self($method.'() expects `ASC` or `DESC` in a case-insensitive way, '.$order.' given.'); + } + + public static function dueToInvalidOperator(string $operator, string $method): self + { + return new self($method.'() expects valid comparison operator in a case-insensitive way, '.$operator.' given.'); + } + + public static function dueToInvalidSeekingPosition(int $position, string $method): self + { + return new self($method.'() can\'t seek stream to negative line '.$position); + } + + public static function dueToStreamFilterNotFound(string $filtername): self + { + return new self('unable to locate filter `'.$filtername.'`'); + } + + public static function dueToInvalidThreshold(int $threshold, string $method): self + { + return new self($method.'() expects threshold to be null or a valid integer greater or equal to 1'); + } +} diff --git a/vendor/league/csv/src/JsonConverter.php b/vendor/league/csv/src/JsonConverter.php new file mode 100644 index 0000000..b158370 --- /dev/null +++ b/vendor/league/csv/src/JsonConverter.php @@ -0,0 +1,542 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use BadMethodCallException; +use Closure; +use Deprecated; +use Exception; +use InvalidArgumentException; +use Iterator; +use JsonException; +use RuntimeException; +use SplFileInfo; +use SplFileObject; +use TypeError; + +use function array_filter; +use function array_reduce; +use function get_defined_constants; +use function is_bool; +use function is_resource; +use function is_string; +use function json_encode; +use function json_last_error; +use function preg_match; +use function restore_error_handler; +use function set_error_handler; +use function str_repeat; +use function str_replace; +use function str_starts_with; +use function strlen; +use function strtolower; +use function substr; +use function ucwords; + +use const ARRAY_FILTER_USE_KEY; +use const JSON_ERROR_NONE; +use const JSON_PRETTY_PRINT; +use const JSON_THROW_ON_ERROR; + +/** + * Converts and store tabular data into a JSON string. + * @template T + * + * @method JsonConverter withHexTag() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutHexTag() removes the JSON_HEX_TAG flag + * @method bool useHexTag() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withHexAmp() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutHexAmp() removes the JSON_HEX_TAG flag + * @method bool useHexAmp() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withHexApos() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutHexApos() removes the JSON_HEX_TAG flag + * @method bool useHexApos() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withHexQuot() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutHexQuot() removes the JSON_HEX_TAG flag + * @method bool useHexQuot() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withForceObject() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutForceObject() removes the JSON_HEX_TAG flag + * @method bool useForceObject() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withNumericCheck() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutNumericCheck() removes the JSON_HEX_TAG flag + * @method bool useNumericCheck() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withUnescapedSlashes() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutUnescapedSlashes() removes the JSON_HEX_TAG flag + * @method bool useUnescapedSlashes() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withoutPrettyPrint() removes the JSON_PRETTY_PRINT flag + * @method bool usePrettyPrint() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withUnescapedUnicode() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutUnescapedUnicode() removes the JSON_HEX_TAG flag + * @method bool useUnescapedUnicode() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withPartialOutputOnError() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutPartialOutputOnError() removes the JSON_HEX_TAG flag + * @method bool usePartialOutputOnError() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withPreserveZeroFraction() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutPreserveZeroFraction() removes the JSON_HEX_TAG flag + * @method bool usePreserveZeroFraction() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withUnescapedLineTerminators() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutUnescapedLineTerminators() removes the JSON_HEX_TAG flag + * @method bool useUnescapedLineTerminators() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withInvalidUtf8Ignore() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutInvalidUtf8Ignore() removes the JSON_HEX_TAG flag + * @method bool useInvalidUtf8Ignore() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withInvalidUtf8Substitute() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutInvalidUtf8Substitute() removes the JSON_HEX_TAG flag + * @method bool useInvalidUtf8Substitute() tells whether the JSON_HEX_TAG flag is used + * @method JsonConverter withThrowOnError() adds the JSON_HEX_TAG flag + * @method JsonConverter withoutThrowOnError() removes the JSON_HEX_TAG flag + * @method bool useThrowOnError() tells whether the JSON_HEX_TAG flag is used + */ +final class JsonConverter +{ + public readonly int $flags; + /** @var int<1, max> */ + public readonly int $depth; + /** @var int<1, max> */ + public readonly int $indentSize; + /** @var ?Closure(T, array-key): mixed */ + public readonly ?Closure $formatter; + /** @var int<1, max> */ + public readonly int $chunkSize; + /** @var non-empty-string */ + private readonly string $start; + /** @var non-empty-string */ + private readonly string $end; + /** @var non-empty-string */ + private readonly string $separator; + /** @var non-empty-string */ + private readonly string $emptyIterable; + /** @var non-empty-string */ + private readonly string $indentation; + /** @var Closure(array): string */ + private readonly Closure $jsonEncodeChunk; + /** @var array */ + private array $indentationLevels = []; + + /** + * @param int<1, max> $depth + * @param int<1, max> $indentSize + * @param ?callable(T, array-key): mixed $formatter + * @param int<1, max> $chunkSize + * + * @throws InvalidArgumentException + */ + public function __construct( + int $flags = 0, + int $depth = 512, + int $indentSize = 4, + ?callable $formatter = null, + int $chunkSize = 500 + ) { + json_encode([], $flags & ~JSON_THROW_ON_ERROR, $depth); + + JSON_ERROR_NONE === ($errorCode = json_last_error()) || throw new InvalidArgumentException('The flags or the depth given are not valid JSON encoding parameters in PHP; '.json_last_error_msg(), $errorCode); + 1 <= $indentSize || throw new InvalidArgumentException('The indentation space must be greater or equal to 1.'); + 1 <= $chunkSize || throw new InvalidArgumentException('The chunk size must be greater or equal to 1.'); + + $this->flags = $flags; + $this->depth = $depth; + $this->indentSize = $indentSize; + $this->formatter = ($formatter instanceof Closure || null === $formatter) ? $formatter : $formatter(...); + $this->chunkSize = $chunkSize; + + // Initialize settings and closure to use for conversion. + // To speed up the process we pre-calculate them + $this->indentation = str_repeat(' ', $this->indentSize); + $start = '['; + $end = ']'; + $separator = ','; + $chunkFormatter = array_values(...); + $prettyPrintFormatter = fn (string $json): string => $json; + if ($this->useForceObject()) { + $start = '{'; + $end = '}'; + $chunkFormatter = fn (array $value): array => $value; + } + + $this->emptyIterable = $start.$end; + if ($this->usePrettyPrint()) { + $start .= "\n"; + $end = "\n".$end; + $separator .= "\n"; + $prettyPrintFormatter = $this->prettyPrint(...); + } + + $flags = ($this->flags & ~JSON_PRETTY_PRINT) | JSON_THROW_ON_ERROR; + $this->start = $start; + $this->end = $end; + $this->separator = $separator; + $this->jsonEncodeChunk = fn (array $chunk): string => ($prettyPrintFormatter)(substr( + string: json_encode(($chunkFormatter)($chunk), $flags, $this->depth), /* @phpstan-ignore-line */ + offset: 1, + length: -1 + )); + } + + /** + * Pretty Print the JSON string without using JSON_PRETTY_PRINT + * The method also allow using an arbitrary length for the indentation. + */ + private function prettyPrint(string $json): string + { + $level = 1; + $inQuotes = false; + $escape = false; + $length = strlen($json); + $str = [$this->indentation]; + for ($i = 0; $i < $length; $i++) { + $char = $json[$i]; + if ('"' === $char && !$escape) { + $inQuotes = !$inQuotes; + } + + $escape = '\\' === $char && !$escape; + $str[] = $inQuotes ? $char : match ($char) { + '{', '[' => $char.($this->indentationLevels[++$level] ??= "\n".str_repeat($this->indentation, $level)), + '}', ']' => ($this->indentationLevels[--$level] ??= "\n".str_repeat($this->indentation, $level)).$char, + ',' => $char.($this->indentationLevels[$level] ??= "\n".str_repeat($this->indentation, $level)), + ':' => $char.' ', + default => $char, + }; + } + + return implode('', $str); + } + + /** + * @throws BadMethodCallException + */ + public function __call(string $name, array $arguments): self|bool + { + return match (true) { + str_starts_with($name, 'without') => $this->removeFlags(self::methodToFlag($name, 7)), + str_starts_with($name, 'with') => $this->addFlags(self::methodToFlag($name, 4)), + str_starts_with($name, 'use') => $this->useFlags(self::methodToFlag($name, 3)), + default => throw new BadMethodCallException('The method "'.self::class.'::'.$name.'" does not exist.'), + }; + } + + /** + * @param int<1, max>|null $indentSize + */ + public function withPrettyPrint(?int $indentSize = null): self + { + $flags = $this->flags | JSON_PRETTY_PRINT; + $indentSize = $indentSize ?? $this->indentSize; + + return match (true) { + $flags === $this->flags && $indentSize === $this->indentSize => $this, + default => new self($flags, $this->depth, $indentSize, $this->formatter, $this->chunkSize), + }; + } + + /** + * Returns the PHP json flag associated to its method suffix to ease method lookup. + */ + private static function methodToFlag(string $method, int $prefixSize): int + { + static $suffix2Flag; + + if (null === $suffix2Flag) { + $suffix2Flag = []; + /** @var array $jsonFlags */ + $jsonFlags = get_defined_constants(true)['json']; + $jsonEncodeFlags = array_filter( + $jsonFlags, + fn (string $key) => 1 !== preg_match('/^(JSON_BIGINT_AS_STRING|JSON_OBJECT_AS_ARRAY|JSON_ERROR_)(.*)?$/', $key), + ARRAY_FILTER_USE_KEY + ); + + foreach ($jsonEncodeFlags as $name => $value) { + $suffix2Flag[str_replace('_', '', ucwords(strtolower(substr($name, 5)), '_'))] = $value; + } + } + + return $suffix2Flag[substr($method, $prefixSize)] + ?? throw new BadMethodCallException('The method "'.self::class.'::'.$method.'" does not exist.'); + } + + /** + * Adds a list of JSON flags. + */ + public function addFlags(int ...$flags): self + { + return $this->setFlags( + array_reduce($flags, fn (int $carry, int $flag): int => $carry | $flag, $this->flags) + ); + } + + /** + * Removes a list of JSON flags. + */ + public function removeFlags(int ...$flags): self + { + return $this->setFlags( + array_reduce($flags, fn (int $carry, int $flag): int => $carry & ~$flag, $this->flags) + ); + } + + /** + * Tells whether the flag is being used by the current JsonConverter. + */ + public function useFlags(int ...$flags): bool + { + foreach ($flags as $flag) { + // the JSON_THROW_ON_ERROR flag is always used even if it is not set by the user + if (JSON_THROW_ON_ERROR !== $flag && ($this->flags & $flag) !== $flag) { + return false; + } + } + + return [] !== $flags; + } + + /** + * Sets the encoding flags. + */ + private function setFlags(int $flags): self + { + return match ($flags) { + $this->flags => $this, + default => new self($flags, $this->depth, $this->indentSize, $this->formatter, $this->chunkSize), + }; + } + + /** + * Set the depth of Json encoding. + * + * @param int<1, max> $depth + */ + public function depth(int $depth): self + { + return match ($depth) { + $this->depth => $this, + default => new self($this->flags, $depth, $this->indentSize, $this->formatter, $this->chunkSize), + }; + } + + /** + * Set the indentation size. + * + * @param int<1, max> $chunkSize + */ + public function chunkSize(int $chunkSize): self + { + return match ($chunkSize) { + $this->chunkSize => $this, + default => new self($this->flags, $this->depth, $this->indentSize, $this->formatter, $chunkSize), + }; + } + + /** + * Set a callback to format each item before json encode. + */ + public function formatter(?callable $formatter): self + { + return new self($this->flags, $this->depth, $this->indentSize, $formatter, $this->chunkSize); + } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } + + /** + * Sends and makes the JSON structure downloadable via HTTP. + *. + * Returns the number of characters read from the handle and passed through to the output. + * + * @param iterable $records + * + * @throws Exception + * @throws JsonException + */ + public function download(iterable $records, ?string $filename = null): int + { + if (null !== $filename) { + HttpHeaders::forFileDownload($filename, 'application/json; charset=utf-8'); + } + + return $this->save($records, new SplFileObject('php://output', 'wb')); + } + + /** + * Returns the JSON representation of a tabular data collection. + * + * @param iterable $records + * + * @throws Exception + * @throws JsonException + */ + public function encode(iterable $records): string + { + $stream = Stream::createFromString(); + $this->save($records, $stream); + $stream->rewind(); + + return (string) $stream->getContents(); + } + + /** + * Store the generated JSON in the destination filepath. + * + * if a Path or a SplFileInfo object is given, + * the file will be emptying before adding the JSON + * content to it. For all the other types you are + * required to provide a file with the correct open + * mode. + * + * @param iterable $records + * @param SplFileInfo|SplFileObject|Stream|resource|string $destination + * @param resource|null $context + * + * @throws JsonException + * @throws RuntimeException + * @throws TypeError + * @throws UnavailableStream + */ + public function save(iterable $records, mixed $destination, $context = null): int + { + $stream = match (true) { + $destination instanceof Stream, + $destination instanceof SplFileObject => $destination, + $destination instanceof SplFileInfo => $destination->openFile(mode:'wb', context: $context), + is_resource($destination) => Stream::createFromResource($destination), + is_string($destination) => Stream::createFromPath($destination, 'wb', $context), + default => throw new TypeError('The destination path must be a filename, a stream or a SplFileInfo object.'), + }; + $bytes = 0; + $writtenBytes = 0; + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + foreach ($this->convert($records) as $line) { + if (false === ($writtenBytes = $stream->fwrite($line))) { + break; + } + $bytes += $writtenBytes; + } + restore_error_handler(); + + false !== $writtenBytes || throw new RuntimeException('Unable to write '.(isset($line) ? '`'.$line.'`' : '').' to the destination path `'.$stream->getPathname().'`.'); + + return $bytes; + } + + /** + * Returns an Iterator that you can iterate to generate the actual JSON string representation. + * + * @param iterable $records + * + * @throws JsonException + * @throws Exception + * + * @return Iterator + */ + public function convert(iterable $records): Iterator + { + $iterator = match ($this->formatter) { + null => MapIterator::toIterator($records), + default => MapIterator::fromIterable($records, $this->formatter) + }; + + $iterator->rewind(); + if (!$iterator->valid()) { + yield $this->emptyIterable; + + return; + } + + $chunk = []; + $chunkOffset = 0; + $offset = 0; + $current = $iterator->current(); + $iterator->next(); + + yield $this->start; + + while ($iterator->valid()) { + if ($chunkOffset === $this->chunkSize) { + yield ($this->jsonEncodeChunk)($chunk).$this->separator; + + $chunkOffset = 0; + $chunk = []; + } + + $chunk[$offset] = $current; + ++$chunkOffset; + ++$offset; + $current = $iterator->current(); + $iterator->next(); + } + + if ([] !== $chunk) { + yield ($this->jsonEncodeChunk)($chunk).$this->separator; + } + + yield ($this->jsonEncodeChunk)([$offset => $current]).$this->end; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see JsonConverter::withPrettyPrint() + * @deprecated Since version 9.19.0 + * @codeCoverageIgnore + * + * Set the indentation size. + * + * @param int<1, max> $indentSize + */ + #[Deprecated(message:'use League\Csv\JsonConverter::withPrettyPrint() instead', since:'league/csv:9.19.0')] + public function indentSize(int $indentSize): self + { + return match ($indentSize) { + $this->indentSize => $this, + default => new self($this->flags, $this->depth, $indentSize, $this->formatter, $this->chunkSize), + }; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see JsonConverter::__construct() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\JsonConverter::__construct() instead', since:'league/csv:9.22.0')] + public static function create(): self + { + return new self( + flags: 0, + depth: 512, + indentSize: 4, + formatter: null, + chunkSize: 500 + ); + } +} diff --git a/vendor/league/csv/src/MapIterator.php b/vendor/league/csv/src/MapIterator.php new file mode 100644 index 0000000..692d02b --- /dev/null +++ b/vendor/league/csv/src/MapIterator.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use ArrayIterator; +use Iterator; +use IteratorAggregate; +use IteratorIterator; +use Traversable; + +/** + * Maps value from an iterator before yielding. + * + * @internal used internally to modify CSV content + */ +final class MapIterator extends IteratorIterator +{ + /** @var callable The callback to apply on all InnerIterator current value. */ + private $callable; + + public function __construct(Traversable $iterator, callable $callable) + { + parent::__construct($iterator); + $this->callable = $callable; + } + + public static function fromIterable(iterable $iterator, callable $callable): self + { + return match (true) { + $iterator instanceof Traversable => new self($iterator, $callable), + is_array($iterator) => new self(new ArrayIterator($iterator), $callable), + }; + } + + public function current(): mixed + { + return ($this->callable)(parent::current(), parent::key()); + } + + public static function toIterator(iterable $value): Iterator + { + if ($value instanceof IteratorAggregate) { + $value = $value->getIterator(); + } + + return match (true) { + $value instanceof Iterator => $value, + $value instanceof Traversable => (function () use ($value): Iterator { + foreach ($value as $offset => $record) { + yield $offset => $record; + } + })(), + default => new ArrayIterator($value), + }; + } +} diff --git a/vendor/league/csv/src/Query/Constraint/Column.php b/vendor/league/csv/src/Query/Constraint/Column.php new file mode 100644 index 0000000..81ad21c --- /dev/null +++ b/vendor/league/csv/src/Query/Constraint/Column.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Constraint; + +use CallbackFilterIterator; +use Closure; +use Iterator; +use League\Csv\MapIterator; +use League\Csv\Query; +use ReflectionException; + +/** + * Enable filtering a record based on the value of a one of its cell. + * + * When used with PHP's array_filter with the ARRAY_FILTER_USE_BOTH flag + * the record offset WILL NOT BE taken into account + */ +final class Column implements Query\Predicate +{ + /** + * @throws Query\QueryException + */ + private function __construct( + public readonly string|int $column, + public readonly Comparison|Closure $operator, + public readonly mixed $value, + ) { + if (!$this->operator instanceof Closure) { + $this->operator->accept($this->value); + } + } + + /** + * @throws Query\QueryException + */ + public static function filterOn( + string|int $column, + Comparison|Closure|callable|string $operator, + mixed $value = null, + ): self { + if ($operator instanceof Closure) { + return new self($column, $operator, null); + } + + if (is_callable($operator)) { + return new self($column, $operator(...), $value); + } + + return new self( + $column, + is_string($operator) ? Comparison::fromOperator($operator) : $operator, + $value + ); + } + + /** + * @throws ReflectionException + * @throws Query\QueryException + */ + public function __invoke(mixed $value, int|string $key): bool + { + $subject = Query\Row::from($value)->value($this->column); + if ($this->operator instanceof Closure) { + return ($this->operator)($subject); + } + + return $this->operator->compare($subject, $this->value); + } + + public function filter(iterable $value): Iterator + { + return new CallbackFilterIterator(MapIterator::toIterator($value), $this); + } +} diff --git a/vendor/league/csv/src/Query/Constraint/Comparison.php b/vendor/league/csv/src/Query/Constraint/Comparison.php new file mode 100644 index 0000000..70b21ef --- /dev/null +++ b/vendor/league/csv/src/Query/Constraint/Comparison.php @@ -0,0 +1,157 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Constraint; + +use League\Csv\Query\QueryException; + +use function array_is_list; +use function count; +use function in_array; +use function is_array; +use function is_scalar; +use function is_string; +use function str_contains; +use function str_ends_with; +use function str_starts_with; +use function strtoupper; +use function trim; + +enum Comparison: string +{ + case Equals = '='; + case NotEquals = '!='; + case GreaterThan = '>'; + case GreaterThanOrEqual = '>='; + case LesserThan = '<'; + case LesserThanOrEqual = '<='; + case Between = 'BETWEEN'; + case NotBetween = 'NBETWEEN'; + case Regexp = 'REGEXP'; + case NotRegexp = 'NREGEXP'; + case In = 'IN'; + case NotIn = 'NIN'; + case Contains = 'CONTAINS'; + case NotContain = 'NCONTAIN'; + case StartsWith = 'STARTS_WITH'; + case EndsWith = 'ENDS_WITH'; + + public static function tryFromOperator(string $operator): ?self + { + $operator = strtoupper(trim($operator)); + + return match ($operator) { + '<>', 'NEQ', 'IS NOT', 'NOT EQUAL' => self::NotEquals, + 'EQ', 'IS', 'EQUAL', 'EQUALS' => self::Equals, + 'GT', 'GREATER THAN' => self::GreaterThan, + 'GTE', 'GREATER THAN OR EQUAL' => self::GreaterThanOrEqual, + 'LT', 'LESSER THAN' => self::LesserThan, + 'LTE', 'LESSER THAN OR EQUAL' => self::LesserThanOrEqual, + 'NOT_REGEXP', 'NOT REGEXP' => self::NotRegexp, + 'NOT_CONTAIN', 'NOT CONTAIN', 'DOES_NOT_CONTAIN', 'DOES NOT CONTAIN' => self::NotContain, + 'NOT_IN', 'NOT IN' => self::NotIn, + 'NOT_BETWEEN', 'NOT BETWEEN' => self::Between, + 'STARTS WITH', 'START WITH' => self::StartsWith, + 'ENDS WITH', 'END WITH' => self::EndsWith, + default => self::tryFrom($operator), + }; + } + + /** + * @throws QueryException + */ + public static function fromOperator(string $operator): self + { + return self::tryFromOperator($operator) ?? throw QueryException::dueToUnknownOperator($operator); + } + + /** + * Values comparison. + * + * The method return true if the values satisfy the comparison operator, otherwise false is returned. + * + * @throws QueryException + */ + public function compare(mixed $subject, mixed $reference): bool + { + $this->accept($reference); + + return match ($this) { + self::Equals => self::isSingleValue($subject) ? $subject === $reference : $subject == $reference, + self::NotEquals => self::isSingleValue($subject) ? $subject !== $reference : $subject != $reference, + self::GreaterThan => $subject > $reference, + self::GreaterThanOrEqual => $subject >= $reference, + self::LesserThan => $subject < $reference, + self::LesserThanOrEqual => $subject <= $reference, + self::Between => $subject >= $reference[0] && $subject <= $reference[1], /* @phpstan-ignore-line */ + self::NotBetween => $subject < $reference[0] || $subject > $reference[1], /* @phpstan-ignore-line */ + self::In => in_array($subject, $reference, self::isSingleValue($subject)), /* @phpstan-ignore-line */ + self::NotIn => !in_array($subject, $reference, self::isSingleValue($subject)), /* @phpstan-ignore-line */ + self::Regexp => is_string($subject) && 1 === preg_match($reference, $subject), /* @phpstan-ignore-line */ + self::NotRegexp => is_string($subject) && 1 !== preg_match($reference, $subject), /* @phpstan-ignore-line */ + self::Contains => is_string($subject) && str_contains($subject, $reference), /* @phpstan-ignore-line */ + self::NotContain => is_string($subject) && !str_contains($subject, $reference), /* @phpstan-ignore-line */ + self::StartsWith => is_string($subject) && str_starts_with($subject, $reference), /* @phpstan-ignore-line */ + self::EndsWith => is_string($subject) && str_ends_with($subject, $reference), /* @phpstan-ignore-line */ + }; + } + + private static function isSingleValue(mixed $value): bool + { + return is_scalar($value) || null === $value; + } + + /** + * Assert if the reference value can be used with the Enum operator. + * + * @throws QueryException + */ + public function accept(mixed $reference): void + { + match ($this) { + self::Between, + self::NotBetween => match (true) { + !is_array($reference), + !array_is_list($reference), + 2 !== count($reference) => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be an list containing 2 values, the minimum and maximum values.'), + default => true, + }, + self::In, + self::NotIn => match (true) { + !is_array($reference) => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be an array.'), + default => true, + }, + self::Regexp, + self::NotRegexp => match (true) { + !is_string($reference), + '' === $reference, + false === @preg_match($reference, '') => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be a valid regular expression pattern string.'), + default => true, + }, + self::Contains, + self::NotContain, + self::StartsWith, + self::EndsWith => match (true) { + !is_string($reference), + '' === $reference => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be a non empty string.'), + default => true, + }, + self::Equals, + self::NotEquals, + self::GreaterThanOrEqual, + self::GreaterThan, + self::LesserThanOrEqual, + self::LesserThan => true, + }; + } +} diff --git a/vendor/league/csv/src/Query/Constraint/Criteria.php b/vendor/league/csv/src/Query/Constraint/Criteria.php new file mode 100644 index 0000000..9cd9390 --- /dev/null +++ b/vendor/league/csv/src/Query/Constraint/Criteria.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Constraint; + +use CallbackFilterIterator; +use Closure; +use Iterator; +use League\Csv\MapIterator; +use League\Csv\Query\Predicate; +use League\Csv\Query\PredicateCombinator; + +use function array_reduce; + +/** + * @phpstan-import-type Condition from PredicateCombinator + * @phpstan-import-type ConditionExtended from PredicateCombinator + */ +final class Criteria implements PredicateCombinator +{ + /** + * @param Condition $predicate + */ + private function __construct(private readonly Predicate|Closure $predicate) + { + } + + /** + * Creates a new instance with predicates join using the logical AND operator. + * + * @param ConditionExtended ...$predicates + */ + public static function all(Predicate|Closure|callable ...$predicates): self + { + return new self(function (mixed $value, int|string $key) use ($predicates): bool { + foreach ($predicates as $predicate) { + if (!$predicate($value, $key)) { + return false; + } + } + + return true; + }); + } + + /** + * Creates a new instance with predicates join using the logical NOT operator. + * + * @param ConditionExtended ...$predicates + */ + public static function none(Predicate|Closure|callable ...$predicates): self + { + return new self(function (mixed $value, int|string $key) use ($predicates): bool { + foreach ($predicates as $predicate) { + if ($predicate($value, $key)) { + return false; + } + } + + return true; + }); + } + + /** + * Creates a new instance with predicates join using the logical OR operator. + * + * @param ConditionExtended ...$predicates + */ + public static function any(Predicate|Closure|callable ...$predicates): self + { + return new self(function (mixed $value, int|string $key) use ($predicates): bool { + foreach ($predicates as $predicate) { + if ($predicate($value, $key)) { + return true; + } + } + + return false; + }); + } + + /** + * Creates a new instance with predicates join using the logical XOR operator. + * + * @param ConditionExtended ...$predicates + */ + public static function xany(Predicate|Closure|callable ...$predicates): self + { + return new self(fn (mixed $value, int|string $key): bool => array_reduce( + $predicates, + fn (bool $bool, Predicate|Closure|callable $predicate) => $predicate($value, $key) xor $bool, + false + )); + } + + public function __invoke(mixed $value, int|string $key): bool + { + return ($this->predicate)($value, $key); + } + + public function filter(iterable $value): Iterator + { + return new CallbackFilterIterator(MapIterator::toIterator($value), $this); + } + + /** + * @param ConditionExtended ...$predicates + */ + public function and(Predicate|Closure|callable ...$predicates): self + { + return self::all($this->predicate, ...$predicates); + } + + public function andNot(Predicate|Closure|callable ...$predicates): self + { + return self::all($this->predicate, self::none(...$predicates)); + } + + /** + * @param ConditionExtended ...$predicates + */ + public function not(Predicate|Closure|callable ...$predicates): self + { + return self::none($this->predicate, ...$predicates); + } + + /** + * @param ConditionExtended ...$predicates + */ + public function or(Predicate|Closure|callable ...$predicates): self + { + return self::any($this->predicate, ...$predicates); + } + + /** + * @param ConditionExtended ...$predicates + */ + public function orNot(Predicate|Closure|callable ...$predicates): self + { + return self::any($this->predicate, self::none(...$predicates)); + } + + /** + * @param ConditionExtended ...$predicates + */ + public function xor(Predicate|Closure|callable ...$predicates): self + { + return self::xany($this->predicate, ...$predicates); + } + + /** + * @param ConditionExtended ...$predicates + */ + public function xorNot(Predicate|Closure|callable ...$predicates): self + { + return self::xany($this->predicate, self::none(...$predicates)); + } +} diff --git a/vendor/league/csv/src/Query/Constraint/Offset.php b/vendor/league/csv/src/Query/Constraint/Offset.php new file mode 100644 index 0000000..ddbd615 --- /dev/null +++ b/vendor/league/csv/src/Query/Constraint/Offset.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Constraint; + +use CallbackFilterIterator; +use Closure; +use Iterator; +use League\Csv\MapIterator; +use League\Csv\Query; + +/** + * Enable filtering a record based on its offset. + * + * When used with PHP's array_filter with the ARRAY_FILTER_USE_BOTH flag + * the record value WILL NOT BE taken into account + */ +final class Offset implements Query\Predicate +{ + /** + * @throws Query\QueryException + */ + private function __construct( + public readonly Comparison|Closure $operator, + public readonly mixed $value, + ) { + if (!$this->operator instanceof Closure) { + $this->operator->accept($this->value); + } + } + + /** + * @throws Query\QueryException + */ + public static function filterOn( + Comparison|Closure|callable|string $operator, + mixed $value = null, + ): self { + if ($operator instanceof Closure) { + return new self($operator, null); + } + + if (is_callable($operator)) { + return new self(Closure::fromCallable($operator), $value); + } + + return new self( + is_string($operator) ? Comparison::fromOperator($operator) : $operator, + $value + ); + } + + /** + * @throws Query\QueryException + */ + public function __invoke(mixed $value, int|string $key): bool + { + if ($this->operator instanceof Closure) { + return ($this->operator)($key); + } + + return $this->operator->compare($key, $this->value); + } + + public function filter(iterable $value): Iterator + { + return new CallbackFilterIterator(MapIterator::toIterator($value), $this); + } +} diff --git a/vendor/league/csv/src/Query/Constraint/TwoColumns.php b/vendor/league/csv/src/Query/Constraint/TwoColumns.php new file mode 100644 index 0000000..b6e000f --- /dev/null +++ b/vendor/league/csv/src/Query/Constraint/TwoColumns.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Constraint; + +use CallbackFilterIterator; +use Closure; +use Iterator; +use League\Csv\MapIterator; +use League\Csv\Query\Predicate; +use League\Csv\Query\QueryException; +use League\Csv\Query\Row; +use ReflectionException; + +use function array_filter; +use function is_array; +use function is_int; +use function is_string; + +use const ARRAY_FILTER_USE_BOTH; + +/** + * Enable filtering a record by comparing the values of two of its column. + * + * When used with PHP's array_filter with the ARRAY_FILTER_USE_BOTH flag + * the record offset WILL NOT BE taken into account + */ +final class TwoColumns implements Predicate +{ + /** + * @throws QueryException + */ + private function __construct( + public readonly string|int $first, + public readonly Comparison|Closure $operator, + public readonly array|string|int $second, + ) { + !$this->operator instanceof Closure || !is_array($this->second) || throw new QueryException('The second column must be a string if the operator is a callback.'); + + if (is_array($this->second)) { + $res = array_filter($this->second, fn (mixed $value): bool => !is_string($value) && !is_int($value)); + if ([] !== $res) { + throw new QueryException('The second column must be a string, an integer or a list of strings and/or integer when the operator is not a callback.'); + } + } + } + + /** + * @throws QueryException + */ + public static function filterOn( + string|int $firstColumn, + Comparison|Closure|callable|string $operator, + array|string|int $secondColumn + ): self { + if (is_string($operator)) { + $operator = Comparison::fromOperator($operator); + } + + if (is_callable($operator)) { + return new self($firstColumn, Closure::fromCallable($operator), $secondColumn); + } + + return new self($firstColumn, $operator, $secondColumn); + } + + /** + * @throws QueryException + * @throws ReflectionException + */ + public function __invoke(mixed $value, int|string $key): bool + { + $val = match (true) { + is_array($this->second) => array_values(Row::from($value)->select(...$this->second)), + default => Row::from($value)->value($this->second), + }; + + if ($this->operator instanceof Closure) { + return ($this->operator)(Row::from($value)->value($this->first), $val); + } + + return Column::filterOn($this->first, $this->operator, $val)($value, $key); + } + + public function filter(iterable $value): Iterator + { + return new CallbackFilterIterator(MapIterator::toIterator($value), $this); + } +} diff --git a/vendor/league/csv/src/Query/Limit.php b/vendor/league/csv/src/Query/Limit.php new file mode 100644 index 0000000..dc63f4c --- /dev/null +++ b/vendor/league/csv/src/Query/Limit.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use League\Csv\MapIterator; +use LimitIterator; + +final class Limit +{ + private function __construct( + public readonly int $offset, + public readonly int $length, + ) { + 0 <= $this->offset || throw new QueryException(self::class.' expects the offset to be greater or equal to 0, '.$this->offset.' given.'); + -2 < $this->length || throw new QueryException(self::class.' expects the length to be greater or equal to -1, '.$this->length.' given.'); + } + + public static function new(int $offset, int $length): self + { + return new self($offset, $length); + } + + /** + * Allows iteration over a limited subset of items in an iterable structure. + */ + public function slice(iterable $value): LimitIterator + { + return new LimitIterator(MapIterator::toIterator($value), $this->offset, $this->length); + } +} diff --git a/vendor/league/csv/src/Query/Ordering/Column.php b/vendor/league/csv/src/Query/Ordering/Column.php new file mode 100644 index 0000000..1868362 --- /dev/null +++ b/vendor/league/csv/src/Query/Ordering/Column.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Ordering; + +use ArrayIterator; +use Closure; +use Iterator; +use League\Csv\Query\QueryException; +use League\Csv\Query\Row; +use League\Csv\Query\Sort; +use OutOfBoundsException; +use ReflectionException; + +use function is_array; +use function is_string; +use function iterator_to_array; +use function strtoupper; +use function trim; + +/** + * Enable sorting a record based on the value of a one of its cell. + */ +final class Column implements Sort +{ + private const ASCENDING = 'ASC'; + private const DESCENDING = 'DESC'; + + /** + * @param Closure(mixed, mixed): int $callback + */ + private function __construct( + public readonly string $direction, + public readonly string|int $column, + public readonly Closure $callback, + ) { + } + + /** + * @param (callable(mixed, mixed): int)|(Closure(mixed, mixed): int)|null $callback + * + * @throws QueryException + */ + public static function sortOn( + string|int $column, + string|int $direction, + Closure|callable|null $callback = null + ): self { + + $operator = match (true) { + SORT_ASC === $direction => self::ASCENDING, + SORT_DESC === $direction => self::DESCENDING, + is_string($direction) => match (strtoupper(trim($direction))) { + 'ASC', 'ASCENDING', 'UP' => self::ASCENDING, + 'DESC', 'DESCENDING', 'DOWN' => self::DESCENDING, + default => throw new QueryException('Unknown or unsupported ordering operator value: '.$direction), + }, + default => throw new QueryException('Unknown or unsupported ordering operator value: '.$direction), + }; + + $callback = match (true) { + null === $callback => static fn (mixed $first, mixed $second): int => $first <=> $second, + $callback instanceof Closure => $callback, + default => $callback(...), + }; + + return new self($operator, $column, $callback); + } + + /** + * @throws ReflectionException + * @throws QueryException + */ + public function __invoke(mixed $valueA, mixed $valueB): int + { + $first = Row::from($valueA)->value($this->column); + $second = Row::from($valueB)->value($this->column); + + return match ($this->direction) { + self::ASCENDING => ($this->callback)($first, $second), + default => ($this->callback)($second, $first), + }; + } + + public function sort(iterable $value): Iterator + { + $class = new class () extends ArrayIterator { + public function seek(int $offset): void + { + try { + parent::seek($offset); + } catch (OutOfBoundsException) { + return; + } + } + }; + + $it = new $class(!is_array($value) ? iterator_to_array($value) : $value); + $it->uasort($this); + + return $it; + } +} diff --git a/vendor/league/csv/src/Query/Ordering/MultiSort.php b/vendor/league/csv/src/Query/Ordering/MultiSort.php new file mode 100644 index 0000000..73f0ec6 --- /dev/null +++ b/vendor/league/csv/src/Query/Ordering/MultiSort.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query\Ordering; + +use ArrayIterator; +use Closure; +use Iterator; +use League\Csv\MapIterator; +use League\Csv\Query\Sort; +use League\Csv\Query\SortCombinator; +use OutOfBoundsException; + +use function array_map; + +/** + * Enable sorting a record based on multiple column. + * + * The class can be used with PHP's usort and uasort functions. + * + * @phpstan-import-type Ordering from SortCombinator + * @phpstan-import-type OrderingExtended from SortCombinator + */ +final class MultiSort implements SortCombinator +{ + /** @var array */ + private readonly array $sorts; + + /** + * @param OrderingExtended ...$sorts + */ + private function __construct(Sort|Closure|callable ...$sorts) + { + $this->sorts = array_map( + static fn (Sort|Closure|callable $sort): Sort|Closure => $sort instanceof Closure || $sort instanceof Sort ? $sort : $sort(...), + $sorts + ); + } + + /** + * @param OrderingExtended ...$sorts + */ + public static function all(Sort|Closure|callable ...$sorts): self + { + return new self(...$sorts); + } + + /** + * @param OrderingExtended ...$sorts + */ + public function append(Sort|Closure|callable ...$sorts): self + { + if ([] === $sorts) { + return $this; + } + + return new self(...$this->sorts, ...$sorts); + } + + /** + * @param OrderingExtended ...$sorts + */ + public function prepend(Sort|Closure|callable ...$sorts): self + { + if ([] === $sorts) { + return $this; + } + + return (new self(...$sorts))->append(...$this->sorts); + } + + public function __invoke(mixed $valueA, mixed $valueB): int + { + foreach ($this->sorts as $sort) { + if (0 !== ($result = $sort($valueA, $valueB))) { + return $result; + } + } + + return $result ?? 0; + } + + public function sort(iterable $value): Iterator + { + if ([] === $this->sorts) { + return MapIterator::toIterator($value); + } + + $class = new class () extends ArrayIterator { + public function seek(int $offset): void + { + try { + parent::seek($offset); + } catch (OutOfBoundsException) { + return; + } + } + }; + + $it = new $class(!is_array($value) ? iterator_to_array($value) : $value); + $it->uasort($this); + + return $it; + } +} diff --git a/vendor/league/csv/src/Query/Predicate.php b/vendor/league/csv/src/Query/Predicate.php new file mode 100644 index 0000000..359e59f --- /dev/null +++ b/vendor/league/csv/src/Query/Predicate.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use Iterator; + +/** + * Enable filtering a record based on its value and/or its offset. + * + * The class can be used directly with PHP's + *
    + *
  1. array_filter with the ARRAY_FILTER_USE_BOTH flag.
  2. + *
  3. CallbackFilterIterator class.
  4. + *
+ */ +interface Predicate +{ + /** + * The class predicate method. + * + * Evaluates each element of an iterable structure based on its value and its offset. + * The method must return true if the predicate is satisfied, false otherwise. + */ + public function __invoke(mixed $value, string|int $key): bool; + + /** + * Filters elements of an iterable structure using the class predicate method. + * + * @see Predicate::__invoke + */ + public function filter(iterable $value): Iterator; +} diff --git a/vendor/league/csv/src/Query/PredicateCombinator.php b/vendor/league/csv/src/Query/PredicateCombinator.php new file mode 100644 index 0000000..b5b3168 --- /dev/null +++ b/vendor/league/csv/src/Query/PredicateCombinator.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use Closure; + +/** + * @phpstan-type Condition Predicate|Closure(mixed, array-key): bool + * @phpstan-type ConditionExtended Predicate|Closure(mixed, array-key): bool|callable(mixed, array-key): bool + */ +interface PredicateCombinator extends Predicate +{ + /** + * Return an instance with the specified predicates + * joined together and with the current predicate + * using the AND Logical operator. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified changes. + * + * @param Condition ...$predicates + */ + public function and(Predicate|Closure ...$predicates): self; + + /** + * Return an instance with the specified predicates + * joined together and with the current predicate + * using the OR Logical operator. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified changes. + * + * @param Condition ...$predicates + */ + public function or(Predicate|Closure ...$predicates): self; + + /** + * Return an instance with the specified predicates + * joined together and with the current predicate + * using the NOT Logical operator. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified changes. + * + * @param Condition ...$predicates + */ + public function not(Predicate|Closure ...$predicates): self; + + /** + * Return an instance with the specified predicates + * joined together and with the current predicate + * using the XOR Logical operator. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified changes. + * + * @param Condition ...$predicates + */ + public function xor(Predicate|Closure ...$predicates): self; +} diff --git a/vendor/league/csv/src/Query/QueryException.php b/vendor/league/csv/src/Query/QueryException.php new file mode 100644 index 0000000..760820e --- /dev/null +++ b/vendor/league/csv/src/Query/QueryException.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use Exception; +use League\Csv\UnableToProcessCsv; + +final class QueryException extends Exception implements UnableToProcessCsv +{ + public static function dueToUnknownColumn(string|int $column, array|object $value): self + { + return match (true) { + is_object($value) => match (is_int($column)) { + true => new self('The object property name can not be the integer`'.$column.'`.'), + default => new self('The object property name `'.$column.'` could not be retrieved from the object.'), + }, + default => match (is_string($column)) { + true => new self('The column `'.$column.'` does not exist in the input array.'), + default => new self('The column with the offset `'.$column.'` does not exist in the input array.'), + }, + }; + } + + public static function dueToMissingColumn(): self + { + return new self('No valid column were found with the given data.'); + } + + public static function dueToUnknownOperator(string $operator): self + { + return new self('Unknown or unsupported comparison operator `'.$operator.'`'); + } +} diff --git a/vendor/league/csv/src/Query/Row.php b/vendor/league/csv/src/Query/Row.php new file mode 100644 index 0000000..dbd0064 --- /dev/null +++ b/vendor/league/csv/src/Query/Row.php @@ -0,0 +1,176 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use ArrayAccess; +use ReflectionException; +use ReflectionObject; +use TypeError; + +use function array_is_list; +use function array_key_exists; +use function array_map; +use function array_values; +use function count; +use function explode; +use function implode; +use function is_array; +use function is_int; +use function is_object; +use function lcfirst; +use function str_replace; + +final class Row +{ + public static function from(mixed $value): Row + { + return new self(match (true) { + is_object($value), + is_array($value) => $value, + default => throw new TypeError('The value must be an array or an object; received '.gettype($value).'.'), + }); + } + + private function __construct(private readonly array|object $row) + { + } + + /** + * Tries to retrieve a single value from a record. + * + * @throws ReflectionException + * @throws QueryException If the value can not be retrieved + * @see Row::select() + * + */ + public function value(string|int $key): mixed + { + return $this->select($key)[$key]; + } + + /** + * Tries to retrieve multiple values from a record. + * + * If the value is an array and the key is an integer the content will be retrieved + * from the array_values array form. Negative offset are supported. + * If the value is an object, the key MUST be a string. + * + * @throws ReflectionException + * @throws QueryException If the value can not be retrieved + * + * @return non-empty-array + */ + public function select(string|int ...$key): array + { + return match (true) { + is_object($this->row) => self::getObjectPropertyValue($this->row, ...$key), + default => self::getArrayEntry($this->row, ...$key), + }; + } + + /** + * @throws QueryException + * + * @return non-empty-array + */ + private function getArrayEntry(array $row, string|int ...$keys): array + { + $res = []; + $arrValues = array_values($row); + foreach ($keys as $key) { + if (array_key_exists($key, $res)) { + continue; + } + $offset = $key; + if (is_int($offset)) { + if (!array_is_list($row)) { + $row = $arrValues; + } + + if ($offset < 0) { + $offset += count($row); + } + } + + $res[$key] = array_key_exists($offset, $row) ? $row[$offset] : throw QueryException::dueToUnknownColumn($key, $row); + } + + return [] !== $res ? $res : throw QueryException::dueToMissingColumn(); + } + + /** + * @throws ReflectionException + * @throws QueryException + * + * @return non-empty-array + */ + private static function getObjectPropertyValue(object $row, string|int ...$keys): array + { + $res = []; + $object = new ReflectionObject($row); + foreach ($keys as $key) { + if (array_key_exists($key, $res)) { + continue; + } + + !is_int($key) || throw QueryException::dueToUnknownColumn($key, $row); + + if ($object->hasProperty($key) && $object->getProperty($key)->isPublic()) { + $res[$key] = $object->getProperty($key)->getValue($row); + continue; + } + + $methodNameList = [$key]; + if (($camelCasedKey = self::camelCase($key)) !== $key) { + $methodNameList[] = $camelCasedKey; + } + $methodNameList[] = self::camelCase($key, 'get'); + foreach ($methodNameList as $methodName) { + if ($object->hasMethod($methodName) + && $object->getMethod($methodName)->isPublic() + && 1 > $object->getMethod($methodName)->getNumberOfRequiredParameters() + ) { + $res[$key] = $object->getMethod($methodName)->invoke($row); + continue 2; + } + } + + if (method_exists($row, '__call')) { + $res[$key] = $object->getMethod('__call')->invoke($row, $methodNameList[1]); + continue; + } + + if ($row instanceof ArrayAccess && $row->offsetExists($key)) { + $res[$key] = $row->offsetGet($key); + continue; + } + + throw QueryException::dueToUnknownColumn($key, $row); + } + + return [] !== $res ? $res : throw QueryException::dueToMissingColumn(); + } + + private static function camelCase(string $value, string $prefix = ''): string + { + if ('' !== $prefix) { + $prefix .= '_'; + } + + return lcfirst(implode('', array_map( + ucfirst(...), + explode(' ', str_replace(['-', '_'], ' ', $prefix.$value)) + ))); + } +} diff --git a/vendor/league/csv/src/Query/Sort.php b/vendor/league/csv/src/Query/Sort.php new file mode 100644 index 0000000..d8f5cd1 --- /dev/null +++ b/vendor/league/csv/src/Query/Sort.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use Iterator; + +/** + * Enable sorting a record based on its value. + * + * The class can be used directly with PHP's + *
    + *
  1. usort and uasort.
  2. + *
  3. ArrayIterator::uasort.
  4. + *
  5. ArrayObject::uasort.
  6. + *
+ */ +interface Sort +{ + /** + * The class comparison method. + * + * The method must return an integer less than, equal to, or greater than zero + * if the first argument is considered to be respectively less than, equal to, + * or greater than the second. + */ + public function __invoke(mixed $valueA, mixed $valueB): int; + + /** + * Sort an iterable structure with the class comparison method and maintain index association. + */ + public function sort(iterable $value): Iterator; +} diff --git a/vendor/league/csv/src/Query/SortCombinator.php b/vendor/league/csv/src/Query/SortCombinator.php new file mode 100644 index 0000000..b13edae --- /dev/null +++ b/vendor/league/csv/src/Query/SortCombinator.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Query; + +use Closure; + +/** + * @phpstan-type Ordering Sort|Closure(mixed, mixed): int + * @phpstan-type OrderingExtended Sort|Closure(mixed, mixed): int|callable(mixed, mixed): int + */ +interface SortCombinator extends Sort +{ + /** + * Return an instance with the specified sorting algorithm + * added after the currently registered sorting algorithms. + * + * This method MUST retain the state of the current instance, + * and return an instance that contains the specified changes. + * + * @param Ordering ...$sorts + */ + public function append(Sort|Closure ...$sorts): self; + + /** + * Return an instance with the specified sorting algorithm + * added before the currently registered sorting algorithms. + * + * This method MUST retain the state of the current instance, + * and return an instance that contains the specified changes. + * + * @param Ordering ...$sorts + */ + public function prepend(Sort|Closure ...$sorts): self; +} diff --git a/vendor/league/csv/src/RFC4180Field.php b/vendor/league/csv/src/RFC4180Field.php new file mode 100644 index 0000000..f86345c --- /dev/null +++ b/vendor/league/csv/src/RFC4180Field.php @@ -0,0 +1,216 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use InvalidArgumentException; +use php_user_filter; +use Throwable; +use TypeError; + +use function array_map; +use function in_array; +use function is_string; +use function restore_error_handler; +use function set_error_handler; +use function str_replace; +use function strcspn; +use function stream_bucket_append; +use function stream_bucket_make_writeable; +use function stream_bucket_new; +use function stream_filter_register; +use function stream_get_filters; +use function strlen; +use function trigger_error; + +use const E_USER_WARNING; +use const PSFS_ERR_FATAL; +use const PSFS_PASS_ON; +use const STREAM_FILTER_READ; +use const STREAM_FILTER_WRITE; + +/** + * A stream filter to conform the CSV field to RFC4180. + * + * DEPRECATION WARNING! This class will be removed in the next major point release + * + * @deprecated since version 9.2.0 + * @see AbstractCsv::setEscape + * + * @see https://tools.ietf.org/html/rfc4180#section-2 + */ +class RFC4180Field extends php_user_filter +{ + #[Deprecated(message: 'use League\Csv\Reader::setEscape or League\Csv\Writer::setEscape instead', since: 'league/csv:9.2.0')] + public const FILTERNAME = 'convert.league.csv.rfc4180'; + + /** + * The value being search for. + * + * @var array + */ + protected array $search = []; + + /** + * The replacement value that replace found $search values. + * + * @var array + */ + protected array $replace = []; + + /** + * Characters that triggers enclosure with PHP fputcsv. + */ + protected static string $force_enclosure = "\n\r\t "; + + /** + * Static method to add the stream filter to a {@link AbstractCsv} object. + */ + public static function addTo(AbstractCsv $csv, string $whitespace_replace = ''): AbstractCsv + { + self::register(); + + $params = [ + 'enclosure' => $csv->getEnclosure(), + 'escape' => $csv->getEscape(), + 'mode' => $csv instanceof Writer ? STREAM_FILTER_WRITE : STREAM_FILTER_READ, + ]; + + if ($csv instanceof Writer && '' !== $whitespace_replace) { + self::addFormatterTo($csv, $whitespace_replace); + $params['whitespace_replace'] = $whitespace_replace; + } + + return $csv->addStreamFilter(self::FILTERNAME, $params); + } + + /** + * Add a formatter to the {@link Writer} object to format the record + * field to avoid enclosure around a field with an empty space. + */ + #[Deprecated(message: 'use League\Csv\Reader::setEscape or League\Csv\Writer::setEscape instead', since: 'league/csv:9.2.0')] + public static function addFormatterTo(Writer $csv, string $whitespace_replace): Writer + { + if ('' == $whitespace_replace || strlen($whitespace_replace) !== strcspn($whitespace_replace, self::$force_enclosure)) { + throw new InvalidArgumentException('The sequence contains a character that enforces enclosure or is a CSV control character or is an empty string.'); + } + + $mapper = fn ($value) => is_string($value) + ? str_replace(' ', $whitespace_replace, $value) + : $value; + + return $csv->addFormatter(fn (array $record): array => array_map($mapper, $record)); + } + + /** + * Static method to register the class as a stream filter. + */ + public static function register(): void + { + if (!in_array(self::FILTERNAME, stream_get_filters(), true)) { + stream_filter_register(self::FILTERNAME, self::class); + } + } + + /** + * Static method to return the stream filter filtername. + */ + public static function getFiltername(): string + { + return self::FILTERNAME; + } + + /** + * @param resource $in + * @param resource $out + * @param int $consumed + */ + public function filter($in, $out, &$consumed, bool $closing): int + { + $data = ''; + while (null !== ($bucket = stream_bucket_make_writeable($in))) { + $data .= $bucket->data; + $consumed += $bucket->datalen; + } + + try { + $data = str_replace($this->search, $this->replace, $data); + } catch (Throwable $exception) { + trigger_error('An error occurred while executing the stream filter `'.$this->filtername.'`: '.$exception->getMessage(), E_USER_WARNING); + + return PSFS_ERR_FATAL; + } + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + stream_bucket_append($out, stream_bucket_new($this->stream, $data)); + restore_error_handler(); + + return PSFS_PASS_ON; + } + + #[Deprecated(message: 'use League\Csv\Reader::setEscape or League\Csv\Writer::setEscape instead', since: 'league/csv:9.2.0')] + public function onCreate(): bool + { + if (!is_array($this->params)) { + throw new TypeError('The filter parameters must be an array.'); + } + + static $mode_list = [STREAM_FILTER_READ => 1, STREAM_FILTER_WRITE => 1]; + + $state = isset($this->params['enclosure'], $this->params['escape'], $this->params['mode'], $mode_list[$this->params['mode']]) + && 1 === strlen($this->params['enclosure']) + && 1 === strlen($this->params['escape']); + + if (false === $state) { + return false; + } + + $this->search = [$this->params['escape'].$this->params['enclosure']]; + $this->replace = [$this->params['enclosure'].$this->params['enclosure']]; + if (STREAM_FILTER_WRITE !== $this->params['mode']) { + return true; + } + + $this->search = [$this->params['escape'].$this->params['enclosure']]; + $this->replace = [$this->params['escape'].$this->params['enclosure'].$this->params['enclosure']]; + if ($this->isValidSequence($this->params)) { + $this->search[] = $this->params['whitespace_replace']; + $this->replace[] = ' '; + } + + return true; + } + + /** + * @codeCoverageIgnore + * Validate params property. + */ + protected function isValidParams(array $params): bool + { + static $mode_list = [STREAM_FILTER_READ => 1, STREAM_FILTER_WRITE => 1]; + + return isset($params['enclosure'], $params['escape'], $params['mode'], $mode_list[$params['mode']]) + && 1 === strlen($params['enclosure']) + && 1 === strlen($params['escape']); + } + + /** + * Is Valid White space replaced sequence. + */ + protected function isValidSequence(array $params): bool + { + return isset($params['whitespace_replace']) + && strlen($params['whitespace_replace']) === strcspn($params['whitespace_replace'], self::$force_enclosure); + } +} diff --git a/vendor/league/csv/src/RdbmsResult.php b/vendor/league/csv/src/RdbmsResult.php new file mode 100644 index 0000000..c76aa72 --- /dev/null +++ b/vendor/league/csv/src/RdbmsResult.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Generator; +use mysqli_result; +use PDO; +use PDOStatement; +use PgSql\Result; +use RuntimeException; +use SQLite3Result; + +use function array_column; +use function array_map; +use function pg_fetch_assoc; +use function pg_field_name; +use function pg_num_fields; +use function range; + +use const SQLITE3_ASSOC; + +final class RdbmsResult +{ + /** + * @throws RuntimeException If no column names information is found. + * + * @return list + */ + public static function columnNames(PDOStatement|Result|mysqli_result|SQLite3Result $result): array + { + return match (true) { + $result instanceof PDOStatement => array_map(fn (int $index): string => $result->getColumnMeta($index)['name'] ?? throw new RuntimeException('Unable to get metadata for column '.$index), range(0, $result->columnCount() - 1)), + $result instanceof mysqli_result => array_column($result->fetch_fields(), 'name'), + $result instanceof Result => array_map(fn (int $index) => pg_field_name($result, $index), range(0, pg_num_fields($result) - 1)), + $result instanceof SQLite3Result => array_map($result->columnName(...), range(0, $result->numColumns() - 1)), + }; + } + + /** + * @return Generator> + */ + public static function rows(PDOStatement|Result|mysqli_result|SQLite3Result $result): Generator + { + if ($result instanceof PDOStatement) { + while ($row = $result->fetch(PDO::FETCH_ASSOC)) { + yield $row; /* @phpstan-ignore-line */ + } + + return; + } + + if ($result instanceof Result) { + while ($row = pg_fetch_assoc($result)) { + yield $row; + } + + return; + } + + if ($result instanceof mysqli_result) { + while ($row = $result->fetch_assoc()) { + yield $row; + } + + return; + } + + while ($row = $result->fetchArray(SQLITE3_ASSOC)) { + yield $row; + } + } +} diff --git a/vendor/league/csv/src/Reader.php b/vendor/league/csv/src/Reader.php new file mode 100644 index 0000000..9245421 --- /dev/null +++ b/vendor/league/csv/src/Reader.php @@ -0,0 +1,666 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use CallbackFilterIterator; +use Closure; +use Deprecated; +use Iterator; +use JsonSerializable; +use League\Csv\Serializer\Denormalizer; +use League\Csv\Serializer\MappingFailed; +use League\Csv\Serializer\TypeCastingFailed; +use SplFileObject; + +use function array_filter; +use function array_unique; +use function is_array; +use function iterator_count; +use function strlen; +use function substr; + +use const STREAM_FILTER_READ; + +/** + * A class to parse and read records from a CSV document. + * + * @template TValue of array + */ +class Reader extends AbstractCsv implements TabularDataReader, JsonSerializable +{ + protected const STREAM_FILTER_MODE = STREAM_FILTER_READ; + + protected ?int $header_offset = null; + protected int $nb_records = -1; + protected bool $is_empty_records_included = false; + /** @var array header record. */ + protected array $header = []; + + public static function createFromPath(string $path, string $open_mode = 'r', $context = null): static + { + return parent::createFromPath($path, $open_mode, $context); + } + + /** + * Selects the record to be used as the CSV header. + * + * Because the header is represented as an array, to be valid + * a header MUST contain only unique string value. + * + * @param int|null $offset the header record offset + * + * @throws Exception if the offset is a negative integer + */ + public function setHeaderOffset(?int $offset): static + { + if ($offset === $this->header_offset) { + return $this; + } + + null === $offset || -1 < $offset || throw InvalidArgument::dueToInvalidHeaderOffset($offset, __METHOD__); + + $this->header_offset = $offset; + $this->resetProperties(); + + return $this; + } + + /** + * Enables skipping empty records. + */ + public function skipEmptyRecords(): static + { + if ($this->is_empty_records_included) { + $this->is_empty_records_included = false; + $this->nb_records = -1; + } + + return $this; + } + + /** + * Disables skipping empty records. + */ + public function includeEmptyRecords(): static + { + if (!$this->is_empty_records_included) { + $this->is_empty_records_included = true; + $this->nb_records = -1; + } + + return $this; + } + + /** + * Tells whether empty records are skipped by the instance. + */ + public function isEmptyRecordsIncluded(): bool + { + return $this->is_empty_records_included; + } + + protected function resetProperties(): void + { + parent::resetProperties(); + + $this->nb_records = -1; + $this->header = []; + } + + /** + * Returns the header offset. + */ + public function getHeaderOffset(): ?int + { + return $this->header_offset; + } + + /** + * @throws SyntaxError + * + * Returns the header record. + */ + public function getHeader(): array + { + return match (true) { + null === $this->header_offset, + [] !== $this->header => $this->header, + default => ($this->header = $this->setHeader($this->header_offset)), + }; + } + + /** + * Determines the CSV record header. + * + * @throws SyntaxError If the header offset is set and no record is found or is the empty array + * + * @return array + */ + protected function setHeader(int $offset): array + { + $inputBom = null; + $header = $this->seekRow($offset); + if (0 === $offset) { + $inputBom = Bom::tryFrom($this->getInputBOM()); + $header = $this->removeBOM( + $header, + !$this->is_input_bom_included ? $inputBom?->length() ?? 0 : 0, + $this->enclosure + ); + } + + return match (true) { + [] === $header, + [null] === $header, + [false] === $header, + [''] === $header && 0 === $offset && null !== $inputBom => throw SyntaxError::dueToHeaderNotFound($offset), + default => $header, + }; + } + + /** + * @throws Exception + * + * Returns the row at a given offset. + */ + protected function seekRow(int $offset): array + { + $this->getDocument()->seek($offset); + $record = $this->document->current(); + + return match (true) { + false === $record => [], + default => (array) $record, + }; + } + + /** + * @throws Exception + * + * Returns the document as an Iterator. + */ + protected function getDocument(): SplFileObject|Stream + { + $this->document->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD); + $this->document->setCsvControl($this->delimiter, $this->enclosure, $this->escape); + $this->document->rewind(); + + return $this->document; + } + + /** + * Strips the BOM sequence from a record. + * + * @param array $record + * + * @return array + */ + protected function removeBOM(array $record, int $bom_length, string $enclosure): array + { + if ([] === $record || !is_string($record[0]) || 0 === $bom_length || strlen($record[0]) < $bom_length) { + return $record; + } + + $record[0] = substr($record[0], $bom_length); + if ($enclosure.$enclosure !== substr($record[0].$record[0], strlen($record[0]) - 1, 2)) { + return $record; + } + + $record[0] = substr($record[0], 1, -1); + + return $record; + } + + public function fetchColumn(string|int $index = 0): Iterator + { + return ResultSet::from($this)->fetchColumn($index); + } + + public function value(int|string $column = 0): mixed + { + return ResultSet::from($this)->value($column); + } + + /** + * @throws Exception + */ + public function first(): array + { + return ResultSet::from($this)->first(); + } + + /** + * @throws Exception + */ + public function nth(int $nth): array + { + return ResultSet::from($this)->nth($nth); + } + + /** + * @param class-string $className + * + * @throws Exception + */ + public function nthAsObject(int $nth, string $className, array $header = []): ?object + { + return ResultSet::from($this)->nthAsObject($nth, $className, $header); + } + + /** + * @param class-string $className + * + * @throws Exception + */ + public function firstAsObject(string $className, array $header = []): ?object + { + return ResultSet::from($this)->firstAsObject($className, $header); + } + + public function fetchPairs(string|int $offset_index = 0, string|int $value_index = 1): Iterator + { + return ResultSet::from($this)->fetchPairs($offset_index, $value_index); + } + + /** + * @throws Exception + */ + public function count(): int + { + if (-1 === $this->nb_records) { + $this->nb_records = iterator_count($this->getRecords()); + } + + return $this->nb_records; + } + + /** + * @throws Exception + */ + public function getIterator(): Iterator + { + return $this->getRecords(); + } + + /** + * @throws Exception + */ + public function jsonSerialize(): array + { + return array_values([...$this->getRecords()]); + } + + /** + * @param callable(array, array-key=): (void|bool|null) $callback + */ + public function each(callable $callback): bool + { + return ResultSet::from($this)->each($callback); + } + + /** + * @param callable(array, array-key=): bool $callback + */ + public function exists(callable $callback): bool + { + return ResultSet::from($this)->exists($callback); + } + + /** + * @param callable(TInitial|null, array, array-key=): TInitial $callback + * @param TInitial|null $initial + * + * @template TInitial + * + * @return TInitial|null + */ + public function reduce(callable $callback, mixed $initial = null): mixed + { + return ResultSet::from($this)->reduce($callback, $initial); + } + + /** + * Run a map over each container members. + * + * @template TMap + * + * @param callable(array, int): TMap $callback + * + * @return Iterator + */ + public function map(callable $callback): Iterator + { + return MapIterator::fromIterable($this, $callback); + } + + /** + * @param positive-int $recordsCount + * + * @throws InvalidArgument + * + * @return iterable + */ + public function chunkBy(int $recordsCount): iterable + { + return ResultSet::from($this)->chunkBy($recordsCount); + } + + /** + * @param array $headers + */ + public function mapHeader(array $headers): TabularDataReader + { + return (new Statement())->process($this, $headers); + } + + /** + * @param \League\Csv\Query\Predicate|Closure(array, array-key): bool $predicate + * + * @throws Exception + * @throws SyntaxError + */ + public function filter(Query\Predicate|Closure $predicate): TabularDataReader + { + return (new Statement())->where($predicate)->process($this); + } + + /** + * @param int<0, max> $offset + * @param int<-1, max> $length + * + * @throws Exception + * @throws SyntaxError + */ + public function slice(int $offset, int $length = -1): TabularDataReader + { + return (new Statement())->offset($offset)->limit($length)->process($this); + } + + /** + * @param Closure(mixed, mixed): int $orderBy + * + * @throws Exception + * @throws SyntaxError + */ + public function sorted(Query\Sort|Closure $orderBy): TabularDataReader + { + return (new Statement())->orderBy($orderBy)->process($this); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract all found fragment identifiers for the specifield tabular data + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + * @return iterable + */ + public function matching(string $expression): iterable + { + return (new FragmentFinder())->findAll($expression, $this); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract the first found fragment identifier of the tabular data or returns null + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + */ + public function matchingFirst(string $expression): ?TabularDataReader + { + return (new FragmentFinder())->findFirst($expression, $this); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract the first found fragment identifier of the tabular data or fail + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + * @throws FragmentNotFound + */ + public function matchingFirstOrFail(string $expression): TabularDataReader + { + return (new FragmentFinder())->findFirstOrFail($expression, $this); + } + + public function select(string|int ...$columns): TabularDataReader + { + return ResultSet::from($this)->select(...$columns); + } + + public function selectAllExcept(string|int ...$columns): TabularDataReader + { + return ResultSet::from($this)->selectAllExcept(...$columns); + } + + /** + * @param array $header + * + * @throws Exception + * + * @return Iterator + */ + public function getRecords(array $header = []): Iterator + { + return $this->combineHeader( + $this->prepareRecords(), + $this->prepareHeader($header) + ); + } + + /** + * @template T of object + * @param class-string $className + * @param array $header + * + * @throws Exception + * @throws MappingFailed + * @throws TypeCastingFailed + * + * @return iterator + */ + public function getRecordsAsObject(string $className, array $header = []): Iterator + { + /** @var array $header */ + $header = $this->prepareHeader($header); + + return Denormalizer::assignAll( + $className, + $this->combineHeader($this->prepareRecords(), $header), + $header + ); + } + + /** + * @throws Exception + */ + protected function prepareRecords(): Iterator + { + $normalized = fn ($record): bool => is_array($record) && ($this->is_empty_records_included || $record !== [null]); + $bom = null; + if (!$this->is_input_bom_included) { + $bom = Bom::tryFrom($this->getInputBOM()); + } + + $records = $this->stripBOM(new CallbackFilterIterator($this->getDocument(), $normalized), $bom); + if (null !== $this->header_offset) { + $records = new CallbackFilterIterator($records, fn (array $record, int $offset): bool => $offset !== $this->header_offset); + } + + if ($this->is_empty_records_included) { + $records = new MapIterator($records, fn (array $record): array => ([null] === $record) ? [] : $record); + } + + return $records; + } + + /** + * Strips the BOM sequence from the returned records if necessary. + */ + protected function stripBOM(Iterator $iterator, ?Bom $bom): Iterator + { + if (null === $bom) { + return $iterator; + } + + $bomLength = $bom->length(); + $mapper = function (array $record, int $index) use ($bomLength): array { + if (0 !== $index) { + return $record; + } + + $record = $this->removeBOM($record, $bomLength, $this->enclosure); + + return match ($record) { + [''] => [null], + default => $record, + }; + }; + + return new CallbackFilterIterator( + new MapIterator($iterator, $mapper), + fn (array $record): bool => $this->is_empty_records_included || $record !== [null] + ); + } + + /** + * @param array $header + * + * @throws SyntaxError + * + * @return array + */ + protected function prepareHeader($header = []): array + { + $header == array_filter($header, is_string(...)) || throw SyntaxError::dueToInvalidHeaderColumnNames(); + + return $this->computeHeader($header); + } + + /** + * Returns the header to be used for iteration. + * + * @param array $header + * + * @throws SyntaxError If the header contains non unique column name + * + * @return array + */ + protected function computeHeader(array $header): array + { + if ([] === $header) { + $header = $this->getHeader(); + } + + return match (true) { + $header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header), + [] !== array_filter(array_keys($header), fn (string|int $value) => !is_int($value) || $value < 0) => throw new SyntaxError('The header mapper indexes should only contain positive integer or 0.'), + default => $header, + }; + } + + protected function combineHeader(Iterator $iterator, array $header): Iterator + { + $formatter = fn (array $record): array => array_reduce( + $this->formatters, + fn (array $record, Closure $formatter): array => $formatter($record), + $record + ); + + return match ([]) { + $header => new MapIterator($iterator, $formatter(...)), + default => new MapIterator($iterator, function (array $record) use ($header, $formatter): array { + $assocRecord = []; + foreach ($header as $offset => $headerName) { + $assocRecord[$headerName] = $record[$offset] ?? null; + } + + return $formatter($assocRecord); + }), + }; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @throws Exception + * + * @deprecated since version 9.23.0 + * @codeCoverageIgnore + * + * @see ResultSet::fetchColumn() + */ + #[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')] + public function fetchColumnByName(string $name): Iterator + { + return ResultSet::from($this)->fetchColumnByName($name); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @throws Exception + * + * @deprecated since version 9.23.0 + * @codeCoverageIgnore + * + * @see ResultSet::fetchColumn() + */ + #[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')] + public function fetchColumnByOffset(int $offset = 0): Iterator + { + return ResultSet::from($this)->fetchColumnByOffset($offset); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Reader::nth() + * @deprecated since version 9.9.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\Reader::nth() instead', since:'league/csv:9.9.0')] + public function fetchOne(int $nth_record = 0): array + { + return $this->nth($nth_record); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Reader::getRecordsAsObject() + * @deprecated Since version 9.15.0 + * @codeCoverageIgnore + * + * @param class-string $className + * @param array $header + * + * @throws Exception + * @throws MappingFailed + * @throws TypeCastingFailed + */ + #[Deprecated(message:'use League\Csv\Reader::getRecordsAsObject() instead', since:'league/csv:9.15.0')] + public function getObjects(string $className, array $header = []): Iterator + { + return $this->getRecordsAsObject($className, $header); + } +} diff --git a/vendor/league/csv/src/ResultSet.php b/vendor/league/csv/src/ResultSet.php new file mode 100644 index 0000000..02d0c55 --- /dev/null +++ b/vendor/league/csv/src/ResultSet.php @@ -0,0 +1,718 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use ArrayIterator; +use CallbackFilterIterator; +use Closure; +use Deprecated; +use Generator; +use Iterator; +use JsonSerializable; +use League\Csv\Serializer\Denormalizer; +use League\Csv\Serializer\MappingFailed; +use League\Csv\Serializer\TypeCastingFailed; +use LimitIterator; +use mysqli_result; +use PDOStatement; +use PgSql\Result; +use RuntimeException; +use SQLite3Result; +use Throwable; + +use function array_filter; +use function array_flip; +use function array_key_exists; +use function array_reduce; +use function array_search; +use function array_values; +use function is_int; +use function is_string; +use function iterator_count; + +/** + * Represents the result set of a {@link Reader} processed by a {@link Statement}. + * + * @template TValue of array + */ +class ResultSet implements TabularDataReader, JsonSerializable +{ + /** @var array */ + protected array $header; + + /* @var Iterator> */ + protected Iterator $records; + + /** + * @internal + * + * @see self::from() for public API usage + * + * @param Iterator|array> $records + * @param array $header + * + * @throws SyntaxError + */ + public function __construct(Iterator|array $records = [], array $header = []) + { + $header === array_filter($header, is_string(...)) || throw SyntaxError::dueToInvalidHeaderColumnNames(); + + $this->header = array_values($this->validateHeader($header)); + $this->records = match (true) { + $records instanceof Iterator => $records, + default => new ArrayIterator($records), + }; + } + + /** + * @throws SyntaxError if the header syntax is invalid + */ + protected function validateHeader(array $header): array + { + return match (true) { + $header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header), + [] !== array_filter(array_keys($header), fn (string|int $value) => !is_int($value) || $value < 0) => throw new SyntaxError('The header mapper indexes should only contain positive integer or 0.'), + default => $header, + }; + } + + /** + * Returns a new instance from a tabular data implementing object. + * + * @throws RuntimeException|SyntaxError If the column names can not be found + */ + public static function tryFrom(PDOStatement|Result|mysqli_result|SQLite3Result|TabularData $tabularData): ?self + { + try { + return self::from($tabularData); + } catch (Throwable) { + return null; + } + } + + /** + * Returns a new instance from a tabular data implementing object. + * + * @throws RuntimeException|SyntaxError If the column names can not be found + */ + public static function from(PDOStatement|Result|mysqli_result|SQLite3Result|TabularData $tabularData): self + { + if (!$tabularData instanceof TabularData) { + /** @var ArrayIterator> $data */ + $data = new ArrayIterator(); + foreach (RdbmsResult::rows($tabularData) as $offset => $row) { + $data[$offset] = $row; + } + + return new self($data, RdbmsResult::columnNames($tabularData)); + } + + return new self($tabularData->getRecords(), $tabularData->getHeader()); + } + + public function __destruct() + { + unset($this->records); + } + + /** + * Returns the header associated with the result set. + * + * @return array + */ + public function getHeader(): array + { + return $this->header; + } + + /** + * @throws SyntaxError + */ + public function getIterator(): Iterator + { + return $this->getRecords(); + } + + /** + * @param callable(array, array-key=): mixed $callback + */ + public function each(callable $callback): bool + { + foreach ($this as $offset => $record) { + if (false === $callback($record, $offset)) { + return false; + } + } + + return true; + } + + /** + * @param callable(array, array-key=): bool $callback + */ + public function exists(callable $callback): bool + { + foreach ($this as $offset => $record) { + if (true === $callback($record, $offset)) { + return true; + } + } + + return false; + } + + /** + * @param callable(TInitial|null, array, array-key=): TInitial $callback + * @param TInitial|null $initial + * + * @template TInitial + * + * @return TInitial|null + */ + public function reduce(callable $callback, mixed $initial = null): mixed + { + foreach ($this as $offset => $record) { + $initial = $callback($initial, $record, $offset); + } + + return $initial; + } + + /** + * Run a map over each container members. + * + * @template TMap + * + * @param callable(array, int): TMap $callback + * + * @return Iterator + */ + public function map(callable $callback): Iterator + { + return MapIterator::fromIterable($this, $callback); + } + + /** + * @param positive-int $recordsCount + * + * @throws InvalidArgument + * + * @return iterable + */ + public function chunkBy(int $recordsCount): iterable + { + $recordsCount > 0 || throw InvalidArgument::dueToInvalidChunkSize($recordsCount, __METHOD__); + + $header = $this->getHeader(); + $records = []; + $nbRecords = 0; + foreach ($this->getRecords() as $record) { + $records[] = $record; + ++$nbRecords; + if ($nbRecords === $recordsCount) { + yield new self($records, $header); + $records = []; + $nbRecords = 0; + } + } + + if ([] !== $records) { + yield new self($records, $header); + } + } + + /** + * @param array $headers + */ + public function mapHeader(array $headers): TabularDataReader + { + return (new Statement())->process($this, $headers); + } + + public function filter(Query\Predicate|Closure $predicate): TabularDataReader + { + return (new Statement())->where($predicate)->process($this); + } + + public function slice(int $offset, ?int $length = null): TabularDataReader + { + return (new Statement())->offset($offset)->limit($length ?? -1)->process($this); + } + + public function sorted(Query\Sort|Closure $orderBy): TabularDataReader + { + return (new Statement())->orderBy($orderBy)->process($this); + } + + public function select(string|int ...$columns): TabularDataReader + { + if ([] === $columns) { + return $this; + } + + $recordsHeader = $this->getHeader(); + $hasHeader = [] !== $recordsHeader; + $selectColumn = function (array $header, string|int $field) use ($recordsHeader, $hasHeader): array { + if (is_string($field)) { + $index = array_search($field, $recordsHeader, true); + if (false === $index) { + throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__); + } + + $header[$index] = $field; + + return $header; + } + + if ($hasHeader && !array_key_exists($field, $recordsHeader)) { + throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__); + } + + $header[$field] = $recordsHeader[$field] ?? $field; + + return $header; + }; + + /** @var array $header */ + $header = array_reduce($columns, $selectColumn, []); + $callback = function (array $record) use ($header): array { + $element = []; + $row = array_values($record); + foreach ($header as $offset => $headerName) { + $element[$headerName] = $row[$offset] ?? null; + } + + return $element; + }; + + return new self(new MapIterator($this, $callback), $hasHeader ? $header : []); + } + + public function selectAllExcept(string|int ...$columns): TabularDataReader + { + if ([] === $columns) { + return $this; + } + + $recordsHeader = $this->getHeader(); + $hasHeader = [] !== $recordsHeader; + $selectColumnsToSkip = function (array $res, string|int $column) use ($recordsHeader, $hasHeader): array { + if ($hasHeader) { + if (is_string($column)) { + $index = array_search($column, $recordsHeader, true); + if (false === $index) { + throw InvalidArgument::dueToInvalidColumnIndex($column, 'offset', __METHOD__); + } + + $res[$index] = 1; + + return $res; + } + + if (!array_key_exists($column, $recordsHeader)) { + throw InvalidArgument::dueToInvalidColumnIndex($column, 'offset', __METHOD__); + } + + $res[$column] = 1; + + return $res; + } + + if (!is_int($column)) { + throw InvalidArgument::dueToInvalidColumnIndex($column, 'offset', __METHOD__); + } + + $res[$column] = 1; + + return $res; + }; + + /** @var array $columnsToSkip */ + $columnsToSkip = array_reduce($columns, $selectColumnsToSkip, []); + $callback = function (array $record) use ($columnsToSkip): array { + $element = []; + $index = 0; + foreach ($record as $name => $value) { + if (!array_key_exists($index, $columnsToSkip)) { + $element[$name] = $value; + } + ++$index; + } + + return $element; + }; + + $newHeader = []; + if ($hasHeader) { + $newHeader = array_values( + array_filter( + $recordsHeader, + fn (string|int $key) => !array_key_exists($key, $columnsToSkip), + ARRAY_FILTER_USE_KEY + ) + ); + } + + return new self(new MapIterator($this, $callback), $newHeader); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract all found fragment identifiers for the specifield tabular data + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + * @return iterable + */ + public function matching(string $expression): iterable + { + return (new FragmentFinder())->findAll($expression, $this); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract the first found fragment identifier of the tabular data or returns null + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + */ + public function matchingFirst(string $expression): ?TabularDataReader + { + return (new FragmentFinder())->findFirst($expression, $this); + } + + /** + * EXPERIMENTAL WARNING! This method implementation will change in the next major point release. + * + * Extract the first found fragment identifier of the tabular data or fail + * + * @experimental since version 9.12.0 + * + * @throws SyntaxError + * @throws FragmentNotFound + */ + public function matchingFirstOrFail(string $expression): TabularDataReader + { + return (new FragmentFinder())->findFirstOrFail($expression, $this); + } + + /** + * @param array $header + * + * @throws Exception + * + * @return Iterator + */ + public function getRecords(array $header = []): Iterator + { + return $this->combineHeader($this->prepareHeader($header)); + } + + /** + * @template T of object + * @param class-string $className + * @param array $header + * + * @throws Exception + * @throws MappingFailed + * @throws TypeCastingFailed + * @return iterator + */ + public function getRecordsAsObject(string $className, array $header = []): Iterator + { + $header = $this->prepareHeader($header); + + return Denormalizer::assignAll( + $className, + $this->combineHeader($header), + $header + ); + } + + /** + * @param array $header + * + * @throws SyntaxError + * @return array + */ + protected function prepareHeader(array $header): array + { + $header === array_filter($header, is_string(...)) || throw SyntaxError::dueToInvalidHeaderColumnNames(); + $header = $this->validateHeader($header); + if ([] === $header) { + $header = $this->header; + } + return $header; + } + + /** + * Combines the header to each record if present. + * + * @param array $header + * + * @return Iterator + */ + protected function combineHeader(array $header): Iterator + { + return match (true) { + [] === $header => $this->records, + default => new MapIterator($this->records, function (array $record) use ($header): array { + $assocRecord = []; + $row = array_values($record); + foreach ($header as $offset => $headerName) { + $assocRecord[$headerName] = $row[$offset] ?? null; + } + + return $assocRecord; + }), + }; + } + + public function count(): int + { + return iterator_count($this->records); + } + + public function jsonSerialize(): array + { + return array_values([...$this->records]); + } + + public function first(): array + { + return $this->nth(0); + } + + public function value(int|string $column = 0): mixed + { + return match (true) { + is_string($column) => $this->first()[$column] ?? null, + default => array_values($this->first())[$column] ?? null, + }; + } + + public function nth(int $nth): array + { + 0 <= $nth || throw InvalidArgument::dueToInvalidRecordOffset($nth, __METHOD__); + + $iterator = new LimitIterator($this->getIterator(), $nth, 1); + $iterator->rewind(); + + /** @var array|null $result */ + $result = $iterator->current(); + + return $result ?? []; + } + + /** + * @param class-string $className + * + * @throws InvalidArgument + */ + public function nthAsObject(int $nth, string $className, array $header = []): ?object + { + $header = $this->prepareHeader($header); + $record = $this->nth($nth); + if ([] === $record) { + return null; + } + + if ([] === $header || $this->header === $header) { + return Denormalizer::assign($className, $record); + } + + $row = array_values($record); + $record = []; + foreach ($header as $offset => $headerName) { + $record[$headerName] = $row[$offset] ?? null; + } + + return Denormalizer::assign($className, $record); + } + + /** + * @param class-string $className + * + * @throws InvalidArgument + */ + public function firstAsObject(string $className, array $header = []): ?object + { + return $this->nthAsObject(0, $className, $header); + } + + public function fetchColumn(string|int $index = 0): Iterator + { + return $this->yieldColumn( + $this->getColumnIndex($index, 'offset', __METHOD__) + ); + } + + protected function yieldColumn(string|int $offset): Generator + { + yield from new MapIterator( + new CallbackFilterIterator($this->records, fn (array $record): bool => isset($record[$offset])), + fn (array $record): string => $record[$offset] + ); + } + + /** + * Filters a column name against the header if any. + * + * @throws InvalidArgument if the field is invalid or not found + */ + protected function getColumnIndex(string|int $field, string $type, string $method): string|int + { + return match (true) { + is_string($field) => $this->getColumnIndexByValue($field, $type, $method), + default => $this->getColumnIndexByKey($field, $type, $method), + }; + } + + /** + * Returns the selected column name. + * + * @throws InvalidArgument if the column is not found + */ + protected function getColumnIndexByValue(string $value, string $type, string $method): string + { + return match (true) { + false === array_search($value, $this->header, true) => throw InvalidArgument::dueToInvalidColumnIndex($value, $type, $method), + default => $value, + }; + } + + /** + * Returns the selected column name according to its offset. + * + * @throws InvalidArgument if the field is invalid or not found + */ + protected function getColumnIndexByKey(int $index, string $type, string $method): int|string + { + return match (true) { + $index < 0 => throw InvalidArgument::dueToInvalidColumnIndex($index, $type, $method), + [] === $this->header => $index, + false !== ($value = array_search($index, array_flip($this->header), true)) => $value, + default => throw InvalidArgument::dueToInvalidColumnIndex($index, $type, $method), + }; + } + + public function fetchPairs(string|int $offset_index = 0, string|int $value_index = 1): Iterator + { + $offset = $this->getColumnIndex($offset_index, 'offset', __METHOD__); + $value = $this->getColumnIndex($value_index, 'value', __METHOD__); + + $iterator = new MapIterator( + new CallbackFilterIterator($this->records, fn (array $record): bool => isset($record[$offset])), + fn (array $record): array => [$record[$offset], $record[$value] ?? null] + ); + + /** @var array{0:int|string, 1:string|null} $pair */ + foreach ($iterator as $pair) { + yield $pair[0] => $pair[1]; + } + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @throws Exception + * + * @deprecated since version 9.23.0 + * @codeCoverageIgnore + * + * @see ResultSet::fetchColumn() + */ + #[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')] + public function fetchColumnByName(string $name): Iterator + { + return $this->yieldColumn( + $this->getColumnIndexByValue($name, 'name', __METHOD__) + ); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @throws Exception + * + * @deprecated since version 9.23.0 + * @codeCoverageIgnore + * + * @see ResultSet::fetchColumn() + */ + #[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')] + public function fetchColumnByOffset(int $offset): Iterator + { + return $this->yieldColumn( + $this->getColumnIndexByKey($offset, 'offset', __METHOD__) + ); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see ResultSet::nth() + * @deprecated since version 9.9.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\Resultset::nth() instead', since:'league/csv:9.9.0')] + public function fetchOne(int $nth_record = 0): array + { + return $this->nth($nth_record); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see ResultSet::getRecordsAsObject() + * @deprecated Since version 9.15.0 + * @codeCoverageIgnore + * + * @param class-string $className + * @param array $header + * + * @throws Exception + * @throws MappingFailed + * @throws TypeCastingFailed + */ + #[Deprecated(message:'use League\Csv\ResultSet::getRecordsAsObject() instead', since:'league/csv:9.15.0')] + public function getObjects(string $className, array $header = []): Iterator + { + return $this->getRecordsAsObject($className, $header); + } + + /** + * Returns a new instance from an object implementing the TabularDataReader interface. + * + * @throws SyntaxError + */ + #[Deprecated(message:'use League\Csv\ResultSet::from() instead', since:'league/csv:9.22.0')] + public static function createFromTabularDataReader(TabularDataReader $reader): self + { + return self::from($reader); + } + + /** + * Returns a new instance from a collection without header. + */ + #[Deprecated(message:'use League\Csv\ResultSet::from() instead', since:'league/csv:9.22.0')] + public static function createFromRecords(iterable $records = []): self + { + return new self(MapIterator::toIterator($records)); + } +} diff --git a/vendor/league/csv/src/Serializer/AfterMapping.php b/vendor/league/csv/src/Serializer/AfterMapping.php new file mode 100644 index 0000000..1654be2 --- /dev/null +++ b/vendor/league/csv/src/Serializer/AfterMapping.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use Attribute; +use Deprecated; +use ReflectionAttribute; +use ReflectionClass; + +/** + * @deprecated since version 9.17.0 + * + * @see MapRecord + */ +#[Attribute(Attribute::TARGET_CLASS)] +final class AfterMapping +{ + public readonly MapRecord $mapRecord; + public readonly array $methods; + + #[Deprecated(message: 'use League\Csv\Serializer\MapRecord instead', since: 'league/csv:9.17.0')] + public function __construct(string ...$methods) + { + $this->mapRecord = new MapRecord($methods); + $this->methods = $this->mapRecord->afterMapping; + } + + public static function from(ReflectionClass $class): ?self + { + $attributes = $class->getAttributes(self::class, ReflectionAttribute::IS_INSTANCEOF); + $nbAttributes = count($attributes); + + return match (true) { + 0 === $nbAttributes => null, + 1 < $nbAttributes => throw new MappingFailed('Using more than one `'.self::class.'` attribute on a class property or method is not supported.'), + default => $attributes[0]->newInstance(), + }; + } +} diff --git a/vendor/league/csv/src/Serializer/ArrayShape.php b/vendor/league/csv/src/Serializer/ArrayShape.php new file mode 100644 index 0000000..88c919c --- /dev/null +++ b/vendor/league/csv/src/Serializer/ArrayShape.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace League\Csv\Serializer; + +use function in_array; + +enum ArrayShape: string +{ + case List = 'list'; + case Csv = 'csv'; + case Json = 'json'; + + public function equals(mixed $value): bool + { + return $value instanceof self + && $value === $this; + } + + public function isOneOf(self ...$types): bool + { + return in_array($this, $types, true); + } +} diff --git a/vendor/league/csv/src/Serializer/CallbackCasting.php b/vendor/league/csv/src/Serializer/CallbackCasting.php new file mode 100644 index 0000000..d3fdf79 --- /dev/null +++ b/vendor/league/csv/src/Serializer/CallbackCasting.php @@ -0,0 +1,392 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use Closure; +use Deprecated; +use ReflectionClass; +use ReflectionNamedType; +use ReflectionParameter; +use ReflectionProperty; +use ReflectionType; +use ReflectionUnionType; +use Throwable; + +use function array_key_exists; +use function class_exists; + +/** + * @internal Container for registering Closure as type and/or type alias casting + * @template TValue + */ +final class CallbackCasting implements TypeCasting +{ + /** @var array */ + private static array $types = []; + /** @var array> */ + private static array $aliases = []; + + private string $type; + private readonly bool $isNullable; + /** @var Closure(mixed, bool, mixed...): mixed */ + private Closure $callback; + private array $options = []; + private string $message; + private readonly TypeCastingInfo $info; + + public function __construct( + ReflectionProperty|ReflectionParameter $reflectionProperty, + private readonly ?string $alias = null + ) { + [$this->type, $this->isNullable] = self::resolve($reflectionProperty); + + $this->message = match (true) { + $reflectionProperty instanceof ReflectionParameter => 'The method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` argument `'.$reflectionProperty->getName().'` must be typed with a supported type.', + $reflectionProperty instanceof ReflectionProperty => 'The property `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` must be typed with a supported type.', + }; + + $this->callback = fn (mixed $value, bool $isNullable, mixed ...$arguments): mixed => $value; + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + /** + * @throws MappingFailed + */ + public function setOptions(?string $type = null, mixed ...$options): void + { + if (null === $this->alias) { + if (Type::Mixed->value === $this->type && null !== $type) { + $this->type = $type; + } + + try { + $this->callback = self::resolveTypeCallback($this->type); /* @phpstan-ignore-line */ + $this->options = $options; + + return; + } catch (Throwable) { + + } + + throw new MappingFailed($this->message); + } + + if (Type::Mixed->value === $this->type) { + $this->type = self::aliases()[$this->alias]; + } + + $this->callback = self::resolveAliasCallback($this->type, $this->alias); + $this->options = $options; + } + + /** + * @return TValue + */ + public function toVariable(mixed $value): mixed + { + try { + return ($this->callback)($value, $this->isNullable, ...$this->options); + } catch (Throwable $exception) { + ! $exception instanceof TypeCastingFailed || throw $exception; + null !== $value || throw TypeCastingFailed::dueToNotNullableType($this->type, $exception, $this->info); + + throw TypeCastingFailed::dueToInvalidValue(match (true) { + '' === $value => 'empty string', + default => $value, + }, $this->type, $exception, $this->info); + } + } + + /** + * @param Closure(mixed, bool, mixed...): TValue $callback + */ + public static function register(string $type, Closure $callback, ?string $alias = null): void + { + if (null === $alias) { + self::$types[$type] = match (true) { + class_exists($type), + interface_exists($type), + Type::tryFrom($type) instanceof Type => $callback, + default => throw new MappingFailed('The `'.$type.'` could not be register.'), + }; + + return; + } + + 1 === preg_match('/^@\w+$/', $alias) || throw new MappingFailed("The alias `$alias` is invalid. It must start with an `@` character and contain alphanumeric (letters, numbers, regardless of case) plus underscore (_)."); + + foreach (self::$aliases as $aliases) { + foreach ($aliases as $registeredAlias => $__) { + $alias !== $registeredAlias || throw new MappingFailed("The alias `$alias` is already registered. Please choose another name."); + } + } + + self::$aliases[$type][$alias] = match (true) { + class_exists($type), + interface_exists($type), + Type::tryFrom($type) instanceof Type => $callback, + default => throw new MappingFailed('The `'.$type.'` could not be register.'), + }; + } + + public static function unregisterType(string $type): bool + { + if (!array_key_exists($type, self::$types)) { + return false; + } + + unset(self::$types[$type]); + + return true; + } + + public static function unregisterTypes(): void + { + self::$types = []; + } + + public static function unregisterAlias(string $alias): bool + { + if (1 !== preg_match('/^@\w+$/', $alias)) { + return false; + } + + foreach (self::$aliases as $type => $aliases) { + foreach ($aliases as $registeredAlias => $__) { + if ($registeredAlias === $alias) { + unset(self::$aliases[$type][$registeredAlias]); + + return true; + } + } + } + + return false; + } + + public static function unregisterAliases(): void + { + self::$aliases = []; + } + + public static function unregisterAll(): void + { + self::unregisterTypes(); + self::unregisterAliases(); + } + + public static function supportsAlias(?string $alias): bool + { + return null !== $alias && array_key_exists($alias, self::aliases()); + } + + public static function supportsType(?string $type): bool + { + if (null === $type) { + return false; + } + + try { + self::resolveTypeCallback($type); /* @phpstan-ignore-line */ + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * @return array + */ + public static function types(): array + { + return array_keys(self::$types); + } + + /** + * @return array + */ + public static function aliases(): array + { + $res = []; + foreach (self::$aliases as $registeredType => $aliases) { + foreach ($aliases as $registeredAlias => $__) { + $res[$registeredAlias] = $registeredType; + } + } + + return $res; + } + + public static function supports(ReflectionParameter|ReflectionProperty $reflectionProperty, ?string $alias = null): bool + { + $propertyTypeList = self::getTypes($reflectionProperty->getType()); + if ([] === $propertyTypeList && self::supportsAlias($alias)) { + return true; + } + + foreach ($propertyTypeList as $propertyType) { + $type = $propertyType->getName(); + if (null === $alias) { + if (self::supportsType($type)) { + return true; + } + + continue; + } + + if (self::aliasSupportsType($type) || (Type::Mixed->value === $type && self::supportsAlias($alias))) { + return true; + } + } + + return false; + } + + private static function aliasSupportsType(string $type): bool + { + foreach (self::aliases() as $registeredType) { + if ($type === $registeredType) { + return true; + } + + try { + if ((new ReflectionClass($type))->implementsInterface($registeredType)) { /* @phpstan-ignore-line */ + return true; + } + } catch (Throwable) { + } + } + + return false; + } + + /** + * @param class-string $type + */ + private static function resolveTypeCallback(string $type): Closure + { + foreach (self::$types as $registeredType => $callback) { + if ($type === $registeredType) { + return $callback; + } + + try { + $reflType = new ReflectionClass($type); + if ($reflType->implementsInterface($registeredType)) { + return $callback; + } + } catch (Throwable) { + } + } + + throw new MappingFailed('The `'.$type.'` could not be resolved.'); + } + + private static function resolveAliasCallback(string $type, string $alias): Closure + { + $rType = self::aliases()[$alias] ?? null; + if (isset($rType)) { + return self::$aliases[$rType][$alias]; + } + + foreach (self::aliases() as $aliasName => $registeredType) { + try { + $reflType = new ReflectionClass($type); /* @phpstan-ignore-line */ + if ($reflType->implementsInterface($registeredType)) { + return self::$aliases[$registeredType][$aliasName]; + } + } catch (Throwable) { + } + } + + throw new MappingFailed('The `'.$type.'` could not be resolved.'); + } + + /** + * @throws MappingFailed + * + * @return array{0:string, 1:bool} + */ + private static function resolve(ReflectionParameter|ReflectionProperty $reflectionProperty): array + { + if (null === $reflectionProperty->getType()) { + return [Type::Mixed->value, true]; + } + + $types = self::getTypes($reflectionProperty->getType()); + + $type = null; + $isNullable = false; + $hasMixed = false; + foreach ($types as $foundType) { + if (!$isNullable && $foundType->allowsNull()) { + $isNullable = true; + } + + if (null === $type) { + $instanceName = $foundType->getName(); + if (self::supportsType($instanceName) || array_key_exists($instanceName, self::$aliases)) { + $type = $foundType; + } + + if (true !== $hasMixed && Type::Mixed->value === $instanceName) { + $hasMixed = true; + } + } + } + + return match (true) { + $type instanceof ReflectionNamedType => [$type->getName(), $isNullable], + $hasMixed => [Type::Mixed->value, true], + default => throw new MappingFailed(match (true) { + $reflectionProperty instanceof ReflectionParameter => 'The method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` argument `'.$reflectionProperty->getName().'` must be typed with a supported type.', + $reflectionProperty instanceof ReflectionProperty => 'The property `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` must be typed with a supported type.', + }), + }; + } + + /** + * @return array + */ + private static function getTypes(?ReflectionType $type): array + { + return match (true) { + $type instanceof ReflectionNamedType => [$type], + $type instanceof ReflectionUnionType => array_filter( + $type->getTypes(), + fn (ReflectionType $innerType) => $innerType instanceof ReflectionNamedType + ), + default => [], + }; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated since version 9.13.0 + * @see CallbackCasting::unregisterType() + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\Serializer\CallbackCasting::unregisterType() instead', since:'league/csv:9.13.0')] + public static function unregister(string $type): bool + { + return self::unregisterType($type); + } +} diff --git a/vendor/league/csv/src/Serializer/CastToArray.php b/vendor/league/csv/src/Serializer/CastToArray.php new file mode 100644 index 0000000..6a488ea --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToArray.php @@ -0,0 +1,228 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use JsonException; +use League\Csv\Exception; +use League\Csv\Reader; +use ReflectionParameter; +use ReflectionProperty; + +use function array_map; +use function explode; +use function filter_var; +use function is_array; +use function json_decode; +use function strlen; + +use const FILTER_REQUIRE_ARRAY; +use const JSON_THROW_ON_ERROR; + +/** + * @implements TypeCasting + */ +final class CastToArray implements TypeCasting +{ + private readonly Type $type; + private readonly bool $isNullable; + private ArrayShape $shape; + private int $filterFlag; + /** @var non-empty-string */ + private string $separator = ','; + private string $delimiter = ''; + private string $enclosure = '"'; + /** @var int<1, max> $depth */ + private int $depth = 512; + private int $flags = 0; + private ?array $default = null; + private bool $trimElementValueBeforeCasting = false; + private ?int $headerOffset = null; + private readonly TypeCastingInfo $info; + + /** + * @throws MappingFailed + */ + public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty) + { + [$this->type, $this->isNullable] = $this->init($reflectionProperty); + $this->shape = ArrayShape::List; + $this->filterFlag = Type::String->filterFlag(); + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + /** + * @param non-empty-string $delimiter + * @param non-empty-string $separator + * @param int<1, max> $depth + * + * @throws MappingFailed + */ + public function setOptions( + ?array $default = null, + ArrayShape|string $shape = ArrayShape::List, + string $separator = ',', + string $delimiter = ',', + string $enclosure = '"', + int $depth = 512, + int $flags = 0, + Type|string $type = Type::String, + bool $trimElementValueBeforeCasting = false, + ?int $headerOffset = null, + ): void { + if (!$shape instanceof ArrayShape) { + $shape = ArrayShape::tryFrom($shape) ?? throw new MappingFailed('Unable to resolve the array shape; Verify your options arguments.'); + } + + if (!$type instanceof Type) { + $type = Type::tryFrom($type) ?? throw new MappingFailed('Unable to resolve the array value type; Verify your options arguments.'); + } + + $this->shape = $shape; + $this->depth = $depth; + $this->separator = $separator; + $this->delimiter = $delimiter; + $this->enclosure = $enclosure; + $this->flags = $flags; + $this->default = $default; + $this->filterFlag = match (true) { + 1 > $this->depth && $this->shape->equals(ArrayShape::Json) => throw new MappingFailed('the json depth can not be less than 1.'), + 1 > strlen($this->separator) && $this->shape->equals(ArrayShape::List) => throw new MappingFailed('expects separator to be a non-empty string for list conversion; empty string given.'), + 1 !== strlen($this->delimiter) && $this->shape->equals(ArrayShape::Csv) => throw new MappingFailed('expects delimiter to be a single character for CSV conversion; `'.$this->delimiter.'` given.'), + 1 !== strlen($this->enclosure) && $this->shape->equals(ArrayShape::Csv) => throw new MappingFailed('expects enclosure to be a single character; `'.$this->enclosure.'` given.'), + default => $this->resolveFilterFlag($type), + }; + $this->trimElementValueBeforeCasting = $trimElementValueBeforeCasting; + $this->headerOffset = $headerOffset; + } + + public function toVariable(mixed $value): ?array + { + if (null === $value) { + return match (true) { + $this->isNullable, + Type::Mixed->equals($this->type) => $this->default, + default => throw TypeCastingFailed::dueToNotNullableType($this->type->value, info: $this->info), + }; + } + + if ('' === $value) { + return []; + } + + if (is_array($value)) { + return $value; + } + + if (!is_string($value)) { + throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, info: $this->info); + } + + if ($this->shape->equals(ArrayShape::Json)) { + try { + $data = json_decode($value, true, $this->depth, $this->flags | JSON_THROW_ON_ERROR); + } catch (JsonException $exception) { + throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, $exception, $this->info); + } + + if (!is_array($data)) { + throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, info: $this->info); + } + + return $data; + } + + if ($this->shape->equals(ArrayShape::Csv)) { + try { + $data = Reader::createFromString($value); + $data->setDelimiter($this->delimiter); + $data->setEnclosure($this->enclosure); + $data->setEscape(''); + $data->setHeaderOffset($this->headerOffset); + if ($this->trimElementValueBeforeCasting) { + $data->addFormatter($this->trimString(...)); + } + $data->addFormatter($this->filterElement(...)); + + return [...$data]; + } catch (Exception $exception) { + throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, $exception, $this->info); + } + } + + $data = explode($this->separator, $value); + + return $this->filterElement(match (true) { + $this->trimElementValueBeforeCasting => $this->trimString($data), + default => $data, + }); + } + + private function trimString(array $record): array + { + return array_map( + fn (mixed $value): mixed => is_string($value) ? trim($value) : $value, + $record + ); + } + + private function filterElement(array $record): array + { + return filter_var($record, $this->filterFlag, FILTER_REQUIRE_ARRAY); + } + + /** + * @throws MappingFailed if the type is not supported + */ + private function resolveFilterFlag(?Type $type): int + { + return match (true) { + $this->shape->equals(ArrayShape::Json) => Type::String->filterFlag(), + $type instanceof Type && $type->isOneOf(Type::Bool, Type::True, Type::False, Type::String, Type::Float, Type::Int) => $type->filterFlag(), + default => throw new MappingFailed('Only scalar type are supported for `array` value casting.'), + }; + } + + /** + * @return array{0:Type, 1:bool} + */ + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array + { + if (null === $reflectionProperty->getType()) { + return [Type::Mixed, true]; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Array, Type::Iterable)) { + $type = $found; + } + } + + if (null === $type) { + throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'array', 'iterable', 'mixed'); + } + + return [$type[0], $isNullable]; + } +} diff --git a/vendor/league/csv/src/Serializer/CastToBool.php b/vendor/league/csv/src/Serializer/CastToBool.php new file mode 100644 index 0000000..b73a8fc --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToBool.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionParameter; +use ReflectionProperty; + +use function filter_var; + +/** + * @implements TypeCasting + */ +final class CastToBool implements TypeCasting +{ + private readonly bool $isNullable; + private readonly Type $type; + private readonly TypeCastingInfo $info; + private ?bool $default = null; + + public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty) + { + [$this->type, $this->isNullable] = $this->init($reflectionProperty); + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function setOptions( + ?bool $default = null, + bool $emptyStringAsNull = false, + ): void { + $this->default = $default; + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + /** + * @throws TypeCastingFailed + */ + public function toVariable(mixed $value): ?bool + { + $returnValue = match (true) { + is_bool($value) => $value, + null !== $value => filter_var($value, Type::Bool->filterFlag()), + $this->isNullable => $this->default, + default => throw TypeCastingFailed::dueToNotNullableType('boolean', info: $this->info), + }; + + return match (true) { + Type::True->equals($this->type) && true !== $returnValue && !$this->isNullable, + Type::False->equals($this->type) && false !== $returnValue && !$this->isNullable => throw TypeCastingFailed::dueToInvalidValue(match (true) { + null === $value => 'null', + '' === $value => 'empty string', + default => $value, + }, $this->type->value, info: $this->info), + default => $returnValue, + }; + } + + /** + * @return array{0:Type, 1:bool} + */ + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array + { + if (null === $reflectionProperty->getType()) { + return [Type::Mixed, true]; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Bool, Type::True, Type::False)) { + $type = $found; + } + } + + if (null === $type) { + throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'bool', 'mixed'); + } + + return [$type[0], $isNullable]; + } +} diff --git a/vendor/league/csv/src/Serializer/CastToDate.php b/vendor/league/csv/src/Serializer/CastToDate.php new file mode 100644 index 0000000..5697bee --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToDate.php @@ -0,0 +1,159 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use DateTime; +use DateTimeImmutable; +use DateTimeInterface; +use DateTimeZone; +use ReflectionClass; +use ReflectionParameter; +use ReflectionProperty; +use Throwable; + +use function class_exists; +use function is_string; + +/** + * @implements TypeCasting + */ +final class CastToDate implements TypeCasting +{ + /** @var class-string */ + private string $class; + private readonly bool $isNullable; + private DateTimeImmutable|DateTime|null $default = null; + private readonly Type $type; + private readonly TypeCastingInfo $info; + private ?DateTimeZone $timezone = null; + private ?string $format = null; + + /** + * @throws MappingFailed + */ + public function __construct( + ReflectionProperty|ReflectionParameter $reflectionProperty, + ) { + [$this->type, $this->class, $this->isNullable] = $this->init($reflectionProperty); + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + /** + * @param ?class-string $className + * + * @throws MappingFailed + */ + public function setOptions( + ?string $default = null, + ?string $format = null, + DateTimeZone|string|null $timezone = null, + ?string $className = null, + ): void { + $this->class = match (true) { + !interface_exists($this->class) && !Type::Mixed->equals($this->type) => $this->class, + DateTimeInterface::class === $this->class && null === $className => DateTimeImmutable::class, + interface_exists($this->class) && null !== $className && class_exists($className) && (new ReflectionClass($className))->implementsInterface($this->class) => $className, + default => throw new MappingFailed('`'.$this->info->targetName.'` type is `'.($this->class ?? 'mixed').'` but the specified class via the `$className` argument is invalid or could not be found.'), + }; + + try { + $this->format = $format; + $this->timezone = is_string($timezone) ? new DateTimeZone($timezone) : $timezone; + $this->default = (null !== $default) ? $this->cast($default) : $default; + } catch (Throwable $exception) { + throw new MappingFailed('The `timezone` and/or `format` options used for `'.self::class.'` are invalud.', 0, $exception); + } + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + /** + * @throws TypeCastingFailed + */ + public function toVariable(mixed $value): DateTimeImmutable|DateTime|null + { + return match (true) { + null !== $value && '' !== $value => $this->cast($value), + $this->isNullable => $this->default, + default => throw TypeCastingFailed::dueToNotNullableType($this->class, info: $this->info), + }; + } + + /** + * @throws TypeCastingFailed + */ + private function cast(mixed $value): DateTimeImmutable|DateTime + { + if ($value instanceof DateTimeInterface) { + if ($value instanceof $this->class) { + return $value; + } + + return ($this->class)::createFromInterface($value); + } + + is_string($value) || throw TypeCastingFailed::dueToInvalidValue($value, $this->class, info: $this->info); + + try { + $date = null !== $this->format ? + ($this->class)::createFromFormat($this->format, $value, $this->timezone) : + new ($this->class)($value, $this->timezone); + if (false === $date) { + throw TypeCastingFailed::dueToInvalidValue($value, $this->class); + } + } catch (Throwable $exception) { + if ($exception instanceof TypeCastingFailed) { + throw $exception; + } + + throw TypeCastingFailed::dueToInvalidValue($value, $this->class, $exception, $this->info); + } + + return $date; + } + + /** + * @throws MappingFailed + * + * @return array{0:Type, 1:class-string, 2:bool} + */ + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array + { + if (null === $reflectionProperty->getType()) { + return [Type::Mixed, DateTimeInterface::class, true]; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Date)) { + $type = $found; + } + } + + null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, DateTimeInterface::class, 'mixed'); + + /** @var class-string $className */ + $className = $type[1]->getName(); + + return [$type[0], $className, $isNullable]; + } +} diff --git a/vendor/league/csv/src/Serializer/CastToEnum.php b/vendor/league/csv/src/Serializer/CastToEnum.php new file mode 100644 index 0000000..5abd199 --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToEnum.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use BackedEnum; +use ReflectionEnum; +use ReflectionParameter; +use ReflectionProperty; +use Throwable; +use UnitEnum; + +/** + * @implements TypeCasting + */ +class CastToEnum implements TypeCasting +{ + private readonly bool $isNullable; + private readonly Type $type; + private ?UnitEnum $default = null; + private readonly TypeCastingInfo $info; + /** @var class-string */ + private string $class; + + /** + * @throws MappingFailed + */ + public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty) + { + [$this->type, $this->class, $this->isNullable] = $this->init($reflectionProperty); + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + /** + * @param ?class-string $className * + * + * @throws MappingFailed + */ + public function setOptions( + ?string $default = null, + ?string $className = null, + bool $emptyStringAsNull = false, + ): void { + if (Type::Mixed->equals($this->type) || in_array($this->class, [BackedEnum::class , UnitEnum::class], true)) { + (null !== $className && enum_exists($className)) || throw new MappingFailed('`'.$this->info->targetName.'` type is `'.($this->class ?? 'mixed').'` but the specified class via the `$className` argument is invalid or could not be found.'); + $this->class = $className; + } + + try { + $this->default = (null !== $default) ? $this->cast($default) : $default; + } catch (TypeCastingFailed $exception) { + throw new MappingFailed(message:'The `default` option is invalid.', previous: $exception); + } + } + + /** + * @throws TypeCastingFailed + */ + public function toVariable(mixed $value): BackedEnum|UnitEnum|null + { + return match (true) { + null !== $value => $this->cast($value), + $this->isNullable => $this->default, + default => throw TypeCastingFailed::dueToNotNullableType($this->class, info: $this->info), + }; + } + + /** + * @throws TypeCastingFailed + */ + private function cast(mixed $value): BackedEnum|UnitEnum + { + if ($value instanceof $this->class) { + return $value; + } + + is_string($value) || throw throw TypeCastingFailed::dueToInvalidValue($value, $this->class, info: $this->info); + + try { + $enum = new ReflectionEnum($this->class); + if (!$enum->isBacked()) { + return $enum->getCase($value)->getValue(); + } + + $backedValue = 'int' === $enum->getBackingType()->getName() ? filter_var($value, Type::Int->filterFlag()) : $value; + + return $this->class::from($backedValue); /* @phpstan-ignore-line */ + } catch (Throwable $exception) { + throw throw TypeCastingFailed::dueToInvalidValue($value, $this->class, $exception, $this->info); + } + } + + /** + * @return array{0:Type, 1:class-string, 2:bool} + */ + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array + { + if (null === $reflectionProperty->getType()) { + return [Type::Mixed, UnitEnum::class, true]; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Enum)) { + $type = $found; + } + } + + null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'enum', 'mixed'); + + /** @var class-string $className */ + $className = $type[1]->getName(); + + return [$type[0], $className, $isNullable]; + } +} diff --git a/vendor/league/csv/src/Serializer/CastToFloat.php b/vendor/league/csv/src/Serializer/CastToFloat.php new file mode 100644 index 0000000..1406a17 --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToFloat.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionParameter; +use ReflectionProperty; + +use function filter_var; + +/** + * @implements TypeCasting + */ +final class CastToFloat implements TypeCasting +{ + private readonly bool $isNullable; + private ?float $default = null; + private readonly TypeCastingInfo $info; + + public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty) + { + $this->isNullable = $this->init($reflectionProperty); + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + public function setOptions( + int|float|null $default = null, + bool $emptyStringAsNull = false, + ): void { + $this->default = $default; + } + + /** + * @throws TypeCastingFailed + */ + public function toVariable(mixed $value): ?float + { + if (null === $value) { + return match ($this->isNullable) { + true => $this->default, + false => throw TypeCastingFailed::dueToNotNullableType('float', info: $this->info), + }; + } + + is_scalar($value) || throw TypeCastingFailed::dueToInvalidValue($value, Type::Int->value, info: $this->info); + + $float = filter_var($value, Type::Float->filterFlag()); + + return match ($float) { + false => throw TypeCastingFailed::dueToInvalidValue($value, Type::Float->value, info: $this->info), + default => $float, + }; + } + + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): bool + { + if (null === $reflectionProperty->getType()) { + return true; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Float)) { + $type = $found; + } + } + + null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'float', 'null', 'mixed'); + + return $isNullable; + } +} diff --git a/vendor/league/csv/src/Serializer/CastToInt.php b/vendor/league/csv/src/Serializer/CastToInt.php new file mode 100644 index 0000000..479d4e5 --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToInt.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionParameter; +use ReflectionProperty; + +use function filter_var; + +/** + * @implements TypeCasting + */ +final class CastToInt implements TypeCasting +{ + private readonly bool $isNullable; + private ?int $default = null; + private readonly TypeCastingInfo $info; + + public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty) + { + $this->isNullable = $this->init($reflectionProperty); + $this->info = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function info(): TypeCastingInfo + { + return $this->info; + } + + public function setOptions( + ?int $default = null, + bool $emptyStringAsNull = false, + ): void { + $this->default = $default; + } + + /** + * @throws TypeCastingFailed + */ + public function toVariable(mixed $value): ?int + { + if (null === $value) { + return match ($this->isNullable) { + true => $this->default, + false => throw TypeCastingFailed::dueToNotNullableType('integer', info: $this->info), + }; + } + + is_scalar($value) || throw TypeCastingFailed::dueToInvalidValue($value, Type::Int->value, info: $this->info); + + $int = filter_var($value, Type::Int->filterFlag()); + + return match ($int) { + false => throw TypeCastingFailed::dueToInvalidValue($value, Type::Int->value, info: $this->info), + default => $int, + }; + } + + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): bool + { + if (null === $reflectionProperty->getType()) { + return true; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Int, Type::Float)) { + $type = $found; + } + } + + null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'int', 'float', 'null', 'mixed'); + + return $isNullable; + } +} diff --git a/vendor/league/csv/src/Serializer/CastToString.php b/vendor/league/csv/src/Serializer/CastToString.php new file mode 100644 index 0000000..08bbfe8 --- /dev/null +++ b/vendor/league/csv/src/Serializer/CastToString.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionParameter; +use ReflectionProperty; + +/** + * @implements TypeCasting + */ +final class CastToString implements TypeCasting +{ + private readonly bool $isNullable; + private readonly Type $type; + private ?string $default = null; + private readonly TypeCastingInfo $variableName; + + public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty) + { + [$this->type, $this->isNullable] = $this->init($reflectionProperty); + $this->variableName = TypeCastingInfo::fromAccessor($reflectionProperty); + } + + public function info(): TypeCastingInfo + { + return $this->variableName; + } + + public function setOptions( + ?string $default = null, + bool $emptyStringAsNull = false, + ): void { + $this->default = $default; + } + + /** + * @throws TypeCastingFailed + */ + public function toVariable(mixed $value): ?string + { + $returnedValue = match (true) { + is_string($value) => $value, + $this->isNullable => $this->default, + default => throw TypeCastingFailed::dueToNotNullableType($this->type->value, info: $this->variableName), + }; + + return match (true) { + Type::Null->equals($this->type) && null !== $returnedValue => throw TypeCastingFailed::dueToInvalidValue(match (true) { + null === $value => 'null', + '' === $value => 'empty string', + default => $value, + }, $this->type->value, info: $this->variableName), + default => $returnedValue, + }; + } + + /** + * @return array{0:Type, 1:bool} + */ + private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array + { + if (null === $reflectionProperty->getType()) { + return [Type::Mixed, true]; + } + + $type = null; + $isNullable = false; + foreach (Type::list($reflectionProperty) as $found) { + if (!$isNullable && $found[1]->allowsNull()) { + $isNullable = true; + } + + if (null === $type && $found[0]->isOneOf(Type::String, Type::Mixed, Type::Null)) { + $type = $found; + } + } + + null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'string', 'mixed', 'null'); + + return [$type[0], $isNullable]; + } +} diff --git a/vendor/league/csv/src/Serializer/DenormalizationFailed.php b/vendor/league/csv/src/Serializer/DenormalizationFailed.php new file mode 100644 index 0000000..f78c6f3 --- /dev/null +++ b/vendor/league/csv/src/Serializer/DenormalizationFailed.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionProperty; +use RuntimeException; + +final class DenormalizationFailed extends RuntimeException implements SerializationFailed +{ + public static function dueToUninitializedProperty(ReflectionProperty $reflectionProperty): self + { + return new self('The property '.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().' is not initialized; its value is missing from the source data.'); + } +} diff --git a/vendor/league/csv/src/Serializer/Denormalizer.php b/vendor/league/csv/src/Serializer/Denormalizer.php new file mode 100644 index 0000000..aeb2007 --- /dev/null +++ b/vendor/league/csv/src/Serializer/Denormalizer.php @@ -0,0 +1,461 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use Closure; +use Deprecated; +use Iterator; +use League\Csv\MapIterator; +use ReflectionAttribute; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; +use ReflectionParameter; +use ReflectionProperty; +use Throwable; + +use function array_search; +use function array_values; +use function count; +use function is_int; + +final class Denormalizer +{ + private static bool $convertEmptyStringToNull = true; + + private readonly ReflectionClass $class; + /** @var array */ + private readonly array $properties; + /** @var array */ + private readonly array $propertySetters; + /** @var array */ + private readonly array $afterMappingCalls; + private readonly ?MapRecord $mapRecord; + + /** + * @param class-string $className + * @param array $propertyNames + * + * @throws MappingFailed + */ + public function __construct(string $className, array $propertyNames = []) + { + $this->class = $this->setClass($className); + $this->properties = $this->class->getProperties(); + $this->mapRecord = MapRecord::tryFrom($this->class); + $this->propertySetters = $this->setPropertySetters($propertyNames); + $this->afterMappingCalls = $this->setAfterMappingCalls(); + } + + /** + * @deprecated since version 9.17.0 + * + * @see MapRecord::$convertEmptyStringToNull + * @see MapCell::$convertEmptyStringToNull + * + * Enables converting empty string to the null value. + */ + #[Deprecated(message:'use League\Csv\Serializer\MapRecord::$convertEmptyStringToNull or League\Csv\Serializer\MapCell::$convertEmptyStringToNullinstead', since:'league/csv:9.17.0')] + public static function allowEmptyStringAsNull(): void + { + self::$convertEmptyStringToNull = true; + } + + /** + * @deprecated since version 9.17.0 + * + * @see MapRecord::$convertEmptyStringToNull + * @see MapCell::$convertEmptyStringToNull + * + * Disables converting empty string to the null value. + */ + #[Deprecated(message:'use League\Csv\Serializer\MapRecord::$convertEmptyStringToNull or League\Csv\Serializer\MapCell::$convertEmptyStringToNullinstead', since:'league/csv:9.17.0')] + public static function disallowEmptyStringAsNull(): void + { + self::$convertEmptyStringToNull = false; + } + + /** + * Register a global type conversion callback to convert a field into a specific type. + * + * @throws MappingFailed + */ + public static function registerType(string $type, Closure $callback): void + { + CallbackCasting::register($type, $callback); + } + + /** + * Unregister a global type conversion callback to convert a field into a specific type. + * + * + */ + public static function unregisterType(string $type): bool + { + return CallbackCasting::unregisterType($type); + } + + public static function unregisterAllTypes(): void + { + CallbackCasting::unregisterTypes(); + } + + /** + * Register a callback to convert a field into a specific type. + * + * @throws MappingFailed + */ + public static function registerAlias(string $alias, string $type, Closure $callback): void + { + CallbackCasting::register($type, $callback, $alias); + } + + public static function unregisterAlias(string $alias): bool + { + return CallbackCasting::unregisterAlias($alias); + } + + public static function unregisterAllAliases(): void + { + CallbackCasting::unregisterAliases(); + } + + public static function unregisterAll(): void + { + CallbackCasting::unregisterAll(); + } + + /** + * @return array + */ + public static function types(): array + { + $default = [...array_column(Type::cases(), 'value'), ...CallbackCasting::types()]; + + return array_values(array_unique($default)); + } + + /** + * @return array + */ + public static function aliases(): array + { + return CallbackCasting::aliases(); + } + + public static function supportsAlias(string $alias): bool + { + return CallbackCasting::supportsAlias($alias); + } + + /** + * @param class-string $className + * @param array $record + * + * @throws DenormalizationFailed + * @throws MappingFailed + * @throws ReflectionException + * @throws TypeCastingFailed + */ + public static function assign(string $className, array $record): object + { + return (new self($className, array_keys($record)))->denormalize($record); + } + + /** + * @param class-string $className + * @param array $propertyNames + * + * @throws MappingFailed + * @throws TypeCastingFailed + */ + public static function assignAll(string $className, iterable $records, array $propertyNames = []): Iterator + { + return (new self($className, $propertyNames))->denormalizeAll($records); + } + + public function denormalizeAll(iterable $records): Iterator + { + return MapIterator::fromIterable($records, $this->denormalize(...)); + } + + /** + * @throws DenormalizationFailed + * @throws ReflectionException + * @throws TypeCastingFailed + */ + public function denormalize(array $record): object + { + $object = $this->class->newInstanceWithoutConstructor(); + $values = array_values($record); + + foreach ($this->propertySetters as $propertySetter) { + $propertySetter($object, $values); + } + + foreach ($this->afterMappingCalls as $callback) { + $callback->invoke($object); + } + + foreach ($this->properties as $property) { + $property->isInitialized($object) || throw DenormalizationFailed::dueToUninitializedProperty($property); + } + + return $object; + } + + /** + * @param class-string $className + * + * @throws MappingFailed + */ + private function setClass(string $className): ReflectionClass + { + class_exists($className) || throw new MappingFailed('The class `'.$className.'` can not be denormalized; The class does not exist or could not be found.'); + + $class = new ReflectionClass($className); + if ($class->isInternal() && $class->isFinal()) { + throw new MappingFailed('The class `'.$className.'` can not be denormalized; PHP internal class marked as final can not be instantiated without using the constructor.'); + } + + return $class; + } + + /** + * @param array $propertyNames + * + * @throws MappingFailed + * + * @return array + */ + private function setPropertySetters(array $propertyNames): array + { + $propertySetters = []; + $methodNames = array_map(fn (string $propertyName) => 'set'.ucfirst($propertyName), $propertyNames); + + foreach ([...$this->properties, ...$this->class->getMethods()] as $accessor) { + $attributes = $accessor->getAttributes(MapCell::class, ReflectionAttribute::IS_INSTANCEOF); + $propertySetter = match (count($attributes)) { + 0 => $this->autoDiscoverPropertySetter($accessor, $propertyNames, $methodNames), + 1 => $this->findPropertySetter($attributes[0]->newInstance(), $accessor, $propertyNames), + default => throw new MappingFailed('Using more than one `'.MapCell::class.'` attribute on a class property or method is not supported.'), + }; + if (null !== $propertySetter) { + $propertySetters[] = $propertySetter; + } + } + + return match ([]) { + $propertySetters => throw new MappingFailed('No property or method from `'.$this->class->getName().'` could be used for denormalization.'), + default => $propertySetters, + }; + } + /** + * @return array + */ + private function setAfterMappingCalls(): array + { + return $this->mapRecord?->afterMappingMethods($this->class) + ?? AfterMapping::from($this->class)?->mapRecord->afterMappingMethods($this->class) /* @phpstan-ignore-line */ + ?? []; + } + + /** + * @param array $propertyNames + * @param array $methodNames + * + * @throws MappingFailed + */ + private function autoDiscoverPropertySetter(ReflectionMethod|ReflectionProperty $accessor, array $propertyNames, array $methodNames): ?PropertySetter + { + if ($accessor->isStatic() || !$accessor->isPublic()) { + return null; + } + + if ($accessor instanceof ReflectionMethod) { + if ($accessor->isConstructor()) { + return null; + } + + if ([] === $accessor->getParameters()) { + return null; + } + + if (1 < $accessor->getNumberOfRequiredParameters()) { + return null; + } + } + + /** @var int|false $offset */ + /** @var ReflectionParameter|ReflectionProperty $reflectionProperty */ + [$offset, $reflectionProperty] = match (true) { + $accessor instanceof ReflectionMethod => [array_search($accessor->getName(), $methodNames, true), $accessor->getParameters()[0]], + $accessor instanceof ReflectionProperty => [array_search($accessor->getName(), $propertyNames, true), $accessor], + }; + + return match (true) { + false === $offset, + null === $reflectionProperty->getType() => null, + default => new PropertySetter( + $accessor, + $offset, + $this->resolveTypeCasting($reflectionProperty), + $this->mapRecord?->convertEmptyStringToNull ?? self::$convertEmptyStringToNull, + $this->mapRecord?->trimFieldValueBeforeCasting ?? false + ), + }; + } + + /** + * @param array $propertyNames + * + * @throws MappingFailed + */ + private function findPropertySetter(MapCell $mapCell, ReflectionMethod|ReflectionProperty $accessor, array $propertyNames): ?PropertySetter + { + if ($mapCell->ignore) { + return null; + } + + $typeCaster = $this->resolveTypeCaster($mapCell, $accessor); + + $offset = $mapCell->column ?? match (true) { + $accessor instanceof ReflectionMethod => $this->getMethodFirstArgument($accessor)->getName(), + $accessor instanceof ReflectionProperty => $accessor->getName(), + }; + + if (!is_int($offset)) { + if ([] === $propertyNames) { + throw new MappingFailed('offset as string are only supported if the property names list is not empty.'); + } + + /** @var int<0, max>|false $index */ + $index = array_search($offset, $propertyNames, true); + if (false === $index) { + throw new MappingFailed('The `'.$offset.'` property could not be found in the property names list; Please verify your property names list.'); + } + + $offset = $index; + } + + $reflectionProperty = match (true) { + $accessor instanceof ReflectionMethod => $accessor->getParameters()[0], + $accessor instanceof ReflectionProperty => $accessor, + }; + + $convertEmptyStringToNull = $mapCell->convertEmptyStringToNull + ?? $this->mapRecord?->convertEmptyStringToNull + ?? self::$convertEmptyStringToNull; + + $trimFieldValueBeforeCasting = $mapCell->trimFieldValueBeforeCasting + ?? $this->mapRecord?->trimFieldValueBeforeCasting + ?? false; + + return match (true) { + 0 > $offset => throw new MappingFailed('offset integer position can only be positive or equals to 0; received `'.$offset.'`'), + [] !== $propertyNames && $offset > count($propertyNames) - 1 => throw new MappingFailed('offset integer position can not exceed property names count.'), + null === $typeCaster => new PropertySetter($accessor, $offset, $this->resolveTypeCasting($reflectionProperty, $mapCell->options), $convertEmptyStringToNull, $trimFieldValueBeforeCasting), + default => new PropertySetter($accessor, $offset, $this->getTypeCasting($typeCaster, $reflectionProperty, $mapCell->options), $convertEmptyStringToNull, $trimFieldValueBeforeCasting), + }; + } + + /** + * @throws MappingFailed + */ + private function getMethodFirstArgument(ReflectionMethod $reflectionMethod): ReflectionParameter + { + $arguments = $reflectionMethod->getParameters(); + + return match (true) { + [] === $arguments => throw new MappingFailed('The method `'.$reflectionMethod->getDeclaringClass()->getName().'::'.$reflectionMethod->getName().'` does not use parameters.'), + 1 < $reflectionMethod->getNumberOfRequiredParameters() => throw new MappingFailed('The method `'.$reflectionMethod->getDeclaringClass()->getName().'::'.$reflectionMethod->getName().'` has too many required parameters.'), + default => $arguments[0] + }; + } + + /** + * @throws MappingFailed + */ + private function getTypeCasting( + string $typeCaster, + ReflectionProperty|ReflectionParameter $reflectionProperty, + array $options + ): TypeCasting { + try { + /** @var TypeCasting $cast */ + $cast = match (str_starts_with($typeCaster, CallbackCasting::class.'@')) { + true => new CallbackCasting($reflectionProperty, substr($typeCaster, strlen(CallbackCasting::class))), + false => new $typeCaster($reflectionProperty), + }; + $cast->setOptions(...$options); + + return $cast; + } catch (MappingFailed $exception) { + throw $exception; + } catch (Throwable $exception) { + throw MappingFailed::dueToInvalidCastingArguments($exception); + } + } + + /** + * @throws MappingFailed + */ + private function resolveTypeCasting(ReflectionProperty|ReflectionParameter $reflectionProperty, array $options = []): TypeCasting + { + $castResolver = function (ReflectionProperty|ReflectionParameter $reflectionProperty, $options): CallbackCasting { + $cast = new CallbackCasting($reflectionProperty); + $cast->setOptions(...$options); + + return $cast; + }; + + try { + return match (true) { + CallbackCasting::supports($reflectionProperty) => $castResolver($reflectionProperty, $options), + default => Type::resolve($reflectionProperty, $options), + }; + } catch (MappingFailed $exception) { + throw $exception; + } catch (Throwable $exception) { + throw MappingFailed::dueToInvalidCastingArguments($exception); + } + } + + public function resolveTypeCaster(MapCell $mapCell, ReflectionMethod|ReflectionProperty $accessor): ?string + { + /** @var ?class-string $typeCaster */ + $typeCaster = $mapCell->cast; + if (null === $typeCaster) { + return null; + } + + if (class_exists($typeCaster)) { + if (!(new ReflectionClass($typeCaster))->implementsInterface(TypeCasting::class)) { + throw MappingFailed::dueToInvalidTypeCastingClass($typeCaster); + } + + return $typeCaster; + } + + if ($accessor instanceof ReflectionMethod) { + $accessor = $accessor->getParameters()[0]; + } + + if (!CallbackCasting::supports($accessor, $typeCaster)) { + throw MappingFailed::dueToInvalidTypeCastingClass($typeCaster); + } + + return CallbackCasting::class.$typeCaster; + } +} diff --git a/vendor/league/csv/src/Serializer/MapCell.php b/vendor/league/csv/src/Serializer/MapCell.php new file mode 100644 index 0000000..effc5ee --- /dev/null +++ b/vendor/league/csv/src/Serializer/MapCell.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use Attribute; + +#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_PROPERTY)] +final class MapCell +{ + /** + * @param class-string|string|null $cast + */ + public function __construct( + public readonly string|int|null $column = null, + public readonly ?string $cast = null, + public readonly array $options = [], + public readonly bool $ignore = false, + public readonly ?bool $convertEmptyStringToNull = null, + public readonly ?bool $trimFieldValueBeforeCasting = false, + ) { + } +} diff --git a/vendor/league/csv/src/Serializer/MapRecord.php b/vendor/league/csv/src/Serializer/MapRecord.php new file mode 100644 index 0000000..f514e0f --- /dev/null +++ b/vendor/league/csv/src/Serializer/MapRecord.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use Attribute; +use ReflectionAttribute; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; +use ValueError; + +#[Attribute(Attribute::TARGET_CLASS)] +final class MapRecord +{ + public function __construct( + /** @var array $afterMapping */ + public readonly array $afterMapping = [], + public readonly ?bool $convertEmptyStringToNull = null, + public readonly bool $trimFieldValueBeforeCasting = false, + ) { + foreach ($this->afterMapping as $method) { + is_string($method) || throw new ValueError('The method names must be string.'); + } + } + + /** + * @return array + */ + public function afterMappingMethods(ReflectionClass $class): array + { + $methods = []; + foreach ($this->afterMapping as $method) { + try { + $accessor = $class->getMethod($method); + } catch (ReflectionException $exception) { + throw new MappingFailed('The method `'.$method.'` is not defined on the `'.$class->getName().'` class.', 0, $exception); + } + + 0 === $accessor->getNumberOfRequiredParameters() || throw new MappingFailed('The method `'.$class->getName().'::'.$accessor->getName().'` has too many required parameters.'); + $methods[] = $accessor; + } + + return $methods; + } + + /** + * @throws MappingFailed + */ + public static function tryFrom(ReflectionClass $class): ?self + { + $attributes = $class->getAttributes(self::class, ReflectionAttribute::IS_INSTANCEOF); + $nbAttributes = count($attributes); + + return match ($nbAttributes) { + 0 => null, + 1 => $attributes[0]->newInstance(), + default => throw new MappingFailed('Using more than one `'.self::class.'` attribute on a class property or method is not supported.'), + }; + } +} diff --git a/vendor/league/csv/src/Serializer/MappingFailed.php b/vendor/league/csv/src/Serializer/MappingFailed.php new file mode 100644 index 0000000..2f8ec94 --- /dev/null +++ b/vendor/league/csv/src/Serializer/MappingFailed.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use LogicException; +use ReflectionParameter; +use ReflectionProperty; +use Throwable; + +final class MappingFailed extends LogicException implements SerializationFailed +{ + public static function dueToUnsupportedType(ReflectionProperty|ReflectionParameter $reflectionProperty): self + { + $suffix = 'is missing; register it using the `'.Denormalizer::class.'` class.'; + + return new self(match (true) { + $reflectionProperty instanceof ReflectionParameter => 'The type definition for the method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` first argument `'.$reflectionProperty->getName().'` '.$suffix, + $reflectionProperty instanceof ReflectionProperty => 'The property type definition for `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` '.$suffix, + }); + } + + public static function dueToTypeCastingUnsupportedType( + ReflectionProperty|ReflectionParameter $reflectionProperty, + TypeCasting $typeCasting, + string ...$types + ): self { + + $suffix = 'is invalid; `'.implode('` or `', $types).'` type must be used with the `'.$typeCasting::class.'`.'; + + return new self(match (true) { + $reflectionProperty instanceof ReflectionParameter => 'The type for the method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` first argument `'.$reflectionProperty->getName().'` '.$suffix, + $reflectionProperty instanceof ReflectionProperty => 'The property type for `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` '.$suffix, + }); + } + + public static function dueToInvalidCastingArguments(?Throwable $exception = null): self + { + return new self('Unable to load the casting mechanism. Please verify your casting arguments', 0, $exception); + } + + public static function dueToInvalidTypeCastingClass(string $typeCaster): self + { + return new self('`'.$typeCaster.'` must be an resolvable class implementing the `'.TypeCasting::class.'` interface or a supported alias.'); + } +} diff --git a/vendor/league/csv/src/Serializer/PropertySetter.php b/vendor/league/csv/src/Serializer/PropertySetter.php new file mode 100644 index 0000000..a545b51 --- /dev/null +++ b/vendor/league/csv/src/Serializer/PropertySetter.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionException; +use ReflectionMethod; +use ReflectionProperty; + +use function array_key_exists; +use function is_string; + +/** + * @internal + */ +final class PropertySetter +{ + public function __construct( + public readonly ReflectionMethod|ReflectionProperty $accessor, + public readonly int $offset, + public readonly TypeCasting $cast, + public readonly bool $convertEmptyStringToNull, + public readonly bool $trimFieldValueBeforeCasting, + ) { + } + + /** + * @throws ReflectionException + * @throws TypeCastingFailed + */ + public function __invoke(object $object, array $recordValues): void + { + $typeCastedValue = $this->cast->toVariable($this->getRecordValue($recordValues)); + + match (true) { + $this->accessor instanceof ReflectionMethod => $this->accessor->invoke($object, $typeCastedValue), + $this->accessor instanceof ReflectionProperty => $this->accessor->setValue($object, $typeCastedValue), + }; + } + + /** + * @throws TypeCastingFailed + */ + private function getRecordValue(array $record): mixed + { + if (!array_key_exists($this->offset, $record)) { + throw TypeCastingFailed::dueToUndefinedValue($this->offset, TypeCastingInfo::fromAccessor($this->accessor)); + } + + $value = $record[$this->offset]; + if (is_string($value) && $this->trimFieldValueBeforeCasting) { + $value = trim($value); + } + + if ('' === $value && $this->convertEmptyStringToNull) { + return null; + } + + return $value; + } +} diff --git a/vendor/league/csv/src/Serializer/SerializationFailed.php b/vendor/league/csv/src/Serializer/SerializationFailed.php new file mode 100644 index 0000000..97e67eb --- /dev/null +++ b/vendor/league/csv/src/Serializer/SerializationFailed.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use Throwable; + +interface SerializationFailed extends Throwable +{ +} diff --git a/vendor/league/csv/src/Serializer/Type.php b/vendor/league/csv/src/Serializer/Type.php new file mode 100644 index 0000000..0b54b95 --- /dev/null +++ b/vendor/league/csv/src/Serializer/Type.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace League\Csv\Serializer; + +use DateTimeInterface; +use ReflectionClass; +use ReflectionNamedType; +use ReflectionParameter; +use ReflectionProperty; +use ReflectionType; +use ReflectionUnionType; +use Throwable; +use UnitEnum; + +use function class_exists; +use function enum_exists; +use function in_array; + +use const FILTER_UNSAFE_RAW; +use const FILTER_VALIDATE_BOOL; +use const FILTER_VALIDATE_FLOAT; +use const FILTER_VALIDATE_INT; + +enum Type: string +{ + case Bool = 'bool'; + case True = 'true'; + case False = 'false'; + case Null = 'null'; + case Int = 'int'; + case Float = 'float'; + case String = 'string'; + case Mixed = 'mixed'; + case Array = 'array'; + case Iterable = 'iterable'; + case Enum = UnitEnum::class; + case Date = DateTimeInterface::class; + + public function equals(mixed $value): bool + { + return $value instanceof self + && $value === $this; + } + + public function isOneOf(self ...$types): bool + { + return in_array($this, $types, true); + } + + public function filterFlag(): int + { + return match ($this) { + self::Bool, + self::True, + self::False => FILTER_VALIDATE_BOOL, + self::Int => FILTER_VALIDATE_INT, + self::Float => FILTER_VALIDATE_FLOAT, + default => FILTER_UNSAFE_RAW, + }; + } + + public static function resolve(ReflectionProperty|ReflectionParameter $reflectionProperty, array $arguments = []): TypeCasting + { + try { + $cast = match (self::tryFromAccessor($reflectionProperty)) { + self::Mixed, self::Null, self::String => new CastToString($reflectionProperty), + self::Iterable, self::Array => new CastToArray($reflectionProperty), + self::False, self::True, self::Bool => new CastToBool($reflectionProperty), + self::Float => new CastToFloat($reflectionProperty), + self::Int => new CastToInt($reflectionProperty), + self::Date => new CastToDate($reflectionProperty), + self::Enum => new CastToEnum($reflectionProperty), + null => throw MappingFailed::dueToUnsupportedType($reflectionProperty), + }; + + $cast->setOptions(...$arguments); + + return $cast; + } catch (MappingFailed $exception) { + throw $exception; + } catch (Throwable $exception) { + throw MappingFailed::dueToInvalidCastingArguments($exception); + } + } + + /** + * @return list + */ + public static function list(ReflectionParameter|ReflectionProperty $reflectionProperty): array + { + $reflectionType = $reflectionProperty->getType() ?? throw MappingFailed::dueToUnsupportedType($reflectionProperty); + + $foundTypes = static function (array $res, ReflectionType $reflectionType) { + if (!$reflectionType instanceof ReflectionNamedType) { + return $res; + } + + $type = self::tryFromName($reflectionType->getName()); + if (null !== $type) { + $res[] = [$type, $reflectionType]; + } + + return $res; + }; + + return match (true) { + $reflectionType instanceof ReflectionNamedType => $foundTypes([], $reflectionType), + $reflectionType instanceof ReflectionUnionType => array_reduce($reflectionType->getTypes(), $foundTypes, []), + default => [], + }; + } + + public static function tryFromName(string $propertyType): ?self + { + $interfaceExists = interface_exists($propertyType); + + return match (true) { + enum_exists($propertyType), + $interfaceExists && (new ReflectionClass($propertyType))->implementsInterface(UnitEnum::class) => self::Enum, + $interfaceExists && (new ReflectionClass($propertyType))->implementsInterface(DateTimeInterface::class), + class_exists($propertyType) && (new ReflectionClass($propertyType))->implementsInterface(DateTimeInterface::class) => self::Date, + default => self::tryFrom($propertyType), + }; + } + + public static function tryFromAccessor(ReflectionProperty|ReflectionParameter $reflectionProperty): ?self + { + $type = $reflectionProperty->getType(); + if (null === $type) { + return Type::Mixed; + } + + if ($type instanceof ReflectionNamedType) { + return self::tryFromName($type->getName()); + } + + if (!$type instanceof ReflectionUnionType) { + return null; + } + + foreach ($type->getTypes() as $innerType) { + if (!$innerType instanceof ReflectionNamedType) { + continue; + } + + $result = self::tryFromName($innerType->getName()); + if ($result instanceof self) { + return $result; + } + } + + return null; + } +} diff --git a/vendor/league/csv/src/Serializer/TypeCasting.php b/vendor/league/csv/src/Serializer/TypeCasting.php new file mode 100644 index 0000000..f5a2b3d --- /dev/null +++ b/vendor/league/csv/src/Serializer/TypeCasting.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +/** + * @template TValue + * + * @method TypeCastingInfo info() the name of the property the value will be assigned to + */ +interface TypeCasting +{ + /** + * @throws TypeCastingFailed + * + * @return TValue + */ + public function toVariable(mixed $value): mixed; + + /** + * Accepts additional parameters to configure the class + * Parameters should be scalar value, null or array containing + * only scalar value and null. + * + * @throws MappingFailed + */ + public function setOptions(): void; +} diff --git a/vendor/league/csv/src/Serializer/TypeCastingFailed.php b/vendor/league/csv/src/Serializer/TypeCastingFailed.php new file mode 100644 index 0000000..81085ec --- /dev/null +++ b/vendor/league/csv/src/Serializer/TypeCastingFailed.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use RuntimeException; +use Throwable; + +use function is_int; + +final class TypeCastingFailed extends RuntimeException implements SerializationFailed +{ + public readonly ?TypeCastingInfo $info; + + public function __construct(string $message, int $code = 0, ?Throwable $previous = null, ?TypeCastingInfo $info = null) + { + parent::__construct(self::format($message, $info), $code, $previous); + + $this->info = $info; + } + + private static function format(string $message, ?TypeCastingInfo $info = null): string + { + if (null === $info) { + return $message; + } + + $className = $info->targetClassName; + if (null !== $className) { + $className .= '::'; + } + + $target = $info->targetName; + $target = (TypeCastingTargetType::MethodFirstArgument === $info->targetType) + ? 'the first argument `'.$target.'` of the method `'.$className.$info->targetMethodName.'()`' + : 'the property `'.$className.$target.'`'; + + $source = $info->source; + $source = is_int($source) + ? "the record field offset `$source`" + : "the record field `$source`"; + + return "Casting $target using $source failed; $message"; + } + + public static function dueToNotNullableType(string $type, ?Throwable $exception = null, ?TypeCastingInfo $info = null): self + { + return new self('The `null` value can not be cast to a `'.$type.'`; the property type is not nullable.', 0, $exception, $info); + } + + public static function dueToInvalidValue(mixed $value, string $type, ?Throwable $previous = null, ?TypeCastingInfo $info = null): self + { + if (!is_scalar($value)) { + $value = gettype($value); + } + + return new self('Unable to cast the given data `'.$value.'` to a `'.$type.'`.', 0, $previous, $info); + } + + public static function dueToUndefinedValue(string|int $offset, ?TypeCastingInfo $info = null): self + { + return new self('Unable to cast the record value; Missing value was for offset `'.$offset.'`.', 0, info: $info); + } +} diff --git a/vendor/league/csv/src/Serializer/TypeCastingInfo.php b/vendor/league/csv/src/Serializer/TypeCastingInfo.php new file mode 100644 index 0000000..ec32c6c --- /dev/null +++ b/vendor/league/csv/src/Serializer/TypeCastingInfo.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv\Serializer; + +use ReflectionAttribute; +use ReflectionFunctionAbstract; +use ReflectionMethod; +use ReflectionParameter; +use ReflectionProperty; +use ValueError; + +use function strtolower; +use function substr; + +final class TypeCastingInfo +{ + public function __construct( + public readonly int|string $source, + public readonly TypeCastingTargetType $targetType, + public readonly string $targetName, + public readonly ?string $targetMethodName, + public readonly ?string $targetClassName, + ) { + } + + public static function fromAccessor(ReflectionMethod|ReflectionProperty|ReflectionParameter $accessor): self + { + return match (true) { + $accessor instanceof ReflectionMethod => self::fromMethod($accessor), + $accessor instanceof ReflectionParameter => self::fromMethodFirstArgument($accessor), + $accessor instanceof ReflectionProperty => self::fromProperty($accessor), + }; + } + + public static function fromMethod(ReflectionMethod $accessor): self + { + $accessor = $accessor->getParameters()[0] ?? null; + if (null === $accessor) { + throw new ValueError('The method must contain at least one parameter in its signature.'); + } + + return self::fromMethodFirstArgument($accessor); + } + + public static function fromMethodFirstArgument(ReflectionParameter $accessor): self + { + /** @var ReflectionMethod $method */ + $method = $accessor->getDeclaringFunction(); + $className = $method->getDeclaringClass()->getName(); + + return new self( + self::resolveSource($method), + TypeCastingTargetType::MethodFirstArgument, + $accessor->getName(), + $method->getName(), + $className, + ); + } + + public static function fromProperty(ReflectionProperty $accessor): self + { + $attributes = $accessor->getAttributes(MapCell::class, ReflectionAttribute::IS_INSTANCEOF); + $source = [] === $attributes ? $accessor->getName() : ($attributes[0]->newInstance()->column ?? $accessor->getName()); + + $className = $accessor->getDeclaringClass()->getName(); + + return new self( + $source, + TypeCastingTargetType::PropertyName, + $accessor->getName(), + null, + $className, + ); + } + + private static function resolveSource(ReflectionFunctionAbstract $method): int|string + { + $attributes = $method->getAttributes(MapCell::class, ReflectionAttribute::IS_INSTANCEOF); + if ([] === $attributes) { + return self::getColumnName($method); + } + + $name = $attributes[0]->newInstance()->column; + if (null !== $name) { + return $name; + } + + return self::getColumnName($method); + } + + private static function getColumnName(ReflectionFunctionAbstract $method): string + { + $name = $method->getName(); + if (!str_starts_with($name, 'set')) { + throw new ValueError('The method `'.$name.'` has no Mapping information and does not start with `set`.'); + } + + return strtolower($name[3]).substr($name, 4); + } +} diff --git a/vendor/league/csv/src/Serializer/TypeCastingTargetType.php b/vendor/league/csv/src/Serializer/TypeCastingTargetType.php new file mode 100644 index 0000000..368cc03 --- /dev/null +++ b/vendor/league/csv/src/Serializer/TypeCastingTargetType.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace League\Csv\Serializer; + +use ReflectionParameter; +use ReflectionProperty; + +enum TypeCastingTargetType +{ + case PropertyName; + case MethodFirstArgument; + + public static function fromAccessor(ReflectionParameter|ReflectionProperty $accessor): self + { + if ($accessor instanceof ReflectionProperty) { + return self::PropertyName; + } + + return self::MethodFirstArgument; + } +} diff --git a/vendor/league/csv/src/Statement.php b/vendor/league/csv/src/Statement.php new file mode 100644 index 0000000..c3e7cac --- /dev/null +++ b/vendor/league/csv/src/Statement.php @@ -0,0 +1,518 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use ArrayIterator; +use CallbackFilterIterator; +use Closure; +use Deprecated; +use Iterator; +use OutOfBoundsException; +use ReflectionException; +use ReflectionFunction; + +use function array_key_exists; +use function array_reduce; +use function array_search; +use function array_values; +use function is_string; + +/** + * Criteria to filter a {@link TabularData} object. + * + * @phpstan-import-type ConditionExtended from Query\PredicateCombinator + * @phpstan-import-type OrderingExtended from Query\SortCombinator + */ +class Statement +{ + final protected const COLUMN_ALL = 0; + final protected const COLUMN_INCLUDE = 1; + final protected const COLUMN_EXCLUDE = 2; + + /** @var array Callables to filter the iterator. */ + protected array $where = []; + /** @var array Callables to sort the iterator. */ + protected array $order_by = []; + /** iterator Offset. */ + protected int $offset = 0; + /** iterator maximum length. */ + protected int $limit = -1; + /** @var array */ + protected array $select = []; + /** @var self::COLUMN_* */ + protected int $select_mode = self::COLUMN_ALL; + + /** + * Select all the columns from the tabular data that MUST BE present in the ResultSet. + */ + public function select(string|int ...$columns): self + { + if ($columns === $this->select && self::COLUMN_INCLUDE === $this->select_mode) { + return $this; + } + + $clone = clone $this; + $clone->select = $columns; + $clone->select_mode = [] === $columns ? self::COLUMN_ALL : self::COLUMN_INCLUDE; + + return $clone; + } + + /** + * Select all the columns from the tabular data that MUST NOT BE present in the ResultSet. + */ + public function selectAllExcept(string|int ...$columns): self + { + if ($columns === $this->select && self::COLUMN_EXCLUDE === $this->select_mode) { + return $this; + } + + $clone = clone $this; + $clone->select = $columns; + $clone->select_mode = [] === $columns ? self::COLUMN_ALL : self::COLUMN_EXCLUDE; + + return $clone; + } + + /** + * Sets the Iterator filter method. + * + * @param callable(array, array-key): bool $where + * + * @throws ReflectionException + * @throws InvalidArgument + */ + public function where(callable $where): self + { + $where = self::wrapSingleArgumentCallable($where); + + $clone = clone $this; + $clone->where[] = $where; + + return $clone; + } + + /** + * Sanitize the number of required parameters for a predicate. + * + * To avoid BC break in 9.16+ version the predicate should have + * at least 1 required argument. + * + * @throws InvalidArgument + * @throws ReflectionException + * + * @return ConditionExtended + */ + final protected static function wrapSingleArgumentCallable(callable $where): callable + { + if ($where instanceof Query\Predicate) { + return $where; + } + + $reflection = new ReflectionFunction($where instanceof Closure ? $where : $where(...)); + + return match ($reflection->getNumberOfRequiredParameters()) { + 0 => throw new InvalidArgument('The where condition must be callable with 2 required parameters.'), + 1 => fn (mixed $record, int $key) => $where($record), + default => $where, + }; + } + + public function andWhere(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('and', Query\Constraint\Column::filterOn($column, $operator, $value)); + } + + public function orWhere(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('or', Query\Constraint\Column::filterOn($column, $operator, $value)); + } + + public function whereNot(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('not', Query\Constraint\Column::filterOn($column, $operator, $value)); + } + + public function xorWhere(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('xor', Query\Constraint\Column::filterOn($column, $operator, $value)); + } + + public function andWhereColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self + { + return $this->appendWhere('and', Query\Constraint\TwoColumns::filterOn($first, $operator, $second)); + } + + public function orWhereColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self + { + return $this->appendWhere('or', Query\Constraint\TwoColumns::filterOn($first, $operator, $second)); + } + + public function xorWhereColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self + { + return $this->appendWhere('xor', Query\Constraint\TwoColumns::filterOn($first, $operator, $second)); + } + + public function whereNotColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self + { + return $this->appendWhere('not', Query\Constraint\TwoColumns::filterOn($first, $operator, $second)); + } + + public function andWhereOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('and', Query\Constraint\Offset::filterOn($operator, $value)); + } + + public function orWhereOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('or', Query\Constraint\Offset::filterOn($operator, $value)); + } + + public function xorWhereOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('xor', Query\Constraint\Offset::filterOn($operator, $value)); + } + + public function whereNotOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self + { + return $this->appendWhere('not', Query\Constraint\Offset::filterOn($operator, $value)); + } + + /** + * @param 'and'|'not'|'or'|'xor' $joiner + */ + final protected function appendWhere(string $joiner, Query\Predicate $predicate): self + { + if ([] === $this->where) { + return $this->where(match ($joiner) { + 'and' => $predicate, + 'not' => Query\Constraint\Criteria::none($predicate), + 'or' => Query\Constraint\Criteria::any($predicate), + 'xor' => Query\Constraint\Criteria::xany($predicate), + }); + } + + $predicates = Query\Constraint\Criteria::all(...$this->where); + + $clone = clone $this; + $clone->where = [match ($joiner) { + 'and' => $predicates->and($predicate), + 'not' => $predicates->not($predicate), + 'or' => $predicates->or($predicate), + 'xor' => $predicates->xor($predicate), + }]; + + return $clone; + } + + /** + * Sets an Iterator sorting callable function. + * + * @param OrderingExtended $order_by + */ + public function orderBy(callable|Query\Sort|Closure $order_by): self + { + $clone = clone $this; + $clone->order_by[] = $order_by; + + return $clone; + } + + /** + * Ascending ordering of the tabular data according to a column value. + * + * The column value can be modified using the callback before ordering. + */ + public function orderByAsc(string|int $column, callable|Closure|null $callback = null): self + { + return $this->orderBy(Query\Ordering\Column::sortOn($column, 'asc', $callback)); + } + + /** + * Descending ordering of the tabular data according to a column value. + * + * The column value can be modified using the callback before ordering. + */ + public function orderByDesc(string|int $column, callable|Closure|null $callback = null): self + { + return $this->orderBy(Query\Ordering\Column::sortOn($column, 'desc', $callback)); + } + + /** + * Sets LimitIterator Offset. + * + * @throws Exception if the offset is less than 0 + */ + public function offset(int $offset): self + { + if (0 > $offset) { + throw InvalidArgument::dueToInvalidRecordOffset($offset, __METHOD__); + } + + if ($offset === $this->offset) { + return $this; + } + + $clone = clone $this; + $clone->offset = $offset; + + return $clone; + } + + /** + * Sets LimitIterator Count. + * + * @throws Exception if the limit is less than -1 + */ + public function limit(int $limit): self + { + $limit >= -1 || throw InvalidArgument::dueToInvalidLimit($limit, __METHOD__); + if ($limit === $this->limit) { + return $this; + } + + $clone = clone $this; + $clone->limit = $limit; + + return $clone; + } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } + + /** + * Executes the prepared Statement on the {@link TabularData} object. + * + * @param array $header an optional header to use instead of the tabular data header + * + * @throws InvalidArgument + * @throws SyntaxError + */ + public function process(TabularData $tabular_data, array $header = []): TabularDataReader + { + if (!$tabular_data instanceof TabularDataReader) { + $tabular_data = ResultSet::from($tabular_data); + } + + if ([] === $header) { + $header = $tabular_data->getHeader(); + } + + $iterator = $tabular_data->getRecords($header); + if ([] !== $this->where) { + $iterator = Query\Constraint\Criteria::all(...$this->where)->filter($iterator); + } + + if ([] !== $this->order_by) { + $iterator = Query\Ordering\MultiSort::all(...$this->order_by)->sort($iterator); + } + + if (0 !== $this->offset || -1 !== $this->limit) { + $iterator = Query\Limit::new($this->offset, $this->limit)->slice($iterator); + } + + $iterator = new ResultSet($iterator, $header); + + return match ($this->select_mode) { + self::COLUMN_EXCLUDE => $iterator->selectAllExcept(...$this->select), + self::COLUMN_INCLUDE => $iterator->select(...$this->select), + default => $iterator, + }; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @throws InvalidArgument + * + * @throws SyntaxError + * @see Statement::process() + * @deprecated Since version 9.16.0 + */ + #[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::process() instead', since:'league/csv:9.16.0')] + protected function applySelect(Iterator $records, array $recordsHeader, array $select): TabularDataReader + { + $hasHeader = [] !== $recordsHeader; + $selectColumn = function (array $header, string|int $field) use ($recordsHeader, $hasHeader): array { + if (is_string($field)) { + $index = array_search($field, $recordsHeader, true); + if (false === $index) { + throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__); + } + + $header[$index] = $field; + + return $header; + } + + if ($hasHeader && !array_key_exists($field, $recordsHeader)) { + throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__); + } + + $header[$field] = $recordsHeader[$field] ?? $field; + + return $header; + }; + + /** @var array $header */ + $header = array_reduce($select, $selectColumn, []); + $callback = function (array $record) use ($header): array { + $element = []; + $row = array_values($record); + foreach ($header as $offset => $headerName) { + $element[$headerName] = $row[$offset] ?? null; + } + + return $element; + }; + + return new ResultSet(new MapIterator($records, $callback), $hasHeader ? $header : []); + } + + /** + * Filters elements of an Iterator using a callback function. + * + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Statement::applyFilter() + * @deprecated Since version 9.15.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::applyFilter() instead', since:'league/csv:9.15.0')] + protected function filter(Iterator $iterator, callable $callable): CallbackFilterIterator + { + return new CallbackFilterIterator($iterator, $callable); + } + + /** + * Filters elements of an Iterator using a callback function. + * + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Statement::process() + * @deprecated Since version 9.16.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::process() instead', since:'league/csv:9.16.0')] + protected function applyFilter(Iterator $iterator): Iterator + { + $filter = function (array $record, string|int $key): bool { + foreach ($this->where as $where) { + if (true !== $where($record, $key)) { + return false; + } + } + + return true; + }; + + return new CallbackFilterIterator($iterator, $filter); + } + + /** + * Sorts the Iterator. + * + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Statement::process() + * @deprecated Since version 9.16.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::process() instead', since:'league/csv:9.16.0')] + protected function buildOrderBy(Iterator $iterator): Iterator + { + if ([] === $this->order_by) { + return $iterator; + } + + $compare = function (array $record_a, array $record_b): int { + foreach ($this->order_by as $callable) { + if (0 !== ($cmp = $callable($record_a, $record_b))) { + return $cmp; + } + } + + return $cmp ?? 0; + }; + + $class = new class () extends ArrayIterator { + public function seek(int $offset): void + { + try { + parent::seek($offset); + } catch (OutOfBoundsException) { + return; + } + } + }; + + /** @var ArrayIterator> $it */ + $it = new $class([...$iterator]); + $it->uasort($compare); + + return $it; + } + + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @param ?callable(array, array-key): bool $where , Deprecated argument use Statement::where instead + * @param int $offset, Deprecated argument use Statement::offset instead + * @param int $limit, Deprecated argument use Statement::limit instead + * + * @throws Exception + * @throws InvalidArgument + * @throws ReflectionException + * + * @see Statement::__construct() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + */ + #[Deprecated(message:'use League\Csv\Statement::__construct() instead', since:'league/csv:9.22.0')] + public static function create(?callable $where = null, int $offset = 0, int $limit = -1): self + { + $stmt = new self(); + if (null !== $where) { + $stmt = $stmt->where($where); + } + + if (0 !== $offset) { + $stmt = $stmt->offset($offset); + } + + if (-1 !== $limit) { + $stmt = $stmt->limit($limit); + } + + return $stmt; + } +} diff --git a/vendor/league/csv/src/Stream.php b/vendor/league/csv/src/Stream.php new file mode 100644 index 0000000..5d8301c --- /dev/null +++ b/vendor/league/csv/src/Stream.php @@ -0,0 +1,542 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use RuntimeException; +use SeekableIterator; +use SplFileObject; +use Stringable; +use TypeError; +use ValueError; + +use function array_keys; +use function array_walk_recursive; +use function fclose; +use function feof; +use function fflush; +use function fgetcsv; +use function fopen; +use function fpassthru; +use function fputcsv; +use function fread; +use function fseek; +use function fwrite; +use function get_resource_type; +use function gettype; +use function is_array; +use function is_resource; +use function restore_error_handler; +use function rewind; +use function set_error_handler; +use function stream_filter_append; +use function stream_filter_remove; +use function stream_get_meta_data; +use function strlen; + +use const SEEK_SET; + +/** + * An object-oriented API to handle a PHP stream resource. + * + * @internal used internally to iterate over a stream resource + */ +final class Stream implements SeekableIterator +{ + /** @var resource */ + private $stream; + private bool $is_seekable; + private bool $should_close_stream = false; + /** @var mixed can be a null, false or a scalar type value. Current iterator value. */ + private mixed $value = null; + /** Current iterator key. */ + private int $offset = -1; + /** Flags for the Document. */ + private int $flags = 0; + private string $delimiter = ','; + private string $enclosure = '"'; + private string $escape = '\\'; + /** @var array> Attached filters. */ + private array $filters = []; + private int $maxLength = 0; + + /** + * @param resource $stream stream type resource + */ + private function __construct($stream) + { + $this->is_seekable = stream_get_meta_data($stream)['seekable']; + $this->stream = $stream; + } + + public function __destruct() + { + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + + array_walk_recursive($this->filters, static function ($filter): void { + if (is_resource($filter)) { + stream_filter_remove($filter); + } + }); + if ($this->should_close_stream && is_resource($this->stream)) { + fclose($this->stream); + } + + restore_error_handler(); + + unset($this->stream); + } + + public function __clone(): void + { + throw UnavailableStream::dueToForbiddenCloning(self::class); + } + + public function __debugInfo(): array + { + return stream_get_meta_data($this->stream) + [ + 'delimiter' => $this->delimiter, + 'enclosure' => $this->enclosure, + 'escape' => $this->escape, + 'stream_filters' => array_keys($this->filters), + ]; + } + + /** + * Returns the actual mode used to open the resource stream. + */ + public function getMode(): string + { + return stream_get_meta_data($this->stream)['mode']; + } + + public function ftell(): int|false + { + return ftell($this->stream); + } + + /** + * Returns a new instance from a file path. + * + * @param resource|null $context + * + * @throws UnavailableStream if the stream resource can not be created + */ + public static function createFromPath(string $path, string $open_mode = 'r', $context = null): self + { + $args = [$path, $open_mode]; + if (null !== $context) { + $args[] = false; + $args[] = $context; + } + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $resource = fopen(...$args); + restore_error_handler(); + + is_resource($resource) || throw UnavailableStream::dueToPathNotFound($path); + + $instance = new self($resource); + $instance->should_close_stream = true; + + return $instance; + } + + /** + * Returns a new instance from a string. + */ + public static function createFromString(Stringable|string $content = ''): self + { + /** @var resource $resource */ + $resource = fopen('php://temp', 'r+'); + fwrite($resource, (string) $content); + + $instance = new self($resource); + $instance->should_close_stream = true; + + return $instance; + } + + public static function createFromResource(mixed $stream): self + { + return match (true) { + !is_resource($stream) => throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.'), + 'stream' !== ($type = get_resource_type($stream)) => throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given'), + default => new self($stream), + }; + } + + /** + * Returns the URI of the underlying stream. + * + * @see https://www.php.net/manual/en/splfileinfo.getpathname.php + */ + public function getPathname(): string + { + return stream_get_meta_data($this->stream)['uri']; + } + + /** + * Appends a filter. + * + * @see http://php.net/manual/en/function.stream-filter-append.php + * + * @throws InvalidArgument if the filter can not be appended + */ + public function appendFilter(string $filtername, int $read_write, mixed $params = null): void + { + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $res = stream_filter_append($this->stream, $filtername, $read_write, $params); + restore_error_handler(); + is_resource($res) || throw InvalidArgument::dueToStreamFilterNotFound($filtername); + + $this->filters[$filtername][] = $res; + } + + /** + * Appends a filter. + * + * @see http://php.net/manual/en/function.stream-filter-append.php + * + * @throws InvalidArgument if the filter can not be appended + */ + public function prependFilter(string $filtername, int $read_write, mixed $params = null): void + { + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $res = stream_filter_prepend($this->stream, $filtername, $read_write, $params); + restore_error_handler(); + is_resource($res) || throw InvalidArgument::dueToStreamFilterNotFound($filtername); + + $this->filters[$filtername][] = $res; + } + + /** + * Sets CSV control. + * + * @see https://www.php.net/manual/en/splfileobject.setcsvcontrol.php + * + * @throws InvalidArgument + */ + public function setCsvControl(string $delimiter = ',', string $enclosure = '"', string $escape = '\\'): void + { + [$this->delimiter, $this->enclosure, $this->escape] = $this->filterControl($delimiter, $enclosure, $escape, __METHOD__); + } + + /** + * Filters CSV control characters. + * + * @throws InvalidArgument If the CSV control character is not exactly one character. + * + * @return array{0:string, 1:string, 2:string} + */ + private function filterControl(string $delimiter, string $enclosure, string $escape, string $caller): array + { + return match (true) { + 1 !== strlen($delimiter) => throw InvalidArgument::dueToInvalidDelimiterCharacter($delimiter, $caller), + 1 !== strlen($enclosure) => throw InvalidArgument::dueToInvalidEnclosureCharacter($enclosure, $caller), + 1 !== strlen($escape) && '' !== $escape => throw InvalidArgument::dueToInvalidEscapeCharacter($escape, $caller), + default => [$delimiter, $enclosure, $escape], + }; + } + + /** + * Returns CSV control. + * + * @see https://www.php.net/manual/en/splfileobject.getcsvcontrol.php + * + * @return array + */ + public function getCsvControl(): array + { + return [$this->delimiter, $this->enclosure, $this->escape]; + } + + /** + * Sets CSV stream flags. + * + * @see https://www.php.net/manual/en/splfileobject.setflags.php + */ + public function setFlags(int $flags): void + { + $this->flags = $flags; + } + + /** + * Writes a field array as a CSV line. + * + * @see https://www.php.net/manual/en/splfileobject.fputcsv.php + * + * @throws InvalidArgument If the CSV control character is not exactly one character. + */ + public function fputcsv(array $fields, string $delimiter = ',', string $enclosure = '"', string $escape = '\\', string $eol = "\n"): int|false + { + return fputcsv( + $this->stream, + $fields, + ...[...$this->filterControl($delimiter, $enclosure, $escape, __METHOD__), $eol] + ); + } + + /** + * Gets line number. + * + * @see https://www.php.net/manual/en/splfileobject.key.php + */ + public function key(): int + { + return $this->offset; + } + + /** + * Reads next line. + * + * @see https://www.php.net/manual/en/splfileobject.next.php + */ + public function next(): void + { + $this->value = false; + $this->offset++; + } + + /** + * Rewinds the file to the first line. + * + * @see https://www.php.net/manual/en/splfileobject.rewind.php + * + * @throws Exception if the stream resource is not seekable + * @throws RuntimeException if rewinding the stream fails. + */ + public function rewind(): void + { + $this->is_seekable || throw UnavailableFeature::dueToMissingStreamSeekability(); + false !== rewind($this->stream) || throw new RuntimeException('Unable to rewind the document.'); + + $this->offset = 0; + $this->value = false; + if (SplFileObject::READ_AHEAD === ($this->flags & SplFileObject::READ_AHEAD)) { + $this->current(); + } + } + + /** + * Not at EOF. + * + * @see https://www.php.net/manual/en/splfileobject.valid.php + */ + public function valid(): bool + { + return match (true) { + SplFileObject::READ_AHEAD === ($this->flags & SplFileObject::READ_AHEAD) => false !== $this->current(), + default => !feof($this->stream), + }; + } + + /** + * Retrieves the current line of the file. + * + * @see https://www.php.net/manual/en/splfileobject.current.php + */ + public function current(): mixed + { + if (false !== $this->value) { + return $this->value; + } + + $this->value = match (true) { + SplFileObject::READ_CSV === ($this->flags & SplFileObject::READ_CSV) => $this->getCurrentRecord(), + default => $this->getCurrentLine(), + }; + + return $this->value; + } + + public function fgets(): string|false + { + $arg = [$this->stream]; + if (0 < $this->maxLength) { + $arg[] = $this->maxLength; + } + return fgets(...$arg); + } + + /** + * Sets the maximum length of a line to be read. + * + * @see https://www.php.net/manual/en/splfileobject.setmaxlinelen.php + */ + public function setMaxLineLen(int $maxLength): void + { + 0 <= $maxLength || throw new ValueError(' Argument #1 ($maxLength) must be greater than or equal to 0'); + + $this->maxLength = $maxLength; + } + + /** + * Gets the maximum line length as set by setMaxLineLen. + * + * @see https://www.php.net/manual/en/splfileobject.getmaxlinelen.php + */ + public function getMaxLineLen(): int + { + return $this->maxLength; + } + + /** + * Tells whether the end of file has been reached. + * + * @see https://www.php.net/manual/en/splfileobject.eof.php + */ + public function eof(): bool + { + return feof($this->stream); + } + + /** + * Retrieves the current line as a CSV Record. + */ + private function getCurrentRecord(): array|false + { + $isEmptyLine = SplFileObject::SKIP_EMPTY === ($this->flags & SplFileObject::SKIP_EMPTY); + do { + $ret = fgetcsv($this->stream, 0, $this->delimiter, $this->enclosure, $this->escape); + } while ($isEmptyLine && is_array($ret) && null === $ret[0]); + + return $ret; + } + + /** + * Retrieves the current line. + */ + private function getCurrentLine(): string|false + { + $isEmptyLine = SplFileObject::SKIP_EMPTY === ($this->flags & SplFileObject::SKIP_EMPTY); + $dropNewLine = SplFileObject::DROP_NEW_LINE === ($this->flags & SplFileObject::DROP_NEW_LINE); + $shouldBeIgnored = fn (string|false $line): bool => ($isEmptyLine || $dropNewLine) + && (false !== $line && '' === rtrim($line, "\r\n")); + $arguments = [$this->stream]; + if (0 < $this->maxLength) { + $arguments[] = $this->maxLength; + } + + do { + $line = fgets(...$arguments); + } while ($shouldBeIgnored($line)); + + if ($dropNewLine && false !== $line) { + return rtrim($line, "\r\n"); + } + + return $line; + } + + /** + * Seeks to specified line. + * + * @see https://www.php.net/manual/en/splfileobject.seek.php + * + * @throws Exception if the position is negative + */ + public function seek(int $offset): void + { + $offset >= 0 || throw InvalidArgument::dueToInvalidSeekingPosition($offset, __METHOD__); + + $this->rewind(); + while ($this->key() !== $offset && $this->valid()) { + $this->current(); + $this->next(); + } + + if (0 !== $offset) { + $this->offset--; + } + + $this->current(); + } + + /** + * Outputs all remaining data on a file pointer. + * + * @see https://www.php.net/manual/en/splfileobject.fpassthru.php + */ + public function fpassthru(): int|false + { + return fpassthru($this->stream); + } + + /** + * Reads from file. + * + * @see https://www.php.net/manual/en/splfileobject.fread.php + * + * @param int<1, max> $length The number of bytes to read + */ + public function fread(int $length): string|false + { + return fread($this->stream, $length); + } + + /** + * Seeks to a position. + * + * @see https://www.php.net/manual/en/splfileobject.fseek.php + * + * @throws Exception if the stream resource is not seekable + */ + public function fseek(int $offset, int $whence = SEEK_SET): int + { + return match (true) { + !$this->is_seekable => throw UnavailableFeature::dueToMissingStreamSeekability(), + default => fseek($this->stream, $offset, $whence), + }; + } + + /** + * Write to stream. + * + * @see http://php.net/manual/en/SplFileObject.fwrite.php + */ + public function fwrite(string $str, ?int $length = null): int|false + { + $args = [$this->stream, $str]; + if (null !== $length) { + $args[] = $length; + } + + return fwrite(...$args); + } + + /** + * Flushes the output to a file. + * + * @see https://www.php.net/manual/en/splfileobject.fflush.php + */ + public function fflush(): bool + { + return fflush($this->stream); + } + + /** + * Gets file size. + * + * @see https://www.php.net/manual/en/splfileinfo.getsize.php + */ + public function getSize(): int|false + { + return fstat($this->stream)['size'] ?? false; + } + + public function getContents(?int $length = null, int $offset = -1): string|false + { + return stream_get_contents($this->stream, $length, $offset); + } +} diff --git a/vendor/league/csv/src/StreamFilter.php b/vendor/league/csv/src/StreamFilter.php new file mode 100644 index 0000000..350010f --- /dev/null +++ b/vendor/league/csv/src/StreamFilter.php @@ -0,0 +1,192 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use LogicException; +use RuntimeException; +use TypeError; + +use function get_resource_type; +use function gettype; +use function in_array; +use function is_resource; +use function restore_error_handler; +use function set_error_handler; +use function stream_filter_append; +use function stream_get_filters; + +use const STREAM_FILTER_READ; +use const STREAM_FILTER_WRITE; + +final class StreamFilter +{ + /** + * Remove a filter from a stream. + * + * @param resource $stream_filter + */ + public static function remove($stream_filter): bool + { + if (!is_resource($stream_filter)) { + throw new TypeError('Argument passed must be a stream resource, '.gettype($stream_filter).' given.'); + } + + if ('stream filter' !== ($type = get_resource_type($stream_filter))) { + throw new TypeError('Argument passed must be a stream filter resource, '.$type.' resource given'); + } + + return stream_filter_remove($stream_filter); + } + + /** + * @param resource|AbstractCsv $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource|AbstractCsv + */ + public static function appendOnReadTo(mixed $stream, string $filtername, mixed $params = null): mixed + { + return self::appendFilter(STREAM_FILTER_READ, $stream, $filtername, $params); + } + + /** + * @param resource|AbstractCsv $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource|AbstractCsv + */ + public static function appendOnWriteTo(mixed $stream, string $filtername, mixed $params = null): mixed + { + return self::appendFilter(STREAM_FILTER_WRITE, $stream, $filtername, $params); + } + + /** + * @param resource|AbstractCsv $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource|AbstractCsv + */ + public static function prependOnReadTo(mixed $stream, string $filtername, mixed $params = null): mixed + { + return self::prependFilter(STREAM_FILTER_READ, $stream, $filtername, $params); + } + + /** + * @param resource|AbstractCsv $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource|AbstractCsv + */ + public static function prependOnWriteTo(mixed $stream, string $filtername, mixed $params = null): mixed + { + return self::prependFilter(STREAM_FILTER_WRITE, $stream, $filtername, $params); + } + + /** + * @param resource|AbstractCsv $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource|AbstractCsv + */ + private static function prependFilter(int $mode, mixed $stream, string $filtername, mixed $params): mixed + { + self::filterFiltername($filtername); + self::filterStream($stream); + + if ($stream instanceof AbstractCsv) { + return match ($mode) { + STREAM_FILTER_WRITE => $stream->prependStreamFilterOnWrite($filtername, $params), + default => $stream->prependStreamFilterOnRead($filtername, $params), + }; + } + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $filter = stream_filter_prepend($stream, $filtername, $mode, $params); + restore_error_handler(); + + if (!is_resource($filter)) { + throw new RuntimeException('Could not append the registered stream filter: '.$filtername); + } + + return $filter; + } + + /** + * @param resource|AbstractCsv $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource|AbstractCsv + */ + private static function appendFilter(int $mode, mixed $stream, string $filtername, mixed $params): mixed + { + self::filterFiltername($filtername); + self::filterStream($stream); + + if ($stream instanceof AbstractCsv) { + return match ($mode) { + STREAM_FILTER_WRITE => $stream->appendStreamFilterOnWrite($filtername, $params), + default => $stream->appendStreamFilterOnRead($filtername, $params), + }; + } + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $filter = stream_filter_append($stream, $filtername, $mode, $params); + restore_error_handler(); + + if (!is_resource($filter)) { + throw new RuntimeException('Could not append the registered stream filter: '.$filtername); + } + + return $filter; + } + + private static function filterFiltername(string $filtername): void + { + if (!in_array($filtername, stream_get_filters(), true)) { + throw new LogicException('The stream filter "'.$filtername.'" is not registered.'); + } + } + + /** + * Validate the resource given. + * + * @throws TypeError if the resource given is not a stream + */ + private static function filterStream(mixed $stream): void + { + if ($stream instanceof AbstractCsv) { + return; + } + + if (!is_resource($stream)) { + throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.'); + } + + if ('stream' !== ($type = get_resource_type($stream))) { + throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given'); + } + } +} diff --git a/vendor/league/csv/src/SwapDelimiter.php b/vendor/league/csv/src/SwapDelimiter.php new file mode 100644 index 0000000..ef887d0 --- /dev/null +++ b/vendor/league/csv/src/SwapDelimiter.php @@ -0,0 +1,165 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use php_user_filter; +use RuntimeException; +use TypeError; + +use function in_array; +use function str_replace; +use function stream_bucket_append; +use function stream_bucket_make_writeable; +use function stream_filter_register; +use function stream_get_filters; + +use const PSFS_PASS_ON; + +final class SwapDelimiter extends php_user_filter +{ + private const FILTER_NAME = 'string.league.csv.delimiter'; + public const MODE_READ = 'read'; + public const MODE_WRITE = 'write'; + private string $search = ''; + private string $replace = ''; + + public static function getFiltername(): string + { + return self::FILTER_NAME; + } + + /** + * Static method to register the class as a stream filter. + */ + public static function register(): void + { + in_array(self::FILTER_NAME, stream_get_filters(), true) || stream_filter_register(self::FILTER_NAME, self::class); + } + + /** + * Static method to attach the stream filter to a CSV Reader or Writer instance. + */ + public static function addTo(AbstractCsv $csv, string $inputDelimiter): void + { + self::register(); + + if ($csv instanceof Reader) { + $csv->appendStreamFilterOnRead(self::getFiltername(), [ + 'mb_separator' => $inputDelimiter, + 'separator' => $csv->getDelimiter(), + 'mode' => self::MODE_READ, + ]); + return; + } + + $csv->appendStreamFilterOnWrite(self::getFiltername(), [ + 'mb_separator' => $inputDelimiter, + 'separator' => $csv->getDelimiter(), + 'mode' => self::MODE_WRITE, + ]); + } + + /** + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + public static function appendTo(mixed $stream, string $inputDelimiter, string $delimiter): mixed + { + self::register(); + + is_resource($stream) || throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.'); + 'stream' === ($type = get_resource_type($stream)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given'); + + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $filter = stream_filter_append($stream, self::getFiltername(), params: [ + 'mb_separator' => $inputDelimiter, + 'separator' => $delimiter, + 'mode' => str_contains(stream_get_meta_data($stream)['mode'], 'r') ? self::MODE_READ : self::MODE_WRITE, + ]); + restore_error_handler(); + + is_resource($filter) || throw new RuntimeException('Could not append the registered stream filter: '.self::getFiltername()); + + return $filter; + } + + /** + * @param resource $stream + * + * @throws TypeError + * @throws RuntimeException + * + * @return resource + */ + public static function prependTo(mixed $stream, string $inputDelimiter, string $delimiter): mixed + { + self::register(); + + is_resource($stream) || throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.'); + 'stream' === ($type = get_resource_type($stream)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given'); + + $filtername = self::getFiltername(); + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $filter = stream_filter_append($stream, $filtername, params: [ + 'mb_separator' => $inputDelimiter, + 'separator' => $delimiter, + 'mode' => str_contains(stream_get_meta_data($stream)['mode'], 'r') ? self::MODE_READ : self::MODE_WRITE, + ]); + restore_error_handler(); + + is_resource($filter) || throw new RuntimeException('Could not prepend the registered stream filter: '.$filtername); + + return $filter; + } + + public function onCreate(): bool + { + if (self::FILTER_NAME !== $this->filtername) { + return false; + } + + if (!is_array($this->params)) { + return false; + } + + $mode = $this->params['mode'] ?? ''; + [$this->search, $this->replace] = match ($mode) { + self::MODE_READ => [trim($this->params['mb_separator'] ?? ''), trim($this->params['separator'] ?? '')], + self::MODE_WRITE => [trim($this->params['separator'] ?? ''), trim($this->params['mb_separator'] ?? '')], + default => ['', ''], + }; + + return !in_array('', [$this->replace, $this->search], true); + } + + public function filter($in, $out, &$consumed, bool $closing): int + { + $data = ''; + while (null !== ($bucket = stream_bucket_make_writeable($in))) { + $data .= $bucket->data; + $consumed += $bucket->datalen; + } + + $data = str_replace($this->search, $this->replace, $data); + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + stream_bucket_append($out, stream_bucket_new($this->stream, $data)); + restore_error_handler(); + + return PSFS_PASS_ON; + } +} diff --git a/vendor/league/csv/src/SyntaxError.php b/vendor/league/csv/src/SyntaxError.php new file mode 100644 index 0000000..034ebec --- /dev/null +++ b/vendor/league/csv/src/SyntaxError.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use Throwable; + +use function array_count_values; +use function array_filter; +use function array_keys; + +/** + * SyntaxError Exception. + */ +class SyntaxError extends Exception +{ + /** + * @var array + */ + protected array $duplicateColumnNames = []; + + /** + * DEPRECATION WARNING! This class will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + */ + public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + } + + public static function dueToHeaderNotFound(int $offset): self + { + return new self('The header record does not exist or is empty at offset: `'.$offset.'`'); + } + + public static function dueToInvalidHeaderColumnNames(): self + { + return new self('The header record contains non string colum names.'); + } + + public static function dueToDuplicateHeaderColumnNames(array $header): self + { + $instance = new self('The header record contains duplicate column names.'); + $instance->duplicateColumnNames = array_keys(array_filter(array_count_values($header), fn (int $value): bool => $value > 1)); + + return $instance; + } + + public function duplicateColumnNames(): array + { + return $this->duplicateColumnNames; + } +} diff --git a/vendor/league/csv/src/TabularData.php b/vendor/league/csv/src/TabularData.php new file mode 100644 index 0000000..aa1cda2 --- /dev/null +++ b/vendor/league/csv/src/TabularData.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Iterator; + +/** + * @method array nth(int $nth) returns the nth record from the tabular data. + * @method object|null nthAsObject(int $nth, string $className, array $header = []) returns the nth record from the tabular data as an instance of the defined class name. + * @method Iterator map(callable $callback) Run a map over each container record. + * @method Iterator getRecordsAsObject(string $className, array $header = []) Returns the tabular data records as an iterator object containing instance of the defined class name. + */ +interface TabularData +{ + /** + * Returns the header associated with the tabular data. + * + * The header must contain unique string or be an empty array + * if no header is specified. + * + * @return array + */ + public function getHeader(): array; + + /** + * Returns the tabular data records as an iterator object. + * + * Each record is represented as a simple array containing strings or null values. + * + * If the tabular data has a header record then each record is combined + * to the header record and the header record is removed from the iterator. + * + * If the tabular data is inconsistent. Missing record fields are + * filled with null values while extra record fields are strip from + * the returned object. + * + * @param array $header an optional header mapper to use instead of the tabular data header + * + * @return Iterator> + */ + public function getRecords(array $header = []): Iterator; + + /** + * Returns a single column from the next record of the tabular data. + * + * By default, if no value is supplied the first column is fetched + * + * @param string|int $index CSV column index + * + * @throws UnableToProcessCsv if the column index is invalid or not found + * + * @return Iterator + */ + public function fetchColumn(string|int $index = 0): Iterator; +} diff --git a/vendor/league/csv/src/TabularDataReader.php b/vendor/league/csv/src/TabularDataReader.php new file mode 100644 index 0000000..94146db --- /dev/null +++ b/vendor/league/csv/src/TabularDataReader.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Closure; +use Countable; +use Deprecated; +use Iterator; +use IteratorAggregate; + +/** + * Represents a Tabular data. + * + * @template TValue of array + * @template-extends IteratorAggregate + * + * @method Iterator fetchColumnByName(string $name) returns a column from its name + * @method Iterator fetchColumnByOffset(int $offset) returns a column from its offset + * @method array first() returns the first record from the tabular data. + * @method object|null firstAsObject(string $className, array $header = []) returns the first record from the tabular data as an instance of the defined class name. + * @method mixed value(int|string $column = 0) returns a given value from the first element of the tabular data. + * @method bool each(Closure $callback) iterates over each record and passes it to a closure. Iteration is interrupted if the closure returns false + * @method bool exists(Closure $callback) tells whether at least one record satisfies the predicate. + * @method mixed reduce(Closure $callback, mixed $initial = null) reduces the collection to a single value, passing the result of each iteration into the subsequent iteration + * @method Iterator getObjects(string $className, array $header = []) Returns the tabular data records as an iterator object containing instance of the defined class name. + * @method TabularDataReader filter(Query\Predicate|Closure $predicate) returns all the elements of this collection for which your callback function returns `true` + * @method TabularDataReader slice(int $offset, ?int $length = null) extracts a slice of $length elements starting at position $offset from the Collection. + * @method TabularDataReader sorted(Query\Sort|Closure $orderBy) sorts the Collection according to the closure provided see Statement::orderBy method + * @method TabularDataReader select(string|int ...$columnOffsetOrName) extract a selection of the tabular data records columns. + * @method TabularDataReader selectAllExcept(string|int ...$columnOffsetOrName) specifies the names or index of one or more columns to exclude from the selection of the tabular data records columns. + * @method TabularDataReader matchingFirstOrFail(string $expression) extract the first found fragment identifier of the tabular data or fail + * @method TabularDataReader|null matchingFirst(string $expression) extract the first found fragment identifier of the tabular data or return null if none is found + * @method iterable matching(string $expression) extract all found fragment identifiers for the tabular data + * @method iterable chunkBy(int $recordsCount) Chunk the TabulaDataReader into smaller TabularDataReader instances of the given size or less. + * @method TabularDataReader mapHeader(array $headers) Returns a new TabulaDataReader with a new set of headers. + */ +interface TabularDataReader extends TabularData, IteratorAggregate, Countable +{ + /** + * Returns the tabular data rows as an iterator object containing flat array. + * + * Each row is represented as a simple array containing values. + * + * If the tabular data has a header included as a separate row then each record + * is combined to the header record and the header record is removed from the iteration. + * + * If the tabular data is inconsistent. Missing fields are filled with null values + * while extra record fields are strip from the returned array. + * + * @return Iterator + */ + public function getIterator(): Iterator; + + /** + * Returns the number of records contained in the tabular data structure + * excluding the header record. + */ + public function count(): int; + + /** + * Returns the next key-value pairs from the tabular data (first + * column is the key, second column is the value). + * + * By default, if no column index is provided: + * - the first column is used to provide the keys + * - the second column is used to provide the value + * + * @param string|int $offset_index The column index to serve as offset + * @param string|int $value_index The column index to serve as value + * + * @throws UnableToProcessCsv if the column index is invalid or not found + */ + public function fetchPairs(string|int $offset_index = 0, string|int $value_index = 1): Iterator; + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated since version 9.9.0 + * + * Returns the nth record from the tabular data. + * + * By default, if no index is provided the first record of the tabular data is returned + * + * @param int $nth_record the tabular data record offset + * + * @throws UnableToProcessCsv if argument is less than 0 + */ + #[Deprecated(message:'use League\Csv\TabularDataReader::nth() instead', since:'league/csv:9.9.0')] + public function fetchOne(int $nth_record = 0): array; +} diff --git a/vendor/league/csv/src/TabularDataWriter.php b/vendor/league/csv/src/TabularDataWriter.php new file mode 100644 index 0000000..c52ecd1 --- /dev/null +++ b/vendor/league/csv/src/TabularDataWriter.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Stringable; + +/** + * A class to insert records into a CSV Document. + */ +interface TabularDataWriter +{ + /** + * Adds multiple records to the CSV document. + * + * @see TabularDataWriter::insertOne + * + * @param iterable> $records + * + * @throws CannotInsertRecord If the record can not be inserted + * @throws Exception If the record can not be inserted + */ + public function insertAll(iterable $records): int; + + /** + * Adds a single record to a CSV document. + * + * A record is an array that can contain scalar type values, NULL values + * or objects implementing the __toString method. + * + * @param array $record + * + * @throws CannotInsertRecord If the record can not be inserted + * @throws Exception If the record can not be inserted + */ + public function insertOne(array $record): int; +} diff --git a/vendor/league/csv/src/UnableToProcessCsv.php b/vendor/league/csv/src/UnableToProcessCsv.php new file mode 100644 index 0000000..3270953 --- /dev/null +++ b/vendor/league/csv/src/UnableToProcessCsv.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Throwable; + +interface UnableToProcessCsv extends Throwable +{ +} diff --git a/vendor/league/csv/src/UnavailableFeature.php b/vendor/league/csv/src/UnavailableFeature.php new file mode 100644 index 0000000..1d153c7 --- /dev/null +++ b/vendor/league/csv/src/UnavailableFeature.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; +use Throwable; + +/** + * StreamFilterSupportMissing Exception. + */ +class UnavailableFeature extends Exception +{ + /** + * DEPRECATION WARNING! This class will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + */ + public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + } + + public static function dueToUnsupportedStreamFilterApi(string $className): self + { + return new self('The stream filter API can not be used with a '.$className.' instance.'); + } + + public static function dueToMissingStreamSeekability(): self + { + return new self('stream does not support seeking.'); + } +} diff --git a/vendor/league/csv/src/UnavailableStream.php b/vendor/league/csv/src/UnavailableStream.php new file mode 100644 index 0000000..bc2d391 --- /dev/null +++ b/vendor/league/csv/src/UnavailableStream.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +final class UnavailableStream extends Exception +{ + private function __construct(string $message) + { + parent::__construct($message); + } + + public static function dueToPathNotFound(string $path): self + { + return new self('`'.$path.'`: failed to open stream: No such file or directory.'); + } + + public static function dueToForbiddenCloning(string $class_name): self + { + return new self('An object of class '.$class_name.' cannot be cloned.'); + } +} diff --git a/vendor/league/csv/src/Writer.php b/vendor/league/csv/src/Writer.php new file mode 100644 index 0000000..404c675 --- /dev/null +++ b/vendor/league/csv/src/Writer.php @@ -0,0 +1,346 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Closure; +use Deprecated; + +use function array_map; +use function array_reduce; +use function implode; +use function restore_error_handler; +use function set_error_handler; +use function str_replace; + +use const STREAM_FILTER_WRITE; + +/** + * A class to insert records into a CSV Document. + */ +class Writer extends AbstractCsv implements TabularDataWriter +{ + protected const ENCLOSE_ALL = 1; + protected const ENCLOSE_NECESSARY = 0; + protected const ENCLOSE_NONE = -1; + + protected const STREAM_FILTER_MODE = STREAM_FILTER_WRITE; + /** @var array callable collection to validate the record before insertion. */ + protected array $validators = []; + protected string $newline = "\n"; + protected int $flush_counter = 0; + protected ?int $flush_threshold = null; + protected int $enclose_all = self::ENCLOSE_NECESSARY; + /** @var array{0:array,1:array} */ + protected array $enclosure_replace = [[], []]; + /** @var Closure(array): (int|false) */ + protected Closure $insertRecord; + + protected function resetProperties(): void + { + parent::resetProperties(); + + $this->enclosure_replace = [ + [$this->enclosure, $this->escape.$this->enclosure.$this->enclosure], + [$this->enclosure.$this->enclosure, $this->escape.$this->enclosure], + ]; + + $this->insertRecord = match ($this->enclose_all) { + self::ENCLOSE_ALL => fn (array $record): int|false => $this->document->fwrite(implode( + $this->delimiter, + array_map( + fn ($content) => $this->enclosure.$content.$this->enclosure, + str_replace($this->enclosure_replace[0], $this->enclosure_replace[1], $record) + ) + ).$this->newline), + self::ENCLOSE_NONE => fn (array $record): int|false => $this->document->fwrite(implode($this->delimiter, $record).$this->newline), + default => fn (array $record): int|false => $this->document->fputcsv($record, $this->delimiter, $this->enclosure, $this->escape, $this->newline), + }; + } + + /** + * Returns the current end of line sequence characters. + */ + public function getEndOfLine(): string + { + return $this->newline; + } + + /** + * Returns the flush threshold. + */ + public function getFlushThreshold(): ?int + { + return $this->flush_threshold; + } + + /** + * Tells whether new entries will all be enclosed on writing. + */ + public function encloseAll(): bool + { + return self::ENCLOSE_ALL === $this->enclose_all; + } + + /** + * Tells whether new entries will be selectively enclosed on writing + * if the field content requires encoding. + */ + public function encloseNecessary(): bool + { + return self::ENCLOSE_NECESSARY === $this->enclose_all; + } + + /** + * Tells whether new entries will never be enclosed on writing. + */ + public function encloseNone(): bool + { + return self::ENCLOSE_NONE === $this->enclose_all; + } + + /** + * Adds multiple records to the CSV document. + * @see Writer::insertOne + * + * @throws CannotInsertRecord + * @throws Exception + */ + public function insertAll(iterable $records): int + { + $bytes = 0; + foreach ($records as $record) { + $bytes += $this->insertOne($record); + } + + $this->flush_counter = 0; + $this->document->fflush(); + + return $bytes; + } + + /** + * Adds a single record to a CSV document. + * + * A record is an array that can contain scalar type values, NULL values + * or objects implementing the __toString method. + * + * @throws CannotInsertRecord If the record can not be inserted + * @throws Exception If the record can not be inserted + */ + public function insertOne(array $record): int + { + $record = array_reduce($this->formatters, fn (array $record, callable $formatter): array => $formatter($record), $record); + $this->validateRecord($record); + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $bytes = ($this->insertRecord)($record); + restore_error_handler(); + if (false === $bytes) { + throw CannotInsertRecord::triggerOnInsertion($record); + } + + if (null === $this->flush_threshold) { + return $bytes; + } + + ++$this->flush_counter; + if (0 === $this->flush_counter % $this->flush_threshold) { + $this->flush_counter = 0; + $this->document->fflush(); + } + + return $bytes; + } + + /** + * Validates a record. + * + * @throws CannotInsertRecord If the validation failed + */ + protected function validateRecord(array $record): void + { + foreach ($this->validators as $name => $validator) { + true === $validator($record) || throw CannotInsertRecord::triggerOnValidation($name, $record); + } + } + + /** + * Adds a record validator. + * + * @param callable(array): bool $validator + */ + public function addValidator(callable $validator, string $validator_name): self + { + $this->validators[$validator_name] = !$validator instanceof Closure ? $validator(...) : $validator; + + return $this; + } + + /** + * Sets the end of line sequence. + */ + public function setEndOfLine(string $endOfLine): self + { + $this->newline = $endOfLine; + + return $this; + } + + /** + * Sets the flush threshold. + * + * @throws InvalidArgument if the threshold is an integer less than 1 + */ + public function setFlushThreshold(?int $threshold): self + { + if ($threshold === $this->flush_threshold) { + return $this; + } + + null === $threshold || 1 <= $threshold || throw InvalidArgument::dueToInvalidThreshold($threshold, __METHOD__); + + $this->flush_threshold = $threshold; + $this->flush_counter = 0; + $this->document->fflush(); + + return $this; + } + + public function necessaryEnclosure(): self + { + $this->enclose_all = self::ENCLOSE_NECESSARY; + $this->resetProperties(); + + return $this; + } + + public function forceEnclosure(): self + { + $this->enclose_all = self::ENCLOSE_ALL; + $this->resetProperties(); + + return $this; + } + + public function noEnclosure(): self + { + $this->enclose_all = self::ENCLOSE_NONE; + $this->resetProperties(); + + return $this; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated since version 9.8.0 + * @codeCoverageIgnore + * + * Format a record. + * + * The returned array must contain + * - scalar types values, + * - NULL values, + * - or objects implementing the __toString() method. + */ + #[Deprecated(message:'no longer affecting the class behaviour', since:'league/csv:9.8.0')] + protected function formatRecord(array $record, callable $formatter): array + { + return $formatter($record); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 9.9.0 + * @codeCoverageIgnore + * + * Adds a single record to a CSV Document using PHP algorithm. + * + * @see https://php.net/manual/en/function.fputcsv.php + */ + #[Deprecated(message:'no longer affecting the class behaviour', since:'league/csv:9.9.0')] + protected function addRecord(array $record): int|false + { + return $this->document->fputcsv($record, $this->delimiter, $this->enclosure, $this->escape, $this->newline); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 9.9.0 + * @codeCoverageIgnore + * + * Applies post insertion actions. + */ + #[Deprecated(message:'no longer affecting the class behaviour', since:'league/csv:9.9.0')] + protected function consolidate(): int + { + if (null === $this->flush_threshold) { + return 0; + } + + ++$this->flush_counter; + if (0 === $this->flush_counter % $this->flush_threshold) { + $this->flush_counter = 0; + $this->document->fflush(); + } + + return 0; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Writer::getEndOfLine() + * @deprecated Since version 9.10.0 + * @codeCoverageIgnore + * + * Returns the current newline sequence characters. + */ + #[Deprecated(message:'use League\Csv\Writer::getEndOfLine()', since:'league/csv:9.10.0')] + public function getNewline(): string + { + return $this->getEndOfLine(); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Writer::setEndOfLine() + * @deprecated Since version 9.10.0 + * @codeCoverageIgnore + * + * Sets the newline sequence. + */ + #[Deprecated(message:'use League\Csv\Writer::setEndOfLine()', since:'league/csv:9.10.0')] + public function setNewline(string $newline): self + { + return $this->setEndOfLine($newline); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see Writer::necessaryEnclosure() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + * + * Sets the enclosure threshold to only enclose necessary fields. + */ + #[Deprecated(message:'use League\Csv\Writer::necessaryEnclosure()', since:'league/csv:9.22.0')] + public function relaxEnclosure(): self + { + return $this->necessaryEnclosure(); + } +} diff --git a/vendor/league/csv/src/XMLConverter.php b/vendor/league/csv/src/XMLConverter.php new file mode 100644 index 0000000..e1f0b6d --- /dev/null +++ b/vendor/league/csv/src/XMLConverter.php @@ -0,0 +1,307 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Closure; +use Deprecated; +use Dom\Element; +use Dom\XMLDocument; +use DOMDocument; +use DOMElement; +use DOMException; +use Exception; +use RuntimeException; +use Throwable; +use ValueError; + +use function class_exists; +use function extension_loaded; +use function in_array; +use function is_bool; +use function strtolower; +use function strtoupper; + +/** + * Converts tabular data into a DOMDocument object. + */ +class XMLConverter +{ + /** XML Root name. */ + protected string $root_name = 'csv'; + /** XML Node name. */ + protected string $record_name = 'row'; + /** XML Item name. */ + protected ?string $field_name = 'cell'; + /** XML column attribute name. */ + protected string $column_attr = ''; + /** XML offset attribute name. */ + protected string $offset_attr = ''; + /** @var ?Closure(array, array-key): array */ + protected ?Closure $formatter = null; + + /** + * + * @throws RuntimeException If the extension is not present + * @throws ValueError If the XML class used is invalid + */ + private static function newXmlDocument(string $xml_class): DOMDocument|XMLDocument + { + return match (true) { + !extension_loaded('dom') => throw new RuntimeException('The DOM extension is not loaded.'), + !in_array($xml_class, [XMLDocument::class , DOMDocument::class], true) => throw new ValueError('The xml class is invalid.'), + XMLDocument::class === $xml_class && class_exists(XMLDocument::class) => XMLDocument::createEmpty(), + default => new DOMDocument(encoding: 'UTF-8'), + }; + } + + public static function supportsHeader(array $header): bool + { + $document = self::newXmlDocument(XMLDocument::class); + foreach ($header as $header_value) { + try { + $document->createElement($header_value); + } catch (Throwable) { + return false; + } + } + + return [] !== $header; + } + + public function __construct() + { + } + + /** + * XML root element setter. + * + * @throws DOMException + */ + public function rootElement(string $node_name): self + { + $clone = clone $this; + $clone->root_name = (string) $this->filterElementName($node_name); + + return $clone; + } + + /** + * XML Record element setter. + * + * @throws DOMException + */ + public function recordElement(string $node_name, string $record_offset_attribute_name = ''): self + { + $clone = clone $this; + $clone->record_name = (string) $this->filterElementName($node_name); + $clone->offset_attr = $this->filterAttributeName($record_offset_attribute_name); + + return $clone; + } + + /** + * XML Field element setter. + * + * @throws DOMException + */ + public function fieldElement(?string $node_name, string $fieldname_attribute_name = ''): self + { + $clone = clone $this; + $clone->field_name = $this->filterElementName($node_name); + $clone->column_attr = $this->filterAttributeName($fieldname_attribute_name); + + return $clone; + } + + /** + * Set a callback to format each item before json encode. + * + * @param ?callable(array, array-key): array $formatter + */ + public function formatter(?callable $formatter): self + { + $clone = clone $this; + $clone->formatter = ($formatter instanceof Closure || null === $formatter) ? $formatter : $formatter(...); + + return $clone; + } + + /** + * Sends and makes the XML structure downloadable via HTTP. + *. + * Returns the number of characters read from the handle and passed through to the output. + * + * @throws Exception + */ + public function download(iterable $records, ?string $filename = null, string $encoding = 'utf-8', bool $formatOutput = false): int|false + { + /** @var XMLDocument|DOMDocument $document */ + $document = self::newXmlDocument(XMLDocument::class); + $document->appendChild($this->import($records, $document)); + if (null !== $filename) { + HttpHeaders::forFileDownload($filename, 'application/xml; charset='.strtolower($encoding)); + } + + $document->formatOutput = $formatOutput; + if ($document instanceof DOMDocument) { + $document->encoding = strtoupper($encoding); + + return $document->save('php://output'); + } + + return $document->saveXmlFile('php://output'); + } + + /** + * Creates a new DOMElement related to the given DOMDocument. + * + * **DOES NOT** attach to the DOMDocument + */ + public function import(iterable $records, DOMDocument|XMLDocument $doc): DOMElement|Element + { + if (null !== $this->formatter) { + $records = MapIterator::fromIterable($records, $this->formatter); + } + + $root = $doc->createElement($this->root_name); + foreach ($records as $offset => $record) { + $root->appendChild($this->recordToElement($doc, $record, $offset)); + } + + return $root; + } + + /** + * Converts a CSV record into a DOMElement and + * adds its offset as DOMElement attribute. + */ + protected function recordToElement(DOMDocument|XMLDocument $document, array $record, int $offset): DOMElement|Element + { + $node = $document->createElement($this->record_name); + foreach ($record as $node_name => $value) { + $node->appendChild($this->fieldToElement($document, (string) $value, $node_name)); + } + + if ('' !== $this->offset_attr) { + $node->setAttribute($this->offset_attr, (string) $offset); + } + + return $node; + } + + /** + * Converts Cell to Item. + * + * Converts the CSV item into a DOMElement and adds the item offset + * as attribute to the returned DOMElement + */ + protected function fieldToElement(DOMDocument|XMLDocument $document, string $value, int|string $node_name): DOMElement|Element + { + $node_name = (string) $node_name; + $item = $document->createElement($this->field_name ?? $node_name); + $item->appendChild($document->createTextNode($value)); + + if ('' !== $this->column_attr) { + $item->setAttribute($this->column_attr, $node_name); + } + + return $item; + } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } + + /** + * Filters XML element name. + * + * @throws DOMException If the Element name is invalid + */ + protected function filterElementName(?string $value): ?string + { + if (null === $value) { + return null; + } + + return self::newXmlDocument(XMLDocument::class)->createElement($value)->tagName; + } + + /** + * Filters XML attribute name. + * + * @param string $value Element name + * + * @throws DOMException If the Element attribute name is invalid + */ + protected function filterAttributeName(string $value): string + { + if ('' === $value) { + return $value; + } + + $element = self::newXmlDocument(XMLDocument::class)->createElement('foo'); + $element->setAttribute($value, 'foo'); + + return $value; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see XMLConverter::import() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + * + * Converts a Record collection into a DOMDocument. + */ + #[Deprecated(message:'use League\Csv\XMLConverter::impoprt()', since:'league/csv:9.22.0')] + public function convert(iterable $records): DOMDocument + { + $document = new DOMDocument(encoding: 'UTF-8'); + $document->appendChild($this->import($records, $document)); + + return $document; + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @see XMLConverter::__construct() + * @deprecated Since version 9.22.0 + * @codeCoverageIgnore + * + * Returns an new instance. + */ + #[Deprecated(message:'use League\Csv\XMLConverter::__construct()', since:'league/csv:9.22.0')] + public static function create(): self + { + return new self(); + } +} diff --git a/vendor/league/csv/src/functions.php b/vendor/league/csv/src/functions.php new file mode 100644 index 0000000..ce56fbb --- /dev/null +++ b/vendor/league/csv/src/functions.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Csv; + +use Deprecated; + +/** + * DEPRECATION WARNING! This namespace function will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + * @see Bom::tryFromSequence() + * @codeCoverageIgnore + * + * Returns the BOM sequence found at the start of the string. + * + * If no valid BOM sequence is found an empty string is returned + */ +#[Deprecated(message:'use League\Csv\Bom::tryFromSequence()', since:'league/csv:9.7.0')] +function bom_match(string $str): string +{ + return Bom::tryFromSequence($str)?->value ?? ''; +} + +/** + * DEPRECATION WARNING! This namespace function will be removed in the next major point release. + * + * @deprecated since version 9.7.0 + * @see Info::getDelimiterStats() + * @codeCoverageIgnore + * + * Detect Delimiters usage in a {@link Reader} object. + * + * Returns a associative array where each key represents + * a submitted delimiter and each value the number of CSV fields found + * when processing at most $limit CSV records with the given delimiter + * + * @param array $delimiters + * @param int<-1, max> $limit + * + * @return array + */ +#[Deprecated(message:'use League\Csv\Info::getDelimiterStats() instead', since:'league/csv:9.8.0')] +function delimiter_detect(Reader $csv, array $delimiters, int $limit = 1): array +{ + return Info::getDelimiterStats($csv, $delimiters, $limit); +} diff --git a/vendor/league/csv/src/functions_include.php b/vendor/league/csv/src/functions_include.php new file mode 100644 index 0000000..38bce98 --- /dev/null +++ b/vendor/league/csv/src/functions_include.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (!function_exists('League\Csv\delimiter_detect')) { + require __DIR__.'/functions.php'; +}