From 45b4cb95ad363a7ab70c929a8c6763c78f46bcf5 Mon Sep 17 00:00:00 2001 From: Jan Marsh Date: Fri, 30 Sep 2022 08:39:44 +0000 Subject: [PATCH 01/35] Change logger --- lib/main.dart | 4 + lib/src/core/logger/app_logger.dart | 26 ++++++ lib/src/core/logger/appenders.dart | 50 +++++++++++ lib/src/core/logger/log_formatters.dart | 84 +++++++++++++++++++ lib/src/core/routing/router.dart | 2 +- .../data/repositories/counter.repository.dart | 10 +-- .../edit/bloc/edit_counter.bloc.dart | 7 +- .../edit/view/edit_counter.page.dart | 5 +- pubspec.lock | 16 +++- pubspec.yaml | 2 + 10 files changed, 192 insertions(+), 14 deletions(-) create mode 100644 lib/src/core/logger/app_logger.dart create mode 100644 lib/src/core/logger/appenders.dart create mode 100644 lib/src/core/logger/log_formatters.dart diff --git a/lib/main.dart b/lib/main.dart index 9274c45..82e9561 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,13 +1,17 @@ import 'package:counter_workshop/src/app.dart'; +import 'package:counter_workshop/src/core/logger/app_logger.dart'; import 'package:counter_workshop/src/features/counter/data/datasources/remote/src/mock/counter_fake.api.dart'; import 'package:counter_workshop/src/features/counter/data/repositories/counter.repository.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:intl/intl_standalone.dart' if (dart.library.html) 'package:intl/intl_browser.dart'; +import 'package:logging/logging.dart'; Future main() async { Intl.systemLocale = await findSystemLocale(); + AppLogger(level: Level.WARNING); final CounterRepository counterRepository = CounterRepository(counterApi: CounterFakeApi()); + runApp( App( counterRepository: counterRepository, diff --git a/lib/src/core/logger/app_logger.dart b/lib/src/core/logger/app_logger.dart new file mode 100644 index 0000000..eb19c5a --- /dev/null +++ b/lib/src/core/logger/app_logger.dart @@ -0,0 +1,26 @@ +import 'package:counter_workshop/src/core/logger/appenders.dart'; +import 'package:counter_workshop/src/core/logger/log_formatters.dart'; +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; + +final appLogger = Logger('CounterWorkshop'); + +class AppLogger { + // ignore: unused_field + static late AppLogger _singleton; + + factory AppLogger({Level level = Level.ALL}) => _singleton = AppLogger._initLogger(level); + + AppLogger._initLogger(Level level) { + recordStackTraceAtLevel = level; + appLogger.info('App Started'); + if (kDebugMode) { + ConsoleLogAppender(formatter: const ConsoleLogFormatter()).attachToLogger(Logger.root); + FileLogAppender(formatter: const FileLogFormatter()).attachToLogger(Logger.root); + } + + if (kReleaseMode) { + FileLogAppender(formatter: const FileLogFormatter()).attachToLogger(Logger.root); + } + } +} diff --git a/lib/src/core/logger/appenders.dart b/lib/src/core/logger/appenders.dart new file mode 100644 index 0000000..58053ee --- /dev/null +++ b/lib/src/core/logger/appenders.dart @@ -0,0 +1,50 @@ +import 'dart:developer'; + +import 'package:counter_workshop/src/core/logger/log_formatters.dart'; +import 'package:logging/logging.dart'; +import 'package:logging_appenders/logging_appenders.dart'; + +class ConsoleLogAppender extends BaseLogAppender { + void Function(Object line)? printer; + + ConsoleLogAppender({LogRecordFormatter? formatter}) : super(formatter ?? defaultDebugConsoleLogFormatter()); + + ConsoleLogAppender setupLogging({Level level = Level.ALL, Level stderrLevel = Level.OFF}) { + Logger.root.clearListeners(); + Logger.root.level = level; + + return defaultLogAppender(stderrLevel: stderrLevel)..attachToLogger(Logger.root); + } + + @override + void handle(LogRecord record) { + log(formatter.format(record)); + } +} + +ConsoleLogAppender defaultLogAppender({LogRecordFormatter? formatter, Level? stderrLevel}) { + return ConsoleLogAppender(formatter: formatter); +} + +class FileLogAppender extends RotatingFileAppender { + void Function(Object line)? printer; + + FileLogAppender({LogRecordFormatter? formatter}) + : super(baseFilePath: '/counter_workshop_logs', formatter: formatter); + + FileLogAppender setupLogging({Level level = Level.ALL, Level stderrLevel = Level.OFF}) { + Logger.root.clearListeners(); + Logger.root.level = level; + + return fileLogAppender(stderrLevel: stderrLevel)..attachToLogger(Logger.root); + } + + @override + void handle(LogRecord record) { + //log(formatter.format(record)); + } +} + +FileLogAppender fileLogAppender({LogRecordFormatter? formatter, Level? stderrLevel}) { + return FileLogAppender(formatter: formatter); +} diff --git a/lib/src/core/logger/log_formatters.dart b/lib/src/core/logger/log_formatters.dart new file mode 100644 index 0000000..d79adc0 --- /dev/null +++ b/lib/src/core/logger/log_formatters.dart @@ -0,0 +1,84 @@ +import 'package:logging/logging.dart'; +import 'package:logging_appenders/logging_appenders.dart'; + +LogRecordFormatter defaultDebugConsoleLogFormatter() => const DefaultLogRecordFormatter(); + +LogRecordFormatter defaultFileLogFormatter() => const DefaultLogRecordFormatter(); + +class ConsoleLogFormatter extends LogRecordFormatter { + const ConsoleLogFormatter(); + + @override + StringBuffer formatToStringBuffer(LogRecord rec, StringBuffer sb) { + String outputColor = FormatterHelper.defineOutputColor(rec.level); + sb.write( + '$outputColor [${rec.time}] [${rec.level.name}] [${rec.zone}] ' + '[${rec.loggerName}] - \x1B[34m${rec.message}', + ); + + if (rec.error != null) { + sb.writeln(); + sb.write('### ${rec.error?.runtimeType}: '); + sb.write(rec.error); + } + final stackTrace = rec.stackTrace ?? (rec.error is Error ? (rec.error as Error).stackTrace : null); + if (stackTrace != null) { + sb.writeln(); + sb.write(stackTrace); + } + sb.write('\x1B[0m'); + return sb; + } +} + +class FileLogFormatter extends LogRecordFormatter { + const FileLogFormatter(); + + @override + StringBuffer formatToStringBuffer(LogRecord rec, StringBuffer sb) { + sb.write( + '[${rec.time}] [${rec.level.name}] [${rec.zone}] ' + '[${rec.loggerName}] - ${rec.message}', + ); + + if (rec.error != null) { + sb.writeln(); + sb.write('### ${rec.error?.runtimeType}: '); + sb.write(rec.error); + } + final stackTrace = rec.stackTrace ?? (rec.error is Error ? (rec.error as Error).stackTrace : null); + if (stackTrace != null) { + sb.writeln(); + sb.write(stackTrace); + } + return sb; + } +} + +class FormatterHelper { + FormatterHelper._(); + + static String defineOutputColor(Level level) { + String outputColor = ''; + switch (level.name) { + case 'ALL': + case 'FINEST': + case 'FINER': + case 'FINE': + case 'CONFIG': + outputColor = '\x1B[37m'; + break; + case 'INFO': + case 'WARNING': + outputColor = '\x1B[33m'; + break; + case 'SEVERE': + case 'SHOUT': + outputColor = '\x1B[31m'; + break; + default: + outputColor = '\x1B[37m'; + } + return outputColor; + } +} diff --git a/lib/src/core/routing/router.dart b/lib/src/core/routing/router.dart index d75556a..46d5e82 100644 --- a/lib/src/core/routing/router.dart +++ b/lib/src/core/routing/router.dart @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart'; final router = GoRouter( urlPathStrategy: UrlPathStrategy.path, - debugLogDiagnostics: true, + debugLogDiagnostics: false, // Logs werden durch den Logger übernommen initialLocation: '/counters', routes: [ GoRoute( diff --git a/lib/src/features/counter/data/repositories/counter.repository.dart b/lib/src/features/counter/data/repositories/counter.repository.dart index 0927222..677a7db 100644 --- a/lib/src/features/counter/data/repositories/counter.repository.dart +++ b/lib/src/features/counter/data/repositories/counter.repository.dart @@ -1,11 +1,11 @@ import 'dart:async'; +import 'package:counter_workshop/src/core/logger/app_logger.dart'; import 'package:counter_workshop/src/features/counter/data/datasources/remote/converters/counter_request.converter.dart'; import 'package:counter_workshop/src/features/counter/data/datasources/remote/counter.api.dart'; import 'package:counter_workshop/src/features/counter/data/datasources/remote/converters/counter_response.converter.dart'; import 'package:counter_workshop/src/features/counter/data/datasources/remote/dtos/counter_response.dto.dart'; import 'package:counter_workshop/src/features/counter/domain/model/counter.model.dart'; -import 'dart:developer'; import 'package:counter_workshop/src/features/counter/domain/repository/counter.repository_interface.dart'; @@ -16,7 +16,7 @@ class CounterRepository implements CounterRepositoryInterface { @override Future> getCounterList() async { - log('retriving counter list'); + appLogger.info('retriving counter list'); final List response = await counterApi.fetchAll(); // map result to model @@ -33,7 +33,7 @@ class CounterRepository implements CounterRepositoryInterface { @override Future createCounter({required CounterModel counterModel}) async { - log('creating new counter with name ${counterModel.name}'); + appLogger.info('creating new counter with name ${counterModel.name}'); // map model to dto final dto = CounterRequestConverter().toDto(counterModel); @@ -47,7 +47,7 @@ class CounterRepository implements CounterRepositoryInterface { @override Future updateCounter({required String id, required CounterModel counterModel}) async { - log('updating counter: $id with value: $counterModel'); + appLogger.info('updating counter: $id with value: $counterModel'); // map model to dto final dto = CounterResponseConverter().toDto(counterModel); @@ -58,7 +58,7 @@ class CounterRepository implements CounterRepositoryInterface { @override Future deleteCounter({required String id}) async { - log('deleting counter: $id'); + appLogger.info('deleting counter: $id'); await counterApi.deleteCounter(id); } } diff --git a/lib/src/features/counter/presentation/edit/bloc/edit_counter.bloc.dart b/lib/src/features/counter/presentation/edit/bloc/edit_counter.bloc.dart index 9c196fe..24a7717 100644 --- a/lib/src/features/counter/presentation/edit/bloc/edit_counter.bloc.dart +++ b/lib/src/features/counter/presentation/edit/bloc/edit_counter.bloc.dart @@ -1,9 +1,8 @@ import 'dart:async'; - +import 'package:counter_workshop/src/core/logger/app_logger.dart'; import 'package:counter_workshop/src/features/counter/data/repositories/counter.repository.dart'; import 'package:counter_workshop/src/features/counter/presentation/edit/bloc/edit_counter.event.dart'; import 'package:counter_workshop/src/features/counter/presentation/edit/bloc/edit_counter.state.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class EditCounterBloc extends Bloc { @@ -26,14 +25,14 @@ class EditCounterBloc extends Bloc { } Future _onIncrement(CounterIncrementPressed event, Emitter emit) async { - debugPrint('INCREMENT: ${event.counterModel.toString()}'); + appLogger.info('INCREMENT: ${event.counterModel.toString()}'); final newCounterModel = event.counterModel.copyWith(value: event.counterModel.value + 1); emit(EditCounterData(newCounterModel)); await counterRepository.updateCounter(id: event.counterModel.id, counterModel: newCounterModel); } Future _onDecrement(CounterDecrementPressed event, Emitter emit) async { - debugPrint('DECREMENT: ${event.counterModel.toString()}'); + appLogger.info('DECREMENT: ${event.counterModel.toString()}'); if (event.counterModel.value == 0) { return; diff --git a/lib/src/features/counter/presentation/edit/view/edit_counter.page.dart b/lib/src/features/counter/presentation/edit/view/edit_counter.page.dart index 361dadb..11e7d69 100644 --- a/lib/src/features/counter/presentation/edit/view/edit_counter.page.dart +++ b/lib/src/features/counter/presentation/edit/view/edit_counter.page.dart @@ -1,5 +1,4 @@ -import 'dart:developer'; - +import 'package:counter_workshop/src/core/logger/app_logger.dart'; import 'package:counter_workshop/src/core/widgets/custom_loading_indicator.widget.dart'; import 'package:counter_workshop/src/core/widgets/error_message.widget.dart'; import 'package:counter_workshop/src/features/counter/data/repositories/counter.repository.dart'; @@ -65,7 +64,7 @@ class CounterView extends StatelessWidget { listener: (context, state) { if (state is EditCounterData) { // Calling DashboardBloc (MasterPage) from EditCounterBloc (DetailPage) - log('EditBlocListener: ${state.counterModel.value}'); + appLogger.info('EditBlocListener: ${state.counterModel.value}'); final dashboardBloc = context.read(); dashboardBloc.add(FetchCounterList()); } diff --git a/pubspec.lock b/pubspec.lock index 9112bda..ee0b0a8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -162,6 +162,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.2.3" + dio: + dependency: transitive + description: + name: dio + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.6" equatable: dependency: "direct main" description: @@ -309,12 +316,19 @@ packages: source: hosted version: "2.0.0" logging: - dependency: transitive + dependency: "direct main" description: name: logging url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + logging_appenders: + dependency: "direct main" + description: + name: logging_appenders + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a998cab..48e9e70 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,8 @@ dependencies: http: ^0.13.5 flutter_bloc: ^8.1.1 go_router: ^4.4.1 + logging: ^1.0.2 + logging_appenders: ^1.0.0 dev_dependencies: flutter_test: From e9beb1e3ec3693adc9cfcb4782214495f4e9ef28 Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Tue, 4 Oct 2022 13:58:10 +0200 Subject: [PATCH 02/35] github actions first attempt --- .github/workflows/main.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..bd9ae91 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,18 @@ +name: Flutter Workflow + +on: [push, workflow_dispatch] +jobs: + build: + runs-on: macos-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.3.2' + channel: 'stable' + + - name: Install dependencies + run: flutter pub get \ No newline at end of file From 72351c93d16fdc5059f4d266cc11fab1c8f9463e Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Tue, 4 Oct 2022 14:28:45 +0200 Subject: [PATCH 03/35] second try --- .github/workflows/main.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bd9ae91..81358ce 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,4 +15,7 @@ jobs: channel: 'stable' - name: Install dependencies - run: flutter pub get \ No newline at end of file + run: flutter pub get + + - name: Run unit tests + run: flutter test --coverage \ No newline at end of file From b0f3c059367d29bc9c68b84682da3a1722da16fb Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Tue, 4 Oct 2022 15:51:34 +0200 Subject: [PATCH 04/35] test manuall workflow --- .github/workflows/main.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 81358ce..e4f1645 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,11 +11,22 @@ jobs: - name: Install Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.2' + flutter-version: '3.3.0' channel: 'stable' - name: Install dependencies run: flutter pub get - - name: Run unit tests - run: flutter test --coverage \ No newline at end of file + - name: Run tests + run: flutter test + + +name: Test +on: + workflow_dispatch: +jobs: + build: + runs-on: macos-latest + steps: + - name: Run tests + run: flutter test From 90f76ab011aea1ac269c9e865d879b9a83983c11 Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Tue, 4 Oct 2022 16:00:07 +0200 Subject: [PATCH 05/35] second test manual workflow --- .github/workflows/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e4f1645..51b04de 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,8 +20,6 @@ jobs: - name: Run tests run: flutter test - -name: Test on: workflow_dispatch: jobs: From e8d76f9df526742119a8aa2d62360f76c192c724 Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Wed, 5 Oct 2022 10:01:55 +0200 Subject: [PATCH 06/35] check artifacts migration and jobs --- .github/workflows/main.yml | 41 ++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 51b04de..986a3d3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,15 +16,36 @@ jobs: - name: Install dependencies run: flutter pub get - - - name: Run tests - run: flutter test - -on: - workflow_dispatch: -jobs: - build: + check_app: + runs-on: macos-latest + steps: + # before + - run: flutter --version + # just run + - run: make format + - run: make clean + - run: make lint + code_quality: runs-on: macos-latest steps: - - name: Run tests - run: flutter test + # before + - run: export PATH="$PATH":"$HOME/.pub-cache/bin" + - run: flutter pub global activate dart_code_metrics + # just run + - run: metrics lib -r codeclimate > gh-code-quality-report.json + - name: Upload math result for job 1 + uses: actions/upload-artifact@v3 + with: + name: gl-code-quality-report + path: gh-code-quality-report.json + test: + runs-on: macos-latest + steps: + # before + - run: export PATH="$PATH":"$HOME/.pub-cache/bin" + - run: flutter pub global activate junitreport + # just run + - run: flutter test --machine --coverage | tojunit -o report.xml + - run: lcov --summary coverage/lcov.info + - run: genhtml coverage/lcov.info --output=coverage + From 32c9cab6cfff7ff5fb2f6fbaad737059663f5a08 Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Wed, 5 Oct 2022 10:11:26 +0200 Subject: [PATCH 07/35] adding needs --- .github/workflows/main.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 986a3d3..8fe53a9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,10 +13,11 @@ jobs: with: flutter-version: '3.3.0' channel: 'stable' - + - name: Install dependencies run: flutter pub get check_app: + needs: build runs-on: macos-latest steps: # before @@ -26,6 +27,7 @@ jobs: - run: make clean - run: make lint code_quality: + needs: build runs-on: macos-latest steps: # before @@ -39,6 +41,7 @@ jobs: name: gl-code-quality-report path: gh-code-quality-report.json test: + needs: build runs-on: macos-latest steps: # before From b6b2404c503d0e799c29817c975d8cbb6dd7af76 Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Wed, 5 Oct 2022 10:19:29 +0200 Subject: [PATCH 08/35] check chache flutter --- .github/workflows/main.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8fe53a9..3edf925 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,11 @@ jobs: with: flutter-version: '3.3.0' channel: 'stable' - + - name: Cache Flutter + uses: actions/cache@v3 + with: + path: /flutter/bin/cache/dart-sdk + - name: Install dependencies run: flutter pub get check_app: From df54f54b571e51da7175e7b27ac57d577def83c9 Mon Sep 17 00:00:00 2001 From: Richard Maasri Date: Tue, 18 Oct 2022 15:13:44 +0200 Subject: [PATCH 09/35] run github actions test --- .github/workflows/main.yml | 57 +++++++++--------- build-output/app-dev-release.apk | Bin 0 -> 18855804 bytes .../goldens/macos/counter_grid_phone.png | Bin 0 -> 23418 bytes .../goldens/macos/counter_grid_tablet.png | Bin 0 -> 24603 bytes 4 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 build-output/app-dev-release.apk create mode 100644 test/golden/goldens/macos/counter_grid_phone.png create mode 100644 test/golden/goldens/macos/counter_grid_tablet.png diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3edf925..9d6c33d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,39 +20,42 @@ jobs: - name: Install dependencies run: flutter pub get - check_app: - needs: build - runs-on: macos-latest - steps: - # before - - run: flutter --version - # just run - - run: make format - - run: make clean - - run: make lint - code_quality: - needs: build - runs-on: macos-latest - steps: - # before - - run: export PATH="$PATH":"$HOME/.pub-cache/bin" - - run: flutter pub global activate dart_code_metrics - # just run - - run: metrics lib -r codeclimate > gh-code-quality-report.json - - name: Upload math result for job 1 - uses: actions/upload-artifact@v3 - with: - name: gl-code-quality-report - path: gh-code-quality-report.json + # Check app for format and lint exceptions (fail fast) + # check_app: + # needs: build + # runs-on: macos-latest + # steps: + # # before + # - run: flutter --version + # # just run + # - run: make format + # - run: make clean + # - run: make lint + # # Check code quality + # code_quality: + # needs: build + # runs-on: macos-latest + # steps: + # # before + # - run: export PATH="$PATH":"$HOME/.pub-cache/bin" + # - run: flutter pub global activate dart_code_metrics + # # just run + # - run: metrics lib -r codeclimate > gh-code-quality-report.json + # - name: Upload math result for job 1 + # uses: actions/upload-artifact@v3 + # with: + # name: gl-code-quality-report + # path: gh-code-quality-report.json + # Run tests and report quality test: needs: build runs-on: macos-latest steps: - # before + # before - run: export PATH="$PATH":"$HOME/.pub-cache/bin" - run: flutter pub global activate junitreport - # just run + # just run - run: flutter test --machine --coverage | tojunit -o report.xml - run: lcov --summary coverage/lcov.info - run: genhtml coverage/lcov.info --output=coverage - + # Build the app to check if release builds still work diff --git a/build-output/app-dev-release.apk b/build-output/app-dev-release.apk new file mode 100644 index 0000000000000000000000000000000000000000..70675bd10ab14b0366f7a72b33c53cd28de7e254 GIT binary patch literal 18855804 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%0D?uet4GB0mA?XP${x?xjqOl=1v@vCBif|re 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