From a9c98a02034c58d32d06c725409ada69b660bff0 Mon Sep 17 00:00:00 2001 From: Tejasw Gupta Date: Wed, 10 Mar 2021 16:53:05 +0530 Subject: [PATCH] initial rebased commit --- .gitignore | 84 + .metadata | 10 + android/.gitignore | 7 + android/app/build.gradle | 76 + android/app/src/debug/AndroidManifest.xml | 6 + android/app/src/main/AndroidManifest.xml | 102 + .../kotlin/com/o1298098/movie/MainActivity.kt | 12 + .../app/src/main/res/drawable/app_icon.png | Bin 0 -> 544 bytes .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes android/app/src/main/res/values/styles.xml | 11 + android/app/src/profile/AndroidManifest.xml | 6 + android/build.gradle | 32 + android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 15 + android/settings_aar.gradle | 1 + i18n/de-DE.json | 90 + i18n/en-US.json | 88 + i18n/es-ES.json | 88 + i18n/fr-FR.json | 88 + i18n/ja-JP.json | 88 + i18n/ru-RU.json | 88 + i18n/zh-CN.json | 88 + i18n/zh-TW.json | 87 + i18nconfig.json | 27 + images/CacheBG.jpg | Bin 0 -> 1625 bytes images/account_bar_background.png | Bin 0 -> 8854 bytes images/account_icon.png | Bin 0 -> 730 bytes images/account_icon2.png | Bin 0 -> 729 bytes images/account_icon3.png | Bin 0 -> 727 bytes images/account_icon4.png | Bin 0 -> 728 bytes images/american_express.png | Bin 0 -> 2892 bytes images/c3po.png | Bin 0 -> 2971 bytes images/chewbacca.png | Bin 0 -> 3248 bytes images/darth_vader.png | Bin 0 -> 4179 bytes images/discover.png | Bin 0 -> 3944 bytes images/discover_logo.png | Bin 0 -> 2385 bytes images/email_login.png | Bin 0 -> 3750 bytes images/empty.png | Bin 0 -> 5010 bytes images/empty_comment.png | Bin 0 -> 2266 bytes images/facebook_circle.png | Bin 0 -> 1721 bytes images/google.png | Bin 0 -> 3367 bytes images/google_american_express.png | Bin 0 -> 2596 bytes images/google_discover.png | Bin 0 -> 3194 bytes images/google_mastercard.png | Bin 0 -> 2338 bytes images/google_visa.png | Bin 0 -> 2519 bytes images/icons/icon1.png | Bin 0 -> 16713 bytes images/icons/icon2.png | Bin 0 -> 50068 bytes images/icons/icon3.png | Bin 0 -> 2331 bytes images/icons/icon4.png | Bin 0 -> 13543 bytes images/icons/icon5.png | Bin 0 -> 14175 bytes images/icons/icon6.png | Bin 0 -> 10608 bytes images/instagram_circle.png | Bin 0 -> 1775 bytes images/jcb.png | Bin 0 -> 2816 bytes images/jcb_logo.png | Bin 0 -> 3940 bytes images/landscape.json | 1 + images/link_bold.png | Bin 0 -> 2040 bytes images/local_payment.png | Bin 0 -> 2697 bytes images/luke_skywalker.png | Bin 0 -> 3413 bytes images/mastercard.png | Bin 0 -> 3456 bytes images/mastercard_logo.png | Bin 0 -> 8826 bytes images/option_icon_b.png | Bin 0 -> 5833 bytes images/option_icon_l.png | Bin 0 -> 5245 bytes images/paypal_account.png | Bin 0 -> 2103 bytes images/paypal_logo.png | Bin 0 -> 3468 bytes images/phone_sms.png | Bin 0 -> 4433 bytes images/r2d2.png | Bin 0 -> 2278 bytes images/samsung_pay.png | Bin 0 -> 1355 bytes images/tmdb_blue.png | Bin 0 -> 4029 bytes images/tmdb_green.png | Bin 0 -> 4032 bytes images/twitter_circle.png | Bin 0 -> 2104 bytes images/venmo_account.png | Bin 0 -> 2954 bytes images/visa.png | Bin 0 -> 2836 bytes images/visa_logo.png | Bin 0 -> 2497 bytes images/yoda.png | Bin 0 -> 4485 bytes ios/.gitignore | 32 + ios/Flutter/.last_build_id | 1 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 3 + ios/Flutter/Release.xcconfig | 3 + ios/Podfile | 42 + ios/Podfile.lock | 743 ++++++ ios/Runner-Bridging-Header.h | 4 + ios/Runner.xcodeproj/project.pbxproj | 703 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 10 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + ios/Runner/AppDelegate.h | 6 + ios/Runner/AppDelegate.m | 34 + ios/Runner/AppDelegate.swift | 32 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 104 + ios/Runner/Runner-Bridging-Header.h | 1 + ios/Runner/Runner.entitlements | 5 + ios/Runner/main.m | 9 + ...7b0fc03a98d8a0604f07c05fb3e42-desc.xcbuild | Bin 0 -> 673538 bytes ...c03a98d8a0604f07c05fb3e42-manifest.xcbuild | 93 + ...9b704e802e3dbbc38b7d9cfe73ef4-desc.xcbuild | Bin 0 -> 673263 bytes ...4e802e3dbbc38b7d9cfe73ef4-manifest.xcbuild | 93 + ...acheIndex-9cb884f38aa6d9ca6b46f6a93f416231 | Bin 0 -> 78 bytes ...acheIndex-f486b63b45fa1476554e34497a9755c0 | Bin 0 -> 78 bytes ios/build/XCBuildData/build.db | Bin 0 -> 122880 bytes ...0e20f868f3f06ba0848e6582b8e21-desc.xcbuild | Bin 0 -> 489016 bytes ...f868f3f06ba0848e6582b8e21-manifest.xcbuild | 86 + ...1666a983853c9b7ee142760007e28-desc.xcbuild | Bin 0 -> 828536 bytes ...a983853c9b7ee142760007e28-manifest.xcbuild | 95 + lib/actions/adapt.dart | 53 + lib/actions/ads_config.dart | 22 + lib/actions/api/base_api.dart | 627 +++++ lib/actions/api/github_api.dart | 16 + lib/actions/api/graphql_client.dart | 180 ++ lib/actions/api/graphql_service.dart | 52 + lib/actions/api/request.dart | 47 + lib/actions/api/tmdb_api.dart | 832 +++++++ lib/actions/api/urlresolver_api.dart | 25 + lib/actions/app_config.dart | 47 + lib/actions/app_language.dart | 31 + lib/actions/creditcard_verify.dart | 23 + lib/actions/downloader_callback.dart | 13 + lib/actions/imageurl.dart | 17 + lib/actions/local_notification.dart | 44 + lib/actions/notification_topic.dart | 12 + lib/actions/pop_result.dart | 17 + lib/actions/stream_link_convert/archive.dart | 13 + lib/actions/stream_link_convert/bitporno.dart | 18 + .../stream_link_convert/clipwatching.dart | 18 + .../stream_link_convert/cloudvideo.dart | 22 + lib/actions/stream_link_convert/dood.dart | 48 + lib/actions/stream_link_convert/fembed.dart | 25 + .../stream_link_convert/gamovideo.dart | 18 + .../stream_link_convert/gounlimited.dart | 20 + lib/actions/stream_link_convert/jawcloud.dart | 21 + lib/actions/stream_link_convert/jetload.dart | 94 + .../stream_link_convert/mediafire.dart | 0 lib/actions/stream_link_convert/mixdrop.dart | 37 + .../stream_link_convert/mp4upload.dart | 23 + .../stream_link_convert/ninjastream.dart | 18 + lib/actions/stream_link_convert/openlay.dart | 18 + lib/actions/stream_link_convert/powvideo.dart | 21 + .../stream_link_convert/prostream.dart | 18 + .../stream_link_convert_factory.dart | 188 ++ .../stream_link_convert/streamplay.dart | 18 + .../stream_link_convert/streamtape.dart | 18 + .../stream_link_convert/supervideo.dart | 18 + lib/actions/stream_link_convert/upstream.dart | 21 + .../stream_link_convert/uptostream.dart | 21 + lib/actions/stream_link_convert/uqload.dart | 21 + lib/actions/stream_link_convert/veoh.dart | 23 + lib/actions/stream_link_convert/vidcloud.dart | 103 + lib/actions/stream_link_convert/videobin.dart | 21 + .../stream_link_convert/videomega.dart | 21 + lib/actions/stream_link_convert/vidfast.dart | 23 + lib/actions/stream_link_convert/vidia.dart | 13 + lib/actions/stream_link_convert/vidlox.dart | 18 + lib/actions/stream_link_convert/vidoza.dart | 18 + lib/actions/stream_link_convert/vidtodo.dart | 18 + lib/actions/stream_link_convert/vup.dart | 18 + lib/actions/stream_link_convert/waaw.dart | 21 + lib/actions/timeline.dart | 94 + lib/actions/timeline_convert.dart | 15 + lib/actions/user_info_operate.dart | 75 + lib/actions/version_comparison.dart | 45 + lib/actions/videourl.dart | 14 + lib/actions/votecolorhelper.dart | 11 + lib/app.dart | 90 + lib/generated/i18n.dart | 2150 +++++++++++++++++ lib/globalbasestate/action.dart | 25 + lib/globalbasestate/reducer.dart | 52 + lib/globalbasestate/state.dart | 32 + lib/globalbasestate/store.dart | 10 + lib/main.dart | 13 + lib/models/account_detail.dart | 64 + lib/models/app_user.dart | 11 + lib/models/base_api_model/account_info.dart | 35 + lib/models/base_api_model/account_state.dart | 41 + lib/models/base_api_model/base_cast_list.dart | 76 + lib/models/base_api_model/base_movie.dart | 71 + lib/models/base_api_model/base_tvshow.dart | 74 + lib/models/base_api_model/base_user.dart | 32 + .../braintree_billing_address.dart | 68 + .../base_api_model/braintree_creditcard.dart | 138 ++ .../base_api_model/braintree_customer.dart | 514 ++++ .../braintree_customer_details.dart | 38 + .../base_api_model/braintree_descriptor.dart | 18 + .../base_api_model/braintree_item_type.dart | 18 + .../braintree_status_history.dart | 30 + .../braintree_subscription.dart | 148 ++ .../base_api_model/braintree_transaction.dart | 510 ++++ .../branintree_disbursement_details.dart | 30 + .../base_api_model/cast_list_detail.dart | 60 + lib/models/base_api_model/checkout_model.dart | 17 + lib/models/base_api_model/movie_comment.dart | 72 + .../base_api_model/movie_like_model.dart | 26 + .../base_api_model/movie_stream_link.dart | 89 + .../base_api_model/payment_client_token.dart | 26 + lib/models/base_api_model/purchase.dart | 8 + .../base_api_model/stream_link_language.dart | 20 + .../base_api_model/stream_link_quality.dart | 20 + .../base_api_model/stream_link_report.dart | 19 + .../base_api_model/stream_link_type.dart | 18 + .../base_api_model/topic_subscription.dart | 29 + lib/models/base_api_model/tvshow_comment.dart | 78 + .../base_api_model/tvshow_like_model.dart | 31 + .../base_api_model/tvshow_stream_link.dart | 93 + lib/models/base_api_model/user_list.dart | 76 + .../base_api_model/user_list_detail.dart | 68 + lib/models/base_api_model/user_media.dart | 77 + .../base_api_model/user_premium_model.dart | 68 + lib/models/certification.dart | 221 ++ lib/models/combined_cast_data.dart | 81 + lib/models/combined_credits.dart | 44 + lib/models/combined_crew_data.dart | 84 + lib/models/country_phone_code.dart | 25 + lib/models/country_phone_codes.json | 1478 +++++++++++ lib/models/credits_model.dart | 121 + lib/models/discover_sort_type.dart | 16 + lib/models/download_queue.dart | 24 + lib/models/enums/genres.dart | 414 ++++ lib/models/enums/imagesize.dart | 20 + lib/models/enums/list_sort_type.dart | 10 + lib/models/enums/media_type.dart | 6 + lib/models/enums/premium_type.dart | 6 + lib/models/enums/releasedatetype.dart | 10 + lib/models/enums/screenshot_type.dart | 4 + lib/models/enums/streamlink_type.dart | 5 + lib/models/enums/theme_color.dart | 17 + lib/models/enums/time_window.dart | 1 + lib/models/episode_model.dart | 111 + lib/models/external_ids_model.dart | 36 + .../firebase/firebase_accountstate.dart | 26 + lib/models/firebase/firebase_streamlink.dart | 36 + lib/models/genre.dart | 18 + lib/models/github_release.dart | 200 ++ lib/models/image_model.dart | 61 + lib/models/item.dart | 22 + lib/models/keyword.dart | 49 + lib/models/list_detail_mode.dart | 108 + lib/models/list_media_item.dart | 11 + lib/models/media_account_state_model.dart | 44 + lib/models/model_factory.dart | 88 + lib/models/models.dart | 49 + lib/models/movie_change.dart | 48 + lib/models/movie_detail.dart | 234 ++ lib/models/mylist_model.dart | 101 + lib/models/notification_model.dart | 111 + lib/models/people_detail.dart | 94 + lib/models/production_companie.dart | 23 + lib/models/release_date_model.dart | 72 + lib/models/response_model.dart | 7 + lib/models/review.dart | 54 + lib/models/search_result.dart | 190 ++ lib/models/season_detail.dart | 62 + lib/models/sort_condition.dart | 7 + lib/models/tvshow_detail.dart | 358 +++ lib/models/video_list.dart | 117 + lib/models/video_model.dart | 56 + lib/routes/routes.dart | 102 + lib/style/test_inherited_widget.dart | 22 + lib/style/themestyle.dart | 28 + lib/style/themestyle_widget.dart | 59 + lib/views/account_page/action.dart | 25 + .../data_panel_component/action.dart | 18 + .../data_panel_component/component.dart | 19 + .../data_panel_component/effect.dart | 24 + .../data_panel_component/reducer.dart | 20 + .../data_panel_component/state.dart | 25 + .../components/data_panel_component/view.dart | 90 + .../components/settings_component/action.dart | 57 + .../settings_component/component.dart | 22 + .../components/settings_component/effect.dart | 159 ++ .../settings_component/reducer.dart | 42 + .../components/settings_component/state.dart | 31 + .../components/settings_component/view.dart | 244 ++ .../user_data_component/action.dart | 19 + .../user_data_component/component.dart | 22 + .../user_data_component/effect.dart | 38 + .../user_data_component/reducer.dart | 26 + .../components/user_data_component/state.dart | 29 + .../components/user_data_component/view.dart | 119 + .../user_info_component/action.dart | 36 + .../user_info_component/component.dart | 20 + .../component/about_page.dart | 170 ++ .../component/arrow_clipper.dart | 17 + .../component/user_menu.dart | 118 + .../user_info_component/effect.dart | 33 + .../user_info_component/reducer.dart | 17 + .../components/user_info_component/state.dart | 25 + .../components/user_info_component/view.dart | 215 ++ lib/views/account_page/effect.dart | 45 + lib/views/account_page/page.dart | 33 + lib/views/account_page/reducer.dart | 41 + lib/views/account_page/state.dart | 60 + lib/views/account_page/view.dart | 335 +++ lib/views/account_page_old/action.dart | 42 + .../components/body_component/component.dart | 16 + .../components/body_component/state.dart | 17 + .../components/body_component/view.dart | 109 + .../header_component/component.dart | 16 + .../components/header_component/state.dart | 20 + .../components/header_component/view.dart | 169 ++ lib/views/account_page_old/effect.dart | 78 + lib/views/account_page_old/page.dart | 27 + lib/views/account_page_old/reducer.dart | 29 + lib/views/account_page_old/state.dart | 42 + lib/views/account_page_old/view.dart | 67 + .../cast_list_detail_page/action.dart | 42 + .../cast_list_detail_page/effect.dart | 84 + .../cast_list/cast_list_detail_page/page.dart | 22 + .../cast_list_detail_page/reducer.dart | 53 + .../cast_list_detail_page/state.dart | 29 + .../cast_list/cast_list_detail_page/view.dart | 452 ++++ .../cast_list/cast_list_page/action.dart | 33 + .../components/cast_list_create.dart | 312 +++ .../cast_list/cast_list_page/effect.dart | 46 + lib/views/cast_list/cast_list_page/page.dart | 19 + .../cast_list/cast_list_page/reducer.dart | 26 + lib/views/cast_list/cast_list_page/state.dart | 30 + lib/views/cast_list/cast_list_page/view.dart | 154 ++ lib/views/checkout_page/action.dart | 34 + lib/views/checkout_page/effect.dart | 128 + lib/views/checkout_page/page.dart | 19 + lib/views/checkout_page/reducer.dart | 34 + lib/views/checkout_page/state.dart | 41 + lib/views/checkout_page/view.dart | 312 +++ lib/views/coming_page/action.dart | 32 + .../components/movie_component/action.dart | 14 + .../components/movie_component/component.dart | 20 + .../components/movie_component/effect.dart | 22 + .../components/movie_component/reducer.dart | 17 + .../components/movie_component/state.dart | 25 + .../components/movie_component/view.dart | 207 ++ .../components/tab_component/action.dart | 9 + .../components/tab_component/component.dart | 21 + .../components/tab_component/effect.dart | 12 + .../components/tab_component/reducer.dart | 17 + .../components/tab_component/state.dart | 19 + .../components/tab_component/view.dart | 35 + .../components/tv_component/action.dart | 18 + .../components/tv_component/adapter.dart | 15 + .../components/tv_component/component.dart | 23 + .../components/tv_component/effect.dart | 24 + .../components/tv_component/reducer.dart | 32 + .../shimmercell_component/component.dart | 15 + .../shimmercell_component/state.dart | 16 + .../shimmercell_component/view.dart | 91 + .../components/tv_component/state.dart | 59 + .../tv_component/tvcell_component/action.dart | 19 + .../tvcell_component/component.dart | 17 + .../tv_component/tvcell_component/effect.dart | 31 + .../tvcell_component/reducer.dart | 17 + .../tv_component/tvcell_component/state.dart | 19 + .../tv_component/tvcell_component/view.dart | 123 + .../components/tv_component/view.dart | 36 + lib/views/coming_page/effect.dart | 62 + lib/views/coming_page/page.dart | 30 + lib/views/coming_page/reducer.dart | 63 + lib/views/coming_page/state.dart | 34 + lib/views/coming_page/view.dart | 29 + lib/views/createlist_page/action.dart | 31 + lib/views/createlist_page/effect.dart | 85 + lib/views/createlist_page/page.dart | 19 + lib/views/createlist_page/reducer.dart | 33 + lib/views/createlist_page/state.dart | 54 + lib/views/createlist_page/view.dart | 209 ++ lib/views/detail_page/action.dart | 71 + .../components/appbar_component/action.dart | 9 + .../appbar_component/component.dart | 21 + .../components/appbar_component/effect.dart | 12 + .../components/appbar_component/reducer.dart | 17 + .../components/appbar_component/state.dart | 24 + .../components/appbar_component/view.dart | 119 + .../components/cast_component/action.dart | 9 + .../components/cast_component/component.dart | 18 + .../components/cast_component/effect.dart | 12 + .../components/cast_component/state.dart | 20 + .../components/cast_component/view.dart | 176 ++ .../components/keyword_component/action.dart | 9 + .../keyword_component/component.dart | 18 + .../components/keyword_component/effect.dart | 12 + .../components/keyword_component/state.dart | 20 + .../components/keyword_component/view.dart | 144 ++ .../components/maininfo_component/action.dart | 9 + .../maininfo_component/component.dart | 24 + .../components/maininfo_component/effect.dart | 11 + .../maininfo_component/reducer.dart | 17 + .../components/maininfo_component/state.dart | 27 + .../components/maininfo_component/view.dart | 465 ++++ .../components/menu_component/action.dart | 51 + .../components/menu_component/component.dart | 22 + .../components/menu_component/effect.dart | 125 + .../components/menu_component/reducer.dart | 40 + .../components/menu_component/state.dart | 46 + .../components/menu_component/view.dart | 237 ++ .../components/overview_component/action.dart | 9 + .../overview_component/component.dart | 18 + .../components/overview_component/effect.dart | 12 + .../components/overview_component/state.dart | 19 + .../components/overview_component/view.dart | 79 + .../recommendation_component/action.dart | 9 + .../recommendation_component/component.dart | 19 + .../recommendation_component/effect.dart | 12 + .../recommendation_component/state.dart | 21 + .../recommendation_component/view.dart | 184 ++ .../components/still_component/action.dart | 9 + .../components/still_component/component.dart | 18 + .../components/still_component/effect.dart | 12 + .../components/still_component/state.dart | 20 + .../components/still_component/view.dart | 121 + .../components/trailer_component/action.dart | 16 + .../trailer_component/component.dart | 20 + .../components/trailer_component/effect.dart | 78 + .../components/trailer_component/reducer.dart | 17 + .../components/trailer_component/state.dart | 20 + .../components/trailer_component/view.dart | 156 ++ lib/views/detail_page/effect.dart | 130 + lib/views/detail_page/page.dart | 53 + lib/views/detail_page/reducer.dart | 56 + lib/views/detail_page/state.dart | 51 + lib/views/detail_page/view.dart | 31 + lib/views/discover_page/action.dart | 59 + lib/views/discover_page/adapter.dart | 12 + .../components/filter_component/action.dart | 52 + .../filter_component/component.dart | 17 + .../components/filter_component/effect.dart | 42 + .../components/filter_component/reducer.dart | 58 + .../components/filter_component/state.dart | 63 + .../components/filter_component/view.dart | 465 ++++ .../movicecell_component/action.dart | 16 + .../movicecell_component/component.dart | 21 + .../movicecell_component/effect.dart | 17 + .../movicecell_component/reducer.dart | 17 + .../movicecell_component/state.dart | 18 + .../components/movicecell_component/view.dart | 175 ++ lib/views/discover_page/effect.dart | 154 ++ lib/views/discover_page/page.dart | 30 + lib/views/discover_page/reducer.dart | 44 + lib/views/discover_page/state.dart | 83 + lib/views/discover_page/view.dart | 376 +++ lib/views/download_page/action.dart | 43 + lib/views/download_page/effect.dart | 91 + lib/views/download_page/page.dart | 20 + lib/views/download_page/reducer.dart | 26 + lib/views/download_page/state.dart | 16 + lib/views/download_page/view.dart | 342 +++ lib/views/episodedetail_page/action.dart | 14 + lib/views/episodedetail_page/adapter.dart | 16 + .../components/credits_component/action.dart | 15 + .../credits_component/component.dart | 19 + .../components/credits_component/effect.dart | 18 + .../components/credits_component/state.dart | 18 + .../components/credits_component/view.dart | 363 +++ .../components/header_component/action.dart | 9 + .../header_component/component.dart | 19 + .../components/header_component/effect.dart | 17 + .../components/header_component/reducer.dart | 17 + .../components/header_component/state.dart | 16 + .../components/header_component/view.dart | 115 + .../components/images_component/action.dart | 17 + .../images_component/component.dart | 20 + .../components/images_component/effect.dart | 42 + .../components/images_component/reducer.dart | 17 + .../components/images_component/state.dart | 17 + .../components/images_component/view.dart | 146 ++ lib/views/episodedetail_page/effect.dart | 22 + lib/views/episodedetail_page/page.dart | 23 + lib/views/episodedetail_page/reducer.dart | 27 + lib/views/episodedetail_page/state.dart | 75 + lib/views/episodedetail_page/view.dart | 32 + lib/views/favorites_page/action.dart | 49 + .../background_component/component.dart | 16 + .../background_component/state.dart | 19 + .../components/background_component/view.dart | 28 + .../components/header_component/action.dart | 9 + .../header_component/component.dart | 22 + .../components/header_component/effect.dart | 12 + .../components/header_component/reducer.dart | 17 + .../components/header_component/state.dart | 25 + .../components/header_component/view.dart | 154 ++ .../components/swiper_component/action.dart | 27 + .../swiper_component/component.dart | 24 + .../components/swiper_component/effect.dart | 31 + .../components/swiper_component/reducer.dart | 40 + .../components/swiper_component/state.dart | 41 + .../components/swiper_component/view.dart | 158 ++ lib/views/favorites_page/effect.dart | 57 + lib/views/favorites_page/page.dart | 30 + lib/views/favorites_page/reducer.dart | 61 + lib/views/favorites_page/state.dart | 45 + lib/views/favorites_page/view.dart | 58 + lib/views/gallery_page/action.dart | 9 + lib/views/gallery_page/effect.dart | 24 + lib/views/gallery_page/page.dart | 19 + lib/views/gallery_page/reducer.dart | 17 + lib/views/gallery_page/state.dart | 19 + lib/views/gallery_page/view.dart | 70 + lib/views/home_page/action.dart | 78 + .../components/header_component/action.dart | 16 + .../header_component/component.dart | 22 + .../components/header_component/effect.dart | 11 + .../components/header_component/reducer.dart | 24 + .../components/header_component/state.dart | 32 + .../components/header_component/view.dart | 220 ++ .../popularposter_cpmponent/action.dart | 23 + .../popularposter_cpmponent/component.dart | 23 + .../popularposter_cpmponent/effect.dart | 30 + .../popularposter_cpmponent/reducer.dart | 26 + .../popularposter_cpmponent/state.dart | 33 + .../popularposter_cpmponent/view.dart | 247 ++ .../components/share_component/action.dart | 16 + .../components/share_component/component.dart | 23 + .../components/share_component/effect.dart | 12 + .../components/share_component/reducer.dart | 24 + .../components/share_component/state.dart | 32 + .../components/share_component/view.dart | 259 ++ .../components/swiper_component/action.dart | 9 + .../swiper_component/component.dart | 20 + .../components/swiper_component/effect.dart | 12 + .../components/swiper_component/state.dart | 24 + .../components/swiper_component/view.dart | 190 ++ .../components/trending_component/action.dart | 9 + .../trending_component/component.dart | 18 + .../components/trending_component/effect.dart | 12 + .../components/trending_component/state.dart | 20 + .../components/trending_component/view.dart | 167 ++ lib/views/home_page/effect.dart | 119 + lib/views/home_page/page.dart | 40 + lib/views/home_page/reducer.dart | 77 + lib/views/home_page/state.dart | 53 + lib/views/home_page/view.dart | 98 + lib/views/listdetail_page/action.dart | 50 + .../components/body_component/action.dart | 9 + .../body_component/adapter/adapter.dart | 11 + .../components/body_component/component.dart | 22 + .../components/body_component/effect.dart | 12 + .../components/body_component/reducer.dart | 17 + .../components/body_component/state.dart | 37 + .../components/body_component/view.dart | 64 + .../components/header_component/action.dart | 9 + .../header_component/component.dart | 20 + .../components/header_component/effect.dart | 12 + .../components/header_component/reducer.dart | 17 + .../components/header_component/state.dart | 34 + .../components/header_component/view.dart | 277 +++ .../infogroup_component/component.dart | 19 + .../components/infogroup_component/state.dart | 28 + .../components/infogroup_component/view.dart | 118 + .../components/listcell_component/action.dart | 9 + .../listcell_component/component.dart | 20 + .../components/listcell_component/effect.dart | 12 + .../listcell_component/reducer.dart | 17 + .../components/listcell_component/state.dart | 15 + .../components/listcell_component/view.dart | 47 + .../sharecard_component/action.dart | 9 + .../sharecard_component/component.dart | 19 + .../sharecard_component/effect.dart | 12 + .../components/sharecard_component/state.dart | 26 + .../components/sharecard_component/view.dart | 164 ++ lib/views/listdetail_page/effect.dart | 66 + lib/views/listdetail_page/page.dart | 33 + lib/views/listdetail_page/reducer.dart | 40 + lib/views/listdetail_page/state.dart | 60 + lib/views/listdetail_page/view.dart | 35 + lib/views/login_page/action.dart | 42 + lib/views/login_page/effect.dart | 204 ++ lib/views/login_page/page.dart | 20 + lib/views/login_page/reducer.dart | 32 + lib/views/login_page/state.dart | 53 + lib/views/login_page/view.dart | 729 ++++++ lib/views/main_page/action.dart | 13 + lib/views/main_page/effect.dart | 169 ++ lib/views/main_page/page.dart | 23 + lib/views/main_page/reducer.dart | 24 + lib/views/main_page/state.dart | 31 + lib/views/main_page/view.dart | 90 + lib/views/moremedia_page/action.dart | 20 + lib/views/moremedia_page/effect.dart | 78 + lib/views/moremedia_page/page.dart | 20 + lib/views/moremedia_page/reducer.dart | 28 + lib/views/moremedia_page/state.dart | 27 + lib/views/moremedia_page/view.dart | 146 ++ lib/views/moviedetail_page/action.dart | 70 + .../components/info_component/action.dart | 13 + .../components/info_component/component.dart | 17 + .../components/info_component/effect.dart | 20 + .../components/info_component/state.dart | 22 + .../components/info_component/view.dart | 375 +++ .../components/keywords_component/action.dart | 9 + .../keywords_component/component.dart | 19 + .../components/keywords_component/effect.dart | 12 + .../keywords_component/reducer.dart | 17 + .../components/keywords_component/state.dart | 26 + .../components/keywords_component/view.dart | 78 + .../components/menu_component/action.dart | 41 + .../components/menu_component/component.dart | 19 + .../components/menu_component/effect.dart | 47 + .../components/menu_component/reducer.dart | 42 + .../components/menu_component/state.dart | 43 + .../components/menu_component/view.dart | 223 ++ lib/views/moviedetail_page/effect.dart | 82 + lib/views/moviedetail_page/page.dart | 31 + lib/views/moviedetail_page/reducer.dart | 75 + lib/views/moviedetail_page/state.dart | 84 + lib/views/moviedetail_page/view.dart | 897 +++++++ lib/views/mylists_page/action.dart | 38 + lib/views/mylists_page/adapter/action.dart | 9 + lib/views/mylists_page/adapter/adapter.dart | 13 + lib/views/mylists_page/adapter/reducer.dart | 26 + .../addcell_component/component.dart | 16 + .../mylists_page/addcell_component/state.dart | 20 + .../mylists_page/addcell_component/view.dart | 43 + lib/views/mylists_page/effect.dart | 55 + .../listcell_component/action.dart | 32 + .../listcell_component/component.dart | 23 + .../listcell_component/effect.dart | 70 + .../listcell_component/reducer.dart | 17 + .../listcell_component/state.dart | 25 + .../mylists_page/listcell_component/view.dart | 146 ++ lib/views/mylists_page/page.dart | 26 + lib/views/mylists_page/reducer.dart | 42 + lib/views/mylists_page/state.dart | 62 + lib/views/mylists_page/view.dart | 100 + lib/views/notification_page/action.dart | 18 + lib/views/notification_page/effect.dart | 52 + lib/views/notification_page/page.dart | 22 + lib/views/notification_page/reducer.dart | 26 + lib/views/notification_page/state.dart | 14 + lib/views/notification_page/view.dart | 211 ++ lib/views/payment_page/action.dart | 44 + .../android_pay_component/component.dart | 15 + .../android_pay_component/state.dart | 13 + .../android_pay_component/view.dart | 8 + .../apple_pay_component/component.dart | 15 + .../components/apple_pay_component/state.dart | 13 + .../components/apple_pay_component/view.dart | 8 + .../billing_address_component/action.dart | 37 + .../billing_address_component/component.dart | 27 + .../create_address_component/action.dart | 26 + .../create_address_component/component.dart | 24 + .../create_address_component/effect.dart | 97 + .../create_address_component/reducer.dart | 34 + .../create_address_component/state.dart | 53 + .../create_address_component/view.dart | 382 +++ .../billing_address_component/effect.dart | 52 + .../billing_address_component/reducer.dart | 50 + .../billing_address_component/state.dart | 32 + .../billing_address_component/view.dart | 161 ++ .../create_card_component/action.dart | 36 + .../create_card_component/component.dart | 23 + .../components/scan_component/action.dart | 18 + .../components/scan_component/component.dart | 17 + .../components/scan_component/effect.dart | 55 + .../components/scan_component/reducer.dart | 26 + .../components/scan_component/state.dart | 24 + .../components/scan_component/view.dart | 23 + .../create_card_component/effect.dart | 147 ++ .../create_card_component/reducer.dart | 33 + .../create_card_component/state.dart | 55 + .../create_card_component/view.dart | 779 ++++++ .../components/history_component/action.dart | 22 + .../history_component/component.dart | 17 + .../components/history_component/effect.dart | 29 + .../components/history_component/reducer.dart | 34 + .../components/history_component/state.dart | 34 + .../components/history_component/view.dart | 140 ++ lib/views/payment_page/effect.dart | 53 + lib/views/payment_page/page.dart | 31 + lib/views/payment_page/reducer.dart | 46 + lib/views/payment_page/state.dart | 46 + lib/views/payment_page/view.dart | 538 +++++ lib/views/peopledetail_page/action.dart | 42 + .../components/gallery_component/action.dart | 13 + .../gallery_component/component.dart | 20 + .../components/gallery_component/effect.dart | 24 + .../components/gallery_component/reducer.dart | 17 + .../components/gallery_component/state.dart | 22 + .../components/gallery_component/view.dart | 135 ++ .../components/header_component/action.dart | 13 + .../header_component/component.dart | 26 + .../components/cast_list.dart | 256 ++ .../components/header_component/effect.dart | 13 + .../components/header_component/reducer.dart | 17 + .../components/header_component/state.dart | 47 + .../components/header_component/view.dart | 261 ++ .../components/knownfor_component/action.dart | 9 + .../knownfor_component/component.dart | 20 + .../components/knownfor_component/effect.dart | 12 + .../knownfor_component/reducer.dart | 17 + .../components/knownfor_component/state.dart | 23 + .../components/knownfor_component/view.dart | 186 ++ .../personalinfo_component/action.dart | 9 + .../personalinfo_component/component.dart | 20 + .../personalinfo_component/effect.dart | 12 + .../personalinfo_component/reducer.dart | 17 + .../personalinfo_component/state.dart | 29 + .../personalinfo_component/view.dart | 119 + .../components/timeline_component/action.dart | 13 + .../timeline_component/component.dart | 23 + .../components/timeline_component/effect.dart | 12 + .../timeline_component/reducer.dart | 24 + .../components/timeline_component/state.dart | 47 + .../components/timeline_component/view.dart | 154 ++ lib/views/peopledetail_page/effect.dart | 69 + lib/views/peopledetail_page/page.dart | 38 + lib/views/peopledetail_page/reducer.dart | 64 + lib/views/peopledetail_page/state.dart | 71 + lib/views/peopledetail_page/view.dart | 128 + lib/views/premium_page/action.dart | 22 + .../components/plan_component/action.dart | 17 + .../components/plan_component/component.dart | 19 + .../components/plan_component/effect.dart | 28 + .../components/plan_component/reducer.dart | 23 + .../components/plan_component/state.dart | 33 + .../components/plan_component/view.dart | 275 +++ .../premium_info_component/action.dart | 13 + .../premium_info_component/component.dart | 22 + .../header_component/component.dart | 16 + .../components/header_component/state.dart | 20 + .../components/header_component/view.dart | 175 ++ .../premium_info_component/effect.dart | 13 + .../premium_info_component/reducer.dart | 17 + .../premium_info_component/state.dart | 25 + .../premium_info_component/view.dart | 344 +++ lib/views/premium_page/effect.dart | 38 + lib/views/premium_page/page.dart | 27 + lib/views/premium_page/reducer.dart | 34 + lib/views/premium_page/state.dart | 34 + lib/views/premium_page/view.dart | 12 + lib/views/register_page/action.dart | 16 + lib/views/register_page/effect.dart | 79 + lib/views/register_page/page.dart | 20 + lib/views/register_page/reducer.dart | 17 + lib/views/register_page/state.dart | 34 + lib/views/register_page/view.dart | 275 +++ lib/views/seasondetail_page/action.dart | 41 + .../components/episodes_component/action.dart | 18 + .../episodes_component/component.dart | 20 + .../components/episodes_component/effect.dart | 40 + .../episodes_component/reducer.dart | 23 + .../components/episodes_component/state.dart | 28 + .../components/episodes_component/view.dart | 321 +++ .../header_component/component.dart | 21 + .../components/header_component/state.dart | 53 + .../components/header_component/view.dart | 382 +++ .../seasoncast_component/action.dart | 23 + .../seasoncast_component/component.dart | 20 + .../seasoncast_component/effect.dart | 17 + .../seasoncast_component/reducer.dart | 23 + .../seasoncast_component/state.dart | 26 + .../components/seasoncast_component/view.dart | 191 ++ lib/views/seasondetail_page/effect.dart | 92 + lib/views/seasondetail_page/page.dart | 29 + lib/views/seasondetail_page/reducer.dart | 49 + lib/views/seasondetail_page/state.dart | 62 + lib/views/seasondetail_page/view.dart | 70 + lib/views/seasons_page/action.dart | 15 + lib/views/seasons_page/effect.dart | 43 + lib/views/seasons_page/page.dart | 20 + lib/views/seasons_page/reducer.dart | 17 + lib/views/seasons_page/state.dart | 21 + lib/views/seasons_page/view.dart | 151 ++ lib/views/setting_page/action.dart | 78 + .../setting_page/components/setting_body.dart | 377 +++ lib/views/setting_page/effect.dart | 197 ++ lib/views/setting_page/page.dart | 20 + lib/views/setting_page/reducer.dart | 78 + lib/views/setting_page/state.dart | 65 + lib/views/setting_page/view.dart | 371 +++ lib/views/start_page/action.dart | 17 + lib/views/start_page/effect.dart | 62 + lib/views/start_page/page.dart | 19 + lib/views/start_page/reducer.dart | 25 + lib/views/start_page/state.dart | 17 + lib/views/start_page/view.dart | 295 +++ .../allstreamlink_page/action.dart | 56 + .../allstreamlink_page/effect.dart | 134 + .../stream_link/allstreamlink_page/page.dart | 22 + .../allstreamlink_page/reducer.dart | 61 + .../stream_link/allstreamlink_page/state.dart | 55 + .../stream_link/allstreamlink_page/view.dart | 217 ++ .../episode_livestream_page/action.dart | 55 + .../bottom_panel_component/action.dart | 95 + .../bottom_panel_component/component.dart | 36 + .../components/arrow_clipper.dart | 17 + .../components/comment_component/action.dart | 27 + .../comment_component/component.dart | 22 + .../components/comment_component/effect.dart | 82 + .../components/comment_component/reducer.dart | 44 + .../components/comment_component/state.dart | 40 + .../components/comment_component/view.dart | 266 ++ .../components/download_menu.dart | 440 ++++ .../components/option_menu.dart | 243 ++ .../streamlink_filter_component/action.dart | 67 + .../component.dart | 29 + .../components/filter_menu.dart | 260 ++ .../components/sort_menu.dart | 145 ++ .../streamlink_filter_component/effect.dart | 91 + .../streamlink_filter_component/reducer.dart | 72 + .../streamlink_filter_component/state.dart | 61 + .../streamlink_filter_component/view.dart | 315 +++ .../components/video_source_menu.dart | 202 ++ .../bottom_panel_component/effect.dart | 179 ++ .../bottom_panel_component/reducer.dart | 66 + .../bottom_panel_component/state.dart | 69 + .../bottom_panel_component/view.dart | 264 ++ .../components/player_component/action.dart | 9 + .../player_component/component.dart | 27 + .../components/player_component/effect.dart | 12 + .../components/player_component/reducer.dart | 17 + .../components/player_component/state.dart | 52 + .../components/player_component/view.dart | 31 + .../episode_livestream_page/effect.dart | 123 + .../episode_livestream_page/page.dart | 28 + .../episode_livestream_page/reducer.dart | 79 + .../episode_livestream_page/state.dart | 62 + .../episode_livestream_page/view.dart | 314 +++ .../movie_livestream_page/action.dart | 47 + .../bottom_panel_component/action.dart | 95 + .../bottom_panel_component/component.dart | 37 + .../components/comment_component/action.dart | 27 + .../comment_component/component.dart | 22 + .../components/comment_component/effect.dart | 78 + .../components/comment_component/reducer.dart | 44 + .../components/comment_component/state.dart | 34 + .../components/comment_component/view.dart | 266 ++ .../components/download_menu.dart | 435 ++++ .../components/option_menu.dart | 242 ++ .../streamlink_filter_component/action.dart | 67 + .../component.dart | 29 + .../components/filter_menu.dart | 246 ++ .../components/sort_menu.dart | 145 ++ .../streamlink_filter_component/effect.dart | 91 + .../streamlink_filter_component/reducer.dart | 72 + .../streamlink_filter_component/state.dart | 57 + .../streamlink_filter_component/view.dart | 315 +++ .../components/video_source_menu.dart | 206 ++ .../bottom_panel_component/effect.dart | 171 ++ .../bottom_panel_component/reducer.dart | 82 + .../bottom_panel_component/state.dart | 64 + .../bottom_panel_component/view.dart | 257 ++ .../cast_component/component.dart | 17 + .../cast_component/state.dart | 21 + .../header_component/cast_component/view.dart | 44 + .../header_component/component.dart | 24 + .../components/header_component/state.dart | 30 + .../components/header_component/view.dart | 79 + .../components/player_component/action.dart | 9 + .../player_component/component.dart | 27 + .../components/player_component/effect.dart | 12 + .../components/player_component/reducer.dart | 17 + .../components/player_component/state.dart | 52 + .../components/player_component/view.dart | 28 + .../recommendation_component/action.dart | 23 + .../recommendation_component/component.dart | 17 + .../recommendation_component/effect.dart | 66 + .../recommendation_component/reducer.dart | 40 + .../recommendation_component/state.dart | 48 + .../recommendation_component/view.dart | 97 + .../movie_livestream_page/effect.dart | 78 + .../movie_livestream_page/page.dart | 38 + .../movie_livestream_page/reducer.dart | 64 + .../movie_livestream_page/state.dart | 76 + .../movie_livestream_page/view.dart | 71 + .../stream_link/season_link_page/action.dart | 29 + .../stream_link/season_link_page/adapter.dart | 12 + .../components/appbar_component/action.dart | 9 + .../appbar_component/component.dart | 21 + .../components/appbar_component/effect.dart | 12 + .../components/appbar_component/state.dart | 22 + .../components/appbar_component/view.dart | 67 + .../components/episode_component/action.dart | 9 + .../episode_component/component.dart | 21 + .../components/episode_component/effect.dart | 12 + .../components/episode_component/reducer.dart | 17 + .../components/episode_component/state.dart | 17 + .../components/episode_component/view.dart | 89 + .../episodelist_component/action.dart | 23 + .../episodelist_component/adapter.dart | 12 + .../episodelist_component/component.dart | 24 + .../episodelist_component/effect.dart | 38 + .../episodelist_component/reducer.dart | 26 + .../episodelist_component/state.dart | 47 + .../episodelist_component/view.dart | 92 + .../components/header_component/action.dart | 9 + .../header_component/component.dart | 22 + .../components/header_component/effect.dart | 12 + .../components/header_component/state.dart | 26 + .../components/header_component/view.dart | 86 + .../components/tabbar_component/action.dart | 9 + .../tabbar_component/component.dart | 20 + .../components/tabbar_component/effect.dart | 12 + .../components/tabbar_component/state.dart | 23 + .../components/tabbar_component/view.dart | 36 + .../stream_link/season_link_page/effect.dart | 137 ++ .../stream_link/season_link_page/page.dart | 32 + .../stream_link/season_link_page/reducer.dart | 26 + .../stream_link/season_link_page/state.dart | 55 + .../stream_link/season_link_page/view.dart | 33 + lib/views/test_page/action.dart | 18 + .../components/test_component/action.dart | 9 + .../components/test_component/component.dart | 21 + .../components/test_component/effect.dart | 11 + .../components/test_component/reducer.dart | 18 + .../components/test_component/state.dart | 22 + .../components/test_component/view.dart | 28 + lib/views/test_page/effect.dart | 24 + lib/views/test_page/page.dart | 24 + lib/views/test_page/reducer.dart | 33 + lib/views/test_page/state.dart | 33 + lib/views/test_page/view.dart | 50 + lib/views/trending_page/action.dart | 38 + lib/views/trending_page/adpater/action.dart | 9 + lib/views/trending_page/adpater/adapter.dart | 15 + lib/views/trending_page/adpater/reducer.dart | 34 + .../components/filter_component/action.dart | 41 + .../filter_component/component.dart | 25 + .../components/filter_component/effect.dart | 52 + .../components/filter_component/reducer.dart | 35 + .../components/filter_component/state.dart | 43 + .../components/filter_component/view.dart | 95 + .../trendingcell_component/action.dart | 17 + .../trendingcell_component/component.dart | 23 + .../trendingcell_component/effect.dart | 73 + .../trendingcell_component/reducer.dart | 17 + .../trendingcell_component/state.dart | 23 + .../trendingcell_component/view.dart | 134 + lib/views/trending_page/effect.dart | 112 + lib/views/trending_page/page.dart | 26 + lib/views/trending_page/reducer.dart | 36 + lib/views/trending_page/state.dart | 76 + lib/views/trending_page/view.dart | 96 + lib/views/tvshow_detail_page/action.dart | 93 + .../components/cast_component/action.dart | 17 + .../components/cast_component/component.dart | 20 + .../components/cast_component/effect.dart | 24 + .../components/cast_component/reducer.dart | 17 + .../components/cast_component/state.dart | 20 + .../components/cast_component/view.dart | 192 ++ .../components/keyword_component/action.dart | 9 + .../keyword_component/component.dart | 20 + .../components/keyword_component/effect.dart | 12 + .../components/keyword_component/reducer.dart | 17 + .../components/keyword_component/state.dart | 20 + .../components/keyword_component/view.dart | 143 ++ .../last_episode_component/action.dart | 9 + .../last_episode_component/component.dart | 20 + .../last_episode_component/effect.dart | 12 + .../last_episode_component/reducer.dart | 17 + .../last_episode_component/state.dart | 20 + .../last_episode_component/view.dart | 118 + .../components/menu_component/action.dart | 41 + .../components/menu_component/component.dart | 21 + .../components/menu_component/effect.dart | 99 + .../components/menu_component/reducer.dart | 40 + .../components/menu_component/state.dart | 46 + .../components/menu_component/view.dart | 231 ++ .../recommendation_component/action.dart | 14 + .../recommendation_component/component.dart | 20 + .../recommendation_component/effect.dart | 20 + .../recommendation_component/reducer.dart | 17 + .../recommendation_component/state.dart | 21 + .../recommendation_component/view.dart | 185 ++ .../components/season_component/action.dart | 14 + .../season_component/component.dart | 20 + .../components/season_component/effect.dart | 27 + .../components/season_component/reducer.dart | 16 + .../components/season_component/state.dart | 26 + .../components/season_component/view.dart | 279 +++ .../components/swiper_component/action.dart | 9 + .../swiper_component/component.dart | 21 + .../components/swiper_component/effect.dart | 12 + .../components/swiper_component/reducer.dart | 17 + .../components/swiper_component/state.dart | 23 + .../components/swiper_component/view.dart | 298 +++ .../components/title_component/action.dart | 9 + .../components/title_component/component.dart | 24 + .../components/title_component/effect.dart | 12 + .../components/title_component/reducer.dart | 17 + .../components/title_component/state.dart | 34 + .../components/title_component/view.dart | 172 ++ lib/views/tvshow_detail_page/effect.dart | 118 + lib/views/tvshow_detail_page/page.dart | 47 + lib/views/tvshow_detail_page/reducer.dart | 91 + lib/views/tvshow_detail_page/state.dart | 66 + lib/views/tvshow_detail_page/view.dart | 48 + lib/views/views.dart | 37 + lib/views/watchlist_page/action.dart | 32 + .../components/header_component/action.dart | 16 + .../header_component/component.dart | 22 + .../components/header_component/effect.dart | 12 + .../components/header_component/reducer.dart | 31 + .../components/header_component/state.dart | 39 + .../components/header_component/view.dart | 96 + .../components/info_component/component.dart | 16 + .../components/info_component/state.dart | 20 + .../components/info_component/view.dart | 96 + .../components/swiper_component/action.dart | 9 + .../swiper_component/component.dart | 23 + .../components/swiper_component/effect.dart | 12 + .../components/swiper_component/reducer.dart | 17 + .../components/swiper_component/state.dart | 31 + .../components/swiper_component/view.dart | 213 ++ lib/views/watchlist_page/effect.dart | 56 + lib/views/watchlist_page/page.dart | 30 + lib/views/watchlist_page/reducer.dart | 43 + lib/views/watchlist_page/state.dart | 44 + lib/views/watchlist_page/view.dart | 26 + lib/views/watchlistdetail_page/action.dart | 13 + lib/views/watchlistdetail_page/effect.dart | 50 + lib/views/watchlistdetail_page/page.dart | 22 + lib/views/watchlistdetail_page/reducer.dart | 17 + lib/views/watchlistdetail_page/state.dart | 19 + lib/views/watchlistdetail_page/view.dart | 286 +++ lib/widgets/arrow_clipper.dart | 29 + lib/widgets/backdrop.dart | 76 + lib/widgets/chromecast_dialog.dart | 573 +++++ lib/widgets/custom_video_controls.dart | 677 ++++++ lib/widgets/customcliper_path.dart | 34 + lib/widgets/dialogratingbar.dart | 93 + lib/widgets/expandable_text.dart | 79 + lib/widgets/gallery_photoview_wrapper.dart | 119 + lib/widgets/hero_dialog_route.dart | 40 + lib/widgets/host_dialog.dart | 92 + lib/widgets/imageview_wrapper.dart | 58 + lib/widgets/keepalive_widget.dart | 26 + lib/widgets/language_dialog.dart | 98 + lib/widgets/linear_progress_Indicator.dart | 43 + lib/widgets/loading_layout.dart | 49 + lib/widgets/medialist_card.dart | 269 +++ lib/widgets/overlay_entry_manage.dart | 29 + lib/widgets/scrollview_background.dart | 51 + lib/widgets/searchbar_delegate.dart | 482 ++++ lib/widgets/service_discovery.dart | 30 + lib/widgets/share_card.dart | 222 ++ lib/widgets/shimmercell.dart | 41 + lib/widgets/sliverappbar_delegate.dart | 35 + lib/widgets/stream_link_report_dialog.dart | 123 + lib/widgets/update_info_dialog.dart | 104 + lib/widgets/video_panel.dart | 350 +++ lib/widgets/videoplayeritem.dart | 108 + lib/widgets/watchlistdetail.dart | 235 ++ lib/widgets/web_torrent_player.dart | 173 ++ lib/widgets/webview_player.dart | 151 ++ lib/widgets/youtube_player.dart | 51 + pubspec.yaml | 135 ++ test/widget_test.dart | 28 + web/index.html | 10 + 1076 files changed, 69989 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/o1298098/movie/MainActivity.kt create mode 100644 android/app/src/main/res/drawable/app_icon.png create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 android/settings_aar.gradle create mode 100644 i18n/de-DE.json create mode 100644 i18n/en-US.json create mode 100644 i18n/es-ES.json create mode 100644 i18n/fr-FR.json create mode 100644 i18n/ja-JP.json create mode 100644 i18n/ru-RU.json create mode 100644 i18n/zh-CN.json create mode 100644 i18n/zh-TW.json create mode 100644 i18nconfig.json create mode 100644 images/CacheBG.jpg create mode 100644 images/account_bar_background.png create mode 100644 images/account_icon.png create mode 100644 images/account_icon2.png create mode 100644 images/account_icon3.png create mode 100644 images/account_icon4.png create mode 100644 images/american_express.png create mode 100644 images/c3po.png create mode 100644 images/chewbacca.png create mode 100644 images/darth_vader.png create mode 100644 images/discover.png create mode 100644 images/discover_logo.png create mode 100644 images/email_login.png create mode 100644 images/empty.png create mode 100644 images/empty_comment.png create mode 100644 images/facebook_circle.png create mode 100644 images/google.png create mode 100644 images/google_american_express.png create mode 100644 images/google_discover.png create mode 100644 images/google_mastercard.png create mode 100644 images/google_visa.png create mode 100644 images/icons/icon1.png create mode 100644 images/icons/icon2.png create mode 100644 images/icons/icon3.png create mode 100644 images/icons/icon4.png create mode 100644 images/icons/icon5.png create mode 100644 images/icons/icon6.png create mode 100644 images/instagram_circle.png create mode 100644 images/jcb.png create mode 100644 images/jcb_logo.png create mode 100644 images/landscape.json create mode 100644 images/link_bold.png create mode 100644 images/local_payment.png create mode 100644 images/luke_skywalker.png create mode 100644 images/mastercard.png create mode 100644 images/mastercard_logo.png create mode 100644 images/option_icon_b.png create mode 100644 images/option_icon_l.png create mode 100644 images/paypal_account.png create mode 100644 images/paypal_logo.png create mode 100644 images/phone_sms.png create mode 100644 images/r2d2.png create mode 100644 images/samsung_pay.png create mode 100644 images/tmdb_blue.png create mode 100644 images/tmdb_green.png create mode 100644 images/twitter_circle.png create mode 100644 images/venmo_account.png create mode 100644 images/visa.png create mode 100644 images/visa_logo.png create mode 100644 images/yoda.png create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/.last_build_id create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Runner-Bridging-Header.h create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner/AppDelegate.h create mode 100644 ios/Runner/AppDelegate.m create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/Runner/Runner.entitlements create mode 100644 ios/Runner/main.m create mode 100644 ios/build/XCBuildData/5e07b0fc03a98d8a0604f07c05fb3e42-desc.xcbuild create mode 100644 ios/build/XCBuildData/5e07b0fc03a98d8a0604f07c05fb3e42-manifest.xcbuild create mode 100644 ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-desc.xcbuild create mode 100644 ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-manifest.xcbuild create mode 100644 ios/build/XCBuildData/BuildDescriptionCacheIndex-9cb884f38aa6d9ca6b46f6a93f416231 create mode 100644 ios/build/XCBuildData/BuildDescriptionCacheIndex-f486b63b45fa1476554e34497a9755c0 create mode 100644 ios/build/XCBuildData/build.db create mode 100644 ios/build/XCBuildData/d360e20f868f3f06ba0848e6582b8e21-desc.xcbuild create mode 100644 ios/build/XCBuildData/d360e20f868f3f06ba0848e6582b8e21-manifest.xcbuild create mode 100644 ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-desc.xcbuild create mode 100644 ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-manifest.xcbuild create mode 100644 lib/actions/adapt.dart create mode 100644 lib/actions/ads_config.dart create mode 100644 lib/actions/api/base_api.dart create mode 100644 lib/actions/api/github_api.dart create mode 100644 lib/actions/api/graphql_client.dart create mode 100644 lib/actions/api/graphql_service.dart create mode 100644 lib/actions/api/request.dart create mode 100644 lib/actions/api/tmdb_api.dart create mode 100644 lib/actions/api/urlresolver_api.dart create mode 100644 lib/actions/app_config.dart create mode 100644 lib/actions/app_language.dart create mode 100644 lib/actions/creditcard_verify.dart create mode 100644 lib/actions/downloader_callback.dart create mode 100644 lib/actions/imageurl.dart create mode 100644 lib/actions/local_notification.dart create mode 100644 lib/actions/notification_topic.dart create mode 100644 lib/actions/pop_result.dart create mode 100644 lib/actions/stream_link_convert/archive.dart create mode 100644 lib/actions/stream_link_convert/bitporno.dart create mode 100644 lib/actions/stream_link_convert/clipwatching.dart create mode 100644 lib/actions/stream_link_convert/cloudvideo.dart create mode 100644 lib/actions/stream_link_convert/dood.dart create mode 100644 lib/actions/stream_link_convert/fembed.dart create mode 100644 lib/actions/stream_link_convert/gamovideo.dart create mode 100644 lib/actions/stream_link_convert/gounlimited.dart create mode 100644 lib/actions/stream_link_convert/jawcloud.dart create mode 100644 lib/actions/stream_link_convert/jetload.dart create mode 100644 lib/actions/stream_link_convert/mediafire.dart create mode 100644 lib/actions/stream_link_convert/mixdrop.dart create mode 100644 lib/actions/stream_link_convert/mp4upload.dart create mode 100644 lib/actions/stream_link_convert/ninjastream.dart create mode 100644 lib/actions/stream_link_convert/openlay.dart create mode 100644 lib/actions/stream_link_convert/powvideo.dart create mode 100644 lib/actions/stream_link_convert/prostream.dart create mode 100644 lib/actions/stream_link_convert/stream_link_convert_factory.dart create mode 100644 lib/actions/stream_link_convert/streamplay.dart create mode 100644 lib/actions/stream_link_convert/streamtape.dart create mode 100644 lib/actions/stream_link_convert/supervideo.dart create mode 100644 lib/actions/stream_link_convert/upstream.dart create mode 100644 lib/actions/stream_link_convert/uptostream.dart create mode 100644 lib/actions/stream_link_convert/uqload.dart create mode 100644 lib/actions/stream_link_convert/veoh.dart create mode 100644 lib/actions/stream_link_convert/vidcloud.dart create mode 100644 lib/actions/stream_link_convert/videobin.dart create mode 100644 lib/actions/stream_link_convert/videomega.dart create mode 100644 lib/actions/stream_link_convert/vidfast.dart create mode 100644 lib/actions/stream_link_convert/vidia.dart create mode 100644 lib/actions/stream_link_convert/vidlox.dart create mode 100644 lib/actions/stream_link_convert/vidoza.dart create mode 100644 lib/actions/stream_link_convert/vidtodo.dart create mode 100644 lib/actions/stream_link_convert/vup.dart create mode 100644 lib/actions/stream_link_convert/waaw.dart create mode 100644 lib/actions/timeline.dart create mode 100644 lib/actions/timeline_convert.dart create mode 100644 lib/actions/user_info_operate.dart create mode 100644 lib/actions/version_comparison.dart create mode 100644 lib/actions/videourl.dart create mode 100644 lib/actions/votecolorhelper.dart create mode 100644 lib/app.dart create mode 100644 lib/generated/i18n.dart create mode 100644 lib/globalbasestate/action.dart create mode 100644 lib/globalbasestate/reducer.dart create mode 100644 lib/globalbasestate/state.dart create mode 100644 lib/globalbasestate/store.dart create mode 100644 lib/main.dart create mode 100644 lib/models/account_detail.dart create mode 100644 lib/models/app_user.dart create mode 100644 lib/models/base_api_model/account_info.dart create mode 100644 lib/models/base_api_model/account_state.dart create mode 100644 lib/models/base_api_model/base_cast_list.dart create mode 100644 lib/models/base_api_model/base_movie.dart create mode 100644 lib/models/base_api_model/base_tvshow.dart create mode 100644 lib/models/base_api_model/base_user.dart create mode 100644 lib/models/base_api_model/braintree_billing_address.dart create mode 100644 lib/models/base_api_model/braintree_creditcard.dart create mode 100644 lib/models/base_api_model/braintree_customer.dart create mode 100644 lib/models/base_api_model/braintree_customer_details.dart create mode 100644 lib/models/base_api_model/braintree_descriptor.dart create mode 100644 lib/models/base_api_model/braintree_item_type.dart create mode 100644 lib/models/base_api_model/braintree_status_history.dart create mode 100644 lib/models/base_api_model/braintree_subscription.dart create mode 100644 lib/models/base_api_model/braintree_transaction.dart create mode 100644 lib/models/base_api_model/branintree_disbursement_details.dart create mode 100644 lib/models/base_api_model/cast_list_detail.dart create mode 100644 lib/models/base_api_model/checkout_model.dart create mode 100644 lib/models/base_api_model/movie_comment.dart create mode 100644 lib/models/base_api_model/movie_like_model.dart create mode 100644 lib/models/base_api_model/movie_stream_link.dart create mode 100644 lib/models/base_api_model/payment_client_token.dart create mode 100644 lib/models/base_api_model/purchase.dart create mode 100644 lib/models/base_api_model/stream_link_language.dart create mode 100644 lib/models/base_api_model/stream_link_quality.dart create mode 100644 lib/models/base_api_model/stream_link_report.dart create mode 100644 lib/models/base_api_model/stream_link_type.dart create mode 100644 lib/models/base_api_model/topic_subscription.dart create mode 100644 lib/models/base_api_model/tvshow_comment.dart create mode 100644 lib/models/base_api_model/tvshow_like_model.dart create mode 100644 lib/models/base_api_model/tvshow_stream_link.dart create mode 100644 lib/models/base_api_model/user_list.dart create mode 100644 lib/models/base_api_model/user_list_detail.dart create mode 100644 lib/models/base_api_model/user_media.dart create mode 100644 lib/models/base_api_model/user_premium_model.dart create mode 100644 lib/models/certification.dart create mode 100644 lib/models/combined_cast_data.dart create mode 100644 lib/models/combined_credits.dart create mode 100644 lib/models/combined_crew_data.dart create mode 100644 lib/models/country_phone_code.dart create mode 100644 lib/models/country_phone_codes.json create mode 100644 lib/models/credits_model.dart create mode 100644 lib/models/discover_sort_type.dart create mode 100644 lib/models/download_queue.dart create mode 100644 lib/models/enums/genres.dart create mode 100644 lib/models/enums/imagesize.dart create mode 100644 lib/models/enums/list_sort_type.dart create mode 100644 lib/models/enums/media_type.dart create mode 100644 lib/models/enums/premium_type.dart create mode 100644 lib/models/enums/releasedatetype.dart create mode 100644 lib/models/enums/screenshot_type.dart create mode 100644 lib/models/enums/streamlink_type.dart create mode 100644 lib/models/enums/theme_color.dart create mode 100644 lib/models/enums/time_window.dart create mode 100644 lib/models/episode_model.dart create mode 100644 lib/models/external_ids_model.dart create mode 100644 lib/models/firebase/firebase_accountstate.dart create mode 100644 lib/models/firebase/firebase_streamlink.dart create mode 100644 lib/models/genre.dart create mode 100644 lib/models/github_release.dart create mode 100644 lib/models/image_model.dart create mode 100644 lib/models/item.dart create mode 100644 lib/models/keyword.dart create mode 100644 lib/models/list_detail_mode.dart create mode 100644 lib/models/list_media_item.dart create mode 100644 lib/models/media_account_state_model.dart create mode 100644 lib/models/model_factory.dart create mode 100644 lib/models/models.dart create mode 100644 lib/models/movie_change.dart create mode 100644 lib/models/movie_detail.dart create mode 100644 lib/models/mylist_model.dart create mode 100644 lib/models/notification_model.dart create mode 100644 lib/models/people_detail.dart create mode 100644 lib/models/production_companie.dart create mode 100644 lib/models/release_date_model.dart create mode 100644 lib/models/response_model.dart create mode 100644 lib/models/review.dart create mode 100644 lib/models/search_result.dart create mode 100644 lib/models/season_detail.dart create mode 100644 lib/models/sort_condition.dart create mode 100644 lib/models/tvshow_detail.dart create mode 100644 lib/models/video_list.dart create mode 100644 lib/models/video_model.dart create mode 100644 lib/routes/routes.dart create mode 100644 lib/style/test_inherited_widget.dart create mode 100644 lib/style/themestyle.dart create mode 100644 lib/style/themestyle_widget.dart create mode 100644 lib/views/account_page/action.dart create mode 100644 lib/views/account_page/components/data_panel_component/action.dart create mode 100644 lib/views/account_page/components/data_panel_component/component.dart create mode 100644 lib/views/account_page/components/data_panel_component/effect.dart create mode 100644 lib/views/account_page/components/data_panel_component/reducer.dart create mode 100644 lib/views/account_page/components/data_panel_component/state.dart create mode 100644 lib/views/account_page/components/data_panel_component/view.dart create mode 100644 lib/views/account_page/components/settings_component/action.dart create mode 100644 lib/views/account_page/components/settings_component/component.dart create mode 100644 lib/views/account_page/components/settings_component/effect.dart create mode 100644 lib/views/account_page/components/settings_component/reducer.dart create mode 100644 lib/views/account_page/components/settings_component/state.dart create mode 100644 lib/views/account_page/components/settings_component/view.dart create mode 100644 lib/views/account_page/components/user_data_component/action.dart create mode 100644 lib/views/account_page/components/user_data_component/component.dart create mode 100644 lib/views/account_page/components/user_data_component/effect.dart create mode 100644 lib/views/account_page/components/user_data_component/reducer.dart create mode 100644 lib/views/account_page/components/user_data_component/state.dart create mode 100644 lib/views/account_page/components/user_data_component/view.dart create mode 100644 lib/views/account_page/components/user_info_component/action.dart create mode 100644 lib/views/account_page/components/user_info_component/component.dart create mode 100644 lib/views/account_page/components/user_info_component/component/about_page.dart create mode 100644 lib/views/account_page/components/user_info_component/component/arrow_clipper.dart create mode 100644 lib/views/account_page/components/user_info_component/component/user_menu.dart create mode 100644 lib/views/account_page/components/user_info_component/effect.dart create mode 100644 lib/views/account_page/components/user_info_component/reducer.dart create mode 100644 lib/views/account_page/components/user_info_component/state.dart create mode 100644 lib/views/account_page/components/user_info_component/view.dart create mode 100644 lib/views/account_page/effect.dart create mode 100644 lib/views/account_page/page.dart create mode 100644 lib/views/account_page/reducer.dart create mode 100644 lib/views/account_page/state.dart create mode 100644 lib/views/account_page/view.dart create mode 100644 lib/views/account_page_old/action.dart create mode 100644 lib/views/account_page_old/components/body_component/component.dart create mode 100644 lib/views/account_page_old/components/body_component/state.dart create mode 100644 lib/views/account_page_old/components/body_component/view.dart create mode 100644 lib/views/account_page_old/components/header_component/component.dart create mode 100644 lib/views/account_page_old/components/header_component/state.dart create mode 100644 lib/views/account_page_old/components/header_component/view.dart create mode 100644 lib/views/account_page_old/effect.dart create mode 100644 lib/views/account_page_old/page.dart create mode 100644 lib/views/account_page_old/reducer.dart create mode 100644 lib/views/account_page_old/state.dart create mode 100644 lib/views/account_page_old/view.dart create mode 100644 lib/views/cast_list/cast_list_detail_page/action.dart create mode 100644 lib/views/cast_list/cast_list_detail_page/effect.dart create mode 100644 lib/views/cast_list/cast_list_detail_page/page.dart create mode 100644 lib/views/cast_list/cast_list_detail_page/reducer.dart create mode 100644 lib/views/cast_list/cast_list_detail_page/state.dart create mode 100644 lib/views/cast_list/cast_list_detail_page/view.dart create mode 100644 lib/views/cast_list/cast_list_page/action.dart create mode 100644 lib/views/cast_list/cast_list_page/components/cast_list_create.dart create mode 100644 lib/views/cast_list/cast_list_page/effect.dart create mode 100644 lib/views/cast_list/cast_list_page/page.dart create mode 100644 lib/views/cast_list/cast_list_page/reducer.dart create mode 100644 lib/views/cast_list/cast_list_page/state.dart create mode 100644 lib/views/cast_list/cast_list_page/view.dart create mode 100644 lib/views/checkout_page/action.dart create mode 100644 lib/views/checkout_page/effect.dart create mode 100644 lib/views/checkout_page/page.dart create mode 100644 lib/views/checkout_page/reducer.dart create mode 100644 lib/views/checkout_page/state.dart create mode 100644 lib/views/checkout_page/view.dart create mode 100644 lib/views/coming_page/action.dart create mode 100644 lib/views/coming_page/components/movie_component/action.dart create mode 100644 lib/views/coming_page/components/movie_component/component.dart create mode 100644 lib/views/coming_page/components/movie_component/effect.dart create mode 100644 lib/views/coming_page/components/movie_component/reducer.dart create mode 100644 lib/views/coming_page/components/movie_component/state.dart create mode 100644 lib/views/coming_page/components/movie_component/view.dart create mode 100644 lib/views/coming_page/components/tab_component/action.dart create mode 100644 lib/views/coming_page/components/tab_component/component.dart create mode 100644 lib/views/coming_page/components/tab_component/effect.dart create mode 100644 lib/views/coming_page/components/tab_component/reducer.dart create mode 100644 lib/views/coming_page/components/tab_component/state.dart create mode 100644 lib/views/coming_page/components/tab_component/view.dart create mode 100644 lib/views/coming_page/components/tv_component/action.dart create mode 100644 lib/views/coming_page/components/tv_component/adapter.dart create mode 100644 lib/views/coming_page/components/tv_component/component.dart create mode 100644 lib/views/coming_page/components/tv_component/effect.dart create mode 100644 lib/views/coming_page/components/tv_component/reducer.dart create mode 100644 lib/views/coming_page/components/tv_component/shimmercell_component/component.dart create mode 100644 lib/views/coming_page/components/tv_component/shimmercell_component/state.dart create mode 100644 lib/views/coming_page/components/tv_component/shimmercell_component/view.dart create mode 100644 lib/views/coming_page/components/tv_component/state.dart create mode 100644 lib/views/coming_page/components/tv_component/tvcell_component/action.dart create mode 100644 lib/views/coming_page/components/tv_component/tvcell_component/component.dart create mode 100644 lib/views/coming_page/components/tv_component/tvcell_component/effect.dart create mode 100644 lib/views/coming_page/components/tv_component/tvcell_component/reducer.dart create mode 100644 lib/views/coming_page/components/tv_component/tvcell_component/state.dart create mode 100644 lib/views/coming_page/components/tv_component/tvcell_component/view.dart create mode 100644 lib/views/coming_page/components/tv_component/view.dart create mode 100644 lib/views/coming_page/effect.dart create mode 100644 lib/views/coming_page/page.dart create mode 100644 lib/views/coming_page/reducer.dart create mode 100644 lib/views/coming_page/state.dart create mode 100644 lib/views/coming_page/view.dart create mode 100644 lib/views/createlist_page/action.dart create mode 100644 lib/views/createlist_page/effect.dart create mode 100644 lib/views/createlist_page/page.dart create mode 100644 lib/views/createlist_page/reducer.dart create mode 100644 lib/views/createlist_page/state.dart create mode 100644 lib/views/createlist_page/view.dart create mode 100644 lib/views/detail_page/action.dart create mode 100644 lib/views/detail_page/components/appbar_component/action.dart create mode 100644 lib/views/detail_page/components/appbar_component/component.dart create mode 100644 lib/views/detail_page/components/appbar_component/effect.dart create mode 100644 lib/views/detail_page/components/appbar_component/reducer.dart create mode 100644 lib/views/detail_page/components/appbar_component/state.dart create mode 100644 lib/views/detail_page/components/appbar_component/view.dart create mode 100644 lib/views/detail_page/components/cast_component/action.dart create mode 100644 lib/views/detail_page/components/cast_component/component.dart create mode 100644 lib/views/detail_page/components/cast_component/effect.dart create mode 100644 lib/views/detail_page/components/cast_component/state.dart create mode 100644 lib/views/detail_page/components/cast_component/view.dart create mode 100644 lib/views/detail_page/components/keyword_component/action.dart create mode 100644 lib/views/detail_page/components/keyword_component/component.dart create mode 100644 lib/views/detail_page/components/keyword_component/effect.dart create mode 100644 lib/views/detail_page/components/keyword_component/state.dart create mode 100644 lib/views/detail_page/components/keyword_component/view.dart create mode 100644 lib/views/detail_page/components/maininfo_component/action.dart create mode 100644 lib/views/detail_page/components/maininfo_component/component.dart create mode 100644 lib/views/detail_page/components/maininfo_component/effect.dart create mode 100644 lib/views/detail_page/components/maininfo_component/reducer.dart create mode 100644 lib/views/detail_page/components/maininfo_component/state.dart create mode 100644 lib/views/detail_page/components/maininfo_component/view.dart create mode 100644 lib/views/detail_page/components/menu_component/action.dart create mode 100644 lib/views/detail_page/components/menu_component/component.dart create mode 100644 lib/views/detail_page/components/menu_component/effect.dart create mode 100644 lib/views/detail_page/components/menu_component/reducer.dart create mode 100644 lib/views/detail_page/components/menu_component/state.dart create mode 100644 lib/views/detail_page/components/menu_component/view.dart create mode 100644 lib/views/detail_page/components/overview_component/action.dart create mode 100644 lib/views/detail_page/components/overview_component/component.dart create mode 100644 lib/views/detail_page/components/overview_component/effect.dart create mode 100644 lib/views/detail_page/components/overview_component/state.dart create mode 100644 lib/views/detail_page/components/overview_component/view.dart create mode 100644 lib/views/detail_page/components/recommendation_component/action.dart create mode 100644 lib/views/detail_page/components/recommendation_component/component.dart create mode 100644 lib/views/detail_page/components/recommendation_component/effect.dart create mode 100644 lib/views/detail_page/components/recommendation_component/state.dart create mode 100644 lib/views/detail_page/components/recommendation_component/view.dart create mode 100644 lib/views/detail_page/components/still_component/action.dart create mode 100644 lib/views/detail_page/components/still_component/component.dart create mode 100644 lib/views/detail_page/components/still_component/effect.dart create mode 100644 lib/views/detail_page/components/still_component/state.dart create mode 100644 lib/views/detail_page/components/still_component/view.dart create mode 100644 lib/views/detail_page/components/trailer_component/action.dart create mode 100644 lib/views/detail_page/components/trailer_component/component.dart create mode 100644 lib/views/detail_page/components/trailer_component/effect.dart create mode 100644 lib/views/detail_page/components/trailer_component/reducer.dart create mode 100644 lib/views/detail_page/components/trailer_component/state.dart create mode 100644 lib/views/detail_page/components/trailer_component/view.dart create mode 100644 lib/views/detail_page/effect.dart create mode 100644 lib/views/detail_page/page.dart create mode 100644 lib/views/detail_page/reducer.dart create mode 100644 lib/views/detail_page/state.dart create mode 100644 lib/views/detail_page/view.dart create mode 100644 lib/views/discover_page/action.dart create mode 100644 lib/views/discover_page/adapter.dart create mode 100644 lib/views/discover_page/components/filter_component/action.dart create mode 100644 lib/views/discover_page/components/filter_component/component.dart create mode 100644 lib/views/discover_page/components/filter_component/effect.dart create mode 100644 lib/views/discover_page/components/filter_component/reducer.dart create mode 100644 lib/views/discover_page/components/filter_component/state.dart create mode 100644 lib/views/discover_page/components/filter_component/view.dart create mode 100644 lib/views/discover_page/components/movicecell_component/action.dart create mode 100644 lib/views/discover_page/components/movicecell_component/component.dart create mode 100644 lib/views/discover_page/components/movicecell_component/effect.dart create mode 100644 lib/views/discover_page/components/movicecell_component/reducer.dart create mode 100644 lib/views/discover_page/components/movicecell_component/state.dart create mode 100644 lib/views/discover_page/components/movicecell_component/view.dart create mode 100644 lib/views/discover_page/effect.dart create mode 100644 lib/views/discover_page/page.dart create mode 100644 lib/views/discover_page/reducer.dart create mode 100644 lib/views/discover_page/state.dart create mode 100644 lib/views/discover_page/view.dart create mode 100644 lib/views/download_page/action.dart create mode 100644 lib/views/download_page/effect.dart create mode 100644 lib/views/download_page/page.dart create mode 100644 lib/views/download_page/reducer.dart create mode 100644 lib/views/download_page/state.dart create mode 100644 lib/views/download_page/view.dart create mode 100644 lib/views/episodedetail_page/action.dart create mode 100644 lib/views/episodedetail_page/adapter.dart create mode 100644 lib/views/episodedetail_page/components/credits_component/action.dart create mode 100644 lib/views/episodedetail_page/components/credits_component/component.dart create mode 100644 lib/views/episodedetail_page/components/credits_component/effect.dart create mode 100644 lib/views/episodedetail_page/components/credits_component/state.dart create mode 100644 lib/views/episodedetail_page/components/credits_component/view.dart create mode 100644 lib/views/episodedetail_page/components/header_component/action.dart create mode 100644 lib/views/episodedetail_page/components/header_component/component.dart create mode 100644 lib/views/episodedetail_page/components/header_component/effect.dart create mode 100644 lib/views/episodedetail_page/components/header_component/reducer.dart create mode 100644 lib/views/episodedetail_page/components/header_component/state.dart create mode 100644 lib/views/episodedetail_page/components/header_component/view.dart create mode 100644 lib/views/episodedetail_page/components/images_component/action.dart create mode 100644 lib/views/episodedetail_page/components/images_component/component.dart create mode 100644 lib/views/episodedetail_page/components/images_component/effect.dart create mode 100644 lib/views/episodedetail_page/components/images_component/reducer.dart create mode 100644 lib/views/episodedetail_page/components/images_component/state.dart create mode 100644 lib/views/episodedetail_page/components/images_component/view.dart create mode 100644 lib/views/episodedetail_page/effect.dart create mode 100644 lib/views/episodedetail_page/page.dart create mode 100644 lib/views/episodedetail_page/reducer.dart create mode 100644 lib/views/episodedetail_page/state.dart create mode 100644 lib/views/episodedetail_page/view.dart create mode 100644 lib/views/favorites_page/action.dart create mode 100644 lib/views/favorites_page/components/background_component/component.dart create mode 100644 lib/views/favorites_page/components/background_component/state.dart create mode 100644 lib/views/favorites_page/components/background_component/view.dart create mode 100644 lib/views/favorites_page/components/header_component/action.dart create mode 100644 lib/views/favorites_page/components/header_component/component.dart create mode 100644 lib/views/favorites_page/components/header_component/effect.dart create mode 100644 lib/views/favorites_page/components/header_component/reducer.dart create mode 100644 lib/views/favorites_page/components/header_component/state.dart create mode 100644 lib/views/favorites_page/components/header_component/view.dart create mode 100644 lib/views/favorites_page/components/swiper_component/action.dart create mode 100644 lib/views/favorites_page/components/swiper_component/component.dart create mode 100644 lib/views/favorites_page/components/swiper_component/effect.dart create mode 100644 lib/views/favorites_page/components/swiper_component/reducer.dart create mode 100644 lib/views/favorites_page/components/swiper_component/state.dart create mode 100644 lib/views/favorites_page/components/swiper_component/view.dart create mode 100644 lib/views/favorites_page/effect.dart create mode 100644 lib/views/favorites_page/page.dart create mode 100644 lib/views/favorites_page/reducer.dart create mode 100644 lib/views/favorites_page/state.dart create mode 100644 lib/views/favorites_page/view.dart create mode 100644 lib/views/gallery_page/action.dart create mode 100644 lib/views/gallery_page/effect.dart create mode 100644 lib/views/gallery_page/page.dart create mode 100644 lib/views/gallery_page/reducer.dart create mode 100644 lib/views/gallery_page/state.dart create mode 100644 lib/views/gallery_page/view.dart create mode 100644 lib/views/home_page/action.dart create mode 100644 lib/views/home_page/components/header_component/action.dart create mode 100644 lib/views/home_page/components/header_component/component.dart create mode 100644 lib/views/home_page/components/header_component/effect.dart create mode 100644 lib/views/home_page/components/header_component/reducer.dart create mode 100644 lib/views/home_page/components/header_component/state.dart create mode 100644 lib/views/home_page/components/header_component/view.dart create mode 100644 lib/views/home_page/components/popularposter_cpmponent/action.dart create mode 100644 lib/views/home_page/components/popularposter_cpmponent/component.dart create mode 100644 lib/views/home_page/components/popularposter_cpmponent/effect.dart create mode 100644 lib/views/home_page/components/popularposter_cpmponent/reducer.dart create mode 100644 lib/views/home_page/components/popularposter_cpmponent/state.dart create mode 100644 lib/views/home_page/components/popularposter_cpmponent/view.dart create mode 100644 lib/views/home_page/components/share_component/action.dart create mode 100644 lib/views/home_page/components/share_component/component.dart create mode 100644 lib/views/home_page/components/share_component/effect.dart create mode 100644 lib/views/home_page/components/share_component/reducer.dart create mode 100644 lib/views/home_page/components/share_component/state.dart create mode 100644 lib/views/home_page/components/share_component/view.dart create mode 100644 lib/views/home_page/components/swiper_component/action.dart create mode 100644 lib/views/home_page/components/swiper_component/component.dart create mode 100644 lib/views/home_page/components/swiper_component/effect.dart create mode 100644 lib/views/home_page/components/swiper_component/state.dart create mode 100644 lib/views/home_page/components/swiper_component/view.dart create mode 100644 lib/views/home_page/components/trending_component/action.dart create mode 100644 lib/views/home_page/components/trending_component/component.dart create mode 100644 lib/views/home_page/components/trending_component/effect.dart create mode 100644 lib/views/home_page/components/trending_component/state.dart create mode 100644 lib/views/home_page/components/trending_component/view.dart create mode 100644 lib/views/home_page/effect.dart create mode 100644 lib/views/home_page/page.dart create mode 100644 lib/views/home_page/reducer.dart create mode 100644 lib/views/home_page/state.dart create mode 100644 lib/views/home_page/view.dart create mode 100644 lib/views/listdetail_page/action.dart create mode 100644 lib/views/listdetail_page/components/body_component/action.dart create mode 100644 lib/views/listdetail_page/components/body_component/adapter/adapter.dart create mode 100644 lib/views/listdetail_page/components/body_component/component.dart create mode 100644 lib/views/listdetail_page/components/body_component/effect.dart create mode 100644 lib/views/listdetail_page/components/body_component/reducer.dart create mode 100644 lib/views/listdetail_page/components/body_component/state.dart create mode 100644 lib/views/listdetail_page/components/body_component/view.dart create mode 100644 lib/views/listdetail_page/components/header_component/action.dart create mode 100644 lib/views/listdetail_page/components/header_component/component.dart create mode 100644 lib/views/listdetail_page/components/header_component/effect.dart create mode 100644 lib/views/listdetail_page/components/header_component/reducer.dart create mode 100644 lib/views/listdetail_page/components/header_component/state.dart create mode 100644 lib/views/listdetail_page/components/header_component/view.dart create mode 100644 lib/views/listdetail_page/components/infogroup_component/component.dart create mode 100644 lib/views/listdetail_page/components/infogroup_component/state.dart create mode 100644 lib/views/listdetail_page/components/infogroup_component/view.dart create mode 100644 lib/views/listdetail_page/components/listcell_component/action.dart create mode 100644 lib/views/listdetail_page/components/listcell_component/component.dart create mode 100644 lib/views/listdetail_page/components/listcell_component/effect.dart create mode 100644 lib/views/listdetail_page/components/listcell_component/reducer.dart create mode 100644 lib/views/listdetail_page/components/listcell_component/state.dart create mode 100644 lib/views/listdetail_page/components/listcell_component/view.dart create mode 100644 lib/views/listdetail_page/components/sharecard_component/action.dart create mode 100644 lib/views/listdetail_page/components/sharecard_component/component.dart create mode 100644 lib/views/listdetail_page/components/sharecard_component/effect.dart create mode 100644 lib/views/listdetail_page/components/sharecard_component/state.dart create mode 100644 lib/views/listdetail_page/components/sharecard_component/view.dart create mode 100644 lib/views/listdetail_page/effect.dart create mode 100644 lib/views/listdetail_page/page.dart create mode 100644 lib/views/listdetail_page/reducer.dart create mode 100644 lib/views/listdetail_page/state.dart create mode 100644 lib/views/listdetail_page/view.dart create mode 100644 lib/views/login_page/action.dart create mode 100644 lib/views/login_page/effect.dart create mode 100644 lib/views/login_page/page.dart create mode 100644 lib/views/login_page/reducer.dart create mode 100644 lib/views/login_page/state.dart create mode 100644 lib/views/login_page/view.dart create mode 100644 lib/views/main_page/action.dart create mode 100644 lib/views/main_page/effect.dart create mode 100644 lib/views/main_page/page.dart create mode 100644 lib/views/main_page/reducer.dart create mode 100644 lib/views/main_page/state.dart create mode 100644 lib/views/main_page/view.dart create mode 100644 lib/views/moremedia_page/action.dart create mode 100644 lib/views/moremedia_page/effect.dart create mode 100644 lib/views/moremedia_page/page.dart create mode 100644 lib/views/moremedia_page/reducer.dart create mode 100644 lib/views/moremedia_page/state.dart create mode 100644 lib/views/moremedia_page/view.dart create mode 100644 lib/views/moviedetail_page/action.dart create mode 100644 lib/views/moviedetail_page/components/info_component/action.dart create mode 100644 lib/views/moviedetail_page/components/info_component/component.dart create mode 100644 lib/views/moviedetail_page/components/info_component/effect.dart create mode 100644 lib/views/moviedetail_page/components/info_component/state.dart create mode 100644 lib/views/moviedetail_page/components/info_component/view.dart create mode 100644 lib/views/moviedetail_page/components/keywords_component/action.dart create mode 100644 lib/views/moviedetail_page/components/keywords_component/component.dart create mode 100644 lib/views/moviedetail_page/components/keywords_component/effect.dart create mode 100644 lib/views/moviedetail_page/components/keywords_component/reducer.dart create mode 100644 lib/views/moviedetail_page/components/keywords_component/state.dart create mode 100644 lib/views/moviedetail_page/components/keywords_component/view.dart create mode 100644 lib/views/moviedetail_page/components/menu_component/action.dart create mode 100644 lib/views/moviedetail_page/components/menu_component/component.dart create mode 100644 lib/views/moviedetail_page/components/menu_component/effect.dart create mode 100644 lib/views/moviedetail_page/components/menu_component/reducer.dart create mode 100644 lib/views/moviedetail_page/components/menu_component/state.dart create mode 100644 lib/views/moviedetail_page/components/menu_component/view.dart create mode 100644 lib/views/moviedetail_page/effect.dart create mode 100644 lib/views/moviedetail_page/page.dart create mode 100644 lib/views/moviedetail_page/reducer.dart create mode 100644 lib/views/moviedetail_page/state.dart create mode 100644 lib/views/moviedetail_page/view.dart create mode 100644 lib/views/mylists_page/action.dart create mode 100644 lib/views/mylists_page/adapter/action.dart create mode 100644 lib/views/mylists_page/adapter/adapter.dart create mode 100644 lib/views/mylists_page/adapter/reducer.dart create mode 100644 lib/views/mylists_page/addcell_component/component.dart create mode 100644 lib/views/mylists_page/addcell_component/state.dart create mode 100644 lib/views/mylists_page/addcell_component/view.dart create mode 100644 lib/views/mylists_page/effect.dart create mode 100644 lib/views/mylists_page/listcell_component/action.dart create mode 100644 lib/views/mylists_page/listcell_component/component.dart create mode 100644 lib/views/mylists_page/listcell_component/effect.dart create mode 100644 lib/views/mylists_page/listcell_component/reducer.dart create mode 100644 lib/views/mylists_page/listcell_component/state.dart create mode 100644 lib/views/mylists_page/listcell_component/view.dart create mode 100644 lib/views/mylists_page/page.dart create mode 100644 lib/views/mylists_page/reducer.dart create mode 100644 lib/views/mylists_page/state.dart create mode 100644 lib/views/mylists_page/view.dart create mode 100644 lib/views/notification_page/action.dart create mode 100644 lib/views/notification_page/effect.dart create mode 100644 lib/views/notification_page/page.dart create mode 100644 lib/views/notification_page/reducer.dart create mode 100644 lib/views/notification_page/state.dart create mode 100644 lib/views/notification_page/view.dart create mode 100644 lib/views/payment_page/action.dart create mode 100644 lib/views/payment_page/components/android_pay_component/component.dart create mode 100644 lib/views/payment_page/components/android_pay_component/state.dart create mode 100644 lib/views/payment_page/components/android_pay_component/view.dart create mode 100644 lib/views/payment_page/components/apple_pay_component/component.dart create mode 100644 lib/views/payment_page/components/apple_pay_component/state.dart create mode 100644 lib/views/payment_page/components/apple_pay_component/view.dart create mode 100644 lib/views/payment_page/components/billing_address_component/action.dart create mode 100644 lib/views/payment_page/components/billing_address_component/component.dart create mode 100644 lib/views/payment_page/components/billing_address_component/create_address_component/action.dart create mode 100644 lib/views/payment_page/components/billing_address_component/create_address_component/component.dart create mode 100644 lib/views/payment_page/components/billing_address_component/create_address_component/effect.dart create mode 100644 lib/views/payment_page/components/billing_address_component/create_address_component/reducer.dart create mode 100644 lib/views/payment_page/components/billing_address_component/create_address_component/state.dart create mode 100644 lib/views/payment_page/components/billing_address_component/create_address_component/view.dart create mode 100644 lib/views/payment_page/components/billing_address_component/effect.dart create mode 100644 lib/views/payment_page/components/billing_address_component/reducer.dart create mode 100644 lib/views/payment_page/components/billing_address_component/state.dart create mode 100644 lib/views/payment_page/components/billing_address_component/view.dart create mode 100644 lib/views/payment_page/components/create_card_component/action.dart create mode 100644 lib/views/payment_page/components/create_card_component/component.dart create mode 100644 lib/views/payment_page/components/create_card_component/components/scan_component/action.dart create mode 100644 lib/views/payment_page/components/create_card_component/components/scan_component/component.dart create mode 100644 lib/views/payment_page/components/create_card_component/components/scan_component/effect.dart create mode 100644 lib/views/payment_page/components/create_card_component/components/scan_component/reducer.dart create mode 100644 lib/views/payment_page/components/create_card_component/components/scan_component/state.dart create mode 100644 lib/views/payment_page/components/create_card_component/components/scan_component/view.dart create mode 100644 lib/views/payment_page/components/create_card_component/effect.dart create mode 100644 lib/views/payment_page/components/create_card_component/reducer.dart create mode 100644 lib/views/payment_page/components/create_card_component/state.dart create mode 100644 lib/views/payment_page/components/create_card_component/view.dart create mode 100644 lib/views/payment_page/components/history_component/action.dart create mode 100644 lib/views/payment_page/components/history_component/component.dart create mode 100644 lib/views/payment_page/components/history_component/effect.dart create mode 100644 lib/views/payment_page/components/history_component/reducer.dart create mode 100644 lib/views/payment_page/components/history_component/state.dart create mode 100644 lib/views/payment_page/components/history_component/view.dart create mode 100644 lib/views/payment_page/effect.dart create mode 100644 lib/views/payment_page/page.dart create mode 100644 lib/views/payment_page/reducer.dart create mode 100644 lib/views/payment_page/state.dart create mode 100644 lib/views/payment_page/view.dart create mode 100644 lib/views/peopledetail_page/action.dart create mode 100644 lib/views/peopledetail_page/components/gallery_component/action.dart create mode 100644 lib/views/peopledetail_page/components/gallery_component/component.dart create mode 100644 lib/views/peopledetail_page/components/gallery_component/effect.dart create mode 100644 lib/views/peopledetail_page/components/gallery_component/reducer.dart create mode 100644 lib/views/peopledetail_page/components/gallery_component/state.dart create mode 100644 lib/views/peopledetail_page/components/gallery_component/view.dart create mode 100644 lib/views/peopledetail_page/components/header_component/action.dart create mode 100644 lib/views/peopledetail_page/components/header_component/component.dart create mode 100644 lib/views/peopledetail_page/components/header_component/components/cast_list.dart create mode 100644 lib/views/peopledetail_page/components/header_component/effect.dart create mode 100644 lib/views/peopledetail_page/components/header_component/reducer.dart create mode 100644 lib/views/peopledetail_page/components/header_component/state.dart create mode 100644 lib/views/peopledetail_page/components/header_component/view.dart create mode 100644 lib/views/peopledetail_page/components/knownfor_component/action.dart create mode 100644 lib/views/peopledetail_page/components/knownfor_component/component.dart create mode 100644 lib/views/peopledetail_page/components/knownfor_component/effect.dart create mode 100644 lib/views/peopledetail_page/components/knownfor_component/reducer.dart create mode 100644 lib/views/peopledetail_page/components/knownfor_component/state.dart create mode 100644 lib/views/peopledetail_page/components/knownfor_component/view.dart create mode 100644 lib/views/peopledetail_page/components/personalinfo_component/action.dart create mode 100644 lib/views/peopledetail_page/components/personalinfo_component/component.dart create mode 100644 lib/views/peopledetail_page/components/personalinfo_component/effect.dart create mode 100644 lib/views/peopledetail_page/components/personalinfo_component/reducer.dart create mode 100644 lib/views/peopledetail_page/components/personalinfo_component/state.dart create mode 100644 lib/views/peopledetail_page/components/personalinfo_component/view.dart create mode 100644 lib/views/peopledetail_page/components/timeline_component/action.dart create mode 100644 lib/views/peopledetail_page/components/timeline_component/component.dart create mode 100644 lib/views/peopledetail_page/components/timeline_component/effect.dart create mode 100644 lib/views/peopledetail_page/components/timeline_component/reducer.dart create mode 100644 lib/views/peopledetail_page/components/timeline_component/state.dart create mode 100644 lib/views/peopledetail_page/components/timeline_component/view.dart create mode 100644 lib/views/peopledetail_page/effect.dart create mode 100644 lib/views/peopledetail_page/page.dart create mode 100644 lib/views/peopledetail_page/reducer.dart create mode 100644 lib/views/peopledetail_page/state.dart create mode 100644 lib/views/peopledetail_page/view.dart create mode 100644 lib/views/premium_page/action.dart create mode 100644 lib/views/premium_page/components/plan_component/action.dart create mode 100644 lib/views/premium_page/components/plan_component/component.dart create mode 100644 lib/views/premium_page/components/plan_component/effect.dart create mode 100644 lib/views/premium_page/components/plan_component/reducer.dart create mode 100644 lib/views/premium_page/components/plan_component/state.dart create mode 100644 lib/views/premium_page/components/plan_component/view.dart create mode 100644 lib/views/premium_page/components/premium_info_component/action.dart create mode 100644 lib/views/premium_page/components/premium_info_component/component.dart create mode 100644 lib/views/premium_page/components/premium_info_component/components/header_component/component.dart create mode 100644 lib/views/premium_page/components/premium_info_component/components/header_component/state.dart create mode 100644 lib/views/premium_page/components/premium_info_component/components/header_component/view.dart create mode 100644 lib/views/premium_page/components/premium_info_component/effect.dart create mode 100644 lib/views/premium_page/components/premium_info_component/reducer.dart create mode 100644 lib/views/premium_page/components/premium_info_component/state.dart create mode 100644 lib/views/premium_page/components/premium_info_component/view.dart create mode 100644 lib/views/premium_page/effect.dart create mode 100644 lib/views/premium_page/page.dart create mode 100644 lib/views/premium_page/reducer.dart create mode 100644 lib/views/premium_page/state.dart create mode 100644 lib/views/premium_page/view.dart create mode 100644 lib/views/register_page/action.dart create mode 100644 lib/views/register_page/effect.dart create mode 100644 lib/views/register_page/page.dart create mode 100644 lib/views/register_page/reducer.dart create mode 100644 lib/views/register_page/state.dart create mode 100644 lib/views/register_page/view.dart create mode 100644 lib/views/seasondetail_page/action.dart create mode 100644 lib/views/seasondetail_page/components/episodes_component/action.dart create mode 100644 lib/views/seasondetail_page/components/episodes_component/component.dart create mode 100644 lib/views/seasondetail_page/components/episodes_component/effect.dart create mode 100644 lib/views/seasondetail_page/components/episodes_component/reducer.dart create mode 100644 lib/views/seasondetail_page/components/episodes_component/state.dart create mode 100644 lib/views/seasondetail_page/components/episodes_component/view.dart create mode 100644 lib/views/seasondetail_page/components/header_component/component.dart create mode 100644 lib/views/seasondetail_page/components/header_component/state.dart create mode 100644 lib/views/seasondetail_page/components/header_component/view.dart create mode 100644 lib/views/seasondetail_page/components/seasoncast_component/action.dart create mode 100644 lib/views/seasondetail_page/components/seasoncast_component/component.dart create mode 100644 lib/views/seasondetail_page/components/seasoncast_component/effect.dart create mode 100644 lib/views/seasondetail_page/components/seasoncast_component/reducer.dart create mode 100644 lib/views/seasondetail_page/components/seasoncast_component/state.dart create mode 100644 lib/views/seasondetail_page/components/seasoncast_component/view.dart create mode 100644 lib/views/seasondetail_page/effect.dart create mode 100644 lib/views/seasondetail_page/page.dart create mode 100644 lib/views/seasondetail_page/reducer.dart create mode 100644 lib/views/seasondetail_page/state.dart create mode 100644 lib/views/seasondetail_page/view.dart create mode 100644 lib/views/seasons_page/action.dart create mode 100644 lib/views/seasons_page/effect.dart create mode 100644 lib/views/seasons_page/page.dart create mode 100644 lib/views/seasons_page/reducer.dart create mode 100644 lib/views/seasons_page/state.dart create mode 100644 lib/views/seasons_page/view.dart create mode 100644 lib/views/setting_page/action.dart create mode 100644 lib/views/setting_page/components/setting_body.dart create mode 100644 lib/views/setting_page/effect.dart create mode 100644 lib/views/setting_page/page.dart create mode 100644 lib/views/setting_page/reducer.dart create mode 100644 lib/views/setting_page/state.dart create mode 100644 lib/views/setting_page/view.dart create mode 100644 lib/views/start_page/action.dart create mode 100644 lib/views/start_page/effect.dart create mode 100644 lib/views/start_page/page.dart create mode 100644 lib/views/start_page/reducer.dart create mode 100644 lib/views/start_page/state.dart create mode 100644 lib/views/start_page/view.dart create mode 100644 lib/views/stream_link/allstreamlink_page/action.dart create mode 100644 lib/views/stream_link/allstreamlink_page/effect.dart create mode 100644 lib/views/stream_link/allstreamlink_page/page.dart create mode 100644 lib/views/stream_link/allstreamlink_page/reducer.dart create mode 100644 lib/views/stream_link/allstreamlink_page/state.dart create mode 100644 lib/views/stream_link/allstreamlink_page/view.dart create mode 100644 lib/views/stream_link/episode_livestream_page/action.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/action.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/component.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/arrow_clipper.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/action.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/component.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/state.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/view.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/download_menu.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/option_menu.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/video_source_menu.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/effect.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/reducer.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/view.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/player_component/action.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/player_component/component.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/player_component/effect.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/player_component/reducer.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/player_component/state.dart create mode 100644 lib/views/stream_link/episode_livestream_page/components/player_component/view.dart create mode 100644 lib/views/stream_link/episode_livestream_page/effect.dart create mode 100644 lib/views/stream_link/episode_livestream_page/page.dart create mode 100644 lib/views/stream_link/episode_livestream_page/reducer.dart create mode 100644 lib/views/stream_link/episode_livestream_page/state.dart create mode 100644 lib/views/stream_link/episode_livestream_page/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/action.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/action.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/action.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/download_menu.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/option_menu.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/video_source_menu.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/effect.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/reducer.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/header_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/header_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/header_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/player_component/action.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/player_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/player_component/effect.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/player_component/reducer.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/player_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/player_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/recommendation_component/action.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/recommendation_component/component.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/recommendation_component/effect.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/recommendation_component/reducer.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/recommendation_component/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/components/recommendation_component/view.dart create mode 100644 lib/views/stream_link/movie_livestream_page/effect.dart create mode 100644 lib/views/stream_link/movie_livestream_page/page.dart create mode 100644 lib/views/stream_link/movie_livestream_page/reducer.dart create mode 100644 lib/views/stream_link/movie_livestream_page/state.dart create mode 100644 lib/views/stream_link/movie_livestream_page/view.dart create mode 100644 lib/views/stream_link/season_link_page/action.dart create mode 100644 lib/views/stream_link/season_link_page/adapter.dart create mode 100644 lib/views/stream_link/season_link_page/components/appbar_component/action.dart create mode 100644 lib/views/stream_link/season_link_page/components/appbar_component/component.dart create mode 100644 lib/views/stream_link/season_link_page/components/appbar_component/effect.dart create mode 100644 lib/views/stream_link/season_link_page/components/appbar_component/state.dart create mode 100644 lib/views/stream_link/season_link_page/components/appbar_component/view.dart create mode 100644 lib/views/stream_link/season_link_page/components/episode_component/action.dart create mode 100644 lib/views/stream_link/season_link_page/components/episode_component/component.dart create mode 100644 lib/views/stream_link/season_link_page/components/episode_component/effect.dart create mode 100644 lib/views/stream_link/season_link_page/components/episode_component/reducer.dart create mode 100644 lib/views/stream_link/season_link_page/components/episode_component/state.dart create mode 100644 lib/views/stream_link/season_link_page/components/episode_component/view.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/action.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/adapter.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/component.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/effect.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/reducer.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/state.dart create mode 100644 lib/views/stream_link/season_link_page/components/episodelist_component/view.dart create mode 100644 lib/views/stream_link/season_link_page/components/header_component/action.dart create mode 100644 lib/views/stream_link/season_link_page/components/header_component/component.dart create mode 100644 lib/views/stream_link/season_link_page/components/header_component/effect.dart create mode 100644 lib/views/stream_link/season_link_page/components/header_component/state.dart create mode 100644 lib/views/stream_link/season_link_page/components/header_component/view.dart create mode 100644 lib/views/stream_link/season_link_page/components/tabbar_component/action.dart create mode 100644 lib/views/stream_link/season_link_page/components/tabbar_component/component.dart create mode 100644 lib/views/stream_link/season_link_page/components/tabbar_component/effect.dart create mode 100644 lib/views/stream_link/season_link_page/components/tabbar_component/state.dart create mode 100644 lib/views/stream_link/season_link_page/components/tabbar_component/view.dart create mode 100644 lib/views/stream_link/season_link_page/effect.dart create mode 100644 lib/views/stream_link/season_link_page/page.dart create mode 100644 lib/views/stream_link/season_link_page/reducer.dart create mode 100644 lib/views/stream_link/season_link_page/state.dart create mode 100644 lib/views/stream_link/season_link_page/view.dart create mode 100644 lib/views/test_page/action.dart create mode 100644 lib/views/test_page/components/test_component/action.dart create mode 100644 lib/views/test_page/components/test_component/component.dart create mode 100644 lib/views/test_page/components/test_component/effect.dart create mode 100644 lib/views/test_page/components/test_component/reducer.dart create mode 100644 lib/views/test_page/components/test_component/state.dart create mode 100644 lib/views/test_page/components/test_component/view.dart create mode 100644 lib/views/test_page/effect.dart create mode 100644 lib/views/test_page/page.dart create mode 100644 lib/views/test_page/reducer.dart create mode 100644 lib/views/test_page/state.dart create mode 100644 lib/views/test_page/view.dart create mode 100644 lib/views/trending_page/action.dart create mode 100644 lib/views/trending_page/adpater/action.dart create mode 100644 lib/views/trending_page/adpater/adapter.dart create mode 100644 lib/views/trending_page/adpater/reducer.dart create mode 100644 lib/views/trending_page/components/filter_component/action.dart create mode 100644 lib/views/trending_page/components/filter_component/component.dart create mode 100644 lib/views/trending_page/components/filter_component/effect.dart create mode 100644 lib/views/trending_page/components/filter_component/reducer.dart create mode 100644 lib/views/trending_page/components/filter_component/state.dart create mode 100644 lib/views/trending_page/components/filter_component/view.dart create mode 100644 lib/views/trending_page/components/trendingcell_component/action.dart create mode 100644 lib/views/trending_page/components/trendingcell_component/component.dart create mode 100644 lib/views/trending_page/components/trendingcell_component/effect.dart create mode 100644 lib/views/trending_page/components/trendingcell_component/reducer.dart create mode 100644 lib/views/trending_page/components/trendingcell_component/state.dart create mode 100644 lib/views/trending_page/components/trendingcell_component/view.dart create mode 100644 lib/views/trending_page/effect.dart create mode 100644 lib/views/trending_page/page.dart create mode 100644 lib/views/trending_page/reducer.dart create mode 100644 lib/views/trending_page/state.dart create mode 100644 lib/views/trending_page/view.dart create mode 100644 lib/views/tvshow_detail_page/action.dart create mode 100644 lib/views/tvshow_detail_page/components/cast_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/cast_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/cast_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/cast_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/cast_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/cast_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/keyword_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/keyword_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/keyword_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/keyword_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/keyword_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/keyword_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/last_episode_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/last_episode_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/last_episode_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/last_episode_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/last_episode_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/last_episode_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/menu_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/menu_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/menu_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/menu_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/menu_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/menu_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/recommendation_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/recommendation_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/recommendation_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/recommendation_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/recommendation_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/recommendation_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/season_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/season_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/season_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/season_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/season_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/season_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/swiper_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/swiper_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/swiper_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/swiper_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/swiper_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/swiper_component/view.dart create mode 100644 lib/views/tvshow_detail_page/components/title_component/action.dart create mode 100644 lib/views/tvshow_detail_page/components/title_component/component.dart create mode 100644 lib/views/tvshow_detail_page/components/title_component/effect.dart create mode 100644 lib/views/tvshow_detail_page/components/title_component/reducer.dart create mode 100644 lib/views/tvshow_detail_page/components/title_component/state.dart create mode 100644 lib/views/tvshow_detail_page/components/title_component/view.dart create mode 100644 lib/views/tvshow_detail_page/effect.dart create mode 100644 lib/views/tvshow_detail_page/page.dart create mode 100644 lib/views/tvshow_detail_page/reducer.dart create mode 100644 lib/views/tvshow_detail_page/state.dart create mode 100644 lib/views/tvshow_detail_page/view.dart create mode 100644 lib/views/views.dart create mode 100644 lib/views/watchlist_page/action.dart create mode 100644 lib/views/watchlist_page/components/header_component/action.dart create mode 100644 lib/views/watchlist_page/components/header_component/component.dart create mode 100644 lib/views/watchlist_page/components/header_component/effect.dart create mode 100644 lib/views/watchlist_page/components/header_component/reducer.dart create mode 100644 lib/views/watchlist_page/components/header_component/state.dart create mode 100644 lib/views/watchlist_page/components/header_component/view.dart create mode 100644 lib/views/watchlist_page/components/info_component/component.dart create mode 100644 lib/views/watchlist_page/components/info_component/state.dart create mode 100644 lib/views/watchlist_page/components/info_component/view.dart create mode 100644 lib/views/watchlist_page/components/swiper_component/action.dart create mode 100644 lib/views/watchlist_page/components/swiper_component/component.dart create mode 100644 lib/views/watchlist_page/components/swiper_component/effect.dart create mode 100644 lib/views/watchlist_page/components/swiper_component/reducer.dart create mode 100644 lib/views/watchlist_page/components/swiper_component/state.dart create mode 100644 lib/views/watchlist_page/components/swiper_component/view.dart create mode 100644 lib/views/watchlist_page/effect.dart create mode 100644 lib/views/watchlist_page/page.dart create mode 100644 lib/views/watchlist_page/reducer.dart create mode 100644 lib/views/watchlist_page/state.dart create mode 100644 lib/views/watchlist_page/view.dart create mode 100644 lib/views/watchlistdetail_page/action.dart create mode 100644 lib/views/watchlistdetail_page/effect.dart create mode 100644 lib/views/watchlistdetail_page/page.dart create mode 100644 lib/views/watchlistdetail_page/reducer.dart create mode 100644 lib/views/watchlistdetail_page/state.dart create mode 100644 lib/views/watchlistdetail_page/view.dart create mode 100644 lib/widgets/arrow_clipper.dart create mode 100644 lib/widgets/backdrop.dart create mode 100644 lib/widgets/chromecast_dialog.dart create mode 100644 lib/widgets/custom_video_controls.dart create mode 100644 lib/widgets/customcliper_path.dart create mode 100644 lib/widgets/dialogratingbar.dart create mode 100644 lib/widgets/expandable_text.dart create mode 100644 lib/widgets/gallery_photoview_wrapper.dart create mode 100644 lib/widgets/hero_dialog_route.dart create mode 100644 lib/widgets/host_dialog.dart create mode 100644 lib/widgets/imageview_wrapper.dart create mode 100644 lib/widgets/keepalive_widget.dart create mode 100644 lib/widgets/language_dialog.dart create mode 100644 lib/widgets/linear_progress_Indicator.dart create mode 100644 lib/widgets/loading_layout.dart create mode 100644 lib/widgets/medialist_card.dart create mode 100644 lib/widgets/overlay_entry_manage.dart create mode 100644 lib/widgets/scrollview_background.dart create mode 100644 lib/widgets/searchbar_delegate.dart create mode 100644 lib/widgets/service_discovery.dart create mode 100644 lib/widgets/share_card.dart create mode 100644 lib/widgets/shimmercell.dart create mode 100644 lib/widgets/sliverappbar_delegate.dart create mode 100644 lib/widgets/stream_link_report_dialog.dart create mode 100644 lib/widgets/update_info_dialog.dart create mode 100644 lib/widgets/video_panel.dart create mode 100644 lib/widgets/videoplayeritem.dart create mode 100644 lib/widgets/watchlistdetail.dart create mode 100644 lib/widgets/web_torrent_player.dart create mode 100644 lib/widgets/webview_player.dart create mode 100644 lib/widgets/youtube_player.dart create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart create mode 100644 web/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9e4293a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,84 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +pubspec.lock +.pub-cache/ +.pub/ +/build/ +srceenshot + + + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +lib/generated_plugin_registrant.dart + + +#Credientials +android/app/google-services.json +appconfig.json +ios/Runner/GoogleService-Info.plist diff --git a/.metadata b/.metadata new file mode 100644 index 00000000..aeb01ee2 --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2d2a1ffec95cc70a3218872a2cd3f8de4933c42f + channel: stable + +project_type: app diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 00000000..bc2100d8 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,7 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 00000000..2e4cbdbe --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,76 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.tejasw.tmovies" + minSdkVersion 21 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled true + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'com.android.support:multidex:1.0.3' + implementation 'io.card:android-sdk:5.+' +} + +apply plugin: 'com.google.gms.google-services' +googleServices { + disableVersionCheck = true +} \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..b4b4b0d5 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..64ecf2a6 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/o1298098/movie/MainActivity.kt b/android/app/src/main/kotlin/com/o1298098/movie/MainActivity.kt new file mode 100644 index 00000000..cd90c564 --- /dev/null +++ b/android/app/src/main/kotlin/com/o1298098/movie/MainActivity.kt @@ -0,0 +1,12 @@ +package com.tejasw.tmoviess + +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugins.GeneratedPluginRegistrant + +class MainActivity: FlutterActivity() { + override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine); + } +} diff --git a/android/app/src/main/res/drawable/app_icon.png b/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..447bbfec --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..b4b4b0d5 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 00000000..70b3637d --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,32 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.2' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 00000000..a6738207 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..296b146b --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 00000000..5a2f14fb --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/i18n/de-DE.json b/i18n/de-DE.json new file mode 100644 index 00000000..52838a6e --- /dev/null +++ b/i18n/de-DE.json @@ -0,0 +1,90 @@ +{ + "appname": "Film", + "searchbartxt": "Suche nach einem Film, einer Fernsehsendung, einer Person", + "home": "Zuhause", + "discover": "Entdecken", + "coming": "Kommen", + "account": "Konto", + "inTheaters": "In Theatern", + "onTV": "Im Fernsehen", + "overView": "Überblick", + "topBilledCast": "Top Billed Cast", + "userScore": "User Score", + "playTrailer": "Trailer abspielen", + "main": "Main", + "videos": "Videos", + "images": "Bilder", + "reviews": "Bewertungen", + "tags": "Stichworte", + "recommendations": "Empfehlungen", + "biography": "Biografie", + "knownFor": "Bekannt für", + "acting": "Schauspielkunst", + "movies": "Filme", + "tvShows": "Fernsehshows", + "personalInfo": "Persönliche Informationen", + "gender": "Geschlecht", + "birthday": "Geburtstag", + "knownCredits": "Bekannte Credits", + "placeOfBirth": "Geburtsort", + "officialSite": "offizielle Seite", + "alsoKnownAs": "Auch bekannt als", + "sortBy": "Sortiere nach", + "filter": "Filter", + "watchlist": "Beobachtungsliste", + "lists": "Listen", + "favorites": "Favoriten", + "ratingsReviews": "Bewertungen & Bewertungen", + "popular": "Beliebt", + "more": "Mehr", + "featuredCrew": "Ausgewählte Crew", + "creator": "Schöpfer", + "currentSeason": "Aktuelle Saison", + "viewAllSeasons": "Alle Jahreszeiten anzeigen", + "seasonDetail": "Saison Detail", + "seasonCast": "Staffelbesetzung", + "episodes": "Folgen", + "guestStars": "Gaststars", + "guestStarsEmpty": "Es wurde kein Gaststar hinzugefügt", + "crew": "Besatzung", + "crewEmpty": "Es wurde keine Crew hinzugefügt", + "episodeImages": "Episodenbilder", + "episodeImagesEmpty": "Es wurde kein Episodenbild hinzugefügt", + "facts": "Fakten", + "network": "Netzwerk", + "status": "Status", + "type": "Art", + "originalLanguage": "Ursprache", + "runtime": "Laufzeit", + "genders": "Geschlechter", + "releaseInformation": "Release-Informationen", + "budget": "Budget", + "revenue": "Einnahmen", + "company": "Unternehmen", + "play": "abspielen", + "welcomeBack": "Willkommen zurück", + "settings": "Settings", + "adultContent": "Inhalt für Erwachsene", + "notifications": "Benachrichtigungen", + "darkMode": "Dunkler Modus", + "language": "Sprache", + "feedback": "Feedback", + "version": "Ausführung", + "stills": "Stills", + "keyWords": "Schlüsselwörter", + "trailers": "Anhänger", + "trending": "Trend", + "newStare": "Neue Freigabe", + "newShare": "Neue Freigabe", + "Shared": "Geteilt", + "shared": "Geteilt", + "seasons": "Jahreszeiten", + "welcome": "Herzlich willkommen", + "letStartWithFewSteps": "Beginnen wir mit wenigen Schritten", + "continueA": "Fortsetzen", + "next": "Nächster", + "back": "Zurück", + "start": "Anfang", + "whatKindOfMovieDoYouLike": "Welche Art von Film gefällt Ihnen", + "whatKindOfTvShowDoYouLike": "Was für eine TV-Show magst du" +} \ No newline at end of file diff --git a/i18n/en-US.json b/i18n/en-US.json new file mode 100644 index 00000000..48a139b2 --- /dev/null +++ b/i18n/en-US.json @@ -0,0 +1,88 @@ +{ + "appname": "Movie", + "searchbartxt": "Search for a movie, tv show, person", + "home": "Home", + "discover": "Discover", + "coming": "Coming", + "account": "Account", + "inTheaters": "In Theaters", + "onTV": "On TV", + "overView": "OverView", + "topBilledCast": "Top Billed Cast", + "userScore": "User Score", + "stills": "Stills", + "keyWords": "Keywords", + "trailers": "Trailers", + "playTrailer": "Play Trailer", + "main": "Main", + "videos": "Videos", + "images": "Images", + "reviews": "Reviews", + "tags": "Tags", + "recommendations": "Recommendations", + "biography": "Biography", + "knownFor": "Known For", + "acting": "Acting", + "movies": "Movies", + "tvShows": "TV Shows", + "personalInfo": "Personal Info", + "gender": "Gender", + "birthday": "Birthday", + "knownCredits": "Known Credits", + "placeOfBirth": "Place of Birth", + "officialSite": "official Site", + "alsoKnownAs": "Also Known As", + "sortBy": "Sort By", + "filter": "Filter", + "watchlist": "Watchlist", + "lists": "Lists", + "favorites": "Favorites", + "ratingsReviews": "Ratings&Reviews", + "popular": "Popular", + "more": "More", + "featuredCrew": "Featured Crew", + "creator": "Creator", + "seasons": "Seasons", + "currentSeason": "Current Season", + "viewAllSeasons": "View All Seasons", + "seasonDetail": "Season Detail", + "seasonCast": "Season Cast", + "episodes": "Episodes", + "guestStars": "Guest Stars", + "guestStarsEmpty": "No guest star have been added", + "crew": "Crew", + "crewEmpty": "No crew have been added", + "episodeImages": "Episode Images", + "episodeImagesEmpty": "No episode image have been added", + "facts": "Facts", + "network": "Network", + "status": "Status", + "type": "Type", + "originalLanguage": "Original Language", + "runtime": "Runtime", + "genders": "Genders", + "releaseInformation": "Release Information", + "budget": "Budget", + "revenue": "Revenue", + "company": "Company", + "play": "Play", + "welcomeBack": "Welcome back", + "settings": "Settings", + "adultContent": "Adult Content", + "notifications": "Notifications", + "darkMode": "Dark Mode", + "language": "Language", + "feedback": "Feedback", + "version": "Version", + "trending": "Trending", + "shared": "Shared", + "lastEpisode": "Last Episode", + "welcome": "Welcome", + "letStartWithFewSteps": "let start with few steps", + "continueA": "Continue", + "next": "Next", + "back": "Back", + "start": "Start", + "whatKindOfMovieDoYouLike": "What kind of movie do you like", + "whatKindOfTvShowDoYouLike": "What kind of tvshow do you like" +} \ No newline at end of file diff --git a/i18n/es-ES.json b/i18n/es-ES.json new file mode 100644 index 00000000..396fa680 --- /dev/null +++ b/i18n/es-ES.json @@ -0,0 +1,88 @@ +{ + "appname": "Película", + "searchbartxt": "Busca una película, un programa de televisión, una persona", + "home": "Hogar", + "discover": "Descubrir", + "coming": "Viniendo", + "account": "Cuenta", + "inTheaters": "En los cines", + "onTV": "En TV", + "overView": "Visión de conjunto", + "topBilledCast": "Reparto más facturado", + "userScore": "Puntuación de usuario", + "playTrailer": "Reproducir tráiler", + "main": "Principal", + "videos": "Videos", + "images": "Imagenes", + "reviews": "Reseñas", + "tags": "Etiquetas", + "recommendations": "Recomendaciones", + "biography": "Biografía", + "knownFor": "Conocido por", + "acting": "Interino", + "movies": "Películas", + "tvShows": "Programas de tv", + "personalInfo": "Información personal", + "gender": "Género", + "birthday": "Cumpleaños", + "knownCredits": "Créditos conocidos", + "placeOfBirth": "Lugar de nacimiento", + "officialSite": "sitio oficial", + "alsoKnownAs": "También conocido como", + "sortBy": "Ordenar por", + "filter": "Filtrar", + "watchlist": "Lista de seguimiento", + "lists": "Liza", + "favorites": "Favoritos", + "ratingsReviews": "Calificaciones y reseñas", + "popular": "Popular", + "more": "Más", + "featuredCrew": "Tripulación destacada", + "creator": "Creador", + "currentSeason": "Temporada actual", + "viewAllSeasons": "Ver todas las temporadas", + "seasonDetail": "Detalle de temporada", + "seasonCast": "Reparto de la temporada", + "episodes": "Episodios", + "guestStars": "Estrellas invitadas", + "guestStarsEmpty": "No se ha agregado ninguna estrella invitada", + "crew": "Tripulación", + "crewEmpty": "No se ha agregado tripulación", + "episodeImages": "Imágenes del episodio", + "episodeImagesEmpty": "No se ha agregado ninguna imagen de episodio", + "facts": "Hechos", + "network": "Red", + "status": "Estado", + "type": "Tipo", + "originalLanguage": "Idioma original", + "runtime": "Tiempo de ejecución", + "genders": "Géneros", + "releaseInformation": "Información de lanzamiento", + "budget": "Presupuesto", + "revenue": "Ingresos", + "company": "Empresa", + "play": "Jugar", + "welcomeBack": "Dar una buena acogida", + "settings": "Settings", + "adultContent": "Contenido para adultos", + "notifications": "Notificaciones", + "darkMode": "Modo oscuro", + "language": "Idioma", + "feedback": "Realimentación", + "version": "Versión", + "stills": "Fotogramas", + "keyWords": "Palabras clave", + "trailers": "Remolques", + "trending": "Tendencias", + "newShare": "Compartir nuevo", + "shared": "Compartido", + "seasons": "Estaciones", + "welcome": "Bienvenidos", + "letStartWithFewSteps": "vamos a empezar con unos pocos pasos", + "continueA": "Seguir", + "next": "Próximo", + "back": "Espalda", + "start": "Comienzo", + "whatKindOfMovieDoYouLike": "Que tipo de peliculas te gustan", + "whatKindOfTvShowDoYouLike": "¿Qué tipo de programa de televisión te gusta" +} \ No newline at end of file diff --git a/i18n/fr-FR.json b/i18n/fr-FR.json new file mode 100644 index 00000000..e505463b --- /dev/null +++ b/i18n/fr-FR.json @@ -0,0 +1,88 @@ +{ + "appname": "Film", + "searchbartxt": "Rechercher un film, une émission de télévision, une personne", + "home": "Accueil", + "discover": "Découvrir", + "coming": "À venir", + "account": "Compte", + "inTheaters": "Dans les théâtres", + "onTV": "À la télé", + "overView": "Aperçu", + "topBilledCast": "Meilleur casting facturé", + "userScore": "Score de l'utilisateur", + "playTrailer": "Jouer la bande-annonce", + "main": "Principale", + "videos": "Vidéos", + "images": "Images", + "reviews": "Commentaires", + "tags": "Mots clés", + "recommendations": "Recommandations", + "biography": "Biographie", + "knownFor": "Connu pour", + "acting": "Agissant", + "movies": "Films", + "tvShows": "Émissions de télévision", + "personalInfo": "Informations personnelles", + "gender": "Le sexe", + "birthday": "Anniversaire", + "knownCredits": "Crédits connus", + "placeOfBirth": "Lieu de naissance", + "officialSite": "site officiel", + "alsoKnownAs": "Aussi connu sous le nom", + "sortBy": "Trier par", + "filter": "Filtre", + "watchlist": "Liste de surveillance", + "lists": "Listes", + "favorites": "Favoris", + "ratingsReviews": "Notes et avis", + "popular": "Populaire", + "more": "Plus", + "featuredCrew": "Équipage en vedette", + "creator": "Créateur", + "currentSeason": "Saison en cours", + "viewAllSeasons": "Voir toutes les saisons", + "seasonDetail": "Détail de la saison", + "seasonCast": "Distribution de la saison", + "episodes": "Épisodes", + "guestStars": "Des invités de prestige", + "guestStarsEmpty": "Aucune guest star n'a été ajoutée", + "crew": "Équipage", + "crewEmpty": "Aucun équipage n'a été ajouté", + "episodeImages": "Images d'épisode", + "episodeImagesEmpty": "Aucune image d'épisode n'a été ajoutée", + "facts": "Les faits", + "network": "Réseau", + "status": "Statut", + "type": "Type", + "originalLanguage": "Langue originale", + "runtime": "Durée", + "genders": "Les genres", + "releaseInformation": "Divulguer des renseignements", + "budget": "Budget", + "revenue": "Revenu", + "company": "Compagnie", + "play": "Jouer", + "welcomeBack": "Nous saluons le retour", + "settings": "Paramètres", + "adultContent": "Contenu adulte", + "notifications": "Notifications", + "darkMode": "Mode sombre", + "language": "Langue", + "feedback": "Retour d'information", + "version": "Version", + "stills": "Photos", + "keyWords": "Mots clés", + "trailers": "Bandes annonces", + "trending": "Tendance", + "newShare": "Nouveau partage", + "shared": "partagé", + "seasons": "Saisons", + "welcome": "Bienvenu", + "letStartWithFewSteps": "commençons par quelques étapes", + "continueA": "Continuer", + "next": "Prochain", + "back": "Arrière", + "start": "Début", + "whatKindOfMovieDoYouLike": "Quel genre de film aimez-vous", + "whatKindOfTvShowDoYouLike": "Quel genre de télé-émission aimez-vous" +} \ No newline at end of file diff --git a/i18n/ja-JP.json b/i18n/ja-JP.json new file mode 100644 index 00000000..638f9f0c --- /dev/null +++ b/i18n/ja-JP.json @@ -0,0 +1,88 @@ +{ + "appname": "Movie", + "searchbartxt": "映画名、テレビ番組名、人物名で検索", + "home": "ホーム", + "discover": "発見", + "coming": "Coming", + "account": "アカウント", + "inTheaters": "上映中", + "onTV": "放送中", + "overView": "概要", + "topBilledCast": "主な出演者", + "userScore": "ユーザースコア", + "playTrailer": "予告編を再生", + "main": "メイン", + "videos": "動画", + "images": "画像", + "reviews": "レビュー", + "tags": "キーワード", + "recommendations": "おすすめ", + "biography": "経歴", + "knownFor": "仕事", + "acting": "演技", + "movies": "映画", + "tvShows": "テレビ番組", + "personalInfo": "プロフィール", + "gender": "性別", + "birthday": "誕生日", + "knownCredits": "既知のクレジット", + "placeOfBirth": "出生地", + "officialSite": "公式サイト", + "alsoKnownAs": "別の呼び方", + "sortBy": "並び替え", + "filter": "フィルタ", + "watchlist": "ウォッチリスト", + "lists": "リスト", + "favorites": "お気に入り", + "ratingsReviews": "評価とレビュー", + "popular": "人気の", + "more": "もっと", + "featuredCrew": "主なスタッフ", + "creator": "Creator", + "currentSeason": "現在のシーズン", + "viewAllSeasons": "View All Seasons", + "seasonDetail": "Season Detail", + "seasonCast": "Season Cast", + "episodes": "Episodes", + "guestStars": "Guest Stars", + "guestStarsEmpty": "No guest star have been added", + "crew": "Crew", + "crewEmpty": "No crew have been added", + "episodeImages": "Episode Images", + "episodeImagesEmpty": "No episode image have been added", + "facts": "Facts", + "network": "Network", + "status": "Status", + "type": "Type", + "originalLanguage": "Original Language", + "runtime": "Runtime", + "genders": "Genders", + "releaseInformation": "Release Information", + "budget": "Budget", + "revenue": "Revenue", + "company": "Company", + "play": "Play", + "welcomeBack": "お帰りなさい", + "settings": "設定", + "adultContent": "成人コンテンツ", + "notifications": "お知らせ", + "darkMode": "Dark Mode", + "language": "言語", + "feedback": "フィードバック", + "version": "バージョン", + "stills": "静止画", + "keyWords": "キーワード", + "trailers": "トレーラー", + "trending": "急上昇", + "newShare": "新しい共有", + "shared": "共有", + "seasons": "季節", + "welcome": "ようこそ", + "letStartWithFewSteps": "いくつかのステップから始めましょう", + "continueA": "継続する", + "next": "Next", + "back": "Back", + "start": "Start", + "whatKindOfMovieDoYouLike": "どんな映画が好きですか", + "whatKindOfTvShowDoYouLike": "どんなテレビ番組が好きですか" +} \ No newline at end of file diff --git a/i18n/ru-RU.json b/i18n/ru-RU.json new file mode 100644 index 00000000..7123913c --- /dev/null +++ b/i18n/ru-RU.json @@ -0,0 +1,88 @@ +{ + "appname": "Фильм", + "searchbartxt": "Искать фильм, сериал, человека", + "home": "Домой", + "discover": "Обнаружить", + "coming": "приход", + "account": "учетная запись", + "inTheaters": "В театрах", + "onTV": "По телевизору", + "overView": "OverView", + "topBilledCast": "Лучшие актеры", + "userScore": "Оценка пользователей", + "playTrailer": "Слушать трейлер", + "main": "Основной", + "videos": "Ролики", + "images": "Изображений", + "reviews": "Отзывы", + "tags": "Теги", + "recommendations": "рекомендации", + "biography": "биография", + "knownFor": "Известный", + "acting": "Действующий", + "movies": "Фильмы", + "tvShows": "ТВ шоу", + "personalInfo": "Личная информация", + "gender": "Пол", + "birthday": "день рождения", + "knownCredits": "Известные кредиты", + "placeOfBirth": "Место рождения", + "officialSite": "официальный сайт", + "alsoKnownAs": "Также известный как", + "sortBy": "Сортировать по", + "filter": "Фильтр", + "watchlist": "Список", + "lists": "Списки", + "favorites": "Избранные", + "ratingsReviews": "Рейтинги и отзывы", + "popular": "Популярный", + "more": "Больше", + "featuredCrew": "Избранный экипаж", + "creator": "творец", + "currentSeason": "Текущий сезон", + "viewAllSeasons": "Просмотреть все сезоны", + "seasonDetail": "Детали сезона", + "seasonCast": "Сезонный состав", + "episodes": "Эпизоды", + "guestStars": "Приглашенные звезды", + "guestStarsEmpty": "Приглашенная звезда не добавлена", + "crew": "экипаж", + "crewEmpty": "Экипаж не добавлен", + "episodeImages": "Изображения эпизодов", + "episodeImagesEmpty": "Изображение эпизода не добавлено", + "facts": "факты", + "network": "сеть", + "status": "Положение дел", + "type": "Тип", + "originalLanguage": "Исходный язык", + "runtime": "время выполнения", + "genders": "Genders", + "releaseInformation": "Информация о выпуске", + "budget": "бюджет", + "revenue": "доходов", + "company": "Компания", + "play": "Играть", + "welcomeBack": "Добро пожаловать", + "settings": "настройки", + "adultContent": "Контент для взрослых", + "notifications": "Уведомления", + "darkMode": "Темный режим", + "language": "язык", + "feedback": "Обратная связь", + "version": "Версия", + "stills": "Кадры из фильма", + "keyWords": "Ключевые слова", + "trailers": "Прицепы", + "trending": "Trending", + "newShare": "Новая акция", + "shared": "Общий", + "seasons": "Времена года", + "welcome": "Добро пожаловать", + "letStartWithFewSteps": "давай начнем с нескольких шагов", + "continueA": "Продолжать", + "next": "Next", + "back": "Back", + "start": "Start", + "whatKindOfMovieDoYouLike": "Какой фильм тебе нравится", + "whatKindOfTvShowDoYouLike": "Какое телешоу тебе нравится" +} \ No newline at end of file diff --git a/i18n/zh-CN.json b/i18n/zh-CN.json new file mode 100644 index 00000000..1d561ff0 --- /dev/null +++ b/i18n/zh-CN.json @@ -0,0 +1,88 @@ +{ + "appname": "电影", + "searchbartxt": "搜索电影、电视剧、演员", + "home": "主页", + "discover": "发现", + "coming": "预播", + "account": "账号", + "inTheaters": "上映中", + "onTV": "放送中", + "overView": "概要", + "topBilledCast": "主要演员", + "userScore": "用户评分", + "playTrailer": "播放预告", + "main": "主要", + "videos": "视频", + "images": "图片", + "reviews": "评论", + "tags": "标签", + "recommendations": "推荐", + "biography": "经历", + "knownFor": "被认识", + "acting": "Acting", + "movies": "电影", + "tvShows": "电视剧", + "personalInfo": "个人信息", + "gender": "性别", + "birthday": "生日", + "knownCredits": "作品", + "placeOfBirth": "出生地", + "officialSite": "个人主页", + "alsoKnownAs": "被称为", + "sortBy": "排序", + "filter": "过滤", + "watchlist": "待看清单", + "lists": "收藏表", + "favorites": "我的最爱", + "ratingsReviews": "评分", + "popular": "热门", + "more": "更多", + "featuredCrew": "主创人员", + "creator": "创作者", + "currentSeason": "当前季", + "viewAllSeasons": "View All Seasons", + "seasonDetail": "Season Detail", + "seasonCast": "Season Cast", + "episodes": "Episodes", + "guestStars": "Guest Stars", + "guestStarsEmpty": "No guest star have been added", + "crew": "Crew", + "crewEmpty": "No crew have been added", + "episodeImages": "Episode Images", + "episodeImagesEmpty": "No episode image have been added", + "facts": "Facts", + "network": "Network", + "status": "状态", + "type": "Type", + "originalLanguage": "原始语言", + "runtime": "Runtime", + "genders": "Genders", + "releaseInformation": "Release Information", + "budget": "Budget", + "revenue": "Revenue", + "company": "公司", + "play": "播放", + "welcomeBack": "欢迎回来", + "settings": "设置", + "adultContent": "成人内容", + "notifications": "通知", + "darkMode": "黑暗模式", + "language": "语言", + "feedback": "反馈", + "version": "版本", + "stills": "剧照", + "keyWords": "关键词", + "trailers": "预告片", + "trending": "趋势", + "newShare": "新股", + "shared": "分享", + "seasons": "季节", + "welcome": "欢迎", + "letStartWithFewSteps": "让我们从几个步骤开始", + "continueA": "继续", + "next": "前进", + "back": "后退", + "start": "开始", + "whatKindOfMovieDoYouLike": "你喜欢什么类型的电影", + "whatKindOfTvShowDoYouLike": "你喜欢什么类型的电视节目" +} \ No newline at end of file diff --git a/i18n/zh-TW.json b/i18n/zh-TW.json new file mode 100644 index 00000000..c556f457 --- /dev/null +++ b/i18n/zh-TW.json @@ -0,0 +1,87 @@ +{ + "appname": "电影", + "searchbartxt": "搜索电影,电视节目,人物", + "home": "家", + "discover": "发现", + "coming": "未来", + "account": "帐户", + "inTheaters": "在剧院", + "onTV": "在电视上", + "overView": "概观", + "topBilledCast": "热门付费演员表", + "userScore": "用户分数", + "playTrailer": "播放预告片", + "main": "主要", + "videos": "影片", + "images": "图片", + "reviews": "评论", + "tags": "标签", + "recommendations": "推荐建议", + "biography": "传", + "knownFor": "闻名", + "acting": "代理", + "movies": "电影", + "tvShows": "电视节目", + "personalInfo": "个人信息", + "gender": "性别", + "birthday": "生日", + "knownCredits": "已知学分", + "placeOfBirth": "出生地", + "officialSite": "官方网站", + "alsoKnownAs": "也称为", + "sortBy": "排序方式", + "filter": "过滤", + "watchlist": "监视清单", + "lists": "清单", + "favorites": "收藏夹", + "ratingsReviews": "评分与评论", + "popular": "流行", + "more": "更多", + "featuredCrew": "精选船员", + "creator": "创作者", + "currentSeason": "当前季节", + "viewAllSeasons": "查看所有季节", + "seasonDetail": "季节细节", + "seasonCast": "季播", + "episodes": "集数", + "guestStars": "客串明星", + "guestStarsEmpty": "尚未添加来宾星级", + "crew": "船员", + "crewEmpty": "尚未添加任何机组", + "episodeImages": "情节图像", + "episodeImagesEmpty": "没有添加剧集图片", + "facts": "事实", + "network": "网络", + "status": "状态", + "type": "类型", + "originalLanguage": "原始语言", + "runtime": "运行", + "genders": "性别", + "releaseInformation": "发布信息", + "budget": "预算", + "revenue": "收入", + "company": "公司", + "play": "玩", + "welcomeBack": "欢迎回来", + "settings": "设定值", + "adultContent": "成人内容", + "notifications": "通知事项", + "darkMode": "暗模式", + "language": "语言", + "feedback": "反馈", + "version": "版本", + "stills": "剧照", + "keyWords": "关键词", + "trailers": "预告片", + "trending": "趋势", + "shared": "分享", + "seasons": "季节", + "welcome": "Welcome", + "letStartWithFewSteps": "let start with few steps", + "continueA": "Continue", + "next": "Next", + "back": "Back", + "start": "Start", + "whatKindOfMovieDoYouLike": "What kind of movie do you like", + "whatKindOfTvShowDoYouLike": "What kind of tvshow do you like" +} \ No newline at end of file diff --git a/i18nconfig.json b/i18nconfig.json new file mode 100644 index 00000000..0bb6d3b6 --- /dev/null +++ b/i18nconfig.json @@ -0,0 +1,27 @@ +{ + "defaultLocale": "en-US", + "locales": [ + "en-US", + "zh-CN", + "ja-JP", + "zh-TW", + "es-ES", + "fr-FR", + "ru-RU", + "de-DE" + ], + "localePath": "i18n", + "generatedPath": "lib/generated", + "ltr": [ + "en-US", + "zh-CN", + "ja-JP", + "zh-TW", + "es-ES", + "fr-FR", + "ru-RU", + "de-DE" + ], + "rtl": [], + "googleTranslateApiKey": "AIzaSyDiQrY6N-yu_6ipGtEKYRxeQOTGzXz1j1M" +} \ No newline at end of file diff --git a/images/CacheBG.jpg b/images/CacheBG.jpg new file mode 100644 index 0000000000000000000000000000000000000000..821b149337959d768f95b877524068d0e13ffef6 GIT binary patch literal 1625 zcmbV}doJhBwCC(!yZe2f=bYy~&-1+J`J6{KB>NR8JJ~tf z0R#d8{9yyKaiC3)4c!lbiwmFt0B~?k1t8%J0o!NEMu9C*Kp^D)MMyMKE({8VL}M{n ztUPe|6?hzufWu-5iUh(6A}lQa8zn{JH}YKmiF{l>1v?Rk#mPJVn`HL@2?v5eFcP5+ z6i5gp2_bs`wBTLQFp(VUix3J(6dD7sL|6eg+){?uMTU^)OvDpbu2R=nt+zqnz>s1}-D>u|xrOacx}Cj) zqmu{I)63h(mlYJeZ~uXi(6Fc@N26n6f8?A>O8zP3bSn2eFEi^x_Qf22@nwPVN=d1x z?8eQiTh+H~YU}PdKWJ%fYwzgn>Fw(u7#tcN8Gk9Bn3PQYHvLNaZtneu`Hu_GqMQo> zkbhx)CHn^#3FcCOZ-Bzexey95a3D!2^m=2A3e6oGz*f~ZIf*0h$SAtrgxA@^c&io| z*-cofYdWqcm7{$o`*&c8|BLJ^*xy_ufQUrE$3v2UHTZZs@6g6H{Of62_Jn2pY{@OJ z)F!c&63Z^!SW;h`lM}m3>G^ceAst5eULi_boy(1Yp zQGI=kt#7O?Dnk%f!`6dTVns$@)FLw%XtC1vwaGwPnMsXuMuYWYzhYH(`OV*p5*Dep=R|qchp17@C8j#33Rj&e}>&+ zuTQb)jXAh??vZJus}QU?yp3YGij5IQkA+rt4s?3kc%CnRM&wq->Mm1>&5_-u8fM)Y z2F?CK4QhIeYPk!!TqE-cmRWa=mXlj(nls~eTwYI#`uq&T=FPGUbmmnotEuqnvV275 zqHw&~?6&w!^N!N)8&#ICtt)qBuG4*XYQe*m95HG`wJ{Kr&ue9mmh@!u?V++_l%<(b zy!Pc_sE+NWAZ??nyL8dRFn)yvceUQkn=%KxmlxQhJzUAL%#b~rgNl#`GvIja6)Pw| z+e*UgY7?3`DvM=c(B{w_KUo(NJ&%ZQ%mOZ?Cwn|{^IwSF1bH4wH8U;|sI!rD%Ls`K z%rHZSWguGM4RQKU6!us@yjOy(PMJtZ4t2(fiRFXS4yCkD7EDpQ3|M(oi+ks0ScrmS zt7h$KE##T^UCq<<0E1U7o!Yos@y0x6z~k-G`O@Hm@T(0s?Q>d!X`AD;SZx2@AIe(e z%vf2vom`N!Mt{k0sH44$rltugBr_E5A1yZ~Qps+pYqjl530Z!l>5sXTbE-v6 z$m+0>G}pcGOI&-AHrHM|#joFABshF*6P@fO9U}0nu5OZEBKyZzxzmF-K2nkm{|Q^O By66A^ literal 0 HcmV?d00001 diff --git a/images/account_bar_background.png b/images/account_bar_background.png new file mode 100644 index 0000000000000000000000000000000000000000..20b7ee0b7ce0d70ac1ea313e3de24522b4ebb543 GIT binary patch literal 8854 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 literal 0 HcmV?d00001 diff --git a/images/account_icon2.png b/images/account_icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb4d6e3c0237ab4e23bff9753a2a1be062e4989 GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^AAtA-2OE&QR+9q~;4JWnEM{Qf76xHPhFNnYfP#$0 zLGDfr>(0r%1aer?9eo`c7&i8E|4C$JU|`Dgba4!+V0?Skk@v8Jz<~p~Q-dt{{)T9s zv~jjP`0z3h`|0&tuh}|Ws&3F>be_?m=yO0oErCPWpoLT75DQNtQ=7p+3BQ?fcJB51 zgmAtAbp^5Eu_5`!t@pnrzdao^;YX~?sTjd;7{A)GlwJKA6AVm=44$rjF6*2UngDde B$`Akm literal 0 HcmV?d00001 diff --git a/images/account_icon3.png b/images/account_icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..a7358971b32320ba00a3ddd5997dce1241c37cf5 GIT binary patch literal 727 zcmeAS@N?(olHy`uVBq!ia0vp^AAtA-2OE&QR+9q~;4JWnEM{Qf76xHPhFNnYfP#$0 zLGDfr>(0r%1aer?9eo`c7&i8E|4C$JU|`Deba4!+V0?RZqhPaxz<~ps+b?uZ&S$7v zQnSL@ez$GLm&j~eW|dm@6G8?poDzpvcoLb~3>ckfG${HU5Kv3t5FRMuzMFU6+p(8D z9avWo8y?neYyY0lzA>G75QH4DZl-qBZV=bn!F-v;;z=1W9Wr>j`njxgN@xNA;L^sr literal 0 HcmV?d00001 diff --git a/images/account_icon4.png b/images/account_icon4.png new file mode 100644 index 0000000000000000000000000000000000000000..43905673d8f433485b39c7ced08794a4b8bfee4e GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^AAtA-2OE&QR+9q~;4JWnEM{Qf76xHPhFNnYfP#$0 zLGDfr>(0r%1aer?9eo`c7&i8E|4C$JU|`Diba4!+V0?Skk@v8Jz<~p~Q}g$;FFYE2 zLvbogyT7rF&i-pr-x)mLGj3wxNn~m>V050*py+czKrMko*r0_|;?O_|Z%8)#{(mm> z?xKNq2ysCod-$5&{p=glnFmYw5$9~GM(_sqL#(Xsc>zM6z=X))>FVdQ&MBb@0QX_U A%m4rY literal 0 HcmV?d00001 diff --git a/images/american_express.png b/images/american_express.png new file mode 100644 index 0000000000000000000000000000000000000000..88e88ffce3260dd5f6138ee5b08b2ee669c4e121 GIT binary patch literal 2892 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∾Z9(R7QDGPgcxB0v6+sDx$jH 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 R5%>TA002ovPDHLkV1j&rh(-Va literal 0 HcmV?d00001 diff --git a/images/chewbacca.png b/images/chewbacca.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6957f278daf2cda154513c6405c2a5787726cb GIT binary patch literal 3248 zcmV;h3{UfkP)Z+Rs#5Wz>N71# zQ(63ILQ{Nu&UnY(*X+#fj@NgVxzdrNoqNx{_k45Dx#uxt)he~AO>JsZo7%FxHJi;} zu$O4IIZWCHr%4llzpvX(+S~B=9iVr^^b4m^^E0Ped(&yuhU{i-tF2VO*Iv5!8>$3l zXpS=ddJwW3=nl{$Ad&|C!C}_E>@aE%It+%VROyO630t>*)^5^N1M! zyG@z3RSE!b&BOOreW=(nas4A28)pUg6 zKUzsH5BHIv{kSB-V&4&mg&m7L(lqk#fk*$W^1*;ReYz?Gg?TOLXX(mtKMAxp5~o?m z+uvELBY~EqY+r6%+JG!Lj;9q52!z0YBPSpnP4#t>&I&_ZUw1_bnd*1N^_K+@a2geT zO6+ExL9A*);kK6-i3SAe@?bCVRGSz3bssj9*)zQf`z8aV1Lha23Y}(6uaa$tsDR

Ja_R?0O-L8aCi6@!IePyVhdN39pPl$o}l6m+> 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 literal 0 HcmV?d00001 diff --git a/images/discover.png b/images/discover.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc0f8bda9b4f9796dccab8428cf57dce468dc22 GIT binary patch literal 3944 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 YA5VE2mKtu1AN>0o>!VSXXWXLy10N{lumAu6 literal 0 HcmV?d00001 diff --git a/images/discover_logo.png b/images/discover_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c2b62367f181eaead5f7662e3508e7116b2866 GIT binary patch literal 2385 zcmV-X39j~uP)I?NeRT^wuS~jP+Nr3CKH5nvh5jYZqwmm~wDa-7^rSx4 zkO=MvA9lUGEtWysqmdJLCS7Af|Cllg?Kh@xU2!5=yUfjGAM~MjF$`mZ5ThMb*O&(_ z+Sx9Y*BbNVI*`7bJW?jD5Y%Y3?ilTjR2C9}vS6x+ys0Q9#6Qu%iT<7FmzwhPb8XTW zw1VCK2Ib&XKM|!FNJD0z{h%~pE+G#T*d?fs=3&xcx*GCBY>T1)!8~Z7ZJ^9@lAukZ z@3zCInwgfGKJ$qtxC$b{Wt1n&{;+)fHK4%u?^R%aGQr%pcIJ@%Kb{t(F((HdMrvZT z11vYRhd-M6?yxXC^l1XA@$_hMAjl|dV=5Ch!C-_I4$Pm5Q)uEobU@#@<@A>S?@Xxk z--WW|_!-j-&QU~KiyTNA!ZZTaMN5H;xiczSfv$vXG-KU>b>28AlU~Eo0ToJ*^42kB z;5cJ;aMWB1j(r!5MEbd)z-o<)o`Z(8F|7zzo-*{kHxK}{8cBJw#A;#6djVxJB_9fG zzmNmaIaqz5wl}^E-1Z9=cuMs1+k-<{m?3r$2(*TFi(#Mvu^Oo(SQDeQ38HC?(Ay9A z))RSa3@$7tW1v7CoQuau1Cto2(jeQiPdy&64DdzBoIHzwmBXr6dZY%%W;)<9$$zMb3L_Cmxe?X@lKm{`mK4q56BwonHz)8I|`|t zG7MTl*<(t0n=4>s#O|BZN2Txqd9pM7?&0Vuoq}($OYOV)g*?(eJU}9fZ85PRe-^T7 zOt%Fjq1j;`?f6c3zt1JWL!cbN_FQn=hYp{F{2Is26b1hFbuK#VC4<|kJz2UrW2odl zF<}Gp45J|p--P!HtVflWG1ZL8LJRMu0Xzp9mW#jLe*(4fRp9UXDA~6s0V@(I_+?f* zr7fmeprxs41kEtolZ_gA3-O>W4$_iJ$fr4xW^TZ4IW-|mw16e~ec`2E7CXBThP;va z88c#_nfGUR2yHL42S-c+Y0%ERjkx3s-dX+8;C~-W#HPqX5T=n!g+#I2=N=?eO9}Yg>O#@kB8)`^T^2% zGNCB2`&muAb-0#@4Qo`cbgAOdY;A9877;;(e1j<1vJMm&Jp}&0CPqTx-aH zVnU4e;Cdxw+vha!L&5haNy|33y(8H!6oOb}SVSHq>g?6s`gny55cm$c z6d>d*aRoCVZ843-h8}(o)|KwAxzP}gdnk8piUzwxq1mkgd!KUGdry3a#Iq6}g_uJ; z$x%^*yiN7EALxF8>BpP?~e# zJ0=%yrp~bPna|W%?NGSO^cjU?F0yFI%O^wgubG-@$~G>hg_ndt+xYRKg=k*Xoh_C@b|L1vLT(3D5Q#HP_l$MGe^@Qok_heKS$nd05A$;eI7b^f-P{4~ z{-C7t#5cvg((*Xnq41QxbNKb2!{d72nFpfXIV`Cmvkji69?c?ABO-yaoMXyFUH{9R%E)?#jQ300000NkvXXu0mjf DitLH2 literal 0 HcmV?d00001 diff --git a/images/email_login.png b/images/email_login.png new file mode 100644 index 0000000000000000000000000000000000000000..33d805f8d7e9b4228e231acba34fb6c68e2cba67 GIT binary patch literal 3750 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 Qx&QzG07*qoM6N<$f`LH*DF6Tf literal 0 HcmV?d00001 diff --git a/images/empty.png b/images/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..2da4de41c33d2b21988a2871e78b3d51d5371038 GIT binary patch literal 5010 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 literal 0 HcmV?d00001 diff --git a/images/empty_comment.png b/images/empty_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..87fa726a96743745db86274fd2cf65aa00d47373 GIT binary patch literal 2266 zcma);dpOe#8^?dknUOP7PHPpy9Oe{ZMviG>IZVvT9CLca9L88g&PmUrGN;L+99B7v zp%inf6h%?UL!n{_50B@%-uI99zxTSY`~Lj-{pWMt*EbXGY%40PAPfM2sJ)%_xqV*x zcLn+PZ^V}(w|(&A9c`_Fy?=+ssxAZo!906wq#N|{5YSoC})G)w-FR|q7|CBF2cSBO4k|9@rd zc8hc|T>~>}C80Wvo5ay{LmPhj#|8|IDSI>TK_12C#1h__55tFJ!&bJqcl77)oVu6_ z(+ZtgX?SHc+FcR-da#DhROlhKWM(Yi7gtKpjPmQ9vU#avXTFIH^+7vRJ_E zlEbCqgWaJQsg~G-is)ob(T0N8zZlT6pgmr6pxsHAeA_HH%v+YTAP07<*5_0@)Ik^7 zH=`C@Ts&Grsi|&m9zTH~9UmZEEgR8iFctw7QC)E`f79Mr7N1pwI;biGuPrD{0Vx~7 zv9fn!f6(HOyp3m7C`}4~P3tv2u`~I3A`C;D_ME=sEBG)KZK-?KYQTWg__Z&jYsed6)#ctn`(t= zCwFaD-~e1X0W=cO>vVkNCakd+(a&(KS{5wtKqks;WxkMv5-&C9@?EH`l@VsP2@ynm%CkXy5;B`5(z9AIC=?c77Y7&LiadZVss zv@>3onoKBQRxgmZN_PAE;_NJLZk`whh-TW-tAT5FdS^XSEL9%aZaORU^RO{wxvgoD z7XmZx33Iftt{X)%O=TrXw{!Z;m)8ZS#HfP+*%k=SRrz4Vm<>7VFJmeaRTNOADw|KE z>GtBTxX|$Q15QWPlo4re94^Bq<@#;$@tgQUA05)E$uxeGbdRp~ck<8?u{>IGA&n)T z*ukuY;xMBeYBo}gulC2Kpp2BNvwWSv2qLTURis70x7zk#%%=zQJACXpBtlVj{d?hs zTSBWJ{n8FR+4=Z(Y_Fk$*&duS@^}!JWZYs{gH%+&va226W*rD!y8F2t<)wj0*Su$RDw4}L1R`C4=Zm6E9ddm^RoHGmGNJDLtm|q zwf(`@Cy0MGFzU#8aNXMJ0l%LT*&;yb1KRgd(jrs)$PohA@63c)w>xO|fQORnra`rV zr*0J3Z|yc#C$QDkOHvmPPDy2v9(sO{v9q@_;|YK$g?evI{_>>OKvGa(9-g;Io13Hk-x6)q4CH$W0HA+9Qf=A=CewCtDD;v=484j7rj<%cl4p2h(zS-e2Lkm0T=!-qag|%AR&3lwMK}`^v~tD9v-rw$e%l)z~RrFyfxB;pB2|+w7)ODQE5d5@9y6PZgD) z-V6@P;QR-6oXD$(CUXp5rIbukl-|)$l@$=c(y;yIQMgjMi~J)qvUk4&78|2ena=z} z&N;+gg0OwQu}$2Dnqn9|eKU!#u;_rG8|3C#CMc+#Ol>26@DCHofN`k+_X410c zFZNEYJuzP|{Nfu#IuTLTBhMK=Yvy~h!na5L+F-_UVbPW6UZE`4Yr=)9=HV+-fOmVs z1rHChNmIZ&w#z?KYJP2xZu^l$Lrs(FWLyHB9qok*Rm;%#OHO%;u!(cGuM~ZNKi!kA z_*EB9Qq0~DXJ#GNWF7ADl-q59bw`0syqi`P$fbu*(st`R&43Y&?!Ufzv@%77q%fE2z8#;RZs=$z;o~oMqp469Z8djWa97eas}BrObN z9=}PB?+!!KpMtc6+-jjnl8^UUr(q?A>r}&;qBHxi`x{6zPlRizI9@d2n`D|#Y5lL3 z|0}6Zr;GFPHw|h?sD7@4D9->~4811nn*F<6*H9D3l!xZ7m{7qc9&H=GPQ+~=a&v1# zSl*JOV9d14CnF%NvdxWjj)PDe%2Px42 literal 0 HcmV?d00001 diff --git a/images/facebook_circle.png b/images/facebook_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b7d373c42482141968934050610d3bc1f35cfa GIT binary patch literal 1721 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 literal 0 HcmV?d00001 diff --git a/images/google_american_express.png b/images/google_american_express.png new file mode 100644 index 0000000000000000000000000000000000000000..8da9dce63f11e6d9cfd3633cb6e864cf642c9b06 GIT binary patch literal 2596 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 IM6N<$f=x?n2LJ#7 literal 0 HcmV?d00001 diff --git a/images/google_visa.png b/images/google_visa.png new file mode 100644 index 0000000000000000000000000000000000000000..90f119823f02354091a253888347f775cb03826b GIT binary patch literal 2519 zcmV;|2`Ki7P)Px;kx4{BRCodHTzPC%#~J^z3rREP5fr_d~73%R91PP(kBB~()f+{(v4U|(Hfnu-=7-Mg2GzF! zoAugDjAQS6c6X%Nd2jCd{bs)Jo0;7OhFt*#hsZx9FA{!AF<^`tYsMVPXm*UoJq9GjtCq3lx3g9J?r^hD3xFXQT1hC9cID-&S4Qe;h>|+EH z1Q0 z@I9L8zbVNl;FH042MA;>#_)JBOom-m(B%)}uPtu8fA=8m9 z+ibfP^OBu-)|DjBR(Q3zNIBQFKf2pcZn zLc1@Z_j|^Krr8P8#6`__RX7%PBf0uELWO-$0v0KX-nn^qMuN|?$TS3$6)ITtoPv-? zg)7&G*&FX5snU(VxjS*5cDOUunMMgOFDJV_naoMntwGw^k_57^dw`EVd9n#v^l~kn z8O6}F;5axMmbfkd`XjtOE#t^P^;t|qz|UTz#Tapf!%MTH8~D$|h{!SU$X)Uaq!+&g zEqb#sMqZ9mtO|PXeV!m78lM#l2>*yl%zLay{Q^B-BYm`>7a=lFwb1x>x)!)#b7e(0 zZ`iwObbvH)SVBZN+Dpk}h={1kd5mgjaw?rzEv6yh(+hNv79kM%^dM(8kW2naPPIB< zvD?VIMtRjriX_Sjp&{h!kBT+!HDbudb%I;2`%J@6zr)`V759tu`$hS0v!BSH(n*Vm>uV|Zv90xmX^yzd3*)ETM>q0yU) z_dFHoSWSxI^V2bJuH9GbVuD!o%G*#aNeF2}GLNFD2zq+pdDI-UOuQ3JBZBU^1^#_Q zgK7=oltLcT=dkqSe>(xU-_#M%2~14FyOucUoU?V#2n5vD}Yau z|8$hh&axM9z%!4QfeO2{OBKw0b20p14q~9OYn-U5cz)e`NY0rLE%4RZk)m4B@x|ZA z5Le@@b_%kw(0z9b>YY%Pw^~&+mMuU^ehL)*G?a+3IBiH@ItTvFA$VH)o>;eq^v1lZ zJt$cI7VQm&MGqHX@O{0lxK;lSnXO-A+di>{$xSpB0erLKZ|RXDN41f3)bCg5eBa`< zB4b4XlAlY5<`2=4MF4^>1K6UpIIM8wr66-v5$67KG13-iLFp@mMUcI(3@c!Z&55Q@ z-^HUl|Cn3^zhQ0Me|?zWu&T)`p8Z-ep53yPtQYE9)K#Qvvk*^oA>ZRgpqI`qXr=H9 zv89ta>aszE=q5~1yf+OFcMa^`l|+yo9XIN6_23({Dn{NTOkS@iR+A|S;GyJxe;x{} z7s*jEsL@X0dr96d%MlRhOjKkxn)z&*I{IFR?`jdQeeiSm`psj0>f}-FJ;v%V3P0#zvc(0EWhqmx?)WEI|75d?{)K zi5&K0k-@7%k>?kH&pn9tqmB6TWRuht#=;!Cb<-1|cb%1Q#>yh3EqVq?Imu8-@$xKZ z$2x%(apL>Yzvk#=6(94@OoHhjL04ii1C1od*cfp!!mwG_+g%IfWz}GP} zEkM`D!r`$#(=MPVDH|&5*%6qVPI@Fo1oPo<2P^KEaRgIC@U+I>488%)YjIDnwlC> zUtcfQuU{XoM{nck(W7Aknwy)2s;Z;%=y?qYjU|9YP#BygOO{Ar)~#D7<49D9S+i!1 zNx+&lYh)gu&nK2HT^bY6;^JZv3Wdb&+qcE()2C&bs;a7(`QuH1;Y#@W_3Jo){ydEv z*sx*4h_J4%4t;%N-+-MxdlqiD8+N;0mgo148#mGk_3-(StcX6gY}rD$n<@?+I)uZA z56kGSTes@TrU(t64FrgsnLJBbFLZWx%6C$(;l4$SAVN-*mzRqZCr$`WqaP$acKi12 z3zs3qEV{b7WD1L{?Cfk23r||CB+qstYyoVg-zG$>go|~ z7(|9S2w>B&rKLrJcI?=(QNTnKP*PGNMG9Lux;t~`jGzshEPL?aK^fi9&@ielQtmR1 z6!)mKc#|;g?*nMl1yZn}l>j1;@S9$4+7mFn;2zyu!}kHByY&ARlOVugz7qtPfB^G- zUCdxm;@Er}uYiU)HkfE?Bmxa=1@S+)CjPi}Brx%K3;%H|A2%K%pGTg5znMxt;ie7& h7Wv1>|Cs!P{{cdtE(|xXbeI4D002ovPDHLkV1nu_%US>c literal 0 HcmV?d00001 diff --git a/images/icons/icon1.png b/images/icons/icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..50ebb675ccee37c85a677c8a5ef44eed98f40ed2 GIT binary patch literal 16713 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 G3j8mI6Gq_x literal 0 HcmV?d00001 diff --git a/images/icons/icon3.png b/images/icons/icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..249fde288b4fa843edb554e92edd9e8688239572 GIT binary patch literal 2331 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 BOI-i} literal 0 HcmV?d00001 diff --git a/images/icons/icon6.png b/images/icons/icon6.png new file mode 100644 index 0000000000000000000000000000000000000000..35b049333e90d26bf38e70ebfb7697f84e10a308 GIT binary patch literal 10608 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 literal 0 HcmV?d00001 diff --git a/images/instagram_circle.png b/images/instagram_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..969dd178d8e9c3f7e5890c1e2fcc748a93c63b23 GIT binary patch literal 1775 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 EA7Sdn!~g&Q literal 0 HcmV?d00001 diff --git a/images/jcb_logo.png b/images/jcb_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c76b9b7666135d617f0976a3fb0ed887580771bd GIT binary patch literal 3940 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 literal 0 HcmV?d00001 diff --git a/images/landscape.json b/images/landscape.json new file mode 100644 index 00000000..c417c3a1 --- /dev/null +++ b/images/landscape.json @@ -0,0 +1 @@ +{"v":"5.6.3","fr":60,"ip":0,"op":240,"w":1600,"h":1200,"nm":"风景","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":720,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":826.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":960}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":720,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":840,"s":[100,100,100],"e":[0,0,100]},{"t":960}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[50,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":720,"op":960,"st":720,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"形状图层 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":480,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":586.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":720}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":480,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":600,"s":[100,100,100],"e":[0,0,100]},{"t":720}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[50,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":480,"op":720,"st":480,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"形状图层 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":240,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":346.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":480}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":240,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":360,"s":[100,100,100],"e":[0,0,100]},{"t":480}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[50,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":240,"op":480,"st":240,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":0,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":106.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":240}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":120,"s":[100,100,100],"e":[0,0,100]},{"t":240}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[50,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":720,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":826.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":960}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":720,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":840,"s":[100,100,100],"e":[0,0,100]},{"t":960}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[26,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":720,"op":960,"st":720,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"形状图层 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":480,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":586.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":720}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":480,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":600,"s":[100,100,100],"e":[0,0,100]},{"t":720}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[26,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":480,"op":720,"st":480,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"形状图层 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":240,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":346.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":480}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":240,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":360,"s":[100,100,100],"e":[0,0,100]},{"t":480}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[26,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":240,"op":480,"st":240,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"形状图层 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.809},"o":{"x":0.5,"y":0},"t":0,"s":[1035.468,572.84,0],"e":[1011.468,558.09,0],"to":[-4,-2.458,0],"ti":[0.127,11.075,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.151},"t":106.062,"s":[1011.468,558.09,0],"e":[1049.218,531.09,0],"to":[-0.134,-11.707,0],"ti":[-12.292,10.25,0]},{"t":240}],"ix":2},"a":{"a":0,"k":[233.468,-22.41,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":120,"s":[100,100,100],"e":[0,0,100]},{"t":240}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[26,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":137,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.093,-32.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hua2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":240}],"ix":10},"p":{"a":0,"k":[21,21,0],"ix":2},"a":{"a":0,"k":[20.617,20.617,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-5.523],[5.523,0],[0,5.523],[-5.523,0]],"o":[[0,5.523],[-5.523,0],[0,-5.523],[5.523,0]],"v":[[10,0],[0,10],[-10,0],[0,-10]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.925,0.732999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.617,20.617],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.781,-0.781],[0,0],[-0.53,0],[0,0],[0,-1.105],[0,0],[-0.375,-0.375],[0,0],[0.781,-0.781],[0,0],[0,-0.53],[0,0],[1.105,0],[0,0],[0.375,-0.375],[0,0],[0.781,0.781],[0,0],[0.53,0],[0,0],[0,1.104],[0,0],[0.375,0.375],[0,0],[-0.781,0.781],[0,0],[0,0.53],[0,0],[-1.105,0],[0,0],[-0.375,0.375],[0,0]],"o":[[0,0],[0.375,0.375],[0,0],[1.105,0],[0,0],[0,0.53],[0,0],[0.781,0.781],[0,0],[-0.375,0.375],[0,0],[0,1.104],[0,0],[-0.53,0],[0,0],[-0.781,0.781],[0,0],[-0.375,-0.375],[0,0],[-1.105,0],[0,0],[0,-0.53],[0,0],[-0.781,-0.781],[0,0],[0.375,-0.375],[0,0],[0,-1.105],[0,0],[0.53,0],[0,0],[0.781,-0.781]],"v":[[1.414,-19.586],[5.565,-15.435],[6.979,-14.849],[12.849,-14.849],[14.849,-12.849],[14.849,-6.979],[15.435,-5.565],[19.586,-1.414],[19.586,1.414],[15.435,5.565],[14.849,6.979],[14.849,12.85],[12.849,14.85],[6.979,14.85],[5.565,15.435],[1.414,19.586],[-1.414,19.586],[-5.565,15.435],[-6.979,14.85],[-12.849,14.85],[-14.849,12.85],[-14.849,6.979],[-15.435,5.565],[-19.586,1.414],[-19.586,-1.414],[-15.435,-5.565],[-14.849,-6.979],[-14.849,-12.849],[-12.849,-14.849],[-6.979,-14.849],[-5.565,-15.435],[-1.414,-19.586]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490000017952,0.313999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.617,20.617],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“图层 25”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[21,44.5,0],"ix":2},"a":{"a":0,"k":[2.25,22.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-22.5],[2,-22.5],[2,22.5],[-2,22.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.25,22.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hua1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":240}],"ix":10},"p":{"a":0,"k":[32,32,0],"ix":2},"a":{"a":0,"k":[31.984,31.983,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.732],[7.732,0],[0,7.732],[-7.732,0]],"o":[[0,7.732],[-7.732,0],[0,-7.732],[7.732,0]],"v":[[14,0],[0,14],[-14,0],[0,-14]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.885999971278,0.732999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.984,31.983],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.562,-1.562],[0,0],[-1.061,0],[0,0],[0,-2.209],[0,0],[-0.75,-0.75],[0,0],[1.562,-1.563],[0,0],[0,-1.061],[0,0],[2.209,0],[0,0],[0.75,-0.75],[0,0],[1.562,1.562],[0,0],[1.061,0],[0,0],[0,2.209],[0,0],[0.75,0.75],[0,0],[-1.563,1.562],[0,0],[0,1.061],[0,0],[-2.209,0],[0,0],[-0.75,0.75],[0,0]],"o":[[0,0],[0.75,0.75],[0,0],[2.209,0],[0,0],[0,1.061],[0,0],[1.562,1.562],[0,0],[-0.75,0.75],[0,0],[0,2.209],[0,0],[-1.061,0],[0,0],[-1.562,1.562],[0,0],[-0.75,-0.75],[0,0],[-2.209,0],[0,0],[0,-1.061],[0,0],[-1.563,-1.563],[0,0],[0.75,-0.75],[0,0],[0,-2.209],[0,0],[1.061,0],[0,0],[1.562,-1.562]],"v":[[2.829,-30.172],[8.495,-24.506],[11.323,-23.335],[19.335,-23.335],[23.335,-19.335],[23.335,-11.322],[24.506,-8.495],[30.172,-2.829],[30.172,2.828],[24.506,8.494],[23.335,11.322],[23.335,19.335],[19.335,23.335],[11.323,23.335],[8.495,24.505],[2.829,30.171],[-2.828,30.171],[-8.494,24.505],[-11.322,23.335],[-19.334,23.335],[-23.334,19.335],[-23.334,11.322],[-24.505,8.494],[-30.171,2.828],[-30.171,-2.829],[-24.505,-8.495],[-23.334,-11.322],[-23.334,-19.335],[-19.334,-23.335],[-11.322,-23.335],[-8.494,-24.506],[-2.828,-30.172]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.722000002394,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.984,31.984],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“图层 26”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[32,65,0],"ix":2},"a":{"a":0,"k":[2.25,26.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-26],[2,-26],[2,26],[-2,26]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.25,26.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“图层 15”轮廓 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,102.829,0],"ix":2},"a":{"a":0,"k":[68.299,103.079,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[37.583,0],[0,0],[0,-37.583],[0,0],[-37.583,0],[0,37.582],[0,0]],"o":[[0,0],[-37.583,0],[0,0],[0,37.582],[37.583,0],[0,0],[0,-37.583]],"v":[[0,-102.829],[0,-102.829],[-68.049,-34.78],[-68.049,34.781],[0,102.829],[68.049,34.781],[68.049,-34.78]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.442999985639,0.685999971278,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.299,103.079],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“图层 16”轮廓 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,235.525,0],"ix":2},"a":{"a":0,"k":[8.567,43.725,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.317,43.475],[-8.317,43.475],[-8.317,-43.475],[8.317,-43.475]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.567,43.725],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“图层 17”轮廓 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,136,0],"ix":2},"a":{"a":0,"k":[90.25,136.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[49.706,0],[0,0],[0,-49.706],[0,0],[-49.706,0],[0,49.706],[0,0]],"o":[[0,0],[-49.706,0],[0,0],[0,49.706],[49.706,0],[0,0],[0,-49.706]],"v":[[0,-136],[0,-136],[-90,-46],[-90,46],[0,136],[90,46],[90,-46]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.25,136.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“图层 18”轮廓 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,311.5,0],"ix":2},"a":{"a":0,"k":[11.25,57.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11,57.5],[-11,57.5],[-11,-57.5],[11,-57.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.25,57.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“图层 5”轮廓","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":165,"s":[100],"e":[0]},{"t":225}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[1068.817,461.443,0],"e":[972.317,419.443,0],"to":[-16.083,-7,0],"ti":[16.083,7,0]},{"t":225}],"ix":2},"a":{"a":0,"k":[15.91,12.443,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[200,200,100],"e":[140,140,100]},{"t":225}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}],"e":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}],"e":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}],"e":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}],"e":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}],"e":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}],"e":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}],"e":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}],"e":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}],"e":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}],"e":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}],"e":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}],"e":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}],"e":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":195,"s":[{"i":[[0,0],[-2.379,2.295],[-0.395,2.328]],"o":[[0,0],[1.181,-1.139],[0,0]],"v":[[-2.975,4.943],[2.083,2.015],[5.019,-2.771]],"c":false}],"e":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[0,0],[-1.962,0.774],[-1.876,2.278]],"o":[[0,0],[2.088,-0.824],[0,0]],"v":[[-2.975,4.943],[0.488,3.905],[7.063,-0.6]],"c":false}],"e":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":224,"s":[{"i":[[0,0],[-1.362,1.274],[-3.009,1.116]],"o":[[0,0],[1.45,-1.356],[0,0]],"v":[[-2.975,4.943],[0.622,0.304],[5.155,-2.627]],"c":false}],"e":[{"i":[[0,0],[-0.676,1.845],[-3.067,2.197]],"o":[[0,0],[0.72,-1.964],[0,0]],"v":[[-2.975,4.943],[-2.298,1.778],[2.975,-4.943]],"c":false}]},{"t":240}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[21.344,12.443],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}],"e":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}],"e":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}],"e":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}],"e":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}],"e":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}],"e":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}],"e":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}],"e":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}],"e":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}],"e":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}],"e":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}],"e":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}],"e":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":195,"s":[{"i":[[0,0],[3.804,0.403],[1.973,1.059]],"o":[[0,0],[-1.501,-0.159],[0,0]],"v":[[5.435,2.175],[-0.459,2.218],[-5.69,0.855]],"c":false}],"e":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[0,0],[2.097,-0.435],[3.495,0.46]],"o":[[0,0],[-1.924,0.399],[0,0]],"v":[[5.435,2.175],[2.229,3.208],[-5.945,3.409]],"c":false}],"e":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":224,"s":[{"i":[[0,0],[2.044,0.165],[3.127,-0.932]],"o":[[0,0],[-1.875,-0.151],[0,0]],"v":[[5.435,2.175],[0.257,0.595],[-5.741,1.366]],"c":false}],"e":[{"i":[[0,0],[1.964,1.065],[3.494,-0.227]],"o":[[0,0],[-1.802,-0.977],[0,0]],"v":[[5.435,2.175],[2.5,-0.073],[-5.435,-1.7]],"c":false}]},{"t":240}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[12.935,15.211],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“图层 6”轮廓","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[100],"e":[0]},{"t":240}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[1162.317,446.944,0],"e":[1045.817,392.444,0],"to":[-19.417,-9.083,0],"ti":[19.417,9.083,0]},{"t":240}],"ix":2},"a":{"a":0,"k":[21.509,16.765,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[200,200,100],"e":[140,140,100]},{"t":240}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-14,"s":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}],"e":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}],"e":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}],"e":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}],"e":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}],"e":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}],"e":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76,"s":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}],"e":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}],"e":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}],"e":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}],"e":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}],"e":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}],"e":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}],"e":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181,"s":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}],"e":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":196,"s":[{"i":[[0,0],[-3.062,1.236],[-1.634,3.228]],"o":[[0,0],[2.956,-1.194],[0,0]],"v":[[-4.072,6.765],[1.66,5.151],[9.572,-1.265]],"c":false}],"e":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[0,0],[-2.133,1.931],[-4.031,1.646]],"o":[[0,0],[2.06,-1.865],[0,0]],"v":[[-4.072,6.765],[0.251,0.897],[7.005,-3.832]],"c":false}],"e":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":226,"s":[{"i":[[0,0],[-1.073,2.725],[-4,2.865]],"o":[[0,0],[1.036,-2.632],[0,0]],"v":[[-4.072,6.765],[-2.999,2.047],[4.072,-6.765]],"c":false}],"e":[{"i":[[0,0],[-3.3,3.273],[-0.327,2.821]],"o":[[0,0],[1.581,-1.568],[0,0]],"v":[[-4.072,6.765],[3.337,3.149],[6.822,-4.015]],"c":false}]},{"t":241}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[28.947,16.765],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-14,"s":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}],"e":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}],"e":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}],"e":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}],"e":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}],"e":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}],"e":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76,"s":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}],"e":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}],"e":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}],"e":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}],"e":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}],"e":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}],"e":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}],"e":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181,"s":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}],"e":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":196,"s":[{"i":[[0,0],[2.649,-0.831],[4.695,0.687]],"o":[[0,0],[-2.766,0.867],[0,0]],"v":[[7.438,2.977],[3.249,4.775],[-8.188,5.674]],"c":false}],"e":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[0,0],[2.516,0.201],[3.699,-1.792]],"o":[[0,0],[-2.627,-0.21],[0,0]],"v":[[7.438,2.977],[1.005,1.097],[-7.837,1.941]],"c":false}],"e":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":226,"s":[{"i":[[0,0],[2.363,1.379],[5.105,-0.333]],"o":[[0,0],[-2.468,-1.44],[0,0]],"v":[[7.438,2.977],[3.906,0.173],[-7.438,-2.326]],"c":false}],"e":[{"i":[[0,0],[4.776,0.395],[2.567,1.844]],"o":[[0,0],[-2.181,-0.18],[0,0]],"v":[[7.438,2.977],[-0.004,4.132],[-7.812,1.674]],"c":false}]},{"t":241}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[17.438,20.553],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-210,"op":390,"st":-210,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"预合成 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-180,"op":420,"st":-180,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-150,"op":450,"st":-150,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"预合成 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-120,"op":480,"st":-120,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-90,"op":510,"st":-90,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"预合成 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-60,"op":540,"st":-60,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":-30,"op":570,"st":-30,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"预合成 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,600,0],"ix":2},"a":{"a":0,"k":[800,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1600,"h":1200,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"内 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":208,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":215.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":223,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":230.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":238,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":245.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":253,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":260.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":268}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":210,"op":240,"st":208,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"内 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":148}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":120,"st":88,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"内 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":185.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":193,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":200.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":208,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":215.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":223,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":230.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":238}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":210,"st":178,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"内 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":118}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":90,"st":58,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"内 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":185.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":193,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":200.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":208}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":150,"op":180,"st":148,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"内 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":88}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":60,"st":28,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"内 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":178}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":150,"st":118,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"内 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1043.1,607.393,0],"ix":2},"a":{"a":0,"k":[83.25,92.75,0],"ix":1},"s":{"a":0,"k":[13.94,13.94,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-2,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35.5,"s":[{"i":[[0,38.66],[29.833,18.583],[11.418,-0.289],[9.261,-27.477],[0,-22.26],[-45.84,0]],"o":[[0,-36],[-27.713,-17.262],[-13.167,0.333],[-7.987,23.696],[0,38.66],[45.84,0]],"v":[[84.25,32.5],[35.167,-37.333],[-39.75,-67.417],[-69.097,-29.946],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[-5.504,38.266],[11.667,18.417],[19.284,0],[13.32,-17.446],[1,-45.5],[-45.84,0]],"o":[[5.25,-36.5],[-10.909,-17.221],[-18.009,0],[-13.32,17.446],[-0.849,38.651],[45.84,0]],"v":[[83.25,31],[75,-34.667],[9,-67.833],[-27.18,-34.946],[-76.5,33],[0,92.5]],"c":true}],"e":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50.5,"s":[{"i":[[-2.843,38.555],[1.5,15.75],[19.284,0],[21.68,-15.054],[1,-45.5],[-45.84,0]],"o":[[1.333,-18.083],[-1.933,-20.293],[-18.009,0],[-18.03,12.519],[-0.849,38.651],[45.84,0]],"v":[[83.25,31.833],[82.917,-18.833],[47.333,-67.75],[-12.18,-36.613],[-79,33],[0,92.5]],"c":true}],"e":[{"i":[[0,38.66],[25,21],[19.284,0],[13.446,-22.774],[0,-26.048],[-45.84,0]],"o":[[0,-36],[-25,-21],[-15.458,0],[-14.803,25.073],[0,38.66],[45.84,0]],"v":[[83,32.5],[42,-28.333],[-1.333,-66.25],[-67.196,-25.143],[-83,32.5],[0,92.5]],"c":true}]},{"t":58}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549079446,0.819607902976,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,92.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":-2,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"外 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":217.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":225,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":232.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":240,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":247.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":255,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":262.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":270}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":210,"op":240,"st":210,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"外 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":150}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":120,"st":90,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"外 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":187.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":195,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":202.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":217.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":225,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":232.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":240}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":210,"st":180,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"外 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":120}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":90,"st":60,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"外 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":187.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":195,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":202.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":210}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":150,"op":180,"st":150,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"外 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":90}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":60,"st":30,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"外 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":180}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":150,"st":120,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"外","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042.9,602.203,0],"ix":2},"a":{"a":0,"k":[136.25,162.654,0],"ix":1},"s":{"a":0,"k":[15,15,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-41.75,14.057]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607992733,0.807843017578,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37.5,"s":[{"i":[[52,0],[-18,107],[-14,21.346],[-24,14.961],[-42.284,-43.308],[-12,-47]],"o":[[-52,0],[8,-44],[14,-21.346],[25.088,-15.638],[27,27.653],[26.539,103.945]],"v":[[2,162.404],[-126,23.403],[-87,-84.25],[-45,-158.557],[63.222,-95.028],[123,15.404]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-18,0.346],[-42.284,-43.308],[-10,-88]],"o":[[-52,0],[8,-44],[26,-26.346],[18,-0.346],[11.778,17.432],[12.888,113.41]],"v":[[2,162.404],[-124,25.403],[-48,-82.25],[13,-162.171],[91.222,-122.028],[136,16.403]],"c":true}],"e":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52.5,"s":[{"i":[[52,0],[-18,107],[-26,26.346],[-26,-6.803],[-23.778,-39.432],[-6,-24]],"o":[[-52,0],[8,-44],[26,-26.346],[26,6.803],[23.778,39.432],[22,112]],"v":[[2,162.404],[-138,17.403],[-73,-95.25],[57,-158.399],[77.222,-71.029],[120,15.403]],"c":true}],"e":[{"i":[[52,0],[0,95.901],[-31,42.346],[-30,-7.654],[-42.284,-43.308],[-18,-35]],"o":[[-52,0],[0,-31],[31,-42.346],[30,7.654],[27,27.653],[35,102]],"v":[[2,162.404],[-152,26.404],[-114,-98.25],[-9,-158.25],[34,-66.25],[118,19.403]],"c":true}]},{"t":60}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.490196108351,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.25,162.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"“图层 8”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1042,630,0],"ix":2},"a":{"a":0,"k":[30.25,8.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[-4.418,0],[0,4.418]],"o":[[0,0],[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"v":[[0,-8],[0,-8],[-8,0],[0,8],[8,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.463000009574,0.380000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,8.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[-4.418,0],[0,0],[0,4.418]],"o":[[0,0],[-4.418,0],[0,4.418],[0,0],[4.418,0],[0,-4.418]],"v":[[22,-8],[-22,-8],[-30,0],[-22,8],[22,8],[30,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.349000010771,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.25,8.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"“图层 9”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[845.778,575.5,0],"ix":2},"a":{"a":0,"k":[140.528,62.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.787,0.575],[-2.751,19.712],[-0.143,-1.161],[-24.718,-13.418],[1.032,0],[0,0]],"o":[[25.58,-18.692],[0.162,-1.159],[2.557,20.845],[0.908,0.493],[0,0],[-0.974,0]],"v":[[-37.721,42.281],[-0.327,-42.935],[1.653,-42.918],[37.6,42.226],[37.12,44.094],[-37.144,44.094]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898000021542,0.481999984442,0.172999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.971,81.156],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.096,-10.973],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-6.096,-10.973]],"v":[[-13.986,-44.426],[-69.444,55.398],[69.444,55.398],[13.986,-44.426]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.57599995931,0.263000009574,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.694,69.851],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.705,1.27],[0,0],[-3.05,0],[0,0],[-0.705,-1.27],[0,0],[3.05,0],[0,0]],"o":[[0,0],[-1.482,-2.666],[0,0],[1.452,0],[0,0],[1.482,2.666],[0,0],[-1.452,0]],"v":[[-7.834,10.442],[-17.278,-6.558],[-13.782,-12.5],[4.338,-12.5],[7.834,-10.443],[17.278,6.557],[13.782,12.5],[-4.338,12.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.57599995931,0.263000009574,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.25,54.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.526,0],[0,0],[7.055,-12.699],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-14.526,0],[0,0],[0,0],[0,0],[0,0],[-7.055,-12.699]],"v":[[47.298,-62.5],[-47.298,-62.5],[-82.264,-41.926],[-140.277,62.5],[1.389,62.5],[140.277,62.5],[82.263,-41.926]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.722000002394,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.528,62.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"xinxin3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[792,416,0],"ix":2},"a":{"a":0,"k":[9.639,9.639,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":150,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":180,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":210,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":240,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":270,"s":[25,25,100],"e":[100,100,100]},{"t":300}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.407,-1.557],[0,0],[-0.547,-0.143],[0,0],[1.557,-0.406],[0,0],[0.143,-0.547],[0,0],[0.406,1.557],[0,0],[0.547,0.143],[0,0],[-1.557,0.407],[0,0],[-0.143,0.547],[0,0]],"o":[[0,0],[0.143,0.547],[0,0],[1.557,0.407],[0,0],[-0.547,0.143],[0,0],[-0.407,1.557],[0,0],[-0.143,-0.547],[0,0],[-1.557,-0.406],[0,0],[0.547,-0.143],[0,0],[0.406,-1.557]],"v":[[1.512,-7.832],[2.589,-3.707],[3.706,-2.589],[7.832,-1.512],[7.832,1.512],[3.706,2.589],[2.589,3.707],[1.512,7.832],[-1.512,7.832],[-2.59,3.707],[-3.707,2.589],[-7.832,1.512],[-7.832,-1.512],[-3.707,-2.589],[-2.59,-3.707],[-1.512,-7.832]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.639,9.639],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"xinxin2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[829,385,0],"ix":2},"a":{"a":0,"k":[8.596,8.596,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":-16,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":44,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":74,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":104,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":134,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":164,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":194,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":224,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":254,"s":[25,25,100],"e":[100,100,100]},{"t":284}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.361,-1.384],[0,0],[-0.486,-0.127],[0,0],[1.384,-0.362],[0,0],[0.127,-0.486],[0,0],[0.362,1.384],[0,0],[0.487,0.127],[0,0],[-1.383,0.361],[0,0],[-0.126,0.486],[0,0]],"o":[[0,0],[0.127,0.486],[0,0],[1.384,0.361],[0,0],[-0.486,0.127],[0,0],[-0.361,1.384],[0,0],[-0.126,-0.486],[0,0],[-1.383,-0.362],[0,0],[0.487,-0.127],[0,0],[0.362,-1.384]],"v":[[1.344,-6.962],[2.301,-3.295],[3.295,-2.302],[6.962,-1.344],[6.962,1.344],[3.295,2.302],[2.301,3.295],[1.344,6.962],[-1.345,6.962],[-2.303,3.295],[-3.296,2.302],[-6.962,1.344],[-6.962,-1.344],[-3.296,-2.302],[-2.303,-3.295],[-1.345,-6.962]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.595,8.596],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-16,"op":584,"st":-16,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"xinxin1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[770.5,341.5,0],"ix":2},"a":{"a":0,"k":[16.942,16.942,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":-33,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":-3,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":57,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":87,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":117,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":147,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":177,"s":[25,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":207,"s":[100,100,100],"e":[25,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":237,"s":[25,25,100],"e":[100,100,100]},{"t":267}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.723,-2.768],[0,0],[-0.972,-0.254],[0,0],[2.768,-0.723],[0,0],[0.253,-0.972],[0,0],[0.723,2.768],[0,0],[0.972,0.254],[0,0],[-2.768,0.722],[0,0],[-0.253,0.973],[0,0]],"o":[[0,0],[0.253,0.973],[0,0],[2.768,0.722],[0,0],[-0.972,0.254],[0,0],[-0.723,2.768],[0,0],[-0.253,-0.972],[0,0],[-2.768,-0.723],[0,0],[0.972,-0.254],[0,0],[0.723,-2.768]],"v":[[2.688,-13.924],[4.604,-6.59],[6.589,-4.604],[13.924,-2.688],[13.924,2.688],[6.589,4.603],[4.604,6.589],[2.688,13.924],[-2.688,13.924],[-4.604,6.589],[-6.589,4.603],[-13.924,2.688],[-13.924,-2.688],[-6.589,-4.604],[-4.604,-6.59],[-2.688,-13.924]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.942,16.942],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-33,"op":567,"st":-33,"bm":0},{"ddd":0,"ind":32,"ty":0,"nm":"hua2","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":-14,"s":[8],"e":[-8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":46,"s":[-8],"e":[8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":106,"s":[8],"e":[-8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":166,"s":[-8],"e":[8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":226,"s":[8],"e":[-8]},{"t":286}],"ix":10},"p":{"a":0,"k":[538,625.75,0],"ix":2},"a":{"a":0,"k":[21,57.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":42,"h":67,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":33,"ty":0,"nm":"hua1","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":-40,"s":[8],"e":[-8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":20,"s":[-8],"e":[8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":80,"s":[8],"e":[-8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":140,"s":[-8],"e":[8]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":200,"s":[8],"e":[-8]},{"t":260}],"ix":10},"p":{"a":0,"k":[482,622.25,0],"ix":2},"a":{"a":0,"k":[32,94.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":91,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":34,"ty":0,"nm":"shu2","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":-16,"s":[4],"e":[-4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":44,"s":[-4],"e":[4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":104,"s":[4],"e":[-4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":164,"s":[-4],"e":[4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":224,"s":[4],"e":[-4]},{"t":284}],"ix":10},"p":{"a":0,"k":[674,638,0],"ix":2},"a":{"a":0,"k":[69,279,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":138,"h":279,"ip":-16,"op":584,"st":-16,"bm":0},{"ddd":0,"ind":35,"ty":0,"nm":"shu1","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":-5,"s":[4],"e":[-4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":55,"s":[-4],"e":[4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":115,"s":[4],"e":[-4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":175,"s":[-4],"e":[4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":235,"s":[4],"e":[-4]},{"t":295}],"ix":10},"p":{"a":0,"k":[594,638,0],"ix":2},"a":{"a":0,"k":[90,369,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":180,"h":369,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"“图层 20”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":0,"s":[735,913,0],"e":[805,913,0],"to":[11.667,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":120,"s":[805,913,0],"e":[735,913,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":240,"s":[735,913,0],"e":[805,913,0],"to":[0,0,0],"ti":[-11.667,0,0]},{"t":360}],"ix":2},"a":{"a":0,"k":[22.25,5.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.761,0],[0,0],[0,-2.762],[-2.761,0],[0,0],[0,2.762]],"o":[[0,0],[-2.761,0],[0,2.762],[0,0],[2.761,0],[0,-2.762]],"v":[[17,-5],[-17,-5],[-22,0],[-17,5],[17,5],[22,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.681999954523,0.925,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.25,5.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"形状图层 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[963,322.943,0],"e":[943,322.943,0],"to":[-3.333,0,0],"ti":[3.333,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":75,"s":[943,322.943,0],"e":[943,322.943,0],"to":[0,0,0],"ti":[-3.333,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":165,"s":[943,322.943,0],"e":[963,322.943,0],"to":[3.333,0,0],"ti":[-3.333,0,0]},{"t":180}],"ix":2},"a":{"a":0,"k":[110.852,-284.057,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":95,"s":[100,100,100],"e":[100,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":105,"s":[100,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":115,"s":[100,100,100],"e":[100,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":125,"s":[100,25,100],"e":[100,100,100]},{"t":135}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[14,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":208,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96003370098,0.691117410099,0.001588266854,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.852,-284.057],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[895,322.943,0],"e":[875,322.943,0],"to":[-3.333,0,0],"ti":[3.333,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":75,"s":[875,322.943,0],"e":[875,322.943,0],"to":[0,0,0],"ti":[-3.333,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":165,"s":[875,322.943,0],"e":[895,322.943,0],"to":[3.333,0,0],"ti":[-3.333,0,0]},{"t":180}],"ix":2},"a":{"a":0,"k":[110.852,-284.057,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":95,"s":[100,100,100],"e":[100,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":105,"s":[100,25,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":115,"s":[100,100,100],"e":[100,25,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":125,"s":[100,25,100],"e":[100,100,100]},{"t":135}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[14,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":208,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96003370098,0.691117410099,0.001588266854,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.852,-284.057],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"“图层 24”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[929,322,0],"ix":2},"a":{"a":0,"k":[83.25,83.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-45.84],[45.84,0],[0,45.84],[-45.84,0]],"o":[[0,45.84],[-45.84,0],[0,-45.84],[45.84,0]],"v":[[83,0],[0,83],[-83,0],[0,-83]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972999961703,0.819999964097,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.25,83.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"“图层 27”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544,636,0],"ix":2},"a":{"a":0,"k":[21.25,21.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-11.598],[11.598,0],[0,11.598],[-11.598,0]],"o":[[0,11.598],[-11.598,0],[0,-11.598],[11.598,0]],"v":[[21,0],[0,21],[-21,0],[0,-21]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.25,21.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"“图层 28”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[517,644,0],"ix":2},"a":{"a":0,"k":[21.25,21.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-11.598],[11.598,0],[0,11.598],[-11.598,0]],"o":[[0,11.598],[-11.598,0],[0,-11.598],[11.598,0]],"v":[[21,0],[0,21],[-21,0],[0,-21]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.25,21.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"“图层 29”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450,644,0],"ix":2},"a":{"a":0,"k":[21.25,21.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-11.598],[11.598,0],[0,11.598],[-11.598,0]],"o":[[0,11.598],[-11.598,0],[0,-11.598],[11.598,0]],"v":[[21,0],[0,21],[-21,0],[0,-21]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.25,21.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"“图层 30”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[482,638,0],"ix":2},"a":{"a":0,"k":[30.25,30.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-16.568],[16.568,0],[0,16.568],[-16.568,0]],"o":[[0,16.568],[-16.568,0],[0,-16.568],[16.568,0]],"v":[[30,0],[0,30],[-30,0],[0,-30]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.25,30.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"“图层 31”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,713,0],"ix":2},"a":{"a":0,"k":[485.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-27.614,0],[0,0],[0,27.614]],"o":[[0,0],[0,27.614],[0,0],[27.614,0],[0,0]],"v":[[-485,-25],[-485,-25],[-435,25],[435,25],[485,-25]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972999961703,0.819999964097,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[485.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"“图层 32”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,663,0],"ix":2},"a":{"a":0,"k":[485.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[11.046,0],[0,0],[0,-11.046],[0,0]],"o":[[0,0],[0,-11.046],[0,0],[-11.046,0],[0,0],[0,0]],"v":[[485,25],[485,-5],[465,-25],[-465,-25],[-485,-5],[-485,25]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.827000038297,0.532999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[485.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":"“图层 33”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1139,575.992,0],"ix":2},"a":{"a":0,"k":[109.25,62.257,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.804,-21.024],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-15.804,-21.024]],"v":[[-31.579,-40.984],[-109,62.008],[109,62.008],[31.579,-40.984]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.442999985639,0.685999971278,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.25,62.258],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":"“图层 34”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[551,525.247,0],"ix":2},"a":{"a":0,"k":[194.25,113.004,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[29.387,-40.445],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-29.387,-40.445]],"v":[[-59.536,-72.309],[-194,112.753],[194,112.753],[59.535,-72.309]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.74900004069,0.898000021542,0.717999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.25,113.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":48,"ty":4,"nm":"“图层 36”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[801,463.5,0],"ix":2},"a":{"a":0,"k":[349.25,174.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[192.747,0],[0,-192.748]],"o":[[0,-192.748],[-192.748,0],[0,0]],"v":[[349,174.5],[0,-174.5],[-349,174.5]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.791999966491,0.952999997606,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[349.25,174.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":49,"ty":4,"nm":"“图层 37”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[605.5,863,0],"ix":2},"a":{"a":0,"k":[63.75,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-37,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[38.5,0],[38.5,0],[63.5,-25],[-63.5,-25],[-38.5,0],[-63.5,25],[63.5,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[78.5,0],[78.5,0],[103.5,-25],[-48.5,-25],[-23.5,0],[-48.5,25],[103.5,25]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":83,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[78.5,0],[78.5,0],[103.5,-25],[-48.5,-25],[-23.5,0],[-48.5,25],[103.5,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[38.5,0],[38.5,0],[63.5,-25],[-63.5,-25],[-38.5,0],[-63.5,25],[63.5,25]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":203,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[38.5,0],[38.5,0],[63.5,-25],[-63.5,-25],[-38.5,0],[-63.5,25],[63.5,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[78.5,0],[78.5,0],[103.5,-25],[-48.5,-25],[-23.5,0],[-48.5,25],[103.5,25]],"c":true}]},{"t":323}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.611999990426,0.889999988032,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.75,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-37,"op":563,"st":-37,"bm":0},{"ddd":0,"ind":50,"ty":4,"nm":"“图层 38”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-66,"s":[875,763,0],"e":[828,763,0],"to":[-7.833,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":54,"s":[828,763,0],"e":[875,763,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":174,"s":[875,763,0],"e":[828,763,0],"to":[0,0,0],"ti":[7.833,0,0]},{"t":294}],"ix":2},"a":{"a":0,"k":[0.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-66,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[88.5,0],[88.5,0],[113.5,-25],[-113.5,-25],[-88.5,0],[-113.5,25],[113.5,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[48.5,0],[48.5,0],[73.5,-25],[-113.5,-25],[-88.5,0],[-113.5,25],[73.5,25]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":54,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[48.5,0],[48.5,0],[73.5,-25],[-113.5,-25],[-88.5,0],[-113.5,25],[73.5,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[88.5,0],[88.5,0],[113.5,-25],[-113.5,-25],[-88.5,0],[-113.5,25],[113.5,25]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":174,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[88.5,0],[88.5,0],[113.5,-25],[-113.5,-25],[-88.5,0],[-113.5,25],[113.5,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[48.5,0],[48.5,0],[73.5,-25],[-113.5,-25],[-88.5,0],[-113.5,25],[73.5,25]],"c":true}]},{"t":294}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.611999990426,0.889999988032,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.75,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-66,"op":534,"st":-66,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":"“图层 21”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-21,"s":[929,813,0],"e":[889,813,0],"to":[-6.667,0,0],"ti":[6.667,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":99,"s":[889,813,0],"e":[929,813,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":219,"s":[929,813,0],"e":[889,813,0],"to":[-6.667,0,0],"ti":[6.667,0,0]},{"t":339}],"ix":2},"a":{"a":0,"k":[0.25,5.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.762,0],[0,0],[0,-2.762],[-2.762,0],[0,0],[0,2.762]],"o":[[0,0],[-2.762,0],[0,2.762],[0,0],[2.762,0],[0,-2.762]],"v":[[56.5,-5],[-56.5,-5],[-61.5,0],[-56.5,5],[56.5,5],[61.5,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.681999954523,0.925,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.75,5.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-21,"op":579,"st":-21,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":"“图层 39”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[945,813,0],"ix":2},"a":{"a":0,"k":[221.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-21,"s":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[196,25],[-196,25],[-221,0],[-196,-25],[196,-25],[221,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[156,25],[-196,25],[-221,0],[-196,-25],[156,-25],[181,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":99,"s":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[156,25],[-196,25],[-221,0],[-196,-25],[156,-25],[181,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[196,25],[-196,25],[-221,0],[-196,-25],[196,-25],[221,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":219,"s":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[196,25],[-196,25],[-221,0],[-196,-25],[196,-25],[221,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[156,25],[-196,25],[-221,0],[-196,-25],[156,-25],[181,0]],"c":true}]},{"t":339}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.611999990426,0.889999988032,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-21,"op":579,"st":-21,"bm":0},{"ddd":0,"ind":53,"ty":4,"nm":"“图层 19”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-66,"s":[585.5,763,0],"e":[565.5,763,0],"to":[-3.333,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":54,"s":[565.5,763,0],"e":[585.5,763,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":174,"s":[585.5,763,0],"e":[565.5,763,0],"to":[0,0,0],"ti":[3.333,0,0]},{"t":294}],"ix":2},"a":{"a":0,"k":[34.75,5.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.761,0],[0,0],[0,-2.762],[-2.761,0],[0,0],[0,2.762]],"o":[[0,0],[-2.761,0],[0,2.762],[0,0],[2.761,0],[0,-2.762]],"v":[[29.5,-5],[-29.5,-5],[-34.5,0],[-29.5,5],[29.5,5],[34.5,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.681999954523,0.925,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.75,5.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-66,"op":534,"st":-66,"bm":0},{"ddd":0,"ind":54,"ty":4,"nm":"“图层 40”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-66,"s":[634,763,0],"e":[614,763,0],"to":[-3.333,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":54,"s":[614,763,0],"e":[634,763,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":174,"s":[634,763,0],"e":[614,763,0],"to":[0,0,0],"ti":[3.333,0,0]},{"t":294}],"ix":2},"a":{"a":0,"k":[158.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-66,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[133,0],[133,0],[158,-25],[-158,-25],[-133,0],[-158,25],[158,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[103,0],[103,0],[128,-25],[-158,-25],[-133,0],[-158,25],[128,25]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":54,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[103,0],[103,0],[128,-25],[-158,-25],[-133,0],[-158,25],[128,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[133,0],[133,0],[158,-25],[-158,-25],[-133,0],[-158,25],[158,25]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":174,"s":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[133,0],[133,0],[158,-25],[-158,-25],[-133,0],[-158,25],[158,25]],"c":true}],"e":[{"i":[[0,13.807],[0,0],[-13.807,0],[0,0],[0,-13.807],[13.807,0],[0,0]],"o":[[0,0],[0,-13.807],[0,0],[13.807,0],[0,13.807],[0,0],[-13.807,0]],"v":[[103,0],[103,0],[128,-25],[-158,-25],[-133,0],[-158,25],[128,25]],"c":true}]},{"t":294}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.611999990426,0.889999988032,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-66,"op":534,"st":-66,"bm":0},{"ddd":0,"ind":55,"ty":4,"nm":"“图层 41”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":0,"s":[947,913,0],"e":[1043,913,0],"to":[16,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":120,"s":[1043,913,0],"e":[947,913,0],"to":[0,0,0],"ti":[16,0,0]},{"t":240}],"ix":2},"a":{"a":0,"k":[60.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":0,"s":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.808,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.808,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[35,25],[-35,25],[-60,0],[-35,-25],[35,-25],[60,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.808,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.808,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[75,25],[-35,25],[-60,0],[-35,-25],[75,-25],[100,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":120,"s":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.808,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.808,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[75,25],[-35,25],[-60,0],[-35,-25],[75,-25],[100,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.807],[-13.808,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.808,0],[0,-13.808],[0,0],[13.808,0],[0,13.807]],"v":[[35,25],[-35,25],[-60,0],[-35,-25],[35,-25],[60,0]],"c":true}]},{"t":240}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823999980852,0.969000004787,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":56,"ty":4,"nm":"“图层 42”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-35,"s":[393,913,0],"e":[422,913,0],"to":[4.833,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":85,"s":[422,913,0],"e":[393,913,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":205,"s":[393,913,0],"e":[422,913,0],"to":[0,0,0],"ti":[-4.833,0,0]},{"t":325}],"ix":2},"a":{"a":0,"k":[39.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.807,0],[0,0],[0,13.807],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.807]],"v":[[14,25],[-14,25],[-39,0],[-14,-25],[14,-25],[39,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823999980852,0.969000004787,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-35,"op":565,"st":-35,"bm":0},{"ddd":0,"ind":57,"ty":4,"nm":"“图层 43”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":0,"s":[662.5,913,0],"e":[682.5,913,0],"to":[3.333,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":120,"s":[682.5,913,0],"e":[662.5,913,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":240,"s":[662.5,913,0],"e":[682.5,913,0],"to":[0,0,0],"ti":[-3.333,0,0]},{"t":360}],"ix":2},"a":{"a":0,"k":[170.75,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":0,"s":[{"i":[[13.808,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.808]],"v":[[145.5,25],[-145.5,25],[-170.5,0],[-145.5,-25],[145.5,-25],[170.5,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.808]],"v":[[213.5,25],[-145.5,25],[-170.5,0],[-145.5,-25],[213.5,-25],[238.5,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":120,"s":[{"i":[[13.808,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.808]],"v":[[213.5,25],[-145.5,25],[-170.5,0],[-145.5,-25],[213.5,-25],[238.5,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.808]],"v":[[145.5,25],[-145.5,25],[-170.5,0],[-145.5,-25],[145.5,-25],[170.5,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":240,"s":[{"i":[[13.808,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.808]],"v":[[145.5,25],[-145.5,25],[-170.5,0],[-145.5,-25],[145.5,-25],[170.5,0]],"c":true}],"e":[{"i":[[13.808,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.808,0],[0,13.808]],"v":[[213.5,25],[-145.5,25],[-170.5,0],[-145.5,-25],[213.5,-25],[238.5,0]],"c":true}]},{"t":360}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.611999990426,0.889999988032,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.75,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":58,"ty":4,"nm":"“图层 22”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-21,"s":[617,813,0],"e":[637,813,0],"to":[3.333,0,0],"ti":[-3.333,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":99,"s":[637,813,0],"e":[617,813,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":219,"s":[617,813,0],"e":[637,813,0],"to":[3.333,0,0],"ti":[-3.333,0,0]},{"t":339}],"ix":2},"a":{"a":0,"k":[9.25,5.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.761,0],[0,0],[0,-2.762],[-2.761,0],[0,0],[0,2.762]],"o":[[0,0],[-2.761,0],[0,2.762],[0,0],[2.761,0],[0,-2.762]],"v":[[4,-5],[-4,-5],[-9,0],[-4,5],[4,5],[9,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.681999954523,0.925,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.25,5.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-21,"op":579,"st":-21,"bm":0},{"ddd":0,"ind":59,"ty":4,"nm":"“图层 23”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-21,"s":[538,813,0],"e":[558,813,0],"to":[3.333,0,0],"ti":[-3.333,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":99,"s":[558,813,0],"e":[538,813,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":219,"s":[538,813,0],"e":[558,813,0],"to":[3.333,0,0],"ti":[-3.333,0,0]},{"t":339}],"ix":2},"a":{"a":0,"k":[43.25,5.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.761,0],[0,0],[0,-2.762],[-2.761,0],[0,0],[0,2.762]],"o":[[0,0],[-2.761,0],[0,2.762],[0,0],[2.761,0],[0,-2.762]],"v":[[38,-5],[-38,-5],[-43,0],[-38,5],[38,5],[43,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.681999954523,0.925,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.25,5.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-21,"op":579,"st":-21,"bm":0},{"ddd":0,"ind":60,"ty":4,"nm":"“图层 44”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[584,813,0],"ix":2},"a":{"a":0,"k":[202.25,25.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":-21,"s":[{"i":[[13.807,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.808]],"v":[[177,25],[-177,25],[-202,0],[-177,-25],[177,-25],[202,0]],"c":true}],"e":[{"i":[[13.807,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.808]],"v":[[177,25],[-162,25],[-187,0],[-162,-25],[177,-25],[202,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":99,"s":[{"i":[[13.807,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.808]],"v":[[177,25],[-162,25],[-187,0],[-162,-25],[177,-25],[202,0]],"c":true}],"e":[{"i":[[13.807,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.808]],"v":[[177,25],[-177,25],[-202,0],[-177,-25],[177,-25],[202,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.5,"y":0},"t":219,"s":[{"i":[[13.807,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.808]],"v":[[177,25],[-177,25],[-202,0],[-177,-25],[177,-25],[202,0]],"c":true}],"e":[{"i":[[13.807,0],[0,0],[0,13.808],[-13.807,0],[0,0],[0,-13.808]],"o":[[0,0],[-13.807,0],[0,-13.808],[0,0],[13.807,0],[0,13.808]],"v":[[177,25],[-162,25],[-187,0],[-162,-25],[177,-25],[202,0]],"c":true}]},{"t":339}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.611999990426,0.889999988032,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[202.25,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-21,"op":579,"st":-21,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/images/link_bold.png b/images/link_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..9c78e7d047d44004f47c6ad9d0b6ea6b96099a9c GIT binary patch literal 2040 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 DZO0+h literal 0 HcmV?d00001 diff --git a/images/luke_skywalker.png b/images/luke_skywalker.png new file mode 100644 index 0000000000000000000000000000000000000000..18e0b0df4f4af2c8ee211d27b017b7c32725c854 GIT binary patch literal 3413 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 literal 0 HcmV?d00001 diff --git a/images/mastercard.png b/images/mastercard.png new file mode 100644 index 0000000000000000000000000000000000000000..d14b564f9644c3129004b8d954f85468fd4de19f GIT binary patch literal 3456 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 literal 0 HcmV?d00001 diff --git a/images/option_icon_l.png b/images/option_icon_l.png new file mode 100644 index 0000000000000000000000000000000000000000..96d3860f18e82d8fcc53224a1ffa5489226e2d49 GIT binary patch literal 5245 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 F@IQLXlE1pboCsFW3)cXew zN0SO-D4~pi_pxA$ijI@ZAqozsP$;kp5>_IO#SzG4G7e9~5s9ua!d0dc%Xvyyv26X4 z0t1xsr9wz9l!#G!MP9Vzpqz?^GyS6k5%fV;EPLN3xM4UY55f_!czsDrKo;x&Lq(zw zXqh||{4?MGDJ-C`^3SA2F$zruHa9u|FT^DLWm$ZG6R$f6G1_MR3btx7ETc^pNrqJ zdhfY{<#VAg%f-RT;Pm7DuW>KA;2qLmKP)e7d{}=_4DY-YUT&@Lxds4Op>FOdY)r zxxEnl^zWjc5sh)-nRA-JA6<$}Gl6>~(% z(-~D=@7&~R2PCJoH1W>Swm8*sTO+@rQ?wu-*YO>N?Y$as;D^GEm<0B2P&j%CQSf6_ zgCS~9fmp1;`KG(vEXl<%u!w@)8hn{Ne#J$w4EX#eitN_r-M zHcXSPZAEL&-;ILWfZWU3IobO#C)S*K!b-I+ae24zhYTdJu%+0JYu_56eVLLvvX?13 zX5+hIqk+q_Ec5f5{qEG?+3>kPyI0BY$PA=4UPM?#z1!{rSPwt7E4CMfLmKL8R(+^- za?+C~g`F4)6!J-}InS%d?|P?oy`6Y@|F_q1+;vUkz$P&UKXs^4JN@#zT?s;Bu zI_`Z>nnbi;`4b72MCX-}dNOcej6;E?HF;X1n^PZrGGNwkylUf*EJ*;iNis zW1{wpQXA9Mha1pT96H%zP+ybNvTYp7N5-x!X#rOqLjmW*F+$&5t5YX-aw@7@(!9Oj5L+#JeAcS+ z5xzmyHBM7g9rUEF?mv%?%wBs_uJycUl&s{|n$X0$;)|-YN&8z~luiR}23~E_s*l$O ze*daI`>7%F3}Np;MC{6TD>I`e`w(nbSF<)IC^5q~H{_LR(j%(K&<6-8Z?+n=Ljvmn zt_cZZztH?`zQOWw2QKn)^RDZ5Rn5~n+3&c@sdR{wccCIdC+?n3F~b813mLhhyim3N OSI+bgW|aGJ)BXe4RAgHK literal 0 HcmV?d00001 diff --git a/images/paypal_logo.png b/images/paypal_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbab895f6d4f896b8fdb483738b6c1c123e7d10 GIT binary patch literal 3468 zcmV;74Ri8|P)Pqb+P;0 z&?iII)H0yFybz=DZ!80Yx}m?g+O5j07lUPB@WXf*oFD&0JT}B=%=tuUL#*RNHXN(w zUsx6f=cy@!cpgKH#+ZRB7K3a!){MdOFgQO=8N~Cn>DyaXpm-VIuw2S25%xn5$%v-j;q+m`4px4w-Dn8!ky#Tqrhon5YJcnaSBF5_#K(GV6YChIBl2_EGs{T zjKbO<_UWz<@oYa4QqOi`{jX_yu0^ogf6?$QGGXXKGEA$h2V)&)>~IE|d!vo~j0WLOdUlIdu#;SWW#G znKqaJZ;+?K4vj@U5fnbxz=$d{E$nE71&2kZ4TE@sj0W4E`x_hZK%|slSO9f7;so{WKA96>Nzz`y*%I7uR01g;IWv8JqTPqZ{;`C zM$+JCVKj?1-}M^lV5FdS1N$8j49 z5LBPrx&$K6CE0%O9lyBkgKNnfsQ&h6WSO5_%WO(l=Nf#8C}&@7qs;bo@%6NKEe{|o1uanH#@7^6?zZQ8nZ&pI!!o*J8mwE#4vh&Z6NK#00j_>p zi4d-#m$b7*y+oV{CnX0#i{GGx7w$FmpzEj76dMRlnH)EG&IvSS$a4EW!_>)(IOT<6 z!GZ;Wubh;d?lbz!7uQ|95d(b;>KD#v_Sf&hAzc71@uqZl+Ojbx9m4mTD!_9;Q2yAO z`UJl0zB;34w>ET5STo>Yp9rb_@v>`&t6k+S#^n+`j~#y#kBw>I0=&`rj(2aj;P}uH z)T6yuaHMLg^TwMC|EY$<;&n(FJCBqen zX=#hnr@E$7Vh8ris8E4;#4zt-KH$=VpEm;;jagIEVSDx&D3sUMJz2}bulCp-PVA4* z!I0}+f`b{&VZDrI(VIRD*1@T3ihAMm@gLfZhK7qb1uvcmiY{b{+SQizA^#z-p_AXJ zU4H57TIkU`q~_gZX4oxiQQXwvXTULQS)jK~Q(L4{Vi}q;h-WyaE$7J7f-FGex z$^9<^>PKx|Qv~2fPAT`_hi&t_z;o=~@)<)@dl#lDG4j_=fr0Zd^mi>CKaM*kB5-qb z-6_Hsm|TF=Mh>0ZP&khJ!1C`Lj|n`-8ZbxKEce3R@rbdH^4eXxruyO z(t@8c!ZuhgeVQu3@gF3Rs449rXsZ#rP$+n8q#~|*taky9Tcy>K*c&>=d)R@aHKp98 zjSB3ldW&(P4VK4Pn%XT`Q}hd;k2y9POB)(1tL@hg_pyPUYw-a(l;8;N@A@uEiFn?0 z1mjpQ!y^7AL`%#2DXZ=6NScbRn=VRl*q(i(#WW0-fvvVbs)l_VV7Uv#Q*QLuWMqPr zI8J{L;4|V8p}gp#_`u{A93O~!TS}bF;)kY&>YnND&aNr+8;#Lo8V2(r7btG8H0m!s zlb@b({K`gizeL9(o)R3FNB?KjvhBdrxr;gDWQ~Uwqp4<2ODuD1s&mymb_A=-xV}m) zn8c!PP`RkD{`cc1eyKnM4rVl>3&vrRRG*hoCIgPQk;ku9Q|vX* zt*J-l@@&_R!wG8!Jkl`IpWAKtH9{HK2HrytgLs05TU(HnLx}8{41{|82V(P8$C1uQgV!L)|8I7wD*KY(UQ6?-@+lE?SF#zelF*zv(>foM1 zJQjR_FU8ZCOH&2}3(!=br(qC}?b>mXSg`OkQ{xH-^TVv7&bqQ}cBmvOZNYJq5a2W5 zm{U_J-jNo}=#BR5)=ndMXf&pN;qz=br4_pql7K7-60$=t!C@0`UUmq7PEAqTaO7%f zE#(++n$k|}>TH8Uqru)t>pvm5?18gRQn(B;eNh5^;ew8mxzKh)f{V9&V)q^?eVv#?we08k-9X4q1QW9Z39S zuL2wzt~Zk%8pDl(mtnwTF&`EjuN5@K#-92#rEP?sjmEio8p3oh^tr7l2xhc zr->)oXe6v18bZ=?0S6e6DCa!HV!;!usW)Cz*GR+m>`Q*(^D&LlV26t=W+Y(9nWh;=5*3JGA`e<}Z8df=kuMjhe(UdItSRfsX{_BaQw+)(%Py>!R zp9l@ozfb9235DO_mqoM~FL6xkrYNBkd~2{s41ONL#>tkVsRC&fm`+oD-8uD)<K| zoN7{6gBT41o;iocp7Bq~63a*XhS2DmX$C(V)|&V8%!<4X+p~``-h(lvB%?9&(AY6+ zcrsWh;&1j8LlpBWf*5E|gIES}Oj2Ga5DRN8ZO=Y~cn0fVjK)dKZuL)wDGY}NpUYsO zPfB*^SU1I~XiBbU3d3O&&Z9jg-VPlgMuT-F7vV-8;-8vh#y2eLnV)Q(sdndl4gkAy zcI>MNVmKvD-C`O|v1m_;w?hY{1VY&*>qez&iRqLjZ8|=z2eV_6qRDG)ZS1xYBp)u`! z3>MWrImBy9x)2)P(4nTR{~P0-?Yef5sT5_9#${%ni{o3$Y`!V+DZ4wzA>Z@5t@3@j z`-rk0oYHDx2iLH79HWnTxp+-|uOqAgw<1lsxVO+hxWMHMHooxSWSoUQp?YyYmQZUJ z*KKp3#ll+DfyH|tSPdz62=z&QE^SuiuTzXrxX1*rwdpEQQ-aj>Y?=yfhnV``;7mDg zoVAG7UpMP5Nbpl@7Hj5+wQ4GJ;#9)?GIT2hvrJ7}nOeS+axcETX3oiqi zOy<0(Zu~pPW01*Y&Iea73&+B)nx4sI){0B$mSis@lQ}c0oBqAy*&>t4oDZ%JezJT) zCX+cYTn>I_GMP|ZT296_GMUVI;nISis*~d~nasj*X+x}AWHOoaLOcamPos`yv1^=U uPKUFd<+^lS9mw29eB^P&<@++3XZ{biARr2co!J=x0000oKWBIEL%R3s1=yz8U@!;~pxDO2#s~~40Zf{< z)5K(wOq?{6x^0>!nRGHqTSKlP?M&jf6L*qMXj4CuxJ_W(IVq@v9bChx$#+54 zX1lCxBCt=C{Pn^0;iK6sCu@SN+x>K)Te_bDzC`v~OXH2LM4l-y0^vRDzuJ|J09`PlwP!|!C;u#stlmAke+u3h~bZeB3}DnzN8%3V)=Dbt2C z_Jpji3j5ut`hh4unJJqS1NmV{mpzfGmRLpvSzQ$lIx+PU@WD*jn|P?be$)FWuYd6C zZE0Id*TCvm!gtuF`h|k~(zP|gIqKTxhC?5I@^U&x(h{Wd_3#{Q^;!;xJo1fNELm5* zHheZ!11Ssg@b2(!hNx;_UaB^3N`$kPmKA$H6uy#5_LN##5B?%tq(tpvQjDP}<~Wwx zv$`r=l1lcZ1zBAc_FIN}dGehx3c_M1X8e40RXEwXo8)`YZdCn1DOM$$Z!o$eO8k5i zZfh61JD#q&jG+7;j6yHoSyQoYD@xOvtahX7`@mJWIn-F6&Quyl+r-=9E-TL_s}NyVwss{kE+NbwwvWGTgP{t1Lyv=ZgK) zr%_xnH`8Xvh4$0uh+Il(G<`%2lZ=dVKQZ{!KtV(ls3D0a$qowj>BK$1&HzDH z?RjdYg1g7nt6Q5{D_`68aQ_nn1aXD+sO}^w;@QsrV!)Nb#gs=bhr<`i9A2E&UHydm8J2^k45_3pN zfuAp~T9#!o(qo#xh^O!WI6-T)5G~br?-PQA!v-+n2AV!lKAS>s{=fFhd_g{R=e;8* zP?Yy*kPu|ma&s2R?~ssl=1fT`S~DjsD4sF$MWLW_1$RP^AX>Ylq|RTw*056wc}ame z`jc$veu9XhLgV1mB%|Ocg3u#~(uspfa)+rC4@IKcYp4)1K|3L%;A%~4XFJh&9Hk&s z5Fk_-7?j4PI~v6>3<`aIRKGrkh!Ba#a9o!HuMf|lfQk0*PP!ryT+tMI{gi}47%Ihn zkn|TsIrAy>`RR^DsX2ZGdV0hj%R}X&>#Hmd zpFBoqv@3B{;Qo0FC<%sW>FnU0vnSE6;Aj_=U?~&BFsYb%H@BB29|tT@1X)-Xoe$Js zYofO95^={yi^j4{lv2dvaoRdNIeh9ET5DQ5+KD-FVzy1pwu##|tzC(*rMPX=8R_af zA9rjTTdxtfZQee8oJcH2+_f=H15=sUu0tdq<=ykOv~{H(E|d^NsmumX<(RW|mvCGM zk7ZFlVzEVo6H!D^D7==3rSlfx^(5Xi#laNX zNGhR$1t12U`LUl`W+)35b2;9K?K;%fU*x@pItqL~rk73Sf%1hEczt*Wg_k-yu{BoQ zwQ*dR&h7{RdQcqJwBj-@H(ted9a=lusXqD^mT57qxRiVEDaU7dDD)>EPwX1~1TmCq zmz$`SRWWlmt=%0&V=-LU#dTd`cAVDEPJAAV8B=bj{H{SknLU5MXyH=h6|^J-(%K!6 zY)Vlvx0RI9(AtdSx_$4Tu4shI&5eW#3b}vY0xUDRPOBw!LQj=tx_aWRq!|T|Wl_2C zJ}PF;p*Rr4=ka2iCLqLYoA<8PbMflHdOlE4h-sSGuFaXci`b5hX()mPfg$!6&zZ;4 zdGF))k}3E+p1$U=?buxFXyeV(sVu*+E<(=}vbTl{mCK1BWG;3;haA6fmWGyQ7S6hd zz?$m>OGK zICi0yX~kvSH?IN#+PgYAQ+I)ujy4=u(;bcAYMsp7O!vM+&Skhh+N*&xnYkUgMS%L| zMxyaJ$KE@K)*90=nO0KDf?0Dg&EBrpz$)4_O{|_9*n7!P3g4iY|CzcAL}D=-TAFC> z>_7p292vLP1~iHtyOSK7EX)wpJQinmKXd z9FCiKCj^Fh@s@=KM%9M`L#wOOU?|b2v2A{L_7wHknrLosXAxNJXK984*nX_qbZ%ZgBpp@c{vZ*w* zHeow1reQF>bSlyK_2m?XQp}z{lPfLFMB{NHu_#B+oyIf_Y}Z9ZuuPM=)9*^kUybw$ z()Waj=1{sfB43zNRKk*b=2PhR- zE*KR!zi-_)1~jGyR#}M!?f;!s&oapAtNFd7P=DTOxiI9M5?&a*iNKJ)y)JW=a8nz?cZSP1tRQ!E zRP3xTIv!?%#QSOyj?`V{NL^xI6-R6SpnUd->07#^{PP=!=!}hRmx*)lTwjGdWAUd^ zM%qJ6C#q}YXTx0>c6@l}rcEyJt#nJx6+3?WE*D$dhrK2u{MWDE8nYN#;-5zPde4Xh z_K~S~{8-?8)?CUWwyXJ%18-uxL;vR8Cu%u%r6~tq^&p(JeDXgdT^>=8Hy`*5+Yq%m zJ6>g<%WWOJ^t*vGcb8i``1w00a^z7TPwrh49Xg?04VzzN0uQI`IZ@m9Ua?)x z_JhMeHRFZAzUmEIell8`(dQVI5~bw}z}R;T%OeDMuI6n{G&J#i&D&fW;k`0W#7)!q z%Nu>i>V}iP`!|Mdc&5a?pM;w5n9^$bKtdP^WB0}g>>2Hlg*U0 zAn$Gp$89Yi1>QN{m zyn<@~#=mdGl1G8sRBhaZ)Eb7dHr4M>L7Ge2s@I0k+LpC~$?6LfN5qg-`_^wxD<&cB zHHI~7|DnP1$s%%7^ad`;j+aePqq-abS3Z?b8BDO3&xITO|8%1R9 z;~InL8BF`yqK~buai^C&3*_b-6B)vDS6Q2H&K;kv{==;=WwV^D@8odwr?0e&lD*t~FijNxxHAX^JN&Tf{krOX;?iG0}$Z&l4 z<(CUhr)imTb%lj_Cm7R2bU=ww1R#cPQyASEeZ^5u9ojrrI`!_~Jilg5{;ye>BtQ9o Xic({@F+wxw00000NkvXXu0mjf*M-l9 literal 0 HcmV?d00001 diff --git a/images/r2d2.png b/images/r2d2.png new file mode 100644 index 0000000000000000000000000000000000000000..d373f45ca54b19470999f8540c23c3c8f82126a4 GIT binary patch literal 2278 zcmV{$|G(R= zbltc<*7mNw|1bF_m)n26@9+2N|8ed0P9!2hf5=EOpZl>baz1K8P&|tBAS zD2`4%H-l7igb}+#`~0UHhYv#lC!NSVb6J1K^qU}l5Xg^!katPmajd17au>_ zur< z-%CKKTi{VZley)CkxaY{kk{Thjz*0dZ36<^u+IxXkW6J+DxCR4Wr_C&klBm!(AWtN z*?^3jFqz)x4Ipy0HBK-#;Jj z>k9+}WYq?l)ss(W7p^Gs+A3?yFO{tS|NbgzmtcTId?V}fH;|Gti(5dJL>6Ba43L#; z{_ge{kV2^m#qB(YHpQ#aZwIt6S-S*e@k&V_0pbH7yOVV2yX|V5vho`V5PtwUcVQ1Q zHta^B?-C%q00J<~mR%@p$>3#g;Tb$+{n|fd?IuH(|A0WxU|@J-QYS!ow(Jd9AQaX2 z24%gfVH4A~&3d)OLiK7Jo4c>oH(o(*tLX}AHg(f#z}swM+TBTw&Fsf&XzIQOUcs|1 zS0{NwEjR~)4ToE-R}q_-ws^bUSz8{e-OfL2Tc|}q07*{Op8>VB^@mJ+0=}9@ci-@Cls1E|Oye$7J&ao*DnV1`_&i-dp&S)y%cgWrqlm zenBmuCQuu{1DUlb{|iXyz0XdU5+MD8TEJ^UZGr-bRBlFxG7Nqd9FqVEAPE{s!D$oy z*^@s7$0R_=972E)AOuL@pNAaHGNO%JRelv5GbqkOd~v28=&P)t`{;xKAwUERL`}+_mxUCe)931nlO3@NJ(v^H#&5g=RwfnEV1Dr=3j%J4SRQwR_afXx3;Y=glF z_W25kvpk^|1PB4bA0T1)9$4xNw}&j)4jZ_)76HQ1q#l!~KovRzt<4DvpHAuoh>OeK zxy!_~e7)=?KzMdyNPxHiB>dANv_Gu^?N6;h;gLlI2-iRgeyT)AfN%+9-m;;~ z-g(Q&vX`8P5Fi}`w|p%?6*aeEz&7k7KscO3Qgfaf#+JYX)`HLo`K3{K>v8jUq;Sxwn{u#9MNR~|{<+TLJ zNTbH^PfU4r2V#@Afi&TtHJ>hNWfinxdyTs0OQ^cmWRt$$8XQ1Iav6}PK)kWal9W~t zI`*+51p(qMAT#Hup_y-|`y7a-svWUOr|;Y%cpy`!Mu93vwGjmEb-xX0WolDTA^qekB!_Q zKy11RHQ~&3siyq}S01n>ARzF7;~CryS88gxy_vI$7L=1wgtAid25HZ)nY8x(o{R4! zT@x@sz$d0{rD-)Q=#O99q7;a_(A$( zdp!F6`#7|BTO!KOtH6&PYMaJ)Am9 z@!wpmv_|rPVVS!9Dc%FY9z6zvYvXsrTCMhOxyqXB{zHGM7*T+PTxpH+Aiq;m>EQ2s z{1$Lv8j6~_?4kk&hTXYVjLZ4qT5tw~1PMXJ|9JGD8@y1UfB*mh07*qoM6N<$g2tvg A)&Kwi literal 0 HcmV?d00001 diff --git a/images/samsung_pay.png b/images/samsung_pay.png new file mode 100644 index 0000000000000000000000000000000000000000..a6da4ecb67d17b35ef7f6cb1b7f733523b64ce82 GIT binary patch literal 1355 zcmV-R1+@B!P)Io>LPORLvrElFoWsFZf@}Hib@+4SUS;-S1|KsDMm@ofJ zT{})yT{|vi%vYEH6w{DCf12*@?mjKv-`_vO#7gzZv(V+#w+IW&%U)hyO8L|2v}m`p zvlH$6^z^i-Lw$kFOThe7YoYH{-5~VnxVp|y(!#8o5A$bdXN6`Q9v+r7&}zSETot5T zv^Rzz=%R1NM-#!((b3FiVS9T!SvHwWigERhM;?K=Zq5J^zD(ly__(w^H35Q~o0}*B z`hO83d6F-A7ScBYI5|1VE-x=zv&(vY7P3C(wY9ZXTKjj3)fxd>m}uO^#YMKdx|)qf zqkK}ag*-ew6#uWStwjkFJG#8QT(aGQ&CSiyc_2iD?VsJ=-sa1Rf`5PM>B}G60D8eix z2;o)dfc1tXRh?O_p8;q)e<1=JtWA=&(;`GoR&27Aqt&|Hy0wMt7RG1iAutp{c7vFY zS$9CpeU6zdZE`yc#1OpRb_m02s@{$wL|rE(B<-75?Eo2{gdon(&uf_sd*EA;uSxjs zpl+h|t(*Y@+)iw-Og3g_o}Zudzi)4Ewa)JEO_g93gg^Z(sy^f7jHHXx= zAjBzozjfx@x)&t2SL~oHSllu^nW`P259rhatD;ML2`GokOs6+o9%cFk+5GW5RJfI+SjiA*13*Y`0*oI2u7Mcnd09)rHIm3t!&Wr>iven{QC{%SY0 z>Q=H%AYkc}YizC(_V)IQ@;bMvzmkBIYiOSz?dK+SuAD8QB4mV*%PM2bCpCSc*E1mY zIR~G9Xozjr-i-E+B$1ao17c@HkFMu@xuN{#pv6VRE77i|_DrZ_;{@7}tOpb$Am%Cc zXdz}-xJ;g-@&c0w%h(ynWYfO&8|=ZXN#2Z9z; zBEReOqubOKq&8y^HV1D4{Sz>hu?PPkgZpZ~=Jxl14#6iZeFt6^i+v1wb#+x-HFO#N z^I42sNwoPf?|&DFdGbeje-m~%0ZxF!32*|O0EZLc1UQ_4q2iAK0|2c3(UH+Dw@m;5 N002ovPDHLkV1j8Ii{bzP literal 0 HcmV?d00001 diff --git a/images/tmdb_blue.png b/images/tmdb_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25e2518efa03dff98da41d522035c9d8f38419 GIT binary patch literal 4029 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 literal 0 HcmV?d00001 diff --git a/images/tmdb_green.png b/images/tmdb_green.png new file mode 100644 index 0000000000000000000000000000000000000000..910f91e8bd072f5f7ba8178396d6d5b485a700fe GIT binary patch literal 4032 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 literal 0 HcmV?d00001 diff --git a/images/venmo_account.png b/images/venmo_account.png new file mode 100644 index 0000000000000000000000000000000000000000..2390b6dcaaebc18347e16275aa55b16c98e48491 GIT binary patch literal 2954 zcmbVOc{G%JA0ILrMiO1!l#CG<8DqwbVKSDCv1H5AwRM^0875{i^DxLxizTTpveU&K z+9ljlNs&lpD>TS^sT5HZCA_2MzV9FR-1DCIIp=wP+xPSNetzHOoF~=I#crLvnmhyo zS?6F+c9)ESlGhw2EBWU2-mH}jn?YM|(1Xhag;YKOv1V{-0K$Py4FcQ&DkCcF9$*fE ztchfKdV}81PDDDFZAe|UF^pvMBxnhlWh9SE4*@^~4G3a!NXY4HH<1VygM|DU?`-7E zvjKux_R)O6BihB29vwnAV<0Up5ay9Y2>}}bsfb8+C`UkyBq6`>5+(E1Z8Q?`#RLo? zA-{_9c6LM9aQOfNZ)k#|8)0w=f|(%(Z$dC57$C5cHQLA&jWt3UnGx~EL?bNX+k=#N z<1?5f+VBA?$mM%-xuM^y zz%7^yas|O$9>T`vOV$y(&Qv;!v%0Cbny9b$CIfs{1i+y1xopIjNE2CqqvC&yz*juu z|BWD8A_~1)F8@_N-?t<+xjOx;86=Cp+6mxDdWbJ+7CG4EdB@Qi@hD44$@DQH96tp$4d)s3%5;t7UKB=_&|ofw0Qqy&2#wZF$=`(`-p)l zSozv35u>v`^1ttELtIyqDc|gqXJmh@htguE$cfPB4^(A6?W#i*O)I>f=HefE)+4Oe4~^=29TgnEo%1=5uWFd0p4KWGtC89A^1L1=^$x>ogtqRH z^>#;aKm!wVzPHFUCdaa<@$`iu?a6k2O=uE?gfI`gfLi&9{#eB*{>qu%2efA;p}Z2eQC(Ew%y z)%rQnzH<8m`8S1UiQcZf}divnK?Sol)0@Lwc(9UO})(q)h0751rHL0CK-1PxH1b=Vo8ERzAM|9DmDIR4VOfBpE2oDDKKg)sFdX2|W4qVA=O zh`^1zx+0sVwdU^2FvzsWwkK5+>}L;qSPZTNpaFSoGNdlyr#RN}OqKHlMhZNs|AO6U zkb=|`V;QL=h;>2&;#q6Uk!H8@lwYe2Tdq9V=jK^9HZS}@x!0-z2i@O}*QaPggd)A~S9vJ7kE~vax?*3O&Y4|m@wJChRmS?-)+5!V7 zW)f{s*8AZKD~xvo(2q;8dC)Xmb-U~_7R%P9`$gB{nfi_09<%S1Q`R^1>s#G_+L5Na z!*-%it1jW{AqdIzH&>OAc0svTAXHby{o+y#jo3!`DF#HIKZP8CDx~ReD=DxmQGct* zirJy_{E=m6tepzIf8PTGmtw+Iep*4c=on(_7@IhiyHO!+Z>PY=_^y`E`^N6jXfWsS zjhz#_SCARW*otBKWp{@RKJTGpKFt4C;`2MRn_*j`@?SmgbJ*g8C*@ZDkl&N%@=-cY z4(?KQ=+-z1GGCTm%rBYjPCy@v(gvD;Jicw#<9dn3a{X?+s?c%2g1a)bZy!t~b{pCL z;&P6z@XAh~^ky{+72i2#cvorV!J$nD%JDKPaW|^1eA|xltSquRnDu*5ey2|m(pFmL zrA}0~wXaDs3E9q@8V%Ehn~1l(>NT*2$W|ISwr}sdp*oS^YxPkV=Q&i%JA?`?i1{N) z=r$fKLpE^qtcy9}SL341j=g(u+lTq&&2DzgBZajOif5cJS98jm0M`{Y2qJsy@eZtN zv~8TK^H^oDy4VAIQ*lH*NvJo9j}_lFMA@Y^6c^@lU!9I6_zg>%S2b)5IcvpYT(9sTrL7WXN3IF$<^YsH>UI&(#&DZP%`+pakkb3A%P>g9l)ds3B0 zqBd|v`d~Am0b_7~X4V6~h}-nS>XkreypUo|LeCxX?VWD2-0{MyKjzkj+v<9%sWip4 zD(RPtjMX(ekB-plWVM&Bqm(L=a}PLs&HSDXNyJ@6NLgD^l$Dfe_FHx#N?qDC*`hU4 zuSL^#WGH1*)<@#bIE!4%-arkcxa(zuy3b>L*3yc!0z^~phnj;mFLhS`jvZ`W$me$j GCjA?vLh%j& literal 0 HcmV?d00001 diff --git a/images/visa.png b/images/visa.png new file mode 100644 index 0000000000000000000000000000000000000000..221da87218f4d0060895b1b4a808ba5d354faf72 GIT binary patch literal 2836 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 LNkvXXu0mjfJ7uij literal 0 HcmV?d00001 diff --git a/images/yoda.png b/images/yoda.png new file mode 100644 index 0000000000000000000000000000000000000000..94ab03acf6c3175a2545a8366a473d4cefffdc40 GIT binary patch literal 4485 zcmV;05qj>4P)q3u&C^G03C2e1=5KG5fNmQY>;5~ zm5@#+1n7j2gk^9;1tiM=0VI$FI$(`D1!@VFqqs06VK2+k87*;Krqp4(bMH@g`uFec zzn@MpoqkofD*4NM@80w7`d)vT%-{UY-~7$r{LROj$*3MylCL!)9YXp5>BA1v2bR8! zYw|Qh{Sp@0O7eqrNc&N6H;|x{=z2-Mrf!WPc(h;QF51>a*)3~~LHQ`G|8*h|Lb_6H z&{mjCx?BAS@XeD!HK4?xJ>G>t*imu5_C1<|9|>%whTw@Plz({=8fp)$EgAr2t3#lo zWDr!WK`I&O@El!hyElk?mfoRvMF8_viBWxbj|QXI5HuA9@uNFIm97Yeb)|z~dONt-g?@Q{JX@aJNjE!lssYe>-mvCjUVrMbaF zd>f2xxf~g75gYxG&G$ASrG>#P5m<9Yz9PV90a;_v?q&)}F*@2<;YC2OFZQrlQ|Ft0 z!w{4%B}Z7lcCgm~S&xyHq+G?QN%k#Mg$|OU7b(K1Fb#ABqI?L3v4dUaA#{(P5x!S$ z8Yne+{MBc2lubDUdm}?L*e4eFE1X5J^+(EqnK6Q=7TEmoeh@vsW0gn zy{6S6Soo+YBc#cE937{T0_OrRKoUhkgTVbq3;O8&5vL5|p& z6DGS)H7H>+hke63EFe0IsOTEqb6OL_>l>ZDQ#OQ~gNU+ptcxU%Sm!D7wCEFtc#@C3Ne`U+bn4%wOTF zQBvy4$Ka;cmM#_J0FJB$f;qlr)ajGd_5wFf zW+*$03`v$>R96nIuCBgwtSB(5whu4Dm#!dz2fBjK91zB*}AvJ<7+0LOnK^{_JxQtAX%VXj);{XE^MP)Fe)pDzaXL`2g3J0 z#T7BvWRm^fve#js*tuA#<)uR)J53AGa~1I9w0`i|)V?t5(c56&%m7##qXI)tFgkwM z&Uu5Zq_JrZIXD-ZlbE2Qje>NJfG^Y z+_n!-5`Zyk3f{Pmpuq0EBjL3JqoJ;0H0-M%4SVZGLGA7lP*W|g^R2JkDJb^Y7$YG? z;Ytj9ptncCI0)*&K9G{22GfcVNQ&<75)3QRGo}>-ASGVSy~{ct&5^W*z_j@<`}~G@ z6(f_H>fumZI|5!qS?;sQmSjw_u5Od-^_rUDk66ICy%+xT)9yVZq28>6h9=ik*Dwab z!A`2g0YVuuX~zbnj3f;_I;k(aV0aYyNN;#%k!LWhv=pC>e56l@#(ealzL1ryv4Aq9 zt%4u|5Ry^to)NIWakN{RlFUi=2-=T?g{-!AZ)PF*nTi}g$j~DDtp^T`vH22;78;I>nciU5on-EiG-m%O zZcAJ!k% zMUw1Ymp$-iV^ipIeE5nKV0P>nZYP|T%QR^B6}U=mz(mc_!TZOLasncn_1Ji)LfW2`$o77USEV~0D>o~u{Tb4vnR=~l@t}qg55x<9oE6$UT*B?Wkd`#Z z4ve@cJ)A#(4(D+U%m+;H=hE?9AK6Q7xlY<*xx*rm0LXU@hjn*#sIFzvlwYL+Qjlpg zAE|KxP@E^MaRtNX4G%-jmS}XCGcl8nfX&aw!D~Cyp|&a>w_Yc5E1WOf>}M3PEJ+1X zPst$$ZF+u&nxmMxa_-u)WEEsRW1l!C#mHfu>3-N#^9%`zSTkxeA*+_DnRe%vrz)N17t4|Y zVcaO&3cv5}UU2VSz1sh$dpSvgPT$Q-4P=@F&Dm=Hh!^P^5}M%E3UGZ>=oVH$R_AJL zt1CmrBnU&ABN(Z%0qwRtJzj~qL4R2AM1OSnDo!itZ@QMAptLx5HTRC4rXU&8l}vM? zxm({So+JSBlGjV}`}XN>Z8V3TU;%_yqjg2I2*8MDE=d4JPND)#2KIvq^bWl%1h*iQ zO)%fA^~}iWY;PCBnOU+8;ApZBNh;H;2G$EiwzpljMEBCjtQ_^(X3|18RZEy zE*WcGtCowO7x6&65Kp23G3&lIo5zQA>gLtKCf!sV?3x%rsFbmqfoc3%8=4}y9T*f8 zcJNuTbjgllgE=(IBOnGXvlA!V&IiMoq4fIMD(aID ziXlzK?Bq)fA^5)gB!>82cJ zXf%&`-dlk1i-MU;*-VLqU)^$J*ou@&uK`luq}y~;Pncj$W+{~etP|R|e>A&*3^qre zf?+C?-;qe<4^k{4F**2R2@xD^;PJC?T%b#S6UTnc<`F71VfmP=yuH6+H1kRKe4g(R zX2W7vycCTpO4JwiNqzJ49&06;B`?8aLFR6B&^joOHR8!l4zvR!b+O!QKsc0O;_UrY zt|bena*gPd`bJG|w*ka*Sniq_#wgLE70MS-W`d&Az~D!6`~^U#R5BApo2~2g^X~3- z`W;nTOlD4C@U?@0Nor3H1GusYnKcqxM~M2!!|;~B(PgJ4I0r7;5(h|Q_xm}5F?fQf zZ(ebwZGr7JS}Ln_z0iwg6Mkfs)E-&c`d?*P2qLNrH}F*aJ>B$2J3%|#moac7X{lUL zRaHo;5VKHD`xy379host+XU!4YP#)D+R6$-leTZaIcy|S27))nH+LHBgSzn znC3!ZvzvFnEH@5Tbn72}mgZ|7boG@uDp?3^Hif1+Ns3O-)M<}|#&Whx>FVoqrTM{+ z$b6xpgO6|f&Y|GAPLA54z(}TKC1aIX3ek}s8cVq8C7cuQ8;!9tUuwlh?bFEERbiAR z6jC~S#w?krLf`W*cKeQGn^Tmcm#3*<92}MAx``sNO8mrKK?d&QoB$+Qa`h*_t zKm6dT$k-K?UcPg8Ra8XZ_7g6k2w6{PsfzLl7`9`lYNyxI;sUBB>&sAr!NpLgtcR zSx#LTI7rr$8Zv!RSb-&>bfuQiSTtrzoS?)X-T%C-r!~|3fDQD;PD6mOU@>ci@=-TrzP>14PHTJ@UGTl67Hp9X_IMbV;H*CQZ6RJ1_c z_AF)Zt2$6lp?A|n?m*IwH!ye#|Pv|qkV zgjVp0=ER>PQkKv94KxG)<1>3&uY&vqY=;<`r>3irN4?f@=jzv0vVIj@ur>FG~^c_>B zS2Z|iw2cnUP%^J(ZxW5&h;wi^N8-UZOx2VDD))@G(T-VxHw}=TPXvOPIr@Z_oSPol zADOu>hT&aLD7sWrXslY1U?5#PJw<(+kC-g=agj`OQBG19fw6Cuqr3+z-!pMrgR_89^SSI7HKLO4(M2W09K76BZMR6=$qfRc%yYj@1VWCg2mnvtHH z!+t7$6Mp-oIa~r5;p);JwI_n6ARigO!3xR?44^!V&$cjYh580*v8*RH3MEkhR~aK7 zcyW$r^YxN6FtCuQj+6D|b|zf?5DMZeR!}xP@n!2&%_Nz>QF$duje8|; zu?UdLu z{Y;oL#4l;~(0Cr2vF|(y_#-q^l+lX-;s+{p`X$?e)*Kc*1WnlA*t2Y*<5s zFHvu5i(dUTI~bbFq!m7Woabh>&mIa;P*fyx2l7U1xM~M&A^RoQ*~z3{{V)prV|V)( zlyLeb)rAf4yXj}bHL(cJzxkmo9c=Tt&7|(sE`%!r&@^ozqQCtT@i%|-H-GcDp4$Eo XwXz&QN>%M$00000NkvXXu0mjfm~4q; literal 0 HcmV?d00001 diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 00000000..e96ef602 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id new file mode 100644 index 00000000..0efae0a5 --- /dev/null +++ b/ios/Flutter/.last_build_id @@ -0,0 +1 @@ +a1b949f93fb4704866ea0645edc5c9c0 \ No newline at end of file diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9367d483 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..b2f5fae9 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..88c29144 --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 00000000..7ac9ccfa --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,42 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end +pod 'Firebase/MLVisionTextModel' \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 00000000..651b9123 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,743 @@ +PODS: + - abseil/algorithm (0.20200225.0): + - abseil/algorithm/algorithm (= 0.20200225.0) + - abseil/algorithm/container (= 0.20200225.0) + - abseil/algorithm/algorithm (0.20200225.0): + - abseil/base/config + - abseil/algorithm/container (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/base (0.20200225.0): + - abseil/base/atomic_hook (= 0.20200225.0) + - abseil/base/base (= 0.20200225.0) + - abseil/base/base_internal (= 0.20200225.0) + - abseil/base/bits (= 0.20200225.0) + - abseil/base/config (= 0.20200225.0) + - abseil/base/core_headers (= 0.20200225.0) + - abseil/base/dynamic_annotations (= 0.20200225.0) + - abseil/base/endian (= 0.20200225.0) + - abseil/base/errno_saver (= 0.20200225.0) + - abseil/base/exponential_biased (= 0.20200225.0) + - abseil/base/log_severity (= 0.20200225.0) + - abseil/base/malloc_internal (= 0.20200225.0) + - abseil/base/periodic_sampler (= 0.20200225.0) + - abseil/base/pretty_function (= 0.20200225.0) + - abseil/base/raw_logging_internal (= 0.20200225.0) + - abseil/base/spinlock_wait (= 0.20200225.0) + - abseil/base/throw_delegate (= 0.20200225.0) + - abseil/base/atomic_hook (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/base (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/base/base_internal (0.20200225.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/base/bits (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/config (0.20200225.0) + - abseil/base/core_headers (0.20200225.0): + - abseil/base/config + - abseil/base/dynamic_annotations (0.20200225.0) + - abseil/base/endian (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver (0.20200225.0): + - abseil/base/config + - abseil/base/exponential_biased (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal (0.20200225.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/base/periodic_sampler (0.20200225.0): + - abseil/base/core_headers + - abseil/base/exponential_biased + - abseil/base/pretty_function (0.20200225.0) + - abseil/base/raw_logging_internal (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/spinlock_wait (0.20200225.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/throw_delegate (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/container/compressed_tuple (0.20200225.0): + - abseil/utility/utility + - abseil/container/inlined_vector (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/container/inlined_vector_internal (0.20200225.0): + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/memory (0.20200225.0): + - abseil/memory/memory (= 0.20200225.0) + - abseil/memory/memory (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/meta (0.20200225.0): + - abseil/meta/type_traits (= 0.20200225.0) + - abseil/meta/type_traits (0.20200225.0): + - abseil/base/config + - abseil/numeric/int128 (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/strings/str_format (0.20200225.0): + - abseil/strings/str_format_internal + - abseil/strings/str_format_internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/span + - abseil/strings/strings (0.20200225.0): + - abseil/base/base + - abseil/base/bits + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/internal + - abseil/time (0.20200225.0): + - abseil/time/internal (= 0.20200225.0) + - abseil/time/time (= 0.20200225.0) + - abseil/time/internal (0.20200225.0): + - abseil/time/internal/cctz (= 0.20200225.0) + - abseil/time/internal/cctz (0.20200225.0): + - abseil/time/internal/cctz/civil_time (= 0.20200225.0) + - abseil/time/internal/cctz/time_zone (= 0.20200225.0) + - abseil/time/internal/cctz/civil_time (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/time_zone (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/time/time (0.20200225.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types (0.20200225.0): + - abseil/types/any (= 0.20200225.0) + - abseil/types/bad_any_cast (= 0.20200225.0) + - abseil/types/bad_any_cast_impl (= 0.20200225.0) + - abseil/types/bad_optional_access (= 0.20200225.0) + - abseil/types/bad_variant_access (= 0.20200225.0) + - abseil/types/compare (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - abseil/types/span (= 0.20200225.0) + - abseil/types/variant (= 0.20200225.0) + - abseil/types/any (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/types/bad_any_cast (0.20200225.0): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/types/bad_any_cast_impl (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_optional_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_variant_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/compare (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/optional (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/types/span (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/types/variant (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/utility/utility (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits + - AppAuth (1.4.0): + - AppAuth/Core (= 1.4.0) + - AppAuth/ExternalUserAgent (= 1.4.0) + - AppAuth/Core (1.4.0) + - AppAuth/ExternalUserAgent (1.4.0) + - BoringSSL-GRPC (0.0.7): + - BoringSSL-GRPC/Implementation (= 0.0.7) + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Implementation (0.0.7): + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Interface (0.0.7) + - Braintree/Card (4.34.0): + - Braintree/Core + - Braintree/Core (4.34.0) + - Braintree/PaymentFlow (4.34.0): + - Braintree/Card + - Braintree/Core + - Braintree/PayPalOneTouch + - Braintree/PayPal (4.34.0): + - Braintree/Core + - Braintree/PayPalOneTouch + - Braintree/PayPalDataCollector (4.34.0): + - Braintree/Core + - Braintree/PayPalUtils + - Braintree/PayPalOneTouch (4.34.0): + - Braintree/Core + - Braintree/PayPalDataCollector + - Braintree/PayPalUtils + - Braintree/PayPalUtils (4.34.0) + - Braintree/UnionPay (4.34.0): + - Braintree/Card + - Braintree/Core + - BraintreeDropIn (8.1.0): + - BraintreeDropIn/DropIn (= 8.1.0) + - BraintreeDropIn/DropIn (8.1.0): + - Braintree/Card (~> 4.32) + - Braintree/Core (~> 4.32) + - Braintree/PaymentFlow (~> 4.32) + - Braintree/PayPal (~> 4.32) + - Braintree/UnionPay (~> 4.32) + - BraintreeDropIn/UIKit + - BraintreeDropIn/UIKit (8.1.0) + - camera (0.0.1): + - Flutter + - cloud_firestore (0.0.1): + - Firebase/Core + - Firebase/Firestore (~> 6.0) + - Flutter + - connectivity (0.0.1): + - Flutter + - Reachability + - Firebase/AdMob (6.26.0): + - Firebase/CoreOnly + - Google-Mobile-Ads-SDK (~> 7.50) + - Firebase/Analytics (6.26.0): + - Firebase/Core + - Firebase/Auth (6.26.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 6.5.3) + - Firebase/Core (6.26.0): + - Firebase/CoreOnly + - FirebaseAnalytics (= 6.6.0) + - Firebase/CoreOnly (6.26.0): + - FirebaseCore (= 6.7.2) + - Firebase/Firestore (6.26.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 1.15.0) + - Firebase/Messaging (6.26.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 4.4.1) + - Firebase/MLVision (6.26.0): + - Firebase/CoreOnly + - FirebaseMLVision (~> 0.20.0) + - Firebase/MLVisionTextModel (6.26.0): + - Firebase/CoreOnly + - FirebaseMLVisionTextModel (~> 0.20.0) + - Firebase/Storage (6.26.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 3.6.1) + - firebase_admob (0.0.1): + - Firebase/AdMob + - Firebase/Core + - Flutter + - firebase_analytics (0.0.1): + - Firebase/Analytics (~> 6.0) + - Firebase/Core + - Flutter + - firebase_auth (0.0.1): + - Firebase/Auth (~> 6.3) + - Firebase/Core + - Flutter + - firebase_core (0.0.1): + - Firebase/Core + - Flutter + - firebase_messaging (0.0.1): + - Firebase/Core + - Firebase/Messaging + - Flutter + - firebase_ml_vision (0.1.1): + - Firebase/Core + - Firebase/MLVision + - Flutter + - firebase_storage (0.0.1): + - Firebase/Storage + - Flutter + - FirebaseAnalytics (6.6.0): + - FirebaseCore (~> 6.7) + - FirebaseInstallations (~> 1.3) + - GoogleAppMeasurement (= 6.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 6.0) + - GoogleUtilities/MethodSwizzler (~> 6.0) + - GoogleUtilities/Network (~> 6.0) + - "GoogleUtilities/NSData+zlib (~> 6.0)" + - nanopb (~> 1.30905.0) + - FirebaseAnalyticsInterop (1.5.0) + - FirebaseAuth (6.5.3): + - FirebaseAuthInterop (~> 1.0) + - FirebaseCore (~> 6.6) + - GoogleUtilities/AppDelegateSwizzler (~> 6.5) + - GoogleUtilities/Environment (~> 6.5) + - GTMSessionFetcher/Core (~> 1.1) + - FirebaseAuthInterop (1.1.0) + - FirebaseCore (6.7.2): + - FirebaseCoreDiagnostics (~> 1.3) + - FirebaseCoreDiagnosticsInterop (~> 1.2) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) + - FirebaseCoreDiagnostics (1.3.0): + - FirebaseCoreDiagnosticsInterop (~> 1.2) + - GoogleDataTransportCCTSupport (~> 3.1) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) + - nanopb (~> 1.30905.0) + - FirebaseCoreDiagnosticsInterop (1.2.0) + - FirebaseFirestore (1.15.0): + - abseil/algorithm (= 0.20200225.0) + - abseil/base (= 0.20200225.0) + - abseil/memory (= 0.20200225.0) + - abseil/meta (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/time (= 0.20200225.0) + - abseil/types (= 0.20200225.0) + - FirebaseAuthInterop (~> 1.0) + - FirebaseCore (~> 6.2) + - "gRPC-C++ (~> 1.28.0)" + - leveldb-library (~> 1.22) + - nanopb (~> 1.30905.0) + - FirebaseInstallations (1.3.0): + - FirebaseCore (~> 6.6) + - GoogleUtilities/Environment (~> 6.6) + - GoogleUtilities/UserDefaults (~> 6.6) + - PromisesObjC (~> 1.2) + - FirebaseInstanceID (4.3.4): + - FirebaseCore (~> 6.6) + - FirebaseInstallations (~> 1.0) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/UserDefaults (~> 6.5) + - FirebaseMessaging (4.4.1): + - FirebaseAnalyticsInterop (~> 1.5) + - FirebaseCore (~> 6.6) + - FirebaseInstanceID (~> 4.3) + - GoogleUtilities/AppDelegateSwizzler (~> 6.5) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Reachability (~> 6.5) + - GoogleUtilities/UserDefaults (~> 6.5) + - Protobuf (>= 3.9.2, ~> 3.9) + - FirebaseMLCommon (0.20.1): + - FirebaseCore (~> 6.7) + - FirebaseInstanceID (~> 4.3) + - GoogleToolboxForMac/Logger (~> 2.1) + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - "GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1)" + - GoogleUtilities/UserDefaults (~> 6.0) + - GTMSessionFetcher/Core (~> 1.1) + - Protobuf (~> 3.12) + - FirebaseMLVision (0.20.1): + - FirebaseCore (~> 6.7) + - FirebaseMLCommon (~> 0.20) + - GoogleAPIClientForREST/Core (~> 1.3) + - GoogleAPIClientForREST/Vision (~> 1.3) + - GoogleToolboxForMac/Logger (~> 2.1) + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - GTMSessionFetcher/Core (~> 1.1) + - Protobuf (~> 3.12) + - FirebaseMLVisionTextModel (0.20.0): + - FirebaseMLVision (~> 0.20) + - FirebaseStorage (3.6.1): + - FirebaseAuthInterop (~> 1.1) + - FirebaseCore (~> 6.6) + - GTMSessionFetcher/Core (~> 1.1) + - Flutter (1.0.0) + - flutter_braintree (0.2.0): + - Braintree/PayPal + - BraintreeDropIn + - Flutter + - flutter_downloader (0.0.1): + - Flutter + - flutter_inappwebview (0.0.1): + - Flutter + - flutter_local_notifications (0.0.1): + - Flutter + - flutter_mdns_plugin (0.0.1): + - Flutter + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - Google-Mobile-Ads-SDK (7.60.0): + - GoogleAppMeasurement (~> 6.0) + - google_sign_in (0.0.1): + - Flutter + - GoogleSignIn (~> 5.0) + - GoogleAPIClientForREST/Core (1.4.1): + - GTMSessionFetcher (>= 1.1.7) + - GoogleAPIClientForREST/Vision (1.4.1): + - GoogleAPIClientForREST/Core + - GTMSessionFetcher (>= 1.1.7) + - GoogleAppMeasurement (6.6.0): + - GoogleUtilities/AppDelegateSwizzler (~> 6.0) + - GoogleUtilities/MethodSwizzler (~> 6.0) + - GoogleUtilities/Network (~> 6.0) + - "GoogleUtilities/NSData+zlib (~> 6.0)" + - nanopb (~> 1.30905.0) + - GoogleDataTransport (6.2.1) + - GoogleDataTransportCCTSupport (3.1.0): + - GoogleDataTransport (~> 6.1) + - nanopb (~> 1.30905.0) + - GoogleSignIn (5.0.2): + - AppAuth (~> 1.2) + - GTMAppAuth (~> 1.0) + - GTMSessionFetcher/Core (~> 1.1) + - GoogleToolboxForMac/DebugUtils (2.2.2): + - GoogleToolboxForMac/Defines (= 2.2.2) + - GoogleToolboxForMac/Defines (2.2.2) + - GoogleToolboxForMac/Logger (2.2.2): + - GoogleToolboxForMac/Defines (= 2.2.2) + - "GoogleToolboxForMac/NSData+zlib (2.2.2)": + - GoogleToolboxForMac/Defines (= 2.2.2) + - "GoogleToolboxForMac/NSDictionary+URLArguments (2.2.2)": + - GoogleToolboxForMac/DebugUtils (= 2.2.2) + - GoogleToolboxForMac/Defines (= 2.2.2) + - "GoogleToolboxForMac/NSString+URLArguments (= 2.2.2)" + - "GoogleToolboxForMac/NSString+URLArguments (2.2.2)" + - GoogleUtilities/AppDelegateSwizzler (6.6.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (6.6.0): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (6.6.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (6.6.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (6.6.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (6.6.0)" + - GoogleUtilities/Reachability (6.6.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (6.6.0): + - GoogleUtilities/Logger + - "gRPC-C++ (1.28.2)": + - "gRPC-C++/Implementation (= 1.28.2)" + - "gRPC-C++/Interface (= 1.28.2)" + - "gRPC-C++/Implementation (1.28.2)": + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - "gRPC-C++/Interface (= 1.28.2)" + - gRPC-Core (= 1.28.2) + - "gRPC-C++/Interface (1.28.2)" + - gRPC-Core (1.28.2): + - gRPC-Core/Implementation (= 1.28.2) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Implementation (1.28.2): + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - BoringSSL-GRPC (= 0.0.7) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Interface (1.28.2) + - GTMAppAuth (1.0.0): + - AppAuth/Core (~> 1.0) + - GTMSessionFetcher (~> 1.1) + - GTMSessionFetcher (1.4.0): + - GTMSessionFetcher/Full (= 1.4.0) + - GTMSessionFetcher/Core (1.4.0) + - GTMSessionFetcher/Full (1.4.0): + - GTMSessionFetcher/Core (= 1.4.0) + - image_picker (0.0.1): + - Flutter + - leveldb-library (1.22) + - nanopb (1.30905.0): + - nanopb/decode (= 1.30905.0) + - nanopb/encode (= 1.30905.0) + - nanopb/decode (1.30905.0) + - nanopb/encode (1.30905.0) + - package_info (0.0.1): + - Flutter + - path_provider (0.0.1): + - Flutter + - permission_handler (3.3.0): + - Flutter + - PromisesObjC (1.2.9) + - Protobuf (3.12.0) + - Reachability (3.2) + - share_extend (0.0.1): + - Flutter + - shared_preferences (0.0.1): + - Flutter + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - uni_links (0.0.1): + - Flutter + - url_launcher (0.0.1): + - Flutter + - video_player (0.0.1): + - Flutter + - wakelock (0.0.1): + - Flutter + +DEPENDENCIES: + - camera (from `.symlinks/plugins/camera/ios`) + - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) + - connectivity (from `.symlinks/plugins/connectivity/ios`) + - Firebase/MLVisionTextModel + - firebase_admob (from `.symlinks/plugins/firebase_admob/ios`) + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - firebase_ml_vision (from `.symlinks/plugins/firebase_ml_vision/ios`) + - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) + - Flutter (from `Flutter`) + - flutter_braintree (from `.symlinks/plugins/flutter_braintree/ios`) + - flutter_downloader (from `.symlinks/plugins/flutter_downloader/ios`) + - flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_mdns_plugin (from `.symlinks/plugins/flutter_mdns_plugin/ios`) + - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) + - image_picker (from `.symlinks/plugins/image_picker/ios`) + - package_info (from `.symlinks/plugins/package_info/ios`) + - path_provider (from `.symlinks/plugins/path_provider/ios`) + - permission_handler (from `.symlinks/plugins/permission_handler/ios`) + - share_extend (from `.symlinks/plugins/share_extend/ios`) + - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - uni_links (from `.symlinks/plugins/uni_links/ios`) + - url_launcher (from `.symlinks/plugins/url_launcher/ios`) + - video_player (from `.symlinks/plugins/video_player/ios`) + - wakelock (from `.symlinks/plugins/wakelock/ios`) + +SPEC REPOS: + trunk: + - abseil + - AppAuth + - BoringSSL-GRPC + - Braintree + - BraintreeDropIn + - Firebase + - FirebaseAnalytics + - FirebaseAnalyticsInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseCoreDiagnosticsInterop + - FirebaseFirestore + - FirebaseInstallations + - FirebaseInstanceID + - FirebaseMessaging + - FirebaseMLCommon + - FirebaseMLVision + - FirebaseMLVisionTextModel + - FirebaseStorage + - FMDB + - Google-Mobile-Ads-SDK + - GoogleAPIClientForREST + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleDataTransportCCTSupport + - GoogleSignIn + - GoogleToolboxForMac + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMAppAuth + - GTMSessionFetcher + - leveldb-library + - nanopb + - PromisesObjC + - Protobuf + - Reachability + +EXTERNAL SOURCES: + camera: + :path: ".symlinks/plugins/camera/ios" + cloud_firestore: + :path: ".symlinks/plugins/cloud_firestore/ios" + connectivity: + :path: ".symlinks/plugins/connectivity/ios" + firebase_admob: + :path: ".symlinks/plugins/firebase_admob/ios" + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_auth: + :path: ".symlinks/plugins/firebase_auth/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + firebase_ml_vision: + :path: ".symlinks/plugins/firebase_ml_vision/ios" + firebase_storage: + :path: ".symlinks/plugins/firebase_storage/ios" + Flutter: + :path: Flutter + flutter_braintree: + :path: ".symlinks/plugins/flutter_braintree/ios" + flutter_downloader: + :path: ".symlinks/plugins/flutter_downloader/ios" + flutter_inappwebview: + :path: ".symlinks/plugins/flutter_inappwebview/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_mdns_plugin: + :path: ".symlinks/plugins/flutter_mdns_plugin/ios" + google_sign_in: + :path: ".symlinks/plugins/google_sign_in/ios" + image_picker: + :path: ".symlinks/plugins/image_picker/ios" + package_info: + :path: ".symlinks/plugins/package_info/ios" + path_provider: + :path: ".symlinks/plugins/path_provider/ios" + permission_handler: + :path: ".symlinks/plugins/permission_handler/ios" + share_extend: + :path: ".symlinks/plugins/share_extend/ios" + shared_preferences: + :path: ".symlinks/plugins/shared_preferences/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + uni_links: + :path: ".symlinks/plugins/uni_links/ios" + url_launcher: + :path: ".symlinks/plugins/url_launcher/ios" + video_player: + :path: ".symlinks/plugins/video_player/ios" + wakelock: + :path: ".symlinks/plugins/wakelock/ios" + +SPEC CHECKSUMS: + abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f + AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 + BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 + Braintree: 48154e70306eb3e6c81eaa87bbc5c5988c0d2784 + BraintreeDropIn: fc3e96a8a2b5416e5e3a3beba119f0089713bc1e + camera: a0ca5080336f7af47b88436e5e26da3dee5568f0 + cloud_firestore: 2a4f8f802fb0b701cf809b283b6bec7477ebaa6f + connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 + Firebase: 7cf5f9c67f03cb3b606d1d6535286e1080e57eb6 + firebase_admob: d8c2bc95b5e0069406280ce6adb816cdee6aa595 + firebase_analytics: 9118044ffb98bee71d84733fc594f5134fe4bc1b + firebase_auth: 4ee3a54d3f09434c508c284a62f895a741a30637 + firebase_core: 335c02abd48672b7c83c683df833d0488a72e73e + firebase_messaging: 21344b3b3a7d9d325d63a70e3750c0c798fe1e03 + firebase_ml_vision: 2a31103bf58f5746b3af9486cd8e45d2021d3ade + firebase_storage: 22966fce4aa6e8848cbaa017df62107cee29f327 + FirebaseAnalytics: 96634d356482d4f3af8fe459a0ebf19a99c71b75 + FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae + FirebaseAuth: 7047aec89c0b17ecd924a550c853f0c27ac6015e + FirebaseAuthInterop: a0f37ae05833af156e72028f648d313f7e7592e9 + FirebaseCore: f42e5e5f382cdcf6b617ed737bf6c871a6947b17 + FirebaseCoreDiagnostics: 4a773a47bd83bbd5a9b1ccf1ce7caa8b2d535e67 + FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 + FirebaseFirestore: 8c158bdde010fa397386333a74570eaef033e62d + FirebaseInstallations: 6f5f680e65dc374397a483c32d1799ba822a395b + FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b + FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44 + FirebaseMLCommon: 5e1184cfdddbd097f55cad75b598881d348d900f + FirebaseMLVision: 485358b97d3332669ecc4fed55ee360aaef2813d + FirebaseMLVisionTextModel: 2ec9bf2287b29ef2b7d79152aad454cce5bc3040 + FirebaseStorage: f4f39ae834a7145963b913f54e2f24a9db1d8fac + Flutter: 0e3d915762c693b495b44d77113d4970485de6ec + flutter_braintree: 101b66de3f3ae397c9ee3593c2e24ed67a41eeab + flutter_downloader: 058b9c41564a90500f67f3e432e3524613a7fd83 + flutter_inappwebview: 69dfbac46157b336ffbec19ca6dfd4638c7bf189 + flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 + flutter_mdns_plugin: 3b8fa566cc39005527b515c77243cfdba77b70bc + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + Google-Mobile-Ads-SDK: d70efb31e7ea19fe99d466dc5d4788966b6914f8 + google_sign_in: 6bd214b9c154f881422f5fe27b66aaa7bbd580cc + GoogleAPIClientForREST: e50dc3267b3131ee3a25e707c10204f6bec15ae9 + GoogleAppMeasurement: 67458367830514fb20fd9e233496f1eef9d90185 + GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 + GoogleDataTransportCCTSupport: d70a561f7d236af529fee598835caad5e25f6d3d + GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 + GoogleToolboxForMac: 800648f8b3127618c1b59c7f97684427630c5ea3 + GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1 + "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 + gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 + GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e + GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 + image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09 + leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 + nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 + package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 + path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c + permission_handler: 67637977b227d62d46bfbf524f335f8568de5a73 + PromisesObjC: b48e0338dbbac2207e611750777895f7a5811b75 + Protobuf: 2793fcd0622a00b546c60e7cbbcc493e043e9bb9 + Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 + share_extend: b6748dc53695587891126a89533b862b92548c7b + shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + uni_links: d97da20c7701486ba192624d99bffaaffcfc298a + url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef + video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e + wakelock: 0d4a70faf8950410735e3f61fb15d517c8a6efc4 + +PODFILE CHECKSUM: cf02092078bdcf60e051c724991bff546a953444 + +COCOAPODS: 1.9.3 diff --git a/ios/Runner-Bridging-Header.h b/ios/Runner-Bridging-Header.h new file mode 100644 index 00000000..1b2cb5d6 --- /dev/null +++ b/ios/Runner-Bridging-Header.h @@ -0,0 +1,4 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..f4a4bbfa --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,703 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 889614F92429F7510048208E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 889614F82429F7510048208E /* GoogleService-Info.plist */; }; + 88D1AF8824444EAA00F7C534 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 88D1AF8724444E9100F7C534 /* libsqlite3.tbd */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B1A6D8E21271DCECC86F8B0C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE980B7454427A1E27A0546 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 032A949A9633FCD004344C6F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2AF9DDC8BB06DFF99E1912EB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 43A853D019D881728DD706F6 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 889614F82429F7510048208E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 88D1AF8724444E9100F7C534 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 88D8F6EB23D547FD0069573B /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 88DFFFEC2399F89300537037 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DAE980B7454427A1E27A0546 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 88D1AF8824444EAA00F7C534 /* libsqlite3.tbd in Frameworks */, + B1A6D8E21271DCECC86F8B0C /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 326B41CB61671A9A5FFB0E23 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 88D1AF8724444E9100F7C534 /* libsqlite3.tbd */, + DAE980B7454427A1E27A0546 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + E8876DB7899783F6210EB6CF /* Pods */, + 326B41CB61671A9A5FFB0E23 /* Frameworks */, + 88DFFFEC2399F89300537037 /* Runner-Bridging-Header.h */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 889614F82429F7510048208E /* GoogleService-Info.plist */, + 88D8F6EB23D547FD0069573B /* Runner.entitlements */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + E8876DB7899783F6210EB6CF /* Pods */ = { + isa = PBXGroup; + children = ( + 43A853D019D881728DD706F6 /* Pods-Runner.debug.xcconfig */, + 032A949A9633FCD004344C6F /* Pods-Runner.release.xcconfig */, + 2AF9DDC8BB06DFF99E1912EB /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 489AAC4A396A2A6CA857B38C /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 8D14BB61F9C4CDF213DDBE56 /* [CP] Embed Pods Frameworks */, + A0BD7956FDE77326B4BA1FD5 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 7U3JRV3K6W; + LastSwiftMigration = 1120; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 889614F92429F7510048208E /* GoogleService-Info.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 489AAC4A396A2A6CA857B38C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 8D14BB61F9C4CDF213DDBE56 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework", + "${BUILT_PRODUCTS_DIR}/Braintree/Braintree.framework", + "${PODS_ROOT}/Braintree/Frameworks/CardinalMobile.framework", + "${BUILT_PRODUCTS_DIR}/BraintreeDropIn/BraintreeDropIn.framework", + "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", + "${PODS_ROOT}/../Flutter/Flutter.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleAPIClientForREST/GoogleAPIClientForREST.framework", + "${BUILT_PRODUCTS_DIR}/GoogleToolboxForMac/GoogleToolboxForMac.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", + "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", + "${BUILT_PRODUCTS_DIR}/abseil/absl.framework", + "${BUILT_PRODUCTS_DIR}/camera/camera.framework", + "${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework", + "${BUILT_PRODUCTS_DIR}/flutter_braintree/flutter_braintree.framework", + "${BUILT_PRODUCTS_DIR}/flutter_downloader/flutter_downloader.framework", + "${BUILT_PRODUCTS_DIR}/flutter_inappwebview/flutter_inappwebview.framework", + "${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework", + "${BUILT_PRODUCTS_DIR}/flutter_mdns_plugin/flutter_mdns_plugin.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", + "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework", + "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/package_info/package_info.framework", + "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework", + "${BUILT_PRODUCTS_DIR}/share_extend/share_extend.framework", + "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework", + "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework", + "${BUILT_PRODUCTS_DIR}/uni_links/uni_links.framework", + "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", + "${BUILT_PRODUCTS_DIR}/video_player/video_player.framework", + "${BUILT_PRODUCTS_DIR}/wakelock/wakelock.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Braintree.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CardinalMobile.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BraintreeDropIn.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleAPIClientForREST.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleToolboxForMac.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/absl.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/camera.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_braintree.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_downloader.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_inappwebview.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_mdns_plugin.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_extend.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/uni_links.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; + A0BD7956FDE77326B4BA1FD5 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMLVisionTextModel/GoogleMVTextDetectorResources.bundle", + "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMVTextDetectorResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Runner; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 7U3JRV3K6W; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.o1298098.movies; + PRODUCT_NAME = Runner; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = Runner; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Runner; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 7U3JRV3K6W; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.o1298098.movies; + PRODUCT_NAME = Runner; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 7U3JRV3K6W; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.o1298098.movies; + PRODUCT_NAME = Runner; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..530b8335 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + BuildSystemType + Latest + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..ad6250a1 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner/AppDelegate.h b/ios/Runner/AppDelegate.h new file mode 100644 index 00000000..36e21bbf --- /dev/null +++ b/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m new file mode 100644 index 00000000..96455438 --- /dev/null +++ b/ios/Runner/AppDelegate.m @@ -0,0 +1,34 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" +#include "FlutterDownloaderPlugin.h" +#import "BraintreeCore.h" + +@implementation AppDelegate +void registerPlugins(NSObject* registry) { + if (![registry hasPlugin:@"FlutterDownloaderPlugin"]) { + [FlutterDownloaderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterDownloaderPlugin"]]; + } +} + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + [FlutterDownloaderPlugin setPluginRegistrantCallback:registerPlugins]; + // Override point for customization after application launch. + [BTAppSwitch setReturnURLScheme:@"com.o1298098.movies.payments"]; + if (@available(iOS 10.0, *)) { + [UNUserNotificationCenter currentNotificationCenter].delegate = (id) self; + } + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + options:(NSDictionary *)options { + if ([url.scheme localizedCaseInsensitiveCompare:@"com.o1298098.movies.payments"] == NSOrderedSame) { + return [BTAppSwitch handleOpenURL:url options:options]; + } + return NO; +} + +@end diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..1e40b957 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,32 @@ +import UIKit +import Flutter +import flutter_downloader +import Braintree + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins) + BTAppSwitch.setReturnURLScheme("com.o1298098.movies.payments") + if #available(iOS 10.0, *) { + UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate + } + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} +private func registerPlugins(registry: FlutterPluginRegistry) { + if (!registry.hasPlugin("FlutterDownloaderPlugin")) { + FlutterDownloaderPlugin.register(with: registry.registrar(forPlugin: "FlutterDownloaderPlugin")) + } +} +override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + if url.scheme == "com.o1298098.movies.payments" { + return BTAppSwitch.handleOpen(url, options:options) + } + + return false +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 00000000..94755943 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,104 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLocalizations + + en + pt + es + ja + zh + + CFBundleName + movie + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.472468283055-5vepq9actfcm7p0vgm7it41ed3plkbfn + + + + CFBundleTypeRole + Editor + CFBundleURLName + com.tejasw.tmovies.payments + CFBundleURLSchemes + + com.tejasw.tmovies.payments + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + FDAllFilesDownloadedMessage + All files have been downloaded + FirebaseAppDelegateProxyEnabled + + GADApplicationIdentifier + ca-app-pub-8117211796129035~9625154831 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSCameraUsageDescription + take photo + NSMicrophoneUsageDescription + Used to capture audio for image picker plugin + NSPhotoLibraryAddUsageDescription + share to other + NSPhotoLibraryUsageDescription + share to other + UIBackgroundModes + + processing + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + io.flutter.embedded_views_preview + + NSCameraUsageDescription + use camera for scan credit card + NSMicrophoneUsageDescription + use mic for get sound + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..7335fdf9 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/ios/Runner/main.m b/ios/Runner/main.m new file mode 100644 index 00000000..dff6597e --- /dev/null +++ b/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/ios/build/XCBuildData/5e07b0fc03a98d8a0604f07c05fb3e42-desc.xcbuild b/ios/build/XCBuildData/5e07b0fc03a98d8a0604f07c05fb3e42-desc.xcbuild new file mode 100644 index 0000000000000000000000000000000000000000..01cd99202c3b33520ac516b2865984ebfa93b4db GIT binary patch literal 673538 zcmeFa>ysndbsq>)G|3@Hd1?EK%ezk@e{A>81l~qVTA~G*AHX=m&!A6$S9v>dvyL)i&u3epuKXf}Y zyEmB6X702#96#;5c7N>I?RkIDwI5|q=x@%MIg8|N_u&2ZL9cUg?A*KCz3Uv@Ik?q3 zc)xRSyVpK;Zyo(CQTkcpofr7;qyOd9nYk~gGiQ3?&aB#eG;*ib-NQR~@XD>@_HoyLWGQ@3s%9Q2WTe*SmMn?z+dlTlXyM#Ft0L#`L4*<+>5@436X#9cIGq8h3a_F?_A}dciag* zUfZgRUAGDgtvm0`u5CnjSB3f}=4Zte(2B?23>6IwAl2r!T*|?Oov$UD^Nm$9$FfU%jWB?%6aMW|NJ;#|Cjmm%t$V(T>iXKEEMy#|N8*{-90!uu<-Zz_PwK{gM9wp!NF1f&x5aon;oigsgZy12Y>M5 z1znu)+&yUDx#c*wkMA8F-0nJu$G7jex83fc)T36_Qm;R^pvXy;;b0*%~sypgN_QUEXG~;i=YU2t{rMb0_2sPWOW}rj=K-~!=c;lhi`;xQm$^ue-U>>hI|F^tSM&d^@9>S<1)E) zJomt|Iura)T%9!;cRgze#w{Q|^oxP>-g_iE2a-GPg#u}({3U$fkj+oB~sk``Rs5$(7a29v*I%`S0- zwD}TrE&bRp#!UZxu{zvg+wF?g(NkBU>$_vTlkT`H7b{H;UaQwkjgLNlnZ(hXawe03 zo07cP)Jr*@=gvBqErapJNB>T-yf3F=<_v;?2+_O{%aed!u!1R(z|5_snAu>SNwC#* zCpZD!Q3qGH7ZKa+kN-R?xW)`MGb@_;vbbsEqT7S6c=_G+s`9_k=9YM==NA`zs0ZVPnkH=S>G9OQ!I3hH(UH@y^h{?LTS#TMct4Rw9#c446EN6j~1W9NEPV^ zI-XVmmW*djs55^ZojKwzACJ(V7=*6B*DihmO#I?+S{AlGNcCy3Q06H{#KMv74i;bV zZx4&V9aU`XSx?0!c=1_rXIOmQqB`hSHpCRl;3R<(5 z-&}9TU}^sJU&&n}$!jtxw=?g>CqETRH*9|I;WL*uzroU(x&~?!@9<@AJ}}Er)?zX4%`cHqN(nWU;dYGkb2+wiMsv#d-dZ#s2`tx z`JZpvwBR1R!RWsDqnE$w4_GVe_mSp7Io--fJqK=QB{HdH6**7_m<8?dB zJY|fDF#HoSM})xV&&E7)AiJ?T8_jB*RR3}DgAGoqhU#Z|qREcN(WghiR;L*+qQ$4J z=Zh~I?OS|K?pBMh@%*N37)KhuleeUItlkjYFH~XHz#U!8F4G5#-?DnRh+T}JfPf^) z@-D~E=;*^sqt0O71sgtt_6$35Z|HQUW2=p)+0?;4Jm?SmGt}?}6zQffM)Q03@VkfR zbS!7u!B*Fkw=4X-P(Od5Q>~7JYmYT?(2nrrUPFjxm-*_JrAktxai7FqI0+O@Yl3SG zeFaXBr_LaK_s*?@1DrXbe5Z%}^zp6RcaS@`dc3h%9_e9lDiPluSKI8ms5B*d0&OCd zC>=oG^cy8pU28l-4?}o}O9%`wRD)3T;Rx;GDx9evBk<^&F&3Hb!nPi|)9HAcUiXDB zQQa1F#TQd&a_KF;V)Z7D*8yAMA(2k(U$80%i!WL|6vGBFMAQEczr)rSqYHGGi?-ri zBxZzkH{Rk`0tKMrnvG{y6R=fZQ_Y*YP&AD!N?p8TJ)Dnl6~}HvtQg5nC5ir!_`Uwj za%SUUzk|^w(drCr?BYLDHQ^+N)RVNU7Ei*y=U8)^?U=pvX(Ev(M33fg|EVJyD7uMr zr{nR=!rJn@#c%LCn8@H0CN9@H_b@O$>zV63S^To~P`3%6fZY*;H0XgveAt}}-W05g zJG&fraiyPiF6oQW2-R26n-F*Ti`GLhZ{S8QT}-;g=dFj{vp$vnDs=@2cCFrg)Zux8 zBvc?%2TmJY&@Y)us0ex@e4g<#zOhezxxnbkH!;WN?&59q+Hf+%EqC0#0-J+ef8dD0 zc?hPhi;*0UFav^_Uzb#$jK5iXKH{hWMeLG|un5n1?8wogb zB8410EA9;6pmNRRub_j$q!|VA{cUWKp(J+%Cd?=$x}-N4JAs#ZI7isD&_DQ~(R>i7 z2s4ByfXX*2#H7ToIK{ofx^v5#jjiJ&>dgtZ9Molbu(-imp^qB5&jx*LI_|hf153RD z<^sF-bn&;uBNkF;rc>p_K#L)1a53$s7;gQ_uVW_pGnyuwOI)V7^I%KOUcDAe%s2OR!>^ZItjunjmk;0&??k2<^01+?S89Ru2yP|&@1m)IlKX} zIHc>xM<>MwYW!7BJFm2=ne6?1u2pZ;npuAF>zpHH?d43VRLP=z(#lm%KFGEzs3TXb zS2K<5nP@=caW!AZnemp@_pUrzZHwLpCuCJJ)SfN4|4JP<4#8s^H@H(7GWpQD@FN zHypy4(8HlaTS%LvcsS`Mq)oS+IVng6t{{&MLAJ=)7qOf1yul_n9$>47sT^KWI|(n= zuVRbEVTWy*a_IbAye{1izODbmIoN~6EPP~F;}Td%C6~Tg@+s`4E@7>*xUx3BHLWcu zk#uQGlUF{ezIbh<9qdU_q+egBVA}l~EqTdBd+VBTVav>Cm$YZl z-;`#1Y^mm4jJBq6GA4GXUN2dvwQAM|qcQTlLF-~V=|s@$ZBK6s?qN1{UHe4+il8%% zk4_HEQ*q=|6VDMef3P*pLOFM0(?1cl54NwpKXu#CqVSX`7!Nz8mc_PfD{Ax*LG2&K z_H9HU=ikr*gpKrwHav~34fL^m+Gy%JC4%lhjE!!Qn8pE4cyOVfrX5I)p#MBx`nZV| zb3x*q6hS$@9xwAf9ovv5tWzTBZofCE=}ZB8 zOb9I`UHu$E^U2oz4~`tt2G^^!Kg`;NlahLlAl8k8*lgUM_sFM+e?(B({=lyZ*%0;O zm2EymQ2X7jzsYHPZXc?Gwl|2V|M#}8zXNg2)Um~%2nyRzyUt)d@3wmS_zpcs(A<8E zAUYZ04$*%~V`M%=P@8PshxBd40=As)aNM?oj}a8NXAXQ4kc?fC)ZCz|k|HQ?e=+eX z(-kQ2v|D-|;&?SZdWxVIW6ugL1#v%`s7~53lM}W5qS}9*`5tj^oHG$*P0CGFcQ`sVWdUS-d=oj z0fCB@eeXS+gej9r1Py2Fz7{lS$66t=+5XVEUqs*1-Ez@tb*uLQUvAg`xUCbsoR3N983yr z^C5!T_TR|_y69QA=R#o$<*A?cxi zs6b1+7LT@UimoZ6E(1kU6pts1dTcd=|5uf+ea(H-jn`!vMB*Gz{PmoZ@husVUVt{J6!Z%8^OhQt-_|N z+MxChOKZy-l(ueB*}A5nZf^0x_7$od(4rb&T|%L@$ZuUEY0ehq?W>V1lJsOTR!8d_ z+vT>iL+ux#4QNq|t!AP?*J*e0AhtRKS}1JoarFY%%L=9#J3uRsVwmM>xTI=maewPi z_q9JUeDacJXYp|R21Y7u7LAxH4ya-lzq^ZCebq{Atqv$nVwhJU6-f;Hlu~$*0%TF# zx?7cIBZiils*AGo;ye5{o!$@}7a@%5w>tH*HCC_$kog6kL#8P&UnNIHf+TnV6KxH)J!a}2vtP=Xx8ZfS~$W7y6^0^t}=8X@nE;Y&?{ zZVWqQKwulgf?k%z#_-Liur-D@E{j%UxbsVCX$)U$ibG?l&Xjk?u%jrU=HhtW4V46O z1+gWsFCx&=J8dIuYiuoV{a(@46qHCnaVutZrAVs9&`t0Bc~gGvbe8U<#8Kcf>s95EpR+Bs+2ZfA|KiM8?5YnN-kgP z@5}mA1Wi~?mf=GJj}meSGDxn!Y(q5?Y%nasbrZdt&F0To<#G;gg5}2IZFtjYs0m6c zEZ(GVHyjb+Sp{D>@=LS~kJrVU_4$SiZ)dTlZ#RvZ5Oa{{j<9VBzSc^ryCe8Ni2jtAc2aB<@aIGI7*o|slTb70w`4m zihDqUm3^m0nR`Hj>*BGk>^~)RCBrFgbxIErvv3bcutwy&SN3$k=u3BbAT^@zw>N%Q zBkdc91&Qwg3B1J~kU&RpTse=W{$LMCpuiA(ySOM=1V1-oRd4T!Cq^S+N4EzgAg54o zvAx%cvew%J5-bIHUAaB%0SUJE4ebRC3w?KP#wUo_Mz&`Te2Q9^znm07d3#?+pUfVR z0O9%cl`qCI9V#10emo!nnt&KK!Upm_wLd~GGd3+mXvZH?*R$c^=)6#b6T<)@(11n5=6{C|0=(> zz2Y8_z*E|~7(93OfCSg#;OE9&xVsvj;OEI# zoWTlWb!=wnf}fjVhy%#r<$DUr;2MAK7;z0=GpL5pGPEdmGa(tgX7G#vbpyNL|M}~L z`0r=x$ERPe397M*!+iP8wH^3h{L#zbM8Mw^0*egXRCkt|A;cJ>UiU|-M-;+5=k}cW zVD{o8)woZoABms*shlm@mv3+&$1msWeXQSEH`O+oBiQ+q(Rey^27k;TAOEcL@;$#7 z@oNHD9n7-9;OQ`h*w~|s)M4u&r7}MLS>pd){D2fWK!2A3BDuF|7=Szu$aO>;H=;t5 znKciJXPcvvdXD(qGRK~KQ@f3T9!w5<)APlrI`A+QF?knX<91p+%odcFhX<(xgskrg z>_gWYxTA~NC8AsZmen&5W)Kp6{0w;Gh!HL0;39G}LQ){)bZ_W%remv(ry0eAN5G9? ze})>qfFj-W#b|!-9%5zphU4yhfbj5dSr_W(4|FP`OCxFk$AM0Vhp{9Bc;qOc2Ljnn z#kZqdrv0aGm*l)QppZ~`mMTe&5Y!x@r2*8gXd=A(93jp71YwWJ@#(vFZXFyfem$J; z^pKxEzIFQ!a_3f$X9^H^_OJy%FR%p&EbdOH<7wImbIu{}`<`RXJ%pD56C#UnIz?x< zuo66Pfk@?m9^fz|qYDe-B}Ct#2=@~N02$3LU5xYM^YBW4)<<+rL|R8Y`?-f$_B{l& zpxCXHgbHNpz-haK1)|>jNvH_1@Gympm!CR-YibYN#g}w_n1FM4@iv+{oXoB)j)wka z%B2wO0^6y(_%#Z@KI$T2j}&ktq=2`qTrPjoJWU^BjC0vawvwqWHC z(3!kOK!k~~hYONlI}VTk=$dTdY-v|Tp?OkAk_CGdwtdZvpS}Q`& z_13kGTiH9>XWrJoBED<;$g#Tiy>I@F>}QoYbMKq)xzrZ~yB>v0@DI0M5vr#H_D@=z z97v5=Dcieh1?aOQevtUyH-GP&Kf~3gHAGBE*Iv1^N85BsE2K=wWj|sjZ|{f|Vf+>4 z6(2$SpKQH~BWU~H_ff6zb0gXlS6}RX^CLQU@0)Lv>q3Za6)|{h{24^_+4gaA_rCdi z-~4MGKtl7er*R1OzWICK{B2wTmEjxYzEA^9T~~W&>y(HcZ+pgC(e)kiHDNy~g7V%s zU%Aw7&jzV6FpM7cAQ)*8qp-dBMwv$Lee+)>I}C08d*A$<`#tY{^QRGudGDL=?|RqY z;$_$?TmIciUz+x(d*A$P{7+YSm?KQmn(CPq6=(q;qF={UlQw%*ZtnHiY6kzWD*fHK zD&70$Z-T9HQ)?+UI9l}A9W-CGcte7V?`~@wzkUQVzp)|iMQZEzzWFNvM^<)Rp`1I3 z!5u;AGe~tBV|BD+V7n}AsuvH<4%NEQ1{9-fI#FP4)#5>Htqo|Q_P+VsNFz=gWwk?W z?=gwW>cU2`;KFnb_Gb^b9`k5DP7Dr+5h{|!@5a>JfXBbDT8XXI0Y%FCfiG9?b)ql! zzWJ-&f>w5&P*lVa!dYk}Vi?TMU_9@(NMJ4Y-SXCxdheUR_s!pgK@Tw*G!@&9=eB4* zl4bPvCyf%MYLR&iT!5<6mxeFaj*h%?dr+13N6uvO%x%MF;o0H`Tdzn}?O?q3&EJv* zz8H@$2AG?O+1%=nVqnotd2tNe`QA5w@0-7&#zIOJr1?}Sln0kzWHnW=D$IA*lWD;->kng``^DAS6z10e}iKZhim@7k-pYRAsrV^ z?41~W@n@Sdc5932D{V6U^58{G4%0U41?(Ytn8OMG>6;*Hc;Ekf<<9;e)Q|u4yzk${ z(2ZZdzuw5vDI%td81rGkasJQXt&7P4e{O4I7yAGB8eHhVXteK*JJWx`>alY(!l>^Z z>w`}Jwv>dY1jGP*t@~YeYF&KO_x6{mt~G{Riv>UdivP#-ZpBKmazr)Sy4+)5(4=3RnFkU-=O(3|1Ss$M9 zYk1znp%|aWGn0`PdISd1hX=g3+A04x_#I4SYwAv1X9jUUj7asLlyuOz*sbgS zBfNnX@Nk2$bi%r4V5N}H&X zp;W{y{70K_R3Rm)NiElRE=FT-hTSKy6{$0Zm<}M9|%14&2;7LXEl( z;G%n6r$qGl_IM1>ZV03!o!U>7m_o@_n)pd{AeaO}cKNj*mp+hYzyF-&{Rfoq(9R$4eg zbTVRrd4G0gn-3B5ZjU*z#~iTw6T*yy5~io@0tMtRpdcfXB4$wxzVMpzp!Kv*Vo8It zN{XO7+j^7M-%R{9abDqs2&&sNM9N%Hn@ei{OPvxyH->&5%o(f6H>uQw{iF!Wd(447 z=763luK@ZIxCXeEGq6F#WZM4F37Ux7!N&-S+xvH$Hl()s5JBz3tv98RiK#80BWP_8 zyfkt~<4M~Vep;CVyhn!tNib;yJu;WPkA8P z)p;A10ej4WSIQh$^qdy;gnMOo0D7ZMD&;SS9{EX>h^O|%1WeaXmNk*8h!0g44$A%nw>r70Mspe z%z@(8(-iuX*|4ncohRwz#enp?xtuyTFmNnhvRk}-r`Dx?2Mej z6`5+pi4ousTG08{Q&@j>hm85^@ztj#_OVu~B=3vw#n)0PXOH2eSrVeh@$E|j@;&Cj z$ZJgo^9%UmZ@-5t(AyYp4qDC}1C&}&f*ivEV~U7lxY>jR!Z93KLf#w0mzvVu75RIFxf;VadzWw(Xt~c3gtZ$(8@akJzS`}%h&V}- znzOAp+&$*NDxQP{aRsr@uP-9d(mO3=unmv-wIQ8!HR@`tfl*ESx>&fM-_;dqN;5)B$!=3=G=wCR0Go=FeE=a&GYp zR=Kfw8xcIQJ7G5=A3Y=$7H`4{_!_W*H{{pNC<8b3OlF*bH_?xA00jIi1rWfV^}{G+ zfCI!IrwHQ+^!}V;yK}5}FV$~T5b+eT?pN)xGwtd)E0Ia}=cF94c<;!{p!8t}oD-b08>x+9E#K~0w(8c#4rnAK{qdf#9x1Kpu#96+e zDC88)yicbv3J7oE#b<@S0nwMO@q9L!&k&Ft?yvAO_l>@^d2J=e zioUSwCsommB3gl%ztoCfw=CRN$Cg7*^Kjs@I&%!%5T4<}{Zn~Yb={}<$i-)c`4{{` zLm8jxPaFz2jlkHW{t!-{*ii=KEAoMqB^RIJ81Z;h_6fxxc4mvOUCxKj2!6Xxmm*wS zGi>;9^o74CMZISSN~??OI(cSZEjq8E*A}~&elHf4N7+g)-^%45`lHXjPc& z__wg7%JZ6M9X4j~iHFm9awX0rcHWIVq<{RsXHlw3M@9j=#>?N^baIDOrE-M8JkZ{! zFAV;{^zv*y3UqIf4DE`VKK{w#tMs`utQ7iG{s=m^1!}--@wqnOJ*QWPbb#Y%!dbIe zGmeG7c2|BLctC3r+qb+}Y_#kDB@J3Kx`RLZcM0*|r~hb?ymQb#ICRJ-K9@TArc>z~OZyS-4PMH7*6+{x zTk5w7pS?H&+nzIS#VIhfk=GaA8ToCz>b+cZjMkXcU}%1M@hfWU;$HFFxA-h=V3RA_ z$bik#9((TMtCr<;z)HK%-OhYQ%=Drf-x3qcWATfUNN+qKnQJ3H0{Rs2!bH9oACW3_ z69_;Nrm*d2kaVUc54GOZ8M@C9W|J<86Wn0vqOCO4Q~~H^{L;a>t4Nhdfv*EN|kJ;k>BK^ zx5i-W4xuq%1Z-fE08)JBCj3igu2|cEY@(jKU#nCa8@ysysaiv1JkfRAUKenF3>} zPmQ-WV{m@kKb2@%fj@?50)i3Vv3*HIB%A!vUu3!P388xAl+fa(z2W}#@kfilt@izB z>WfXQ-0;AEp?mKuYxLevHGBB4{mz@TpQi@>(G!>irUqSIU*hF|yJ2rg#w^7HaP3vE z5`_#Zwy>7JJpd;j;xEAY{rF|<$KyvI#b4*k7&mdbpU>Lem)}}{caGwFe*Di%-T1#% zf_Z-YvroOZV>HgsDY4|&7(mv-jsf8#?g1>Nd;^eY-?d7cE{x!4 z>R(mostQzH@rR(qvg3h(#j|UD@5$nL6Cz60v=60+$RW1az^L>l1@XB&yq+wfCgm?JKYa_M!ClX6-k1UF<0bf#Ke)9b(?K?f6#i zgKEw0L+ROjv-W#8fhyaZwcm6z+ncqoYahFE`}$8Ll-}Q4_d~S^D3wz76MOS^0e2?2 zO5H)~{$4Ka&D%+er8`DmNGFrB>v;1i$Gb2+3D)*X3Dp>rdHY*z&BR8o|J9~~RVgMH zyFo};7s$Itqy!A*ZL!h{ylG~Dz@@wDqHTEsaGkfv67k}lu2%G{f z{6;TbOYMtLqdHxwS@lVOg~IW`0+$K32D7oz`X9ZC&ZRb_%vO9ERu3e(Xmzhf4q^@& z4g4}Jw4wgdfqtNt_v2oDP5!3Av8MCUtUq)Yf5XDKX7OjxdG9?~SPZ-$QmC0@ct#9< zM6YWN|J#`dg)!p62yMHW^My>OgLpC&6eIA)=U|RS!4Lw8Z)fJ+{+Lw0?eX(K&RbfZ z8%X}LPL^U`lk{8J!nr$>76^V@zm$c(6zun)JcciOuvKr9-1C$|Ns%jburlNnhZOkR zOy(C#q--WL12g9>s;caE`%WPF7b&@c9wGeDt3cN0MHbAym+E-{$G&kO`HKcNavH}W>D&LF9*lvoj?(|0Ty!s3SUwA%E@b0t~k{Kxqs7tH{^sBD5gI`qumFx zzpQE@lk@QW`J7S>nV95Ks(bs0Xy%>LySB2%->*P~9cz-N3-lnBa4%_@E) zqJV+mVHW+eC@L0UrW+j5w?(En{-T;7_lLrGT6Q{t0P#(zq8ZFZS?KyD9=tr#B zFY;=I8OIfF`et+A5(Dcti-F{KMEhyx*M%`)@IyYYg_LGxU-;e}-X}j=S}$)0;5E!Q zzEpR5Fztw@QHPD&lmI!*H$G2O&As0b?j&EUUwJckh&`d#znEi34sTh1qgf2U^BJIY z3<7n3wga=SX>e2fa#+M@Hs);;PCHQ5mwHONB=9WEx8CvdG&F^o|BHTpcu(@PI^j*p zuhqwXFl#mPwYL2HTN+W`l8^POJ|`nsE0??l}1&HT3m9_VJyI}y(0 zX8z}tU$~k0cHk}?$O%M*;dKO`?;~5V&B%-&8IfBQu}kdVo8&~CLwtQV~m@qP@u8Gqh=C!!Rt#E4W?9i*-cQdm?E?Av6>niqt z@FFoLu;CK+fB6eU*t!m%!2Kz59eni16o#Zct z-EILq;q#X+8D4;QfU{{qsuq)2=D`#Tdv2?Ex=_ir8K^Cx!>vxR#HhlM)_ z2e*#z-YR6#cnrwrcrJUFn8=;Qn{3OAzxv5P&SV?K%6Xavn2AiTbymr?*!!IP5sK%h z?2_;>pG%)t5}8sXUpt3;LhH0vX;#yaIP`i(Y8h?}>G^xlzI`#ao_*VSZ~Dl{tUNr= z*V0Ncg^Y)p$Msgee3H+#>JN*BMyuY)oaZvNT&q+(sby+KgcN?9ud9;ve5QtY!_7MU z;mH@iE?UI3AhA`?S2Hzg+gU!7%h$@8swh#dmh!FQIk&uI_|$862bUqSafR}I5E7Zt zTgo*;mt87R$u`UR^G1ex6VZ{SD}^p^=f<76j`JLTTYT{2sQ2J12Cs#y@EeUvrBoNb z7X}UOLqP%nkKZZ6orIc{f7HmI*Xb7w!&;T|(qryFeCOjf=_Sh^JMV zqH{$yhNGTlo9F}$ONi|WlEJ(^hddh-l(C^s>Lk&?mSb@ry-Xu z;>MoHm_^ZRm}0F$rABkCn9a9nHI&lA)8+8++jn18zEW>d%V;&S*UMod^B_|!Wlk`E ztEEf>RhQ9LVp3;M$6iwY@&KX%vEO)_RDNUfho3QYI%Ds7@)^ae$BX<|=O)n8yx>ps zSfFCE@IoFsQ@CU#PMSr;`=)K;LB3VX*DK9h7PEzC5G_xUPd$a+Ja5#~m(UBql_M#( z6p_sfVzY1qvSPI~xMPd;My+_#F9*dgE~^pO*DJz?PGt4;T^L$beHD z6yH48%r@#`ZEi*-WW9|V&vO_|OeCyDR9QeIb-9~C?ch$*bT@_Q&9ha}{G)uf+2AQ4 z3)2h~g(2FjQ1^44G&wSjG;Zl|?0TkCYbgD&QoA3ZmG;kCRj^uWo)*u8rKAI-E>bH# z@VD1c(J4d1$k+|~jpj+In3el+@C8*eo5`MGRD1?`KYmrDEf8 z>l}+qq~P48H5Mw4{PSk1WMpL@J!(;v&CDrILV1p+FGlnC-aB|MU*|G>vOZ437Y+(5 znUO!|35JH#IbhT(Gb$$^WLwzbjT~9FC01ZPU+0sBPL6b#w~_~#f4GVP!80a}+a+na z4cNB%z|8_Y*-eec{SgJHmvLNE0x9XKGw2K5nQZjKOzpgNf^NFs%4VvKW-Z^!G#iy# zzLd|@aRL~P6-9Ai(#lg?tlzDijs2^f3BQBl)R&EG-pl2ywLE!j=33lM#WL6p%?OyC z$z-q(=Cci1w4MPsg8?J5t$eLkshQuFFIO=YPAa*_;b!H}o8@boR6H*f&x>G$K&mOu zlhDV48@lFw%r0o6H4OrK?AQi_tP|VaC_F z_m(@RhIyXHlBrb10;(66x|xm%bTjtuMy2t%8kp2P4)tao2YRv6tmBw|z$0Mxee=AQ z$Iisdg3iY9=d^OoDz-M-4$Jw*StZxP=9@iJ#p>AXuoP}|WCV-`t}`egVP$sUc%JK_ z>G{k#J~vOtu<8wBZVYx!`4|&-WE?z8>lG@QP26E*d%=t(BCicR_0WYab)Tr^zt_Yn zkQ znB#XI69)%CD|u`XS8f(M|A3b0Nd|X{0ExhtV3Q@*0aE8Npvn3jR8S(;ub4SKuhbjG zEVIZMj*}t{Loo-YyI96zSLuSUES~4`k5Cu(EfAymmX^Nys1O`goz^iNqG>9D-QSS? z$O6f0?7<#^T&lT3@Ne~2m1Y1l`QnqXUz|1t=LhQT`2~s^X>yal0Sg!Ae}dIEu*1c@ zM5yIUyp^0BB;Q4T^)amgtQA}&A7JA>D}c8HzfU(FzW>NIgIm#g3%7+rE?>}j)iatF zw7pbyn$Hs#YLzmbz8L;iL9tC1C&i~gnD(Wlf z#YDC$`7n$+wsR~boQxIh+jWQh=IZMguoN9K~4jQrDR3!)c18hCrj6&O0;M!gcf0>3Hh> z)^QFgfMcN7Dkp_zUEJH#J!jw%N&`eQVk4uuS5*v7E`QQI1?PU+sy{BDkVt@*G^g^{ z(xrgDQ(h0cK%?v-yO3#?hy@V0+qBO~;}>E7kt6=#=`ht9IHQZyVe3G@gYBw;nlZ`2 z7zjv0p){3G|$HiIxBzvKwRa83;;K8qZ(1tq!)O%P|BQ&mxt=YO}IMrtpsU# z{d?GU3dKih6qLb{%~#VA@8arxv&P~@zooF7Y{@pZqT2|eM}wvjucnQ9rH%=huM-3O zAX92$vfoP`B=4mT@&6J2KTeXHJpFS>{~XajNIRsoLrOcOv_p}0D@k`Z`Ue?DlyO8E zM=4|+Q^ql698<0O1&cPYdGQTKhMvRV`IO%X zVI`Wm$w|F7+Zp-MV1KhLGkc7^RZ2|2Hn3zuFkOWrgulEZ6{abPSfy}Mj??<5pIH+9 zuByaVzUetCk%Ej$xc5u~*B->ii~fnfX(QCuX~<>#j|x`X`d+hwwYJGId~NMYytdg_ ztIgi{`mOi_7G*ustV@V3FsQKDd(-X}!f?Mw2~Bsy@5MAxtq>=Wl(nQ?+VFY)ae5=4 zDW`KsnWLk7kM5lwC2|3^fO+lm?@czqrv)B$P)CphE8CJnS(A5RDGM#7ioD*nz$=`y zt_Jh}12lj#!K1QNZ8n^!U90QO61hf;`Ve>9&DRR`<10|b5;7aBzZB8L1U(g~qIB-dK6Wn1;;2{r)CfJzOM zEz=<7U_G76VQ`^Hag!dr3liw1{ z8h?Ar4FJC{I+ysDVer4jKS+c#^OC>wt#2m%7Jz1`72irt+L%lq;vE2H(JwSgX$OMR zb$`9tLjUam;n6dS2LwQVX|sf}aLr_9`TaNK){@}qPdBTL7pAOBaa52#=rySJEs-Z3 zXmIrS&N86;==Jb=h5mE5OFlYYqEKqmgdv@vVqoM=XdUs4e%)7$@%M$&x%2jWb-z70Y#L2`CPEQV<;8A9UxK@cu>*V44a*>Qbcy0Ew&tvT|8e%l@r z9y>7kW(nQ+l@r+DiF9Fcvr%^`y}10^%(c0>*erNfB$MxMDt8N3Kj;bpXah2($}LoL#LKA!$B$lAy{IKH+~ZHD(xd=*o3$p}Bjwg$Y6;%g~a z%brQ`)u~;L;;WLF19&uSU!m`%6iZ!FRa$Ui-{DSUsFFP&!T?fn)f@1S+DWCpPgPvi z)71wKm%^bcu1d8N*7g-v4eY2`YGdfA?Q1eUwzjWL#6#Y`9^s!ALp_7>yxSs&rSALu`YyV~~6)1FxDI~Hes%HJ%`I%DCG^e2;FTa2yKzHo8Ysr=_+tdr(pEGLxm zj?;d6F*I^126B9Ln*MXv-{JO^Dxj#iYKmp`1RW^1Z<^^&xqWRRkf`k| z6z-eb*E4ZCPq2pBp)ZcwjKIe+RJRoOc>6j{r_-2f3q(DRq0S%n2-ai!icE*t?Q1ig zXt%FTIo_^alSbq5k)bw!SHqJSP&S*_LRZ~3oPIPoM=Z4|K#Z6wTSA4p`FARasi>I8 zo7XDfBrE~eU;%Byf;P|iXj>G}U=&&=XJzM8L>8ajlq4i$(U4F#tx!N>7)^gSxt{Qj z=5j$WD25nOS@~oV1u}$H${Is9&PHXY+3d0Q-GE_20tu~bv_ba0dz_nlj7nf8c3x@0 z5S4T^^iJ`-#8xjEm;+X&y*)YZ)XrIdLPhWbv}9%2^sw=>F!-U2N)_53*pRcmPlx8`TF47sTow}IObJ?#db*PoFikMku{ueZf}77U45tbqU&RNLH4Xc;uu(B=iRx)K zFG?RKli5nPlBrg5bv)?A)9ML1X;Ei2Dksf?ZwUtj$ZDkq>PBf4hG_tlf5%7U@pG6& z0`&>>V-V~^zeK(lB3bI3${ZsH0&r@hw0a76mh8^P8HDA~%~Xl3?!g8bgSE&E7)q!* z6mr7EnDtszryBG%tfGwKEyKPsksutN(wb-7jMfOzmCR-xIQK?ZOuPA&z z=@=Dt(tGJbnUhMB?W>zGdMATs`WR^$tqZ~2A`i1^nASr4O~YKN>2GFIFlK~ZIHo}H z`zS-!@;rN5nbT9U3xzh+r`SBl7{ZFCc@8xxJdy&O4&u(5qvJI{3eb~emDk8&d9nDJU zs!01t)^vfF*!-Bxeret{PsDsE=F&$PEyLYWC{gM2gtr+60)|!%vK1zmMKZN(NrSPI zJP{&AkC=T?uPQUq!24`mCmfG>xWy`ucpbL-RpDhrzk(h*JS-9KpbNOyL{_+J3_HF- zw@N5kRO3Qba@hw3?kQ1QoQfB_Kk5wTT{kubj8ep;w8qGmen@K{H$oLjheb%o6I9LE zCTz=2$SKW@9}#4yWQ117CnlbEL6Y=7HvO}c$`zXkVUw+SMm+4280mL3F?!fFF+-UY zplhV>vI*3$EDzPhb;>Tu22@j;bRc!-9noT)q79<_V;4kBb)#)Q?1GrkM%o1bxQptAlF}A`c0wSi zy|hCJl{+D6=r`fN?<+fZL98d4y%wuK?cn2X2`c@lK~yE}mN4Jx;b<%DLD^0CISS9V0uvF*zWM#rmh)VUW*7({>I^bQB^$}k+T|a4;giY14 zCT%9}l6ZuMS+^k~ZI={n&ztwmFcJd%HSs12SW6 z0se~jwHPb5inJvHqf3q_@l_12KJGe6Ds4!Ib@dx4&pAqbL0-9lSTc1hqrsIeo#Wy9 zB7d232BqP7Hvxd0JZV4$#DxK6aaMr`V@QRcASlKM0#l73)%v(eK27-G9{ERbBF$-R zG6psfYA(MFJJAZ?GrKtIjp2KY;7dj&P`Fm1bCtjuAVVOW{`+A+xX3zu4LT_r>1A@5 zB&Bosb?pL7^;D@Tgb>mnU3hqnYyz}~TdU?+>n42~&vLao6q*3)(a^hdYnY^8kG^y6KCAbC6R8@Ug`op!ntuq=9g(@hk(?SQ3upzdk4^-SSKwr+ z=8AG4$72YKkf$O=fJjJ()^tiFl0C)c+O4y_yXavfGu!uTeTq5NV8 znnncjlA>WiE~!ckzxLPWJFD3;-yBr`sybIytQPTy6jIsoV8AF^cCGI{xrv3JoQ}C- z9qCbaa&|fM0j2`y9z^68&ncJR1nz4|g7ype zct+1m13=H24`vBKq#F5>vF85U@U#lqT*<==lQki14(V9Yh}s6~qr?~XWHA5+6Y6wS z3zkM*?DE*ZuLUbklp7`3$T42555C7N9wC*0xnoR0tmvojCyW$n_nGb=-@Ow^m+4W%p4h(I+)@Yi5*eOj(aR%Q+lQayeNCe~rp|4sV0NSD;A`DEMnI*)V4aWkdyk4HaSR36qEtY-p)Y=mo>B zFgl0W#ML>5>?OJo(I?&CiaG*TZqYTE5DQUXrhHwZ-&X!6*XL?)loiErp>x0_Uqok1 z3$jqA&`O39bs*(nx^Eq}lpeI=3S~#yUqzM)_^U*f2pCMgvVd>Q6jfCF+eBpwPnW2i zfTdDY0nHW#GnoquhEWU_FoM5^GiYED{56!!0BAJxRXE0AzOn=gruxBOgXyL@PcSDK z{56y(gTIDSX(=HHV<>ew_-n8L2Y(GFk@Zh7MS%;Li!5YX6MDh0g9+wnLksD^Z&vB& zDa(>o??PU@BCE5sq3Bw*Va1A9hsyq8MZPpt2<3)N45G7ry?=DRshp24F<1`%8ePy( za0d$n)wrQNXp)yxCJ^zP17vDugE>-%8cbB)!)6tx7eTPJsl5#67@EdV){>4em~U$D zB60#swotzEk2PCw>ac>vO@&i1M`?(V8Vvpl7D@?IqVh1u3G-j@8OClCu7r@(3G*zX z4icV<@NM#}4!^s!&4dfkZRXqz{u)6=1b;<_&m1bZL&08(P-u$9%=tcc3G#`f@Gek( z0I)xul5@b*87x5dz1C#DHM^R)sb^DMliVq}D=P6m-UD!GiJa_6C&4#}W$FC2=(jeV zHLrjKRr2fa1cd(aRLkp}Fzt3ydB06J>`kghWb_$C&_mBw;VXPhTZuFrXLUFF{Oj7N zg&j8;wDl{#QM+%@fAoq$E8>x-4*x@$6rkxl{4dr9q-#Qw3WbJ7|Ktb{($!7t4hZp+ zJ4`vO@q-|&lUAyfl3{IA6`}@b=K4yfL^Xg(5F(QeKa9qIzOrAB(^Wyn*d@b^dXvIr{+9RVkys0K7OpnzK&_r!5)KG$Akq|8@ z6M5Aq7o=s@B*R0d^JUCILqB3bo<_-AA3>$+(h=jULHr#>Pn(Fn(Jz(p&nFyg%PqJ8 z#QS=L<@ORqGa&Lc8+iR8wjNz2LXP;>tsvEx4!J!_)0-zlrVPu$yK!!+>p+Efcbj~3D8x&AV zObnr~u5E=>|8C~^-T_KcI2%>~M_Q~z1$H#HXBFd-KpdpnAWAI$3c+!LUl)9-3?y~) z%0iyiqHYl2Z$#rZ*&Ru(m=ZN?AShPK$OOiPbkqdY&KTkw~)Hvn4J>05O1S)#2B5Hy>2etxz6*7oWAAoZKlPF*&AcQOo2SQK*tMn$474hp< z`lWDW54v@z(9Qt9f7%C5wm)yVw7S0VErkveT|g*r#BvdHQ)lsl38l$UHPVP`J!1_T zQc;a*?WI~6zBo-0jXD?kVtIcpr(()s3Q^MhBV@ zA$0;o&JfFw%0$*ue}K?mQMuB}O9cK7bV@D%eMlHe0zYQA8<(<0D?1}dkEiO!^y{<2ie$J2whT7FEs4_}CPATED7HmQjsVR{VGX6wWN3R92AeC@*+NX^ z$znL2*iscWVdN0>BYhB&!+b(0TX75#Z<<-bS9ABpa*Uf1CZ<$h4JedX%IiK!?34#y zNv@^Bz#QIc9c&V7X+73-^`{0HM2=@h9YCq|wBII}y;3qZwJ38B!5C5jZ2>~z5RC+F z`EiSaX$Nwo(MLoE+k0?v3O^;UOSb2B6ZL#GgYcn7TueWOO}Sh79I(A;ULyh@v2biV z%m%_OVOmU#6J_!yy_8FDo)PTVLoi*$Oz=L6Bx0GjK5IjF+W5E01N+`$_9fH}`Nv)XU5TAl4ki4dK zGVOOsnQnI78c(;UMvWG^Y)MR zXZ_xc;_sBmO+$RC+TL!{?zWLJon{sA9)RS^>zWa&(vjwdsxAbprQlFCnqHEB2?>8q zmAHBfk+&!e>5`lR2D(!Rt4_4jH&R?-@_4NX&OEZ0YrKJIO$p7GTDR(J)^47yjTG#Y zd4DiV=AS!5ASy=m#B!fqM`iiD5u-1n-><8~&g8Pmn%i@MecEx8N`$x63#YYA^$elF zIpki{;9gI}5QW;x=qf1$X-lNo8RJIsJ9AR7_sS{~5RcAD> zR0E17JeJN8@N)Cciy9$&>JD6>1dqnEsENcMwF$SkqTRA{VwzTVcifqi_JnQdd{2UF ziSM@SUfGBn2z5zZyELnt4PbRP2vu{lMIKa`>8->kuyGJ;)wDo7Pi~Yp88(MWQHt=q z2%QCn1BRp#P&WiiCmLW6h^;Rc9y1f27SY4W)e?CW;X1_GJZ8Q|WSP<$g-{A?Qn1i# zOOo`#8J5z@`fxrGQ)OV`(hcM8!O?+*zsI-l9UUFy^Y;!8j`Fg-;E?zgV){#Ip|vUK0goeQz{6Qp7KYD|Epz^Td}hqj!@@U{>|& z4%^_`pywGHNcs)!&KMBJ+(>J!Fa27j<8NmwuCeW3Z!vW;#ZnVj8oE@WEI9MC%zf-o&{oyc zJ$RG4i6%gvZyy{cn&<0#JfSdOS*vtc6ml4%07uzcS}8*K$#6OfU9nBZOB7Wj9JLe` zlgX~QLGXAIo=~#5AHpG&Z@PYpFPs)FY%M!}36V0r5|PJuSGX6x+9hDz#8}rni zQebFl6(g$>e#jgg)|^U#T-vXt7@$R!q%%8aZ4c+81jrhCxr=pgHAQhSK0$~dc9d7v4Kw010e%jYY`wOGh@+{j0HXR zh#?+8Q91K%x?d=Mi+3Mcog8JUbe4UUK0M02e+>DiAgOv#dA%KB#Rqew?DJ^p6}T9Z zuN!Anv-)bk!rAN*in!CKeP9A49z!&gzH&O9gfs12ri1>{iKouA?~GZ$N$#f#PJLF zuCABj_bl<=ix(gLbwd32DfJ`q$sYT0&zcm5v`x&l)0?`CAK-wc%h7IvK)UO);x_#`tN3v=+RGNq1}vjGkw51s_s03i^)^z5e7NE|@0 z2?}PB_o#Ffy}l4dR^bxi3jDX1D;N4mnzeqZP(u(q6!s%0B=t`Y;STCOPd;-HYZux4SHG4}5JnQM1G|B^rVpLz6L*^6V_kWk zYK^^^LBv{#eCnynIpT@b)0eK(#Q~obTZ+hz;tpSBpe5c^OM^QWc4M{T2_!7ov9KSB z5;wY{iC2a0Mb;zDY3u4}qapwx5{$Bx=7iYcSA0U~r~nk?IWonPpxGcj1TxO^sRnSc0958B?8LZL6Hg4qLBl*mb z%ZMT|VcTFHKg?Sx-d7Kj7!a(DYvBoO>HP}JyzU&{XMo@Ust`Ci*=UXq#o@#NjZkgi zy3Em`gb*1gfYDe{6rus_=Yd#NqFXr|`&T&=euwVcIMSA4Tp91dp#oP0utYhb_(Zs{ zQofAU&8M!}nM_7pEM(Do20_Q*9Ytj2mCmR+U#?;*oK$j;!_CT{H_O+23P7RAdJ;-< z>>V|}9ML{)R1I$En)flg0E~gd3}+-wvuld-%%D#$W?>mt17-%82uL#u;U;rIRq5(c z;9|5)1>#tA$JB7C$DO}YsfqcCd6N#9JIFn~hNDg20Fol*Pp{@-F@btnvlO!aalh#`$OjR+s+<7Fn?&78@|)<^blOs@@~N%Gtmr4HP;@ zQI{hA#^W?NxPhCLI}(*L3!Sq`C`siggqTkv@Fn1NA48x4*YoiZ+foM=l!)~!W=;We z)qnz3^m!Q?Y79d$2d2AN#$s3Lg0Czh{@o+gMe294+oqLpk~yk6tz)u+!c^KE*eVMU zkgMPg^5z6QQ!zE z73TVL!0icb=x-h8ST(?}RZa>`7~S$UM~M4<#|WN#RmI>ia1$F^nFeD%oKp?w5_4u1 z`jzfJbEdt7#sCuj#jRm~bp3nMa18~eLzVezI^tbux^LE4yy&+ShH@-)2m9QL zZX<*q4ceJ_HEq-@_2wx~HDZ9FtY~7g-%A}N@1+j${}KK_P7-b({c}kF9ML~WJEXKj zN;{;qLy>kXNq0B;2N_3{aYPwMDP$Z|#xZ3aQwBm7(?6VXn||F%@~SsYYj1XG7pz1| za6Hl6j>-%8xR{i8%ld`PeHCG0p8qC3+B7Fs5)*0mY}!@uibRm-3VTyS^eBasvdP4i zt#|sFC9!B!m0MT?`js%#ZW6fGW7eQ<2wOI*BSM3}vf377(?Y_qb_=hsU5VFj)?%ZX zTk!`h%6g<(mk?WEP?2V8N*ur5Y!Oyx{s`aD(o0q#P9WStn{;(|X~XCF$LWoHrku_l zWsZ*SJpzPf0(P1V9;{B`NTf#%q@D}t2y$R$eF$ZrcVQ_DEv1TNRa@ks!}mI{GasM< zlnFio_vo}8gi2538f*v2MiQIyoa0lS!(JoJ6=#{jAc& zc?G>AIFigc5aE661hcFGlo^&XZ77M&7Yf7y!r@Ib;M`I_Y`6AblQ#;!phCO>EeBbg zQy=RhXfEIPxe9mKcDr4-3&B+ztQ33?pY};*E{ca$&hkr@j|kN&AUUN}p6Mu%&O)XM ziL|(%1fizsZYp1d2S*Mu#Tk>jQ3RXf*D2o&fPffpf**zrH2K`>D-DYhWX0fJ9u)Hr z`2s7Gq@0DtHs$&$>|TYuQf8Aei5o+?I_x3WEeimX%Y-L z#6{!djUoXNgT_ITTq}G*BvL%9_%Ycs4N?x)(<%6q6QG})OnFa7$<#%EmP}n~oSuas2 zHEF_-k(6R!Ht_G)uM5#RoxA*fp>*zkFv+RIa7MFy0wWtgS+gDMbbz=JJDp3{cBZp_ zk8s5Rgbkk@*CuZo^=;zpxL(_(3ybT~nj;U*gFSTmBg6=p&Jw!uD<`m_tI~zV%|_j& z^y2bs3vQ0vofS#Mfw{gTmLe2{E)8JS2%>WBXgXrPV>m+kL;GY*;Z^GOl66|EW@D&t zih-C-T_Ch>`;8jQSAq6!TVa9mY`3l@0CF2wZ31jB&e{TCx^Y!(0Px0DWeBu4)@nKG z{Pr`EzPb$qFdb1ozA81^@3!Anc}(3&&G$2yS=>m6{O6@l;P&pZ559 zVLZiEb^8f*${nnIe73K!Ivo%D&;)`>is4*9Z5-}=`*sBZkhdKR5xso-Rw=mSZQHX1 zk-T+<0a)d2Ytz8U5{fy#`h582`09*>L(-otV4`DdodGQ!U!6W2b!>HN2Ft{q zL?_?2b)hKH+c!_4p>Nx;iPL!kY$=YUw|%PuQJiC_E&`8z+Yb(6xW`gk2={&KIu%y@ zwiN~O<+rUZh)KU~Z9b0unl+Jxf&G2Z*&Y9ld6&TE%t560uvXOxLrZ%`kbUnS=jMX$u+Y)aJ0fl}9D!jDsO;^@ai@09`V%UGK&51>3|$QyKMU(J%80;F zI^asH1qq8pkTDqoNrZQFa@?l)uoRTGlY}X_`3%Ewsu1#3d@xzluulsc6~mUOo@VnR zguYE?E7?khaCGsY6HlurFl(mv!}#{3S@134U;tUI)Ii-RjlzXu9?HMtBl7q;Od^3| zvBGy6f_>r-^`?7%m}-1OabyM zU~74vJ*~{?DHMKnXhVI9&2x+)G%L;XEL&Oynj( zu%Ybyl)R7;N}yY2yMF}k^|V4LVFVP0#ZgTHZnFM|M^Cn)Wg^oDT1T@I+9J|El38%z zB?Hi`-e{hP`2aWjBaBw9(yXSvnbYefgc6lLPoZCuI-)_g!ZkvDAx9-?Fm{qBLhMJx zt%!P6qePhRvvHk7O7!j5BVLECzC?tjUkFJ|W{#qq*cl?;K^L%vb96BbJHA1;N+?;> z$A!Lv%RVS@Pl?*%RJ_S~wN6ly)z7;iX=)8^Blz%+Xt7SwR?5X)5HZz_w)wCNVnQ2fQ#93GR4-m7J?-@Cv=Y{*sgrg~SZQhv!YXN}grz#yCo282}as3NGq+ieSzrIa1Pml zTt=(2nZ`~i1hm}tMc{E41Wh%#Z9eRRSV&85%jaE?68dvn{MiKoQ?YKF54#~|#54yr z<7p@4mh|#ALTAG!kX(;imw--$SNARmo639JeApSWfNo!q3?%J@urL6yJ@I!JBuvu) z+kDssG1GFuHXn9DOc@r~>cNo3k{avklj|$b*$|{4uUv?wJaq}+->#46Q-I1sg(H8Nat5X0c{c%ooV<>tWI|b- zRp7xGYDI#e7$5lYy!yCFK27)zviV1FBF#x)T?uR;v|)Z3av4*gK@?e90vh`TR4_RK zoFOAV`PpGVxX3zu4LT_r>1A@5B&Bosb?pL7^;8Fl7eojlaQ5-=8i9jr4YyX!vDQuc zG@j*Zbtp6eUc&%2f*NCVaE=K}ZR834Y|ueC;8zaX0_elkf2uU7d0|&j%AAG}UsZkx z?^Px9mq$~HbXZ=EMUf_8i3A0afnh^l_{LIu>S^l(>(S7=b8DESUyr_X?mnycf8?fb zl_??DgBxE8QEf_*Oyq8bD2hZ(ny^^?}sRO4>WoPA!IZlR=ht>0(QGZ55<#fByB6&$`NQM(h z%R!EHF&MXjes2xPY{i>TCgbTWSOVdBI$<`*i$k|4C*ki?Q~W&B$a#R|Sj6np8yY6%iTjO(JMYko?AX-REv+J|kD=7O~T|zbe0h z+`*VoXP0xXc`Z@OpJuX;F$ola2pg;ztJjOd{*bt+BI}q=x>O&7HkiYU76+e1aIIfD z0C$pM41GWg(0r60xX%+Bcw-q*Nh4+wyv)=Hwxiymb%S2k@c?vXoT2<;2Rb;Cg4H2ppjt(B zY`rw@0Lb-6SQyORB(sI=cybj=U9N;7H=4zODId3P-5`jvaC8hrkr~9dWX1XiG>;NLw$d`;Y_uq!L zfx*p1!9!rOCWOu5N)Q2IOX$gB01VEaMWeGWjk?(7v439+R-7m|O3FUf2jAnRh;RwS z+%cx0z_T|}q}^w_e|+~&!c3R&_0Iu%4U~H`M-H0GQP#jr3pgw=`xN`uP5O6JERIBo zAY7#o9dQu8ukDI~BJvxoAZ@#spy&q*(Vho}_DsY9z(T6fk4)C*y2l>C^BEK|QE8kJ zR(DRYtx1cVZIjmEU6@b5OMkr|4uG|K%)ftxf3-L}`EKSxVGL%80jxtgoely#lErH% zU4cdfs+o8DV`+&HEUwSZ70C*g!K^J?ICp1+N)vo1>r8Pmat6ZOKa>YZlFg9AMq+G>p8p)0$+h9JpcnX4kjDs455r-P0MD$t&s|P zJPj3L>I5^U%Ihi5Mc2SZB*a2g1C_5! z^xNf20ZXN*0@|i1n8{oi&0rXtNq5&^0bZ>D^}TXK>qQtG zy3Jy!JOiN7{8q80g89l4D46=aIe>wFw7gzSbDrQEb*G1*RM9l*xHC>+U=n(RmeT!x zXeSYIOR*>P`WJKT$V*#Rv$*sQS^os&}Q zL4ULEOa6y4DL~VA_+P9INY{iUl{_sUWlPN*`9sz!Wd*>hbq6GM z<5{j8*7!jX)=9yj=!Wn*X@|08FfCuay-7G{sTSYl6^gvDNqIei64es}`&a~4;0?r3 zNg;5T`_vtbC*(Nyr z|ePk3`6f zJ_Lt)2n(5V5fVm*i3ntf6dC%%FHh$TFbHtIC^0dFzPh#*QvJJ`<9i1v1<++7@r|@t zi3;p!Y|kpjBY`+bgP9u$juZU4;7el<8pUjtR?5f(#)Wj$ z6dIS$f8|*(*Z}tHS2`E59g-YbzJy(qP|gML{|)+7X*Yz_I$HA~@~Ts}*MF`eYJxlm zwgP=bbLQA*g!%xS3z$R!Goj4-%@9<;Dz#oHuBSf}IgV)%@gg-oJi2%H;ND#T-@`rv zi(PA@xU{;y@GXT75?w$jZ^UvDb5my-NGm!`S#)hW5k%FtVX38B7``}70X@-~iHlR< z!n6b)ff`8VA}z_NiL8N95n0rn-IlWn#F^1VXir;9gGLHR_131gBD5IfhQXNi69S%B zm4$|fzde?)Zkhtuw!zxC|W7jAN{FoadxX9V^>Wxd;qLrNy^hQ(l=q0EP;%*?h%(Z5@ z9(pxjZ{7l1T554i;eowiuHmM9!zi1WQhha`P+lpo`y{bb z9(X0WmI}{yc&l}=Nvx%9KQ+K0ay&EY07|W={Wihum6EZkMVWgD#*hjqEGb=4*z)5R z1=HrbRE{+Ih{#}j4=#?N)Jmvldu}&T&sQ@9{lt<)j*IE1JT9Lg?s7f{Y%iMEdBj8n z3&*y@Y#`hcrp3fKQ6^8~rCfURj9|YWsyI1Z9+7UqGH-p>hIp$`a5WGnD!$qEs&hgZ z{P|KFYBIg4naG83w{>@d6y(Nz&&&v!MF;2nPZDBvTlF<-H_z5a3iipoKbR%+&z&K(S`j_5+-KKOS^jRs=!@w0>*}yGxoooL z_FQ0}cHE>A;Vt#TX)RMdLnv?#xwqA5*~;iDDFkUtq}UnbM)EszQm_ZfDiRQrlQ=kY zj$LzmN>z6XXN{pl9k}9~YCy4s9qD-m0pnsBA$tnLG9ZEg(LHJ+@kedK?X76H?3|dU zmEAR?Li!BzwZwPZb+2s14TQQRu3ehd%?7YK8-%L4*&+|Bn)O!V6WBP2wQ5=*o+md- zn+%)7q$ovrUWCp9!vRCm2&fx^r4tRX2gKGF3y+zJPK)T_wBZoSyu)lzJwXQn@obu z$ZT+J(DMupB>jeVXAB5qZltx=m;NZtm|D#KH7D)yYo?7K1@T&=H8T;JSF~WQwIGt~7M1LRoO;XPNu?7P*ku z(>-{Tx``%0o^Kx5wTAaG#YK_8t9jzMoP*8xQY%Q%6A^b#M#q#(H?XV`} zC5oyMj#`R}$z)gDAb30pLnv9?58)8XH)21<7fy>7ww4{g#08sPiOA!-E8LcGTUVr3 zl`4sg?R6E=5vJ=ggz8xc02)G;NeVXvwdMqNXcx_U0Oax<$(anR6CF>vamIxtD7r2x zWn?t^I_+Vlc3=BWnlG^WwVsBX&YfFH{@0~HPu~~+dI_AoClz#3_2f~O1zqwAN>fjq z-okaxx*!zueurKl6-2ac44gX&okd#3$fEdk_#u;S5rQp$Dg|sSYtY+1H-BwHSg+iwB# z;HL)kza+o4*1mq+WRXRFGXm68+?TcX-rv5i%Wuh6oyp)gscF>j?B>1b8D1%50z;nB zN7P#CgGqJHS9(^O^hRr!#0DnKe2C%``FvU^h{?=Y^dw`!S2$*sBsgkkzGe3dy+!lx zqsYyWgl-i+*@k>mSn3hfUT<4i@qUhyeQr%vITT+v&Zrg5(|(2*{xOR5Mlbt-y@*aA z8p^-vbh}Y!)V;|2{?gG)n5}oNCV3IBMDIRaSe^Gz@4kf(n(5xa&iXPlzUU1GnQ?d2 zzn)~?Z(j7TGCM3*d;g0szxi(dCdhHyVJ(BSmX;h>U((c6o6f4o>X%o*?9 zt>)dkVrfVA{-ei*Lh(KfARZRB3J;5gM-M*P*?v?+e}4Fbx4*+dj>i{ozme^}{W{z7 z#XtY+{|B>;RuuO&fk{Bo?G?gT>mAsAFjq4k*$GZE!B$hE1g_asq6_W+vb^ z3J1@~v6(f860v@kudphqZWY+M#lnIYtIDJ8+=%qeDI+DI$j51V#4SJ2J2PnT8AeB3 zkI`h{q+qW&5thGKOIzodvQs6d-(3mX-s>wt-#b_Rdiq#R)Nn)rrcJi}Z1z0nHdY|{ z#Rs;VC(ipyn;Z=Ji=v+=05l*SAC5FeXyHr!tW2f$h%==?$yY=uiC3E0}x#6?9(v(}bMGz2k5XrqN$xe|86tYvVgiB>ROt?{qJmo#qecNgNQ$nWw^I+sTgp$rAb}iHIVd22Nn6Xr(N>zV zlb6GBM*U^v{Yw6ioP;7Ea|sX8@$1a1&ZK*RZ2qsQ7Gb1$!7Bg{nk>AKFFT_by-~y` zy>>>mw@#ixblZ}A8ma0LLWDH(7d-;H7-wWlk?hcg@fOq)MOZHl9$1)?)hjy?x?sn` zek8Q-^lFo;qK;8?l!a|WpLSHFsdbp)8}cn(NE{X5!-htfNVv$r;>kImfvVEG&Xe~C z%#g>iE?Pb=7h6r90;(`wccd`G`RIZy_-y9kAu|{NQATkx&r*+9-aa06!H^Z6Hoa4{ z=2>JV%&>Hg*3LntXl>Gfv7`3xyw(zmqq}@TTsGqK;eh5&{OM&pe*NHVqubrw`tC^uZ&N*E|P~3E-KvBZ*NUu*fmq+=6a?GrK9bD^dMN#p3=~!e$?9C(j3b z_u_JR78Un#@QFH_toLKAz*kohKUQGz2A$mZF(&F+SJ)wGBJ47;xT^4cp@$y7L=wf3 ze}r&fPFC^wI2_IE~5ypU)P($1) zKp3=|&}@-N9w&g)SSbo=0rqn*e3kT)v$2027Ls-7363KTFZ!AF;A4T;1Fl3R(S;&{ z*g^RatD8?^j9xtYRTw`8((hf{Cyrv|wL76+X%f~sRllwq}{ z4LMXZa2)HsmkvwnhrZK02hV~Qn)WT^%hh#zaT#F_ZOuYI8|aGQy(c_lK9fU}jExMi z0ve6{aZ$Sm6rnCAS8_fY0pDe7V3Adtve*C{cLSh=k!}q+h))I_vk`-Xj&rlxBK2>c z)uEjn7ai;nH0>#A4U!jGc!&cd2{~TBMPe-8Qe~m3*UW&^jhdDNH5!a3utEw_QJq zzy%qO0r^1^U9|8JGX!(9hWoKx@}*1Ut*NZy!5vx?6m`<>Zg!u%|M+Cn&{0s!r|wp2 za$a^`H#fG-}F-ijr#VssZa+Y{2 z%&es*;WFCiq^;p}8=V)cqjWIkSdm6Xmb1D-jSBUG?Fk_Om3tU=CX&IE6kxY1lFkMs zesp8OafJn1sPkhOr)3>0UVK~3BXO3t9tgi&my_&w@FqRYBUb!}87U2oj z5Zq7oJUDyR8J$N4-cr489rX$B)YkwXg~XOnEpr?WG)Lh;bscP1Bm>7Jr*O0IL7l=P zEhRw#b=9R*&1&T6C5nqCtu@@V4yq?~wc_itegitmHEg{2J`@m^#>cOt^vU{S`&8!5 zZ17f>pI29~4e<)gUuuKbtP+%GFZ);X>tWj=p)?9AA1k+NK2R6R@AA=I8jFgyrLdi2 zIXpz8?Qk0*^nf!EKpUxJON~mSwTDxUF2K-Vv@qEp=Qc8rbDQ}87XH7TAt*okXOsTf zqJNOKNokvuwn=H5l6F5sZ#Vh}8C#UGMHyQ;WNcH$Hf3y62BH|#Kb-M^{(6|ux2b4`(H<=T?e7W6%5_~MF4Ez8jeDb#Iye6nqZtA&JN;TF!P zuElG2Yq8V&mF@>D$~rbzm&CQe;i4?pv^ajT*&>E$c0})J{G|xU34}Lji=OU1+VFY) zaeA{{ILw!}3R_!`kAZ3#!E}@Hg!L(GC17fo>A(^+q(-(S?F-9 zs;eqA(S;+{)!;hwJv4waaZg~gc^^GJDmB?OlIl*N2vLHVW4B$xZA6~He4g08 z=FX54B?~q7t1X;YP(|WKQaA!gyf}_J(S0>k*tyNsBJUlUiuiQ|&fF zRF7EfprrE5M^f}XO5P_v`ZPV{R7E&-ln`c|VXB)IoaUCMs_Ef^I5lw}hFLVZ;hHB6 zixL!J++Chl%Fp-#tCEzQg~c|9jXjvcio8-~lYNVlX}W|cnO{L=(hcz~QW3SUZKHOS z_Bk1j+j5=+10A|Wqw`J?PsCuLQPiy!?jg|Z6L>sp{V~}JO;Qdv@;SJe6UJXJlN-Oh z%H*E+Cz;&E^9)si$9Y?zdEt)W-6Vw-&B|N=NbrGG@xy$`ar1MsSOLA^AnbA7j!Bxs8oBP2c zcTRZ_ce)q77$AoIbAlSf`2#ndUQ7-)x^HrJ%ojJA!ty*?@XJH<5MOrsR|p$0nnb4Y zGbga4t1^Y)lRK=XGjrO8jXYO zUcFXaIAG7rhB=tLD>qGtVAMFis}kI0h})H^c(}Lgq9*uz>!eodcb;Dj#}Fg~`EOl> z9ZcSJkxbzDu9d99{#_SM!F**f-*u5R0Klsfba8;!K+BH+zxo8)n}IjHa#NXZ0)aRM zqAqIjddSn$=XCfQA@1>1UDp5`x1ZGs)<#2wQtXWh@qI1SI28KolzdF&RlkJ%nndYd7jX~SdsU)3Q1$A2qlrho22x(6>DB4^faR+W zSt4-s>dn&t>8m#Ey3>6DxG4^SCFDcS zuS(5_sb7_vg|=Ui5{WuEs%|b9D~$MsCzz>gWDt%!>GD+Qse1}PAQS#(E!1?#nKcoU z2sLXZW&+x*L{;8?zDETB^(SO2@A|CjlwVufbws9i#&cdGf1HDtZ=7>U?2LW7B!cXl~U=D zEK7?JfKwZl)l+h?)NnTUAuQK!oMr^!WDSRGGRKAziv6$wZCr(UrK+Vry7e!ZX%$6H z&~BR!qy);hq1Z(nSW~l2_Ec@Qr)rZu71d;ma5yS8t18SM=@>P4(tDXgg&m-hk$rWm zek9Qqk*!R|O(8g!lwsaPkZv%+X62UYGqZv*BkaO41=xX{tmS$3v=?k{ ziHKOfW2=;PVhqFLsID+LS<}p4Pqm@#g4KJiqge@E6=@&IEZD2$V4P8qZJ7`7yx+pt zs#jaJ{CLtiKaWI-O5M|dn52$qlC3a>H)Rhn4PH_vM(jt#tq4^$z!7eJHm+0PiPnBS zP#w1V3M7{Pg8dPhIZ8R%83J`M1Z?3PE{4yJKA2XCl0|ne(F-p7beBg;sI61+66??u ziykg^68Rb&t$@-0%^8hRto)D`K5k~R@KrOh8yG1Sc3RzHqY$UcMzlJXnfy+JCFy-) z`X?3Q`kDw~Q*7>x_>m?v(iRzJ^doI%jxx#P>!hdI1fzB`%uPy~Y(3SKVeO@+&Yo3R zK5tG+ld;ir8NMbZO}0uGW|*qqX|S}~ve^Ea5+h%gM*RGgRM-a9ZR*hlZ~fw+k2e-{ zPq?Ku(`$gIms8xmw6BP@)!u~~VRO@Kj;HNYjquXaV{LSTimmyb21{3K7(4NZQ{u%s zMT)h}f26_0RX4`&k2IKxHZrCFt7(uIC1ouCNrk~+cyrc1*MXbkgf=r3mX3ZC{`(x; zy8jZK0gHcfES(qOH%*70)$tiHZZj|J^h#3L0Bo|Zd)?)^-Ip{oXu-5+T%OK8bs z^*aq#qCb!2KWQ*<73;D4BOPW=m~(J*ex<^0N-rNHnl@|#$@Qpx0Wd{)b*I7DRo=($ zkJOlXx_x2kC8fex3;^P>{5K62u4zE*{z!wFYdH|RKhj{P4GUuZ#|li0-GGwZ$F-YN zI1Mi>z@Jgyh_Tj2$XFsUy5#VBeS~qVUpGyXN;}eFLq4;(@|+DpcGZ&$v0X+z!u*ew zb39Zy>MvK$pfx=AA^_x+O>iX_%3{9?55`0*B7$OkYD0YW@sfNQSqItjF`P(C3bsZ8 z8;CZ{mSHDa@jY_`ZrTDm^c)2gY3d+QHaqDD=LGF^3Kv3-Aq36~V^kx&aHHWisyWuWDWAsuQoR9%CctYLphmbcMhEA(NYzfB=x2QgVb8A| zyanjP)qmYozux z^4afYk1xj$?_XxlC34N;0+1aQ!9%r(bWH^z@c94^OJ{X!KX8njc4KE&8otRFYK${O(bKVvb+YL!9$yUa` ziYR<=Y*oR_y0B&iPCND?hLpD}usyGPS7(@>Z`cA9ev*?2Ep<#EFye%-jx7c0WQagN zmvBM7OVg!~S#rLGNrvh{*6%@X0(>?!iR^bOx_yjS0X)H@C*(3)-(xrgv69eJyj>#T zlsc~nR0r-BZ4$mILFWDM_Fnh8HxqJYZqs!-wyW}e+r&@GS-YXPOFbOn( z2pg<8t9Km2{!qB6lC@1IU9OLhHn@Qotqp3{xaa`fNkulafEM6+oFDXFM+SIf8c@j~ zW+su8bRAkZ7-bV8z!2jM?H4;R$pPdg&BKZAqp3T7?O&Pithtt1b5QeFt@EY^aBlez zDWr_`$N_q=cL38RGVGJB0rORs6~~tS`ojx) zUhmX=1RJ3>q7b*Sz;@~dvOkhlbnx_0hfgG|I&2RPx-2%G$@F=T$+#^PZx=u`8(W*Un6_BdfhIOKA8b6F&Q{STD0d@}D^}4T?MDwIH(kNkzXs?vQ10Cv_0e>W zwgzTiz+r*er+k6CjPJ4+nJB>!u2Kk?I7q(N(z-wq`z2P8xv)iqU9S=C`NPm%9LBI% zNLBiyP_(!1;TYig42l?4oBM>-U6N~SCQHt?ne5;m%%|_sf5(3`0M_a@|NR;MHD-pH zdxfXFLtK`C6g#|1kpMBf?wR6mNSwyEQ3p}xO>!_5Gsvd zr`Q?cVbmFjxql)Lw;dhnb2_JT3BRT3WZK@RJ5Cp;!`@lHGhLyH5g~lUH=(T8@HX&z z0Xk1{0UP?sjyXdjqf$4r8Gs63@l7I8gs~@FCR(szY9=Z;c7@>_>h0_tNA?mfMEptj zH-m;}rh1KaJI4_OJs^xGLblAEm`X@ zzx8bZ$w ztyo^I0QG&-8~HWG;IP-KB$62bjb^?MH|6JROCUe>_iq3U^x5=!am{)B8ja35;#7rs zH1K8|!N4R@gO<{heqtw)P^Q=u&il`Aup>|H)vd}@9kTxMX=`u+cabGbYZ4V4I~YI5 z7+NR?ewU=p)0QQ(>f(#e$m&jQD2A#rte8>tQrkbw$XA96iQJ@#K{(s${lodLaz0#Q zK+lY%{$i)bo+7G+t*7}6+)b2a9h^jce0zY}`@IRDE0h+$U|6*-Gx+aoT^0YiI9<)m2 z4_U7sYSdk$J0PhW&vNas#y^CyN%G^QJHqQsoXAqaw5)i0nF!BHExt?@ioCE)c{72c z+Kz*LEP)kx1F?dc7=gQbFMEUGHAPv$Vt{5dqFAo<>~`HZ@8m1Gth^$uc;WV_=nY?2 zlOoq+HDy&!?ZtD_G8>l3PiFGr)k<+A9LcBydAc-ayO}m~aZm;`cMu#$TwU&^Dv;FOi6zi;g*F(lk{gX% zW_KjDVooS5At=_$$Ozwsbkr0Ym(PFgSufWB_UqR=7ugO;j;tzS*Cdp40sgc@dH=PJs0sEQ*b4j+&6#7L5$XeQE?^P`%!EVMZziAuW~ucOaXsx!%SU1CgsV%W~t&#_Ad|IKfq=dnNAKY;-GJrzP zP&gQ~)_`7ELEwMZI384=5fBY&<>eJ!FH=y-HZc5Ur!Y2H{Ki(fdx)6H&xv5JX%sy; zOrQw~tm`q^M=U=o6Qt63ilD5aTxI1Yfxo>$sh7WxUE@ITW755qYg@F#&K2}VBmHw6 zQ5!_Hm@=xrW|?e3tbz@2OV()*6H%xZifz$WUw~$%SVL(v8M5mVgUy-hY!Oq9RWY1S zHJ}6W{N7l6MNPn?bNxZ5=i9TLD&lhmq_Jovm*( zWZJf9ugv1tJC-EOJ3ReRS`25GmF+HzAPHR6@U+&haJ9zHSC>lwN286QjG&UZ1GDipTUfWnHk)pql*zlmR4&!rC)~7WxR=vyj1M9t(VJuC z%SvK>`Adoz6Blc@KI@A&M)qGU7PX$GK`&qg5kJy7_HVR-94e z39Ox!Av=GKYO7vEoNW%YweU?00f?5Zp}Yq8IZV|=yPQ6m%7^!lpQkV7Y&ZvJz)(Bad61j^=dK&;z%vP_4S3Q-ld!`L6F+VA$ zCtb3I0Ip&P^b3=D{$4Ce{`w6_8?XB36B9Q{8mhOq2ecn9WsPV~TGRs)-{GQmn7VY> z5L4wM+Al@ds?+pR7r=yw+_fptEkNip7(wzL;T<=ya2|E=X{4Q2l87g0sQ57j<{~wj zHRZN~Gneo*#XHC*wbXH{b+dZ2aPwkgZ z&!Z6+O2tgQcisbdY`2%uGSI0}*sB+6`-r8^F$-7vTCuiT%ZMa$iWPga+(`iHP6~Fx znZ*Kn501lpgk5uWPPN_$-Y%CN8o(KSssjcThPX#nMBH1;7m7!)%mbv#)o>D;NZhGq zZhJG@tp;aJ(<(l5!)jVrjJeFy9lBc^aR;e5$-Ad!b*l-m(U(8E zu*D%^ZZ;=;uaPWQ+@&F2TNSu0aX%Ki0Gfj{Ddtx66l+JcN-vB@8(SM${CE4o@&Dkr;ik?HbZRXkyhI1RCwcT0ap0@(oxY9| zdEP2Oke={G?=F*IIW|i?8_YaI14%(-{6Rfw)}7S;=FuNgE$YQ=pKDe3n>o)-RTDX(}+$njji<1120dC8dK%WlTY#bN`+`4$`6ed5lKo&~Gin{NpB2N48+r7Mr!@-m6SGEdMUlf02Y4FS^IDU{ zzsN0H9bbtZ*1dR1QT>HOOHp4k*_YWz-zVV-CCmE|9<}@;wkcM+FD-0Od(O!No2mrz z`0Wb6Z@ktut68NEggZ!Kx-p}yAJ^IhfPvqZmgp+rtib1OF z92Z&8rJkTP_2l#x-^1*4f`RXMsRHS6!p21}dn1CkQD#M|D7p?uZjP?&P9-mw_G={u zXcLi~VI;N1cQJqOyC3}ChZq1nLk_A8MUH$+RuP7I7X4)=w+W!3Qiyz%D?G! zyHRJ<~uANu9HPw+uA-5VIHUuMP^y}=+e?vDD`lg#^n zP^|r7rbyEN456B2v<`q38}EPd<(Gf*HB;kvf4o?q%z^J+wB}vHVrfFQu(4D6 z6BR6r@!?s0s zHpBB;l~h*@Y~y0D!Yfzh(cW$rw>fg81k56Ev>tKG5A-$-8hoJ9dDmlX9=Lqi`%Z+t zz^kQgolM!O64Q^c1a0prmZ0w)vVJ{%#wKbwasksO+kQ48A9EWk5Ch`_+np4Lf2B?C zn*2r4&lA8ykj50}8{^&Z4S!aqQlfJ<>`m3d6p@it!?@0iSFW5^i7ax@Ri3!!6oX}! zUtjz1a*1S~tvy{&6uvZTZ7De^O<6>2pvO~AWTQFc0VZAhXU}2b7uk1hqgB=U|kpc0=z^Hp1>!Ri3 zad0?Qxc%`GVEH?!)hB^Jd|vAF-0u-V7j$@2lV6?RCp2rE}Ct}6V9=+(#1l0}lT|!E z4#!6O_~VV&iW`?XN@pa8LaWc4(;$mC;7}!%ZNfJL z08V42C`1R?&%Iz^(o4?9{&iSL)}i+}&|vVqpIHwcD|kxaN>mcXDB`gll<5)3r>;Ag z%tjs_s%WEtsBUmSBev?v=d`GNSi@AyPH+AM4c|sYT!VxR9n!9!>%yd+}05!I1n_^(MxAzGQVAF zQJ?813?!EQDq)5-fkr~-AwFRP+btPc-Qm<*{Ha0CmBm44j1cwUS%wXqw(3yLz;Uei zUOFtPANo%396Sq}q}jJn!ZbyRTX7j-4sFdsKO1;Rz}jSZrjh2QL6eLv4tV(T$3^XI zQH1W89P{~T1Q?pFfkjqn%3=cu-wj|VMtbzf-F`CYk%JTlM{{qB3ZQwC#|>`K%cvcR zO1XuO*yfg`b`+z{vhaF>yY2}D9`NlSUc#-t3jzmp^{W*2fFjm}f>p-+5E^WJhDr&S z?#dw+yG~~$LfpAa&+)rY#Is+YWdXNN=*(H3(*UQ-Ul=iFo(d#yT6OO z9ZY59djaoLJ#h#$uZ`CN-tfC7k0pQBri|Z9_D;+uLO3z-`K@|D?LAdEqmT^?85m(L z9JXN0g9&3SU(9n}`vK%S%kyHyc;HX#0^8w-vrEYL!oAHz5;>sayPF_aLC z={zN>v}TNv&QZ??{dy=BU;>A!LxTUj3j2`jUyZLB9EYH2;SX^GJVVizervnLsspZ8 z-Pvuys+pfTq7Ja0CnDk37aR@|%Z6C4K^doVZwYCaZ)SqId-kd`I*$xksCwNxx)j{0 zuL0!>@hxG5<~X=&j)JS|I@qpAAdX2+!FwU$o%EEq)5EN@|W8BHLIlN z*~|Xb{Ce1SNJ5Q*%45x~nh(^4Cj4%VMMc|E7}Bv&9#YYExQ!5cz_khxnAEYQMy1i( z!>L9WU??+MnCy>p8=1$sP5gfg|KH9KFe3f4N&jroKSf3tA$} z9mEcIN7%9)jgWTTw#O&iX7FD~7~CP4e^t;Aa7XH6scZ4t-CFGQex>^Xi?WW*)g^H) zaJVQlHZ6`{Y_^D1n(gx)Ex{B4If3v7ZPC-cM;kuRKTdC!3y1mAR$*)F@i8z$BiL~= zIf5VqFccGv7l4C=>StwxRd2 z=%Z4T?IhWV!m2wT1HvdP&?!3P*t4 zx7G`8Sx11Flrk+Ti7oH$(hU$Eh2{dzEwypcjf0?iQSbv5;tgmy$PAvw*c3r?`Mu91 zdY7lYv$NhA1XriHN?niOx=Si`DV|hGtDdUOlBo*jsglY&Df%8I?-L)(n;vpXS_j{d z5`wlf=y$V%)0|o=G*wLxWyPt9`!H;z$*I{qX;_q?YUA$mv{HV?4_K9?`4~Dw~X5luXklM9KULDwEnr*-3CK?Q7ep9i@FvhT{aDC&566ZqewWQ^XT77@!$- zYlW`})ciZx@Yn(kft7aFCt1HOFUuD4jU;T<5nkDcPK=D~d(TY_>C6hdxAzVbWtRSBN{ zEx_3rw$IsvdQLtu*d+&gSZ1f%ovc6 z{c{3t!}$ZBonB1dHo9+ecFgaODJ;*U1;0Er5AkKEe}y0nqe)~MKXU>*w-!@aUN-tI zWfqsE=B~}<#b*AUKZ8I!^9Mp>wPki(~>7d97p>lJdG}3W6>} zBd?33fm2?Upo^-!23ks0y4!<&2LTDMOmYT#^Lpqe@SIa1>S92zhdezYPlvB}ha)^y z*EPV#2WWMIxN0CUWp7OQ`D>xZ@#I&hGR0|J@pX}OvB=j&)5kAg z7geC{Ok&8s z7Xa_#P=%|v$_tad266$w`&B#agXFJ;S^`*qWttj{e^o+0fd8u0e9-?@so6jQ3sNFc z2gfMR7>btEt~ z9ED*HsO{|~x-RQas0bp#lC3gyHEjGW)@76tz*yQ~qP1NGn?#T@1wx^O_jG1>N&$E& z>Tfp#Q*ie;48w^aqx1jL?9VAe&TliK(un+xGi<-;HN~v^6mZe1qz^RSO z>M1!`YB-zw5SDA7PBVf{_Rc1AY$&1FDH}l1RRnTYwe&}~{sl9wqNoYlhtt8AK>2ou zOibIRW}ED(+H6nNCVMKX$rj;oRBBe0!xQNkHFwf`nL>pfK$MYvb*p|Pu_}?ROvX(i zIG2=R-bBc7Fu`W!mgzIIf-xiP!Z8Kdo1CoWdG@pmdwWp$HJ}Z(99u{DhS03Ej*4t) z;nrv4I)$WY?bidFK@sj?BRj%6ml(_l$@pP2qhg}A;ZLf90WJ0pIi z$&9o`h8g`xo0+3b^7uOGX*PkzmE=&i(SB zX~!se#e98cS)8sVj-$J*!w6e#S$6VqfK&@h`e1oF~sildJolE zV6C;*@pFX#zP?V61?^MBBNYywmOJ*NoTtIiRfEUwk2IJiwB)h+odzq>pU3i_G#I#w z_1OK94l^fcJh(Z(QeiixmyZ#f95#XEdepuEjv~Ce(_ri>?_>8zYRo*{zOeL?Qei9x z0P$G zED;!8a(KNy!noD1ndA#bFQXm>0EktDO{j3xU#^@%Yk2NO z0LUquNJ}o1#eNkYjEPo61jYE&#{25yCHXS44zlHAIFXhVY>fgo5N(((LoQ<)G>AfX zE5Ku0K*ymI;0z$Qbw+O-9!WpAAPuWQCq*OCCWlE{GFrTt49B`UjF_eC6qWsBckLC&oIFGR&)0eQz3^wSRAx=rXWp>y~~(`(L6nL zHZX%Kj9`u3YJ&?v->88M8k3t-MIFAbGT%j>X z5sy{{G>Sh3;8#~NUHmS`8IvHvQ~{&FHLkq$wSkk>8xLg;J4Kso7BSM-Q^qbN1=zEnXP#^nWC8`bDZp#hvSon2HFOPmZN zkL>vvu^}h)sXAw8&?1d9*-J8<$YeXn$vz(pPl1k~9gx||_~!b0IGXq+5Wc6|%bvZt z>Rk4_SzJf(hK!z+%Qdrp#GHl~53Ej1r%o6yM=S{v+YL!9$yUa`iYOR!Y*oR_y0B&i zTRZk4hLpD}usyGPS7(@>Z`cA9ev*?2Ep<#EFygd(VM{?e86wcnC0tPN(sb!#mYi>4 zlA(H#^?Sf!Jkcbw->K;KF9itH9k^SxN%*D& znfJfjd)@2aOvshFP1otzuFCh3I~Wq`>~zkYYSBS?uTVU}B+vjNY_Q_2-f;+7L*b%I z);67VxjsJH;09i_Ho{rsq62Uz73R>F@>b0>(IKvD4Tcz zh8SmPzu19E4j?aS9!{tqP2KTp|H^!4&9%&!Ggw=LTIWp-;N0>bQb-ktg8`#x#r6L9 z#l0miDcZtMO~+ED0r&@?kOTB!?*OJtWY{NL1LmtND-JaK^~W0Yyxyt#h&)1T1n{JQ z3@c%Q?bHioez?ki*RIN+Eh{#~jT0DpuzySur z#Hk}!9YO}GSM|U)4#=Yd`}ZxOIxuLo)dp2(^p^vwL33c~}4 zR3~3utnXqQnDDE&H=jss4rhW0h%Mn*6$4;!aX*aCI`!3Mm&g7+7pyosY$BkrfUH>X zJzk0kmq3?0y5tGYeB`8Pp!@#zqlaF)g0FuK&}$&qyEW8D(>dB2n0Wz*1!kY}1@1Dw z%U)!n1jDxMlgam5S{Eo{zr+eM7q*D7>ouZ1e;B%Xz!(+_sY-toiuTq$90NR`K@p>B zbDyxfOLA?^WXah!lO5cH`Sd;d@A!`fz*^nrzdysj#>_Btukdtth|3a?Vux3WoNgBZ zAj#r2k*+}_JTfEwxh#- zPUloE;kPuMOxyc($LZp9*gNZYrYkftB7~3lCY1FW-UePTK<6ngU_(FIF=t3*RO&`H z15n{BzDXpCF!qGYL<=@d%|rzy_YjzmP(|u(xDMqwvX^in;!nE288kdAw=e}Rq97JR z4b;9a;o64>;=D3H*Lb7MD24}Jhr&aLvy}x|B2%=IiNqOe$y$f`<)^H;64^oft6&+= zUnNw+Gnl%yfHh_c6*c}gp-k~~3FUZ}N}&SArpV9aTNuq?7@H|TIKKd|R)G4xA&d!k z4vE2GuT@DTGXNURZykHe&)1efe(LYv02t`A>Gk58^Y}FyopS`O3iD{-%{YRANumZV zr6>KwP9kwlu_v7OpWk3dp4zKhm8m*p{o~Wt-~#RdB}{7)6&yPlKgSqaCe&ZXyqws=j|U))tV`8ircgw$8P&WpBth0?;5P@cDIIXgj;2p0E*FwX)sNO&sY z+tl8ZtUI;MBnyzI)6o#9Y8p;6z~x!*G`WXpp@dv7B@~*zVwS9rT|_={fE*jtp(H)S~jc2)b zSmPhU*d+Nu(;eY;CQf9jU|LqZy-c`gr50bN3PoO6ro5RzQEkV;K9;}=yn$H3OpL%? zy_dbg@R}UFm6DYLyVA4Ub>F;`ujsP!im>7(qV}lh4PRH2BG+RzWmQh?#dFeD8Em*U@pCx1G+BEjNXdN& z4$UXrEgV)LVPu#HFGEsP=nq?-&KY13;C#_yVhDW=wHZ?VM}_Uj8z=?PWs&#>EmlH- z9i8o2$9NPhhzkaQAk?oM=$f^={O+q;r;Qu>}sSkb~)_jOWyEf{b_h0LXnqbd? zt-v4AoH_Oxp*{fT0wz(wOgLoyW&$c;mRc_n*VE2Kj$`U0UgU3W2alii6t zoV*9q6nF&sNGca)Nk&a%4UCS+qUY?Y8WAtfjA251+Cu0Wq;S-=mbDe3#h^9}#;nKS zd}@d#J`eYOEn(dZ2d1{f+Ot$6 zeMUeuq?MOfbiGVLCELL8mz~1cVDTGUFxu#L{;4pzEB(Sc>WFN8os7#Pb z<0*o&hH{mamjwRy2Blv9K6Z@*!H-GzR<3Q)4m(%S8;$hOaYStp)uOs(E;P%{r`PjU z66S54nq{&Du?jZ8Em@~MOhlntD7HmgeF2)4VhyFyWXP^d3^r$~vqelbR>g2S)qoDf z^Lu0Q9YLVmnw`<}-Xx>!lrkLQfOE2HyCl0_^>-FJC@~()jV}VsHy31XKUCt|kd})) zHnq0N=#!K)^x;!VDfK3-v(q1MoI8bTbNJ6FCCb z{rIAXka><$__*Bo>_wF7yK5%9whjrnd7tLPSJzeVQNl6wXaFd+k+*GvsWm0zAPt!q z$zy~HX#6rmC~0kUp8~iuEuEtbjRF~LW5mS~2we-3<8kjSYLsgQf*WJ$b&dB-lX7yn zgIM3?67b|`FD)YuC!P&#ug*s4Z82x3%Q|K9#yOQsHTMZ>?irpkbb;lw8%gv`Tls#M z*!U6w{S+5#>ObplB1WcGQbqHh zy934y6QRInbnz;-cj}cAhn1CksCwUIcSij)GT_L{l*r*0Aa!bpG*3b{AsxWZm)=q3@-!zUMzh7`fY9-ulnZ`6KYC&qPMpPv>z^I zz-i8I)B||o;i9Iix^&ofRplZ;G6f{7)AUkz=7d(kHN(&?K(sg5jq)Dh9XBuvA9b+m zq@7myidTE6_%X#YBh8||YA z)WAqgkJ&sf)BQ$V$iTSIqY)QM#Z0|--UHrlx0lgkQB`5~=lGnae!gp}VyacTgmdiePG1x0=9* zZ4#2}a*N!*v74>LGFUorx^7z4jUmg8GG^-TXVRPk-ad)5z;XIfJUkVbUpi{ydO+9u z%I*nYqVp25p4@wpSKliW=r0ZlbF(?&dyQnd5<-oN+p56Ji~F(A1<)LvNzH(wr&v4E zXnJ8h+SuC2;=kJu9&c@Jl*^AdHnz&Dy}Gq@=|9MerfhTb+m902j>`j(PR+Q`dIG>Z zSxT5ke@Gjv7qflFt)B;8=F@@>yQPLAkn&K;bdKF(wiY$(u(yMkT?rdpyGWSv&?V$2qnjSG@T+}T0cJYk zd*i+U**^}90&ZPAbqbY(7M?Wps6tuX%=ZgV%58!zXynh~!Q6{l02Y6+u^F|F*fot2 z*^LN)#?u;w`N>+Nx1z{lhy$Fn>v^qw<6q>-u8yz74(ndLq^SPFp{1xVne6`U2P`1r z2_?(>5KhSaBDN`3AtEhoPdgjR1DmP@^7!ovS9!eFHLF>r4&-4wj}RSUhK{4iDMA3y z6!|$Rc@apR6BtB6n)eiF`6ZGwsaFt3c`r0bZbYwCE~J3?O;P9Dn6zir`V-@?>sDZu ze}i1Z9^TLJzdicT%TMIrafFk1r;0(U?Hm_b(50TBH1*{47I)3;b3)GVcc}uYy~6fb zFMA_G1X2o6RTN#{t%}Cpol0IV?bk{S&?X`|!$@k2yJ!C1cR%>O4>16Eh8%uJw(3j< zzezQyerGrDMbGd`A+sy;#y_IgQXfpJbH38E(xf+9yCgO+X~|&fMkt8M%<&IM#)A2G z%xZ9O)DEP}?iYHC=G{k;Q(svbI;gSAZ*CPn*@k>mSn3hfo|ao!@qUhyeQr%vITZg& z&Zrg5(|!i>!!e5VMlbsW>~I3nQ2tG)+l@M-?nU1B(T`rjRibk>$%}X;diUYND&#NU zZQ+Avx;L=xzs!s;dV@h`+#U6=Cz<#Epji9E47u`VNMD3^s!|la|HYSI{>hhL{3iO{ z&wu!jc1y=!c!iyfp+^FhtWf#li_iZhlK;J@|A>C@^V$VoPonXXVCI;3>ee`n|6=I-O-{bFf%Yje9)+9^MHh|c`*2XB9e zLu`*P-hLz7efxE`<%@s*)qjn7M{A4w8o?Z7AMZn63nU<<4TJ^Ukga2p6b@h=0(+IR z5|2x?3!6%pc_?oHtSe zW+XUQkGSOrdXEMTKF#Q`>oJxQTx9HJC&EVH)zY?MrtDOS=@(dnw)YN8(DzPQzn(r| z6Ez&6fN7I$KO5bTxs4UbfboItHj0zK(kAy-{-WsT3E(tH!;Hg?@qzeyKPyui9dI`6 zbJeL7kx^R1Kn;i&vm8~4EOKX7p3CM4gC(0^U;8|BiDaIwJzY-}@T4L><8@Jt8iku7dAfRSPCXrO zDL?&|1a48~pn&i>j@-XPGj{TFIL@fQjO1Tw0+5qX31lwepFDn@dDTJiXJqq#O|=L? zm3YA`_!ycjypS(DqZhqVL^f=&I>a^sdlh^Cpb}$!3cgF>!Ri3a4*H z;@T0P4+k`N;!iK*@#_a?8{O{a)~BcUuizs9oP$>zrw<;H zik{uT9TJ!@f{maW&Ed*8z8$bSYKVFU01bpI6A3d;0H?816mkRX=U(tM=_O}l|2ixr z>(FBy=s9@X&#VUzAG{-QB`S$l6!Gg0%Jc%{Q`a3#W+Sf-RkTq+6g;@=5nJ`%b6QkB ztYIqbR7)qxW|faxhjW^Qml~P#(q>(3@jEX`0Jotz^)b7E)PlndXCzItIYoJ9P?sx3 zm?|RpT!CK5<%8WMM=q#|&K^xJM$1$n@WKOA$BQ2VfoioT3#d_<8fH2sfO3MpyIHlt z(VW3;v>G_jE7ca%;jqI@Hn(*I@eQO*boA2Mn9OgNTGVH{2?M!ize*TuO`x~Xc?d2I zY`0{yb%#@L@uvnkqZS99@fh#9A~aG*#-u|v1IMx6d+D&Ge&{>BbMP!^{>F!SOh#~F zu`Mnm%%QDW=w|~D30Rv9&y>`>G-#5sxd9Jf{emr*+sxt+O%j@U+-M0P$4uP3;9AdHSbVhE(ox4;%1})Of%Wj+3 zl1si(HE11^%@n56@WM=jgKfMPc7a7{ z@>uL=4a)evWbedmAA}PFpWo^R)aF!$^9~uXkaZE(!eI-RJeV-X?1lFVnwQ!$d^yjt zhPMAP>H`eLEi74vmUt`7tfeO5GJ5Ewi_~-*ofoU4elX>Xx#g^`P@_V?LggNY zor$FJBn8;5ip;YC*&p3la9m-57V7*M#%Wo{rXn6z37MGAQ*ugc!x-rt^?cB;2SDz@ zs1P>{|I>UnVXsxvx|47jR#-8zaC+^Mhoz?vH82var3!Dw?7j8@md zc16-~OmYf#4Dt3967CcvrLMY^(pilhy+m=*r1giJ)2fO^dx`M2US6Kd1o4#h1$UJ-5znWi9S+${{^6+!3<^y%{ z^uAkTQPH*(=Qc~^As20j+X$ftT+sj-N*!BjR2r>4oN9Cdh9;wh$^JOEk$Ifk#Q(SO z|LqI`Nzy-?^v@RkgS1Ub+oZHjO52pQ`x$z>(Lc!8qKqxd*vcVen=-a3W1BJ%L!18L zj0g1B!wj!_*Y5UikM>2i$NB}MP|NZ02%}akL({$bC2WB;WAPXHIy&vznrexOvWZrg zE=2II%Zk)Mx+Kt4!b#QS#ZN!CB*tBnT)|Y(5?SsbcDOsjmgQ)KRO_}qKG`;dB}2mC z4#E7Zf_{KIQXflQi`VYfVyE{j-49rlb!@IKiEDwwMcJ@var|O;B{4~}eZHd^m?9u2 z5Z<6Idb;;$!{_CJNCFkjj#Y;8S02BvBRBTh!M)~B$QfT>-k1Cv;T>|gS91SMQ$ zEvC1V8kk^ypy8uQSv_VvCrutr=)do?h>fZ+^R z2hx2zHE|z?fiyXRn@YnCxY87Hfs<}zs3@TtW{zX<!EI3DPMbb`>%Uv?D`t*9<*q}kWNrvVAM+}VM$dBDY#5^5uMYy%l%8F z^HzdOa&9x3(K_70Rmvut`@tf2PI(Y_x);3|5SsmS0=mQb1Baa+3HJ;yIXmX}#}t<5 z(SlzdnuqwZ)4xK{iqRx8jh{Jzom-13EH4}VmNJXWQghel@?tZ87G@BbX#PMb%yyZk z0TC%qSV8?=mC(+R;{7xl2id)Pt+;TwsF@9O5TRFYnhpS}QKVNTxXS>`D^u}Mm)Av2 z&>z=H%|mxy7h&?1Cy-SjLa&Qt0!4bQWEJxCx@ZdGFhfbNizHnR7`}W}f-Va68fYn1 z>24499R$3*GRYZe*XyC1z`ss`sEe7s9`f|`IUT;<9ggr+UDp5`2cXpn;;Ml_p1m=} z8(0gq$?){%e054bBKNA_0!Z4uKCrY`rK9n;SEe%<-kh}w5PMDAEUd~X*Z{}7U%i_K zsas)#ui9Np&*F)%k0xV~uZ^7GmamPRgLS?>nid~@Z8T{fuH}T93hcgy>8JqJUF`Oi zJFaN@c<<|?%J{s9SmWV!uZy^cE59mH9VUJCuOyV#a%oHgoRYHEigH@^dK@wJ_ zW&PR4OcnQNCP}|!}G-B4DP!UAVC0k|aYS{Q$6gZSood#IiV4}5Mg_%Tn zG6h2IgzI!>cuE0_DN1rT15>EPYW9r!)B_HXY(S&V$Kw+#cF|o zo$;RvP z?5kV#BZ=*aY-KWT3c$EEzh&3UD(@$!mj~s zsO8u?!Z(C1OY5k}mR4SKR3=-z!9-fPK<7wkdoYD&lPwB5%|-=F%Fg%5MH!(E&mF7B2?8tNVxUcxK6<+TKn}t zb=c}Fh+_H+_D5vqDCJ~l2-Lw4u!VED7(P4tU|J7P`H>uVxrL2T}fDNPAYpR`4W8U0AJXGGsoCV70F^fa45{bqTnVQx~=Wb3J>3~Mhn zb@r^n@_BPonv9K}%kVWRX|h$iFvC>+PJ^Y@mc{nZlo|&{v!=0uDUUHf26@ow2?7|_f3PmC@Ew4Pbv(2?PZ*ZK%5FoN52XGeXHzD zgW0*d?6q0_8T&ueWvKO|4pW_!E@Qga+K#4lu{8`x$!giruT*$T zbyBK~l{(k5RSBsuO-A01r*yz+vb9=a!`CLI$=FpL8`f@On#=@{z!vaLQ5X2-)XQC z{dp|^NrQo_SdZNw=`fpIw6Dqe2Y^Q4=KM;9-IQKFMl5&O1d{7f`vORc@aj&3v8%j~ z-5;qj^K|>d(o0H(u^0fvWBG3yEL_uo*!__PGuLt;c7LS7OdA%&`i~Wu7`p)_xsPi% zr+~~@Sb#sHz7b=sjgYZKV06jh_4)|oR=;kV38}Fmzl8Ff4MBF*lM7K^Mm<9RkCk&g zR5iL|6(YZS17 zXv1t7cA^#EGdJ9;Eue$YQD~8-4hLnklYVd%E?preJB5q}owSpbP7af#bWT<`F2F>m zHt3Hhgb)Jfg)yoTa=6iO8`T_Z-IPz`eyQGoLKEOM3{WH77^8!8T+C`GPxQ0CgRtjU z4&DOv;p#ti8q~b7D>x|ZB@kbAegf}RCv(rkT!IeEv#}`h1S}Czgc%q%ly?g)pfyr^ z8u{$^vd5R>hxact^w;rsj(V>e{m**&`-hZJI)__s4k2=eXBgmotGWA#sgOe-EDl;b zQ;;UsoP;CMJUw(aFoR?;nCEf-;AC|->W=<`q=*(AD1&9!*jdXs76l;4d9gN?4qhz z;$#?kWY5Q)tNw&ORp;ysTBLC%dr5{9nQR9++2@1dDWLJQ12S6~-&|i0M-#sUV)t}= z*|RrSoy&eVi|Yv9kkONJxn|annA7m$fz^rW)Csit066DuA+g<%#FA`f?5l`^SI1Tr zysQgrR)Do*A7V&hmjT=Jx_5Pk>G_5&K;b7jiO^DGra+bl+)QjKNY_7?a6!FG)1{AD za=wL0hU!7q??G+?d^R+R>~|{cca9&7R{=c1qbKAtTi;_i1hJCPQ@mXw;FLNW7oY}k zw`h~_O$jpZf4BF#*S(pLD|4H!)3IHZ?<03GB-GjIoH^B^gYsUXc!Eiw0Yunf#aX@M z5VD5CMU|{=I_Yw_<6jSM;6-c0n>8*v0C!R`4lSSscpm2mz1NWe-k1hd(tsUPNJ_d6 zts9K82^L_8afbGb9hl?*@{;D^#QD+G9l!Rk%y-sY%d9!5`K#7>Qv*1+{D%}$#o=JU zC|Ys7KYno+3qLg-OO*!TAAmv*(1X1Lm@biFpKJ}7ue{1Ia}ns}>kl;OdA(Ef5q5;u z2;fNp8CF6wcj^VQKay2+@bpjzQpAmeu*@BFX$&?Wozu}WV9a(@s@5f1L}V~%Egr-S z-~a<*;?$9=4j}{8t9oD?2g5FaTtCCY;M+~6xJwZM5~Xk@l5%+b&EzwRE15< z6L*aZyW}pQ7l?taRmJow;jKayqO3(c=9Qy3#-D27n!98rjOBj2Di?*zi?(cty$H$l zd5_7sEfjedKr|a$o3@y?SkxgWHZ~t@JeC%7hXUk}s_JdssH=$ZL5 z6@v#5sZPGSSl`7q(09z&V4od8kBZIVOb`LFB^;|_01PhfhtXN5zPjx48tRL7pIC?$ z2}B`xHSFW8ejOb)5lvWtTP*kt@3pipP{e+T6=W`K5nTs_THWTqKf}Mq z%rJAW@N{>G%My@chgXT5ZWqxX$>KGUu0bO_GB;=ap|V8qi<{GOMzV%waH$n{k9reA zrSa<&J0m=dIssL_sWsdZv9{!nF?%#Cc_YuJJ~hQ49~d4#kEJXDbV`M5bsZ z6Nxj{lC=)=%THNxC9;F|SHUu#ze=bCoe<4Y2RN^Io8DT$8Z(88$^wMHO(;`5T|zmY zrBbMXu_^L1`4&d@(J(esz<>!(OYBNM?T_n)y2Ll%KCHf&A3p zzX34NXVdG&HRthbG&<*qSQX~cz?*T@pCon?nrgi#{lo{7pr+Up&il`Aup>|H)vd}@ z9kTxMTcg1R+yP3M)+8!8b})X9F|<$){4PnG7v7R={?wjivbs|nipesD6*F3NsqG(T zwygxSCl% zN9j=gMD0E7l5o8U{L-%WGMVFO8WUMl3PC^L)!qeiJSAHqU;D?pt#@@;esNdf!pN3(^t%r^|6b{Ck~LKW)GbNzaXZi^C1bCc@uM-v0I{~YWekdJfZ)3$nrWTOuJNw z_fP4Cy$tCj;(fJYF>RF?f1Tv+)ctvFv>$fOt@R1tsoi&I5mj+`1%C3>;eRNT0yKSx z|HayXbWJ3wwH*ihSOP2X2I8os5V))NvNsrBlY_TXkWy4vdUm_+n|JaR zT~=NZR=h;i9u>Xe>uOTudaS0b%Bj70PFiNeGWp3&KD=5fZiFKlbs$fd#%wp!W^SbO zf<2#buuZq%4iN8)F;?44h^Hs=bsISU5L=9|79j`vx)P+ij-O-?AiD?CiVt=4PUz~3 zb(0>YL7sO2V_%FTKB&{jmump~^=qAr zY=l${SfOGB-_@gS2AO zv_;pl6G2G3)?T`W$%oSjAt$>Nc{q6wrYZ0UP#~3y!ceCsvIa&+WYKeWRgDNo%G7aY z3=`VZ7DCq`g`=*;O_FEcqII>RjWO$C()_6*miRo}_qBv|GaQ)O5^L8gdC=jf6$(pA z7##S)9rq#wDC7)8{(U4YNUeWb31(j?A!(Vm^V}r$SY?Zr* zh?)GH2iA15jDBdg4|<6E_Nv^W4>BOuu9^7!X>flHY-f3rh9K_R<69Q8sO@Lr*DYa%6qA++@0Zr8{)h2&U&jmZiws3d+ZF)+z_vo_f=Q3 zJ;O;iz<1>pW9;WF#@*c2vAyyx>bV5Zau5!6b>+R&)$`AA*$wesd9P%?o)y7d@7+)v zR{qY)fp^-GH^gn_9ndv_nBmhK;=A%*=o(neaPJNAU3pv7<{JS|-vGZwhgZvE?b3{` zay0hMRp&0+mB-cW61U-D270^l;0BN}18f#OVrWoz#R^LQckbA&e27@%%pi(iperk% zB~x~v^YHuv4JcMyN6q~9CxI+hyGZ_q&ejSTQpT)&JUB`kXR<2+$@G_Ud9Qpxgn7Hx zXty*VrQQdGB)2pqrJ+d3Np5Mx$_HoodpH*Ew=`hoQ#0HEZNGa9_eHn)nR2=?cUO#Z zOAA)s_roplk^e%wz~;)EewcF-6fnqp(UV}waR=CfiBWdTxUYO>gnO@Fw{rw7-gdb1 zIWoT)^JE@wJ5t&P%$;QZ$5>tLGk+B3%Ury1NNH2n(_$fUi`Sr(zKm|rT#1XhSw}qC&c1lyh6$9PU{gifL zS0Hpt3sTyRwP3Y&wTbNokLRs zp!uyx=`0dy!R-bm?unp8PY*-$#Fsslo``wex((CGNZgp}Z{E*sSe zmCf|#eUhwwbzSugwrLP}04TMQw{23%Fft6muZW>G4V;ecW(XybSnhA&f6PMXC=ixF z2IH@A@p8$+Rg8OQQKMWdP$)L`?5nXonMpZ0+^GVpq=Z;|WM@`xl8GOMY=iyyGemG} z3)CMOGE*iSl}+VR&3y{P_Y7vy`rsO6&DMGILmIc!2n!V zc1lgA_8Ft@I~cmhLKGI)3KQf^TZby*jaH399L{f(GPa8vPXL~$a1r@yR9p38xxIw7 zD;f4S>dRseX%I^OxN6fWAHh@{ma-b@lFHN!A}8CB0$;L1E^uVAC?A~5s1ESR^89!5 z8qE_-j?Q2Z2|aOcb@4sbfbqO}T0!sGcY-|XHov_U*<9@nVV7M-*59~)c{Aw1pI;Xy zG_PW@0LY<}hD>t#CY(-I`IWsR>IQ;Z3brKvQz%KJbx9`_AhvD(HqR=%O)^R?ws-24 z(jFNVi;b?b{m$-;`ey`gk(DWtgMp;fnU2eutzHeUdMaP{OyhN7e(qL|^ZaR<04#fJ z2)n6*c(P;S*N;cmc-23jkhSOmuu4@=^!E0E_QR#Xt&9i~^$^(ca8Xz)=bH!rqEp*uJI!6Z|D-MNI9d0-@XUv;}S*G+D^-=!)As;w_` z%oj?Zv^nv%MK0Tj6T&7RTj8zN7bfYM+<-DIQWI)5rCc$wfkx~2~8yK z)H2gxM!VJEtZ7=sXT$Cdc{4LW46Y~a-rO6_WuETP-P(vdI9ZbW zU7(IzuiZ*4gX5;Y2q~|w#11_Lg{qrYEi#}iK=u$3n;T^y{M^r^IR%hV6Pz4CRK>${ z|Mg2pO3Hix=_c=C>auvK=^4 zej9G;{6MGH;t`hUp!P}Q0f@dL4t({!)7MerS@~Rv2acO3J>iS_T_%A`>h=L!;-O*Y z85&6b#s*&8bB?+biiCOehdkBwVz$q?_45b{I_#DjPq#q^LGKGG4*}ij2L02BPO;*C z0ne?x#rQd!=sC$s96UV5fF$=*x=g5dYQN1{A6^~ zLl%Cu4=ac#PqEK&Uw~gE4vYeBT|9LPm4g+tx=etm^J4e3Jw6SujjR6GXEl!e|3B%{9oP6j1<*hIJ6Yi zte}GJ(g}9GN>PB%i~N+NWO*L~pgoadokgXE?P(xpd0-QfKpwwc5k>&7b&}J}D|H|b z+j&Lk2s3mXC)Xkb0CXzDw~!p*+inmEY2MSqL8U};CIyas{ zWMuU9P1>_+{fWUccPlU)LW5v)AKuUKzdicT%TMIrafFk1r;0(U?Hm_b(50TBH1*{4 z7AWiN^WIf&)bCOSatRJ&)x7MDC|Z(2sZmAIb;JcAUw;U;>{Rk{X}?xtfHo1y8AeiD z1TOh|-~HhCKEwdv8FKg?*{U-c{3f?)^*g(HFM5Vo3PI9Pq=F-AE%m{qI_E1rD@}T% zwM$|HlV(0d@rissEds=32EQs}h2tw6GeiJ5YH;mk_Y1u}^6sO^&5(p{6+YR9d{bEJ z5!5KuTUhaaj*@+DO;tG*>}k%Z70uIrMpTSr6zPp#_PcmvoIo^`f79u9qt2*%k@w>l zL@xm&*}0nJMZ6Nd`*30R`Y+$z#|O=HZ-9GvnHgX727}DFJL+FgGVlLEvG#|V^5tpo zEJMz;8GDw!|HYSI{>hhL{3iO{&wu#tp54`HOCRU@0O`pBt!+HX-c0&{7Jl=^7oY!2 zB>#I){}KJ*=di;=-^M0%42fmlH5Y5UIoM}h7cj*f#DsVM?P65PxL78*Q~8I#iT>5w z|B4t+`d3-%9S6D*!NQxjtB`*CpJ%THw1L3x-a136lBcj7-u`E_CtSaP#O{3f_V*X- z)*^$Y(39T&7unwHYlL0nI^*61eSSWE`#V{FWKZ7yHlW5jqc?B=Q+(mhgc9HWCt9KK z_P@*`{0ZWq3<2#4bGr#1n-sI=?fkd1ZJIl1{v(#GE8RN48*}5|rK5z2@0}$^s3EINT_U*sQ zj(UG|1L)?n0(Ki&#+D7DAK#mdp|Hm-uwJdd5+tyNq%Fq`uwMb5;RSyM=+D6Ck&i}=l|DH)$o1~ zKZyHZ5jcZ~^scLVjehrUzxe@P>WtI*Vdk43H26%#6~QKXM5v6H(EjEJ>bUtZlt;%? zFhf^DeN#psw~bo4SlPuzRAJPAXnOaJ-$ehN`SBmwW5oG0`ggiNrr>XVY5x3eTjv}9 zCS#JF`p%!xPZPso%HNsdUwDJJI=!EG^xB4?(+lU%=tpYUO}XFtC-bK>G)R>ntZXMW zy!8D7W^Jo^>gO)D2{?7UonXs!*_q#8h6^pz7&9Fw?a6 z=ofvfUnqh~HVgTe;6|E@q(>uk5B#;FK%z5aP-P@~i_`ggh*sbaS~=oLe4u4zXbn60>ta*30|x{4s!W*f{RfFGc5kta=WD2kqm*<#`MYS zDR<&QxDy(t+D4#P3RFH;!aWJ!pWbEXa{#n;kpennX+TM3wlHr7hi+BxzCDZXZdH_W ziXzYV@JzdZ+e{0|V$EQ#f5yGL=TEs1d;V%OwwS78ARO$my)M7^Lnf39526GEKByjv zI=#J9-Y-0@RO>;aKT^?I&A_~;Q<%k!{XlX#I$V|q3*kHdTqvy1ovT9 zWGm|^wl~tGyshQO)(FWq)=A{{es~LcYp)dK@n>ShWa+B}qWyD^G^`)Vj#yLiW_)-p z{lcp+Qjpn#q~yT;(y!fWGS)BIeVSG0jn-dZ+`xzviige_g-Xv(daoz8TcKR))r1|Ejj2-UJl0@^_Ou2P;LRpN%#k3E)mFe{5tchGwEI+oBwO7nIZbd|8D+_{@k!J zY2J16FO$r}#r~aE?1i&`nrLXa)SpT7!VT%TPk$~gne{mTF;qR`+OW(i|07k$v})=||Fy8y4_oq1L3DaJ z*zCaO*6Q87?Iv`<{#fXcX`dbwZ_TCE{(mog+2JS17=kDq?Fd|_0)#9xe1GB9oH2;@ zqrT^;6lG`miL_1yc?wUiKNG7DL;XFKK(qX3R3BDN;^4>TW5G`TGSNvJ1!bA;{+-ud zOT#qHpFM8Jzm^8bHo!qX)a}hft`CmXyZDGy0J6TYVimygTE zR+A4&W$#25VeOfu|Malatu`!K`AsDMVJ1bg-V3(#UDbS-(3k$uoP*SVPpQ{K=AWf%QVCC_UF*@^h2)*_m+Bh^;#>vm zzx&qwAy5IazM}sBNU`%)_?*~G;Vwb+GG}dk=m&B7ihA}FpDTCpztP{SwF6PN4W?Bk z(^@te4)^btPbU7h%gB^gnX*4p?5IaSE*6UW;;2ecykK~44c_av7r^0O7kt> zdzUgN>g|t;#r>K0%CsBs)pqqyi~D#D1;6Q!Dco?}y|^5n*)}v&coRMpbxp>5L;T7J zGN;NrSFT%i=)X{6%qb$Kf!@hX&3yOm8SNC4J@Es87`BK|TJ^93?A^xf)(5F9)1`OW zS$ztUp3~8fW_6SfVL0?)^P@iQ0#76OjY99dckj<4N($@3E=kuKQ2rS+1@Ef|DLzmX z8Q0?ol5i}6)tTJ!h1gdJX>nFdF8bcv~2L^v)-s}t(e{mX47Q< zha`{6Q}|@IcTU2vPuC zMHzRH(+lbOT+!!}c>((b?I=hFDrO34yE<6bP?%%}xeN^+rAoTZg~mSw?YEo67i60r9wz#fB} zNmnc97LtsOU?Uk7k%!kr>SzIJv4V zKugHh^Du}ek$-UNbL=SDf!4bBh+kX-Hq%CHiY_my1!6q(iZ;lX!6CvOT|P7XUHE{p zqEifAlC|rWETp&ztEC?XI4S2CqF0eNB_nC4Y;~MII2Is@+Yz-gZA!Dav}tI62>ilU zny2MEt(G;b0_PqTT+cVF3{qIKowH zWp$La#)4-Vnv6sLGz_q(oPzLBJ>;W$DtC^d5>TjO0)oK>PM=yRb+RO6Eh!HW+gnf1 z&(o;xsfdL=R^3YDx?VRx2F(xL7Taf(ncXoDM|%4t{*K-0Hz$mhY@@ zG9X2|f*t%_>$HBo*<5Kgdy~`4t%l+W*E#=O{V;q|#-C%`o_bX|qhWt0m$N@rZ;e}x z236xv+?z33R|O5S(KNO#8oId=)W)unIB4jIC0d&50ArzGGh~~r1!3?Wf|!Sf+9w%8 z5mEc@R)pDRwkx@)INA2>%EE>sTAv{hk1B$BfS-u)t8$HCKHTfIo8FdVZY3!{d`2Z{ z*ar?y>iHsW(lF(i-I6HHC7>vdE<#f5XofiR1O&vaHwm1{rIj9F4KmlR^Mbc1zmUzH zMK2L1DW~P+0h>PmQq%{Sois0%WO#0SX!ysaXr;-eHyB`B@~D|hdLG;271;#*+{v>8 zGks2ly?+@`yv2vt!&7N9@r69xekb2r-ZZkOl0f zJakS;#@Y|B99FFyzjD}E5xBMrjVrx?NYlh|+d}VER7g@BAQWa1$%!>q-3w6e6=twKCVu;N=4#Etj943fl=8Pa;j2!H{h+!-wS*fI1#OA9~o8>51zTx8* z*5Expw-qsrL7d}pzE4+6zy-reUy9xu1Y5Wy2^%K=sGcuX=%$w*7tYr-RHOnMt}k1v z0{05mgR`>2o%9jdua=;YlbMz&cRtIgYn=--XM6j-x7j?h74|FDR+t{LM1v+e6LON4 z20My~oq;6=0msRyiM3MbtMzoPTB0>12|u!Nd;R>V-!`4-wV-P)7HtZ_5=k3mcu ziNU2}26%h`u8#Iv7n{pjfYhXl-Q~@8Gt*eQ(46jcTbmO33VkKXRy>$VOkQl>yJ^q;~zpab%-V%#HKku3l6Ce*#E1=^awB zF^e-EkG1h?BTsSAVvVTt4-;C39|a4m23qGCYUU$T`t?HPv=me1uoRvdhrYtW{Usr* z_XZ~ra?W!+Or}cf8?Ck0Z`dRSY!eyQ`-r5)m}Ook3I&~<28`DV=CN^H{9Dx;;{a#; zId)UjpuV$Ot)7lOcXOaVFlZWoj@>gER3CflxUCw%29>a9Do09@^ghHomP{4-V1!4|_$G}C7U5vn5?hVfk#xo8?bB7TVVWG0Q)@Zqj z3?+e>QSpQcQ^edjse?@+3co~tKmldlhtg2Hi29JGR;Ct+;cLqqduf<}?h#6E><9;frT z=}am_9X>frE4I4#{${7u0Wu(V>fbbt05tnK>uM1sgAixh#-M7;>wpom7<{ONF|2G7 z!3^FPk{L$OFQtL-!wf48kyUf^J8*FgB}(xDB7j7W;>g8C#5<5f!?n=IrX$8LsXm0| z3LORpgIY0md8vqV0_-5dEGTpy0iww->zRr=n?^QDu5pamEMiqoVVhlqYYKB5gO;Z^ zFiuU@pml5ZViD#Pfvv@ZLXw6|h|QQ$fl^jXOZmj$K=hO-%TCHbv!>9Lq+E!3%qg8c zd-$xjLb^|-E~VA#Fo5qPcK{s^>!2y$(tnbPy3)=NPV*(40Lf0+X4{*jj_27Cv+tj9BF)^2$+=ma`k26vg(hDXIY? zOlQJ)gS<5HiHd**2T^g-plB;6Ikzmu+0LLxh+lJL2DZYiqNjpT+%zTG(L3woko4pj z6jD3KEQTkM7jHMxgWUvqAE0G2y=Sg&`bHv~Y_7I!$j~*DIu@IXV#%VRHx9K}1vV2? zd0H%|=Zk3uO(6TzqUP>TbLz{LjoSz$5o;>Ai43NU74w%hB+ep>ccxH7>^H*6^cu=d zBa*Vko@+{&nhQdj5D`F8Ui|px>qifV=5(zfMuq}07I0R8;TIM&9#iSvJYBpAixL~Y zbb&p??oC%qR$!*pLJw!=;xv3Gj4d~Fpcy31kfS)gYHBJq3dtyE(Xj%(f`ywqIdZqt z)E#RJIIJR^iXbq^DV%_eFqSc~pU$0yE{+jjt|TF0DWG&L=cz8iN*Z7uWV!IT?GMQXhPA=wqCu z(>34#AjJufb*Ue#AHh|1GVO{JE?ylwVrc(~F0Ma!SD+R-!=z^XIre%;{i>{`&AFeF zj`x7Ay3F_B1*rVN0l-9w3Nvj2{7P~WGby;&y_8XpU^kc67J1ooF^1Fq3tJHHNtkQr=-L6cUzRPJ*=$vZ9QeP~pGFrOe~vv0Qd9-pT|9P0 zg9;dQj6cU7hZu6xB#CdaU==9=x(RT`gRbvh?w(oY%ei0HaE4TYY%w|x=or{N<h)_1FVAK;dQ_>BK_b>lYqi6m7EDYe|2Nd$=ejx^LGx7}f#O~xUWuG1BJBnM9a_|6jn=uv>=z~&=v;?J=D$d!_M4JZz3ZP{3T0TJo*`lB^-Jx zn_&sTwT)md6p^JDnZEK_#KY%{uzskK5n1{*IT2Y@pc!t%_Yuj0wVd1(x!rV2<-k*9qcIqOt2Q%c_S~m-!luU##p=V zPbL^saKU;dMkoakP|`A3L{H8EObW4mQuvXB_5}lU7Fr8no)_u>%AJGW7@Gp)Lb^<4 zX`Z!4(y-PG-3pH6_=s_^c#^gbI^Vf3>9{7`-~(0^jW5;8l#8AFaCyY4ItwRR4loPL zxgxm^vT**uBqjpnWkamxQ!o3f@5c2r8b!22TJ$&){d}P`3;X+!)4!{=Z=AG-`4#|? z#w!#bB{A^cw@Ru8+Jlpt_@QD;Z9eg#SN}rkvvSoSb=HdEo}9{bd(C1Yls8QAbRaSs zA?dLoTEk5gt3LL^*9ICSn1O7Jz@<_sont|$TqAc5y1|#Q=z9v(adgaAC@hJ=PM@n( zzY?IVNRMeA95p1Rp|u--j$ux_c{0EWjPH#<#~#=ms9rKgj`_Jc(*H}@;(w(|84>>m zfj?z=z2t-l39b&?f+S_l*ukMgI6;NKM~2ZV893MiZp@PZr1&scj{I}%hv79SqE?IC zPicUB@9zva!JG{RoHR!{2TW~<8KZ%bThuE*89&3=JlW`xpsRkc^TFq8G+Q5!ZX`oF z3G=d_MzNg!f%bbw@Q-pySD%a1J5&IqYfaL%Z}t|S(=EId=W@7@J}n?Ua#?JP-Iy%TBrn(r+pr%It?IQ92EoxqK;x+ z6uB|`B1w3qg$w14jc!ln3RevuA2DIpOeic7&7>vBIiRz<42ql~WcQc9F(kex^|Owd7$z@opF9m9EmMDm>X9bO=Ze53r=5HYiRn>icfof|En;?a3D*L1==-vXy zt}{ki&wLSXH@l=mx%9|ut@Ql5SP26bSWCo%^bp}pA<%KE)9p;H^cri;Z@ay3rZyVA z)#k>Oz<~Zkk>23LcuisQog5QQTM4AAGgatsZ#NaBk3T%lGaFj0Ot zk%QbNIks-O2&m>*tfGtn)b7_BVQ1$u@h< zAtHW89Z^z8eHLViGNh>4StQcD(`a3%kk&W5JH@G!$&h zMP0SRZPOlmWe0+pm8+swzq_B(upJz7F<^4PqcGRM~qpX(Ly=Hbl#>G)9Hqdm-L?)scycgy*Fus(SJY71NH2ZWYYl>9N zE>K8$oEKue2=JFgnW;Xd>>#O5hi(3A2c>^<)oxoD|7#k3^l;`P=yg#RE5Gwzz9h~ zY_R()68zxi-g*BZ{d|LoQ0wT<0^A|Fh0}f?S{xVM_>hliJkY`t5Ui-05=;8)ezqo4 z5l&r%asvm<)LP5PLE(PSYQ$DKq(<(}a(3=Es#w3!?KHc6v(lgGf$sZ)>is@kZ6W*i z1?+GMquSxZeTcxVx)5vK5^L}cHOx_i>DG3Na>%IA(j4*;>&Sy)iB^uO z(}xu+4ruV(FQ*Srd^tUX{~y8sk50@S#smB_L;oD1fADOEp3Ts+8G1IupBq0m9OC9sQLYMhpdD%es`b&A) zz)U00A;w;=~>HY0e$9Q+wG1#*X^_?paY8$}9`E4+|Zsi?rgD(=qH_&wm8C0Ui)%cD{h*=@|g(29_ z=8*(!ZuWZ=HehhLgVJK8N#=Y5X7EXT#teoMlp;oO9+!+L-~Nz3{aJjTQgZRrSt1QK zcSndg|Ix>JonO^;&cea&>K$nVp6Le2#L?cdkYtz%xf{Ihpmbmc4GmWZ(Bz@$_ zmuJ76*Sh1l@sKFJ%v#tqk#|55KEkfKAq8U=AS7~^H_A<>vfZUky259JZ$>+=e~h54 zy310q)KlEgvT7dcfO`Yj)he>RAYGyDFE!ouF^ozj5fz8@gupna=uzygzt9~LN#Z6_ z{CV?`K1^+_t*68#q-8UPHTZ^)3OJ>3^{{|z;N{tpzAYcg#FH$CcrH~>LY*PQKs;@4 zTb9#_04y{VYdGHExn@;=jf)4Ibp%0R(c#Hgyz_e@!ThF$XX!!%zDORGE3O+(UxH&& zywR)-MogL7w3P*X!CXCyPGLbHenS>gafI$HBSiuVDh{J(Puy$IiX`G3sS09s@NtmW z%E?jZ+zzxOp0s|axCdG)H$N(&~Z}D;WJcdD%1DWp?fIApXtmZ`$#9f}cDkFMKO(qgG3F|MDH99}xeRglapuYk8LZhqhGYfAVLAfe_l(;(an z$*AX>=4aHDsc}E%kPIC$g8af_4a+x@1f24@Q{3ScgTIVTl|@~1ID3(HMhz@W>Yj?;lNFIOyw2S7 z?7qEF0E|Eqi<&De>VY67(pbe8;XzSQdQo|hAiygLGS*fdEhgMelJKl239g3#QHSMu zaJA!=U`Mb4J9-Y_stXw(?wFemNd-7ixaq{B41jkIB}CzETa9sXvL!gdbfVE(Ccj>i z-hCs=Ga&smUlx^W>g=E4Z9!arHiz7^hJu@b%J+hs#S#M^Cq&Vc1WJ+6U-?jyDd$e- zb7$Q0a7k14h(N1i2xP^|JW^gH!6kVjs;|P6G7K};Ey>qLX?CM3YK*%YB1d?wlKq

mBs?$Y0eX2vmgz;QJ#_zA%N24z}gjW6C6u}V%_u#t)J17{LG@a1F)C} zxw8yy4XZkq3^gPygDiB(R_6jTB_N7_a-z{&JARD+tJyjbb+dHrwj!b0;>N_Vyh?#^ zQ0v_d#z_;gp;vM1>K^Xpb^Djd)%5u%W(?sU1ozLDDGx>Oo7Tp(Xb0SOpU|E=sX9pL zbpWDA1lBAxSq97nH9Af4r+Rs_`tJ2~78(WOCYuw}{fnK6>DAW8#Po&LiOlJW>IkFv z#%`+u`t_9w^*0iWfsFcTb;va$?tXO@ReIil5vE*BsfG$5QfQ*aMrO9z*iWp+4pu&y z?zGNNd@|jp@Ou1L-F(8|t4kN~@1-Tc9DTz6ATX|t{=~9Y{`IBj#lB|;gD#!DHz&yJc^ zti;yGld0UL=F;Xy<2+JOXs-WS{ppFYaw4^;Le_y(JsrDeR`!!#{>H!4ZR6+5E!{R9 zIwo}yYxfD3d~TF9jC0Pih>Ldt&KSciGE6^#9ELXdp~1HIXf&t*)1RSiiL^TG@_FF$ zhV_Yvvd6MShg#&NG>VI7s(TQT@!zT+o^F3^l;^=hs)W1GJ#>;>OZAX=X|Q59b7w4> zP2-|*(}~@UWD|D|JGxM0FmH@ff?+Y<&_FN-V0X5Y+M8Jk zt^c=~9i)IWqmw6KPT&Xw?TOn^$tDO-YUi6d*hC5~!z3PUA$=Gi@!)r3JEY>kQM`xkaiqqf%4X+8oiCyN@HoGpK5kiTb(9h<>|)nmJ%_3 zPcm+Lm@IyOjOcXDPt=!G-ve2n9Ug7f7!K=ljV zqI2uwBqy5E3>2O0%4}7f#HCtgKuEH2KMB)PY)0E3JPJ~jEyIv4?l9tfpjk&d%Zr&f1$vm<8@*;T$+y{FcRk;UQDUx`osIKZtJge_ zO!YAvIVV0ROuz)x>GN!>vD)eOf!y0qP?9R_lRYRwnS7_e0TclaNR_l)XQ`RbCMZ-y z%GCz;uGIu($iUTDjnkz0YBBx@#K$55>|ApL+iNcdOY`0CYP*?6TB3Ff0V{Le9{dK? z*aayQZME0HZRc)pV`rr@STi@*6P2gHhV$J^U=|@`v1_euwAx6u*Nij#upzItfPG&& z|EoAt8J}--&u^~8;HBJz=F@;bv$b(K#^;Um{bs8jWyVMZewty3v?Ro%P|)ST`1o2tiE50x0tB!*Ah%{U8r5>zUm~+ zr*$sgvLIom&nMVIWSM2)-n6@odME2D{x|YP9Q}F0_0Z z%blR~+H$8~UvF<>b&XMK6}#?K=F?AOe;RKbtg;2N-iK?e9*d9G8v3xl-dg%5mV}X} zyV+hoKLusK*XYGr5;~1ecRkL$T5l|UL%g&)E8Q4US#NAysIOCyMZB@G-t1wGq=1b2 zg+^x?=n63^L9W|gv);V4(d;b8{d^f*HCLLwCidnyi+BImD_C9QY_FTWcD>!$?8MwG zNitoG$j0SZZT+_KO%pTV8{JMig#I=)JuP+9;G0=FpN*4G@S8cYyr$)18ROex0hs~T zx}8{`o@PNd2|lf&JCTjP*&b4c>lsr;7RfV}UhYpJfZX^##XsQh@mihyrZSs7^t_>5 za3KoCWqrNaZ1mxBrf^$>UQlZMb8=AUEh(sD#DRZ0@R#a`=lrpwv&{IFgHd$f3_F9U z!j_3uJ;gysXo%{OS)=LIGoO1}xGPQ`rtCA&o-=eOr6$y#^YTdZ!q0Gf&e8Q0oe}q( zjr*|K>NDs*Vuuc`d(O@aC7r+-de1p~qBx`eV`ua|=jplP$+7|LIbTn0zL9%CvFrIXgE~+=jXj7~wYB zJ!j-mYRR?%?>R^JQ>Kl1&)IpHQifb+!`^d-o*E2Ev(KJ0^}t{XHu(L-583$loFAjp zln-HFF(rKzd(PBjJ(7eEWY1Z8qGG<3k7dt!!hjNf745^>bEcjtrc58vp0o8vvE}eV z?KyW_iaW!{wdY*jPDvlyp0jdCu(BW4@rS8Z%LlmU!nvO^eT;j~&ZAVohq>n*-Ar*G z>7FxkKV|x0_ne&vV8`(B?m0hCQ(+(So-=hnW%{W1oSmnf9m@y4=S#$!%NxauBL-yeSP8|LyjxaqaYs6xiv`Y$D~RPCGc_xW+`EX9dB+@22#yhf z;ts=kxBR>i?1aL6Og60h0QxE(ze@dB-y|6ZWpyQOP)yUEkudg{^IFZrLm!_h<1!jB z<^p#*BQF@=GYhKftp(UP^K%tY?TYX?{i2q=q=Y3vr7PEw zS-!SFct^MZNDpKS$IN??E*z7`jKmpW+Z1s-5_xzOs+LvMjij>83fCn*rKffX|S;Pvy>?DQRh0<=p~jk`ffybtHgh&D9oI5qo+o5h)B6w%{yh`Zp$;Hctrg!VGcer%Fh)_z`g;#CBrqUON8DG@_)I- z;-dJyLGTn{P;vzfN`++VY?+IUnHh@V8$~qEEgiFm7Sq7*EU=t#3mW?}MmL+R0K3Xe zQWd*7!_xHZn8*gxMcdM;h50=-@12t*e9 zfr=?~*WG088%$WF2oDSQ<*<>Y=X3lbcx*}V`NWXY0Q3kbzMRP5msKFL*jIcIdM@d( zX66@=;}rMN(`BNWKTUYHNP36q<>bsg8Q7xBf&A!pd-dF+8;SCEV{@ashRbD3Y5^bD z&uFXR0wesRa*aVFxO!2g^%Za(VriBAWephUxW4a`4Cog=B1*dUz}E5{|IRgL*@3~y zy)_LVG46E}ldyc>A|HcKeN^PgR7_0<5iIVMMy~`=eoE@cuwmV!d+?og_dHX|l+t8U z``L^I7ceouI9so=?XgrX&DQ4X`cRrL639%b1PUN?3(%^M9swvT=-~mK8-PbkfHc^L zFyr`Rp^z7$wU#nJ(?A~pebU%)p4%Ziy8kkE*J!AcvpEk(THD}I9PzzVcSw2?rh*+6dfuqzTU< zv$|@5wdA_iJ9f$yaJA_|KJ87)=~i6W5lq5P#ZZ7d9JhmZe;V6r{wh_PYxYj*#rCs2)kRiDsM4ViKA%x_5u3Rpa z-MqQlHaKn&Uyxw;fWejs#cbRlR{^E3*hvL!FW}7Yg32S}vbInz0S&)UDlNuuAkz|Q z%!0zvI%!*!582lPKs$7On`HOgauHCAiGQ>AbpAosayI9l^2G)GzN$|c#hIBN^rBMc6Ud6xEA=uAv!Lk(ZUH14G8T2h$Z z!9j8%cZO^cvFQxn3$#}9hApjHqID@gPa#@zdE+*FSV-Ko-2KWn6{CgaT(yP)!h2fvtr$Z8SGiQm4u|-OB7zj9lhqE^~@9QQ%h?B+_fGV^Z$NFRP0ObT*2=o72Onrmzrv`*%cG-IKDI$y5VU|k(PA6&GU zy_mHzzi<)>TB?NN&SsleH*t{}u;oV3!4ZWIccykx-ko#xS;}33j!b%dW7a*+1}QZIinT&DPw6T2Ns5g(f~zZIDY>)2>Idi_RLfLgVrroFY} zKA@#2JwFe4s|vCP=`||wf)*;KPBGcn7EUdc&QQ{r^n5X`C`V2XlLAyFy%Q#ol^y}L z1xBNgp4DczNEVoLM>K*J$M^w^FqSkY53W@s!~shu?kw)^rjQsIJ~MF26VTX}PK<25 zh*Mqxc}W&c@KLLm2Pc?imSU79Q}fLZAhD1I0^lT@?PjsD-Uq6(J8zVscSWKr--JCj zP81ZbQieHD1J7gi@FliV)l(W05Wg@`EQ}g+Sxf1j2 zIE%ZxT6Gg`<#3>2d%~iXb@#N3gO{oqRrqdLCNMHx)n?<*y61|7RKszQ)TqjlQ|9V? zUhRL@u=@QG!>)}Vv`E~aFO+5}2~_-Kf!F8DrP`tts#U{vKo+j7s7@Z|zp0*QJUtPO zdWI8Csm{{sXl)U>yU}Yb1LCfWJ7SuY`IM<)$2CQ9%)$nX%rY=qz~q5tl6G4G;5?h7 zj$~l~l5b0l?!hql%2fp|KZr#*Wz|FKjA_1c_qL~+l%pE#^^3Jx7!aV{EJ$Mr|IST& z@WG*v9dy7Hn?|Cju|PzId<+go(^LHun$K}cC+UliG&9%-(7UQ1gb7@9djgtI0whn* zxkdY!LTF$VN3DGAP9ntzc2U2;o^oztfc1Xj1nW(;I!o=%<)&qYSJg#B+$IO@1!$9~ zQ&%%$1MENk8|0KUfP5qIYXypwM3b6UxoA>6YiS(hH5>ma)m?9P`u%o&wYR>sGkOXS zO#wOWjt+-j(lNsP_l{^1coIWU+F5A>^GL;_5(w|Es1ZhxqDDVoZ@P8C->*?<4GaMhAID51!$_k7}5mrxjMOOgoD5~Q3j%aE~90MI^r<80w zn=r!7&geREjb*rU0Pc7fHCW&>g1q%?RJ1ijjH?#?b{F+okT0SZ>)9@7E8rGESN+}* zO%r-0H8)$3zjsQE0jDSgl^szrF;6T2lpRsykR^m%(%w;djx>_u|JfM@8zLkK8L~5) z29UIc_^~5uHb#er5MYoUyQC;VHVmrr(Jm=ti#Lewbi-F|C!`BakACfrKZR7GiK<7t zq%7ek49fD+?kEe)2u)W!*cnv;v7lfd)Kz`;WLI=Gbb}(SAMJ{=iNBy|n-6zI-2tPZ zDsjBqRb2)sf~v!Kwj^^gE}b@ZK6vo4T3?v(G0 zGDljMx50Nr!@R$3UFO~qHS_v)%KWh-YV!89x<);W3dbcE#*)`b=FX&UZGNNCXtO7_^LJCCGGOobXj)%c3MwC-H{SshyI3q^M}A)4rUlbT@mz z>sN`Bgh3hkpm_=L-c;YEQA`7-1C@PRnaDgIlc=~vRo;v_H7}!k=N4vlrLqxaZOZR)F88x#!#sKGW+U9irrl z<2IV^Cw6H`RP54^{WxG@%N9#`VDa}o-;a$ru9&69&@oU8UOm~5jQ@MZxMiYtKi!WF zIAOCI-!i`U6IBlyWoTE8QBU@x%#SEGg)Kk$dp|P$vEeZ={@jnO9uNB>!cX=i<3ATh z_8=s`=kb1Q!dHS<%a`JMwjY^aa51V~G{fKS#|FvXu)IN{8P>D?$ovt(sB$?4fA2@8 zKef^en1|&3$n7EJJ5zt`M>apR9COx>eaP+)B5{Go3%K`+(}eIZdfkkB&*G7w-!k}n zAND&Ax@I;6>&Jd%_po-nG1qJ0=YC}Qgu$cq>pC9oN7kneK4bWj_kIc*3@_1nd_|ZU z>hx(aMwur43%N7j#NKI8lI_kMIAR}N|w9uR)AALWfv9!e(R zc(fl`|4YTE8QtJ~xF6a7h2qo^H!8ADNvHF+bkWpS>TkpIPBV z){p%t(P=we$^Nw;89w0%g>pRFkF0-YMO;}w_9MF|9Kl?UNBfcWgEDYT{&znz`I!}z zX8qWo?3z(;5g~AUzYZT#p>^tyw{oJn@J-igWbQa-{P4JH^+tI7*c%y7YP!N?yr}vNfs{XKY}o_f1<@V1fX9?0s53&QKq`vj zY{`S&?*<&WcCu7dh!z&~!oyUp-|Y2M-I*g_o;dvF3C&XQ4TE6#C_js&8o=}c(s-Gn z*3^ME#gWT1wMw-Fu<()(bIQ%z;6sZhuKL#(^0Po2KMA-Sj_JVAzvVT5i+wF94sLsg zXbnMGbhGe?N)eJo6_{73+zkrgF3W1-SW+ zoSR1)7$71oFnnMF6Jziq@#=p-BnVh)(cjI$NT;vN;gAIVAvBi!U3HJ@A*3TOB$|83 z4ZvV!f>V^+)*eS#s(>)c0E5&a7xB%g~ILMWGXGXB6yC7T}u zK!*&SRY^wv@cF5yfw^DPiiM>I&5f9qTf`_nGsi{}=E5UOGxYcBPYz6VpVhR3iFrLw zNThPeS{v1a)MmezI^XJ~T5ytIR5gwVUXVau=JUXyI(s%|?x-IQeGEW4f~|5DNg|}z zL+B`uLp#nEv75~ye+l8mK{4>7oJ|t0j{V_e3Ox$~8r>(5U@Q{W>`{=Un^pC6>`F@g z?NKwIggH`0LhW~a>>L8fp(c0oKocW@neLed{hT}`wmGO!#oGx$QFe7$l5yhfaX(wn zsXhY7X6U9o6-PE-b_(g;bN7b0^8vg|9xbirX1$IwMh=2;`Go1nQv#eU3uPr!L)yC2 zP}y^&&?2z`lHpWpvuHho1T`|@STzJypI3@x1t6~(k(7i+Q9Qk8D-YDlv-NDcn#Mv~ zLb@TJ{0FOn13{`F?DpB_#bz7GNWIkArS5Vwm2LKr?PQq(T~p=F4j>DsmN)wC<<_rP zf8APLU2iS*f7M<8X8qd>7uI_hf0fF2mYbJS^f^U+H`Q<%e`i%v?`(5Ph-?H}AhM%l zsLD?`2?C48LC8PR2J3HEl#9Kl$bYje?p+!(edl$PaDOBKMh0DoG**kGq7wig0i`1Q zU9yw}4>T#-Qe^j7d+K98>@c!cy3_0JR)0eaApDNa&4ZdO*RQOJAOGZoVI*4$=~M1MiN`!v*YjY$cg=wfsON{Q8!QmSWD@ z-qh2vyGC7xsUn=N(~yjS>Ej!cvt@dn;U#qlXr0XioPxdacfCUx_rjqkfE_u1I>wx;iWOdItEhye!FL?$#Y@gf&q?9Za=r$0Ss%6`)m=r$&!JTlQiQRY#L=%ttEe|)RM8Y0e}T%Q?ias z$ZX$FQu_nDsD}@21r9H*ia{ERP6qGjk*eq)h&){kADSeZ*VMs0DI_h3nNyTPlkM%E z-g(^WV7=R1Lwb<&o2~Y8v#0nO55J=-28V~#LAg0{P+=F4NRZZM3*^}v7K6Vy^s%te zS93)MxIGDTyJV(6C7@ZR1Y6U~O@MtOjmc80nPhE#7^p-w&l*DVAX7fc$T4wFU! zi8XQ779FA1+M!2?!DquLBI#P?96-2{=bD{V4-NC!*{>Fw-&R_`Y5we3ksf4MTJ7dE=0|rK>dVh+)j91WGP-B%wj!f@&wvIVdlV$@ z{_MHCN@~)5Y7#BI3|-wRjX~|u$6_4IG}k!jPNwF1jkV^t-QG9-)Grzr8>fqgufE*u zbHtZav9VODun&MK3=kaT%I$V48=L1ftC7m}lW_H_v~Own`EL0m>1=W7aJN|a3y5`1f2i3JP5xJ224Q zByOt_t{5NJ&q&@67*X&rWS#i^l3}#Q4=VSBl@lf@Zq{=4)D?||G=628NQ_EoVPQTk|KlNk!>9N z{iiw~iy2EWc2kt1+O|%mE9nJQ+mN&iga0^{WgjCG=G02R(LqWCtiz4vWnhBzC#Kfg z?Tc8X8+bFd+U}ljwEKvvMaJR&=K6ZKw_$&=(glpw)biy{W39C`1!OkBH7eE*XsbF_ zZdt2-ZLZu;!o0XYyumqizkKEA+g%_IHCG$C%yYR#bt>g4)z##%MwiQuaQ74?@)*)l zS_$Cxf~ULy9NQK8zkftNIP|eWJIU$6&em1$COS`o_IcZL_j*j|1meULBcMhK~4k7}IKH%J?NK zpCliYd`5P9`fYk#ChO{yaJk+hYvXc5+ZvI9_}{6fdd}~ZIo)C+s=!0Zj}Vah-o59z zpT_WX-IMiDyCW)zL(UXi6uB*zSgmby@W<{ODUj$Yfwbpv&ec%yUR;zAMEkm?XGPkDE3`{eQ zdl{ppI(rVM6iSR(I+I3nF=*|1vhhnQLlwbisyrRQDH{>F17*?SXI2!2e+FrG>mnCa z@`ys}V?jUgGIXWdx&ws+`qF>S>Gx z>tTQuRo0?Ny?%>Y96L1b2YjuvdddBfiy7(8R4y%Rzk~1F73XP;|437wGf>puChA4S zrOebN$B@OFOHZPm*u}7uz`JkU6R=l6vPWaRV zq~Ib$dA>%Lc7EMJ+A-@{3RNu2MaOEYTdAWR5lSJcCegl+0aRZj(cRCRmzqnP8;$er zW_`UuK*7prt(tP+Z`7Zj#b`&DZN^>?soa>c2fiC*EuKFbQtqRPkAB|nHsJaTHs>SN zhy(w(`g4@+8NZ^d7}_>fyII1t+85UhI|E` zjecsey}1g2WB%$WU5}e?!6byI20Nmr3tX}7Bg{khdamU(zXAs z`g4bstMV}#au-%;$%`syIZM=2WHg@RyxOf>uv#aR5c3Q$v*GN%i;c^RjdqIvhhp3_ z-FCaVgh2OHxz+#XpsMe{|D*mKr69~qEIzu9tJ9`mM)5T^II5F?=)WSGsESA3Wxk2U zqFO2yoD0NFpagAnyT&RZpU`xBBZ^{EkL&+wjL5db*>X87RKx#h@lm2kX7PDb7rpKh zuiPSN$WXukv-K*x(u2F2D;E)qUBM-8%Xe!jH14hVdvT)8=HZG?pF{q7+zc!rSkSsG zWD#8ejn}sCT-(wMM(%=&c<;Ca3(LX!i(?lz$nT zqLWj+REm`fI%B8FmN$o}w1Ro#BRbvvL&FeEhXFNOJv+k#n+x^1XMOb;?aWh`A~AN~ zYJ^zZAh$DlvK&-#btYYg^_odPSzyfI!$RS7kzKdTXAsVxo}VWLne_D1Vl`jPf6Y8q zN=vbZ!r%n7D=Kb&S})KM3eNHZT<7x{+)Os;@RyUuK`=5B{>`u&l!!c1e(q*K6?5yo z)>D%9Eye@919C`On!0O7d_Roq!;*|8&BSD8MnmSvXviFmO=d7LOgJlz{)Us3Zv`7N z0Q*iti3R z$|5F)dzQJMj^2$<9c_!YQk$F0yX_a+m?rKXu`y>CKaEQQrLwbEuEU_yHg28r-?SEN zix5)og6H?_yvCv+7g2Y#oV*NXV@0mgC}GAc76eXL{A;*(F*)5{?{$BrIyQRa8$n2G zw9jhG#j9e{T7cElu^YTCKWTj+eCy?nj_~DI@}SZn6{oGx*k|pJ7Al4AQlpLN$>j>W zb~llk%XHT-2c9ZM%%IN4p~CtzGc59%lOzo&EQjh^pkSFz(ORC_s}Oe~M}@UrxR=8% zZsSR3p%JQkN3y)N?rhs;OqDi9u|Mwnf|w3mPjc39->N~=wVxBUr=06(+p=)zwzN@dSm4fjeLTaV2}o!(GhCll4;Fdu!m%+J!oIZy77F@sJwwf}wl?q#)KA z?>g?i%zUmph5sfx_Zgjf296CN9XLBRG#0EP<%yHZFR7k2m1Tib^L%bbtoKX zrQJ|msUN0*+?@Gx{>b4YGg>xH9na0wE=5(jqBG?=?+M^q#(6A&yRn{|8wnT%h3i+A}*h;J-vEz#G ziAKYIrBz&O-3j*kT~(r_LSly&5W_Oj%7{ve`)Y4^!x+Nekj)ix2tp#Cb@F{;@PQk>d%{YJO=pNb zU~u%%$Kg+5qRe;JH#f*WT-jV%X^5aXo1B?UCkwrh2&wN zZuPw}_x?;SYk#8N8o0&Aha8OXM+Y1AOG~(b)K~)yS6foErp>kKweFfCKhA#Alpah( zP+NAAyH4bmH9h{D5#)nVg<;5{SS_a!9YS}k7zU`MYMpmoRy#0QE$H~W*lxagrGseH zhhlRBE?Hwd%r^Q>LU57egMQaKtzU08+29CX>iTolU|(-bRN#229S2y39PjyVH>r5HCc)SZ zUaflTnfWgrgt=W@mGntFGTxs%!7LGxaY7gpBIqaJmkYv8kNWEg#<_-}Pc}d568kYX zTLUa9(1e`5?6$@}r-}su4g<;HG$jRVe?!=;2W-;l;m8|ZKETQd;RqhZsmjTpYyZ7Z z?VC%(Z(lUf2(4zh1w-3~fS!$xeAmYSaetl)=jUPc*?}Is#R@ZgQx0uP(f6{!*2E=j zSqBbklHLG7VHil&-xahTD?}jZ=cn@(=;u!6p2AX`MM!b?GJ$4Q8@<)0VV-flrHSyp zvx53^t3lCc&Wf&D)@J%egxe7uY{stxFk%eMgZ4x^k^YnK`=_fv=rOCl)z;rL+B82*6V99 zwCHP_<69G>lt@V-(A2t9050Ual<)4uOqPO;umV1kMrMbXETb{ zj~=0m4^9f#T1QV9W_k8ARQ~ueZ}}USP8_cvKc-m_4?;ACIR}Q&xQ(Mf&T&P(+QryJ zf)QHImSbC$D}Vy{E1f5=S`yn|(o37SQlbtL(DOhfnFw-|>{{V%01pj(Eu-6%?4yl( zLBXh^p3t?MB6N+Iy@~4m-oaEn4<$oO4EQON7A0mLl@vO3RARaRX1M`hzngj7M1wix8QhP}WbbObDsFC+LqeCut zy`iQ;TI{S|?A&skkWA1K`Jk^VojLNvp<%Umib348M^K*Kl3_G)JcY zIw$m8Def3Ov@Pf;1I{on<@HQqX4>#k^54XcBm=xp1WzH?57a{3O;dWh#ffX%Py|Xf zg4MvjQ-M1z!Ns5#q9IHZCbQ~UM9_LQViyaK1%)DR*Ku9kDMwe)m!fDm%u$9V{_YQjtUD8CNcNUNsy+5=1(0iK5Z4U%1ODzGX+% zBpUKPv!IfPwd|7|9`Vm8l|_R7eyB^uKSST=g$h}J5%}ngi_KFj@*?wuxN4)?aUcrN zXDsSYk|t%wX5G7Vyb;`>C;aS(trEEZnrj?N7>)M!N0m; z2h*qLx|3h48_mG;^>rY>UI;wgTyAx%xBzp$d&z#IE**IuXM5fC ze4y&g+(L7MU{CEbnMMy-u8nrFdmdhrz&qS+o$oc)FCcwK_)UJTvFa#5VRhk#(>2** z6Gzc7ohl@;=tg49}fnLsv8_eVsgPkB+?uW|X9tgcMT!R87E*e9K(Wx_Iw7I$_B1Puex7T-j~q$5fd>`!ZVlV zt3_PZ4o@3Aub^)5KiAxV-@Ip&o9}j4+s*W1KGSZ&xH8x6;Yvi+`OW%zvDxTv_L^jc zaeYCT`>MT0r%#BRkso9-RdFBO^(mi#>E%F=a&{}N)lP6i^EYCBKr?_??4qkeKkb(+ z`jv!7{!rJ9WwUj$-MAbSV3BofvzE6Ba{g(2SDL+xt)<{h#Qfaop5I)tOZ{@Q(cAb< zc)paIIEgo~B(*jI>q4cm(&)9^byNVF(F>QLsdTCp=pcSVz?!hqTHVBo92)Pne5g$0 zd_OSSmw+YR3oL3&?e6AseZ@VAm-r&ox)@@U3ec)kZ!E8M&)Z_s@32%~Mu!DPiGCki zlhmuF(1M~~t-0r_e&4QNbgT&KJuOzD$-Kg^($>$*8?u2WiPu1)?Qm!i_j_zk>+9b( z&m%VWTlW`j3h&0ToBaBGBnPDzAFCOBQ%1pTla=+920(_Ifdqtj=<->wsRo480*z|cm6Z#FK}aRY$Tr3cnI zB-MITg`}TcqD6()}FUVpId}RO#h|kKVWehaYbrCanlBDRwJ(9p=^n;dX1R8 zG+>XI>>X{z9yMicyBjg($06(Ah%0#RwjYkTmMu|>Wq}-V9Zz{3mJM^nRebNLLR&#c zT-ifjnX;pfnEX9Xo?Bu^Oj~q?Wy>9L6+$}78a!h1PaXE;5m#~7ut<-X^lfF+9x>r3 zVXOFvYq%xt>LaFmM_cAcO!=N^+aEFQ2e#R6#MEy||H8=W3J=AI={|M%I7VE>b><}* zG0|(}XBjcg8{AVfVyX`VzMc`2zh`=jMojy`isf$_G4&^!y7X9$xQ6?>hS8srHSwj< zACt9gl;3T{vN39qp1Tp(@JLBt`2I#r|8dBBIN}PP$O^Roal|!j$r?-#=7{TfE$eXj zKu28FQ(2YaMICV!4^}Nd?1-sfBgg89Y2M(z;1N^3XL^%IO#7zrM~|574erq%G1Ysf zPkhw0O|SZhY2T-uEy^!HV&YH2p8XNmaL`8FDY; z)RV;A+Y#=Htx(YY6Tt`1XW-|>!#^Oz;+GNk6zKW{zwQvfs1O&5#xEo8HsJCjRhQ&W zfncDNQ*z)PQr${&ay1{8x@qhxOP%SXmtV! zic+;o_Ui55sHIHAH+!jf04gi>rVH0%hEHQ+Knh zOHgk3hHGBXghAZ`{dHwWQ<=`>6|S$?AMAXZI^XK>pX?9ytIz(Te{~DrdQ~K&L5gK( z{ zFkBDP`5uuKs&cLZBr5~sn8EU#Y*IeOzW044d&>V3f&CjR$i|`P2JmJ6Cnf%|duEf= zV`~9<5^kvb!&kvJ>c+VX4BiWt2ua0R&=XO+<&vKwVD04UDN;cR`Km`|<40N3^%V8g zTd(F05*La-r=h>SIBS5kBWXQgUi|a^QyYa&0FuYitJ)2pSc_Z11xM=0lu`aB}D(y{L6)gRl*DU~Tig{#T0hn)oVX;2J?iIaHNh z^V7vSAUP47QwHgI(gjRRwVhhZx!#Ytz3ATJsd>Wr^D8?)`gEPeZ;}B zN>nsdry0Dj5=!aBD(OWiav6^M?9Ey<_+Jtn;*`#qYAxc9ezR18lE>9Zoz&W*r)K#0 zTds(P{ws$NW|12Q%d>m7pS5@$et?bF_RW5e&b3Cf-&!5i;vXC>mWdhPVXHZ4(&e|> zYEg%;pK)sP_j7IJ{cIi5#s_bw0&43UM-P+Q?oVelI6d;#QYflEla9Zw8hm|QtCanH zTOE08F^7$j{8s2wOYiBP^{r2HqiLJbnh{YX{+}8Avy8I-bP!itrHW>Pei4B!MPM#n z%me(*n@+-A{=O>jEqJR%STapBiI#dqENm+hWc33eJ*<60p&1PrHU`beQPT7>4A(}s zhGPNGcQXv+?8eNA^wBS^yhrQ-vGsymV3_=ozc8ctDh%;+O{w zXBWv+7TcRpboA_hdwLG9XsDj^fMqII$%N#tZdv;89r`Qv!Ee>5I}iz{d|Q=Lg)D0z ziSrGspSu}qWu{t*t~PdCiyP!H{wtg5-_p60IVuDNAb#iO=Ag3@FsK@kG^P!6NsJ?D zKsfGJsHZUy)bCqts*;ve)Kkw9Zrjr|RnDSDGJeLyg@4%ar=zuLiL``^uCA0>lD*%i zrWM8L5qeXUQbjB#)YGxwr>2Rc+l(Um!eo{Se|of_K#|%zhqSZ_ zoR#-QiIcfB5EW&wS*FHdC67cAwnYKxG#9HBRm3x{7t-3}7jYaGMR10QcYq!oL@kwE z87o&74T1+Yo5Rq`SAosBkgZd?dPT?@LN3GhYndC2%O-l$8hq$IopZ-o@}aaNC&WXH zC+4UV^$p#_UTPg-A&Xg@2bgI!KbQ9mhNt8O?#>+f^2FgUPaxY4kdO2VGwymz!x^HK ziU_MD(zkt$tOaVGjkBLb=&2+m@^N`ptpO&q{FXlYYU#@_fhT07SW?uZ7idf?&OT96 zRl2y_pX&FXMqemDrg;jk? z(-324<^99@#nk0&R=$ddH;$|nDL#XzFD(IZ5_o4imy@)Mrtnit&(aYTZ;}c_EIw@a%%;1qFNi>)pLeYF;2gT$lyZ+RM*NCvH?|c zEYya2o=vVo=}f(Hu1JSD_hHICC|{Oy#S+M6PK(n$PHLrEIg{H7k@-Ag9mqtm6C#5{ zf)#bJBTBjAY%WXjm9sTEqwIt$PLG@e&|FJpBPKIa-+dujn%{Z5q=YM{ksV;C!g;Qu z+UufwC@Ik?=j^!F*xb-A=W+Iv4?)qjEMqX#=iw22!AZI;J5?0l!3y}ajEs@+wU*Oo z5L&m8_V&eVO0|YO(1ike9?K>(m!~T@1y_RxQ=m6TcCx05JgOMAlUV1B~9)CcM;dw36$YkOiEx~SnNM(3ak!i_${ho!9wTPvt~iXdAfkrLxo*u7$FId6z_6vD8=Dp#RShIJ0sC`x@T zMKsg`_CtsQ)~19sFcrRL%VYtIZ@Q32Zd6sdCF&dL_P348dJK(=2h_i>BoSJ$kzi&K z6k%UWl);3_u#!QTC=$NGt{^2~F>$@zU27Nt3;Z{+@Q7G2_aa%|k|0HWhRw#4IOFI` zE~<|YL@I?(!n9Orx0OCdBz6>vvZ29*@02}bVmOICILq>aa)+FhMdUs+m}cc`i)1LR zpck__m^jGMs1{vj^9kwqervNuiN5>2nm(21F2^~3HF{?A$tw@40T7IwD%o|ewE z5yN3Urh#-@Qc>%uwRu|K>;ASL6PcGpMk>qP2s7-|J1n;3E|D5m_!><;%?tZUJUlT9 zQl7?Iy5JPejhSPI@jp#LJRlm6O&Z1YFG}TIlE@gnlG1X?)p6@1fs$0_Hh3pe_jL;ms9sa}F2iinfb)3ZZ;&$dl9@mB{qE205>|vlb>ih3SBj(CjO3vV1Z|(n58ur!-wFr?n zVcTk|LRngtT^A-Jo0GsYsz&nI<4}!56^5sxtruI71s{mofcJGB zsp*!3M$Ylk(WGvBC7M!!-d-wW4n!DZ=@P}TJ`<_FlxU;Xyd8De10g6;-O%2;S2>0I zgTjm=2V&%^@?4-I?A+3MR~$9GswKQ9B0kH|{v)lm;ZQ1bl2V__FJxQoNjDj9NW%T7 zIx(pybnr<9h9`hZq{|d3Q(T1ih7MYDC2p@11BflSZYEDFPmDHA!JgJx-`tqPtSC2E zk>P0(a8nsf69m3?HV|B>Ue6+**yL1Yb`e?DT8%bcUkP5){im@%SIzSrsFDU-T}eez ze4{vYG(Z)0Ta7$S-d7~4(GfJpwp>D?A@f?`CGb6v-P1+RUN|yvKy~)e3q#zL5;50- zj~Wp2Nk;NB#k)zt-3DUvjm4yh7aq#xu!!M1Oh@rw7t=;Xeue5s_Px4J&CKAL(qbMP zHz^KE@3mGI--gewG>0s^QqnOG2`F4SlZ^! z!E`pu%zBkHS($ydH~2inei`~c$-?l$M?`gywMNp=7<}g8lZ<{)%5miZG9-NsM?!aQ z?7?9__f9HFnlza5waH1^-_Y-QJ7@D%7J>>tb56wP)5%44tF`67!imBCd6E`vduaGs zea>0s3ILCi_VReAkIkcvSmn0f#Kw(>)W<&xdgT)A%OXtE%=0cAZ%vCKV>)Col>{v5 z{b8DKUvpVy^A+-%)d75#tDdW8PUbQm*Sbqif=I3iTepyR9>=xvTv~@_Tf!c^#}B93 zy1bl8D;Jo+em7eq?^Kcz_X9To`AGQ(-YedCIpY==;XuSGvx53%7l+t3E)namX{BVY zs6=cJC*@~bEVY8|*>n{!B<6&%cy?W4Fc| zHWB`%Xl53=4KI~MNZTG7iowvvE;bR9OK+suw&YPWM~1;93~up?Yyy7nUUK;hO`c*7 zWL%r<4oiscIkv@#@W};@IGOYNiCOxbKa5VFXSml(tTycC4C5Pa)@ok60b(%zm{%>f z2Com{xxO%Ae43Y_*jcGp$SD(k4A#lnwyV((xQnJwqDxKuhHxOryH z$`?FFduq1VT3&??GsO*d(?$kE?$a9@=s8f&&uARxrWJ&(2 zWul^AraXmhmaY$ax-rH87aAvcpjaxp=2t}Y7h4?st#qHC#cGQ~)FNVZ1d5AyB^yl3 z{tXuZXwAh&uhoFf3x76xOBW`MxfJ96tXQ-hlvU4otW7sX#p*k2xmHidu0$f?TqC|! z0XG@zDeK!0_#km`-T|s(qg`+G){Y;Oqs6+sI`|ojRYx~+8yD>hQ@m7)mExCVSd<>W zB*P{XSsM!$yx-p{u029}h^cH=qrP{C^^85R*-)Q*$g8Vc#HIS!M|;|81ry?XT!^^L z2m~P<<$1UdTjyvV8xdqNX2?B3jA7?W!CTYxHd8_DysP>d<47p2<~=ZWxFzd{xHhP@ zHjDTV(Av%};sz#+B;g{)w1_mTzaBzIOF3w2A4p*u*uk-G1y3mhH$UXiaKs37d(Vt^ zM8=i9h06xd-CPZkilaky2qzGh>lBXV94+^RU72kAMzbTk?>4g~Q>h_rIXa8`yDCAR z;;0Dba6OefmpO^BU}u|fw9sQyewn0kPr}8AwDKc!N^&@B0c=OEZ8oR;R&Ut#ogXJ* zSKyy(rdf5G;~=Wp;9!_z;X6}0u}`qPq&%0>ewu_+hwiM|49<0-44B={ZQ{Z(CRvQJ zY6@k?Bt=+9YzVp4ROoveU_yUO$D2gq;vuIz;% zxS4IPG&bAD^&RqC;*8MT*Q>AC4qXAAp8^&|^hAMPH34MiG>0-qbb6S>uGduaH16xOCHSgfkq zQBMQ;oxCDy!Lb%DmpynO&Z@NqW=|!hOB}K(Zhz=uMoxwtQfV+T8IkFQC6^lwr_>Sem9&=HI#o}Pn62J2HHJ;b^)m{AIyj#voQHPyvJ z)^1#$zT8;TKGxAU^T%*At*Ti|g~zOh!ze}V;krgQ$*C;g(fiLE+WYg{A#KKFDFGXMoQx0@*94fz?Q z;zi%6fG{-|#uFDMK|B*l0Mgka?ySKv;g40@w&UC#DYJcFP(=@AMZ>DNZ&jh2W*5C`fp0fl3F%1PFMM=95@zgi26r?pMi^0l{Ntj)radwA7%pOU=Z5TXu z2c?O}S0RyRaTVC#b%VtOT$(aXsp*iK-E6ftCUTb=Ye8Y2blzUWUON2#TcJuV}_&lZ3*~~<_xzg-4J4?-pFx2j@X%YWWVS;I8v}M9SaDt2c z;QbJp`Eq*kWIjWtgrTUlb4f&EOzYG+GqO5`Mg&GJ{yBu!e zE|lQI_D{-UlD4@fWvbU~HxX{y>26pn;Aja`8=r@o$Yz&&u{oTeUBRwNT$Z@|!OdNL z=#rQOhu*m)rk1-)o0NE{v4J3Htpo&{^mZ#^Bk&`S0OF0q|2aW_xg}waL%$&2YCR+e zsjX^NX(*ESbb@x<7~Kg=y2mI2cMt_baR%OPJDq?-x0+;V7`rEC%NSv-GTy>(asXha z7@N{I%&ZPsx+K+u%HHhsF?qE57JUYP5~imb>9$$nT2Zh*t0kpOjm2g$$Fi?4o~MK+ zl**dZUR6Er`G9KrUa+kEH_<2uTG5f=5L{gn05p*(3BmGmYMi3zI@l+rI;+k(jR8n?;GC2a~N7Y zuAD{xW(s-2uaoVx+5Fc_u?RTvw2kmk^<+i?5ys+>iV zaQ%7+9nE&o75K{JS~zfqT{VYSRn%jDoP^V7P6~b=w+$ZU!s`vu1B0sj%#RZ>=%nCh z@HJzQ1()N-KkiUbq+RlxMNc^y7P%@c*J`9&3!lrr`@LBhJqQ#-o=7Tb;5Bbdf{hl* zvE5%M5xI`cuy%GW^WX~jg0(m9W{$v3$EQgceCjCg=k6urPHu~lx(331UEe0*Z_7o% z&*0z?$RijK7HU&Ta*w_NU3O<6MiHfxus`@97D?Tp;6lcCMB(qrq;WsQ z@5Y1o(yXnnKTpE)wugqFM?^HyEsR2+w_nA#`qfn zP2O22E0KhEKr%X{$jJCv9()kwS#GVSKIswv`xfiYf=L=Mm@r!4q~>o2*9aZu{es7> zXW#cpxCT(K61!wNLg-#*$uQ=YwVPS?{cf3MMEsH+9AqOTxlM}l2n;Qigz@1vF+cZw zN?MAZrE~iZ*ZvYoxR#FYMCvqG_GRQ14+dlw5+|>3!{EZtX6#&rJ6Q7wkk()bmbK*x z?hTV)eU@eTOB($BFi=+aVsM+_x};zTYOnjk{GD8{*X{L7owku|(0E824m9WTe2z96 zSp5~Ag}Pg6wa$%Z0Sg#WpeZgp#47bbDYW!SlF@Qk^f{FqDhsMVoY&9df&$y1L(k>s zLwNw9F^h`0#$Bn+(h^{B8kr`2+e6yTwR-ANZMIzOs6v*m_>+ly@z1r57^Y5{L3o}6HK zs*?cS^|Pmejv!Stj4c5?7mZ>wI%&>xH(f=+niA@1jJ!>zR8%<+HJMh%nsNU^+Kd5o zOZKL-^Re-XaW6kJme0sg@Zk7zcZIdqy^{*j><6qp3>nMoXGYQz^%Z@Tr0MsqlAeZx z5Bs~l>jSWIo3ZST4Srk6lwK2{g>f8?w5tyOHxtty%D1|Q!hPt?i_La-z1hQk#QnwjNYRnTpB8M|w= zL4E6Cau8c=ijt?+C&R>bWkMDAFd~7^)pwq1zBd{du90?03~h|DlO>OOAJi>gvd`rq zH+n#x8~uQ!802>AylOf|*S}FeJo5S%Ho9&K8Bqs+Pw;Uy1mmZx1-dxI-EF~}cGk(k zo&RaeCdA?~6+oU<{$6>0HhlvBs{`dwb=8Lr=F1mj0K3Cm7a`@PZ zOZ1N>s-F?XJNkm9+%PP2p&rgWNanu!-n-Qe77~P1Q6%5eg+{B>PqCU$jQ+)z1$b2MGE_Rc_NgGGUMwu5CZ+tsYkV1QsI!h8&(2EAWd#I$>CC z)l1PS8WT8|EbTJbgeSNsOxI8sVJ8vZHOX>hcW>1yS)_j2@k(Ub{~vhu@akf@{14tBf_P6}jkW!fRAoeeXFrh3`c@Vw}m1(-$)ccME4uY}Trt z5%G0P#w3!ko`59;{@{R$%sdOF`eI%|ky%~rzT$^Y&eh?NI$B?xqpQjcgY%;DgJcp!s-H|_BjJ{+-j<8K0ea4c#1`53tc4#hg4D8q88?nu!3;B zaR)kz5x2meD0(dY#i9X{np8rQVN!LI)qVXOrj2qJT4&t}|9 zyQ@bZ3L7trBdpeD|YT zr6Yn^Qzs_yf?)Ib3kIOaUH}Y7V$p~%q$_9gplS+?H~&`s7`ty(q@H_>I*CMfNAnqn zu4;z**cw>s>DZMi^|y!3ZI2XGIUnVN;qK*8jLu#PcJBjW;;Co+m|?mMH-|iwWeVB& zgI`nZ6O=^=VBJ~| zuVVL9M37QseVq#5lZ9!bJ4Yiq=H*AeC|&tJ)F=P1s?pQn2eK$9tvBw0Q@ zBorUK393em4{J~Tqg=-L|NitROD=jP;ubU|*#sM!Dl=r2deusWsO~# zR{iPe{>LFos)T<8+(axuXSr=yUgZ;-Sp&u$EUo;khMW)VFe$S$V!6XkTk@u^cPZD; z&N4hl%ywy|@!PsjSXMD^!=A>ZcOlnEe-blvtA>vcc1(lX|C%!^b^sCKBs3i7LUVKG zNcxMTW-?Ftgvf1ia#BSak`wgW%n{QJ%zhGur#1zDMo=nYq!eX8T?D-OKz#%T@1Mn; zK%N95VKO!Z#0O&(;QCd`yBxX95E-Uk^JHv)OvQ!;>ra1D1AOesR7fP$&)a7gGYao2 zG8rS{rk$4l6j5pRF1D7M#tB}pN}iP{fz@9(HR0MhB(ZSLvTK(cOZqf3&VEvf z+f*XHs`!FFuZzq_6zNa)nhJs|oR!|HY&1H{jh?=+Gp-&{<%5G3IRg!wFO&Jx30zdK z87+jl=8#L1++DOtVy*QOahsBE*SWE#UYAX>>^pavsf3$rR7cu+-HD;5xSd$hu+im34m6%kzUC!5x zgJaPg?7VsJg@{WrvBXX}50s~Sj14}Fq=pgf3FsKyKJ;;@cu3Y*o!E^>HN1jfOa}US z@-G}@17k8o)P5f#sd^1Yf`6xecvir{!RS^+(fBc<(W<^$`3v=h zuT>MFR@p*}OxN&zpiOphRlkSBcrBv&^SoZq=jXM3nES z7@7>s@!{cz5F^N$XneifOdSsc^pv1I9lgi-IkxI`4jxZ^$TxH?E6bJRS&~lF>)dIT zgN4_X7>n=D2nt}YnL{d@o2{uFwQ(x>Y6q1FKr6Mung(unTVBgr#N}$8hDeLV+SK*g zm0QtRh7?($HSh!OmvR34cfb3N72&^31|Q(0h|G$e<}&i5Ea?OZweEJl zJdb-j%k>rHNvVsR<-Ph!yRq7rM25EV<#MaB+UfQ;T1)k{X20K9ZPwe(&g#YmS=?&+ z72|Alg_-P8`Sn76GTC2ai zo^77rT>b89fBBp5?#b-AbS>gmbM1U{88F?i(Ythr2U7Psa_JJt;k5kFE+L-|4jM&z z0Qp|pnA*6!&OmJ2ttAFur^x>`A9=!kNIx!qAzXsjT1QVDzj5ir@%r&&zx#)Y&kr|F z;2hC7y3#y9v$Aw_WoG95@nfGKojJBL(_C3O_IH2xzyIA&6wUdc2VZIi*f5>iX!O77 zPxp{MyuZ=xO*Jnymo^DSZ)&{@jxOWDQgfXiKsKrezQymK)>~ z0z4zM7J{FWGE4DvVkGGQ{M|o%Ok8iYI#W^A{=?|1{plaZ2Jv&m|NY>I%)Fj^*b%f9>ng!%5@qC1ZtK7V+oasKd;r4z>*UwnCDdHHDLNOR`%FODo7`Qk|9 zsP4{Zx;H5fvOm4i-CVlh?y2ildN<16_&@&PU;qE?y?b+8N0ui@s(ZUPHa2#5CT3%I zV)qYPmdmDP5_;KX*LL+b2!JF?0D;0o56A9cAQF;L1_>5O%5rtoH`ssLf6T<}&P;@@ z2lb{Nl&F_w$Mk%O+fg58e<$C0Zzk@&BqY+^T@hsw_uf2t^5n_PljoTciHkF=vwu{4B8O@aQgP@1`0clU_oqMq44Wi0en#zBYfHYt2&^{?{+qVeE!4n9p2Z68 z*5tI2%vIxw-H6l&$r`@O=HY*z(^as@3xd_YF1TH^TnE@AG!P=(Fxy>lou!Ln8XHQ7 zQD@p@+_GEh5tjo65cRO^46<`9Hnn+$xhXr;Nth!>W4>i zzJ=sf40-jTI~Kz9b@71O3Xx;)5bs;W+dI4m7QEQYpA;>0$A7Q>G*p_qCRj>z5|s`# zGioSg6HH!8ToRIIR0R=tJF4ftMWRS!O&;xD&y200I70yreg$ptpVj&{J~dXh@zlNa z?GM81-+mh@e(BrqLO-=fUTZHf$saV+YL@{b?xm2 zp`XbD{2{skWBH5A5T!<;wm>=N=4zFu@`bcS5QNdn96RhIgWqE#i0@l16-!%+JVN9_ zRw3d|n}L`J35~vC=V=;T9z|OF@!8V&RL(AV+yD*2u#eIpqX@%V`Vo1h5rH2Ji*`a} z5_ct*7ssI*kl=%C>1_5qoTke&LtJv;8v%j5)9cb}fajh;tc4OtW8u7}?7#@tLNF4Tm<%zp^bO=%Nga!qpEK8i zP7xJu1}p8J4m?#eFz)??`1EnOM^8Tw?0z)#&{mW4A zanV1|Lj8t=fRHgfOKKcNWAOp?wH@lqUv1${2#5~h4%H!u`H*^zNg^#7C6?V@5ccO= zwI;doBYJ{@3G9^^3*wav1n2zZY|ryhOSG-k&$V2d-S}@J!UL9?Nv(Wm>k%1#pW9uv zPM&~ft%WkCZ?n^<(N29ma_yf@q$|H9B87nrLEBI1A48ZF7jmU$p6<&-z&#TA$kha; zIZQ%xt43zYlQg~;9JS^G90qE2?3l&sd<9+v6~%lOH;srNg2T*H44IF!r3x%J$XE%h zKZ}5*I9q0fldNIw)|=Q!iqIgd0gcNiG??IhH&}wt3bi7xTaC+FnXF>6{)n&PGz3S* z3a-f!A+8_{8BM)m~fctV7A&?)5LVmO86c>vCnW z+ezb)lPtfB8rj&(jJH=dA;;VU6*0D$X_QZc;DLxVUVqs=J4iI?Z;@t}Ui!hPF-2$V zQ}-bFDkfoLw!))kN|hWHxM#8J?vc3Vr(kM$5A{YdcN)t>xL(PXVR5iastP{w!Ic;b zh(kE-R2-*CQ`izLP#62D!++9pTyWTCIal|L^*mcl#ZhC_+G4a>R0PFOyNSpp<`Qj| zY|ol0%xBLOD>XSg7SK)DLqqkO#S@0BXFrhhj>x{#!XHYpm9;HvoVh7CIAY<9eFX9_ z3!fFq)vRP^7N$mCGqohb$(w}Wxppn{`3UNxBS{(0QOV6$LTnpk? zB!vn0(r(RDfDehKdvbXLmDi>Qo%T}u0>bsyQDaz>&GnY%`>EASIHyU1LB3%CaK{2) zVE-)6QZk%otwiacQF>dF%ObiSD(CAbsIylr@qFZ^Y=Z`==xi}p@LOhtUBA*_n-G7k zb(c3_l7)>;ni0hx`o(g4vA=e8f`zo8A^TUoRU|s}pVXgYw^cXlnW^X+dl>HA{n;&v zlKb@*f9*iUNMAH|lcVnju_*@Se*3^4D$Vx}_kR3 z_ogz;MdUHHPY_OroDbF@bz<2x!%deF)*AS}Ai%eQg*?k$5KX!xdDmJ;0m3I{n%*`r zk%+hasGBtC7n@P{^)SF{33_ZF_pN@_*Vck{KV@>$#IU}XI-OM~HEyeV)(Z5ve#QVF z7J!X{5F$2$LI-iX@_@ckZZB5q8Z7@!Ab;>eq|_EpJcEjw7a^xxA?%2G@xo+Ss`t@Z zjSW@AN#kV~H9Yq;d8QhBE`#VHsRHV0zBf*>TRW+}xpukT>-E1@h>Xi8=Je@A7!apR zVa`XR0hI%764}FAl1GBZy~}0E3egtZT_1-AVflYF^xN46SEHw9+O=q82ghDvLw68<`$;@{o!#4 z#9U78bO{g$Pa|5l;Pt@-dIZTjad9&6`yn)-`hZ1Y0V|%?1S|{91!as)fLCxd3{RLo zL@nJyx!O3-?G@(~T#I5(EalpjTq_MK0xFh?c%og5Eud}=ej38HOkT=r9+QlAA`GEW zuGG$x>NPu8pr9~05f(7ixDB^sJ*U|h-MIU=zc9m;DKM_Ga0WO+vE^Q7ZmNYBDu_?f zv~r{g=pGlBDnVI9b0ecRV96N^O*k)MC!b*%uh$&h~X$L z()OKI+nUvZ^Nb4b=?Xj~O4KT-RI2PS_1plQAg6s8L&rkM7pNXF6606T(tp$NP~@Ce z*qWfrrzx3<^7XZ7;8}iNDwuF?W-+2wc_sEB7 z(0deV?MF$&%L3&kkWIwWtx$Cu=fvF z$Y8m1=USu;YSNIUZ@e6{#f6)fRyK|vJ$6-r9G6ds10V5)%)l|ndbM>~KyLQB7Z#5m z)iA^ZgNa$z3Fd27D>DbPR*8Ju-8c>PHWHUw4iJhra$c5Ttm&jOxEz0>o8cexlo-(e z&!w3Ou?2Y`sgXw(hM2*8Q7s8eAh5_7l#YBqCom6E(}9*! zUgLU}MjjA?4$Cve@9fY#;u7YZ827>vXLLE6L&m@v_&`$eFcirtLgtiUtaBln#7Aso zTv~<1m0f_RX==Z1A@?dMM5!$0E+n;x#KhVV-2)24!L1MaEr?neV4594?obLLMqunt z#W{-TgbE^^IwOo116L}-+L0}#!b_+{Y`jptn^&9hv5%Wr!FzmdD`4P3+~aY-&o(M3 z35A=!B)!E1+wfO_4wHY>Dpu;`G^x0M-1(Xg4=KP#`^#4lH+de~1Lbg=V6G!`1oRsf z2;`)u4eRwSc&>deikxljPw5yMgeMBBhdjZch0cg9No!%2aH0sN*f--Z(`$qdrUXMp<$AaoR77@eg&LU1x= zWS{DFa_z;-o#~Z+7oj*;Gj*gJqY5c7X5*bsN~4+Z?f1nvTAcTimT-OLZs5WdMmVH9 zN$X-lxgQI}*o<3TXSzTikw9Nh za})>1Q-fEN5Dk$N`;8c0wT2Rl+~zAOWbw<*lczrY%uJ~*9uVc_hH8Og!OAF@Hk3CoN_Ua@t`*6anJ!{xk&bGOo%%v6w>ZMpjgmN%|C=#yf7 z4W6{%Syg9ca(WdnklM<)F8)U~1kYV=Q}m#|bKl~|p1Cnl%{<_#LWDw4eeCJuwi*Cq zDxuF*hLkeNeQ@-vRZ!q|cZ?-uEpb;;sd>QyN=CA#K)PKj%q>UEKv)c1;95Lwmft-$ z?9Uj8;SK{P+(ISW*{IedKBM9ZBc|}VaYDzDBS;~zc6M-`JdHIW*iQm23^+1NJ_??~ z9h`;oN-)-ji_EpMnh$-HW-GmCHdL5IHc4?jH|FV(Zw>c?!gWhrw8EdKL2SnZL*p3U zO2j#ZFpo1uL^_iQ(Sl9Rl8UYAy}z;2UFoiOk)7@j9m4_5e$J*^ILW}pnT|1t+Aa7|Qki{^l>^fENDbm&XS zvFs|eeGC+L{FoV0^KKD zxf+pFJFpNd5`b0nV~J<%NI7QUrX4|L)&Uu}z$CLOyYuT`?7WMsh03I4#v7U*i@-R=QYIw~I%GfN&1scV}4QZmdRbFgG2fEhY_q zdE_J9q_a)r0YFVj?(5Pz)jEMtbyDq$8!ld*I$=ovsRGxZxjRr2nMb?!YDoX8ttHL5 zpOTFCfbF`>_CUs5=gNBHNWk=)_LX+7N2#~oW^%848KWP8ZXv5R@)F$y>~ufJ5+$Y0 zYlz$o+Asa6r_}fx^|W-vf=p6!$X5*mNP{8|4+@0XSN@PA*u%MDIWVS zqrUKfd=x=QwXk3k#Ze#;fmS4$69p&|;H(aPNkI3fR{L7vw@ut3-9EX#jZPv!;%Ni! zK0_ph7w2-_>gE1Qr&7=Lmpb+Cr4^QH!OV%||Axl2Z~!RdCBX0$O0xP z!_!^wb(Zn3UKHa)KBE4RwolNvg))THqq?_R`_ZE;B`}>37C-7k&DnVL9YMx^tU)g@ zb^J^gJDF=(2`17&RQdqR90s(dhvQE>b341S-d~2j zWKokxKO?e4T~FmOEF!p$5v+ys3{|+CFXrJrRxCsNp*SP9^(!(WGOs|>-G-kd5(SHr zoB2q}Ht|F-4w5I;>8guT8?<>VR4mOqV!$9{b8}Lzzr5OC>#lduLbGUm&WB9_LDAIG zzN@EW4^Zyd=s}^$0+W&YlASXOO^agg#Sd2t5REl&6lZ67`_|cckP*8<^}L~iw4k|W z&(133q_`*vrQY%1Gz?#k9`&i2jwtx+u)!X-yWe#d*E1J;8|z5(+*2@+KtyQMm zUxVS^tcautI=)v(ggSOKBM(zchQzorKb;nHQR0XX#XF2qf~7Gz%l0})1jCaoHclyN zjFUGu$o-z#P|b;bLYmVa-mqQ@4kZTyDsYT&hWXigi`?fVskrwO{B_@C0cO83xsPIyxXT7u`WRt_2r-z?x$4ER0IpaJk2- z(kG_b4zLPqg)*5A@-Y5DB_7;dCh08zF55)_4i`zJ;Sg#UhV-I`-T*24WJdK*l35sgx?`nG-6fiIeGqFQC!) zG-%=KSgey<5=%P`Uxr_aFo|C;RLqN`PD$wz;IXFNI2p+aJWU_i7$_nbq%m5KnVkOL z$`Sv$YGru*8vwZ9j9d^A!nL4Vkf5v;OXXzg)*T`=te1@j-9Fd`Zmg33pzttIj{S4& z&F~%+P-{f)r^FyX_$LDqY|eoqoixvKjx@CqWQ+mE9#Jp-VEhQ<@MPRm6-ih9$FRT_e?kO6THG{K`jkj}z}A z%`D5<{>_?kp){YegYpQV;v7e^R#r5iUMwS14D8b_g`Q7&6qH%j3{m@ZjXSDNBatqy z3aEI3t1^V&E1h0{wKK?6MU~aH48O(KWtLx6e^m{9e8hm+Fd?wS43oAX=aTkj^&Jnt zp`L#9btJBG&Mt!Wk&@D&J6#9EB&SNa(^MN*;j%ydvx%7)MlbK2JPBo5rXlI!xZYA{ z-{+KwYn@J;JQJAV3@4vZtH%_L#pQGas19-FMo6Q)f{|{}QVULBUT$mn@q$xKegieu z1Uf--*;M*T)zEzej@@90vYGj1blfaR2bw}MAs99=5EiAvxyM3JMor z9JH4^U-t)Jp|ybrfA%RtZ>5@S#{0z>xa1G~gW>Jt28$m_`yI-m|4< zgOZ7I12#``m*(2K?E;{NWAUrCc(mG?C;Hx!c#9$qPV%BUhb)b(x`?OP@B+F-G~M|S z*YGgL_fWmG!Gj33Xz^!yb`O0UObYwYba!QK75jXDFuk@uz)rR?=qwcmgZ^OcgOhnY zG18}{Xhf(#WLQ*YW}9$0CBBw~voN`FvE5rUI^n;m{S(Tm$`tHe+wV=a<2KkmVo6;n zH4AMmGnG_P+RvjYW>`G3JEs1|(%0?5MK$l^{5Pk8aNLm=S4ji=vT;}^-^O37h^-r} zP4{|NmZw?9*XiReP@QHONxCMeLQ--0P(`Ewqake zle={V+jc=$G;!;+$6nfwU}op4sWtEJr^L3w5f=g$X?!Zg8*A_aJE=gA^WOw?#|6^| z=DH1q{UjjR6rx^u$GsC(bx)Kv5_{In=?7n&w0r|ivrKFun&7=Ct|9(XWb#aDFlo-| zP}CHtgj1|`Ce8e(TE|P67^1kv{a_=s|nr?o-j@K&}n^0hM0|5#}j{Gl4dv8Vxo zkrE@Mak0VauR!pNoBQPbS=#x6iOA^46A_Y5Vd0G5hL*%cH$LPe;s@GTLWC7vQ(;Me z-%poiDZ;5M5N?qAV`{l;)Sz&`XFcMm9MU5`V(wBDS9<01v8 zAZ15WUsfzXpx}>ROdp&0V){7#e**tMIdS|L9^gO6=|3mvKX`VWo*k!W$LZN|{_NBQ z)vuxd;Kd1gae`i)n8u5f^x`DFI7u%~(u$)^%M=L7iz39wpDCAuQK?@Rj71z*{dtbJ6giMT%{WHe5D=@seIyuLf?2cK}9 zOxH9OuOf=LaaaA>Vv3X-FH!2dP@=4DNVcj{unti*|1yPt1BF9KrxL|io<_WX2?!y+;H4)NMnQZ`P@nc+Jht(pFq{@-_u{S`l`YsenDb)%3~d6X;@z@7Yw z?1>X!ocm%<%Z}s5LxS`oZ{?lsYS%I)bJRx!%lVJ#F>u>ag z#DdsFi9c^0(yh$;@~RBLTrz!F!*4iOz$k^#!xF;4YcmxcEgy@-<2+CCTxrZhoFT

EEOfj^)sTw3kSG5ig^`P;%y6?@B3>S5`Kh0sCCRF z2=_)Z>h-4a88u`Y+>ZqmL(EfF6c(e8nWleHCaT_IVGMH4Vi(0z1qkK`wp)6=yPtQK zFLaicI!j1reF4UMIE7v5l8##s)%ywIj4YLeG$mVPf=LcuP&k^O#$Txflal-5|2|F z+<8h$kew(gQ!Fx!1hXYQn$AR*Tw5j{MxW^kcliMb#~XUYFmZ*SJzy_(KLqJZCIXJUHo%F4v_ zrSAH~^yNzvxifV&5ytF|-Bu0s>+dGi-zY2wFzTl@A=e4G`_(mc>3IW0m~b(r28w|- zkzg2Gu5pl=V>ZqcYp}t^kEd6<7bZTQ?vZ;v{#B7r`1{i0W&HQ*BGMdv%>JNcTD3DY-0Fp^^p_sVpT_<-^<(S?>s|e}XtODBa=*Q6VCwz?uz|n( z-7PsP_v<_Knvd1}!8K68{U(kXu3234HrWJY zJsrDecJ`Cr{>H!6W8?SBZ9O*aIwoZi>+}h?d}g$aBMSWD#l6O+iNZMk?wx`TLkGNN zpzXaH1$E@~XIZvHSsfO99tz&DJ`rB_*p}#0i#nA?bMZ_M_D^H~O8xLm`y-=0cNS7D z+;i@MlO`rf#{O~R78^3^PKBBidO z5|7uAZiN83r%yc{yKi+wxNc$hz!(W*zj+MlPaguQjDuC#87JmU!)5GIc#CQ7j@=h{Ny2FtUid*Htbz+)SLc{JD% z;A>{Ml#SnDzX^gfa?6RuciIVS{JZ1S_NnY$xdfOdNDG13ly*GL0@ba{vaKJsSDqgHULg_U_ax$`g~`JA$Cydi_{4ol{XLNV+3wL+k5RWSC!b|{-3ysz zm~W<+KqrmHu9_2W&(!2uQjTN+OPUG}dqkp)!+9fq<4GYMsez7RHOov8YeSEer)pr_ zrFY1&az|&EP#ujM4{bV`H#)a0PIRIr&61*%UYYHRlL)F+3WPKV_v0umg=W0|!6P8W z=`sx3B8Cz71C2VyA>&Hfxiic2TPmF5Q<%hcu0a|1G0#Bm8n~!-ZnBKs$_QMo(fz}J z|36s6JACACs}-mmJjS;_lC>2XXD=U~i2ZV=Kj^Mps@F?XbG2$NNrM5__WGdHN%L)f z&|fXCBxo^P&d((ItUKsjXs>k=4sup}PB{TnK&Q|1-S(xG{u(m(uBB*69j=i+C`Fs% z%Gx>t`kC`Zn!Z@OmBmgmpQ5ueO0KqXc3n!*h7?@wOG$<_*C;3FKzu9;z|MBoal8%^ zpfuO-U+Q(TC`;7q!eM2$KY-n!k+>mMqHPS?h<5G|)_2z`hdpy+HC20ZY`D3%^UUl=1m`|H8(_1h~{XkbK&(XLi@WN$`35!dj=> zOYq?$awZMhNj~iLH?4S{>lo1*}GSgp-iA@OKG*2V7N_yk#4Zk?tPPRgV2qV zZO`ia#bld_`hGdZ0@satEpDq$Gkn_Tl5Gnz&Gdy7M~G~*guFMsetRj=_8=Q|SCG-~ z>&^vawf;KEkVG2nUVpLOYpwJl^FguMOB{gp(Yo?%WlDL!prI#G?j(;L!;%NbK;=E*aa zU0R!h1G({ihJV1{^%NH!At9P_8qG?F08Z;Y~S&dRI_w!`;OH^K{chr+joraXG|U8zN2%S z&|x~reMjYf#?*1{J35;gu0uTlh;SY4z9aH5vuNvp_Z_4A8B@o+@91o0lp>euu=gFI zCk8@N?X&MlJur}h4*nqFLpuI_$H$m7WkWbnNJ$&Tz9aQWbCR%u>^n-2RVhzpW7&6{ zz)-@jqHQ?)j?`0ylxZW{ceGwBv>Z05eaCKFVQ1L5_8qI+8EHe?cU0~OR1U&EzLmLT z*#P&QIQKKAjd9=6d6)^=F!vp!%?!7Z?mHs)Go}r8-_dyhbPOBszT@*G6SX1lJ5u*E zrj2^v(Rsqrv25V`j?}G;u(9tuCigR@4gUb3WBLf}J36;B(g$G_sN7~|YBIkoXdavN zUBkygeQTPZQ<|ld_xx0wSq*Q1cZhjikPZ!Xqb#Cg{3` zRP74zIQ^oLy`X|6$Vyjhp|X5)f$|+80FWNY5ssO0k*+)@j~Ixv$Zbjmj0fB`h zA!*iZbAc7nQ$bJ(;4sD!aHt|7vK$nuX)_x=F@{4xYK=zGNelN_o*K<#`gajC_|RxS zTdE-U4f0#EyhbgVp*M&6Uv9FvApT$gJdHFcg%X%jWioY+%mv1*48`&r#SG3(9dm}N zS>*35v6^rTI`?IQX*N+o?kclLRpQ|cE7P-UASZOfh~)E=qCQh%#I}t&M@p(W8~{3X zkwszGRNtr8v)OtB+1qs~rK6Wsav$;zBoRk7u<)WgHb&Li-%K}bpo#D6yPnD6uZU)Je zPrFI&rVwk-c2neglQfbXWYGtu8^YhE5eXiK8!JwVhyu@v0odoI!dy0Y9%1)&Kd4B9KXKcpD37Vo7?)3oof+d)aB`Q6Uosf25}jC1!hEMIyNrLw3Z*dd ztvbthiWWq$Vzz`_7HVFsj95P|PV_HOfox8g59#kBqjH@?Q+Fy~bLu{>bzAT1;jO+V84MRWo z0a4Vo8C%nH{96~#vI~O~dutg!WZ3H=ra}3>1wH|u`l`q?Q!z0aK(M(}8NCXU@>5Yi zmK)a1-NCn3?0K$|t7J)~_Uq$Tx`2tf>P)N2j>k%)GSi%G=}T#`Oi5-UEzkg!Tac~# zLs)VAu@K11kXkFbU+Y94D8r?5!+D}Zb`}3JcGnoFqO-XU zN7`F(BnkQ6J{}LlbK>lB?3sI}+#f&2$D#SNwkDKRm}$<1*hzyj_RLN3rG6QoeIai4 zEmZVs;fj^uI2~lZ+ zmLH{$O?MUAqA?frS(j%%n{kg?Z21UD9pbdC9Dd4`o-1{Ea5t?|1X2PcSj4Rnv9+GQ#xRYblk zp>@E{ib9-RfT0Y@twOC)SM^=e7%g+D!b1y=U?dvyrnk z$CZ272Uwn8k$}f{BXoniOVEa?ZY)SSOc19Q&mW!Y$<`67yD zEVRxPYmFwftHalW3l`HCvoRJI=24)fL0R0{YV*n_E-(SxZUh`$Q8>FZv5V^NoNvug z?FvkUGONUnlAU=BqGDO--xiSSzwY5#H=hL=wF1h`Qlm)aDfCT>@f)S9tKldh#X+T( zcx^G|8N+Y^>L57>l*OLzLn#0;$%X-{7V=<)6y_Kv60)ZC`E0&&HZk(da={zI;zl~H zD#)9-x!#|ISShJTTI3Ykqd>1&TKRmTF_Q@=DrioG;B-GLUblAkk z!_oUUssc0{6}9ZG6ZZjaMcKJIq_?76?Rt+2y`YVXiBpXB&4tqom9tbdCOcQoD#)>m z!-N1)NuPu%Xr(!zxxiqQvNKxk7K;Ki?ubFK=HMTs5yqD0#KE;|L@;3G#GTFE(-a{C z%g>BFk_5uiM$z{gsf%T{U?-j3 zQ!NVtR!`3r7iKHWvg2&-o@zBsbd=8Ee4v)JnU6NX+JKWLMEP!Xu)#R6~4)hf-ZB&yZJ4Wul* zcu`IAIR8!kJmuwyi0fINXdH#u!ks|wt`FKvNO9LkjF<*xK4oIqXBwioX5oNEWf>?f zpz^>rNvEwy;5<{HiDYg7vP+AMZe|F6Ko)<(`F<%>#5c=rU2as(-8 z^kdJ^jI6yDVB`6o`cS!p6m<1uPjIdLKMJ<>bnoz49v>Sxd$cFWDjAOgte)%%u1Kh( zpo-tSf~iyD7};@l3(3xB6U}h5JGjog#?oCml+SkLwVTP1E0aMkZ!!8B8^WM*ed^7n3mvBW7VgUYU;m^n|Z1Sq?L##5G1=91p7 z+Ve~!8UD}iAlNBF!YM;`2h&I-ZDst}6*N0XhfX2DQg-YSqD-=3K$Va72pLDb0d%(q zz8X7ay3p|G*WU0`nJP3;^=OZfWx5FivV62R$RcNihASTI4ys78pwd35P<{1ePjGeW z1_f9@+7o0m|AK;TKHL*@M;ZmyiR0a#`ZAIts6LEmyMirK8)WD*vbwql7_{PceWS5c z34}5W>r6H5$IMp`tG4w0pyOD^4&q^nbu`A_^x1>@!M7~_pYFs;nx}S$F88s=xG&3Jq!xZ zOD>cpnd-)cUe_p2;(Dv@V&QD%HW2lh3MVeEtanfdC}}fD8R=S(>cF_+tHzc_Nt90F z1EX6z75&Ii)5=Qkn@qjGF+je4RX9l~lu-|ww-E15@m(s#bi#CGWuI0mGLOY1&M#55 zH+@dcU~~`MJ>^0V4ogLv{5Q%v3NaIzcZ%e6C}Vq!#%})+{)JZE>AwylWlw1IlIk4y zow~>s;MZyHJ9fb*dLN`ql-zOLO4EacE^UblUHWkl85X*1v4w{=f8X_vNRaF z25Q2qCkGMnzgCD_Dr)!BgE)ZCZB&zM#`k}rYNk<&b~PCFeB|E32e#xzXT107wJBJQK%VO^y?r}*kBH2`qo&hM+Y5sXZdfG$?f_3 z&)uIX1GRDwh(0-p^ahtlib*&g9YoasO5tgGH#i?2MD%~7Fm?D%410GF2lFe1u;HNL zdUgnZ|1@YfTH;rg-M^T(jP&AX#|DmvhRETks1DCPMvN3&j~^ z8=ptI8=ljFW&f68{ucV0P&~Qq9fCC^%c2{Fht!HPNi>l23Z1)?0=V0<9(j@gCx*`` z*DufV$-hcnK;?;}y_zPA?P!Yb(pZp|w20)s5}^c{FSe*z1xc`KLpOE zMB)|I*U$z#)C+GApY=e`Elmy%=SlTAgy{$uV27skrh>ut^lk_QAnD=>r zmLldCL`c6D!9r-4b}_zTtZTR7YD(>pXF?l^6Jg5xBC=MVYvr?zEH>H-$_@GGA6yDu2r?z1x6gO3bb82)G{~G=>@RgP`OW~}LR2Hr1d$V+KvaIrK~S=2T!j1!Em(cKq^u4)qW;a2h`Tgs`p)|%;{Hep z7+LBhQb=TH40iy5N+B~em za{0(@7sw()W<Y78q^7-|Z_SPwsuF8X zudNTdE0@+3N#iH##~A1elxNN!vpKVRA3AmSC?jzTsXnn--78KLiqF>zUcnB>CszR} zAx<4jv6J?U>dhgU=6t?Zhi0jIzEzz^jlIN^{@iR|&*5s{ND1MtfZ#n7QS=}WZlK(} zkexWXd;zK%IQ0LjKRqJlrU0S7b5EM5HKvA9iFNA+LA%L)`I$dq>n&7pplq&bw2uzXDRATVb88&PVXgB%TfjD1F_2oC zVO)n!qo%sG=ue$mGF0qwWg!yNzX(2f47(?Jac%3ZL=lJL)1hHlz=# z%~5~|yMRK1v^QHxo-MWr{*NOc2@QRtP-Y3YC!uba$gE9?)GSj1t?8u>l6|6#$zr#Y zW^djKb)tr6v6Xr{79_`lQRC<^YLrk|6L)Pf5o)g;dW8r+83qwW*Xrkygd26P3#59N z+!echLl^014fERL#`38%v8^IoJntsXVaupGlm;^QHkF92!QLWiVDVS@1jO;facQNb3(j+{MfXSv3rx>Es4~|d$X6oGX+GnShC+M$pzgp;gUGM&(^XpS(dXT@^?RBQHKKe@# zUw++e%xW8vF+F3q6&O8xMrz=(hhgCE&z`xvq#@m>A<@>0D{OPdNsXX+pjK{wrM|v#L8BTg zTtAL>uUh-IhQHY>eng#ZP91JGYeA8Rn$~K~SMdUA4&IA}si1i#^aks5 zsHn}Br=jx%9o1wF-Nt|5q*1BR^|b?x?gnvNakxT!Tt6dvKVU$C!;pRA`$a=(jUUwR zF>5DOQe3U&oT=}0E~N4Arm5vq){<;Y>SQ-`VF}okqx>ZddHzfL^{I`)B|T>LlRAI$ zo8oC$mgD!vJ4Xu>M{(cI)hh}NW=D>3?E9m-9*gNqFt#aLQE%I)v-RwP>TO8bh2Y;# z<=MxmggJF_t-XSh2-t_)OH0TJvNkcb-0NMzCf&xHsY|{7g?4WZUbUz=ytc8r+8?aj zUtH`Xjn&lBH!JPs?&1_OvmsrhLj91|s$=Jtz3SKI&iy!wi~GZy97FfZmwvq64U#}} zjgiy5P^hX~DKDw67Kg=MEXz_Lt4rF(rMA{J zq5|>%qK4|ZzfKQd=i#e^H+^*C@fDij_7WU9@)4PYLpL31FyO9I##Zzn6id13;eI;yW_S+@sCyMz zPw8}dLF0oyzEx||xt?!Q*)NV9&6Mx59+?hU?HRlVf-$jOXy zXR4N#b>6}D?eg<9_&-*a=X4bHkBMecVJRzhNglFrbID0`61xy~0(kd>dkpkSDE4R^ zy%IBPc?73NBO~wlIC6e-3MxUcAsZ?+gAX~~h8D7lhZKHT&7TZhUwB*0CT zx+`Cykm8gU^n_qFX*^=G-}L%bOSb!86>6RxDXl6v-u);Qy>6?q#Ud(Yy<{@w*mqNL z5L1aC*NL*Wc=yjU$GI|&&M9vLZ)fJPAa7$q!c`ZZJaeMe( zhrdg6^3e^;>O|2ra*_vA!0ETm3d(mgO9}!RYI9A}wDWKSsmE;P$yKo?HyvxJZlR7& zLn#9{a0*Jmwp}W87Td#S*XZ$--pv-KCeM66w&NL( z3B{sTSWol}>>=%ja8!WAPbZFB-iNoS+^*TNq&hK-E*_eBcIB|Lh*oA}zE;S>K`RT- zkK&geUWb-Q_{)VqPqRRGJTTP2BJ1=K5XAZ`&Z5ja4}D6p6t_!-xh%}Z`NEk(sZxc@ zl-K3)-%zT1Y42I%?v2y!)l~$Jp= zq0qJ*z6HdE$Wsf%P=|k4^B2m-Ncv*)jw>;+CV=Yoavu=Yj%<^8a-$s-u7cCnU~f$0 zgzzW=PED}2nAFp;N0IJ`3AQCd#0fay>+mdaQ_(#YPptOb?axVq@28CV&iFx{D=IS0 zcq|ovbQ19$k?(FscVrQcdrh!AisE5QeM4FhR*hN~jpqJCp3=SAI^)^m6T3aAsW(qG z570Q-!8+T5_bo|)-M5&En;YDDjxOE%e^h_&vUAlw!9eap3oUU`?JQ%7dWwq1vm94@ zbPLw#WD#Os0cIvz-M8BQrrPdh_&?<1p6mB|okcjhXKLNGuMVsJ4*h5K=O_tbR$}qN zb%aivb{U1&Sa4Do0nvZO3{f?Yi)G%#X3?lrO3n>p6Ip`R`+Z}VkWXm2y%tSzs3*1m zv`3`d;b^%G7HZ)CtnpE#NT>06-4e6zBCk9mh-GNr|Iu0%UTWrU6l!JoV%HJGZP{)u zfyR9l{~&I(`65iw+4HDhkI29hoCU35Aq$X8w1Gqb7sDFFvzc19c0PsT`xUk1VSpu! zptaH;EVp~D_F(z5Q*z1wnKqB$O8HljB|169TV+_QurYR;ba}JzN-LQWAMxexw+uxv zT?Q1ldQOH1HWuo0&;IIB+L^a51!C;JH3+e{fo^Auq&a9HbS7Ja_L@;YonuV!i&E)K znT6XGb8zR+&drg4Omcdq+9;NbUouOTl2R;I2tJ2&Ma|7mTP33lAS$YcW! ze>rJf1YDpJtb=2VmQD$AX(Cq)Lkp$hhbPBlVB`rrUr9- zG+<7Q2F%ICV1kKZ#JSjBTX%x;?O;O~aLoxQHKG5I5{#|1fpf0#6_#Ku?g?^mLOolY zMH~uJicnmbRQm9n5!@Ej*t}x}#@E9-i&+@%Rpx#=dNVprv`yN2b9T1q)?a94nutAO zJZCpQgCK!Q%{ePKpwQ_VQK$Sj?FBo+g_N7%d7PbBSro=1E=J3VOE8njbCtM+DX*9l zIEDB(5qB{;-CG^>f2Srk{@@#dOKZH%YTJdYLekoR)zh(?d@Mg{c_13~@>+ZN@{l}; zG$_Ss3pDm!`@@BLslV9n!FzJ4&cf~{aNlaM3K7$(^HHR+{>*fXeCh;A42A7b zg#`+f*%ECQnZ62s7m_Qi!P?#$Wjmc&nEr5+J3 zn;57!91B4|c6KeQGV?pA1$3h6{*`Vg)9q`m-*}2fguopj0Kbxb#o;bi)%>(^?;y&J>O$!3YIjJ`kA@#!qkj>*?%$+!P;<%=cd_wfuQ4j?T%HY<_ zy7e(Pj~_e!>9Nl=B=LX%J&OP;XMf|NIB#YIDv1XkIK>4Ioa;6=>?gqh2Ugi#*--ym zo8!Aq!}gFN1Y3D(tHPslwsyKe`4WaonPKMIDHq@cs4wi4hiAqJq_(KBxzxGX-sovR zmvQ-oi22+GB^>;`<}=(Gg%rlKJun4u5&=hXRlL{V!*CC(tw*wm7g%;J6%mP^mXS0j z*-rKI^l^Q_^QcMht3>o)3$qqG3yi431n@j^g(CL8)w5 z5}<19St;9MKvsu*Pes~F>>`Q%itmX*Lw}`3Tx;J6&-z`}qM}@4hc*ywnQCW5C*=cm zHoRsC;cUnkN(DF}k4)nZ7cX|N{tBKNE9>2h z-Oj*NQ^uNDu_Ivw79K6NmOL7gtx(_Udt>eWrQFv3OuaSo78@V(WQ0FD&}dy_-_V~Gof=&TRr&N@u820zTS*E*EJMe+yzZmx8HztLgL5f1A5 z7iz%1*_O&Dk!V7FZ%v|lI<}eND5)nNxc4m#)z@yQ9vC|o3_Z#iXk*uj3N*7j=0wEC zc#MSp?XJ!e0%PhwQTl@lME@<&Ul`$%`)57Xjbf+l|HSrbT^U3RA->!1SXxiIPE1ZO z)3SoWR&i3i0@8b-P%zxQogjY4ckPLTd|Qn}GP@wQT+_@yQ|?>V<{GpxMW3BQ+<;dD zO+f{Ym)dZEZOHMSpLUZ9cWV)h-Q?Y>x1N>%!U34;#Z^lmwPXGLxe?4F5h*8xA|VET z3Vb;s-0*0=9)r(y8v1nWqa|}c7G|1AONwkl&RKSAW1msS0sv0~$`2-f)qw^>iJ zNn?g%Bf5MED`SWwa1^&HCw{K;_dbnpHVeCb*~ms{4a-d!Ixa-&*?7-)eGL%t^VGOF z2c^$02lG?A)*Dri4e8G#_5pDETMpF5Fz z0!?uqF2((CC}~!sJ-E~{)HANPv=Dx9cFS;~rPmyIq1qBIcPPw=*!Pe5yGz}!cBzBpW&J5zbptjSCTuy4DARwN`W)XN_it!IzDaKDEV(f zM}k4VPdHDZ)(^x&#HJ}Z-NM9mY$yPgCZ*NDxl@NZEk$6^b1@Jm36om&96V^f60r+~ zM*>0_(RExFchb?-^o3{|b+eQpEYANn%|;C0n-1xexQye*o>r~N`Kr}&m#Rnthw_soWh9@e%`ba===qf!`d95YD(J}bI6vsG7DHX-$gM6qa0-(xcW@Pr!fAjatC#yL-?&~~U5`FJ10zn~empx< zf;ZK2cdZjbbhcPiwLTG>yTZb-LT$_Wnb4E&pmPEC0M*j-Ix=Ikq9Kje-6m8`)BO>F zS);lr?$-!DCao)@a(K7`0rtttVyBpQgD97B{pIB_cS`ijr88X$KlQccZyTMf>o8Au zdY;darm~HY=u7U`RQDyqKVl(^E&zl{P( z7IVEWlq<9S0YV}g&Tm#%%boVx#-Kx57}pmR+}9YiSJo)wX6y&KTtmczyFTR$FuN3* zQI2lCdub)Sp!plIKVTThSnPtUTtDrX%=?vyNA^(Hie;;{+G~FkCSaLOY^PbY0do9_ zzw4dBmF{AAC1QQ9_b+T*v|Iglqdi#vLv+2=I=G3qu_blaL;FI#eX%|0y8EajX~rPh zf|kTfV%AuiGHBYTp1wHVn@)T?FpTGj7+tt*ZlLA|HVDzca_ z@=)5=1sNe58j^U8OtdRJHHiB?4yV=CuR9mu8~e5UiypamWHqEmsZwV zJW+!U=@Q!$T5DKkNa-1RH&_j=t4nyYx@v#brNgj=I#*wXmrIXQKP-jjbEUn~UkyE@ z+vnO^uSMW(;G#?c%QhN*vwpdS2mmUV9@^(noD1h6ZG)}L?Uf}+9d=VB0UmVVh>KJM zOO7{70Nc6P8Q?}7Udd~}zeu8w-DqRbYxUY2E71+tEah&u`MUiTs)#L;MDlf~{Z-2p zp=9a|*E?(1GIoM65K6|;hAPMbgEGI@7YE(db+Pw^+eWsT@CW3~y%6HL@Hb~W7ibUB zV&|U@<<$?532b*l?u{vuPZezIa&IMC_)cRpb`7$uYGOu>Cu_bbMBqJu`0fw!jpO8Z z6Y;TortCdp*mtr@dLJ?5O(DpP80@{Qaf28!?Az)NGGf463NXLLj2QfFbq^Xb;0N|i zYQ)g*(KaRTVk3rqn_#os+=u})q~(2Z#IPCCOhz3s;QK@kbtfG$@LL?XkyO&$y{v6F z)wai|!S2N)M)osEVQh_~Uuy?c;d(@D%?ry}8A4Rl(Bktgt zTYos>UbaOqmIiXfeLUfPSUSuRckzRx3#|nmac5h+Go?ozG5C8NJlDjI7`B)SOP4$1 zE(CRyHh9F~pE&f%Bktm^p^+Xj=-W!CJz~I*qgwG1_i#(<)kh5Xj@HbN81g++w?AUo z4{WvFh@sz-_Jxtd6&8vS!+qkgag4Z&8_Y^FVxZT_&N5<{H@T%|#89_Fww@7#zh_#D zMhyGGMa$kaV(5=GbZM~~aS!)(52L>&Yv7Bczb0$iD7)K;X=C&tEq5dC;i00wu>Fk~ z{-cQXaKs%vmK|vOESSH*rt!fh+*H7UKa6iw?b|hs)cEoG7VN^ zx3khuLw#$$H`|S+hyKj=Pm`V=Z=)+1=D4rO+W`K+_BMGdU8KGErk{;R5s#O*F_4?w zXT}8mlgS=uLZ4Y;aR>bN4vA~1ZGw|c$!5=Ba zlD83Y3KTxU!yS@0734zGYlSb9 z_a<|31htKkvAN5A{?n&MFlW~2kCl`s0vj-Uq>b@BgZjI%QN4hdWvh_ z_x1c~|4TUbuU|wp4!t&zU*>;THju~Bfx16@86Kk^oV!8rUbsbsD$a%; zkJ@b){S*M}Bv(&S3QEvdJu(MB%ARgyXr|tJH+N9DP|P{8{!VqqNYaj?^+@yLU-w6S zi8fa+Eb-EY6e2T?!ij4-QAvC#`>v91Zf6{wTHB~TnRp6@=hc~WxvH!i$#%r5RZGVT zSWVR0TeK?N`W5e6B(y0PQGEr;e2WX!X2ZQFyP|-fa3Hjmt6?OLYJF%nPK@^!Rmr5B z6~p8`Dr6V>4mlUCQl*Bh9a{|MVHlQL6rT0wDQ^1rs-2lk@xK^PX$9O>y_NEkm=+^E zMP9D_UdD3`%~hwP7=k%48p0D}2r}~6Ig}r0DDsQF4C$@`=B*Cxxf)t1V}^5l!KabT z8pbGPb@xdmfV7xXjR1$=|D=9+W{QeRBOL-SXN40uc4|`=>h>jK%fum;U=R9_lU0H@7mPqoFcQ@V+W2r3oOkhi{&7Yx2)?bL8`EUDC#bx6=WQ^|fP$ zNo@C*GYZa(e6-|>s_&%ZZ>tC2+&1eq|J*i4K3c3{gOlG1d>ZLJJ+r?3X?8SYGe$Ea zh=l)B1AkUg)?W_dTDMZyNYF0=u&n^hX3Iq+fAf};aJRp&+It(`>QXM5j#)%YJt7o# z6bRD#At61qeM3_-8fn;AYDS(VO>e_6ZRDG{7VvsE!;+lcJpOt1cJ>rVK169-OvVC=r)0YQ3#YaS$=Jrqx=_BJ5s=+*!BHv$ zqN_WqceRuJPkbW^laO)MnT)3NU}(}dA&hLM>m z)52oQz@pk;O0!gwB61@`fC-o9!thF$9d4-*mI=8QER&AD?{M8`a7;9>L+Qw@8=^Hf z2r_ce5`gBHZ(^2+VS#m9igpBSm?lu4oU+wchREKqR78@sR*__+do`kJ|95IeJWQ50 zW$Ob}TQqtix;_%bWSR+od9*M=QQEtJva~6TmG?!9`9c;M73Hj1s>X094@DDpL?O{> zAyF&ph*w-MWwpgG<~l5z;0}@O0v#MiFZDtVJ69e9f(15T0BaQ+$j!NsZ&A5=1;}C{ zmty;stPRF#6Mtw0zwqA9x#285EA7e%u?2o&hC0#T&@=3XmJt^6Sj9yoGi?-Siymfp zLRR4Z@e^Nse(a0SQEdmAkMs^R?s`k?3{px#gmn^Y+rCcP0=3S@*-rxWL;@1^xV)lP zfCVkTrH_8K_{A54TV&)c^AELY0b>*8p0;u78+aU${# zWW78oH#l1dkiMYdrNf*I0J1G1H#yC7S?4=g%qS1t-xwg7%5pX;ze<*G991bYd<9Qm zT|~l3P`ng=_o;boll`+)0}xFBC)DJATlTa$*qP zB!drJO)W{?zcS(PAw+d`MP|m+%0dI8izTKRCqrx*#kWwoH-+>@^!&j|lv?4p%_1~G zPQtpcK5v|W>eWKdFW7~r=w%ft>5DmiA*+-q<+^uTyq2kVB=jnuC~Fglj7q!vk~lI~ zSWs1uob|GIlodku~A-!xf2Mj>%IX_%G`&feBX27ks%F88gLY9U*j4k7kJBPMEV zg=?Z(2i>*vhEOq1zX(Y13pi9aYjx5A)eFqkhGw2Eu2SV}tA4&rmpS)k%FUE7YK3wI z;Bsfg?H)I^O0$+L>;}kO5xx$jBG?U(;D|s)UF--_p*&N_lYiw*lkOw!hblSN(uD3VVwaIy${p2htrj}I< zhWI?(gD<>DcjTms=DXMdpVUw>61LV__AFfM7P8*CctxewPzSnH!pvjaWa{#49k<|m zn#K9t2gJWlA0Y?;cOrC5yyCYg>Elj{ag&)^XN_G4%Iy`T_8rKd#_eF_N~#y$PHDy; z&|r97i!3UcIJqS}&0ExlySG@nJ!^Y6?VBgO)|7|&_+?|Ye}M^8n8DJ2-ura!oX7al5LYEY`)o25w%fO z=N74NW_w?^ztKE2E*{YQzLY>{!$yIbDj-6?ma2jYqhUP5W|b7Bb{k>&F~&HbD8e6?x(aUp78Z# zU3%QZ`{c++&4p40Q8&dejoG$ZPG)%8alHq`Z>+(4v0&ZktEbp$MYjgyj~l_1+*q^; zCl}M`WzXKl(fB49eq-cQqa4eQpPD{4y|(m~LV7%SM?KOk)6o3_!aG7_e}=v-hTf8{ z6UR@rj=4GfA2l6r5gkY^>>T?&O`U1Ohr@bIjC5N_3d>vx zGwjwo%(vt&fg0BMIxRho3;RhpJT@9qoyKOiNg&pOvypY!$s$_vnInSRA}>GHabBJzncE_4=S*sAl0Uf}1_X z>_~iLPtZAgw1=_SrdH+b0+dN}wMx_7zej~YFqqyR=0DWW zivi*?>OQE?L%x9Y#Bce|!Mi)(K}(X8lG$}2O+-b~(z4_Vn2a4x3eBkExuBsGNk`l zZEe(*%3P#0r}7IqR(sJ+CSysMAJrtLwS)#A*P(bqQi*JhJY~vNSa0Z}HCy5OI>A6} z!*wHhMp)S*(g$=MpMBRgrEghh+lC*OhfR7pm7Ys3$f#RiCM%%38PG zqwtk*knW$x{)HNz=R%d%+3LGY9K_cOL&pGAW4G4GgXDb$k_H_EV{F?+6k?fIB3}YO z16iCdYWBjAfeWg0hMpVbrjm$-71*eeLOu;AKUKJ!5Zq%RBwt%d3V-3DSPt_TzQbe` zf4G=dD)JDjAKCXRoSLb@bCqfl2R8{0O769G7T}+wiK}H&gX=#T1LL4wm%sEqps*m}?8-@() zzHsgMCnpRX@QdTXPbmPA?!yWPtNC+zYnkAGtaX<+5Wm&e&QSPVQCoS+t4F4)ZEPz9 zriFp5R(Q)Roy*1E*UcTz-$hIu#O0NVldKERp%=U@S>|`mBBW_Z0{(5 z#3sz&6Q2Loq8hv&%=ou1lyJYg7D9$ zn~R)Q>&SnJ8-x4vG$YvY!0@B`jHAj00PZF2#qrJ>4v!vum3#US8#f-(9RDcb)hf_0 z3pY)(&bu7EwJe74bVOk)0a(=gd8%(;aa!ezb+VeZkoc_7IN!?67jhocx{FQ%NTCc} zx1e_s*R|SgR=Z|f#17u$m(zSp24~XF1tf6Z%{0k6m4@Tqa0QSLl%Mfl^1;g$SFOT; zh+AeI{mUtiplt*Z>#u32WTvQ8Xb%VFM_X*Q0_~Y>18GRi1!LjtmMnrJ*3c3A0P8>O z6Uc~VEJG&|+yLKL@Z?k!&QwZlI-QUX2p2rJP;VesBRd0s;f8znN7@rXc;m}7)BZTx z+&|TdtXLnAg;)kI<`M&;0oF4~R%;{rzHeAB@q@O+J7SFI3OQ$+n``7{w5Sjn7Z0ed zpidEY-*ZsdRcgRv!L+ek{Dwn>e<_BUhit=Jr6JOe2Zlm0aPb0BU z=83a|QDml8%p<6DE);oYt;*-zM|)~!&|SI&8D@$r?52$hhTcz@;5xyH$U0P~tLV{h zmx1?6g!oW-&}uijj@Q0Lr_fDT^>pl(?8VqaOew5YDx4{JEGAQx6)0;Itnr)t0YQ4r zha>NG!k|u0E(kl5i^-z=HA_WBzf5`x-7JLzKT-N}M!Ils{cNLq8HJ?OTf^TMC)!Q$mfV=X0!pB0;y1G1VKkG5%3 zbgaI!wrllt?7P@ZIM)ep)xZtLddlYZ1I{E4%vX@rvE6I62g{$GlH6hiuLi$nzUr7p zuH&L}VT!lPuvR=shI#4nAQ`rpNZVMl();~Kg|&xBTUg3wH|l%0ThG`78x8fj2fPa1 zA}rO%KG@UNC>Rmn<3vO-BQgl#D$m`0*gi+=*zh1rutM$$U@Uj8B)qjuZ!;0ZuDhzA zF^q)JYQ}-F%Pna?MA)E~+AQF2Ahn&VA_5ail4uiSS;VTpEUZXRyI&N1O?p?On&nPza0qs@nm@ z32h2fO()syw2aNK9zw5V4j)?CnM&QboLk%c=9SLiLf^1&jmsx=eh7J=G~JL4>aEls zrV<~rZJgwnI2bDnHE#-n&3xx#d!uKB@5m>F&l65Ane_plFdj=w@D+B3CX(^Mfs`U) zCZ|}=b({?xf?F7drIWvo=r8f6R60|ZvNIW(NcY#Ag$Qjdi$9J1&uX%LLWYT!`q&c4 z)YGv|fwp?$0XkH~SB>4BctDD&k5FQF&|Y|{=Y~gZU}9r=kczHeW`}8VnPDU$q_E&)rcn+xG=^ zv?V(l*2R6R3q3UZIe~jFz~x9QO=)-FG2lo2b+~W>-8Q3jvxa^~y*^YW6Ur5TZ`;-= zGKH(_gSO!-<$O)hUnuC%k5yQr?_tCWerfk}j*>u3LqNz-(JpvAtr;N&S)G){KxNk; z%qh@$c88{zJ&^+2X!6)yv?d&1Mo5}RD6oI(f@%sZO`2xZa>&eVbbIR)g{$pll*ciN zJ#yGILT42Z=S~=WoP2D0>7{Aq=8AlUa#7dZIQ>m>oHE&bZlcz?*co(I7CRHsRJ(hI zMfgL6373`8nh8JSgg5!%{Ro)3TDCf0%#kW#Xx7@0d;~f;|`Z)^Zk^<>H1^-0hI6odH!CY7-BK zCu(#+*#O^*3=moE3W&m8sKAEpUzFuEV{L4v^C%p5-~~f|2Hs;kn*u|(m}E#8 zdk1FI7;dc6-@>nQK*CJHn^HH-v<`U+k{Uo{@2sq0@o4ca{to^)3QrBvt+PT{QMf;A zB$Zr~`DQW0vTrV)WrQS@$(zewbv^F+fO`5tpsegS@mUVEpd;NOxVR(|(8Oj*2)CC@ z<1~36$4?uwDMZOUNq4MwGGTX(o``^sId>jCTcHc6o}KU;f+~*<$(g$oKv~7n;jV@f zS4*)+-g(2DrBOz{84gMj!df9jggYF6XuXw2$TGU!0+#eL4Kg=a3*BefknxQ58BrEX zGFghHpQqdJYd*sBU@h)f&b)tfr6T38ljF4L%xa{y^6nOCi2o90-#lRaGZIV~2$P2@ zl#Sd;b7<%`%>KM9XOlEozZwEZqa8K{zBI8G2ApA`=CG=Ye(aCaVEWVv!H?sPfur1b zy)Jq{P)(otaVi9z5c~+fVhA$lazy+ihKfAx(nl6O;b55Os?c03PPaBbmwxvLvoU56 zSqyn0skDyQd@v~vS`^22f1QTp+B3sC*)`3>JK%FR-lT^)95)@Gra|zDqrD%y7YsXj zEXK+jaQAh6n+Csa7XUwk!4ZZbw~y3OR{f*s0%wSJtlL=Hp|OA4Le` zo*DJjGh&aMqRD`9AYK@#*b|^yT4JSoI(D5Vh~0n~?_h$HXUYp2M?RX%<-FtWE<7~Kw^X5gx4VuItt;5)H*cS`hqBt_I|=6>e=^w8my71SCL&J9Yb_4vZNSu)7p(J`+l#;G9Z4+28S7kq}NGN z9f6^((jY!uC+5eVFG)+#vt(}H<=WpO4c5}ool2bM!oKvp;?96fL*m5sZ75v$-HhF< z5Q8-b2Wg!Q!P2%oM%*yj)n{0RzqHQZTcNgk7Q@E`mn8*45PRJL^LGk^L4UATS?L+Y z291Yw;6QS&%@ydNf!1H;vrw_6*67^XET91+2(-lIgjlT}D1nwfNy9C7#hg>Sp|qg> zqjmi(EXc79GW2Y5E>Z^&60_)tOWgJ53~d1hrm@V)%Z*gj)j!NdIJo(gNPdnX-Y*bmrvSY|A*of$<- z)K~OTnxWsfT6zW!JnZlGZw`RUZHBVfH~4K8Q+h=SEsX1MtX?(vf6Scr5WZC$3b&zm zu5^0+)y@F%iXqV20Yd9*xJ)38*gB^t3H3bhHYG2WAfw-@sfC{HU#lM;2_P;3zG|O9 zQDW6CR}I~Im$AFX7}U2OB!k3cQ;tCuL9(w%~c2dWIxCMTF7#!re@rFOsKuIA(pe}isfb* zfv#V=?^U-?96R;-Rr-$xs-F?WJ37Ep9vGIoP_r|4lDV(G_a1e@LJF5E^5k2*-0rTd zWti8$h&DtW$aVQfqdscLM1ZG_S~hpObr$JQa6v>4DJurZlAW)w4>md)8}^exV3T9v zX60hNPKMnX_@%VO@Fj=8)-0;@ix#(D`}CM`fuLX135B#UZTqv{YPRAxumlA# zBzsz@z%B~vMAK@kS&A>wn8LVZNtfXvJVu-_g`rlVClS^)iE`|8Z#V0Clz!UvPIDbb zn40X(BG4^aW?E5XTs@*$yH72LM@wzPG+u#L##+@1T)a2ob!x4?_uQPKaZwK$X7b?t z|J!@A7&(sXc5FwnH*usyi5=%`4H=P}XlA>od%Anb=-8dzrI_&8WJ!s#LQndr-feMq zdOSU|3MiANdN900{!*BOl4Ds;-*u z+3q>W?HzGp0?XZ*?y7gxt5;R;y?QSzW)R#h6uD@z=5TfiuQymsB4*ZmfD#1$zyTF1 z^PD=}SUt{DktK#W{fZw9@^S+lQgUN;1z%MrS;*O-CE5>)79OPNULM>&O>L46^8J28 z9Bz_bZ7?lh5!~Wx_sM+e1@!Dz$PN&Nl z8D*L!AdxI7mHPB9LV<_3M8`T(=n9IK!@Dbhvg|O@{Vab zcxohg`bnIt3o>dy6U#ZCAT@11zSHlEmRL-sFs)^HkT=Ck)Tv`oumb1thC9%s5J_j) zd%QnV{$e$jBy~~_&F$=}fvXtcWfWJI;l6FIcZTjye?Yn$k_7KVk^xH~|0DcsOQZkC z0_4BL$8+XY@*@8nKTFTNMmtG=h#PKc>CbS(Esf-Gy9UNu$OZzDIg97&>8d?#MBk2V zyd;kB%-KaI3JLBHE+g;88<8-s)MnS<;%yU^)=>-UtXQ0aLh^eo-hUf)NM$<;TN-lA zdHGT-6+i)h!o4uGMie;BF2@1a9PkZ?!MX?e)K9rSp8$6&Zt5Lm_>G7^qwB+DwFJeu za+SSLmMD|h`x}_6 z<-W9y-oEi@nQYe|r*Y=>sDCVP?APMxy14xF$a?wO@Fjvl8k&^<(n+N%anQI9^{QC@}&O|Kxejm?q z`sHNsmlJ};zn!^S;(uqL`9TI3c)P5gi#vyxMlq(2(%|r3k4!v`dUnpRej92Id7HI4 zu{3_851+>QuE#!~zpN$le!wS8=1tNGQ4O$1p&NoB*W4aw*~*Dsd%z1fSGs6)t&Moz zEp7)-NvSlloXnd%EOq3NjVvT{E#cQ2)!%EB68>6-gvC;W4G_v(CS;5(Q%}RKcbv*% zM}qZ)K71KgPu>ZX6lu3{u{`5O)~gW&6|DeaoSo}iL{ zo6*T6>La5Ijt3=yLrmb2SW|z>ml^u+zFP^t^feK+pmEMlu%PiaL$u@%!F|nyhf99! z6yD!u&0H<>@yrktdjvYRo>EBgk|tdL*_mR5RJgPITIFv+Sjg1Up1 z_H<_H`n1jU56_W&jxgJql_uNPttYHv)P`M#NuQRvhWV3-p_>z42=BNLO#ep|*=Plb zBAlWfPO74LU8*c-a=e%)`v!M+gLcQZNJDCZz9LoPW?=FW_watQhwO@=xJ9g_DEXMy zL1sPBtPa8h=ip8tEdnuNF*XQ@AB<4|*Do*Ll~T(LBE$G&T8!n1olJfg%>E zv+R{^!|I=A3gjbh@g{CD{#NlOe!US@KEjdy*j}>+!4;`M-&pG!E!*hyFYFZfR~UF$ zOmr8^hE3Jv@uwzmQGG=Ef-u)*sHKVBU06wiuFdQu-IVlZgBoiZ4MtMJzVicODxu~Y zJ`nH*dzlz$vg|C>cta?c8V!0IYvB~sDTAV3fbCNd=+{_$rU9Q$V{`r*Fc;^`8FI3F z+k$j!e9l~GW!1#t|pv6Z!OwM@E}cXWN~?1>XFq>#a%rgI&W zq#J~!Q@v&r>guwbRDHTq9}^6e(HPu0c@ORAoUw@%c3RFz<(V#H;lm?)0}0Lu=m_6D zcz8$i9lQqZL~cBC@fv(%ZeX0}j;3@wAd@>fO+MezB_A~~5`2|^$k2dcaWqw<`uO`1 zMDzBE-5vjS=IsHd@FyAXUp>m-$f8QvK~<7zBg-}X-2hF=<{W+ohT~C$=g*HCjpN6U z_3hiF07_pACJvSPUn;u^*qp+*PRR;`Cj)VOWZ;7{Mqp=R?Cra))baK}f1J@713l&X z95)&bnmitlAzje>yh^xoGE|b@Xi%rsGFW)i3S-gL8G-`HW8#onT3$TMYt)VduGQE?zHh9fMiaHxyBn-|g7mAgv(Z&z^80AhU2hP#jL`)Qnl2h5EG_yZug7==rFD&#fxlPyTY_GtJVQ<15%JZ~D7ljLUPoVTOZ_+x+KO6L4MWpSMV4jDu|LUWPJJu4Id$564q074S>!63ktf{N z1w5s3g{^`4HGPC8oNM7j@yS+>lO{lwHmFNB7sRIC^y&Mw@ITWSbgG8D*}a9m&~7h5 z(%N;{B$W3W_9jGf?>W$8I8p_uwO5-xs7r~Bv_2%NZ*>6^qGv2nGZL~C6*;wvVmeUK zMy{wfC>}|cj7l}1wfoz-4SS@Mjb;;6O{?T|j7@aW>s%;xjm|pimNt-K<8X=%s4z01 zYd#xDO{#AyaeY%7i|)7r`fLz=d%JCHZWLfkaw*!Dd@=f+`!6yJ3|WztO4Y15wq{f{ z1tC$dR;v|LhFz>EqkLA|i+eE(M$7%Q(3n)x5AKlk6x!mlJuSkfEzORj*`iUEK!fY1 zZ0d@r8m43+%P|~XbSn8sb2o2kX2*M*928Sk_*8J1RE`rnL>fzqSLhg3aUq@xNz<0# znj$(iLlF&G)(r!Tu_RhG#}>_+21;4WM}l+L7v9Cz82gZEp)si(C-rd#ZE;ba7Gcwt zW(!Gdq#-SP05e%O{ecjc9a!=!SY)W>N(#)Wt) zBz;==T6}~2dDs-378qOfp=_OtVyzN8!8y79k~L_hU9?N%!DJY>D2OB zFzoTTK`h<#eV&YAf{rX>DW}vufjQw6dN;l^Cr9h}jM)>6r>)~{U9~HkUehe3*Cewl zIdFcIMYB@1)S9ZO`3T?(xe4H!)p6V1lDsIY3ro_nw5-%B@=8?{m8FU*>ScdpzOMUBw;j-aWS4Ifw#{ecxc{qTl4wb63%83k!8+L9VF_l?AoFpjWj;S+7q)l82yjcal7$ z<2{w+A$WXR_+DR>ZP#%?j$c?ky|mVV|44uhgi4b5niuC+JsZ1(%T3R^06wkHt@7u=TMZ?`PrqTAiTJqmH`%Gd=d z9BO+uya&GiX7i8$5PEGJPWHk!IFg0BXL$y+@!1=sZd~x z0M+Yt+dTm63)megnA-x0ju#Hm2mT>UfwASew$MSPPOsI1Efk;z4Sb@#h4u!N=PS=r z($>z_p?dBb0K}|}u9UNjsW^64e6cv2R0VJXS9DFQ>6#(x#Ko^@x+pq&4Nfkalaq5G zcU7P-Ny_4)Dy`J&N_}aiBFRfji_2AY3aVfTDtD&}hIG8As$d8nx6k%9L2`1RA-)=6 zt=DdQovwg=!#>sqeu?gj}G?qFBom6>L;ZTd8O^s9d#bTgX6~X4J&0fslI?s1_?x+% zjIoOyjD&VCX8PPVHk$+I;k`#-LSg+eJp^Zw6PM7vr{%WvLeYZFYYECr`)(J)F^flv zB&A>Rkz&X5x_^JKuiCmP;+M<{ zsyQ{$w2|y6wNh!(=yY7vDb+WO);d~f;_ya*1LeRsU7ysN?FY4ntvx^?1#%$>QNEDD z+^`0roQ%}Z1)-BO!1nfn5BJU(#Loxei@8FifmFDLFtU2M0Qaibbgk{>OBQP5j|`D7 z1YvVe5Lu-fiNXDuAarwuiz9N|YulS9gl{vT_vI~EPZ>=YpQstYpAEw2bD^^CwYS$U zx=weMTGjrTt#4-x{{m$->M$(67=&IfSa8n?IRK@B{!$P=mkVg>h=CZnG^n$AK|S7b zywxT|D5gRExxApBgtfehPNviP^Fg?k3x}f#y9$?HU^fBRRD7`Bq|yE5ApB;Y7{E-1 ztxT_j(t!U$UQAyD`(4+49(B^7-XDY)av^!G+cRl#p){}$1mSi*V6iIUIqw%1kJmR4 z7~@lE|HZtvCPbgDMYrH-z6}@oX?*yly!dbi47Sv^Gg|B)%u5FPNTkvJ%R#uAiws0J zSu)kzujI8;I9KPAmqzecg3!)|U=w1^TP1oK5L6pmEx(!{o;E zTrPBiPmR&`wIKX@PB6NiZ3gAn^4d=K11zH`c?R*5SqC_ z+9Zp-U+O@F3FqW*=B4O}<3%i$tTy~$U0(v%kYC!2oK_|5(PGT~t-OYlAR%GLP>K43 z7{uSsOSKY+m1xex**$sxR>*53L%=Ek78C%@hXunt0Q{j`xm=~dvA2?+hKfPBo{K0G za@7*{+?OCG0Pe%GfjyAdW|e@{s63O{0V>b@b`2-`U=VimBU+DU6dq_Yp>_=O?*!q0 z@3Kwj2)QbJr0#9DVR#pOA9d>nxOlyFVNx4o`lVyI4n1a1{SdNwf`<>aKn#o!=l{dO zPYU12l>zlJalM0}x70hL@$f@$OxSTg#cup5;|85X|lq+x7x?X47^dMi} zWML@9E8{M;|($MfqBm#b5O^S8ix3M5Pml&#Nk-pMT0PowKG(L&2`m%xLT6Yh{>rLWZad7%=7ujT{rDHCMt7GHp67a&Gg}G5|ICNkt2oe?UT5GQX%do5zngd%s3sfZo)Yc9G$clj4O}${ z|7#D4hY0GHKwUk#Q$OUA45MC!1@Q}eNdB|+)$;=JGT}INUr2<@=gyEJ@&Ak=S`hx< zp7R6jMwA`gpPxG`hQ!`6R_Gubg}vs*GS25mnbB8NxpQMkG&ti%EeQWNCuUGLI}bA0 z<*oJIY#IA)85@oS;jMhwFe-FuVj;*pZ7^Dn=C;W=#3iJR&BZijL8`5QP7?eB1IE^0LPxOv)$a-==(L09m>G*!4cMOxl z9|Yk~?tOigbv2DGH-GracY^B%D+)mJC-T(V!S_ixSR3CaU|)VN_z`#_!O;LwV&G{g z+050zUU(pQk4887IAFWvckQNYvWH&^Zn)qvE0Heo4L}^T?{(N?xcqXUL((h5^)JM( z1woh+z83^vL>GhD>kkI+Y(=+O*lj}g=>Bj0W%$J1UPb$uF{!}*m|=fB9RBHG;1Vmp zxP-P)(`%y+t=0(UcoHM91o2Mu^qNH7fOy7o%X6Wa$ffx;d~E^Bi__@Jh#>eP`0M!f z!M`}=LE;UMYyt%b@?so"] + +nodes: + "/Users/o1298098/Project/flutter_movie/build/ios": {"is-mutated":true} + "/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"is-mutated":true} + "": {"is-command-timestamp":true} + +commands: + "": {"tool":"phony","inputs":["/Users/o1298098/Project/flutter_movie/build/ios","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks","",""],"outputs":[""]} + "": {"tool":"stale-file-removal","expectedOutputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"],"roots":["/tmp/Runner.dst","/Users/o1298098/Project/flutter_movie/build/ios","/Users/o1298098/Project/flutter_movie/build/ios"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangeAlternatePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-CodeSign": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-CopyAside": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-RegisterExecutionPolicyException": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-RegisterProduct": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-StripSymbols": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-Validate": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--CopySwiftPackageResourcesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--GeneratedFilesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--HeadermapTaskProducer": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--InfoPlistTaskProducer": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--ModuleMapTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--ProductPostprocessingTaskProducer": {"tool":"phony","inputs":["","","","","","","","","","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--ProductStructureTaskProducer": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--SanitizerTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--StubBinaryTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--SwiftFrameworkABICheckerTaskProducer": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--SwiftStandardLibrariesTaskProducer": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--TestTargetPostprocessingTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--TestTargetTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--VersionPlistTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--XCFrameworkTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--begin-compiling": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--copy-headers-completion": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--end": {"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist","","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc","","","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist","","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--entry": {"tool":"phony","inputs":["","","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--generated-headers": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--immediate": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--modules-ready": {"tool":"phony","inputs":["","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase0--cp--check-pods-manifest-lock": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase1-run-script": {"tool":"phony","inputs":["","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase2-compile-sources": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase4-copy-bundle-resources": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase5-copy-files": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase6-thin-binary": {"tool":"phony","inputs":["","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase7--cp--embed-pods-frameworks": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase8--cp--copy-pods-resources": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileAssetCatalog /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app /Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets": {"tool":"shell","description":"CompileAssetCatalog /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app /Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/actool","--output-format","human-readable-text","--notices","--warnings","--export-dependency-info","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_dependencies","--output-partial-info-plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","--app-icon","AppIcon","--compress-pngs","--enable-on-demand-resources","YES","--filter-for-device-model","iPhone11,8","--filter-for-device-os-version","14.0.1","--development-region","en","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--platform","iphoneos","--compile","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets"],"env":{},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_dependencies"],"deps-style":"dependency-info","signature":"e270f653cd41c676dceafdb9229c13e5"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o /Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o /Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.dia","-c","/Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.d"],"deps-style":"makefile","signature":"19ef5044cd69bd49c3e0e20a1991cc66"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o /Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o /Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.dia","-c","/Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.d"],"deps-style":"makefile","signature":"ee3b3057c2a5fb1b04ac3c1319869702"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Werror=deprecated-objc-isa-usage","-Werror=objc-root-class","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.dia","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.d"],"deps-style":"makefile","signature":"223eeb3712d2a2c3548b697fb87ccd6b"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o /Users/o1298098/Project/flutter_movie/ios/Runner/main.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o /Users/o1298098/Project/flutter_movie/ios/Runner/main.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/main.m","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.dia","-c","/Users/o1298098/Project/flutter_movie/ios/Runner/main.m","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.d"],"deps-style":"makefile","signature":"823354bb770b8565f8853be280496e31"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj","/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"83bfd45fced1a9c4b3c24cf545914243"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj","/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"a81480391647b25c03f77990177a2c1d"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist /Users/o1298098/Project/flutter_movie/ios/Flutter/AppFrameworkInfo.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist /Users/o1298098/Project/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","inputs":["/Users/o1298098/Project/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/GoogleService-Info.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/GoogleService-Info.plist","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/GoogleService-Info.plist","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopySwiftLibs /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner","","",""],"outputs":[""],"deps":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/SwiftStdLibToolInputDependencies.dep"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CreateBuildDirectory /Users/o1298098/Project/flutter_movie/build/ios": {"tool":"create-build-directory","description":"CreateBuildDirectory /Users/o1298098/Project/flutter_movie/build/ios","inputs":[],"outputs":["","/Users/o1298098/Project/flutter_movie/build/ios"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:Ld /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner normal": {"tool":"shell","description":"Ld /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner normal","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-target","arm64-apple-ios10.0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-L/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-L/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk","-L/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-filelist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-Xlinker","-rpath","-Xlinker","@loader_path/Frameworks","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-dead_strip","-Xlinker","-object_path_lto","-Xlinker","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_lto.o","-Xlinker","-export_dynamic","-Xlinker","-no_deduplicate","-fobjc-arc","-fobjc-link-runtime","-ObjC","-lc++","-lsqlite3","-lz","-framework","AVFoundation","-framework","Accelerate","-framework","AppAuth","-framework","AudioToolbox","-framework","Braintree","-framework","BraintreeDropIn","-framework","CFNetwork","-framework","CardinalMobile","-framework","CoreGraphics","-framework","CoreImage","-framework","CoreLocation","-framework","CoreMedia","-framework","CoreTelephony","-framework","CoreText","-framework","CoreVideo","-framework","FBLPromises","-framework","FIRAnalyticsConnector","-framework","FMDB","-framework","FirebaseAnalytics","-framework","FirebaseAuth","-framework","FirebaseCore","-framework","FirebaseCoreDiagnostics","-framework","FirebaseFirestore","-framework","FirebaseInstallations","-framework","FirebaseInstanceID","-framework","FirebaseMLCommon","-framework","FirebaseMLVision","-framework","FirebaseMLVisionTextModel","-framework","FirebaseMessaging","-framework","FirebaseStorage","-framework","Flutter","-framework","Foundation","-framework","GTMAppAuth","-framework","GTMSessionFetcher","-framework","GoogleAPIClientForREST","-framework","GoogleAppMeasurement","-framework","GoogleDataTransport","-framework","GoogleDataTransportCCTSupport","-framework","GoogleMobileAds","-framework","GoogleSignIn","-framework","GoogleToolboxForMac","-framework","GoogleUtilities","-framework","LocalAuthentication","-framework","MediaPlayer","-framework","MessageUI","-framework","MobileCoreServices","-framework","Protobuf","-framework","QuartzCore","-framework","Reachability","-framework","SafariServices","-framework","Security","-framework","StoreKit","-framework","SystemConfiguration","-framework","UIKit","-framework","absl","-framework","camera","-framework","cloud_firestore","-framework","connectivity","-framework","firebase_admob","-framework","firebase_analytics","-framework","firebase_auth","-framework","firebase_core","-framework","firebase_messaging","-framework","firebase_ml_vision","-framework","firebase_storage","-framework","flutter_braintree","-framework","flutter_downloader","-framework","flutter_inappwebview","-framework","flutter_local_notifications","-framework","flutter_mdns_plugin","-framework","google_sign_in","-framework","grpc","-framework","grpcpp","-framework","image_picker","-framework","leveldb","-framework","nanopb","-framework","openssl_grpc","-framework","package_info","-framework","path_provider","-framework","permission_handler","-framework","share_extend","-framework","shared_preferences","-framework","sqflite","-framework","url_launcher","-framework","video_player","-framework","wakelock","-weak_framework","AdSupport","-weak_framework","AuthenticationServices","-weak_framework","Contacts","-weak_framework","JavaScriptCore","-weak_framework","SafariServices","-weak_framework","UserNotifications","-weak_framework","WebKit","-framework","Flutter","-lsqlite3","-framework","Pods_Runner","-Xlinker","-dependency_info","-Xlinker","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_dependency_info.dat","-o","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner"],"env":{},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_dependency_info.dat"],"deps-style":"dependency-info","signature":"345744978baf475ad0ecc39b42b68f8f"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:LinkStoryboards": {"tool":"shell","description":"LinkStoryboards","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--link","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"29eb9577820ef4a275529cccbe6a7761"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"mkdir","description":"MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks": {"tool":"mkdir","description":"MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks",""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Run Script /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"shell","description":"PhaseScriptExecution Run Script /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"f4389fd2c66e58f6dd2af8aceda4754b"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Thin Binary /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"shell","description":"PhaseScriptExecution Thin Binary /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"edf5e05e501c54cea3372bac3d8b52aa"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["/Users/o1298098/Project/flutter_movie/ios/Podfile.lock/","/Users/o1298098/Project/flutter_movie/ios/Pods/Manifest.lock/","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt"],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/ios/Podfile.lock","SCRIPT_INPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/ios/Pods/Manifest.lock","SCRIPT_INPUT_FILE_COUNT":"2","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","SCRIPT_OUTPUT_FILE_COUNT":"1","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"9d7b088864115d4bc79f9edb94f116f8"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Copy Pods Resources /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Copy Pods Resources /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMLVisionTextModel/GoogleMVTextDetectorResources.bundle/","/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle"],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh","SCRIPT_INPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMLVisionTextModel/GoogleMVTextDetectorResources.bundle","SCRIPT_INPUT_FILE_2":"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle","SCRIPT_INPUT_FILE_COUNT":"3","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","SCRIPT_OUTPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","SCRIPT_OUTPUT_FILE_COUNT":"2","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"ffb597e29feea9ae92218e169cbd11b9"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Embed Pods Frameworks /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Embed Pods Frameworks /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/","/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks/CardinalMobile.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/","/Users/o1298098/Project/flutter_movie/ios/Flutter/Flutter.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework"],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh","SCRIPT_INPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework","SCRIPT_INPUT_FILE_10":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework","SCRIPT_INPUT_FILE_11":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework","SCRIPT_INPUT_FILE_12":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework","SCRIPT_INPUT_FILE_13":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework","SCRIPT_INPUT_FILE_14":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework","SCRIPT_INPUT_FILE_15":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework","SCRIPT_INPUT_FILE_16":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework","SCRIPT_INPUT_FILE_17":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework","SCRIPT_INPUT_FILE_18":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework","SCRIPT_INPUT_FILE_19":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework","SCRIPT_INPUT_FILE_2":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework","SCRIPT_INPUT_FILE_20":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework","SCRIPT_INPUT_FILE_21":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework","SCRIPT_INPUT_FILE_22":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework","SCRIPT_INPUT_FILE_23":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework","SCRIPT_INPUT_FILE_24":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework","SCRIPT_INPUT_FILE_25":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework","SCRIPT_INPUT_FILE_26":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework","SCRIPT_INPUT_FILE_27":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework","SCRIPT_INPUT_FILE_28":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework","SCRIPT_INPUT_FILE_29":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework","SCRIPT_INPUT_FILE_3":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework","SCRIPT_INPUT_FILE_30":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework","SCRIPT_INPUT_FILE_31":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework","SCRIPT_INPUT_FILE_32":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework","SCRIPT_INPUT_FILE_33":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework","SCRIPT_INPUT_FILE_34":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework","SCRIPT_INPUT_FILE_35":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework","SCRIPT_INPUT_FILE_36":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework","SCRIPT_INPUT_FILE_4":"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks/CardinalMobile.framework","SCRIPT_INPUT_FILE_5":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework","SCRIPT_INPUT_FILE_6":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework","SCRIPT_INPUT_FILE_7":"/Users/o1298098/Project/flutter_movie/ios/Flutter/Flutter.framework","SCRIPT_INPUT_FILE_8":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework","SCRIPT_INPUT_FILE_9":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework","SCRIPT_INPUT_FILE_COUNT":"37","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","SCRIPT_OUTPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","SCRIPT_OUTPUT_FILE_10":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","SCRIPT_OUTPUT_FILE_11":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","SCRIPT_OUTPUT_FILE_12":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","SCRIPT_OUTPUT_FILE_13":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","SCRIPT_OUTPUT_FILE_14":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","SCRIPT_OUTPUT_FILE_15":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","SCRIPT_OUTPUT_FILE_16":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","SCRIPT_OUTPUT_FILE_17":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","SCRIPT_OUTPUT_FILE_18":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","SCRIPT_OUTPUT_FILE_19":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","SCRIPT_OUTPUT_FILE_2":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","SCRIPT_OUTPUT_FILE_20":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","SCRIPT_OUTPUT_FILE_21":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","SCRIPT_OUTPUT_FILE_22":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","SCRIPT_OUTPUT_FILE_23":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","SCRIPT_OUTPUT_FILE_24":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","SCRIPT_OUTPUT_FILE_25":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","SCRIPT_OUTPUT_FILE_26":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","SCRIPT_OUTPUT_FILE_27":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","SCRIPT_OUTPUT_FILE_28":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","SCRIPT_OUTPUT_FILE_29":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","SCRIPT_OUTPUT_FILE_3":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","SCRIPT_OUTPUT_FILE_30":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","SCRIPT_OUTPUT_FILE_31":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","SCRIPT_OUTPUT_FILE_32":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","SCRIPT_OUTPUT_FILE_33":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","SCRIPT_OUTPUT_FILE_34":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","SCRIPT_OUTPUT_FILE_35":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","SCRIPT_OUTPUT_FILE_4":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","SCRIPT_OUTPUT_FILE_5":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","SCRIPT_OUTPUT_FILE_6":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","SCRIPT_OUTPUT_FILE_7":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","SCRIPT_OUTPUT_FILE_8":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","SCRIPT_OUTPUT_FILE_9":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","SCRIPT_OUTPUT_FILE_COUNT":"36","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"5769a715b55af1c357474f29c0458727"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessInfoPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist": {"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:RegisterExecutionPolicyException /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""],"outputs":[""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:Touch /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"shell","description":"Touch /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app"],"env":{},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","signature":"89ee2dac165138d327ece2e3b1182a76"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:Validate /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"validate-product","description":"Validate /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["","",""],"outputs":[""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"]} + diff --git a/ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-desc.xcbuild b/ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-desc.xcbuild new file mode 100644 index 0000000000000000000000000000000000000000..87ac3f83eed30fb9ea669f58229a29efa3417479 GIT binary patch literal 673263 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 H^Tq!M@%~m9 literal 0 HcmV?d00001 diff --git a/ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-manifest.xcbuild b/ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-manifest.xcbuild new file mode 100644 index 00000000..11e7db55 --- /dev/null +++ b/ios/build/XCBuildData/9d49b704e802e3dbbc38b7d9cfe73ef4-manifest.xcbuild @@ -0,0 +1,93 @@ +client: + name: basic + version: 0 + file-system: default + +targets: + "": [""] + +nodes: + "/Users/o1298098/Project/flutter_movie/build/ios": {"is-mutated":true} + "/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"is-mutated":true} + "": {"is-command-timestamp":true} + +commands: + "": {"tool":"phony","inputs":["/Users/o1298098/Project/flutter_movie/build/ios","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks","",""],"outputs":[""]} + "": {"tool":"stale-file-removal","expectedOutputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"],"roots":["/tmp/Runner.dst","/Users/o1298098/Project/flutter_movie/build/ios","/Users/o1298098/Project/flutter_movie/build/ios"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangeAlternatePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-CodeSign": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-CopyAside": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-RegisterExecutionPolicyException": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-RegisterProduct": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-StripSymbols": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--Barrier-Validate": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--CopySwiftPackageResourcesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--GeneratedFilesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--HeadermapTaskProducer": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--InfoPlistTaskProducer": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--ModuleMapTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--ProductPostprocessingTaskProducer": {"tool":"phony","inputs":["","","","","","","","","","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--ProductStructureTaskProducer": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--SanitizerTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--StubBinaryTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--SwiftFrameworkABICheckerTaskProducer": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--SwiftStandardLibrariesTaskProducer": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--TestTargetPostprocessingTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--TestTargetTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--VersionPlistTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--XCFrameworkTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--begin-compiling": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--copy-headers-completion": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--end": {"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist","","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc","","","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist","","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--entry": {"tool":"phony","inputs":["","","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--generated-headers": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--immediate": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--modules-ready": {"tool":"phony","inputs":["","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase0--cp--check-pods-manifest-lock": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase1-run-script": {"tool":"phony","inputs":["","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase2-compile-sources": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase4-copy-bundle-resources": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase5-copy-files": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase6-thin-binary": {"tool":"phony","inputs":["","","","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase7--cp--embed-pods-frameworks": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"outputs":[""]} + "Gate target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49--phase8--cp--copy-pods-resources": {"tool":"phony","inputs":["","","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileAssetCatalog /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app /Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets": {"tool":"shell","description":"CompileAssetCatalog /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app /Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Assets.car"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/actool","--output-format","human-readable-text","--notices","--warnings","--export-dependency-info","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_dependencies","--output-partial-info-plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","--app-icon","AppIcon","--compress-pngs","--enable-on-demand-resources","YES","--filter-for-device-model","iPhone11,8","--filter-for-device-os-version","14.0.1","--development-region","en","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--platform","iphoneos","--compile","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/ios/Runner/Assets.xcassets"],"env":{},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_dependencies"],"deps-style":"dependency-info","signature":"e270f653cd41c676dceafdb9229c13e5"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o /Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o /Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.dia","-c","/Users/o1298098/Project/flutter_movie/ios/Runner/AppDelegate.m","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.d"],"deps-style":"makefile","signature":"19ef5044cd69bd49c3e0e20a1991cc66"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o /Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o /Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.dia","-c","/Users/o1298098/Project/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.d"],"deps-style":"makefile","signature":"ee3b3057c2a5fb1b04ac3c1319869702"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Werror=deprecated-objc-isa-usage","-Werror=objc-root-class","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.dia","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.d"],"deps-style":"makefile","signature":"223eeb3712d2a2c3548b697fb87ccd6b"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o /Users/o1298098/Project/flutter_movie/ios/Runner/main.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o /Users/o1298098/Project/flutter_movie/ios/Runner/main.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/main.m","","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","arm64-apple-ios10.0","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/o1298098/Library/Developer/Xcode/DerivedData/Runner-dtsldiqgqiggpicsjopkpwhhprvj/Index/DataStore","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers","-I/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources-normal/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/arm64","-I/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.d","--serialize-diagnostics","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.dia","-c","/Users/o1298098/Project/flutter_movie/ios/Runner/main.m","-o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.d"],"deps-style":"makefile","signature":"823354bb770b8565f8853be280496e31"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj","/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"83bfd45fced1a9c4b3c24cf545914243"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj","/Users/o1298098/Project/flutter_movie/ios/Runner/Base.lproj/Main.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"a81480391647b25c03f77990177a2c1d"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist /Users/o1298098/Project/flutter_movie/ios/Flutter/AppFrameworkInfo.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist /Users/o1298098/Project/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","inputs":["/Users/o1298098/Project/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/AppFrameworkInfo.plist"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/GoogleService-Info.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/GoogleService-Info.plist","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/GoogleService-Info.plist","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleService-Info.plist"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopySwiftLibs /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner","","",""],"outputs":[""],"deps":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/SwiftStdLibToolInputDependencies.dep"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:CreateBuildDirectory /Users/o1298098/Project/flutter_movie/build/ios": {"tool":"create-build-directory","description":"CreateBuildDirectory /Users/o1298098/Project/flutter_movie/build/ios","inputs":[],"outputs":["","/Users/o1298098/Project/flutter_movie/build/ios"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:Ld /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner normal": {"tool":"shell","description":"Ld /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner normal","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_vers.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/AppDelegate.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/main.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/GeneratedPluginRegistrant.o","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-target","arm64-apple-ios10.0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","-L/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-L/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk","-L/Users/o1298098/Project/flutter_movie/ios/Flutter","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player","-F/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock","-F/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/o1298098/Project/flutter_movie/ios/Flutter","-filelist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-Xlinker","-rpath","-Xlinker","@loader_path/Frameworks","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-dead_strip","-Xlinker","-object_path_lto","-Xlinker","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_lto.o","-Xlinker","-export_dynamic","-Xlinker","-no_deduplicate","-fobjc-arc","-fobjc-link-runtime","-ObjC","-lc++","-lsqlite3","-lz","-framework","AVFoundation","-framework","Accelerate","-framework","AppAuth","-framework","AudioToolbox","-framework","Braintree","-framework","BraintreeDropIn","-framework","CFNetwork","-framework","CardinalMobile","-framework","CoreGraphics","-framework","CoreImage","-framework","CoreLocation","-framework","CoreMedia","-framework","CoreTelephony","-framework","CoreText","-framework","CoreVideo","-framework","FBLPromises","-framework","FIRAnalyticsConnector","-framework","FMDB","-framework","FirebaseAnalytics","-framework","FirebaseAuth","-framework","FirebaseCore","-framework","FirebaseCoreDiagnostics","-framework","FirebaseFirestore","-framework","FirebaseInstallations","-framework","FirebaseInstanceID","-framework","FirebaseMLCommon","-framework","FirebaseMLVision","-framework","FirebaseMLVisionTextModel","-framework","FirebaseMessaging","-framework","FirebaseStorage","-framework","Flutter","-framework","Foundation","-framework","GTMAppAuth","-framework","GTMSessionFetcher","-framework","GoogleAPIClientForREST","-framework","GoogleAppMeasurement","-framework","GoogleDataTransport","-framework","GoogleDataTransportCCTSupport","-framework","GoogleMobileAds","-framework","GoogleSignIn","-framework","GoogleToolboxForMac","-framework","GoogleUtilities","-framework","LocalAuthentication","-framework","MediaPlayer","-framework","MessageUI","-framework","MobileCoreServices","-framework","Protobuf","-framework","QuartzCore","-framework","Reachability","-framework","SafariServices","-framework","Security","-framework","StoreKit","-framework","SystemConfiguration","-framework","UIKit","-framework","absl","-framework","camera","-framework","cloud_firestore","-framework","connectivity","-framework","firebase_admob","-framework","firebase_analytics","-framework","firebase_auth","-framework","firebase_core","-framework","firebase_messaging","-framework","firebase_ml_vision","-framework","firebase_storage","-framework","flutter_braintree","-framework","flutter_downloader","-framework","flutter_inappwebview","-framework","flutter_local_notifications","-framework","flutter_mdns_plugin","-framework","google_sign_in","-framework","grpc","-framework","grpcpp","-framework","image_picker","-framework","leveldb","-framework","nanopb","-framework","openssl_grpc","-framework","package_info","-framework","path_provider","-framework","permission_handler","-framework","share_extend","-framework","shared_preferences","-framework","sqflite","-framework","url_launcher","-framework","video_player","-framework","wakelock","-weak_framework","AdSupport","-weak_framework","AuthenticationServices","-weak_framework","Contacts","-weak_framework","JavaScriptCore","-weak_framework","SafariServices","-weak_framework","UserNotifications","-weak_framework","WebKit","-framework","Flutter","-lsqlite3","-framework","Pods_Runner","-Xlinker","-dependency_info","-Xlinker","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_dependency_info.dat","-o","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Runner"],"env":{},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","deps":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner_dependency_info.dat"],"deps-style":"dependency-info","signature":"345744978baf475ad0ecc39b42b68f8f"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:LinkStoryboards": {"tool":"shell","description":"LinkStoryboards","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Base.lproj/Main.storyboardc"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--link","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main.storyboardc"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"29eb9577820ef4a275529cccbe6a7761"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"mkdir","description":"MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks": {"tool":"mkdir","description":"MkDir /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks",""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Run Script /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"shell","description":"PhaseScriptExecution Run Script /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"f4389fd2c66e58f6dd2af8aceda4754b"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Thin Binary /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"shell","description":"PhaseScriptExecution Thin Binary /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"edf5e05e501c54cea3372bac3d8b52aa"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["/Users/o1298098/Project/flutter_movie/ios/Podfile.lock/","/Users/o1298098/Project/flutter_movie/ios/Pods/Manifest.lock/","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt"],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/ios/Podfile.lock","SCRIPT_INPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/ios/Pods/Manifest.lock","SCRIPT_INPUT_FILE_COUNT":"2","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","SCRIPT_OUTPUT_FILE_COUNT":"1","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"9d7b088864115d4bc79f9edb94f116f8"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Copy Pods Resources /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Copy Pods Resources /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMLVisionTextModel/GoogleMVTextDetectorResources.bundle/","/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle"],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh","SCRIPT_INPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMLVisionTextModel/GoogleMVTextDetectorResources.bundle","SCRIPT_INPUT_FILE_2":"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle","SCRIPT_INPUT_FILE_COUNT":"3","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleMVTextDetectorResources.bundle","SCRIPT_OUTPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/GoogleSignIn.bundle","SCRIPT_OUTPUT_FILE_COUNT":"2","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"ffb597e29feea9ae92218e169cbd11b9"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Embed Pods Frameworks /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Embed Pods Frameworks /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/","/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks/CardinalMobile.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/","/Users/o1298098/Project/flutter_movie/ios/Flutter/Flutter.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework"],"args":["/bin/sh","-c","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"NO","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"o1298098","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"arm64","ARCHS_STANDARD":"armv7 arm64","ARCHS_STANDARD_32_64_BIT":"armv7 arm64","ARCHS_STANDARD_32_BIT":"armv7","ARCHS_STANDARD_64_BIT":"arm64","ARCHS_STANDARD_INCLUDING_64_BIT":"armv7 arm64","ARCHS_UNIVERSAL_IPHONE_OS":"armv7 arm64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_FILTER_FOR_DEVICE_MODEL":"iPhone11,8","ASSETCATALOG_FILTER_FOR_DEVICE_OS_VERSION":"14.0.1","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CCHROOT":"/var/folders/jm/sx5d0cc12jb4npbd86_w0b580000gn/C/com.apple.DeveloperTools/12.0.1-12A7300/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneOSCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/o1298098/Project/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","CONFIGURATION_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_SIMULATOR_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","CORRESPONDING_SIMULATOR_PLATFORM_NAME":"iphonesimulator","CORRESPONDING_SIMULATOR_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.0.sdk","CORRESPONDING_SIMULATOR_SDK_NAME":"iphonesimulator14.0","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DART_DEFINES":"flutter.inspector.structuredErrors%3Dtrue","DART_OBFUSCATION":"false","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"miphoneos-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-miphoneos-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4 13.5 13.6 14.0","DERIVED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources","DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER":"NO","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"D2A229X9G2","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","EFFECTIVE_PLATFORM_NAME":"-iphoneos","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.mobileprovision","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_ALLOWED":"YES","ENTITLEMENTS_DESTINATION":"Signature","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/o1298098/Project/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.1","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/o1298098/Project/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/o1298098/Project/flutter","FLUTTER_TARGET":"/Users/o1298098/Project/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/../Flutter\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLCommon/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVision/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/FirebaseMLVisionTextModel/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/o1298098/Project/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_THUMB_SUPPORT":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATED_MODULEMAP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/GeneratedModuleMaps-iphoneos","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/include \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_admob/firebase_admob.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_auth/firebase_auth.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_core/firebase_core.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_ml_vision/firebase_ml_vision.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/firebase_storage/firebase_storage.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/google_sign_in/google_sign_in.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/permission_handler/permission_handler.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework/Headers\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/o1298098/Project/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/o1298098/Project/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/o1298098","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"o1298098","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos \"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/o1298098/Project/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/o1298098/Project/flutter_movie/ios","LOCSYMROOT":"/Users/o1298098/Project/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G2021","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/o1298098/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"armv7","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","OBJROOT":"/Users/o1298098/Project/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"Accelerate\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreImage\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMLCommon\" -framework \"FirebaseMLVision\" -framework \"FirebaseMLVisionTextModel\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAPIClientForREST\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleToolboxForMac\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"Protobuf\" -framework \"QuartzCore\" -framework \"Reachability\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"camera\" -framework \"cloud_firestore\" -framework \"connectivity\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_ml_vision\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_local_notifications\" -framework \"flutter_mdns_plugin\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_CONFIG":".packages","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","PLATFORM_DISPLAY_NAME":"iOS","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphoneos","PLATFORM_PREFERRED_ARCH":"arm64","PLATFORM_PRODUCT_BUILD_VERSION":"18A390","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","PODS_PODFILE_DIR_PATH":"/Users/o1298098/Project/flutter_movie/ios/.","PODS_ROOT":"/Users/o1298098/Project/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/o1298098/Project/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/o1298098/Project/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","PROVISIONING_PROFILE_REQUIRED":"YES","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","RESOURCE_RULES_REQUIRED":"YES","REZ_COLLECTOR_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh","SCRIPT_INPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/AppAuth/AppAuth.framework","SCRIPT_INPUT_FILE_10":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleAPIClientForREST/GoogleAPIClientForREST.framework","SCRIPT_INPUT_FILE_11":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleToolboxForMac/GoogleToolboxForMac.framework","SCRIPT_INPUT_FILE_12":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GoogleUtilities/GoogleUtilities.framework","SCRIPT_INPUT_FILE_13":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/PromisesObjC/FBLPromises.framework","SCRIPT_INPUT_FILE_14":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Protobuf/Protobuf.framework","SCRIPT_INPUT_FILE_15":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Reachability/Reachability.framework","SCRIPT_INPUT_FILE_16":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/abseil/absl.framework","SCRIPT_INPUT_FILE_17":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/camera/camera.framework","SCRIPT_INPUT_FILE_18":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/connectivity/connectivity.framework","SCRIPT_INPUT_FILE_19":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_braintree/flutter_braintree.framework","SCRIPT_INPUT_FILE_2":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BoringSSL-GRPC/openssl_grpc.framework","SCRIPT_INPUT_FILE_20":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_downloader/flutter_downloader.framework","SCRIPT_INPUT_FILE_21":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_inappwebview/flutter_inappwebview.framework","SCRIPT_INPUT_FILE_22":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_local_notifications/flutter_local_notifications.framework","SCRIPT_INPUT_FILE_23":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/flutter_mdns_plugin/flutter_mdns_plugin.framework","SCRIPT_INPUT_FILE_24":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-C++/grpcpp.framework","SCRIPT_INPUT_FILE_25":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/gRPC-Core/grpc.framework","SCRIPT_INPUT_FILE_26":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/image_picker/image_picker.framework","SCRIPT_INPUT_FILE_27":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/leveldb-library/leveldb.framework","SCRIPT_INPUT_FILE_28":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/nanopb/nanopb.framework","SCRIPT_INPUT_FILE_29":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/package_info/package_info.framework","SCRIPT_INPUT_FILE_3":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Braintree/Braintree.framework","SCRIPT_INPUT_FILE_30":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/path_provider/path_provider.framework","SCRIPT_INPUT_FILE_31":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/share_extend/share_extend.framework","SCRIPT_INPUT_FILE_32":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/shared_preferences/shared_preferences.framework","SCRIPT_INPUT_FILE_33":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/sqflite/sqflite.framework","SCRIPT_INPUT_FILE_34":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/url_launcher/url_launcher.framework","SCRIPT_INPUT_FILE_35":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/video_player/video_player.framework","SCRIPT_INPUT_FILE_36":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/wakelock/wakelock.framework","SCRIPT_INPUT_FILE_4":"/Users/o1298098/Project/flutter_movie/ios/Pods/Braintree/Frameworks/CardinalMobile.framework","SCRIPT_INPUT_FILE_5":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/BraintreeDropIn/BraintreeDropIn.framework","SCRIPT_INPUT_FILE_6":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/FMDB/FMDB.framework","SCRIPT_INPUT_FILE_7":"/Users/o1298098/Project/flutter_movie/ios/Flutter/Flutter.framework","SCRIPT_INPUT_FILE_8":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMAppAuth/GTMAppAuth.framework","SCRIPT_INPUT_FILE_9":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/GTMSessionFetcher/GTMSessionFetcher.framework","SCRIPT_INPUT_FILE_COUNT":"37","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/AppAuth.framework","SCRIPT_OUTPUT_FILE_1":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/openssl_grpc.framework","SCRIPT_OUTPUT_FILE_10":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleToolboxForMac.framework","SCRIPT_OUTPUT_FILE_11":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleUtilities.framework","SCRIPT_OUTPUT_FILE_12":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FBLPromises.framework","SCRIPT_OUTPUT_FILE_13":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Protobuf.framework","SCRIPT_OUTPUT_FILE_14":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Reachability.framework","SCRIPT_OUTPUT_FILE_15":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/absl.framework","SCRIPT_OUTPUT_FILE_16":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/camera.framework","SCRIPT_OUTPUT_FILE_17":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/connectivity.framework","SCRIPT_OUTPUT_FILE_18":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_braintree.framework","SCRIPT_OUTPUT_FILE_19":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_downloader.framework","SCRIPT_OUTPUT_FILE_2":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Braintree.framework","SCRIPT_OUTPUT_FILE_20":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_inappwebview.framework","SCRIPT_OUTPUT_FILE_21":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_local_notifications.framework","SCRIPT_OUTPUT_FILE_22":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/flutter_mdns_plugin.framework","SCRIPT_OUTPUT_FILE_23":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpcpp.framework","SCRIPT_OUTPUT_FILE_24":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/grpc.framework","SCRIPT_OUTPUT_FILE_25":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/image_picker.framework","SCRIPT_OUTPUT_FILE_26":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/leveldb.framework","SCRIPT_OUTPUT_FILE_27":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/nanopb.framework","SCRIPT_OUTPUT_FILE_28":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/package_info.framework","SCRIPT_OUTPUT_FILE_29":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/path_provider.framework","SCRIPT_OUTPUT_FILE_3":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/CardinalMobile.framework","SCRIPT_OUTPUT_FILE_30":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/share_extend.framework","SCRIPT_OUTPUT_FILE_31":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/shared_preferences.framework","SCRIPT_OUTPUT_FILE_32":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/sqflite.framework","SCRIPT_OUTPUT_FILE_33":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/url_launcher.framework","SCRIPT_OUTPUT_FILE_34":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/video_player.framework","SCRIPT_OUTPUT_FILE_35":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/wakelock.framework","SCRIPT_OUTPUT_FILE_4":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/BraintreeDropIn.framework","SCRIPT_OUTPUT_FILE_5":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/FMDB.framework","SCRIPT_OUTPUT_FILE_6":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/Flutter.framework","SCRIPT_OUTPUT_FILE_7":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMAppAuth.framework","SCRIPT_OUTPUT_FILE_8":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GTMSessionFetcher.framework","SCRIPT_OUTPUT_FILE_9":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Frameworks/GoogleAPIClientForREST.framework","SCRIPT_OUTPUT_FILE_COUNT":"36","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_DIR_iphoneos14_0":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk","SDK_NAME":"iphoneos14.0","SDK_NAMES":"iphoneos14.0","SDK_PRODUCT_BUILD_VERSION":"18A390","SDK_VERSION":"14.0","SDK_VERSION_ACTUAL":"140000","SDK_VERSION_MAJOR":"140000","SDK_VERSION_MINOR":"000","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/o1298098/Project/flutter_movie/ios","SRCROOT":"/Users/o1298098/Project/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"YES","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_MACCATALYST":"NO","SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD":"YES","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_arm64":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/o1298098/Project/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos","TARGET_DEVICE_IDENTIFIER":"00008020-000359220EE9002E","TARGET_DEVICE_MODEL":"iPhone11,8","TARGET_DEVICE_OS_VERSION":"14.0.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILES_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_FILE_DIR":"/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build","TEMP_ROOT":"/Users/o1298098/Project/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TREE_SHAKE_ICONS":"false","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"o1298098","USER_APPS_DIR":"/Users/o1298098/Applications","USER_LIBRARY_DIR":"/Users/o1298098/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"arm64 arm64e armv7 armv7s","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"o1298098","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"12A7300","XCODE_VERSION_ACTUAL":"1201","XCODE_VERSION_MAJOR":"1200","XCODE_VERSION_MINOR":"1200","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/o1298098/Project/flutter_movie/ios","control-enabled":false,"signature":"5769a715b55af1c357474f29c0458727"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessInfoPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist": {"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist /Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","inputs":["/Users/o1298098/Project/flutter_movie/ios/Runner/Info.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/assetcatalog_generated_info.plist","",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app/Info.plist"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:RegisterExecutionPolicyException /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""],"outputs":[""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:Touch /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"shell","description":"Touch /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app"],"env":{},"working-directory":"/Users/o1298098/Project/flutter_movie/ios","signature":"89ee2dac165138d327ece2e3b1182a76"} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:Validate /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app": {"tool":"validate-product","description":"Validate /Users/o1298098/Project/flutter_movie/build/ios/Debug-iphoneos/Runner.app","inputs":["","",""],"outputs":[""]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/DerivedSources/Runner_vers.c"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Objects-normal/arm64/Runner.LinkFileList"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-non-framework-target-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-all-target-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-generated-files.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-own-target-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner-project-headers.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Runner.hmap"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-9740EEB61CF901F6004384FC.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"]} + "target-Runner-816660443b3bef565d30e61ec44354b788a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml","inputs":["",""],"outputs":["/Users/o1298098/Project/flutter_movie/build/ios/Runner.build/Debug-iphoneos/Runner.build/all-product-headers.yaml"]} + diff --git a/ios/build/XCBuildData/BuildDescriptionCacheIndex-9cb884f38aa6d9ca6b46f6a93f416231 b/ios/build/XCBuildData/BuildDescriptionCacheIndex-9cb884f38aa6d9ca6b46f6a93f416231 new file mode 100644 index 0000000000000000000000000000000000000000..19ff8207cd61bf72d7c400dd1d79c3fcdc2a55f1 GIT binary patch literal 78 zcmWN;(G7qw2n9e#=?E_c1*S2jK;k;i)D8S~7`=P8- literal 0 HcmV?d00001 diff --git a/ios/build/XCBuildData/BuildDescriptionCacheIndex-f486b63b45fa1476554e34497a9755c0 b/ios/build/XCBuildData/BuildDescriptionCacheIndex-f486b63b45fa1476554e34497a9755c0 new file mode 100644 index 0000000000000000000000000000000000000000..d5440645e3ac99aff912f4f63b9d06c3c9adcfd5 GIT binary patch literal 78 zcmWN;%MpMe3yKzKCc3`kNA2Wz4O8`9nP_+9H<&rUI!&8#;lir#Hhcg|9c Zh^h;Anrh@i0YhkzjZVmLE06&f{s3966*K?< literal 0 HcmV?d00001 diff --git a/ios/build/XCBuildData/build.db b/ios/build/XCBuildData/build.db new file mode 100644 index 0000000000000000000000000000000000000000..7be73fe55103c570c5efe448c1e67e7f358a3752 GIT binary patch literal 122880 zcmeG_2Ygf2`ZvjK)2y2^OQF!Pp)?)oh7#yxl~USLHYH8cHZ)C3k}mdX0TB^U5hsX? zp@0hkWr%=2aH1ljK7GjZ`P7Gs1NZo!bMCoG8q$^aw*SXVetNzpeD_;tpZlHf%bT8M zvKv*!71nZ{T@^zGQUU=rUZtWaN(lcS0RQJcH2eeo&wT{kAI(4^6%ngaD3?-xih4@f z!2C-&QSl}G)A#XNz-IxU1$-9pS-@ujp9Opt@L9lT0iOl_2Q5(SCk|2%6#%ixVldWP ztIWnitI<|vw%ZC#hDP80({eLX@-tL3vL{WSk)fKDot`mE<^F(bT6Uw~R3plab&%3X zP)m!0h7J`p#MpI3W~1wKu7CRxCiy9;Ss5NFLB{zR6EbpDIk}UjrsU36P05%YuBz6V ztBk7DtZAv?Dx0aqqO(_7jT~yYs;J6jwim)JCV4nqrLQQjtg;&ojefM*bym9ys+kq8 zGFlAeFN3iXelc3~CZmn8$efm&F=;|J;>{@tkux)LGqTe%@>ED?i>};g8v!*RsS}EW zLPG_h8`j+MZ;n4ijdXVWtbz}7@-|i$qNwunb0=j_AeAvPTI3&;5h|c?CE6C7;ikG! zS7ooj-wPci3!@!>qOEiQYVS)0;-Fr=1YkCn&SWWu4;5Dk8_9%zXqyh>cQ2s>0|9l^x1$-9pS-@ujp9Opt@L9lT0iOkY7VufX zX91rDd=|K|EFh-*;ER5VT;d1y5-UGI+VxldruJI-)BqWf1uC9W1j|Lz#qzz%E$Bzz$7cbb1$-9pS-@ujp9Opt_+Pbv{C+`b z6S~8H>hI~F;O_%H{oWbBLEeF#!N)5eJ(km8xga}oh7J0yMwS|vl$wf6mdG4y#Ui8L zZi}pl)+8lHB_&1{o2%^5W3{lnqS|DPG*#FlbE_;Cqct+cW;5Dt5w&_9{v$G_vT~BX z!V;mYtTaIg|1lDMSHs`c(NUV%T2zdWu8pX)l#G<$PkF2_P8YeE2D61}&=a}DXjiiw z)w;x(gt+K9T~dt3n2;2wiPz{28huQnJ~lcbF;1V9n5augjL{_~#u*ZeqKaaQj71t_ zQgKpLk-->K9Gj#boo+0uDjA(+vXtf7E39=z6*{ZIM%@j$%Ah@#3ezU&;6>aH=BlnN z)!B>*YPG&ntu~ey84c>n3WH5uY=zFzH5Jw}8?_Hg5Da?I^&{I}CCIDW;8HOW>%uy<>u|nQ_>sIea zuT}_nYN0c&&`Ug}s@7yS>8y2`CbO{}c4m7|>zf7F+stOzGAzz!swVxS)TlGSK_jBH zTvs_C+U}w^_WLh*Ca8o4(_uUB=;5HqSYooM(bWrBy_OQ~X!QP{R{jT>B!s;G$6x*n zY~&NsX91rDd=~Ioz-IxU1$-9pS-@ujp9Opt@L9lT0iOjtTA(M0g1;-#>wc*g7Lqw`8#ug zImf)hoMw(Qhnc6Dz06K#2Xim8h1tlgW9pe@Of^%licC{8MlDh?{1R6M45M6q3Qx8ioi z2E|&%D#a3oU13p_DvA{I6a|VL#biagLaRtrXcXa!VG5O^ucD`dQ3NO``OosJ^3Ua$ z%j6`9%46d7?Z@K0>aN_mKz6 z1LTzKXW3QR=dw$(i?VaFGqMx1!?Gu3yJb6Mcgr@**2z}MYGswOQrSY;ELo0hqHMe@ zQ5Gc|Aydiv$O2^nGD`Zh^s4l8=_Tn!={e~c=?Up!>66mk(jC&frJJSeq^qR0(n@Km zbfI*XG)FoSR+#VOvw+V6J`4CP;In|w0zM0Lkp;vep%A`>yNKa?)O#3Spe|teF7+;k z=c)4;zC*o(;oH>P7`{clh2c5s9ENXFZ({fc^#+EoQ?FzA8uc26uTrmK_zLw3hG(g> z7@ncdVE8xcZy3Hzy^P^Y)JqtircPsciaLeiN$MnqFH$dJc!D~C;S1CY7#^pNV|a`@ zhT&1_D27LdfrVe9xh&qJfLFyoe&r;7~cz`;9;WN}T7(Pusjp0+& zQy4x;J&EBH)Dsx)r}ksGkJ^XfUTQCfk5i9h_!#vVhI^QGr*i^`fBR907`vZ@M|b~`F< zHdI=zs9d}lm6esKtf)Yx#e&N6a#Whls4Oc(<)THXG?`FYT8he&5>yr!qta+ZrNMwo zy&jcCMX1#2P`Pj+DhmryxnKb*=g&vwym_dcI~SF6=Ad%+Y*fygh02*TQCU!c${90I znV*l!ygXFq=Av@?bX4Z#pmN$YRAy(Ra_Ur6W@Vvr$`n*io{Y*#lTbNvA}S|LKxJko zDl;-rnVycyv@}$vrlK+>1(oB+qjKChRBE-T96J`3$;qf3GX|BTN24++36+V7s7y#e zWqdp;m8;i=A7*uLBsEm$AWmFU@BO_565rImz8kOPUs2nv4m0@A1961t|BSxTd z_;6GX8-~iELs2>M`P#GAAN~IE&41-FA0+n((DrGWMN~Nfj zNKhFNfJ(6#mHz&y^z%a{O`}pILZwhB5=kUz+HiPSIsIeW>bK$9ou^!9vP4u+ZFQjW zUW`=e>=a?HgpOp9S-L8VzBEs7H5x4uHiyTRzU!q?=cVSrD3>Okc@m837*T09+3Z~- z)l^hJU2YpBMF-oYCHF4mXqL&jz;#G1w8(KnMMa6(m}j(BoAgF?=kR2EaXZ>pi(2v9 z;o8E!1KV;-Y};YbwvMamMysjXXvnLmvg(bt$QX7tE}TMiI%~IPkYTZ#>}F#* z)ZgY}kj|b-nvts0XEirj*t)_2kRv*C%J;kuA}t5`ej|U{tj?YAS?+3GYkX=uy*pvC zJUI7uz91z=c(VXHo*UG~u#Q+4IM*SYfrL5pa38$<2taoy=sU_b9pYD#owdR*sP1`YDC=NhV9dTyPr+)V8^{93ak z1}qr=@1J*G9-jImg8%%bUpU(TM|!{E_B`MD_WhntAv$=EOBNMu-8H*xXHi_XY8|*& zYNr$(Y?Efq0Cx|*eSdQoES|q`(3uVzJ0%M z-*2=!?vyq90}^Zmc~zg<`>%o3^uX9SgkWca`h_R;i_Py_rW60tbMFK2P& zqAwq_92zO=bw?t&<6UgC((Q{e+&*X6FrvFA$oWi<*?X*$4>RgU&zKVI_?fMn_KhIV z6!ex*)tHZ5D1g7gdO(2M_rrY{-KFnc#dOz9stxN2bqrwb!s&?rEjxER zhV$xgRUrcK6V}6t%h?d)$9$+`F|z znk=;1u{&&$Lt$El!I;NoRc!|+c9M6jonb_x=GRC#zLH*N*O@Cy3LPt@LQ_XLuC%B% ziSne^Svyf<&nKGDU&I-hsLQ39z`d%f(^m|!cnFez zI*yyO3Im&9@N~ozc+_=gaD*^WZtOM2l>;LD`Pj1iFazO_VdyR$`T(&Kawzbi!cMo* zcooKXj>b17oWi3qH(S7F=N8wDVvpM-E~&@#Pqj7ME}!UC!8%%c&6K0{Tk7IqTf7H##IHhXS%H&x*E~#^U1?l-mJ~b28kpT!>$?yt}D#TL$}|BaZ>KI z>=p|hD=N8fMb*sG2E7RKt*F`KiqR@ID&plI%h$>yWEW&BWW%IyNUNm-Bri)WlHLKw1BwF}@j>wd zvA_R*{{nxZU%p=eeV(2y`ciaUlqq~e_>iz#@S|WW^%^AB#Akt)8y!RN-nR)fc0=sp zA2(4yT>9hIF;XP^cenmliQ&d$XO<9LFk!5es*lIxWVjSf?A-2p>A?g%&vU!$6J-4` z@Ztk_p5Of7o_-z}di@jL(tCJ1>X}yqwoMxT5|aGeZ?leK4eX!&#VuT|fE&+prw!hA|&M%f9*iZLAhd0x?f<6qUEHuR+MiO9D^}x!xZ}zLE$LOA&_2HJ zWCtC(Z^O60V1BV@O&HcjE@+8wSiI9V^`~|z?v~a*grDtG127zxwxyKVWueyNg24CreVZXQ|9DN{;MY|q$l_KRN zC&XF>+A7iO0XgC~58aK&gUeCD1xTW+|5CrAiE*CG4f*u5=$eo7gIrflUz-*#N4Q@v z5{L{$vdJ3m>}sAL_YB6Fv+xxR=Z~o!Kybqe3?s0Jz=Z^YQPEOzXjUKMr^$V%x)vm;NXi;hFAJZggYGaMUc_CHgDa4%2ca z1;ahlJ?KVPM9vGErCWauk5FGtq81kn^Gx@E8{ODe?CY=GvYWL->VcC5Lp{@d!i}x~ z4zcLdth`%-uVFhRo4OYa@l5xa8{Gq~k#}1HUhjMrPkmi5*fZTjZgf|PTOseGFFcRs zjl3c#804AmlWufdRd4&Pk7K$cm&6nd^i21#8{LxD$a`oDK9c-u(ECpos65j>>PFW@ zjuxA(w-X!iTbr*!ZaY~J>Y48I-q1Z8w-4K)cRVN<;F<1oZghWQT2XIrS53fll`B3k z=tVKcNM7n!X3;Y4=2a1eUHbj8qz8(cH|}&vB*|oX>@1|Q((A$AFsh#F&h08 z!~T?;k&-?&Bcj}Z&zHY=U#&xO{%6_dN!-e(VO+43TAS%X-qya)Tu5f9#_~3qyn}N5 zizcd86Gc*bxc^F2a>FHBIe$&6)g)a{0snd(1^lZ!h1jUt*z09re|4w8{_0L4KB_i8 zimL*LWbCi*xC!yK3Gvs-%l_)lEion{t`-#>ZB%n#>JR8~4bJ(-pIgI9sSl~a)I0(8 zgK`x$&;L)sTE9C4l-Mr3#QX{4@&)+~RP6K@C?e#?R1BW|O`y z13I!+qOa5&Y{nU062LetMcyD&uUKhd;9S}{WlrFX136?F;nN0@R_^7ubUv7`+A_DhkAq~dyWCNqcK%KYHU_MXu zalOW??WHhM15DKf^TJTO%4sl{Pj+#z8CBM?mocdaYiY2UPj0a+x1uVG!EA(WiEFys z7t=t`6JvChJ_kkr$k*A*a`3G!qm|mmqhXzcL1kTv&15iA$9T*=#j0e_sj%6hS1F8N zV1p@V8tHn3$0;JO##C(2v+FDdm}o1@RAkk`8N=3y{c}|`DC4Pe9j3-JlABV&6Tmg?6&Z5=UDvR2NukY5Z zgxd1SEQ(F1h68Z0>D0@65#TugeO+B(i}mBT*sLV8x2f6u`Gbu(9nv~eHtl(^Olh( zp3W}ss->Psj(PT~qEx)@aOGGG2U0yxI_AM1Z8t43T3s0$Yv3w`Cx&FQgabFcyIo~9 zy7EoqQPHV*`8-uu>B>;YBg2U}g&)k{=gP1U&cx+BS=Qk#iDIubS^!K#6QhVHwrOzn ziq{}HI(-@R(}Ure*zJ(3-UfEA>gYUw9$jnIHt5D{#0zS;z=b(gb!M$lDi}vG)No30 zR+vEzXO_!9mJO3U74Xl1{{C0|4%6S#86vx2oS?opy;{vzPSiAtp?sMu%fO?dh|N@N)?O8xwU=50!svRq zeB-J9;lYmGn2ItD!<@e`egRCL?7fPyAcJm@@nw9+m=E`xHt&UuY_Y)}s@Kq~;VB+Z zCWoCIuPED@{kJ7GBAW_|*=EzZjL}Weq&C$@(yI&q>um-dCmp*CXD~*uESAaUS8pmR z%B>)sZh(j5d^IwZgxKgzhVGRLtaD_fOFR;{fFRUHkVQAZ1ONXnEt-g`LT#wG(QDvl zl2>ig+FTXRxwd1xgV_jDZ5G327{CKwMpRYnRWJ#51f2WL#t1eYHcBgQ zHdmKN=*{q*QbcrNl;aU2pV8j>c`az4uMPE!d5#7<#t~Y*V#S4GsP2 zwPSDi&f?hMUVk01&9&&#gPJDWLEUOegMeP^cf(gtqni%xsSsB}9aII&kpKS(%0?;A zEAyEjnLSJq^WTOdhbkt8(P00 z-w8CFn;?WYA|oBX6s~?EwZl7~GwYdAJFN3Lv;HHsLpznTi%(7Mkk02!tUb8%ITLFS z>P*hA{ztU~JD)SLwyN_v6KjWdCTCY)t=a*d&zb1lzcV?z`kd8E&_TA+;`R^gUUGkZXi zF?r~+kC!Cfs*NMOqB~913$nZH&C`@_P_ceqwfF1WVn!e&ru3GW!|2msSS&EuD>9y2 z;$#LA3~o=ebDr=`Qy}5mL(8q3%#=fdFiZC%_Q)jqEQb@U7Lxsyh zVG~Deb0m;QQhTI#;o)`|IW+*%4s8$ZMti_aF(l{R2uuvko|4V=hjhlYN33Sf3Nrj4 zaiv$pT?fP|G$hl{TQY8g;5-o|HnzhDKlFy(YS*q1qM)RXIf2mV@g%6$!vmt((QbM#&*-z$7^#tN^Q;xpl$+9HPrl%S%FPVWyys7U)S;d zzX=CG?cxl`uY@1}*Cu${(jm*Tj#sfcKQ(Q28f3bdA3d96JTDdU&Z*kc6i9tW z$D6W*3**Q6*=kG1Lr!_w$y3Xqt3#WQik*XJOE2EFh2tQjv^LMCt>;jwg$#_@$@#gH zCQQi49j)SBB`{_zoN|`(G@kJ-epxcK*Ia&j&UNjqa15$_ewg7dQ#=|nnBMU{#?6;o zyD$mz$>?}K4mW$PJ`r-5!jGvOTucd&$xMEjxS4E5JY*Hw)Z)aCvK6AuBh81AkT8%dAbS$FYecx zawYf2Yr;F7G5fm1G72)*@vgBW)Int!F z?f+w_dnn}&rCm8u8N%#kRxy1PR}_a8s}-{p;qt5U1M+q9d9rt8yJX{}?@249O34$F zY0wYgrhriK3*wpnKlyL+kMz6MPe=bk-$suVy(pS3{8o5Oc$?5DOcE-fN5Hd!n+0P9 z-5{IRf2tRAAvU}V<+kpp;&;#eYw15>z=K`NZgmSWv@Slug`hh@L^(&`B?7}L9U;{i zQ|>eCpP16;ANW~1KLbO*+ctena3@!AxbqnQq4S>3oOV79;V^f_&&2Tc`$k3)+z0|! z6L^9^j(?biqZJ|;a3%ib_aB$4F^w6=-^1|cAG9aQGhyXUTqgWKJ*Hi{Z5zfZ`0Z{C z8?sKE=5WnU+^sk7`T0zx03|fo#moffFkCik*~=VmnG<(q!TRYNv+SW5XI8?S7~0?X zO#tnFgLUtZ^K z@8V*vU4?rUBCzj68@4DakCq_%iU}X05MsNS{>vx0x2s}f`}n-|Om^SiA9d@G`OFTk z!F+mF?!S(Yp?!Q#exnVkF1u?8=99ugCg9tR*YVM}kI%!uE&Ns`jmgJ+(r?H0qxk*3 zH?QMU)IL7LCXc=_-M;$-=5uqe?igOk`QbV~y7uweV0~-KoT>J&F#T-#2n_ca`nmH7 zTgbK15J8_k6+_0wFF1*Dl|yjWe`_H9 zo!4If5(P-xC0`gT;sUGg;PjZs@oB8b?=9%@T{jWd!`krsYnw;i(hbp<&3$18h6~2- zJ;>=Xm!scUkJi%fePq<=f8X)di&&4-C3xnM{wX+iogQ;IK8^MGwFNyQ^?%_|dxLvb zTYsM#d^3_?QnC=GblD{_F*~2;^q9@jZ>&da=^y&w?;rj4pR*gW9w#C;VEU@0J=f_m zi{sN+kDpr5W8^o#vLOQl?_GGhZdEy=AMoboy%@fAWWat-kC`0(#(K1t{*aItA4r{= zAA|Kc7KGrgfbG2pU8hF@$EUF#KfCFnCSk9*{xLi7C#=WI=S3f!II!dkMBmT$+%ybt zes9=AT)Um&nf`BX^rHzrM_+lCrT>ovsx~!f$T3W}s^K*Z>;0a7grlGDnf@KGQw(X>EP$$9z1z z`UNu%s(bD5&*Kpv`maML-T8#&IA@U=w|(&1E9d6V!?Hba%V-RDd=tK%*ckXvzIoStEmxo1O|^qt>t zh$=tT7d`X+kC&FSGhkEmdQO6 zA_!kNV)h$}QO{!B>VXv))+~6QyUkpj!L=c_qY_bD4dS!YEwp3Wu z#a3Opv8KXWrY1M|N^v+0TSO_0h*3|^hmHvfo=(BL)G?tgW&nzLu#(#DCeUlE5iB468UDbodeir!&)f2fos8|){0qO(-$ggES`oa zP(AYo?+Z;SE-mPqz5qifE`m`nI3E!_Q2_A_C`^wwzoziMW1{&BN@9S)sT`8j>B`MZ z^5G0#*NK9V`4>%>K%WQO;*=YAL}2T>G8bxTyb-l*s!;*k^c#Gr_tdEu=fJL1((%qL z6F4_B=IS!%OjTd(4&dqby56n7T_G;*_%=wJ|DmG|B+obxz4l{D*U$fA$|8yf#Q)h$z? z>bn00)k$3kPKNES?XE-KPutD-gR`E{Qn;5_3X&*667!?tOZn@v1JZjWO9EDkH~Js& zyGDN_`d;{(;3w%->BAki>F;1d;ztF)Q(zX|5Y1PB7LW1!K{8#xl&{zoe0!UYtrya( z#e7NMr3Ve3vyGBLD9dCiL$hEO47y$is_6#ag8Fo+4cvM?t2~>MT~7h9gl?$0A?w~v zZ`a!|>}WTko~BpJ{?~MOnRhEuoal*QEF8P|8ZGlHs`RDpSYI@|q=2gk>Rjg!_Abd< z_|)t*P(e57_-da2uhxR>f@lh;qZ_LJClq$+gm@2^HhC5dUXHYFx0K1GufpO%ssmyjBhm#FX-OL8rM2)dn1^f5 zIDLR?f+lTQ4dlerW!LMt&8vpY;N5T|&b|nf5|$d_yDS@?{MEX|n1s0KI9*bV#t5es zO}s{L(CA|l^|8?jiE;X*Bx6y0RB>^9bc`V;z9^g$;jc$G=a) zJ*p)G`(UHz+ZrZ{eCm<40!!3A`c*&bo9 zwb%Epfa6CJPc78r_<{F1{}pRivjw)``5oVaJ?6a9R+K|-`i|$;REjojxfwDn?0ANr z^RsD}l|gpPJD!~*=}B{muC(Sw{M4n#L~Yt~6F;W)oQO^fx|Md#+}F&84=gFU!RNka zl&>s?^>5_IvB7g2s4zl~Jh?J^Y~w2pu*r$|QL$BBx>C=djXe)x)*{H!#E;5NjnWl5 z{_54^JY-%78S*gcdGv?ZN(Jkv{?zwWz$o!1|6lye{9gAPOFyZsWd6y_RJ^O0ExJkm zlJGluH1)k~7abzYmWib=NUhQ#l6NJmC7OUYgsX%?NP@c$*7_3x_z-soq4f`S2qx%3 z*AEwV;>wUL)tfuIME7og?hx(%%ZT8lv2Cskmv;tkL2W$*rfD2*Bdn{czqup*$GS?W z=1xf;0p02Pp`F=La5@h?n*p@Y;SFDCvJ_Xa@9(LtKt|UGw*5J1=WXgg)^U$-}PHDd-^6b$c7Nm@SW zws)0G%^X0K!hGCyooOa^BEdI?^4YZZZC+J--&zQB#|4XQAf@Yrx4TgL-K6dSF+u* zrLtbq&!tDC8=+soaY>ydIpD8=lL2c2X2H{gKgDl}9}(AxCyV<-Ux5by0{@YIzx&-n zU!_mcTWJ`#QuL~5yGSRB6&?|86wVfg3%(JY6igC?Q2&PPz4(NIC`T9t=2U#p69Kmg zC%`ZVy9V5GlM=%%OHvn*I6E2;$sxl~ao1Mfvm|uX=NKtt!&VHf$z!-sar4MSVIYEg zC`6F)z9sy?(Nj2L)qwE7;mA(|)X$usLy)V1nv2wsZWk21<*}mOU3gddKx9myq}G+-o$9L}7N z+a_H1?S)$rQpigssTf%>shc~eFff99C`2IH^1$YrD_5@Khn{|85{A!)y`D`tRDg9{L<^41R4V3BheH^3>T$v6M+QyB z4=wuPFox!u*E0zx4H(QJhcmlMCeNdO-HBqt?CKX3hy#fA8~?~TcTQno5cg1sAoPG` zbbrfg6bxopKk=JbmwuA5FQyU>#b6+3aqptSL~nZHY-VBUeTYHd2QKu+@RMhcaTeD) zEUa=$CHs28y9M{(8-bB)?oGsS^{jED9mt_hF9dRv=cIuj$+erm+9?)~G*1Q`T@ z0gf1Za<4jSU0vDMqkjqSM5Kd%nT=!2^_};h9-IAew!7+w@)Xb9z85X>Q) z8B0LeV`D~bP+_E;H*x6C;9a@1Lx}8L`{i^ACqy_SbH+^teK?|7%(T--3d>Kgz84dn zX+}Ytb_L%Qc$6c?)mRuIHpHQG5Jx10nR{a8)=OEx;y{_f)YR`Vk@UPzdpnSOH-RiD zNyo^^58mNK?&URvVOtPt5xeUGQ9{7Qo;TAbPI7HcWVmyCp?k` z2M$y_kprE`##Qo%9kT&0Z$jPv2!`@B6onCgBOKcox|!SL_t}zSw}-jVOPuauK*|vb5&YhJ<2yU=^$$l91pP4($Hoi#Q?sc%u`&n+ z635WzU3gJj$N~K^YUWVPV$n=Ip9ekjrDKG-O5|mOc2d-z#7!Viok3&dS^ct1!X_4agbkxEJ3!e2X*#VfFqt6}RG`q1V#5(c@mCRBM&z zlnw*5Q>5JAc1Hi>;lFxeCYKN0j^U?0YW#_1Qh|s=&SDl!ih11p(+0d?>m7HZJ4RkV z`&VwDuXmG(Gxq`@R+~rQ(%c~zPly$Gh)TK@uPd+~4W&40Z=h3r)?=HpzUAJ4cK}<_DmN;qr zy7GiDdb0E_Oyixg-(We4fBQk+0u4$un8s^2`(YZ2oN}&nI4Z1` zdnQD1`Rh9}!*(`Q<7b}x`*Ro`DL?%+;agq9HKHu8N0NVO9XP*qlhQI{5nhr9)TP5;C6?c!j{QYKM%BO!@1Kzf5OP49Z=B;z` z1>Hh$2=>6~H(|-Jtvw=ImFgy2b2vf6s+pRBsbNU1PjNccP7>bpTen$9cY#eSl zv-dNXGuPlSOTsEEDMl}cZ;+9 zzwy7*f0DnzZ;PLbK1*+>hr&qz{({|tN!07q9G37>nu0ri!o&xB7U)N)L}CXW@DZPW1gwR!Yi}0-oHU(YblaVAuOIk126nC zTzaJQ@-H)+2664`-A(0>md&Gq7Y-6GQa1hex!iv)4U*a=cGHQYCGCE*?LwPPDh1!G z8I6_*o4vwXS5%?18l)98(6vi`cV8^m>{X_6U5OEnxsi@kOQYbhV&k8mix6ZC5AS@& z>=3T5qCt75YK(^O2snnB_~+UvJzAuZ22*+G*=sosmUk!@INhUZKLWl-G(m{kt793E z7!wg!iwcqxtzV~3$O-Ya3Gsw;NEdKsmjeAem2-SlZ9KQ|8qfut*#$invM8-^9dC#QBAQxT&XbwRxSZCGcFKd&ohXgl?S57n5>m5q*HYj_s+5rpb0tpO6aPq6Wa5_>xB@p#l5oD|B^0w)h+IZDNi8LH{(r z_o*d*1=PRjdS$&*$vntt6sKW)!1MBA*-x^if;^dAdY^QZ=%~mf3KTvgOoPN){aHkV z8SpI^xyQ;bs9KE2mYAqZNQ}`XCdL^Oi=tpaHe->-m{gn;Rb(*66vrm1)u}qG)nv4) z(HpxIo5^6*QYXr3FqcPGd3LL*GOw<@sKRX1QYYb|^im$UIYVOPRM_nBatTW80dsle z>uhB(+%L@UVYF(g7br^jXsheMhv>6FS6DzM3Whxd-Z9it@0nb2Bca1&K8;!!D&8A)7%)N83Xc{XcW1?!xkrCzntz{sPnX{B(_Y|JrQ z%S~{+gYV?D)MGbR=n#~F)Y zu+fD0gv8>6#6-O&Q4_DFcFu?7p&yG^62n(3rauj)a$H!NQW=jW~Dg-?KfJ=WLDBZ z4|_sKFA$pw^rbDg(4de9hR%gsBmK-g4PtpUreb@ZU1u>spPnpJkyQuR!;RDaQP1L^7uji0#sfEYkqu32g{kzatj0#QnZ5*ir1CH&5vI*8`H%8s zU60Y}v=-QO=JTK^a{tRg*@+sNmD<6Ra-O5%Ere^C5+0h4V;g^c3eFtXhpEGdIfut; zvr$>g(EI;jDwSg1WF+!;<#S}GW%1Hu(oo6G(BFSuKtKQA{Wtjs_^tQrLq9-|6g@A> z5`H51ryv_XLO%5YU?_Zt-ixOb9*-f6|G#FI0Nub4c=X%_LC~8CoM$}5zE@K zsLEn68`V}L=NM8A20*Th`3d>j9OnwqA2Q}Cp07s>FNM+jP`rMxFDta@AQb815H(e2 za`pYz0}<#4M=n_>v2Vf!UB3thz@xxyKBaKpGpO$eg5k_HhOe26J)(6~_J3Orwnd;1 zstca1gDw*}-TZ8eKoH**Pkh|;Ix7eSys8=VywRRZ}n(B|B zFN~8()hD&1L$=lLrwOUld8s)%tKFnCJ3DYS44aF5_;?&L;rndI@r08xkiw92RDEze zIJd(r*NxrXLAS1JI!GE%l~W4>VdYe{!$i$`#zFt8$fmA&)kgs(9N3LK4P9t!g}17F zkLXS5*XDCR7r%<8Xo6H2nvQCa@Mbf99J}56LcJO&V9giurbQ>!yys!Zt9oxfvM9R$ z-_w62rMzDm&-}>T$%H7L5cl!FR}m|IK>n)#NV!^emrNkFNiImz0`3doLPKzye;@Q& zz-IxU1$-8`(JcVq#_8G}F%R(EZQB!+#YBTTif%A}*x{D3_#G{^`ce&IZ3u%zno`Jt51CJX=13^0& z#Np^B>20-)%PEZ8ed|cJbx%Suaw51$Iel@=pN`}L?d=xbBpAK_520!(<%3EM^RnWM zB1Yav_MB{t^n~Q3L>T~#@cOMH# zfro=Se%|YGuD`B+`K4eyWXQv7V2+vdzQIy34zl7Q@wU^EtQmKp6+jEmf_cik-5LqX zz*wmMTz;$8VeMLw47pWx{A=l!9j}&xF{qyTQM5(&bzn5)Ueoc4x59sL8AyV>m-C}} z%lsFEM999RQ={^MG>`y~$7MVoEMvu?!=|mx$GpyUdrLE4HHe3%gHbO!+N&1(QY5O? z`bzjea*3&|FxXriISe2UGM?J;jLYH8C$kZ;(i!TsB_I~E$>XPGHeyu=Vj!m)emJ#Y z&3Qlrd5`t>mOx8>{Pn#+G<=B?$x~a;Db?AGY*w#~TBE+o4li}6=BDM$SD{f|g|^+Q zT+Rci9ets#+r*aB^g{Q(C^)%xfqP#wxr3p5U*rw$-q(!wwIBj^1s>*q+yxWZ0nJ!m zWHhiNTCr7EZmg-Wmf5sR0nBQ}*Zkii`*|R|9b-U?mu>2Uz$iEd#B}-?kb!K?4gwCx zi}uWjUXB9IWNU__Kv>s|0?i4v1dP1FM}cOvH-QnbGtBJx)dlW`@oIZ1^l>RNS#;Jq ztr-l5yyo*b@i*c(4<3ViKi9W-;Sjz5SI{p~;+_6a`W>QQRQ81)0HN}MvLVu8l9+%i z0S|b$!S_Aovw+V6J`3<}0br*a$^<+uQ@S)>8M|^(S9(YzI~~-}4U2DNt((YKJM)IG z?h>QLXhm;J*-J$@q4Vq;zPeGmadIS83J-FOFkoV7xvp|9P8RRgD-d*y5II$6F%=ta zcAVwC8&2}>Eip&3_&~6jZZO`EeXpsc@3~+Z-B2gI5eM0p4}GX7z*4CF4O!tt`=o@} zsEmx%_~^9Eq^Ri3_^7DZn8eu3vPv3;s&D4nF!eAn&<#^=$X-v5#Lxtrhu;5>5O$}Or<7Zj{h3szm*R89 z!-{J8AM$hZ{<5pGn`8r|-%3wQ=Sm|aFG=o}L`sAK`vO)4U{9eyrS$O*9y##p$DBu!$&hsjv=aKl(q6=HspTUIpkHhK42cH#% zEFvb3CyW*mxS7Dm2n+)=oYF4nm-@nrf?YW4>fnbr{Emq}vf<|41bK}T*HuLRbp&o8a0`LA6L>#?T&Ce2a5Y z+b&Tt(mt z0#_5bj=&8B-cI0F0`DboJAn@oxRbyzkmqc_Q?3kG25h`~8aJxEeK?u=;QXRTA0fyV zkjwS9WUpH9Tl2qu>#AfR&R{-x@cvIRBW=BqOP}j5Wf++5kd84v(nGVq^r1cYq2OZ* z4EwIg+d-ro4RSc-WTy7lcfN@@_0SB2H0XniIAi&sU+$XA^%E}LIma;!OyeF75%~Ah z?tJOa>5t=w-+bja49`9D`~40(WVg=_B`5cOLcbfBgb8n}=!@a;U4uD0xYu47nCg&@ zx#zD1%;k?B-H#tytNM_IZ*RKWVTUXZIhlF!*J-CWo{jn*BTYFl3d2R;e&cQjj$;^@ z!aW=!(2FvTZA9VWNW4*R~o%Wv7xkt$4BG~*o%N4&n7vx9r9 z4g-@M(lO^hQ`G5}2o9o$27cj(RU7#IlnWb)bYWnk6M69IRYyLIpNSK05By@c4nOo| z`0pHYE||a}o0$p16EinIb+Z&B?K!#;!saK4EbB`nm-HhLr>(IFg!9UdI^y#42*LkXP51fJbd18fH{< z?IR4=+CFw?6b6!=>VGtH>9WP5TUTS`nRi5EIIB3any3#V!5D5S1iYI}UWodsHe%LY zTQTXO_x8bXB4yy@Izf6)TbCl^iHO{k%uU5%V6;=eKAES+{%)@QJ7(JN@g*3B=<2NG z;cAe?S>3x#^XsRm#=WGzd@~{(dg|I0%s`Np=dK+mCAV-01BnhPncNA~Q02p8f-#Zj z^VVZ{B)Ff2NSO)}IOHtmmT#sk)(om!jFFa?;ZZ+yhw!qM*paiR+|52=Af6)=3@wHz(YHK#_(0+1#VV!=ZNW7AW*y$-vX%c@9yvK_bWvAeS8-1S-@uj zp9TK=EI@-YX*eUp954eqoF#RkoY)$oaZ2e z5|9V!=XJdB+%+#pI*COf7jl}-k0$QiO2BkhE#7lifH5EkI=3$6>0K}1@~;Hbp!6dC z>c6EB{92gaH5-Z`;kRM5BnFgXDv}~Qxh2eYT(D^AvXK@PfGp^g9L-Z>>O$2@z!ZMR z87>%#b`hA&|2V^OTLdN{X6R-eo8E=b)?on?Av0Y&0ztIY03#d6lmS{W0X9dz-syIN z&FVlVG#L+9b}2l^`9mH}W^KU!P~l2GStQGJZ$$>)4io zRLFHMe~P+Zi`OFm|6bz9DDhLuhm?uT1*SsronoD$kNhEdg6vgUj`Tfgo#YqEPRZ1O ztMIKq15te+p9Opt@L9lT0iOkY7U(n!_=}XneCpyn8o&@-9Ui{{9nMhi;skqng-|D+ zV;gZ+i^56e^5%Ce$Lr%9ar~m8`NjzHCU+=5j<{wP4Ppd&nO+jV{>B1FxJNDxh70n> zdr#PLdx0a_b0u95Ltu4uJMy?AQ`_u1nAHWz0K;^YS5)iF+U_LJWk<&$fvl`{t%wa> z*3sIj@pa&4qMT3%c}fG zv_sSba9k?ni>n4k$idO@)m)k*YCTNXJEP;fBimr3)z&JD+NOtD%I(_PWiUNCU!0;y z0H9K%zKo5RQBH1Psm&GoGOe|k22*)3Yoo|KTIyLH4KjGp(Ntb;G?-8_=_H=&%X#~c TT!Yi5@H9}uXt6MuLF)ej2<4B< literal 0 HcmV?d00001 diff --git a/ios/build/XCBuildData/d360e20f868f3f06ba0848e6582b8e21-desc.xcbuild b/ios/build/XCBuildData/d360e20f868f3f06ba0848e6582b8e21-desc.xcbuild new file mode 100644 index 0000000000000000000000000000000000000000..f8349f47cdb7e95142ae064c5d55319e2d65aeb1 GIT binary patch literal 489016 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"] + +nodes: + "/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios": {"is-mutated":true} + +commands: + "": {"tool":"phony","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/LaunchScreen.storyboardc","",""],"outputs":[""]} + "": {"tool":"stale-file-removal","expectedOutputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"],"roots":["/tmp/Runner.dst","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangeAlternatePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-CodeSign": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-CopyAside": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-RegisterExecutionPolicyException": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-StripSymbols": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-Validate": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--CopySwiftPackageResourcesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--GeneratedFilesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--HeadermapTaskProducer": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--InfoPlistTaskProducer": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--ModuleMapTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--ProductPostprocessingTaskProducer": {"tool":"phony","inputs":["","","","","","","","","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--ProductStructureTaskProducer": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--SanitizerTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--StubBinaryTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--SwiftStandardLibrariesTaskProducer": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--TestTargetPostprocessingTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--TestTargetTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--VersionPlistTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--XCFrameworkTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--begin-compiling": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--end": {"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc","","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--entry": {"tool":"phony","inputs":["","","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--generated-headers": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--immediate": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--modules-ready": {"tool":"phony","inputs":["","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase0--cp--check-pods-manifest-lock": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase1-run-script": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase2-compile-sources": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase4-copy-bundle-resources": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase5-copy-files": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase6-thin-binary": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase7--cp--embed-pods-frameworks": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase8--cp--copy-pods-resources": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileAssetCatalog /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets": {"tool":"shell","description":"CompileAssetCatalog /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets/","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/actool","--output-format","human-readable-text","--notices","--warnings","--export-dependency-info","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_dependencies","--output-partial-info-plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","--app-icon","AppIcon","--compress-pngs","--enable-on-demand-resources","YES","--filter-for-device-model","iPhone12,1","--filter-for-device-os-version","13.4.1","--sticker-pack-identifier-prefix","com.o1298098.movies.sticker-pack.","--development-region","en","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--platform","iphonesimulator","--product-type","com.apple.product-type.application","--compile","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets"],"env":{},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_dependencies"],"deps-style":"dependency-info","signature":"c58a00ec9192e4733f7bf5e6e17a9b23"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-fobjc-abi-version=2","-fobjc-legacy-dispatch","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.d"],"deps-style":"makefile","signature":"8a7fb9eb7c96b631505b57bfc131d31d"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-fobjc-abi-version=2","-fobjc-legacy-dispatch","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.d"],"deps-style":"makefile","signature":"0729f6452ec8c93db47bd4a844c27e9f"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c normal x86_64 c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c normal x86_64 c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Werror=deprecated-objc-isa-usage","-Werror=objc-root-class","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.d"],"deps-style":"makefile","signature":"12708ea9868440399df8549f9a22e8c8"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-fobjc-abi-version=2","-fobjc-legacy-dispatch","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.d"],"deps-style":"makefile","signature":"bc677d1f1e0311c4f1de9cbff0180357"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"8024117da0da25606f83fa4d96ab1c82"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"98ece48a61395b155809e0623b426cc7"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter/AppFrameworkInfo.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GoogleService-Info.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GoogleService-Info.plist","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GoogleService-Info.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopySwiftLibs /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner","","",""],"outputs":[""],"deps":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/SwiftStdLibToolInputDependencies.dep"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CreateBuildDirectory /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios": {"tool":"create-build-directory","description":"CreateBuildDirectory /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","inputs":[],"outputs":["","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:Ld /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner normal x86_64": {"tool":"shell","description":"Ld /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner normal x86_64","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-target","x86_64-apple-ios10.0-simulator","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-L/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-L/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk","-L/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-filelist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-Xlinker","-rpath","-Xlinker","@loader_path/Frameworks","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-dead_strip","-Xlinker","-object_path_lto","-Xlinker","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_lto.o","-Xlinker","-export_dynamic","-Xlinker","-no_deduplicate","-Xlinker","-objc_abi_version","-Xlinker","2","-fobjc-arc","-fobjc-link-runtime","-ObjC","-lc++","-lsqlite3","-lz","-framework","AVFoundation","-framework","AppAuth","-framework","AudioToolbox","-framework","Braintree","-framework","BraintreeDropIn","-framework","CFNetwork","-framework","CardinalMobile","-framework","CoreGraphics","-framework","CoreLocation","-framework","CoreMedia","-framework","CoreTelephony","-framework","CoreText","-framework","CoreVideo","-framework","FBLPromises","-framework","FIRAnalyticsConnector","-framework","FMDB","-framework","FirebaseAnalytics","-framework","FirebaseAuth","-framework","FirebaseCore","-framework","FirebaseCoreDiagnostics","-framework","FirebaseFirestore","-framework","FirebaseInstallations","-framework","FirebaseInstanceID","-framework","FirebaseMessaging","-framework","FirebaseStorage","-framework","Flutter","-framework","Foundation","-framework","GTMAppAuth","-framework","GTMSessionFetcher","-framework","GoogleAppMeasurement","-framework","GoogleDataTransport","-framework","GoogleDataTransportCCTSupport","-framework","GoogleMobileAds","-framework","GoogleSignIn","-framework","GoogleUtilities","-framework","LocalAuthentication","-framework","MediaPlayer","-framework","MessageUI","-framework","MobileCoreServices","-framework","QuartzCore","-framework","SafariServices","-framework","Security","-framework","StoreKit","-framework","SystemConfiguration","-framework","UIKit","-framework","absl","-framework","cloud_firestore","-framework","firebase_admob","-framework","firebase_analytics","-framework","firebase_auth","-framework","firebase_core","-framework","firebase_messaging","-framework","firebase_storage","-framework","flutter_braintree","-framework","flutter_downloader","-framework","flutter_inappwebview","-framework","flutter_mdns_plugin","-framework","flutter_plugin_android_lifecycle","-framework","google_sign_in","-framework","grpc","-framework","grpcpp","-framework","image_picker","-framework","leveldb","-framework","nanopb","-framework","openssl_grpc","-framework","package_info","-framework","path_provider","-framework","permission_handler","-framework","protobuf","-framework","share_extend","-framework","shared_preferences","-framework","sqflite","-framework","url_launcher","-framework","video_player","-framework","wakelock","-framework","webview_media","-weak_framework","AdSupport","-weak_framework","AuthenticationServices","-weak_framework","Contacts","-weak_framework","JavaScriptCore","-weak_framework","SafariServices","-weak_framework","UserNotifications","-weak_framework","WebKit","-framework","Flutter","-lsqlite3","-framework","Pods_Runner","-Xlinker","-dependency_info","-Xlinker","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_dependency_info.dat","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner"],"env":{},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_dependency_info.dat"],"deps-style":"dependency-info","signature":"2f69a87c92b248700024911c69fc0166"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:LinkStoryboards": {"tool":"shell","description":"LinkStoryboards","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--link","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"54bb90ec5b38498a38021e05bff75100"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:MkDir /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"mkdir","description":"MkDir /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app",""]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Run Script /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"shell","description":"PhaseScriptExecution Run Script /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"edc27024dc6841ecef2924e1a44a6e5c"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Thin Binary /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"shell","description":"PhaseScriptExecution Thin Binary /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"8b4762825a6fe250b925267cb4a5e5de"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Podfile.lock/","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Manifest.lock/","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt"],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Podfile.lock","SCRIPT_INPUT_FILE_1":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Manifest.lock","SCRIPT_INPUT_FILE_COUNT":"2","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","SCRIPT_OUTPUT_FILE_COUNT":"1","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"f0534ca0836a7bb8ac96bb5d7dcd267a"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Copy Pods Resources /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Copy Pods Resources /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"f1714de05963e15ebf581972559f25e6"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Embed Pods Frameworks /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Embed Pods Frameworks /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"f3bf14e60e6c458bb5d7158e90c359c5"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessInfoPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist": {"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:RegisterExecutionPolicyException /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""],"outputs":[""]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:Touch /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"shell","description":"Touch /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app"],"env":{},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","signature":"935e8582d9075a2b36f750d74519c052"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"]} + diff --git a/ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-desc.xcbuild b/ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-desc.xcbuild new file mode 100644 index 0000000000000000000000000000000000000000..4acc6acbf2d7706854545ac6625d29c6543c18e2 GIT binary patch literal 828536 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
xb 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
jz6?Xe&9Fxb9?NHsg5Pcvgyx2qLq~f-RVW2H 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 JguUY4{{f^WL5TnW literal 0 HcmV?d00001 diff --git a/ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-manifest.xcbuild b/ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-manifest.xcbuild new file mode 100644 index 00000000..8959fdac --- /dev/null +++ b/ios/build/XCBuildData/fd11666a983853c9b7ee142760007e28-manifest.xcbuild @@ -0,0 +1,95 @@ +client: + name: basic + version: 0 + file-system: default + +targets: + "": [""] + +nodes: + "/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios": {"is-mutated":true} + "/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"is-mutated":true} + "/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner": {"is-mutated":true} + "": {"is-command-timestamp":true} + "": {"is-command-timestamp":true} + +commands: + "": {"tool":"phony","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/_CodeSignature","",""],"outputs":[""]} + "": {"tool":"stale-file-removal","expectedOutputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/_CodeSignature","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"],"roots":["/tmp/Runner.dst","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangeAlternatePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-ChangePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-CodeSign": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-CopyAside": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-RegisterExecutionPolicyException": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-StripSymbols": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--Barrier-Validate": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--CopySwiftPackageResourcesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--GeneratedFilesTaskProducer": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--HeadermapTaskProducer": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--InfoPlistTaskProducer": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--ModuleMapTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--ProductPostprocessingTaskProducer": {"tool":"phony","inputs":["","","","","","","","","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--ProductStructureTaskProducer": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--SanitizerTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--StubBinaryTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--SwiftStandardLibrariesTaskProducer": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--TestTargetPostprocessingTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--TestTargetTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--VersionPlistTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--XCFrameworkTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--begin-compiling": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--end": {"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc","","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--entry": {"tool":"phony","inputs":["","","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--generated-headers": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--immediate": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--modules-ready": {"tool":"phony","inputs":["","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase0--cp--check-pods-manifest-lock": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase1-run-script": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase2-compile-sources": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase4-copy-bundle-resources": {"tool":"phony","inputs":["","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase5-copy-files": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase6-thin-binary": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase7--cp--embed-pods-frameworks": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"outputs":[""]} + "Gate target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49--phase8--cp--copy-pods-resources": {"tool":"phony","inputs":["","","","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"outputs":[""]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CodeSign /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"shell","description":"CodeSign /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent","","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/_CodeSignature",""],"args":["/usr/bin/codesign","--force","--sign","-","--entitlements","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent","--timestamp=none","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app"],"env":{"CODESIGN_ALLOCATE":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"},"can-safely-interrupt":false,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","signature":"b7a415db8f66c474c9191bfa55b1a0b7"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileAssetCatalog /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets": {"tool":"shell","description":"CompileAssetCatalog /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets/","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Assets.car"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/actool","--output-format","human-readable-text","--notices","--warnings","--export-dependency-info","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_dependencies","--output-partial-info-plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","--app-icon","AppIcon","--compress-pngs","--enable-on-demand-resources","YES","--filter-for-device-model","iPhone12,1","--filter-for-device-os-version","13.4.1","--sticker-pack-identifier-prefix","com.o1298098.movies.sticker-pack.","--development-region","en","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--platform","iphonesimulator","--product-type","com.apple.product-type.application","--compile","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Assets.xcassets"],"env":{},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_dependencies"],"deps-style":"dependency-info","signature":"c58a00ec9192e4733f7bf5e6e17a9b23"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-fobjc-abi-version=2","-fobjc-legacy-dispatch","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/AppDelegate.m","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.d"],"deps-style":"makefile","signature":"8a7fb9eb7c96b631505b57bfc131d31d"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-fobjc-abi-version=2","-fobjc-legacy-dispatch","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GeneratedPluginRegistrant.m","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.d"],"deps-style":"makefile","signature":"0729f6452ec8c93db47bd4a844c27e9f"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c normal x86_64 c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c normal x86_64 c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Werror=deprecated-objc-isa-usage","-Werror=objc-root-class","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.d"],"deps-style":"makefile","signature":"12708ea9868440399df8549f9a22e8c8"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m","","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","objective-c","-target","x86_64-apple-ios10.0-simulator","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-std=gnu99","-fobjc-arc","-fmodules","-gmodules","-fmodules-cache-path=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","-fmodules-prune-interval=86400","-fmodules-prune-after=345600","-fbuild-session-file=/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","-fmodules-validate-once-per-build-session","-Wnon-modular-include-in-framework-module","-Werror=non-modular-include-in-framework-module","-Wno-trigraphs","-fpascal-strings","-O0","-fno-common","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Werror=return-type","-Wunreachable-code","-Wno-implicit-atomic-properties","-Werror=deprecated-objc-isa-usage","-Wno-objc-interface-ivars","-Werror=objc-root-class","-Wno-arc-repeated-use-of-weak","-Wimplicit-retain-self","-Wduplicate-method-match","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wunused-function","-Wno-unused-label","-Wno-unused-parameter","-Wunused-variable","-Wunused-value","-Wempty-body","-Wuninitialized","-Wconditional-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wconstant-conversion","-Wint-conversion","-Wbool-conversion","-Wenum-conversion","-Wno-float-conversion","-Wnon-literal-null-conversion","-Wobjc-literal-conversion","-Wshorten-64-to-32","-Wpointer-sign","-Wno-newline-eof","-Wno-selector","-Wno-strict-selector-match","-Wundeclared-selector","-Wdeprecated-implementations","-DDEBUG=1","-DCOCOAPODS=1","-DDEBUG=1","-DGPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1","-DDEBUG=1","-DPB_FIELD_32BIT=1","-DPB_NO_PACKED_STRUCTS=1","-DPB_ENABLE_MALLOC=1","-DOBJC_OLD_DISPATCH_PROTOTYPES=0","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-fasm-blocks","-fstrict-aliasing","-Wprotocol","-Wdeprecated-declarations","-g","-Wno-sign-conversion","-Winfinite-recursion","-Wcomma","-Wblock-capture-autoreleasing","-Wstrict-prototypes","-Wno-semicolon-before-method-body","-fobjc-abi-version=2","-fobjc-legacy-dispatch","-index-store-path","/Users/hezhibin/Library/Developer/Xcode/DerivedData/Runner-examnunszqmutucwpskjiezibkpt/Index/DataStore","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","-iquote","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop","-I/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources","-I/Sources/FBLPromises/include","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources-normal/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/x86_64","-I/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-MMD","-MT","dependencies","-MF","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.d","--serialize-diagnostics","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.dia","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/main.m","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.d"],"deps-style":"makefile","signature":"bc677d1f1e0311c4f1de9cbff0180357"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/LaunchScreen.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"8024117da0da25606f83fa4d96ab1c82"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard": {"tool":"shell","description":"CompileStoryboard /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--output-partial-info-plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","--auto-activate-custom-fonts","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--compilation-directory","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Base.lproj/Main.storyboard"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"98ece48a61395b155809e0623b426cc7"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter/AppFrameworkInfo.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter/AppFrameworkInfo.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/AppFrameworkInfo.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GoogleService-Info.plist": {"tool":"copy-plist","description":"CopyPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GoogleService-Info.plist","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/GoogleService-Info.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CopySwiftLibs /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner","","",""],"outputs":[""],"deps":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/SwiftStdLibToolInputDependencies.dep"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:CreateBuildDirectory /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios": {"tool":"create-build-directory","description":"CreateBuildDirectory /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","inputs":[],"outputs":["","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:Ld /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner normal x86_64": {"tool":"shell","description":"Ld /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner normal x86_64","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_vers.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/AppDelegate.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/main.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/GeneratedPluginRegistrant.o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner","",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-target","x86_64-apple-ios10.0-simulator","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","-L/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-L/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk","-L/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock","-F/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks","-F/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","-filelist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-Xlinker","-rpath","-Xlinker","@loader_path/Frameworks","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-dead_strip","-Xlinker","-object_path_lto","-Xlinker","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_lto.o","-Xlinker","-export_dynamic","-Xlinker","-no_deduplicate","-Xlinker","-objc_abi_version","-Xlinker","2","-fobjc-arc","-fobjc-link-runtime","-ObjC","-lc++","-lsqlite3","-lz","-framework","AVFoundation","-framework","AppAuth","-framework","AudioToolbox","-framework","Braintree","-framework","BraintreeDropIn","-framework","CFNetwork","-framework","CardinalMobile","-framework","CoreGraphics","-framework","CoreLocation","-framework","CoreMedia","-framework","CoreTelephony","-framework","CoreText","-framework","CoreVideo","-framework","FBLPromises","-framework","FIRAnalyticsConnector","-framework","FMDB","-framework","FirebaseAnalytics","-framework","FirebaseAuth","-framework","FirebaseCore","-framework","FirebaseCoreDiagnostics","-framework","FirebaseFirestore","-framework","FirebaseInstallations","-framework","FirebaseInstanceID","-framework","FirebaseMessaging","-framework","FirebaseStorage","-framework","Flutter","-framework","Foundation","-framework","GTMAppAuth","-framework","GTMSessionFetcher","-framework","GoogleAppMeasurement","-framework","GoogleDataTransport","-framework","GoogleDataTransportCCTSupport","-framework","GoogleMobileAds","-framework","GoogleSignIn","-framework","GoogleUtilities","-framework","LocalAuthentication","-framework","MediaPlayer","-framework","MessageUI","-framework","MobileCoreServices","-framework","QuartzCore","-framework","SafariServices","-framework","Security","-framework","StoreKit","-framework","SystemConfiguration","-framework","UIKit","-framework","absl","-framework","cloud_firestore","-framework","firebase_admob","-framework","firebase_analytics","-framework","firebase_auth","-framework","firebase_core","-framework","firebase_messaging","-framework","firebase_storage","-framework","flutter_braintree","-framework","flutter_downloader","-framework","flutter_inappwebview","-framework","flutter_mdns_plugin","-framework","flutter_plugin_android_lifecycle","-framework","google_sign_in","-framework","grpc","-framework","grpcpp","-framework","image_picker","-framework","leveldb","-framework","nanopb","-framework","openssl_grpc","-framework","package_info","-framework","path_provider","-framework","permission_handler","-framework","protobuf","-framework","share_extend","-framework","shared_preferences","-framework","sqflite","-framework","url_launcher","-framework","video_player","-framework","wakelock","-framework","webview_media","-weak_framework","AdSupport","-weak_framework","AuthenticationServices","-weak_framework","Contacts","-weak_framework","JavaScriptCore","-weak_framework","SafariServices","-weak_framework","UserNotifications","-weak_framework","WebKit","-framework","Flutter","-Xlinker","-sectcreate","-Xlinker","__TEXT","-Xlinker","__entitlements","-Xlinker","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","-lsqlite3","-framework","Pods_Runner","-Xlinker","-dependency_info","-Xlinker","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_dependency_info.dat","-o","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Runner"],"env":{},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","deps":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner_dependency_info.dat"],"deps-style":"dependency-info","signature":"cddf67831af70fbadb46ebb5849cfcec"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:LinkStoryboards": {"tool":"shell","description":"LinkStoryboards","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Base.lproj/Main.storyboardc"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool","--errors","--warnings","--notices","--module","Runner","--target-device","iphone","--target-device","ipad","--minimum-deployment-target","10.0","--output-format","human-readable-text","--link","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen.storyboardc","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main.storyboardc"],"env":{"XCODE_DEVELOPER_USR_PATH":"/Applications/Xcode.app/Contents/Developer/usr/bin/.."},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"54bb90ec5b38498a38021e05bff75100"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:MkDir /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"mkdir","description":"MkDir /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Run Script /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"shell","description":"PhaseScriptExecution Run Script /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","AppIdentifierPrefix":"7U3JRV3K6W.","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","EXPANDED_CODE_SIGN_IDENTITY":"-","EXPANDED_CODE_SIGN_IDENTITY_NAME":"-","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_ENTITLEMENTS_SECTION":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TeamIdentifierPrefix":"7U3JRV3K6W.","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"540540736373e77e826f8c1e47b14d58"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Thin Binary /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"shell","description":"PhaseScriptExecution Thin Binary /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","AppIdentifierPrefix":"7U3JRV3K6W.","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","EXPANDED_CODE_SIGN_IDENTITY":"-","EXPANDED_CODE_SIGN_IDENTITY_NAME":"-","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_ENTITLEMENTS_SECTION":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TeamIdentifierPrefix":"7U3JRV3K6W.","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"b6315255083be4b82b2f94203a4d8886"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Check Pods Manifest.lock /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Podfile.lock/","/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Manifest.lock/","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt"],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","AppIdentifierPrefix":"7U3JRV3K6W.","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","EXPANDED_CODE_SIGN_IDENTITY":"-","EXPANDED_CODE_SIGN_IDENTITY_NAME":"-","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_ENTITLEMENTS_SECTION":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_0":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Podfile.lock","SCRIPT_INPUT_FILE_1":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Manifest.lock","SCRIPT_INPUT_FILE_COUNT":"2","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_0":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Pods-Runner-checkManifestLockResult.txt","SCRIPT_OUTPUT_FILE_COUNT":"1","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TeamIdentifierPrefix":"7U3JRV3K6W.","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"dd6ad8ed3ea8fac591e406be46d8aca5"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Copy Pods Resources /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Copy Pods Resources /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","AppIdentifierPrefix":"7U3JRV3K6W.","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","EXPANDED_CODE_SIGN_IDENTITY":"-","EXPANDED_CODE_SIGN_IDENTITY_NAME":"-","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_ENTITLEMENTS_SECTION":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TeamIdentifierPrefix":"7U3JRV3K6W.","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"21517dc752402cb0d20f1f17ab2d318e"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Embed Pods Frameworks /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"shell","description":"PhaseScriptExecution [CP] Embed Pods Frameworks /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"hezhibin","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"YES","ALWAYS_SEARCH_USER_PATHS":"NO","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"i386 x86_64","ARCHS_STANDARD_32_64_BIT":"i386 x86_64","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"i386 x86_64","ARCHS_UNIVERSAL_IPHONE_OS":"i386 x86_64","ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","AppIdentifierPrefix":"7U3JRV3K6W.","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"YES","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_FORMAT":"shallow","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Headers","CACHE_ROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CCHROOT":"/var/folders/0s/wkc_hf5n0zz4vkkxn1swl4780000gn/C/com.apple.DeveloperTools/11.4.1-11E503a/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_CXX_LANGUAGE_STANDARD":"gnu++0x","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_MODULES_BUILD_SESSION_FILE":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","CLASS_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"YES","CODE_SIGN_CONTEXT_CLASS":"XCiPhoneSimulatorCodeSignContext","CODE_SIGN_ENTITLEMENTS":"Runner/Runner.entitlements","CODE_SIGN_IDENTITY":"Apple Development","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","CODE_SIGN_STYLE":"Automatic","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/CompositeSDKs","COMPRESS_PNG_FILES":"YES","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","CONFIGURATION_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator","CONTENTS_FOLDER_PATH":"Runner.app","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"NO","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CORRESPONDING_DEVICE_PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform","CORRESPONDING_DEVICE_PLATFORM_NAME":"iphoneos","CORRESPONDING_DEVICE_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk","CORRESPONDING_DEVICE_SDK_NAME":"iphoneos13.4","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_PROJECT_VERSION":"1","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"YES","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mios-simulator-version-min","DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX":"-mios-simulator-version-min=","DEPLOYMENT_TARGET_LD_ENV_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"ios_simulator_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"IPHONEOS_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2 9.3 10.0 10.1 10.2 10.3 11.0 11.1 11.2 11.3 11.4 12.0 12.1 12.2 12.3 12.4 13.0 13.1 13.2 13.3 13.4","DERIVED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"en","DEVELOPMENT_TEAM":"7U3JRV3K6W","DOCUMENTATION_FOLDER_PATH":"Runner.app/en.lproj/Documentation","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/Runner.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"Runner.app.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","EFFECTIVE_PLATFORM_NAME":"-iphonesimulator","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"YES","ENABLE_PREVIEWS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","ENABLE_TESTING_SEARCH_PATHS":"NO","ENTITLEMENTS_DESTINATION":"__entitlements","ENTITLEMENTS_REQUIRED":"YES","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLES_FOLDER_PATH":"Runner.app/Executables","EXECUTABLE_FOLDER_PATH":"Runner.app","EXECUTABLE_NAME":"Runner","EXECUTABLE_PATH":"Runner.app/Runner","EXPANDED_CODE_SIGN_IDENTITY":"-","EXPANDED_CODE_SIGN_IDENTITY_NAME":"-","FILE_LIST":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/FixedFiles","FLUTTER_APPLICATION_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie","FLUTTER_BUILD_DIR":"build","FLUTTER_BUILD_NAME":"1.0.0","FLUTTER_BUILD_NUMBER":"1","FLUTTER_FRAMEWORK_DIR":"/Users/hezhibin/flutter/bin/cache/artifacts/engine/ios","FLUTTER_ROOT":"/Users/hezhibin/flutter","FLUTTER_TARGET":"/Users/hezhibin/Projects/o1298098/flutter_movie/lib/main.dart","FRAMEWORKS_FOLDER_PATH":"Runner.app/Frameworks","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/../Flutter\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/FirebaseAnalytics/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleAppMeasurement/Frameworks\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/GoogleSignIn/Frameworks\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"Runner.app","GCC3_VERSION":"3.3","GCC_C_LANGUAGE_STANDARD":"gnu99","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_NO_COMMON_BLOCKS":"YES","GCC_OBJC_LEGACY_DISPATCH":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_PREPROCESSOR_DEFINITIONS":"DEBUG=1 COCOAPODS=1 DEBUG=1 GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 DEBUG=1 PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1","GCC_SYMBOLS_PRIVATE_EXTERN":"NO","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"YES","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/include \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/AppAuth/AppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BoringSSL-GRPC/openssl_grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Braintree/Braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/BraintreeDropIn/BraintreeDropIn.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FMDB/FMDB.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseAuth/FirebaseAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCore/FirebaseCore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseFirestore/FirebaseFirestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstallations/FirebaseInstallations.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseInstanceID/FirebaseInstanceID.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseMessaging/FirebaseMessaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/FirebaseStorage/FirebaseStorage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransport/GoogleDataTransport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/GoogleUtilities/GoogleUtilities.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/PromisesObjC/FBLPromises.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Protobuf/protobuf.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/abseil/absl.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/cloud_firestore/cloud_firestore.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_admob/firebase_admob.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_analytics/firebase_analytics.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_auth/firebase_auth.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_core/firebase_core.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_messaging/firebase_messaging.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/firebase_storage/firebase_storage.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_braintree/flutter_braintree.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_downloader/flutter_downloader.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_mdns_plugin/flutter_mdns_plugin.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-C++/grpcpp.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/gRPC-Core/grpc.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/google_sign_in/google_sign_in.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/image_picker/image_picker.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/leveldb-library/leveldb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/nanopb/nanopb.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/package_info/package_info.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/path_provider/path_provider.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/permission_handler/permission_handler.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/share_extend/share_extend.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/shared_preferences/shared_preferences.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/sqflite/sqflite.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/url_launcher/url_launcher.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/video_player/video_player.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/wakelock/wakelock.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/webview_media/webview_media.framework/Headers\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/Firebase\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAnalyticsInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseAuthInterop\" \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Headers/Public/FirebaseCoreDiagnosticsInterop\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Firebase/CoreOnly/Sources \"/Sources/FBLPromises/include\"","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/hezhibin","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_FILE":"Runner/Info.plist","INFOPLIST_OUTPUT_FORMAT":"binary","INFOPLIST_PATH":"Runner.app/Info.plist","INFOPLIST_PREPROCESS":"NO","INFOSTRINGS_PATH":"Runner.app/en.lproj/InfoPlist.strings","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/Runner.dst/Applications","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"hezhibin","INSTALL_PATH":"/Applications","INSTALL_ROOT":"/tmp/Runner.dst","IPHONEOS_DEPLOYMENT_TARGET":"10.0","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FOLDER_PATH":"Runner.app/Java","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch/Runner_dependency_info.dat","LD_ENTITLEMENTS_SECTION":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LD_RUNPATH_SEARCH_PATHS":" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator \"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods/Braintree/BraintreePayPal/PayPalDataCollector/Risk\" /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Flutter","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"ios10.0","LLVM_TARGET_TRIPLE_SUFFIX":"-simulator","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app/en.lproj","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","LOCSYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","MACH_O_TYPE":"mh_execute","MAC_OS_X_PRODUCT_BUILD_VERSION":"19E287","MAC_OS_X_VERSION_ACTUAL":"101504","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1504","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","MODULES_FOLDER_PATH":"Runner.app/Modules","MODULE_CACHE_DIR":"/Users/hezhibin/Library/Developer/Xcode/DerivedData/ModuleCache.noindex","MTL_ENABLE_DEBUG_INFO":"YES","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJC_ABI_VERSION":"2","OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects","OBJECT_FILE_DIR_normal":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","OBJROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","OTHER_LDFLAGS":" -ObjC -l\"c++\" -l\"sqlite3\" -l\"z\" -framework \"AVFoundation\" -framework \"AppAuth\" -framework \"AudioToolbox\" -framework \"Braintree\" -framework \"BraintreeDropIn\" -framework \"CFNetwork\" -framework \"CardinalMobile\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"CoreVideo\" -framework \"FBLPromises\" -framework \"FIRAnalyticsConnector\" -framework \"FMDB\" -framework \"FirebaseAnalytics\" -framework \"FirebaseAuth\" -framework \"FirebaseCore\" -framework \"FirebaseCoreDiagnostics\" -framework \"FirebaseFirestore\" -framework \"FirebaseInstallations\" -framework \"FirebaseInstanceID\" -framework \"FirebaseMessaging\" -framework \"FirebaseStorage\" -framework \"Flutter\" -framework \"Foundation\" -framework \"GTMAppAuth\" -framework \"GTMSessionFetcher\" -framework \"GoogleAppMeasurement\" -framework \"GoogleDataTransport\" -framework \"GoogleDataTransportCCTSupport\" -framework \"GoogleMobileAds\" -framework \"GoogleSignIn\" -framework \"GoogleUtilities\" -framework \"LocalAuthentication\" -framework \"MediaPlayer\" -framework \"MessageUI\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"SafariServices\" -framework \"Security\" -framework \"StoreKit\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"absl\" -framework \"cloud_firestore\" -framework \"firebase_admob\" -framework \"firebase_analytics\" -framework \"firebase_auth\" -framework \"firebase_core\" -framework \"firebase_messaging\" -framework \"firebase_storage\" -framework \"flutter_braintree\" -framework \"flutter_downloader\" -framework \"flutter_inappwebview\" -framework \"flutter_mdns_plugin\" -framework \"flutter_plugin_android_lifecycle\" -framework \"google_sign_in\" -framework \"grpc\" -framework \"grpcpp\" -framework \"image_picker\" -framework \"leveldb\" -framework \"nanopb\" -framework \"openssl_grpc\" -framework \"package_info\" -framework \"path_provider\" -framework \"permission_handler\" -framework \"protobuf\" -framework \"share_extend\" -framework \"shared_preferences\" -framework \"sqflite\" -framework \"url_launcher\" -framework \"video_player\" -framework \"wakelock\" -framework \"webview_media\" -weak_framework \"AdSupport\" -weak_framework \"AuthenticationServices\" -weak_framework \"Contacts\" -weak_framework \"JavaScriptCore\" -weak_framework \"SafariServices\" -weak_framework \"UserNotifications\" -weak_framework \"WebKit\" -framework Flutter","OTHER_SWIFT_FLAGS":" -D COCOAPODS","PACKAGE_TYPE":"com.apple.package-type.wrapper.application","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PBDEVELOPMENTPLIST_PATH":"Runner.app/pbdevelopment.plist","PER_ARCH_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PkgInfo","PKGINFO_PATH":"Runner.app/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform","PLATFORM_DISPLAY_NAME":"iOS Simulator","PLATFORM_FAMILY_NAME":"iOS","PLATFORM_NAME":"iphonesimulator","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"17E8258","PLIST_FILE_OUTPUT_FORMAT":"binary","PLUGINS_FOLDER_PATH":"Runner.app/PlugIns","PODS_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PODS_CONFIGURATION_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","PODS_PODFILE_DIR_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/.","PODS_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Pods","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRIVATE_HEADERS_FOLDER_PATH":"Runner.app/PrivateHeaders","PRODUCT_BUNDLE_IDENTIFIER":"com.o1298098.movies","PRODUCT_BUNDLE_PACKAGE_TYPE":"APPL","PRODUCT_MODULE_NAME":"Runner","PRODUCT_NAME":"Runner","PRODUCT_SETTINGS_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","PRODUCT_TYPE":"com.apple.product-type.application","PROFILING_CODE":"NO","PROJECT":"Runner","PROJECT_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/DerivedSources","PROJECT_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","PROJECT_FILE_PATH":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner.xcodeproj","PROJECT_NAME":"Runner","PROJECT_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build","PROJECT_TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","PUBLIC_HEADERS_FOLDER_PATH":"Runner.app/Headers","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources","REZ_OBJECTS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPTS_FOLDER_PATH":"Runner.app/Scripts","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_DIR_iphonesimulator13_4":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.4.sdk","SDK_NAME":"iphonesimulator13.4","SDK_NAMES":"iphonesimulator13.4","SDK_PRODUCT_BUILD_VERSION":"17E8258","SDK_VERSION":"13.4","SDK_VERSION_ACTUAL":"130400","SDK_VERSION_MAJOR":"130000","SDK_VERSION_MINOR":"400","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"YES","SHARED_DERIVED_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/DerivedSources","SHARED_FRAMEWORKS_FOLDER_PATH":"Runner.app/SharedFrameworks","SHARED_PRECOMPS_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/SharedPrecompiledHeaders","SHARED_SUPPORT_FOLDER_PATH":"Runner.app/SharedSupport","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","SRCROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","STRINGS_FILE_OUTPUT_ENCODING":"binary","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_DEVICE_FAMILIES":"1,2","SUPPORTED_PLATFORMS":"iphoneos iphonesimulator","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_OBJC_BRIDGING_HEADER":"Runner-Bridging-Header.h","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_PLATFORM_TARGET_PREFIX":"ios","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.SwiftFileList","SWIFT_VERSION":"5.0","SYMROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETED_DEVICE_FAMILY":"1,2","TARGETNAME":"Runner","TARGET_BUILD_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator","TARGET_DEVICE_IDENTIFIER":"C3BCA272-00F9-4B15-89B0-1CCDFC079E02","TARGET_DEVICE_MODEL":"iPhone12,1","TARGET_DEVICE_OS_VERSION":"13.4.1","TARGET_NAME":"Runner","TARGET_TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILES_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_FILE_DIR":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build","TEMP_ROOT":"/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TRACK_WIDGET_CREATION":"true","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","TeamIdentifierPrefix":"7U3JRV3K6W.","UID":"501","UNLOCALIZED_RESOURCES_FOLDER_PATH":"Runner.app","UNSTRIPPED_PRODUCT":"NO","USER":"hezhibin","USER_APPS_DIR":"/Users/hezhibin/Applications","USER_LIBRARY_DIR":"/Users/hezhibin/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSIONING_SYSTEM":"apple-generic","VERSIONPLIST_PATH":"Runner.app/version.plist","VERSION_INFO_BUILDER":"hezhibin","VERSION_INFO_FILE":"Runner_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:Runner PROJECT:Runner-1\"","WRAPPER_EXTENSION":"app","WRAPPER_NAME":"Runner.app","WRAPPER_SUFFIX":".app","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E503a","XCODE_VERSION_ACTUAL":"1141","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1140","XPCSERVICES_FOLDER_PATH":"Runner.app/XPCServices","YACC":"yacc","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","control-enabled":false,"signature":"aba0656fcc758bb4d60b691c301d4279"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessInfoPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist": {"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist /Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/ios/Runner/Info.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/LaunchScreen-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Base.lproj/Main-SBPartialInfo.plist","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/assetcatalog_generated_info.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app/Info.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessProductPackaging /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent": {"tool":"process-product-entitlements","description":"ProcessProductPackaging /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app-Simulated.xcent"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessProductPackaging /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent": {"tool":"process-product-entitlements","description":"ProcessProductPackaging /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist","",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.app.xcent"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:RegisterExecutionPolicyException /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""],"outputs":[""]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:Touch /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app": {"tool":"shell","description":"Touch /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","inputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Debug-iphonesimulator/Runner.app"],"env":{},"working-directory":"/Users/hezhibin/Projects/o1298098/flutter_movie/ios","signature":"935e8582d9075a2b36f750d74519c052"} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements-Simulated.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Entitlements.plist"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/DerivedSources/Runner_vers.c"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/x86_64/Runner.LinkFileList"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-non-framework-target-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-all-target-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-generated-files.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-own-target-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner-project-headers.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Runner.hmap"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-489AAC4A396A2A6CA857B38C.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-8D14BB61F9C4CDF213DDBE56.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-9740EEB61CF901F6004384FC.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/Script-A0BD7956FDE77326B4BA1FD5.sh"]} + "target-Runner-a837515a932e795262cd2c38c41785c988a783a885d8b0b3beb2e9f90bde3f49-:Debug:WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml","inputs":["",""],"outputs":["/Users/hezhibin/Projects/o1298098/flutter_movie/build/ios/Runner.build/Debug-iphonesimulator/Runner.build/all-product-headers.yaml"]} + diff --git a/lib/actions/adapt.dart b/lib/actions/adapt.dart new file mode 100644 index 00000000..37ed82eb --- /dev/null +++ b/lib/actions/adapt.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +class Adapt { + static MediaQueryData mediaQuery; + static double _width; + static double _height; + static double _topbarH; + static double _botbarH; + static double _pixelRatio; + static var _ratio; + static initContext(BuildContext context) { + if (mediaQuery == null) { + mediaQuery = MediaQuery.of(context); + _width = mediaQuery.size.width; + _height = mediaQuery.size.height; + _topbarH = mediaQuery.padding.top; + _botbarH = mediaQuery.padding.bottom; + _pixelRatio = mediaQuery.devicePixelRatio; + } + } + + static init(int number) { + int uiwidth = number is int ? number : 750; + _ratio = _width / uiwidth; + } + + static px(number) { + if (!(_ratio is double || _ratio is int)) { + Adapt.init(750); + } + return number * _ratio; + } + + static onepx() { + return 1 / _pixelRatio; + } + + static screenW() { + return _width; + } + + static screenH() { + return _height; + } + + static padTopH() { + return _topbarH; + } + + static padBotH() { + return _botbarH; + } +} diff --git a/lib/actions/ads_config.dart b/lib/actions/ads_config.dart new file mode 100644 index 00000000..2e34cf91 --- /dev/null +++ b/lib/actions/ads_config.dart @@ -0,0 +1,22 @@ +import 'dart:io'; + +import 'package:firebase_admob/firebase_admob.dart'; + +class AdsConfig { + AdsConfig._(); + + static final AdsConfig _instance = AdsConfig._(); + static AdsConfig get instance => _instance; + + final MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo( + //testDevices: testDevice != null ? [testDevice] : null, + keywords: ['movie', 'tv'], + contentUrl: '', + childDirected: true, + nonPersonalizedAds: true, + ); + + final String unitId = Platform.isAndroid + ? 'ca-app-pub-8117211796129035/4564399847' + : 'ca-app-pub-8117211796129035/6998991498'; +} diff --git a/lib/actions/api/base_api.dart b/lib/actions/api/base_api.dart new file mode 100644 index 00000000..1aabad9a --- /dev/null +++ b/lib/actions/api/base_api.dart @@ -0,0 +1,627 @@ +import 'package:movie/actions/app_config.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/enums/premium_type.dart'; +import 'package:movie/models/models.dart'; + +import 'request.dart'; + +class BaseApi { + BaseApi._(); + static final BaseApi _instance = BaseApi._(); + static BaseApi get instance => _instance; + + final Request _http = Request(AppConfig.instance.baseApiHost); + + Future> updateUser(String uid, String email, + String photoUrl, String userName, String phone) async { + final String _url = '/Users'; + final _data = { + "phone": phone, + "email": email, + "photoUrl": photoUrl, + "userName": userName, + "uid": uid + }; + return await _http.request(_url, method: "POST", data: _data); + } + + Future> getUserList(String uid, + {int page = 1, int pageSize = 20}) async { + final String _url = '/UserLists/User/$uid?page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> createUserList(UserList d) async { + final String _url = '/UserLists'; + final data = { + "id": 0, + "updateTime": DateTime.now().toString(), + "createTime": DateTime.now().toString(), + "runTime": 0, + "totalRated": 0, + "selected": 0, + "revenue": 0, + "itemCount": 0, + "description": d.description, + "backGroundUrl": d.backGroundUrl, + "uid": d.uid, + "listName": d.listName + }; + return await _http.request(_url, method: 'POST', data: data); + } + + Future> deleteUserList(int listid) async { + final String _url = '/UserLists/$listid'; + return await _http.request(_url, method: 'DELETE'); + } + + Future> addUserListDetail(UserListDetail d) async { + final String _url = '/UserListDetails'; + final data = { + "id": 0, + "photoUrl": d.photoUrl, + "mediaName": d.mediaName, + "mediaType": d.mediaType, + "mediaid": d.mediaid, + "listid": d.listid, + "rated": d.rated, + "runTime": d.runTime, + "revenue": d.revenue + }; + return await _http.request(_url, method: 'POST', data: data); + } + + Future> getUserListDetailItem( + int listid, String mediaType, int mediaid) async { + final String _url = '/UserListDetails/$listid/$mediaType/$mediaid'; + final r = await _http.request(_url); + return r; + } + + Future> getUserListDetailItems(int listid, + {int page = 1, int pageSize = 20}) async { + final String _url = + '/UserListDetails/List/$listid?page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> updateUserList(UserList list) async { + final String _url = '/UserLists/${list.id}'; + final data = { + "id": list.id, + "updateTime": DateTime.now().toString(), + "createTime": list.createTime, + "runTime": list.runTime, + "totalRated": list.totalRated, + "selected": 0, + "revenue": list.revenue, + "itemCount": list.itemCount, + "description": list.description, + "backGroundUrl": list.backGroundUrl, + "uid": list.uid, + "listName": list.listName + }; + return await _http.request(_url, method: 'PUT', data: data); + } + + Future> getCastListDetail(int listId, + {int page = 1, int pageSize = 20}) async { + final String _url = + '/CastList/$listId/detail?page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> addCast(BaseCast cast) async { + final String _url = '/CastList/addCast'; + final _data = { + "listId": cast.listId, + "Name": cast.name, + "castId": cast.castId, + "profileUrl": cast.profileUrl + }; + final r = await _http.request(_url, method: 'POST', data: _data); + return r; + } + + Future> deleteCast(int id) async { + final String _url = '/CastList/detail/$id'; + final r = await _http.request(_url, method: 'DELETE'); + return r; + } + + Future> getAccountState( + String uid, int mediaId, MediaType type) async { + final String _url = + '/UserAccountStates/$uid/${type.toString().split('.').last}/$mediaId'; + final r = await _http.request(_url); + return r; + } + + Future> updateAccountState(AccountState d) async { + final String _url = '/UserAccountStates'; + final data = { + 'id': d.id, + 'mediaType': d.mediaType, + 'watchlist': d.watchlist ? 1 : 0, + 'rated': d.rated, + 'favorite': d.favorite ? 1 : 0, + 'mediaId': d.mediaId, + 'uid': d.uid + }; + final r = + await _http.request(_url, method: 'POST', data: data); + return r; + } + + Future> setFavorite(UserMedia d) async { + final String _url = '/UserFavorite'; + final _data = { + 'id': 0, + 'uid': d.uid, + 'mediaId': d.mediaId, + 'name': d.name, + 'genre': d.genre, + 'overwatch': d.overwatch, + 'photoUrl': d.photoUrl, + 'rated': d.rated, + 'ratedCount': d.ratedCount, + 'popular': d.popular, + 'mediaType': d.mediaType, + 'releaseDate': d.releaseDate, + 'createDate': DateTime.now().toString(), + }; + final r = await _http.request(_url, method: 'POST', data: _data); + return r; + } + + Future> getFavorite( + String uid, String mediaType, + {int page = 1, int pageSize = 20}) async { + final String _url = + '/UserFavorite/$uid?mediaType=$mediaType&page=$page&pageSize=$pageSize'; + final r = await _http.request(_url, + cached: true, cacheDuration: Duration(days: 0)); + return r; + } + + Future> deleteFavorite( + String uid, MediaType type, int mediaId) async { + final String _url = + '/UserFavorite/$uid/${type.toString().split('.').last}/$mediaId'; + final r = await _http.request(_url, method: 'DELETE'); + return r; + } + + Future> setWatchlist(UserMedia d) async { + final String _url = '/UserWatchlist'; + final _data = { + 'id': 0, + 'uid': d.uid, + 'mediaId': d.mediaId, + 'name': d.name, + 'genre': d.genre, + 'overwatch': d.overwatch, + 'photoUrl': d.photoUrl, + 'rated': d.rated, + 'ratedCount': d.ratedCount, + 'popular': d.popular, + 'mediaType': d.mediaType, + 'releaseDate': d.releaseDate, + 'createDate': DateTime.now().toString(), + }; + final r = await _http.request(_url, method: 'POST', data: _data); + return r; + } + + Future> getWatchlist( + String uid, String mediaType, + {int page = 1, int pageSize = 20}) async { + final String _url = + '/UserWatchlist/$uid?mediaType=$mediaType&page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> deleteWatchlist( + String uid, MediaType type, int mediaId) async { + final String _url = + '/UserWatchlist/$uid/${type.toString().split('.').last}/$mediaId'; + final r = await _http.request(_url, method: 'DELETE'); + return r; + } + + Future> getMovies( + {int page = 1, int pageSize = 20}) async { + final String _url = '/Movies?page=$page&pageSize=$pageSize'; + final r = await _http.request(_url, + cached: true, cacheDuration: Duration(days: 0)); + return r; + } + + Future> searchMovies(String query, + {int page = 1, int pageSize = 20}) async { + final String _url = + '/Movies/Search?name=$query&page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> getMovieStreamLinks( + int movieid) async { + final String _url = '/MovieStreamLinks/MovieId/$movieid'; + final r = await _http.request(_url); + return r; + } + + Future> hasMovieStreamLinks(int movieid) async { + String _url = '/MovieStreamLinks/Exist/$movieid'; + final _r = _http.request(_url); + return _r; + } + + Future> getMovieLikes( + {int movieid, String uid = ''}) async { + final String _url = '/Movies/Like/$movieid?uid=$uid'; + final r = await _http.request(_url); + return r; + } + + Future> likeMovie(MovieLikeModel like) async { + final String _url = '/Movies/Like'; + final _data = {'id': 0, 'movieId': like.movieId ?? 0, 'uid': like.uid}; + final r = + await _http.request(_url, method: "POST", data: _data); + return r; + } + + Future> unlikeMovie(MovieLikeModel like) async { + final String _url = '/Movies/Like'; + final _data = {'id': 0, 'movieId': like.movieId ?? 0, 'uid': like.uid}; + final r = await _http.request(_url, + method: "DELETE", data: _data); + return r; + } + + Future> getTvShows( + {int page = 1, int pageSize = 20}) async { + final String _url = '/TvShows?page=$page&pageSize=$pageSize'; + final r = await _http.request(_url, + cached: true, cacheDuration: Duration(days: 0)); + return r; + } + + Future> searchTvShows(String query, + {int page = 1, int pageSize = 20}) async { + final String _url = '/TvShows/Search/$query&page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> getTvSeasonStreamLinks( + int tvid, int season) async { + final String _url = '/TvShowStreamLinks/$tvid/$season'; + final r = await _http.request(_url, + cached: true, cacheDuration: Duration(minutes: 10)); + return r; + } + + Future> getTvShowLikes( + {int tvid, int season = 0, int episode = 0, String uid = ''}) async { + final String _url = + '/TvShows/Like/$tvid?season=$season&episode=$episode&uid=$uid'; + final r = await _http.request(_url); + return r; + } + + Future> likeTvShow( + TvShowLikeModel like) async { + final String _url = '/TvShows/Like'; + final _data = { + 'id': 0, + 'tvId': like.tvId ?? 0, + 'season': like.season, + 'episode': like.episode, + 'uid': like.uid + }; + final r = + await _http.request(_url, method: "POST", data: _data); + return r; + } + + Future> unlikeTvShow( + TvShowLikeModel like) async { + final String _url = '/TvShows/Like'; + final _data = { + 'id': 0, + 'tvId': like.tvId ?? 0, + 'season': like.season, + 'episode': like.episode, + 'uid': like.uid + }; + final r = await _http.request(_url, + method: "DELETE", data: _data); + return r; + } + + Future> hasTvShowStreamLinks(int tvid) async { + String _url = '/TvShowStreamLinks/Exist/$tvid'; + final _r = await _http.request(_url); + return _r; + } + + Future> hasTvSeasonStreamLinks( + int tvid, int season) async { + final String _url = '/TvShowStreamLinks/Exist/$tvid/$season'; + final _r = await _http.request(_url); + return _r; + } + + Future> createMovieComment( + MovieComment comment) async { + String _url = '/MovieComments'; + var _data = { + 'mediaId': comment.mediaId, + 'comment': comment.comment, + 'uid': comment.uid, + 'createTime': comment.createTime, + 'updateTime': comment.updateTime, + 'like': 0, + }; + return await _http.request(_url, method: 'POST', data: _data); + } + + Future> createTvShowComment( + TvShowComment comment) async { + final String _url = '/TvShowComments'; + final _data = { + 'mediaId': comment.mediaId, + 'comment': comment.comment, + 'uid': comment.uid, + 'createTime': comment.createTime, + 'updateTime': comment.updateTime, + 'like': comment.like, + 'season': comment.season, + 'episode': comment.episode + }; + final r = + await _http.request(_url, method: 'POST', data: _data); + return r; + } + + Future> getTvShowComments( + int tvid, int season, int episode, + {int page = 1, int pageSize = 40}) async { + final String _url = + '/TvShowComments/$tvid/$season/$episode?page=$page&pageSize=$pageSize'; + final r = await _http.request(_url); + return r; + } + + Future> getMovieComments(int movieid, + {int page = 1, int pageSize = 40}) async { + final String _url = '/MovieComments/$movieid'; + final r = await _http.request(_url); + return r; + } + + Future> sendStreamLinkReport( + StreamLinkReport report) async { + final String _url = '/Email/ReportEmail'; + final _data = { + 'mediaName': report.mediaName, + 'linkName': report.linkName, + 'content': report.content, + 'mediaId': report.mediaId, + 'streamLinkId': report.streamLinkId, + 'type': report.type, + 'streamLink': report.streamLink + }; + final r = await _http.request(_url, method: "POST", data: _data); + return r; + } + + Future> sendRequestStreamLink( + StreamLinkReport report) async { + final String _url = '/Email/RequestLinkEmail'; + final _data = { + 'mediaName': report.mediaName, + 'mediaId': report.mediaId, + 'type': report.type, + 'season': report.season + }; + final r = await _http.request(_url, method: "POST", data: _data); + return r; + } + + Future> getPaymentToken(String userId) async { + final String _url = '/Payment/ClientToken/$userId'; + final _r = await _http.request(_url); + return _r; + } + + Future> transactionSearch(String userId, + {DateTime begin, DateTime end}) async { + final String _url = '/payment/TransactionSearch/$userId'; + final _r = await _http.request(_url); + return _r; + } + + Future> getBraintreeCustomer( + String userId) async { + final String _url = '/payment/Customer/$userId'; + final _r = await _http.request(_url); + return _r; + } + + Future> updateCreditCard( + String token, dynamic creditCardRequest) async { + String _url = '/payment/CreditCard'; + var _r = await _http.request(_url, method: 'PUT', data: creditCardRequest); + return _r; + } + + Future> createPurchase(Purchase purchase) async { + String _url = '/payment/CreatePurchase'; + var _r = await _http.request(_url, method: 'POST', data: { + 'userId': purchase.userId, + 'amount': purchase.amount, + 'paymentMethodNonce': purchase.paymentMethodNonce, + 'deviceData': purchase.deviceData + }); + return _r; + } + + Future> createPremiumPurchase( + Purchase purchase, PremiumType type) async { + final String _url = '/payment/CreatePremiumPurchase'; + final _r = + await _http.request(_url, method: 'POST', data: { + 'userId': purchase.userId, + 'amount': purchase.amount, + 'paymentMethodNonce': purchase.paymentMethodNonce, + 'deviceData': purchase.deviceData, + 'premiumType': type.toString().split('.').last + }); + return _r; + } + + Future> getUserPremium(String uid) async { + final String _url = '/users/UserPremium/$uid'; + final _r = await _http.request(_url); + return _r; + } + + Future> createPremiumSubscription( + Purchase purchase, PremiumType type) async { + final String _url = '/payment/CreateSubscription'; + final _r = + await _http.request(_url, method: 'POST', data: { + 'userId': purchase.userId, + 'amount': purchase.amount, + 'paymentMethodNonce': purchase.paymentMethodNonce, + 'deviceData': purchase.deviceData, + 'premiumType': type.toString().split('.').last + }); + return _r; + } + + Future> getPremiumSubscription( + String id) async { + final String _url = '/Payment/Subscription/$id'; + final _r = await _http.request(_url); + return _r; + } + + Future> cancelSubscription( + UserPremiumData userPremium) async { + final String _url = '/Payment/CancelSubscription'; + final _r = await _http.request(_url, + method: 'POST', data: userPremium.toString()); + return _r; + } + + Future createBillAddress(BillingAddress address) async { + BillingAddress _model; + final String _url = '/Payment/Customer/BillingAddress'; + final _r = await _http.request(_url, method: 'POST', data: { + 'customerID': address.customerId, + 'address': { + 'firstName': address.firstName, + 'lastName': address.lastName, + 'company': address.company, + 'countryName': address.countryName, + 'locality': address.locality, + 'extendedAddress': address.extendedAddress, + 'region': address.region, + 'postalCode': address.postalCode, + 'streetAddress': address.streetAddress, + }, + }); + if (_r.result) if (_r.result['status']) + _model = BillingAddress(_r.result['data']); + return _model; + } + + Future updateBillAddress(BillingAddress address) async { + BillingAddress _model; + String _url = '/Payment/Customer/BillingAddress'; + var _r = await _http.request(_url, method: 'PUT', data: { + 'customerID': address.customerId, + 'addressID': address.id, + 'address': { + 'firstName': address.firstName, + 'lastName': address.lastName, + 'company': address.company, + 'countryName': address.countryName, + 'locality': address.locality, + 'extendedAddress': address.extendedAddress, + 'region': address.region, + 'postalCode': address.postalCode, + 'streetAddress': address.streetAddress, + }, + }); + if (_r.success) if (_r.result['status']) + _model = BillingAddress(_r.result['data']); + return _model; + } + + Future deleteBillAddress(BillingAddress address) async { + BillingAddress _model; + String _url = '/Payment/Customer/BillingAddress'; + var _r = await _http.request(_url, + method: 'DELETE', + data: {'customerID': address.customerId, 'addressID': address.id}); + if (_r.success) if (_r.result['status']) + _model = BillingAddress(_r.result['data']); + return _model; + } + + Future> createCreditCard(CreditCard card) async { + final String _url = '/Payment/CreditCard'; + final _r = await _http.request(_url, method: 'POST', data: { + 'customerID': card.customerId, + 'cardholderName': card.cardholderName, + 'cvv': card.bin, + 'number': card.maskedNumber, + 'expirationMonth': card.expirationMonth, + 'expirationYear': card.expirationYear, + }); + return _r; + } + + Future> getVideoSpiderMovie(int movieId) async { + final String _url = '/videoSpider/movie?movieId=$movieId'; + final _r = await _http.request(_url); + return _r; + } + + Future> getVideoSpiderTvShow( + int tvId, int season, int epsiode) async { + final String _url = + '/videoSpider/tvshow?tvId=$tvId&season=$season&episode=$epsiode'; + final _r = await _http.request(_url); + return _r; + } + + Future> getUserAccountInfo(String uid) async { + final String _url = '/Users/$uid/AccountInfo'; + final _r = await _http.request(_url); + return _r; + } + + Future> subscribeTpoic( + TopicSubscription topic) async { + final _url = '/Topic/Subscribe'; + final _data = { + 'topicId': topic.topicId, + 'cloudMessagingToken': topic.cloudMessagingToken, + 'localCode': topic.localCode + }; + final _result = await _http.request(_url, + method: 'POST', data: _data); + return _result; + } +} diff --git a/lib/actions/api/github_api.dart b/lib/actions/api/github_api.dart new file mode 100644 index 00000000..5071d714 --- /dev/null +++ b/lib/actions/api/github_api.dart @@ -0,0 +1,16 @@ +import 'package:movie/models/models.dart'; + +import 'request.dart'; + +class GithubApi { + GithubApi._(); + static final GithubApi _instance = GithubApi._(); + static GithubApi get instance => _instance; + final Request _http = Request('https://api.github.com'); + + Future> checkUpdate() async { + final String _parma = '/repos/tejasw/tmovies/releases/latest'; + final _result = await _http.request(_parma); + return _result; + } +} diff --git a/lib/actions/api/graphql_client.dart b/lib/actions/api/graphql_client.dart new file mode 100644 index 00000000..e536240a --- /dev/null +++ b/lib/actions/api/graphql_client.dart @@ -0,0 +1,180 @@ +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/actions/app_config.dart'; +import 'package:movie/actions/api/graphql_service.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; + +class BaseGraphQLClient { + BaseGraphQLClient._(); + + static final BaseGraphQLClient _instance = BaseGraphQLClient._(); + static BaseGraphQLClient get instance => _instance; + final GraphQLService _service = GraphQLService() + ..setupClient( + httpLink: AppConfig.instance.graphQLHttpLink, + webSocketLink: AppConfig.instance.graphQlWebSocketLink); + + Stream castListSubscription(String uid) { + String _sub = ''' + subscription castList{ + castList(uid:"$uid"){ + id + uid + name + updateTime + createTime + castCount + backgroundUrl + description + } + }'''; + + return _service.subscribe(_sub, operationName: 'castList'); + } + + Future addCastList(BaseCastList list) { + String _query = ''' + mutation { + cast{ + addList( + castList: { + uid: "${list.uid}" + updateTime: "${list.updateTime.toString()}" + createTime: "${list.createTime.toString()}" + name: "${list.name}" + description: "${list.description ?? ''}" + backgroundUrl: "${list.backgroundUrl ?? ''}" + } + ) { + id + } + } + } + '''; + + return _service.mutate(_query); + } + + Future getMovieLiked(int movieId, String uid) { + String _query = ''' + { + movie{ + userLiked(id:$movieId,uid:"$uid") + } + } + '''; + return _service.mutate(_query); + } + + Future getTvShowLiked(int tvId, String uid) { + String _query = ''' + { + tvshow{ + userLiked(id:$tvId,uid:"$uid") + } + } + '''; + return _service.mutate(_query); + } + + Future updateCastList(BaseCastList list) { + String _query = ''' + mutation { + cast{ + updateList( + castList: { + id:${list.id} + uid: "${list.uid}" + updateTime: "${DateTime.now().toString()}" + createTime: "${list.createTime.toString()}" + name: "${list.name}" + description: "${list.description ?? ''}" + backgroundUrl: "${list.backgroundUrl ?? ''}" + castCount:${list.castCount} + } + ) { + id + } + } + } + '''; + + return _service.mutate(_query); + } + + Future deleteCastList(int listId) { + String _query = ''' + mutation { + cast{ + removeList(castListId:$listId){ + id + } + } + } + '''; + + return _service.mutate(_query); + } + + Future addCast(BaseCastList list, BaseCast cast) { + String _query = ''' + mutation { + cast{ + addCast( + cast: { + listId: ${cast.listId} + name: "${cast.name}" + castId: ${cast.castId} + profileUrl: "${cast.profileUrl}" + updateTime:"${DateTime.now().toString()}" + } + ) { + id + } + } + } + '''; + + return _service.mutate(_query); + } + + Future deleteCast(int id, BaseCastList list) { + String _query = ''' + mutation { + cast { + deleteCast(id: $id) { + id + } + updateList( + castList: { + id:${list.id} + uid: "${list.uid}" + updateTime: "${DateTime.now().toString()}" + createTime: "${list.createTime.toString()}" + name: "${list.name}" + description: "${list.description ?? ''}" + backgroundUrl: "${list.backgroundUrl ?? ''}" + castCount:${list.castCount - 1} + } + ) { + id + } + } + } + '''; + + return _service.mutate(_query); + } + + Stream tvShowCommentSubscription(int id) { + String _sub = ''' + subscription tvComment{ + comment: tvShowCommentList(id:$id){ + id + comment + } + }'''; + + return _service.subscribe(_sub, operationName: 'tvComment'); + } +} diff --git a/lib/actions/api/graphql_service.dart b/lib/actions/api/graphql_service.dart new file mode 100644 index 00000000..11522f1e --- /dev/null +++ b/lib/actions/api/graphql_service.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:graphql/client.dart'; + +class GraphQLService { + HttpLink _httpLink; + WebSocketLink _webSocketLink; + InMemoryCache cache = InMemoryCache(); + GraphQLClient _httpClient; + GraphQLClient _websocketClient; + void setupClient( + {@required String httpLink, @required String webSocketLink}) { + /*final AuthLink authLink = AuthLink( + getToken: () => token + );*/ + + _httpLink = HttpLink( + uri: httpLink, + ); + _webSocketLink = WebSocketLink( + url: webSocketLink, + config: SocketClientConfig( + autoReconnect: true, + inactivityTimeout: const Duration(minutes: 5), + )); + + //Link httpLink = authLink.concat(_httpLink); + //Link webSocketLink = authLink.concat(_webSocketLink); + + _httpClient = GraphQLClient(link: _httpLink, cache: cache); + _websocketClient = GraphQLClient(link: _webSocketLink, cache: cache); + } + + Future query(String query, {Map variables}) { + return _httpClient + .query(QueryOptions(documentNode: gql(query), variables: variables)); + } + + Future mutate(String mutation, + {Map variables}) { + return _httpClient.mutate( + MutationOptions(documentNode: gql(mutation), variables: variables)); + } + + Stream subscribe(String subscription, + {String operationName, Map variables}) { + var _stream = _websocketClient.subscribe(Operation( + documentNode: gql(subscription), + variables: variables, + operationName: operationName)); + return _stream; + } +} diff --git a/lib/actions/api/request.dart b/lib/actions/api/request.dart new file mode 100644 index 00000000..88efa0cd --- /dev/null +++ b/lib/actions/api/request.dart @@ -0,0 +1,47 @@ +import 'package:dio/dio.dart'; +import 'package:dio_http_cache/dio_http_cache.dart'; +import 'package:movie/models/model_factory.dart'; +import 'package:movie/models/response_model.dart'; + +class Request { + final String baseurl; + Dio _dio; + Request(this.baseurl) { + _dio = new Dio(BaseOptions(baseUrl: baseurl)); + } + + Future> request(String host, + {String method = 'GET', + dynamic data, + dynamic queryParameters, + bool cached = false, + Map headers, + Duration cacheDuration = const Duration(days: 1), + Duration maxStale = const Duration(days: 30)}) async { + try { + if (cached) + _dio.interceptors.add(DioCacheManager(CacheConfig()).interceptor); + if (headers != null) _dio.options.headers = headers; + _dio.options.method = method; + final response = await _dio.request( + host, + data: data, + queryParameters: queryParameters, + options: cached + ? buildCacheOptions( + cacheDuration, + maxStale: maxStale, + ) + : null, + ); + return ResponseModel( + statusCode: response.statusCode, + message: response.statusMessage, + result: ModelFactory.generate(response.data)); + } on DioError catch (_) { + return ResponseModel( + statusCode: _.response?.statusCode ?? _.type.index, + message: _.message); + } + } +} diff --git a/lib/actions/api/tmdb_api.dart b/lib/actions/api/tmdb_api.dart new file mode 100644 index 00000000..a2ab49a6 --- /dev/null +++ b/lib/actions/api/tmdb_api.dart @@ -0,0 +1,832 @@ +import 'dart:convert' show json; +import 'dart:ui' as ui; +import 'package:dio/dio.dart'; +import 'package:movie/actions/app_config.dart'; +import 'package:movie/globalbasestate/action.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/enums/time_window.dart'; +import 'package:movie/models/models.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'request.dart'; + +class TMDBApi { + TMDBApi._(); + static final TMDBApi _instance = TMDBApi._(); + static TMDBApi get instance => _instance; + + String _apikey; + String _apikeyV4; + String _requestToken; + String accessTokenV4; + String session; + DateTime _sessionExpiresTime; + SharedPreferences prefs; + String _language = ui.window.locale.languageCode; + String region = ui.window.locale.countryCode; + bool _includeAdult; + Request _http; + Request _httpV4; + + Future init() async { + _http = Request(AppConfig.instance.theMovieDBHostV3); + _httpV4 = Request(AppConfig.instance.theMovieDBHostV4); + _apikey = AppConfig.instance.theMovieDBApiKeyV3; + _apikeyV4 = AppConfig.instance.theMovieDBApiKeyV4; + prefs = await SharedPreferences.getInstance(); + _includeAdult = prefs.getBool('adultItems') ?? false; + final _appLanguage = prefs.getString('appLanguage'); + if (_appLanguage != null) { + _language = Item(_appLanguage).value; + GlobalStore.store + .dispatch(GlobalActionCreator.changeLocale(ui.Locale(_language))); + } + } + + void setAdultValue(bool adult) { + _includeAdult = adult ?? false; + } + + void setLanguage(String languageCode) { + if (languageCode == null) + _language = ui.window.locale.languageCode; + else + _language = languageCode; + } + + Future createGuestSession() async { + String param = '/authentication/guest_session/new?api_key=$_apikey'; + final r = await _http.request(param); + if (r.success) { + if (r.result['success']) { + session = r.result['guest_session_id']; + _sessionExpiresTime = DateTime.parse(r.result['expires_at'] + .toString() + .replaceFirst(new RegExp(' UTC'), '')); + var date = DateTime.utc( + _sessionExpiresTime.year, + _sessionExpiresTime.month, + _sessionExpiresTime.day, + _sessionExpiresTime.hour, + _sessionExpiresTime.minute, + _sessionExpiresTime.second, + _sessionExpiresTime.millisecond, + _sessionExpiresTime.microsecond); + prefs.setString('guestSession', session); + prefs.setString('guestSessionExpires', date.toIso8601String()); + } + } + } + + Future createRequestToken() async { + String param = '/authentication/token/new?api_key=$_apikey'; + dynamic r = await _http.request(param); + if (r != null) { + if (r['success']) { + _requestToken = r['request_token']; + } + } + } + + Future createSessionWithLogin(String account, String pwd) async { + bool result = false; + if (_requestToken == null) await createRequestToken(); + String param = '/authentication/token/validate_with_login?api_key=$_apikey'; + FormData formData = new FormData.fromMap( + {"username": account, "password": pwd, "request_token": _requestToken}); + dynamic r = await _http.request(param, method: "POST", data: formData); + if (r != null) { + if (r['success']) { + result = await createNewSession(_requestToken); + } + } + return result; + } + + Future createNewSession(String sessionToken) async { + bool result = false; + if (session != null) { + String param = '/authentication/session/new?api_key=$_apikey'; + FormData formData = new FormData.fromMap({"request_token": sessionToken}); + dynamic r = await _http.request(param, method: "POST", data: formData); + if (r != null) { + if (r['success']) { + session = r['session_id']; + prefs.setString('loginsession', session); + var detail = await getAccountDetail(); + if (detail != null) result = true; + } + } + } + return result; + } + + Future createSessionWithV4(String sessionToken) async { + String param = '/authentication/session/convert/4?api_key=$_apikey'; + FormData formData = new FormData.fromMap({"access_token": _apikeyV4}); + dynamic r = await _httpV4.request(param, + method: "POST", + data: formData, + headers: {'Authorization': 'Bearer $accessTokenV4'}); + if (r != null) { + if (r['success']) { + session = r['session_id']; + _sessionExpiresTime = DateTime.parse( + r['expires_at'].toString().replaceFirst(new RegExp(' UTC'), '')); + prefs.setString('loginsession', session); + prefs.setString( + 'loginsessionexpires', _sessionExpiresTime.toIso8601String()); + } + } + } + + Future getAccountDetail() async { + AccountDetailModel accountDetailModel; + if (session != null) { + String param = '/account?api_key=$_apikey&session_id=$session'; + var r = await _http.request(param); + if (r != null) accountDetailModel = AccountDetailModel(r); + prefs.setInt('accountid', accountDetailModel.id); + prefs.setBool('islogin', true); + prefs.setString('accountname', accountDetailModel.username); + prefs.setString('accountgravatar', + 'https://www.gravatar.com/avatar/${accountDetailModel.avatar.gravatar.hash}?size=200'); + } + return accountDetailModel; + } + + Future deleteSession() async { + String param = '/authentication/session?api_key=$_apikey'; + if (session != null) { + FormData formData = new FormData.fromMap({"session_id": session}); + dynamic r = await _http.request(param, + method: 'DELETE', queryParameters: formData); + if (r != null) { + if (r['status_code'] == 6) { + prefs.remove('loginsession'); + prefs.remove('accountid'); + prefs.remove('accountname'); + prefs.remove('accountgravatar'); + prefs.remove('islogin'); + await deleteAccessTokenV4(); + } else + return false; + } + } + return true; + } + + Future createRequestTokenV4() async { + String result; + String param = "/auth/request_token"; + FormData formData = new FormData.fromMap({}); + var r = await _httpV4.request(param, + method: "POST", + data: formData, + headers: {'Authorization': 'Bearer $_apikeyV4'}); + if (r != null) { + var jsonobject = json.decode(r.result); + if (jsonobject['success']) { + result = jsonobject['request_token']; + } + } + return result; + } + + Future createAccessTokenV4(String requestTokenV4) async { + if (requestTokenV4 == null) return false; + bool result = false; + String param = "/auth/access_token"; + FormData formData = new FormData.fromMap({"request_token": requestTokenV4}); + var r = await _httpV4.request(param, + method: "POST", + data: formData, + headers: {'Authorization': 'Bearer $_apikeyV4'}); + if (r.success) { + var jsonobject = json.decode(r.result); + if (jsonobject['success']) { + String _accountid = jsonobject['account_id']; + accessTokenV4 = jsonobject['access_token']; + prefs.setString('accountIdV4', _accountid); + prefs.setString('accessTokenV4', accessTokenV4); + result = true; + } + } + return result; + } + + Future> getAccountListsV4(String acountid, + {int page = 1}) async { + String param = '/account/$acountid/lists?page=$page'; + final r = await _httpV4.request(param, + headers: {'Authorization': 'Bearer $_apikeyV4'}); + return r; + } + + Future> getListDetailV4(int listId, + {int page = 1, String sortBy}) async { + String param = '/list/$listId?page=$page&language=$_language'; + if (sortBy != null) param += '&sort_by=$sortBy'; + final r = await _httpV4.request(param, + headers: {'Authorization': 'Bearer $_apikeyV4'}); + return r; + } + + Future deleteAccessTokenV4() async { + String param = '/auth/access_token'; + if (session != null) { + var formData = {"access_token": accessTokenV4}; + final r = await _httpV4.request(param, + method: 'DELETE', + headers: {'Authorization': 'Bearer $_apikeyV4'}, + queryParameters: formData); + if (r.success) { + if (r.result['success']) { + prefs.remove('accountIdV4'); + prefs.remove('accessTokenV4'); + } else + return false; + } + } + return true; + } + + Future markAsFavorite(int id, MediaType type, bool isFavorite) async { + bool result = false; + int accountid = prefs.getInt('accountid'); + if (accountid == null) return result; + String param = + '/account/$accountid/favorite?api_key=$_apikey&session_id=$session'; + var formData = { + "media_type": type == MediaType.movie ? "movie" : "tv", + "media_id": id, + "favorite": isFavorite + }; + final r = await _http.request(param, method: "POST", data: formData); + if (r.success) { + if (r.result['status_code'] == 1 || + r.result['status_code'] == 12 || + r.result['status_code'] == 13) result = true; + } + return result; + } + + Future addToWatchlist(int id, MediaType type, bool isAdd) async { + bool result = false; + int accountid = prefs.getInt('accountid'); + if (accountid == null) return result; + String param = + '/account/$accountid/watchlist?api_key=$_apikey&session_id=$session'; + var formData = { + "media_type": type == MediaType.movie ? 'movie' : 'tv', + "media_id": id, + "watchlist": isAdd + }; + final r = await _http.request(param, method: "POST", data: formData); + if (r.success) { + if (r.result['status_code'] == 1 || + r.result['status_code'] == 12 || + r.result['status_code'] == 13) result = true; + } + return result; + } + + Future addToList(int listid, List items) async { + bool result = false; + String param = '/list/$listid/items'; + var data = {"items": items}; + final r = await _httpV4.request(param, + method: "POST", + data: data, + headers: {'Authorization': 'Bearer $accessTokenV4'}); + if (r.success) { + if (r.result['status_code'] == 1) result = true; + } + return result; + } + + ///Get the list of your favorite Movies.sortBy allowed values: created_at.asc, created_at.desc + Future> getFavoriteMovies(int accountid, + {int page = 1, String sortBy = 'created_at.asc'}) async { + String param = + '/account/$accountid/favorite/movies?api_key=$_apikey&language=$_language&session_id=$session&sort_by=$sortBy&page=$page'; + final r = await _http.request(param); + return r; + } + + ///Get the list of your favorite TV shows. + Future> getFavoriteTVShows(int accountid, + {int page = 1, String sortBy = 'created_at.asc'}) async { + final String param = + '/account/$accountid/favorite/tv?api_key=$_apikey&language=$_language&session_id=$session&sort_by=$sortBy&page=$page'; + final r = await _http.request(param); + return r; + } + + Future> getMoviesWatchlist(int accountid, + {int page = 1, String sortBy = 'created_at.asc'}) async { + String param = + '/account/$accountid/watchlist/movies?api_key=$_apikey&language=$_language&session_id=$session&sort_by=$sortBy&page=$page'; + final r = await _http.request(param); + return r; + } + + Future> getTVShowsWacthlist(int accountid, + {int page = 1, String sortBy = 'created_at.asc'}) async { + String param = + '/account/$accountid/watchlist/tv?api_key=$_apikey&language=$_language&session_id=$session&sort_by=$sortBy&page=$page'; + final r = await _http.request(param); + return r; + } + + ///Get a list of all the movies you have rated. + Future> getRatedMovies( + {int page = 1, String sortBy = 'created_at.asc'}) async { + int accountid = prefs.getInt('accountid'); + if (accountid == null) return null; + final String param = + '/account/$accountid/rated/movies?api_key=$_apikey&language=$_language&session_id=$session&sort_by=$sortBy&page=$page'; + final r = await _http.request(param); + return r; + } + + ///Get a list of all the movies you have rated. + Future> getRatedTVShows( + {int page = 1, String sortBy = 'created_at.asc'}) async { + final int accountid = prefs.getInt('accountid'); + if (accountid == null) return null; + final String param = + '/account/$accountid/rated/tv?api_key=$_apikey&language=$_language&session_id=$session&sort_by=$sortBy&page=$page'; + final r = await _http.request(param); + return r; + } + + Future rateTVShow(int tvid, double rating) async { + bool result = false; + String param = '/tv/$tvid/rating?api_key=$_apikey'; + int accountid = prefs.getInt('accountid'); + if (accountid == null) + //param += '&guest_session_id=$session'; + return false; + else + param += '&session_id=$session'; + FormData formData = new FormData.fromMap({"value": rating}); + var r = await _http.request(param, method: "POST", data: formData); + if (r.success) { + var jsonobject = json.decode(r.result); + if (jsonobject['status_code'] == 1) result = true; + } + return result; + } + + Future rateMovie(int movieid, double rating) async { + bool result = false; + String param = '/movie/$movieid/rating?api_key=$_apikey'; + int accountid = prefs.getInt('accountid'); + if (accountid == null) + //param += '&guest_session_id=$session'; + return false; + else + param += '&session_id=$session'; + FormData formData = new FormData.fromMap({"value": rating}); + var r = await _http.request(param, method: "POST", data: formData); + if (r.success) { + var jsonobject = json.decode(r.result); + if (jsonobject['status_code'] == 1) result = true; + } + return result; + } + + Future rateTVEpisode( + int tvid, int seasonid, int episodeid, double rating) async { + bool result = false; + String param = + '/tv/$tvid/season/$seasonid/episode/$episodeid/rating?api_key=$_apikey&session_id=$seasonid'; + var data = {"value": rating}; + var r = await _http.request(param, method: "POST", data: data); + if (r.success) { + var jsonobject = json.decode(r.result); + if (jsonobject['status_code'] == 1) result = true; + } + return result; + } + + Future> getMovieCertifications() async { + final String param = '/certification/movie/list'; + final r = await _http.request(param); + return r; + } + + Future> getTVCertifications() async { + String param = '/certification/tv/list'; + final r = await _http.request(param); + return r; + } + + Future> getLastMovies() async { + final String param = "/movie/latest?api_key=$_apikey&language=$_language"; + final r = await _http.request(param); + return r; + } + + Future> getLastTVShows() async { + final String param = "/tv/latest?api_key=$_apikey&language=$_language"; + final r = await _http.request(param); + return r; + } + + Future> getPopularMovies({int page = 1}) async { + final String param = + "/movie/popular?api_key=$_apikey&language=$_language&page=$page®ion=$region"; + final r = await _http.request(param); + return r; + } + + Future> getPopularTVShows( + {int page = 1}) async { + final String param = + "/tv/popular?api_key=$_apikey&language=$_language&page=$page®ion=$region"; + final r = await _http.request(param); + return r; + } + + Future> getMovieDetail(int mvid, + {String appendtoresponse}) async { + String param = '/movie/$mvid?api_key=$_apikey&language=$_language'; + if (appendtoresponse != null) + param = param + '&append_to_response=$appendtoresponse'; + final r = await _http.request(param, + cached: true, cacheDuration: Duration(hours: 1)); + return r; + } + + Future> getTVDetail(int tvid, + {String appendtoresponse}) async { + String param = '/tv/$tvid?api_key=$_apikey&language=$_language'; + if (appendtoresponse != null) + param = param + '&append_to_response=$appendtoresponse'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVAccountState( + int tvid) async { + String param = + '/tv/$tvid/account_states?api_key=$_apikey&language=$_language'; + final int accountid = prefs.getInt('accountid'); + if (accountid != null) + param += '&session_id=$session'; + else + return null; + final r = await _http.request(param); + return r; + } + + Future> getMovieAccountState( + int movieid) async { + String param = + '/movie/$movieid/account_states?api_key=$_apikey&language=$_language'; + int accountid = prefs.getInt('accountid'); + if (accountid != null) + param += '&session_id=$session'; + else + param += '&guest_session_id=$session'; + final r = await _http.request(param); + return r; + } + + ///Get a list of all of the movie ids that have been changed in the past 24 hours.You can query it for up to 14 days worth of changed IDs at a time with the start_date and end_date query parameters. 100 items are returned per page. + Future> getMovieChange( + {int page = 1, String startdate, String enddate}) async { + String param = '/movie/changes?api_key=$_apikey&page=$page'; + if (startdate != null && enddate == null) + param = param + '&start_date=$enddate&start_date=$startdate'; + final r = await _http.request(param); + return r; + } + + ///Get a list of upcoming movies in theatres. This is a release type query that looks for all movies that have a release type of 2 or 3 within the specified date range.You can optionally specify a region prameter which will narrow the search to only look for theatrical release dates within the specified country. + Future> getMovieUpComing({int page = 1}) async { + final String param = + '/movie/upcoming?api_key=$_apikey&language=$_language&page=$page®ion=$region'; + final r = await _http.request(param, + cached: true, cacheDuration: Duration(seconds: 0)); + + return r; + } + + ///Get the daily or weekly trending items. The daily trending list tracks items over the period of a day while items have a 24 hour half life. The weekly list tracks items over a 7 day period, with a 7 day half life. + Future> getTrending( + MediaType type, TimeWindow time, + {int page = 1}) async { + final String param = + '/trending/${type.toString().split('.').last}/${time.toString().split('.').last}?api_key=$_apikey&language=$_language&page=$page'; + final r = await _http.request(param, + cached: true, cacheDuration: Duration(hours: 1)); + return r; + } + + ///Get a list of movies in theatres. This is a release type query that looks for all movies that have a release type of 2 or 3 within the specified date range.You can optionally specify a region prameter which will narrow the search to only look for theatrical release dates within the specified country. + Future> getNowPlayingMovie( + {int page = 1}) async { + final String param = + '/movie/now_playing?api_key=$_apikey&language=$_language&page=$page®ion=$region'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getRecommendationsMovie(int movieid, + {int page = 1}) async { + final String param = + '/movie/$movieid/recommendations?api_key=$_apikey&language=$_language&page=$page'; + final r = await _http.request(param); + return r; + } + + Future> getRecommendationsTV(int tvid, + {int page = 1}) async { + final String param = + '/tv/$tvid/recommendations?api_key=$_apikey&language=$_language&page=$page'; + final r = await _http.request(param); + return r; + } + + ///Get the videos that have been added to a movie. + Future> getMovieVideo(int movieid) async { + final String param = '/movie/$movieid/videos?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVVideo(int tvid) async { + final String param = '/tv/$tvid/videos?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Get a list of shows that are currently on the air.This query looks for any TV show that has an episode with an air date in the next 7 days. + Future> getTVOnTheAir({int page = 1}) async { + String param = + '/tv/on_the_air?api_key=$_apikey&language=$_language&page=$page®ion=$region'; + final r = await _http.request(param, + cached: true, cacheDuration: Duration(seconds: 0)); + return r; + } + + ///Search multiple models in a single request. Multi search currently supports searching for movies, tv shows and people in a single request. + Future> searchMulit(String query, + {int page = 1, bool searchadult = false}) async { + final String param = + '/search/multi?api_key=$_apikey&query=$query&page=$page&include_adult=$_includeAdult&language=$_language'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Get the cast and crew for a movie. + Future> getMovieCredits(int movieid) async { + final String param = + '/movie/$movieid/credits?api_key=$_apikey&language=$_language'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVCredits(int tvid) async { + final String param = + '/tv/$tvid/credits?api_key=$_apikey&language=$_language'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Get the user reviews for a movie. + Future> getMovieReviews(int movieid, + {int page = 1}) async { + final String param = '/movie/$movieid/reviews?api_key=$_apikey&page=$page'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVReviews(int tvid, + {int page = 1}) async { + final String param = '/tv/$tvid/reviews?api_key=$_apikey&page=$page'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Get the images that belong to a movie.Querying images with a language parameter will filter the results. If you want to include a fallback language (especially useful for backdrops) you can use the include_image_language parameter. This should be a comma seperated value like so: include_image_language=en,null. + Future> getMovieImages(int movieid, + {String includelan = 'en,cn,jp'}) async { + final String param = '/movie/$movieid/images?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVImages(int tvid, + {String includelan = 'en,cn,jp'}) async { + final String param = '/tv/$tvid/images?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Get the keywords that have been added to a movie. + Future> getMovieKeyWords(int moiveid) async { + final String param = '/movie/$moiveid/keywords?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVKeyWords(int tvid) async { + final String param = '/tv/$tvid/keywords?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Discover movies by different types of data like average rating, number of votes, genres and certifications. You can get a valid list of certifications from the certifications list method.Discover also supports a nice list of sort options. See below for all of the available options.Please note, when using certification \ certification.lte you must also specify certification_country. These two parameters work together in order to filter the results. You can only filter results with the countries we have added to our certifications list.If you specify the region parameter, the regional release date will be used instead of the primary release date. The date returned will be the first date based on your query (ie. if a with_release_type is specified). It's important to note the order of the release types that are used. Specifying "2|3" would return the limited theatrical release date as opposed to "3|2" which would return the theatrical date.Also note that a number of filters support being comma (,) or pipe (|) separated. Comma's are treated like an AND and query while pipe's are an OR. + Future> getMovieDiscover( + {String lan, + String region, + String sortBy, + String certificationCountry, + String certification, + String certificationLte, + bool includeVideo = false, + int page = 1, + int primaryReleaseYear, + String primaryReleaseDateGte, + String primaryReleaseDateLte, + String releaseDateGte, + String releaseDateLte, + int voteCountGte, + int voteCountLte, + double voteAverageGte, + double voteAverageLte, + String withCast, + String withCrew, + String withCompanies, + String withGenres, + String withKeywords, + String withPeople, + int year, + String withoutGenres, + int withRuntimeGte, + int withRuntimeLte, + int withReleaseType, + String withOriginalLanguage, + String withoutKeywords}) async { + String param = + '/discover/movie?api_key=$_apikey&page=$page&language=$_language'; + param += sortBy == null ? '' : '&sort_by=$sortBy'; + param += certification == null ? '' : '&certification=$certification'; + param += certificationCountry == null + ? '' + : '&certification_country=$certificationCountry'; + param += + certificationLte == null ? '' : '&certification.lte=$certificationLte'; + param += _includeAdult == null ? '' : '&include_adult=$_includeAdult'; + param += includeVideo == null ? '' : '&include_video=$includeVideo'; + param += primaryReleaseYear == null + ? '' + : '&primary_release_year=$primaryReleaseYear'; + param += primaryReleaseDateGte == null + ? '' + : '&primary_release_date.gte=$primaryReleaseDateGte'; + param += primaryReleaseDateLte == null + ? '' + : '&primary_release_date.lte=$primaryReleaseDateLte'; + param += releaseDateGte == null ? '' : '&release_date.gte=$releaseDateGte'; + param += releaseDateLte == null ? '' : '&release_date.lte=$releaseDateLte'; + param += voteAverageGte == null ? '' : '&vote_average.gte=$voteAverageGte'; + param += voteCountGte == null ? '' : '&vote_count.gte=$voteCountGte'; + param += voteCountLte == null ? '' : '&vote_count.lte=$voteCountLte'; + param += voteAverageLte == null ? '' : '&vote_average.lte=$voteAverageLte'; + param += withCast == null ? '' : '&with_cast=$withCast'; + param += withCrew == null ? '' : '&with_crew=$withCrew'; + param += withCompanies == null ? '' : '&with_companies=$withCompanies'; + param += withGenres == null ? '' : '&with_genres=$withGenres'; + param += withKeywords == null ? '' : '&with_keywords=$withKeywords'; + param += withPeople == null ? '' : '&with_people=$withPeople'; + param += year == null ? '' : '&year=$year'; + param += withoutGenres == null ? '' : '&without_genres=$withoutGenres'; + param += withRuntimeGte == null ? '' : '&with_runtime.gte=$withRuntimeGte'; + param += withRuntimeLte == null ? '' : '&with_runtime.lte=$withRuntimeLte'; + param += + withReleaseType == null ? '' : '&with_release_type=$withReleaseType'; + param += withOriginalLanguage == null + ? '' + : '&with_original_language=$withOriginalLanguage'; + param += + withoutKeywords == null ? '' : '&without_keywords=$withoutKeywords'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVDiscover( + {String lan, + int page, + String sortBy, + String airDateGte, + String airDateLte, + String firstAirDateGte, + String firstAirDateLte, + double voteAverageGte, + double voteAverageLte, + String timezone = 'America/New_York', + String withGenres, + String withKeywords}) async { + String param = + '/discover/tv?api_key=$_apikey&page=$page&timezone=$timezone&language=$_language'; + param += sortBy == null ? '' : '&sort_by=$sortBy'; + param += airDateGte == null ? '' : '&air_ate.gte=$airDateGte'; + param += airDateLte == null ? '' : '&air_ate.lte=$airDateLte'; + param += voteAverageGte == null ? '' : '&vote_average.gte=$voteAverageGte'; + param += voteAverageLte == null ? '' : '&vote_average.lte=$voteAverageLte'; + param += + firstAirDateGte == null ? '' : '&first_air_ate.gte=$firstAirDateGte'; + param += + firstAirDateLte == null ? '' : '&first_air_ate.lte=$firstAirDateLte'; + param += withGenres == null ? '' : '&with_genres=$withGenres'; + param += withKeywords == null ? '' : '&with_keywords=$withKeywords'; + final r = await _http.request(param, cached: true); + return r; + } + + ///Search for movies. + Future> searchMovie(String keyword, + {String lan, + int page = 1, + String region, + int year, + int primaryReleaseYear}) async { + String param = + '/search/movie?api_key=$_apikey&page=$page&include_adult=$_includeAdult'; + param += region == null ? '' : '®ion=$region'; + param += year == null ? '' : '&year=$year'; + param += primaryReleaseYear == null + ? '' + : '&primary_release_year=$primaryReleaseYear'; + final r = _http.request(param, cached: true); + return r; + } + + Future> getTVSeasonDetail(int tvid, int seasonNumber, + {String appendToResponse}) async { + String param = + '/tv/$tvid/season/$seasonNumber?api_key=$_apikey&language=$_language'; + if (appendToResponse != null) + param += "&append_to_response=$appendToResponse"; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTVEpisodeDetail( + int tvid, int seasonNumber, int episodeNumber, + {String appendToResponse}) async { + String param = + '/tv/$tvid/season/$seasonNumber/episode/$episodeNumber?api_key=$_apikey&language=$_language'; + if (appendToResponse != null) + param += '&append_to_response=$appendToResponse'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getPeopleDetail(int peopleid, + {String appendToResponse}) async { + String param = '/person/$peopleid?api_key=$_apikey&language=$_language'; + if (appendToResponse != null) + param += '&append_to_response=$appendToResponse'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getPeopleMovieCredits( + int peopleid) async { + final String param = + '/person/$peopleid/movie_credits?api_key=$_apikey&language=$_language'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getCombinedCredits( + int peopleid) async { + final String param = + '/person/$peopleid/combined_credits?api_key=$_apikey&language=$_language'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTvShowSeasonVideo( + int tvid, int seasonNumber) async { + final String param = + '/tv/$tvid/season/$seasonNumber/videos?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } + + Future> getTvShowSeasonImages( + int tvid, int seasonNumber) async { + final String param = + '/tv/$tvid/season/$seasonNumber/images?api_key=$_apikey'; + final r = await _http.request(param, cached: true); + return r; + } +} diff --git a/lib/actions/api/urlresolver_api.dart b/lib/actions/api/urlresolver_api.dart new file mode 100644 index 00000000..96fc501b --- /dev/null +++ b/lib/actions/api/urlresolver_api.dart @@ -0,0 +1,25 @@ +import 'package:movie/actions/app_config.dart'; +import 'package:movie/actions/api/request.dart'; +import 'package:movie/models/models.dart'; +import 'dart:convert'; + +class UrlResolverApi { + UrlResolverApi._(); + static final UrlResolverApi _instance = UrlResolverApi._(); + static UrlResolverApi get instance => _instance; + final Request _http = Request(AppConfig.instance.urlresolverApiHost); + final String _apiKey = AppConfig.instance.urlresolverApiKey; + + Future> getDirectUrl(String link, String domain, + {String mode, String token}) async { + final String _url = '/$domain'; + final String _auth = '{"auth":"","skk":"$_apiKey"}'; + final _data = { + 'source': base64.encode(utf8.encode(link)), + 'auth': base64.encode(utf8.encode(_auth)), + }; + if (mode != null) _data['mode'] = '$mode'; + if (token != null) _data['token'] = token; + return await _http.request(_url, method: 'POST', data: _data); + } +} diff --git a/lib/actions/app_config.dart b/lib/actions/app_config.dart new file mode 100644 index 00000000..e005b7e2 --- /dev/null +++ b/lib/actions/app_config.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'dart:convert' show json; + +class AppConfig { + AppConfig._(); + + static final AppConfig instance = AppConfig._(); + + dynamic _config; + + String get theMovieDBHostV3 => _config['theMovieDBHostV3']; + + String get theMovieDBHostV4 => _config['theMovieDBHostV4']; + + String get theMovieDBApiKeyV3 => _config['theMovieDBApiKeyV3']; + + String get theMovieDBApiKeyV4 => _config['theMovieDBApiKeyV4']; + + String get baseApiHost => _config['baseApiHost']; + + String get graphQLHttpLink => _config['graphQLHttpLink']; + + String get graphQlWebSocketLink => _config['graphQlWebSocketLink']; + + String get urlresolverApiHost => _config['urlresolverApiHost']; + + String get urlresolverApiKey => _config['urlresolverApiKey']; + + Future init(BuildContext context) async { + final _jsonStr = await _getConfigJson(context); + if (_jsonStr == null) { + print('can not find config file'); + return; + } + _config = json.decode(_jsonStr); + } + + Future _getConfigJson(BuildContext context) async { + try { + final _jsonStr = + await DefaultAssetBundle.of(context).loadString("appconfig.json"); + return _jsonStr; + } on Exception catch (_) { + return null; + } + } +} diff --git a/lib/actions/app_language.dart b/lib/actions/app_language.dart new file mode 100644 index 00000000..dedbcf52 --- /dev/null +++ b/lib/actions/app_language.dart @@ -0,0 +1,31 @@ +import 'package:movie/models/item.dart'; + +import 'dart:ui' as ui; + +import 'package:shared_preferences/shared_preferences.dart'; + +class AppLanguage { + AppLanguage._(); + static final AppLanguage instance = AppLanguage._(); + + List get supportLanguages => [ + Item.fromParams( + name: "System Default", value: ui.window.locale.languageCode), + Item.fromParams(name: "Deutsch", value: 'de'), + Item.fromParams(name: "English", value: 'en'), + Item.fromParams(name: "Español", value: 'es'), + Item.fromParams(name: "Français", value: 'fr'), + Item.fromParams(name: "русский", value: 'ru'), + Item.fromParams(name: "日本語", value: 'ja'), + Item.fromParams(name: "简体中文", value: 'zh'), + Item.fromParams(name: "繁體中文", value: 'zh-TW'), + ]; + + Future getApplanguage() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final _appLanguage = prefs.getString('appLanguage'); + if (_appLanguage != null) return Item(_appLanguage); + return Item.fromParams( + name: "System Default", value: ui.window.locale.languageCode); + } +} diff --git a/lib/actions/creditcard_verify.dart b/lib/actions/creditcard_verify.dart new file mode 100644 index 00000000..ee37b7c8 --- /dev/null +++ b/lib/actions/creditcard_verify.dart @@ -0,0 +1,23 @@ +class CreditCardVerify { + final RegExp _visaExp = RegExp(r'^4[0-9]{6,}$'); + + final RegExp _mastercardExp = RegExp( + r'(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}'); + + final RegExp _jcbExp = RegExp(r'(^3[0-9]{15}$)|(^(2131|1800)[0-9]{11}$)'); + + final RegExp _discoverExp = RegExp(r'^6011-?\d{4}-?\d{4}-?\d{4}$'); + + String verify(String text) { + if (_visaExp.hasMatch(text)) { + return 'Visa'; + } else if (_mastercardExp.hasMatch(text)) { + return 'MasterCard'; + } else if (_jcbExp.hasMatch(text)) { + return 'JCB'; + } else if (_discoverExp.hasMatch(text)) { + return 'Discover'; + } else + return '-'; + } +} diff --git a/lib/actions/downloader_callback.dart b/lib/actions/downloader_callback.dart new file mode 100644 index 00000000..8dcd7874 --- /dev/null +++ b/lib/actions/downloader_callback.dart @@ -0,0 +1,13 @@ +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:flutter_downloader/flutter_downloader.dart'; + +class DownloaderCallBack { + static void callback(String id, DownloadTaskStatus status, int progress) { + print('id:$id, status:$status, progress:$progress'); + final SendPort send = + IsolateNameServer.lookupPortByName('downloader_send_port'); + send.send([id, status, progress]); + } +} diff --git a/lib/actions/imageurl.dart b/lib/actions/imageurl.dart new file mode 100644 index 00000000..5467fc5e --- /dev/null +++ b/lib/actions/imageurl.dart @@ -0,0 +1,17 @@ +import 'package:movie/models/enums/imagesize.dart'; + +class ImageUrl { + static String emptyimage = 'https://www.color-hex.com/palettes/7707.png'; + static String getUrl(String param, ImageSize size) { + String host = 'https://image.tmdb.org/t/p/'; + return param == null + ? emptyimage + : host + size.toString().split('.').last + param; + } + + static String getGravatarUrl(String hash, int size) { + return hash == null + ? 'https://www.gravatar.com/avatar' + : 'https://www.gravatar.com/avatar/$hash?size=$size'; + } +} diff --git a/lib/actions/local_notification.dart b/lib/actions/local_notification.dart new file mode 100644 index 00000000..ae585767 --- /dev/null +++ b/lib/actions/local_notification.dart @@ -0,0 +1,44 @@ +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +class LocalNotification { + LocalNotification._(); + static final LocalNotification instance = LocalNotification._(); + Function(String) onSelectNotification; + Function(int id, String title, String body, String payload) + didReceiveLocalNotification; + FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin; + Future init() async { + _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + var initializationSettingsAndroid = + AndroidInitializationSettings('app_icon'); + var initializationSettingsIOS = IOSInitializationSettings( + onDidReceiveLocalNotification: onDidReceiveLocalNotification); + var initializationSettings = InitializationSettings( + initializationSettingsAndroid, initializationSettingsIOS); + _flutterLocalNotificationsPlugin.initialize(initializationSettings, + onSelectNotification: selectNotification); + } + + Future onDidReceiveLocalNotification( + int id, String title, String body, String payload) async { + if (didReceiveLocalNotification != null) + didReceiveLocalNotification(id, title, body, payload); + } + + Future selectNotification(String payload) async { + if (onSelectNotification != null) onSelectNotification(payload); + } + + Future sendNotification(String title, String body, + {int id = 0, String payload = ''}) async { + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + '1128', 'flutterMovieNotification', 'for loacl Notification', + importance: Importance.Max, priority: Priority.High, ticker: 'ticker'); + var iOSPlatformChannelSpecifics = + IOSNotificationDetails(presentAlert: true, presentBadge: true); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await _flutterLocalNotificationsPlugin + .show(id, title, body, platformChannelSpecifics, payload: payload); + } +} diff --git a/lib/actions/notification_topic.dart b/lib/actions/notification_topic.dart new file mode 100644 index 00000000..d43c1348 --- /dev/null +++ b/lib/actions/notification_topic.dart @@ -0,0 +1,12 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; + +class NotificationTopic { + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); + void subscribeToTopic(List topics) { + for (var e in topics) _firebaseMessaging.subscribeToTopic(e); + } + + void unsubscribeFromTopic(List topics) { + for (var e in topics) _firebaseMessaging.unsubscribeFromTopic(e); + } +} diff --git a/lib/actions/pop_result.dart b/lib/actions/pop_result.dart new file mode 100644 index 00000000..97ecdbd6 --- /dev/null +++ b/lib/actions/pop_result.dart @@ -0,0 +1,17 @@ +import 'package:meta/meta.dart'; + +/// PopResult +class PopWithResults { + /// poped from this page + final String fromPage; + + /// pop until this page + final String toPage; + + /// results + final dynamic results; + + /// constructor + PopWithResults( + {@required this.fromPage, @required this.toPage, this.results}); +} diff --git a/lib/actions/stream_link_convert/archive.dart b/lib/actions/stream_link_convert/archive.dart new file mode 100644 index 00000000..8cadecce --- /dev/null +++ b/lib/actions/stream_link_convert/archive.dart @@ -0,0 +1,13 @@ +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Archive { + static Future getUrl(String link) async { + String _link; + + final _result = await UrlResolverApi.instance.getDirectUrl(link, 'archive'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + + return _link; + } +} diff --git a/lib/actions/stream_link_convert/bitporno.dart b/lib/actions/stream_link_convert/bitporno.dart new file mode 100644 index 00000000..865695c6 --- /dev/null +++ b/lib/actions/stream_link_convert/bitporno.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Bitporno { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'bitporno', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/clipwatching.dart b/lib/actions/stream_link_convert/clipwatching.dart new file mode 100644 index 00000000..96f73d22 --- /dev/null +++ b/lib/actions/stream_link_convert/clipwatching.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Clipwatching { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'clipwatching', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/cloudvideo.dart b/lib/actions/stream_link_convert/cloudvideo.dart new file mode 100644 index 00000000..fa1024ce --- /dev/null +++ b/lib/actions/stream_link_convert/cloudvideo.dart @@ -0,0 +1,22 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class CloudVideo { + static Future getUrl(String link) async { + String _link = link.contains("/embed-") + ? link + : "https://cloudvideo.tv/embed-" + + link.replaceAll(".html", "").split("/")[3] + + ".html"; + try { + final Response _response = await Dio().get(_link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'cloudvideo', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/dood.dart b/lib/actions/stream_link_convert/dood.dart new file mode 100644 index 00000000..1254bbd2 --- /dev/null +++ b/lib/actions/stream_link_convert/dood.dart @@ -0,0 +1,48 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Dood { + static Future getUrl(String link) async { + String _link; + Response _response; + String _replaceLink = link.replaceAll("/e/", "/d/"); + String _embedRegex = "\\/pass_md5\\/(.*?)[\'|\"]"; + String _downloadRegex = "\\/download\\/(.*?)[\'|\"]"; + try { + _response = await Dio().get(_replaceLink, + options: Options(headers: {'referrer': _replaceLink})); + RegExp _regExp = new RegExp(_downloadRegex, dotAll: true); + RegExpMatch _m = _regExp.firstMatch(_response.data); + if (_m.groupCount > 0) { + String _downloadLink = "https://dood.watch/download/" + _m.group(1); + _response = await Dio().get(_downloadLink, + options: Options(headers: {'referrer': _replaceLink})); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'dood', mode: 'direct'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } + if (_link == null || _link?.isEmpty == true) { + _replaceLink = + _replaceLink.replaceAll("/d/", "/e/").replaceAll("/h/", "/e/"); + + _response = await Dio().get(_replaceLink); + RegExp _regExp2 = new RegExp(_embedRegex, dotAll: true); + RegExpMatch _m2 = _regExp2.firstMatch(_response.data); + if (_m2.groupCount > 0) { + String _pasrs = _m2.group(1); + String _embedLink = "https://dood.watch/pass_md5/" + _pasrs; + _response = await Dio().get(_embedLink); + final _result2 = await UrlResolverApi.instance.getDirectUrl( + _response.data, 'dood', + mode: 'embed', token: _pasrs); + if (_result2.success) if (_result2.result['status'] == 'ok') + _link = _result2.result['url']; + } + } + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/fembed.dart b/lib/actions/stream_link_convert/fembed.dart new file mode 100644 index 00000000..8e7ed055 --- /dev/null +++ b/lib/actions/stream_link_convert/fembed.dart @@ -0,0 +1,25 @@ +import 'package:dio/dio.dart'; + +class Fembed { + static Future getUrl(String link) async { + String _link; + String _file = link.split('/')[4]; + try { + final Response _response = await Dio().post( + 'https://feurl.com/api/source/$_file', + data: { + 'r': '', + 'd': 'feurl.com', + }, + ); + + if (_response.data != null) if (_response.data['success']) { + final _data = _response.data['data']; + _link = _data[0]['file']; + } + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/gamovideo.dart b/lib/actions/stream_link_convert/gamovideo.dart new file mode 100644 index 00000000..595d527c --- /dev/null +++ b/lib/actions/stream_link_convert/gamovideo.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class GamoVideo { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'gamovideo'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/gounlimited.dart b/lib/actions/stream_link_convert/gounlimited.dart new file mode 100644 index 00000000..2cb0bada --- /dev/null +++ b/lib/actions/stream_link_convert/gounlimited.dart @@ -0,0 +1,20 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Gounlimited { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'gounlimited'); + if (_result.success) if (_result.result['status'] == 'ok') { + final _data = _result.result['url']; + _link = _data['src']; + } + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/jawcloud.dart b/lib/actions/stream_link_convert/jawcloud.dart new file mode 100644 index 00000000..e6c68cd4 --- /dev/null +++ b/lib/actions/stream_link_convert/jawcloud.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Jawcloud { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains('/embed') + ? link + : "https://jawcloud.co/embed-" + link.split("/")[3]; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'jawcloud'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/jetload.dart b/lib/actions/stream_link_convert/jetload.dart new file mode 100644 index 00000000..91f747b6 --- /dev/null +++ b/lib/actions/stream_link_convert/jetload.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; + +class Jetload { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.replaceAll('/p/', '/e/'); + String v = ''; + String cb = '123456789'; + String siteKey = '6Lc90MkUAAAAAOrqIJqt4iXY_fkXb7j3zwgRGtUI'; + String co = 'aHR0cHM6Ly9qZXRsb2FkLm5ldDo0NDM.'; + String sa = 'secure_url'; + String _url = + 'https://www.google.com/recaptcha/api2/anchor?ar=1&k=$siteKey&co=$co&hl=ro&v=$v&size=invisible&cb=$cb'; + Map _headers = { + "Accept": + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "ro-RO,ro;q=0.8,en-US;q=0.6,en-GB;q=0.4,en;q=0.2", + "referer": "https://jetload.net", + }; + Response _response; + try { + _response = await Dio().get(_url, options: Options(headers: _headers)); + RegExp _regExp = new RegExp( + "recaptcha-token\"\\s*value\\s*=\\s*\"(.*?)\"", + dotAll: true); + RegExpMatch _m = _regExp.firstMatch(_response.data); + if (_m.groupCount > 0) { + String _token = _m.group(1); + String _url2 = + "https://www.google.com/recaptcha/api2/reload?k=" + siteKey; + Map _params = { + 'v': v, + "reason": "q", + "k": siteKey, + "c": _token, + "sa": sa, + "co": co, + }; + String _post = _params.keys + .map((e) => + '${utf8.decode(e.codeUnits)}=${utf8.decode(_params[e].codeUnits)}') + .join('&'); + _headers = { + "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", + "Referer": _replaceLink + }; + _response = await Dio().post('$_url2&$_post', + options: + Options(headers: _headers, responseType: ResponseType.plain)); + _regExp = new RegExp("\\/[p|e]\\/([a-zA-Z0-9_]+)", dotAll: true); + _m = _regExp.firstMatch(_replaceLink); + if (_m.groupCount > 0) { + String streamid = _m.group(1); + _regExp = + new RegExp("rresp\\s*\"\\s*,\\s*\"\\s*(.*?)\"", dotAll: true); + _m = _regExp.firstMatch(_response.data); + if (_m.groupCount > 0) { + _token = _m.group(1); + _params = {"token": _token, "stream_code": streamid}; + String pars = "{\"token\":\"" + + _token + + "\",\"stream_code\":\"" + + streamid + + "\"}"; + _headers = { + "Referer": _replaceLink, + "Connection": "keep-alive", + "Content-Length": pars.length.toString(), + "Content-Type": "application/json;charset=UTF-8", + "Accept-Encoding": "gzip, deflate, br", + "Accept": "application/json, text/plain, */*", + "Accept-Language": + "res-ES,es;q=0.9,en-US;q=0.8,en-GB;q=0.7,en;q=0.6,fr;q=0.5,id;q=0.4", + }; + _response = await Dio(BaseOptions(headers: _headers)) + .post('https://jetload.net/jet_secure', data: pars); + if (_response.data != null) if (_response.data["err"] == null) { + final _srcData = _response.data["src"]; + _link = _srcData["src"]; + } + } + } + } + } on DioError catch (_) { + print(_.toString()); + return null; + } on Exception catch (_) { + print(_.toString()); + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/mediafire.dart b/lib/actions/stream_link_convert/mediafire.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/actions/stream_link_convert/mixdrop.dart b/lib/actions/stream_link_convert/mixdrop.dart new file mode 100644 index 00000000..3f59cfd9 --- /dev/null +++ b/lib/actions/stream_link_convert/mixdrop.dart @@ -0,0 +1,37 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Mixdrop { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.replaceAll("/f/", "/e/"); + Response _response; + Map mapHeaders = {'Referer': _replaceLink}; + try { + _response = await Dio(BaseOptions(headers: mapHeaders)).get(_replaceLink); + if (_response.data == null || + !_response.data.toString().contains('eval(')) { + if (_response.data != null) { + RegExp _regExp = + new RegExp("window.location\\s*=\\s*\"(.*?)\"", dotAll: true); + RegExpMatch _m = _regExp.firstMatch(_response.data.toString()); + if (_m.groupCount > 0) { + String token = _m.group(1); + if (token != null && token?.isEmpty == false) { + _replaceLink = _replaceLink.split("/e/")[0] + token; + _response = + await Dio(BaseOptions(headers: mapHeaders)).get(_replaceLink); + } + } + } + } + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data.toString(), 'mixdrop'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/mp4upload.dart b/lib/actions/stream_link_convert/mp4upload.dart new file mode 100644 index 00000000..608cc958 --- /dev/null +++ b/lib/actions/stream_link_convert/mp4upload.dart @@ -0,0 +1,23 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Mp4upload { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/embed-") + ? link + : "https://www.mp4upload.com/embed-" + + link.split("/")[3].replaceAll(".html", "") + + ".html"; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'mp4upload'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/ninjastream.dart b/lib/actions/stream_link_convert/ninjastream.dart new file mode 100644 index 00000000..a00c9783 --- /dev/null +++ b/lib/actions/stream_link_convert/ninjastream.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class NinjaStream { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'ninjastream', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/openlay.dart b/lib/actions/stream_link_convert/openlay.dart new file mode 100644 index 00000000..c7a18e0f --- /dev/null +++ b/lib/actions/stream_link_convert/openlay.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Openlay { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'openplay', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/powvideo.dart b/lib/actions/stream_link_convert/powvideo.dart new file mode 100644 index 00000000..2cc57ecc --- /dev/null +++ b/lib/actions/stream_link_convert/powvideo.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class PowVideo { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link, + options: Options(headers: { + "accept": "*/*", + }, responseType: ResponseType.plain)); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'powvideo'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/prostream.dart b/lib/actions/stream_link_convert/prostream.dart new file mode 100644 index 00000000..d735698e --- /dev/null +++ b/lib/actions/stream_link_convert/prostream.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Prostream { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'prostream'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/stream_link_convert_factory.dart b/lib/actions/stream_link_convert/stream_link_convert_factory.dart new file mode 100644 index 00000000..7f149b2d --- /dev/null +++ b/lib/actions/stream_link_convert/stream_link_convert_factory.dart @@ -0,0 +1,188 @@ +import 'package:movie/actions/stream_link_convert/archive.dart'; +import 'package:movie/actions/stream_link_convert/bitporno.dart'; +import 'package:movie/actions/stream_link_convert/clipwatching.dart'; +import 'package:movie/actions/stream_link_convert/gamovideo.dart'; +import 'package:movie/actions/stream_link_convert/gounlimited.dart'; +import 'package:movie/actions/stream_link_convert/ninjastream.dart'; +import 'package:movie/actions/stream_link_convert/powvideo.dart'; +import 'package:movie/actions/stream_link_convert/prostream.dart'; +import 'package:movie/actions/stream_link_convert/streamplay.dart'; +import 'package:movie/actions/stream_link_convert/upstream.dart'; +import 'package:movie/actions/stream_link_convert/vidtodo.dart'; +import 'package:movie/actions/stream_link_convert/waaw.dart'; + +import 'cloudvideo.dart'; +import 'dood.dart'; +import 'fembed.dart'; +import 'jawcloud.dart'; +import 'jetload.dart'; +import 'mixdrop.dart'; +import 'mp4upload.dart'; +import 'openlay.dart'; +import 'streamtape.dart'; +import 'supervideo.dart'; +import 'uptostream.dart'; +import 'uqload.dart'; +import 'veoh.dart'; +import 'vidcloud.dart'; +import 'videobin.dart'; +import 'videomega.dart'; +import 'vidfast.dart'; +import 'vidia.dart'; +import 'vidlox.dart'; +import 'vidoza.dart'; +import 'vup.dart'; + +class StreamLinkConvertFactory { + StreamLinkConvertFactory._(); + static final StreamLinkConvertFactory instance = StreamLinkConvertFactory._(); + List hosts = [ + 'archive', + 'bitporno', + 'clipwatching', + 'cloudvideo', + 'dood', + 'feurl', + 'fembed', + 'gamovideo', + 'gounlimited', + 'jawcloud', + 'jetload', + 'mediafire', + 'mixdrop', + 'mp4upload', + "ninjastream", + 'openlay', + 'powvideo', + 'prostream', + 'streamplay', + 'streamtape', + 'supervideo', + 'upstream', + 'uptostream', + 'uqload', + 'veoh', + 'vidcloud', + 'videobin', + 'videomega', + 'vidfast', + 'vidia', + 'vidlox', + 'vidoza', + 'vidtodo', + 'vup', + 'waaw' + ]; + Future getLink(String link) async { + final String _domain = _getDomain(link); + String _link; + switch (_domain) { + case 'archive': + _link = await Archive.getUrl(link); + break; + case 'bitporno': + _link = await Bitporno.getUrl(link); + break; + case 'clipwatching': + _link = await Clipwatching.getUrl(link); + break; + case 'cloudvideo': + _link = await CloudVideo.getUrl(link); + break; + case 'dood': + _link = await Dood.getUrl(link); + break; + case 'feurl': + case 'fembed': + _link = await Fembed.getUrl(link); + break; + case 'gamovideo': + _link = await GamoVideo.getUrl(link); + break; + case 'gounlimited': + _link = await Gounlimited.getUrl(link); + break; + case 'jawcloud': + _link = await Jawcloud.getUrl(link); + break; + case 'jetload': + _link = await Jetload.getUrl(link); + break; + case 'mixdrop': + _link = await Mixdrop.getUrl(link); + break; + case 'mp4upload': + _link = await Mp4upload.getUrl(link); + break; + case 'ninjastream': + _link = await NinjaStream.getUrl(link); + break; + case 'openlay': + _link = await Openlay.getUrl(link); + break; + case 'prostream': + _link = await Prostream.getUrl(link); + break; + case 'powvideo': + _link = await PowVideo.getUrl(link); + break; + case 'streamplay': + _link = await StreamPlay.getUrl(link); + break; + case 'streamtape': + _link = await Streamtape.getUrl(link); + break; + case 'supervideo': + _link = await Supervideo.getUrl(link); + break; + case 'upstream': + _link = await Upstream.getUrl(link); + break; + case 'uptostream': + _link = await Uptostream.getUrl(link); + break; + case 'uqload': + _link = await Uqload.getUrl(link); + break; + case 'veoh': + _link = await Veoh.getUrl(link); + break; + case 'vidcloud': + _link = await Vidcloud.getUrl(link); + break; + case 'videobin': + _link = await Videobin.getUrl(link); + break; + case 'videomega': + _link = await Videomega.getUrl(link); + break; + case 'vidfast': + _link = await Vidfast.getUrl(link); + break; + case 'vidia': + _link = await Vidia.getUrl(link); + break; + case 'vidlox': + _link = await Vidlox.getUrl(link); + break; + case 'vidoza': + _link = await Vidoza.getUrl(link); + break; + case 'vidtodo': + _link = await Vidtodo.getUrl(link); + break; + case 'vup': + _link = await Vup.getUrl(link); + break; + case 'waaw': + _link = await Waaw.getUrl(link); + break; + } + return _link; + } + + String _getDomain(String link) { + for (var e in hosts) if (link.contains(e)) return e; + return ''; + } +} diff --git a/lib/actions/stream_link_convert/streamplay.dart b/lib/actions/stream_link_convert/streamplay.dart new file mode 100644 index 00000000..3f0d1e14 --- /dev/null +++ b/lib/actions/stream_link_convert/streamplay.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class StreamPlay { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'streamplay', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/streamtape.dart b/lib/actions/stream_link_convert/streamtape.dart new file mode 100644 index 00000000..d6a190cf --- /dev/null +++ b/lib/actions/stream_link_convert/streamtape.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Streamtape { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'streamtape'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/supervideo.dart b/lib/actions/stream_link_convert/supervideo.dart new file mode 100644 index 00000000..898c7af5 --- /dev/null +++ b/lib/actions/stream_link_convert/supervideo.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Supervideo { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'supervideo', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/upstream.dart b/lib/actions/stream_link_convert/upstream.dart new file mode 100644 index 00000000..0f37cdf2 --- /dev/null +++ b/lib/actions/stream_link_convert/upstream.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Upstream { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/embed-") + ? link + : "https://upstream.to/embed-" + link.split("/")[3] + ".html"; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'upstream'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/uptostream.dart b/lib/actions/stream_link_convert/uptostream.dart new file mode 100644 index 00000000..b2039237 --- /dev/null +++ b/lib/actions/stream_link_convert/uptostream.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Uptostream { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.replaceAll("uptobox.com", "uptostream.com"); + String _file = _replaceLink.split("/")[3]; + try { + final Response _response = await Dio().get( + 'https://uptostream.com/api/streaming/source/get?token=null&file_code=$_file'); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'uptostream'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/uqload.dart b/lib/actions/stream_link_convert/uqload.dart new file mode 100644 index 00000000..8a3c3ca4 --- /dev/null +++ b/lib/actions/stream_link_convert/uqload.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Uqload { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/embed-") + ? link + : "https://uqload.com/embed-" + link.split("/")[3]; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = + await UrlResolverApi.instance.getDirectUrl(_response.data, 'uqload'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/veoh.dart b/lib/actions/stream_link_convert/veoh.dart new file mode 100644 index 00000000..c8993700 --- /dev/null +++ b/lib/actions/stream_link_convert/veoh.dart @@ -0,0 +1,23 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Veoh { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/getVideo/") + ? link + : "https://www.veoh.com/watch/getVideo/" + link.split("/")[4]; + try { + final Response _response = + await Dio(BaseOptions(headers: {'User-Agent': 'Mozilla'})) + .get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'veoh', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vidcloud.dart b/lib/actions/stream_link_convert/vidcloud.dart new file mode 100644 index 00000000..0474855c --- /dev/null +++ b/lib/actions/stream_link_convert/vidcloud.dart @@ -0,0 +1,103 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; + +class Vidcloud { + static Future getUrl(String link) async { + String _link; + String v = 'JZfekeK8w6ZlhLfH_ZyseSLX'; + String cb = 'ilzxej5hmdxe'; + String siteKey = '6LdqXa0UAAAAABc77NIcku_LdXJio9kaJVpYkgQJ'; + String co = 'aHR0cHM6Ly92aWRjbG91ZC5ydTo0NDM.'; + String sa = 'get_playerr'; + String _url = + 'https://www.google.com/recaptcha/api2/anchor?ar=1&k=$siteKey&co=$co&hl=ro&v=$v&size=invisible&cb=$cb'; + Map _headers = { + "Accept": + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "ro-RO,ro;q=0.8,en-US;q=0.6,en-GB;q=0.4,en;q=0.2", + "referer": "https://vidcloud.ru", + }; + Response _response; + try { + _response = await Dio(BaseOptions(headers: _headers)).get(_url); + RegExp _regExp = new RegExp( + "recaptcha-token\"\\s*value\\s*=\\s*\"(.*?)\"", + dotAll: true); + RegExpMatch _m = _regExp.firstMatch(_response.data); + if (_m.groupCount > 0) { + String _token = _m.group(1); + String _url2 = + "https://www.google.com/recaptcha/api2/reload?k=" + siteKey; + Map _params = { + 'v': v, + "reason": "q", + "k": siteKey, + "c": _token, + "sa": sa, + "co": co, + }; + String _post = _params.keys + .map((e) => + '${utf8.decode(e.codeUnits)}=${utf8.decode(_params[e].codeUnits)}') + .join('&'); + _headers = { + "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", + "Referer": link + }; + _response = await Dio().post('$_url2&$_post', + options: + Options(headers: _headers, responseType: ResponseType.plain)); + _regExp = new RegExp("\\/[p|e]\\/([a-zA-Z0-9_]+)", dotAll: true); + _m = _regExp.firstMatch(link); + if (_m.groupCount > 0) { + String streamid = _m.group(1); + _regExp = + new RegExp("rresp\\s*\"\\s*,\\s*\"\\s*(.*?)\"", dotAll: true); + _m = _regExp.firstMatch(_response.data); + if (_m.groupCount > 0) { + _token = _m.group(1); + String page = link.contains("/embed") ? "embed" : "video"; + + _headers = { + "Referer": link, + "Connection": "keep-alive", + "Accept-Encoding": "gzip, deflate, br", + "Accept": "application/json, text/plain, */*", + "Accept-Language": + "res-ES,es;q=0.9,en-US;q=0.8,en-GB;q=0.7,en;q=0.6,fr;q=0.5,id;q=0.4", + }; + _response = await Dio(BaseOptions(headers: _headers)) + .get('https://vidcloud.ru/player', queryParameters: { + 'token': _token, + 'page': page, + 'fid': streamid, + }); + if (_response.data != null) { + String _jsonData = _response.data["html"]; + _regExp = new RegExp("sources\\s*=\\s*\\[(.*?)]"); + _m = _regExp.firstMatch(link); + _jsonData = null; + if (_m.groupCount > 0) _jsonData = _m.group(1); + if (_jsonData != null) { + final _arr = json.decode('[$_jsonData]'); + for (int i = 0; i < _arr.length(); i++) { + _link = _arr[i]['file']; + if (_link.contains(".mp4")) break; + } + + if (_link != null) _link = _link.replaceAll("\\", ""); + } + } + } + } + } + } on DioError catch (_) { + print(_.toString()); + return null; + } on Exception catch (_) { + print(_.toString()); + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/videobin.dart b/lib/actions/stream_link_convert/videobin.dart new file mode 100644 index 00000000..aa96fe92 --- /dev/null +++ b/lib/actions/stream_link_convert/videobin.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Videobin { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/embed-") + ? link + : "https://videobin.co/embed-" + link.split("/")[3]; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'videobin'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/videomega.dart b/lib/actions/stream_link_convert/videomega.dart new file mode 100644 index 00000000..b6b9c7b2 --- /dev/null +++ b/lib/actions/stream_link_convert/videomega.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Videomega { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/e/") + ? link + : "https://www.videomega.co/e/" + link.split("/")[3]; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'videomega'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vidfast.dart b/lib/actions/stream_link_convert/vidfast.dart new file mode 100644 index 00000000..d3d7f1ea --- /dev/null +++ b/lib/actions/stream_link_convert/vidfast.dart @@ -0,0 +1,23 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Vidfast { + static Future getUrl(String link) async { + String _link; + String _replaceLink = link.contains("/embed-") + ? link + : "https://vidfast.co/embed-" + + link.split("/")[3].replaceAll(".html", "") + + ".html"; + try { + final Response _response = await Dio().get(_replaceLink); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'vidfast', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vidia.dart b/lib/actions/stream_link_convert/vidia.dart new file mode 100644 index 00000000..15c878e3 --- /dev/null +++ b/lib/actions/stream_link_convert/vidia.dart @@ -0,0 +1,13 @@ +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Vidia { + static Future getUrl(String link) async { + String _link; + + final _result = await UrlResolverApi.instance.getDirectUrl(link, 'vidia'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vidlox.dart b/lib/actions/stream_link_convert/vidlox.dart new file mode 100644 index 00000000..b606a62f --- /dev/null +++ b/lib/actions/stream_link_convert/vidlox.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Vidlox { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = + await UrlResolverApi.instance.getDirectUrl(_response.data, 'vidlox'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vidoza.dart b/lib/actions/stream_link_convert/vidoza.dart new file mode 100644 index 00000000..fdcf80fc --- /dev/null +++ b/lib/actions/stream_link_convert/vidoza.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Vidoza { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = + await UrlResolverApi.instance.getDirectUrl(_response.data, 'vidoza'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vidtodo.dart b/lib/actions/stream_link_convert/vidtodo.dart new file mode 100644 index 00000000..9a2133da --- /dev/null +++ b/lib/actions/stream_link_convert/vidtodo.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Vidtodo { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = + await UrlResolverApi.instance.getDirectUrl(_response.data, 'vidtodo'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/vup.dart b/lib/actions/stream_link_convert/vup.dart new file mode 100644 index 00000000..58e75a2c --- /dev/null +++ b/lib/actions/stream_link_convert/vup.dart @@ -0,0 +1,18 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Vup { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link); + final _result = await UrlResolverApi.instance + .getDirectUrl(_response.data, 'vup', mode: 'local'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/stream_link_convert/waaw.dart b/lib/actions/stream_link_convert/waaw.dart new file mode 100644 index 00000000..70239ea6 --- /dev/null +++ b/lib/actions/stream_link_convert/waaw.dart @@ -0,0 +1,21 @@ +import 'package:dio/dio.dart'; +import 'package:movie/actions/api/urlresolver_api.dart'; + +class Waaw { + static Future getUrl(String link) async { + String _link; + try { + final Response _response = await Dio().get(link, + options: Options(headers: { + "accept": "*/*", + })); + final _result = + await UrlResolverApi.instance.getDirectUrl(_response.data, 'waaw'); + if (_result.success) if (_result.result['status'] == 'ok') + _link = _result.result['url']; + } on DioError catch (_) { + return null; + } + return _link; + } +} diff --git a/lib/actions/timeline.dart b/lib/actions/timeline.dart new file mode 100644 index 00000000..f3a5db36 --- /dev/null +++ b/lib/actions/timeline.dart @@ -0,0 +1,94 @@ +import 'package:common_utils/common_utils.dart'; + +class TimelineInfoEN implements TimelineInfo { + String suffixAgo() => ' ago'; + String suffixAfter() => ' after'; + String lessThanTenSecond() => 'just now'; + String customYesterday() => 'Yesterday'; + bool keepOneDay() => false; + bool keepTwoDays() => true; + String oneMinute(int minutes) => 'a minute'; + String minutes(int minutes) => '$minutes minutes'; + String anHour(int hours) => 'an hour'; + String hours(int hours) => '$hours hours'; + String oneDay(int days) => 'a day'; + String days(int days) => '$days days'; + DayFormat dayFormat() => DayFormat.Common; + + @override + String lessThanOneMinute() { + return 'one minute ago'; + } + + @override + int maxJustNowSecond() { + return 10; + } + + @override + String weeks(int week) { + throw '$week weeks ago'; + } +} + +class TimelineInfoCN implements TimelineInfo { + String suffixAgo() => '前'; + String suffixAfter() => '后'; + String lessThanTenSecond() => '刚刚'; + String customYesterday() => '昨天'; + bool keepOneDay() => false; + bool keepTwoDays() => true; + String oneMinute(int minutes) => '$minutes分钟'; + String minutes(int minutes) => '$minutes分钟'; + String anHour(int hours) => '$hours小时'; + String hours(int hours) => '$hours小时'; + String oneDay(int days) => '$days天'; + String days(int days) => '$days天'; + DayFormat dayFormat() => DayFormat.Common; + + @override + String lessThanOneMinute() { + return '1 分钟前'; + } + + @override + int maxJustNowSecond() { + return 10; + } + + @override + String weeks(int week) { + return '$week 星期前'; + } +} + +class TimelineInfoJA implements TimelineInfo { + String suffixAgo() => ' ago'; + String suffixAfter() => ' after'; + String lessThanTenSecond() => 'just now'; + String customYesterday() => 'Yesterday'; + bool keepOneDay() => false; + bool keepTwoDays() => true; + String oneMinute(int minutes) => 'a minute'; + String minutes(int minutes) => '$minutes minutes'; + String anHour(int hours) => 'an hour'; + String hours(int hours) => '$hours hours'; + String oneDay(int days) => 'a day'; + String days(int days) => '$days days'; + DayFormat dayFormat() => DayFormat.Common; + + @override + String lessThanOneMinute() { + return 'one minute ago'; + } + + @override + int maxJustNowSecond() { + return 10; + } + + @override + String weeks(int week) { + throw '$week weeks ago'; + } +} diff --git a/lib/actions/timeline_convert.dart b/lib/actions/timeline_convert.dart new file mode 100644 index 00000000..dcfcae1e --- /dev/null +++ b/lib/actions/timeline_convert.dart @@ -0,0 +1,15 @@ +import 'package:common_utils/common_utils.dart'; +import 'dart:ui' as ui; + +class TimeLineConvert { + TimeLineConvert._(); + static final TimeLineConvert instance = TimeLineConvert._(); + String getTimeLine(DateTime date) { + final _date = DateTime.parse(date.toString().split('.')[0]); + final String _timeline = TimelineUtil.format( + _date.millisecondsSinceEpoch, + locale: ui.window.locale.languageCode, + ); + return _timeline; + } +} diff --git a/lib/actions/user_info_operate.dart b/lib/actions/user_info_operate.dart new file mode 100644 index 00000000..a8adc2f0 --- /dev/null +++ b/lib/actions/user_info_operate.dart @@ -0,0 +1,75 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:movie/globalbasestate/action.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/user_premium_model.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'api/base_api.dart'; + +class UserInfoOperate { + static bool isPremium = false; + static String premiumExpireDate; + + static Future whenLogin(FirebaseUser user, String nickName) async { + final _baseApi = BaseApi.instance; + _baseApi.updateUser( + user.uid, user.email, user.photoUrl, nickName, user.phoneNumber); + + GlobalStore.store.dispatch(GlobalActionCreator.setUser( + AppUser(firebaseUser: user, premium: null))); + final _r = await _baseApi.getUserPremium(user.uid); + if (_r.success) { + if (_r.result.status) { + if (_r.result.data != null) await setPremium(_r.result.data); + } + } + print(_r); + } + + static Future whenLogout() async { + final FirebaseAuth _auth = FirebaseAuth.instance; + final FirebaseUser currentUser = await _auth.currentUser(); + SharedPreferences _preferences = await SharedPreferences.getInstance(); + if (currentUser != null) { + try { + _auth.signOut(); + _preferences.remove('PaymentToken'); + _preferences.remove('premiumData'); + premiumExpireDate = null; + GlobalStore.store.dispatch(GlobalActionCreator.setUser(null)); + } on Exception catch (_) { + return false; + } + return true; + } + return false; + } + + static Future whenAppStart() async { + var _user = await FirebaseAuth.instance.currentUser(); + if (_user != null) { + SharedPreferences _preferences = await SharedPreferences.getInstance(); + UserPremiumData _premiumData; + String _data = _preferences.getString('premiumData'); + if (_data != null) _premiumData = UserPremiumData(_data); + GlobalStore.store.dispatch(GlobalActionCreator.setUser( + AppUser(firebaseUser: _user, premium: _premiumData))); + } else + GlobalStore.store.dispatch(GlobalActionCreator.setUser(AppUser())); + } + + static Future setPremium(UserPremiumData userPremiumData) async { + SharedPreferences _preferences = await SharedPreferences.getInstance(); + _preferences.setString('premiumData', userPremiumData.toString()); + GlobalStore.store + .dispatch(GlobalActionCreator.setUserPremium(userPremiumData)); + } + + static bool checkPremium() { + isPremium = premiumExpireDate == null + ? false + : DateTime.parse(premiumExpireDate).compareTo(DateTime.now()) > 0; + return isPremium; + } +} diff --git a/lib/actions/version_comparison.dart b/lib/actions/version_comparison.dart new file mode 100644 index 00000000..6c5797f6 --- /dev/null +++ b/lib/actions/version_comparison.dart @@ -0,0 +1,45 @@ +import 'dart:math' as math; + +class VersionComparison { + bool compare(String now, String release) { + final List _v1 = now.replaceAll("v", "").split('.'); + final List _v2 = release.replaceAll("v", "").split('.'); + final _v1Lenght = _v1.length; + final _v2Lenght = _v2.length; + final _maxLenght = math.max(_v1Lenght, _v2Lenght); + final int _l = (_v1Lenght - _v2Lenght).abs(); + + if (_v1Lenght == 0 && _v2Lenght == 0) + return false; + else if (_v1Lenght == 0) + return true; + else if (_v2Lenght == 0) return false; + + if (_v1Lenght < _v2Lenght) + for (int i = 0; i < _l; i++) _v1.add('0'); + else if (_v1Lenght > _v2Lenght) for (int i = 0; i < _l; i++) _v2.add('0'); + + for (int i = 0; i < _maxLenght; i++) { + int _r = _compareNum(int.parse(_v1[i]), int.parse(_v2[i])); + if (_r == 0) + continue; + else { + if (_r == -1) + return true; + else + return false; + } + } + return false; + } + + int _compareNum(int n1, int n2) { + if (n1 > n2) { + return 1; + } else if (n1 < n2) { + return -1; + } else { + return 0; + } + } +} diff --git a/lib/actions/videourl.dart b/lib/actions/videourl.dart new file mode 100644 index 00000000..2482df01 --- /dev/null +++ b/lib/actions/videourl.dart @@ -0,0 +1,14 @@ +class VideoUrl{ +static String getUrl(String key,String type) + { + switch(type) + { + case 'YouTube': + return 'https://www.youtube.com/watch?v=$key'; + case 'Vimeo': + return key; + } + + return 'https://www.youtube.com/watch?v=$key'; + } +} \ No newline at end of file diff --git a/lib/actions/votecolorhelper.dart b/lib/actions/votecolorhelper.dart new file mode 100644 index 00000000..c2b00b42 --- /dev/null +++ b/lib/actions/votecolorhelper.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class VoteColorHelper { + static Color getColor(double s) { + Color r = const Color(0xFFFB5B3A); + if (s > 4.5 && s < 7) + r = const Color(0xFFF5AD6F); + else if (s >= 7) r = const Color(0xFF68C790); + return r; + } +} diff --git a/lib/app.dart b/lib/app.dart new file mode 100644 index 00000000..000e6310 --- /dev/null +++ b/lib/app.dart @@ -0,0 +1,90 @@ +import 'dart:io'; + +import 'package:common_utils/common_utils.dart'; +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:firebase_analytics/observer.dart'; +import 'package:flutter/material.dart' hide Action; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:movie/routes/routes.dart'; +import 'actions/app_config.dart'; +import 'actions/api/tmdb_api.dart'; +import 'actions/timeline.dart'; +import 'actions/user_info_operate.dart'; +import 'generated/i18n.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class App extends StatefulWidget { + App({Key key}) : super(key: key); + + @override + _AppState createState() => _AppState(); +} + +class _AppState extends State { + final i18n = I18n.delegate; + + final AbstractRoutes routes = Routes.routes; + final ThemeData _lightTheme = + ThemeData.light().copyWith(accentColor: Colors.transparent); + final ThemeData _darkTheme = + ThemeData.dark().copyWith(accentColor: Colors.transparent); + final FirebaseAnalytics analytics = FirebaseAnalytics(); + + Future _init() async { + if (Platform.isAndroid) + await PermissionHandler().requestPermissions([PermissionGroup.storage]); + setLocaleInfo('zh', TimelineInfoCN()); + setLocaleInfo('en', TimelineInfoEN()); + setLocaleInfo('Ja', TimelineInfoJA()); + + await AppConfig.instance.init(context); + + await TMDBApi.instance.init(); + + await UserInfoOperate.whenAppStart(); + } + + @override + void initState() { + I18n.onLocaleChanged = onLocaleChange; + + _init(); + super.initState(); + } + + void onLocaleChange(Locale locale) { + setState(() { + I18n.locale = locale; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'TMovie', + debugShowCheckedModeBanner: false, + theme: _lightTheme, + darkTheme: _darkTheme, + localizationsDelegates: [ + I18n.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: I18n.delegate.supportedLocales, + localeResolutionCallback: + I18n.delegate.resolution(fallback: new Locale("en", "US")), + navigatorObservers: [ + FirebaseAnalyticsObserver(analytics: analytics), + ], + home: routes.buildPage('startpage', null), + onGenerateRoute: (RouteSettings settings) { + return MaterialPageRoute(builder: (BuildContext context) { + return routes.buildPage(settings.name, settings.arguments); + }); + }, + ); + } +} diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart new file mode 100644 index 00000000..b8096e86 --- /dev/null +++ b/lib/generated/i18n.dart @@ -0,0 +1,2150 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: camel_case_types +// ignore_for_file: prefer_single_quotes +// ignore_for_file: unnecessary_brace_in_string_interps + +//WARNING: This file is automatically generated. DO NOT EDIT, all your changes would be lost. + +typedef LocaleChangeCallback = void Function(Locale locale); + +class I18n implements WidgetsLocalizations { + const I18n(); + static Locale _locale; + static bool _shouldReload = false; + + static set locale(Locale newLocale) { + _shouldReload = true; + I18n._locale = newLocale; + } + + static const GeneratedLocalizationsDelegate delegate = GeneratedLocalizationsDelegate(); + + /// function to be invoked when changing the language + static LocaleChangeCallback onLocaleChanged; + + static I18n of(BuildContext context) => + Localizations.of(context, WidgetsLocalizations); + + @override + TextDirection get textDirection => TextDirection.ltr; + + /// "Movie" + String get appname => "Movie"; + /// "Search for a movie, tv show, person" + String get searchbartxt => "Search for a movie, tv show, person"; + /// "Home" + String get home => "Home"; + /// "Discover" + String get discover => "Discover"; + /// "Coming" + String get coming => "Coming"; + /// "Account" + String get account => "Account"; + /// "In Theaters" + String get inTheaters => "In Theaters"; + /// "On TV" + String get onTV => "On TV"; + /// "OverView" + String get overView => "OverView"; + /// "Top Billed Cast" + String get topBilledCast => "Top Billed Cast"; + /// "User Score" + String get userScore => "User Score"; + /// "Stills" + String get stills => "Stills"; + /// "Keywords" + String get keyWords => "Keywords"; + /// "Trailers" + String get trailers => "Trailers"; + /// "Play Trailer" + String get playTrailer => "Play Trailer"; + /// "Main" + String get main => "Main"; + /// "Videos" + String get videos => "Videos"; + /// "Images" + String get images => "Images"; + /// "Reviews" + String get reviews => "Reviews"; + /// "Tags" + String get tags => "Tags"; + /// "Recommendations" + String get recommendations => "Recommendations"; + /// "Biography" + String get biography => "Biography"; + /// "Known For" + String get knownFor => "Known For"; + /// "Acting" + String get acting => "Acting"; + /// "Movies" + String get movies => "Movies"; + /// "TV Shows" + String get tvShows => "TV Shows"; + /// "Personal Info" + String get personalInfo => "Personal Info"; + /// "Gender" + String get gender => "Gender"; + /// "Birthday" + String get birthday => "Birthday"; + /// "Known Credits" + String get knownCredits => "Known Credits"; + /// "Place of Birth" + String get placeOfBirth => "Place of Birth"; + /// "official Site" + String get officialSite => "official Site"; + /// "Also Known As" + String get alsoKnownAs => "Also Known As"; + /// "Sort By" + String get sortBy => "Sort By"; + /// "Filter" + String get filter => "Filter"; + /// "Watchlist" + String get watchlist => "Watchlist"; + /// "Lists" + String get lists => "Lists"; + /// "Favorites" + String get favorites => "Favorites"; + /// "Ratings&Reviews" + String get ratingsReviews => "Ratings&Reviews"; + /// "Popular" + String get popular => "Popular"; + /// "More" + String get more => "More"; + /// "Featured Crew" + String get featuredCrew => "Featured Crew"; + /// "Creator" + String get creator => "Creator"; + /// "Seasons" + String get seasons => "Seasons"; + /// "Current Season" + String get currentSeason => "Current Season"; + /// "View All Seasons" + String get viewAllSeasons => "View All Seasons"; + /// "Season Detail" + String get seasonDetail => "Season Detail"; + /// "Season Cast" + String get seasonCast => "Season Cast"; + /// "Episodes" + String get episodes => "Episodes"; + /// "Guest Stars" + String get guestStars => "Guest Stars"; + /// "No guest star have been added" + String get guestStarsEmpty => "No guest star have been added"; + /// "Crew" + String get crew => "Crew"; + /// "No crew have been added" + String get crewEmpty => "No crew have been added"; + /// "Episode Images" + String get episodeImages => "Episode Images"; + /// "No episode image have been added" + String get episodeImagesEmpty => "No episode image have been added"; + /// "Facts" + String get facts => "Facts"; + /// "Network" + String get network => "Network"; + /// "Status" + String get status => "Status"; + /// "Type" + String get type => "Type"; + /// "Original Language" + String get originalLanguage => "Original Language"; + /// "Runtime" + String get runtime => "Runtime"; + /// "Genders" + String get genders => "Genders"; + /// "Release Information" + String get releaseInformation => "Release Information"; + /// "Budget" + String get budget => "Budget"; + /// "Revenue" + String get revenue => "Revenue"; + /// "Company" + String get company => "Company"; + /// "Play" + String get play => "Play"; + /// "Welcome back" + String get welcomeBack => "Welcome back"; + /// "Settings" + String get settings => "Settings"; + /// "Adult Content" + String get adultContent => "Adult Content"; + /// "Notifications" + String get notifications => "Notifications"; + /// "Dark Mode" + String get darkMode => "Dark Mode"; + /// "Language" + String get language => "Language"; + /// "Feedback" + String get feedback => "Feedback"; + /// "Version" + String get version => "Version"; + /// "Trending" + String get trending => "Trending"; + /// "Shared" + String get shared => "Shared"; + /// "Last Episode" + String get lastEpisode => "Last Episode"; + /// "Welcome" + String get welcome => "Welcome"; + /// "let start with few steps" + String get letStartWithFewSteps => "let start with few steps"; + /// "Continue" + String get continueA => "Continue"; + /// "Next" + String get next => "Next"; + /// "Back" + String get back => "Back"; + /// "Start" + String get start => "Start"; + /// "What kind of movie do you like" + String get whatKindOfMovieDoYouLike => "What kind of movie do you like"; + /// "What kind of tvshow do you like" + String get whatKindOfTvShowDoYouLike => "What kind of tvshow do you like"; +} + +class _I18n_en_US extends I18n { + const _I18n_en_US(); + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_zh_CN extends I18n { + const _I18n_zh_CN(); + + /// "电影" + @override + String get appname => "电影"; + /// "搜索电影、电视剧、演员" + @override + String get searchbartxt => "搜索电影、电视剧、演员"; + /// "主页" + @override + String get home => "主页"; + /// "发现" + @override + String get discover => "发现"; + /// "预播" + @override + String get coming => "预播"; + /// "账号" + @override + String get account => "账号"; + /// "上映中" + @override + String get inTheaters => "上映中"; + /// "放送中" + @override + String get onTV => "放送中"; + /// "概要" + @override + String get overView => "概要"; + /// "主要演员" + @override + String get topBilledCast => "主要演员"; + /// "用户评分" + @override + String get userScore => "用户评分"; + /// "剧照" + @override + String get stills => "剧照"; + /// "关键词" + @override + String get keyWords => "关键词"; + /// "预告片" + @override + String get trailers => "预告片"; + /// "播放预告" + @override + String get playTrailer => "播放预告"; + /// "主要" + @override + String get main => "主要"; + /// "视频" + @override + String get videos => "视频"; + /// "图片" + @override + String get images => "图片"; + /// "评论" + @override + String get reviews => "评论"; + /// "标签" + @override + String get tags => "标签"; + /// "推荐" + @override + String get recommendations => "推荐"; + /// "经历" + @override + String get biography => "经历"; + /// "被认识" + @override + String get knownFor => "被认识"; + /// "Acting" + @override + String get acting => "Acting"; + /// "电影" + @override + String get movies => "电影"; + /// "电视剧" + @override + String get tvShows => "电视剧"; + /// "个人信息" + @override + String get personalInfo => "个人信息"; + /// "性别" + @override + String get gender => "性别"; + /// "生日" + @override + String get birthday => "生日"; + /// "作品" + @override + String get knownCredits => "作品"; + /// "出生地" + @override + String get placeOfBirth => "出生地"; + /// "个人主页" + @override + String get officialSite => "个人主页"; + /// "被称为" + @override + String get alsoKnownAs => "被称为"; + /// "排序" + @override + String get sortBy => "排序"; + /// "过滤" + @override + String get filter => "过滤"; + /// "待看清单" + @override + String get watchlist => "待看清单"; + /// "收藏表" + @override + String get lists => "收藏表"; + /// "我的最爱" + @override + String get favorites => "我的最爱"; + /// "评分" + @override + String get ratingsReviews => "评分"; + /// "热门" + @override + String get popular => "热门"; + /// "更多" + @override + String get more => "更多"; + /// "主创人员" + @override + String get featuredCrew => "主创人员"; + /// "创作者" + @override + String get creator => "创作者"; + /// "季节" + @override + String get seasons => "季节"; + /// "当前季" + @override + String get currentSeason => "当前季"; + /// "View All Seasons" + @override + String get viewAllSeasons => "View All Seasons"; + /// "Season Detail" + @override + String get seasonDetail => "Season Detail"; + /// "Season Cast" + @override + String get seasonCast => "Season Cast"; + /// "Episodes" + @override + String get episodes => "Episodes"; + /// "Guest Stars" + @override + String get guestStars => "Guest Stars"; + /// "No guest star have been added" + @override + String get guestStarsEmpty => "No guest star have been added"; + /// "Crew" + @override + String get crew => "Crew"; + /// "No crew have been added" + @override + String get crewEmpty => "No crew have been added"; + /// "Episode Images" + @override + String get episodeImages => "Episode Images"; + /// "No episode image have been added" + @override + String get episodeImagesEmpty => "No episode image have been added"; + /// "Facts" + @override + String get facts => "Facts"; + /// "Network" + @override + String get network => "Network"; + /// "状态" + @override + String get status => "状态"; + /// "Type" + @override + String get type => "Type"; + /// "原始语言" + @override + String get originalLanguage => "原始语言"; + /// "Runtime" + @override + String get runtime => "Runtime"; + /// "Genders" + @override + String get genders => "Genders"; + /// "Release Information" + @override + String get releaseInformation => "Release Information"; + /// "Budget" + @override + String get budget => "Budget"; + /// "Revenue" + @override + String get revenue => "Revenue"; + /// "公司" + @override + String get company => "公司"; + /// "播放" + @override + String get play => "播放"; + /// "欢迎回来" + @override + String get welcomeBack => "欢迎回来"; + /// "设置" + @override + String get settings => "设置"; + /// "成人内容" + @override + String get adultContent => "成人内容"; + /// "通知" + @override + String get notifications => "通知"; + /// "黑暗模式" + @override + String get darkMode => "黑暗模式"; + /// "语言" + @override + String get language => "语言"; + /// "反馈" + @override + String get feedback => "反馈"; + /// "版本" + @override + String get version => "版本"; + /// "趋势" + @override + String get trending => "趋势"; + /// "分享" + @override + String get shared => "分享"; + /// "欢迎" + @override + String get welcome => "欢迎"; + /// "让我们从几个步骤开始" + @override + String get letStartWithFewSteps => "让我们从几个步骤开始"; + /// "继续" + @override + String get continueA => "继续"; + /// "前进" + @override + String get next => "前进"; + /// "后退" + @override + String get back => "后退"; + /// "开始" + @override + String get start => "开始"; + /// "你喜欢什么类型的电影" + @override + String get whatKindOfMovieDoYouLike => "你喜欢什么类型的电影"; + /// "你喜欢什么类型的电视节目" + @override + String get whatKindOfTvShowDoYouLike => "你喜欢什么类型的电视节目"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_ja_JP extends I18n { + const _I18n_ja_JP(); + + /// "Movie" + @override + String get appname => "Movie"; + /// "映画名、テレビ番組名、人物名で検索" + @override + String get searchbartxt => "映画名、テレビ番組名、人物名で検索"; + /// "ホーム" + @override + String get home => "ホーム"; + /// "発見" + @override + String get discover => "発見"; + /// "Coming" + @override + String get coming => "Coming"; + /// "アカウント" + @override + String get account => "アカウント"; + /// "上映中" + @override + String get inTheaters => "上映中"; + /// "放送中" + @override + String get onTV => "放送中"; + /// "概要" + @override + String get overView => "概要"; + /// "主な出演者" + @override + String get topBilledCast => "主な出演者"; + /// "ユーザースコア" + @override + String get userScore => "ユーザースコア"; + /// "静止画" + @override + String get stills => "静止画"; + /// "キーワード" + @override + String get keyWords => "キーワード"; + /// "トレーラー" + @override + String get trailers => "トレーラー"; + /// "予告編を再生" + @override + String get playTrailer => "予告編を再生"; + /// "メイン" + @override + String get main => "メイン"; + /// "動画" + @override + String get videos => "動画"; + /// "画像" + @override + String get images => "画像"; + /// "レビュー" + @override + String get reviews => "レビュー"; + /// "キーワード" + @override + String get tags => "キーワード"; + /// "おすすめ" + @override + String get recommendations => "おすすめ"; + /// "経歴" + @override + String get biography => "経歴"; + /// "仕事" + @override + String get knownFor => "仕事"; + /// "演技" + @override + String get acting => "演技"; + /// "映画" + @override + String get movies => "映画"; + /// "テレビ番組" + @override + String get tvShows => "テレビ番組"; + /// "プロフィール" + @override + String get personalInfo => "プロフィール"; + /// "性別" + @override + String get gender => "性別"; + /// "誕生日" + @override + String get birthday => "誕生日"; + /// "既知のクレジット" + @override + String get knownCredits => "既知のクレジット"; + /// "出生地" + @override + String get placeOfBirth => "出生地"; + /// "公式サイト" + @override + String get officialSite => "公式サイト"; + /// "別の呼び方" + @override + String get alsoKnownAs => "別の呼び方"; + /// "並び替え" + @override + String get sortBy => "並び替え"; + /// "フィルタ" + @override + String get filter => "フィルタ"; + /// "ウォッチリスト" + @override + String get watchlist => "ウォッチリスト"; + /// "リスト" + @override + String get lists => "リスト"; + /// "お気に入り" + @override + String get favorites => "お気に入り"; + /// "評価とレビュー" + @override + String get ratingsReviews => "評価とレビュー"; + /// "人気の" + @override + String get popular => "人気の"; + /// "もっと" + @override + String get more => "もっと"; + /// "主なスタッフ" + @override + String get featuredCrew => "主なスタッフ"; + /// "Creator" + @override + String get creator => "Creator"; + /// "季節" + @override + String get seasons => "季節"; + /// "現在のシーズン" + @override + String get currentSeason => "現在のシーズン"; + /// "View All Seasons" + @override + String get viewAllSeasons => "View All Seasons"; + /// "Season Detail" + @override + String get seasonDetail => "Season Detail"; + /// "Season Cast" + @override + String get seasonCast => "Season Cast"; + /// "Episodes" + @override + String get episodes => "Episodes"; + /// "Guest Stars" + @override + String get guestStars => "Guest Stars"; + /// "No guest star have been added" + @override + String get guestStarsEmpty => "No guest star have been added"; + /// "Crew" + @override + String get crew => "Crew"; + /// "No crew have been added" + @override + String get crewEmpty => "No crew have been added"; + /// "Episode Images" + @override + String get episodeImages => "Episode Images"; + /// "No episode image have been added" + @override + String get episodeImagesEmpty => "No episode image have been added"; + /// "Facts" + @override + String get facts => "Facts"; + /// "Network" + @override + String get network => "Network"; + /// "Status" + @override + String get status => "Status"; + /// "Type" + @override + String get type => "Type"; + /// "Original Language" + @override + String get originalLanguage => "Original Language"; + /// "Runtime" + @override + String get runtime => "Runtime"; + /// "Genders" + @override + String get genders => "Genders"; + /// "Release Information" + @override + String get releaseInformation => "Release Information"; + /// "Budget" + @override + String get budget => "Budget"; + /// "Revenue" + @override + String get revenue => "Revenue"; + /// "Company" + @override + String get company => "Company"; + /// "Play" + @override + String get play => "Play"; + /// "お帰りなさい" + @override + String get welcomeBack => "お帰りなさい"; + /// "設定" + @override + String get settings => "設定"; + /// "成人コンテンツ" + @override + String get adultContent => "成人コンテンツ"; + /// "お知らせ" + @override + String get notifications => "お知らせ"; + /// "Dark Mode" + @override + String get darkMode => "Dark Mode"; + /// "言語" + @override + String get language => "言語"; + /// "フィードバック" + @override + String get feedback => "フィードバック"; + /// "バージョン" + @override + String get version => "バージョン"; + /// "急上昇" + @override + String get trending => "急上昇"; + /// "共有" + @override + String get shared => "共有"; + /// "ようこそ" + @override + String get welcome => "ようこそ"; + /// "いくつかのステップから始めましょう" + @override + String get letStartWithFewSteps => "いくつかのステップから始めましょう"; + /// "継続する" + @override + String get continueA => "継続する"; + /// "Next" + @override + String get next => "Next"; + /// "Back" + @override + String get back => "Back"; + /// "Start" + @override + String get start => "Start"; + /// "どんな映画が好きですか" + @override + String get whatKindOfMovieDoYouLike => "どんな映画が好きですか"; + /// "どんなテレビ番組が好きですか" + @override + String get whatKindOfTvShowDoYouLike => "どんなテレビ番組が好きですか"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_zh_TW extends _I18n_zh_CN { + const _I18n_zh_TW(); + + /// "电影" + @override + String get appname => "电影"; + /// "搜索电影,电视节目,人物" + @override + String get searchbartxt => "搜索电影,电视节目,人物"; + /// "家" + @override + String get home => "家"; + /// "发现" + @override + String get discover => "发现"; + /// "未来" + @override + String get coming => "未来"; + /// "帐户" + @override + String get account => "帐户"; + /// "在剧院" + @override + String get inTheaters => "在剧院"; + /// "在电视上" + @override + String get onTV => "在电视上"; + /// "概观" + @override + String get overView => "概观"; + /// "热门付费演员表" + @override + String get topBilledCast => "热门付费演员表"; + /// "用户分数" + @override + String get userScore => "用户分数"; + /// "剧照" + @override + String get stills => "剧照"; + /// "关键词" + @override + String get keyWords => "关键词"; + /// "预告片" + @override + String get trailers => "预告片"; + /// "播放预告片" + @override + String get playTrailer => "播放预告片"; + /// "主要" + @override + String get main => "主要"; + /// "影片" + @override + String get videos => "影片"; + /// "图片" + @override + String get images => "图片"; + /// "评论" + @override + String get reviews => "评论"; + /// "标签" + @override + String get tags => "标签"; + /// "推荐建议" + @override + String get recommendations => "推荐建议"; + /// "传" + @override + String get biography => "传"; + /// "闻名" + @override + String get knownFor => "闻名"; + /// "代理" + @override + String get acting => "代理"; + /// "电影" + @override + String get movies => "电影"; + /// "电视节目" + @override + String get tvShows => "电视节目"; + /// "个人信息" + @override + String get personalInfo => "个人信息"; + /// "性别" + @override + String get gender => "性别"; + /// "生日" + @override + String get birthday => "生日"; + /// "已知学分" + @override + String get knownCredits => "已知学分"; + /// "出生地" + @override + String get placeOfBirth => "出生地"; + /// "官方网站" + @override + String get officialSite => "官方网站"; + /// "也称为" + @override + String get alsoKnownAs => "也称为"; + /// "排序方式" + @override + String get sortBy => "排序方式"; + /// "过滤" + @override + String get filter => "过滤"; + /// "监视清单" + @override + String get watchlist => "监视清单"; + /// "清单" + @override + String get lists => "清单"; + /// "收藏夹" + @override + String get favorites => "收藏夹"; + /// "评分与评论" + @override + String get ratingsReviews => "评分与评论"; + /// "流行" + @override + String get popular => "流行"; + /// "更多" + @override + String get more => "更多"; + /// "精选船员" + @override + String get featuredCrew => "精选船员"; + /// "创作者" + @override + String get creator => "创作者"; + /// "季节" + @override + String get seasons => "季节"; + /// "当前季节" + @override + String get currentSeason => "当前季节"; + /// "查看所有季节" + @override + String get viewAllSeasons => "查看所有季节"; + /// "季节细节" + @override + String get seasonDetail => "季节细节"; + /// "季播" + @override + String get seasonCast => "季播"; + /// "集数" + @override + String get episodes => "集数"; + /// "客串明星" + @override + String get guestStars => "客串明星"; + /// "尚未添加来宾星级" + @override + String get guestStarsEmpty => "尚未添加来宾星级"; + /// "船员" + @override + String get crew => "船员"; + /// "尚未添加任何机组" + @override + String get crewEmpty => "尚未添加任何机组"; + /// "情节图像" + @override + String get episodeImages => "情节图像"; + /// "没有添加剧集图片" + @override + String get episodeImagesEmpty => "没有添加剧集图片"; + /// "事实" + @override + String get facts => "事实"; + /// "网络" + @override + String get network => "网络"; + /// "状态" + @override + String get status => "状态"; + /// "类型" + @override + String get type => "类型"; + /// "原始语言" + @override + String get originalLanguage => "原始语言"; + /// "运行" + @override + String get runtime => "运行"; + /// "性别" + @override + String get genders => "性别"; + /// "发布信息" + @override + String get releaseInformation => "发布信息"; + /// "预算" + @override + String get budget => "预算"; + /// "收入" + @override + String get revenue => "收入"; + /// "公司" + @override + String get company => "公司"; + /// "玩" + @override + String get play => "玩"; + /// "欢迎回来" + @override + String get welcomeBack => "欢迎回来"; + /// "设定值" + @override + String get settings => "设定值"; + /// "成人内容" + @override + String get adultContent => "成人内容"; + /// "通知事项" + @override + String get notifications => "通知事项"; + /// "暗模式" + @override + String get darkMode => "暗模式"; + /// "语言" + @override + String get language => "语言"; + /// "反馈" + @override + String get feedback => "反馈"; + /// "版本" + @override + String get version => "版本"; + /// "趋势" + @override + String get trending => "趋势"; + /// "分享" + @override + String get shared => "分享"; + /// "Welcome" + @override + String get welcome => "Welcome"; + /// "let start with few steps" + @override + String get letStartWithFewSteps => "let start with few steps"; + /// "Continue" + @override + String get continueA => "Continue"; + /// "Next" + @override + String get next => "Next"; + /// "Back" + @override + String get back => "Back"; + /// "Start" + @override + String get start => "Start"; + /// "What kind of movie do you like" + @override + String get whatKindOfMovieDoYouLike => "What kind of movie do you like"; + /// "What kind of tvshow do you like" + @override + String get whatKindOfTvShowDoYouLike => "What kind of tvshow do you like"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_es_ES extends I18n { + const _I18n_es_ES(); + + /// "Película" + @override + String get appname => "Película"; + /// "Busca una película, un programa de televisión, una persona" + @override + String get searchbartxt => "Busca una película, un programa de televisión, una persona"; + /// "Hogar" + @override + String get home => "Hogar"; + /// "Descubrir" + @override + String get discover => "Descubrir"; + /// "Viniendo" + @override + String get coming => "Viniendo"; + /// "Cuenta" + @override + String get account => "Cuenta"; + /// "En los cines" + @override + String get inTheaters => "En los cines"; + /// "En TV" + @override + String get onTV => "En TV"; + /// "Visión de conjunto" + @override + String get overView => "Visión de conjunto"; + /// "Reparto más facturado" + @override + String get topBilledCast => "Reparto más facturado"; + /// "Puntuación de usuario" + @override + String get userScore => "Puntuación de usuario"; + /// "Fotogramas" + @override + String get stills => "Fotogramas"; + /// "Palabras clave" + @override + String get keyWords => "Palabras clave"; + /// "Remolques" + @override + String get trailers => "Remolques"; + /// "Reproducir tráiler" + @override + String get playTrailer => "Reproducir tráiler"; + /// "Principal" + @override + String get main => "Principal"; + /// "Videos" + @override + String get videos => "Videos"; + /// "Imagenes" + @override + String get images => "Imagenes"; + /// "Reseñas" + @override + String get reviews => "Reseñas"; + /// "Etiquetas" + @override + String get tags => "Etiquetas"; + /// "Recomendaciones" + @override + String get recommendations => "Recomendaciones"; + /// "Biografía" + @override + String get biography => "Biografía"; + /// "Conocido por" + @override + String get knownFor => "Conocido por"; + /// "Interino" + @override + String get acting => "Interino"; + /// "Películas" + @override + String get movies => "Películas"; + /// "Programas de tv" + @override + String get tvShows => "Programas de tv"; + /// "Información personal" + @override + String get personalInfo => "Información personal"; + /// "Género" + @override + String get gender => "Género"; + /// "Cumpleaños" + @override + String get birthday => "Cumpleaños"; + /// "Créditos conocidos" + @override + String get knownCredits => "Créditos conocidos"; + /// "Lugar de nacimiento" + @override + String get placeOfBirth => "Lugar de nacimiento"; + /// "sitio oficial" + @override + String get officialSite => "sitio oficial"; + /// "También conocido como" + @override + String get alsoKnownAs => "También conocido como"; + /// "Ordenar por" + @override + String get sortBy => "Ordenar por"; + /// "Filtrar" + @override + String get filter => "Filtrar"; + /// "Lista de seguimiento" + @override + String get watchlist => "Lista de seguimiento"; + /// "Liza" + @override + String get lists => "Liza"; + /// "Favoritos" + @override + String get favorites => "Favoritos"; + /// "Calificaciones y reseñas" + @override + String get ratingsReviews => "Calificaciones y reseñas"; + /// "Popular" + @override + String get popular => "Popular"; + /// "Más" + @override + String get more => "Más"; + /// "Tripulación destacada" + @override + String get featuredCrew => "Tripulación destacada"; + /// "Creador" + @override + String get creator => "Creador"; + /// "Estaciones" + @override + String get seasons => "Estaciones"; + /// "Temporada actual" + @override + String get currentSeason => "Temporada actual"; + /// "Ver todas las temporadas" + @override + String get viewAllSeasons => "Ver todas las temporadas"; + /// "Detalle de temporada" + @override + String get seasonDetail => "Detalle de temporada"; + /// "Reparto de la temporada" + @override + String get seasonCast => "Reparto de la temporada"; + /// "Episodios" + @override + String get episodes => "Episodios"; + /// "Estrellas invitadas" + @override + String get guestStars => "Estrellas invitadas"; + /// "No se ha agregado ninguna estrella invitada" + @override + String get guestStarsEmpty => "No se ha agregado ninguna estrella invitada"; + /// "Tripulación" + @override + String get crew => "Tripulación"; + /// "No se ha agregado tripulación" + @override + String get crewEmpty => "No se ha agregado tripulación"; + /// "Imágenes del episodio" + @override + String get episodeImages => "Imágenes del episodio"; + /// "No se ha agregado ninguna imagen de episodio" + @override + String get episodeImagesEmpty => "No se ha agregado ninguna imagen de episodio"; + /// "Hechos" + @override + String get facts => "Hechos"; + /// "Red" + @override + String get network => "Red"; + /// "Estado" + @override + String get status => "Estado"; + /// "Tipo" + @override + String get type => "Tipo"; + /// "Idioma original" + @override + String get originalLanguage => "Idioma original"; + /// "Tiempo de ejecución" + @override + String get runtime => "Tiempo de ejecución"; + /// "Géneros" + @override + String get genders => "Géneros"; + /// "Información de lanzamiento" + @override + String get releaseInformation => "Información de lanzamiento"; + /// "Presupuesto" + @override + String get budget => "Presupuesto"; + /// "Ingresos" + @override + String get revenue => "Ingresos"; + /// "Empresa" + @override + String get company => "Empresa"; + /// "Jugar" + @override + String get play => "Jugar"; + /// "Dar una buena acogida" + @override + String get welcomeBack => "Dar una buena acogida"; + /// "Settings" + @override + String get settings => "Settings"; + /// "Contenido para adultos" + @override + String get adultContent => "Contenido para adultos"; + /// "Notificaciones" + @override + String get notifications => "Notificaciones"; + /// "Modo oscuro" + @override + String get darkMode => "Modo oscuro"; + /// "Idioma" + @override + String get language => "Idioma"; + /// "Realimentación" + @override + String get feedback => "Realimentación"; + /// "Versión" + @override + String get version => "Versión"; + /// "Tendencias" + @override + String get trending => "Tendencias"; + /// "Compartido" + @override + String get shared => "Compartido"; + /// "Bienvenidos" + @override + String get welcome => "Bienvenidos"; + /// "vamos a empezar con unos pocos pasos" + @override + String get letStartWithFewSteps => "vamos a empezar con unos pocos pasos"; + /// "Seguir" + @override + String get continueA => "Seguir"; + /// "Próximo" + @override + String get next => "Próximo"; + /// "Espalda" + @override + String get back => "Espalda"; + /// "Comienzo" + @override + String get start => "Comienzo"; + /// "Que tipo de peliculas te gustan" + @override + String get whatKindOfMovieDoYouLike => "Que tipo de peliculas te gustan"; + /// "¿Qué tipo de programa de televisión te gusta" + @override + String get whatKindOfTvShowDoYouLike => "¿Qué tipo de programa de televisión te gusta"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_fr_FR extends I18n { + const _I18n_fr_FR(); + + /// "Film" + @override + String get appname => "Film"; + /// "Rechercher un film, une émission de télévision, une personne" + @override + String get searchbartxt => "Rechercher un film, une émission de télévision, une personne"; + /// "Accueil" + @override + String get home => "Accueil"; + /// "Découvrir" + @override + String get discover => "Découvrir"; + /// "À venir" + @override + String get coming => "À venir"; + /// "Compte" + @override + String get account => "Compte"; + /// "Dans les théâtres" + @override + String get inTheaters => "Dans les théâtres"; + /// "À la télé" + @override + String get onTV => "À la télé"; + /// "Aperçu" + @override + String get overView => "Aperçu"; + /// "Meilleur casting facturé" + @override + String get topBilledCast => "Meilleur casting facturé"; + /// "Score de l'utilisateur" + @override + String get userScore => "Score de l'utilisateur"; + /// "Photos" + @override + String get stills => "Photos"; + /// "Mots clés" + @override + String get keyWords => "Mots clés"; + /// "Bandes annonces" + @override + String get trailers => "Bandes annonces"; + /// "Jouer la bande-annonce" + @override + String get playTrailer => "Jouer la bande-annonce"; + /// "Principale" + @override + String get main => "Principale"; + /// "Vidéos" + @override + String get videos => "Vidéos"; + /// "Images" + @override + String get images => "Images"; + /// "Commentaires" + @override + String get reviews => "Commentaires"; + /// "Mots clés" + @override + String get tags => "Mots clés"; + /// "Recommandations" + @override + String get recommendations => "Recommandations"; + /// "Biographie" + @override + String get biography => "Biographie"; + /// "Connu pour" + @override + String get knownFor => "Connu pour"; + /// "Agissant" + @override + String get acting => "Agissant"; + /// "Films" + @override + String get movies => "Films"; + /// "Émissions de télévision" + @override + String get tvShows => "Émissions de télévision"; + /// "Informations personnelles" + @override + String get personalInfo => "Informations personnelles"; + /// "Le sexe" + @override + String get gender => "Le sexe"; + /// "Anniversaire" + @override + String get birthday => "Anniversaire"; + /// "Crédits connus" + @override + String get knownCredits => "Crédits connus"; + /// "Lieu de naissance" + @override + String get placeOfBirth => "Lieu de naissance"; + /// "site officiel" + @override + String get officialSite => "site officiel"; + /// "Aussi connu sous le nom" + @override + String get alsoKnownAs => "Aussi connu sous le nom"; + /// "Trier par" + @override + String get sortBy => "Trier par"; + /// "Filtre" + @override + String get filter => "Filtre"; + /// "Liste de surveillance" + @override + String get watchlist => "Liste de surveillance"; + /// "Listes" + @override + String get lists => "Listes"; + /// "Favoris" + @override + String get favorites => "Favoris"; + /// "Notes et avis" + @override + String get ratingsReviews => "Notes et avis"; + /// "Populaire" + @override + String get popular => "Populaire"; + /// "Plus" + @override + String get more => "Plus"; + /// "Équipage en vedette" + @override + String get featuredCrew => "Équipage en vedette"; + /// "Créateur" + @override + String get creator => "Créateur"; + /// "Saisons" + @override + String get seasons => "Saisons"; + /// "Saison en cours" + @override + String get currentSeason => "Saison en cours"; + /// "Voir toutes les saisons" + @override + String get viewAllSeasons => "Voir toutes les saisons"; + /// "Détail de la saison" + @override + String get seasonDetail => "Détail de la saison"; + /// "Distribution de la saison" + @override + String get seasonCast => "Distribution de la saison"; + /// "Épisodes" + @override + String get episodes => "Épisodes"; + /// "Des invités de prestige" + @override + String get guestStars => "Des invités de prestige"; + /// "Aucune guest star n'a été ajoutée" + @override + String get guestStarsEmpty => "Aucune guest star n'a été ajoutée"; + /// "Équipage" + @override + String get crew => "Équipage"; + /// "Aucun équipage n'a été ajouté" + @override + String get crewEmpty => "Aucun équipage n'a été ajouté"; + /// "Images d'épisode" + @override + String get episodeImages => "Images d'épisode"; + /// "Aucune image d'épisode n'a été ajoutée" + @override + String get episodeImagesEmpty => "Aucune image d'épisode n'a été ajoutée"; + /// "Les faits" + @override + String get facts => "Les faits"; + /// "Réseau" + @override + String get network => "Réseau"; + /// "Statut" + @override + String get status => "Statut"; + /// "Type" + @override + String get type => "Type"; + /// "Langue originale" + @override + String get originalLanguage => "Langue originale"; + /// "Durée" + @override + String get runtime => "Durée"; + /// "Les genres" + @override + String get genders => "Les genres"; + /// "Divulguer des renseignements" + @override + String get releaseInformation => "Divulguer des renseignements"; + /// "Budget" + @override + String get budget => "Budget"; + /// "Revenu" + @override + String get revenue => "Revenu"; + /// "Compagnie" + @override + String get company => "Compagnie"; + /// "Jouer" + @override + String get play => "Jouer"; + /// "Nous saluons le retour" + @override + String get welcomeBack => "Nous saluons le retour"; + /// "Paramètres" + @override + String get settings => "Paramètres"; + /// "Contenu adulte" + @override + String get adultContent => "Contenu adulte"; + /// "Notifications" + @override + String get notifications => "Notifications"; + /// "Mode sombre" + @override + String get darkMode => "Mode sombre"; + /// "Langue" + @override + String get language => "Langue"; + /// "Retour d'information" + @override + String get feedback => "Retour d'information"; + /// "Version" + @override + String get version => "Version"; + /// "Tendance" + @override + String get trending => "Tendance"; + /// "partagé" + @override + String get shared => "partagé"; + /// "Bienvenu" + @override + String get welcome => "Bienvenu"; + /// "commençons par quelques étapes" + @override + String get letStartWithFewSteps => "commençons par quelques étapes"; + /// "Continuer" + @override + String get continueA => "Continuer"; + /// "Prochain" + @override + String get next => "Prochain"; + /// "Arrière" + @override + String get back => "Arrière"; + /// "Début" + @override + String get start => "Début"; + /// "Quel genre de film aimez-vous" + @override + String get whatKindOfMovieDoYouLike => "Quel genre de film aimez-vous"; + /// "Quel genre de télé-émission aimez-vous" + @override + String get whatKindOfTvShowDoYouLike => "Quel genre de télé-émission aimez-vous"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_ru_RU extends I18n { + const _I18n_ru_RU(); + + /// "Фильм" + @override + String get appname => "Фильм"; + /// "Искать фильм, сериал, человека" + @override + String get searchbartxt => "Искать фильм, сериал, человека"; + /// "Домой" + @override + String get home => "Домой"; + /// "Обнаружить" + @override + String get discover => "Обнаружить"; + /// "приход" + @override + String get coming => "приход"; + /// "учетная запись" + @override + String get account => "учетная запись"; + /// "В театрах" + @override + String get inTheaters => "В театрах"; + /// "По телевизору" + @override + String get onTV => "По телевизору"; + /// "OverView" + @override + String get overView => "OverView"; + /// "Лучшие актеры" + @override + String get topBilledCast => "Лучшие актеры"; + /// "Оценка пользователей" + @override + String get userScore => "Оценка пользователей"; + /// "Кадры из фильма" + @override + String get stills => "Кадры из фильма"; + /// "Ключевые слова" + @override + String get keyWords => "Ключевые слова"; + /// "Прицепы" + @override + String get trailers => "Прицепы"; + /// "Слушать трейлер" + @override + String get playTrailer => "Слушать трейлер"; + /// "Основной" + @override + String get main => "Основной"; + /// "Ролики" + @override + String get videos => "Ролики"; + /// "Изображений" + @override + String get images => "Изображений"; + /// "Отзывы" + @override + String get reviews => "Отзывы"; + /// "Теги" + @override + String get tags => "Теги"; + /// "рекомендации" + @override + String get recommendations => "рекомендации"; + /// "биография" + @override + String get biography => "биография"; + /// "Известный" + @override + String get knownFor => "Известный"; + /// "Действующий" + @override + String get acting => "Действующий"; + /// "Фильмы" + @override + String get movies => "Фильмы"; + /// "ТВ шоу" + @override + String get tvShows => "ТВ шоу"; + /// "Личная информация" + @override + String get personalInfo => "Личная информация"; + /// "Пол" + @override + String get gender => "Пол"; + /// "день рождения" + @override + String get birthday => "день рождения"; + /// "Известные кредиты" + @override + String get knownCredits => "Известные кредиты"; + /// "Место рождения" + @override + String get placeOfBirth => "Место рождения"; + /// "официальный сайт" + @override + String get officialSite => "официальный сайт"; + /// "Также известный как" + @override + String get alsoKnownAs => "Также известный как"; + /// "Сортировать по" + @override + String get sortBy => "Сортировать по"; + /// "Фильтр" + @override + String get filter => "Фильтр"; + /// "Список" + @override + String get watchlist => "Список"; + /// "Списки" + @override + String get lists => "Списки"; + /// "Избранные" + @override + String get favorites => "Избранные"; + /// "Рейтинги и отзывы" + @override + String get ratingsReviews => "Рейтинги и отзывы"; + /// "Популярный" + @override + String get popular => "Популярный"; + /// "Больше" + @override + String get more => "Больше"; + /// "Избранный экипаж" + @override + String get featuredCrew => "Избранный экипаж"; + /// "творец" + @override + String get creator => "творец"; + /// "Времена года" + @override + String get seasons => "Времена года"; + /// "Текущий сезон" + @override + String get currentSeason => "Текущий сезон"; + /// "Просмотреть все сезоны" + @override + String get viewAllSeasons => "Просмотреть все сезоны"; + /// "Детали сезона" + @override + String get seasonDetail => "Детали сезона"; + /// "Сезонный состав" + @override + String get seasonCast => "Сезонный состав"; + /// "Эпизоды" + @override + String get episodes => "Эпизоды"; + /// "Приглашенные звезды" + @override + String get guestStars => "Приглашенные звезды"; + /// "Приглашенная звезда не добавлена" + @override + String get guestStarsEmpty => "Приглашенная звезда не добавлена"; + /// "экипаж" + @override + String get crew => "экипаж"; + /// "Экипаж не добавлен" + @override + String get crewEmpty => "Экипаж не добавлен"; + /// "Изображения эпизодов" + @override + String get episodeImages => "Изображения эпизодов"; + /// "Изображение эпизода не добавлено" + @override + String get episodeImagesEmpty => "Изображение эпизода не добавлено"; + /// "факты" + @override + String get facts => "факты"; + /// "сеть" + @override + String get network => "сеть"; + /// "Положение дел" + @override + String get status => "Положение дел"; + /// "Тип" + @override + String get type => "Тип"; + /// "Исходный язык" + @override + String get originalLanguage => "Исходный язык"; + /// "время выполнения" + @override + String get runtime => "время выполнения"; + /// "Genders" + @override + String get genders => "Genders"; + /// "Информация о выпуске" + @override + String get releaseInformation => "Информация о выпуске"; + /// "бюджет" + @override + String get budget => "бюджет"; + /// "доходов" + @override + String get revenue => "доходов"; + /// "Компания" + @override + String get company => "Компания"; + /// "Играть" + @override + String get play => "Играть"; + /// "Добро пожаловать" + @override + String get welcomeBack => "Добро пожаловать"; + /// "настройки" + @override + String get settings => "настройки"; + /// "Контент для взрослых" + @override + String get adultContent => "Контент для взрослых"; + /// "Уведомления" + @override + String get notifications => "Уведомления"; + /// "Темный режим" + @override + String get darkMode => "Темный режим"; + /// "язык" + @override + String get language => "язык"; + /// "Обратная связь" + @override + String get feedback => "Обратная связь"; + /// "Версия" + @override + String get version => "Версия"; + /// "Trending" + @override + String get trending => "Trending"; + /// "Общий" + @override + String get shared => "Общий"; + /// "Добро пожаловать" + @override + String get welcome => "Добро пожаловать"; + /// "давай начнем с нескольких шагов" + @override + String get letStartWithFewSteps => "давай начнем с нескольких шагов"; + /// "Продолжать" + @override + String get continueA => "Продолжать"; + /// "Next" + @override + String get next => "Next"; + /// "Back" + @override + String get back => "Back"; + /// "Start" + @override + String get start => "Start"; + /// "Какой фильм тебе нравится" + @override + String get whatKindOfMovieDoYouLike => "Какой фильм тебе нравится"; + /// "Какое телешоу тебе нравится" + @override + String get whatKindOfTvShowDoYouLike => "Какое телешоу тебе нравится"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class _I18n_de_DE extends I18n { + const _I18n_de_DE(); + + /// "Film" + @override + String get appname => "Film"; + /// "Suche nach einem Film, einer Fernsehsendung, einer Person" + @override + String get searchbartxt => "Suche nach einem Film, einer Fernsehsendung, einer Person"; + /// "Zuhause" + @override + String get home => "Zuhause"; + /// "Entdecken" + @override + String get discover => "Entdecken"; + /// "Kommen" + @override + String get coming => "Kommen"; + /// "Konto" + @override + String get account => "Konto"; + /// "In Theatern" + @override + String get inTheaters => "In Theatern"; + /// "Im Fernsehen" + @override + String get onTV => "Im Fernsehen"; + /// "Überblick" + @override + String get overView => "Überblick"; + /// "Top Billed Cast" + @override + String get topBilledCast => "Top Billed Cast"; + /// "User Score" + @override + String get userScore => "User Score"; + /// "Stills" + @override + String get stills => "Stills"; + /// "Schlüsselwörter" + @override + String get keyWords => "Schlüsselwörter"; + /// "Anhänger" + @override + String get trailers => "Anhänger"; + /// "Trailer abspielen" + @override + String get playTrailer => "Trailer abspielen"; + /// "Main" + @override + String get main => "Main"; + /// "Videos" + @override + String get videos => "Videos"; + /// "Bilder" + @override + String get images => "Bilder"; + /// "Bewertungen" + @override + String get reviews => "Bewertungen"; + /// "Stichworte" + @override + String get tags => "Stichworte"; + /// "Empfehlungen" + @override + String get recommendations => "Empfehlungen"; + /// "Biografie" + @override + String get biography => "Biografie"; + /// "Bekannt für" + @override + String get knownFor => "Bekannt für"; + /// "Schauspielkunst" + @override + String get acting => "Schauspielkunst"; + /// "Filme" + @override + String get movies => "Filme"; + /// "Fernsehshows" + @override + String get tvShows => "Fernsehshows"; + /// "Persönliche Informationen" + @override + String get personalInfo => "Persönliche Informationen"; + /// "Geschlecht" + @override + String get gender => "Geschlecht"; + /// "Geburtstag" + @override + String get birthday => "Geburtstag"; + /// "Bekannte Credits" + @override + String get knownCredits => "Bekannte Credits"; + /// "Geburtsort" + @override + String get placeOfBirth => "Geburtsort"; + /// "offizielle Seite" + @override + String get officialSite => "offizielle Seite"; + /// "Auch bekannt als" + @override + String get alsoKnownAs => "Auch bekannt als"; + /// "Sortiere nach" + @override + String get sortBy => "Sortiere nach"; + /// "Filter" + @override + String get filter => "Filter"; + /// "Beobachtungsliste" + @override + String get watchlist => "Beobachtungsliste"; + /// "Listen" + @override + String get lists => "Listen"; + /// "Favoriten" + @override + String get favorites => "Favoriten"; + /// "Bewertungen & Bewertungen" + @override + String get ratingsReviews => "Bewertungen & Bewertungen"; + /// "Beliebt" + @override + String get popular => "Beliebt"; + /// "Mehr" + @override + String get more => "Mehr"; + /// "Ausgewählte Crew" + @override + String get featuredCrew => "Ausgewählte Crew"; + /// "Schöpfer" + @override + String get creator => "Schöpfer"; + /// "Jahreszeiten" + @override + String get seasons => "Jahreszeiten"; + /// "Aktuelle Saison" + @override + String get currentSeason => "Aktuelle Saison"; + /// "Alle Jahreszeiten anzeigen" + @override + String get viewAllSeasons => "Alle Jahreszeiten anzeigen"; + /// "Saison Detail" + @override + String get seasonDetail => "Saison Detail"; + /// "Staffelbesetzung" + @override + String get seasonCast => "Staffelbesetzung"; + /// "Folgen" + @override + String get episodes => "Folgen"; + /// "Gaststars" + @override + String get guestStars => "Gaststars"; + /// "Es wurde kein Gaststar hinzugefügt" + @override + String get guestStarsEmpty => "Es wurde kein Gaststar hinzugefügt"; + /// "Besatzung" + @override + String get crew => "Besatzung"; + /// "Es wurde keine Crew hinzugefügt" + @override + String get crewEmpty => "Es wurde keine Crew hinzugefügt"; + /// "Episodenbilder" + @override + String get episodeImages => "Episodenbilder"; + /// "Es wurde kein Episodenbild hinzugefügt" + @override + String get episodeImagesEmpty => "Es wurde kein Episodenbild hinzugefügt"; + /// "Fakten" + @override + String get facts => "Fakten"; + /// "Netzwerk" + @override + String get network => "Netzwerk"; + /// "Status" + @override + String get status => "Status"; + /// "Art" + @override + String get type => "Art"; + /// "Ursprache" + @override + String get originalLanguage => "Ursprache"; + /// "Laufzeit" + @override + String get runtime => "Laufzeit"; + /// "Geschlechter" + @override + String get genders => "Geschlechter"; + /// "Release-Informationen" + @override + String get releaseInformation => "Release-Informationen"; + /// "Budget" + @override + String get budget => "Budget"; + /// "Einnahmen" + @override + String get revenue => "Einnahmen"; + /// "Unternehmen" + @override + String get company => "Unternehmen"; + /// "abspielen" + @override + String get play => "abspielen"; + /// "Willkommen zurück" + @override + String get welcomeBack => "Willkommen zurück"; + /// "Settings" + @override + String get settings => "Settings"; + /// "Inhalt für Erwachsene" + @override + String get adultContent => "Inhalt für Erwachsene"; + /// "Benachrichtigungen" + @override + String get notifications => "Benachrichtigungen"; + /// "Dunkler Modus" + @override + String get darkMode => "Dunkler Modus"; + /// "Sprache" + @override + String get language => "Sprache"; + /// "Feedback" + @override + String get feedback => "Feedback"; + /// "Ausführung" + @override + String get version => "Ausführung"; + /// "Trend" + @override + String get trending => "Trend"; + /// "Geteilt" + @override + String get shared => "Geteilt"; + /// "Herzlich willkommen" + @override + String get welcome => "Herzlich willkommen"; + /// "Beginnen wir mit wenigen Schritten" + @override + String get letStartWithFewSteps => "Beginnen wir mit wenigen Schritten"; + /// "Fortsetzen" + @override + String get continueA => "Fortsetzen"; + /// "Nächster" + @override + String get next => "Nächster"; + /// "Zurück" + @override + String get back => "Zurück"; + /// "Anfang" + @override + String get start => "Anfang"; + /// "Welche Art von Film gefällt Ihnen" + @override + String get whatKindOfMovieDoYouLike => "Welche Art von Film gefällt Ihnen"; + /// "Was für eine TV-Show magst du" + @override + String get whatKindOfTvShowDoYouLike => "Was für eine TV-Show magst du"; + + @override + TextDirection get textDirection => TextDirection.ltr; +} + +class GeneratedLocalizationsDelegate extends LocalizationsDelegate { + const GeneratedLocalizationsDelegate(); + List get supportedLocales { + return const [ + Locale("en", "US"), + Locale("zh", "CN"), + Locale("ja", "JP"), + Locale("zh", "TW"), + Locale("es", "ES"), + Locale("fr", "FR"), + Locale("ru", "RU"), + Locale("de", "DE") + ]; + } + + LocaleResolutionCallback resolution({Locale fallback}) { + return (Locale locale, Iterable supported) { + if (isSupported(locale)) { + return locale; + } + final Locale fallbackLocale = fallback ?? supported.first; + return fallbackLocale; + }; + } + + @override + Future load(Locale locale) { + I18n._locale ??= locale; + I18n._shouldReload = false; + final String lang = I18n._locale != null ? I18n._locale.toString() : ""; + final String languageCode = I18n._locale != null ? I18n._locale.languageCode : ""; + if ("en_US" == lang) { + return SynchronousFuture(const _I18n_en_US()); + } + else if ("zh_CN" == lang) { + return SynchronousFuture(const _I18n_zh_CN()); + } + else if ("ja_JP" == lang) { + return SynchronousFuture(const _I18n_ja_JP()); + } + else if ("zh_TW" == lang) { + return SynchronousFuture(const _I18n_zh_TW()); + } + else if ("es_ES" == lang) { + return SynchronousFuture(const _I18n_es_ES()); + } + else if ("fr_FR" == lang) { + return SynchronousFuture(const _I18n_fr_FR()); + } + else if ("ru_RU" == lang) { + return SynchronousFuture(const _I18n_ru_RU()); + } + else if ("de_DE" == lang) { + return SynchronousFuture(const _I18n_de_DE()); + } + else if ("en" == languageCode) { + return SynchronousFuture(const _I18n_en_US()); + } + else if ("zh" == languageCode) { + return SynchronousFuture(const _I18n_zh_CN()); + } + else if ("ja" == languageCode) { + return SynchronousFuture(const _I18n_ja_JP()); + } + else if ("es" == languageCode) { + return SynchronousFuture(const _I18n_es_ES()); + } + else if ("fr" == languageCode) { + return SynchronousFuture(const _I18n_fr_FR()); + } + else if ("ru" == languageCode) { + return SynchronousFuture(const _I18n_ru_RU()); + } + else if ("de" == languageCode) { + return SynchronousFuture(const _I18n_de_DE()); + } + + return SynchronousFuture(const I18n()); + } + + @override + bool isSupported(Locale locale) { + for (var i = 0; i < supportedLocales.length && locale != null; i++) { + final l = supportedLocales[i]; + if (l.languageCode == locale.languageCode) { + return true; + } + } + return false; + } + + @override + bool shouldReload(GeneratedLocalizationsDelegate old) => I18n._shouldReload; +} \ No newline at end of file diff --git a/lib/globalbasestate/action.dart b/lib/globalbasestate/action.dart new file mode 100644 index 00000000..43c7ab34 --- /dev/null +++ b/lib/globalbasestate/action.dart @@ -0,0 +1,25 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/user_premium_model.dart'; + +enum GlobalAction { changeThemeColor, changeLocale, setUser, setUserPremium } + +class GlobalActionCreator { + static Action onchangeThemeColor() { + return const Action(GlobalAction.changeThemeColor); + } + + static Action changeLocale(Locale l) { + return Action(GlobalAction.changeLocale, payload: l); + } + + static Action setUser(AppUser user) { + return Action(GlobalAction.setUser, payload: user); + } + + static Action setUserPremium(UserPremiumData premiumData) { + return Action(GlobalAction.setUserPremium, payload: premiumData); + } +} diff --git a/lib/globalbasestate/reducer.dart b/lib/globalbasestate/reducer.dart new file mode 100644 index 00000000..9a417e2e --- /dev/null +++ b/lib/globalbasestate/reducer.dart @@ -0,0 +1,52 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/user_premium_model.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + GlobalAction.changeThemeColor: _onchangeThemeColor, + GlobalAction.changeLocale: _onChangeLocale, + GlobalAction.setUser: _onSetUser, + GlobalAction.setUserPremium: _onSetUserPremium + }, + ); +} + +List _colors = [ + Colors.green, + Colors.red, + Colors.black, + Colors.blue +]; + +GlobalState _onchangeThemeColor(GlobalState state, Action action) { + final Color next = + _colors[((_colors.indexOf(state.themeColor) + 1) % _colors.length)]; + return state.clone()..themeColor = next; +} + +GlobalState _onChangeLocale(GlobalState state, Action action) { + final Locale l = action.payload; + I18n.onLocaleChanged(l); + return state.clone()..locale = l; +} + +GlobalState _onSetUser(GlobalState state, Action action) { + final AppUser user = action.payload; + return state.clone()..user = user; +} + +GlobalState _onSetUserPremium(GlobalState state, Action action) { + final UserPremiumData _data = action.payload; + final AppUser _user = + AppUser(firebaseUser: state.user.firebaseUser, premium: _data); + return state.clone()..user = _user; +} diff --git a/lib/globalbasestate/state.dart b/lib/globalbasestate/state.dart new file mode 100644 index 00000000..96c8a4d9 --- /dev/null +++ b/lib/globalbasestate/state.dart @@ -0,0 +1,32 @@ +import 'dart:ui'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; + +abstract class GlobalBaseState { + Color get themeColor; + set themeColor(Color color); + + Locale get locale; + set locale(Locale locale); + + AppUser get user; + set user(AppUser u); +} + +class GlobalState implements GlobalBaseState, Cloneable { + @override + Color themeColor; + @override + Locale locale; + + @override + AppUser user; + + @override + GlobalState clone() { + return GlobalState() + ..themeColor = themeColor + ..locale = locale + ..user = user; + } +} diff --git a/lib/globalbasestate/store.dart b/lib/globalbasestate/store.dart new file mode 100644 index 00000000..04ac5b00 --- /dev/null +++ b/lib/globalbasestate/store.dart @@ -0,0 +1,10 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'reducer.dart'; +import 'state.dart'; + +class GlobalStore { + static Store _globalStore; + + static Store get store => + _globalStore ??= createStore(GlobalState(), buildReducer()); +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 00000000..879729a9 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; + +import 'app.dart'; + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + await FlutterDownloader.initialize(); + await SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); + runApp(App()); +} diff --git a/lib/models/account_detail.dart b/lib/models/account_detail.dart new file mode 100644 index 00000000..bf0b9bd0 --- /dev/null +++ b/lib/models/account_detail.dart @@ -0,0 +1,64 @@ +import 'dart:convert' show json; + +class AccountDetailModel { + + int id; + bool includeAdult; + String iso31661; + String iso6391; + String name; + String username; + Avatar avatar; + + AccountDetailModel.fromParams({this.id, this.includeAdult, this.iso31661, this.iso6391, this.name, this.username, this.avatar}); + + factory AccountDetailModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new AccountDetailModel.fromJson(json.decode(jsonStr)) : new AccountDetailModel.fromJson(jsonStr); + + AccountDetailModel.fromJson(jsonRes) { + id = jsonRes['id']; + includeAdult = jsonRes['include_adult']; + iso31661 = jsonRes['iso_3166_1']; + iso6391 = jsonRes['iso_639_1']; + name = jsonRes['name']; + username = jsonRes['username']; + avatar = jsonRes['avatar'] == null ? null : new Avatar.fromJson(jsonRes['avatar']); + } + + @override + String toString() { + return '{"id": $id,"include_adult": $includeAdult,"iso_3166_1": ${iso31661 != null?'${json.encode(iso31661)}':'null'},"iso_639_1": ${iso6391 != null?'${json.encode(iso6391)}':'null'},"name": ${name != null?'${json.encode(name)}':'null'},"username": ${username != null?'${json.encode(username)}':'null'},"avatar": $avatar}'; + } +} + +class Avatar { + + Gravatar gravatar; + + Avatar.fromParams({this.gravatar}); + + Avatar.fromJson(jsonRes) { + gravatar = jsonRes['gravatar'] == null ? null : new Gravatar.fromJson(jsonRes['gravatar']); + } + + @override + String toString() { + return '{"gravatar": $gravatar}'; + } +} + +class Gravatar { + + String hash; + + Gravatar.fromParams({this.hash}); + + Gravatar.fromJson(jsonRes) { + hash = jsonRes['hash']; + } + + @override + String toString() { + return '{"hash": ${hash != null?'${json.encode(hash)}':'null'}}'; + } +} + diff --git a/lib/models/app_user.dart b/lib/models/app_user.dart new file mode 100644 index 00000000..56c1eda6 --- /dev/null +++ b/lib/models/app_user.dart @@ -0,0 +1,11 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:movie/models/base_api_model/user_premium_model.dart'; + +class AppUser { + FirebaseUser firebaseUser; + UserPremiumData premium; + bool get isPremium => premium?.expireDate == null + ? false + : DateTime.parse(premium.expireDate).compareTo(DateTime.now()) > 0; + AppUser({this.firebaseUser, this.premium}); +} diff --git a/lib/models/base_api_model/account_info.dart b/lib/models/base_api_model/account_info.dart new file mode 100644 index 00000000..63bfc760 --- /dev/null +++ b/lib/models/base_api_model/account_info.dart @@ -0,0 +1,35 @@ +import 'dart:convert' show json; + +class AccountInfo { + int castLists; + int favorites; + int myLists; + int watchLists; + String uid; + + AccountInfo.fromParams( + {this.castLists, + this.favorites, + this.myLists, + this.watchLists, + this.uid}); + + factory AccountInfo(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new AccountInfo.fromJson(json.decode(jsonStr)) + : new AccountInfo.fromJson(jsonStr); + + AccountInfo.fromJson(jsonRes) { + castLists = jsonRes['castLists']; + favorites = jsonRes['favorites']; + myLists = jsonRes['myLists']; + watchLists = jsonRes['watchLists']; + uid = jsonRes['uid']; + } + + @override + String toString() { + return '{"castLists": $castLists,"favorites": $favorites,"myLists": $myLists,"watchLists": $watchLists,"uid": ${uid != null ? '${json.encode(uid)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/account_state.dart b/lib/models/base_api_model/account_state.dart new file mode 100644 index 00000000..badd4d57 --- /dev/null +++ b/lib/models/base_api_model/account_state.dart @@ -0,0 +1,41 @@ +import 'dart:convert' show json; + +class AccountState { + bool favorite; + int id; + int mediaId; + bool watchlist; + double rated; + String mediaType; + String uid; + + AccountState.fromParams( + {this.favorite, + this.id, + this.mediaId, + this.watchlist, + this.rated, + this.mediaType, + this.uid}); + + factory AccountState(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new AccountState.fromJson(json.decode(jsonStr)) + : new AccountState.fromJson(jsonStr); + + AccountState.fromJson(jsonRes) { + favorite = jsonRes['favorite'] == 1 ? true : false; + id = jsonRes['id']; + mediaId = jsonRes['mediaId']; + watchlist = jsonRes['watchlist'] == 1 ? true : false; + rated = jsonRes['rated']; + mediaType = jsonRes['mediaType']; + uid = jsonRes['uid']; + } + + @override + String toString() { + return '{"favorite": $favorite,"id": $id,"mediaId": $mediaId,"watchlist": $watchlist,"rated": $rated,"mediaType": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/base_cast_list.dart b/lib/models/base_api_model/base_cast_list.dart new file mode 100644 index 00000000..fbb16a61 --- /dev/null +++ b/lib/models/base_api_model/base_cast_list.dart @@ -0,0 +1,76 @@ +import 'dart:convert' show json; + +class CastListModel { + List list; + + CastListModel.fromParams({this.list}); + + factory CastListModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new CastListModel.fromJson(json.decode(jsonStr)) + : new CastListModel.fromJson(jsonStr); + + CastListModel.fromJson(jsonRes) { + list = jsonRes['castList'] == null ? null : []; + + for (var listItem in list == null ? [] : jsonRes['castList']) { + list.add(listItem == null ? null : new BaseCastList.fromJson(listItem)); + } + } + + CastListModel.fromMap(jsonRes) { + list = jsonRes['castList'] == null ? null : []; + + for (var listItem in list == null ? [] : jsonRes['castList']) { + list.add(listItem == null ? null : new BaseCastList.fromJson(listItem)); + } + } + + @override + String toString() { + return '{"castList": $list}'; + } +} + +class BaseCastList { + String backgroundUrl; + int id; + bool selected; + DateTime createTime; + String description; + String name; + String uid; + DateTime updateTime; + int castCount; + + BaseCastList.fromParams( + {this.backgroundUrl, + this.id, + this.selected, + this.createTime, + this.description, + this.name, + this.uid, + this.updateTime, + this.castCount = 0}); + + BaseCastList.fromJson(jsonRes) { + backgroundUrl = jsonRes['backgroundUrl']; + id = int.parse(jsonRes['id']); + selected = jsonRes['selected'] == '1'; + createTime = + DateTime.parse(jsonRes['createTime']?.toString() ?? '1990-01-01'); + description = jsonRes['description']; + name = jsonRes['name']; + uid = jsonRes['uid']; + updateTime = + DateTime.parse(jsonRes['updateTime']?.toString() ?? '1990-01-01'); + castCount = int.parse(jsonRes['castCount']?.toString() ?? '0'); + } + + @override + String toString() { + return '{"backGroundUrl": ${backgroundUrl != null ? '${json.encode(backgroundUrl)}' : 'null'},"id": $id,"selected": $selected,"createTime": $createTime,"description": ${description != null ? '${json.encode(description)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"updateTime": $updateTime,"castCount": $castCount}'; + } +} diff --git a/lib/models/base_api_model/base_movie.dart b/lib/models/base_api_model/base_movie.dart new file mode 100644 index 00000000..72cb029d --- /dev/null +++ b/lib/models/base_api_model/base_movie.dart @@ -0,0 +1,71 @@ +import 'dart:convert' show json; + +class BaseMovieModel { + int page; + List data; + + BaseMovieModel.fromParams({this.page, this.data}); + + factory BaseMovieModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new BaseMovieModel.fromJson(json.decode(jsonStr)) + : new BaseMovieModel.fromJson(jsonStr); + + BaseMovieModel.fromJson(jsonRes) { + page = jsonRes['page']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new BaseMovie.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"data": $data}'; + } +} + +class BaseMovie { + int id; + int ratedCount; + double popular; + double rate; + String genre; + String name; + String overwatch; + String photourl; + String releaseDate; + String updateTime; + + BaseMovie.fromParams( + {this.id, + this.ratedCount, + this.popular, + this.rate, + this.genre, + this.name, + this.overwatch, + this.photourl, + this.releaseDate, + this.updateTime}); + + BaseMovie.fromJson(jsonRes) { + id = jsonRes['id']; + ratedCount = jsonRes['ratedCount']; + popular = jsonRes['popular']; + rate = double.parse(jsonRes['rate']?.toString() ?? '0.0'); + genre = jsonRes['genre']; + name = jsonRes['name']; + overwatch = jsonRes['overwatch']; + photourl = jsonRes['photourl']; + releaseDate = jsonRes['releaseDate']; + updateTime = jsonRes['updateTime']; + } + + @override + String toString() { + return '{"id": $id,"ratedCount": $ratedCount,"popular": $popular,"rate": $rate,"genre": ${genre != null ? '${json.encode(genre)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"overwatch": ${overwatch != null ? '${json.encode(overwatch)}' : 'null'},"photourl": ${photourl != null ? '${json.encode(photourl)}' : 'null'},"releaseDate": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'},"updateTime": ${updateTime != null ? '${json.encode(updateTime)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/base_tvshow.dart b/lib/models/base_api_model/base_tvshow.dart new file mode 100644 index 00000000..7505f352 --- /dev/null +++ b/lib/models/base_api_model/base_tvshow.dart @@ -0,0 +1,74 @@ +import 'dart:convert' show json; + +class BaseTvShowModel { + int page; + List data; + + BaseTvShowModel.fromParams({this.page, this.data}); + + factory BaseTvShowModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new BaseTvShowModel.fromJson(json.decode(jsonStr)) + : new BaseTvShowModel.fromJson(jsonStr); + + BaseTvShowModel.fromJson(jsonRes) { + page = jsonRes['page']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new BaseTvShow.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"data": $data}'; + } +} + +class BaseTvShow { + int id; + int rateCount; + int seasonCount; + double popular; + double rate; + String firstAirDate; + String genre; + String name; + String overwatch; + String photourl; + String updateTime; + + BaseTvShow.fromParams( + {this.id, + this.rateCount, + this.seasonCount, + this.popular, + this.rate, + this.firstAirDate, + this.genre, + this.name, + this.overwatch, + this.photourl, + this.updateTime}); + + BaseTvShow.fromJson(jsonRes) { + id = jsonRes['id']; + rateCount = jsonRes['rateCount']; + seasonCount = jsonRes['seasonCount']; + popular = jsonRes['popular']; + rate = double.parse(jsonRes['rate']?.toString() ?? '0.0'); + firstAirDate = jsonRes['firstAirDate']; + genre = jsonRes['genre']; + name = jsonRes['name']; + overwatch = jsonRes['overwatch']; + photourl = jsonRes['photourl']; + updateTime = jsonRes['updateTime']; + } + + @override + String toString() { + return '{"id": $id,"rateCount": $rateCount,"seasonCount": $seasonCount,"popular": $popular,"rate": $rate,"firstAirDate": ${firstAirDate != null ? '${json.encode(firstAirDate)}' : 'null'},"genre": ${genre != null ? '${json.encode(genre)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"overwatch": ${overwatch != null ? '${json.encode(overwatch)}' : 'null'},"photourl": ${photourl != null ? '${json.encode(photourl)}' : 'null'},"updateTime": ${updateTime != null ? '${json.encode(updateTime)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/base_user.dart b/lib/models/base_api_model/base_user.dart new file mode 100644 index 00000000..1fa8f9ab --- /dev/null +++ b/lib/models/base_api_model/base_user.dart @@ -0,0 +1,32 @@ +import 'dart:convert' show json; + +class BaseUser { + int isAdmin; + String phone; + String email; + String photoUrl; + String uid; + String userName; + + BaseUser.fromParams( + {this.isAdmin, + this.phone, + this.email, + this.photoUrl, + this.uid, + this.userName}); + + BaseUser.fromJson(jsonRes) { + isAdmin = jsonRes['isAdmin']; + phone = jsonRes['phone']; + email = jsonRes['email']; + photoUrl = jsonRes['photoUrl']; + uid = jsonRes['uid']; + userName = jsonRes['userName']; + } + + @override + String toString() { + return '{"isAdmin": $isAdmin,"phone": ${phone != null ? '${json.encode(phone)}' : 'null'},"email": ${email != null ? '${json.encode(email)}' : 'null'},"photoUrl": ${photoUrl != null ? '${json.encode(photoUrl)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"userName": ${userName != null ? '${json.encode(userName)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/braintree_billing_address.dart b/lib/models/base_api_model/braintree_billing_address.dart new file mode 100644 index 00000000..5b8ac93a --- /dev/null +++ b/lib/models/base_api_model/braintree_billing_address.dart @@ -0,0 +1,68 @@ +import 'dart:convert' show json; + +class BillingAddress { + String company; + String countryCodeAlpha2; + String countryCodeAlpha3; + String countryCodeNumeric; + String countryName; + Object createdAt; + String customerId; + String extendedAddress; + String firstName; + String id; + String lastName; + String locality; + String postalCode; + String region; + String streetAddress; + Object updatedAt; + + factory BillingAddress(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new BillingAddress.fromJson(json.decode(jsonStr)) + : new BillingAddress.fromJson(jsonStr); + + BillingAddress.fromParams( + {this.company, + this.countryCodeAlpha2, + this.countryCodeAlpha3, + this.countryCodeNumeric, + this.countryName, + this.createdAt, + this.customerId, + this.extendedAddress, + this.firstName, + this.id, + this.lastName, + this.locality, + this.postalCode, + this.region, + this.streetAddress, + this.updatedAt}); + + BillingAddress.fromJson(jsonRes) { + company = jsonRes['Company']; + countryCodeAlpha2 = jsonRes['CountryCodeAlpha2']; + countryCodeAlpha3 = jsonRes['CountryCodeAlpha3']; + countryCodeNumeric = jsonRes['CountryCodeNumeric']; + countryName = jsonRes['CountryName']; + createdAt = jsonRes['CreatedAt']; + customerId = jsonRes['CustomerId']; + extendedAddress = jsonRes['ExtendedAddress']; + firstName = jsonRes['FirstName']; + id = jsonRes['Id']; + lastName = jsonRes['LastName']; + locality = jsonRes['Locality']; + postalCode = jsonRes['PostalCode']; + region = jsonRes['Region']; + streetAddress = jsonRes['StreetAddress']; + updatedAt = jsonRes['UpdatedAt']; + } + + @override + String toString() { + return '{"Company": $company,"CountryCodeAlpha2": $countryCodeAlpha2,"CountryCodeAlpha3": $countryCodeAlpha3,"CountryCodeNumeric": $countryCodeNumeric,"CountryName": $countryName,"CreatedAt": $createdAt,"CustomerId": $customerId,"ExtendedAddress": $extendedAddress,"FirstName": $firstName,"Id": $id,"LastName": $lastName,"Locality": $locality,"PostalCode": $postalCode,"Region": $region,"StreetAddress": $streetAddress,"UpdatedAt": $updatedAt}'; + } +} diff --git a/lib/models/base_api_model/braintree_creditcard.dart b/lib/models/base_api_model/braintree_creditcard.dart new file mode 100644 index 00000000..919869c7 --- /dev/null +++ b/lib/models/base_api_model/braintree_creditcard.dart @@ -0,0 +1,138 @@ +import 'braintree_billing_address.dart'; +import 'braintree_item_type.dart'; +import 'braintree_subscription.dart'; +import 'dart:convert' show json; + +class CreditCard { + Object accountType; + String cardholderName; + Object createdAt; + String customerId; + String imageUrl; + bool isDefault; + bool isExpired; + Object isVenmoSdk; + Object updatedAt; + Object verification; + String bin; + String countryOfIssuance; + String expirationDate; + String expirationMonth; + String expirationYear; + String issuingBank; + String lastFour; + String maskedNumber; + String productId; + String token; + String uniqueNumberIdentifier; + List subscriptions; + BillingAddress billingAddress; + ItemType cardType; + ItemType commercial; + ItemType customerLocation; + ItemType debit; + ItemType durbinRegulated; + ItemType healthcare; + ItemType payroll; + ItemType prepaid; + factory CreditCard(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new CreditCard.fromJson(json.decode(jsonStr)) + : new CreditCard.fromJson(jsonStr); + CreditCard.fromParams( + {this.accountType, + this.cardholderName, + this.createdAt, + this.customerId, + this.imageUrl, + this.isDefault, + this.isExpired, + this.isVenmoSdk, + this.updatedAt, + this.verification, + this.bin, + this.countryOfIssuance, + this.expirationDate, + this.expirationMonth, + this.expirationYear, + this.issuingBank, + this.lastFour, + this.maskedNumber, + this.productId, + this.token, + this.uniqueNumberIdentifier, + this.subscriptions, + this.billingAddress, + this.cardType, + this.commercial, + this.customerLocation, + this.debit, + this.durbinRegulated, + this.healthcare, + this.payroll, + this.prepaid}); + + CreditCard.fromJson(jsonRes) { + accountType = jsonRes['AccountType']; + cardholderName = jsonRes['CardholderName']; + createdAt = jsonRes['CreatedAt']; + customerId = jsonRes['CustomerId']; + imageUrl = jsonRes['ImageUrl']; + isDefault = jsonRes['IsDefault']; + isExpired = jsonRes['IsExpired']; + isVenmoSdk = jsonRes['IsVenmoSdk']; + updatedAt = jsonRes['UpdatedAt']; + verification = jsonRes['Verification']; + bin = jsonRes['Bin']; + countryOfIssuance = jsonRes['CountryOfIssuance']; + expirationDate = jsonRes['ExpirationDate']; + expirationMonth = jsonRes['ExpirationMonth']; + expirationYear = jsonRes['ExpirationYear']; + issuingBank = jsonRes['IssuingBank']; + lastFour = jsonRes['LastFour']; + maskedNumber = jsonRes['MaskedNumber']; + productId = jsonRes['ProductId']; + token = jsonRes['Token']; + uniqueNumberIdentifier = jsonRes['UniqueNumberIdentifier']; + subscriptions = jsonRes['Subscriptions'] == null ? null : []; + + for (var subscriptionsItem + in subscriptions == null ? [] : jsonRes['Subscriptions']) { + subscriptions.add(BraintreeSubscription(subscriptionsItem)); + } + + billingAddress = jsonRes['BillingAddress'] == null + ? null + : new BillingAddress.fromJson(jsonRes['BillingAddress']); + cardType = jsonRes['CardType'] == null + ? null + : new ItemType.fromJson(jsonRes['CardType']); + commercial = jsonRes['Commercial'] == null + ? null + : new ItemType.fromJson(jsonRes['Commercial']); + customerLocation = jsonRes['CustomerLocation'] == null + ? null + : new ItemType.fromJson(jsonRes['CustomerLocation']); + debit = jsonRes['Debit'] == null + ? null + : new ItemType.fromJson(jsonRes['Debit']); + durbinRegulated = jsonRes['DurbinRegulated'] == null + ? null + : new ItemType.fromJson(jsonRes['DurbinRegulated']); + healthcare = jsonRes['Healthcare'] == null + ? null + : new ItemType.fromJson(jsonRes['Healthcare']); + payroll = jsonRes['Payroll'] == null + ? null + : new ItemType.fromJson(jsonRes['Payroll']); + prepaid = jsonRes['Prepaid'] == null + ? null + : new ItemType.fromJson(jsonRes['Prepaid']); + } + + @override + String toString() { + return '{"AccountType": $accountType,"CardholderName": $cardholderName,"CreatedAt": $createdAt,"CustomerId": $customerId,"ImageUrl": $imageUrl,"IsDefault": $isDefault,"IsExpired": $isExpired,"IsVenmoSdk": $isVenmoSdk,"UpdatedAt": $updatedAt,"Verification": $verification,"Bin": ${bin != null ? '${json.encode(bin)}' : 'null'},"CountryOfIssuance": ${countryOfIssuance != null ? '${json.encode(countryOfIssuance)}' : 'null'},"ExpirationDate": ${expirationDate != null ? '${json.encode(expirationDate)}' : 'null'},"ExpirationMonth": ${expirationMonth != null ? '${json.encode(expirationMonth)}' : 'null'},"ExpirationYear": ${expirationYear != null ? '${json.encode(expirationYear)}' : 'null'},"IssuingBank": ${issuingBank != null ? '${json.encode(issuingBank)}' : 'null'},"LastFour": ${lastFour != null ? '${json.encode(lastFour)}' : 'null'},"MaskedNumber": ${maskedNumber != null ? '${json.encode(maskedNumber)}' : 'null'},"ProductId": ${productId != null ? '${json.encode(productId)}' : 'null'},"Token": ${token != null ? '${json.encode(token)}' : 'null'},"UniqueNumberIdentifier": ${uniqueNumberIdentifier != null ? '${json.encode(uniqueNumberIdentifier)}' : 'null'},"Subscriptions": $subscriptions,"BillingAddress": $billingAddress,"CardType": $cardType,"Commercial": $commercial,"CustomerLocation": $customerLocation,"Debit": $debit,"DurbinRegulated": $durbinRegulated,"Healthcare": $healthcare,"Payroll": $payroll,"Prepaid": $prepaid}'; + } +} diff --git a/lib/models/base_api_model/braintree_customer.dart b/lib/models/base_api_model/braintree_customer.dart new file mode 100644 index 00000000..45f7893b --- /dev/null +++ b/lib/models/base_api_model/braintree_customer.dart @@ -0,0 +1,514 @@ +import 'dart:convert' show json; + +import 'package:movie/models/base_api_model/braintree_subscription.dart'; + +import 'braintree_billing_address.dart'; +import 'braintree_creditcard.dart'; +import 'braintree_item_type.dart'; + +class BraintreeCustomer { + Object company; + Object customFields; + Object email; + Object fax; + Object firstName; + Object lastName; + Object phone; + Object website; + String createdAt; + String graphQLId; + String id; + String updatedAt; + List addresses; + List amexExpressCheckoutCards; + List androidPayCards; + List applePayCards; + List coinbaseAccounts; + List creditCards; + List masterpassCards; + List payPalAccounts; + List paymentMethods; + List usBankAccounts; + List venmoAccounts; + List visaCheckoutCards; + DefaultPaymentMethod defaultPaymentMethod; + + BraintreeCustomer.fromParams( + {this.company, + this.customFields, + this.email, + this.fax, + this.firstName, + this.lastName, + this.phone, + this.website, + this.createdAt, + this.graphQLId, + this.id, + this.updatedAt, + this.addresses, + this.amexExpressCheckoutCards, + this.androidPayCards, + this.applePayCards, + this.coinbaseAccounts, + this.creditCards, + this.masterpassCards, + this.payPalAccounts, + this.paymentMethods, + this.usBankAccounts, + this.venmoAccounts, + this.visaCheckoutCards, + this.defaultPaymentMethod}); + + factory BraintreeCustomer(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new BraintreeCustomer.fromJson(json.decode(jsonStr)) + : new BraintreeCustomer.fromJson(jsonStr); + + BraintreeCustomer.fromJson(jsonRes) { + company = jsonRes['Company']; + customFields = jsonRes['CustomFields']; + email = jsonRes['Email']; + fax = jsonRes['Fax']; + firstName = jsonRes['FirstName']; + lastName = jsonRes['LastName']; + phone = jsonRes['Phone']; + website = jsonRes['Website']; + createdAt = jsonRes['CreatedAt']; + graphQLId = jsonRes['GraphQLId']; + id = jsonRes['Id']; + updatedAt = jsonRes['UpdatedAt']; + addresses = jsonRes['Addresses'] == null ? null : []; + + for (var addressesItem in addresses == null ? [] : jsonRes['Addresses']) { + addresses.add(addressesItem == null + ? null + : new BillingAddress.fromJson(addressesItem)); + } + + amexExpressCheckoutCards = + jsonRes['AmexExpressCheckoutCards'] == null ? null : []; + + for (var amexExpressCheckoutCardsItem in amexExpressCheckoutCards == null + ? [] + : jsonRes['AmexExpressCheckoutCards']) { + amexExpressCheckoutCards.add(amexExpressCheckoutCardsItem); + } + + androidPayCards = jsonRes['AndroidPayCards'] == null ? null : []; + + for (var androidPayCardsItem + in androidPayCards == null ? [] : jsonRes['AndroidPayCards']) { + androidPayCards.add(androidPayCardsItem); + } + + applePayCards = jsonRes['ApplePayCards'] == null ? null : []; + + for (var applePayCardsItem + in applePayCards == null ? [] : jsonRes['ApplePayCards']) { + applePayCards.add(applePayCardsItem); + } + + coinbaseAccounts = jsonRes['CoinbaseAccounts'] == null ? null : []; + + for (var coinbaseAccountsItem + in coinbaseAccounts == null ? [] : jsonRes['CoinbaseAccounts']) { + coinbaseAccounts.add(coinbaseAccountsItem); + } + + creditCards = jsonRes['CreditCards'] == null ? null : []; + + for (var creditCardsItem + in creditCards == null ? [] : jsonRes['CreditCards']) { + creditCards.add(creditCardsItem == null + ? null + : new CreditCard.fromJson(creditCardsItem)); + } + + masterpassCards = jsonRes['MasterpassCards'] == null ? null : []; + + for (var masterpassCardsItem + in masterpassCards == null ? [] : jsonRes['MasterpassCards']) { + masterpassCards.add(masterpassCardsItem); + } + + payPalAccounts = jsonRes['PayPalAccounts'] == null ? null : []; + + for (var payPalAccountsItem + in payPalAccounts == null ? [] : jsonRes['PayPalAccounts']) { + payPalAccounts.add(payPalAccountsItem == null + ? null + : new PayPalAccount.fromJson(payPalAccountsItem)); + } + + paymentMethods = jsonRes['PaymentMethods'] == null ? null : []; + + for (var paymentMethodsItem + in paymentMethods == null ? [] : jsonRes['PaymentMethods']) { + paymentMethods.add(paymentMethodsItem == null + ? null + : new PaymentMethod.fromJson(paymentMethodsItem)); + } + + usBankAccounts = jsonRes['UsBankAccounts'] == null ? null : []; + + for (var usBankAccountsItem + in usBankAccounts == null ? [] : jsonRes['UsBankAccounts']) { + usBankAccounts.add(usBankAccountsItem); + } + + venmoAccounts = jsonRes['VenmoAccounts'] == null ? null : []; + + for (var venmoAccountsItem + in venmoAccounts == null ? [] : jsonRes['VenmoAccounts']) { + venmoAccounts.add(venmoAccountsItem); + } + + visaCheckoutCards = jsonRes['VisaCheckoutCards'] == null ? null : []; + + for (var visaCheckoutCardsItem + in visaCheckoutCards == null ? [] : jsonRes['VisaCheckoutCards']) { + visaCheckoutCards.add(visaCheckoutCardsItem); + } + + defaultPaymentMethod = jsonRes['DefaultPaymentMethod'] == null + ? null + : new DefaultPaymentMethod.fromJson(jsonRes['DefaultPaymentMethod']); + } + + @override + String toString() { + return '{"Company": $company,"CustomFields": $customFields,"Email": $email,"Fax": $fax,"FirstName": $firstName,"LastName": $lastName,"Phone": $phone,"Website": $website,"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"GraphQLId": ${graphQLId != null ? '${json.encode(graphQLId)}' : 'null'},"Id": ${id != null ? '${json.encode(id)}' : 'null'},"UpdatedAt": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"Addresses": $addresses,"AmexExpressCheckoutCards": $amexExpressCheckoutCards,"AndroidPayCards": $androidPayCards,"ApplePayCards": $applePayCards,"CoinbaseAccounts": $coinbaseAccounts,"CreditCards": $creditCards,"MasterpassCards": $masterpassCards,"PayPalAccounts": $payPalAccounts,"PaymentMethods": $paymentMethods,"UsBankAccounts": $usBankAccounts,"VenmoAccounts": $venmoAccounts,"VisaCheckoutCards": $visaCheckoutCards,"DefaultPaymentMethod": $defaultPaymentMethod}'; + } +} + +class DefaultPaymentMethod { + Object revokedAt; + bool isDefault; + String billingAgreementId; + String createdAt; + String customerId; + String email; + String imageUrl; + String payerId; + String token; + String updatedAt; + List subscriptions; + + DefaultPaymentMethod.fromParams( + {this.revokedAt, + this.isDefault, + this.billingAgreementId, + this.createdAt, + this.customerId, + this.email, + this.imageUrl, + this.payerId, + this.token, + this.updatedAt, + this.subscriptions}); + + DefaultPaymentMethod.fromJson(jsonRes) { + revokedAt = jsonRes['RevokedAt']; + isDefault = jsonRes['IsDefault']; + billingAgreementId = jsonRes['BillingAgreementId']; + createdAt = jsonRes['CreatedAt']; + customerId = jsonRes['CustomerId']; + email = jsonRes['Email']; + imageUrl = jsonRes['ImageUrl']; + payerId = jsonRes['PayerId']; + token = jsonRes['Token']; + updatedAt = jsonRes['UpdatedAt']; + subscriptions = jsonRes['Subscriptions'] == null ? null : []; + + for (var subscriptionsItem + in subscriptions == null ? [] : jsonRes['Subscriptions']) { + subscriptions.add(BraintreeSubscription(subscriptionsItem)); + } + } + + @override + String toString() { + return '{"RevokedAt": $revokedAt,"IsDefault": $isDefault,"BillingAgreementId": ${billingAgreementId != null ? '${json.encode(billingAgreementId)}' : 'null'},"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"CustomerId": ${customerId != null ? '${json.encode(customerId)}' : 'null'},"Email": ${email != null ? '${json.encode(email)}' : 'null'},"ImageUrl": ${imageUrl != null ? '${json.encode(imageUrl)}' : 'null'},"PayerId": ${payerId != null ? '${json.encode(payerId)}' : 'null'},"Token": ${token != null ? '${json.encode(token)}' : 'null'},"UpdatedAt": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"Subscriptions": $subscriptions}'; + } +} + +class PaymentMethod { + Object accountType; + Object cardholderName; + Object revokedAt; + bool isDefault; + bool isExpired; + bool isVenmoSdk; + String billingAgreementId; + String bin; + String countryOfIssuance; + String createdAt; + String customerId; + String email; + String expirationDate; + String expirationMonth; + String expirationYear; + String imageUrl; + String issuingBank; + String lastFour; + String maskedNumber; + String payerId; + String productId; + String token; + String uniqueNumberIdentifier; + String updatedAt; + List subscriptions; + BillingAddress billingAddress; + ItemType cardType; + ItemType commercial; + ItemType customerLocation; + ItemType debit; + ItemType durbinRegulated; + ItemType healthcare; + ItemType payroll; + ItemType prepaid; + Verification verification; + + PaymentMethod.fromParams( + {this.accountType, + this.cardholderName, + this.revokedAt, + this.isDefault, + this.isExpired, + this.isVenmoSdk, + this.billingAgreementId, + this.bin, + this.countryOfIssuance, + this.createdAt, + this.customerId, + this.email, + this.expirationDate, + this.expirationMonth, + this.expirationYear, + this.imageUrl, + this.issuingBank, + this.lastFour, + this.maskedNumber, + this.payerId, + this.productId, + this.token, + this.uniqueNumberIdentifier, + this.updatedAt, + this.subscriptions, + this.billingAddress, + this.cardType, + this.commercial, + this.customerLocation, + this.debit, + this.durbinRegulated, + this.healthcare, + this.payroll, + this.prepaid, + this.verification}); + + PaymentMethod.fromJson(jsonRes) { + accountType = jsonRes['AccountType']; + cardholderName = jsonRes['CardholderName']; + revokedAt = jsonRes['RevokedAt']; + isDefault = jsonRes['IsDefault']; + isExpired = jsonRes['IsExpired']; + isVenmoSdk = jsonRes['IsVenmoSdk']; + billingAgreementId = jsonRes['BillingAgreementId']; + bin = jsonRes['Bin']; + countryOfIssuance = jsonRes['CountryOfIssuance']; + createdAt = jsonRes['CreatedAt']; + customerId = jsonRes['CustomerId']; + email = jsonRes['Email']; + expirationDate = jsonRes['ExpirationDate']; + expirationMonth = jsonRes['ExpirationMonth']; + expirationYear = jsonRes['ExpirationYear']; + imageUrl = jsonRes['ImageUrl']; + issuingBank = jsonRes['IssuingBank']; + lastFour = jsonRes['LastFour']; + maskedNumber = jsonRes['MaskedNumber']; + payerId = jsonRes['PayerId']; + productId = jsonRes['ProductId']; + token = jsonRes['Token']; + uniqueNumberIdentifier = jsonRes['UniqueNumberIdentifier']; + updatedAt = jsonRes['UpdatedAt']; + subscriptions = jsonRes['Subscriptions'] == null ? null : []; + + for (var subscriptionsItem + in subscriptions == null ? [] : jsonRes['Subscriptions']) { + subscriptions.add(BraintreeSubscription(subscriptionsItem)); + } + + billingAddress = jsonRes['BillingAddress'] == null + ? null + : new BillingAddress.fromJson(jsonRes['BillingAddress']); + cardType = jsonRes['CardType'] == null + ? null + : new ItemType.fromJson(jsonRes['CardType']); + commercial = jsonRes['Commercial'] == null + ? null + : new ItemType.fromJson(jsonRes['Commercial']); + customerLocation = jsonRes['CustomerLocation'] == null + ? null + : new ItemType.fromJson(jsonRes['CustomerLocation']); + debit = jsonRes['Debit'] == null + ? null + : new ItemType.fromJson(jsonRes['Debit']); + durbinRegulated = jsonRes['DurbinRegulated'] == null + ? null + : new ItemType.fromJson(jsonRes['DurbinRegulated']); + healthcare = jsonRes['Healthcare'] == null + ? null + : new ItemType.fromJson(jsonRes['Healthcare']); + payroll = jsonRes['Payroll'] == null + ? null + : new ItemType.fromJson(jsonRes['Payroll']); + prepaid = jsonRes['Prepaid'] == null + ? null + : new ItemType.fromJson(jsonRes['Prepaid']); + verification = jsonRes['Verification'] == null + ? null + : new Verification.fromJson(jsonRes['Verification']); + } + + @override + String toString() { + return '{"AccountType": $accountType,"CardholderName": $cardholderName,"RevokedAt": $revokedAt,"IsDefault": $isDefault,"IsExpired": $isExpired,"IsVenmoSdk": $isVenmoSdk,"BillingAgreementId": ${billingAgreementId != null ? '${json.encode(billingAgreementId)}' : 'null'},"Bin": ${bin != null ? '${json.encode(bin)}' : 'null'},"CountryOfIssuance": ${countryOfIssuance != null ? '${json.encode(countryOfIssuance)}' : 'null'},"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"CustomerId": ${customerId != null ? '${json.encode(customerId)}' : 'null'},"Email": ${email != null ? '${json.encode(email)}' : 'null'},"ExpirationDate": ${expirationDate != null ? '${json.encode(expirationDate)}' : 'null'},"ExpirationMonth": ${expirationMonth != null ? '${json.encode(expirationMonth)}' : 'null'},"ExpirationYear": ${expirationYear != null ? '${json.encode(expirationYear)}' : 'null'},"ImageUrl": ${imageUrl != null ? '${json.encode(imageUrl)}' : 'null'},"IssuingBank": ${issuingBank != null ? '${json.encode(issuingBank)}' : 'null'},"LastFour": ${lastFour != null ? '${json.encode(lastFour)}' : 'null'},"MaskedNumber": ${maskedNumber != null ? '${json.encode(maskedNumber)}' : 'null'},"PayerId": ${payerId != null ? '${json.encode(payerId)}' : 'null'},"ProductId": ${productId != null ? '${json.encode(productId)}' : 'null'},"Token": ${token != null ? '${json.encode(token)}' : 'null'},"UniqueNumberIdentifier": ${uniqueNumberIdentifier != null ? '${json.encode(uniqueNumberIdentifier)}' : 'null'},"UpdatedAt": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"Subscriptions": $subscriptions,"BillingAddress": $billingAddress,"CardType": $cardType,"Commercial": $commercial,"CustomerLocation": $customerLocation,"Debit": $debit,"DurbinRegulated": $durbinRegulated,"Healthcare": $healthcare,"Payroll": $payroll,"Prepaid": $prepaid,"Verification": $verification}'; + } +} + +class Verification { + Object avsErrorResponseCode; + Object gatewayRejectionReason; + Object riskData; + Object threeDSecureInfo; + double amount; + String avsPostalCodeResponseCode; + String avsStreetAddressResponseCode; + String createdAt; + String currencyIsoCode; + String cvvResponseCode; + String graphQLId; + String id; + String merchantAccountId; + String networkResponseCode; + String networkResponseText; + String processorResponseCode; + String processorResponseText; + BillingAddress billingAddress; + CreditCard creditCard; + ItemType processorResponseType; + ItemType status; + + Verification.fromParams( + {this.avsErrorResponseCode, + this.gatewayRejectionReason, + this.riskData, + this.threeDSecureInfo, + this.amount, + this.avsPostalCodeResponseCode, + this.avsStreetAddressResponseCode, + this.createdAt, + this.currencyIsoCode, + this.cvvResponseCode, + this.graphQLId, + this.id, + this.merchantAccountId, + this.networkResponseCode, + this.networkResponseText, + this.processorResponseCode, + this.processorResponseText, + this.billingAddress, + this.creditCard, + this.processorResponseType, + this.status}); + + Verification.fromJson(jsonRes) { + avsErrorResponseCode = jsonRes['AvsErrorResponseCode']; + gatewayRejectionReason = jsonRes['GatewayRejectionReason']; + riskData = jsonRes['RiskData']; + threeDSecureInfo = jsonRes['ThreeDSecureInfo']; + amount = jsonRes['Amount']; + avsPostalCodeResponseCode = jsonRes['AvsPostalCodeResponseCode']; + avsStreetAddressResponseCode = jsonRes['AvsStreetAddressResponseCode']; + createdAt = jsonRes['CreatedAt']; + currencyIsoCode = jsonRes['CurrencyIsoCode']; + cvvResponseCode = jsonRes['CvvResponseCode']; + graphQLId = jsonRes['GraphQLId']; + id = jsonRes['Id']; + merchantAccountId = jsonRes['MerchantAccountId']; + networkResponseCode = jsonRes['NetworkResponseCode']; + networkResponseText = jsonRes['NetworkResponseText']; + processorResponseCode = jsonRes['ProcessorResponseCode']; + processorResponseText = jsonRes['ProcessorResponseText']; + billingAddress = jsonRes['BillingAddress'] == null + ? null + : new BillingAddress.fromJson(jsonRes['BillingAddress']); + creditCard = jsonRes['CreditCard'] == null + ? null + : new CreditCard.fromJson(jsonRes['CreditCard']); + processorResponseType = jsonRes['ProcessorResponseType'] == null + ? null + : new ItemType.fromJson(jsonRes['ProcessorResponseType']); + status = jsonRes['Status'] == null + ? null + : new ItemType.fromJson(jsonRes['Status']); + } + + @override + String toString() { + return '{"AvsErrorResponseCode": $avsErrorResponseCode,"GatewayRejectionReason": $gatewayRejectionReason,"RiskData": $riskData,"ThreeDSecureInfo": $threeDSecureInfo,"Amount": $amount,"AvsPostalCodeResponseCode": ${avsPostalCodeResponseCode != null ? '${json.encode(avsPostalCodeResponseCode)}' : 'null'},"AvsStreetAddressResponseCode": ${avsStreetAddressResponseCode != null ? '${json.encode(avsStreetAddressResponseCode)}' : 'null'},"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"CurrencyIsoCode": ${currencyIsoCode != null ? '${json.encode(currencyIsoCode)}' : 'null'},"CvvResponseCode": ${cvvResponseCode != null ? '${json.encode(cvvResponseCode)}' : 'null'},"GraphQLId": ${graphQLId != null ? '${json.encode(graphQLId)}' : 'null'},"Id": ${id != null ? '${json.encode(id)}' : 'null'},"MerchantAccountId": ${merchantAccountId != null ? '${json.encode(merchantAccountId)}' : 'null'},"NetworkResponseCode": ${networkResponseCode != null ? '${json.encode(networkResponseCode)}' : 'null'},"NetworkResponseText": ${networkResponseText != null ? '${json.encode(networkResponseText)}' : 'null'},"ProcessorResponseCode": ${processorResponseCode != null ? '${json.encode(processorResponseCode)}' : 'null'},"ProcessorResponseText": ${processorResponseText != null ? '${json.encode(processorResponseText)}' : 'null'},"BillingAddress": $billingAddress,"CreditCard": $creditCard,"ProcessorResponseType": $processorResponseType,"Status": $status}'; + } +} + +class PayPalAccount { + Object revokedAt; + bool isDefault; + String billingAgreementId; + String createdAt; + String customerId; + String email; + String imageUrl; + String payerId; + String token; + String updatedAt; + List subscriptions; + + PayPalAccount.fromParams( + {this.revokedAt, + this.isDefault, + this.billingAgreementId, + this.createdAt, + this.customerId, + this.email, + this.imageUrl, + this.payerId, + this.token, + this.updatedAt, + this.subscriptions}); + + PayPalAccount.fromJson(jsonRes) { + revokedAt = jsonRes['RevokedAt']; + isDefault = jsonRes['IsDefault']; + billingAgreementId = jsonRes['BillingAgreementId']; + createdAt = jsonRes['CreatedAt']; + customerId = jsonRes['CustomerId']; + email = jsonRes['Email']; + imageUrl = jsonRes['ImageUrl']; + payerId = jsonRes['PayerId']; + token = jsonRes['Token']; + updatedAt = jsonRes['UpdatedAt']; + subscriptions = jsonRes['Subscriptions'] == null ? null : []; + + for (var subscriptionsItem + in subscriptions == null ? [] : jsonRes['Subscriptions']) { + subscriptions.add(BraintreeSubscription(subscriptionsItem)); + } + } + + @override + String toString() { + return '{"RevokedAt": $revokedAt,"IsDefault": $isDefault,"BillingAgreementId": ${billingAgreementId != null ? '${json.encode(billingAgreementId)}' : 'null'},"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"CustomerId": ${customerId != null ? '${json.encode(customerId)}' : 'null'},"Email": ${email != null ? '${json.encode(email)}' : 'null'},"ImageUrl": ${imageUrl != null ? '${json.encode(imageUrl)}' : 'null'},"PayerId": ${payerId != null ? '${json.encode(payerId)}' : 'null'},"Token": ${token != null ? '${json.encode(token)}' : 'null'},"UpdatedAt": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"Subscriptions": $subscriptions}'; + } +} diff --git a/lib/models/base_api_model/braintree_customer_details.dart b/lib/models/base_api_model/braintree_customer_details.dart new file mode 100644 index 00000000..49ac96cc --- /dev/null +++ b/lib/models/base_api_model/braintree_customer_details.dart @@ -0,0 +1,38 @@ +import 'dart:convert' show json; + +class CustomerDetails { + Object company; + Object email; + Object fax; + Object firstName; + Object lastName; + Object phone; + Object website; + String id; + + CustomerDetails.fromParams( + {this.company, + this.email, + this.fax, + this.firstName, + this.lastName, + this.phone, + this.website, + this.id}); + + CustomerDetails.fromJson(jsonRes) { + company = jsonRes['Company']; + email = jsonRes['Email']; + fax = jsonRes['Fax']; + firstName = jsonRes['FirstName']; + lastName = jsonRes['LastName']; + phone = jsonRes['Phone']; + website = jsonRes['Website']; + id = jsonRes['Id']; + } + + @override + String toString() { + return '{"Company": $company,"Email": $email,"Fax": $fax,"FirstName": $firstName,"LastName": $lastName,"Phone": $phone,"Website": $website,"Id": ${id != null ? '${json.encode(id)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/braintree_descriptor.dart b/lib/models/base_api_model/braintree_descriptor.dart new file mode 100644 index 00000000..32f54640 --- /dev/null +++ b/lib/models/base_api_model/braintree_descriptor.dart @@ -0,0 +1,18 @@ +class BraintreeDescriptor { + Object name; + Object phone; + Object url; + + BraintreeDescriptor.fromParams({this.name, this.phone, this.url}); + + BraintreeDescriptor.fromJson(jsonRes) { + name = jsonRes['Name']; + phone = jsonRes['Phone']; + url = jsonRes['Url']; + } + + @override + String toString() { + return '{"Name": $name,"Phone": $phone,"Url": $url}'; + } +} diff --git a/lib/models/base_api_model/braintree_item_type.dart b/lib/models/base_api_model/braintree_item_type.dart new file mode 100644 index 00000000..bf8d671c --- /dev/null +++ b/lib/models/base_api_model/braintree_item_type.dart @@ -0,0 +1,18 @@ +import 'dart:convert' show json; + +class ItemType { + String type; + String value; + + ItemType.fromParams({this.type, this.value}); + + ItemType.fromJson(jsonRes) { + type = jsonRes['type']; + value = jsonRes['value']; + } + + @override + String toString() { + return '{"type": ${type != null ? '${json.encode(type)}' : 'null'},"value": ${value != null ? '${json.encode(value)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/braintree_status_history.dart b/lib/models/base_api_model/braintree_status_history.dart new file mode 100644 index 00000000..d4f44127 --- /dev/null +++ b/lib/models/base_api_model/braintree_status_history.dart @@ -0,0 +1,30 @@ +import 'dart:convert' show json; +import 'braintree_item_type.dart'; + +class StatusHistory { + double amount; + String timestamp; + String user; + ItemType source; + ItemType status; + + StatusHistory.fromParams( + {this.amount, this.timestamp, this.user, this.source, this.status}); + + StatusHistory.fromJson(jsonRes) { + amount = jsonRes['Amount']; + timestamp = jsonRes['Timestamp']; + user = jsonRes['User']; + source = jsonRes['Source'] == null + ? null + : new ItemType.fromJson(jsonRes['Source']); + status = jsonRes['Status'] == null + ? null + : new ItemType.fromJson(jsonRes['Status']); + } + + @override + String toString() { + return '{"Amount": $amount,"Timestamp": ${timestamp != null ? '${json.encode(timestamp)}' : 'null'},"User": ${user != null ? '${json.encode(user)}' : 'null'},"Source": $source,"Status": $status}'; + } +} diff --git a/lib/models/base_api_model/braintree_subscription.dart b/lib/models/base_api_model/braintree_subscription.dart new file mode 100644 index 00000000..a392ace5 --- /dev/null +++ b/lib/models/base_api_model/braintree_subscription.dart @@ -0,0 +1,148 @@ +import 'dart:convert' show json; + +import 'braintree_descriptor.dart'; +import 'braintree_item_type.dart'; +import 'braintree_status_history.dart'; +import 'braintree_transaction.dart'; + +class BraintreeSubscription { + Object daysPastDue; + Object description; + Object numberOfBillingCycles; + Object trialDuration; + Object trialDurationUnit; + int billingDayOfMonth; + int currentBillingCycle; + int failureCount; + double balance; + double nextBillAmount; + double nextBillingPeriodAmount; + double price; + bool hasTrialPeriod; + bool neverExpires; + String billingPeriodEndDate; + String billingPeriodStartDate; + String createdAt; + String firstBillingDate; + String id; + String merchantAccountId; + String nextBillingDate; + String paidThroughDate; + String paymentMethodToken; + String planId; + String updatedAt; + List addOns; + List discounts; + List statusHistory; + List transactions; + BraintreeDescriptor descriptor; + ItemType status; + + BraintreeSubscription.fromParams( + {this.daysPastDue, + this.description, + this.numberOfBillingCycles, + this.trialDuration, + this.trialDurationUnit, + this.billingDayOfMonth, + this.currentBillingCycle, + this.failureCount, + this.balance, + this.nextBillAmount, + this.nextBillingPeriodAmount, + this.price, + this.hasTrialPeriod, + this.neverExpires, + this.billingPeriodEndDate, + this.billingPeriodStartDate, + this.createdAt, + this.firstBillingDate, + this.id, + this.merchantAccountId, + this.nextBillingDate, + this.paidThroughDate, + this.paymentMethodToken, + this.planId, + this.updatedAt, + this.addOns, + this.discounts, + this.statusHistory, + this.transactions, + this.descriptor, + this.status}); + + factory BraintreeSubscription(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new BraintreeSubscription.fromJson(json.decode(jsonStr)) + : new BraintreeSubscription.fromJson(jsonStr); + + BraintreeSubscription.fromJson(jsonRes) { + daysPastDue = jsonRes['DaysPastDue']; + description = jsonRes['Description']; + numberOfBillingCycles = jsonRes['NumberOfBillingCycles']; + trialDuration = jsonRes['TrialDuration']; + trialDurationUnit = jsonRes['TrialDurationUnit']; + billingDayOfMonth = jsonRes['BillingDayOfMonth']; + currentBillingCycle = jsonRes['CurrentBillingCycle']; + failureCount = jsonRes['FailureCount']; + balance = jsonRes['Balance']; + nextBillAmount = jsonRes['NextBillAmount']; + nextBillingPeriodAmount = jsonRes['NextBillingPeriodAmount']; + price = jsonRes['Price']; + hasTrialPeriod = jsonRes['HasTrialPeriod']; + neverExpires = jsonRes['NeverExpires']; + billingPeriodEndDate = jsonRes['BillingPeriodEndDate']; + billingPeriodStartDate = jsonRes['BillingPeriodStartDate']; + createdAt = jsonRes['CreatedAt']; + firstBillingDate = jsonRes['FirstBillingDate']; + id = jsonRes['Id']; + merchantAccountId = jsonRes['MerchantAccountId']; + nextBillingDate = jsonRes['NextBillingDate']; + paidThroughDate = jsonRes['PaidThroughDate']; + paymentMethodToken = jsonRes['PaymentMethodToken']; + planId = jsonRes['PlanId']; + updatedAt = jsonRes['UpdatedAt']; + addOns = jsonRes['AddOns'] == null ? null : []; + + for (var addOnsItem in addOns == null ? [] : jsonRes['AddOns']) { + addOns.add(addOnsItem); + } + + discounts = jsonRes['Discounts'] == null ? null : []; + + for (var discountsItem in discounts == null ? [] : jsonRes['Discounts']) { + discounts.add(discountsItem); + } + + statusHistory = jsonRes['StatusHistory'] == null ? null : []; + + for (var statusHistoryItem + in statusHistory == null ? [] : jsonRes['StatusHistory']) { + statusHistory.add(statusHistoryItem == null + ? null + : new StatusHistory.fromJson(statusHistoryItem)); + } + + transactions = jsonRes['Transactions'] == null ? null : []; + + for (var transactionsItem + in transactions == null ? [] : jsonRes['Transactions']) { + transactions.add(transactionsItem == null + ? null + : new Transaction.fromJson(transactionsItem)); + } + + descriptor = jsonRes['Descriptor'] == null + ? null + : new BraintreeDescriptor.fromJson(jsonRes['Descriptor']); + status = jsonRes['Status'] == null + ? null + : new ItemType.fromJson(jsonRes['Status']); + } + + @override + String toString() { + return '{"DaysPastDue": $daysPastDue,"Description": $description,"NumberOfBillingCycles": $numberOfBillingCycles,"TrialDuration": $trialDuration,"TrialDurationUnit": $trialDurationUnit,"BillingDayOfMonth": $billingDayOfMonth,"CurrentBillingCycle": $currentBillingCycle,"FailureCount": $failureCount,"Balance": $balance,"NextBillAmount": $nextBillAmount,"NextBillingPeriodAmount": $nextBillingPeriodAmount,"Price": $price,"HasTrialPeriod": $hasTrialPeriod,"NeverExpires": $neverExpires,"BillingPeriodEndDate": ${billingPeriodEndDate != null ? '${json.encode(billingPeriodEndDate)}' : 'null'},"BillingPeriodStartDate": ${billingPeriodStartDate != null ? '${json.encode(billingPeriodStartDate)}' : 'null'},"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"FirstBillingDate": ${firstBillingDate != null ? '${json.encode(firstBillingDate)}' : 'null'},"Id": ${id != null ? '${json.encode(id)}' : 'null'},"MerchantAccountId": ${merchantAccountId != null ? '${json.encode(merchantAccountId)}' : 'null'},"NextBillingDate": ${nextBillingDate != null ? '${json.encode(nextBillingDate)}' : 'null'},"PaidThroughDate": ${paidThroughDate != null ? '${json.encode(paidThroughDate)}' : 'null'},"PaymentMethodToken": ${paymentMethodToken != null ? '${json.encode(paymentMethodToken)}' : 'null'},"PlanId": ${planId != null ? '${json.encode(planId)}' : 'null'},"UpdatedAt": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"AddOns": $addOns,"Discounts": $discounts,"StatusHistory": $statusHistory,"Transactions": $transactions,"Descriptor": $descriptor,"Status": $status}'; + } +} diff --git a/lib/models/base_api_model/braintree_transaction.dart b/lib/models/base_api_model/braintree_transaction.dart new file mode 100644 index 00000000..8a42603d --- /dev/null +++ b/lib/models/base_api_model/braintree_transaction.dart @@ -0,0 +1,510 @@ +import 'dart:convert' show json; + +import 'braintree_billing_address.dart'; +import 'braintree_creditcard.dart'; +import 'braintree_customer_details.dart'; +import 'braintree_descriptor.dart'; +import 'braintree_item_type.dart'; +import 'braintree_status_history.dart'; +import 'branintree_disbursement_details.dart'; + +class TransactionModel { + List list; + + TransactionModel.fromParams({this.list}); + + factory TransactionModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TransactionModel.fromJson(json.decode(jsonStr)) + : new TransactionModel.fromJson(jsonStr); + + TransactionModel.fromJson(jsonRes) { + list = jsonRes == null ? null : []; + + for (var listItem in list == null ? [] : jsonRes) { + list.add(listItem == null ? null : new Transaction.fromJson(listItem)); + } + } + + @override + String toString() { + return '{"json_list": $list}'; + } +} + +class Transaction { + Object additionalProcessorResponse; + Object amexExpressCheckoutDetails; + Object applePayDetails; + Object authorizedTransactionId; + Object avsErrorResponseCode; + Object channel; + Object coinbaseDetails; + Object customFields; + Object discountAmount; + Object facilitatedDetails; + Object facilitatorDetails; + Object idealPaymentDetails; + Object localPaymentDetails; + Object masterpassCardDetails; + Object orderId; + Object payPalHereDetails; + Object purchaseOrderNumber; + Object refundedTransactionId; + Object riskData; + Object samsungPayCardDetails; + Object serviceFeeAmount; + Object shippingAmount; + Object shipsFromPostalCode; + Object taxAmount; + Object threeDSecureInfo; + Object usBankAccountDetails; + Object venmoAccountDetails; + Object visaCheckoutCardDetails; + Object voiceReferralNumber; + double amount; + bool recurring; + bool taxExempt; + String authorizationExpiresAt; + String avsPostalCodeResponseCode; + String avsStreetAddressResponseCode; + String createdAt; + String currencyIsoCode; + String cvvResponseCode; + String graphQLId; + String id; + String merchantAccountId; + String networkResponseCode; + String networkResponseText; + String networkTransactionId; + String planId; + String processorAuthorizationCode; + String processorResponseCode; + String processorResponseText; + String processorSettlementResponseCode; + String processorSettlementResponseText; + String settlementBatchId; + String subscriptionId; + String updatedAt; + List addOns; + List authorizationAdjustments; + List discounts; + List disputes; + List partialSettlementTransactionIds; + List refundIds; + List statusHistory; + AndroidPayDetails androidPayDetails; + BillingAddress billingAddress; + CreditCard creditCard; + CustomerDetails customerDetails; + BraintreeDescriptor descriptor; + DisbursementDetails disbursementDetails; + ItemType escrowStatus; + ItemType gatewayRejectionReason; + PayPalDetails payPalDetails; + ItemType paymentInstrumentType; + ItemType processorResponseType; + BillingAddress shippingAddress; + ItemType status; + ItemType subscriptionDetails; + ItemType type; + + Transaction.fromParams( + {this.additionalProcessorResponse, + this.amexExpressCheckoutDetails, + this.applePayDetails, + this.authorizedTransactionId, + this.avsErrorResponseCode, + this.channel, + this.coinbaseDetails, + this.customFields, + this.discountAmount, + this.facilitatedDetails, + this.facilitatorDetails, + this.idealPaymentDetails, + this.localPaymentDetails, + this.masterpassCardDetails, + this.orderId, + this.payPalHereDetails, + this.purchaseOrderNumber, + this.refundedTransactionId, + this.riskData, + this.samsungPayCardDetails, + this.serviceFeeAmount, + this.shippingAmount, + this.shipsFromPostalCode, + this.taxAmount, + this.threeDSecureInfo, + this.usBankAccountDetails, + this.venmoAccountDetails, + this.visaCheckoutCardDetails, + this.voiceReferralNumber, + this.amount, + this.recurring, + this.taxExempt, + this.authorizationExpiresAt, + this.avsPostalCodeResponseCode, + this.avsStreetAddressResponseCode, + this.createdAt, + this.currencyIsoCode, + this.cvvResponseCode, + this.graphQLId, + this.id, + this.merchantAccountId, + this.networkResponseCode, + this.networkResponseText, + this.networkTransactionId, + this.planId, + this.processorAuthorizationCode, + this.processorResponseCode, + this.processorResponseText, + this.processorSettlementResponseCode, + this.processorSettlementResponseText, + this.settlementBatchId, + this.subscriptionId, + this.updatedAt, + this.addOns, + this.authorizationAdjustments, + this.discounts, + this.disputes, + this.partialSettlementTransactionIds, + this.refundIds, + this.statusHistory, + this.androidPayDetails, + this.billingAddress, + this.creditCard, + this.customerDetails, + this.descriptor, + this.disbursementDetails, + this.escrowStatus, + this.gatewayRejectionReason, + this.payPalDetails, + this.paymentInstrumentType, + this.processorResponseType, + this.shippingAddress, + this.status, + this.subscriptionDetails, + this.type}); + + Transaction.fromJson(jsonRes) { + additionalProcessorResponse = jsonRes['AdditionalProcessorResponse']; + amexExpressCheckoutDetails = jsonRes['AmexExpressCheckoutDetails']; + applePayDetails = jsonRes['ApplePayDetails']; + authorizedTransactionId = jsonRes['AuthorizedTransactionId']; + avsErrorResponseCode = jsonRes['AvsErrorResponseCode']; + channel = jsonRes['Channel']; + coinbaseDetails = jsonRes['CoinbaseDetails']; + customFields = jsonRes['CustomFields']; + discountAmount = jsonRes['DiscountAmount']; + facilitatedDetails = jsonRes['FacilitatedDetails']; + facilitatorDetails = jsonRes['FacilitatorDetails']; + idealPaymentDetails = jsonRes['IdealPaymentDetails']; + localPaymentDetails = jsonRes['LocalPaymentDetails']; + masterpassCardDetails = jsonRes['MasterpassCardDetails']; + orderId = jsonRes['OrderId']; + payPalHereDetails = jsonRes['PayPalHereDetails']; + purchaseOrderNumber = jsonRes['PurchaseOrderNumber']; + refundedTransactionId = jsonRes['RefundedTransactionId']; + riskData = jsonRes['RiskData']; + samsungPayCardDetails = jsonRes['SamsungPayCardDetails']; + serviceFeeAmount = jsonRes['ServiceFeeAmount']; + shippingAmount = jsonRes['ShippingAmount']; + shipsFromPostalCode = jsonRes['ShipsFromPostalCode']; + taxAmount = jsonRes['TaxAmount']; + threeDSecureInfo = jsonRes['ThreeDSecureInfo']; + usBankAccountDetails = jsonRes['UsBankAccountDetails']; + venmoAccountDetails = jsonRes['VenmoAccountDetails']; + visaCheckoutCardDetails = jsonRes['VisaCheckoutCardDetails']; + voiceReferralNumber = jsonRes['VoiceReferralNumber']; + amount = jsonRes['Amount']; + recurring = jsonRes['Recurring']; + taxExempt = jsonRes['TaxExempt']; + authorizationExpiresAt = jsonRes['AuthorizationExpiresAt']; + avsPostalCodeResponseCode = jsonRes['AvsPostalCodeResponseCode']; + avsStreetAddressResponseCode = jsonRes['AvsStreetAddressResponseCode']; + createdAt = jsonRes['CreatedAt']; + currencyIsoCode = jsonRes['CurrencyIsoCode']; + cvvResponseCode = jsonRes['CvvResponseCode']; + graphQLId = jsonRes['GraphQLId']; + id = jsonRes['Id']; + merchantAccountId = jsonRes['MerchantAccountId']; + networkResponseCode = jsonRes['NetworkResponseCode']; + networkResponseText = jsonRes['NetworkResponseText']; + networkTransactionId = jsonRes['NetworkTransactionId']; + planId = jsonRes['PlanId']; + processorAuthorizationCode = jsonRes['ProcessorAuthorizationCode']; + processorResponseCode = jsonRes['ProcessorResponseCode']; + processorResponseText = jsonRes['ProcessorResponseText']; + processorSettlementResponseCode = + jsonRes['ProcessorSettlementResponseCode']; + processorSettlementResponseText = + jsonRes['ProcessorSettlementResponseText']; + settlementBatchId = jsonRes['SettlementBatchId']; + subscriptionId = jsonRes['SubscriptionId']; + updatedAt = jsonRes['UpdatedAt']; + addOns = jsonRes['AddOns'] == null ? null : []; + + for (var addOnsItem in addOns == null ? [] : jsonRes['AddOns']) { + addOns.add(addOnsItem); + } + + authorizationAdjustments = + jsonRes['AuthorizationAdjustments'] == null ? null : []; + + for (var authorizationAdjustmentsItem in authorizationAdjustments == null + ? [] + : jsonRes['AuthorizationAdjustments']) { + authorizationAdjustments.add(authorizationAdjustmentsItem); + } + + discounts = jsonRes['Discounts'] == null ? null : []; + + for (var discountsItem in discounts == null ? [] : jsonRes['Discounts']) { + discounts.add(discountsItem); + } + + disputes = jsonRes['Disputes'] == null ? null : []; + + for (var disputesItem in disputes == null ? [] : jsonRes['Disputes']) { + disputes.add(disputesItem); + } + + partialSettlementTransactionIds = + jsonRes['PartialSettlementTransactionIds'] == null ? null : []; + + for (var partialSettlementTransactionIdsItem + in partialSettlementTransactionIds == null + ? [] + : jsonRes['PartialSettlementTransactionIds']) { + partialSettlementTransactionIds.add(partialSettlementTransactionIdsItem); + } + + refundIds = jsonRes['RefundIds'] == null ? null : []; + + for (var refundIdsItem in refundIds == null ? [] : jsonRes['RefundIds']) { + refundIds.add(refundIdsItem); + } + + statusHistory = jsonRes['StatusHistory'] == null ? null : []; + + for (var statusHistoryItem + in statusHistory == null ? [] : jsonRes['StatusHistory']) { + statusHistory.add(statusHistoryItem == null + ? null + : new StatusHistory.fromJson(statusHistoryItem)); + } + + androidPayDetails = jsonRes['AndroidPayDetails'] == null + ? null + : new AndroidPayDetails.fromJson(jsonRes['AndroidPayDetails']); + billingAddress = jsonRes['BillingAddress'] == null + ? null + : new BillingAddress.fromJson(jsonRes['BillingAddress']); + creditCard = jsonRes['CreditCard'] == null + ? null + : new CreditCard.fromJson(jsonRes['CreditCard']); + customerDetails = jsonRes['CustomerDetails'] == null + ? null + : new CustomerDetails.fromJson(jsonRes['CustomerDetails']); + descriptor = jsonRes['Descriptor'] == null + ? null + : new BraintreeDescriptor.fromJson(jsonRes['Descriptor']); + disbursementDetails = jsonRes['DisbursementDetails'] == null + ? null + : new DisbursementDetails.fromJson(jsonRes['DisbursementDetails']); + escrowStatus = jsonRes['EscrowStatus'] == null + ? null + : new ItemType.fromJson(jsonRes['EscrowStatus']); + gatewayRejectionReason = jsonRes['GatewayRejectionReason'] == null + ? null + : new ItemType.fromJson(jsonRes['GatewayRejectionReason']); + payPalDetails = jsonRes['PayPalDetails'] == null + ? null + : new PayPalDetails.fromJson(jsonRes['PayPalDetails']); + paymentInstrumentType = jsonRes['PaymentInstrumentType'] == null + ? null + : new ItemType.fromJson(jsonRes['PaymentInstrumentType']); + processorResponseType = jsonRes['ProcessorResponseType'] == null + ? null + : new ItemType.fromJson(jsonRes['ProcessorResponseType']); + shippingAddress = jsonRes['ShippingAddress'] == null + ? null + : new BillingAddress.fromJson(jsonRes['ShippingAddress']); + status = jsonRes['Status'] == null + ? null + : new ItemType.fromJson(jsonRes['Status']); + subscriptionDetails = jsonRes['SubscriptionDetails'] == null + ? null + : new ItemType.fromJson(jsonRes['SubscriptionDetails']); + type = + jsonRes['Type'] == null ? null : new ItemType.fromJson(jsonRes['Type']); + } + + @override + String toString() { + return '{"AdditionalProcessorResponse": $additionalProcessorResponse,"AmexExpressCheckoutDetails": $amexExpressCheckoutDetails,"ApplePayDetails": $applePayDetails,"AuthorizedTransactionId": $authorizedTransactionId,"AvsErrorResponseCode": $avsErrorResponseCode,"Channel": $channel,"CoinbaseDetails": $coinbaseDetails,"CustomFields": $customFields,"DiscountAmount": $discountAmount,"FacilitatedDetails": $facilitatedDetails,"FacilitatorDetails": $facilitatorDetails,"IdealPaymentDetails": ${id != null ? '${json.encode(id)}' : 'null'}ealPaymentDetails,"LocalPaymentDetails": $localPaymentDetails,"MasterpassCardDetails": $masterpassCardDetails,"OrderId": $orderId,"PayPalHereDetails": $payPalHereDetails,"PurchaseOrderNumber": $purchaseOrderNumber,"RefundedTransactionId": $refundedTransactionId,"RiskData": $riskData,"SamsungPayCardDetails": $samsungPayCardDetails,"ServiceFeeAmount": $serviceFeeAmount,"ShippingAmount": $shippingAmount,"ShipsFromPostalCode": $shipsFromPostalCode,"TaxAmount": $taxAmount,"ThreeDSecureInfo": $threeDSecureInfo,"UsBankAccountDetails": $usBankAccountDetails,"VenmoAccountDetails": $venmoAccountDetails,"VisaCheckoutCardDetails": $visaCheckoutCardDetails,"VoiceReferralNumber": $voiceReferralNumber,"Amount": $amount,"Recurring": $recurring,"TaxExempt": $taxExempt,"AuthorizationExpiresAt": ${authorizationExpiresAt != null ? '${json.encode(authorizationExpiresAt)}' : 'null'},"AvsPostalCodeResponseCode": ${avsPostalCodeResponseCode != null ? '${json.encode(avsPostalCodeResponseCode)}' : 'null'},"AvsStreetAddressResponseCode": ${avsStreetAddressResponseCode != null ? '${json.encode(avsStreetAddressResponseCode)}' : 'null'},"CreatedAt": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"CurrencyIsoCode": ${currencyIsoCode != null ? '${json.encode(currencyIsoCode)}' : 'null'},"CvvResponseCode": ${cvvResponseCode != null ? '${json.encode(cvvResponseCode)}' : 'null'},"GraphQLId": ${graphQLId != null ? '${json.encode(graphQLId)}' : 'null'},"Id": ${id != null ? '${json.encode(id)}' : 'null'},"MerchantAccountId": ${merchantAccountId != null ? '${json.encode(merchantAccountId)}' : 'null'},"NetworkResponseCode": ${networkResponseCode != null ? '${json.encode(networkResponseCode)}' : 'null'},"NetworkResponseText": ${networkResponseText != null ? '${json.encode(networkResponseText)}' : 'null'},"NetworkTransactionId": ${networkTransactionId != null ? '${json.encode(networkTransactionId)}' : 'null'},"PlanId": ${planId != null ? '${json.encode(planId)}' : 'null'},"ProcessorAuthorizationCode": ${processorAuthorizationCode != null ? '${json.encode(processorAuthorizationCode)}' : 'null'},"ProcessorResponseCode": ${processorResponseCode != null ? '${json.encode(processorResponseCode)}' : 'null'},"ProcessorResponseText": ${processorResponseText != null ? '${json.encode(processorResponseText)}' : 'null'},"ProcessorSettlementResponseCode": ${processorSettlementResponseCode != null ? '${json.encode(processorSettlementResponseCode)}' : 'null'},"ProcessorSettlementResponseText": ${processorSettlementResponseText != null ? '${json.encode(processorSettlementResponseText)}' : 'null'},"SettlementBatchId": ${settlementBatchId != null ? '${json.encode(settlementBatchId)}' : 'null'},"SubscriptionId": ${subscriptionId != null ? '${json.encode(subscriptionId)}' : 'null'},"UpdatedAt": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"AddOns": $addOns,"AuthorizationAdjustments": $authorizationAdjustments,"Discounts": $discounts,"Disputes": $disputes,"PartialSettlementTransactionIds": $partialSettlementTransactionIds,"RefundIds": $refundIds,"StatusHistory": $statusHistory,"AndroidPayDetails": $androidPayDetails,"BillingAddress": $billingAddress,"CreditCard": $creditCard,"CustomerDetails": $customerDetails,"Descriptor": $descriptor,"DisbursementDetails": $disbursementDetails,"EscrowStatus": $escrowStatus,"GatewayRejectionReason": $gatewayRejectionReason,"PayPalDetails": $payPalDetails,"PaymentInstrumentType": $paymentInstrumentType,"ProcessorResponseType": $processorResponseType,"ShippingAddress": $shippingAddress,"Status": $status,"SubscriptionDetails": $subscriptionDetails,"Type": $type}'; + } +} + +class PayPalDetails { + Object customField; + Object description; + Object payeeEmail; + Object payeeId; + Object refundFromTransactionFeeAmount; + Object refundFromTransactionFeeCurrencyIsoCode; + Object refundId; + String authorizationId; + String captureId; + String debugId; + String imageUrl; + String payerEmail; + String payerFirstName; + String payerId; + String payerLastName; + String payerStatus; + String paymentId; + String sellerProtectionStatus; + String token; + String transactionFeeAmount; + String transactionFeeCurrencyIsoCode; + + PayPalDetails.fromParams( + {this.customField, + this.description, + this.payeeEmail, + this.payeeId, + this.refundFromTransactionFeeAmount, + this.refundFromTransactionFeeCurrencyIsoCode, + this.refundId, + this.authorizationId, + this.captureId, + this.debugId, + this.imageUrl, + this.payerEmail, + this.payerFirstName, + this.payerId, + this.payerLastName, + this.payerStatus, + this.paymentId, + this.sellerProtectionStatus, + this.token, + this.transactionFeeAmount, + this.transactionFeeCurrencyIsoCode}); + + PayPalDetails.fromJson(jsonRes) { + customField = jsonRes['CustomField']; + description = jsonRes['Description']; + payeeEmail = jsonRes['PayeeEmail']; + payeeId = jsonRes['PayeeId']; + refundFromTransactionFeeAmount = jsonRes['RefundFromTransactionFeeAmount']; + refundFromTransactionFeeCurrencyIsoCode = + jsonRes['RefundFromTransactionFeeCurrencyIsoCode']; + refundId = jsonRes['RefundId']; + authorizationId = jsonRes['AuthorizationId']; + captureId = jsonRes['CaptureId']; + debugId = jsonRes['DebugId']; + imageUrl = jsonRes['ImageUrl']; + payerEmail = jsonRes['PayerEmail']; + payerFirstName = jsonRes['PayerFirstName']; + payerId = jsonRes['PayerId']; + payerLastName = jsonRes['PayerLastName']; + payerStatus = jsonRes['PayerStatus']; + paymentId = jsonRes['PaymentId']; + sellerProtectionStatus = jsonRes['SellerProtectionStatus']; + token = jsonRes['Token']; + transactionFeeAmount = jsonRes['TransactionFeeAmount']; + transactionFeeCurrencyIsoCode = jsonRes['TransactionFeeCurrencyIsoCode']; + } + + @override + String toString() { + return '{"CustomField": $customField,"Description": $description,"PayeeEmail": $payeeEmail,"PayeeId": $payeeId,"RefundFromTransactionFeeAmount": $refundFromTransactionFeeAmount,"RefundFromTransactionFeeCurrencyIsoCode": $refundFromTransactionFeeCurrencyIsoCode,"RefundId": $refundId,"AuthorizationId": ${authorizationId != null ? '${json.encode(authorizationId)}' : 'null'},"CaptureId": ${captureId != null ? '${json.encode(captureId)}' : 'null'},"DebugId": ${debugId != null ? '${json.encode(debugId)}' : 'null'},"ImageUrl": ${imageUrl != null ? '${json.encode(imageUrl)}' : 'null'},"PayerEmail": ${payerEmail != null ? '${json.encode(payerEmail)}' : 'null'},"PayerFirstName": ${payerFirstName != null ? '${json.encode(payerFirstName)}' : 'null'},"PayerId": ${payerId != null ? '${json.encode(payerId)}' : 'null'},"PayerLastName": ${payerLastName != null ? '${json.encode(payerLastName)}' : 'null'},"PayerStatus": ${payerStatus != null ? '${json.encode(payerStatus)}' : 'null'},"PaymentId": ${paymentId != null ? '${json.encode(paymentId)}' : 'null'},"SellerProtectionStatus": ${sellerProtectionStatus != null ? '${json.encode(sellerProtectionStatus)}' : 'null'},"Token": ${token != null ? '${json.encode(token)}' : 'null'},"TransactionFeeAmount": ${transactionFeeAmount != null ? '${json.encode(transactionFeeAmount)}' : 'null'},"TransactionFeeCurrencyIsoCode": ${transactionFeeCurrencyIsoCode != null ? '${json.encode(transactionFeeCurrencyIsoCode)}' : 'null'}}'; + } +} + +class AndroidPayDetails { + Object countryOfIssuance; + Object globalId; + Object issuingBank; + Object token; + bool isNetworkTokenized; + String bin; + String cardType; + String commercial; + String debit; + String durbinRegulated; + String expirationMonth; + String expirationYear; + String googleTransactionId; + String healthcare; + String imageUrl; + String last4; + String payroll; + String prepaid; + String productId; + String sourceCardLast4; + String sourceCardType; + String sourceDescription; + String virtualCardLast4; + String virtualCardType; + + AndroidPayDetails.fromParams( + {this.countryOfIssuance, + this.globalId, + this.issuingBank, + this.token, + this.isNetworkTokenized, + this.bin, + this.cardType, + this.commercial, + this.debit, + this.durbinRegulated, + this.expirationMonth, + this.expirationYear, + this.googleTransactionId, + this.healthcare, + this.imageUrl, + this.last4, + this.payroll, + this.prepaid, + this.productId, + this.sourceCardLast4, + this.sourceCardType, + this.sourceDescription, + this.virtualCardLast4, + this.virtualCardType}); + + AndroidPayDetails.fromJson(jsonRes) { + countryOfIssuance = jsonRes['CountryOfIssuance']; + globalId = jsonRes['GlobalId']; + issuingBank = jsonRes['IssuingBank']; + token = jsonRes['Token']; + isNetworkTokenized = jsonRes['IsNetworkTokenized']; + bin = jsonRes['Bin']; + cardType = jsonRes['CardType']; + commercial = jsonRes['Commercial']; + debit = jsonRes['Debit']; + durbinRegulated = jsonRes['DurbinRegulated']; + expirationMonth = jsonRes['ExpirationMonth']; + expirationYear = jsonRes['ExpirationYear']; + googleTransactionId = jsonRes['GoogleTransactionId']; + healthcare = jsonRes['Healthcare']; + imageUrl = jsonRes['ImageUrl']; + last4 = jsonRes['Last4']; + payroll = jsonRes['Payroll']; + prepaid = jsonRes['Prepaid']; + productId = jsonRes['ProductId']; + sourceCardLast4 = jsonRes['SourceCardLast4']; + sourceCardType = jsonRes['SourceCardType']; + sourceDescription = jsonRes['SourceDescription']; + virtualCardLast4 = jsonRes['VirtualCardLast4']; + virtualCardType = jsonRes['VirtualCardType']; + } + + @override + String toString() { + return '{"CountryOfIssuance": $countryOfIssuance,"GlobalId": $globalId,"IssuingBank": $issuingBank,"Token": $token,"IsNetworkTokenized": $isNetworkTokenized,"Bin": ${bin != null ? '${json.encode(bin)}' : 'null'},"CardType": ${cardType != null ? '${json.encode(cardType)}' : 'null'},"Commercial": ${commercial != null ? '${json.encode(commercial)}' : 'null'},"Debit": ${debit != null ? '${json.encode(debit)}' : 'null'},"DurbinRegulated": ${durbinRegulated != null ? '${json.encode(durbinRegulated)}' : 'null'},"ExpirationMonth": ${expirationMonth != null ? '${json.encode(expirationMonth)}' : 'null'},"ExpirationYear": ${expirationYear != null ? '${json.encode(expirationYear)}' : 'null'},"GoogleTransactionId": ${googleTransactionId != null ? '${json.encode(googleTransactionId)}' : 'null'},"Healthcare": ${healthcare != null ? '${json.encode(healthcare)}' : 'null'},"ImageUrl": ${imageUrl != null ? '${json.encode(imageUrl)}' : 'null'},"Last4": ${last4 != null ? '${json.encode(last4)}' : 'null'},"Payroll": ${payroll != null ? '${json.encode(payroll)}' : 'null'},"Prepaid": ${prepaid != null ? '${json.encode(prepaid)}' : 'null'},"ProductId": ${productId != null ? '${json.encode(productId)}' : 'null'},"SourceCardLast4": ${sourceCardLast4 != null ? '${json.encode(sourceCardLast4)}' : 'null'},"SourceCardType": ${sourceCardType != null ? '${json.encode(sourceCardType)}' : 'null'},"SourceDescription": ${sourceDescription != null ? '${json.encode(sourceDescription)}' : 'null'},"VirtualCardLast4": ${virtualCardLast4 != null ? '${json.encode(virtualCardLast4)}' : 'null'},"VirtualCardType": ${virtualCardType != null ? '${json.encode(virtualCardType)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/branintree_disbursement_details.dart b/lib/models/base_api_model/branintree_disbursement_details.dart new file mode 100644 index 00000000..ee036e2f --- /dev/null +++ b/lib/models/base_api_model/branintree_disbursement_details.dart @@ -0,0 +1,30 @@ +class DisbursementDetails { + Object disbursementDate; + Object fundsHeld; + Object settlementAmount; + Object settlementCurrencyExchangeRate; + Object settlementCurrencyIsoCode; + Object success; + + DisbursementDetails.fromParams( + {this.disbursementDate, + this.fundsHeld, + this.settlementAmount, + this.settlementCurrencyExchangeRate, + this.settlementCurrencyIsoCode, + this.success}); + + DisbursementDetails.fromJson(jsonRes) { + disbursementDate = jsonRes['DisbursementDate']; + fundsHeld = jsonRes['FundsHeld']; + settlementAmount = jsonRes['SettlementAmount']; + settlementCurrencyExchangeRate = jsonRes['SettlementCurrencyExchangeRate']; + settlementCurrencyIsoCode = jsonRes['SettlementCurrencyIsoCode']; + success = jsonRes['Success']; + } + + @override + String toString() { + return '{"DisbursementDate": $disbursementDate,"FundsHeld": $fundsHeld,"SettlementAmount": $settlementAmount,"SettlementCurrencyExchangeRate": $settlementCurrencyExchangeRate,"SettlementCurrencyIsoCode": $settlementCurrencyIsoCode,"Success": $success}'; + } +} diff --git a/lib/models/base_api_model/cast_list_detail.dart b/lib/models/base_api_model/cast_list_detail.dart new file mode 100644 index 00000000..7a90ef45 --- /dev/null +++ b/lib/models/base_api_model/cast_list_detail.dart @@ -0,0 +1,60 @@ +import 'dart:convert' show json; + +class CastListDetail { + int page; + List data; + + CastListDetail.fromParams({this.page, this.data}); + + factory CastListDetail(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new CastListDetail.fromJson(json.decode(jsonStr)) + : new CastListDetail.fromJson(jsonStr); + + CastListDetail.fromJson(jsonRes) { + page = jsonRes['page']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new BaseCast.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"data": $data}'; + } +} + +class BaseCast { + int castId; + int id; + int listId; + String name; + String profileUrl; + DateTime updateTime; + + BaseCast.fromParams( + {this.castId, + this.id, + this.listId, + this.name, + this.profileUrl, + this.updateTime}); + + BaseCast.fromJson(jsonRes) { + castId = jsonRes['castId']; + id = jsonRes['id']; + listId = jsonRes['listId']; + name = jsonRes['name']; + profileUrl = jsonRes['profileUrl']; + updateTime = + DateTime.parse(jsonRes['updateTime']?.toString() ?? '2020-01-01'); + } + + @override + String toString() { + return '{"castId": $castId,"id": $id,"listId": $listId,"name": ${name != null ? '${json.encode(name)}' : 'null'},"profileUrl": ${profileUrl != null ? '${json.encode(profileUrl)}' : 'null'},"updateTime": $updateTime}'; + } +} diff --git a/lib/models/base_api_model/checkout_model.dart b/lib/models/base_api_model/checkout_model.dart new file mode 100644 index 00000000..7f5e4d2b --- /dev/null +++ b/lib/models/base_api_model/checkout_model.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:movie/models/enums/premium_type.dart'; + +class CheckOutModel { + String name; + double amount; + String url; + bool isPremium; + PremiumType premiumType; + CheckOutModel({ + @required this.name, + @required this.amount, + this.isPremium = false, + this.url, + this.premiumType = PremiumType.oneMonth, + }); +} diff --git a/lib/models/base_api_model/movie_comment.dart b/lib/models/base_api_model/movie_comment.dart new file mode 100644 index 00000000..93bcbeba --- /dev/null +++ b/lib/models/base_api_model/movie_comment.dart @@ -0,0 +1,72 @@ +import 'dart:convert' show json; + +import 'base_user.dart'; + +class MovieComments { + int page; + int totalCount; + List data; + + MovieComments.fromParams({this.page, this.data, this.totalCount}); + + factory MovieComments(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new MovieComments.fromJson(json.decode(jsonStr)) + : new MovieComments.fromJson(jsonStr); + + MovieComments.fromJson(jsonRes) { + page = jsonRes['page']; + totalCount = jsonRes['totalCount']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new MovieComment.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"totalCount": $totalCount,"data": $data}'; + } +} + +class MovieComment { + Object mainId; + int id; + int like; + int mediaId; + String comment; + String createTime; + String uid; + String updateTime; + BaseUser u; + + MovieComment.fromParams( + {this.mainId, + this.id, + this.like, + this.mediaId, + this.comment, + this.createTime, + this.uid, + this.updateTime, + this.u}); + + MovieComment.fromJson(jsonRes) { + mainId = jsonRes['mainId']; + id = jsonRes['id']; + like = jsonRes['like']; + mediaId = jsonRes['mediaId']; + comment = jsonRes['comment']; + createTime = jsonRes['createTime']; + uid = jsonRes['uid']; + updateTime = jsonRes['updateTime']; + u = jsonRes['u'] == null ? null : new BaseUser.fromJson(jsonRes['u']); + } + + @override + String toString() { + return '{"mainId": $mainId,"id": $id,"like": $like,"mediaId": $mediaId,"comment": ${comment != null ? '${json.encode(comment)}' : 'null'},"createTime": ${createTime != null ? '${json.encode(createTime)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"updateTime": ${updateTime != null ? '${json.encode(updateTime)}' : 'null'},"u": $u}'; + } +} diff --git a/lib/models/base_api_model/movie_like_model.dart b/lib/models/base_api_model/movie_like_model.dart new file mode 100644 index 00000000..1051c0bb --- /dev/null +++ b/lib/models/base_api_model/movie_like_model.dart @@ -0,0 +1,26 @@ +import 'dart:convert' show json; + +class MovieLikeModel { + int id; + int movieId; + String uid; + + MovieLikeModel.fromParams({this.id, this.movieId, this.uid}); + + factory MovieLikeModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new MovieLikeModel.fromJson(json.decode(jsonStr)) + : new MovieLikeModel.fromJson(jsonStr); + + MovieLikeModel.fromJson(jsonRes) { + id = jsonRes['id']; + movieId = jsonRes['movieId']; + uid = jsonRes['uid']; + } + + @override + String toString() { + return '{"id": $id",movieId": $movieId,"uid": ${uid != null ? '${json.encode(uid)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/movie_stream_link.dart b/lib/models/base_api_model/movie_stream_link.dart new file mode 100644 index 00000000..bbe2528f --- /dev/null +++ b/lib/models/base_api_model/movie_stream_link.dart @@ -0,0 +1,89 @@ +import 'dart:convert' show json; + +import 'stream_link_language.dart'; +import 'stream_link_quality.dart'; +import 'stream_link_type.dart'; + +class MovieStreamLinks { + List list; + + MovieStreamLinks.fromParams({this.list}); + + factory MovieStreamLinks(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new MovieStreamLinks.fromJson(json.decode(jsonStr)) + : new MovieStreamLinks.fromJson(jsonStr); + + MovieStreamLinks.fromJson(jsonRes) { + list = jsonRes == null ? null : []; + + for (var listItem in list == null ? [] : jsonRes) { + list.add( + listItem == null ? null : new MovieStreamLink.fromJson(listItem)); + } + } + + @override + String toString() { + return '{"json_list": $list}'; + } +} + +class MovieStreamLink { + int movieId; + int sid; + String linkName; + String streamLink; + String uid; + String updateTime; + Language language; + Quality quality; + StreamLinkType streamLinkType; + bool selected; + bool needAd; + bool externalBrowser; + factory MovieStreamLink(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new MovieStreamLink.fromJson(json.decode(jsonStr)) + : new MovieStreamLink.fromJson(jsonStr); + MovieStreamLink.fromParams( + {this.language, + this.movieId, + this.quality, + this.sid, + this.streamLinkType, + this.linkName, + this.streamLink, + this.uid, + this.updateTime, + this.needAd, + this.externalBrowser}); + + MovieStreamLink.fromJson(jsonRes) { + movieId = jsonRes['movieId']; + sid = jsonRes['sid']; + linkName = jsonRes['linkName']; + streamLink = jsonRes['streamLink']; + uid = jsonRes['uid']; + updateTime = jsonRes['updateTime']; + needAd = jsonRes['needAd'] == 1; + externalBrowser = jsonRes['externalBrowser'] == 1; + selected = false; + language = jsonRes['languageNavigation'] == null + ? null + : new Language.fromJson(jsonRes['languageNavigation']); + quality = jsonRes['qualityNavigation'] == null + ? null + : new Quality.fromJson(jsonRes['qualityNavigation']); + streamLinkType = jsonRes['streamLinkTypeNavigation'] == null + ? null + : new StreamLinkType.fromJson(jsonRes['streamLinkTypeNavigation']); + } + + @override + String toString() { + return '{"languageNavigation": $language,"movieId": $movieId,"qualityNavigation": $quality,"sid": $sid,"streamLinkTypeNavigation": $streamLinkType,"needAd": $needAd,"externalBrowser": $externalBrowser,"streamLink":${streamLink != null ? '${json.encode(streamLink)}' : 'null'},"needAd":$needAd,"externalBrowser":$externalBrowser}'; + } +} diff --git a/lib/models/base_api_model/payment_client_token.dart b/lib/models/base_api_model/payment_client_token.dart new file mode 100644 index 00000000..d283e875 --- /dev/null +++ b/lib/models/base_api_model/payment_client_token.dart @@ -0,0 +1,26 @@ +import 'dart:convert' show json; + +class PaymentClientToken { + String token; + int expiredTime; + PaymentClientToken.fromParams({this.expiredTime, this.token}); + factory PaymentClientToken(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new PaymentClientToken.fromJson(json.decode(jsonStr)) + : new PaymentClientToken.fromJson(jsonStr); + + PaymentClientToken.fromJson(jsonRes) { + token = jsonRes['token']; + expiredTime = jsonRes['expiredTime']; + } + + bool isExpired() { + return DateTime.now().millisecondsSinceEpoch - expiredTime >= 86400000; + } + + @override + String toString() { + return '{"token": "$token","expiredTime": $expiredTime}'; + } +} diff --git a/lib/models/base_api_model/purchase.dart b/lib/models/base_api_model/purchase.dart new file mode 100644 index 00000000..20cd5ccf --- /dev/null +++ b/lib/models/base_api_model/purchase.dart @@ -0,0 +1,8 @@ +class Purchase { + String userId; + double amount; + String paymentMethodNonce; + String deviceData; + Purchase( + {this.amount, this.deviceData, this.paymentMethodNonce, this.userId}); +} diff --git a/lib/models/base_api_model/stream_link_language.dart b/lib/models/base_api_model/stream_link_language.dart new file mode 100644 index 00000000..465a17c0 --- /dev/null +++ b/lib/models/base_api_model/stream_link_language.dart @@ -0,0 +1,20 @@ +import 'dart:convert' show json; + +class Language { + int id; + String code; + String name; + + Language.fromParams({this.id, this.code, this.name}); + + Language.fromJson(jsonRes) { + id = jsonRes['id']; + code = jsonRes['code']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"id": $id,"code": ${code != null ? '${json.encode(code)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/stream_link_quality.dart b/lib/models/base_api_model/stream_link_quality.dart new file mode 100644 index 00000000..cc713b44 --- /dev/null +++ b/lib/models/base_api_model/stream_link_quality.dart @@ -0,0 +1,20 @@ +import 'dart:convert' show json; + +class Quality { + int id; + String code; + String name; + + Quality.fromParams({this.id, this.code, this.name}); + + Quality.fromJson(jsonRes) { + id = jsonRes['id']; + code = jsonRes['code']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"id": $id,"code": ${code != null ? '${json.encode(code)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/stream_link_report.dart b/lib/models/base_api_model/stream_link_report.dart new file mode 100644 index 00000000..d681e6f8 --- /dev/null +++ b/lib/models/base_api_model/stream_link_report.dart @@ -0,0 +1,19 @@ +class StreamLinkReport { + String mediaName; + String linkName; + String content; + String streamLink; + String type; + int mediaId; + int streamLinkId; + int season; + StreamLinkReport( + {this.mediaName, + this.content, + this.linkName, + this.mediaId, + this.streamLink, + this.streamLinkId, + this.season, + this.type}); +} diff --git a/lib/models/base_api_model/stream_link_type.dart b/lib/models/base_api_model/stream_link_type.dart new file mode 100644 index 00000000..224394b3 --- /dev/null +++ b/lib/models/base_api_model/stream_link_type.dart @@ -0,0 +1,18 @@ +import 'dart:convert' show json; + +class StreamLinkType { + int id; + String name; + + StreamLinkType.fromParams({this.id, this.name}); + + StreamLinkType.fromJson(jsonRes) { + id = jsonRes['id']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"id": $id,"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/topic_subscription.dart b/lib/models/base_api_model/topic_subscription.dart new file mode 100644 index 00000000..3c4c5d65 --- /dev/null +++ b/lib/models/base_api_model/topic_subscription.dart @@ -0,0 +1,29 @@ +import 'dart:convert' show json; + +class TopicSubscription { + int id; + String cloudMessagingToken; + String localCode; + String topicId; + + TopicSubscription.fromParams( + {this.id, this.cloudMessagingToken, this.localCode, this.topicId}); + + factory TopicSubscription(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TopicSubscription.fromJson(json.decode(jsonStr)) + : new TopicSubscription.fromJson(jsonStr); + + TopicSubscription.fromJson(jsonRes) { + id = jsonRes['id']; + cloudMessagingToken = jsonRes['cloudMessagingToken']; + localCode = jsonRes['localCode']; + topicId = jsonRes['topicId']; + } + + @override + String toString() { + return '{"id": $id,"cloudMessagingToken": ${cloudMessagingToken != null ? '${json.encode(cloudMessagingToken)}' : 'null'},"localCode": ${localCode != null ? '${json.encode(localCode)}' : 'null'},"topicId": ${topicId != null ? '${json.encode(topicId)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/tvshow_comment.dart b/lib/models/base_api_model/tvshow_comment.dart new file mode 100644 index 00000000..45872925 --- /dev/null +++ b/lib/models/base_api_model/tvshow_comment.dart @@ -0,0 +1,78 @@ +import 'dart:convert' show json; + +import 'base_user.dart'; + +class TvShowComments { + int page; + int totalCount; + List data; + + TvShowComments.fromParams({this.page, this.data, this.totalCount}); + + factory TvShowComments(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TvShowComments.fromJson(json.decode(jsonStr)) + : new TvShowComments.fromJson(jsonStr); + + TvShowComments.fromJson(jsonRes) { + page = jsonRes['page']; + totalCount = jsonRes['totalCount']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new TvShowComment.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"totalCount": $totalCount,"data": $data}'; + } +} + +class TvShowComment { + int episode; + int id; + int like; + int mainId; + int mediaId; + int season; + String comment; + String createTime; + String uid; + String updateTime; + BaseUser u; + + TvShowComment.fromParams( + {this.episode, + this.id, + this.like, + this.mainId, + this.mediaId, + this.season, + this.comment, + this.createTime, + this.uid, + this.updateTime, + this.u}); + + TvShowComment.fromJson(jsonRes) { + episode = jsonRes['episode']; + id = jsonRes['id']; + like = jsonRes['like']; + mainId = jsonRes['mainId']; + mediaId = jsonRes['mediaId']; + season = jsonRes['season']; + comment = jsonRes['comment']; + createTime = jsonRes['createTime']; + uid = jsonRes['uid']; + updateTime = jsonRes['updateTime']; + u = jsonRes['u'] == null ? null : new BaseUser.fromJson(jsonRes['u']); + } + + @override + String toString() { + return '{"episode": $episode,"id": $id,"like": $like,"mainId": $mainId,"mediaId": $mediaId,"season": $season,"comment": ${comment != null ? '${json.encode(comment)}' : 'null'},"createTime": ${createTime != null ? '${json.encode(createTime)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"updateTime": ${updateTime != null ? '${json.encode(updateTime)}' : 'null'},"u": $u}'; + } +} diff --git a/lib/models/base_api_model/tvshow_like_model.dart b/lib/models/base_api_model/tvshow_like_model.dart new file mode 100644 index 00000000..98b6dd0d --- /dev/null +++ b/lib/models/base_api_model/tvshow_like_model.dart @@ -0,0 +1,31 @@ +import 'dart:convert' show json; + +class TvShowLikeModel { + int episode; + int id; + int season; + int tvId; + String uid; + + TvShowLikeModel.fromParams( + {this.episode, this.id, this.season, this.tvId, this.uid}); + + factory TvShowLikeModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TvShowLikeModel.fromJson(json.decode(jsonStr)) + : new TvShowLikeModel.fromJson(jsonStr); + + TvShowLikeModel.fromJson(jsonRes) { + episode = jsonRes['episode']; + id = jsonRes['id']; + season = jsonRes['season']; + tvId = jsonRes['tvId']; + uid = jsonRes['uid']; + } + + @override + String toString() { + return '{"episode": $episode,"id": $id,"season": $season,"tvId": $tvId,"uid": ${uid != null ? '${json.encode(uid)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/tvshow_stream_link.dart b/lib/models/base_api_model/tvshow_stream_link.dart new file mode 100644 index 00000000..ece50c19 --- /dev/null +++ b/lib/models/base_api_model/tvshow_stream_link.dart @@ -0,0 +1,93 @@ +import 'dart:convert' show json; + +import 'stream_link_language.dart'; +import 'stream_link_quality.dart'; +import 'stream_link_type.dart'; + +class TvShowStreamLinks { + List list; + + TvShowStreamLinks.fromParams({this.list}); + + factory TvShowStreamLinks(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TvShowStreamLinks.fromJson(json.decode(jsonStr)) + : new TvShowStreamLinks.fromJson(jsonStr); + + TvShowStreamLinks.fromJson(jsonRes) { + list = jsonRes == null ? null : []; + + for (var listItem in list == null ? [] : jsonRes) { + list.add( + listItem == null ? null : new TvShowStreamLink.fromJson(listItem)); + } + } + + @override + String toString() { + return '{"json_list": $list}'; + } +} + +class TvShowStreamLink { + int episode; + int season; + int sid; + int tvId; + String linkName; + String streamLink; + String uid; + String updateTime; + Language language; + Quality quality; + bool needAd; + bool externalBrowser; + StreamLinkType streamLinkType; + factory TvShowStreamLink(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TvShowStreamLink.fromJson(json.decode(jsonStr)) + : new TvShowStreamLink.fromJson(jsonStr); + TvShowStreamLink.fromParams( + {this.episode, + this.language, + this.quality, + this.season, + this.sid, + this.streamLinkType, + this.tvId, + this.linkName, + this.streamLink, + this.uid, + this.needAd, + this.externalBrowser, + this.updateTime}); + + TvShowStreamLink.fromJson(jsonRes) { + episode = jsonRes['episode']; + season = jsonRes['season']; + sid = jsonRes['sid']; + tvId = jsonRes['tvId']; + linkName = jsonRes['linkName']; + streamLink = jsonRes['streamLink']; + uid = jsonRes['uid']; + updateTime = jsonRes['updateTime']; + needAd = jsonRes['needAd'] == 1; + externalBrowser = jsonRes['externalBrowser'] == 1; + language = jsonRes['languageNavigation'] == null + ? null + : new Language.fromJson(jsonRes['languageNavigation']); + quality = jsonRes['qualityNavigation'] == null + ? null + : new Quality.fromJson(jsonRes['qualityNavigation']); + streamLinkType = jsonRes['streamLinkTypeNavigation'] == null + ? null + : new StreamLinkType.fromJson(jsonRes['streamLinkTypeNavigation']); + } + + @override + String toString() { + return '{"episode": $episode,"season": $season,"sid": $sid,"streamLink": ${streamLink != null ? '${json.encode(streamLink)}' : 'null'},"tvId": $tvId,"linkName": ${linkName != null ? '${json.encode(linkName)}' : 'null'},"streamLink": ${streamLink != null ? '${json.encode(streamLink)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"updateTime": ${updateTime != null ? '${json.encode(updateTime)}' : 'null'},"languageNavigation": $language,"qualityNavigation": $quality,"streamLinkTypeNavigation": $streamLinkType,"needAd":$needAd,"externalBrowser":$externalBrowser}'; + } +} diff --git a/lib/models/base_api_model/user_list.dart b/lib/models/base_api_model/user_list.dart new file mode 100644 index 00000000..9bfda49d --- /dev/null +++ b/lib/models/base_api_model/user_list.dart @@ -0,0 +1,76 @@ +import 'dart:convert' show json; + +class UserListModel { + List data; + int page; + + UserListModel.fromParams({this.data}); + + factory UserListModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new UserListModel.fromJson(json.decode(jsonStr)) + : new UserListModel.fromJson(jsonStr); + + UserListModel.fromJson(jsonRes) { + data = jsonRes['data'] == null ? null : []; + page = jsonRes['page']; + for (var listItem in data == null ? [] : jsonRes['data']) { + data.add(listItem == null ? null : new UserList.fromJson(listItem)); + } + } + + @override + String toString() { + return '{"page":$page,"data": $data}'; + } +} + +class UserList { + int id; + int itemCount; + int runTime; + int selected; + double revenue; + double totalRated; + String backGroundUrl; + String createTime; + String description; + String listName; + String uid; + String updateTime; + + UserList.fromParams( + {this.id, + this.itemCount, + this.runTime, + this.selected, + this.revenue, + this.totalRated, + this.backGroundUrl, + this.createTime, + this.description, + this.listName, + this.uid, + this.updateTime}); + + UserList.fromJson(jsonRes) { + id = jsonRes['id']; + itemCount = jsonRes['itemCount']; + runTime = jsonRes['runTime']; + selected = jsonRes['selected']; + revenue = jsonRes['revenue']; + totalRated = jsonRes['totalRated']; + backGroundUrl = jsonRes['backGroundUrl']; + createTime = jsonRes['createTime']; + description = jsonRes['description']; + listName = jsonRes['listName']; + uid = jsonRes['uid']; + updateTime = jsonRes['updateTime']; + } + + @override + String toString() { + return '{"id": $id,"itemCount": $itemCount,"runTime": $runTime,"selected": $selected,"revenue": $revenue,"totalRated": $totalRated,"backGroundUrl": ${backGroundUrl != null ? '${json.encode(backGroundUrl)}' : 'null'},"createTime": ${createTime != null ? '${json.encode(createTime)}' : 'null'},"description": ${description != null ? '${json.encode(description)}' : 'null'},"listName": ${listName != null ? '${json.encode(listName)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"updateTime": ${updateTime != null ? '${json.encode(updateTime)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/user_list_detail.dart b/lib/models/base_api_model/user_list_detail.dart new file mode 100644 index 00000000..f7ec485a --- /dev/null +++ b/lib/models/base_api_model/user_list_detail.dart @@ -0,0 +1,68 @@ +import 'dart:convert' show json; + +class UserListDetailModel { + int page; + List data; + + UserListDetailModel.fromParams({this.page, this.data}); + + factory UserListDetailModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new UserListDetailModel.fromJson(json.decode(jsonStr)) + : new UserListDetailModel.fromJson(jsonStr); + + UserListDetailModel.fromJson(jsonRes) { + page = jsonRes['page']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new UserListDetail.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"data": $data}'; + } +} + +class UserListDetail { + int id; + int listid; + int mediaid; + int runTime; + double rated; + double revenue; + String mediaName; + String mediaType; + String photoUrl; + + UserListDetail.fromParams( + {this.id, + this.listid, + this.mediaid, + this.runTime, + this.rated, + this.revenue, + this.mediaName, + this.mediaType, + this.photoUrl}); + + UserListDetail.fromJson(jsonRes) { + id = jsonRes['id']; + listid = jsonRes['listid']; + mediaid = jsonRes['mediaid']; + runTime = jsonRes['runTime']; + rated = double.parse(jsonRes['rated'].toString() ?? '0.0'); + revenue = double.parse(jsonRes['revenue']?.toString() ?? '0.0'); + mediaName = jsonRes['mediaName']; + mediaType = jsonRes['mediaType']; + photoUrl = jsonRes['photoUrl']; + } + + @override + String toString() { + return '{"id": $id,"listid": $listid,"mediaid": $mediaid,"runTime": $runTime,"rated": $rated,"revenue": $revenue,"mediaName": ${mediaName != null ? '${json.encode(mediaName)}' : 'null'},"mediaType": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"photoUrl": ${photoUrl != null ? '${json.encode(photoUrl)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/user_media.dart b/lib/models/base_api_model/user_media.dart new file mode 100644 index 00000000..41478c13 --- /dev/null +++ b/lib/models/base_api_model/user_media.dart @@ -0,0 +1,77 @@ +import 'dart:convert' show json; + +class UserMediaModel { + int page; + List data; + + UserMediaModel.fromParams({this.page, this.data}); + + factory UserMediaModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new UserMediaModel.fromJson(json.decode(jsonStr)) + : new UserMediaModel.fromJson(jsonStr); + + UserMediaModel.fromJson(jsonRes) { + page = jsonRes['page']; + data = jsonRes['data'] == null ? null : []; + + for (var dataItem in data == null ? [] : jsonRes['data']) { + data.add(dataItem == null ? null : new UserMedia.fromJson(dataItem)); + } + } + + @override + String toString() { + return '{"page": $page,"data": $data}'; + } +} + +class UserMedia { + int id; + int mediaId; + int ratedCount; + double popular; + double rated; + String genre; + String mediaType; + String name; + String overwatch; + String photoUrl; + String uid; + String releaseDate; + + UserMedia.fromParams( + {this.id, + this.mediaId, + this.ratedCount, + this.popular, + this.rated, + this.genre, + this.mediaType, + this.name, + this.overwatch, + this.photoUrl, + this.uid, + this.releaseDate}); + + UserMedia.fromJson(jsonRes) { + id = jsonRes['id']; + mediaId = jsonRes['mediaId']; + ratedCount = jsonRes['ratedCount']; + popular = jsonRes['popular']; + rated = jsonRes['rated']; + genre = jsonRes['genre']; + mediaType = jsonRes['mediaType']; + name = jsonRes['name']; + overwatch = jsonRes['overwatch']; + photoUrl = jsonRes['photoUrl']; + uid = jsonRes['uid']; + releaseDate = jsonRes['releaseDate']; + } + + @override + String toString() { + return '{"id": $id,"mediaId": $mediaId,"ratedCount": $ratedCount,"popular": $popular,"rated": $rated,"genre": ${genre != null ? '${json.encode(genre)}' : 'null'},"mediaType": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"overwatch": ${overwatch != null ? '${json.encode(overwatch)}' : 'null'},"photoUrl": ${photoUrl != null ? '${json.encode(photoUrl)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"releaseDate": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'}}'; + } +} diff --git a/lib/models/base_api_model/user_premium_model.dart b/lib/models/base_api_model/user_premium_model.dart new file mode 100644 index 00000000..166e798a --- /dev/null +++ b/lib/models/base_api_model/user_premium_model.dart @@ -0,0 +1,68 @@ +import 'dart:convert' show json; + +class UserPremiumModel { + bool status; + String message; + UserPremiumData data; + + UserPremiumModel.fromParams({this.status, this.message, this.data}); + + factory UserPremiumModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new UserPremiumModel.fromJson(json.decode(jsonStr)) + : new UserPremiumModel.fromJson(jsonStr); + + UserPremiumModel.fromJson(jsonRes) { + status = jsonRes['status']; + message = jsonRes['message']; + data = jsonRes['data'] == null + ? null + : new UserPremiumData.fromJson(jsonRes['data']); + } + + @override + String toString() { + return '{"status": $status,"message": ${message != null ? '${json.encode(message)}' : 'null'},"data": $data}'; + } +} + +class UserPremiumData { + int id; + int premiumType; + bool subscription; + String expireDate; + String startDate; + String subscriptionId; + String uid; + + UserPremiumData.fromParams( + {this.id, + this.premiumType, + this.subscription, + this.expireDate, + this.startDate, + this.subscriptionId, + this.uid}); + + factory UserPremiumData(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new UserPremiumData.fromJson(json.decode(jsonStr)) + : new UserPremiumData.fromJson(jsonStr); + + UserPremiumData.fromJson(jsonRes) { + id = jsonRes['id']; + premiumType = jsonRes['premiumType']; + subscription = jsonRes['subscription'] == 1; + expireDate = jsonRes['expireDate']; + startDate = jsonRes['startDate']; + subscriptionId = jsonRes['subscriptionId']; + uid = jsonRes['uid']; + } + + @override + String toString() { + return '{"id": $id,"premiumType": $premiumType,"subscription": ${subscription ? '1' : '0'},"expireDate": ${expireDate != null ? '${json.encode(expireDate)}' : 'null'},"startDate": ${startDate != null ? '${json.encode(startDate)}' : 'null'},"uid": ${uid != null ? '${json.encode(uid)}' : 'null'},"subscriptionId": ${subscriptionId != null ? '${json.encode(subscriptionId)}' : 'null'}}'; + } +} diff --git a/lib/models/certification.dart b/lib/models/certification.dart new file mode 100644 index 00000000..ebf5c923 --- /dev/null +++ b/lib/models/certification.dart @@ -0,0 +1,221 @@ +import 'dart:convert' show json; + +class CertificationModel { + + Certification certifications; + + CertificationModel.fromParams({this.certifications}); + + factory CertificationModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new CertificationModel.fromJson(json.decode(jsonStr)) : new CertificationModel.fromJson(jsonStr); + + CertificationModel.fromJson(jsonRes) { + certifications = jsonRes['certifications'] == null ? null : new Certification.fromJson(jsonRes['certifications']); + } + + @override + String toString() { + return '{"certifications": $certifications}'; + } +} + +class Certification { + + List au; + List bg; + List br; + List ca; + List caQc; + List de; + List dk; + List es; + List fi; + List fr; + List gb; + List hu; + List inn; + List it; + List lt; + List my; + List nl; + List no; + List nz; + List ph; + List pt; + List ru; + List se; + List us; + + Certification.fromParams({this.au, this.bg, this.br, this.ca, this.caQc, this.de, this.dk, this.es, this.fi, this.fr, this.gb, this.hu, this.inn, this.it, this.lt, this.my, this.nl, this.no, this.nz, this.ph, this.pt, this.ru, this.se, this.us}); + + Certification.fromJson(jsonRes) { + au = jsonRes['AU'] == null ? null : []; + + for (var AUItem in au == null ? [] : jsonRes['AU']){ + au.add(AUItem == null ? null : new Order.fromJson(AUItem)); + } + + bg = jsonRes['BG'] == null ? null : []; + + for (var BGItem in bg == null ? [] : jsonRes['BG']){ + bg.add(BGItem == null ? null : new Order.fromJson(BGItem)); + } + + br = jsonRes['BR'] == null ? null : []; + + for (var BRItem in br == null ? [] : jsonRes['BR']){ + br.add(BRItem == null ? null : new Order.fromJson(BRItem)); + } + + ca = jsonRes['CA'] == null ? null : []; + + for (var CAItem in ca == null ? [] : jsonRes['CA']){ + ca.add(CAItem == null ? null : new Order.fromJson(CAItem)); + } + + caQc = jsonRes['CA-QC'] == null ? null : []; + + for (var CA_QCItem in caQc == null ? [] : jsonRes['CA-QC']){ + caQc.add(CA_QCItem == null ? null : new Order.fromJson(CA_QCItem)); + } + + de = jsonRes['DE'] == null ? null : []; + + for (var DEItem in de == null ? [] : jsonRes['DE']){ + de.add(DEItem == null ? null : new Order.fromJson(DEItem)); + } + + dk = jsonRes['DK'] == null ? null : []; + + for (var DKItem in dk == null ? [] : jsonRes['DK']){ + dk.add(DKItem == null ? null : new Order.fromJson(DKItem)); + } + + es = jsonRes['ES'] == null ? null : []; + + for (var ESItem in es == null ? [] : jsonRes['ES']){ + es.add(ESItem == null ? null : new Order.fromJson(ESItem)); + } + + fi = jsonRes['FI'] == null ? null : []; + + for (var FIItem in fi == null ? [] : jsonRes['FI']){ + fi.add(FIItem == null ? null : new Order.fromJson(FIItem)); + } + + fr = jsonRes['FR'] == null ? null : []; + + for (var FRItem in fr == null ? [] : jsonRes['FR']){ + fr.add(FRItem == null ? null : new Order.fromJson(FRItem)); + } + + gb = jsonRes['GB'] == null ? null : []; + + for (var GBItem in gb == null ? [] : jsonRes['GB']){ + gb.add(GBItem == null ? null : new Order.fromJson(GBItem)); + } + + hu = jsonRes['HU'] == null ? null : []; + + for (var HUItem in hu == null ? [] : jsonRes['HU']){ + hu.add(HUItem == null ? null : new Order.fromJson(HUItem)); + } + + inn = jsonRes['IN'] == null ? null : []; + + for (var INItem in inn == null ? [] : jsonRes['IN']){ + inn.add(INItem == null ? null : new Order.fromJson(INItem)); + } + + it = jsonRes['IT'] == null ? null : []; + + for (var ITItem in it == null ? [] : jsonRes['IT']){ + it.add(ITItem == null ? null : new Order.fromJson(ITItem)); + } + + lt = jsonRes['LT'] == null ? null : []; + + for (var LTItem in lt == null ? [] : jsonRes['LT']){ + lt.add(LTItem == null ? null : new Order.fromJson(LTItem)); + } + + my = jsonRes['MY'] == null ? null : []; + + for (var MYItem in my == null ? [] : jsonRes['MY']){ + my.add(MYItem == null ? null : new Order.fromJson(MYItem)); + } + + nl = jsonRes['NL'] == null ? null : []; + + for (var NLItem in nl == null ? [] : jsonRes['NL']){ + nl.add(NLItem == null ? null : new Order.fromJson(NLItem)); + } + + no = jsonRes['NO'] == null ? null : []; + + for (var NOItem in no == null ? [] : jsonRes['NO']){ + no.add(NOItem == null ? null : new Order.fromJson(NOItem)); + } + + nz = jsonRes['NZ'] == null ? null : []; + + for (var NZItem in nz == null ? [] : jsonRes['NZ']){ + nz.add(NZItem == null ? null : new Order.fromJson(NZItem)); + } + + ph = jsonRes['PH'] == null ? null : []; + + for (var PHItem in ph == null ? [] : jsonRes['PH']){ + ph.add(PHItem == null ? null : new Order.fromJson(PHItem)); + } + + pt = jsonRes['PT'] == null ? null : []; + + for (var PTItem in pt == null ? [] : jsonRes['PT']){ + pt.add(PTItem == null ? null : new Order.fromJson(PTItem)); + } + + ru = jsonRes['RU'] == null ? null : []; + + for (var RUItem in ru == null ? [] : jsonRes['RU']){ + ru.add(RUItem == null ? null : new Order.fromJson(RUItem)); + } + + se = jsonRes['SE'] == null ? null : []; + + for (var SEItem in se == null ? [] : jsonRes['SE']){ + se.add(SEItem == null ? null : new Order.fromJson(SEItem)); + } + + us = jsonRes['US'] == null ? null : []; + + for (var USItem in us == null ? [] : jsonRes['US']){ + us.add(USItem == null ? null : new Order.fromJson(USItem)); + } + } + + @override + String toString() { + return '{"AU": $au,"BG": $bg,"BR": $br,"CA": $ca,"CA-QC": $ca-QC,"DE": $de,"DK": $dk,"ES": $es,"FI": $fi,"FR": $fr,"GB": $gb,"HU": $hu,"IN": $inn,"IT": $it,"LT": $lt,"MY": $my,"NL": $nl,"NO": $no,"NZ": $nz,"PH": $ph,"PT": $pt,"RU": $ru,"SE": $se,"US": $us}'; + } +} + +class Order { + + int order; + String certification; + String meaning; + + Order.fromParams({this.order, this.certification, this.meaning}); + + Order.fromJson(jsonRes) { + order = jsonRes['order']; + certification = jsonRes['certification']; + meaning = jsonRes['meaning']; + } + + @override + String toString() { + return '{"order": $order,"certification": ${certification != null?'${json.encode(certification)}':'null'},"meaning": ${meaning != null?'${json.encode(meaning)}':'null'}}'; + } +} + diff --git a/lib/models/combined_cast_data.dart b/lib/models/combined_cast_data.dart new file mode 100644 index 00000000..739e145b --- /dev/null +++ b/lib/models/combined_cast_data.dart @@ -0,0 +1,81 @@ +import 'dart:convert' show json; + +class CombinedCastData { + int id; + int voteCount; + double popularity; + double voteAverage; + bool adult; + bool video; + int episodeCount; + String backdropPath; + String character; + String creditId; + String mediaType; + String originalLanguage; + String originalTitle; + String overview; + String posterPath; + String releaseDate; + String title; + String name; + String originalName; + String firstAirDate; + List genreIds; + + CombinedCastData.fromParams( + {this.id, + this.episodeCount, + this.name, + this.originalName, + this.firstAirDate, + this.voteCount, + this.popularity, + this.voteAverage, + this.adult, + this.video, + this.backdropPath, + this.character, + this.creditId, + this.mediaType, + this.originalLanguage, + this.originalTitle, + this.overview, + this.posterPath, + this.releaseDate, + this.title, + this.genreIds}); + + CombinedCastData.fromJson(jsonRes) { + id = jsonRes['id']; + voteCount = jsonRes['vote_count']; + popularity = double.parse(jsonRes['popularity']?.toString() ?? '0'); + voteAverage = double.parse(jsonRes['vote_average']?.toString() ?? '0'); + adult = jsonRes['adult']; + video = jsonRes['video']; + backdropPath = jsonRes['backdrop_path']; + character = jsonRes['character']; + creditId = jsonRes['credit_id']; + mediaType = jsonRes['media_type']; + originalLanguage = jsonRes['original_language']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + releaseDate = jsonRes['release_date']; + title = jsonRes['title']; + genreIds = jsonRes['genre_ids'] == null ? null : []; + episodeCount = jsonRes['episode_count']; + name = jsonRes['name']; + originalName = jsonRes['original_name']; + firstAirDate = jsonRes['first_air_date']; + + for (var genre_idsItem in genreIds == null ? [] : jsonRes['genre_ids']) { + genreIds.add(genre_idsItem); + } + } + + @override + String toString() { + return '{"id": $id,"first_air_date": $firstAirDate,"original_name": $originalName,"name": $name,"episode_count": $episodeCount,,"vote_count": $voteCount,"popularity": $popularity,"vote_average": $voteAverage,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"character": ${character != null ? '${json.encode(character)}' : 'null'},"credit_id": ${creditId != null ? '${json.encode(creditId)}' : 'null'},"media_type": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"original_language": ${originalLanguage != null ? '${json.encode(originalLanguage)}' : 'null'},"original_title": ${originalTitle != null ? '${json.encode(originalTitle)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"release_date": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'},"title": ${title != null ? '${json.encode(title)}' : 'null'},"genre_ids": $genreIds}'; + } +} diff --git a/lib/models/combined_credits.dart b/lib/models/combined_credits.dart new file mode 100644 index 00000000..34478891 --- /dev/null +++ b/lib/models/combined_credits.dart @@ -0,0 +1,44 @@ +import 'dart:convert' show json; + +import 'combined_cast_data.dart'; +import 'combined_crew_data.dart'; + +class CombinedCreditsModel { + int id; + List cast; + List crew; + + CombinedCreditsModel.fromParams({this.id, this.cast, this.crew}); + + factory CombinedCreditsModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new CombinedCreditsModel.fromJson(json.decode(jsonStr)) + : new CombinedCreditsModel.fromJson(jsonStr); + + CombinedCreditsModel.fromJson(jsonRes) { + id = jsonRes['id']; + cast = jsonRes['cast'] == null ? null : []; + + for (var castItem in cast == null ? [] : jsonRes['cast']) { + cast.add( + castItem == null ? null : new CombinedCastData.fromJson(castItem)); + } + + crew = jsonRes['crew'] == null ? null : []; + + for (var crewItem in crew == null ? [] : jsonRes['crew']) { + crew.add( + crewItem == null ? null : new CombinedCrewData.fromJson(crewItem)); + } + } + + CombinedCreditsModel clone() { + return new CombinedCreditsModel.fromParams(id: id, cast: cast, crew: crew); + } + + @override + String toString() { + return '{"id": $id,"cast": $cast,"crew": $crew}'; + } +} diff --git a/lib/models/combined_crew_data.dart b/lib/models/combined_crew_data.dart new file mode 100644 index 00000000..a2b6d45e --- /dev/null +++ b/lib/models/combined_crew_data.dart @@ -0,0 +1,84 @@ +import 'dart:convert' show json; + +class CombinedCrewData { + int id; + double voteAverage; + int voteCount; + double popularity; + bool adult; + bool video; + String backdropPath; + String creditId; + String department; + String job; + String mediaType; + String originalLanguage; + String originalTitle; + String overview; + String posterPath; + String releaseDate; + String title; + List genreIds; + int episodeCount; + String name; + String originalName; + String firstAirDate; + + CombinedCrewData.fromParams( + {this.id, + this.episodeCount, + this.name, + this.originalName, + this.firstAirDate, + this.voteAverage, + this.voteCount, + this.popularity, + this.adult, + this.video, + this.backdropPath, + this.creditId, + this.department, + this.job, + this.mediaType, + this.originalLanguage, + this.originalTitle, + this.overview, + this.posterPath, + this.releaseDate, + this.title, + this.genreIds}); + + CombinedCrewData.fromJson(jsonRes) { + id = jsonRes['id']; + voteAverage = double.parse(jsonRes['vote_average']?.toString() ?? '0'); + voteCount = jsonRes['vote_count']; + popularity = double.parse(jsonRes['popularity']?.toString() ?? '0'); + adult = jsonRes['adult']; + video = jsonRes['video']; + backdropPath = jsonRes['backdrop_path']; + creditId = jsonRes['credit_id']; + department = jsonRes['department']; + job = jsonRes['job']; + mediaType = jsonRes['media_type']; + originalLanguage = jsonRes['original_language']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + releaseDate = jsonRes['release_date']; + title = jsonRes['title']; + genreIds = jsonRes['genre_ids'] == null ? null : []; + episodeCount = jsonRes['episode_count']; + name = jsonRes['name']; + originalName = jsonRes['original_name']; + firstAirDate = jsonRes['first_air_date']; + + for (var genre_idsItem in genreIds == null ? [] : jsonRes['genre_ids']) { + genreIds.add(genre_idsItem); + } + } + + @override + String toString() { + return '{"id": $id,"first_air_date": $firstAirDate,"original_name": $originalName,"name": $name,"episode_count": $episodeCount,"vote_average": $voteAverage,"vote_count": $voteCount,"popularity": $popularity,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"credit_id": ${creditId != null ? '${json.encode(creditId)}' : 'null'},"department": ${department != null ? '${json.encode(department)}' : 'null'},"job": ${job != null ? '${json.encode(job)}' : 'null'},"media_type": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"original_language": ${originalLanguage != null ? '${json.encode(originalLanguage)}' : 'null'},"original_title": ${originalTitle != null ? '${json.encode(originalTitle)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"release_date": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'},"title": ${title != null ? '${json.encode(title)}' : 'null'},"genre_ids": $genreIds}'; + } +} diff --git a/lib/models/country_phone_code.dart b/lib/models/country_phone_code.dart new file mode 100644 index 00000000..f7f3af65 --- /dev/null +++ b/lib/models/country_phone_code.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class CountryPhoneCode { + String name, code, dialCode, flag; + + CountryPhoneCode({this.name, this.code, this.dialCode, this.flag}); + + factory CountryPhoneCode.fromJson(Map json) => + CountryPhoneCode( + name: json["name"], + code: json["code"], + dialCode: json["dial_code"], + flag: json["flag"]); + + @override + String toString() { + return '{name: $name, code: $code, dialCode: $dialCode}'; + } + + static Future getCountryJson(BuildContext context) async { + final _jsonStr = await DefaultAssetBundle.of(context) + .loadString("lib/models/country_phone_codes.json"); + return _jsonStr; + } +} diff --git a/lib/models/country_phone_codes.json b/lib/models/country_phone_codes.json new file mode 100644 index 00000000..935df145 --- /dev/null +++ b/lib/models/country_phone_codes.json @@ -0,0 +1,1478 @@ +[ + { + "name": "Afghanistan", + "flag": "🇦🇫", + "code": "AF", + "dial_code": "+93" + }, + { + "name": "Åland Islands", + "flag": "🇦🇽", + "code": "AX", + "dial_code": "+358" + }, + { + "name": "Albania", + "flag": "🇦🇱", + "code": "AL", + "dial_code": "+355" + }, + { + "name": "Algeria", + "flag": "🇩🇿", + "code": "DZ", + "dial_code": "+213" + }, + { + "name": "American Samoa", + "flag": "🇦🇸", + "code": "AS", + "dial_code": "+1684" + }, + { + "name": "Andorra", + "flag": "🇦🇩", + "code": "AD", + "dial_code": "+376" + }, + { + "name": "Angola", + "flag": "🇦🇴", + "code": "AO", + "dial_code": "+244" + }, + { + "name": "Anguilla", + "flag": "🇦🇮", + "code": "AI", + "dial_code": "+1264" + }, + { + "name": "Antarctica", + "flag": "🇦🇶", + "code": "AQ", + "dial_code": "+672" + }, + { + "name": "Antigua and Barbuda", + "flag": "🇦🇬", + "code": "AG", + "dial_code": "+1268" + }, + { + "name": "Argentina", + "flag": "🇦🇷", + "code": "AR", + "dial_code": "+54" + }, + { + "name": "Armenia", + "flag": "🇦🇲", + "code": "AM", + "dial_code": "+374" + }, + { + "name": "Aruba", + "flag": "🇦🇼", + "code": "AW", + "dial_code": "+297" + }, + { + "name": "Australia", + "flag": "🇦🇺", + "code": "AU", + "dial_code": "+61" + }, + { + "name": "Austria", + "flag": "🇦🇹", + "code": "AT", + "dial_code": "+43" + }, + { + "name": "Azerbaijan", + "flag": "🇦🇿", + "code": "AZ", + "dial_code": "+994" + }, + { + "name": "Bahamas", + "flag": "🇧🇸", + "code": "BS", + "dial_code": "+1242" + }, + { + "name": "Bahrain", + "flag": "🇧🇭", + "code": "BH", + "dial_code": "+973" + }, + { + "name": "Bangladesh", + "flag": "🇧🇩", + "code": "BD", + "dial_code": "+880" + }, + { + "name": "Barbados", + "flag": "🇧🇧", + "code": "BB", + "dial_code": "+1246" + }, + { + "name": "Belarus", + "flag": "🇧🇾", + "code": "BY", + "dial_code": "+375" + }, + { + "name": "Belgium", + "flag": "🇧🇪", + "code": "BE", + "dial_code": "+32" + }, + { + "name": "Belize", + "flag": "🇧🇿", + "code": "BZ", + "dial_code": "+501" + }, + { + "name": "Benin", + "flag": "🇧🇯", + "code": "BJ", + "dial_code": "+229" + }, + { + "name": "Bermuda", + "flag": "🇧🇲", + "code": "BM", + "dial_code": "+1441" + }, + { + "name": "Bhutan", + "flag": "🇧🇹", + "code": "BT", + "dial_code": "+975" + }, + { + "name": "Bolivia, Plurinational State of bolivia", + "flag": "🇧🇴", + "code": "BO", + "dial_code": "+591" + }, + { + "name": "Bosnia and Herzegovina", + "flag": "🇧🇦", + "code": "BA", + "dial_code": "+387" + }, + { + "name": "Botswana", + "flag": "🇧🇼", + "code": "BW", + "dial_code": "+267" + }, + { + "name": "Bouvet Island", + "flag": "🇧🇻", + "code": "BV", + "dial_code": "+47" + }, + { + "name": "Brazil", + "flag": "🇧🇷", + "code": "BR", + "dial_code": "+55" + }, + { + "name": "British Indian Ocean Territory", + "flag": "🇮🇴", + "code": "IO", + "dial_code": "+246" + }, + { + "name": "Brunei Darussalam", + "flag": "🇧🇳", + "code": "BN", + "dial_code": "+673" + }, + { + "name": "Bulgaria", + "flag": "🇧🇬", + "code": "BG", + "dial_code": "+359" + }, + { + "name": "Burkina Faso", + "flag": "🇧🇫", + "code": "BF", + "dial_code": "+226" + }, + { + "name": "Burundi", + "flag": "🇧🇮", + "code": "BI", + "dial_code": "+257" + }, + { + "name": "Cambodia", + "flag": "🇰🇭", + "code": "KH", + "dial_code": "+855" + }, + { + "name": "Cameroon", + "flag": "🇨🇲", + "code": "CM", + "dial_code": "+237" + }, + { + "name": "Canada", + "flag": "🇨🇦", + "code": "CA", + "dial_code": "+1" + }, + { + "name": "Cape Verde", + "flag": "🇨🇻", + "code": "CV", + "dial_code": "+238" + }, + { + "name": "Cayman Islands", + "flag": "🇰🇾", + "code": "KY", + "dial_code": "+345" + }, + { + "name": "Central African Republic", + "flag": "🇨🇫", + "code": "CF", + "dial_code": "+236" + }, + { + "name": "Chad", + "flag": "🇹🇩", + "code": "TD", + "dial_code": "+235" + }, + { + "name": "Chile", + "flag": "🇨🇱", + "code": "CL", + "dial_code": "+56" + }, + { + "name": "China", + "flag": "🇨🇳", + "code": "CN", + "dial_code": "+86" + }, + { + "name": "Christmas Island", + "flag": "🇨🇽", + "code": "CX", + "dial_code": "+61" + }, + { + "name": "Cocos (Keeling) Islands", + "flag": "🇨🇨", + "code": "CC", + "dial_code": "+61" + }, + { + "name": "Colombia", + "flag": "🇨🇴", + "code": "CO", + "dial_code": "+57" + }, + { + "name": "Comoros", + "flag": "🇰🇲", + "code": "KM", + "dial_code": "+269" + }, + { + "name": "Congo", + "flag": "🇨🇬", + "code": "CG", + "dial_code": "+242" + }, + { + "name": "Congo, The Democratic Republic of the Congo", + "flag": "🇨🇩", + "code": "CD", + "dial_code": "+243" + }, + { + "name": "Cook Islands", + "flag": "🇨🇰", + "code": "CK", + "dial_code": "+682" + }, + { + "name": "Costa Rica", + "flag": "🇨🇷", + "code": "CR", + "dial_code": "+506" + }, + { + "name": "Cote d'Ivoire", + "flag": "🇨🇮", + "code": "CI", + "dial_code": "+225" + }, + { + "name": "Croatia", + "flag": "🇭🇷", + "code": "HR", + "dial_code": "+385" + }, + { + "name": "Cuba", + "flag": "🇨🇺", + "code": "CU", + "dial_code": "+53" + }, + { + "name": "Cyprus", + "flag": "🇨🇾", + "code": "CY", + "dial_code": "+357" + }, + { + "name": "Czech Republic", + "flag": "🇨🇿", + "code": "CZ", + "dial_code": "+420" + }, + { + "name": "Denmark", + "flag": "🇩🇰", + "code": "DK", + "dial_code": "+45" + }, + { + "name": "Djibouti", + "flag": "🇩🇯", + "code": "DJ", + "dial_code": "+253" + }, + { + "name": "Dominica", + "flag": "🇩🇲", + "code": "DM", + "dial_code": "+1767" + }, + { + "name": "Dominican Republic", + "flag": "🇩🇴", + "code": "DO", + "dial_code": "+1849" + }, + { + "name": "Ecuador", + "flag": "🇪🇨", + "code": "EC", + "dial_code": "+593" + }, + { + "name": "Egypt", + "flag": "🇪🇬", + "code": "EG", + "dial_code": "+20" + }, + { + "name": "El Salvador", + "flag": "🇸🇻", + "code": "SV", + "dial_code": "+503" + }, + { + "name": "Equatorial Guinea", + "flag": "🇬🇶", + "code": "GQ", + "dial_code": "+240" + }, + { + "name": "Eritrea", + "flag": "🇪🇷", + "code": "ER", + "dial_code": "+291" + }, + { + "name": "Estonia", + "flag": "🇪🇪", + "code": "EE", + "dial_code": "+372" + }, + { + "name": "Ethiopia", + "flag": "🇪🇹", + "code": "ET", + "dial_code": "+251" + }, + { + "name": "Falkland Islands (Malvinas)", + "flag": "🇫🇰", + "code": "FK", + "dial_code": "+500" + }, + { + "name": "Faroe Islands", + "flag": "🇫🇴", + "code": "FO", + "dial_code": "+298" + }, + { + "name": "Fiji", + "flag": "🇫🇯", + "code": "FJ", + "dial_code": "+679" + }, + { + "name": "Finland", + "flag": "🇫🇮", + "code": "FI", + "dial_code": "+358" + }, + { + "name": "France", + "flag": "🇫🇷", + "code": "FR", + "dial_code": "+33" + }, + { + "name": "French Guiana", + "flag": "🇬🇫", + "code": "GF", + "dial_code": "+594" + }, + { + "name": "French Polynesia", + "flag": "🇵🇫", + "code": "PF", + "dial_code": "+689" + }, + { + "name": "French Southern Territories", + "flag": "🇹🇫", + "code": "TF", + "dial_code": "+262" + }, + { + "name": "Gabon", + "flag": "🇬🇦", + "code": "GA", + "dial_code": "+241" + }, + { + "name": "Gambia", + "flag": "🇬🇲", + "code": "GM", + "dial_code": "+220" + }, + { + "name": "Georgia", + "flag": "🇬🇪", + "code": "GE", + "dial_code": "+995" + }, + { + "name": "Germany", + "flag": "🇩🇪", + "code": "DE", + "dial_code": "+49" + }, + { + "name": "Ghana", + "flag": "🇬🇭", + "code": "GH", + "dial_code": "+233" + }, + { + "name": "Gibraltar", + "flag": "🇬🇮", + "code": "GI", + "dial_code": "+350" + }, + { + "name": "Greece", + "flag": "🇬🇷", + "code": "GR", + "dial_code": "+30" + }, + { + "name": "Greenland", + "flag": "🇬🇱", + "code": "GL", + "dial_code": "+299" + }, + { + "name": "Grenada", + "flag": "🇬🇩", + "code": "GD", + "dial_code": "+1473" + }, + { + "name": "Guadeloupe", + "flag": "🇬🇵", + "code": "GP", + "dial_code": "+590" + }, + { + "name": "Guam", + "flag": "🇬🇺", + "code": "GU", + "dial_code": "+1671" + }, + { + "name": "Guatemala", + "flag": "🇬🇹", + "code": "GT", + "dial_code": "+502" + }, + { + "name": "Guernsey", + "flag": "🇬🇬", + "code": "GG", + "dial_code": "+44" + }, + { + "name": "Guinea", + "flag": "🇬🇳", + "code": "GN", + "dial_code": "+224" + }, + { + "name": "Guinea-Bissau", + "flag": "🇬🇼", + "code": "GW", + "dial_code": "+245" + }, + { + "name": "Guyana", + "flag": "🇬🇾", + "code": "GY", + "dial_code": "+592" + }, + { + "name": "Haiti", + "flag": "🇭🇹", + "code": "HT", + "dial_code": "+509" + }, + { + "name": "Heard Island and Mcdonald Islands", + "flag": "🇭🇲", + "code": "HM", + "dial_code": "+672" + }, + { + "name": "Holy See (Vatican City State)", + "flag": "🇻🇦", + "code": "VA", + "dial_code": "+379" + }, + { + "name": "Honduras", + "flag": "🇭🇳", + "code": "HN", + "dial_code": "+504" + }, + { + "name": "Hong Kong", + "flag": "🇭🇰", + "code": "HK", + "dial_code": "+852" + }, + { + "name": "Hungary", + "flag": "🇭🇺", + "code": "HU", + "dial_code": "+36" + }, + { + "name": "Iceland", + "flag": "🇮🇸", + "code": "IS", + "dial_code": "+354" + }, + { + "name": "India", + "flag": "🇮🇳", + "code": "IN", + "dial_code": "+91" + }, + { + "name": "Indonesia", + "flag": "🇮🇩", + "code": "ID", + "dial_code": "+62" + }, + { + "name": "Iran, Islamic Republic of Persian Gulf", + "flag": "🇮🇷", + "code": "IR", + "dial_code": "+98" + }, + { + "name": "Iraq", + "flag": "🇮🇶", + "code": "IQ", + "dial_code": "+964" + }, + { + "name": "Ireland", + "flag": "🇮🇪", + "code": "IE", + "dial_code": "+353" + }, + { + "name": "Isle of Man", + "flag": "🇮🇲", + "code": "IM", + "dial_code": "+44" + }, + { + "name": "Israel", + "flag": "🇮🇱", + "code": "IL", + "dial_code": "+972" + }, + { + "name": "Italy", + "flag": "🇮🇹", + "code": "IT", + "dial_code": "+39" + }, + { + "name": "Jamaica", + "flag": "🇯🇲", + "code": "JM", + "dial_code": "+1876" + }, + { + "name": "Japan", + "flag": "🇯🇵", + "code": "JP", + "dial_code": "+81" + }, + { + "name": "Jersey", + "flag": "🇯🇪", + "code": "JE", + "dial_code": "+44" + }, + { + "name": "Jordan", + "flag": "🇯🇴", + "code": "JO", + "dial_code": "+962" + }, + { + "name": "Kazakhstan", + "flag": "🇰🇿", + "code": "KZ", + "dial_code": "+7" + }, + { + "name": "Kenya", + "flag": "🇰🇪", + "code": "KE", + "dial_code": "+254" + }, + { + "name": "Kiribati", + "flag": "🇰🇮", + "code": "KI", + "dial_code": "+686" + }, + { + "name": "Korea, Democratic People's Republic of Korea", + "flag": "🇰🇵", + "code": "KP", + "dial_code": "+850" + }, + { + "name": "Korea, Republic of South Korea", + "flag": "🇰🇷", + "code": "KR", + "dial_code": "+82" + }, + { + "name": "Kosovo", + "flag": "🇽🇰", + "code": "XK", + "dial_code": "+383" + }, + { + "name": "Kuwait", + "flag": "🇰🇼", + "code": "KW", + "dial_code": "+965" + }, + { + "name": "Kyrgyzstan", + "flag": "🇰🇬", + "code": "KG", + "dial_code": "+996" + }, + { + "name": "Laos", + "flag": "🇱🇦", + "code": "LA", + "dial_code": "+856" + }, + { + "name": "Latvia", + "flag": "🇱🇻", + "code": "LV", + "dial_code": "+371" + }, + { + "name": "Lebanon", + "flag": "🇱🇧", + "code": "LB", + "dial_code": "+961" + }, + { + "name": "Lesotho", + "flag": "🇱🇸", + "code": "LS", + "dial_code": "+266" + }, + { + "name": "Liberia", + "flag": "🇱🇷", + "code": "LR", + "dial_code": "+231" + }, + { + "name": "Libyan Arab Jamahiriya", + "flag": "🇱🇾", + "code": "LY", + "dial_code": "+218" + }, + { + "name": "Liechtenstein", + "flag": "🇱🇮", + "code": "LI", + "dial_code": "+423" + }, + { + "name": "Lithuania", + "flag": "🇱🇹", + "code": "LT", + "dial_code": "+370" + }, + { + "name": "Luxembourg", + "flag": "🇱🇺", + "code": "LU", + "dial_code": "+352" + }, + { + "name": "Macao", + "flag": "🇲🇴", + "code": "MO", + "dial_code": "+853" + }, + { + "name": "Macedonia", + "flag": "🇲🇰", + "code": "MK", + "dial_code": "+389" + }, + { + "name": "Madagascar", + "flag": "🇲🇬", + "code": "MG", + "dial_code": "+261" + }, + { + "name": "Malawi", + "flag": "🇲🇼", + "code": "MW", + "dial_code": "+265" + }, + { + "name": "Malaysia", + "flag": "🇲🇾", + "code": "MY", + "dial_code": "+60" + }, + { + "name": "Maldives", + "flag": "🇲🇻", + "code": "MV", + "dial_code": "+960" + }, + { + "name": "Mali", + "flag": "🇲🇱", + "code": "ML", + "dial_code": "+223" + }, + { + "name": "Malta", + "flag": "🇲🇹", + "code": "MT", + "dial_code": "+356" + }, + { + "name": "Marshall Islands", + "flag": "🇲🇭", + "code": "MH", + "dial_code": "+692" + }, + { + "name": "Martinique", + "flag": "🇲🇶", + "code": "MQ", + "dial_code": "+596" + }, + { + "name": "Mauritania", + "flag": "🇲🇷", + "code": "MR", + "dial_code": "+222" + }, + { + "name": "Mauritius", + "flag": "🇲🇺", + "code": "MU", + "dial_code": "+230" + }, + { + "name": "Mayotte", + "flag": "🇾🇹", + "code": "YT", + "dial_code": "+262" + }, + { + "name": "Mexico", + "flag": "🇲🇽", + "code": "MX", + "dial_code": "+52" + }, + { + "name": "Micronesia, Federated States of Micronesia", + "flag": "🇫🇲", + "code": "FM", + "dial_code": "+691" + }, + { + "name": "Moldova", + "flag": "🇲🇩", + "code": "MD", + "dial_code": "+373" + }, + { + "name": "Monaco", + "flag": "🇲🇨", + "code": "MC", + "dial_code": "+377" + }, + { + "name": "Mongolia", + "flag": "🇲🇳", + "code": "MN", + "dial_code": "+976" + }, + { + "name": "Montenegro", + "flag": "🇲🇪", + "code": "ME", + "dial_code": "+382" + }, + { + "name": "Montserrat", + "flag": "🇲🇸", + "code": "MS", + "dial_code": "+1664" + }, + { + "name": "Morocco", + "flag": "🇲🇦", + "code": "MA", + "dial_code": "+212" + }, + { + "name": "Mozambique", + "flag": "🇲🇿", + "code": "MZ", + "dial_code": "+258" + }, + { + "name": "Myanmar", + "flag": "🇲🇲", + "code": "MM", + "dial_code": "+95" + }, + { + "name": "Namibia", + "flag": "🇳🇦", + "code": "NA", + "dial_code": "+264" + }, + { + "name": "Nauru", + "flag": "🇳🇷", + "code": "NR", + "dial_code": "+674" + }, + { + "name": "Nepal", + "flag": "🇳🇵", + "code": "NP", + "dial_code": "+977" + }, + { + "name": "Netherlands", + "flag": "🇳🇱", + "code": "NL", + "dial_code": "+31" + }, + { + "name": "Netherlands Antilles", + "flag": "", + "code": "AN", + "dial_code": "+599" + }, + { + "name": "New Caledonia", + "flag": "🇳🇨", + "code": "NC", + "dial_code": "+687" + }, + { + "name": "New Zealand", + "flag": "🇳🇿", + "code": "NZ", + "dial_code": "+64" + }, + { + "name": "Nicaragua", + "flag": "🇳🇮", + "code": "NI", + "dial_code": "+505" + }, + { + "name": "Niger", + "flag": "🇳🇪", + "code": "NE", + "dial_code": "+227" + }, + { + "name": "Nigeria", + "flag": "🇳🇬", + "code": "NG", + "dial_code": "+234" + }, + { + "name": "Niue", + "flag": "🇳🇺", + "code": "NU", + "dial_code": "+683" + }, + { + "name": "Norfolk Island", + "flag": "🇳🇫", + "code": "NF", + "dial_code": "+672" + }, + { + "name": "Northern Mariana Islands", + "flag": "🇲🇵", + "code": "MP", + "dial_code": "+1670" + }, + { + "name": "Norway", + "flag": "🇳🇴", + "code": "NO", + "dial_code": "+47" + }, + { + "name": "Oman", + "flag": "🇴🇲", + "code": "OM", + "dial_code": "+968" + }, + { + "name": "Pakistan", + "flag": "🇵🇰", + "code": "PK", + "dial_code": "+92" + }, + { + "name": "Palau", + "flag": "🇵🇼", + "code": "PW", + "dial_code": "+680" + }, + { + "name": "Palestinian Territory, Occupied", + "flag": "🇵🇸", + "code": "PS", + "dial_code": "+970" + }, + { + "name": "Panama", + "flag": "🇵🇦", + "code": "PA", + "dial_code": "+507" + }, + { + "name": "Papua New Guinea", + "flag": "🇵🇬", + "code": "PG", + "dial_code": "+675" + }, + { + "name": "Paraguay", + "flag": "🇵🇾", + "code": "PY", + "dial_code": "+595" + }, + { + "name": "Peru", + "flag": "🇵🇪", + "code": "PE", + "dial_code": "+51" + }, + { + "name": "Philippines", + "flag": "🇵🇭", + "code": "PH", + "dial_code": "+63" + }, + { + "name": "Pitcairn", + "flag": "🇵🇳", + "code": "PN", + "dial_code": "+64" + }, + { + "name": "Poland", + "flag": "🇵🇱", + "code": "PL", + "dial_code": "+48" + }, + { + "name": "Portugal", + "flag": "🇵🇹", + "code": "PT", + "dial_code": "+351" + }, + { + "name": "Puerto Rico", + "flag": "🇵🇷", + "code": "PR", + "dial_code": "+1939" + }, + { + "name": "Qatar", + "flag": "🇶🇦", + "code": "QA", + "dial_code": "+974" + }, + { + "name": "Romania", + "flag": "🇷🇴", + "code": "RO", + "dial_code": "+40" + }, + { + "name": "Russia", + "flag": "🇷🇺", + "code": "RU", + "dial_code": "+7" + }, + { + "name": "Rwanda", + "flag": "🇷🇼", + "code": "RW", + "dial_code": "+250" + }, + { + "name": "Reunion", + "flag": "🇷🇪", + "code": "RE", + "dial_code": "+262" + }, + { + "name": "Saint Barthelemy", + "flag": "🇧🇱", + "code": "BL", + "dial_code": "+590" + }, + { + "name": "Saint Helena, Ascension and Tristan Da Cunha", + "flag": "🇸🇭", + "code": "SH", + "dial_code": "+290" + }, + { + "name": "Saint Kitts and Nevis", + "flag": "🇰🇳", + "code": "KN", + "dial_code": "+1869" + }, + { + "name": "Saint Lucia", + "flag": "🇱🇨", + "code": "LC", + "dial_code": "+1758" + }, + { + "name": "Saint Martin", + "flag": "🇲🇫", + "code": "MF", + "dial_code": "+590" + }, + { + "name": "Saint Pierre and Miquelon", + "flag": "🇵🇲", + "code": "PM", + "dial_code": "+508" + }, + { + "name": "Saint Vincent and the Grenadines", + "flag": "🇻🇨", + "code": "VC", + "dial_code": "+1784" + }, + { + "name": "Samoa", + "flag": "🇼🇸", + "code": "WS", + "dial_code": "+685" + }, + { + "name": "San Marino", + "flag": "🇸🇲", + "code": "SM", + "dial_code": "+378" + }, + { + "name": "Sao Tome and Principe", + "flag": "🇸🇹", + "code": "ST", + "dial_code": "+239" + }, + { + "name": "Saudi Arabia", + "flag": "🇸🇦", + "code": "SA", + "dial_code": "+966" + }, + { + "name": "Senegal", + "flag": "🇸🇳", + "code": "SN", + "dial_code": "+221" + }, + { + "name": "Serbia", + "flag": "🇷🇸", + "code": "RS", + "dial_code": "+381" + }, + { + "name": "Seychelles", + "flag": "🇸🇨", + "code": "SC", + "dial_code": "+248" + }, + { + "name": "Sierra Leone", + "flag": "🇸🇱", + "code": "SL", + "dial_code": "+232" + }, + { + "name": "Singapore", + "flag": "🇸🇬", + "code": "SG", + "dial_code": "+65" + }, + { + "name": "Slovakia", + "flag": "🇸🇰", + "code": "SK", + "dial_code": "+421" + }, + { + "name": "Slovenia", + "flag": "🇸🇮", + "code": "SI", + "dial_code": "+386" + }, + { + "name": "Solomon Islands", + "flag": "🇸🇧", + "code": "SB", + "dial_code": "+677" + }, + { + "name": "Somalia", + "flag": "🇸🇴", + "code": "SO", + "dial_code": "+252" + }, + { + "name": "South Africa", + "flag": "🇿🇦", + "code": "ZA", + "dial_code": "+27" + }, + { + "name": "South Sudan", + "flag": "🇸🇸", + "code": "SS", + "dial_code": "+211" + }, + { + "name": "South Georgia and the South Sandwich Islands", + "flag": "🇬🇸", + "code": "GS", + "dial_code": "+500" + }, + { + "name": "Spain", + "flag": "🇪🇸", + "code": "ES", + "dial_code": "+34" + }, + { + "name": "Sri Lanka", + "flag": "🇱🇰", + "code": "LK", + "dial_code": "+94" + }, + { + "name": "Sudan", + "flag": "🇸🇩", + "code": "SD", + "dial_code": "+249" + }, + { + "name": "Suriname", + "flag": "🇸🇷", + "code": "SR", + "dial_code": "+597" + }, + { + "name": "Svalbard and Jan Mayen", + "flag": "🇸🇯", + "code": "SJ", + "dial_code": "+47" + }, + { + "name": "Swaziland", + "flag": "🇸🇿", + "code": "SZ", + "dial_code": "+268" + }, + { + "name": "Sweden", + "flag": "🇸🇪", + "code": "SE", + "dial_code": "+46" + }, + { + "name": "Switzerland", + "flag": "🇨🇭", + "code": "CH", + "dial_code": "+41" + }, + { + "name": "Syrian Arab Republic", + "flag": "🇸🇾", + "code": "SY", + "dial_code": "+963" + }, + { + "name": "Taiwan", + "flag": "🇹🇼", + "code": "TW", + "dial_code": "+886" + }, + { + "name": "Tajikistan", + "flag": "🇹🇯", + "code": "TJ", + "dial_code": "+992" + }, + { + "name": "Tanzania, United Republic of Tanzania", + "flag": "🇹🇿", + "code": "TZ", + "dial_code": "+255" + }, + { + "name": "Thailand", + "flag": "🇹🇭", + "code": "TH", + "dial_code": "+66" + }, + { + "name": "Timor-Leste", + "flag": "🇹🇱", + "code": "TL", + "dial_code": "+670" + }, + { + "name": "Togo", + "flag": "🇹🇬", + "code": "TG", + "dial_code": "+228" + }, + { + "name": "Tokelau", + "flag": "🇹🇰", + "code": "TK", + "dial_code": "+690" + }, + { + "name": "Tonga", + "flag": "🇹🇴", + "code": "TO", + "dial_code": "+676" + }, + { + "name": "Trinidad and Tobago", + "flag": "🇹🇹", + "code": "TT", + "dial_code": "+1868" + }, + { + "name": "Tunisia", + "flag": "🇹🇳", + "code": "TN", + "dial_code": "+216" + }, + { + "name": "Turkey", + "flag": "🇹🇷", + "code": "TR", + "dial_code": "+90" + }, + { + "name": "Turkmenistan", + "flag": "🇹🇲", + "code": "TM", + "dial_code": "+993" + }, + { + "name": "Turks and Caicos Islands", + "flag": "🇹🇨", + "code": "TC", + "dial_code": "+1649" + }, + { + "name": "Tuvalu", + "flag": "🇹🇻", + "code": "TV", + "dial_code": "+688" + }, + { + "name": "Uganda", + "flag": "🇺🇬", + "code": "UG", + "dial_code": "+256" + }, + { + "name": "Ukraine", + "flag": "🇺🇦", + "code": "UA", + "dial_code": "+380" + }, + { + "name": "United Arab Emirates", + "flag": "🇦🇪", + "code": "AE", + "dial_code": "+971" + }, + { + "name": "United Kingdom", + "flag": "🇬🇧", + "code": "GB", + "dial_code": "+44" + }, + { + "name": "United States", + "flag": "🇺🇸", + "code": "US", + "dial_code": "+1" + }, + { + "name": "Uruguay", + "flag": "🇺🇾", + "code": "UY", + "dial_code": "+598" + }, + { + "name": "Uzbekistan", + "flag": "🇺🇿", + "code": "UZ", + "dial_code": "+998" + }, + { + "name": "Vanuatu", + "flag": "🇻🇺", + "code": "VU", + "dial_code": "+678" + }, + { + "name": "Venezuela, Bolivarian Republic of Venezuela", + "flag": "🇻🇪", + "code": "VE", + "dial_code": "+58" + }, + { + "name": "Vietnam", + "flag": "🇻🇳", + "code": "VN", + "dial_code": "+84" + }, + { + "name": "Virgin Islands, British", + "flag": "🇻🇬", + "code": "VG", + "dial_code": "+1284" + }, + { + "name": "Virgin Islands, U.S.", + "flag": "🇻🇮", + "code": "VI", + "dial_code": "+1340" + }, + { + "name": "Wallis and Futuna", + "flag": "🇼🇫", + "code": "WF", + "dial_code": "+681" + }, + { + "name": "Yemen", + "flag": "🇾🇪", + "code": "YE", + "dial_code": "+967" + }, + { + "name": "Zambia", + "flag": "🇿🇲", + "code": "ZM", + "dial_code": "+260" + }, + { + "name": "Zimbabwe", + "flag": "🇿🇼", + "code": "ZW", + "dial_code": "+263" + } +] \ No newline at end of file diff --git a/lib/models/credits_model.dart b/lib/models/credits_model.dart new file mode 100644 index 00000000..24b48b00 --- /dev/null +++ b/lib/models/credits_model.dart @@ -0,0 +1,121 @@ +import 'dart:convert' show json; + +class CreditsModel { + + int id; + List cast; + List crew; + List guestStars; + + CreditsModel.fromParams({this.id, this.cast, this.crew}); + + factory CreditsModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new CreditsModel.fromJson(json.decode(jsonStr)) : new CreditsModel.fromJson(jsonStr); + + CreditsModel.fromJson(jsonRes) { + id = jsonRes['id']; + cast = jsonRes['cast'] == null ? null : []; + + for (var castItem in cast == null ? [] : jsonRes['cast']){ + cast.add(castItem == null ? null : new CastData.fromJson(castItem)); + } + + crew = jsonRes['crew'] == null ? null : []; + + for (var crewItem in crew == null ? [] : jsonRes['crew']){ + crew.add(crewItem == null ? null : new CrewData.fromJson(crewItem)); + } + guestStars = jsonRes['guest_stars'] == null ? null : []; + + for (var guest_starsItem in guestStars == null ? [] : jsonRes['guest_stars']){ + guestStars.add(guest_starsItem == null ? null : new CastData.fromJson(guest_starsItem)); + } + } + + @override + String toString() { + return '{"id": $id,"cast": $cast,"crew": $crew,"guest_stars": $guestStars}'; + } +} + +class CrewData { + + int gender; + int id; + String creditId; + String department; + String job; + String name; + String profilePath; + + CrewData.fromParams({this.gender, this.id, this.creditId, this.department, this.job, this.name, this.profilePath}); + + CrewData.fromJson(jsonRes) { + gender = jsonRes['gender']; + id = jsonRes['id']; + creditId = jsonRes['credit_id']; + department = jsonRes['department']; + job = jsonRes['job']; + name = jsonRes['name']; + profilePath = jsonRes['profile_path']; + } + + @override + String toString() { + return '{"gender": $gender,"id": $id,"credit_id": ${creditId != null?'${json.encode(creditId)}':'null'},"department": ${department != null?'${json.encode(department)}':'null'},"job": ${job != null?'${json.encode(job)}':'null'},"name": ${name != null?'${json.encode(name)}':'null'},"profile_path": ${profilePath != null?'${json.encode(profilePath)}':'null'}}'; + } +} + +class CastData { + + int id; + int voteCount; + double popularity; + double voteAverage; + bool adult; + bool video; + String profilePath; + String backdropPath; + String character; + String creditId; + String originalLanguage; + String originalTitle; + String overview; + String posterPath; + String releaseDate; + String title; + String name; + List genreIds; + + CastData.fromParams({this.id, this.voteCount, this.name,this.profilePath,this.popularity, this.voteAverage, this.adult, this.video, this.backdropPath, this.character, this.creditId, this.originalLanguage, this.originalTitle, this.overview, this.posterPath, this.releaseDate, this.title, this.genreIds}); + + CastData.fromJson(jsonRes) { + id = jsonRes['id']; + voteCount = jsonRes['vote_count']; + popularity = double.parse(jsonRes['popularity']?.toString()??'0'); + voteAverage =double.parse(jsonRes['vote_average']?.toString()??'0') ; + adult = jsonRes['adult']; + video = jsonRes['video']; + name = jsonRes['name']; + backdropPath = jsonRes['backdrop_path']; + character = jsonRes['character']; + creditId = jsonRes['credit_id']; + originalLanguage = jsonRes['original_language']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + releaseDate = jsonRes['release_date']; + title = jsonRes['title']; + profilePath=jsonRes['profile_path']; + genreIds = jsonRes['genre_ids'] == null ? null : []; + + for (var genre_idsItem in genreIds == null ? [] : jsonRes['genre_ids']){ + genreIds.add(genre_idsItem); + } + } + + @override + String toString() { + return '{"id": $id,"vote_count": $voteCount,"profile_path":$profilePath,"name":$name,"popularity": $popularity,"vote_average": $voteAverage,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null?'${json.encode(backdropPath)}':'null'},"character": ${character != null?'${json.encode(character)}':'null'},"credit_id": ${creditId != null?'${json.encode(creditId)}':'null'},"original_language": ${originalLanguage != null?'${json.encode(originalLanguage)}':'null'},"original_title": ${originalTitle != null?'${json.encode(originalTitle)}':'null'},"overview": ${overview != null?'${json.encode(overview)}':'null'},"poster_path": ${posterPath != null?'${json.encode(posterPath)}':'null'},"release_date": ${releaseDate != null?'${json.encode(releaseDate)}':'null'},"title": ${title != null?'${json.encode(title)}':'null'},"genre_ids": $genreIds}'; + } +} + diff --git a/lib/models/discover_sort_type.dart b/lib/models/discover_sort_type.dart new file mode 100644 index 00000000..2e9649ad --- /dev/null +++ b/lib/models/discover_sort_type.dart @@ -0,0 +1,16 @@ +class DiscoverSortType { + static const popularityAsc = "popularity.asc"; + static const popularityDesc = "popularity.desc"; + static const releaseDateAsc = "release_date.asc"; + static const releaseDateDesc = "release_date.desc"; + static const revenuneAsc = "revenune.asc"; + static const revenuneDesc = "revenune.desc"; + static const primaryReleaseDateAsc = "primary_release_date.asc"; + static const primaryReleaseDateDesc = "primary_release_date.desc"; + static const originalTitleAsc = "original_title.asc"; + static const originalTitleDesc = "original_title.desc"; + static const voteAverageAsc = "vote_average.asc"; + static const voteAverageDesc = "vote_average.desc"; + static const voteCountAsc = "vote_count.asc"; + static const voteCountDesc = "vote_count.desc"; +} diff --git a/lib/models/download_queue.dart b/lib/models/download_queue.dart new file mode 100644 index 00000000..59cbde03 --- /dev/null +++ b/lib/models/download_queue.dart @@ -0,0 +1,24 @@ +import 'package:flutter_downloader/flutter_downloader.dart'; + +class DownloadQueue { + final String taskId; + DownloadTaskStatus status; + int progress; + final String url; + final String filename; + final String savedDir; + final int timeCreated; + + DownloadQueue( + {this.taskId, + this.status, + this.progress, + this.url, + this.filename, + this.savedDir, + this.timeCreated}); + + @override + String toString() => + "DownloadQueue(taskId: $taskId, status: $status, progress: $progress, url: $url, filename: $filename, savedDir: $savedDir, timeCreated: $timeCreated)"; +} diff --git a/lib/models/enums/genres.dart b/lib/models/enums/genres.dart new file mode 100644 index 00000000..eeb9f775 --- /dev/null +++ b/lib/models/enums/genres.dart @@ -0,0 +1,414 @@ +class Genres { + Genres._(); + static final Genres instance = Genres._(); + Map getMovieGenresList(String locale) { + switch (locale) { + case 'de': + return deMovieList; + case 'es': + return esMovieList; + case 'en': + return movieList; + case 'fr': + return frMovieList; + case 'ja': + return jaMovieList; + case 'ru': + return ruMovieList; + case 'zh': + return zhMovieList; + } + return movieList; + } + + Map getTvGenresList(String locale) { + switch (locale) { + case 'de': + return deTvList; + case 'es': + return esTvList; + case 'en': + return tvList; + case 'fr': + return frTvList; + case 'ja': + return jaTvList; + case 'ru': + return ruTvList; + case 'zh': + return zhTvList; + } + return tvList; + } + + final Map movieList = { + 12: "Adventure", + 14: "Fantasy", + 16: "Animation", + 18: "Drama", + 27: "Horror", + 28: "Action", + 35: "Comedy", + 36: "History", + 37: "Western", + 53: "Thriller", + 80: "Crime", + 99: "Documentary", + 878: "Science_Fiction", + 9648: "Mystery", + 10402: "Music", + 10749: "Romance", + 10751: "Family", + 10752: "War", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10766: "Soap", + 10767: "Talk", + 10770: "TV_Movie", + }; + + final Map zhMovieList = { + 12: "冒险", + 14: "奇幻", + 16: "动画", + 18: "剧情", + 27: "恐怖", + 28: "动作", + 35: "喜剧", + 36: "历史", + 37: "西部", + 53: "惊悚", + 80: "犯罪", + 99: "纪录", + 878: "科幻", + 9648: "悬疑", + 10402: "音乐", + 10751: "家庭", + 10752: "战争", + 10762: "儿童", + 10763: "新闻", + 10764: "真人秀", + 10766: "肥皂剧", + 10767: "脱口秀", + 10749: "爱情", + 10770: "电视电影", + }; + + final Map esMovieList = { + 12: "Aventura", + 14: "Fantasía", + 16: "Animación", + 18: "Drama", + 27: "Terror", + 28: "Acción", + 35: "Comedia", + 36: "Historia", + 37: "Western", + 53: "Suspense", + 80: "Crimen", + 99: "Documental", + 878: "Ciencia_ficción", + 9648: "Misterio", + 10402: "Música", + 10751: "Familia", + 10752: "Bélica", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10766: "Soap", + 10767: "Talk", + 10749: "Romance", + 10770: "Película_de_TV", + }; + + final Map deMovieList = { + 12: "Abenteuer", + 14: "Fantasy", + 16: "Animation", + 18: "Drama", + 27: "Horror", + 28: "Action", + 35: "Komödie", + 36: "Historie", + 37: "Western", + 53: "Thriller", + 80: "Krimi", + 99: "Dokumentarfilm", + 878: "Science_Fiction", + 9648: "Mystery", + 10402: "Musik", + 10751: "Familie", + 10752: "Kriegsfilm", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10766: "Soap", + 10767: "Talk", + 10749: "Liebesfilm", + 10770: "TV_Film", + }; + + final Map frMovieList = { + 12: "Aventure", + 14: "Fantastique", + 16: "Animation", + 18: "Drame", + 27: "Horreur", + 28: "Action", + 35: "Comédie", + 36: "Histoire", + 37: "Western", + 53: "Thriller", + 80: "Crime", + 99: "Documentaire", + 878: "Science_Fiction", + 9648: "Mystère", + 10402: "Musique", + 10751: "Familial", + 10752: "Guerre", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10766: "Soap", + 10767: "Talk", + 10749: "Romance", + 10770: "Téléfilm", + }; + + final Map jaMovieList = { + 12: "アドベンチャー", + 14: "ファンタジー", + 16: "アニメーション", + 18: "ドラマ", + 27: "ホラー", + 28: "アクション", + 35: "コメディ", + 36: "履歴", + 37: "西洋", + 53: "スリラー", + 80: "犯罪", + 99: "ドキュメンタリー", + 878: "サイエンスフィクション", + 9648: "謎", + 10402: "音楽", + 10751: "ファミリー", + 10752: "戦争", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10766: "Soap", + 10767: "Talk", + 10749: "ロマンス", + 10770: "テレビ映画", + }; + + final Map ruMovieList = { + 12: "приключения", + 14: "фэнтези", + 16: "мультфильм", + 18: "драма", + 27: "ужасы", + 28: "боевик", + 35: "комедия", + 36: "история", + 37: "вестерн", + 53: "триллер", + 80: "криминал", + 99: "документальный", + 878: "фантастика", + 9648: "детектив", + 10402: "музыка", + 10751: "семейный", + 10752: "военный", + 10762: "Детский", + 10763: "Новости", + 10764: "Реалити_шоу", + 10766: "Мыльная_опера", + 10767: "Ток_шоу", + 10749: "мелодрама", + 10770: "телевизионный_фильм", + }; + + final Map tvList = { + 14: "Fantasy", + 16: "Animation", + 18: "Drama", + 27: "Horror", + 28: "Action", + 35: "Comedy", + 36: "History", + 37: "Western", + 53: "Thriller", + 80: "Crime", + 99: "Documentary", + 878: "Science_Fiction", + 9648: "Mystery", + 10402: "Music", + 10751: "Family", + 10759: "Action_Adventure", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10765: "Sci-Fi_Fantasy", + 10766: "Soap", + 10767: "Talk", + 10768: "War_Politics", + }; + + final Map zhTvList = { + 14: "奇幻", + 16: "动画", + 18: "剧情", + 27: "恐怖", + 28: "动作", + 35: "喜剧", + 36: "历史", + 37: "西部", + 53: "惊悚", + 80: "犯罪", + 99: "纪录", + 878: "科幻", + 9648: "悬疑", + 10402: "音乐", + 10751: "家庭", + 10759: "动作冒险", + 10762: "儿童", + 10763: "新闻", + 10764: "真人秀", + 10765: "Sci-Fi_Fantasy", + 10766: "肥皂剧", + 10767: "脱口秀", + 10768: "War_Politics", + }; + + final Map deTvList = { + 14: "Fantasy", + 16: "Animation", + 18: "Drama", + 27: "Horror", + 28: "Action", + 35: "Komödie", + 36: "Historie", + 37: "Western", + 53: "Thriller", + 80: "Krimi", + 99: "Dokumentarfilm", + 878: "Science_Fiction", + 9648: "Mystery", + 10402: "Musik", + 10751: "Familie", + 10759: "Action_Adventure", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10765: "Sci-Fi_Fantasy", + 10766: "Soap", + 10767: "Talk", + 10768: "War_Politics", + }; + + final Map esTvList = { + 14: "Fantasía", + 16: "Animación", + 18: "Drama", + 27: "Terror", + 28: "Acción", + 35: "Comedia", + 36: "Historia", + 37: "Western", + 53: "Suspense", + 80: "Crimen", + 99: "Documental", + 878: "Ciencia_ficción", + 9648: "Misterio", + 10402: "Música", + 10751: "Familia", + 10759: "Action_Adventure", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10765: "Sci-Fi_Fantasy", + 10766: "Soap", + 10767: "Talk", + 10768: "War_Politics", + }; + + final Map frTvList = { + 14: "Fantastique", + 16: "Animation", + 18: "Drame", + 27: "Horreur", + 28: "Action", + 35: "Comédie", + 36: "Histoire", + 37: "Western", + 53: "Thriller", + 80: "Crime", + 99: "Documentaire", + 878: "Science_Fiction", + 9648: "Mystère", + 10402: "Musique", + 10751: "Familial", + 10759: "Action_Adventure", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10765: "Science-Fiction_Fantastique", + 10766: "Soap", + 10767: "Talk", + 10768: "War_Politics", + }; + + final Map jaTvList = { + 14: "奇幻", + 16: "アニメーション", + 18: "ドラマ", + 27: "恐怖", + 28: "アクション", + 35: "コメディ", + 36: "历史", + 37: "西部", + 53: "惊悚", + 80: "犯罪", + 99: "ドキュメンタリー", + 878: "サイエンスフィクション", + 9648: "謎", + 10402: "音楽", + 10751: "ファミリー", + 10759: "Action_Adventure", + 10762: "Kids", + 10763: "News", + 10764: "Reality", + 10765: "Sci-Fi_Fantasy", + 10766: "Soap", + 10767: "Talk", + 10768: "War_Politics", + }; + + final Map ruTvList = { + 14: "фэнтези", + 16: "мультфильм", + 18: "драма", + 27: "ужасы", + 28: "боевик", + 35: "комедия", + 36: "история", + 37: "вестерн", + 53: "триллер", + 80: "криминал", + 99: "документальный", + 878: "фантастика", + 9648: "детектив", + 10402: "музыка", + 10751: "семейный", + 10759: "Боевик_и_Приключения", + 10762: "Детский", + 10763: "Новости", + 10764: "Реалити_шоу", + 10765: "НФ_и_Фэнтези", + 10766: "Мыльная_опера", + 10767: "Ток_шоу", + 10768: "War_Politics", + }; +} diff --git a/lib/models/enums/imagesize.dart b/lib/models/enums/imagesize.dart new file mode 100644 index 00000000..7f96ed31 --- /dev/null +++ b/lib/models/enums/imagesize.dart @@ -0,0 +1,20 @@ +enum ImageSize{ + original, + w45, + w92, + w154, + w185, + w100, + w200, + w300, + w342, + w400, + w500, + w600, + h632, + w700, + w800, + w900, + w780, + w1280, +} \ No newline at end of file diff --git a/lib/models/enums/list_sort_type.dart b/lib/models/enums/list_sort_type.dart new file mode 100644 index 00000000..2aaf413e --- /dev/null +++ b/lib/models/enums/list_sort_type.dart @@ -0,0 +1,10 @@ +class ListSortType{ + static const originalOrderAsc="original_order.asc"; + static const originalOrderDesc="original_order.desc"; + static const releaseDateAsc="release_date.asc"; + static const releaseDateDesc="release_date.desc"; + static const titleAsc="title.asc"; + static const titleDesc="title.desc"; + static const voteAverageAsc="vote_average.asc"; + static const voteAverageDesc="vote_average.desc"; +} \ No newline at end of file diff --git a/lib/models/enums/media_type.dart b/lib/models/enums/media_type.dart new file mode 100644 index 00000000..6c9d85e0 --- /dev/null +++ b/lib/models/enums/media_type.dart @@ -0,0 +1,6 @@ +enum MediaType { + movie, + tv, + all, + person, +} diff --git a/lib/models/enums/premium_type.dart b/lib/models/enums/premium_type.dart new file mode 100644 index 00000000..4737df59 --- /dev/null +++ b/lib/models/enums/premium_type.dart @@ -0,0 +1,6 @@ +enum PremiumType { + oneMonth, + threeMonths, + sixMonths, + twelveMonths, +} diff --git a/lib/models/enums/releasedatetype.dart b/lib/models/enums/releasedatetype.dart new file mode 100644 index 00000000..5f9e8b7e --- /dev/null +++ b/lib/models/enums/releasedatetype.dart @@ -0,0 +1,10 @@ +class ReleaseDateType { + static Map releaseDateType = { + 1: 'Premiere', + 2: 'Theatrical(limited)', + 3: 'Theatrical', + 4: 'Digital', + 5: 'Physical', + 6: 'TV', + }; +} diff --git a/lib/models/enums/screenshot_type.dart b/lib/models/enums/screenshot_type.dart new file mode 100644 index 00000000..96eb4f0d --- /dev/null +++ b/lib/models/enums/screenshot_type.dart @@ -0,0 +1,4 @@ +enum ScreenShotType{ + download, + share +} \ No newline at end of file diff --git a/lib/models/enums/streamlink_type.dart b/lib/models/enums/streamlink_type.dart new file mode 100644 index 00000000..7e41862a --- /dev/null +++ b/lib/models/enums/streamlink_type.dart @@ -0,0 +1,5 @@ +enum StreamLinkType { + webview, + youtube, + other, +} diff --git a/lib/models/enums/theme_color.dart b/lib/models/enums/theme_color.dart new file mode 100644 index 00000000..e8c789a0 --- /dev/null +++ b/lib/models/enums/theme_color.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class ThemeColor { + static Map color = { + 0: Color(0xFF604BA6), + 1: Color(0xFF504465), + 2: Color(0xFF0F0F1C), + 3: Color(0xFF1F3EBE), + 4: Color(0xFF2C3E50), + 5: Color(0xFF5C3444), + 6: Color(0xFF3A1944), + 7: Color(0xFF004253), + 8: Color(0xFF125892), + 9: Color(0xFF274D39), + 10: Color(0xFFB2506D), + }; +} diff --git a/lib/models/enums/time_window.dart b/lib/models/enums/time_window.dart new file mode 100644 index 00000000..a6cb4a19 --- /dev/null +++ b/lib/models/enums/time_window.dart @@ -0,0 +1 @@ +enum TimeWindow { day, week } diff --git a/lib/models/episode_model.dart b/lib/models/episode_model.dart new file mode 100644 index 00000000..8039ec5a --- /dev/null +++ b/lib/models/episode_model.dart @@ -0,0 +1,111 @@ +import 'dart:convert' show json; + +import 'package:movie/models/credits_model.dart'; +import 'base_api_model/tvshow_stream_link.dart'; +import 'image_model.dart'; +import 'video_model.dart'; + +class Episode { + int episodeNumber; + int id; + int seasonNumber; + double voteAverage; + int voteCount; + String airDate; + String name; + String overview; + String productionCode; + String stillPath; + List crew; + List guestStars; + CreditsModel credits; + EpisodeImageModel images; + VideoModel videos; + TvShowStreamLink streamLink; + bool playState; + Episode.fromParams( + {this.episodeNumber, + this.id, + this.seasonNumber, + this.voteAverage, + this.voteCount, + this.airDate, + this.name, + this.overview, + this.productionCode, + this.stillPath, + this.crew, + this.guestStars, + this.credits, + this.images, + this.videos}); + + factory Episode(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new Episode.fromJson(json.decode(jsonStr)) + : new Episode.fromJson(jsonStr); + + Episode.fromJson(jsonRes) { + episodeNumber = jsonRes['episode_number']; + id = jsonRes['id']; + seasonNumber = jsonRes['season_number']; + voteAverage = double.parse(jsonRes['vote_average'].toString()); + voteCount = jsonRes['vote_count']; + airDate = jsonRes['air_date']; + name = jsonRes['name']; + overview = jsonRes['overview']; + productionCode = jsonRes['production_code']; + stillPath = jsonRes['still_path']; + crew = jsonRes['crew'] == null ? null : []; + guestStars = jsonRes['guest_stars'] == null ? null : []; + + for (var crewItem in crew == null ? [] : jsonRes['crew']) { + crew.add(crewItem == null ? null : new CrewData.fromJson(crewItem)); + } + + guestStars = jsonRes['guest_stars'] == null ? null : []; + + for (var guest_starsItem + in guestStars == null ? [] : jsonRes['guest_stars']) { + guestStars.add(guest_starsItem == null + ? null + : new CastData.fromJson(guest_starsItem)); + } + + credits = jsonRes['credits'] == null + ? null + : new CreditsModel.fromJson(jsonRes['credits']); + images = jsonRes['images'] == null + ? null + : new EpisodeImageModel.fromJson(jsonRes['images']); + videos = jsonRes['videos'] == null + ? null + : new VideoModel.fromJson(jsonRes['videos']); + } + + @override + String toString() { + return '{"episode_number": $episodeNumber,"id": $id,"season_number": $seasonNumber,"vote_average": $voteAverage,"vote_count": $voteCount,"air_date": ${airDate != null ? '${json.encode(airDate)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"production_code": ${productionCode != null ? '${json.encode(productionCode)}' : 'null'},"still_path": ${stillPath != null ? '${json.encode(stillPath)}' : 'null'},"crew": $crew,"guest_stars": $guestStars,"credits": $credits,"images": $images,"videos": $videos}'; + } +} + +class EpisodeImageModel { + List stills; + + EpisodeImageModel.fromParams({this.stills}); + + EpisodeImageModel.fromJson(jsonRes) { + stills = jsonRes['stills'] == null ? null : []; + + for (var stillsItem in stills == null ? [] : jsonRes['stills']) { + stills + .add(stillsItem == null ? null : new ImageData.fromJson(stillsItem)); + } + } + + @override + String toString() { + return '{"stills": $stills}'; + } +} diff --git a/lib/models/external_ids_model.dart b/lib/models/external_ids_model.dart new file mode 100644 index 00000000..01ade604 --- /dev/null +++ b/lib/models/external_ids_model.dart @@ -0,0 +1,36 @@ +import 'dart:convert' show json; + +class ExternalIdsModel { + + int id; + int tvdbId; + int tvrageId; + String facebookId; + String freebaseId; + String freebaseMid; + String imdbId; + String instagramId; + String twitterId; + + ExternalIdsModel.fromParams({this.id, this.tvdbId, this.tvrageId, this.facebookId, this.freebaseId, this.freebaseMid, this.imdbId, this.instagramId, this.twitterId}); + + factory ExternalIdsModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new ExternalIdsModel.fromJson(json.decode(jsonStr)) : new ExternalIdsModel.fromJson(jsonStr); + + ExternalIdsModel.fromJson(jsonRes) { + id = jsonRes['id']; + tvdbId = jsonRes['tvdb_id']; + tvrageId = jsonRes['tvrage_id']; + facebookId = jsonRes['facebook_id']; + freebaseId = jsonRes['freebase_id']; + freebaseMid = jsonRes['freebase_mid']; + imdbId = jsonRes['imdb_id']; + instagramId = jsonRes['instagram_id']; + twitterId = jsonRes['twitter_id']; + } + + @override + String toString() { + return '{"id": $id,"tvdb_id": $tvdbId,"tvrage_id": $tvrageId,"facebook_id": ${facebookId != null?'${json.encode(facebookId)}':'null'},"freebase_id": ${freebaseId != null?'${json.encode(freebaseId)}':'null'},"freebase_mid": ${freebaseMid != null?'${json.encode(freebaseMid)}':'null'},"imdb_id": ${imdbId != null?'${json.encode(imdbId)}':'null'},"instagram_id": ${instagramId != null?'${json.encode(instagramId)}':'null'},"twitter_id": ${twitterId != null?'${json.encode(twitterId)}':'null'}}'; + } +} + diff --git a/lib/models/firebase/firebase_accountstate.dart b/lib/models/firebase/firebase_accountstate.dart new file mode 100644 index 00000000..02504ab8 --- /dev/null +++ b/lib/models/firebase/firebase_accountstate.dart @@ -0,0 +1,26 @@ +class AccountStateModel { + bool favorite; + bool watchlist; + double rated; + bool isRated; + + AccountStateModel.fromParams( + {this.favorite, this.watchlist, this.rated, this.isRated}); + + factory AccountStateModel(Map mapRes) => mapRes == null + ? AccountStateModel.fromParams( + favorite: false, watchlist: false, rated: 0, isRated: false) + : new AccountStateModel.fromMap(mapRes); + + AccountStateModel.fromMap(mapRes) { + favorite = mapRes['favorite'] == null ? false : mapRes['favorite']; + watchlist = mapRes['watchlist'] == null ? false : mapRes['watchlist']; + rated = mapRes['rated'] == null ? 0 : mapRes['rated']; + isRated = mapRes['rated'] == null ? false : true; + } + + @override + String toString() { + return '{"favorite": $favorite,"watchlist": $watchlist,"rated": $rated,"isRated": $isRated}'; + } +} diff --git a/lib/models/firebase/firebase_streamlink.dart b/lib/models/firebase/firebase_streamlink.dart new file mode 100644 index 00000000..9b135c3f --- /dev/null +++ b/lib/models/firebase/firebase_streamlink.dart @@ -0,0 +1,36 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:movie/models/enums/streamlink_type.dart'; + +class StreamLinkModel { + String linkName; + String streamLink; + Timestamp createTime; + StreamLinkType type; + bool selected; + + StreamLinkModel.fromParams( + {this.linkName, + this.streamLink, + this.createTime, + this.selected, + this.type}); + + factory StreamLinkModel(Map mapRes) => mapRes == null + ? StreamLinkModel.fromParams(selected: false) + : new StreamLinkModel.fromMap(mapRes); + + StreamLinkModel.fromMap(mapRes) { + linkName = mapRes['linkName']; + streamLink = mapRes['streamLink']; + createTime = mapRes['createTime']; + type = mapRes['streamLinkType'] == 'YouTube' + ? StreamLinkType.youtube + : StreamLinkType.other; + selected = false; + } + + @override + String toString() { + return '{"linkName": $linkName,"streamLink": $streamLink,"createTime ": $createTime ,"selected ": $selected,"type":$type }'; + } +} diff --git a/lib/models/genre.dart b/lib/models/genre.dart new file mode 100644 index 00000000..aea6ff7f --- /dev/null +++ b/lib/models/genre.dart @@ -0,0 +1,18 @@ +import 'dart:convert' show json; + +class Genre { + int id; + String name; + + Genre.fromParams({this.id, this.name}); + + Genre.fromJson(jsonRes) { + id = jsonRes['id']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"id": $id,"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} diff --git a/lib/models/github_release.dart b/lib/models/github_release.dart new file mode 100644 index 00000000..4d635929 --- /dev/null +++ b/lib/models/github_release.dart @@ -0,0 +1,200 @@ +import 'dart:convert' show json; + +class GithubReleaseModel { + + int id; + bool draft; + bool prerelease; + String assetsUrl; + String body; + String createdAt; + String htmlUrl; + String name; + String nodeId; + String publishedAt; + String tagName; + String tarballUrl; + String targetCommitish; + String uploadUrl; + String url; + String zipballUrl; + List assets; + Author author; + + GithubReleaseModel.fromParams({this.id, this.draft, this.prerelease, this.assetsUrl, this.body, this.createdAt, this.htmlUrl, this.name, this.nodeId, this.publishedAt, this.tagName, this.tarballUrl, this.targetCommitish, this.uploadUrl, this.url, this.zipballUrl, this.assets, this.author}); + + factory GithubReleaseModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new GithubReleaseModel.fromJson(json.decode(jsonStr)) : new GithubReleaseModel.fromJson(jsonStr); + + GithubReleaseModel.fromJson(jsonRes) { + id = jsonRes['id']; + draft = jsonRes['draft']; + prerelease = jsonRes['prerelease']; + assetsUrl = jsonRes['assets_url']; + body = jsonRes['body']; + createdAt = jsonRes['created_at']; + htmlUrl = jsonRes['html_url']; + name = jsonRes['name']; + nodeId = jsonRes['node_id']; + publishedAt = jsonRes['published_at']; + tagName = jsonRes['tag_name']; + tarballUrl = jsonRes['tarball_url']; + targetCommitish = jsonRes['target_commitish']; + uploadUrl = jsonRes['upload_url']; + url = jsonRes['url']; + zipballUrl = jsonRes['zipball_url']; + assets = jsonRes['assets'] == null ? null : []; + + for (var assetsItem in assets == null ? [] : jsonRes['assets']){ + assets.add(assetsItem == null ? null : new Asset.fromJson(assetsItem)); + } + + author = jsonRes['author'] == null ? null : new Author.fromJson(jsonRes['author']); + } + + @override + String toString() { + return '{"id": $id,"draft": $draft,"prerelease": $prerelease,"assets_url": ${assetsUrl != null?'${json.encode(assetsUrl)}':'null'},"body": ${body != null?'${json.encode(body)}':'null'},"created_at": ${createdAt != null?'${json.encode(createdAt)}':'null'},"html_url": ${htmlUrl != null?'${json.encode(htmlUrl)}':'null'},"name": ${name != null?'${json.encode(name)}':'null'},"node_id": ${nodeId != null?'${json.encode(nodeId)}':'null'},"published_at": ${publishedAt != null?'${json.encode(publishedAt)}':'null'},"tag_name": ${tagName != null?'${json.encode(tagName)}':'null'},"tarball_url": ${tarballUrl != null?'${json.encode(tarballUrl)}':'null'},"target_commitish": ${targetCommitish != null?'${json.encode(targetCommitish)}':'null'},"upload_url": ${uploadUrl != null?'${json.encode(uploadUrl)}':'null'},"url": ${url != null?'${json.encode(url)}':'null'},"zipball_url": ${zipballUrl != null?'${json.encode(zipballUrl)}':'null'},"assets": $assets,"author": $author}'; + } +} + +class Author { + + int id; + bool siteAdmin; + String avatarUrl; + String eventsUrl; + String followersUrl; + String followingUrl; + String gistsUrl; + String gravatarId; + String htmlUrl; + String login; + String nodeId; + String organizationsUrl; + String receivedEventsUrl; + String reposUrl; + String starredUrl; + String subscriptionsUrl; + String type; + String url; + + Author.fromParams({this.id, this.siteAdmin, this.avatarUrl, this.eventsUrl, this.followersUrl, this.followingUrl, this.gistsUrl, this.gravatarId, this.htmlUrl, this.login, this.nodeId, this.organizationsUrl, this.receivedEventsUrl, this.reposUrl, this.starredUrl, this.subscriptionsUrl, this.type, this.url}); + + Author.fromJson(jsonRes) { + id = jsonRes['id']; + siteAdmin = jsonRes['site_admin']; + avatarUrl = jsonRes['avatar_url']; + eventsUrl = jsonRes['events_url']; + followersUrl = jsonRes['followers_url']; + followingUrl = jsonRes['following_url']; + gistsUrl = jsonRes['gists_url']; + gravatarId = jsonRes['gravatar_id']; + htmlUrl = jsonRes['html_url']; + login = jsonRes['login']; + nodeId = jsonRes['node_id']; + organizationsUrl = jsonRes['organizations_url']; + receivedEventsUrl = jsonRes['received_events_url']; + reposUrl = jsonRes['repos_url']; + starredUrl = jsonRes['starred_url']; + subscriptionsUrl = jsonRes['subscriptions_url']; + type = jsonRes['type']; + url = jsonRes['url']; + } + + @override + String toString() { + return '{"id": $id,"site_admin": $siteAdmin,"avatar_url": ${avatarUrl != null?'${json.encode(avatarUrl)}':'null'},"events_url": ${eventsUrl != null?'${json.encode(eventsUrl)}':'null'},"followers_url": ${followersUrl != null?'${json.encode(followersUrl)}':'null'},"following_url": ${followingUrl != null?'${json.encode(followingUrl)}':'null'},"gists_url": ${gistsUrl != null?'${json.encode(gistsUrl)}':'null'},"gravatar_id": ${gravatarId != null?'${json.encode(gravatarId)}':'null'},"html_url": ${htmlUrl != null?'${json.encode(htmlUrl)}':'null'},"login": ${login != null?'${json.encode(login)}':'null'},"node_id": ${nodeId != null?'${json.encode(nodeId)}':'null'},"organizations_url": ${organizationsUrl != null?'${json.encode(organizationsUrl)}':'null'},"received_events_url": ${receivedEventsUrl != null?'${json.encode(receivedEventsUrl)}':'null'},"repos_url": ${reposUrl != null?'${json.encode(reposUrl)}':'null'},"starred_url": ${starredUrl != null?'${json.encode(starredUrl)}':'null'},"subscriptions_url": ${subscriptionsUrl != null?'${json.encode(subscriptionsUrl)}':'null'},"type": ${type != null?'${json.encode(type)}':'null'},"url": ${url != null?'${json.encode(url)}':'null'}}'; + } +} + +class Asset { + + Object label; + int downloadCount; + int id; + int size; + String browserDownloadUrl; + String contentType; + String createdAt; + String name; + String nodeId; + String state; + String updatedAt; + String url; + Uploader uploader; + + Asset.fromParams({this.label, this.downloadCount, this.id, this.size, this.browserDownloadUrl, this.contentType, this.createdAt, this.name, this.nodeId, this.state, this.updatedAt, this.url, this.uploader}); + + Asset.fromJson(jsonRes) { + label = jsonRes['label']; + downloadCount = jsonRes['download_count']; + id = jsonRes['id']; + size = jsonRes['size']; + browserDownloadUrl = jsonRes['browser_download_url']; + contentType = jsonRes['content_type']; + createdAt = jsonRes['created_at']; + name = jsonRes['name']; + nodeId = jsonRes['node_id']; + state = jsonRes['state']; + updatedAt = jsonRes['updated_at']; + url = jsonRes['url']; + uploader = jsonRes['uploader'] == null ? null : new Uploader.fromJson(jsonRes['uploader']); + } + + @override + String toString() { + return '{"label": $label,"download_count": $downloadCount,"id": $id,"size": $size,"browser_download_url": ${browserDownloadUrl != null?'${json.encode(browserDownloadUrl)}':'null'},"content_type": ${contentType != null?'${json.encode(contentType)}':'null'},"created_at": ${createdAt != null?'${json.encode(createdAt)}':'null'},"name": ${name != null?'${json.encode(name)}':'null'},"node_id": ${nodeId != null?'${json.encode(nodeId)}':'null'},"state": ${state != null?'${json.encode(state)}':'null'},"updated_at": ${updatedAt != null?'${json.encode(updatedAt)}':'null'},"url": ${url != null?'${json.encode(url)}':'null'},"uploader": $uploader}'; + } +} + +class Uploader { + + int id; + bool siteAdmin; + String avatarUrl; + String eventsUrl; + String followersUrl; + String followingUrl; + String gistsUrl; + String gravatarId; + String htmlUrl; + String login; + String nodeId; + String organizationsUrl; + String receivedEventsUrl; + String reposUrl; + String starredUrl; + String subscriptionsUrl; + String type; + String url; + + Uploader.fromParams({this.id, this.siteAdmin, this.avatarUrl, this.eventsUrl, this.followersUrl, this.followingUrl, this.gistsUrl, this.gravatarId, this.htmlUrl, this.login, this.nodeId, this.organizationsUrl, this.receivedEventsUrl, this.reposUrl, this.starredUrl, this.subscriptionsUrl, this.type, this.url}); + + Uploader.fromJson(jsonRes) { + id = jsonRes['id']; + siteAdmin = jsonRes['site_admin']; + avatarUrl = jsonRes['avatar_url']; + eventsUrl = jsonRes['events_url']; + followersUrl = jsonRes['followers_url']; + followingUrl = jsonRes['following_url']; + gistsUrl = jsonRes['gists_url']; + gravatarId = jsonRes['gravatar_id']; + htmlUrl = jsonRes['html_url']; + login = jsonRes['login']; + nodeId = jsonRes['node_id']; + organizationsUrl = jsonRes['organizations_url']; + receivedEventsUrl = jsonRes['received_events_url']; + reposUrl = jsonRes['repos_url']; + starredUrl = jsonRes['starred_url']; + subscriptionsUrl = jsonRes['subscriptions_url']; + type = jsonRes['type']; + url = jsonRes['url']; + } + + @override + String toString() { + return '{"id": $id,"site_admin": $siteAdmin,"avatar_url": ${avatarUrl != null?'${json.encode(avatarUrl)}':'null'},"events_url": ${eventsUrl != null?'${json.encode(eventsUrl)}':'null'},"followers_url": ${followersUrl != null?'${json.encode(followersUrl)}':'null'},"following_url": ${followingUrl != null?'${json.encode(followingUrl)}':'null'},"gists_url": ${gistsUrl != null?'${json.encode(gistsUrl)}':'null'},"gravatar_id": ${gravatarId != null?'${json.encode(gravatarId)}':'null'},"html_url": ${htmlUrl != null?'${json.encode(htmlUrl)}':'null'},"login": ${login != null?'${json.encode(login)}':'null'},"node_id": ${nodeId != null?'${json.encode(nodeId)}':'null'},"organizations_url": ${organizationsUrl != null?'${json.encode(organizationsUrl)}':'null'},"received_events_url": ${receivedEventsUrl != null?'${json.encode(receivedEventsUrl)}':'null'},"repos_url": ${reposUrl != null?'${json.encode(reposUrl)}':'null'},"starred_url": ${starredUrl != null?'${json.encode(starredUrl)}':'null'},"subscriptions_url": ${subscriptionsUrl != null?'${json.encode(subscriptionsUrl)}':'null'},"type": ${type != null?'${json.encode(type)}':'null'},"url": ${url != null?'${json.encode(url)}':'null'}}'; + } +} + + diff --git a/lib/models/image_model.dart b/lib/models/image_model.dart new file mode 100644 index 00000000..095a0d6a --- /dev/null +++ b/lib/models/image_model.dart @@ -0,0 +1,61 @@ +import 'dart:convert' show json; + +class ImageModel { + + int id; + List backdrops; + List posters; + + ImageModel.fromParams({this.id, this.backdrops, this.posters}); + + factory ImageModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new ImageModel.fromJson(json.decode(jsonStr)) : new ImageModel.fromJson(jsonStr); + + ImageModel.fromJson(jsonRes) { + id = jsonRes['id']; + backdrops = jsonRes['backdrops'] == null ? null : []; + + for (var backdropsItem in backdrops == null ? [] : jsonRes['backdrops']){ + backdrops.add(backdropsItem == null ? null : new ImageData.fromJson(backdropsItem)); + } + + posters = jsonRes['posters'] == null ? null : []; + + for (var postersItem in posters == null ? [] : jsonRes['posters']){ + posters.add(postersItem == null ? null : new ImageData.fromJson(postersItem)); + } + } + + @override + String toString() { + return '{"id": $id,"backdrops": $backdrops,"posters": $posters}'; + } +} + +class ImageData { + + int height; + Object voteAverage; + int voteCount; + int width; + double aspectRatio; + String filePath; + String iso_639_1; + + ImageData.fromParams({this.height, this.voteAverage, this.voteCount, this.width, this.aspectRatio, this.filePath, this.iso_639_1}); + + ImageData.fromJson(jsonRes) { + height = jsonRes['height']; + voteAverage = jsonRes['vote_average']; + voteCount = jsonRes['vote_count']; + width = jsonRes['width']; + aspectRatio = jsonRes['aspect_ratio']; + filePath = jsonRes['file_path']; + iso_639_1 = jsonRes['iso_639_1']; + } + + @override + String toString() { + return '{"height": $height,"vote_average": $voteAverage,"vote_count": $voteCount,"width": $width,"aspect_ratio": $aspectRatio,"file_path": ${filePath != null?'${json.encode(filePath)}':'null'},"iso_639_1": ${iso_639_1 != null?'${json.encode(iso_639_1)}':'null'}}'; + } +} + diff --git a/lib/models/item.dart b/lib/models/item.dart new file mode 100644 index 00000000..96ca93fc --- /dev/null +++ b/lib/models/item.dart @@ -0,0 +1,22 @@ +import 'dart:convert' show json; + +class Item { + String name; + dynamic value; + Item.fromParams({this.name, this.value}); + + factory Item(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new Item.fromJson(json.decode(jsonStr)) + : new Item.fromJson(jsonStr); + + Item.fromJson(jsonRes) { + name = jsonRes['name']; + value = jsonRes['value']; + } + @override + String toString() { + return '{"name": "$name","value": ${value != null ? '${json.encode(value)}' : 'null'}}'; + } +} diff --git a/lib/models/keyword.dart b/lib/models/keyword.dart new file mode 100644 index 00000000..acc704a1 --- /dev/null +++ b/lib/models/keyword.dart @@ -0,0 +1,49 @@ +import 'dart:convert' show json; + +class KeyWordModel { + + int id; + List keywords; + List results; + + KeyWordModel.fromParams({this.id, this.keywords,this.results}); + + factory KeyWordModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new KeyWordModel.fromJson(json.decode(jsonStr)) : new KeyWordModel.fromJson(jsonStr); + + KeyWordModel.fromJson(jsonRes) { + id = jsonRes['id']; + keywords = jsonRes['keywords'] == null ? null : []; + results = jsonRes['results'] == null ? null : []; + + for (var keywordsItem in keywords == null ? [] : jsonRes['keywords']){ + keywords.add(keywordsItem == null ? null : new KeyWordData.fromJson(keywordsItem)); + } + for (var keywordsItem in results == null ? [] : jsonRes['results']){ + results.add(keywordsItem == null ? null : new KeyWordData.fromJson(keywordsItem)); + } + } + + @override + String toString() { + return '{"id": $id,"keywords": $keywords,"results": $results}'; + } +} + +class KeyWordData { + + int id; + String name; + + KeyWordData.fromParams({this.id, this.name}); + + KeyWordData.fromJson(jsonRes) { + id = jsonRes['id']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"id": $id,"name": ${name != null?'${json.encode(name)}':'null'}}'; + } +} + diff --git a/lib/models/list_detail_mode.dart b/lib/models/list_detail_mode.dart new file mode 100644 index 00000000..003557af --- /dev/null +++ b/lib/models/list_detail_mode.dart @@ -0,0 +1,108 @@ +import 'dart:convert' show json; + +import 'package:movie/models/video_list.dart'; + +class ListDetailModel { + int id; + int page; + int runtime; + int totalPages; + int totalResults; + double averageRating; + bool public; + String backdropPath; + String description; + String iso31661; + String iso6391; + String name; + String posterPath; + int revenue; + List results; + Comments comments; + ListCreatedBy createdBy; + ObjectIds objectIds; + + ListDetailModel.fromParams( + {this.id, + this.page, + this.runtime, + this.totalPages, + this.totalResults, + this.averageRating, + this.public, + this.backdropPath, + this.description, + this.iso31661, + this.iso6391, + this.name, + this.posterPath, + this.revenue, + this.results, + this.comments, + this.createdBy, + this.objectIds}); + + factory ListDetailModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new ListDetailModel.fromJson(json.decode(jsonStr)) + : new ListDetailModel.fromJson(jsonStr); + + ListDetailModel.fromJson(jsonRes) { + id = jsonRes['id']; + page = jsonRes['page']; + runtime = jsonRes['runtime']; + totalPages = jsonRes['total_pages']; + totalResults = jsonRes['total_results']; + averageRating = double.parse(jsonRes['average_rating'].toString() ?? '0.0'); + public = jsonRes['public']; + backdropPath = jsonRes['backdrop_path']; + description = jsonRes['description']; + iso31661 = jsonRes['iso_3166_1']; + iso6391 = jsonRes['iso_639_1']; + name = jsonRes['name']; + posterPath = jsonRes['poster_path']; + revenue = jsonRes['revenue']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']) { + results.add(resultsItem == null + ? null + : new VideoListResult.fromJson(resultsItem)); + } + + //comments = jsonRes['comments'] == null ? null : new Comments.fromJson(jsonRes['comments']); + createdBy = jsonRes['created_by'] == null + ? null + : new ListCreatedBy.fromJson(jsonRes['created_by']); + //objectIds = jsonRes['object_ids'] == null ? null : new ObjectIds.fromJson(jsonRes['object_ids']); + } + + @override + String toString() { + return '{"id": $id,"page": $page,"runtime": $runtime,"total_pages": $totalPages,"total_results": $totalResults,"average_rating": $averageRating,"public": $public,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"description": ${description != null ? '${json.encode(description)}' : 'null'},"iso_3166_1": ${iso31661 != null ? '${json.encode(iso31661)}' : 'null'},"iso_639_1": ${iso6391 != null ? '${json.encode(iso6391)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"revenue": ${revenue != null ? '${json.encode(revenue)}' : 'null'},"results": $results,"comments": $comments,"created_by": $createdBy,"object_ids": $objectIds}'; + } +} + +class ObjectIds {} + +class ListCreatedBy { + String gravatarHash; + String name; + String username; + + ListCreatedBy.fromParams({this.gravatarHash, this.name, this.username}); + + ListCreatedBy.fromJson(jsonRes) { + gravatarHash = jsonRes['gravatar_hash']; + name = jsonRes['name']; + username = jsonRes['username']; + } + + @override + String toString() { + return '{"gravatar_hash": ${gravatarHash != null ? '${json.encode(gravatarHash)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"username": ${username != null ? '${json.encode(username)}' : 'null'}}'; + } +} + +class Comments {} diff --git a/lib/models/list_media_item.dart b/lib/models/list_media_item.dart new file mode 100644 index 00000000..42286677 --- /dev/null +++ b/lib/models/list_media_item.dart @@ -0,0 +1,11 @@ + +class ListMediaItem{ + String mediaType; + int mediaId; + ListMediaItem(this.mediaType,this.mediaId); + @override + String toString() { + return '{"media_type": "$mediaType","media_id": $mediaId}'; + } + Map toJson() => {"media_type": mediaType,"media_id": mediaId}; +} \ No newline at end of file diff --git a/lib/models/media_account_state_model.dart b/lib/models/media_account_state_model.dart new file mode 100644 index 00000000..74cdd6c4 --- /dev/null +++ b/lib/models/media_account_state_model.dart @@ -0,0 +1,44 @@ + import 'dart:convert' show json; + +class MediaAccountStateModel { + + int id; + bool favorite; + bool watchlist; + RatedResult rated; + bool isRated; + + MediaAccountStateModel.fromParams({this.id, this.favorite, this.watchlist, this.rated,this.isRated}); + + factory MediaAccountStateModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new MediaAccountStateModel.fromJson(json.decode(jsonStr)) : new MediaAccountStateModel.fromJson(jsonStr); + + MediaAccountStateModel.fromJson(jsonRes) { + id = jsonRes['id']; + favorite = jsonRes['favorite']; + watchlist = jsonRes['watchlist']; + rated = jsonRes['rated'] == false || jsonRes['rated'] ==null? null : new RatedResult.fromJson(jsonRes['rated']); + isRated=jsonRes['rated'] == false|| jsonRes['rated'] ==null? false:true; + } + + @override + String toString() { + return '{"id": $id,"favorite": $favorite,"watchlist": $watchlist,"rated": $rated,"isRated": $isRated}'; + } +} + +class RatedResult { + + double value; + + RatedResult.fromParams({this.value}); + + RatedResult.fromJson(jsonRes) { + value =double.parse( jsonRes['value'].toString()??'0.0'); + } + + @override + String toString() { + return '{"value": $value}'; + } +} + diff --git a/lib/models/model_factory.dart b/lib/models/model_factory.dart new file mode 100644 index 00000000..8fccfb2d --- /dev/null +++ b/lib/models/model_factory.dart @@ -0,0 +1,88 @@ +import 'models.dart'; + +class ModelFactory { + static T generate(json) { + switch (T.toString()) { + case 'VideoListModel': + return VideoListModel(json) as T; + case 'MovieDetailModel': + return MovieDetailModel(json) as T; + case 'TVDetailModel': + return TVDetailModel(json) as T; + case 'SearchResultModel': + return SearchResultModel(json) as T; + case 'VideoModel': + return VideoModel(json) as T; + case 'CreditsModel': + return CreditsModel(json) as T; + case 'ReviewModel': + return ReviewModel(json) as T; + case 'ImageModel': + return ImageModel(json) as T; + case 'KeyWordModel': + return KeyWordModel(json) as T; + case 'Season': + return Season(json) as T; + case 'Episode': + return Episode(json) as T; + case 'PeopleDetailModel': + return PeopleDetailModel(json) as T; + case 'CombinedCreditsModel': + return CombinedCreditsModel(json) as T; + case 'UserListModel': + return UserListModel(json) as T; + case 'UserListDetail': + return UserListDetail.fromJson(json) as T; + case 'UserListDetailModel': + return UserListDetailModel(json) as T; + case 'AccountState': + return AccountState(json) as T; + case 'UserMediaModel': + return UserMediaModel(json) as T; + case 'BaseMovieModel': + return BaseMovieModel(json) as T; + case 'MovieStreamLinks': + return MovieStreamLinks(json) as T; + case 'BaseTvShowModel': + return BaseTvShowModel(json) as T; + case 'TvShowStreamLinks': + return TvShowStreamLinks(json) as T; + case 'TvShowComment': + return TvShowComment.fromJson(json) as T; + case 'TvShowComments': + return TvShowComments(json) as T; + case 'MovieComment': + return MovieComment.fromJson(json) as T; + case 'MovieComments': + return MovieComments(json) as T; + case 'TransactionModel': + return TransactionModel(json) as T; + case 'BraintreeCustomer': + return BraintreeCustomer(json) as T; + case 'UserPremiumModel': + return UserPremiumModel(json) as T; + case 'BraintreeSubscription': + return BraintreeSubscription(json) as T; + case 'UserPremiumData': + return UserPremiumData(json) as T; + case 'BillingAddress': + return BillingAddress(json) as T; + case 'GithubReleaseModel': + return GithubReleaseModel(json) as T; + case 'TvShowLikeModel': + return TvShowLikeModel(json) as T; + case 'MovieLikeModel': + return MovieLikeModel(json) as T; + case 'CastListDetail': + return CastListDetail(json) as T; + case 'BaseCast': + return BaseCast.fromJson(json) as T; + case 'AccountInfo': + return AccountInfo(json) as T; + case 'TopicSubscription': + return TopicSubscription(json) as T; + default: + return json; + } + } +} diff --git a/lib/models/models.dart b/lib/models/models.dart new file mode 100644 index 00000000..b71a6ac8 --- /dev/null +++ b/lib/models/models.dart @@ -0,0 +1,49 @@ +export 'base_api_model/account_info.dart'; +export 'base_api_model/movie_like_model.dart'; +export 'base_api_model/tvshow_like_model.dart'; +export 'base_api_model/account_state.dart'; +export 'base_api_model/base_movie.dart'; +export 'base_api_model/base_tvshow.dart'; +export 'base_api_model/braintree_billing_address.dart'; +export 'base_api_model/braintree_customer.dart'; +export 'base_api_model/braintree_subscription.dart'; +export 'base_api_model/cast_list_detail.dart'; +export 'base_api_model/movie_comment.dart'; +export 'base_api_model/movie_stream_link.dart'; +export 'base_api_model/tvshow_comment.dart'; +export 'base_api_model/user_list.dart'; +export 'base_api_model/user_list_detail.dart'; +export 'base_api_model/user_media.dart'; +export 'base_api_model/user_premium_model.dart'; +export 'base_api_model/braintree_transaction.dart'; +export 'base_api_model/braintree_creditcard.dart'; +export 'base_api_model/purchase.dart'; +export 'base_api_model/stream_link_report.dart'; +export 'base_api_model/topic_subscription.dart'; +export 'item.dart'; +export 'credits_model.dart'; +export 'episode_model.dart'; +export 'image_model.dart'; +export 'keyword.dart'; +export 'movie_detail.dart'; +export 'people_detail.dart'; +export 'review.dart'; +export 'search_result.dart'; +export 'season_detail.dart'; +export 'video_list.dart'; +export 'video_model.dart'; +export 'tvshow_detail.dart'; +export 'base_api_model/tvshow_stream_link.dart'; +export 'combined_credits.dart'; +export 'combined_cast_data.dart'; +export 'combined_crew_data.dart'; +export 'video_model.dart'; +export 'account_detail.dart'; +export 'mylist_model.dart'; +export 'list_media_item.dart'; +export 'movie_change.dart'; +export 'list_detail_mode.dart'; +export 'certification.dart'; +export 'media_account_state_model.dart'; +export 'github_release.dart'; +export 'response_model.dart'; diff --git a/lib/models/movie_change.dart b/lib/models/movie_change.dart new file mode 100644 index 00000000..9ce5cf27 --- /dev/null +++ b/lib/models/movie_change.dart @@ -0,0 +1,48 @@ +import 'dart:convert' show json; + +class MovieChangeModel { + + int page; + int totalPages; + int totalResults; + List results; + + MovieChangeModel.fromParams({this.page, this.totalPages, this.totalResults, this.results}); + + factory MovieChangeModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new MovieChangeModel.fromJson(json.decode(jsonStr)) : new MovieChangeModel.fromJson(jsonStr); + + MovieChangeModel.fromJson(jsonRes) { + page = jsonRes['page']; + totalPages = jsonRes['total_pages']; + totalResults = jsonRes['total_results']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']){ + results.add(resultsItem == null ? null : new ChangeResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"page": $page,"total_pages": $totalPages,"total_results": $totalResults,"results": $results}'; + } +} + +class ChangeResult { + + int id; + bool adult; + + ChangeResult.fromParams({this.id, this.adult}); + + ChangeResult.fromJson(jsonRes) { + id = jsonRes['id']; + adult = jsonRes['adult']; + } + + @override + String toString() { + return '{"id": $id,"adult": $adult}'; + } +} + diff --git a/lib/models/movie_detail.dart b/lib/models/movie_detail.dart new file mode 100644 index 00000000..201eef76 --- /dev/null +++ b/lib/models/movie_detail.dart @@ -0,0 +1,234 @@ +import 'dart:convert' show json; + +import 'package:movie/models/production_companie.dart'; +import 'package:movie/models/release_date_model.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/models/video_model.dart'; + +import 'credits_model.dart'; +import 'external_ids_model.dart'; +import 'genre.dart'; +import 'image_model.dart'; +import 'keyword.dart'; + +class MovieDetailModel { + Object homepage; + int budget; + int id; + int revenue; + int runtime; + int voteCount; + double popularity; + double voteAverage; + bool adult; + bool video; + String backdropPath; + String imdbId; + String originalLanguage; + String originalTitle; + String overview; + String posterPath; + String releaseDate; + String status; + String tagLine; + String title; + List genres; + List productionCompanies; + List productionCountries; + List spokenLanguages; + BelongsToCollection belongsToCollection; + CreditsModel credits; + ImageModel images; + VideoModel videos; + KeyWordModel keywords; + VideoListModel recommendations; + ReviewModel reviews; + ExternalIdsModel externalIds; + ReleaseDateModel releaseDates; + + MovieDetailModel.fromParams( + {this.homepage, + this.budget, + this.id, + this.revenue, + this.runtime, + this.voteCount, + this.popularity, + this.voteAverage, + this.adult, + this.video, + this.backdropPath, + this.imdbId, + this.originalLanguage, + this.originalTitle, + this.overview, + this.posterPath, + this.releaseDate, + this.status, + this.tagLine, + this.title, + this.genres, + this.productionCompanies, + this.productionCountries, + this.spokenLanguages, + this.belongsToCollection, + this.credits, + this.images, + this.keywords, + this.recommendations, + this.reviews, + this.externalIds, + this.releaseDates, + this.videos}); + + factory MovieDetailModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new MovieDetailModel.fromJson(json.decode(jsonStr)) + : new MovieDetailModel.fromJson(jsonStr); + + MovieDetailModel.fromJson(jsonRes) { + homepage = jsonRes['homepage']; + budget = jsonRes['budget']; + id = jsonRes['id']; + revenue = jsonRes['revenue']; + runtime = jsonRes['runtime']; + voteCount = jsonRes['vote_count']; + popularity = jsonRes['popularity']; + voteAverage = jsonRes['vote_average']; + adult = jsonRes['adult']; + video = jsonRes['video']; + backdropPath = jsonRes['backdrop_path']; + imdbId = jsonRes['imdb_id']; + originalLanguage = jsonRes['original_language']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + releaseDate = jsonRes['release_date']; + status = jsonRes['status']; + tagLine = jsonRes['tagline']; + title = jsonRes['title']; + genres = jsonRes['genres'] == null ? null : []; + + for (var genresItem in genres == null ? [] : jsonRes['genres']) { + genres.add(genresItem == null ? null : new Genre.fromJson(genresItem)); + } + + productionCompanies = jsonRes['production_companies'] == null ? null : []; + + for (var production_companiesItem + in productionCompanies == null ? [] : jsonRes['production_companies']) { + productionCompanies.add(production_companiesItem == null + ? null + : new ProductionCompanie.fromJson(production_companiesItem)); + } + + productionCountries = jsonRes['production_countries'] == null ? null : []; + + for (var production_countriesItem + in productionCountries == null ? [] : jsonRes['production_countries']) { + productionCountries.add(production_countriesItem == null + ? null + : new ProductionCountrie.fromJson(production_countriesItem)); + } + + spokenLanguages = jsonRes['spoken_languages'] == null ? null : []; + + for (var spoken_languagesItem + in spokenLanguages == null ? [] : jsonRes['spoken_languages']) { + spokenLanguages.add(spoken_languagesItem == null + ? null + : new SpokenLanguage.fromJson(spoken_languagesItem)); + } + + belongsToCollection = jsonRes['belongs_to_collection'] == null + ? null + : new BelongsToCollection.fromJson(jsonRes['belongs_to_collection']); + credits = jsonRes['credits'] == null + ? null + : new CreditsModel.fromJson(jsonRes['credits']); + images = jsonRes['images'] == null + ? null + : new ImageModel.fromJson(jsonRes['images']); + videos = jsonRes['videos'] == null + ? null + : new VideoModel.fromJson(jsonRes['videos']); + keywords = jsonRes['keywords'] == null + ? null + : new KeyWordModel.fromJson(jsonRes['keywords']); + recommendations = jsonRes['recommendations'] == null + ? null + : new VideoListModel.fromJson(jsonRes['recommendations']); + reviews = jsonRes['reviews'] == null + ? null + : new ReviewModel.fromJson(jsonRes['reviews']); + externalIds = jsonRes['external_ids'] == null + ? null + : new ExternalIdsModel.fromJson(jsonRes['external_ids']); + releaseDates = jsonRes['release_dates'] == null + ? null + : new ReleaseDateModel.fromJson(jsonRes['release_dates']); + } + + @override + String toString() { + return '{"homepage": $homepage,"budget": $budget,"id": $id,"revenue": $revenue,"runtime": $runtime,"vote_count": $voteCount,"popularity": $popularity,"vote_average": $voteAverage,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"imdb_id": ${imdbId != null ? '${json.encode(imdbId)}' : 'null'},"original_language": ${originalLanguage != null ? '${json.encode(originalLanguage)}' : 'null'},"original_title": ${originalTitle != null ? '${json.encode(originalTitle)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"release_date": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'},"status": ${status != null ? '${json.encode(status)}' : 'null'},"tagline": ${tagLine != null ? '${json.encode(tagLine)}' : 'null'},"title": ${title != null ? '${json.encode(title)}' : 'null'},"genres": $genres,"production_companies": $productionCompanies,"production_countries": $productionCountries,"spoken_languages": $spokenLanguages,"belongs_to_collection": $belongsToCollection,"credits": $credits,"images": $images,"keywords": $keywords,"recommendations": $recommendations,"reviews": $reviews,"externalids":$externalIds,"releaseDates":$releaseDates,"videos":$videos}'; + } +} + +class BelongsToCollection { + int id; + String backdropPath; + String name; + String posterPath; + + BelongsToCollection.fromParams( + {this.id, this.backdropPath, this.name, this.posterPath}); + + BelongsToCollection.fromJson(jsonRes) { + id = jsonRes['id']; + backdropPath = jsonRes['backdrop_path']; + name = jsonRes['name']; + posterPath = jsonRes['poster_path']; + } + + @override + String toString() { + return '{"id": $id,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'}}'; + } +} + +class SpokenLanguage { + String iso_639_1; + String name; + + SpokenLanguage.fromParams({this.iso_639_1, this.name}); + + SpokenLanguage.fromJson(jsonRes) { + iso_639_1 = jsonRes['iso_639_1']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"iso_639_1": ${iso_639_1 != null ? '${json.encode(iso_639_1)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} + +class ProductionCountrie { + String iso_3166_1; + String name; + + ProductionCountrie.fromParams({this.iso_3166_1, this.name}); + + ProductionCountrie.fromJson(jsonRes) { + iso_3166_1 = jsonRes['iso_3166_1']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"iso_3166_1": ${iso_3166_1 != null ? '${json.encode(iso_3166_1)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} diff --git a/lib/models/mylist_model.dart b/lib/models/mylist_model.dart new file mode 100644 index 00000000..318c9b5d --- /dev/null +++ b/lib/models/mylist_model.dart @@ -0,0 +1,101 @@ +import 'dart:convert' show json; + +class MyListModel { + int page; + int totalPages; + int totalResults; + List results; + + MyListModel.fromParams( + {this.page, this.totalPages, this.totalResults, this.results}); + + factory MyListModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new MyListModel.fromJson(json.decode(jsonStr)) + : new MyListModel.fromJson(jsonStr); + + MyListModel.fromJson(jsonRes) { + page = jsonRes['page']; + totalPages = jsonRes['total_pages']; + totalResults = jsonRes['total_results']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']) { + results.add( + resultsItem == null ? null : new MyListResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"page": $page,"total_pages": $totalPages,"total_results": $totalResults,"results": $results}'; + } +} + +class MyListResult { + int adult; + int featured; + int id; + int numberOfItems; + int public; + int runtime; + int sortBy; + double averageRating; + String backdropPath; + String createdAt; + String description; + String iso31661; + String iso6391; + String name; + String posterPath; + String revenue; + String updatedAt; + bool selected; + + MyListResult.fromParams( + {this.adult, + this.featured, + this.id, + this.numberOfItems, + this.public, + this.runtime, + this.sortBy, + this.averageRating, + this.backdropPath, + this.createdAt, + this.description, + this.iso31661, + this.iso6391, + this.name, + this.posterPath, + this.revenue, + this.updatedAt, + this.selected}); + + MyListResult.fromJson(jsonRes) { + adult = jsonRes['adult']; + featured = jsonRes['featured']; + id = jsonRes['id']; + numberOfItems = jsonRes['number_of_items']; + public = jsonRes['public']; + runtime = jsonRes['runtime']; + sortBy = jsonRes['sort_by']; + averageRating = double.parse(jsonRes['average_rating'].toString() ?? '0.0'); + backdropPath = jsonRes['backdrop_path']; + createdAt = jsonRes['created_at']; + description = jsonRes['description']; + iso31661 = jsonRes['iso_3166_1']; + iso6391 = jsonRes['iso_639_1']; + name = jsonRes['name']; + posterPath = jsonRes['poster_path']; + revenue = jsonRes['revenue']; + updatedAt = jsonRes['updated_at']; + selected = false; + } + + @override + String toString() { + return '{"adult": $adult,"featured": $featured,"id": $id,"number_of_items": $numberOfItems,"public": $public,"runtime": $runtime,"sort_by": $sortBy,"average_rating": $averageRating,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"created_at": ${createdAt != null ? '${json.encode(createdAt)}' : 'null'},"description": ${description != null ? '${json.encode(description)}' : 'null'},"iso_3166_1": ${iso31661 != null ? '${json.encode(iso31661)}' : 'null'},"iso_639_1": ${iso6391 != null ? '${json.encode(iso6391)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"revenue": ${revenue != null ? '${json.encode(revenue)}' : 'null'},"updated_at": ${updatedAt != null ? '${json.encode(updatedAt)}' : 'null'},"selected":$selected}'; + } +} diff --git a/lib/models/notification_model.dart b/lib/models/notification_model.dart new file mode 100644 index 00000000..d08f5260 --- /dev/null +++ b/lib/models/notification_model.dart @@ -0,0 +1,111 @@ +import 'dart:convert' show json; + +class NotificationList { + List notifications; + factory NotificationList(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new NotificationList.fromJson(json.decode(jsonStr)) + : new NotificationList.fromJson(jsonStr); + NotificationList.fromParams({this.notifications}); + NotificationList.fromJson(jsonRes) { + notifications = jsonRes['notifications'] == null ? null : []; + for (var resultsItem + in notifications == null ? [] : jsonRes['notifications']) { + notifications + .add(resultsItem == null ? null : NotificationModel(resultsItem)); + } + } + @override + String toString() { + return '{"notifications": $notifications}'; + } +} + +class NotificationModel { + NotificationData notification; + String date; + String id; + String type; + String name; + String streamLinkId; + String posterPic; + bool read; + + NotificationModel.fromParams( + {this.id, + this.name, + this.posterPic, + this.streamLinkId, + this.type, + this.date, + this.notification, + this.read}); + + factory NotificationModel(dynamic mapRes) => mapRes is String + ? NotificationModel.fromJson(json.encode(mapRes)) + : NotificationModel.fromMap(mapRes); + + NotificationModel.fromMap(Map mapRes) { + final _data = mapRes.containsKey('data') ? mapRes['data'] : mapRes; + id = _data['id'] == null ? null : _data['id']; + type = _data['type'] == null ? null : _data['type']; + name = _data['name'] == null ? null : _data['name']; + streamLinkId = _data['streamLinkId'] == null ? null : _data['streamLinkId']; + posterPic = _data['posterPic'] == null ? null : _data['posterPic']; + read = _data['read'] == null ? false : _data['read']; + date = _data['date'] == null ? DateTime.now().toString() : _data['date']; + notification = mapRes['notification'] == null + ? null + : NotificationData(mapRes['notification']); + } + + NotificationModel.fromJson(jsonRes) { + id = jsonRes['id']; + type = jsonRes['type']; + name = jsonRes['name']; + streamLinkId = jsonRes['streamLinkId']; + posterPic = jsonRes['posterPic']; + date = jsonRes['date']; + read = jsonRes['read'] == null ? false : jsonRes['read']; + notification = jsonRes['notification'] == null + ? null + : NotificationData.fromJson(jsonRes['notification']); + } + + @override + String toString() { + return '{"id": ${id != null ? '${json.encode(id)}' : 'null'},"type": ${type != null ? '${json.encode(type)}' : 'null'},"read": $read,"date": ${date != null ? '${json.encode(date)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"streamLinkId": ${streamLinkId != null ? '${json.encode(streamLinkId)}' : 'null'},"posterPic": ${posterPic != null ? '${json.encode(posterPic)}' : 'null'},"notification": $notification}'; + } +} + +class NotificationData { + String title; + String body; + String image; + + NotificationData.fromParams({ + this.body, + this.image, + this.title, + }); + + factory NotificationData(Map mapRes) => NotificationData.fromMap(mapRes); + + NotificationData.fromMap(mapRes) { + title = mapRes['title'] == null ? null : mapRes['title']; + body = mapRes['body'] == null ? null : mapRes['body']; + image = mapRes['image'] == null ? null : mapRes['image']; + } + + NotificationData.fromJson(jsonRes) { + title = jsonRes['title']; + body = jsonRes['body']; + image = jsonRes['image']; + } + + @override + String toString() { + return '{"title": ${title != null ? '${json.encode(title)}' : 'null'},"body": ${body != null ? '${json.encode(body)}' : 'null'},"image": ${image != null ? '${json.encode(image)}' : 'null'}}'; + } +} diff --git a/lib/models/people_detail.dart b/lib/models/people_detail.dart new file mode 100644 index 00000000..18022d56 --- /dev/null +++ b/lib/models/people_detail.dart @@ -0,0 +1,94 @@ +import 'dart:convert' show json; + +import 'image_model.dart'; + +class PeopleDetailModel { + Object deathday; + Object homepage; + int gender; + int id; + double popularity; + bool adult; + String biography; + String birthday; + String imdbId; + String knownForDepartment; + String name; + String placeOfBirth; + String profilePath; + ProfileImages images; + + List alsoKnownAs; + + PeopleDetailModel.fromParams( + {this.deathday, + this.homepage, + this.gender, + this.id, + this.popularity, + this.adult, + this.biography, + this.birthday, + this.imdbId, + this.knownForDepartment, + this.name, + this.placeOfBirth, + this.profilePath, + this.alsoKnownAs, + this.images}); + + factory PeopleDetailModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new PeopleDetailModel.fromJson(json.decode(jsonStr)) + : new PeopleDetailModel.fromJson(jsonStr); + + PeopleDetailModel.fromJson(jsonRes) { + deathday = jsonRes['deathday']; + homepage = jsonRes['homepage']; + gender = jsonRes['gender']; + id = jsonRes['id']; + popularity = jsonRes['popularity']; + adult = jsonRes['adult']; + biography = jsonRes['biography']; + birthday = jsonRes['birthday']; + imdbId = jsonRes['imdb_id']; + knownForDepartment = jsonRes['known_for_department']; + name = jsonRes['name']; + placeOfBirth = jsonRes['place_of_birth']; + profilePath = jsonRes['profile_path']; + alsoKnownAs = jsonRes['also_known_as'] == null ? null : []; + images = jsonRes['images'] == null + ? null + : new ProfileImages.fromJson(jsonRes['images']); + for (var also_known_asItem + in alsoKnownAs == null ? [] : jsonRes['also_known_as']) { + alsoKnownAs.add(also_known_asItem); + } + } + + @override + String toString() { + return '{"deathday": $deathday,"homepage": $homepage,"gender": $gender,"id": $id,"popularity": $popularity,"adult": $adult,"biography": ${biography != null ? '${json.encode(biography)}' : 'null'},"birthday": ${birthday != null ? '${json.encode(birthday)}' : 'null'},"imdb_id": ${imdbId != null ? '${json.encode(imdbId)}' : 'null'},"known_for_department": ${knownForDepartment != null ? '${json.encode(knownForDepartment)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"place_of_birth": ${placeOfBirth != null ? '${json.encode(placeOfBirth)}' : 'null'},"profile_path": ${profilePath != null ? '${json.encode(profilePath)}' : 'null'},"also_known_as": $alsoKnownAs,"images": $images}'; + } +} + +class ProfileImages { + List profiles; + + ProfileImages.fromParams({this.profiles}); + + ProfileImages.fromJson(jsonRes) { + profiles = jsonRes['profiles'] == null ? null : []; + + for (var profilesItem in profiles == null ? [] : jsonRes['profiles']) { + profiles.add( + profilesItem == null ? null : new ImageData.fromJson(profilesItem)); + } + } + + @override + String toString() { + return '{"profiles": $profiles}'; + } +} diff --git a/lib/models/production_companie.dart b/lib/models/production_companie.dart new file mode 100644 index 00000000..eb49ed0e --- /dev/null +++ b/lib/models/production_companie.dart @@ -0,0 +1,23 @@ +import 'dart:convert' show json; + +class ProductionCompanie { + int id; + String logoPath; + String name; + String originCountry; + + ProductionCompanie.fromParams( + {this.id, this.logoPath, this.name, this.originCountry}); + + ProductionCompanie.fromJson(jsonRes) { + id = jsonRes['id']; + logoPath = jsonRes['logo_path']; + name = jsonRes['name']; + originCountry = jsonRes['origin_country']; + } + + @override + String toString() { + return '{"id": $id,"logo_path": ${logoPath != null ? '${json.encode(logoPath)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"origin_country": ${originCountry != null ? '${json.encode(originCountry)}' : 'null'}}'; + } +} diff --git a/lib/models/release_date_model.dart b/lib/models/release_date_model.dart new file mode 100644 index 00000000..08a74182 --- /dev/null +++ b/lib/models/release_date_model.dart @@ -0,0 +1,72 @@ +import 'dart:convert' show json; + +class ReleaseDateModel { + + int id; + List results; + + ReleaseDateModel.fromParams({this.id, this.results}); + + factory ReleaseDateModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new ReleaseDateModel.fromJson(json.decode(jsonStr)) : new ReleaseDateModel.fromJson(jsonStr); + + ReleaseDateModel.fromJson(jsonRes) { + id = jsonRes['id']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']){ + results.add(resultsItem == null ? null : new ReleaseDateResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"id": $id,"results": $results}'; + } +} + +class ReleaseDateResult { + + String iso31661; + List releaseDates; + + ReleaseDateResult.fromParams({this.iso31661, this.releaseDates}); + + ReleaseDateResult.fromJson(jsonRes) { + iso31661 = jsonRes['iso_3166_1']; + releaseDates = jsonRes['release_dates'] == null ? null : []; + + for (var releaseDatesItem in releaseDates == null ? [] : jsonRes['release_dates']){ + releaseDates.add(releaseDatesItem == null ? null : new ReleaseDateInfo.fromJson(releaseDatesItem)); + } + } + + @override + String toString() { + return '{"iso_3166_1": ${iso31661 != null?'${json.encode(iso31661)}':'null'},"release_dates": $releaseDates}'; + } +} + +class ReleaseDateInfo { + + int type; + String certification; + String iso6391; + String note; + String releaseDate; + + ReleaseDateInfo.fromParams({this.type, this.certification, this.iso6391, this.note, this.releaseDate}); + + ReleaseDateInfo.fromJson(jsonRes) { + type = jsonRes['type']; + certification = jsonRes['certification']; + iso6391 = jsonRes['iso_639_1']; + note = jsonRes['note']; + releaseDate = jsonRes['release_date']; + } + + @override + String toString() { + return '{"type": $type,"certification": ${certification != null?'${json.encode(certification)}':'null'},"iso_639_1": ${iso6391 != null?'${json.encode(iso6391)}':'null'},"note": ${note != null?'${json.encode(note)}':'null'},"release_date": ${releaseDate != null?'${json.encode(releaseDate)}':'null'}}'; + } +} + diff --git a/lib/models/response_model.dart b/lib/models/response_model.dart new file mode 100644 index 00000000..f3c15d25 --- /dev/null +++ b/lib/models/response_model.dart @@ -0,0 +1,7 @@ +class ResponseModel { + final int statusCode; + final String message; + final T result; + ResponseModel({this.message, this.result, this.statusCode}); + bool get success => [200, 201].contains(statusCode); +} diff --git a/lib/models/review.dart b/lib/models/review.dart new file mode 100644 index 00000000..f45963ed --- /dev/null +++ b/lib/models/review.dart @@ -0,0 +1,54 @@ +import 'dart:convert' show json; + +class ReviewModel { + + int id; + int page; + int totalPages; + int totalResults; + List results; + + ReviewModel.fromParams({this.id, this.page, this.totalPages, this.totalResults, this.results}); + + factory ReviewModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new ReviewModel.fromJson(json.decode(jsonStr)) : new ReviewModel.fromJson(jsonStr); + + ReviewModel.fromJson(jsonRes) { + id = jsonRes['id']; + page = jsonRes['page']; + totalPages = jsonRes['total_pages']; + totalResults = jsonRes['total_results']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']){ + results.add(resultsItem == null ? null : new ReviewResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"id": $id,"page": $page,"total_pages": $totalPages,"total_results": $totalResults,"results": $results}'; + } +} + +class ReviewResult { + + String author; + String content; + String id; + String url; + + ReviewResult.fromParams({this.author, this.content, this.id, this.url}); + + ReviewResult.fromJson(jsonRes) { + author = jsonRes['author']; + content = jsonRes['content']; + id = jsonRes['id']; + url = jsonRes['url']; + } + + @override + String toString() { + return '{"author": ${author != null?'${json.encode(author)}':'null'},"content": ${content != null?'${json.encode(content)}':'null'},"id": ${id != null?'${json.encode(id)}':'null'},"url": ${url != null?'${json.encode(url)}':'null'}}'; + } +} + diff --git a/lib/models/search_result.dart b/lib/models/search_result.dart new file mode 100644 index 00000000..868fbfab --- /dev/null +++ b/lib/models/search_result.dart @@ -0,0 +1,190 @@ +import 'dart:convert' show json; + +class SearchResultModel { + int page; + int totalPages; + int totalResults; + List results; + + SearchResultModel.fromParams( + {this.page, this.totalPages, this.totalResults, this.results}); + + factory SearchResultModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new SearchResultModel.fromJson(json.decode(jsonStr)) + : new SearchResultModel.fromJson(jsonStr); + + SearchResultModel.fromJson(jsonRes) { + page = jsonRes['page']; + totalPages = jsonRes['total_pages']; + totalResults = jsonRes['total_results']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']) { + results.add( + resultsItem == null ? null : new SearchResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"page": $page,"total_pages": $totalPages,"total_results": $totalResults,"results": $results}'; + } +} + +class SearchResult { + int id; + double voteAverage; + int voteCount; + double popularity; + bool adult; + bool video; + String backdropPath; + String firstAirDate; + String mediaType; + String name; + String originalLanguage; + String originalName; + String originalTitle; + String overview; + String posterPath; + String profilePath; + String releaseDate; + String title; + List genreIds; + List knownFor; + List originCountry; + bool liked; + + SearchResult.fromParams( + {this.id, + this.voteAverage, + this.voteCount, + this.popularity, + this.adult, + this.video, + this.backdropPath, + this.firstAirDate, + this.mediaType, + this.name, + this.originalLanguage, + this.originalName, + this.originalTitle, + this.overview, + this.posterPath, + this.profilePath, + this.releaseDate, + this.title, + this.genreIds, + this.knownFor, + this.originCountry}); + + SearchResult.fromJson(jsonRes) { + id = jsonRes['id']; + popularity = double.parse(jsonRes['popularity']?.toString() ?? '0.0'); + voteAverage = double.parse(jsonRes['vote_average']?.toString() ?? '0.0'); + voteCount = jsonRes['vote_count']; + adult = jsonRes['adult']; + video = jsonRes['video']; + backdropPath = jsonRes['backdrop_path']; + firstAirDate = jsonRes['first_air_date']; + mediaType = jsonRes['media_type']; + name = jsonRes['name']; + originalLanguage = jsonRes['original_language']; + originalName = jsonRes['original_name']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + profilePath = jsonRes['profile_path']; + releaseDate = jsonRes['release_date']; + title = jsonRes['title']; + genreIds = jsonRes['genre_ids'] == null ? null : []; + + for (var genreIdsItem in genreIds == null ? [] : jsonRes['genre_ids']) { + genreIds.add(genreIdsItem); + } + + knownFor = jsonRes['known_for'] == null ? null : []; + + for (var knownForItem + in knownFor == null ? [] : [] /*jsonRes['known_for']*/) { + knownFor.add( + knownForItem == null ? null : new KnownFor.fromJson(knownForItem)); + } + + originCountry = jsonRes['origin_country'] == null ? null : []; + + for (var originCountryItem + in originCountry == null ? [] : jsonRes['origin_country']) { + originCountry.add(originCountryItem); + } + } + + @override + String toString() { + return '{"id": $id,"vote_average": $voteAverage,"vote_count": $voteCount,"popularity": $popularity,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"first_air_date": ${firstAirDate != null ? '${json.encode(firstAirDate)}' : 'null'},"media_type": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"original_language": ${originalLanguage != null ? '${json.encode(originalLanguage)}' : 'null'},"original_name": ${originalName != null ? '${json.encode(originalName)}' : 'null'},"original_title": ${originalTitle != null ? '${json.encode(originalTitle)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"profile_path": ${profilePath != null ? '${json.encode(profilePath)}' : 'null'},"release_date": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'},"title": ${title != null ? '${json.encode(title)}' : 'null'},"genre_ids": $genreIds,"known_for": $knownFor,"origin_country": $originCountry}'; + } +} + +class KnownFor { + double id; + double voteCount; + double popularity; + double voteAverage; + bool adult; + bool video; + String backdropPath; + String mediaType; + String originalLanguage; + String originalTitle; + String overview; + String posterPath; + String releaseDate; + String title; + List genreIds; + + KnownFor.fromParams( + {this.id, + this.voteCount, + this.popularity, + this.voteAverage, + this.adult, + this.video, + this.backdropPath, + this.mediaType, + this.originalLanguage, + this.originalTitle, + this.overview, + this.posterPath, + this.releaseDate, + this.title, + this.genreIds}); + + KnownFor.fromJson(jsonRes) { + id = double.parse(jsonRes['id']?.toString() ?? '0.0'); + voteCount = double.parse(jsonRes['vote_count']?.toString() ?? '0.0'); + popularity = double.parse(jsonRes['popularity']?.toString() ?? '0.0'); + voteAverage = double.parse(jsonRes['vote_average']?.toString() ?? '0.0'); + adult = jsonRes['adult']; + video = jsonRes['video']; + backdropPath = jsonRes['backdrop_path']; + mediaType = jsonRes['media_type']; + originalLanguage = jsonRes['original_language']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + releaseDate = jsonRes['release_date']; + title = jsonRes['title']; + genreIds = jsonRes['genre_ids'] == null ? null : []; + + for (var genreIdsItem in genreIds == null ? [] : jsonRes['genre_ids']) { + genreIds.add(genreIdsItem); + } + } + + @override + String toString() { + return '{"id": $id,"vote_count": $voteCount,"popularity": $popularity,"vote_average": $voteAverage,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"media_type": ${mediaType != null ? '${json.encode(mediaType)}' : 'null'},"original_language": ${originalLanguage != null ? '${json.encode(originalLanguage)}' : 'null'},"original_title": ${originalTitle != null ? '${json.encode(originalTitle)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"release_date": ${releaseDate != null ? '${json.encode(releaseDate)}' : 'null'},"title": ${title != null ? '${json.encode(title)}' : 'null'},"genre_ids": $genreIds}'; + } +} diff --git a/lib/models/season_detail.dart b/lib/models/season_detail.dart new file mode 100644 index 00000000..0a51f13d --- /dev/null +++ b/lib/models/season_detail.dart @@ -0,0 +1,62 @@ +import 'dart:convert' show json; + +import 'credits_model.dart'; +import 'episode_model.dart'; + +class Season { + int id; + int seasonNumber; + int episodeCount; + String uid; + String airDate; + String name; + String overview; + String posterPath; + List episodes; + List playStates; + CreditsModel credits; + + Season.fromParams( + {this.id, + this.episodeCount, + this.seasonNumber, + this.uid, + this.airDate, + this.name, + this.overview, + this.posterPath, + this.episodes, + this.credits}); + + factory Season(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new Season.fromJson(json.decode(jsonStr)) + : new Season.fromJson(jsonStr); + + Season.fromJson(jsonRes) { + id = jsonRes['id']; + episodeCount = jsonRes['episode_count']; + seasonNumber = jsonRes['season_number']; + uid = jsonRes['_id']; + airDate = jsonRes['air_date']; + name = jsonRes['name']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + episodes = jsonRes['episodes'] == null ? null : []; + + for (var episodesItem in episodes == null ? [] : jsonRes['episodes']) { + episodes.add( + episodesItem == null ? null : new Episode.fromJson(episodesItem)); + } + + credits = jsonRes['credits'] == null + ? null + : new CreditsModel.fromJson(jsonRes['credits']); + } + + @override + String toString() { + return '{"id": $id,"episode_count": $episodeCount,"season_number": $seasonNumber,"_id": ${uid != null ? '${json.encode(uid)}' : 'null'},"air_date": ${airDate != null ? '${json.encode(airDate)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"episodes": $episodes,"credits": $credits}'; + } +} diff --git a/lib/models/sort_condition.dart b/lib/models/sort_condition.dart new file mode 100644 index 00000000..48114f80 --- /dev/null +++ b/lib/models/sort_condition.dart @@ -0,0 +1,7 @@ +class SortCondition { + String name; + bool isSelected; + T value; + + SortCondition({this.name, this.isSelected, this.value}); +} diff --git a/lib/models/tvshow_detail.dart b/lib/models/tvshow_detail.dart new file mode 100644 index 00000000..e5e153ae --- /dev/null +++ b/lib/models/tvshow_detail.dart @@ -0,0 +1,358 @@ +import 'dart:convert' show json; + +import 'package:movie/models/external_ids_model.dart'; +import 'package:movie/models/production_companie.dart'; +import 'package:movie/models/season_detail.dart'; + +import 'credits_model.dart'; +import 'image_model.dart'; +import 'keyword.dart'; +import 'review.dart'; +import 'video_list.dart'; + +class TVDetailModel { + int id; + int numberOfEpisodes; + int numberOfSeasons; + double voteAverage; + int voteCount; + double popularity; + bool inProduction; + String backdropPath; + String firstAirDate; + String homepage; + String lastAirDate; + String name; + String originalLanguage; + String originalName; + String overview; + String posterPath; + String status; + String type; + List createdBy; + List episodeRunTime; + List genres; + List languages; + List networks; + List originCountry; + List productionCompanies; + List seasons; + AirData lastEpisodeToAir; + AirData nextEpisodeToAir; + CreditsModel credits; + ImageModel images; + KeyWordModel keywords; + VideoListModel recommendations; + ReviewModel reviews; + ExternalIdsModel externalIds; + ContentRatingModel contentRatings; + + TVDetailModel.fromParams( + {this.id, + this.numberOfEpisodes, + this.numberOfSeasons, + this.voteAverage, + this.voteCount, + this.popularity, + this.inProduction, + this.backdropPath, + this.firstAirDate, + this.homepage, + this.lastAirDate, + this.name, + this.originalLanguage, + this.originalName, + this.overview, + this.posterPath, + this.status, + this.type, + this.createdBy, + this.episodeRunTime, + this.genres, + this.languages, + this.networks, + this.originCountry, + this.productionCompanies, + this.seasons, + this.lastEpisodeToAir, + this.nextEpisodeToAir, + this.credits, + this.images, + this.keywords, + this.recommendations, + this.reviews, + this.externalIds, + this.contentRatings}); + + factory TVDetailModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new TVDetailModel.fromJson(json.decode(jsonStr)) + : new TVDetailModel.fromJson(jsonStr); + + TVDetailModel.fromJson(jsonRes) { + id = jsonRes['id']; + numberOfEpisodes = jsonRes['number_of_episodes']; + numberOfSeasons = jsonRes['number_of_seasons']; + voteAverage = double.parse(jsonRes['vote_average'].toString()); + voteCount = jsonRes['vote_count']; + popularity = double.parse(jsonRes['popularity'].toString()); + inProduction = jsonRes['in_production']; + backdropPath = jsonRes['backdrop_path']; + firstAirDate = jsonRes['first_air_date']; + homepage = jsonRes['homepage']; + lastAirDate = jsonRes['last_air_date']; + name = jsonRes['name']; + originalLanguage = jsonRes['original_language']; + originalName = jsonRes['original_name']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + status = jsonRes['status']; + type = jsonRes['type']; + createdBy = jsonRes['created_by'] == null ? null : []; + + for (var created_byItem in createdBy == null ? [] : jsonRes['created_by']) { + createdBy.add(created_byItem == null + ? null + : new CreatedBy.fromJson(created_byItem)); + } + + episodeRunTime = jsonRes['episode_run_time'] == null ? null : []; + + for (var episode_run_timeItem + in episodeRunTime == null ? [] : jsonRes['episode_run_time']) { + episodeRunTime.add(episode_run_timeItem); + } + + genres = jsonRes['genres'] == null ? null : []; + + for (var genresItem in genres == null ? [] : jsonRes['genres']) { + genres.add(genresItem == null ? null : new Genre.fromJson(genresItem)); + } + + languages = jsonRes['languages'] == null ? null : []; + + for (var languagesItem in languages == null ? [] : jsonRes['languages']) { + languages.add(languagesItem); + } + + networks = jsonRes['networks'] == null ? null : []; + + for (var networksItem in networks == null ? [] : jsonRes['networks']) { + networks.add( + networksItem == null ? null : new NetWork.fromJson(networksItem)); + } + + originCountry = jsonRes['origin_country'] == null ? null : []; + + for (var origin_countryItem + in originCountry == null ? [] : jsonRes['origin_country']) { + originCountry.add(origin_countryItem); + } + + productionCompanies = jsonRes['production_companies'] == null ? null : []; + + for (var production_companiesItem + in productionCompanies == null ? [] : jsonRes['production_companies']) { + productionCompanies.add(production_companiesItem == null + ? null + : new ProductionCompanie.fromJson(production_companiesItem)); + } + + seasons = jsonRes['seasons'] == null ? null : []; + + for (var seasonsItem in seasons == null ? [] : jsonRes['seasons']) { + seasons + .add(seasonsItem == null ? null : new Season.fromJson(seasonsItem)); + } + + lastEpisodeToAir = jsonRes['last_episode_to_air'] == null + ? null + : new AirData.fromJson(jsonRes['last_episode_to_air']); + nextEpisodeToAir = jsonRes['next_episode_to_air'] == null + ? null + : new AirData.fromJson(jsonRes['next_episode_to_air']); + credits = jsonRes['credits'] == null + ? null + : new CreditsModel.fromJson(jsonRes['credits']); + images = jsonRes['images'] == null + ? null + : new ImageModel.fromJson(jsonRes['images']); + keywords = jsonRes['keywords'] == null + ? null + : new KeyWordModel.fromJson(jsonRes['keywords']); + recommendations = jsonRes['recommendations'] == null + ? null + : new VideoListModel.fromJson(jsonRes['recommendations']); + reviews = jsonRes['reviews'] == null + ? null + : new ReviewModel.fromJson(jsonRes['reviews']); + externalIds = jsonRes['external_ids'] == null + ? null + : new ExternalIdsModel.fromJson(jsonRes['external_ids']); + contentRatings = jsonRes['content_ratings'] == null + ? null + : new ContentRatingModel.fromJson(jsonRes['content_ratings']); + } + + @override + String toString() { + return '{"id": $id,"number_of_episodes": $numberOfEpisodes,"number_of_seasons": $numberOfSeasons,"vote_average": $voteAverage,"vote_count": $voteCount,"popularity": $popularity,"in_production": $inProduction,"backdrop_path": ${backdropPath != null ? '${json.encode(backdropPath)}' : 'null'},"first_air_date": ${firstAirDate != null ? '${json.encode(firstAirDate)}' : 'null'},"homepage": ${homepage != null ? '${json.encode(homepage)}' : 'null'},"last_air_date": ${lastAirDate != null ? '${json.encode(lastAirDate)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"original_language": ${originalLanguage != null ? '${json.encode(originalLanguage)}' : 'null'},"original_name": ${originalName != null ? '${json.encode(originalName)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"poster_path": ${posterPath != null ? '${json.encode(posterPath)}' : 'null'},"status": ${status != null ? '${json.encode(status)}' : 'null'},"type": ${type != null ? '${json.encode(type)}' : 'null'},"created_by": $createdBy,"episode_run_time": $episodeRunTime,"genres": $genres,"languages": $languages,"networks": $networks,"origin_country": $originCountry,"production_companies": $productionCompanies,"seasons": $seasons,"last_episode_to_air": $lastEpisodeToAir,"next_episode_to_air": $nextEpisodeToAir,"credits": $credits,"images": $images,"keywords": $keywords,"recommendations": $recommendations,"reviews": $reviews,"externalids":$externalIds,"contentRatings":$contentRatings}'; + } +} + +class AirData { + Object stillPath; + int episodeNumber; + int id; + int seasonNumber; + int showId; + double voteAverage; + int voteCount; + String airDate; + String name; + String overview; + String productionCode; + + AirData.fromParams( + {this.stillPath, + this.episodeNumber, + this.id, + this.seasonNumber, + this.showId, + this.voteAverage, + this.voteCount, + this.airDate, + this.name, + this.overview, + this.productionCode}); + + AirData.fromJson(jsonRes) { + stillPath = jsonRes['still_path']; + episodeNumber = jsonRes['episode_number']; + id = jsonRes['id']; + seasonNumber = jsonRes['season_number']; + showId = jsonRes['show_id']; + voteAverage = double.parse(jsonRes['vote_average'].toString()); + voteCount = jsonRes['vote_count']; + airDate = jsonRes['air_date']; + name = jsonRes['name']; + overview = jsonRes['overview']; + productionCode = jsonRes['production_code']; + } + + get profilePath => null; + + @override + String toString() { + return '{"still_path": $stillPath,"episode_number": $episodeNumber,"id": $id,"season_number": $seasonNumber,"show_id": $showId,"vote_average": $voteAverage,"vote_count": $voteCount,"air_date": ${airDate != null ? '${json.encode(airDate)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"overview": ${overview != null ? '${json.encode(overview)}' : 'null'},"production_code": ${productionCode != null ? '${json.encode(productionCode)}' : 'null'}}'; + } +} + +class NetWork { + int id; + String logoPath; + String name; + String originCountry; + + NetWork.fromParams({this.id, this.logoPath, this.name, this.originCountry}); + + NetWork.fromJson(jsonRes) { + id = jsonRes['id']; + logoPath = jsonRes['logo_path']; + name = jsonRes['name']; + originCountry = jsonRes['origin_country']; + } + + @override + String toString() { + return '{"id": $id,"logo_path": ${logoPath != null ? '${json.encode(logoPath)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'},"origin_country": ${originCountry != null ? '${json.encode(originCountry)}' : 'null'}}'; + } +} + +class Genre { + int id; + String name; + + Genre.fromParams({this.id, this.name}); + + Genre.fromJson(jsonRes) { + id = jsonRes['id']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"id": $id,"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} + +class CreatedBy { + Object profilePath; + int gender; + int id; + String creditId; + String name; + + CreatedBy.fromParams( + {this.profilePath, this.gender, this.id, this.creditId, this.name}); + + CreatedBy.fromJson(jsonRes) { + profilePath = jsonRes['profile_path']; + gender = jsonRes['gender']; + id = jsonRes['id']; + creditId = jsonRes['credit_id']; + name = jsonRes['name']; + } + + @override + String toString() { + return '{"profile_path": $profilePath,"gender": $gender,"id": $id,"credit_id": ${creditId != null ? '${json.encode(creditId)}' : 'null'},"name": ${name != null ? '${json.encode(name)}' : 'null'}}'; + } +} + +class ContentRatingModel { + int id; + List results; + + ContentRatingModel.fromParams({this.id, this.results}); + + factory ContentRatingModel(jsonStr) => jsonStr == null + ? null + : jsonStr is String + ? new ContentRatingModel.fromJson(json.decode(jsonStr)) + : new ContentRatingModel.fromJson(jsonStr); + + ContentRatingModel.fromJson(jsonRes) { + id = jsonRes['id']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']) { + results.add(resultsItem == null + ? null + : new ContentRatingResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"id": $id,"results": $results}'; + } +} + +class ContentRatingResult { + String iso31661; + String rating; + + ContentRatingResult.fromParams({this.iso31661, this.rating}); + + ContentRatingResult.fromJson(jsonRes) { + iso31661 = jsonRes['iso_3166_1']; + rating = jsonRes['rating']; + } + + @override + String toString() { + return '{"iso_3166_1": ${iso31661 != null ? '${json.encode(iso31661)}' : 'null'},"rating": ${rating != null ? '${json.encode(rating)}' : 'null'}}'; + } +} diff --git a/lib/models/video_list.dart b/lib/models/video_list.dart new file mode 100644 index 00000000..aa773bed --- /dev/null +++ b/lib/models/video_list.dart @@ -0,0 +1,117 @@ +import 'dart:convert' show json; + +class VideoListModel { + + int page; + int totalPages; + int totalResults; + List< VideoListResult> results; + DateString dates; + + VideoListModel.fromParams({this.page, this.totalPages, this.totalResults, this.results, this.dates}); + + factory VideoListModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new VideoListModel.fromJson(json.decode(jsonStr)) : new VideoListModel.fromJson(jsonStr); + + VideoListModel.fromJson(jsonRes) { + page = jsonRes['page']; + totalPages = jsonRes['total_pages']; + totalResults = jsonRes['total_results']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']){ + results.add(resultsItem == null ? null : new VideoListResult.fromJson(resultsItem)); + } + + dates = jsonRes['dates'] == null ? null : new DateString.fromJson(jsonRes['dates']); + } + + @override + String toString() { + return '{"page": $page,"total_pages": $totalPages,"total_results": $totalResults,"results": $results,"dates": $dates}'; + } +} + +class DateString { + + String maximum; + String minimum; + + DateString.fromParams({this.maximum, this.minimum}); + + DateString.fromJson(jsonRes) { + maximum = jsonRes['maximum']; + minimum = jsonRes['minimum']; + } + + @override + String toString() { + return '{"maximum": ${maximum != null?'${json.encode(maximum)}':'null'},"minimum": ${minimum != null?'${json.encode(minimum)}':'null'}}'; + } +} + +class VideoListResult { + + int id; + int voteCount; + double popularity; + double voteAverage; + bool adult; + bool video; + double rating; + String backdropPath; + String originalLanguage; + List originCountry; + String originalTitle; + String originalName; + String firstAirDate; + String name; + String overview; + String posterPath; + String releaseDate; + String title; + List genreIds; + String season; + String nextEpisodeName; + String nextEpisodeNumber; + String nextAirDate; + String mediaType; + + VideoListResult.fromParams({this.id,this.rating,this.nextEpisodeName,this.nextEpisodeNumber,this.nextAirDate,this.season, this.voteCount, this.popularity, this.voteAverage, this.adult, this.video, this.backdropPath, this.originalLanguage, this.originalTitle, this.overview, this.posterPath, this.releaseDate, this.title, this.genreIds,this.firstAirDate, this.name, this.originalName, this.originCountry,this.mediaType}); + + VideoListResult.fromJson(jsonRes) { + id = jsonRes['id']; + voteCount = jsonRes['vote_count']; + popularity =double.tryParse(jsonRes['popularity'].toString()); + voteAverage =double.parse(jsonRes['vote_average'].toString()); + rating =double.parse(jsonRes['rating']?.toString()??'0.0'); + adult = jsonRes['adult']; + video = jsonRes['video']; + backdropPath = jsonRes['backdrop_path']; + originalLanguage = jsonRes['original_language']; + originalTitle = jsonRes['original_title']; + overview = jsonRes['overview']; + posterPath = jsonRes['poster_path']; + releaseDate = jsonRes['release_date']; + title = jsonRes['title']; + genreIds = jsonRes['genre_ids'] == null ? null : []; + originalName = jsonRes['original_name']; + name = jsonRes['name']; + firstAirDate = jsonRes['first_air_date']; + originCountry = jsonRes['origin_country'] == null ? null : []; + mediaType=jsonRes['media_type']; + + for (var origin_countryItem in originCountry == null ? [] : jsonRes['origin_country']){ + originCountry.add(origin_countryItem); + } + + for (var genre_idsItem in genreIds == null ? [] : jsonRes['genre_ids']){ + genreIds.add(genre_idsItem); + } + } + + @override + String toString() { + return '{"id": $id,"rating": $rating,"mediaType":$mediaType,"vote_count": $voteCount,"popularity": $popularity,"vote_average": $voteAverage,"adult": $adult,"video": $video,"backdrop_path": ${backdropPath != null?'${json.encode(backdropPath)}':'null'},"original_language": ${originalLanguage != null?'${json.encode(originalLanguage)}':'null'},"original_title": ${originalTitle != null?'${json.encode(originalTitle)}':'null'},"overview": ${overview != null?'${json.encode(overview)}':'null'},"poster_path": ${posterPath != null?'${json.encode(posterPath)}':'null'},"release_date": ${releaseDate != null?'${json.encode(releaseDate)}':'null'},"title": ${title != null?'${json.encode(title)}':'null'},"genre_ids": $genreIds,"first_air_date": ${firstAirDate != null?'${json.encode(firstAirDate)}':'null'},"name": ${name != null?'${json.encode(name)}':'null'},"original_language": ${originalLanguage != null?'${json.encode(originalLanguage)}':'null'},"original_name": ${originalName != null?'${json.encode(originalName)}':'null'},"origin_country": $originCountry}'; + } +} + diff --git a/lib/models/video_model.dart b/lib/models/video_model.dart new file mode 100644 index 00000000..a9ea29f6 --- /dev/null +++ b/lib/models/video_model.dart @@ -0,0 +1,56 @@ +import 'dart:convert' show json; + +class VideoModel { + + int id; + List results; + + VideoModel.fromParams({this.id, this.results}); + + factory VideoModel(jsonStr) => jsonStr == null ? null : jsonStr is String ? new VideoModel.fromJson(json.decode(jsonStr)) : new VideoModel.fromJson(jsonStr); + + VideoModel.fromJson(jsonRes) { + id = jsonRes['id']; + results = jsonRes['results'] == null ? null : []; + + for (var resultsItem in results == null ? [] : jsonRes['results']){ + results.add(resultsItem == null ? null : new VideoResult.fromJson(resultsItem)); + } + } + + @override + String toString() { + return '{"id": $id,"results": $results}'; + } +} + +class VideoResult { + + int size; + String id; + String iso_3166_1; + String iso_639_1; + String key; + String name; + String site; + String type; + + VideoResult.fromParams({this.size, this.id, this.iso_3166_1, this.iso_639_1, this.key, this.name, this.site, this.type}); + + VideoResult.fromJson(jsonRes) { + size = jsonRes['size']; + id = jsonRes['id']; + iso_3166_1 = jsonRes['iso_3166_1']; + iso_639_1 = jsonRes['iso_639_1']; + key = jsonRes['key']; + name = jsonRes['name']; + site = jsonRes['site']; + type = jsonRes['type']; + } + + @override + String toString() { + return '{"size": $size,"id": ${id != null?'${json.encode(id)}':'null'},"iso_3166_1": ${iso_3166_1 != null?'${json.encode(iso_3166_1)}':'null'},"iso_639_1": ${iso_639_1 != null?'${json.encode(iso_639_1)}':'null'},"key": ${key != null?'${json.encode(key)}':'null'},"name": ${name != null?'${json.encode(name)}':'null'},"site": ${site != null?'${json.encode(site)}':'null'},"type": ${type != null?'${json.encode(type)}':'null'}}'; + } +} + diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart new file mode 100644 index 00000000..64711372 --- /dev/null +++ b/lib/routes/routes.dart @@ -0,0 +1,102 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/views/views.dart'; + +class Routes { + static final PageRoutes routes = PageRoutes( + pages: >{ + 'startpage': StartPage(), + 'mainpage': MainPage(), + 'homePage': HomePage(), + 'discoverPage': DiscoverPage(), + 'comingPage': ComingPage(), + 'loginpage': LoginPage(), + 'trendingPage': TrendingPage(), + 'peopledetailpage': PeopleDetailPage(), + 'seasondetailpage': SeasonDetailPage(), + 'episodedetailpage': EpisodeDetailPage(), + 'MoreMediaPage': MoreMediaPage(), + 'seasonsPage': SeasonsPage(), + 'myListsPage': MyListsPage(), + 'ListDetailPage': ListDetailPage(), + 'favoritesPage': FavoritesPage(), + 'watchlistPage': WatchlistPage(), + 'watchlistDetailPage': WatchlistDetailPage(), + 'detailpage': MovieDetailPage(), + 'galleryPage': GalleryPage(), + 'registerPage': RegisterPage(), + 'createListPage': CreateListPage(), + 'allStreamLinkPage': AllStreamLinkPage(), + 'seasonLinkPage': SeasonLinkPage(), + 'testPage': TestPage(), + 'settingPage': SettingPage(), + 'paymentPage': PaymentPage(), + 'premiumPage': PremiumPage(), + 'checkoutPage': CheckOutPage(), + 'downloadPage': DownloadPage(), + 'tvShowDetailPage': TvShowDetailPage(), + 'notificationPage': NotificationPage(), + 'episodeLiveStreamPage': EpisodeLiveStreamPage(), + 'movieLiveStreamPage': MovieLiveStreamPage(), + 'castListPage': CastListPage(), + 'castListDetailPage': CastListDetailPage(), + 'testAccountPage': AccountPage(), + }, + visitor: (String path, Page page) { + if (page.isTypeof()) { + page.connectExtraStore(GlobalStore.store, + (Object pagestate, GlobalState appState) { + final GlobalBaseState p = pagestate; + if (p.themeColor != appState.themeColor || + p.locale != appState.locale || + p.user != appState.user) { + if (pagestate is Cloneable) { + final Object copy = pagestate.clone(); + final GlobalBaseState newState = copy; + newState.themeColor = appState.themeColor; + newState.locale = appState.locale; + newState.user = appState.user; + return newState; + } + } + return pagestate; + }); + } + page.enhancer.append( + /// View AOP + viewMiddleware: >[ + safetyView(), + ], + + /// Adapter AOP + adapterMiddleware: >[ + safetyAdapter() + ], + + /// Effect AOP + effectMiddleware: [ + _pageAnalyticsMiddleware(), + ], + + /// Store AOP + middleware: >[ + logMiddleware(tag: page.runtimeType.toString()), + ], + ); + }, + ); +} + +EffectMiddleware _pageAnalyticsMiddleware() { + return (AbstractLogic logic, Store store) { + return (Effect effect) { + return (Action action, Context ctx) { + if (logic is Page && action.type is Lifecycle) { + print('${logic.runtimeType} ${action.type.toString()} '); + } + return effect?.call(action, ctx); + }; + }; + }; +} diff --git a/lib/style/test_inherited_widget.dart b/lib/style/test_inherited_widget.dart new file mode 100644 index 00000000..12446e86 --- /dev/null +++ b/lib/style/test_inherited_widget.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class TestInheritedWidget extends InheritedWidget { + TestInheritedWidget({@required this.counter, Widget child}) + : super(child: child); + final TestClass counter; + + static TestInheritedWidget of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(TestInheritedWidget oldWidget) { + return oldWidget.counter.value != counter.value; + } +} + +class TestClass { + String name; + int value; + TestClass({this.name, this.value}); +} diff --git a/lib/style/themestyle.dart b/lib/style/themestyle.dart new file mode 100644 index 00000000..d6f94e3b --- /dev/null +++ b/lib/style/themestyle.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class ThemeStyle { + static final lightTheme = ThemeData.light().copyWith( + tabBarTheme: TabBarTheme(labelColor: const Color(0xFF000000)), + backgroundColor: const Color(0xFFFFFFFF), + cardColor: const Color(0xFFFFFFFF), + bottomAppBarColor: const Color.fromRGBO(45, 45, 48, 1), + primaryColorLight: const Color(0xFFF5F5F5), + primaryColorDark: const Color(0xFFEEEEEE), + ); + static final darkTheme = ThemeData.dark().copyWith( + tabBarTheme: TabBarTheme(labelColor: const Color(0xFFFFFFFF)), + backgroundColor: const Color(0xFF303030), + bottomAppBarColor: const Color(0xFF191919), + cardColor: const Color(0xFF333333), + primaryColorLight: const Color(0xFF505050), + primaryColorDark: const Color(0xFF404040)); + static MediaQueryData _mediaQuery; + static ThemeData theme; + static ThemeData getTheme(BuildContext context) { + _mediaQuery = MediaQuery.of(context); + theme = _mediaQuery.platformBrightness == Brightness.light + ? lightTheme + : darkTheme; + return theme; + } +} diff --git a/lib/style/themestyle_widget.dart b/lib/style/themestyle_widget.dart new file mode 100644 index 00000000..d15234b3 --- /dev/null +++ b/lib/style/themestyle_widget.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/generated/i18n.dart'; +import 'themestyle.dart'; + +class ThemeStyleWidget extends StatefulWidget { + ThemeStyleWidget({@required this.child, Key key}) : super(key: key); + final Widget child; + static ThemeStyleData of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType(); + @override + _ThemeStyleState createState() => _ThemeStyleState(); +} + +class _ThemeStyleState extends State { + @override + void initState() { + I18n.onLocaleChanged = onLocaleChange; + super.initState(); + } + + void onLocaleChange(Locale locale) { + setState(() { + I18n.locale = locale; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Builder( + builder: (c) { + final MediaQueryData _mediaQuery = MediaQuery.of(c); + final ThemeData _theme = + _mediaQuery.platformBrightness == Brightness.light + ? ThemeStyle.lightTheme + : ThemeStyle.darkTheme; + return ThemeStyleData(theme: _theme, child: widget.child); + }, + )); + } +} + +class ThemeStyleData extends InheritedWidget { + ThemeStyleData({@required this.theme, this.locale, Widget child}) + : super(child: child); + final ThemeData theme; + final Locale locale; + + static ThemeStyleData of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(ThemeStyleData oldWidget) { + return oldWidget.theme != theme || oldWidget.locale != locale; + } +} diff --git a/lib/views/account_page/action.dart b/lib/views/account_page/action.dart new file mode 100644 index 00000000..3b3a673a --- /dev/null +++ b/lib/views/account_page/action.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum AccountAction { action, onTabBarTap, navigatorPush, hideTip, showTip } + +class AccountActionCreator { + static Action onAction() { + return const Action(AccountAction.action); + } + + static Action onTabBarTap(int index) { + return Action(AccountAction.onTabBarTap, payload: index); + } + + static Action showTip(String tip) { + return Action(AccountAction.showTip, payload: tip); + } + + static Action hideTip() { + return const Action(AccountAction.hideTip); + } + + static Action navigatorPush(String routeName, {Object arguments}) { + return Action(AccountAction.navigatorPush, payload: [routeName, arguments]); + } +} diff --git a/lib/views/account_page/components/data_panel_component/action.dart b/lib/views/account_page/components/data_panel_component/action.dart new file mode 100644 index 00000000..47d119d6 --- /dev/null +++ b/lib/views/account_page/components/data_panel_component/action.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; + +enum DataPanelAction { action, updateDownloadTask, openDownloadManager } + +class DataPanelActionCreator { + static Action onAction() { + return const Action(DataPanelAction.action); + } + + static Action updateDownloadTask(List task) { + return Action(DataPanelAction.updateDownloadTask, payload: task); + } + + static Action openDownloadManager() { + return const Action(DataPanelAction.openDownloadManager); + } +} diff --git a/lib/views/account_page/components/data_panel_component/component.dart b/lib/views/account_page/components/data_panel_component/component.dart new file mode 100644 index 00000000..528745c1 --- /dev/null +++ b/lib/views/account_page/components/data_panel_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class DataPanelComponent extends Component { + DataPanelComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/account_page/components/data_panel_component/effect.dart b/lib/views/account_page/components/data_panel_component/effect.dart new file mode 100644 index 00000000..23bf38da --- /dev/null +++ b/lib/views/account_page/components/data_panel_component/effect.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + DataPanelAction.action: _onAction, + DataPanelAction.openDownloadManager: _openDownloadManager, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} +void _onInit(Action action, Context ctx) async { + final _task = await FlutterDownloader.loadTasks(); + if (_task != null) + ctx.dispatch(DataPanelActionCreator.updateDownloadTask(_task)); +} + +void _openDownloadManager(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('downloadPage'); +} diff --git a/lib/views/account_page/components/data_panel_component/reducer.dart b/lib/views/account_page/components/data_panel_component/reducer.dart new file mode 100644 index 00000000..2ff24a65 --- /dev/null +++ b/lib/views/account_page/components/data_panel_component/reducer.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + DataPanelAction.updateDownloadTask: _updateDownloadTask, + }, + ); +} + +DataPanelState _updateDownloadTask(DataPanelState state, Action action) { + final List _task = action.payload; + final DataPanelState newState = state.clone(); + newState.downloadTask = _task; + return newState; +} diff --git a/lib/views/account_page/components/data_panel_component/state.dart b/lib/views/account_page/components/data_panel_component/state.dart new file mode 100644 index 00000000..4e452220 --- /dev/null +++ b/lib/views/account_page/components/data_panel_component/state.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/views/account_page/state.dart'; + +class DataPanelState implements Cloneable { + List downloadTask; + @override + DataPanelState clone() { + return DataPanelState()..downloadTask = downloadTask; + } +} + +class DataPanelConnector extends ConnOp { + @override + DataPanelState get(AccountState state) { + DataPanelState substate = DataPanelState(); + substate.downloadTask = state.dataPanelState.downloadTask; + return substate; + } + + @override + void set(AccountState state, DataPanelState subState) { + state.dataPanelState = subState; + } +} diff --git a/lib/views/account_page/components/data_panel_component/view.dart b/lib/views/account_page/components/data_panel_component/view.dart new file mode 100644 index 00000000..95b5e3a4 --- /dev/null +++ b/lib/views/account_page/components/data_panel_component/view.dart @@ -0,0 +1,90 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + DataPanelState state, Dispatch dispatch, ViewService viewService) { + return _SecondPanel( + state: state, + openDownloadManager: () => + dispatch(DataPanelActionCreator.openDownloadManager()), + ); +} + +class _SecondPanel extends StatelessWidget { + final Function onTap; + final Function openDownloadManager; + final DataPanelState state; + const _SecondPanel({this.state, this.onTap, this.openDownloadManager}); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Container( + margin: EdgeInsets.only(bottom: 25), + height: Adapt.px(220), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: const Color(0xFF5568E8), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage('images/account_bar_background.png')), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _DataItem( + onTap: openDownloadManager, + title: 'Download', + value: '${state.downloadTask?.length ?? 0}', + ), + _DataItem( + title: 'What', + value: '80', + ), + _DataItem( + onTap: () async => Navigator.of(context).pushNamed('testPage'), + title: 'Here?', + value: '100', + ), + Icon( + Icons.keyboard_arrow_right, + color: const Color(0xFFFFFFFF), + size: 30, + ) + ]), + ), + ); + } +} + +class _DataItem extends StatelessWidget { + final String title; + final String value; + final Function onTap; + const _DataItem({this.onTap, this.title, this.value}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(value, + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontWeight: FontWeight.bold, + fontSize: Adapt.px(22), + )), + SizedBox(height: 5), + Text(title, + style: TextStyle( + color: const Color(0xFFFFFFFF), fontSize: Adapt.px(24))) + ], + ), + ); + } +} diff --git a/lib/views/account_page/components/settings_component/action.dart b/lib/views/account_page/components/settings_component/action.dart new file mode 100644 index 00000000..c25c1165 --- /dev/null +++ b/lib/views/account_page/components/settings_component/action.dart @@ -0,0 +1,57 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/item.dart'; + +enum SettingsAction { + action, + adultContentTapped, + adultContentUpadte, + notificationsTap, + notificationsUpdate, + checkUpdate, + languageTap, + setLanguage, + darkModeTap, + feedbackTap, +} + +class SettingsActionCreator { + static Action onAction() { + return const Action(SettingsAction.action); + } + + static Action notificationsTap() { + return const Action(SettingsAction.notificationsTap); + } + + static Action notificationsUpdate(bool enable) { + return Action(SettingsAction.notificationsUpdate, payload: enable); + } + + static Action adultContentTapped() { + return Action(SettingsAction.adultContentTapped); + } + + static Action adultContentUpadte(bool b) { + return Action(SettingsAction.adultContentUpadte, payload: b); + } + + static Action onCheckUpdate() { + return const Action(SettingsAction.checkUpdate); + } + + static Action darkModeTap() { + return const Action(SettingsAction.darkModeTap); + } + + static Action languageTap(Item language) { + return Action(SettingsAction.languageTap, payload: language); + } + + static Action setLanguage(Item language) { + return Action(SettingsAction.setLanguage, payload: language); + } + + static Action feedbackTap() { + return const Action(SettingsAction.feedbackTap); + } +} diff --git a/lib/views/account_page/components/settings_component/component.dart b/lib/views/account_page/components/settings_component/component.dart new file mode 100644 index 00000000..ff971f4b --- /dev/null +++ b/lib/views/account_page/components/settings_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SettingsComponent extends Component { + SettingsComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (o, n) { + return o.adultContent != n.adultContent || + o.appLanguage != n.appLanguage || + o.enableNotifications != n.enableNotifications; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/account_page/components/settings_component/effect.dart b/lib/views/account_page/components/settings_component/effect.dart new file mode 100644 index 00000000..e03f4dcd --- /dev/null +++ b/lib/views/account_page/components/settings_component/effect.dart @@ -0,0 +1,159 @@ +import 'dart:io'; +import 'dart:convert' show json; + +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/app_language.dart'; +import 'package:movie/actions/api/github_api.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/notification_topic.dart'; +import 'package:movie/actions/stream_link_convert/stream_link_convert_factory.dart'; +import 'package:movie/actions/version_comparison.dart'; +import 'package:movie/globalbasestate/action.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/item.dart'; +import 'package:movie/views/account_page/action.dart'; +import 'package:movie/widgets/update_info_dialog.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SettingsAction.action: _onAction, + SettingsAction.adultContentTapped: _adultContentTapped, + SettingsAction.languageTap: _languageTap, + SettingsAction.checkUpdate: _checkUpdate, + SettingsAction.darkModeTap: _darkModeTap, + SettingsAction.feedbackTap: _feedbackTap, + SettingsAction.notificationsTap: _notificationsTap, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _adultContentTapped(Action action, Context ctx) async { + final _b = !(ctx.state.adultContent ?? false); + ctx.dispatch(SettingsActionCreator.adultContentUpadte(_b)); + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setBool('adultItems', _b); + TMDBApi.instance.setAdultValue(_b); +} + +Future _checkUpdate(Action action, Context ctx) async { + if (!Platform.isAndroid) return; + + //ctx.dispatch(SettingPageActionCreator.onLoading(true)); + final _github = GithubApi.instance; + final _result = await _github.checkUpdate(); + if (_result.success) { + final _shouldUpdate = + VersionComparison().compare(ctx.state.version, _result.result.tagName); + final _apk = _result.result.assets.singleWhere( + (e) => e.contentType == 'application/vnd.android.package-archive'); + + if (_apk != null && _shouldUpdate) { + await showDialog( + context: ctx.context, + builder: (context) { + return UpdateInfoDialog( + version: _result.result.tagName, + describe: _result.result.body, + packageSize: (_apk.size / 1048576), + downloadUrl: _apk.browserDownloadUrl, + ); + }); + } else + Toast.show('Already up to date', ctx.context); + } else + Toast.show(_result.message, ctx.context); + //ctx.dispatch(SettingPageActionCreator.onLoading(false)); +} + +void _languageTap(Action action, Context ctx) async { + final Item _language = action.payload; + if (_language.name == ctx.state.appLanguage.name) return; + final Item _currentLanguage = ctx.state.appLanguage; + SharedPreferences _prefs = await SharedPreferences.getInstance(); + if (_language.name == 'System Default') + _prefs.remove('appLanguage'); + else + _prefs.setString('appLanguage', _language.toString()); + ctx.dispatch(SettingsActionCreator.setLanguage(_language)); + GlobalStore.store.dispatch(GlobalActionCreator.changeLocale( + _language.value == null ? null : Locale(_language.value))); + TMDBApi.instance.setLanguage(_language.value); + if (ctx.state.enableNotifications) { + final List _topics = List(); + final List _unsubscribetopics = List(); + + String _movieTypeUsbcirbed = _prefs.getString('movieTypeSubscribed'); + String _tvTypeUsbcirbed = _prefs.getString('tvTypeSubscribed'); + + final _movieGenres = (json.decode(_movieTypeUsbcirbed) as List) + .where((e) => e['value']) + .toList(); + final _tvGenres = (json.decode(_tvTypeUsbcirbed) as List) + .where((e) => e['value']) + .toList(); + + _unsubscribetopics.addAll(_movieGenres + .map((e) => 'movie_genre_${e['name']}_${_currentLanguage.value}') + .toList()); + _unsubscribetopics.addAll(_tvGenres + .map((e) => 'tvshow_genre_${e['name']}_${_currentLanguage.value}') + .toList()); + _topics.addAll(_movieGenres + .map((e) => 'movie_genre_${e['name']}_${_language.value}') + .toList()); + _topics.addAll(_tvGenres + .map((e) => 'tvshow_genre_${e['name']}_${_language.value}') + .toList()); + + NotificationTopic _topic = NotificationTopic(); + + _topic.unsubscribeFromTopic(_unsubscribetopics); + _topic.subscribeToTopic(_topics); + } +} + +void _darkModeTap(Action action, Context ctx) { + ctx.dispatch(AccountActionCreator.showTip('Unavailable at this moment')); + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); + print(_firebaseMessaging.getToken()); +} + +void _notificationsTap(Action action, Context ctx) async { + final _enable = ctx.state.enableNotifications; + ctx.dispatch(SettingsActionCreator.notificationsUpdate(!_enable)); + SharedPreferences _prefs = await SharedPreferences.getInstance(); + _prefs.setBool('enableNotifications', !_enable); + final List topics = List(); + final Item _language = await AppLanguage.instance.getApplanguage(); + String _movieTypeUsbcirbed = _prefs.getString('movieTypeSubscribed'); + String _tvTypeUsbcirbed = _prefs.getString('tvTypeSubscribed'); + final _movieGenres = (json.decode(_movieTypeUsbcirbed) as List) + .where((e) => e['value']) + .toList(); + final _tvGenres = + (json.decode(_tvTypeUsbcirbed) as List).where((e) => e['value']).toList(); + topics.addAll( + _movieGenres.map((e) => 'movie_genre_${e['name']}_${_language.value}')); + topics.addAll( + _tvGenres.map((e) => 'tvshow_genre_${e['name']}_${_language.value}')); + NotificationTopic _topic = NotificationTopic(); + if (_enable) + _topic.subscribeToTopic(topics); + else + _topic.unsubscribeFromTopic(topics); +} + +void _feedbackTap(Action action, Context ctx) async { + final _str = await StreamLinkConvertFactory.instance + .getLink('https://vidtodo.com/mhbv9re8oc7u'); + print(_str); + ctx.dispatch( + AccountActionCreator.showTip('Feedback unavailable at this moment')); +} diff --git a/lib/views/account_page/components/settings_component/reducer.dart b/lib/views/account_page/components/settings_component/reducer.dart new file mode 100644 index 00000000..d18b1eb4 --- /dev/null +++ b/lib/views/account_page/components/settings_component/reducer.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/item.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SettingsAction.action: _onAction, + SettingsAction.adultContentUpadte: _adultContentUpadte, + SettingsAction.setLanguage: _setLanguage, + SettingsAction.notificationsUpdate: _notificationsUpdate, + }, + ); +} + +SettingsState _onAction(SettingsState state, Action action) { + final SettingsState newState = state.clone(); + return newState; +} + +SettingsState _adultContentUpadte(SettingsState state, Action action) { + final bool _adult = action.payload; + final SettingsState newState = state.clone(); + newState.adultContent = _adult; + return newState; +} + +SettingsState _notificationsUpdate(SettingsState state, Action action) { + final bool _enbale = action.payload; + final SettingsState newState = state.clone(); + newState.enableNotifications = _enbale; + return newState; +} + +SettingsState _setLanguage(SettingsState state, Action action) { + Item _language = action.payload; + final SettingsState newState = state.clone(); + newState.appLanguage = _language; + return newState; +} diff --git a/lib/views/account_page/components/settings_component/state.dart b/lib/views/account_page/components/settings_component/state.dart new file mode 100644 index 00000000..d76d514e --- /dev/null +++ b/lib/views/account_page/components/settings_component/state.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/item.dart'; +import 'package:movie/views/account_page/state.dart'; + +class SettingsState implements Cloneable { + bool adultContent; + bool enableNotifications; + Item appLanguage; + String version; + @override + SettingsState clone() { + return SettingsState() + ..adultContent = adultContent + ..enableNotifications = enableNotifications + ..appLanguage = appLanguage + ..version = version; + } +} + +class SettingsConnector extends ConnOp { + @override + SettingsState get(AccountState state) { + SettingsState substate = state.settingsState; + return substate; + } + + @override + void set(AccountState state, SettingsState subState) { + state.settingsState = subState; + } +} diff --git a/lib/views/account_page/components/settings_component/view.dart b/lib/views/account_page/components/settings_component/view.dart new file mode 100644 index 00000000..1fd96743 --- /dev/null +++ b/lib/views/account_page/components/settings_component/view.dart @@ -0,0 +1,244 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/app_language.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/item.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + SettingsState state, Dispatch dispatch, ViewService viewService) { + return SliverList( + delegate: SliverChildListDelegate( + [ + _SettingGroup(children: [ + _SettingCell( + title: I18n.of(viewService.context).adultContent, + icon: state.adultContent + ? Icons.visibility + : Icons.visibility_off_outlined, + iconBackgroundColor: const Color(0xFF5568E8), + value: state.adultContent ? 'On' : 'Off', + onTap: () => dispatch(SettingsActionCreator.adultContentTapped()), + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: state.adultContent, + onChanged: (d) => dispatch( + SettingsActionCreator.adultContentTapped(), + ), + ), + ), + ), + SizedBox(height: 15), + _SettingCell( + title: I18n.of(viewService.context).notifications, + icon: FontAwesomeIcons.bell, + iconBackgroundColor: const Color(0xFF5568E8), + onTap: () => dispatch(SettingsActionCreator.notificationsTap()), + value: state.enableNotifications ? 'On' : 'Off', + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: state.enableNotifications, + onChanged: (d) => + dispatch(SettingsActionCreator.notificationsTap()), + ), + ), + ), + SizedBox(height: 15), + _SettingCell( + title: I18n.of(viewService.context).darkMode, + icon: Icons.wb_sunny_outlined, + iconBackgroundColor: const Color(0xFF28A74E), + value: 'System', + onTap: () => dispatch(SettingsActionCreator.darkModeTap()), + ), + SizedBox(height: 15), + _SettingCell( + title: I18n.of(viewService.context).language, + icon: Icons.language, + iconBackgroundColor: const Color(0xFF28A74E), + value: state.appLanguage?.name ?? 'System default', + onTap: () => showDialog( + context: viewService.context, + builder: (_) => _LanguageList( + onTap: (d) => dispatch(SettingsActionCreator.languageTap(d)), + selected: state.appLanguage, + ), + ), + ), + ]), + SizedBox(height: 20), + _SettingGroup(children: [ + _SettingCell( + title: I18n.of(viewService.context).feedback, + icon: Icons.question_answer, + iconBackgroundColor: const Color(0xFF3E3E3E), + onTap: () => dispatch(SettingsActionCreator.feedbackTap()), + ), + SizedBox(height: 15), + _SettingCell( + title: I18n.of(viewService.context).version, + icon: Icons.refresh, + iconBackgroundColor: const Color(0xFF3E3E3E), + value: '${state.version}', + onTap: () => dispatch(SettingsActionCreator.onCheckUpdate()), + ), + ]), + SizedBox(height: 15), + ], + )); +} + +class _SettingGroup extends StatelessWidget { + final List children; + const _SettingGroup({this.children}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + border: Border.all(color: _theme.primaryColorDark), + color: _theme.cardColor, + borderRadius: BorderRadius.circular(15)), + child: Column(children: children), + ); + } +} + +class _SettingCell extends StatelessWidget { + final String title; + final IconData icon; + final Color iconBackgroundColor; + final String value; + final Widget trailing; + final Function onTap; + const _SettingCell( + {Key key, + @required this.title, + @required this.icon, + this.iconBackgroundColor, + this.value, + this.trailing, + this.onTap}) + : assert(title != null), + super(key: key); + @override + Widget build(BuildContext context) { + return InkWell( + enableFeedback: false, + onTap: onTap, + child: Row(children: [ + Container( + width: Adapt.px(60), + height: Adapt.px(60), + decoration: BoxDecoration( + color: iconBackgroundColor, + borderRadius: BorderRadius.circular(Adapt.px(15))), + child: Icon( + icon, + color: const Color(0xFFFFFFFF), + size: 18, + ), + ), + SizedBox(width: 15), + Text( + title, + style: TextStyle(fontSize: Adapt.px(26)), + ), + Spacer(), + Padding( + padding: EdgeInsets.only(right: 5), + child: Text( + value ?? '', + style: TextStyle( + fontSize: Adapt.px(24), color: const Color(0xFF717171)), + ), + ), + trailing ?? + Icon( + Icons.keyboard_arrow_right, + color: const Color(0xFF9E9E9E), + ), + ])); + } +} + +class _LangageListCell extends StatelessWidget { + final Function onTap; + final Item language; + final bool selected; + const _LangageListCell({this.onTap, this.language, this.selected = false}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + onTap(language); + Navigator.of(context).pop(); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + decoration: selected + ? BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all(color: const Color(0xFFFFFFFF))) + : null, + child: Text( + language.name, + style: TextStyle(color: const Color(0xFFFFFFFF), fontSize: 14), + ), + ), + ); + } +} + +class _LanguageList extends StatelessWidget { + final Function(Item) onTap; + final Item selected; + const _LanguageList({this.onTap, this.selected}); + @override + Widget build(BuildContext context) { + final Size _size = MediaQuery.of(context).size; + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final List data = AppLanguage.instance.supportLanguages; + return SimpleDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + elevation: 0.0, + backgroundColor: _backGroundColor, + titleTextStyle: TextStyle(color: const Color(0xFFFFFFFF), fontSize: 18), + title: Text( + 'Support Language', + ), + children: [ + Container( + height: _size.height / 2, + width: _size.width, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 5.0), + separatorBuilder: (_, __) => SizedBox(height: 10), + physics: BouncingScrollPhysics(), + itemCount: data.length, + itemBuilder: (_, index) { + final _language = data[index]; + return _LangageListCell( + onTap: (l) => onTap(l), + selected: selected.name == _language.name, + language: _language, + ); + }, + ), + ), + ], + ); + } +} diff --git a/lib/views/account_page/components/user_data_component/action.dart b/lib/views/account_page/components/user_data_component/action.dart new file mode 100644 index 00000000..fac56781 --- /dev/null +++ b/lib/views/account_page/components/user_data_component/action.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_info.dart'; + +enum UserDataAction { action, navigatorPush, setInfo } + +class UserDataActionCreator { + static Action onAction() { + return const Action(UserDataAction.action); + } + + static Action navigatorPush(String routeName, {Object arguments}) { + return Action(UserDataAction.navigatorPush, + payload: [routeName, arguments]); + } + + static Action setInfo(AccountInfo info) { + return Action(UserDataAction.setInfo, payload: info); + } +} diff --git a/lib/views/account_page/components/user_data_component/component.dart b/lib/views/account_page/components/user_data_component/component.dart new file mode 100644 index 00000000..e1b8c76c --- /dev/null +++ b/lib/views/account_page/components/user_data_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class UserDataComponent extends Component { + UserDataComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (o, n) { + return o.user != n.user || o.info != n.info; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}, + ), + ); +} diff --git a/lib/views/account_page/components/user_data_component/effect.dart b/lib/views/account_page/components/user_data_component/effect.dart new file mode 100644 index 00000000..0a790dde --- /dev/null +++ b/lib/views/account_page/components/user_data_component/effect.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + UserDataAction.action: _onAction, + UserDataAction.navigatorPush: _navigatorPush, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + if (ctx.state.user?.firebaseUser == null || ctx.state.info != null) return; + final _result = await BaseApi.instance + .getUserAccountInfo(ctx.state.user.firebaseUser.uid); + if (_result.success) { + ctx.dispatch(UserDataActionCreator.setInfo(_result.result)); + } +} + +void _navigatorPush(Action action, Context ctx) async { + if (ctx.state.user?.firebaseUser == null) + await _onLogin(action, ctx); + else { + String routerName = action.payload[0]; + Object data = action.payload[1]; + await Navigator.of(ctx.context).pushNamed(routerName, arguments: data); + } +} + +Future _onLogin(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('loginpage'); +} diff --git a/lib/views/account_page/components/user_data_component/reducer.dart b/lib/views/account_page/components/user_data_component/reducer.dart new file mode 100644 index 00000000..01a9d5f7 --- /dev/null +++ b/lib/views/account_page/components/user_data_component/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_info.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + UserDataAction.action: _onAction, + UserDataAction.setInfo: _setInfo, + }, + ); +} + +UserDataState _onAction(UserDataState state, Action action) { + final UserDataState newState = state.clone(); + return newState; +} + +UserDataState _setInfo(UserDataState state, Action action) { + final AccountInfo _info = action.payload; + final UserDataState newState = state.clone(); + newState.info = _info; + return newState; +} diff --git a/lib/views/account_page/components/user_data_component/state.dart b/lib/views/account_page/components/user_data_component/state.dart new file mode 100644 index 00000000..3260b003 --- /dev/null +++ b/lib/views/account_page/components/user_data_component/state.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/account_info.dart'; +import 'package:movie/views/account_page/state.dart'; + +class UserDataState implements Cloneable { + AppUser user; + AccountInfo info; + @override + UserDataState clone() { + return UserDataState() + ..user = user + ..info = info; + } +} + +class UserDataConnector extends ConnOp { + @override + UserDataState get(AccountState state) { + UserDataState substate = state.userDataState.clone(); + substate.user = state.user; + return substate; + } + + @override + void set(AccountState state, UserDataState subState) { + state.userDataState = subState; + } +} diff --git a/lib/views/account_page/components/user_data_component/view.dart b/lib/views/account_page/components/user_data_component/view.dart new file mode 100644 index 00000000..b44cc80f --- /dev/null +++ b/lib/views/account_page/components/user_data_component/view.dart @@ -0,0 +1,119 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/account_info.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + UserDataState state, Dispatch dispatch, ViewService viewService) { + return _UserDataPanel( + dispatch: dispatch, + info: state.info, + ); +} + +class _UserDataPanel extends StatelessWidget { + final Dispatch dispatch; + final AccountInfo info; + const _UserDataPanel({this.dispatch, this.info}); + @override + Widget build(BuildContext context) { + return SliverGrid.count( + crossAxisCount: 2, + mainAxisSpacing: Adapt.px(35), + crossAxisSpacing: Adapt.px(35), + childAspectRatio: 1.2, + children: [ + _FeaturesCell( + title: 'Favorites', + value: '${info?.favorites ?? 0}', + icon: 'images/account_icon.png', + onTap: () => + dispatch(UserDataActionCreator.navigatorPush('favoritesPage')), + ), + _FeaturesCell( + title: 'My Lists', + value: '${info?.myLists ?? 0}', + icon: 'images/account_icon2.png', + onTap: () => + dispatch(UserDataActionCreator.navigatorPush('myListsPage')), + ), + _FeaturesCell( + title: 'Watch Lists', + value: '${info?.watchLists ?? 0}', + icon: 'images/account_icon3.png', + onTap: () => + dispatch(UserDataActionCreator.navigatorPush('watchlistPage')), + ), + _FeaturesCell( + title: 'Cast Lists', + value: '${info?.castLists ?? 0}', + icon: 'images/account_icon4.png', + onTap: () => + dispatch(UserDataActionCreator.navigatorPush('castListPage')), + ), + ], + ); + } +} + +class _FeaturesCell extends StatelessWidget { + final String title; + final String value; + final Function onTap; + final String icon; + const _FeaturesCell({this.title, this.value, this.onTap, this.icon}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + border: Border.all(color: _theme.primaryColorDark), + color: _theme.cardColor, + borderRadius: BorderRadius.circular(25), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: Adapt.px(100), + height: Adapt.px(80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: icon != null + ? DecorationImage( + fit: BoxFit.cover, + image: AssetImage(icon), + ) + : null, + ), + ), + SizedBox(height: Adapt.px(20)), + Text( + title, + style: TextStyle( + fontSize: Adapt.px(26), + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: Adapt.px(10)), + Text( + value, + style: TextStyle( + fontSize: Adapt.px(22), + color: const Color(0xFF717171), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/views/account_page/components/user_info_component/action.dart b/lib/views/account_page/components/user_info_component/action.dart new file mode 100644 index 00000000..33d78a23 --- /dev/null +++ b/lib/views/account_page/components/user_info_component/action.dart @@ -0,0 +1,36 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum UserInfoAction { + action, + openMenu, + signIn, + signOut, + openNotifications, + paymentTap +} + +class UserInfoActionCreator { + static Action onAction() { + return const Action(UserInfoAction.action); + } + + static Action openMenu() { + return const Action(UserInfoAction.openMenu); + } + + static Action signOut() { + return const Action(UserInfoAction.signOut); + } + + static Action signIn() { + return const Action(UserInfoAction.signIn); + } + + static Action openNotifications() { + return const Action(UserInfoAction.openNotifications); + } + + static Action paymentTap() { + return const Action(UserInfoAction.paymentTap); + } +} diff --git a/lib/views/account_page/components/user_info_component/component.dart b/lib/views/account_page/components/user_info_component/component.dart new file mode 100644 index 00000000..56e205d4 --- /dev/null +++ b/lib/views/account_page/components/user_info_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class UserInfoComponent extends Component { + UserInfoComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + shouldUpdate: (o, n) { + return o.user != n.user; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/account_page/components/user_info_component/component/about_page.dart b/lib/views/account_page/components/user_info_component/component/about_page.dart new file mode 100644 index 00000000..86955fd3 --- /dev/null +++ b/lib/views/account_page/components/user_info_component/component/about_page.dart @@ -0,0 +1,170 @@ +// import 'package:flutter/material.dart'; +// import 'package:movie/actions/adapt.dart'; +// import 'package:movie/app.dart'; + +// class AboutPage extends StatelessWidget { +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// // backgroundColor: Colors.grey, +// appBar: AppBar( +// title: Text("About"), +// ), +// body: Center( +// child: Container( +// // alignment: Alignment.center, +// child: Card( +// elevation: 8.0, +// // color: Colors.grey, +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// SizedBox( +// width: double.infinity, +// ), +// ClipRRect( +// borderRadius: BorderRadius.circular(50.0), +// child: Image( +// width: 200.0, +// height: 200.0, +// image: NetworkImage( +// 'https://avatars1.githubusercontent.com/u/41832833?s=400&u=f239e0720be62f57244156ced6fd830f1aa7e958&v=4'), +// ), +// ), +// SizedBox( +// height: 30.0, +// ), +// Text( +// "Developer and Maintained by", +// style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.w700), +// ), +// Text( +// "Tejaswa Gupta", +// style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.w300), +// ), +// ], +// ), +// ), +// ), +// ), +// ); +// } +// } + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; + +class AboutPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: ContactActionButton(), + appBar: AppBar( + title: Text("About"), + ), + backgroundColor: Colors.black, + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleAvatar( + radius: 50.0, + backgroundImage: NetworkImage( + 'https://avatars1.githubusercontent.com/u/41832833?s=400&u=f239e0720be62f57244156ced6fd830f1aa7e958&v=4'), + ), + SizedBox( + width: double.infinity, + ), + Text( + "Tejaswa Gupta", + style: TextStyle( + fontFamily: 'Rubik', + color: Colors.white, + fontSize: 40.0, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'Developer and Maintainer', + style: TextStyle( + fontSize: 15.0, + fontFamily: 'Sans', + color: Colors.white30, + letterSpacing: 1.5, + fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10.0, + width: 150, + child: Divider( + height: 16.0, + thickness: 0.5, + color: Colors.grey, + ), + ), + ], + ), + ), + ); + } +} + +class ContactActionButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return FloatingActionButton( + child: Icon(FontAwesomeIcons.addressCard), + onPressed: () => showModalBottomSheet( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0)), + context: context, + builder: (context) => ContactInfoList())); + } +} + +class ContactInfoList extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + color: Colors.black54, + child: Padding( + padding: EdgeInsets.only(top: 15.0, right: 10.0, left: 10.0), + child: Column( + children: [ + ContactTile( + icon: FontAwesomeIcons.github, + title: 'Github', + ), + ContactTile( + icon: FontAwesomeIcons.linkedinIn, + title: "LinkedIn", + ) + ], + ), + )); + } +} + +class ContactTile extends StatelessWidget { + IconData icon; + String title; + Function onCall; + + ContactTile({this.icon, this.title, this.onCall}); + + @override + Widget build(BuildContext context) { + return Card( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), + elevation: 8.0, + color: Colors.grey[900], + child: ListTile( + leading: Icon(icon), + title: Text(title), + onTap: onCall, + ), + ); + } +} diff --git a/lib/views/account_page/components/user_info_component/component/arrow_clipper.dart b/lib/views/account_page/components/user_info_component/component/arrow_clipper.dart new file mode 100644 index 00000000..656f321b --- /dev/null +++ b/lib/views/account_page/components/user_info_component/component/arrow_clipper.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class ArrowClipper extends CustomClipper { + @override + Path getClip(Size size) { + Path path = Path(); + path.moveTo(size.width / 2, 0); + path.lineTo(size.width, size.height / 2); + path.lineTo(0, size.height / 2); + return path; + } + + @override + bool shouldReclip(CustomClipper oldClipper) { + return true; + } +} diff --git a/lib/views/account_page/components/user_info_component/component/user_menu.dart b/lib/views/account_page/components/user_info_component/component/user_menu.dart new file mode 100644 index 00000000..4f65ca18 --- /dev/null +++ b/lib/views/account_page/components/user_info_component/component/user_menu.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/account_page/components/user_info_component/component/about_page.dart'; + +import 'arrow_clipper.dart'; + +class UserMenu extends StatelessWidget { + final Function onSignOut; + final Function onNotificationTap; + final Function onPaymentTap; + final Function onAboutPageTap; + // final Function onAboutTap; + const UserMenu( + {this.onSignOut, + this.onNotificationTap, + this.onPaymentTap, + this.onAboutPageTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 200; + final double _arrowSize = 15.0; + return Positioned( + top: Adapt.px(130) + Adapt.padTopH(), + right: Adapt.px(40), + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Container( + padding: EdgeInsets.only(right: Adapt.px(35)), + alignment: Alignment.bottomRight, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: _arrowSize / 2 - 1), + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column(children: [ + _OptionItem( + icon: FontAwesomeIcons.bell, + title: 'Notifications', + onTap: onNotificationTap, + ), + _OptionItem( + icon: FontAwesomeIcons.user, + title: 'Profile', + ), + _OptionItem( + icon: Icons.payment_outlined, + title: 'Payment', + onTap: onPaymentTap, + ), + _OptionItem( + icon: Icons.exit_to_app, + title: 'Sign out', + onTap: onSignOut, + ), + _OptionItem( + title: "About", + icon: FontAwesomeIcons.userCircle, + onTap: onAboutPageTap, + ) + ]), + ), + ], + ), + ), + ); + } +} + +class _OptionItem extends StatelessWidget { + final String title; + final IconData icon; + final Function onTap; + const _OptionItem({@required this.title, @required this.icon, this.onTap}); + @override + Widget build(BuildContext context) { + final Color _baseColor = const Color(0xFFFFFFFF); + return InkWell( + onTap: onTap, + child: SizedBox( + height: 50, + child: Row( + children: [ + Icon( + icon, + color: _baseColor, + size: 16, + ), + SizedBox(width: 20), + Text( + title, + style: TextStyle(color: _baseColor, fontSize: 16), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/account_page/components/user_info_component/effect.dart b/lib/views/account_page/components/user_info_component/effect.dart new file mode 100644 index 00000000..a9b8111e --- /dev/null +++ b/lib/views/account_page/components/user_info_component/effect.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/user_info_operate.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + UserInfoAction.action: _onAction, + UserInfoAction.signOut: _onSignOut, + UserInfoAction.signIn: _onSignIn, + UserInfoAction.paymentTap: _onPaymentTap, + UserInfoAction.openNotifications: _openNotifications, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onSignOut(Action action, Context ctx) async { + await UserInfoOperate.whenLogout(); +} + +void _onSignIn(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('loginpage'); +} + +void _onPaymentTap(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('paymentPage'); +} + +void _openNotifications(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('notificationPage'); +} diff --git a/lib/views/account_page/components/user_info_component/reducer.dart b/lib/views/account_page/components/user_info_component/reducer.dart new file mode 100644 index 00000000..0aeacecc --- /dev/null +++ b/lib/views/account_page/components/user_info_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + UserInfoAction.action: _onAction, + }, + ); +} + +UserInfoState _onAction(UserInfoState state, Action action) { + final UserInfoState newState = state.clone(); + return newState; +} diff --git a/lib/views/account_page/components/user_info_component/state.dart b/lib/views/account_page/components/user_info_component/state.dart new file mode 100644 index 00000000..7bf97490 --- /dev/null +++ b/lib/views/account_page/components/user_info_component/state.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/views/account_page/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +class UserInfoState implements Cloneable { + AppUser user; + GlobalKey overlayStateKey; + @override + UserInfoState clone() { + return UserInfoState() + ..user = user + ..overlayStateKey = overlayStateKey; + } +} + +class UserInfoConnector extends ConnOp { + @override + UserInfoState get(AccountState state) { + UserInfoState substate = state.userInfoState.clone(); + substate.user = state.user; + return substate; + } +} diff --git a/lib/views/account_page/components/user_info_component/view.dart b/lib/views/account_page/components/user_info_component/view.dart new file mode 100644 index 00000000..1f54503a --- /dev/null +++ b/lib/views/account_page/components/user_info_component/view.dart @@ -0,0 +1,215 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/account_page/components/user_info_component/component/user_menu.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; +import 'package:movie/views/account_page/components/user_info_component/component/about_page.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + UserInfoState state, Dispatch dispatch, ViewService viewService) { + void _closeMenu(OverlayEntry overlayEntry) { + overlayEntry?.remove(); + state.overlayStateKey.currentState.setOverlayEntry(null); + overlayEntry = null; + } + + void _showMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + UserMenu( + onNotificationTap: () { + _closeMenu(menuOverlayEntry); + dispatch(UserInfoActionCreator.openNotifications()); + }, + onPaymentTap: () { + _closeMenu(menuOverlayEntry); + dispatch(UserInfoActionCreator.paymentTap()); + }, + onSignOut: () { + _closeMenu(menuOverlayEntry); + dispatch(UserInfoActionCreator.signOut()); + }, + onAboutPageTap: () { + _closeMenu(menuOverlayEntry); + Navigator.push(context, + MaterialPageRoute(builder: (context) => AboutPage())); + }, + ) + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + return _Body( + isSignIn: state.user?.firebaseUser != null, + user: state.user?.firebaseUser, + openMenu: _showMenu, + onSignIn: () => dispatch(UserInfoActionCreator.signIn()), + overlayStateKey: state.overlayStateKey, + ); +} + +class _Body extends StatelessWidget { + final bool isSignIn; + final FirebaseUser user; + final Key overlayStateKey; + final Function openMenu; + final Function onSignIn; + const _Body( + {this.isSignIn = false, + this.openMenu, + this.onSignIn, + this.user, + this.overlayStateKey}); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: SafeArea( + child: Padding( + padding: EdgeInsets.fromLTRB(0, Adapt.px(30), 0, 25), + child: isSignIn + ? _UserInfo( + profileUrl: user?.photoUrl, + userName: user?.displayName, + openMenu: openMenu, + overlayStateKey: overlayStateKey) + : _SignInPanel( + onSignIn: onSignIn, + ), + ), + ), + ); + } +} + +class _UserInfo extends StatelessWidget { + final String userName; + final String profileUrl; + final Function openMenu; + final Key overlayStateKey; + const _UserInfo( + {this.profileUrl, this.userName, this.openMenu, this.overlayStateKey}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _avatarSize = Adapt.px(80); + final _avatarMargin = Adapt.px(5); + final _avatarRadius = Adapt.px(20); + return Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(context).welcomeBack, + style: TextStyle(color: const Color(0xFF717171), fontSize: 12), + ), + SizedBox(height: 5), + Text( + userName ?? 'UserName', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + Spacer(), + SizedBox(width: 15), + Stack( + children: [ + OverlayEntryManage( + key: overlayStateKey, + child: GestureDetector( + onTap: openMenu, + child: Container( + width: _avatarSize, + height: _avatarSize, + margin: EdgeInsets.all(_avatarMargin), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(_avatarRadius), + image: profileUrl == null + ? null + : DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(profileUrl), + ), + ), + ), + ), + ), + Container( + margin: EdgeInsets.only(left: _avatarSize - _avatarMargin), + width: 10, + height: 10, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF5568E8), + ), + ), + ], + ), + ], + ); + } +} + +class _SignInPanel extends StatelessWidget { + final Function onSignIn; + const _SignInPanel({this.onSignIn}); + @override + Widget build(BuildContext context) { + final _iconColor = const Color(0xFF717171); + return Container( + height: Adapt.px(90), + child: Row(children: [ + Icon( + FontAwesomeIcons.bell, + size: 18, + color: _iconColor, + ), + Spacer(), + GestureDetector( + onTap: onSignIn, + child: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + border: Border.all(color: _iconColor), + borderRadius: BorderRadius.circular(15), + ), + child: Row(children: [ + Text('Sign In'), + SizedBox(width: Adapt.px(15)), + Icon( + FontAwesomeIcons.user, + color: _iconColor, + size: 18, + ), + ]), + )) + ]), + ); + } +} diff --git a/lib/views/account_page/effect.dart b/lib/views/account_page/effect.dart new file mode 100644 index 00000000..104c4698 --- /dev/null +++ b/lib/views/account_page/effect.dart @@ -0,0 +1,45 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/item.dart'; +import 'package:package_info/package_info.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + AccountAction.action: _onAction, + AccountAction.navigatorPush: _navigatorPush, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _navigatorPush(Action action, Context ctx) async { + if (ctx.state.user?.firebaseUser == null) + await _onLogin(action, ctx); + else { + String routerName = action.payload[0]; + Object data = action.payload[1]; + await Navigator.of(ctx.context).pushNamed(routerName, arguments: data); + } +} + +Future _onLogin(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('loginpage'); +} + +void _onInit(Action action, Context ctx) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final _adultItem = prefs.getBool('adultItems'); + if (_adultItem != null) ctx.state.settingsState.adultContent = _adultItem; + final _enableNotifications = prefs.getBool('enableNotifications'); + if (_enableNotifications != null) + ctx.state.settingsState.enableNotifications = _enableNotifications; + final _packageInfo = await PackageInfo.fromPlatform(); + ctx.state.settingsState.version = _packageInfo?.version ?? '-'; + final _appLanguage = prefs.getString('appLanguage'); + if (_appLanguage != null) + ctx.state.settingsState.appLanguage = Item(_appLanguage); +} diff --git a/lib/views/account_page/page.dart b/lib/views/account_page/page.dart new file mode 100644 index 00000000..523d6518 --- /dev/null +++ b/lib/views/account_page/page.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/account_page/components/data_panel_component/component.dart'; +import 'package:movie/views/account_page/components/data_panel_component/state.dart'; + +import 'components/settings_component/component.dart'; +import 'components/settings_component/state.dart'; +import 'components/user_data_component/component.dart'; +import 'components/user_data_component/state.dart'; +import 'components/user_info_component/component.dart'; +import 'components/user_info_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class AccountPage extends Page> { + AccountPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'userInfo': UserInfoConnector() + UserInfoComponent(), + 'dataPanel': DataPanelConnector() + DataPanelComponent(), + 'userData': UserDataConnector() + UserDataComponent(), + 'settings': SettingsConnector() + SettingsComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/account_page/reducer.dart b/lib/views/account_page/reducer.dart new file mode 100644 index 00000000..f36b29c6 --- /dev/null +++ b/lib/views/account_page/reducer.dart @@ -0,0 +1,41 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + AccountAction.action: _onAction, + AccountAction.onTabBarTap: _onTabBarTap, + AccountAction.hideTip: _hideTip, + AccountAction.showTip: _showTip, + }, + ); +} + +AccountState _onAction(AccountState state, Action action) { + final AccountState newState = state.clone(); + return newState; +} + +AccountState _onTabBarTap(AccountState state, Action action) { + final int _index = action.payload ?? 0; + final AccountState newState = state.clone(); + newState.selectedTabBarIndex = _index; + return newState; +} + +AccountState _showTip(AccountState state, Action action) { + final String _tip = action.payload; + final AccountState newState = state.clone(); + newState.showTip = true; + newState.tip = _tip; + return newState; +} + +AccountState _hideTip(AccountState state, Action action) { + final AccountState newState = state.clone(); + newState.showTip = false; + return newState; +} diff --git a/lib/views/account_page/state.dart b/lib/views/account_page/state.dart new file mode 100644 index 00000000..9fdc8868 --- /dev/null +++ b/lib/views/account_page/state.dart @@ -0,0 +1,60 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/item.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'components/data_panel_component/state.dart'; +import 'components/settings_component/state.dart'; +import 'components/user_data_component/state.dart'; +import 'components/user_info_component/state.dart'; + +class AccountState implements GlobalBaseState, Cloneable { + String name; + String avatar; + int selectedTabBarIndex; + bool showTip; + String tip; + UserInfoState userInfoState; + SettingsState settingsState; + UserDataState userDataState; + DataPanelState dataPanelState; + @override + AccountState clone() { + return AccountState() + ..avatar = avatar + ..selectedTabBarIndex = selectedTabBarIndex + ..showTip = showTip + ..tip = tip + ..user = user + ..userInfoState = userInfoState + ..settingsState = settingsState + ..userDataState = userDataState + ..dataPanelState = dataPanelState; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +AccountState initState(Map args) { + AccountState state = AccountState(); + state.selectedTabBarIndex = 0; + state.showTip = true; + state.userInfoState = UserInfoState() + ..overlayStateKey = GlobalKey(); + state.userDataState = UserDataState(); + state.dataPanelState = DataPanelState(); + state.settingsState = SettingsState() + ..appLanguage = Item.fromParams(name: "System Default") + ..adultContent = false + ..enableNotifications = true; + return state; +} diff --git a/lib/views/account_page/view.dart b/lib/views/account_page/view.dart new file mode 100644 index 00000000..36921a8b --- /dev/null +++ b/lib/views/account_page/view.dart @@ -0,0 +1,335 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + AccountState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + // backgroundColor: const Color(0xFFEDF6FD), + body: AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: CustomScrollView( + physics: BouncingScrollPhysics(), + slivers: [ + viewService.buildComponent('userInfo'), + viewService.buildComponent('dataPanel'), + SliverToBoxAdapter( + child: _TipPanel( + show: state.showTip, + tip: state.tip, + autoClose: true, + onChange: (show) => dispatch(AccountActionCreator.hideTip()), + )), + SliverToBoxAdapter( + child: _TabBarPanel( + currentIndex: state.selectedTabBarIndex, + onTap: (index) => + dispatch(AccountActionCreator.onTabBarTap(index)), + ), + ), + _FeaturesPanel( + index: state.selectedTabBarIndex, + dispatch: dispatch, + viewService: viewService, + ) + ], + ), + ), + ), + ); + }, + ); +} + +class _TipPanel extends StatefulWidget { + final bool show; + final bool autoClose; + final String tip; + final Function(bool) onChange; + const _TipPanel( + {this.show = true, this.onChange, this.tip, this.autoClose = false}); + @override + _TipPanelState createState() => _TipPanelState(); +} + +class _TipPanelState extends State<_TipPanel> with TickerProviderStateMixin { + bool _show; + AnimationController _controller; + Animation _heightAnimation; + Animation _opacityAnimation; + @override + void initState() { + _show = widget.show; + _controller = + AnimationController(vsync: this, duration: Duration(milliseconds: 300)); + _heightAnimation = Tween(begin: Adapt.px(90), end: 0.0).animate( + CurvedAnimation( + parent: _controller, + curve: Curves.ease, + reverseCurve: Curves.ease, + ), + ); + _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation( + parent: _controller, + curve: Interval(0.0, 0.4, curve: Curves.ease), + reverseCurve: Interval(0.0, 0.4, curve: Curves.ease), + ), + ); + super.initState(); + } + + @override + void didUpdateWidget(_TipPanel oldWidget) { + if (_show != widget.show) { + if (widget.show) + _open(); + else + _close(); + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + _controller?.dispose(); + super.dispose(); + } + + _setShow(bool show) { + if (show == _show) return; + setState(() { + _show = show; + }); + } + + _open() { + _setShow(true); + _controller.reverse(); + if (widget.autoClose) + Future.delayed(Duration(seconds: 5), () { + _close(); + if (widget.onChange != null) widget.onChange(_show); + }); + } + + _close() { + _controller.forward(); + _setShow(false); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _light = _theme.brightness == Brightness.light; + return AnimatedBuilder( + animation: _controller, + builder: (_, __) { + return Opacity( + opacity: _opacityAnimation.value, + child: Container( + margin: _show ? EdgeInsets.only(bottom: 20) : null, + padding: EdgeInsets.symmetric(horizontal: 15), + height: _heightAnimation.value, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: _light + ? const Color(0xFFD1ECFD) + : _theme.primaryColorDark, + ), + child: Row( + children: [ + Text( + widget.tip ?? 'This panel for User Tip', + style: TextStyle( + fontWeight: FontWeight.w500, + color: _light + ? const Color(0xFF243586) + : const Color(0xFFFFFFFF), + ), + ), + Spacer(), + _show + ? GestureDetector( + onTap: () { + _close(); + if (widget.onChange != null) + widget.onChange(_show); + }, + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + color: _light + ? const Color(0xFFE2F4FE) + : _theme.primaryColorLight, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.close, + color: _light + ? const Color(0xFF5A6FE8) + : const Color(0xFFFFFFFF), + size: 18, + ), + ), + ) + : SizedBox() + ], + ), + )); + }); + } +} + +class _TabBarPanel extends StatefulWidget { + final int currentIndex; + final Function(int) onTap; + const _TabBarPanel({this.currentIndex, this.onTap}); + @override + _TabPanelState createState() => _TabPanelState(); +} + +class _TabPanelState extends State<_TabBarPanel> with TickerProviderStateMixin { + AnimationController _controller; + final Tween _tween = + Tween(begin: Offset.zero, end: Offset(2, 0)); + @override + void initState() { + _controller = + AnimationController(vsync: this, duration: Duration(milliseconds: 300)); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + void _onTap(int index) { + if (index == widget.currentIndex) return; + if (widget.onTap != null) widget.onTap(index); + _controller.animateTo(index / 2, + curve: Curves.ease, duration: Duration(milliseconds: 300)); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _light = _theme.brightness == Brightness.light; + return Stack( + children: [ + SlideTransition( + position: _tween.animate(_controller), + child: Container( + width: Adapt.px(160), + height: Adapt.px(80), + margin: EdgeInsets.symmetric(horizontal: 5), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + border: + _light ? null : Border.all(color: _theme.primaryColorDark), + color: _theme.cardColor, + boxShadow: [ + BoxShadow( + blurRadius: 8, + spreadRadius: -3, + color: _light ? Color(0xFFD0D0D0) : Colors.transparent, + ) + ], + ), + ), + ), + Padding( + padding: EdgeInsets.only(bottom: 20), + child: Row( + children: [ + _TabCell( + title: I18n.of(context).account, + selected: widget.currentIndex == 0, + index: 0, + onTap: _onTap, + ), + _TabCell( + title: I18n.of(context).settings, + selected: widget.currentIndex == 1, + index: 1, + onTap: _onTap, + ), + ], + ), + ), + ], + ); + } +} + +class _TabCell extends StatelessWidget { + final String title; + final int index; + final Function(int) onTap; + final bool selected; + const _TabCell({ + this.title, + this.selected = false, + this.index, + this.onTap, + }); + @override + Widget build(BuildContext context) { + final _selectedStyle = TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w500, + ); + final _unSelectedStyle = TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w500, + color: const Color(0xFFBEBEBE), + ); + return InkWell( + onTap: () => onTap(index), + child: Container( + width: Adapt.px(160), + height: Adapt.px(80), + margin: EdgeInsets.symmetric(horizontal: 5), + child: Center( + child: Text( + title, + style: selected ? _selectedStyle : _unSelectedStyle, + ), + ), + ), + ); + } +} + +class _FeaturesPanel extends StatelessWidget { + final int index; + final Dispatch dispatch; + final ViewService viewService; + const _FeaturesPanel({this.index, this.dispatch, this.viewService}); + @override + Widget build(BuildContext context) { + switch (index) { + case 0: + return viewService.buildComponent('userData'); + case 1: + return viewService.buildComponent('settings'); + default: + return SliverToBoxAdapter(); + } + } +} diff --git a/lib/views/account_page_old/action.dart b/lib/views/account_page_old/action.dart new file mode 100644 index 00000000..396ea046 --- /dev/null +++ b/lib/views/account_page_old/action.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum AccountPageAction { + action, + login, + init, + logout, + navigatorPush, + settingCellTapped, + notificationsTapped +} + +class AccountPageActionCreator { + static Action onAction() { + return const Action(AccountPageAction.action); + } + + static Action onLogin() { + return Action(AccountPageAction.login); + } + + static Action onInit(String name, String avatar, bool islogin) { + return Action(AccountPageAction.init, payload: [name, avatar, islogin]); + } + + static Action onLogout() { + return Action(AccountPageAction.logout); + } + + static Action navigatorPush(String routeName, {Object arguments}) { + return Action(AccountPageAction.navigatorPush, + payload: [routeName, arguments]); + } + + static Action settingCellTapped() { + return const Action(AccountPageAction.settingCellTapped); + } + + static Action notificationsTapped() { + return const Action(AccountPageAction.notificationsTapped); + } +} diff --git a/lib/views/account_page_old/components/body_component/component.dart b/lib/views/account_page_old/components/body_component/component.dart new file mode 100644 index 00000000..1c7e0d2b --- /dev/null +++ b/lib/views/account_page_old/components/body_component/component.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class BodyComponent extends Component { + BodyComponent() + : super( + view: buildView, + shouldUpdate: (oldState, newState) { + return false; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/account_page_old/components/body_component/state.dart b/lib/views/account_page_old/components/body_component/state.dart new file mode 100644 index 00000000..e21c30ac --- /dev/null +++ b/lib/views/account_page_old/components/body_component/state.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/account_page_old/state.dart'; + +class BodyState implements Cloneable { + @override + BodyState clone() { + return BodyState(); + } +} + +class BodyConnector extends ConnOp { + @override + BodyState get(AccountPageState state) { + BodyState substate = new BodyState(); + return substate; + } +} diff --git a/lib/views/account_page_old/components/body_component/view.dart b/lib/views/account_page_old/components/body_component/view.dart new file mode 100644 index 00000000..ba56fb76 --- /dev/null +++ b/lib/views/account_page_old/components/body_component/view.dart @@ -0,0 +1,109 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/views/account_page_old/action.dart'; + +import 'state.dart'; + +Widget buildView(BodyState state, Dispatch dispatch, ViewService viewService) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: GridView.count( + physics: NeverScrollableScrollPhysics(), + crossAxisSpacing: Adapt.px(30), + shrinkWrap: true, + crossAxisCount: 2, + children: [ + _GirdCell( + icon: 'images/yoda.png', + title: 'Watchlist', + onTap: () => + dispatch(AccountPageActionCreator.navigatorPush('watchlistPage')), + ), + _GirdCell( + icon: 'images/luke_skywalker.png', + title: 'MyLists', + onTap: () => + dispatch(AccountPageActionCreator.navigatorPush('myListsPage')), + ), + _GirdCell( + icon: 'images/darth_vader.png', + title: 'Favorites', + onTap: () => + dispatch(AccountPageActionCreator.navigatorPush('favoritesPage')), + ), + _GirdCell( + icon: 'images/chewbacca.png', + title: 'Payment', + onTap: () => dispatch( + AccountPageActionCreator.navigatorPush('paymentPage'))), + _GirdCell( + icon: 'images/c3po.png', + title: 'Downloaded', + onTap: () => dispatch( + AccountPageActionCreator.navigatorPush('downloadPage'))), + _GirdCell( + icon: 'images/r2d2.png', + title: 'Settings', + onTap: () => dispatch(AccountPageActionCreator.settingCellTapped()), + ), + ], + ), + ); +} + +class _GirdCell extends StatelessWidget { + final Function onTap; + final String icon; + final String title; + + const _GirdCell({this.icon, this.title, this.onTap}); + + @override + Widget build(BuildContext context) { + final _lightTheme = ThemeData.light() + .copyWith(cardColor: Colors.white, canvasColor: Colors.grey[300]); + final _darkTheme = ThemeData.dark() + .copyWith(cardColor: Color(0xFF505050), canvasColor: Color(0xFF404040)); + final MediaQueryData _mediaQuery = MediaQuery.of(context); + final ThemeData _theme = _mediaQuery.platformBrightness == Brightness.light + ? _lightTheme + : _darkTheme; + return GestureDetector( + onTap: onTap, + child: Container( + margin: EdgeInsets.fromLTRB( + Adapt.px(10), Adapt.px(10), Adapt.px(10), Adapt.px(30)), + decoration: BoxDecoration( + color: _theme.cardColor, + borderRadius: BorderRadius.circular(Adapt.px(20)), + boxShadow: [ + BoxShadow( + blurRadius: Adapt.px(10), + color: _theme.canvasColor, + offset: Offset(0, Adapt.px(15))) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + icon, + width: Adapt.px(100), + height: Adapt.px(100), + ), + SizedBox(height: Adapt.px(20)), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(10)), + child: Text( + title, + style: TextStyle( + fontSize: Adapt.px(30), fontWeight: FontWeight.w600), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/views/account_page_old/components/header_component/component.dart b/lib/views/account_page_old/components/header_component/component.dart new file mode 100644 index 00000000..dee40851 --- /dev/null +++ b/lib/views/account_page_old/components/header_component/component.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.user != newState.user; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/account_page_old/components/header_component/state.dart b/lib/views/account_page_old/components/header_component/state.dart new file mode 100644 index 00000000..677b6233 --- /dev/null +++ b/lib/views/account_page_old/components/header_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/views/account_page_old/state.dart'; + +class HeaderState implements Cloneable { + AppUser user; + @override + HeaderState clone() { + return HeaderState(); + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(AccountPageState state) { + HeaderState substate = new HeaderState(); + substate.user = state.user; + return substate; + } +} diff --git a/lib/views/account_page_old/components/header_component/view.dart b/lib/views/account_page_old/components/header_component/view.dart new file mode 100644 index 00000000..3ad4da47 --- /dev/null +++ b/lib/views/account_page_old/components/header_component/view.dart @@ -0,0 +1,169 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/views/account_page_old/action.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + return Row( + children: [ + SizedBox(width: Adapt.px(40)), + Container( + width: Adapt.px(100), + height: Adapt.px(100), + decoration: BoxDecoration( + color: Color(0xFF8499FD), + shape: BoxShape.circle, + image: state.user?.firebaseUser?.photoUrl != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + state.user?.firebaseUser?.photoUrl), + ) + : null, + ), + ), + SizedBox(width: Adapt.px(20)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${state.user?.firebaseUser?.displayName ?? 'Guest'}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35), + ), + ), + SizedBox(height: Adapt.px(10)), + GestureDetector( + onTap: () => + dispatch(AccountPageActionCreator.navigatorPush('premiumPage')), + child: (state.user?.isPremium ?? false) + ? Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(10), + vertical: Adapt.px(10), + ), + decoration: BoxDecoration( + color: const Color(0xFFFFC107), + borderRadius: BorderRadius.circular( + Adapt.px(10), + ), + ), + child: Center( + child: Text( + 'Premium', + style: TextStyle( + fontSize: Adapt.px(20), + color: const Color(0xFF000000), + ), + ), + ), + ) + : Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(10), vertical: Adapt.px(10)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(Adapt.px(10))), + child: Text( + 'Get Premium >', + style: TextStyle( + color: const Color(0xFF000000), + fontSize: Adapt.px(20), + ), + ), + ), + ) + ], + ), + Expanded(child: SizedBox()), + state.user == null + ? InkWell( + onTap: () => dispatch(AccountPageActionCreator.onLogin()), + child: Container( + height: Adapt.px(60), + margin: EdgeInsets.only( + right: Adapt.px(30), + top: Adapt.px(13), + bottom: Adapt.px(13)), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(20), vertical: Adapt.px(10)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + border: + Border.all(color: const Color(0xFFFFFFFF), width: 2)), + child: Text( + 'Sign In', + style: TextStyle( + color: const Color(0xFFFFFFFF), fontSize: Adapt.px(26)), + ))) + : PopupMenuButton( + padding: EdgeInsets.zero, + offset: Offset(0, Adapt.px(100)), + icon: Icon( + Icons.more_vert, + color: const Color(0xFFFFFFFF), + size: Adapt.px(50), + ), + onSelected: (selected) { + switch (selected) { + case 'signOut': + dispatch(AccountPageActionCreator.onLogout()); + break; + case 'notifications': + dispatch(AccountPageActionCreator.notificationsTapped()); + break; + case 'newDesign': + Navigator.of(viewService.context) + .pushNamed('testAccountPage'); + } + }, + itemBuilder: (ctx) { + return [ + PopupMenuItem( + value: 'newDesign', + child: const _DropDownItem( + title: 'new design', + icon: Icons.pageview, + ), + ), + PopupMenuItem( + value: 'notifications', + child: const _DropDownItem( + title: 'Notifications', + icon: Icons.notifications_none, + ), + ), + PopupMenuItem( + value: 'signOut', + child: const _DropDownItem( + title: 'Sign Out', + icon: Icons.exit_to_app, + ), + ), + ]; + }, + ), + SizedBox(width: Adapt.px(10)) + ], + ); +} + +class _DropDownItem extends StatelessWidget { + final String title; + final IconData icon; + const _DropDownItem({@required this.title, this.icon}); + @override + Widget build(BuildContext context) { + return Row( + children: [Icon(icon), SizedBox(width: 10), Text(title)], + ); + } +} diff --git a/lib/views/account_page_old/effect.dart b/lib/views/account_page_old/effect.dart new file mode 100644 index 00000000..2cf6d7fd --- /dev/null +++ b/lib/views/account_page_old/effect.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/user_info_operate.dart'; +import 'package:movie/views/setting_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + Lifecycle.initState: _onInit, + Lifecycle.build: _onBuild, + Lifecycle.dispose: _onDispose, + AccountPageAction.action: _onAction, + AccountPageAction.login: _onLogin, + AccountPageAction.logout: _onLogout, + AccountPageAction.navigatorPush: _navigatorPush, + AccountPageAction.settingCellTapped: _settingCellTapped, + AccountPageAction.notificationsTapped: _notificationsTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onLogin(Action action, Context ctx) async { + var r = (await Navigator.of(ctx.context).pushNamed('loginpage')) as Map; + if (r == null) return; + if (r['s'] == true) { + String name = r['name']; + String avatar = ctx.state.user?.firebaseUser?.photoUrl; + bool islogin = ctx.state.user != null; + ctx.dispatch(AccountPageActionCreator.onInit(name, avatar, islogin)); + } +} + +Future _onInit(Action action, Context ctx) async { + if (ctx.state.animationController == null) { + final Object ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 1000)); + } + String name = ctx.state.user?.firebaseUser?.displayName; + String avatar = ctx.state.user?.firebaseUser?.photoUrl; + bool islogin = ctx.state.user != null; + ctx.dispatch(AccountPageActionCreator.onInit(name, avatar, islogin)); +} + +void _onBuild(Action action, Context ctx) { + ctx.state.animationController.forward(); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); +} + +Future _onLogout(Action action, Context ctx) async { + bool isLogout = await UserInfoOperate.whenLogout(); + if (isLogout) await _onInit(action, ctx); +} + +Future _navigatorPush(Action action, Context ctx) async { + if (!ctx.state.islogin) + await _onLogin(action, ctx); + else { + String routerName = action.payload[0]; + Object data = action.payload[1]; + await Navigator.of(ctx.context).pushNamed(routerName, arguments: data); + } +} + +void _settingCellTapped(Action action, Context ctx) async { + Navigator.of(ctx.context).push(PageRouteBuilder(pageBuilder: (_, __, ___) { + return SettingPage().buildPage(null); + })); +} + +void _notificationsTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('notificationPage'); +} diff --git a/lib/views/account_page_old/page.dart b/lib/views/account_page_old/page.dart new file mode 100644 index 00000000..7247f3d5 --- /dev/null +++ b/lib/views/account_page_old/page.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/body_component/component.dart'; +import 'components/body_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class AccountPage extends Page> + with TickerProviderMixin { + AccountPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'body': BodyConnector() + BodyComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/account_page_old/reducer.dart b/lib/views/account_page_old/reducer.dart new file mode 100644 index 00000000..811779da --- /dev/null +++ b/lib/views/account_page_old/reducer.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + AccountPageAction.action: _onAction, + AccountPageAction.init: _onInit, + }, + ); +} + +AccountPageState _onAction(AccountPageState state, Action action) { + final AccountPageState newState = state.clone(); + return newState; +} + +AccountPageState _onInit(AccountPageState state, Action action) { + final String name = action.payload[0] ?? 'Guest'; + final String avatar = action.payload[1] ?? 'https://www.gravatar.com/avatar/'; + final bool islogin = action.payload[2] ?? false; + final AccountPageState newState = state.clone(); + newState.name = name; + newState.avatar = avatar; + newState.islogin = islogin; + return newState; +} diff --git a/lib/views/account_page_old/state.dart b/lib/views/account_page_old/state.dart new file mode 100644 index 00000000..4da7799a --- /dev/null +++ b/lib/views/account_page_old/state.dart @@ -0,0 +1,42 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; + +class AccountPageState implements GlobalBaseState, Cloneable { + GlobalKey scafoldState = + GlobalKey(debugLabel: 'accountPageScafold'); + String name; + String avatar; + bool islogin; + AnimationController animationController; + @override + AccountPageState clone() { + return AccountPageState() + ..name = name + ..avatar = avatar + ..islogin = islogin + ..animationController = animationController + ..locale = locale + ..themeColor = themeColor + ..scafoldState = scafoldState + ..user = user; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +AccountPageState initState(Map args) { + return AccountPageState() + ..name = '' + ..islogin = false; +} diff --git a/lib/views/account_page_old/view.dart b/lib/views/account_page_old/view.dart new file mode 100644 index 00000000..ed4de563 --- /dev/null +++ b/lib/views/account_page_old/view.dart @@ -0,0 +1,67 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/customcliper_path.dart'; +import 'state.dart'; + +Widget buildView( + AccountPageState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + return Scaffold( + key: state.scafoldState, + body: AnnotatedRegion( + value: SystemUiOverlayStyle.light, + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Stack( + children: [ + const _BackGround(), + SafeArea( + child: Column( + children: [ + SizedBox(height: Adapt.px(60)), + viewService.buildComponent('header'), + SizedBox(height: Adapt.px(50)), + viewService.buildComponent('body'), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ); +} + +class _BackGround extends StatelessWidget { + const _BackGround(); + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: CustomCliperPath( + height: Adapt.px(380), + width: Adapt.screenW(), + radius: Adapt.px(2000), + ), + child: Container( + height: Adapt.px(380), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFF6495ED), + const Color(0xFF6A5ACD), + ], + stops: [0.0, 1.0], + ), + ), + ), + ); + } +} diff --git a/lib/views/cast_list/cast_list_detail_page/action.dart b/lib/views/cast_list/cast_list_detail_page/action.dart new file mode 100644 index 00000000..5c3ce207 --- /dev/null +++ b/lib/views/cast_list/cast_list_detail_page/action.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; + +enum CastListDetailAction { + action, + setListDetail, + onCastTap, + onDeleteTap, + updateCastList, + setLoadMore, + loading +} + +class CastListDetailActionCreator { + static Action onAction() { + return const Action(CastListDetailAction.action); + } + + static Action setListDetail(CastListDetail detail) { + return Action(CastListDetailAction.setListDetail, payload: detail); + } + + static Action onCastTap(BaseCast cast) { + return Action(CastListDetailAction.onCastTap, payload: cast); + } + + static Action setLoadMore(CastListDetail detail) { + return Action(CastListDetailAction.setLoadMore, payload: detail); + } + + static Action loading(bool loading) { + return Action(CastListDetailAction.loading, payload: loading); + } + + static Action onDeleteTap(BaseCast cast) { + return Action(CastListDetailAction.onDeleteTap, payload: cast); + } + + static Action updateCastList(BaseCast cast) { + return Action(CastListDetailAction.updateCastList, payload: cast); + } +} diff --git a/lib/views/cast_list/cast_list_detail_page/effect.dart b/lib/views/cast_list/cast_list_detail_page/effect.dart new file mode 100644 index 00000000..e997e4d4 --- /dev/null +++ b/lib/views/cast_list/cast_list_detail_page/effect.dart @@ -0,0 +1,84 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/actions/api/graphql_client.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; +import 'package:movie/views/peopledetail_page/page.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CastListDetailAction.action: _onAction, + CastListDetailAction.onCastTap: _onCastTap, + CastListDetailAction.onDeleteTap: _onDeleteTap, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + ctx.state.scrollController = ScrollController() + ..addListener(() async { + bool isBottom = ctx.state.scrollController.position.pixels == + ctx.state.scrollController.position.maxScrollExtent; + if (isBottom && !ctx.state.allLoaded) { + await _onLoadMore(action, ctx); + } + }); + if (ctx.state.castList == null) return; + final _result = + await BaseApi.instance.getCastListDetail(ctx.state.castList.id); + if (_result.success) + ctx.dispatch(CastListDetailActionCreator.setListDetail(_result.result)); +} + +void _onCastTap(Action action, Context ctx) async { + final BaseCast _cast = action.payload; + if (_cast == null) return; + await Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: PeopleDetailPage().buildPage({ + 'peopleid': _cast.castId, + 'profilePath': _cast.profileUrl, + 'profileName': _cast.name, + 'character': _cast.updateTime.toString() + }), + ); + })); +} + +Future _onLoadMore(Action action, Context ctx) async { + ctx.dispatch(CastListDetailActionCreator.loading(true)); + final _result = await BaseApi.instance.getCastListDetail( + ctx.state.castList.id, + page: ctx.state.listDetail.page + 1); + if (_result.success) { + if (_result.result.data.length > 0) + ctx.dispatch(CastListDetailActionCreator.setLoadMore(_result.result)); + else + ctx.state.allLoaded = true; + } + ctx.dispatch(CastListDetailActionCreator.loading(false)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController?.dispose(); +} + +void _onDeleteTap(Action action, Context ctx) async { + final BaseCast _cast = action.payload; + if (_cast == null) return; + final _result = + await BaseGraphQLClient.instance.deleteCast(_cast.id, ctx.state.castList); + if (!_result.hasException) { + ctx.dispatch(CastListDetailActionCreator.updateCastList(_cast)); + } else { + Toast.show('Something wrong', ctx.context); + } +} diff --git a/lib/views/cast_list/cast_list_detail_page/page.dart b/lib/views/cast_list/cast_list_detail_page/page.dart new file mode 100644 index 00000000..bb188d16 --- /dev/null +++ b/lib/views/cast_list/cast_list_detail_page/page.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CastListDetailPage extends Page> { + CastListDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }), + middleware: >[ + ],); + +} diff --git a/lib/views/cast_list/cast_list_detail_page/reducer.dart b/lib/views/cast_list/cast_list_detail_page/reducer.dart new file mode 100644 index 00000000..59b2b302 --- /dev/null +++ b/lib/views/cast_list/cast_list_detail_page/reducer.dart @@ -0,0 +1,53 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CastListDetailAction.action: _onAction, + CastListDetailAction.setListDetail: _setListDetail, + CastListDetailAction.setLoadMore: _setLoadMore, + CastListDetailAction.updateCastList: _updateCastList, + CastListDetailAction.loading: _loading + }, + ); +} + +CastListDetailState _onAction(CastListDetailState state, Action action) { + final CastListDetailState newState = state.clone(); + return newState; +} + +CastListDetailState _loading(CastListDetailState state, Action action) { + final bool _loading = action.payload ?? false; + final CastListDetailState newState = state.clone(); + newState.loading = _loading; + return newState; +} + +CastListDetailState _setListDetail(CastListDetailState state, Action action) { + final CastListDetail _result = action.payload; + final CastListDetailState newState = state.clone(); + newState.listDetail = _result; + return newState; +} + +CastListDetailState _setLoadMore(CastListDetailState state, Action action) { + final CastListDetail _result = action.payload; + final CastListDetailState newState = state.clone(); + if (_result != null) { + newState.listDetail.page = _result.page; + newState.listDetail.data.addAll(_result.data); + } + return newState; +} + +CastListDetailState _updateCastList(CastListDetailState state, Action action) { + final BaseCast _cast = action.payload; + final CastListDetailState newState = state.clone(); + newState.listDetail.data.remove(_cast); + return newState; +} diff --git a/lib/views/cast_list/cast_list_detail_page/state.dart b/lib/views/cast_list/cast_list_detail_page/state.dart new file mode 100644 index 00000000..c186abc9 --- /dev/null +++ b/lib/views/cast_list/cast_list_detail_page/state.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; + +class CastListDetailState implements Cloneable { + BaseCastList castList; + CastListDetail listDetail; + ScrollController scrollController; + bool loading; + bool allLoaded; + @override + CastListDetailState clone() { + return CastListDetailState() + ..castList = castList + ..listDetail = listDetail + ..scrollController = scrollController + ..loading = loading + ..allLoaded = allLoaded; + } +} + +CastListDetailState initState(Map args) { + CastListDetailState state = CastListDetailState(); + state.castList = args['castList']; + state.loading = false; + state.allLoaded = false; + return state; +} diff --git a/lib/views/cast_list/cast_list_detail_page/view.dart b/lib/views/cast_list/cast_list_detail_page/view.dart new file mode 100644 index 00000000..bea5e5b8 --- /dev/null +++ b/lib/views/cast_list/cast_list_detail_page/view.dart @@ -0,0 +1,452 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/actions/timeline_convert.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CastListDetailState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + //appBar: AppBar(title: Text(state.castList?.name ?? '')), + body: Stack(children: [ + CustomScrollView( + controller: state.scrollController, + slivers: [ + _Header( + title: state.castList?.name, + description: state.castList?.description, + background: state.castList?.backgroundUrl == null || + state.castList?.backgroundUrl?.isEmpty == true + ? 'https://img.freepik.com/free-vector/people-waving-hand-illustration-concept_52683-29825.jpg?size=626&ext=jpg' + : state.castList.backgroundUrl, + count: state.castList?.castCount ?? 0, + updateTime: TimeLineConvert.instance.getTimeLine( + state.castList?.updateTime ?? DateTime.parse('2020-01-01')), + ), + const _CastListTitle(), + _CastList( + data: state.listDetail?.data, + onCastTap: (d) => dispatch(CastListDetailActionCreator.onCastTap(d)), + onDeleteTap: (d) => + dispatch(CastListDetailActionCreator.onDeleteTap(d)), + ), + _LoadingPanel(loading: state.loading), + ], + ), + _AppBar( + scrollController: state.scrollController, + totalHeight: MediaQuery.of(viewService.context).size.width, + opacityHeight: 120, + title: state.castList.name, + ) + ])); +} + +class _Header extends StatelessWidget { + final String background; + final String title; + final String description; + final String updateTime; + final int count; + const _Header( + {this.title, + this.background, + this.description, + this.updateTime, + this.count}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final Size _size = MediaQuery.of(context).size; + final double _headerSize = _size.width - 10; + return SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(bottom: 20), + child: ClipRRect( + borderRadius: BorderRadius.vertical(bottom: Radius.circular(20)), + child: Container( + width: _headerSize, + height: _headerSize, + decoration: BoxDecoration( + color: _theme.primaryColorLight, + image: background != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(background), + ) + : null, + ), + child: _ListInfo( + title: title, + background: background, + description: description, + updateTime: updateTime, + count: count, + )), + ), + ), + ); + } +} + +class _ListInfo extends StatelessWidget { + final String background; + final String title; + final String description; + final String updateTime; + final int count; + const _ListInfo( + {this.title, + this.background, + this.description, + this.updateTime, + this.count}); + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 30), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [ + const Color(0xC0000000), + const Color(0x00000000), + ], + ), + ), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text( + title, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + color: const Color(0xFFFFFFFF)), + ), + SizedBox(height: 5), + Text( + description ?? '', + style: TextStyle( + fontSize: 16, + height: 1.5, + color: const Color(0xFFFFFFFF), + ), + ), + SizedBox(height: 5), + Text( + '$count casts · updated $updateTime', + style: TextStyle(fontSize: 12, color: const Color(0xFFF0F0F0)), + ), + ]), + ), + ), + ], + ); + } +} + +class _AppBar extends StatefulWidget { + final ScrollController scrollController; + final double opacityHeight; + final double totalHeight; + final String title; + const _AppBar( + {this.scrollController, + this.opacityHeight, + this.totalHeight, + this.title}); + @override + _AppBarState createState() => _AppBarState(); +} + +class _AppBarState extends State<_AppBar> { + bool _showBar = false; + double _opacity = 0.0; + double _appBarChangeHeight; + + @override + void initState() { + widget.scrollController?.addListener(_changeBackground); + _setheight(); + super.initState(); + } + + @override + void didUpdateWidget(_AppBar oldWidget) { + if (oldWidget.opacityHeight != widget.opacityHeight || + oldWidget.totalHeight != widget.totalHeight) _setheight(); + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + widget.scrollController?.removeListener(_changeBackground); + super.dispose(); + } + + void _setheight() { + _appBarChangeHeight = widget.totalHeight - widget.opacityHeight; + } + + void _changeBackground() { + if (widget.scrollController.position.pixels >= _appBarChangeHeight) { + double v = widget.opacityHeight - + (widget.totalHeight - widget.scrollController.position.pixels); + v = v > widget.opacityHeight || v < 0 ? widget.opacityHeight : v; + _opacity = v / widget.opacityHeight; + _showBar = true; + } else { + _showBar = false; + } + setState(() {}); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Positioned( + top: 0, + left: 0, + right: 0, + child: _showBar + ? AppBar( + key: ValueKey('AppBarShow'), + backgroundColor: _theme.backgroundColor.withOpacity(_opacity), + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + title: Text( + widget.title ?? '', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + ) + : AppBar( + key: ValueKey('AppBarHide'), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: InkWell( + child: Container( + margin: EdgeInsets.all(12), + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.circle, color: const Color(0x60000000)), + child: Icon( + Icons.keyboard_arrow_left, + color: const Color(0xFFFFFFFF), + ), + ), + onTap: () => Navigator.of(context).pop(), + ), + ), + ); + } +} + +class _CastListTitle extends StatelessWidget { + const _CastListTitle(); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(bottom: 20, left: 20, right: 20), + child: Text( + 'Casts', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + )); + } +} + +class _CastList extends StatelessWidget { + final List data; + final Function(BaseCast) onCastTap; + final Function(BaseCast) onDeleteTap; + const _CastList({this.data, this.onCastTap, this.onDeleteTap}); + @override + Widget build(BuildContext context) { + return data == null + ? const _ShimmerList() + : data.length > 0 + ? SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) { + return _CastCell( + data: data[index], + onCastTap: onCastTap, + onDeleteTap: onDeleteTap, + ); + }, + childCount: data.length, + ), + ) + : SliverToBoxAdapter( + child: SizedBox( + height: 200, + child: Center( + child: Text( + 'Empty List', + style: TextStyle( + color: const Color(0xFF717171), + ), + )), + ), + ); + } +} + +class _CastCell extends StatelessWidget { + final BaseCast data; + final Function(BaseCast) onCastTap; + final Function(BaseCast) onDeleteTap; + const _CastCell({this.data, this.onCastTap, this.onDeleteTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + + return Padding( + padding: EdgeInsets.only(bottom: 20, left: 20, right: 20), + child: Row(children: [ + GestureDetector( + onTap: () => onCastTap(data), + child: Container( + width: 80, + height: 80, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: _theme.primaryColorDark, + boxShadow: _theme.brightness == Brightness.light + ? [ + BoxShadow( + offset: Offset(0, 10), + blurRadius: 5.0, + spreadRadius: -5.0, + color: const Color(0xFF9E9E9E), + ) + ] + : null, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.profileUrl, ImageSize.w300), + ), + ), + ), + ), + ), + SizedBox(width: 10), + GestureDetector( + onTap: () => onCastTap(data), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data?.name ?? '', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: 5), + Text( + 'updated ${TimeLineConvert.instance.getTimeLine(data?.updateTime ?? DateTime.parse('2020-01-01'))}', + style: TextStyle(color: const Color(0xFF717171)), + ) + ], + ), + ), + Spacer(), + InkWell( + onTap: () => onDeleteTap(data), + child: Icon(Icons.remove_circle_outline), + ) + ]), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + margin: EdgeInsets.only(bottom: 20, left: 20, right: 20), + child: Row(children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: _theme.primaryColorDark, + ), + ), + SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: _theme.primaryColorDark, + width: 200, + height: 20, + ), + SizedBox(height: 5), + Container( + color: _theme.primaryColorDark, + width: 100, + height: 10, + ), + ], + ), + ]), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + return SliverList( + delegate: SliverChildBuilderDelegate( + (_, __) { + return _ShimmerCell(); + }, + childCount: 4, + ), + ); + } +} + +class _LoadingPanel extends StatelessWidget { + final bool loading; + const _LoadingPanel({this.loading = false}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: loading + ? SizedBox( + height: 60, + child: Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(_theme.iconTheme.color), + ), + ), + ) + : SizedBox(), + ); + } +} diff --git a/lib/views/cast_list/cast_list_page/action.dart b/lib/views/cast_list/cast_list_page/action.dart new file mode 100644 index 00000000..16bf6acb --- /dev/null +++ b/lib/views/cast_list/cast_list_page/action.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; + +enum CastListAction { + action, + addCastList, + setCastList, + onCastListTap, + onCastListEdit +} + +class CastListActionCreator { + static Action onAction() { + return const Action(CastListAction.action); + } + + static Action addCastList() { + return const Action(CastListAction.addCastList); + } + + static Action setCastList(Stream stream) { + return Action(CastListAction.setCastList, payload: stream); + } + + static Action onCastListTap(BaseCastList list) { + return Action(CastListAction.onCastListTap, payload: list); + } + + static Action onCastListEdit(BaseCastList list) { + return Action(CastListAction.onCastListEdit, payload: list); + } +} diff --git a/lib/views/cast_list/cast_list_page/components/cast_list_create.dart b/lib/views/cast_list/cast_list_page/components/cast_list_create.dart new file mode 100644 index 00000000..7e7f9638 --- /dev/null +++ b/lib/views/cast_list/cast_list_page/components/cast_list_create.dart @@ -0,0 +1,312 @@ +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:movie/actions/api/graphql_client.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/loading_layout.dart'; +import 'package:path/path.dart' as Path; +import 'package:toast/toast.dart'; + +class CastListCreate extends StatefulWidget { + final BaseCastList data; + const CastListCreate({this.data}); + @override + _CastListCreateState createState() => _CastListCreateState(); +} + +class _CastListCreateState extends State { + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _descriptionController = TextEditingController(); + final FocusNode _nameFoucsNode = FocusNode(); + final FocusNode _descriptionFoucsNode = FocusNode(); + bool _editMode = false; + bool _loading = false; + String _url; + void _onSave() async { + _nameFoucsNode.unfocus(); + _descriptionFoucsNode.unfocus(); + if (_nameController.text == "") + return Toast.show('List name can\'t be empty', context); + final _user = GlobalStore.store.getState().user; + if (_user?.firebaseUser == null) + return Toast.show('Please login before add a list', context); + _setLoading(true); + final _nowTime = DateTime.now(); + QueryResult _result; + if (!_editMode) { + final _list = BaseCastList.fromParams( + uid: _user.firebaseUser.uid, + name: _nameController.text, + description: _descriptionController.text, + backgroundUrl: _url, + createTime: _nowTime, + updateTime: _nowTime, + ); + _result = await BaseGraphQLClient.instance.addCastList(_list); + } else { + final _list = BaseCastList.fromParams( + id: widget.data.id, + uid: widget.data.uid, + name: _nameController.text, + description: _descriptionController.text, + backgroundUrl: _url, + createTime: widget.data.createTime, + updateTime: _nowTime, + castCount: widget.data.castCount); + _result = await BaseGraphQLClient.instance.updateCastList(_list); + } + _setLoading(false); + if (!_result.hasException) + Navigator.of(context).pop(); + else { + Toast.show('Something wrong', context); + } + } + + @override + void dispose() { + _nameController.dispose(); + _descriptionController.dispose(); + _nameFoucsNode.dispose(); + _descriptionFoucsNode.dispose(); + super.dispose(); + } + + void _onUploadImage() async { + final ImagePicker _imagePicker = ImagePicker(); + final _image = await _imagePicker.getImage( + source: ImageSource.gallery, maxHeight: 1920, maxWidth: 1080); + if (_image != null) { + _setLoading(true); + StorageReference storageReference = FirebaseStorage.instance + .ref() + .child('avatar/${Path.basename(_image.path)}'); + StorageUploadTask uploadTask = + storageReference.putData(await _image.readAsBytes()); + await uploadTask.onComplete; + print('File Uploaded'); + storageReference.getDownloadURL().then((fileURL) { + if (fileURL != null) { + setState(() { + _url = fileURL; + }); + } + }); + _setLoading(false); + } + } + + void _setLoading(bool loading) { + if (_loading == loading) return; + setState(() { + _loading = loading; + }); + } + + void _deleteCastList() async { + _setLoading(true); + final _result = + await BaseGraphQLClient.instance.deleteCastList(widget.data.id); + + _setLoading(false); + if (!_result.hasException) + Navigator.of(context).pop(); + else { + Toast.show('Something wrong', context); + } + } + + @override + void initState() { + if (widget.data != null) { + _editMode = true; + _nameController.text = widget.data.name; + _url = widget.data.backgroundUrl; + _descriptionController.text = widget.data.description; + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Stack( + children: [ + Scaffold( + backgroundColor: _theme.backgroundColor, + appBar: AppBar( + elevation: 0.0, + title: Text( + '${_editMode ? 'Edit' : 'Create'} Cast List', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + iconTheme: _theme.iconTheme, + backgroundColor: _theme.backgroundColor, + actions: [ + FlatButton( + onPressed: _onSave, + child: Text( + 'Save', + style: TextStyle( + color: _theme.textTheme.bodyText1.color, fontSize: 16), + ), + ) + ], + ), + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + children: [ + SizedBox(height: 20), + _CustomTextField( + title: 'Name', + controller: _nameController, + focusNode: _nameFoucsNode, + ), + _BackGroundUpLoad( + url: _url, + onTap: _onUploadImage, + ), + _CustomTextField( + title: 'Description', + controller: _descriptionController, + focusNode: _descriptionFoucsNode, + maxLines: 12, + ), + Spacer(), + _editMode + ? GestureDetector( + onTap: _deleteCastList, + child: Container( + margin: EdgeInsets.only(bottom: 20), + height: 50, + decoration: BoxDecoration( + color: const Color(0xFFFF0000), + borderRadius: BorderRadius.circular(10)), + child: Center( + child: Text( + 'DELETE', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontWeight: FontWeight.w500, + fontSize: 18, + ), + ), + ), + ), + ) + : const SizedBox() + ], + ), + ), + ), + LoadingLayout(title: 'loading...', show: _loading) + ], + ); + } +} + +class _CustomTextField extends StatelessWidget { + final String title; + final double width; + final int maxLines; + final FocusNode focusNode; + final TextEditingController controller; + const _CustomTextField( + {this.title, + this.width, + this.maxLines = 1, + this.controller, + this.focusNode}); + @override + Widget build(BuildContext context) { + final double _fontSize = 20; + final Size _size = MediaQuery.of(context).size; + final _intputBorder = OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: const Color(0xFF9E9E9E))); + return Container( + width: width ?? _size.width, + padding: EdgeInsets.only(bottom: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: TextStyle(fontSize: _fontSize)), + SizedBox(height: 10), + TextField( + controller: controller, + maxLines: maxLines, + focusNode: focusNode, + cursorColor: const Color(0xFF9E9E9E), + decoration: InputDecoration( + contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), + enabledBorder: _intputBorder, + disabledBorder: _intputBorder, + focusedBorder: _intputBorder, + ), + ), + ], + ), + ); + } +} + +class _BackGroundUpLoad extends StatelessWidget { + final String url; + final Function onTap; + const _BackGroundUpLoad({this.onTap, this.url}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _size = MediaQuery.of(context).size; + return Padding( + padding: EdgeInsets.only(bottom: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Background', style: TextStyle(fontSize: 20)), + SizedBox(height: 10), + GestureDetector( + onTap: onTap, + child: Container( + height: 50, + padding: EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: const Color(0xFF9E9E9E))), + child: Row( + children: [ + SizedBox( + width: _size.width - 120, + child: Text( + url ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Spacer(), + Container( + width: 30, + height: 30, + decoration: BoxDecoration( + color: _theme.iconTheme.color, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.file_upload, + color: _theme.accentIconTheme.color, + size: 20, + ), + ), + ], + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/views/cast_list/cast_list_page/effect.dart b/lib/views/cast_list/cast_list_page/effect.dart new file mode 100644 index 00000000..bf6ce2f4 --- /dev/null +++ b/lib/views/cast_list/cast_list_page/effect.dart @@ -0,0 +1,46 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/graphql_client.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; +import 'action.dart'; +import 'components/cast_list_create.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CastListAction.action: _onAction, + CastListAction.addCastList: _addCastList, + CastListAction.onCastListTap: _onCastListTap, + CastListAction.onCastListEdit: _onCastListEdit, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + if (ctx.state.user.firebaseUser != null) { + var _result = BaseGraphQLClient.instance + .castListSubscription(ctx.state.user.firebaseUser.uid); + ctx.dispatch(CastListActionCreator.setCastList(_result)); + } +} + +void _addCastList(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .push(MaterialPageRoute(builder: (_) => CastListCreate())); +} + +void _onCastListTap(Action action, Context ctx) async { + final BaseCastList _list = action.payload; + if (_list == null) return; + await Navigator.of(ctx.context) + .pushNamed('castListDetailPage', arguments: {'castList': _list}); +} + +void _onCastListEdit(Action action, Context ctx) async { + final BaseCastList _list = action.payload; + if (_list == null) return; + await Navigator.of(ctx.context) + .push(MaterialPageRoute(builder: (_) => CastListCreate(data: _list))); +} diff --git a/lib/views/cast_list/cast_list_page/page.dart b/lib/views/cast_list/cast_list_page/page.dart new file mode 100644 index 00000000..5015e464 --- /dev/null +++ b/lib/views/cast_list/cast_list_page/page.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CastListPage extends Page> { + CastListPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/cast_list/cast_list_page/reducer.dart b/lib/views/cast_list/cast_list_page/reducer.dart new file mode 100644 index 00000000..4279ef83 --- /dev/null +++ b/lib/views/cast_list/cast_list_page/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CastListAction.action: _onAction, + CastListAction.setCastList: _setCastList + }, + ); +} + +CastListState _onAction(CastListState state, Action action) { + final CastListState newState = state.clone(); + return newState; +} + +CastListState _setCastList(CastListState state, Action action) { + final Stream _stream = action.payload; + final CastListState newState = state.clone(); + newState.castList = _stream; + return newState; +} diff --git a/lib/views/cast_list/cast_list_page/state.dart b/lib/views/cast_list/cast_list_page/state.dart new file mode 100644 index 00000000..e08b5e21 --- /dev/null +++ b/lib/views/cast_list/cast_list_page/state.dart @@ -0,0 +1,30 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; + +class CastListState implements GlobalBaseState, Cloneable { + Stream castList; + @override + CastListState clone() { + return CastListState() + ..user = user + ..locale = locale + ..castList = castList; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +CastListState initState(Map args) { + return CastListState(); +} diff --git a/lib/views/cast_list/cast_list_page/view.dart b/lib/views/cast_list/cast_list_page/view.dart new file mode 100644 index 00000000..ce6e637e --- /dev/null +++ b/lib/views/cast_list/cast_list_page/view.dart @@ -0,0 +1,154 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CastListState state, Dispatch dispatch, ViewService viewService) { + final _theme = ThemeStyle.getTheme(viewService.context); + return Scaffold( + appBar: AppBar( + title: Text( + 'Cast Lists', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + backgroundColor: _theme.backgroundColor, + elevation: 0.0, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + actions: [ + IconButton( + icon: Icon(Icons.add), + onPressed: () => dispatch(CastListActionCreator.addCastList()), + ) + ], + ), + backgroundColor: _theme.backgroundColor, + body: StreamBuilder( + stream: state.castList, + builder: (_, snapShot) { + switch (snapShot.connectionState) { + case ConnectionState.waiting: + return Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(_theme.iconTheme.color), + ), + ); + case ConnectionState.active: + case ConnectionState.done: + final _castList = CastListModel.fromMap(snapShot.data.data); + final List _list = _castList.list + ..sort((a, b) => a.updateTime.isBefore(b.updateTime) ? 1 : 0); + return _CastListView( + data: _list, + onSelected: (d) => + dispatch(CastListActionCreator.onCastListTap(d)), + onEdit: (d) => dispatch(CastListActionCreator.onCastListEdit(d)), + ); + case ConnectionState.none: + default: + return Center( + child: Text('Empty List'), + ); + } + }, + ), + ); +} + +class _CastListView extends StatelessWidget { + final List data; + final Function(BaseCastList) onSelected; + final Function(BaseCastList) onEdit; + const _CastListView({this.data, this.onSelected, this.onEdit}); + + void _onSelected(BaseCastList selected) { + if (onSelected != null) onSelected(selected); + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 20), + itemBuilder: (_, index) { + return _CastListCell( + data: data[index], + onTap: _onSelected, + onEdit: onEdit, + ); + }, + separatorBuilder: (_, index) => SizedBox(height: 10), + itemCount: data.length, + ); + } +} + +class _CastListCell extends StatelessWidget { + final BaseCastList data; + final Function(BaseCastList) onTap; + final Function(BaseCastList) onEdit; + const _CastListCell({this.data, this.onTap, this.onEdit}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _size = MediaQuery.of(context).size; + return Padding( + padding: EdgeInsets.only(bottom: 10), + child: InkWell( + onTap: () => onTap(data), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: _theme.primaryColorDark), + ), + child: Row( + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + borderRadius: BorderRadius.horizontal( + left: Radius.circular(20), + ), + color: _theme.primaryColorDark, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(data.backgroundUrl == + null || + data.backgroundUrl?.isEmpty == true + ? 'https://img.freepik.com/free-vector/people-waving-hand-illustration-concept_52683-29825.jpg?size=626&ext=jpg' + : data.backgroundUrl), + ), + ), + ), + SizedBox(width: 15), + SizedBox( + width: _size.width - 220, + child: Text( + data.name ?? '', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 18), + ), + ), + Spacer(), + Text('${data.castCount ?? 0}'), + //SizedBox(width: 15), + IconButton( + icon: Icon( + Icons.more_vert, + color: const Color(0xFF717171), + ), + onPressed: () => onEdit(data)) + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/checkout_page/action.dart b/lib/views/checkout_page/action.dart new file mode 100644 index 00000000..51ed6abf --- /dev/null +++ b/lib/views/checkout_page/action.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_braintree/flutter_braintree.dart'; + +enum CheckOutPageAction { + action, + selectPaymentMethod, + updatePaymentMethod, + pay, + loading +} + +class CheckOutPageActionCreator { + static Action onAction() { + return const Action(CheckOutPageAction.action); + } + + static Action selectPaymentMethod() { + return const Action(CheckOutPageAction.selectPaymentMethod); + } + + static Action updatePaymentMethod( + BraintreeDropInResult braintreeDropInResult) { + return Action(CheckOutPageAction.updatePaymentMethod, + payload: braintreeDropInResult); + } + + static Action onPay() { + return const Action(CheckOutPageAction.pay); + } + + static Action loading(bool loading) { + return Action(CheckOutPageAction.loading, payload: loading); + } +} diff --git a/lib/views/checkout_page/effect.dart b/lib/views/checkout_page/effect.dart new file mode 100644 index 00000000..1bdd12d7 --- /dev/null +++ b/lib/views/checkout_page/effect.dart @@ -0,0 +1,128 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter_braintree/flutter_braintree.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/actions/user_info_operate.dart'; +import 'package:movie/models/base_api_model/payment_client_token.dart'; +import 'package:movie/models/base_api_model/purchase.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CheckOutPageAction.action: _onAction, + CheckOutPageAction.selectPaymentMethod: _selectPaymentMethod, + CheckOutPageAction.pay: _onPay, + }); +} + +void _onAction(Action action, Context ctx) {} +Future _selectPaymentMethod( + Action action, Context ctx) async { + ctx.dispatch(CheckOutPageActionCreator.loading(true)); + PaymentClientToken _clientNonce = + await _getToken(ctx.state.user.firebaseUser.uid); + ctx.dispatch(CheckOutPageActionCreator.loading(false)); + if (_clientNonce?.token == null) + return Toast.show('Something wrong', ctx.context, + gravity: Toast.CENTER, duration: 5); + final request = BraintreeDropInRequest( + vaultManagerEnabled: true, + clientToken: _clientNonce.token, + collectDeviceData: true, + venmoEnabled: true, + maskCardNumber: true, + maskSecurityCode: true, + cardEnabled: true, + googlePaymentRequest: BraintreeGooglePaymentRequest( + totalPrice: ctx.state.checkoutData.amount.toString(), + currencyCode: 'USD', + billingAddressRequired: false, + ), + paypalRequest: BraintreePayPalRequest( + amount: ctx.state.checkoutData.amount.toString(), + displayName: 'Example company', + ), + ); + BraintreeDropInResult result = await BraintreeDropIn.start(request); + if (result != null) + ctx.dispatch(CheckOutPageActionCreator.updatePaymentMethod(result)); +} + +void _onPay(Action action, Context ctx) async { + ctx.dispatch(CheckOutPageActionCreator.loading(true)); + if (ctx.state.user == null || ctx.state.braintreeDropInResult == null) { + ctx.dispatch(CheckOutPageActionCreator.loading(false)); + return Toast.show('empty payment method', ctx.context, + gravity: Toast.CENTER, duration: 5); + } + final _baseApi = BaseApi.instance; + final _r = await _baseApi.createPremiumSubscription( + Purchase( + userId: ctx.state.user.firebaseUser.uid, + amount: ctx.state.checkoutData.amount, + paymentMethodNonce: + ctx.state.braintreeDropInResult.paymentMethodNonce.nonce, + ), + ctx.state.checkoutData.premiumType, + ); + ctx.dispatch(CheckOutPageActionCreator.loading(false)); + if (!_r.success) + return Toast.show('Something wrong', ctx.context, + gravity: Toast.CENTER, duration: 5); + if (_r.result.status) { + if (_r.result.data == null) return; + if (_r.result.data.expireDate == null) return; + UserInfoOperate.setPremium(_r.result.data); + await Navigator.of(ctx.context).pushAndRemoveUntil( + MaterialPageRoute( + builder: (context) => Scaffold( + appBar: AppBar( + title: Text('Payed'), + ), + body: Center( + child: Container( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Thank you!!!', + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + ), + SizedBox(height: 40), + Text('Premium expire date: ${_r.result.data.expireDate}') + ]), + ), + ), + ), + ), + (route) => route.isFirst); + } else + Toast.show(_r.message, ctx.context, gravity: Toast.CENTER, duration: 5); + print(_r); +} + +Future _getToken(String uid) async { + PaymentClientToken _clientNonce = PaymentClientToken.fromParams( + expiredTime: DateTime.now().millisecondsSinceEpoch); + SharedPreferences preferences = await SharedPreferences.getInstance(); + final _token = preferences.getString('PaymentToken'); + if (_token != null) _clientNonce = PaymentClientToken(_token); + if (_token == null || _clientNonce.isExpired()) { + final _baseApi = BaseApi.instance; + var r = await _baseApi.getPaymentToken(uid); + if (r.success) { + _clientNonce = PaymentClientToken.fromParams( + token: r.result, expiredTime: DateTime.now().millisecondsSinceEpoch); + preferences.setString('PaymentToken', _clientNonce.toString()); + } else + _clientNonce = PaymentClientToken.fromParams( + expiredTime: DateTime.now().millisecondsSinceEpoch); + } + return _clientNonce; +} diff --git a/lib/views/checkout_page/page.dart b/lib/views/checkout_page/page.dart new file mode 100644 index 00000000..29d273d6 --- /dev/null +++ b/lib/views/checkout_page/page.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CheckOutPage extends Page> { + CheckOutPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/checkout_page/reducer.dart b/lib/views/checkout_page/reducer.dart new file mode 100644 index 00000000..7aa01795 --- /dev/null +++ b/lib/views/checkout_page/reducer.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_braintree/flutter_braintree.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CheckOutPageAction.action: _onAction, + CheckOutPageAction.updatePaymentMethod: _updatePaymentMethod, + CheckOutPageAction.loading: _loading, + }, + ); +} + +CheckOutPageState _onAction(CheckOutPageState state, Action action) { + final CheckOutPageState newState = state.clone(); + return newState; +} + +CheckOutPageState _updatePaymentMethod(CheckOutPageState state, Action action) { + final BraintreeDropInResult _braintreeDropInResult = action.payload; + final CheckOutPageState newState = state.clone(); + newState.braintreeDropInResult = _braintreeDropInResult; + return newState; +} + +CheckOutPageState _loading(CheckOutPageState state, Action action) { + final bool _loading = action.payload ?? false; + final CheckOutPageState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/checkout_page/state.dart b/lib/views/checkout_page/state.dart new file mode 100644 index 00000000..a0fa980d --- /dev/null +++ b/lib/views/checkout_page/state.dart @@ -0,0 +1,41 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_braintree/flutter_braintree.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/checkout_model.dart'; +import 'package:movie/models/app_user.dart'; + +class CheckOutPageState + implements GlobalBaseState, Cloneable { + CheckOutModel checkoutData; + BraintreeDropInResult braintreeDropInResult; + bool isSelected; + bool loading; + @override + CheckOutPageState clone() { + return CheckOutPageState() + ..checkoutData = checkoutData + ..braintreeDropInResult = braintreeDropInResult + ..isSelected = isSelected + ..user = user + ..loading = loading; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +CheckOutPageState initState(Map args) { + final _state = CheckOutPageState(); + _state.isSelected = false; + _state.loading = false; + if (args?.containsKey('data') ?? false) _state.checkoutData = args['data']; + return _state; +} diff --git a/lib/views/checkout_page/view.dart b/lib/views/checkout_page/view.dart new file mode 100644 index 00000000..a0c51a35 --- /dev/null +++ b/lib/views/checkout_page/view.dart @@ -0,0 +1,312 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_braintree/flutter_braintree.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CheckOutPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final _theme = ThemeStyle.getTheme(context); + + return Stack( + children: [ + Scaffold( + backgroundColor: _theme.backgroundColor, + appBar: AppBar( + brightness: _theme.brightness, + backgroundColor: _theme.backgroundColor, + iconTheme: _theme.iconTheme, + elevation: 0.0, + title: Text('Check Out', + style: TextStyle(color: _theme.textTheme.bodyText1.color)), + ), + body: Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(20)), + _DetailCell( + name: state.checkoutData?.name ?? '', + amount: state.checkoutData?.amount ?? 0.0, + ), + Expanded(child: SizedBox()), + _TotalCell(amount: state.checkoutData?.amount ?? 0.0), + SizedBox(height: Adapt.px(30)), + _PaymentCell( + braintreeDropInResult: state.braintreeDropInResult, + onTap: () => + dispatch(CheckOutPageActionCreator.selectPaymentMethod()), + ), + SizedBox(height: Adapt.px(30)), + _PayButton( + onTap: () => dispatch(CheckOutPageActionCreator.onPay()), + ), + SizedBox(height: Adapt.px(50)) + ], + ), + ), + ), + state.loading ? _LoadingLayout() : SizedBox(), + ], + ); + }); +} + +class _DetailCell extends StatelessWidget { + final String name; + final double amount; + const _DetailCell({this.name, this.amount}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _boxShadow = [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? Color(0xFFD0D0D0) + : Color(0xFF202020), + blurRadius: Adapt.px(10), + offset: Offset(Adapt.px(5), Adapt.px(5))) + ]; + return Container( + padding: EdgeInsets.all(Adapt.px(30)), + width: Adapt.screenW(), + constraints: BoxConstraints(minHeight: Adapt.px(400)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + boxShadow: _boxShadow, + borderRadius: BorderRadius.circular( + Adapt.px(20), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Detail', + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: Adapt.px(50)), + Row(children: [ + Container( + width: Adapt.px(60), + height: Adapt.px(60), + decoration: BoxDecoration( + shape: BoxShape.circle, color: Color(0xFF505050)), + ), + SizedBox(width: Adapt.px(30)), + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text( + name, + style: TextStyle(fontSize: Adapt.px(30)), + ), + Text( + '\$ ${amount.toString()}', + style: TextStyle(fontSize: Adapt.px(30)), + ) + ]) + ]) + ], + ), + ); + } +} + +class _TotalCell extends StatelessWidget { + final double amount; + const _TotalCell({this.amount}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _boxShadow = [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? Color(0xFFD0D0D0) + : Color(0xFF202020), + blurRadius: Adapt.px(10), + offset: Offset(Adapt.px(5), Adapt.px(5))) + ]; + return Container( + padding: EdgeInsets.all(Adapt.px(30)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + boxShadow: _boxShadow, + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Total', + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold, + ), + ), + Text( + '\$ ${amount.toString()}', + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold, + ), + ) + ], + ), + ); + } +} + +final Map _paymentType = { + 'none': '', + 'PayPal': 'images/paypal_account.png', + 'Visa': 'images/visa.png', + 'MasterCard': 'images/mastercard.png', + 'Discover': 'images/discover.png', + 'JCB': 'images/jcb.png', + 'Google Pay': 'images/google.png' +}; + +class _PaymentCell extends StatelessWidget { + final Function onTap; + final BraintreeDropInResult braintreeDropInResult; + const _PaymentCell({this.braintreeDropInResult, this.onTap}); + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _boxShadow = [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? const Color(0xFFD0D0D0) + : const Color(0xFF202020), + blurRadius: Adapt.px(10), + offset: Offset(Adapt.px(5), Adapt.px(5))) + ]; + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.all(Adapt.px(30)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + boxShadow: _boxShadow, + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text( + 'Select Payment Method', + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: Adapt.px(20)), + Row( + children: [ + braintreeDropInResult == null + ? SizedBox(height: Adapt.px(50)) + : Image.asset( + _paymentType[braintreeDropInResult + ?.paymentMethodNonce?.typeLabel ?? + 'none'], + height: Adapt.px(50), + ), + SizedBox(width: Adapt.px(20)), + SizedBox( + width: Adapt.px(500), + child: Text( + '${braintreeDropInResult?.paymentMethodNonce?.description ?? '---'}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ) + ], + ) + ]), + ), + ); + } +} + +class _PayButton extends StatelessWidget { + final Function onTap; + const _PayButton({this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _boxShadow = [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? Color(0xFFD0D0D0) + : Color(0xFF202020), + blurRadius: Adapt.px(10), + offset: Offset(Adapt.px(5), Adapt.px(5))) + ]; + return GestureDetector( + onTap: onTap, + child: Container( + width: Adapt.screenW(), + height: Adapt.px(90), + decoration: BoxDecoration( + color: const Color(0xDD000000), + boxShadow: _boxShadow, + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: Center( + child: Text( + 'Pay', + style: TextStyle( + color: Color(0xFFFFFFFF), + fontSize: Adapt.px(35), + fontWeight: FontWeight.bold, + ), + )), + ), + ); + } +} + +class _LoadingLayout extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: Container( + width: Adapt.screenW(), + height: Adapt.screenH(), + color: const Color(0x20000000), + child: Center( + child: Container( + width: Adapt.px(300), + height: Adapt.px(300), + decoration: BoxDecoration( + color: const Color(0xAA000000), + borderRadius: BorderRadius.circular( + Adapt.px(20), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator( + valueColor: + AlwaysStoppedAnimation(const Color(0xFFFFFFFF)), + ), + SizedBox(height: Adapt.px(30)), + const Text( + 'Working', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 14, + ), + ) + ]), + ), + ), + )); + } +} diff --git a/lib/views/coming_page/action.dart b/lib/views/coming_page/action.dart new file mode 100644 index 00000000..9ed8af6a --- /dev/null +++ b/lib/views/coming_page/action.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +enum ComingPageAction { + action, + initMoviesComing, + loadMore, + initTVComing, + filterChanged +} + +class ComingPageActionCreator { + static Action onAction() { + return const Action(ComingPageAction.action); + } + + static Action onInitMoviesComing(VideoListModel d) { + return Action(ComingPageAction.initMoviesComing, payload: d); + } + + static Action onInitTVComing(VideoListModel d) { + return Action(ComingPageAction.initTVComing, payload: d); + } + + static Action onLoadMore(VideoListModel d) { + return Action(ComingPageAction.loadMore, payload: d); + } + + static Action onFilterChanged(bool b) { + return Action(ComingPageAction.filterChanged, payload: b); + } +} diff --git a/lib/views/coming_page/components/movie_component/action.dart b/lib/views/coming_page/components/movie_component/action.dart new file mode 100644 index 00000000..5f339466 --- /dev/null +++ b/lib/views/coming_page/components/movie_component/action.dart @@ -0,0 +1,14 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +enum MovieListAction { action, cellTapped } + +class MovieListActionCreator { + static Action onAction() { + return const Action(MovieListAction.action); + } + + static Action cellTapped(VideoListResult d) { + return Action(MovieListAction.cellTapped, payload: d); + } +} diff --git a/lib/views/coming_page/components/movie_component/component.dart b/lib/views/coming_page/components/movie_component/component.dart new file mode 100644 index 00000000..bfeae3e5 --- /dev/null +++ b/lib/views/coming_page/components/movie_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MovieListComponent extends Component { + MovieListComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.page != newState.page; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/coming_page/components/movie_component/effect.dart b/lib/views/coming_page/components/movie_component/effect.dart new file mode 100644 index 00000000..0362c2d0 --- /dev/null +++ b/lib/views/coming_page/components/movie_component/effect.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/detail_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MovieListAction.action: _onAction, + MovieListAction.cellTapped: _cellTapped + }); +} + +void _onAction(Action action, Context ctx) {} +Future _cellTapped(Action action, Context ctx) async { + final VideoListResult _d = action.payload; + if (_d == null) return; + await Navigator.of(ctx.context).push(MaterialPageRoute(builder: (context) { + return MovieDetailPage().buildPage({'id': _d.id, 'bgpic': _d.posterPath}); + })); +} diff --git a/lib/views/coming_page/components/movie_component/reducer.dart b/lib/views/coming_page/components/movie_component/reducer.dart new file mode 100644 index 00000000..ce1bdf9a --- /dev/null +++ b/lib/views/coming_page/components/movie_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MovieListAction.action: _onAction, + }, + ); +} + +MovieListState _onAction(MovieListState state, Action action) { + final MovieListState newState = state.clone(); + return newState; +} diff --git a/lib/views/coming_page/components/movie_component/state.dart b/lib/views/coming_page/components/movie_component/state.dart new file mode 100644 index 00000000..7334d37f --- /dev/null +++ b/lib/views/coming_page/components/movie_component/state.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/coming_page/state.dart'; + +class MovieListState implements Cloneable { + VideoListModel moviecoming; + ScrollController movieController; + int page; + @override + MovieListState clone() { + return MovieListState(); + } +} + +class MovieListConnector extends ConnOp { + @override + MovieListState get(ComingPageState state) { + MovieListState substate = new MovieListState(); + substate.moviecoming = state.moviecoming; + substate.movieController = state.movieController; + substate.page = state.moviePage; + return substate; + } +} diff --git a/lib/views/coming_page/components/movie_component/view.dart b/lib/views/coming_page/components/movie_component/view.dart new file mode 100644 index 00000000..37474c51 --- /dev/null +++ b/lib/views/coming_page/components/movie_component/view.dart @@ -0,0 +1,207 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/widgets/keepalive_widget.dart'; +import 'package:movie/models/enums/genres.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + MovieListState state, Dispatch dispatch, ViewService viewService) { + int _count = state.moviecoming?.results?.length ?? 0; + return keepAliveWrapper(AnimatedSwitcher( + duration: Duration(milliseconds: 600), + child: ListView.separated( + key: ValueKey(state.moviecoming), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + controller: state.movieController, + cacheExtent: Adapt.px(180), + separatorBuilder: (_, __) => const _SeparatorItem(), + itemCount: _count + 1, + itemBuilder: (_, index) { + if (index == _count) + return Offstage( + offstage: + state.moviecoming.page == state.moviecoming.totalPages && + _count > 0, + child: const _ShimmerList(), + ); + final d = state.moviecoming.results[index]; + return _ItemCell( + data: d, + onTap: () => dispatch(MovieListActionCreator.cellTapped(d)), + ); + }, + ))); +} + +class _SeparatorItem extends StatelessWidget { + const _SeparatorItem({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only(left: Adapt.px(190)), child: Divider()); + } +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + final _rightPanelWidth = Adapt.screenW() - Adapt.px(250); + final _color = const Color(0xFFFFFFFF); + return Container( + padding: EdgeInsets.symmetric(vertical: Adapt.px(25)), + height: Adapt.px(280), + child: Row( + children: [ + Container( + height: Adapt.px(200), + width: Adapt.px(160), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(25)), + color: _color), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: _rightPanelWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(20)), + Container( + height: Adapt.px(30), width: Adapt.px(300), color: _color), + SizedBox(height: Adapt.px(5)), + Container( + height: Adapt.px(15), width: Adapt.px(150), color: _color), + SizedBox(height: Adapt.px(5)), + Container( + height: Adapt.px(15), width: Adapt.px(150), color: _color), + SizedBox(height: Adapt.px(15)), + Container(height: Adapt.px(18), color: _color), + SizedBox(height: Adapt.px(5)), + Container( + height: Adapt.px(18), width: Adapt.px(350), color: _color), + ], + ), + ), + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + children: List(4).map((e) => const _ShimmerCell()).toList(), + ), + ); + } +} + +class _ItemCell extends StatelessWidget { + final VideoListResult data; + final Function onTap; + const _ItemCell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _rightPanelWidth = Adapt.screenW() - Adapt.px(250); + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(vertical: Adapt.px(25)), + constraints: BoxConstraints(minHeight: Adapt.px(280)), + child: Row( + children: [ + Container( + height: Adapt.px(200), + width: Adapt.px(160), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(25)), + boxShadow: [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? const Color(0xFF8E8E8E) + : const Color(0x00000000), + offset: Offset(0, Adapt.px(25)), + blurRadius: Adapt.px(20), + spreadRadius: -Adapt.px(10)) + ], + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: _rightPanelWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.title, + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(30)), + ), + SizedBox(height: Adapt.px(5)), + data.genreIds.length > 0 + ? Text( + data.genreIds + .take(3) + .map((e) => Genres.instance.movieList[e]) + .join(', '), + style: TextStyle( + color: const Color(0xFF9E9E9E), + fontSize: Adapt.px(20), + ), + ) + : SizedBox(), + SizedBox(height: Adapt.px(5)), + Text.rich( + TextSpan(children: [ + TextSpan( + text: 'Release on ', + style: TextStyle(color: const Color(0xFF9E9E9E))), + TextSpan( + text: DateFormat.yMMMd() + .format(DateTime.parse(data.releaseDate))) + ]), + style: TextStyle(fontSize: Adapt.px(20)), + ), + SizedBox(height: Adapt.px(15)), + //Text(data.voteAverage.toString()), + Text( + data.overview, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ) + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/coming_page/components/tab_component/action.dart b/lib/views/coming_page/components/tab_component/action.dart new file mode 100644 index 00000000..262cff59 --- /dev/null +++ b/lib/views/coming_page/components/tab_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TabAction { action } + +class TabActionCreator { + static Action onAction() { + return const Action(TabAction.action); + } +} diff --git a/lib/views/coming_page/components/tab_component/component.dart b/lib/views/coming_page/components/tab_component/component.dart new file mode 100644 index 00000000..3e99b1b6 --- /dev/null +++ b/lib/views/coming_page/components/tab_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TabComponent extends Component { + TabComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.showMovie != newState.showMovie; + }, + effect: buildEffect(), + reducer: buildReducer(), + clearOnDependenciesChanged: true, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/coming_page/components/tab_component/effect.dart b/lib/views/coming_page/components/tab_component/effect.dart new file mode 100644 index 00000000..0a5bb76b --- /dev/null +++ b/lib/views/coming_page/components/tab_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TabAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/coming_page/components/tab_component/reducer.dart b/lib/views/coming_page/components/tab_component/reducer.dart new file mode 100644 index 00000000..439bd6c8 --- /dev/null +++ b/lib/views/coming_page/components/tab_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TabAction.action: _onAction, + }, + ); +} + +TabState _onAction(TabState state, Action action) { + final TabState newState = state.clone(); + return newState; +} diff --git a/lib/views/coming_page/components/tab_component/state.dart b/lib/views/coming_page/components/tab_component/state.dart new file mode 100644 index 00000000..1f1123f4 --- /dev/null +++ b/lib/views/coming_page/components/tab_component/state.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/coming_page/state.dart'; + +class TabState implements Cloneable { + bool showMovie; + @override + TabState clone() { + return TabState()..showMovie = showMovie; + } +} + +class TabConnector extends ConnOp { + @override + TabState get(ComingPageState state) { + TabState substate = new TabState(); + substate.showMovie = state.showmovie; + return substate; + } +} diff --git a/lib/views/coming_page/components/tab_component/view.dart b/lib/views/coming_page/components/tab_component/view.dart new file mode 100644 index 00000000..0f51d51b --- /dev/null +++ b/lib/views/coming_page/components/tab_component/view.dart @@ -0,0 +1,35 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/coming_page/action.dart'; + +import 'state.dart'; + +Widget buildView(TabState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + return Container( + child: TabBar( + onTap: (i) { + if (i == 0) + dispatch(ComingPageActionCreator.onFilterChanged(true)); + else + dispatch(ComingPageActionCreator.onFilterChanged(false)); + }, + indicatorSize: TabBarIndicatorSize.label, + indicatorColor: _theme.tabBarTheme.labelColor, + labelColor: _theme.tabBarTheme.labelColor, + unselectedLabelColor: _theme.tabBarTheme.unselectedLabelColor, + labelStyle: TextStyle(fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + unselectedLabelStyle: TextStyle(color: const Color(0xFF9E9E9E)), + tabs: [ + Tab( + text: I18n.of(viewService.context).movies, + ), + Tab( + text: I18n.of(viewService.context).tvShows, + ) + ], + )); +} diff --git a/lib/views/coming_page/components/tv_component/action.dart b/lib/views/coming_page/components/tv_component/action.dart new file mode 100644 index 00000000..46396b49 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/action.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; + +enum TVListAction { action, loadSeason, updateSeason } + +class TVListActionCreator { + static Action onAction() { + return const Action(TVListAction.action); + } + + static Action onLoadSeason(int i) { + return Action(TVListAction.loadSeason, payload: i); + } + + static Action onUpdateSeason(int i, TVDetailModel d) { + return Action(TVListAction.updateSeason, payload: [i, d]); + } +} diff --git a/lib/views/coming_page/components/tv_component/adapter.dart b/lib/views/coming_page/components/tv_component/adapter.dart new file mode 100644 index 00000000..12ca8c4a --- /dev/null +++ b/lib/views/coming_page/components/tv_component/adapter.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/coming_page/components/tv_component/shimmercell_component/component.dart'; +import 'package:movie/views/coming_page/components/tv_component/tvcell_component/component.dart'; + +import 'state.dart'; + +class TVlistAdapter extends SourceFlowAdapter { + TVlistAdapter() + : super( + pool: >{ + 'tvcell': TVCellComponent(), + 'shimmercell': ShimmerCellComponent() + }, + ); +} diff --git a/lib/views/coming_page/components/tv_component/component.dart b/lib/views/coming_page/components/tv_component/component.dart new file mode 100644 index 00000000..3c89d05e --- /dev/null +++ b/lib/views/coming_page/components/tv_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/coming_page/components/tv_component/adapter.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TVListComponent extends Component { + TVListComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.page != newState.page; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + TVlistAdapter(), + slots: >{}), + ); +} diff --git a/lib/views/coming_page/components/tv_component/effect.dart b/lib/views/coming_page/components/tv_component/effect.dart new file mode 100644 index 00000000..f3b37054 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/effect.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TVListAction.action: _onAction, + TVListAction.loadSeason: _onLoadSeason + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onLoadSeason(Action action, Context ctx) async { + if (ctx.state.tvcoming.results[action.payload].nextAirDate == null) { + final _tmdb = TMDBApi.instance; + var r = + await _tmdb.getTVDetail(ctx.state.tvcoming.results[action.payload].id); + if (r.success) + ctx.dispatch( + TVListActionCreator.onUpdateSeason(action.payload, r.result)); + } +} diff --git a/lib/views/coming_page/components/tv_component/reducer.dart b/lib/views/coming_page/components/tv_component/reducer.dart new file mode 100644 index 00000000..0f9634be --- /dev/null +++ b/lib/views/coming_page/components/tv_component/reducer.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TVListAction.action: _onAction, + TVListAction.updateSeason: _onUpdateSeason + }, + ); +} + +TVListState _onAction(TVListState state, Action action) { + final TVListState newState = state.clone(); + return newState; +} + +TVListState _onUpdateSeason(TVListState state, Action action) { + final int i = action.payload[0] ?? 0; + final TVDetailModel d = action.payload[1]; + final TVListState newState = state.clone(); + newState.tvcoming.results[i].nextAirDate = d.nextEpisodeToAir?.airDate ?? '-'; + newState.tvcoming.results[i].nextEpisodeName = + d.nextEpisodeToAir?.name ?? '-'; + newState.tvcoming.results[i].nextEpisodeNumber = + d.nextEpisodeToAir?.episodeNumber?.toString(); + newState.tvcoming.results[i].season = d.numberOfSeasons.toString(); + return newState; +} diff --git a/lib/views/coming_page/components/tv_component/shimmercell_component/component.dart b/lib/views/coming_page/components/tv_component/shimmercell_component/component.dart new file mode 100644 index 00000000..088ebc31 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/shimmercell_component/component.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class ShimmerCellComponent extends Component { + ShimmerCellComponent() + : super( + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/coming_page/components/tv_component/shimmercell_component/state.dart b/lib/views/coming_page/components/tv_component/shimmercell_component/state.dart new file mode 100644 index 00000000..3a55a055 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/shimmercell_component/state.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +class ShimmerCellState implements Cloneable { +bool showShimmer; + +ShimmerCellState({this.showShimmer=true}); + + @override + ShimmerCellState clone() { + return ShimmerCellState(); + } +} + +ShimmerCellState initState(Map args) { + return ShimmerCellState(); +} diff --git a/lib/views/coming_page/components/tv_component/shimmercell_component/view.dart b/lib/views/coming_page/components/tv_component/shimmercell_component/view.dart new file mode 100644 index 00000000..d550182a --- /dev/null +++ b/lib/views/coming_page/components/tv_component/shimmercell_component/view.dart @@ -0,0 +1,91 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + ShimmerCellState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + return Offstage( + offstage: state.showShimmer, + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + children: [ + const _ShimmerCell(), + const _ShimmerCell(), + const _ShimmerCell(), + const _ShimmerCell(), + ], + ), + )); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + final _color = const Color(0xFFFFFFFF); + return Container( + padding: EdgeInsets.symmetric(vertical: Adapt.px(25)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: Adapt.px(220), + width: Adapt.px(160), + decoration: BoxDecoration( + color: _color, + borderRadius: BorderRadius.circular(Adapt.px(25)), + ), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(10)), + Container( + width: Adapt.px(350), + height: Adapt.px(30), + color: _color, + ), + SizedBox( + height: 5, + ), + Container( + width: Adapt.px(150), + height: Adapt.px(24), + color: _color, + ), + SizedBox( + height: Adapt.px(8), + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + width: Adapt.screenW() - Adapt.px(300), + height: Adapt.px(24), + color: _color, + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + width: Adapt.screenW() - Adapt.px(300), + height: Adapt.px(24), + color: _color, + ) + ], + ) + ], + ), + ); + } +} diff --git a/lib/views/coming_page/components/tv_component/state.dart b/lib/views/coming_page/components/tv_component/state.dart new file mode 100644 index 00000000..efbcbe2a --- /dev/null +++ b/lib/views/coming_page/components/tv_component/state.dart @@ -0,0 +1,59 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/coming_page/components/tv_component/tvcell_component/state.dart'; +import 'package:movie/views/coming_page/state.dart'; + +import 'shimmercell_component/state.dart'; + +class TVListState extends MutableSource implements Cloneable { + VideoListModel tvcoming; + int page; + ScrollController tvController; + @override + TVListState clone() { + return TVListState() + ..tvcoming = tvcoming + ..tvController = tvController; + } + + @override + Object getItemData(int index) { + if (index < tvcoming.results.length) + return TVCellState(tvResult: tvcoming.results[index], index: index); + else + return ShimmerCellState( + showShimmer: tvcoming.page == tvcoming.totalResults && + tvcoming.results.length > 0); + } + + @override + String getItemType(int index) { + if (index < tvcoming.results.length) + return 'tvcell'; + else + return 'shimmercell'; + } + + @override + int get itemCount => tvcoming.results.length + 1; + + @override + void setItemData(int index, Object data) {} +} + +class TVListConnector extends ConnOp { + @override + TVListState get(ComingPageState state) { + TVListState substate = new TVListState(); + substate.tvcoming = state.tvcoming; + substate.tvController = state.tvController; + substate.page = state.tvPage; + return substate; + } + + @override + void set(ComingPageState state, TVListState subState) { + state.tvcoming = subState.tvcoming; + } +} diff --git a/lib/views/coming_page/components/tv_component/tvcell_component/action.dart b/lib/views/coming_page/components/tv_component/tvcell_component/action.dart new file mode 100644 index 00000000..4ebfc3b0 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/tvcell_component/action.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/models/video_list.dart'; + +enum TVCellAction { action, loadSeason, cellTapped } + +class TVCellActionCreator { + static Action onAction() { + return const Action(TVCellAction.action); + } + + static Action onLoadSeason(TVDetailModel d) { + return Action(TVCellAction.loadSeason, payload: d); + } + + static Action cellTapped(VideoListResult d) { + return Action(TVCellAction.cellTapped, payload: d); + } +} diff --git a/lib/views/coming_page/components/tv_component/tvcell_component/component.dart b/lib/views/coming_page/components/tv_component/tvcell_component/component.dart new file mode 100644 index 00000000..fdd0bf7a --- /dev/null +++ b/lib/views/coming_page/components/tv_component/tvcell_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TVCellComponent extends Component { + TVCellComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/coming_page/components/tv_component/tvcell_component/effect.dart b/lib/views/coming_page/components/tv_component/tvcell_component/effect.dart new file mode 100644 index 00000000..52d392b6 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/tvcell_component/effect.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/coming_page/components/tv_component/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TVCellAction.action: _onAction, + Lifecycle.initState: _onLoadSeason, + TVCellAction.cellTapped: _cellTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onLoadSeason(Action action, Context ctx) async { + ctx.broadcast(TVListActionCreator.onLoadSeason(ctx.state.index)); +} + +void _cellTapped(Action action, Context ctx) async { + VideoListResult _d = action.payload; + if (_d != null) + await Navigator.of(ctx.context).pushNamed('tvShowDetailPage', arguments: { + 'id': _d.id, + 'bgpic': _d.backdropPath, + 'name': _d.name, + 'posterpic': _d.posterPath + }); +} diff --git a/lib/views/coming_page/components/tv_component/tvcell_component/reducer.dart b/lib/views/coming_page/components/tv_component/tvcell_component/reducer.dart new file mode 100644 index 00000000..e33aed19 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/tvcell_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TVCellAction.action: _onAction, + }, + ); +} + +TVCellState _onAction(TVCellState state, Action action) { + final TVCellState newState = state.clone(); + return newState; +} diff --git a/lib/views/coming_page/components/tv_component/tvcell_component/state.dart b/lib/views/coming_page/components/tv_component/tvcell_component/state.dart new file mode 100644 index 00000000..f881882e --- /dev/null +++ b/lib/views/coming_page/components/tv_component/tvcell_component/state.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +class TVCellState implements Cloneable { + VideoListResult tvResult; + int index; + TVCellState({this.tvResult, this.index}); + + @override + TVCellState clone() { + return TVCellState() + ..tvResult = tvResult + ..index = index; + } +} + +TVCellState initState(Map args) { + return TVCellState(); +} diff --git a/lib/views/coming_page/components/tv_component/tvcell_component/view.dart b/lib/views/coming_page/components/tv_component/tvcell_component/view.dart new file mode 100644 index 00000000..e5499701 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/tvcell_component/view.dart @@ -0,0 +1,123 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/models/enums/genres.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + TVCellState state, Dispatch dispatch, ViewService viewService) { + final d = state.tvResult; + return _ItemCell( + data: d, + onTap: () => dispatch(TVCellActionCreator.cellTapped(d)), + ); +} + +class _ItemCell extends StatelessWidget { + final VideoListResult data; + final Function onTap; + const _ItemCell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _rightPanelWidth = Adapt.screenW() - Adapt.px(250); + return InkWell( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(vertical: Adapt.px(15)), + constraints: BoxConstraints(minHeight: Adapt.px(280)), + child: Row( + children: [ + Container( + height: Adapt.px(220), + width: Adapt.px(160), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(25)), + boxShadow: [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? const Color(0xFF8E8E8E) + : const Color(0x00000000), + offset: Offset(0, Adapt.px(25)), + blurRadius: Adapt.px(20), + spreadRadius: -Adapt.px(10)) + ], + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: _rightPanelWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.name, + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(30)), + ), + SizedBox(height: Adapt.px(5)), + data.genreIds.length > 0 + ? Text( + data.genreIds + .take(3) + .map((e) => Genres.instance.tvList[e]) + .join(', '), + style: TextStyle( + color: const Color(0xFF9E9E9E), + fontSize: Adapt.px(20), + ), + ) + : SizedBox(), + SizedBox(height: Adapt.px(5)), + Text.rich( + TextSpan(children: [ + TextSpan( + text: 'Next Air Date ', + style: TextStyle(color: const Color(0xFF9E9E9E))), + TextSpan( + text: data.nextAirDate != null + ? DateFormat.yMMMd() + .format(DateTime.parse(data.nextAirDate)) + : '-') + ]), + style: TextStyle(fontSize: Adapt.px(20)), + ), + SizedBox(height: Adapt.px(5)), + Text( + 'S${data.season ?? '-'} · EP${data.nextEpisodeNumber ?? '-'}', + style: TextStyle( + fontSize: Adapt.px(20), color: const Color(0xFF9E9E9E)), + ), + + SizedBox(height: Adapt.px(15)), + //Text(data.voteAverage.toString()), + Text( + data.overview, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ) + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/coming_page/components/tv_component/view.dart b/lib/views/coming_page/components/tv_component/view.dart new file mode 100644 index 00000000..95f13ee4 --- /dev/null +++ b/lib/views/coming_page/components/tv_component/view.dart @@ -0,0 +1,36 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/keepalive_widget.dart'; + +import 'state.dart'; + +Widget buildView( + TVListState state, Dispatch dispatch, ViewService viewService) { + var adapter = viewService.buildAdapter(); + + return keepAliveWrapper( + AnimatedSwitcher( + duration: Duration(milliseconds: 600), + child: ListView.separated( + key: ValueKey(state.tvcoming), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + controller: state.tvController, + separatorBuilder: (_, index) => const _SeparatorItem(), + itemBuilder: adapter.itemBuilder, + itemCount: adapter.itemCount, + ), + ), + ); +} + +class _SeparatorItem extends StatelessWidget { + const _SeparatorItem({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only(left: Adapt.px(190)), + child: Divider(), + ); + } +} diff --git a/lib/views/coming_page/effect.dart b/lib/views/coming_page/effect.dart new file mode 100644 index 00000000..d7257fad --- /dev/null +++ b/lib/views/coming_page/effect.dart @@ -0,0 +1,62 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/response_model.dart'; +import 'package:movie/models/video_list.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ComingPageAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final _tmdb = TMDBApi.instance; + ctx.state.movieController = new ScrollController() + ..addListener(() async { + bool isBottom = ctx.state.movieController.position.pixels == + (ctx.state.movieController.position.maxScrollExtent); + if (isBottom) { + await _onLoadMore(action, ctx); + } + }); + ctx.state.tvController = new ScrollController() + ..addListener(() async { + bool isBottom = ctx.state.tvController.position.pixels == + ctx.state.tvController.position.maxScrollExtent; + if (isBottom) { + await _onLoadMore(action, ctx); + } + }); + var q = await _tmdb.getMovieUpComing(); + if (q.result != null) + ctx.dispatch(ComingPageActionCreator.onInitMoviesComing(q.result)); + var t = await _tmdb.getTVOnTheAir(); + if (t.result != null) + ctx.dispatch(ComingPageActionCreator.onInitTVComing(t.result)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.tvController.dispose(); + ctx.state.movieController.dispose(); +} + +Future _onLoadMore(Action action, Context ctx) async { + ResponseModel q; + final _tmdb = TMDBApi.instance; + if (ctx.state.showmovie) { + if (ctx.state.moviecoming.page == ctx.state.moviecoming.totalPages) return; + q = await _tmdb.getMovieUpComing(page: ctx.state.moviecoming.page + 1); + } else { + if (ctx.state.tvcoming.page == ctx.state.tvcoming.totalPages) return; + q = await _tmdb.getTVOnTheAir(page: ctx.state.tvcoming.page + 1); + } + if (q.result != null) + ctx.dispatch(ComingPageActionCreator.onLoadMore(q.result)); +} diff --git a/lib/views/coming_page/page.dart b/lib/views/coming_page/page.dart new file mode 100644 index 00000000..b842980e --- /dev/null +++ b/lib/views/coming_page/page.dart @@ -0,0 +1,30 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/coming_page/components/movie_component/component.dart'; +import 'package:movie/views/coming_page/components/movie_component/state.dart'; +import 'package:movie/views/coming_page/components/tab_component/component.dart'; +import 'package:movie/views/coming_page/components/tab_component/state.dart'; + +import 'components/tv_component/component.dart'; +import 'components/tv_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ComingPage extends Page> { + ComingPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'tab': TabConnector() + TabComponent(), + 'movielist': MovieListConnector() + MovieListComponent(), + 'tvlist': TVListConnector() + TVListComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/coming_page/reducer.dart b/lib/views/coming_page/reducer.dart new file mode 100644 index 00000000..39a34f2f --- /dev/null +++ b/lib/views/coming_page/reducer.dart @@ -0,0 +1,63 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ComingPageAction.action: _onAction, + ComingPageAction.initMoviesComing: _onInitMoviesComing, + ComingPageAction.initTVComing: _onInitTVComing, + ComingPageAction.loadMore: _onLoadMore, + ComingPageAction.filterChanged: _onFilterChanged + }, + ); +} + +ComingPageState _onAction(ComingPageState state, Action action) { + final ComingPageState newState = state.clone(); + return newState; +} + +ComingPageState _onInitMoviesComing(ComingPageState state, Action action) { + final VideoListModel q = action.payload ?? + VideoListModel.fromParams(results: List()); + final ComingPageState newState = state.clone(); + newState.moviecoming = q; + newState.moviePage = q.page; + return newState; +} + +ComingPageState _onLoadMore(ComingPageState state, Action action) { + final VideoListModel q = action.payload ?? + VideoListModel.fromParams(results: List()); + final ComingPageState newState = state.clone(); + if (newState.showmovie) { + newState.moviePage = q.page; + newState.moviecoming.page = q.page; + newState.moviecoming.results.addAll(q.results); + } else { + newState.tvPage = q.page; + newState.tvcoming.page = q.page; + newState.tvcoming.results.addAll(q.results); + } + return newState; +} + +ComingPageState _onInitTVComing(ComingPageState state, Action action) { + final VideoListModel q = action.payload ?? + VideoListModel.fromParams(results: List()); + final ComingPageState newState = state.clone(); + newState.tvcoming = q; + newState.tvPage = q.page; + return newState; +} + +ComingPageState _onFilterChanged(ComingPageState state, Action action) { + final bool b = action.payload ?? true; + final ComingPageState newState = state.clone(); + newState.showmovie = b; + return newState; +} diff --git a/lib/views/coming_page/state.dart b/lib/views/coming_page/state.dart new file mode 100644 index 00000000..b7220ec8 --- /dev/null +++ b/lib/views/coming_page/state.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/video_list.dart'; + +class ComingPageState implements Cloneable { + VideoListModel moviecoming; + VideoListModel tvcoming; + ScrollController movieController; + ScrollController tvController; + bool showmovie; + int moviePage; + int tvPage; + + @override + ComingPageState clone() { + return ComingPageState() + ..movieController = movieController + ..tvController = tvController + ..moviecoming = moviecoming + ..tvcoming = tvcoming + ..showmovie = showmovie + ..moviePage = moviePage + ..tvPage = tvPage; + } +} + +ComingPageState initState(Map args) { + var state = ComingPageState(); + state.showmovie = true; + state.moviecoming = + VideoListModel.fromParams(results: List()); + state.tvcoming = VideoListModel.fromParams(results: List()); + return state; +} diff --git a/lib/views/coming_page/view.dart b/lib/views/coming_page/view.dart new file mode 100644 index 00000000..dc13d803 --- /dev/null +++ b/lib/views/coming_page/view.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + ComingPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return DefaultTabController( + length: 2, + child: Scaffold( + appBar: AppBar( + brightness: _theme.brightness, + title: viewService.buildComponent('tab'), + backgroundColor: _theme.backgroundColor, + elevation: 0.0, + ), + body: TabBarView( + physics: NeverScrollableScrollPhysics(), + children: [ + viewService.buildComponent('movielist'), + viewService.buildComponent('tvlist'), + ], + )), + ); + }); +} diff --git a/lib/views/createlist_page/action.dart b/lib/views/createlist_page/action.dart new file mode 100644 index 00000000..28406d95 --- /dev/null +++ b/lib/views/createlist_page/action.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum CreateListPageAction { + action, + uploadBackground, + setBackground, + setLoading, + submit, +} + +class CreateListPageActionCreator { + static Action onAction() { + return const Action(CreateListPageAction.action); + } + + static Action onSubmit() { + return const Action(CreateListPageAction.submit); + } + + static Action uploadBackground() { + return const Action(CreateListPageAction.uploadBackground); + } + + static Action setBackground(String url) { + return Action(CreateListPageAction.setBackground, payload: url); + } + + static Action setLoading(bool loading) { + return Action(CreateListPageAction.setLoading, payload: loading); + } +} diff --git a/lib/views/createlist_page/effect.dart b/lib/views/createlist_page/effect.dart new file mode 100644 index 00000000..9dec92d4 --- /dev/null +++ b/lib/views/createlist_page/effect.dart @@ -0,0 +1,85 @@ +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:image_picker/image_picker.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:path/path.dart' as Path; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CreateListPageAction.action: _onAction, + CreateListPageAction.submit: _submit, + CreateListPageAction.uploadBackground: _uploadBackground, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} +void _onInit(Action action, Context ctx) { + ctx.state.nameTextController = TextEditingController(text: ctx.state.name); + ctx.state.descriptionTextController = + TextEditingController(text: ctx.state.description); +} + +void _onDispose(Action action, Context ctx) async { + ctx.state.nameTextController?.dispose(); + ctx.state.descriptionTextController?.dispose(); + ctx.state.nameFoucsNode?.dispose(); + ctx.state.descriptionFoucsNode?.dispose(); +} + +void _submit(Action action, Context ctx) { + ctx.state.nameFoucsNode.unfocus(); + ctx.state.descriptionFoucsNode.unfocus(); + final _baseApi = BaseApi.instance; + if (ctx.state.user != null) { + if (ctx.state.listData != null) + _baseApi.updateUserList(ctx.state.listData + ..backGroundUrl = ctx.state.backGroundUrl + ..description = ctx.state.descriptionTextController.text); + else { + final _date = DateTime.now().toString(); + ctx.state.listData = UserList.fromParams( + uid: ctx.state.user.firebaseUser.uid, + listName: ctx.state.nameTextController.text, + backGroundUrl: ctx.state.backGroundUrl, + description: ctx.state.descriptionTextController.text, + createTime: _date, + updateTime: _date, + revenue: 0, + runTime: 0, + itemCount: 0, + totalRated: 0, + ); + _baseApi.createUserList(ctx.state.listData); + } + + Navigator.of(ctx.context).pop(ctx.state.listData); + } +} + +void _uploadBackground(Action action, Context ctx) async { + final ImagePicker _imagePicker = ImagePicker(); + final _image = await _imagePicker.getImage( + source: ImageSource.gallery, maxHeight: 1920, maxWidth: 1080); + if (_image != null) { + ctx.dispatch(CreateListPageActionCreator.setLoading(true)); + StorageReference storageReference = FirebaseStorage.instance + .ref() + .child('avatar/${Path.basename(_image.path)}'); + StorageUploadTask uploadTask = + storageReference.putData(await _image.readAsBytes()); + await uploadTask.onComplete; + print('File Uploaded'); + storageReference.getDownloadURL().then((fileURL) { + if (fileURL != null) { + ctx.dispatch(CreateListPageActionCreator.setBackground(fileURL)); + } + }); + ctx.dispatch(CreateListPageActionCreator.setLoading(false)); + } +} diff --git a/lib/views/createlist_page/page.dart b/lib/views/createlist_page/page.dart new file mode 100644 index 00000000..0b95ce3e --- /dev/null +++ b/lib/views/createlist_page/page.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CreateListPage extends Page> { + CreateListPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/createlist_page/reducer.dart b/lib/views/createlist_page/reducer.dart new file mode 100644 index 00000000..4e3d0bfc --- /dev/null +++ b/lib/views/createlist_page/reducer.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CreateListPageAction.action: _onAction, + CreateListPageAction.setBackground: _setBackground, + CreateListPageAction.setLoading: _setLoading, + }, + ); +} + +CreateListPageState _onAction(CreateListPageState state, Action action) { + final CreateListPageState newState = state.clone(); + return newState; +} + +CreateListPageState _setBackground(CreateListPageState state, Action action) { + final String _url = action.payload; + final CreateListPageState newState = state.clone(); + newState.backGroundUrl = _url; + return newState; +} + +CreateListPageState _setLoading(CreateListPageState state, Action action) { + final bool _loading = action.payload; + final CreateListPageState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/createlist_page/state.dart b/lib/views/createlist_page/state.dart new file mode 100644 index 00000000..75c458ac --- /dev/null +++ b/lib/views/createlist_page/state.dart @@ -0,0 +1,54 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/models/app_user.dart'; + +class CreateListPageState + implements GlobalBaseState, Cloneable { + UserList listData; + String name; + String backGroundUrl; + String description; + TextEditingController nameTextController; + TextEditingController descriptionTextController; + FocusNode nameFoucsNode; + FocusNode descriptionFoucsNode; + bool loading; + @override + CreateListPageState clone() { + return CreateListPageState() + ..listData = listData + ..name = name + ..backGroundUrl = backGroundUrl + ..description = description + ..user = user + ..nameTextController = nameTextController + ..descriptionTextController = descriptionTextController + ..nameFoucsNode = nameFoucsNode + ..descriptionFoucsNode = descriptionFoucsNode + ..loading = loading; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +CreateListPageState initState(Map args) { + CreateListPageState state = CreateListPageState(); + UserList _listData = args != null ? args['list'] : null; + state.listData = _listData; + state.name = _listData != null ? _listData.listName : ''; + state.backGroundUrl = _listData != null ? _listData.backGroundUrl : ''; + state.description = _listData != null ? _listData.description : ''; + state.nameFoucsNode = FocusNode(); + state.descriptionFoucsNode = FocusNode(); + state.loading = false; + return state; +} diff --git a/lib/views/createlist_page/view.dart b/lib/views/createlist_page/view.dart new file mode 100644 index 00000000..3d2fc909 --- /dev/null +++ b/lib/views/createlist_page/view.dart @@ -0,0 +1,209 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/loading_layout.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CreateListPageState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Stack( + children: [ + Scaffold( + backgroundColor: _theme.backgroundColor, + appBar: AppBar( + iconTheme: _theme.iconTheme, + elevation: 0.0, + backgroundColor: _theme.backgroundColor, + title: Text( + 'CreatList', + style: _theme.textTheme.bodyText1, + ), + actions: [ + FlatButton( + onPressed: () => + dispatch(CreateListPageActionCreator.onSubmit()), + child: Text( + 'Save', + style: TextStyle( + color: _theme.textTheme.bodyText1.color, fontSize: 16), + ), + ) + ], + ), + body: _Body( + backGroundUrl: state.backGroundUrl, + descriptionTextController: state.descriptionTextController, + listData: state.listData, + nameTextController: state.nameTextController, + dispatch: dispatch, + nameFoucsNode: state.nameFoucsNode, + descriptionFoucsNode: state.descriptionFoucsNode, + onUploadImage: () => + dispatch(CreateListPageActionCreator.uploadBackground()), + ), + ), + LoadingLayout( + title: 'loading...', + show: state.loading, + ) + ], + ); + }, + ); +} + +class _Body extends StatelessWidget { + final TextEditingController nameTextController; + final String backGroundUrl; + final TextEditingController descriptionTextController; + final FocusNode nameFoucsNode; + final FocusNode descriptionFoucsNode; + final UserList listData; + final Dispatch dispatch; + final Function onUploadImage; + _Body({ + this.backGroundUrl, + this.descriptionTextController, + this.dispatch, + this.listData, + this.nameTextController, + this.descriptionFoucsNode, + this.nameFoucsNode, + this.onUploadImage, + }); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(Adapt.px(30)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _CustomTextField( + title: 'Name', + controller: nameTextController, + focusNode: nameFoucsNode, + ), + _BackGroundUpLoad( + url: backGroundUrl, + onTap: onUploadImage, + ), + _CustomTextField( + title: 'Description', + controller: descriptionTextController, + focusNode: descriptionFoucsNode, + maxLines: 12, + ), + ], + ), + ); + } +} + +class _CustomTextField extends StatelessWidget { + final String title; + final double width; + final int maxLines; + final FocusNode focusNode; + final TextEditingController controller; + const _CustomTextField( + {this.title, + this.width, + this.maxLines = 1, + this.controller, + this.focusNode}); + @override + Widget build(BuildContext context) { + final double _fontSize = 20; + final Size _size = MediaQuery.of(context).size; + final _intputBorder = OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: const Color(0xFF9E9E9E))); + return Container( + width: width ?? _size.width, + padding: EdgeInsets.only(bottom: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: TextStyle(fontSize: _fontSize)), + SizedBox(height: 10), + TextField( + controller: controller, + maxLines: maxLines, + focusNode: focusNode, + cursorColor: const Color(0xFF9E9E9E), + decoration: InputDecoration( + contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), + enabledBorder: _intputBorder, + disabledBorder: _intputBorder, + focusedBorder: _intputBorder, + ), + ), + ], + ), + ); + } +} + +class _BackGroundUpLoad extends StatelessWidget { + final String url; + final Function onTap; + const _BackGroundUpLoad({this.onTap, this.url}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _size = MediaQuery.of(context).size; + return Padding( + padding: EdgeInsets.only(bottom: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Background', style: TextStyle(fontSize: 20)), + SizedBox(height: 10), + GestureDetector( + onTap: onTap, + child: Container( + height: 50, + padding: EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: const Color(0xFF9E9E9E))), + child: Row( + children: [ + SizedBox( + width: _size.width - 120, + child: Text( + url ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Spacer(), + Container( + width: 30, + height: 30, + decoration: BoxDecoration( + color: _theme.iconTheme.color, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.file_upload, + color: _theme.accentIconTheme.color, + size: 20, + ), + ), + ], + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/views/detail_page/action.dart b/lib/views/detail_page/action.dart new file mode 100644 index 00000000..6318c59f --- /dev/null +++ b/lib/views/detail_page/action.dart @@ -0,0 +1,71 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/movie_detail.dart'; + +enum MovieDetailPageAction { + action, + updateDetail, + setImages, + playStreamLink, + externalTapped, + stillImageTapped, + movieCellTapped, + castCellTapped, + setAccountState, + openMenu, + showSnackBar, + setHasStreamLink, +} + +class MovieDetailPageActionCreator { + static Action onAction() { + return const Action(MovieDetailPageAction.action); + } + + static Action updateDetail(MovieDetailModel d) { + return Action(MovieDetailPageAction.updateDetail, payload: d); + } + + static Action onSetImages(ImageModel c) { + return Action(MovieDetailPageAction.setImages, payload: c); + } + + static Action playTrailer() { + return const Action(MovieDetailPageAction.playStreamLink); + } + + static Action onExternalTapped(String url) { + return Action(MovieDetailPageAction.externalTapped, payload: url); + } + + static Action stillImageTapped(int index) { + return Action(MovieDetailPageAction.stillImageTapped, payload: index); + } + + static Action movieCellTapped(int id, String bgurl) { + return Action(MovieDetailPageAction.movieCellTapped, payload: [id, bgurl]); + } + + static Action castCellTapped( + int id, String profilePath, String profileName, String character) { + return Action(MovieDetailPageAction.castCellTapped, + payload: [id, profilePath, profileName, character]); + } + + static Action onSetAccountState(AccountState model) { + return Action(MovieDetailPageAction.setAccountState, payload: model); + } + + static Action openMenu() { + return Action(MovieDetailPageAction.openMenu); + } + + static Action showSnackBar(String message) { + return Action(MovieDetailPageAction.showSnackBar, payload: message); + } + + static Action setHasStreamLink(bool b) { + return Action(MovieDetailPageAction.setHasStreamLink, payload: b); + } +} diff --git a/lib/views/detail_page/components/appbar_component/action.dart b/lib/views/detail_page/components/appbar_component/action.dart new file mode 100644 index 00000000..83763805 --- /dev/null +++ b/lib/views/detail_page/components/appbar_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum AppBarAction { action } + +class AppBarActionCreator { + static Action onAction() { + return const Action(AppBarAction.action); + } +} diff --git a/lib/views/detail_page/components/appbar_component/component.dart b/lib/views/detail_page/components/appbar_component/component.dart new file mode 100644 index 00000000..7a345c9a --- /dev/null +++ b/lib/views/detail_page/components/appbar_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class AppBarComponent extends Component { + AppBarComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.title != newState.title || + oldState.scrollController != newState.scrollController; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/appbar_component/effect.dart b/lib/views/detail_page/components/appbar_component/effect.dart new file mode 100644 index 00000000..e36d58dc --- /dev/null +++ b/lib/views/detail_page/components/appbar_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + AppBarAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/detail_page/components/appbar_component/reducer.dart b/lib/views/detail_page/components/appbar_component/reducer.dart new file mode 100644 index 00000000..eb76c038 --- /dev/null +++ b/lib/views/detail_page/components/appbar_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + AppBarAction.action: _onAction, + }, + ); +} + +AppBarState _onAction(AppBarState state, Action action) { + final AppBarState newState = state.clone(); + return newState; +} diff --git a/lib/views/detail_page/components/appbar_component/state.dart b/lib/views/detail_page/components/appbar_component/state.dart new file mode 100644 index 00000000..7518a6e5 --- /dev/null +++ b/lib/views/detail_page/components/appbar_component/state.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class AppBarState implements Cloneable { + String title; + ScrollController scrollController; + @override + AppBarState clone() { + return AppBarState() + ..title = title + ..scrollController = scrollController; + } +} + +class AppBarConnector extends ConnOp { + @override + AppBarState get(MovieDetailPageState state) { + AppBarState substate = new AppBarState(); + substate.title = state.detail?.title; + substate.scrollController = state.scrollController; + return substate; + } +} diff --git a/lib/views/detail_page/components/appbar_component/view.dart b/lib/views/detail_page/components/appbar_component/view.dart new file mode 100644 index 00000000..34c66bfe --- /dev/null +++ b/lib/views/detail_page/components/appbar_component/view.dart @@ -0,0 +1,119 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/detail_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + AppBarState state, Dispatch dispatch, ViewService viewService) { + return Positioned( + left: 0, + right: 0, + top: 0, + child: _CustomAppBar( + title: state.title ?? '', + controller: state.scrollController, + menuPress: () => dispatch(MovieDetailPageActionCreator.openMenu()), + ), + ); +} + +class _CustomAppBar extends StatefulWidget { + final ScrollController controller; + final String title; + final Function menuPress; + const _CustomAppBar({this.controller, this.title, this.menuPress}); + @override + _CustomAppBarState createState() => _CustomAppBarState(); +} + +class _CustomAppBarState extends State<_CustomAppBar> { + bool showBar = false; + double _opacity = 0.0; + final double _opacityHeight = Adapt.px(300); + final double _appBarChangeHeight = Adapt.px(600); + final double _totalHeight = Adapt.px(900); + void _checkTitle() { + if (widget.controller.position.pixels >= _appBarChangeHeight) { + double v = + _opacityHeight - (_totalHeight - widget.controller.position.pixels); + v = v > _opacityHeight || v < 0 ? _opacityHeight : v; + _opacity = v / _opacityHeight; + showBar = true; + } else { + showBar = false; + } + setState(() {}); + } + + @override + void initState() { + widget.controller.addListener(_checkTitle); + super.initState(); + } + + @override + void dispose() { + widget.controller.removeListener(_checkTitle); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return showBar + ? AppBar( + key: ValueKey('AppBarShow'), + backgroundColor: _theme.backgroundColor.withOpacity(_opacity), + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + title: Text( + widget.title, + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + actions: [ + IconButton( + onPressed: widget.menuPress, + icon: Icon(Icons.more_vert), + ) + ], + ) + : AppBar( + key: ValueKey('AppBarHide'), + backgroundColor: Colors.transparent, + elevation: 0.0, + leading: InkWell( + child: Container( + margin: EdgeInsets.all(Adapt.px(22)), + decoration: BoxDecoration( + shape: BoxShape.circle, color: const Color(0x60000000)), + child: Icon( + Icons.keyboard_arrow_left, + size: Adapt.px(40), + color: const Color(0xFFFFFFFF), + ), + ), + onTap: () => Navigator.of(context).pop(), + ), + actions: [ + InkWell( + child: Container( + margin: EdgeInsets.all(Adapt.px(22)), + width: 40, + height: 40, + decoration: BoxDecoration( + shape: BoxShape.circle, color: const Color(0x60000000)), + child: Icon( + Icons.more_vert, + size: Adapt.px(40), + color: const Color(0xFFFFFFFF), + ), + ), + onTap: widget.menuPress, + ) + ], + ); + } +} diff --git a/lib/views/detail_page/components/cast_component/action.dart b/lib/views/detail_page/components/cast_component/action.dart new file mode 100644 index 00000000..3bed8cde --- /dev/null +++ b/lib/views/detail_page/components/cast_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum CastAction { action } + +class CastActionCreator { + static Action onAction() { + return const Action(CastAction.action); + } +} diff --git a/lib/views/detail_page/components/cast_component/component.dart b/lib/views/detail_page/components/cast_component/component.dart new file mode 100644 index 00000000..60c49885 --- /dev/null +++ b/lib/views/detail_page/components/cast_component/component.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class CastComponent extends Component { + CastComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.cast != newState.cast; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/cast_component/effect.dart b/lib/views/detail_page/components/cast_component/effect.dart new file mode 100644 index 00000000..c4bdc186 --- /dev/null +++ b/lib/views/detail_page/components/cast_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CastAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/detail_page/components/cast_component/state.dart b/lib/views/detail_page/components/cast_component/state.dart new file mode 100644 index 00000000..6d1fd31e --- /dev/null +++ b/lib/views/detail_page/components/cast_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/detail_page/state.dart'; +import 'package:movie/models/models.dart'; + +class CastState implements Cloneable { + List cast; + @override + CastState clone() { + return CastState(); + } +} + +class CastConnector extends ConnOp { + @override + CastState get(MovieDetailPageState state) { + CastState substate = new CastState(); + substate.cast = state.detail.credits?.cast ?? []; + return substate; + } +} diff --git a/lib/views/detail_page/components/cast_component/view.dart b/lib/views/detail_page/components/cast_component/view.dart new file mode 100644 index 00000000..510faa8d --- /dev/null +++ b/lib/views/detail_page/components/cast_component/view.dart @@ -0,0 +1,176 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/detail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView(CastState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(50)), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Text( + I18n.of(viewService.context).topBilledCast, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(28)), + ), + ), + SizedBox(height: Adapt.px(30)), + _CastList( + data: state.cast, + dispatch: dispatch, + ) + ], + ), + ), + ); +} + +class _CastShimmerCell extends StatelessWidget { + final double width = Adapt.px(150); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: width, + height: width, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(15)), + color: const Color(0xFFEEEEEE), + ), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: width, + height: Adapt.px(24), + color: const Color(0xFFEEEEEE), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.px(100), + height: Adapt.px(24), + color: const Color(0xFFEEEEEE), + ) + ], + ); + } +} + +class _CastShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + physics: BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + separatorBuilder: (context, index) => SizedBox(width: Adapt.px(30)), + itemCount: 5, + itemBuilder: (context, index) => _CastShimmerCell(), + )); + } +} + +class _CastCell extends StatelessWidget { + final CastData data; + final Function onTap; + const _CastCell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final double width = Adapt.px(150); + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Column( + key: ValueKey('Cast${data.id}'), + children: [ + Hero( + tag: 'people${data.id}', + child: Material( + color: Colors.transparent, + child: Container( + width: width, + height: width, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(15)), + color: _theme.primaryColorDark, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(ImageUrl.getUrl( + data.profilePath, ImageSize.w300)))), + ), + )), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: width, + child: Text( + data.name ?? '', + maxLines: 2, + style: TextStyle(fontWeight: FontWeight.bold), + )), + Container( + width: width, + child: Text( + data.character ?? '', + maxLines: 2, + style: TextStyle(color: Colors.grey, fontSize: Adapt.px(24)), + )) + ], + ), + ); + } +} + +class _CastList extends StatelessWidget { + final List data; + final Dispatch dispatch; + const _CastList({this.data, this.dispatch}); + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(300), + child: data.length == 0 + ? _CastShimmerList() + : ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + physics: BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: data.length, + itemBuilder: (_, index) { + final d = data[index]; + return _CastCell( + data: d, + onTap: () => dispatch( + MovieDetailPageActionCreator.castCellTapped( + d.id, d.profilePath, d.name, d.character), + ), + ); + }, + ), + ); + } +} diff --git a/lib/views/detail_page/components/keyword_component/action.dart b/lib/views/detail_page/components/keyword_component/action.dart new file mode 100644 index 00000000..1d01b948 --- /dev/null +++ b/lib/views/detail_page/components/keyword_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum KeyWordAction { action } + +class KeyWordActionCreator { + static Action onAction() { + return const Action(KeyWordAction.action); + } +} diff --git a/lib/views/detail_page/components/keyword_component/component.dart b/lib/views/detail_page/components/keyword_component/component.dart new file mode 100644 index 00000000..e6231f98 --- /dev/null +++ b/lib/views/detail_page/components/keyword_component/component.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class KeyWordComponent extends Component { + KeyWordComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.keyWords != newState.keyWords; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/keyword_component/effect.dart b/lib/views/detail_page/components/keyword_component/effect.dart new file mode 100644 index 00000000..2569a871 --- /dev/null +++ b/lib/views/detail_page/components/keyword_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + KeyWordAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/detail_page/components/keyword_component/state.dart b/lib/views/detail_page/components/keyword_component/state.dart new file mode 100644 index 00000000..90e8383a --- /dev/null +++ b/lib/views/detail_page/components/keyword_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class KeyWordState implements Cloneable { + List keyWords; + @override + KeyWordState clone() { + return KeyWordState(); + } +} + +class KeyWordConnector extends ConnOp { + @override + KeyWordState get(MovieDetailPageState state) { + KeyWordState substate = new KeyWordState(); + substate.keyWords = state.detail?.keywords?.keywords ?? []; + return substate; + } +} diff --git a/lib/views/detail_page/components/keyword_component/view.dart b/lib/views/detail_page/components/keyword_component/view.dart new file mode 100644 index 00000000..a5b1e2e8 --- /dev/null +++ b/lib/views/detail_page/components/keyword_component/view.dart @@ -0,0 +1,144 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + KeyWordState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + return SliverToBoxAdapter( + child: state.keyWords.length == 0 + ? const _ShimmerList() + : _KeyWordPanel(keywords: state.keyWords), + ); + }, + ); +} + +class _KeyWordCell extends StatelessWidget { + final KeyWordData data; + const _KeyWordCell({this.data}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(25), vertical: Adapt.px(13)), + height: Adapt.px(60), + decoration: BoxDecoration( + border: Border.all(color: _theme.primaryColorDark), + borderRadius: BorderRadius.circular(Adapt.px(30))), + child: Text( + data.name, + style: + TextStyle(fontSize: Adapt.px(24), color: const Color(0xFF717171)), + ), + ); + } +} + +class _KeyWordPanel extends StatelessWidget { + final List keywords; + const _KeyWordPanel({this.keywords}); + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + return Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(context).keyWords, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + SizedBox(height: Adapt.px(30)), + SizedBox( + width: Adapt.screenW(), + child: Wrap( + spacing: 12, + runSpacing: 12, + children: + keywords.take(15).map((e) => _KeyWordCell(data: e)).toList(), + ), + ), + SizedBox(height: Adapt.px(30)), + ], + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + final double width; + const _ShimmerCell(this.width); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(25), vertical: Adapt.px(13)), + width: width, + height: Adapt.px(60), + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF), + borderRadius: BorderRadius.circular( + Adapt.px(30), + ), + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + final _theme = ThemeStyle.getTheme(context); + return Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Keywords', + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + SizedBox(height: Adapt.px(30)), + Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: SizedBox( + width: Adapt.screenW(), + child: Wrap( + runAlignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + spacing: 12, + runSpacing: 12, + children: [ + const _ShimmerCell(80), + const _ShimmerCell(100), + const _ShimmerCell(90), + const _ShimmerCell(120), + const _ShimmerCell(80), + ], + ), + ), + ), + SizedBox(height: Adapt.px(30)), + ], + )); + } +} diff --git a/lib/views/detail_page/components/maininfo_component/action.dart b/lib/views/detail_page/components/maininfo_component/action.dart new file mode 100644 index 00000000..1e682a38 --- /dev/null +++ b/lib/views/detail_page/components/maininfo_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MainInfoAction { action } + +class MainInfoActionCreator { + static Action onAction() { + return const Action(MainInfoAction.action); + } +} diff --git a/lib/views/detail_page/components/maininfo_component/component.dart b/lib/views/detail_page/components/maininfo_component/component.dart new file mode 100644 index 00000000..3029ff0c --- /dev/null +++ b/lib/views/detail_page/components/maininfo_component/component.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MainInfoComponent extends Component { + MainInfoComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.bgPic != newState.bgPic || + oldState.detail != newState.detail || + oldState.hasStreamLink != newState.hasStreamLink || + oldState.scrollController != newState.scrollController; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/maininfo_component/effect.dart b/lib/views/detail_page/components/maininfo_component/effect.dart new file mode 100644 index 00000000..d44209d6 --- /dev/null +++ b/lib/views/detail_page/components/maininfo_component/effect.dart @@ -0,0 +1,11 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MainInfoAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) {} diff --git a/lib/views/detail_page/components/maininfo_component/reducer.dart b/lib/views/detail_page/components/maininfo_component/reducer.dart new file mode 100644 index 00000000..ebd16f87 --- /dev/null +++ b/lib/views/detail_page/components/maininfo_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MainInfoAction.action: _onAction, + }, + ); +} + +MainInfoState _onAction(MainInfoState state, Action action) { + final MainInfoState newState = state.clone(); + return newState; +} diff --git a/lib/views/detail_page/components/maininfo_component/state.dart b/lib/views/detail_page/components/maininfo_component/state.dart new file mode 100644 index 00000000..e7ba41e3 --- /dev/null +++ b/lib/views/detail_page/components/maininfo_component/state.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class MainInfoState implements Cloneable { + String bgPic; + MovieDetailModel detail; + ScrollController scrollController; + bool hasStreamLink; + @override + MainInfoState clone() { + return MainInfoState(); + } +} + +class MainInfoConnector extends ConnOp { + @override + MainInfoState get(MovieDetailPageState state) { + MainInfoState substate = MainInfoState(); + substate.bgPic = state.bgPic; + substate.detail = state.detail; + substate.hasStreamLink = state.hasStreamLink; + substate.scrollController = state.scrollController; + return substate; + } +} diff --git a/lib/views/detail_page/components/maininfo_component/view.dart b/lib/views/detail_page/components/maininfo_component/view.dart new file mode 100644 index 00000000..3a0e7217 --- /dev/null +++ b/lib/views/detail_page/components/maininfo_component/view.dart @@ -0,0 +1,465 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/genre.dart'; +import 'package:movie/widgets/scrollview_background.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/external_ids_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/detail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + MainInfoState state, Dispatch dispatch, ViewService viewService) { + final _height = Adapt.px(1150); + return Builder( + builder: (context) { + return SliverToBoxAdapter( + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + AnimatedSwitcher( + duration: Duration(milliseconds: 600), + child: SizedBox( + height: _height, + child: _HeaderBackground( + imgUrl: state.bgPic, + scrollController: state.scrollController, + ), + ), + ), + _HeaderTitle( + title: state.detail?.title, + releaseDate: state.detail?.releaseDate, + genres: state.detail?.genres ?? [], + voteAverage: state.detail?.voteAverage ?? 0, + voteCount: state.detail?.voteCount ?? 0, + runtime: state.detail?.runtime ?? 0, + ), + _OperatePanel( + dispatch: dispatch, + hasStreamLink: state.hasStreamLink, + externalIds: state.detail.externalIds, + homePage: state.detail.homepage, + ), + ], + ), + ); + }, + ); +} + +class _HeaderTitleShimmer extends StatelessWidget { + const _HeaderTitleShimmer(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(400), + height: Adapt.px(40), + color: _theme.primaryColorDark, + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.px(120), + height: Adapt.px(24), + color: _theme.primaryColorDark, + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.px(200), + height: Adapt.px(24), + color: _theme.primaryColorDark, + ), + ], + ), + ); + } +} + +class _HeaderTitle extends StatelessWidget { + final String title; + final String releaseDate; + final int runtime; + final List genres; + final double voteAverage; + final int voteCount; + const _HeaderTitle({ + this.title, + this.releaseDate, + this.genres, + this.voteAverage, + this.voteCount, + this.runtime, + }); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Container( + width: Adapt.screenW(), + height: Adapt.px(250), + padding: EdgeInsets.fromLTRB(Adapt.px(40), Adapt.px(40), Adapt.px(40), 0), + decoration: BoxDecoration( + color: _theme.backgroundColor, + //border: Border.all(color: _theme.backgroundColor), + borderRadius: + BorderRadius.vertical(top: Radius.circular(Adapt.px(50)))), + child: title == null + ? const _HeaderTitleShimmer() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(600), + child: Text( + title ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: Adapt.px(40), fontWeight: FontWeight.bold), + ), + ), + SizedBox( + height: Adapt.px(10), + ), + Text(DateFormat.yMMMd().format(DateTime.parse( + releaseDate?.isEmpty == true + ? '1990-01-01' + : releaseDate))), + SizedBox( + height: Adapt.px(10), + ), + RichText( + text: TextSpan( + style: TextStyle(color: Colors.grey), + children: [ + TextSpan( + text: genres + ?.map((f) { + return f.name; + }) + ?.toList() + ?.take(3) + ?.join(' / ') ?? + ''), + TextSpan(text: ' · '), + TextSpan(text: _covertDuration(runtime ?? 0)) + ], + ), + ), + SizedBox( + height: Adapt.px(10), + ), + Row( + children: [ + RatingBarIndicator( + rating: (voteAverage ?? 0.0) / 2, + itemPadding: EdgeInsets.only(right: Adapt.px(8)), + itemCount: 5, + itemBuilder: (context, _) => Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: Colors.grey, + itemSize: Adapt.px(25), + ), + SizedBox( + width: Adapt.px(8), + ), + Text( + '${voteAverage ?? 0.0}', + style: TextStyle(fontWeight: FontWeight.bold), + ), + SizedBox( + width: Adapt.px(8), + ), + Text('(${voteCount ?? 0})'), + ], + ), + ], + ), + ); + } +} + +class _PlayButton extends StatelessWidget { + final bool hasStreamLink; + final Dispatch dispatch; + const _PlayButton({this.dispatch, this.hasStreamLink}); + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only( + right: Adapt.px(60), + ), + width: Adapt.px(100), + height: Adapt.px(100), + child: FlatButton( + padding: EdgeInsets.zero, + color: hasStreamLink == true ? Colors.red : Colors.grey, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(50))), + highlightColor: Colors.red, + child: Icon( + Icons.play_arrow, + color: const Color(0xFFFFFFFF), + size: Adapt.px(45), + ), + onPressed: () => dispatch(MovieDetailPageActionCreator.playTrailer()), + ), + ); + } +} + +class _OperatePanel extends StatelessWidget { + final bool hasStreamLink; + final Dispatch dispatch; + final String homePage; + final ExternalIdsModel externalIds; + const _OperatePanel( + {this.dispatch, this.externalIds, this.hasStreamLink, this.homePage}); + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(300), + width: Adapt.screenW(), + child: Column(crossAxisAlignment: CrossAxisAlignment.end, children: [ + _PlayButton( + dispatch: dispatch, + hasStreamLink: hasStreamLink, + ), + Spacer(), + _ExternalGroup( + dispatch: dispatch, + externalIds: externalIds, + homePage: homePage, + ) + ]), + ); + } +} + +class _HeaderBackground extends StatefulWidget { + final String imgUrl; + final ScrollController scrollController; + const _HeaderBackground({this.imgUrl, this.scrollController}); + @override + _HeaderBackgroundState createState() => _HeaderBackgroundState(); +} + +class _HeaderBackgroundState extends State<_HeaderBackground> { + double postion = 0; + final _height = Adapt.px(1150).floorToDouble(); + void _imageScroll() { + if (widget.scrollController.position.pixels <= _height) + postion = widget.scrollController.position.pixels; + setState(() {}); + } + + @override + void initState() { + widget.scrollController.addListener(_imageScroll); + super.initState(); + } + + @override + void dispose() { + widget.scrollController.removeListener(_imageScroll); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return widget.imgUrl == null + ? Container( + key: ValueKey('bgEmpty'), + color: const Color(0xFF607D8B), + width: Adapt.screenW(), + ) + : Stack( + children: [ + Container( + width: Adapt.screenW(), + key: ValueKey(widget.imgUrl), + transform: Matrix4.translationValues(0, postion, 0), + height: _height - postion, + decoration: BoxDecoration( + color: const Color(0xFF607D8B), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(widget.imgUrl, ImageSize.w500), + ), + ), + ), + ), + ScrollViewBackGround( + scrollController: widget.scrollController, + height: Adapt.px(750).floorToDouble(), + maxOpacity: 0.8, + ) + ], + ); + } +} + +class _ExternalShimmerCell extends StatelessWidget { + const _ExternalShimmerCell(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Row( + children: [ + Container( + width: Adapt.px(60), + height: Adapt.px(60), + decoration: BoxDecoration( + shape: BoxShape.circle, color: const Color(0xFFFFFFFF)), + ), + SizedBox(width: Adapt.px(20)), + Container( + width: Adapt.px(60), + height: Adapt.px(60), + decoration: BoxDecoration( + shape: BoxShape.circle, color: const Color(0xFFFFFFFF)), + ), + SizedBox(width: Adapt.px(20)), + Container( + width: Adapt.px(60), + height: Adapt.px(60), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFFFFFFFF), + ), + ) + ], + )); + } +} + +class _ExternalCell extends StatelessWidget { + final String icon; + final String url; + final String id; + final Dispatch dispatch; + const _ExternalCell({this.icon, this.url, this.id, this.dispatch}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return id != null + ? InkWell( + borderRadius: BorderRadius.circular(Adapt.px(20)), + onTap: () => dispatch( + MovieDetailPageActionCreator.onExternalTapped(url + id)), + child: Container( + width: Adapt.px(40), + height: Adapt.px(40), + child: Image.asset( + icon, + color: _theme.iconTheme.color, + ), + ), + ) + : Container(); + } +} + +class _ExternalGroup extends StatelessWidget { + final String homePage; + final ExternalIdsModel externalIds; + final Dispatch dispatch; + const _ExternalGroup({this.externalIds, this.homePage, this.dispatch}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Container( + margin: EdgeInsets.only(bottom: Adapt.px(30), right: Adapt.px(40)), + width: Adapt.px(250), + child: externalIds != null + ? Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + _ExternalCell( + icon: 'images/facebook_circle.png', + url: 'https://www.facebook.com/', + id: externalIds.facebookId, + dispatch: dispatch, + ), + SizedBox(width: Adapt.px(10)), + _ExternalCell( + icon: 'images/twitter_circle.png', + url: 'https://twitter.com/', + id: externalIds.twitterId, + dispatch: dispatch, + ), + SizedBox(width: Adapt.px(10)), + _ExternalCell( + icon: 'images/instagram_circle.png', + url: 'https://www.instagram.com/', + id: externalIds.instagramId, + dispatch: dispatch, + ), + SizedBox(width: Adapt.px(20)), + (externalIds.facebookId == null && + externalIds.twitterId == null && + externalIds.instagramId == null) || + homePage == null + ? Container() + : Container( + width: Adapt.px(2), + height: Adapt.px(30), + color: Colors.grey, + ), + SizedBox( + width: Adapt.px(20), + ), + homePage != null + ? InkWell( + borderRadius: BorderRadius.circular(Adapt.px(15)), + onTap: () => dispatch( + MovieDetailPageActionCreator.onExternalTapped( + homePage)), + child: Container( + width: Adapt.px(30), + height: Adapt.px(30), + child: Image.asset('images/link_bold.png', + color: _theme.iconTheme.color), + )) + : SizedBox(), + ], + ) + : const _ExternalShimmerCell(), + ); + } +} + +String _covertDuration(int d) { + String result = ''; + Duration duration = Duration(minutes: d); + int h = duration.inHours; + int countedMin = h * 60; + int m = duration.inMinutes - countedMin; + result += h > 0 ? '$h h ' : ''; + result += '$m min'; + return result; +} diff --git a/lib/views/detail_page/components/menu_component/action.dart b/lib/views/detail_page/components/menu_component/action.dart new file mode 100644 index 00000000..5c0ce458 --- /dev/null +++ b/lib/views/detail_page/components/menu_component/action.dart @@ -0,0 +1,51 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MenuAction { + action, + setRating, + updateRating, + setFavorite, + updateFavorite, + setWatchlist, + updateWatchlist, + setFirebaseFavorite, + requestStreamLink, +} + +class MenuActionCreator { + static Action onAction() { + return const Action(MenuAction.action); + } + + static Action setRating(double d) { + return Action(MenuAction.setRating, payload: d); + } + + static Action updateRating(double d) { + return Action(MenuAction.updateRating, payload: d); + } + + static Action setFavorite(bool isFavorite) { + return Action(MenuAction.setFavorite, payload: isFavorite); + } + + static Action updateFavorite(bool isFavorite) { + return Action(MenuAction.updateFavorite, payload: isFavorite); + } + + static Action setWatchlist(bool isAdd) { + return Action(MenuAction.setWatchlist, payload: isAdd); + } + + static Action updateWatctlist(bool isAdd) { + return Action(MenuAction.updateWatchlist, payload: isAdd); + } + + static Action setFirebaseFavorite() { + return Action(MenuAction.setFirebaseFavorite); + } + + static Action requestStreamLink() { + return Action(MenuAction.requestStreamLink); + } +} diff --git a/lib/views/detail_page/components/menu_component/component.dart b/lib/views/detail_page/components/menu_component/component.dart new file mode 100644 index 00000000..2cb99636 --- /dev/null +++ b/lib/views/detail_page/components/menu_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MenuComponent extends Component { + MenuComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.accountState != newState.accountState || + oldState.backdropPic != newState.backdropPic || + oldState.detail != newState.detail; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/menu_component/effect.dart b/lib/views/detail_page/components/menu_component/effect.dart new file mode 100644 index 00000000..333dfdd7 --- /dev/null +++ b/lib/views/detail_page/components/menu_component/effect.dart @@ -0,0 +1,125 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/stream_link_report.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/enums/media_type.dart'; +import '../../action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MenuAction.action: _onAction, + MenuAction.setRating: _setRating, + MenuAction.setFavorite: _setFavorite, + MenuAction.setWatchlist: _setWatchlist, + MenuAction.setFirebaseFavorite: _setFirebaseFavorite, + MenuAction.requestStreamLink: _requestStreamLink, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _requestStreamLink(Action action, Context ctx) async { + FirebaseMessaging().subscribeToTopic('movie_${ctx.state.id}'); + Navigator.of(ctx.context).pop(); + final _baseApi = BaseApi.instance; + _baseApi.sendRequestStreamLink(StreamLinkReport() + ..mediaId = ctx.state.id + ..mediaName = ctx.state.name + ..type = 'movie' + ..season = 0); + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar( + 'You will be notified when the stream link has been added')); +} + +void _setFirebaseFavorite(Action action, Context ctx) async { + final bool _isFavorite = ctx.state.accountState.favorite; + final user = GlobalStore.store.getState().user; + final _baseApi = BaseApi.instance; + if (user != null) { + ctx.dispatch(MenuActionCreator.updateFavorite(!_isFavorite)); + if (_isFavorite) + await _baseApi.deleteFavorite( + user.firebaseUser.uid, MediaType.movie, ctx.state.id); + else + await _baseApi.setFavorite(UserMedia.fromParams( + uid: user.firebaseUser.uid, + name: ctx.state.name, + photoUrl: ctx.state.detail.posterPath, + overwatch: ctx.state.detail.overview, + rated: ctx.state.detail.voteAverage, + ratedCount: ctx.state.detail.voteCount, + popular: ctx.state.detail.popularity, + genre: ctx.state.detail.genres.map((f) => f.name).toList().join(','), + releaseDate: ctx.state.detail.releaseDate, + mediaId: ctx.state.id, + mediaType: 'movie')); + await _baseApi.updateAccountState(ctx.state.accountState); + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar(!_isFavorite + ? 'has been mark as favorite' + : 'has been removed from your favorites')); + } +} + +Future _setRating(Action action, Context ctx) async { + final user = GlobalStore.store.getState().user; + if (user != null) { + ctx.dispatch(MenuActionCreator.updateRating(action.payload)); + final _baseApi = BaseApi.instance; + _baseApi.updateAccountState(ctx.state.accountState); + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar( + 'your rating has been saved')); + } +} + +Future _setFavorite(Action action, Context ctx) async { + final bool f = action.payload; + ctx.dispatch(MenuActionCreator.updateFavorite(f)); + var r = + await TMDBApi.instance.markAsFavorite(ctx.state.id, MediaType.movie, f); + if (r) + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar( + f ? 'has been mark as favorite' : 'has been removed')); +} + +Future _setWatchlist(Action action, Context ctx) async { + final bool _isWatchlist = ctx.state.accountState.watchlist; + final user = GlobalStore.store.getState().user; + final _baseApi = BaseApi.instance; + if (user != null) { + ctx.dispatch(MenuActionCreator.updateWatctlist(!_isWatchlist)); + if (_isWatchlist) + await _baseApi.deleteWatchlist( + user.firebaseUser.uid, MediaType.movie, ctx.state.id); + else + await _baseApi.setWatchlist(UserMedia.fromParams( + uid: user.firebaseUser.uid, + name: ctx.state.name, + photoUrl: ctx.state.detail.posterPath, + overwatch: ctx.state.detail.overview, + rated: ctx.state.detail.voteAverage, + ratedCount: ctx.state.detail.voteCount, + popular: ctx.state.detail.popularity, + releaseDate: ctx.state.detail.releaseDate, + genre: ctx.state.detail.genres.map((f) => f.name).toList().join(','), + mediaId: ctx.state.id, + mediaType: 'movie')); + await _baseApi.updateAccountState(ctx.state.accountState); + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar(!_isWatchlist + ? 'has been add to your watchlist' + : 'has been removed from your watchlist')); + } + final bool f = action.payload; + ctx.dispatch(MenuActionCreator.updateWatctlist(f)); + var r = + await TMDBApi.instance.addToWatchlist(ctx.state.id, MediaType.movie, f); + if (r) + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar(f + ? 'has been add to your watchlist' + : 'has been removed from your watchlist')); +} diff --git a/lib/views/detail_page/components/menu_component/reducer.dart b/lib/views/detail_page/components/menu_component/reducer.dart new file mode 100644 index 00000000..28990a98 --- /dev/null +++ b/lib/views/detail_page/components/menu_component/reducer.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MenuAction.action: _onAction, + MenuAction.updateRating: _updateRating, + MenuAction.updateFavorite: _updateFavorite, + MenuAction.updateWatchlist: _updateWatchlist + }, + ); +} + +MenuState _onAction(MenuState state, Action action) { + final MenuState newState = state.clone(); + return newState; +} + +MenuState _updateRating(MenuState state, Action action) { + final MenuState newState = state.clone(); + newState.accountState.rated = action.payload; + return newState; +} + +MenuState _updateFavorite(MenuState state, Action action) { + final bool favorite = action.payload; + final MenuState newState = state.clone(); + newState.accountState.favorite = favorite; + return newState; +} + +MenuState _updateWatchlist(MenuState state, Action action) { + final bool isAdd = action.payload; + final MenuState newState = state.clone(); + newState.accountState.watchlist = isAdd; + return newState; +} diff --git a/lib/views/detail_page/components/menu_component/state.dart b/lib/views/detail_page/components/menu_component/state.dart new file mode 100644 index 00000000..1fabc3ca --- /dev/null +++ b/lib/views/detail_page/components/menu_component/state.dart @@ -0,0 +1,46 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/movie_detail.dart'; + +import '../../state.dart'; + +class MenuState implements Cloneable { + int id; + String backdropPic; + String posterPic; + String name; + String overWatch; + MovieDetailModel detail; + AccountState accountState; + + @override + MenuState clone() { + return MenuState() + ..accountState = accountState + ..posterPic = posterPic + ..backdropPic = backdropPic + ..id = id + ..overWatch = overWatch + ..name = name; + } +} + +class MenuConnector extends ConnOp { + @override + MenuState get(MovieDetailPageState state) { + MenuState substate = new MenuState(); + substate.posterPic = state.bgPic; + substate.name = state.detail.title ?? ''; + substate.accountState = state.accountState; + substate.id = state.mediaId; + substate.backdropPic = state.detail.backdropPath; + substate.overWatch = state.detail.overview; + substate.detail = state.detail; + return substate; + } + + @override + void set(MovieDetailPageState state, MenuState subState) { + state.accountState = subState.accountState; + } +} diff --git a/lib/views/detail_page/components/menu_component/view.dart b/lib/views/detail_page/components/menu_component/view.dart new file mode 100644 index 00000000..eeb16abb --- /dev/null +++ b/lib/views/detail_page/components/menu_component/view.dart @@ -0,0 +1,237 @@ +import 'dart:ui' as ui; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/widgets/dialogratingbar.dart'; +import 'package:movie/widgets/medialist_card.dart'; +import 'package:movie/widgets/share_card.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView(MenuState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + Widget _buildListTitel(IconData icon, String title, void onTap(), + {Color iconColor = const Color.fromRGBO(50, 50, 50, 1)}) { + TextStyle titleStyle = + TextStyle(color: _theme.textTheme.bodyText1.color, fontSize: 18); + return ListTile( + leading: Icon( + icon, + color: iconColor, + ), + title: Text(title, style: titleStyle), + onTap: onTap, + ); + } + + void _addToList() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + return MediaListCardDialog( + type: MediaType.movie, + mediaId: state.id, + name: state.detail.title, + photourl: state.detail.posterPath, + rated: state.detail.voteAverage, + revenue: state.detail.revenue, + runtime: state.detail.runtime, + releaseDate: state.detail.releaseDate, + ); + }); + } + + void _rateIt() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + double rate = state.accountState.rated ?? 0; + return DialogRatingBar( + rating: rate, + submit: (d) => dispatch(MenuActionCreator.setRating(d)), + ); + }); + } + + void _share() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + var width = (Adapt.screenW() - Adapt.px(60)).floorToDouble(); + var height = ((width - Adapt.px(40)) / 2).floorToDouble(); + return ShareCard( + backgroundImage: ImageUrl.getUrl(state.backdropPic, ImageSize.w300), + qrValue: + 'https://www.themoviedb.org/movie/${state.id}?language=${ui.window.locale.languageCode}', + headerHeight: height, + header: Column(children: [ + SizedBox( + height: Adapt.px(20), + ), + Row( + children: [ + SizedBox( + width: Adapt.px(20), + ), + Container( + width: Adapt.px(120), + height: Adapt.px(120), + decoration: BoxDecoration( + border: + Border.all(color: Colors.white, width: Adapt.px(5)), + borderRadius: BorderRadius.circular(Adapt.px(60)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(ImageUrl.getUrl( + state.posterPic, ImageSize.w300)))), + ), + SizedBox( + width: Adapt.px(20), + ), + Container( + width: width - Adapt.px(310), + child: Text(state.name, + maxLines: 2, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(40), + fontWeight: FontWeight.bold, + )), + ), + ], + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + width: width - Adapt.px(40), + height: height - Adapt.px(170), + child: Text(state.overWatch, + overflow: TextOverflow.ellipsis, + maxLines: 5, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(26), + shadows: [ + Shadow( + offset: Offset(Adapt.px(1), Adapt.px(1)), + blurRadius: 3) + ])), + ) + ]), + ); + }); + } + + return Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: + BorderRadius.vertical(top: Radius.circular(Adapt.px(50)))), + child: ListView( + physics: BouncingScrollPhysics(), + children: [ + _MenuHeader( + poster: state.backdropPic, + title: state.name, + ), + Divider(height: 1), + _buildListTitel(Icons.format_list_bulleted, 'Add to List', _addToList, + iconColor: _theme.iconTheme.color), + Divider(height: Adapt.px(5)), + _buildListTitel( + state.accountState.favorite + ? Icons.favorite + : Icons.favorite_border, + 'Mark as Favorite', () { + Navigator.of(viewService.context).pop(); + dispatch(MenuActionCreator.setFirebaseFavorite()); + }, + iconColor: state.accountState.favorite + ? Colors.pink[400] + : _theme.iconTheme.color), + Divider(height: Adapt.px(5)), + _buildListTitel( + Icons.flag, + 'Add to your Watchlist', + () { + Navigator.of(viewService.context).pop(); + dispatch( + MenuActionCreator.setWatchlist(!state.accountState.watchlist)); + }, + iconColor: state.accountState.watchlist + ? Colors.red + : _theme.iconTheme.color, + ), + Divider(height: Adapt.px(5)), + _buildListTitel( + state.accountState.rated != null ? Icons.star : Icons.star_border, + 'Rate It', + _rateIt, + iconColor: state.accountState.rated != null + ? Colors.amber + : _theme.iconTheme.color), + Divider(height: Adapt.px(5)), + _buildListTitel(Icons.add_alarm, 'Request Stream Link', + () => dispatch(MenuActionCreator.requestStreamLink()), + iconColor: _theme.iconTheme.color), + Divider(height: Adapt.px(5)), + _buildListTitel(Icons.share, 'Share', _share, + iconColor: _theme.iconTheme.color), + Divider(height: Adapt.px(5)), + ], + ), + ); +} + +class _MenuHeader extends StatelessWidget { + final String poster; + final String title; + const _MenuHeader({this.poster, this.title}); + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.all(Adapt.px(20)), + height: Adapt.px(100), + child: Row( + children: [ + Container( + height: Adapt.px(100), + width: Adapt.px(100), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(Adapt.px(50)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(poster, ImageSize.w300), + ), + ), + ), + ), + SizedBox( + width: Adapt.px(30), + ), + SizedBox( + width: Adapt.screenW() - Adapt.px(170), + child: Text( + title, + style: TextStyle( + fontSize: Adapt.px(40), fontWeight: FontWeight.bold), + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/detail_page/components/overview_component/action.dart b/lib/views/detail_page/components/overview_component/action.dart new file mode 100644 index 00000000..6fa86049 --- /dev/null +++ b/lib/views/detail_page/components/overview_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum OverViewAction { action } + +class OverViewActionCreator { + static Action onAction() { + return const Action(OverViewAction.action); + } +} diff --git a/lib/views/detail_page/components/overview_component/component.dart b/lib/views/detail_page/components/overview_component/component.dart new file mode 100644 index 00000000..29d9328d --- /dev/null +++ b/lib/views/detail_page/components/overview_component/component.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class OverViewComponent extends Component { + OverViewComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.overView != newState.overView; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/overview_component/effect.dart b/lib/views/detail_page/components/overview_component/effect.dart new file mode 100644 index 00000000..6a55d9a6 --- /dev/null +++ b/lib/views/detail_page/components/overview_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + OverViewAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/detail_page/components/overview_component/state.dart b/lib/views/detail_page/components/overview_component/state.dart new file mode 100644 index 00000000..9bc4cdbc --- /dev/null +++ b/lib/views/detail_page/components/overview_component/state.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class OverViewState implements Cloneable { + String overView; + @override + OverViewState clone() { + return OverViewState(); + } +} + +class OverViewConnector extends ConnOp { + @override + OverViewState get(MovieDetailPageState state) { + OverViewState substate = new OverViewState(); + substate.overView = state.detail?.overview; + return substate; + } +} diff --git a/lib/views/detail_page/components/overview_component/view.dart b/lib/views/detail_page/components/overview_component/view.dart new file mode 100644 index 00000000..b71dd788 --- /dev/null +++ b/lib/views/detail_page/components/overview_component/view.dart @@ -0,0 +1,79 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/expandable_text.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + OverViewState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(30)), + Text( + I18n.of(viewService.context).overView, + style: + TextStyle(fontWeight: FontWeight.bold, fontSize: Adapt.px(28)), + ), + SizedBox(height: Adapt.px(20)), + state.overView == null + ? _ShimmerCell() + : ExpandableText( + state.overView ?? '', + maxLines: 5, + style: TextStyle(color: const Color(0xFF717171), height: 1.5), + ), + ], + ), + ), + ); +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + width: Adapt.px(300), + height: Adapt.px(24), + color: Colors.grey[200], + ) + ], + ), + ); + } +} diff --git a/lib/views/detail_page/components/recommendation_component/action.dart b/lib/views/detail_page/components/recommendation_component/action.dart new file mode 100644 index 00000000..97f8ad85 --- /dev/null +++ b/lib/views/detail_page/components/recommendation_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum RecommendationsAction { action } + +class RecommendationsActionCreator { + static Action onAction() { + return const Action(RecommendationsAction.action); + } +} diff --git a/lib/views/detail_page/components/recommendation_component/component.dart b/lib/views/detail_page/components/recommendation_component/component.dart new file mode 100644 index 00000000..dcb37d36 --- /dev/null +++ b/lib/views/detail_page/components/recommendation_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class RecommendationsComponent extends Component { + RecommendationsComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.recommendations != newState.recommendations; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/recommendation_component/effect.dart b/lib/views/detail_page/components/recommendation_component/effect.dart new file mode 100644 index 00000000..e3c1c782 --- /dev/null +++ b/lib/views/detail_page/components/recommendation_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + RecommendationsAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/detail_page/components/recommendation_component/state.dart b/lib/views/detail_page/components/recommendation_component/state.dart new file mode 100644 index 00000000..727c66e1 --- /dev/null +++ b/lib/views/detail_page/components/recommendation_component/state.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class RecommendationsState implements Cloneable { + List recommendations; + @override + RecommendationsState clone() { + return RecommendationsState(); + } +} + +class RecommendationsConnector + extends ConnOp { + @override + RecommendationsState get(MovieDetailPageState state) { + RecommendationsState substate = new RecommendationsState(); + substate.recommendations = state.detail?.recommendations?.results ?? []; + return substate; + } +} diff --git a/lib/views/detail_page/components/recommendation_component/view.dart b/lib/views/detail_page/components/recommendation_component/view.dart new file mode 100644 index 00000000..43f906d3 --- /dev/null +++ b/lib/views/detail_page/components/recommendation_component/view.dart @@ -0,0 +1,184 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/detail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + RecommendationsState state, Dispatch dispatch, ViewService viewService) { + final _model = state.recommendations; + return SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Text( + I18n.of(viewService.context).recommendations, + style: + TextStyle(fontWeight: FontWeight.bold, fontSize: Adapt.px(28)), + ), + ), + SizedBox(height: Adapt.px(30)), + Container( + height: Adapt.px(450), + child: _model.length == 0 + ? _ShimmmerList() + : _RecommendationList( + data: _model, + dispatch: dispatch, + ), + ), + SizedBox(height: Adapt.px(30)), + ])); +} + +class _ShimmerCell extends StatelessWidget { + final double _width = Adapt.px(220); + @override + Widget build(BuildContext context) { + return SizedBox( + width: _width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: _width, + height: Adapt.px(320), + decoration: BoxDecoration( + color: const Color(0xFFEEEEEE), + ), + ), + SizedBox(height: Adapt.px(15)), + Container( + width: _width, + height: Adapt.px(30), + color: const Color(0xFFEEEEEE), + ), + SizedBox(height: Adapt.px(8)), + Container( + width: _width - Adapt.px(50), + height: Adapt.px(30), + color: const Color(0xFFEEEEEE), + ), + SizedBox(height: Adapt.px(8)), + ], + ), + ); + } +} + +class _ShimmmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 4, + itemBuilder: (_, __) => _ShimmerCell(), + )); + } +} + +class _RecommendationCell extends StatelessWidget { + final VideoListResult data; + final Function onTap; + const _RecommendationCell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final double _width = Adapt.px(220); + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + key: ValueKey('recommendation${data.id}'), + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: _width, + height: Adapt.px(320), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w500)))), + ), + SizedBox( + height: Adapt.px(15), + ), + Container( + width: _width, + child: Text( + data.title, + softWrap: true, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(24)), + ), + ), + SizedBox( + height: Adapt.px(8), + ), + Text( + '${DateTime.parse(data.releaseDate == null || data.releaseDate == '' ? '2020-01-01' : data.releaseDate).year}', + style: TextStyle(fontSize: Adapt.px(24))), + SizedBox( + height: Adapt.px(8), + ), + Container( + width: _width, + child: RatingBarIndicator( + itemPadding: EdgeInsets.only(right: Adapt.px(5)), + itemSize: Adapt.px(25), + itemBuilder: (context, _) => Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: Colors.grey[300], + rating: data.voteAverage / 2, + )) + ], + ), + ); + } +} + +class _RecommendationList extends StatelessWidget { + final List data; + final Dispatch dispatch; + const _RecommendationList({this.data, this.dispatch}); + @override + Widget build(BuildContext context) { + return ListView.separated( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: data.length, + itemBuilder: (_, index) { + final d = data[index]; + return _RecommendationCell( + data: d, + onTap: () => dispatch( + MovieDetailPageActionCreator.movieCellTapped(d.id, d.posterPath)), + ); + }, + ); + } +} diff --git a/lib/views/detail_page/components/still_component/action.dart b/lib/views/detail_page/components/still_component/action.dart new file mode 100644 index 00000000..5602cbdd --- /dev/null +++ b/lib/views/detail_page/components/still_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum StillAction { action } + +class StillActionCreator { + static Action onAction() { + return const Action(StillAction.action); + } +} diff --git a/lib/views/detail_page/components/still_component/component.dart b/lib/views/detail_page/components/still_component/component.dart new file mode 100644 index 00000000..6279a288 --- /dev/null +++ b/lib/views/detail_page/components/still_component/component.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class StillComponent extends Component { + StillComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.imagesmodel != newState.imagesmodel; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/still_component/effect.dart b/lib/views/detail_page/components/still_component/effect.dart new file mode 100644 index 00000000..561d9c0d --- /dev/null +++ b/lib/views/detail_page/components/still_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + StillAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/detail_page/components/still_component/state.dart b/lib/views/detail_page/components/still_component/state.dart new file mode 100644 index 00000000..9f240400 --- /dev/null +++ b/lib/views/detail_page/components/still_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class StillState implements Cloneable { + ImageModel imagesmodel; + @override + StillState clone() { + return StillState(); + } +} + +class StillConnector extends ConnOp { + @override + StillState get(MovieDetailPageState state) { + StillState substate = new StillState(); + substate.imagesmodel = state.imagesmodel; + return substate; + } +} diff --git a/lib/views/detail_page/components/still_component/view.dart b/lib/views/detail_page/components/still_component/view.dart new file mode 100644 index 00000000..a6eb37eb --- /dev/null +++ b/lib/views/detail_page/components/still_component/view.dart @@ -0,0 +1,121 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/detail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView(StillState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(30)), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Text( + I18n.of(viewService.context).stills, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(28), + ), + ), + ), + SizedBox(height: Adapt.px(30)), + Container( + height: Adapt.px(180), + child: state.imagesmodel.backdrops.length == 0 + ? _ShimmerList() + : _StillList( + backdrops: state.imagesmodel.backdrops, + dispatch: dispatch, + ), + ), + SizedBox(height: Adapt.px(50)), + ], + ), + ), + ); +} + +class _ShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 3, + itemBuilder: (_, __) => Container( + width: Adapt.px(320), + height: Adapt.px(180), + decoration: BoxDecoration( + color: const Color(0xFFEEEEEE), + borderRadius: BorderRadius.circular(Adapt.px(20))), + ), + )); + } +} + +class _ImageCell extends StatelessWidget { + final int index; + final ImageData data; + final Function onTap; + const _ImageCell({@required this.data, this.index, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final String url = ImageUrl.getUrl(data.filePath, ImageSize.w500); + return GestureDetector( + key: ValueKey('image${data.filePath}'), + onTap: onTap, + child: Hero( + tag: url + index.toString(), + child: Container( + width: Adapt.px(320), + height: Adapt.px(180), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: DecorationImage( + fit: BoxFit.cover, image: CachedNetworkImageProvider(url))), + )), + ); + } +} + +class _StillList extends StatelessWidget { + final List backdrops; + final Dispatch dispatch; + const _StillList({this.backdrops, this.dispatch}); + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: backdrops.length, + itemBuilder: (_, index) { + final d = backdrops[index]; + return _ImageCell( + data: d, + index: index, + onTap: () => + dispatch(MovieDetailPageActionCreator.stillImageTapped(index)), + ); + }, + ); + } +} diff --git a/lib/views/detail_page/components/trailer_component/action.dart b/lib/views/detail_page/components/trailer_component/action.dart new file mode 100644 index 00000000..6829603c --- /dev/null +++ b/lib/views/detail_page/components/trailer_component/action.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TrailerAction { + action, + playTrailer, +} + +class TrailerActionCreator { + static Action onAction() { + return const Action(TrailerAction.action); + } + + static Action playTrailer(String videoKey) { + return Action(TrailerAction.playTrailer, payload: videoKey); + } +} diff --git a/lib/views/detail_page/components/trailer_component/component.dart b/lib/views/detail_page/components/trailer_component/component.dart new file mode 100644 index 00000000..d09e62bd --- /dev/null +++ b/lib/views/detail_page/components/trailer_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TrailerComponent extends Component { + TrailerComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.videos != newState.videos; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/detail_page/components/trailer_component/effect.dart b/lib/views/detail_page/components/trailer_component/effect.dart new file mode 100644 index 00000000..300f4e35 --- /dev/null +++ b/lib/views/detail_page/components/trailer_component/effect.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/adapt.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TrailerAction.action: _onAction, + TrailerAction.playTrailer: _playTrailer, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _playTrailer(Action action, Context ctx) async { + final String _videoKey = action.payload ?? ''; + await showGeneralDialog( + barrierLabel: 'Trailer', + barrierDismissible: true, + barrierColor: Colors.black87, + transitionDuration: Duration(milliseconds: 300), + context: ctx.context, + pageBuilder: (_, __, ___) { + return _YoutubePlayer( + videoKey: _videoKey, + ); + }); +} + +class _YoutubePlayer extends StatefulWidget { + final String videoKey; + _YoutubePlayer({@required this.videoKey}); + @override + _YoutubePlayerState createState() => _YoutubePlayerState(); +} + +class _YoutubePlayerState extends State<_YoutubePlayer> { + YoutubePlayerController _controller; + @override + void initState() { + _controller = YoutubePlayerController( + initialVideoId: widget.videoKey, + flags: YoutubePlayerFlags( + mute: false, + autoPlay: true, + )); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Material( + child: Container( + width: Adapt.screenW(), + height: Adapt.screenW() * 9 / 16, + child: YoutubePlayer( + controller: _controller, + showVideoProgressIndicator: true, + progressIndicatorColor: Colors.red, + progressColors: ProgressBarColors( + playedColor: Colors.red, + handleColor: Colors.redAccent, + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/detail_page/components/trailer_component/reducer.dart b/lib/views/detail_page/components/trailer_component/reducer.dart new file mode 100644 index 00000000..ac4353f1 --- /dev/null +++ b/lib/views/detail_page/components/trailer_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TrailerAction.action: _onAction, + }, + ); +} + +TrailerState _onAction(TrailerState state, Action action) { + final TrailerState newState = state.clone(); + return newState; +} diff --git a/lib/views/detail_page/components/trailer_component/state.dart b/lib/views/detail_page/components/trailer_component/state.dart new file mode 100644 index 00000000..3b1a9761 --- /dev/null +++ b/lib/views/detail_page/components/trailer_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/views/detail_page/state.dart'; + +class TrailerState implements Cloneable { + VideoModel videos; + @override + TrailerState clone() { + return TrailerState()..videos = videos; + } +} + +class TrailerConnector extends ConnOp { + @override + TrailerState get(MovieDetailPageState state) { + TrailerState substate = new TrailerState(); + substate.videos = state.detail?.videos; + return substate; + } +} diff --git a/lib/views/detail_page/components/trailer_component/view.dart b/lib/views/detail_page/components/trailer_component/view.dart new file mode 100644 index 00000000..9aee36a1 --- /dev/null +++ b/lib/views/detail_page/components/trailer_component/view.dart @@ -0,0 +1,156 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + TrailerState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: SizedBox( + height: Adapt.px(395), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Text( + I18n.of(viewService.context).trailers, + style: TextStyle(fontWeight: FontWeight.bold, fontSize: Adapt.px(28)), + ), + ), + SizedBox( + height: Adapt.px(350), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: (state.videos?.results?.length ?? 0) > 0 + ? _TrailerList( + dispatch: dispatch, + results: state.videos?.results ?? [], + ) + : _ShimmerList(), + ), + ), + ]), + )); +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + return SizedBox( + width: Adapt.px(320), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Container( + height: Adapt.px(180), + width: Adapt.px(320), + decoration: BoxDecoration( + color: const Color(0xFFEEEEEE), + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + ), + SizedBox(height: Adapt.px(15)), + Container( + width: Adapt.px(200), + height: Adapt.px(24), + color: const Color(0xFFEEEEEE), + ) + ])); + } +} + +class _ShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + key: ValueKey('trailerListShimmer'), + child: ListView.separated( + padding: + EdgeInsets.fromLTRB(Adapt.px(40), Adapt.px(30), Adapt.px(40), 0), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 3, + itemBuilder: (_, index) => _ShimmerCell(), + ), + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight); + } +} + +class _TrailerCell extends StatelessWidget { + final VideoResult data; + final Function onTap; + const _TrailerCell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: SizedBox( + width: Adapt.px(320), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Stack(children: [ + Container( + height: Adapt.px(180), + width: Adapt.px(320), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'https://i.ytimg.com/vi/${data.key}/hqdefault.jpg')), + ), + ), + Container( + height: Adapt.px(180), + width: Adapt.px(320), + decoration: BoxDecoration( + color: const Color(0x55000000), + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + child: Icon( + Icons.play_circle_outline, + size: Adapt.px(80), + color: const Color(0xFFFFFFFF), + ), + ) + ]), + SizedBox(height: Adapt.px(15)), + Text( + data.name, + maxLines: 2, + style: TextStyle( + fontSize: Adapt.px(24), fontWeight: FontWeight.w500), + ) + ]))); + } +} + +class _TrailerList extends StatelessWidget { + final List results; + final Dispatch dispatch; + const _TrailerList({this.results, this.dispatch}); + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.fromLTRB(Adapt.px(40), Adapt.px(30), Adapt.px(40), 0), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: results?.length ?? 0, + itemBuilder: (_, index) { + final d = results[index]; + return _TrailerCell( + data: d, + onTap: () => dispatch(TrailerActionCreator.playTrailer(d.key)), + ); + }, + ); + } +} diff --git a/lib/views/detail_page/effect.dart b/lib/views/detail_page/effect.dart new file mode 100644 index 00000000..ca023890 --- /dev/null +++ b/lib/views/detail_page/effect.dart @@ -0,0 +1,130 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/animation.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/widgets/gallery_photoview_wrapper.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/views/peopledetail_page/page.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MovieDetailPageAction.action: _onAction, + MovieDetailPageAction.playStreamLink: _playStreamLink, + MovieDetailPageAction.externalTapped: _onExternalTapped, + MovieDetailPageAction.stillImageTapped: _stillImageTapped, + MovieDetailPageAction.movieCellTapped: _movieCellTapped, + MovieDetailPageAction.castCellTapped: _castCellTapped, + MovieDetailPageAction.openMenu: _openMenu, + MovieDetailPageAction.showSnackBar: _showSnackBar, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final _id = ctx.state.mediaId; + final Object ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 2000)); + ctx.state.scrollController = ScrollController(); + final _baseApi = BaseApi.instance; + Future.delayed(Duration(milliseconds: 300), () async { + if (_id == null) return; + final _tmdb = TMDBApi.instance; + final r = await _tmdb.getMovieDetail(_id, + appendtoresponse: + 'keywords,recommendations,credits,external_ids,release_dates,images,videos'); + if (r.success) + ctx.dispatch(MovieDetailPageActionCreator.updateDetail(r.result)); + final _images = await _tmdb.getMovieImages(_id); + if (_images.success) + ctx.dispatch(MovieDetailPageActionCreator.onSetImages(_images.result)); + final _user = GlobalStore.store.getState().user; + if (_user != null) { + final _accountstate = await _baseApi.getAccountState( + _user?.firebaseUser?.uid, ctx.state.mediaId, MediaType.movie); + if (_accountstate.success) + ctx.dispatch(MovieDetailPageActionCreator.onSetAccountState( + _accountstate.result)); + } + }); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController?.dispose(); + ctx.state.scrollController?.dispose(); +} + +Future _playStreamLink(Action action, Context ctx) async { + if (ctx.state.hasStreamLink) + await Navigator.of(ctx.context).pushNamed('movieLiveStreamPage', + arguments: {'detail': ctx.state.detail}); +} + +Future _onExternalTapped( + Action action, Context ctx) async { + var url = action.payload; + if (await canLaunch(url)) { + await launch(url); + } +} + +Future _stillImageTapped( + Action action, Context ctx) async { + await Navigator.of(ctx.context).push(PageRouteBuilder( + transitionDuration: Duration(milliseconds: 300), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + return new FadeTransition( + opacity: animation, + child: GalleryPhotoViewWrapper( + imageSize: ImageSize.w500, + galleryItems: ctx.state.imagesmodel.backdrops, + initialIndex: action.payload, + )); + })); +} + +Future _movieCellTapped( + Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('detailpage', + arguments: {'id': action.payload[0], 'bgpic': action.payload[1]}); +} + +Future _castCellTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: PeopleDetailPage().buildPage({ + 'peopleid': action.payload[0], + 'profilePath': action.payload[1], + 'profileName': action.payload[2], + 'character': action.payload[3] + }), + ); + })); +} + +void _openMenu(Action action, Context ctx) { + showModalBottomSheet( + context: ctx.context, + backgroundColor: Colors.transparent, + builder: (context) { + return ctx.buildComponent('menu'); + }); +} + +void _showSnackBar(Action action, Context ctx) { + Scaffold.of(ctx.context).showSnackBar(SnackBar( + content: Text(action.payload ?? ''), + )); +} diff --git a/lib/views/detail_page/page.dart b/lib/views/detail_page/page.dart new file mode 100644 index 00000000..62787dd8 --- /dev/null +++ b/lib/views/detail_page/page.dart @@ -0,0 +1,53 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/appbar_component/component.dart'; +import 'components/appbar_component/state.dart'; +import 'components/cast_component/component.dart'; +import 'components/cast_component/state.dart'; +import 'components/keyword_component/component.dart'; +import 'components/keyword_component/state.dart'; +import 'components/maininfo_component/component.dart'; +import 'components/maininfo_component/state.dart'; +import 'components/menu_component/component.dart'; +import 'components/menu_component/state.dart'; +import 'components/overview_component/component.dart'; +import 'components/overview_component/state.dart'; +import 'components/recommendation_component/component.dart'; +import 'components/recommendation_component/state.dart'; +import 'components/still_component/component.dart'; +import 'components/still_component/state.dart'; +import 'components/trailer_component/component.dart'; +import 'components/trailer_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MovieDetailPage extends Page> + with TickerProviderMixin { + MovieDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (o, n) { + return false; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'appbar': AppBarConnector() + AppBarComponent(), + 'mainInfo': MainInfoConnector() + MainInfoComponent(), + 'menu': MenuConnector() + MenuComponent(), + 'overView': OverViewConnector() + OverViewComponent(), + 'cast': CastConnector() + CastComponent(), + 'still': StillConnector() + StillComponent(), + 'keyWords': KeyWordConnector() + KeyWordComponent(), + 'trailer': TrailerConnector() + TrailerComponent(), + 'recommendations': + RecommendationsConnector() + RecommendationsComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/detail_page/reducer.dart b/lib/views/detail_page/reducer.dart new file mode 100644 index 00000000..6cc229d6 --- /dev/null +++ b/lib/views/detail_page/reducer.dart @@ -0,0 +1,56 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/movie_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MovieDetailPageAction.action: _onAction, + MovieDetailPageAction.updateDetail: _updateDetail, + MovieDetailPageAction.setImages: _onSetImages, + MovieDetailPageAction.setAccountState: _onSetAccountState, + MovieDetailPageAction.setHasStreamLink: _setHasStreamLink, + }, + ); +} + +MovieDetailPageState _onAction(MovieDetailPageState state, Action action) { + final MovieDetailPageState newState = state.clone(); + return newState; +} + +MovieDetailPageState _setHasStreamLink( + MovieDetailPageState state, Action action) { + final bool b = action.payload ?? false; + final MovieDetailPageState newState = state.clone(); + newState.hasStreamLink = b; + return newState; +} + +MovieDetailPageState _updateDetail(MovieDetailPageState state, Action action) { + final MovieDetailModel model = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.detail = model; + newState.hasStreamLink = true; + if (newState.bgPic == null) newState.bgPic = model.posterPath; + return newState; +} + +MovieDetailPageState _onSetImages(MovieDetailPageState state, Action action) { + ImageModel c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.imagesmodel = c; + return newState; +} + +MovieDetailPageState _onSetAccountState( + MovieDetailPageState state, Action action) { + AccountState c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.accountState = c; + return newState; +} diff --git a/lib/views/detail_page/state.dart b/lib/views/detail_page/state.dart new file mode 100644 index 00000000..9b53efe2 --- /dev/null +++ b/lib/views/detail_page/state.dart @@ -0,0 +1,51 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/movie_detail.dart'; + +class MovieDetailPageState implements Cloneable { + GlobalKey scaffoldkey; + int mediaId; + String bgPic; + MovieDetailModel detail; + ImageModel imagesmodel; + AccountState accountState; + AnimationController animationController; + ScrollController scrollController; + bool hasStreamLink; + + @override + MovieDetailPageState clone() { + return MovieDetailPageState() + ..scaffoldkey = scaffoldkey + ..detail = detail + ..bgPic = bgPic + ..mediaId = mediaId + ..imagesmodel = imagesmodel + ..accountState = accountState + ..animationController = animationController + ..scrollController = scrollController + ..hasStreamLink = hasStreamLink; + } +} + +MovieDetailPageState initState(Map args) { + MovieDetailPageState state = MovieDetailPageState(); + state.scaffoldkey = + GlobalKey(debugLabel: '_MovieDetialPagekey'); + state.mediaId = args['id']; + state.bgPic = args['bgpic']; + state.detail = MovieDetailModel.fromParams(); + state.imagesmodel = ImageModel.fromParams(backdrops: [], posters: []); + state.accountState = AccountState.fromParams( + id: 0, + uid: GlobalStore.store.getState().user?.firebaseUser?.uid, + mediaId: state.mediaId, + favorite: false, + watchlist: false, + mediaType: 'movie'); + return state; +} diff --git a/lib/views/detail_page/view.dart b/lib/views/detail_page/view.dart new file mode 100644 index 00000000..35db7ecf --- /dev/null +++ b/lib/views/detail_page/view.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/style/themestyle.dart'; +import 'state.dart'; + +Widget buildView( + MovieDetailPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + + return Scaffold( + key: state.scaffoldkey, + backgroundColor: _theme.backgroundColor, + body: Stack(children: [ + CustomScrollView( + controller: state.scrollController, + physics: ClampingScrollPhysics(), + slivers: [ + viewService.buildComponent('mainInfo'), + viewService.buildComponent('overView'), + viewService.buildComponent('cast'), + viewService.buildComponent('still'), + viewService.buildComponent('keyWords'), + viewService.buildComponent('trailer'), + viewService.buildComponent('recommendations'), + ], + ), + viewService.buildComponent('appbar') + ])); + }); +} diff --git a/lib/views/discover_page/action.dart b/lib/views/discover_page/action.dart new file mode 100644 index 00000000..3179f9d9 --- /dev/null +++ b/lib/views/discover_page/action.dart @@ -0,0 +1,59 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +enum DiscoverPageAction { + loadData, + action, + mediaTypeChange, + sortChanged, + videoCellTapped, + refreshData, + loadMore, + busyChanged, + filterTap, + applyFilter +} + +class DiscoverPageActionCreator { + static Action onAction() { + return const Action(DiscoverPageAction.action); + } + + static Action onSortChanged(String s) { + return Action(DiscoverPageAction.sortChanged, payload: s); + } + + static Action onLoadData(VideoListModel p) { + return Action(DiscoverPageAction.loadData, payload: p); + } + + static Action onRefreshData() { + return const Action(DiscoverPageAction.refreshData); + } + + static Action onLoadMore(List p) { + return Action(DiscoverPageAction.loadMore, payload: p); + } + + static Action onVideoCellTapped( + int p, String backpic, String name, String poster) { + return Action(DiscoverPageAction.videoCellTapped, + payload: [p, backpic, name, poster]); + } + + static Action onBusyChanged(bool p) { + return Action(DiscoverPageAction.busyChanged, payload: p); + } + + static Action mediaTypeChange(bool isMovie) { + return Action(DiscoverPageAction.mediaTypeChange, payload: isMovie); + } + + static Action filterTap() { + return const Action(DiscoverPageAction.filterTap); + } + + static Action applyFilter() { + return const Action(DiscoverPageAction.applyFilter); + } +} diff --git a/lib/views/discover_page/adapter.dart b/lib/views/discover_page/adapter.dart new file mode 100644 index 00000000..d9508b3f --- /dev/null +++ b/lib/views/discover_page/adapter.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/discover_page/components/movicecell_component/component.dart'; +import 'state.dart'; + +class DiscoverListAdapter extends SourceFlowAdapter { + DiscoverListAdapter() + : super( + pool: >{ + 'moviecell': MovieCellComponent(), + }, + ); +} diff --git a/lib/views/discover_page/components/filter_component/action.dart b/lib/views/discover_page/components/filter_component/action.dart new file mode 100644 index 00000000..2f2dc0a4 --- /dev/null +++ b/lib/views/discover_page/components/filter_component/action.dart @@ -0,0 +1,52 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/sort_condition.dart'; + +enum FilterAction { + action, + sortChanged, + genresChanged, + updateGenres, + keywordschanged, + mediaTypeChange, + dataSortChange, + votefilterChange, + applyFilter +} + +class FilterActionCreator { + static Action onAction() { + return const Action(FilterAction.action); + } + + static Action onSortChanged(SortCondition sort) { + return Action(FilterAction.sortChanged, payload: sort); + } + + static Action onGenresChanged(SortCondition genre) { + return Action(FilterAction.genresChanged, payload: genre); + } + + static Action onKeyWordsChanged(String s) { + return Action(FilterAction.keywordschanged, payload: s); + } + + static Action mediaTypeChange(bool isMovie) { + return Action(FilterAction.mediaTypeChange, payload: isMovie); + } + + static Action dataSortChange(bool desc) { + return Action(FilterAction.dataSortChange, payload: desc); + } + + static Action updateGenres(List genres) { + return Action(FilterAction.updateGenres, payload: genres); + } + + static Action votefilterChange(double lvote, double rvote) { + return Action(FilterAction.votefilterChange, payload: [lvote, rvote]); + } + + static Action applyFilter() { + return const Action(FilterAction.applyFilter); + } +} diff --git a/lib/views/discover_page/components/filter_component/component.dart b/lib/views/discover_page/components/filter_component/component.dart new file mode 100644 index 00000000..b29f1740 --- /dev/null +++ b/lib/views/discover_page/components/filter_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class FilterComponent extends Component { + FilterComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/discover_page/components/filter_component/effect.dart b/lib/views/discover_page/components/filter_component/effect.dart new file mode 100644 index 00000000..21a38aca --- /dev/null +++ b/lib/views/discover_page/components/filter_component/effect.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/views/discover_page/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + FilterAction.action: _onAction, + FilterAction.genresChanged: _genresChanged, + FilterAction.votefilterChange: _votefilterChange, + FilterAction.applyFilter: _applyFilter, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _genresChanged(Action action, Context ctx) async { + final _genre = action.payload; + ctx.state.currentGenres.forEach((e) { + if (e == _genre) e.isSelected = !e.isSelected; + }); + ctx.dispatch(FilterActionCreator.updateGenres(ctx.state.currentGenres)); +} + +void _votefilterChange(Action action, Context ctx) { + final double _lvote = action.payload[0] ?? 0.0; + final double _rvote = action.payload[1] ?? 10.0; + ctx.state.lVote = _lvote; + ctx.state.rVote = _rvote; +} + +void _applyFilter(Action action, Context ctx) { + ctx.dispatch(DiscoverPageActionCreator.applyFilter()); + Navigator.of(ctx.context).pop(); +} + +void _onInit(Action action, Context ctx) async { + ctx.state.currentGenres = + ctx.state.isMovie ? ctx.state.movieGenres : ctx.state.tvGenres; +} diff --git a/lib/views/discover_page/components/filter_component/reducer.dart b/lib/views/discover_page/components/filter_component/reducer.dart new file mode 100644 index 00000000..db0c61e5 --- /dev/null +++ b/lib/views/discover_page/components/filter_component/reducer.dart @@ -0,0 +1,58 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + FilterAction.action: _onAction, + FilterAction.sortChanged: _onSortChanged, + FilterAction.updateGenres: _updateGenres, + FilterAction.keywordschanged: _onKeyWordsChanged, + FilterAction.mediaTypeChange: _mediaTypeChanged, + FilterAction.dataSortChange: _dataSortChange, + }, + ); +} + +FilterState _onAction(FilterState state, Action action) { + final FilterState newState = state.clone(); + return newState; +} + +FilterState _onSortChanged(FilterState state, Action action) { + final SortCondition _sort = action.payload; + final FilterState newState = state.clone(); + newState.selectedSort = _sort; + return newState; +} + +FilterState _updateGenres(FilterState state, Action action) { + final List _genres = action.payload; + final FilterState newState = state.clone(); + newState.currentGenres = _genres; + return newState; +} + +FilterState _onKeyWordsChanged(FilterState state, Action action) { + String s = action.payload ?? ''; + final FilterState newState = state.clone(); + newState.keywords = s; + return newState; +} + +FilterState _mediaTypeChanged(FilterState state, Action action) { + final bool _isMovie = action.payload ?? false; + final FilterState newState = state.clone(); + newState.isMovie = _isMovie; + newState.currentGenres = _isMovie ? state.movieGenres : state.tvGenres; + return newState; +} + +FilterState _dataSortChange(FilterState state, Action action) { + final bool _desc = action.payload; + final FilterState newState = state.clone(); + newState.sortDesc = _desc; + return newState; +} diff --git a/lib/views/discover_page/components/filter_component/state.dart b/lib/views/discover_page/components/filter_component/state.dart new file mode 100644 index 00000000..4afc4f72 --- /dev/null +++ b/lib/views/discover_page/components/filter_component/state.dart @@ -0,0 +1,63 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/enums/genres.dart'; +import 'package:movie/models/sort_condition.dart'; +import '../../state.dart'; + +class FilterState implements Cloneable { + bool isMovie = true; + bool sortDesc = true; + double lVote = 0.0; + double rVote = 10.0; + SortCondition selectedSort; + TextEditingController keyWordController; + List sortTypes = [ + SortCondition(name: 'Popularity', isSelected: true, value: 'popularity'), + SortCondition( + name: 'Release Date', isSelected: false, value: 'release_date'), + SortCondition(name: 'Title', isSelected: false, value: 'original_title'), + SortCondition(name: 'Rating', isSelected: false, value: 'vote_average'), + SortCondition(name: 'Vote Count', isSelected: false, value: 'vote_count'), + ]; + List movieGenres = new List() + ..addAll(Genres.instance.movieList.keys.map((i) { + return SortCondition( + name: Genres.instance.movieList[i], isSelected: false, value: i); + }).toList()); + List tvGenres = new List() + ..addAll(Genres.instance.tvList.keys.map((i) { + return SortCondition( + name: Genres.instance.tvList[i], isSelected: false, value: i); + }).toList()); + List currentGenres = []; + String keywords; + + @override + FilterState clone() { + return FilterState() + ..sortTypes = sortTypes + ..lVote = lVote + ..rVote = rVote + ..selectedSort = selectedSort + ..isMovie = isMovie + ..sortDesc = sortDesc + ..movieGenres = movieGenres + ..tvGenres = tvGenres + ..keywords = keywords + ..currentGenres = currentGenres + ..keyWordController = keyWordController; + } +} + +class FilterConnector extends ConnOp { + @override + FilterState get(DiscoverPageState state) { + final FilterState filterState = state.filterState; + return filterState; + } + + @override + void set(DiscoverPageState state, FilterState subState) { + state.filterState = subState; + } +} diff --git a/lib/views/discover_page/components/filter_component/view.dart b/lib/views/discover_page/components/filter_component/view.dart new file mode 100644 index 00000000..3398c6f7 --- /dev/null +++ b/lib/views/discover_page/components/filter_component/view.dart @@ -0,0 +1,465 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/discover_page/components/filter_component/action.dart'; + +import 'state.dart'; + +Widget buildView( + FilterState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + return Scaffold( + body: SafeArea( + child: ListView( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(vertical: Adapt.px(30)), + children: [ + _Title(dispatch: dispatch), + _MediaTypePanel( + isMovie: state.isMovie, + onTap: (d) => dispatch(FilterActionCreator.mediaTypeChange(d)), + ), + _SortPanel( + sortTypes: state.sortTypes, + selected: state.selectedSort, + sortDesc: state.sortDesc, + dataSortChange: (d) => + dispatch(FilterActionCreator.dataSortChange(d)), + onSelected: (s) => dispatch(FilterActionCreator.onSortChanged(s)), + ), + _GenresPanel( + genres: state.currentGenres, + onTap: (d) => dispatch(FilterActionCreator.onGenresChanged(d)), + ), + _VoteFilterPanel( + lvote: state.lVote, + rvote: state.rVote, + onChange: (l, r) => + dispatch(FilterActionCreator.votefilterChange(l, r)), + ) + ], + )), + ); + }); +} + +class _Title extends StatelessWidget { + final Dispatch dispatch; + const _Title({this.dispatch}); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'Filters', + style: TextStyle(fontSize: 26, fontWeight: FontWeight.bold), + ), + Spacer(), + GestureDetector( + onTap: () => dispatch(FilterActionCreator.applyFilter()), + child: Container( + height: Adapt.px(45), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + decoration: BoxDecoration( + color: const Color(0xFF334455), + borderRadius: BorderRadius.circular(Adapt.px(10))), + child: Center( + child: Text( + 'Apply', + style: TextStyle( + fontSize: Adapt.px(20), color: Color(0xFFFFFFFF)), + ), + ), + ), + ), + SizedBox(width: Adapt.px(20)), + GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Container( + width: Adapt.px(45), + height: Adapt.px(45), + padding: EdgeInsets.all(Adapt.px(8)), + decoration: BoxDecoration( + color: const Color(0xFF334455), + borderRadius: BorderRadius.circular(Adapt.px(10))), + child: Icon( + Icons.close, + size: Adapt.px(28), + color: const Color(0xFFFFFFFF), + ), + ), + ), + ], + ), + ); + } +} + +class _MediaTypePanel extends StatelessWidget { + final bool isMovie; + final Function(bool) onTap; + const _MediaTypePanel({this.isMovie, this.onTap}); + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(150), + margin: EdgeInsets.only(top: Adapt.px(30), bottom: Adapt.px(20)), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Media Type', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + ), + SizedBox(height: Adapt.px(30)), + Row(children: [ + _TapCell( + title: 'Movie', + selected: isMovie, + value: true, + onTap: onTap, + ), + SizedBox(width: Adapt.px(20)), + _TapCell( + title: 'TvShow', + selected: !isMovie, + onTap: onTap, + value: false, + ), + ]) + ], + ), + ); + } +} + +class _TapCell extends StatelessWidget { + final String title; + final T value; + final Function(T) onTap; + final bool selected; + const _TapCell({this.title, this.onTap, this.selected = false, this.value}); + @override + Widget build(BuildContext context) { + final TextStyle _seletedStyle = TextStyle( + color: const Color(0xFFFFFFFF), + fontWeight: FontWeight.w500, + fontSize: Adapt.px(24)); + final TextStyle _unSelectedStyle = TextStyle( + color: const Color(0xFF9E9E9E), + fontWeight: FontWeight.w500, + fontSize: Adapt.px(24)); + return GestureDetector( + onTap: () => onTap(value), + child: Container( + height: Adapt.px(60), + padding: EdgeInsets.symmetric( + vertical: Adapt.px(13), horizontal: Adapt.px(25)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + color: selected ? const Color(0xFF334455) : null, + border: Border.all(color: const Color(0xFF9E9E9E)), + ), + child: Text( + title, + style: selected ? _seletedStyle : _unSelectedStyle, + ), + ), + ); + } +} + +class _SortPanel extends StatelessWidget { + final List sortTypes; + final Function(SortCondition) onSelected; + final Function(bool) dataSortChange; + final SortCondition selected; + final bool sortDesc; + const _SortPanel( + {this.sortTypes, + this.selected, + this.onSelected, + this.dataSortChange, + this.sortDesc}); + @override + Widget build(BuildContext context) { + final _dataSorts = [ + SortCondition(name: 'Desc', value: true), + SortCondition(name: 'Asc', value: false) + ]; + return Container( + height: Adapt.px(140), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Row( + children: [ + const Text( + 'Sorted by', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + ), + Expanded(child: SizedBox()), + Text( + '${sortDesc ? 'Desc' : 'Asc'}', + style: TextStyle( + fontSize: Adapt.px(20), fontWeight: FontWeight.w600), + ), + SizedBox(width: Adapt.px(20)), + PopupMenuButton( + padding: EdgeInsets.zero, + offset: Offset(0, Adapt.px(100)), + child: Icon( + Icons.sort, + size: Adapt.px(30), + ), + onSelected: (selected) => dataSortChange(selected.value), + itemBuilder: (ctx) { + return _dataSorts.map((s) { + final unSelectedStyle = TextStyle(color: Colors.grey); + final selectedStyle = + TextStyle(fontWeight: FontWeight.bold); + return PopupMenuItem( + value: s, + child: Row( + children: [ + Text( + s.name, + style: s.value == sortDesc + ? selectedStyle + : unSelectedStyle, + ), + Expanded( + child: Container(), + ), + s.value == sortDesc + ? Icon(Icons.check) + : SizedBox() + ], + ), + ); + }).toList(); + }, + ) + ], + )), + SizedBox(height: Adapt.px(40)), + SizedBox( + height: Adapt.px(60), + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(20)), + itemCount: sortTypes.length, + itemBuilder: (_, index) { + return _TapCell( + title: sortTypes[index].name, + value: sortTypes[index], + selected: sortTypes[index] == selected, + onTap: onSelected, + ); + }, + ), + ), + ], + ), + ); + } +} + +class _GenresPanel extends StatelessWidget { + final List genres; + final Function(SortCondition) onTap; + const _GenresPanel({this.genres, this.onTap}); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(40)), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + const Text( + 'Genres', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + ), + SizedBox(height: Adapt.px(30)), + Wrap( + spacing: 10, + runSpacing: 10, + crossAxisAlignment: WrapCrossAlignment.start, + alignment: WrapAlignment.start, + children: genres + .map( + (e) => SizedBox( + child: _TapCell( + title: e.name.replaceAll('_', ' '), + value: e, + selected: e.isSelected, + onTap: onTap, + ), + ), + ) + .toList()) + ]), + ); + } +} + +class _VoteFilterPanel extends StatefulWidget { + final double lvote; + final double rvote; + final Function(double, double) onChange; + const _VoteFilterPanel({this.onChange, this.lvote, this.rvote}); + @override + _VoteFilterPanelState createState() => _VoteFilterPanelState(); +} + +class _VoteFilterPanelState extends State<_VoteFilterPanel> { + double lvote = 0.0; + double rvote = 10.0; + final _totalWidth = Adapt.screenW() - Adapt.px(80); + final double _pinWidth = 18.0; + final double _lineHeight = 8; + double _linerPadding; + double _barSpace; + double _leftMargin = 0.0; + double _rightMargin = 0.0; + + void _leftPinDrag(DragUpdateDetails d) { + _leftMargin += d.primaryDelta; + if (_leftMargin < 0) + _leftMargin = 0.0; + else if (_barSpace - _rightMargin - _leftMargin < 0) + _leftMargin = _barSpace - _rightMargin; + lvote = (_leftMargin / _totalWidth) * 10; + widget.onChange(lvote, rvote); + setState(() {}); + } + + void _rightPinDrag(DragUpdateDetails d) { + _rightMargin -= d.primaryDelta; + if (_rightMargin < 0) + _rightMargin = 0.0; + else if (_barSpace - _rightMargin - _leftMargin < 0) + _rightMargin = _barSpace - _leftMargin; + + rvote = 10 - (_rightMargin / _totalWidth) * 10; + widget.onChange(lvote, rvote); + setState(() {}); + } + + @override + void initState() { + _linerPadding = (_pinWidth - _lineHeight) / 2; + lvote = widget.lvote; + rvote = widget.rvote; + _barSpace = _totalWidth - _pinWidth * 2; + _leftMargin = lvote / 10 * _barSpace; + _rightMargin = (10 - rvote) / 10 * _barSpace; + super.initState(); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(20)), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + const Text( + 'User Score', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + ), + SizedBox(height: Adapt.px(30)), + Container( + child: Stack(children: [ + Container( + height: _lineHeight, + margin: EdgeInsets.symmetric(vertical: _linerPadding), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(6))), + ), + Column(children: [ + Container( + height: _lineHeight, + margin: EdgeInsets.only( + right: _rightMargin, + left: _leftMargin, + top: _linerPadding, + bottom: _linerPadding), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(7.5)), + gradient: LinearGradient(colors: [ + const Color(0xFF556677), + const Color(0xFF334455), + const Color(0xFF556677), + ]), + ), + ), + SizedBox(height: Adapt.px(15)), + Row(children: [ + Text( + '${lvote.toStringAsFixed(1)}', + style: TextStyle(color: const Color(0xFF9E9E9E)), + ), + Spacer(), + Text( + '${rvote.toStringAsFixed(1)}', + style: TextStyle(color: const Color(0xFF9E9E9E)), + ), + ]) + ]), + Container( + height: _pinWidth, + margin: EdgeInsets.only( + right: _rightMargin, + left: _leftMargin, + ), + child: Row(children: [ + _Pin( + onDrap: _leftPinDrag, + pinSize: _pinWidth, + theme: _theme, + ), + Spacer(), + _Pin( + onDrap: _rightPinDrag, + pinSize: _pinWidth, + theme: _theme, + ) + ]), + ) + ]), + ) + ]), + ); + } +} + +class _Pin extends StatelessWidget { + final double pinSize; + final Function(DragUpdateDetails) onDrap; + final ThemeData theme; + const _Pin({this.onDrap, this.pinSize, this.theme}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onHorizontalDragUpdate: onDrap, + child: Container( + width: pinSize, + height: pinSize, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all(color: const Color(0xFF717171)), + color: theme.backgroundColor, + ), + )); + } +} diff --git a/lib/views/discover_page/components/movicecell_component/action.dart b/lib/views/discover_page/components/movicecell_component/action.dart new file mode 100644 index 00000000..72478308 --- /dev/null +++ b/lib/views/discover_page/components/movicecell_component/action.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MovieCellAction { + action, + movieCellTapped, +} + +class MovieCellActionCreator { + static Action onAction() { + return const Action(MovieCellAction.action); + } + + static Action onMovieCellTapped(int movieid) { + return Action(MovieCellAction.movieCellTapped, payload: movieid); + } +} diff --git a/lib/views/discover_page/components/movicecell_component/component.dart b/lib/views/discover_page/components/movicecell_component/component.dart new file mode 100644 index 00000000..e88e2f7b --- /dev/null +++ b/lib/views/discover_page/components/movicecell_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MovieCellComponent extends Component { + MovieCellComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.isMovie != newState.isMovie || + oldState.videodata != newState.videodata; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/discover_page/components/movicecell_component/effect.dart b/lib/views/discover_page/components/movicecell_component/effect.dart new file mode 100644 index 00000000..e7da5496 --- /dev/null +++ b/lib/views/discover_page/components/movicecell_component/effect.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MovieCellAction.action: _onAction, + MovieCellAction.movieCellTapped:_onMovieCellTapped, + }); +} + +void _onAction(Action action, Context ctx) { +} +Future _onMovieCellTapped(Action action, Context ctx) async{ + await Navigator.of(ctx.context).pushNamed('moviedetailpage',arguments:{'movieid':action.payload}); +} diff --git a/lib/views/discover_page/components/movicecell_component/reducer.dart b/lib/views/discover_page/components/movicecell_component/reducer.dart new file mode 100644 index 00000000..a9821f13 --- /dev/null +++ b/lib/views/discover_page/components/movicecell_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MovieCellAction.action: _onAction, + }, + ); +} + +VideoCellState _onAction(VideoCellState state, Action action) { + final VideoCellState newState = state.clone(); + return newState; +} diff --git a/lib/views/discover_page/components/movicecell_component/state.dart b/lib/views/discover_page/components/movicecell_component/state.dart new file mode 100644 index 00000000..475406b7 --- /dev/null +++ b/lib/views/discover_page/components/movicecell_component/state.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +class VideoCellState implements Cloneable { + VideoListResult videodata; + bool isMovie; + + @override + VideoCellState clone() { + return VideoCellState() + ..videodata = videodata + ..isMovie = isMovie; + } +} + +VideoCellState initState(Map args) { + return VideoCellState(); +} diff --git a/lib/views/discover_page/components/movicecell_component/view.dart b/lib/views/discover_page/components/movicecell_component/view.dart new file mode 100644 index 00000000..c364ed9e --- /dev/null +++ b/lib/views/discover_page/components/movicecell_component/view.dart @@ -0,0 +1,175 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/genres.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/discover_page/action.dart'; +import 'package:movie/widgets/linear_progress_Indicator.dart'; + +import 'state.dart'; + +Widget buildView( + VideoCellState state, Dispatch dispatch, ViewService viewService) { + final VideoListResult d = state.videodata; + if (d == null) return SizedBox(); + return _Card( + data: d, + onTap: (value) => dispatch(DiscoverPageActionCreator.onVideoCellTapped( + value.id, + value.posterPath, + value.posterPath, + value.title ?? value.name)), + ); +} + +String _changeDatetime(String s1) { + return s1 == null || s1 == '' || s1.length < 10 ? '1900-01-01' : s1; +} + +class _Card extends StatelessWidget { + final VideoListResult data; + + final Function(VideoListResult) onTap; + const _Card({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final bool _isMovie = data.title != null; + final _horizontalPadding = Adapt.px(30); + final _cardHeight = Adapt.px(400); + final _borderRadius = Adapt.px(40); + final _imageWidth = Adapt.px(240); + final _rightPanelPadding = Adapt.px(20); + final _rightPanelWidth = Adapt.screenW() - + _imageWidth - + _horizontalPadding * 2 - + _rightPanelPadding * 2; + final ThemeData _theme = ThemeStyle.getTheme(context); + return Container( + key: ValueKey('${data.name}${data.id}'), + margin: EdgeInsets.symmetric( + horizontal: _horizontalPadding, vertical: Adapt.px(20)), + height: _cardHeight, + decoration: BoxDecoration( + color: _theme.cardColor, + borderRadius: BorderRadius.circular(_borderRadius), + boxShadow: [ + BoxShadow( + offset: Offset(5, 5), + color: _theme.brightness == Brightness.light + ? _theme.primaryColorDark + : const Color(0xFF303030), + blurRadius: 5) + ]), + child: GestureDetector( + onTap: () => onTap(data), + child: Row(children: [ + ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(_borderRadius), + bottomLeft: Radius.circular(_borderRadius), + bottomRight: Radius.circular(_imageWidth / 2)), + child: Container( + width: _imageWidth, + height: _cardHeight, + color: const Color(0xFFAABBCC), + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: ImageUrl.getUrl(data.posterPath, ImageSize.w300), + ), + ), + ), + Padding( + padding: EdgeInsets.all(_rightPanelPadding), + child: SizedBox( + width: _rightPanelWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.title ?? data.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: Adapt.px(5)), + Text( + DateFormat.yMMMd().format( + DateTime?.tryParse( + (_isMovie + ? _changeDatetime(data.releaseDate) + : _changeDatetime(data.firstAirDate)), + ), + ), + style: TextStyle( + color: const Color(0xFF9E9E9E), fontSize: Adapt.px(18)), + ), + SizedBox(height: Adapt.px(5)), + Text( + data.genreIds + .take(3) + .map((e) => _isMovie + ? Genres.instance.movieList[e] + : Genres.instance.tvList[e]) + .join(' / '), + style: TextStyle( + fontSize: Adapt.px(18), color: const Color(0xFF9E9E9E)), + ), + SizedBox(height: Adapt.px(10)), + Row(children: [ + LinearGradientProgressIndicator( + value: data.voteAverage / 10, + width: Adapt.px(150), + ), + SizedBox(width: Adapt.px(10)), + Text( + data.voteAverage.toString(), + style: TextStyle( + fontSize: Adapt.px(20), + color: const Color(0xFF9E9E9E)), + ) + ]), + SizedBox(height: Adapt.px(20)), + Text( + data.overview, + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12, + height: 1.5, + color: const Color(0xFF717171)), + ), + Spacer(), + Align( + alignment: Alignment.centerRight, + child: Container( + width: Adapt.px(80), + height: Adapt.px(60), + decoration: BoxDecoration( + color: const Color(0xFF334455), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: Center( + child: Icon( + Icons.chevron_right, + color: const Color(0xFFFFFFFF), + ), + ), + ), + ) + ], + ), + ), + ) + ]), + ), + ); + } +} diff --git a/lib/views/discover_page/effect.dart b/lib/views/discover_page/effect.dart new file mode 100644 index 00000000..35537a6e --- /dev/null +++ b/lib/views/discover_page/effect.dart @@ -0,0 +1,154 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/response_model.dart'; +import 'package:movie/models/video_list.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + DiscoverPageAction.action: _onAction, + DiscoverPageAction.videoCellTapped: _onVideoCellTapped, + DiscoverPageAction.refreshData: _onLoadData, + DiscoverPageAction.mediaTypeChange: _mediaTypeChange, + DiscoverPageAction.filterTap: _filterTap, + DiscoverPageAction.applyFilter: _applyFilter, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + ctx.state.scrollController = ScrollController(); + ctx.state.filterState.keyWordController = TextEditingController(); + ctx.state.scrollController.addListener(() async { + bool isBottom = ctx.state.scrollController.position.pixels == + ctx.state.scrollController.position.maxScrollExtent; + if (isBottom) { + await _onLoadMore(action, ctx); + } + }); + await _onLoadData(action, ctx); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController.dispose(); + ctx.state.filterState.keyWordController.dispose(); +} + +Future _onLoadData(Action action, Context ctx) async { + ctx.dispatch(DiscoverPageActionCreator.onBusyChanged(true)); + final _genres = ctx.state.currentGenres; + var genresIds = _genres.where((e) => e.isSelected).map((e) { + return e.value; + }).toList(); + ResponseModel r; + String _sortBy = ctx.state.selectedSort == null + ? null + : '${ctx.state.selectedSort.value}${ctx.state.sortDesc ? '.desc' : '.asc'}'; + final _tmdb = TMDBApi.instance; + if (ctx.state.isMovie) + r = await _tmdb.getMovieDiscover( + voteAverageGte: ctx.state.lVote, + voteAverageLte: ctx.state.rVote, + sortBy: _sortBy, + withGenres: genresIds.length > 0 ? genresIds.join(',') : null); + else + r = await _tmdb.getTVDiscover( + voteAverageGte: ctx.state.lVote, + voteAverageLte: ctx.state.rVote, + withKeywords: ctx.state.filterState.keyWordController.text, + sortBy: _sortBy, + withGenres: genresIds.length > 0 ? genresIds.join(',') : null); + if (r.success) ctx.dispatch(DiscoverPageActionCreator.onLoadData(r.result)); + + ctx.dispatch(DiscoverPageActionCreator.onBusyChanged(false)); + ctx.state.scrollController?.jumpTo(0); +} + +Future _onVideoCellTapped(Action action, Context ctx) async { + if (ctx.state.isMovie) + await Navigator.of(ctx.context).pushNamed( + 'detailpage', + arguments: {'id': action.payload[0], 'bgpic': action.payload[1]}, + ); + else + await Navigator.of(ctx.context).pushNamed('tvShowDetailPage', arguments: { + 'id': action.payload[0], + 'bgpic': action.payload[1], + 'posterpic': action.payload[2], + 'name': action.payload[3] + }); +} + +Future _onLoadMore(Action action, Context ctx) async { + if (ctx.state.isbusy) return; + ctx.dispatch(DiscoverPageActionCreator.onBusyChanged(true)); + final _genres = ctx.state.filterState.currentGenres; + var genresIds = _genres.where((e) => e.isSelected).map((e) { + return e.value; + }).toList(); + ResponseModel r; + String _sortBy = ctx.state.selectedSort == null + ? null + : '${ctx.state.selectedSort?.value ?? ''}${ctx.state.filterState.sortDesc ? '.desc' : '.asc'}'; + final _tmdb = TMDBApi.instance; + if (ctx.state.isMovie) + r = await _tmdb.getMovieDiscover( + voteAverageGte: ctx.state.lVote, + voteAverageLte: ctx.state.rVote, + page: ctx.state.videoListModel.page + 1, + sortBy: _sortBy, + withGenres: genresIds.length > 0 ? genresIds.join(',') : null, + ); + else + r = await _tmdb.getTVDiscover( + voteAverageGte: ctx.state.lVote, + voteAverageLte: ctx.state.rVote, + page: ctx.state.videoListModel.page + 1, + sortBy: _sortBy, + withGenres: genresIds.length > 0 ? genresIds.join(',') : null, + withKeywords: ctx.state.filterState.keywords); + if (r.success) + ctx.dispatch(DiscoverPageActionCreator.onLoadMore(r.result.results)); + ctx.dispatch(DiscoverPageActionCreator.onBusyChanged(false)); +} + +Future _mediaTypeChange(Action action, Context ctx) async { + final bool _isMovie = action.payload ?? true; + if (ctx.state.isMovie == _isMovie) return; + ctx.state.isMovie = _isMovie; + ctx.state.currentGenres = _isMovie + ? ctx.state.filterState.movieGenres + : ctx.state.filterState.tvGenres; + await _onLoadData(action, ctx); +} + +void _filterTap(Action action, Context ctx) async { + ctx.state.filterState.isMovie = ctx.state.isMovie; + ctx.state.filterState.selectedSort = ctx.state.selectedSort; + ctx.state.filterState.currentGenres = ctx.state.currentGenres; + ctx.state.filterState.lVote = ctx.state.lVote; + ctx.state.filterState.rVote = ctx.state.rVote; + Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (_, animation, ___) { + return SlideTransition( + position: Tween(begin: Offset(0, 1), end: Offset.zero) + .animate(CurvedAnimation(parent: animation, curve: Curves.ease)), + child: FadeTransition( + opacity: animation, child: ctx.buildComponent('filter'))); + })); +} + +void _applyFilter(Action action, Context ctx) { + ctx.state.currentGenres = ctx.state.filterState.currentGenres; + ctx.state.selectedSort = ctx.state.filterState.selectedSort; + ctx.state.sortDesc = ctx.state.filterState.sortDesc; + ctx.state.isMovie = ctx.state.filterState.isMovie; + ctx.state.lVote = ctx.state.filterState.lVote; + ctx.state.rVote = ctx.state.filterState.rVote; + _onLoadData(action, ctx); +} diff --git a/lib/views/discover_page/page.dart b/lib/views/discover_page/page.dart new file mode 100644 index 00000000..11fbae1f --- /dev/null +++ b/lib/views/discover_page/page.dart @@ -0,0 +1,30 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'adapter.dart'; +import 'components/filter_component/component.dart'; +import 'components/filter_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class DiscoverPage extends Page> { + DiscoverPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (o, n) { + return o.filterState.isMovie != n.filterState.isMovie || + o.videoListModel != n.videoListModel || + o.isbusy != n.isbusy; + }, + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + DiscoverListAdapter(), + slots: >{ + 'filter': FilterConnector() + FilterComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/discover_page/reducer.dart b/lib/views/discover_page/reducer.dart new file mode 100644 index 00000000..b814e1ab --- /dev/null +++ b/lib/views/discover_page/reducer.dart @@ -0,0 +1,44 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + DiscoverPageAction.action: _onAction, + DiscoverPageAction.loadData: _onLoadData, + DiscoverPageAction.loadMore: _onLoadMore, + DiscoverPageAction.busyChanged: _busyChanged, + }, + ); +} + +DiscoverPageState _onAction(DiscoverPageState state, Action action) { + final DiscoverPageState newState = state.clone(); + return newState; +} + +DiscoverPageState _busyChanged(DiscoverPageState state, Action action) { + final bool _isBusy = action.payload; + final DiscoverPageState newState = state.clone(); + newState.isbusy = _isBusy; + return newState; +} + +DiscoverPageState _onLoadData(DiscoverPageState state, Action action) { + VideoListModel m = action.payload ?? + VideoListModel.fromParams(results: List()); + final DiscoverPageState newState = state.clone(); + newState.videoListModel = m; + return newState; +} + +DiscoverPageState _onLoadMore(DiscoverPageState state, Action action) { + final List m = action.payload ?? List(); + final DiscoverPageState newState = state.clone(); + newState.videoListModel.page++; + newState.videoListModel.results.addAll(m); + return newState; +} diff --git a/lib/views/discover_page/state.dart b/lib/views/discover_page/state.dart new file mode 100644 index 00000000..abba6a8f --- /dev/null +++ b/lib/views/discover_page/state.dart @@ -0,0 +1,83 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/discover_page/components/filter_component/state.dart'; + +import 'components/movicecell_component/state.dart'; + +class DiscoverPageState extends MutableSource + implements GlobalBaseState, Cloneable { + FilterState filterState; + VideoListModel videoListModel; + ScrollController scrollController; + GlobalKey stackKey; + GlobalKey scaffoldKey; + SortCondition selectedSort; + bool sortDesc; + bool isMovie; + bool isbusy; + double lVote; + double rVote; + List currentGenres = []; + @override + DiscoverPageState clone() { + return DiscoverPageState() + ..filterState = filterState + ..videoListModel = videoListModel + ..selectedSort = selectedSort + ..scrollController = scrollController + ..scaffoldKey = scaffoldKey + ..stackKey = stackKey + ..lVote = lVote + ..rVote = rVote + ..sortDesc = sortDesc + ..isMovie = isMovie + ..isbusy = isbusy + ..currentGenres = currentGenres; + } + + @override + Color themeColor; + + @override + Locale locale; + + @override + AppUser user; + + @override + Object getItemData(int index) => VideoCellState() + ..videodata = videoListModel?.results[index] + ..isMovie = isMovie ?? true; + + @override + String getItemType(int index) => 'moviecell'; + + @override + int get itemCount => videoListModel?.results?.length ?? 0; + + @override + void setItemData(int index, Object data) {} +} + +DiscoverPageState initState(Map args) { + final DiscoverPageState state = DiscoverPageState(); + state.filterState = new FilterState(); + state.filterState.selectedSort = state.filterState.sortTypes[0]; + state.selectedSort = state.filterState.sortTypes[0]; + state.currentGenres = state.filterState.currentGenres; + state.scaffoldKey = GlobalKey(); + state.stackKey = GlobalKey(); + state.sortDesc = true; + state.isMovie = true; + state.isbusy = false; + state.lVote = 0.0; + state.rVote = 10.0; + state.videoListModel = + new VideoListModel.fromParams(results: List()); + return state; +} diff --git a/lib/views/discover_page/view.dart b/lib/views/discover_page/view.dart new file mode 100644 index 00000000..7a535925 --- /dev/null +++ b/lib/views/discover_page/view.dart @@ -0,0 +1,376 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/sliverappbar_delegate.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + DiscoverPageState state, Dispatch dispatch, ViewService viewService) { + final _adapter = viewService.buildAdapter(); + + return Builder( + builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + + return Scaffold( + key: state.scaffoldKey, + body: AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: SafeArea( + child: CustomScrollView( + controller: state.scrollController, + slivers: [ + SliverPersistentHeader( + floating: true, + delegate: SliverAppBarDelegate( + minHeight: Adapt.px(100), + maxHeight: Adapt.px(100), + child: _FilterBar( + isMovie: state.isMovie, + isBusy: state.isbusy, + onFilterPress: () => + dispatch(DiscoverPageActionCreator.filterTap()), + switchMedia: (isMovie) => dispatch( + DiscoverPageActionCreator.mediaTypeChange(isMovie)), + )), + ), + SliverList( + delegate: + SliverChildBuilderDelegate((BuildContext ctx, int index) { + return _adapter.itemBuilder(ctx, index); + }, childCount: _adapter.itemCount), + ), + _ShimmerList(isbusy: state.isbusy) + ], + ), + ), + ), + ); + }, + ); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + final _horizontalPadding = Adapt.px(30); + final _cardHeight = Adapt.px(400); + final _borderRadius = Adapt.px(40); + final _imageWidth = Adapt.px(240); + final _rightPanelPadding = Adapt.px(20); + final _rightPanelWidth = Adapt.screenW() - + _imageWidth - + _horizontalPadding * 2 - + _rightPanelPadding * 2; + return Container( + height: _cardHeight, + child: Row(children: [ + ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(_borderRadius), + bottomLeft: Radius.circular(_borderRadius), + bottomRight: Radius.circular(_imageWidth / 2)), + child: Container( + width: _imageWidth, + height: _cardHeight, + color: const Color(0xFFAABBCC), + ), + ), + Padding( + padding: EdgeInsets.all(_rightPanelPadding), + child: SizedBox( + width: _rightPanelWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(300), + height: Adapt.px(26), + color: Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(15)), + Container( + width: Adapt.px(80), + height: Adapt.px(15), + color: Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(5)), + Container( + width: Adapt.px(120), + height: Adapt.px(15), + color: Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(10)), + Container( + width: Adapt.px(200), + height: Adapt.px(15), + color: Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(20)), + Container( + height: Adapt.px(20), + color: Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(10)), + Container( + height: Adapt.px(20), + color: Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(10)), + Container( + width: Adapt.px(250), + height: Adapt.px(20), + color: Color(0xFFFFFFFF), + ), + ], + ), + ), + ) + ]), + ); + } +} + +class _ShimmerList extends StatelessWidget { + final bool isbusy; + const _ShimmerList({this.isbusy}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: isbusy?Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Container( + margin: EdgeInsets.only( + top: Adapt.px(10), + bottom: Adapt.px(30), + left: Adapt.px(30), + right: Adapt.px(30)), + child: Column( + children: [ + const _ShimmerCell(), + SizedBox(height: Adapt.px(30)), + const _ShimmerCell(), + SizedBox(height: Adapt.px(30)), + const _ShimmerCell(), + ], + ), + ), + ):SizedBox(), + ); + } +} + +class _FilterBar extends StatelessWidget { + final Function(bool) switchMedia; + final bool isMovie; + final bool isBusy; + final Function onFilterPress; + const _FilterBar( + {this.switchMedia, this.onFilterPress, this.isBusy, this.isMovie}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + color: _theme.canvasColor, + child: Stack(children: [ + Container( + margin: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(10)), + padding: EdgeInsets.symmetric( + vertical: Adapt.px(5), horizontal: Adapt.px(20)), + height: Adapt.px(80), + decoration: BoxDecoration( + border: Border.all( + color: _theme.brightness == Brightness.light + ? const Color(0xFFEFEFEF) + : const Color(0xFF505050)), + borderRadius: BorderRadius.circular(Adapt.px(20)), + color: _theme.cardColor, + ), + child: Row( + children: [ + _TapPanel( + isMovie: isMovie, + isBusy: isBusy, + onTap: switchMedia, + ), + Expanded(child: SizedBox()), + GestureDetector( + onTap: onFilterPress, + child: Container( + padding: EdgeInsets.all(Adapt.px(10)), + decoration: BoxDecoration( + color: const Color(0xFF334455), + borderRadius: BorderRadius.circular(Adapt.px(10)), + ), + child: Icon( + Icons.filter_list, + size: Adapt.px(30), + color: const Color(0xFFFFFFFF), + ), + ), + ) + ], + ), + ), + _Loading(isBusy: isBusy), + ]), + ); + } +} + +class _TapPanel extends StatefulWidget { + final bool isMovie; + final bool isBusy; + final Function(bool) onTap; + const _TapPanel({this.onTap, this.isMovie, this.isBusy}); + @override + _TapPanelState createState() => _TapPanelState(); +} + +class _TapPanelState extends State<_TapPanel> with TickerProviderStateMixin { + AnimationController _controller; + bool _isMovie; + final TextStyle _seletedStyle = + TextStyle(fontWeight: FontWeight.w500, fontSize: Adapt.px(24)); + final TextStyle _unSelectedStyle = + TextStyle(color: const Color(0xFF9E9E9E), fontSize: Adapt.px(24)); + + Animation _position; + @override + void didUpdateWidget(_TapPanel oldWidget) { + if (widget.isMovie != _isMovie && !widget.isBusy) { + widget.isMovie ? _controller.reverse() : _controller.forward(); + _isMovie = widget.isMovie; + setState(() {}); + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + _isMovie = widget.isMovie ?? true; + _controller = + AnimationController(vsync: this, duration: Duration(milliseconds: 200)); + _position = Tween(begin: Offset.zero, end: Offset(1, 0)) + .animate(CurvedAnimation(parent: _controller, curve: Curves.ease)); + super.initState(); + } + + @override + void dispose() { + _controller?.stop(); + _controller?.dispose(); + super.dispose(); + } + + onTap(bool isMovie) { + if (_isMovie == isMovie && widget.isBusy) return; + if (widget.onTap != null) widget.onTap(isMovie); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Stack(children: [ + Row(children: [ + _TapCell( + onTap: () => onTap(true), + title: 'Movie', + textStyle: _isMovie ? _seletedStyle : _unSelectedStyle, + ), + _TapCell( + onTap: () => onTap(false), + title: 'TvShow', + textStyle: _isMovie ? _unSelectedStyle : _seletedStyle, + ), + ]), + SlideTransition( + position: _position, + child: Container( + padding: EdgeInsets.only(top: Adapt.px(50)), + width: Adapt.px(100), + child: Container( + width: Adapt.px(8), + height: Adapt.px(8), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _theme.brightness == Brightness.light + ? const Color(0xFF334455) + : const Color(0xFFFFFFFF), + ), + ), + ), + ), + ]); + } +} + +class _TapCell extends StatelessWidget { + final String title; + final TextStyle textStyle; + final Function onTap; + const _TapCell({this.title, this.onTap, this.textStyle}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: SizedBox( + width: Adapt.px(100), + child: Center( + child: Text( + title, + style: textStyle, + ), + ), + ), + ); + } +} + +class _Loading extends StatelessWidget { + final bool isBusy; + const _Loading({this.isBusy}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _brightness = _theme.brightness == Brightness.light; + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: isBusy + ? Container( + alignment: Alignment.bottomCenter, + margin: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(10)), + padding: EdgeInsets.symmetric( + vertical: Adapt.px(1), horizontal: Adapt.px(20)), + height: Adapt.px(80), + child: SizedBox( + height: Adapt.px(2), + child: LinearProgressIndicator( + backgroundColor: _brightness + ? const Color(0xFFEFEFEF) + : const Color(0xFF505050), + valueColor: AlwaysStoppedAnimation( + _brightness + ? const Color(0xFF334455) + : const Color(0xFFFFFFFF), + ), + ), + ), + ) + : SizedBox(), + ); + } +} diff --git a/lib/views/download_page/action.dart b/lib/views/download_page/action.dart new file mode 100644 index 00000000..86d5f2bb --- /dev/null +++ b/lib/views/download_page/action.dart @@ -0,0 +1,43 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/models/download_queue.dart'; + +enum DownloadPageAction { + action, + setDownloadTask, + createTask, + startAllTasks, + pauseAllTasks, + taskCellActionTapped, + deleteTask, +} + +class DownloadPageActionCreator { + static Action onAction() { + return const Action(DownloadPageAction.action); + } + + static Action setDownloadTaks(List task) { + return Action(DownloadPageAction.setDownloadTask, payload: task); + } + + static Action createTask() { + return const Action(DownloadPageAction.createTask); + } + + static Action startAllTasks() { + return const Action(DownloadPageAction.startAllTasks); + } + + static Action pauseAllTasks() { + return const Action(DownloadPageAction.pauseAllTasks); + } + + static Action taskCellActionTapped(DownloadQueue task) { + return Action(DownloadPageAction.taskCellActionTapped, payload: task); + } + + static Action onDelete(String taskId) { + return Action(DownloadPageAction.deleteTask, payload: taskId); + } +} diff --git a/lib/views/download_page/effect.dart b/lib/views/download_page/effect.dart new file mode 100644 index 00000000..67dd0a40 --- /dev/null +++ b/lib/views/download_page/effect.dart @@ -0,0 +1,91 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/models/download_queue.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + DownloadPageAction.action: _onAction, + DownloadPageAction.startAllTasks: _startAllTasks, + DownloadPageAction.pauseAllTasks: _pauseAllTasks, + DownloadPageAction.taskCellActionTapped: _taskCellActionTapped, + DownloadPageAction.deleteTask: _deleteTask, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) async {} + +void _onInit(Action action, Context ctx) async { + final _task = await FlutterDownloader.loadTasks(); + ctx.dispatch(DownloadPageActionCreator.setDownloadTaks(_task)); +} + +void _onDispose(Action action, Context ctx) async {} + +void _deleteTask(Action action, Context ctx) async { + final String _taskId = action.payload; + if (_taskId == null) return; + await FlutterDownloader.remove(taskId: _taskId, shouldDeleteContent: true); + ctx.dispatch(DownloadPageActionCreator.setDownloadTaks( + await FlutterDownloader.loadTasks())); +} + +void _startAllTasks(Action action, Context ctx) async { + if (ctx.state.downloadTask == null) return; + ctx.state.downloadTask.forEach((e) { + if (e.status == DownloadTaskStatus.paused) + FlutterDownloader.resume(taskId: e.taskId); + else if (e.status == DownloadTaskStatus.failed) + FlutterDownloader.retry(taskId: e.taskId); + }); + ctx.dispatch(DownloadPageActionCreator.setDownloadTaks( + await FlutterDownloader.loadTasks())); +} + +void _pauseAllTasks(Action action, Context ctx) async { + if (ctx.state.downloadTask == null) return; + ctx.state.downloadTask.forEach((e) { + if (e.status == DownloadTaskStatus.running || + e.status == DownloadTaskStatus.enqueued) + FlutterDownloader.pause(taskId: e.taskId); + }); + ctx.dispatch(DownloadPageActionCreator.setDownloadTaks( + await FlutterDownloader.loadTasks())); +} + +void _taskCellActionTapped( + Action action, Context ctx) async { + DownloadQueue _task = action.payload; + bool _shouldRefesh = true; + if (_task == null) return; + switch (_task.status.value) { + case 1: + await FlutterDownloader.pause(taskId: _task.taskId); + break; + case 2: + await FlutterDownloader.pause(taskId: _task.taskId); + break; + case 6: + await FlutterDownloader.resume(taskId: _task.taskId); + break; + case 3: + await FlutterDownloader.open(taskId: _task.taskId); + _shouldRefesh = false; + break; + case 4: + await FlutterDownloader.cancel(taskId: _task.taskId); + break; + case 5: + await FlutterDownloader.retry(taskId: _task.taskId); + break; + case 0: + await FlutterDownloader.remove(taskId: _task.taskId); + break; + } + if (_shouldRefesh) + ctx.dispatch(DownloadPageActionCreator.setDownloadTaks( + await FlutterDownloader.loadTasks())); +} diff --git a/lib/views/download_page/page.dart b/lib/views/download_page/page.dart new file mode 100644 index 00000000..38e7c7b1 --- /dev/null +++ b/lib/views/download_page/page.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class DownloadPage extends Page> + with TickerProviderMixin { + DownloadPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/download_page/reducer.dart b/lib/views/download_page/reducer.dart new file mode 100644 index 00000000..144ace68 --- /dev/null +++ b/lib/views/download_page/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + DownloadPageAction.action: _onAction, + DownloadPageAction.setDownloadTask: _setDownLoadTask + }, + ); +} + +DownloadPageState _onAction(DownloadPageState state, Action action) { + final DownloadPageState newState = state.clone(); + return newState; +} + +DownloadPageState _setDownLoadTask(DownloadPageState state, Action action) { + final List _task = action.payload; + final DownloadPageState newState = state.clone(); + newState.downloadTask = _task; + return newState; +} diff --git a/lib/views/download_page/state.dart b/lib/views/download_page/state.dart new file mode 100644 index 00000000..4d345310 --- /dev/null +++ b/lib/views/download_page/state.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; + +class DownloadPageState implements Cloneable { + List downloadTask; + + @override + DownloadPageState clone() { + return DownloadPageState()..downloadTask = downloadTask; + } +} + +DownloadPageState initState(Map args) { + DownloadPageState state = DownloadPageState(); + return state; +} diff --git a/lib/views/download_page/view.dart b/lib/views/download_page/view.dart new file mode 100644 index 00000000..71435512 --- /dev/null +++ b/lib/views/download_page/view.dart @@ -0,0 +1,342 @@ +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/download_queue.dart'; +import 'package:movie/style/themestyle.dart'; +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + DownloadPageState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + + return Scaffold( + appBar: AppBar( + elevation: 0.0, + brightness: _theme.brightness, + backgroundColor: _theme.primaryColorLight, + iconTheme: _theme.iconTheme, + title: Text( + 'Queue', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + ), + body: Container( + color: _theme.primaryColorLight, + child: Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: Column( + children: [ + SizedBox(height: Adapt.px(40)), + _OperateGroup( + startAllTasks: () => + dispatch(DownloadPageActionCreator.startAllTasks()), + pauseAllTasks: () => + dispatch(DownloadPageActionCreator.pauseAllTasks()), + ), + SizedBox(height: Adapt.px(20)), + _DownLoadTaskList( + key: ValueKey("downloadKey"), + dispatch: dispatch, + tasks: state.downloadTask, + ), + ], + ), + ), + ), + ); + }, + ); +} + +class _OperateGroup extends StatelessWidget { + final Function startAllTasks; + final Function pauseAllTasks; + const _OperateGroup({this.startAllTasks, this.pauseAllTasks}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(50)), + child: Row(children: [ + Text('Download tasks', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20)), + Expanded(child: SizedBox()), + GestureDetector( + onTap: startAllTasks, + child: Container( + padding: EdgeInsets.all(Adapt.px(10)), + decoration: BoxDecoration( + color: Colors.blueAccent, + borderRadius: BorderRadius.circular(8)), + child: Icon( + Icons.file_download, + color: Color(0xFFFFFFFF), + size: 18, + ), + ), + ), + SizedBox(width: 10), + GestureDetector( + onTap: pauseAllTasks, + child: Container( + padding: EdgeInsets.all(Adapt.px(10)), + decoration: BoxDecoration( + color: Colors.redAccent, + borderRadius: BorderRadius.circular(8)), + child: Icon( + Icons.pause, + color: Color(0xFFFFFFFF), + size: 18, + ), + ), + ), + ]), + ); + } +} + +String _getFileExtension(String address) { + List _fileExtensions = ['mp4', 'm3u8', 'mkv', 'mov', 'webm', 'apk']; + String _fileExtension = address.split('.').last ?? ''; + return _fileExtensions.contains(_fileExtension) ? _fileExtension : 'X'; +} + +final Map _taskCellColors = { + 'mp4': const Color(0xFFBBDEFB), + 'webm': const Color(0xFFB39DBD), + 'mkv': const Color(0xFFF8BBD0), + 'apk': const Color(0xFFAED581), + 'm3u8': const Color(0xFFC5CAE9), + 'X': const Color(0xFF80CBC4) +}; + +class _TaskItem extends StatelessWidget { + final DownloadQueue task; + final Function(DownloadQueue) onActionTap; + final Function(DownloadQueue) onDelete; + const _TaskItem({this.task, this.onActionTap, this.onDelete}); + IconData _getIcon() { + switch (task.status.value) { + case 1: + return Icons.pause; + case 2: + return Icons.pause; + case 6: + return Icons.file_download; + case 3: + return Icons.play_arrow; + case 4: + return Icons.close; + case 5: + return Icons.refresh; + case 0: + return Icons.close; + default: + return Icons.warning; + } + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final String _fileExtension = _getFileExtension(task?.filename ?? ''); + return Stack(children: [ + task.status == DownloadTaskStatus.complete + ? SizedBox() + : Container( + width: (task.progress < 0 ? 0 : task.progress) / + 100 * + Adapt.screenW(), + height: Adapt.px(180), + color: Colors.blue.withOpacity(0.05), + ), + Container( + padding: EdgeInsets.symmetric( + vertical: Adapt.px(50), horizontal: Adapt.px(50)), + child: Row( + children: [ + Container( + width: 30, + height: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: _taskCellColors[_fileExtension], + ), + child: Center( + child: Text( + _fileExtension, + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 10, + fontWeight: FontWeight.bold), + )), + ), + SizedBox(width: Adapt.px(30)), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + task.filename ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: Adapt.px(10)), + Text( + 'Added ${DateFormat.yMMMd().format(DateTime.fromMillisecondsSinceEpoch(task.timeCreated))}', + style: TextStyle( + fontSize: 10, + color: const Color(0xFF9E9E9E), + ), + ) + ]), + ), + SizedBox(width: Adapt.px(30)), + Container( + width: 30, + height: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: _theme.primaryColorDark, + ), + child: GestureDetector( + onTap: () => onActionTap(task), + child: Icon( + _getIcon(), + color: task.status == DownloadTaskStatus.running + ? Colors.red + : Colors.blueAccent, + size: 18, + )), + ), + Container( + width: 30, + height: 30, + margin: EdgeInsets.only(left: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: _theme.primaryColorDark, + ), + child: GestureDetector( + onTap: () => onDelete(task), + child: Icon( + Icons.delete, + color: Colors.red, + size: 18, + ), + ), + ) + ], + ), + ), + ]); + } +} + +class _DownLoadTaskList extends StatefulWidget { + final List tasks; + final Dispatch dispatch; + const _DownLoadTaskList({Key key, this.tasks, this.dispatch}) + : super(key: key); + @override + _DownLoadTaskListState createState() => _DownLoadTaskListState(); +} + +class _DownLoadTaskListState extends State<_DownLoadTaskList> { + ReceivePort _port = ReceivePort(); + List tasks; + @override + void initState() { + super.initState(); + updateTasks(); + + IsolateNameServer.registerPortWithName( + _port.sendPort, 'downloader_send_port'); + _port.listen((dynamic data) { + String _id = data[0]; + DownloadTaskStatus _status = data[1]; + int _progress = data[2]; + final _task = tasks?.singleWhere( + (e) => e.taskId == _id, + orElse: () => null, + ); + if (_task != null) { + _task.progress = _progress < 0 ? 0 : _progress; + _task.status = _status; + setState(() {}); + } + }); + } + + void updateTasks() { + tasks = List(); + if (tasks != null) + widget.tasks?.forEach((e) { + tasks.add(DownloadQueue( + taskId: e.taskId, + url: e.url, + filename: e.filename, + progress: e.progress, + status: e.status, + savedDir: e.savedDir, + timeCreated: e.timeCreated)); + }); + tasks.sort((a, b) => b.timeCreated.compareTo(a.timeCreated)); + } + + @override + void dispose() { + IsolateNameServer.removePortNameMapping('downloader_send_port'); + super.dispose(); + } + + @override + void didUpdateWidget(_DownLoadTaskList oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.tasks != widget.tasks) updateTasks(); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Expanded( + child: tasks.length > 0 + ? ListView.separated( + shrinkWrap: true, + separatorBuilder: (_, __) => Divider(height: 0), + itemCount: tasks.length, + itemBuilder: (_, index) => _TaskItem( + task: tasks[index], + onActionTap: (_t) => widget.dispatch( + DownloadPageActionCreator.taskCellActionTapped(_t)), + onDelete: (_t) => widget + .dispatch(DownloadPageActionCreator.onDelete(_t.taskId)), + ), + ) + : Container( + padding: EdgeInsets.only(top: Adapt.px(500)), + child: Text( + 'Empty List', + style: TextStyle(fontSize: 18, color: Color(0xFF9E9E9E)), + ), + ), + ); + } +} diff --git a/lib/views/episodedetail_page/action.dart b/lib/views/episodedetail_page/action.dart new file mode 100644 index 00000000..bd79462b --- /dev/null +++ b/lib/views/episodedetail_page/action.dart @@ -0,0 +1,14 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; + +enum EpisodeDetailPageAction { action, updateEpisodeDetail } + +class EpisodeDetailPageActionCreator { + static Action onAction() { + return const Action(EpisodeDetailPageAction.action); + } + + static Action onUpdateEpisodeDetail(Episode p) { + return Action(EpisodeDetailPageAction.updateEpisodeDetail, payload: p); + } +} diff --git a/lib/views/episodedetail_page/adapter.dart b/lib/views/episodedetail_page/adapter.dart new file mode 100644 index 00000000..e94d656c --- /dev/null +++ b/lib/views/episodedetail_page/adapter.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/episodedetail_page/components/credits_component/component.dart'; +import 'package:movie/views/episodedetail_page/components/header_component/component.dart'; +import 'package:movie/views/episodedetail_page/components/images_component/component.dart'; +import 'state.dart'; + +class EpisodeDetailAdapter extends SourceFlowAdapter { + EpisodeDetailAdapter() + : super( + pool: >{ + 'header': EpisodeHeaderComponent(), + 'credits': CreditsComponent(), + 'images': ImagesComponent() + }, + ); +} diff --git a/lib/views/episodedetail_page/components/credits_component/action.dart b/lib/views/episodedetail_page/components/credits_component/action.dart new file mode 100644 index 00000000..a97ec0a7 --- /dev/null +++ b/lib/views/episodedetail_page/components/credits_component/action.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum CreditsAction { action, castTapped } + +class CreditsActionCreator { + static Action onAction() { + return const Action(CreditsAction.action); + } + + static Action onCastTapped( + int peopleid, String profilePath, String profileName, String character) { + return Action(CreditsAction.castTapped, + payload: [peopleid, profilePath, profileName, character]); + } +} diff --git a/lib/views/episodedetail_page/components/credits_component/component.dart b/lib/views/episodedetail_page/components/credits_component/component.dart new file mode 100644 index 00000000..b59089d6 --- /dev/null +++ b/lib/views/episodedetail_page/components/credits_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class CreditsComponent extends Component { + CreditsComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.crew != newState.crew || + oldState.guestStars != newState.guestStars; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/episodedetail_page/components/credits_component/effect.dart b/lib/views/episodedetail_page/components/credits_component/effect.dart new file mode 100644 index 00000000..f8986955 --- /dev/null +++ b/lib/views/episodedetail_page/components/credits_component/effect.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart' hide Action; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CreditsAction.action: _onAction, + CreditsAction.castTapped:_onCastCellTapped + }); +} + +void _onAction(Action action, Context ctx) { +} + +Future _onCastCellTapped(Action action, Context ctx) async{ + await Navigator.of(ctx.context).pushNamed('peopledetailpage',arguments: {'peopleid':action.payload[0],'profilePath':action.payload[1],'profileName':action.payload[2],'character':action.payload[3]}); + } diff --git a/lib/views/episodedetail_page/components/credits_component/state.dart b/lib/views/episodedetail_page/components/credits_component/state.dart new file mode 100644 index 00000000..b784d529 --- /dev/null +++ b/lib/views/episodedetail_page/components/credits_component/state.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/credits_model.dart'; + +class CreditsState implements Cloneable { + List guestStars; + List crew; + + CreditsState({this.crew, this.guestStars}); + + @override + CreditsState clone() { + return CreditsState(); + } +} + +CreditsState initState(Map args) { + return CreditsState(); +} diff --git a/lib/views/episodedetail_page/components/credits_component/view.dart b/lib/views/episodedetail_page/components/credits_component/view.dart new file mode 100644 index 00000000..e6be8242 --- /dev/null +++ b/lib/views/episodedetail_page/components/credits_component/view.dart @@ -0,0 +1,363 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/episodedetail_page/components/credits_component/action.dart'; +import 'package:shimmer/shimmer.dart'; +import "package:collection/collection.dart"; + +import 'state.dart'; + +Widget buildView( + CreditsState state, Dispatch dispatch, ViewService viewService) { + return Container( + padding: EdgeInsets.fromLTRB(Adapt.px(28), 0, Adapt.px(28), 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich(TextSpan(children: [ + TextSpan( + text: I18n.of(viewService.context).guestStars, + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.bold)), + TextSpan( + text: + ' ${state.guestStars != null ? state.guestStars.length.toString() : ''}', + style: TextStyle(color: Colors.grey, fontSize: Adapt.px(26))) + ])), + SizedBox(height: Adapt.px(30)), + _GuestStarsBody( + guestStars: state.guestStars, + dispatch: dispatch, + ), + Text.rich(TextSpan(children: [ + TextSpan( + text: I18n.of(viewService.context).crew, + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.bold)), + TextSpan( + text: + ' ${state.crew != null ? state.crew.length.toString() : ''}', + style: TextStyle(color: Colors.grey, fontSize: Adapt.px(26))) + ])), + SizedBox(height: Adapt.px(30)), + _CrewBody( + dispatch: dispatch, + data: state.crew, + ), + ], + ), + ); +} + +class _CrewCell extends StatelessWidget { + final CrewData data; + final Function onTap; + const _CrewCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final double w = (Adapt.screenW() - Adapt.px(60)) / 2; + + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + width: w, + child: Row( + children: [ + Hero( + tag: 'people${data.id}${data.job ?? ''}', + child: Container( + width: Adapt.px(100), + height: Adapt.px(100), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(50)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.profilePath, ImageSize.w300), + ), + ), + ), + ), + ), + SizedBox( + width: Adapt.px(20), + ), + Container( + width: w - Adapt.px(120), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.name, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(24)), + ), + SizedBox( + height: Adapt.px(5), + ), + Text( + data.job, + style: TextStyle(color: Colors.grey[700]), + ) + ], + ), + ) + ], + ), + ), + ); + } +} + +class _GuestCell extends StatelessWidget { + final Function onTap; + final CastData data; + const _GuestCell({this.onTap, this.data}); + @override + Widget build(BuildContext context) { + final double w = (Adapt.screenW() - Adapt.px(60)) / 2; + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + width: w, + child: Row( + children: [ + Hero( + tag: 'people${data.id}${data.character ?? ''}', + child: Container( + width: Adapt.px(100), + height: Adapt.px(100), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(50)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + data.profilePath == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl(data.profilePath, ImageSize.w300), + ), + ), + ), + ), + ), + SizedBox(width: Adapt.px(20)), + Container( + width: w - Adapt.px(120), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.name, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(24)), + ), + SizedBox( + height: Adapt.px(5), + ), + Text( + data.character, + style: TextStyle(color: Colors.grey[700]), + ) + ], + ), + ) + ], + ), + ), + ); + } +} + +class _CrewGroup extends StatelessWidget { + final String title; + final List data; + final Dispatch dispatch; + const _CrewGroup({this.title, this.data, this.dispatch}); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: + TextStyle(fontSize: Adapt.px(28), fontWeight: FontWeight.bold)), + SizedBox( + height: Adapt.px(30), + ), + Wrap( + children: data + .map( + (d) => _CrewCell( + data: d, + onTap: () => dispatch( + CreditsActionCreator.onCastTapped( + d.id, d.profilePath, d.name, d.job), + ), + ), + ) + .toList(), + ) + ], + ); + } +} + +class _GuestStarShimmerCell extends StatelessWidget { + final double w = (Adapt.screenW() - Adapt.px(60)) / 2; + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + width: w, + child: Row( + children: [ + Container( + width: Adapt.px(100), + height: Adapt.px(100), + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(Adapt.px(50)), + ), + ), + SizedBox( + width: Adapt.px(20), + ), + Container( + width: w - Adapt.px(120), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(150), + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.px(150), + height: Adapt.px(24), + color: Colors.grey[200], + ), + ], + ), + ) + ], + ), + ); + } +} + +class _GuestStarsBody extends StatelessWidget { + final List guestStars; + final Dispatch dispatch; + const _GuestStarsBody({this.guestStars, this.dispatch}); + @override + Widget build(BuildContext context) { + if (guestStars != null) { + if (guestStars.length > 0) + return Wrap( + children: guestStars + .map((d) => _GuestCell( + data: d, + onTap: () => dispatch(CreditsActionCreator.onCastTapped( + d.id, d.profilePath, d.name, d.character)), + )) + .toList(), + ); + else + return Container( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + width: Adapt.screenW() - Adapt.px(60), + child: Text(I18n.of(context).guestStarsEmpty), + ); + } else + return _GuestListShimmer(); + } +} + +class _GuestListShimmer extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Wrap( + children: [ + _GuestStarShimmerCell(), + _GuestStarShimmerCell(), + _GuestStarShimmerCell(), + _GuestStarShimmerCell() + ], + )); + } +} + +class _CrewBody extends StatelessWidget { + final List data; + final Dispatch dispatch; + const _CrewBody({this.data, this.dispatch}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + if (data != null) { + if (data.length > 0) { + var q = groupBy(data, (CrewData s) => s.department); + var keys = q.keys.toList()..sort(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: keys.map((s) { + return _CrewGroup( + title: s, + data: q[s], + dispatch: dispatch, + ); + }).toList(), + ); + } else + return Container( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + width: Adapt.screenW() - Adapt.px(60), + child: Text(I18n.of(context).crewEmpty), + ); + } else + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: Adapt.px(28), + width: Adapt.px(150), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(30), + ), + Wrap( + children: [ + _GuestStarShimmerCell(), + _GuestStarShimmerCell(), + _GuestStarShimmerCell(), + ], + ) + ], + ), + ); + } +} diff --git a/lib/views/episodedetail_page/components/header_component/action.dart b/lib/views/episodedetail_page/components/header_component/action.dart new file mode 100644 index 00000000..eeabb34a --- /dev/null +++ b/lib/views/episodedetail_page/components/header_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum EpisodeHeaderAction { action } + +class EpisodeHeaderActionCreator { + static Action onAction() { + return const Action(EpisodeHeaderAction.action); + } +} diff --git a/lib/views/episodedetail_page/components/header_component/component.dart b/lib/views/episodedetail_page/components/header_component/component.dart new file mode 100644 index 00000000..cd4e21bf --- /dev/null +++ b/lib/views/episodedetail_page/components/header_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class EpisodeHeaderComponent extends Component { + EpisodeHeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.episode != newState.episode; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/episodedetail_page/components/header_component/effect.dart b/lib/views/episodedetail_page/components/header_component/effect.dart new file mode 100644 index 00000000..eafec12e --- /dev/null +++ b/lib/views/episodedetail_page/components/header_component/effect.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + EpisodeHeaderAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose + }); +} + +void _onAction(Action action, Context ctx) {} +void _onInit(Action action, Context ctx) { + //ctx.state.tickerProvider=ctx.stfState as CustomstfState; +} +void _onDispose(Action action, Context ctx) {} diff --git a/lib/views/episodedetail_page/components/header_component/reducer.dart b/lib/views/episodedetail_page/components/header_component/reducer.dart new file mode 100644 index 00000000..73e575ad --- /dev/null +++ b/lib/views/episodedetail_page/components/header_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + EpisodeHeaderAction.action: _onAction, + }, + ); +} + +EpisodeHeaderState _onAction(EpisodeHeaderState state, Action action) { + final EpisodeHeaderState newState = state.clone(); + return newState; +} diff --git a/lib/views/episodedetail_page/components/header_component/state.dart b/lib/views/episodedetail_page/components/header_component/state.dart new file mode 100644 index 00000000..a0d349aa --- /dev/null +++ b/lib/views/episodedetail_page/components/header_component/state.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; + +class EpisodeHeaderState implements Cloneable { + Episode episode; + EpisodeHeaderState({this.episode}); + + @override + EpisodeHeaderState clone() { + return EpisodeHeaderState(); + } +} + +EpisodeHeaderState initState(Map args) { + return EpisodeHeaderState(); +} diff --git a/lib/views/episodedetail_page/components/header_component/view.dart b/lib/views/episodedetail_page/components/header_component/view.dart new file mode 100644 index 00000000..184dcd8a --- /dev/null +++ b/lib/views/episodedetail_page/components/header_component/view.dart @@ -0,0 +1,115 @@ +import 'dart:math'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; + +import 'state.dart'; + +Widget buildView( + EpisodeHeaderState state, Dispatch dispatch, ViewService viewService) { + final Random random = Random(DateTime.now().millisecondsSinceEpoch); + final d = state.episode; + return Container( + padding: EdgeInsets.fromLTRB(Adapt.px(28), 0, Adapt.px(28), 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Hero( + tag: 'pic' + d.episodeNumber.toString(), + child: Container( + width: Adapt.screenW() - Adapt.px(40), + height: (Adapt.screenW() - Adapt.px(40)) * 9 / 16, + decoration: BoxDecoration( + color: Color.fromRGBO(random.nextInt(255), random.nextInt(255), + random.nextInt(255), random.nextDouble()), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(d.stillPath == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl(d.stillPath, ImageSize.w300)))), + ), + ), + Hero( + tag: 'episodeDate' + d.episodeNumber.toString(), + child: Material( + color: Colors.transparent, + child: Container( + alignment: Alignment.centerLeft, + height: Adapt.px(50), + padding: EdgeInsets.fromLTRB( + Adapt.px(20), Adapt.px(10), Adapt.px(20), Adapt.px(10)), + child: Text( + DateFormat.yMMMd().format(DateTime.parse(d.airDate)), + style: TextStyle(fontSize: Adapt.px(24)), + )), + ), + ), + Hero( + tag: 'episodetitle' + d.episodeNumber.toString(), + child: Material( + color: Colors.transparent, + child: Row( + children: [ + SizedBox( + width: Adapt.px(20), + ), + Container( + padding: EdgeInsets.fromLTRB( + Adapt.px(10), Adapt.px(5), Adapt.px(15), Adapt.px(5)), + height: Adapt.px(45), + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(Adapt.px(25))), + child: Row( + children: [ + Icon( + Icons.star, + color: Colors.white, + size: Adapt.px(25), + ), + SizedBox( + width: Adapt.px(5), + ), + Text( + d.voteAverage.toStringAsFixed(1), + style: TextStyle(color: Colors.white), + ) + ], + ), + ), + SizedBox( + width: Adapt.px(20), + ), + Container( + width: Adapt.screenW() - Adapt.px(230), + child: Text( + '${d.episodeNumber} ${d.name}', + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(30)), + ), + ), + ], + ), + ), + ), + Hero( + tag: 'episodeoverWatch' + d.episodeNumber.toString(), + child: Material( + color: Colors.transparent, + child: Container( + padding: EdgeInsets.fromLTRB( + Adapt.px(20), Adapt.px(10), Adapt.px(20), Adapt.px(20)), + child: Text(d.overview ?? '-'), + ), + ), + ), + ], + ), + ); +} diff --git a/lib/views/episodedetail_page/components/images_component/action.dart b/lib/views/episodedetail_page/components/images_component/action.dart new file mode 100644 index 00000000..00d2be96 --- /dev/null +++ b/lib/views/episodedetail_page/components/images_component/action.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum ImagesAction { action, imageTappde, galleryImageTapped } + +class ImagesActionCreator { + static Action onAction() { + return const Action(ImagesAction.action); + } + + static Action onImageTapped(String url) { + return Action(ImagesAction.imageTappde, payload: url); + } + + static Action onGalleryImageTapped(int index) { + return Action(ImagesAction.galleryImageTapped, payload: index); + } +} diff --git a/lib/views/episodedetail_page/components/images_component/component.dart b/lib/views/episodedetail_page/components/images_component/component.dart new file mode 100644 index 00000000..243aa429 --- /dev/null +++ b/lib/views/episodedetail_page/components/images_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ImagesComponent extends Component { + ImagesComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.images != newState.images; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/episodedetail_page/components/images_component/effect.dart b/lib/views/episodedetail_page/components/images_component/effect.dart new file mode 100644 index 00000000..bd45c245 --- /dev/null +++ b/lib/views/episodedetail_page/components/images_component/effect.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter/widgets.dart' hide Action; +import 'package:movie/widgets/gallery_photoview_wrapper.dart'; +import 'package:movie/widgets/imageview_wrapper.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ImagesAction.action: _onAction, + ImagesAction.imageTappde: _onImageTapped, + ImagesAction.galleryImageTapped: _onGalleryImageTapped + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onImageTapped(Action action, Context ctx) async { + String url = action.payload ?? ''; + await Navigator.of(ctx.context).push(MaterialPageRoute( + builder: (context) => HeroPhotoViewWrapper( + url: url, + ), + )); +} + +Future _onGalleryImageTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).push(PageRouteBuilder( + transitionDuration: Duration(milliseconds: 300), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + return new FadeTransition( + opacity: animation, + child: GalleryPhotoViewWrapper( + imageSize: ImageSize.w500, + galleryItems: ctx.state.images.stills, + initialIndex: action.payload, + )); + })); +} diff --git a/lib/views/episodedetail_page/components/images_component/reducer.dart b/lib/views/episodedetail_page/components/images_component/reducer.dart new file mode 100644 index 00000000..f98adbf3 --- /dev/null +++ b/lib/views/episodedetail_page/components/images_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ImagesAction.action: _onAction, + }, + ); +} + +ImagesState _onAction(ImagesState state, Action action) { + final ImagesState newState = state.clone(); + return newState; +} diff --git a/lib/views/episodedetail_page/components/images_component/state.dart b/lib/views/episodedetail_page/components/images_component/state.dart new file mode 100644 index 00000000..b270687a --- /dev/null +++ b/lib/views/episodedetail_page/components/images_component/state.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; + +class ImagesState implements Cloneable { + EpisodeImageModel images; + + ImagesState({this.images}); + + @override + ImagesState clone() { + return ImagesState(); + } +} + +ImagesState initState(Map args) { + return ImagesState(); +} diff --git a/lib/views/episodedetail_page/components/images_component/view.dart b/lib/views/episodedetail_page/components/images_component/view.dart new file mode 100644 index 00000000..af400d28 --- /dev/null +++ b/lib/views/episodedetail_page/components/images_component/view.dart @@ -0,0 +1,146 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + ImagesState state, Dispatch dispatch, ViewService viewService) { + return AnimatedSwitcher( + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + duration: Duration(milliseconds: 600), + child: Column( + key: ValueKey(state.images), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(Adapt.px(28), 0, Adapt.px(28), 0), + child: Text.rich(TextSpan(children: [ + TextSpan( + text: I18n.of(viewService.context).episodeImages, + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.bold)), + TextSpan( + text: + ' ${state.images != null ? state.images.stills.length.toString() : ''}', + style: TextStyle(color: Colors.grey, fontSize: Adapt.px(26))) + ])), + ), + SizedBox( + height: Adapt.px(30), + ), + _ImageList( + dispatch: dispatch, + images: state.images, + ), + SizedBox( + height: Adapt.px(30), + ), + ], + ), + ); +} + +class _ImageCell extends StatelessWidget { + final Function onTap; + final String url; + final int index; + const _ImageCell({this.onTap, this.url, this.index}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Hero( + tag: url + index.toString(), + child: Container( + height: Adapt.px(200), + width: Adapt.px(350), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(15)), + color: _theme.primaryColorDark, + image: DecorationImage( + fit: BoxFit.cover, image: CachedNetworkImageProvider(url))), + ), + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(right: Adapt.px(20)), + height: Adapt.px(200), + width: Adapt.px(350), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(15)), + color: Colors.grey[200], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Container( + height: Adapt.px(200), + child: ListView(scrollDirection: Axis.horizontal, children: [ + SizedBox(width: Adapt.px(30)), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + ]), + ), + ); + } +} + +class _ImageList extends StatelessWidget { + final EpisodeImageModel images; + final Dispatch dispatch; + const _ImageList({this.images, this.dispatch}); + @override + Widget build(BuildContext context) { + if (images != null) { + if (images.stills.length > 0) { + return Container( + height: Adapt.px(200), + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: images.stills.length, + itemBuilder: (_, index) => _ImageCell( + url: ImageUrl.getUrl( + images.stills[index].filePath, ImageSize.w500), + onTap: () => + dispatch(ImagesActionCreator.onGalleryImageTapped(index)), + ), + ), + ); + } else + return Container( + width: Adapt.screenW(), + padding: EdgeInsets.only(left: Adapt.px(28)), + child: Text(I18n.of(context).episodeImages), + ); + } else + return _ShimmerList(); + } +} diff --git a/lib/views/episodedetail_page/effect.dart b/lib/views/episodedetail_page/effect.dart new file mode 100644 index 00000000..e2cd16e9 --- /dev/null +++ b/lib/views/episodedetail_page/effect.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + EpisodeDetailPageAction.action: _onAction, + Lifecycle.initState: _onInit + }); +} + +void _onAction(Action action, Context ctx) {} +Future _onInit(Action action, Context ctx) async { + final _tmdb = TMDBApi.instance; + final r = await _tmdb.getTVEpisodeDetail(ctx.state.tvid, + ctx.state.episode.seasonNumber, ctx.state.episode.episodeNumber, + appendToResponse: 'images,credits,videos'); + if (r.success) + ctx.dispatch( + EpisodeDetailPageActionCreator.onUpdateEpisodeDetail(r.result)); +} diff --git a/lib/views/episodedetail_page/page.dart b/lib/views/episodedetail_page/page.dart new file mode 100644 index 00000000..68eb135f --- /dev/null +++ b/lib/views/episodedetail_page/page.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/episodedetail_page/adapter.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class EpisodeDetailPage extends Page> { + EpisodeDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter:NoneConn() +EpisodeDetailAdapter(), + slots: >{ + }), + middleware: >[ + ],); + +} diff --git a/lib/views/episodedetail_page/reducer.dart b/lib/views/episodedetail_page/reducer.dart new file mode 100644 index 00000000..44be0bc7 --- /dev/null +++ b/lib/views/episodedetail_page/reducer.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + EpisodeDetailPageAction.action: _onAction, + EpisodeDetailPageAction.updateEpisodeDetail: _onUpdateEpisodeDetail + }, + ); +} + +EpisodeDetailPageState _onAction(EpisodeDetailPageState state, Action action) { + final EpisodeDetailPageState newState = state.clone(); + return newState; +} + +EpisodeDetailPageState _onUpdateEpisodeDetail( + EpisodeDetailPageState state, Action action) { + Episode model = action.payload ?? Episode.fromParams(); + final EpisodeDetailPageState newState = state.clone(); + newState.episode = model; + return newState; +} diff --git a/lib/views/episodedetail_page/state.dart b/lib/views/episodedetail_page/state.dart new file mode 100644 index 00000000..9ec15007 --- /dev/null +++ b/lib/views/episodedetail_page/state.dart @@ -0,0 +1,75 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/app_user.dart'; + +import 'components/credits_component/state.dart'; +import 'components/header_component/state.dart'; +import 'components/images_component/state.dart'; + +class EpisodeDetailPageState extends MutableSource + implements GlobalBaseState, Cloneable { + Episode episode; + int tvid; + + @override + EpisodeDetailPageState clone() { + return EpisodeDetailPageState() + ..tvid = tvid + ..episode = episode; + } + + @override + Color themeColor; + + @override + Locale locale; + + @override + AppUser user; + + @override + Object getItemData(int index) { + switch (index) { + case 0: + return EpisodeHeaderState(episode: episode); + case 1: + return CreditsState( + guestStars: episode?.credits?.guestStars, + crew: episode?.credits?.crew); + case 2: + return ImagesState(images: episode?.images); + default: + return null; + } + } + + @override + String getItemType(int index) { + switch (index) { + case 0: + return 'header'; + case 1: + return 'credits'; + case 2: + return 'images'; + default: + return null; + } + } + + @override + int get itemCount => 3; + + @override + void setItemData(int index, Object data) {} +} + +EpisodeDetailPageState initState(Map args) { + EpisodeDetailPageState state = EpisodeDetailPageState(); + state.episode = args['episode']; + state.tvid = args['tvid']; + return state; +} diff --git a/lib/views/episodedetail_page/view.dart b/lib/views/episodedetail_page/view.dart new file mode 100644 index 00000000..35f200d3 --- /dev/null +++ b/lib/views/episodedetail_page/view.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + EpisodeDetailPageState state, Dispatch dispatch, ViewService viewService) { + final adapter = viewService.buildAdapter(); + final d = state.episode; + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.backgroundColor, + appBar: AppBar( + elevation: 0.0, + backgroundColor: _theme.backgroundColor, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + title: Text(d.name, style: _theme.textTheme.bodyText1), + ), + body: Container( + alignment: Alignment.topLeft, + height: Adapt.screenH(), + child: ListView.builder( + itemBuilder: adapter.itemBuilder, + itemCount: adapter.itemCount, + )), + ); + }); +} diff --git a/lib/views/favorites_page/action.dart b/lib/views/favorites_page/action.dart new file mode 100644 index 00000000..55f10fd2 --- /dev/null +++ b/lib/views/favorites_page/action.dart @@ -0,0 +1,49 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:palette_generator/palette_generator.dart'; + +enum FavoritesPageAction { + action, + setFavoriteMovies, + setFavoriteTV, + setBackground, + setColor, + updateColor, + setMovie, + setTVShow, +} + +class FavoritesPageActionCreator { + static Action onAction() { + return const Action(FavoritesPageAction.action); + } + + static Action setFavoriteMovies(VideoListModel d) { + return Action(FavoritesPageAction.setFavoriteMovies, payload: d); + } + + static Action setFavoriteTV(VideoListModel d) { + return Action(FavoritesPageAction.setFavoriteTV, payload: d); + } + + static Action setBackground(UserMedia result) { + return Action(FavoritesPageAction.setBackground, payload: result); + } + + static Action setColor(String url) { + return Action(FavoritesPageAction.setColor, payload: url); + } + + static Action updateColor(PaletteGenerator palette) { + return Action(FavoritesPageAction.updateColor, payload: palette); + } + + static Action setMovie(UserMediaModel d) { + return Action(FavoritesPageAction.setMovie, payload: d); + } + + static Action setTVShow(UserMediaModel d) { + return Action(FavoritesPageAction.setTVShow, payload: d); + } +} diff --git a/lib/views/favorites_page/components/background_component/component.dart b/lib/views/favorites_page/components/background_component/component.dart new file mode 100644 index 00000000..51a581e4 --- /dev/null +++ b/lib/views/favorites_page/components/background_component/component.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class BackGroundComponent extends Component { + BackGroundComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.photoUrl != newState.photoUrl; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/favorites_page/components/background_component/state.dart b/lib/views/favorites_page/components/background_component/state.dart new file mode 100644 index 00000000..a51452a0 --- /dev/null +++ b/lib/views/favorites_page/components/background_component/state.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/favorites_page/state.dart'; + +class BackGroundState implements Cloneable { + String photoUrl; + @override + BackGroundState clone() { + return BackGroundState(); + } +} + +class BackGroundConnector extends ConnOp { + @override + BackGroundState get(FavoritesPageState state) { + final BackGroundState mstate = BackGroundState(); + mstate.photoUrl = state.selectedMedia?.photoUrl ?? ''; + return mstate; + } +} diff --git a/lib/views/favorites_page/components/background_component/view.dart b/lib/views/favorites_page/components/background_component/view.dart new file mode 100644 index 00000000..acbb3081 --- /dev/null +++ b/lib/views/favorites_page/components/background_component/view.dart @@ -0,0 +1,28 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; + +import 'state.dart'; + +Widget buildView( + BackGroundState state, Dispatch dispatch, ViewService viewService) { + return state.photoUrl != null + ? AnimatedSwitcher( + duration: Duration(milliseconds: 800), + child: CachedNetworkImage( + key: ValueKey(state.photoUrl), + imageUrl: ImageUrl.getUrl(state.photoUrl, ImageSize.w500), + imageBuilder: (ctx, image) => Container( + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + colorFilter: ColorFilter.mode(Colors.black, BlendMode.color), + image: image, + ))), + errorWidget: (ctx, str, object) => Container(), + ), + ) + : Container(); +} diff --git a/lib/views/favorites_page/components/header_component/action.dart b/lib/views/favorites_page/components/header_component/action.dart new file mode 100644 index 00000000..13544d73 --- /dev/null +++ b/lib/views/favorites_page/components/header_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum HeaderAction { action } + +class HeaderActionCreator { + static Action onAction() { + return const Action(HeaderAction.action); + } +} diff --git a/lib/views/favorites_page/components/header_component/component.dart b/lib/views/favorites_page/components/header_component/component.dart new file mode 100644 index 00000000..6a597d30 --- /dev/null +++ b/lib/views/favorites_page/components/header_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.animationController != + newState.animationController || + oldState.selectedMedia != newState.selectedMedia; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/favorites_page/components/header_component/effect.dart b/lib/views/favorites_page/components/header_component/effect.dart new file mode 100644 index 00000000..ef23ed69 --- /dev/null +++ b/lib/views/favorites_page/components/header_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HeaderAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/favorites_page/components/header_component/reducer.dart b/lib/views/favorites_page/components/header_component/reducer.dart new file mode 100644 index 00000000..868d7f39 --- /dev/null +++ b/lib/views/favorites_page/components/header_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HeaderAction.action: _onAction, + }, + ); +} + +HeaderState _onAction(HeaderState state, Action action) { + final HeaderState newState = state.clone(); + return newState; +} diff --git a/lib/views/favorites_page/components/header_component/state.dart b/lib/views/favorites_page/components/header_component/state.dart new file mode 100644 index 00000000..69d9d997 --- /dev/null +++ b/lib/views/favorites_page/components/header_component/state.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/views/favorites_page/state.dart'; + +class HeaderState implements Cloneable { + UserMedia selectedMedia; + AnimationController animationController; + @override + HeaderState clone() { + return HeaderState() + ..selectedMedia = selectedMedia + ..animationController = animationController; + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(FavoritesPageState state) { + final HeaderState mstate = HeaderState(); + mstate.animationController = state.animationController; + mstate.selectedMedia = state.selectedMedia; + return mstate; + } +} diff --git a/lib/views/favorites_page/components/header_component/view.dart b/lib/views/favorites_page/components/header_component/view.dart new file mode 100644 index 00000000..df77df6f --- /dev/null +++ b/lib/views/favorites_page/components/header_component/view.dart @@ -0,0 +1,154 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + final d = state.selectedMedia; + if (d != null) { + String name = d.name; + String datetime = d.releaseDate; + return FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(state.animationController), + child: Container( + height: Adapt.px(550), + padding: EdgeInsets.all(Adapt.px(30)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name ?? '', + maxLines: 2, + style: TextStyle( + fontSize: Adapt.px(45), fontWeight: FontWeight.bold), + ), + SizedBox( + height: Adapt.px(10), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + DateFormat.yMMMd() + .format(DateTime.parse(datetime ?? '1990-01-01')), + style: TextStyle(fontSize: Adapt.px(26)), + ), + SizedBox( + width: Adapt.px(20), + ), + RatingBarIndicator( + itemSize: Adapt.px(30), + itemPadding: EdgeInsets.symmetric(horizontal: Adapt.px(4)), + physics: BouncingScrollPhysics(), + itemBuilder: (context, _) => Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: Colors.grey, + rating: (d.rated ?? 0) / 2, + ), + SizedBox( + width: Adapt.px(10), + ), + Text(d.rated?.toStringAsFixed(1) ?? '0.0', + style: TextStyle(fontSize: Adapt.px(26))) + ], + ), + SizedBox( + height: Adapt.px(10), + ), + Text( + d.overwatch ?? '', + maxLines: 9, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: Adapt.px(28), + ), + ), + ], + ), + ), + ); + } else + return _ShimmerHeader(); +} + +class _ShimmerHeader extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final Color _baseColor = Colors.grey[200]; + return Container( + height: Adapt.px(550), + padding: EdgeInsets.all(Adapt.px(30)), + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: _baseColor, + height: Adapt.px(40), + width: Adapt.px(400), + ), + SizedBox( + height: Adapt.px(15), + ), + Container( + color: _baseColor, + width: Adapt.px(300), + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(15), + ), + Container( + color: _baseColor, + width: Adapt.screenW(), + height: Adapt.px(26), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: _baseColor, + width: Adapt.screenW(), + height: Adapt.px(26), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: _baseColor, + width: Adapt.screenW(), + height: Adapt.px(26), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: _baseColor, + width: Adapt.screenW(), + height: Adapt.px(26), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: _baseColor, + width: Adapt.px(600), + height: Adapt.px(26), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/favorites_page/components/swiper_component/action.dart b/lib/views/favorites_page/components/swiper_component/action.dart new file mode 100644 index 00000000..51c5e638 --- /dev/null +++ b/lib/views/favorites_page/components/swiper_component/action.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; + +enum SwiperAction { + action, + mediaTpyeChanged, + setBackground, + cellTapped, +} + +class SwiperActionCreator { + static Action onAction() { + return const Action(SwiperAction.action); + } + + static Action mediaTpyeChanged(bool ismovie) { + return Action(SwiperAction.mediaTpyeChanged, payload: ismovie); + } + + static Action setBackground(UserMedia result) { + return Action(SwiperAction.setBackground, payload: result); + } + + static Action cellTapped(UserMedia media) { + return Action(SwiperAction.cellTapped, payload: media); + } +} diff --git a/lib/views/favorites_page/components/swiper_component/component.dart b/lib/views/favorites_page/components/swiper_component/component.dart new file mode 100644 index 00000000..1134d5f8 --- /dev/null +++ b/lib/views/favorites_page/components/swiper_component/component.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SwiperComponent extends Component { + SwiperComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.animationController != + newState.animationController || + oldState.isMovie != newState.isMovie || + oldState.movies != newState.movies || + oldState.tvshows != newState.tvshows; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/favorites_page/components/swiper_component/effect.dart b/lib/views/favorites_page/components/swiper_component/effect.dart new file mode 100644 index 00000000..22601c50 --- /dev/null +++ b/lib/views/favorites_page/components/swiper_component/effect.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/models.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SwiperAction.action: _onAction, + SwiperAction.cellTapped: _cellTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _cellTapped(Action action, Context ctx) async { + final UserMedia _media = action.payload; + if (_media == null) return; + final int _id = _media.mediaId; + final String title = _media.name; + final String posterpic = _media.photoUrl; + final String _pageName = + _media.mediaType == 'movie' ? 'detailpage' : 'tvShowDetailPage'; + var _data = { + 'id': _id, + 'bgpic': posterpic, + 'name': title, + 'posterpic': posterpic + }; + await Navigator.of(ctx.context).pushNamed(_pageName, arguments: _data); +} diff --git a/lib/views/favorites_page/components/swiper_component/reducer.dart b/lib/views/favorites_page/components/swiper_component/reducer.dart new file mode 100644 index 00000000..d2cf604d --- /dev/null +++ b/lib/views/favorites_page/components/swiper_component/reducer.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SwiperAction.action: _onAction, + SwiperAction.mediaTpyeChanged: _mediaTpyeChanged, + SwiperAction.setBackground: _setBackground, + }, + ); +} + +SwiperState _onAction(SwiperState state, Action action) { + final SwiperState newState = state.clone(); + return newState; +} + +SwiperState _mediaTpyeChanged(SwiperState state, Action action) { + final bool r = action.payload; + final SwiperState newState = state.clone(); + newState.isMovie = r; + final _length = + r ? state.movies?.data?.length ?? 0 : state.tvshows?.data?.length ?? 0; + if (_length > 0) + newState.selectedMedia = r ? state.movies?.data[0] : state.tvshows?.data[0]; + else + newState.selectedMedia = null; + return newState; +} + +SwiperState _setBackground(SwiperState state, Action action) { + final UserMedia result = action.payload; + final SwiperState newState = state.clone(); + if (state.selectedMedia != null) newState.selectedMedia = result; + return newState; +} diff --git a/lib/views/favorites_page/components/swiper_component/state.dart b/lib/views/favorites_page/components/swiper_component/state.dart new file mode 100644 index 00000000..427d2dc4 --- /dev/null +++ b/lib/views/favorites_page/components/swiper_component/state.dart @@ -0,0 +1,41 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/views/favorites_page/state.dart'; + +class SwiperState implements Cloneable { + AnimationController animationController; + bool isMovie; + UserMediaModel movies; + UserMediaModel tvshows; + + UserMedia selectedMedia; + @override + SwiperState clone() { + return SwiperState() + ..isMovie = isMovie + ..movies = movies + ..tvshows = tvshows + ..selectedMedia = selectedMedia + ..animationController = animationController; + } +} + +class SwiperConnector extends ConnOp { + @override + SwiperState get(FavoritesPageState state) { + final SwiperState mstate = SwiperState(); + mstate.animationController = state.animationController; + mstate.isMovie = state.isMovie; + mstate.movies = state.movies; + mstate.tvshows = state.tvshows; + mstate.selectedMedia = state.selectedMedia; + return mstate; + } + + @override + void set(FavoritesPageState state, SwiperState subState) { + state.isMovie = subState.isMovie; + state.selectedMedia = subState.selectedMedia; + } +} diff --git a/lib/views/favorites_page/components/swiper_component/view.dart b/lib/views/favorites_page/components/swiper_component/view.dart new file mode 100644 index 00000000..47b2056c --- /dev/null +++ b/lib/views/favorites_page/components/swiper_component/view.dart @@ -0,0 +1,158 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/widgets/shimmercell.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + SwiperState state, Dispatch dispatch, ViewService viewService) { + final UserMediaModel _d = state.isMovie ? state.movies : state.tvshows; + + return Column( + children: [ + _SwitchTitle( + controller: state.animationController, + isMovie: state.isMovie, + onTabChanged: (b) => dispatch(SwiperActionCreator.mediaTpyeChanged(b)), + ), + SizedBox(height: Adapt.px(40)), + _Swiper( + data: _d?.data, + controller: state.animationController, + dispatch: dispatch, + ) + ], + ); +} + +class _SwitchTitle extends StatelessWidget { + final Function(bool) onTabChanged; + final AnimationController controller; + final bool isMovie; + const _SwitchTitle({this.onTabChanged, this.controller, this.isMovie}); + @override + Widget build(BuildContext context) { + final TextStyle selectTextStyle = + TextStyle(fontSize: Adapt.px(30), fontWeight: FontWeight.bold); + final TextStyle unSelectTextStyle = TextStyle(fontSize: Adapt.px(30)); + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + GestureDetector( + onTap: () { + onTabChanged(true); + controller.forward(from: 0.0); + }, + child: Text( + I18n.of(context).movies, + style: isMovie ? selectTextStyle : unSelectTextStyle, + ), + ), + SizedBox( + width: Adapt.px(30), + ), + GestureDetector( + onTap: () { + onTabChanged(false); + controller.forward(from: 0.0); + }, + child: Text( + I18n.of(context).tvShows, + style: isMovie ? unSelectTextStyle : selectTextStyle, + ), + ), + ], + ), + ); + } +} + +class _ListCell extends StatelessWidget { + final UserMedia data; + final Function(UserMedia) onTap; + const _ListCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(data), + child: Container( + key: ValueKey(data), + width: Adapt.px(200), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.photoUrl, ImageSize.w500), + ), + ), + ), + ), + ); + } +} + +class _Swiper extends StatelessWidget { + final List data; + final AnimationController controller; + final Dispatch dispatch; + const _Swiper({this.data, this.controller, this.dispatch}); + @override + Widget build(BuildContext context) { + final height = (Adapt.screenW() * 0.55 - Adapt.px(40)) * 1.7; + return AnimatedSwitcher( + switchOutCurve: Curves.easeOut, + switchInCurve: Curves.easeIn, + duration: Duration(milliseconds: 300), + child: data != null + ? Container( + key: ValueKey(data), + height: height, + child: Swiper( + loop: false, + scale: 0.65, + fade: 0.1, + viewportFraction: 0.55, + itemBuilder: (BuildContext context, int index) { + return _ListCell( + data: data[index], + onTap: (d) => dispatch(SwiperActionCreator.cellTapped(d)), + ); + }, + itemCount: data?.length ?? 0, + onIndexChanged: (index) { + var r = data[index]; + dispatch(SwiperActionCreator.setBackground(r)); + controller.forward(from: 0.0); + }, + ), + ) + : Container( + height: height, + child: Swiper( + loop: false, + scale: 0.65, + viewportFraction: 0.55, + itemBuilder: (BuildContext context, int index) { + return ShimmerCell(Adapt.px(300), height, Adapt.px(20)); + }, + itemCount: 3, + ), + ), + ); + } +} diff --git a/lib/views/favorites_page/effect.dart b/lib/views/favorites_page/effect.dart new file mode 100644 index 00000000..127482f2 --- /dev/null +++ b/lib/views/favorites_page/effect.dart @@ -0,0 +1,57 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:palette_generator/palette_generator.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + FavoritesPageAction.action: _onAction, + FavoritesPageAction.setColor: _setColor, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final Object ticker = ctx.stfState; + ctx.state.animationController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 600)); + + if (ctx.state.user != null) { + final _baseApi = BaseApi.instance; + final movie = + await _baseApi.getFavorite(ctx.state.user.firebaseUser.uid, 'movie'); + if (movie.success) ctx.state.animationController.forward(from: 0.0); + if ((movie?.result?.data?.length ?? 0) > 0) + ctx.dispatch( + FavoritesPageActionCreator.setBackground(movie.result.data[0])); + ctx.dispatch(FavoritesPageActionCreator.setMovie(movie.result)); + final tv = + await _baseApi.getFavorite(ctx.state.user.firebaseUser.uid, 'tv'); + if (tv.success) + ctx.dispatch(FavoritesPageActionCreator.setTVShow(tv.result)); + } +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); +} + +Future _setColor(Action action, Context ctx) async { + final String url = action.payload; + if (url != null) { + PaletteGenerator palette = + await PaletteGenerator.fromImageProvider(CachedNetworkImageProvider( + ImageUrl.getUrl(url, ImageSize.w300), + )); + if (palette != null) + ctx.dispatch(FavoritesPageActionCreator.updateColor(palette)); + } +} diff --git a/lib/views/favorites_page/page.dart b/lib/views/favorites_page/page.dart new file mode 100644 index 00000000..b2dc6d7a --- /dev/null +++ b/lib/views/favorites_page/page.dart @@ -0,0 +1,30 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/background_component/component.dart'; +import 'components/background_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/swiper_component/component.dart'; +import 'components/swiper_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class FavoritesPage extends Page> + with TickerProviderMixin { + FavoritesPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'swiper': SwiperConnector() + SwiperComponent(), + 'backGround': BackGroundConnector() + BackGroundComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/favorites_page/reducer.dart b/lib/views/favorites_page/reducer.dart new file mode 100644 index 00000000..464bb38e --- /dev/null +++ b/lib/views/favorites_page/reducer.dart @@ -0,0 +1,61 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:palette_generator/palette_generator.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + FavoritesPageAction.action: _onAction, + FavoritesPageAction.setBackground: _setBackground, + FavoritesPageAction.updateColor: _updateColor, + FavoritesPageAction.setMovie: _setMovie, + FavoritesPageAction.setTVShow: _setTVShow + }, + ); +} + +FavoritesPageState _onAction(FavoritesPageState state, Action action) { + final FavoritesPageState newState = state.clone(); + return newState; +} + +FavoritesPageState _setBackground(FavoritesPageState state, Action action) { + final UserMedia result = action.payload; + final FavoritesPageState newState = state.clone(); + if (state.selectedMedia != null) newState.selectedMedia = result; + return newState; +} + +FavoritesPageState _updateColor(FavoritesPageState state, Action action) { + final PaletteGenerator palette = action.payload; + final FavoritesPageState newState = state.clone(); + newState.paletteGenerator = palette; + return newState; +} + +FavoritesPageState _setMovie(FavoritesPageState state, Action action) { + final UserMediaModel movie = action.payload; + final FavoritesPageState newState = state.clone(); + newState.movies = movie; + if (movie.data.length > 0 && + newState.selectedMedia == null && + newState.isMovie) { + newState.selectedMedia = movie.data[0]; + } + return newState; +} + +FavoritesPageState _setTVShow(FavoritesPageState state, Action action) { + final UserMediaModel tv = action.payload; + final FavoritesPageState newState = state.clone(); + newState.tvshows = tv; + if (tv.data.length > 0 && + newState.selectedMedia == null && + !newState.isMovie) { + newState.selectedMedia = tv.data[0]; + } + return newState; +} diff --git a/lib/views/favorites_page/state.dart b/lib/views/favorites_page/state.dart new file mode 100644 index 00000000..8113c25e --- /dev/null +++ b/lib/views/favorites_page/state.dart @@ -0,0 +1,45 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:palette_generator/palette_generator.dart'; + +class FavoritesPageState + implements GlobalBaseState, Cloneable { + UserMedia selectedMedia; + AnimationController animationController; + PaletteGenerator paletteGenerator; + UserMediaModel movies; + UserMediaModel tvshows; + bool isMovie; + + @override + FavoritesPageState clone() { + return FavoritesPageState() + ..selectedMedia = selectedMedia + ..animationController = animationController + ..paletteGenerator = paletteGenerator + ..isMovie = isMovie + ..movies = movies + ..tvshows = tvshows + ..user = user; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +FavoritesPageState initState(Map args) { + FavoritesPageState state = FavoritesPageState(); + state.isMovie = true; + state.paletteGenerator = PaletteGenerator.fromColors([]); + return state; +} diff --git a/lib/views/favorites_page/view.dart b/lib/views/favorites_page/view.dart new file mode 100644 index 00000000..e75ac7b5 --- /dev/null +++ b/lib/views/favorites_page/view.dart @@ -0,0 +1,58 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'state.dart'; + +Widget buildView( + FavoritesPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + + return Scaffold( + body: Stack( + children: [ + viewService.buildComponent('backGround'), + Container( + color: _theme.backgroundColor.withAlpha(230), + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(100)), + viewService.buildComponent('header'), + viewService.buildComponent('swiper'), + Expanded(child: Container()), + ], + ), + ), + ), + Positioned( + left: 0, + top: 0, + right: 0, + child: AppBar( + brightness: _theme.brightness, + titleSpacing: 0, + elevation: 0.0, + backgroundColor: Colors.transparent, + iconTheme: _theme.iconTheme, + centerTitle: true, + title: Text( + 'My Favorites', + style: _theme.textTheme.bodyText1, + ), + actions: [ + IconButton( + onPressed: () {}, + icon: Icon(Icons.sort), + ) + ], + ), + ) + ], + ), + ); + }); +} diff --git a/lib/views/gallery_page/action.dart b/lib/views/gallery_page/action.dart new file mode 100644 index 00000000..0b1c31eb --- /dev/null +++ b/lib/views/gallery_page/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum GalleryPageAction { action } + +class GalleryPageActionCreator { + static Action onAction() { + return const Action(GalleryPageAction.action); + } +} diff --git a/lib/views/gallery_page/effect.dart b/lib/views/gallery_page/effect.dart new file mode 100644 index 00000000..7a673bf5 --- /dev/null +++ b/lib/views/gallery_page/effect.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + GalleryPageAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) { + final Object ticker = ctx.stfState; + ctx.state.animationController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 600)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); +} diff --git a/lib/views/gallery_page/page.dart b/lib/views/gallery_page/page.dart new file mode 100644 index 00000000..34e35c3c --- /dev/null +++ b/lib/views/gallery_page/page.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class GalleryPage extends Page> with SingleTickerProviderMixin{ + GalleryPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/gallery_page/reducer.dart b/lib/views/gallery_page/reducer.dart new file mode 100644 index 00000000..4b0db295 --- /dev/null +++ b/lib/views/gallery_page/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + GalleryPageAction.action: _onAction, + }, + ); +} + +GalleryPageState _onAction(GalleryPageState state, Action action) { + final GalleryPageState newState = state.clone(); + return newState; +} diff --git a/lib/views/gallery_page/state.dart b/lib/views/gallery_page/state.dart new file mode 100644 index 00000000..de570a36 --- /dev/null +++ b/lib/views/gallery_page/state.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/image_model.dart'; + +class GalleryPageState implements Cloneable { + List images; + AnimationController animationController; + + @override + GalleryPageState clone() { + return GalleryPageState()..images = images; + } +} + +GalleryPageState initState(Map args) { + GalleryPageState state = GalleryPageState(); + state.images = args['images']; + return state; +} diff --git a/lib/views/gallery_page/view.dart b/lib/views/gallery_page/view.dart new file mode 100644 index 00000000..9b720a27 --- /dev/null +++ b/lib/views/gallery_page/view.dart @@ -0,0 +1,70 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + GalleryPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + + return Scaffold( + appBar: AppBar( + elevation: 0.0, + backgroundColor: _theme.backgroundColor, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + title: Text( + 'Gallery', + style: _theme.textTheme.bodyText1, + ), + ), + body: StaggeredGridView.countBuilder( + primary: false, + crossAxisCount: 4, + crossAxisSpacing: 4.0, + mainAxisSpacing: 4.0, + itemCount: state.images.length, + itemBuilder: (context, index) => + _ImageCell(data: state.images[index], index: index), + staggeredTileBuilder: (index) => + new StaggeredTile.count(2, index.isEven ? 4 : 3), + ), + ); + }); +} + +class _ImageCell extends StatelessWidget { + final ImageData data; + final int index; + const _ImageCell({this.data, this.index}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final double width = Adapt.screenW() / 2; + return Hero( + key: ValueKey('image${data.filePath}'), + tag: 'image${data.filePath}', + child: Container( + width: width, + height: width / data.aspectRatio, + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.filePath, ImageSize.w300)), + ), + ), + ), + ); + } +} diff --git a/lib/views/home_page/action.dart b/lib/views/home_page/action.dart new file mode 100644 index 00000000..0278ca77 --- /dev/null +++ b/lib/views/home_page/action.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/models/video_list.dart'; + +enum HomePageAction { + action, + initMovie, + initTV, + initPopularMovies, + initPopularTVShows, + moreTapped, + initTrending, + searchBarTapped, + cellTapped, + trendingMore, + shareMore, + initShareMovies, + initShareTvShows, +} + +class HomePageActionCreator { + static Action onAction() { + return const Action(HomePageAction.action); + } + + static Action onInitMovie(VideoListModel movie) { + return Action(HomePageAction.initMovie, payload: movie); + } + + static Action onInitTV(VideoListModel tv) { + return Action(HomePageAction.initTV, payload: tv); + } + + static Action onInitPopularMovie(VideoListModel pop) { + return Action(HomePageAction.initPopularMovies, payload: pop); + } + + static Action onInitPopularTV(VideoListModel pop) { + return Action(HomePageAction.initPopularTVShows, payload: pop); + } + + static Action onMoreTapped(VideoListModel model, MediaType t) { + return Action(HomePageAction.moreTapped, payload: [model, t]); + } + + static Action initTrending(SearchResultModel d) { + return Action(HomePageAction.initTrending, payload: d); + } + + static Action onSearchBarTapped() { + return const Action(HomePageAction.searchBarTapped); + } + + static Action onCellTapped( + int id, String bgpic, String title, String posterpic, MediaType type) { + return Action(HomePageAction.cellTapped, + payload: [id, bgpic, title, posterpic, type]); + } + + static Action onTrendingMore() { + return const Action(HomePageAction.trendingMore); + } + + static Action onShareMore() { + return const Action(HomePageAction.shareMore); + } + + static Action initShareMovies(BaseMovieModel d) { + return Action(HomePageAction.initShareMovies, payload: d); + } + + static Action initShareTvShows(BaseTvShowModel d) { + return Action(HomePageAction.initShareTvShows, payload: d); + } +} diff --git a/lib/views/home_page/components/header_component/action.dart b/lib/views/home_page/components/header_component/action.dart new file mode 100644 index 00000000..57fbc287 --- /dev/null +++ b/lib/views/home_page/components/header_component/action.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum HeaderAction { + action, + headerFilterChanged, +} + +class HeaderActionCreator { + static Action onAction() { + return const Action(HeaderAction.action); + } + + static Action onHeaderFilterChanged(bool e) { + return Action(HeaderAction.headerFilterChanged, payload: e); + } +} diff --git a/lib/views/home_page/components/header_component/component.dart b/lib/views/home_page/components/header_component/component.dart new file mode 100644 index 00000000..70d12561 --- /dev/null +++ b/lib/views/home_page/components/header_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.movie != newState.tv || + oldState.tv != newState.tv || + oldState.showHeaderMovie != newState.showHeaderMovie; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/home_page/components/header_component/effect.dart b/lib/views/home_page/components/header_component/effect.dart new file mode 100644 index 00000000..2eddf64a --- /dev/null +++ b/lib/views/home_page/components/header_component/effect.dart @@ -0,0 +1,11 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HeaderAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) {} diff --git a/lib/views/home_page/components/header_component/reducer.dart b/lib/views/home_page/components/header_component/reducer.dart new file mode 100644 index 00000000..19f9069b --- /dev/null +++ b/lib/views/home_page/components/header_component/reducer.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HeaderAction.action: _onAction, + HeaderAction.headerFilterChanged: _onHeaderFilterChanged, + }, + ); +} + +HeaderState _onAction(HeaderState state, Action action) { + final HeaderState newState = state.clone(); + return newState; +} + +HeaderState _onHeaderFilterChanged(HeaderState state, Action action) { + final bool e = action.payload ?? true; + final HeaderState newState = state.clone(); + newState.showHeaderMovie = e; + return newState; +} diff --git a/lib/views/home_page/components/header_component/state.dart b/lib/views/home_page/components/header_component/state.dart new file mode 100644 index 00000000..a4db94d8 --- /dev/null +++ b/lib/views/home_page/components/header_component/state.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/home_page/state.dart'; + +class HeaderState implements Cloneable { + VideoListModel movie; + VideoListModel tv; + bool showHeaderMovie; + @override + HeaderState clone() { + return HeaderState() + ..movie = movie + ..tv = tv + ..showHeaderMovie = showHeaderMovie; + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(HomePageState state) { + HeaderState mstate = HeaderState(); + mstate.movie = state.movie; + mstate.tv = state.tv; + mstate.showHeaderMovie = state.showHeaderMovie; + return mstate; + } + + @override + void set(HomePageState state, HeaderState subState) { + state.showHeaderMovie = subState.showHeaderMovie; + } +} diff --git a/lib/views/home_page/components/header_component/view.dart b/lib/views/home_page/components/header_component/view.dart new file mode 100644 index 00000000..5f05f5ca --- /dev/null +++ b/lib/views/home_page/components/header_component/view.dart @@ -0,0 +1,220 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/home_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + return Container( + color: _theme.bottomAppBarColor, + child: Column( + children: [ + SizedBox(height: Adapt.px(30)), + _TabTitel( + isMovie: state.showHeaderMovie, + onTap: () => dispatch(HeaderActionCreator.onHeaderFilterChanged( + !state.showHeaderMovie)), + ), + SizedBox(height: Adapt.px(45)), + _HeaderBody( + data: state.showHeaderMovie ? state.movie : state.tv, + dispatch: dispatch, + isMovie: state.showHeaderMovie, + ) + ], + ), + ); +} + +class _TabTitel extends StatelessWidget { + final bool isMovie; + final Function onTap; + _TabTitel({this.isMovie, this.onTap}); + final _selectTextStyle = TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: Adapt.px(40), + fontWeight: FontWeight.bold); + final _unselectTextStyle = + TextStyle(color: const Color(0xFF9E9E9E), fontSize: Adapt.px(40)); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + InkWell( + onTap: onTap, + child: Text(I18n.of(context).inTheaters, + style: isMovie ? _selectTextStyle : _unselectTextStyle), + ), + SizedBox( + width: Adapt.px(30), + ), + InkWell( + onTap: onTap, + child: Text( + I18n.of(context).onTV, + style: isMovie ? _unselectTextStyle : _selectTextStyle, + ), + ) + ], + )); + } +} + +class _ShimmerHeaderCell extends StatelessWidget { + final Color _baseColor = Color.fromRGBO(57, 57, 57, 1); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(200), + height: Adapt.px(280), + color: _baseColor, + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + width: Adapt.px(200), + height: Adapt.px(20), + color: _baseColor, + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + width: Adapt.px(150), + height: Adapt.px(20), + color: _baseColor, + ), + ], + ); + } +} + +class _ShimmerHeaderList extends StatelessWidget { + final Color _baseColor = Color.fromRGBO(57, 57, 57, 1); + final Color _highLightColor = Color.fromRGBO(67, 67, 67, 1); + @override + Widget build(BuildContext context) { + return Shimmer.fromColors( + baseColor: _baseColor, + highlightColor: _highLightColor, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + physics: BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + itemCount: 4, + itemBuilder: (context, index) => _ShimmerHeaderCell(), + separatorBuilder: (context, index) => SizedBox(width: Adapt.px(30)), + ), + ); + } +} + +class _HeaderListCell extends StatelessWidget { + final VideoListResult data; + final Function onTap; + const _HeaderListCell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + String name = data.title ?? data.name; + return Column( + key: ValueKey('headercell' + data.id.toString()), + children: [ + GestureDetector( + onTap: onTap, + key: ValueKey('HeaderCell${data.id}'), + child: Container( + width: Adapt.px(200), + height: Adapt.px(280), + decoration: BoxDecoration( + color: const Color.fromRGBO(57, 57, 57, 1), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300), + ), + ), + ), + ), + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + alignment: Alignment.center, + width: Adapt.px(200), + height: Adapt.px(70), + child: Text( + name, + maxLines: 2, + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xFFE0E0E0), + fontSize: Adapt.px(26), + ), + ), + ), + ], + ); + } +} + +class _HeaderBody extends StatelessWidget { + final VideoListModel data; + final bool isMovie; + final Dispatch dispatch; + _HeaderBody({this.data, this.dispatch, this.isMovie = true}) + : assert(data != null); + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(400), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 600), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + child: data.results.length > 0 + ? ListView.separated( + key: ValueKey(data), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + physics: BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: data.results.length, + itemBuilder: (_, index) { + final _d = data.results[index]; + return _HeaderListCell( + data: data.results[index], + onTap: () => dispatch( + HomePageActionCreator.onCellTapped( + _d.id, + _d.backdropPath, + _d.title ?? _d.name, + _d.posterPath, + isMovie ? MediaType.movie : MediaType.tv), + ), + ); + }) + : _ShimmerHeaderList(), + ), + ); + } +} diff --git a/lib/views/home_page/components/popularposter_cpmponent/action.dart b/lib/views/home_page/components/popularposter_cpmponent/action.dart new file mode 100644 index 00000000..871b28b8 --- /dev/null +++ b/lib/views/home_page/components/popularposter_cpmponent/action.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum PopularPosterAction { + action, + cellTapped, + popularFilterChanged, +} + +class PopularPosterActionCreator { + static Action onAction() { + return const Action(PopularPosterAction.action); + } + + static Action onCellTapped( + int id, String bgpic, String title, String posterpic) { + return Action(PopularPosterAction.cellTapped, + payload: [id, bgpic, title, posterpic]); + } + + static Action onPopularFilterChanged(bool e) { + return Action(PopularPosterAction.popularFilterChanged, payload: e); + } +} diff --git a/lib/views/home_page/components/popularposter_cpmponent/component.dart b/lib/views/home_page/components/popularposter_cpmponent/component.dart new file mode 100644 index 00000000..3fc0fd5f --- /dev/null +++ b/lib/views/home_page/components/popularposter_cpmponent/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PopularPosterComponent extends Component { + PopularPosterComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.popularMoives != newState.popularMoives || + oldState.popularTVShows != newState.popularTVShows || + oldState.showmovie != newState.showmovie; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/home_page/components/popularposter_cpmponent/effect.dart b/lib/views/home_page/components/popularposter_cpmponent/effect.dart new file mode 100644 index 00000000..0e930865 --- /dev/null +++ b/lib/views/home_page/components/popularposter_cpmponent/effect.dart @@ -0,0 +1,30 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart' hide Action; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PopularPosterAction.action: _onAction, + PopularPosterAction.cellTapped: _onCellTapped + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onCellTapped(Action action, Context ctx) async { + if (ctx.state.showmovie) + await Navigator.of(ctx.context).pushNamed('detailpage', arguments: { + 'id': action.payload[0], + 'bgpic': action.payload[3], + 'title': action.payload[2], + 'posterpic': action.payload[3] + }); + else + await Navigator.of(ctx.context).pushNamed('tvShowDetailPage', arguments: { + 'tvid': action.payload[0], + 'bgpic': action.payload[1], + 'name': action.payload[2], + 'posterpic': action.payload[3] + }); +} diff --git a/lib/views/home_page/components/popularposter_cpmponent/reducer.dart b/lib/views/home_page/components/popularposter_cpmponent/reducer.dart new file mode 100644 index 00000000..e4c159b8 --- /dev/null +++ b/lib/views/home_page/components/popularposter_cpmponent/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PopularPosterAction.action: _onAction, + PopularPosterAction.popularFilterChanged: _onPopularFilterChanged, + }, + ); +} + +PopularPosterState _onAction(PopularPosterState state, Action action) { + final PopularPosterState newState = state.clone(); + return newState; +} + +PopularPosterState _onPopularFilterChanged( + PopularPosterState state, Action action) { + final bool e = action.payload ?? true; + final PopularPosterState newState = state.clone(); + newState.showmovie = e; + return newState; +} diff --git a/lib/views/home_page/components/popularposter_cpmponent/state.dart b/lib/views/home_page/components/popularposter_cpmponent/state.dart new file mode 100644 index 00000000..d3d54503 --- /dev/null +++ b/lib/views/home_page/components/popularposter_cpmponent/state.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +import '../../state.dart'; + +class PopularPosterState implements Cloneable { + VideoListModel popularMoives; + VideoListModel popularTVShows; + bool showmovie; + @override + PopularPosterState clone() { + return PopularPosterState() + ..popularMoives = popularMoives + ..popularTVShows = popularTVShows + ..showmovie = showmovie; + } +} + +class PopularPosterConnector extends ConnOp { + @override + PopularPosterState get(HomePageState state) { + PopularPosterState mstate = PopularPosterState(); + mstate.popularMoives = state.popularMovies; + mstate.popularTVShows = state.popularTVShows; + mstate.showmovie = state.showPopMovie; + return mstate; + } + + @override + void set(HomePageState state, PopularPosterState subState) { + state.showPopMovie = subState.showmovie; + } +} diff --git a/lib/views/home_page/components/popularposter_cpmponent/view.dart b/lib/views/home_page/components/popularposter_cpmponent/view.dart new file mode 100644 index 00000000..155e5ba0 --- /dev/null +++ b/lib/views/home_page/components/popularposter_cpmponent/view.dart @@ -0,0 +1,247 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + PopularPosterState state, Dispatch dispatch, ViewService viewService) { + return Column( + children: [ + _FrontTitel( + showMovie: state.showmovie, + dispatch: dispatch, + ), + SizedBox(height: Adapt.px(30)), + _PopBody( + dispatch: dispatch, + model: state.showmovie ? state.popularMoives : state.popularTVShows, + ), + ], + ); +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + return SizedBox( + width: Adapt.px(250), + height: Adapt.px(350), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(250), + height: Adapt.px(350), + decoration: BoxDecoration( + color: const Color(0xFFEEEEEE), + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + width: Adapt.px(220), + height: Adapt.px(30), + color: const Color(0xFFEEEEEE), + ) + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 4, + itemBuilder: (_, __) => _ShimmerCell(), + )); + } +} + +class _Cell extends StatelessWidget { + final VideoListResult data; + final Function onTap; + const _Cell({@required this.data, this.onTap}); + + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + key: ValueKey(data.id), + onTap: onTap, + child: Column( + children: [ + Container( + width: Adapt.px(250), + height: Adapt.px(350), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w400), + ), + ), + ), + ), + Container( + //alignment: Alignment.bottomCenter, + width: Adapt.px(250), + padding: EdgeInsets.all(Adapt.px(10)), + child: Text( + data.title ?? data.name, + maxLines: 2, + //textAlign: TextAlign.center, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ); + } +} + +class _MoreCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Column( + children: [ + Container( + decoration: BoxDecoration( + color: _theme.primaryColorLight, + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + width: Adapt.px(250), + height: Adapt.px(350), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + I18n.of(context).more, + style: TextStyle(fontSize: Adapt.px(35)), + ), + Icon(Icons.arrow_forward, size: Adapt.px(35)) + ]), + ) + ], + ); + } +} + +class _FrontTitel extends StatelessWidget { + final bool showMovie; + final Dispatch dispatch; + const _FrontTitel({this.showMovie, this.dispatch}); + @override + Widget build(BuildContext context) { + final TextStyle _selectPopStyle = TextStyle( + fontSize: Adapt.px(24), + fontWeight: FontWeight.bold, + ); + + final TextStyle _unselectPopStyle = + TextStyle(fontSize: Adapt.px(24), color: const Color(0xFF9E9E9E)); + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + I18n.of(context).popular, + style: + TextStyle(fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + ), + Row( + children: [ + GestureDetector( + onTap: () => dispatch( + PopularPosterActionCreator.onPopularFilterChanged(true)), + child: Text(I18n.of(context).movies, + style: showMovie ? _selectPopStyle : _unselectPopStyle), + ), + SizedBox( + width: Adapt.px(20), + ), + GestureDetector( + onTap: () => dispatch( + PopularPosterActionCreator.onPopularFilterChanged(false)), + child: Text(I18n.of(context).tvShows, + style: showMovie ? _unselectPopStyle : _selectPopStyle), + ) + ], + ) + ], + ), + ); + } +} + +class _PopBody extends StatelessWidget { + final VideoListModel model; + final Dispatch dispatch; + const _PopBody({this.model, this.dispatch}) : assert(model != null); + @override + Widget build(BuildContext context) { + return AnimatedSwitcher( + transitionBuilder: (widget, animated) { + return SlideTransition( + position: + animated.drive(Tween(begin: Offset(1, 0), end: Offset.zero)), + child: widget, + ); + }, + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + duration: Duration(milliseconds: 300), + child: Container( + key: ValueKey(model), + height: Adapt.px(450), + child: model.results.length > 0 + ? ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + separatorBuilder: (_, index) => SizedBox(width: Adapt.px(30)), + itemCount: model.results.length + 1, + itemBuilder: (_, index) { + if (index == model.results.length) return _MoreCell(); + final d = model.results[index]; + return _Cell( + data: d, + onTap: () => dispatch( + PopularPosterActionCreator.onCellTapped(d.id, + d.backdropPath, d.title ?? d.name, d.posterPath)), + ); + }, + ) + : _ShimmerList(), + )); + } +} diff --git a/lib/views/home_page/components/share_component/action.dart b/lib/views/home_page/components/share_component/action.dart new file mode 100644 index 00000000..fa808f11 --- /dev/null +++ b/lib/views/home_page/components/share_component/action.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum ShareAction { + action, + shareFilterChanged, +} + +class ShareActionCreator { + static Action onAction() { + return const Action(ShareAction.action); + } + + static Action onShareFilterChanged(bool e) { + return Action(ShareAction.shareFilterChanged, payload: e); + } +} diff --git a/lib/views/home_page/components/share_component/component.dart b/lib/views/home_page/components/share_component/component.dart new file mode 100644 index 00000000..df0eb6c6 --- /dev/null +++ b/lib/views/home_page/components/share_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ShareComponent extends Component { + ShareComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.shareMovies != newState.shareMovies || + oldState.shareTvshows != newState.shareTvshows || + oldState.showShareMovie != newState.showShareMovie; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/home_page/components/share_component/effect.dart b/lib/views/home_page/components/share_component/effect.dart new file mode 100644 index 00000000..ab7e1d4f --- /dev/null +++ b/lib/views/home_page/components/share_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ShareAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/home_page/components/share_component/reducer.dart b/lib/views/home_page/components/share_component/reducer.dart new file mode 100644 index 00000000..300a5a0b --- /dev/null +++ b/lib/views/home_page/components/share_component/reducer.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ShareAction.action: _onAction, + ShareAction.shareFilterChanged: _onShareFilterChanged, + }, + ); +} + +ShareState _onAction(ShareState state, Action action) { + final ShareState newState = state.clone(); + return newState; +} + +ShareState _onShareFilterChanged(ShareState state, Action action) { + final bool e = action.payload ?? true; + final ShareState newState = state.clone(); + newState.showShareMovie = e; + return newState; +} diff --git a/lib/views/home_page/components/share_component/state.dart b/lib/views/home_page/components/share_component/state.dart new file mode 100644 index 00000000..038c7ec9 --- /dev/null +++ b/lib/views/home_page/components/share_component/state.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; +import 'package:movie/views/home_page/state.dart'; + +class ShareState implements Cloneable { + BaseMovieModel shareMovies; + BaseTvShowModel shareTvshows; + bool showShareMovie; + @override + ShareState clone() { + return ShareState() + ..shareMovies = shareMovies + ..shareTvshows = shareTvshows + ..showShareMovie = showShareMovie; + } +} + +class ShareConnector extends ConnOp { + @override + ShareState get(HomePageState state) { + ShareState mstate = ShareState(); + mstate.shareMovies = state.shareMovies; + mstate.shareTvshows = state.shareTvshows; + mstate.showShareMovie = state.showShareMovie; + return mstate; + } + + void set(HomePageState state, ShareState subState) { + state.showShareMovie = subState.showShareMovie; + } +} diff --git a/lib/views/home_page/components/share_component/view.dart b/lib/views/home_page/components/share_component/view.dart new file mode 100644 index 00000000..e131b32f --- /dev/null +++ b/lib/views/home_page/components/share_component/view.dart @@ -0,0 +1,259 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/home_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView(ShareState state, Dispatch dispatch, ViewService viewService) { + return Column( + children: [ + _FrontTitel( + dispatch: dispatch, + showShareMovie: state.showShareMovie, + ), + SizedBox(height: Adapt.px(30)), + _ShareBody( + model: state.showShareMovie + ? (state.shareMovies?.data ?? []) + : (state.shareTvshows?.data ?? []), + dispatch: dispatch, + showMovie: state.showShareMovie, + ), + ], + ); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + return SizedBox( + width: Adapt.px(250), + height: Adapt.px(350), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(250), + height: Adapt.px(350), + decoration: BoxDecoration( + color: const Color(0xFFEEEEEE), + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + width: Adapt.px(220), + height: Adapt.px(30), + color: const Color(0xFFEEEEEE), + ) + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 4, + itemBuilder: (_, __) => const _ShimmerCell(), + ), + ); + } +} + +class _Cell extends StatelessWidget { + final dynamic data; + final Function onTap; + const _Cell({@required this.data, this.onTap}); + + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + key: ValueKey(data.id), + onTap: onTap, + child: Column( + children: [ + Container( + width: Adapt.px(250), + height: Adapt.px(350), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.photourl, ImageSize.w400), + ), + ), + ), + ), + Container( + //alignment: Alignment.bottomCenter, + width: Adapt.px(250), + padding: EdgeInsets.all(Adapt.px(10)), + child: Text( + data.name, + maxLines: 2, + //textAlign: TextAlign.center, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ); + } +} + +class _FrontTitel extends StatelessWidget { + final Dispatch dispatch; + final bool showShareMovie; + const _FrontTitel({this.dispatch, this.showShareMovie}); + @override + Widget build(BuildContext context) { + final TextStyle _selectPopStyle = TextStyle( + fontSize: Adapt.px(24), + fontWeight: FontWeight.bold, + ); + final TextStyle _unselectPopStyle = + TextStyle(fontSize: Adapt.px(24), color: Colors.grey); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + I18n.of(context).shared, + style: + TextStyle(fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + ), + GestureDetector( + onTap: () => dispatch(HomePageActionCreator.onShareMore()), + child: Row( + children: [ + GestureDetector( + onTap: () => + dispatch(ShareActionCreator.onShareFilterChanged(true)), + child: Text(I18n.of(context).movies, + style: + showShareMovie ? _selectPopStyle : _unselectPopStyle), + ), + SizedBox( + width: Adapt.px(20), + ), + GestureDetector( + onTap: () => + dispatch(ShareActionCreator.onShareFilterChanged(false)), + child: Text(I18n.of(context).tvShows, + style: + showShareMovie ? _unselectPopStyle : _selectPopStyle), + ) + ], + ), + ) + ], + ), + ); + } +} + +class _MoreCell extends StatelessWidget { + final Dispatch dispatch; + const _MoreCell({this.dispatch}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return InkWell( + onTap: () => dispatch(HomePageActionCreator.onShareMore()), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: _theme.primaryColorLight, + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + width: Adapt.px(250), + height: Adapt.px(350), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + I18n.of(context).more, + style: TextStyle(fontSize: Adapt.px(35)), + ), + Icon(Icons.arrow_forward, size: Adapt.px(35)) + ]), + ) + ], + ), + ); + } +} + +class _ShareBody extends StatelessWidget { + final List model; + final Dispatch dispatch; + final bool showMovie; + const _ShareBody({this.model, this.dispatch, this.showMovie}); + @override + Widget build(BuildContext context) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 600), + child: Container( + key: ValueKey(model), + height: Adapt.px(450), + child: model.length > 0 + ? ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + separatorBuilder: (_, index) => SizedBox(width: Adapt.px(30)), + itemCount: model.length + 1, + itemBuilder: (_, index) { + if (index == model.length) + return _MoreCell( + dispatch: dispatch, + ); + final dynamic d = model[index]; + return _Cell( + data: d, + onTap: () => dispatch(HomePageActionCreator.onCellTapped( + d.id, + d.photourl, + d.name, + d.photourl, + showMovie ? MediaType.movie : MediaType.tv)), + ); + }) + : _ShimmerList(), + ), + ); + } +} diff --git a/lib/views/home_page/components/swiper_component/action.dart b/lib/views/home_page/components/swiper_component/action.dart new file mode 100644 index 00000000..1aff5bdc --- /dev/null +++ b/lib/views/home_page/components/swiper_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum SwiperAction { action } + +class SwiperActionCreator { + static Action onAction() { + return const Action(SwiperAction.action); + } +} diff --git a/lib/views/home_page/components/swiper_component/component.dart b/lib/views/home_page/components/swiper_component/component.dart new file mode 100644 index 00000000..d89cbdf1 --- /dev/null +++ b/lib/views/home_page/components/swiper_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class SwiperComponent extends Component { + SwiperComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.movie != newState.movie || + oldState.tv != newState.tv || + oldState.showHeaderMovie != newState.showHeaderMovie; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/home_page/components/swiper_component/effect.dart b/lib/views/home_page/components/swiper_component/effect.dart new file mode 100644 index 00000000..23c0fd50 --- /dev/null +++ b/lib/views/home_page/components/swiper_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SwiperAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/home_page/components/swiper_component/state.dart b/lib/views/home_page/components/swiper_component/state.dart new file mode 100644 index 00000000..a5ccdad4 --- /dev/null +++ b/lib/views/home_page/components/swiper_component/state.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/home_page/state.dart'; + +class SwiperState implements Cloneable { + VideoListModel movie; + VideoListModel tv; + bool showHeaderMovie; + @override + SwiperState clone() { + return SwiperState(); + } +} + +class SwiperConnector extends ConnOp { + @override + SwiperState get(HomePageState state) { + SwiperState mstate = SwiperState(); + mstate.movie = state.movie; + mstate.tv = state.tv; + mstate.showHeaderMovie = state.showHeaderMovie; + return mstate; + } +} diff --git a/lib/views/home_page/components/swiper_component/view.dart b/lib/views/home_page/components/swiper_component/view.dart new file mode 100644 index 00000000..91c87943 --- /dev/null +++ b/lib/views/home_page/components/swiper_component/view.dart @@ -0,0 +1,190 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/widgets/shimmercell.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/home_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + SwiperState state, Dispatch dispatch, ViewService viewService) { + return SizedBox( + height: Adapt.px(225), + child: _Swiper( + model: state.showHeaderMovie ? state.movie : state.tv, + showMovie: state.showHeaderMovie, + dispatch: dispatch, + ), + ); +} + +class _Cell extends StatelessWidget { + final VideoListResult data; + final Function onTap; + const _Cell({@required this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + key: ValueKey('card${data.id}'), + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + decoration: new BoxDecoration( + color: _theme.brightness == Brightness.light + ? const Color(0xFFFFFFFF) + : const Color(0xFF404040), + boxShadow: [ + BoxShadow( + color: _theme.brightness == Brightness.light + ? Colors.grey[200] + : Colors.transparent, + offset: Offset(0, Adapt.px(20)), + blurRadius: Adapt.px(30), + spreadRadius: Adapt.px(1)), + ], + ), + margin: EdgeInsets.fromLTRB( + Adapt.px(30), Adapt.px(5), Adapt.px(30), Adapt.px(30)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(120), + height: Adapt.px(170), + decoration: BoxDecoration( + color: _theme.primaryColorLight, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(width: Adapt.px(20)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(20)), + Row( + children: [ + Container( + width: Adapt.screenW() - Adapt.px(450), + child: Text( + data.title ?? data.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + //color: Colors.black, + fontWeight: FontWeight.w800, + fontSize: Adapt.px(28)), + ), + ), + Container( + width: Adapt.px(160), + child: RatingBarIndicator( + itemBuilder: (context, _) => Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: Colors.grey[300], + itemSize: Adapt.px(22), + itemPadding: EdgeInsets.only(right: Adapt.px(8)), + rating: data.voteAverage / 2, + ), + ), + Text( + data.voteAverage.toStringAsFixed(1), + style: TextStyle( + fontSize: Adapt.px(22), + fontWeight: FontWeight.w700), + ) + ], + ), + SizedBox(height: Adapt.px(20)), + Container( + width: Adapt.screenW() - Adapt.px(210), + child: Text( + data.overview, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: Adapt.px(22)), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Container( + margin: EdgeInsets.only(bottom: Adapt.px(55)), + child: ShimmerCell( + Adapt.screenW() - Adapt.px(60), + Adapt.px(170), + 0, + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + ), + ); + } +} + +class _Swiper extends StatelessWidget { + final VideoListModel model; + final bool showMovie; + final Dispatch dispatch; + const _Swiper({this.model, this.showMovie, this.dispatch}); + @override + Widget build(BuildContext context) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 600), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + child: model.results.length > 0 + ? Swiper( + key: ValueKey(model), + autoplay: true, + duration: 1000, + autoplayDelay: 10000, + viewportFraction: 0.9999, + itemCount: model.results.length, + itemBuilder: (ctx, index) { + var d = model.results[index]; + return _Cell( + data: d, + onTap: () => dispatch(HomePageActionCreator.onCellTapped( + d.id, + d.backdropPath, + d.title ?? d.name, + d.posterPath, + showMovie ? MediaType.movie : MediaType.tv)), + ); + }, + ) + : const _ShimmerCell(), + ); + } +} diff --git a/lib/views/home_page/components/trending_component/action.dart b/lib/views/home_page/components/trending_component/action.dart new file mode 100644 index 00000000..e13994ab --- /dev/null +++ b/lib/views/home_page/components/trending_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TrendingAction { action } + +class TrendingActionCreator { + static Action onAction() { + return const Action(TrendingAction.action); + } +} diff --git a/lib/views/home_page/components/trending_component/component.dart b/lib/views/home_page/components/trending_component/component.dart new file mode 100644 index 00000000..86b99d2b --- /dev/null +++ b/lib/views/home_page/components/trending_component/component.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class TrendingComponent extends Component { + TrendingComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.trending != newState.trending; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/home_page/components/trending_component/effect.dart b/lib/views/home_page/components/trending_component/effect.dart new file mode 100644 index 00000000..b1e1064f --- /dev/null +++ b/lib/views/home_page/components/trending_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TrendingAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/home_page/components/trending_component/state.dart b/lib/views/home_page/components/trending_component/state.dart new file mode 100644 index 00000000..f01b1216 --- /dev/null +++ b/lib/views/home_page/components/trending_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/views/home_page/state.dart'; + +class TrendingState implements Cloneable { + SearchResultModel trending; + @override + TrendingState clone() { + return TrendingState(); + } +} + +class TrendingConnector extends ConnOp { + @override + TrendingState get(HomePageState state) { + TrendingState mstate = TrendingState(); + mstate.trending = state.trending; + return mstate; + } +} diff --git a/lib/views/home_page/components/trending_component/view.dart b/lib/views/home_page/components/trending_component/view.dart new file mode 100644 index 00000000..e108b687 --- /dev/null +++ b/lib/views/home_page/components/trending_component/view.dart @@ -0,0 +1,167 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/home_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + TrendingState state, Dispatch dispatch, ViewService viewService) { + return Column( + children: [ + _FrontTitle(dispatch: dispatch), + SizedBox(height: Adapt.px(30)), + _Trending( + data: state.trending.results, + dispatch: dispatch, + ), + SizedBox(height: Adapt.px(50)), + ], + ); +} + +class _FrontTitle extends StatelessWidget { + final Dispatch dispatch; + const _FrontTitle({this.dispatch}); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + I18n.of(context).trending, + style: + TextStyle(fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + ), + GestureDetector( + onTap: () => dispatch(HomePageActionCreator.onTrendingMore()), + child: Text( + I18n.of(context).more, + style: TextStyle(color: Colors.grey[600]), + ), + ) + ], + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + final double _size = (Adapt.screenW() - Adapt.px(70)) / 2; + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Row( + children: [ + Container( + width: _size, + height: _size, + color: Colors.grey[200], + ), + SizedBox( + width: Adapt.px(10), + ), + Column( + children: [ + Container( + width: _size, + height: (_size - Adapt.px(10)) / 2, + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: _size, + height: (_size - Adapt.px(10)) / 2, + color: Colors.grey[200], + ) + ], + ) + ], + ), + ); + } +} + +class _Trending extends StatelessWidget { + final List data; + final Dispatch dispatch; + const _Trending({this.data, this.dispatch}); + @override + Widget build(BuildContext context) { + final MediaQueryData _mediaQuery = MediaQuery.of(context); + final ThemeData _theme = ThemeStyle.getTheme(context); + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 600), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + child: data.length > 0 + ? StaggeredGridView.countBuilder( + key: ValueKey('Trending'), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + crossAxisCount: 4, + staggeredTileBuilder: (int index) => + new StaggeredTile.count(2, index == 0 ? 2 : 1), + mainAxisSpacing: Adapt.px(5), + crossAxisSpacing: Adapt.px(5), + itemCount: 3, + itemBuilder: (BuildContext contxt, int index) { + var d = data[index]; + return GestureDetector( + onTap: () => dispatch(HomePageActionCreator.onCellTapped( + d.id, + d.backdropPath, + d.title ?? d.name, + d.posterPath, + d.title != null ? MediaType.movie : MediaType.tv)), + child: Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(10)), + alignment: Alignment.bottomLeft, + decoration: BoxDecoration( + color: _theme.primaryColorDark, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(d.backdropPath, ImageSize.w400), + ), + ), + ), + child: Text( + d.title ?? d.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.white, + fontSize: + Adapt.px(30) / _mediaQuery.textScaleFactor, + fontWeight: FontWeight.bold, + shadows: [Shadow(offset: Offset(1, 1))]), + ), + ), + ); + }, + ) + : _ShimmerCell(), + ), + ); + } +} diff --git a/lib/views/home_page/effect.dart b/lib/views/home_page/effect.dart new file mode 100644 index 00000000..8b126c87 --- /dev/null +++ b/lib/views/home_page/effect.dart @@ -0,0 +1,119 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action, Page; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/routes/routes.dart'; +import 'package:movie/widgets/searchbar_delegate.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/enums/time_window.dart'; +import 'package:movie/views/detail_page/page.dart'; +import 'package:movie/views/stream_link/allstreamlink_page/page.dart'; +import 'package:movie/views/tvshow_detail_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HomePageAction.action: _onAction, + HomePageAction.moreTapped: _moreTapped, + HomePageAction.searchBarTapped: _onSearchBarTapped, + HomePageAction.cellTapped: _onCellTapped, + HomePageAction.trendingMore: _trendingMore, + HomePageAction.shareMore: _shareMore, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final Object ticker = ctx.stfState; + ctx.state.animatedController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 600)); + ctx.state.scrollController = new ScrollController(); + final _tmdb = TMDBApi.instance; + final _baseApi = BaseApi.instance; + final _movies = await _tmdb.getNowPlayingMovie(); + if (_movies.success) + ctx.dispatch(HomePageActionCreator.onInitMovie(_movies.result)); + final _tv = await _tmdb.getTVOnTheAir(); + if (_tv.success) ctx.dispatch(HomePageActionCreator.onInitTV(_tv.result)); + final _trending = await _tmdb.getTrending(MediaType.all, TimeWindow.day); + if (_trending.success) + ctx.dispatch(HomePageActionCreator.initTrending(_trending.result)); + final _shareMovie = await _baseApi.getMovies(pageSize: 10); + if (_shareMovie.success) + ctx.dispatch(HomePageActionCreator.initShareMovies(_shareMovie.result)); + final _sharetv = await _baseApi.getTvShows(pageSize: 10); + if (_sharetv.success) + ctx.dispatch(HomePageActionCreator.initShareTvShows(_sharetv.result)); + final _popMovie = await _tmdb.getPopularMovies(); + if (_popMovie.success) + ctx.dispatch(HomePageActionCreator.onInitPopularMovie(_popMovie.result)); + final _popTv = await _tmdb.getPopularTVShows(); + if (_popTv.success) + ctx.dispatch(HomePageActionCreator.onInitPopularTV(_popTv.result)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animatedController.dispose(); + ctx.state.scrollController.dispose(); +} + +Future _moreTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('MoreMediaPage', + arguments: {'list': action.payload[0], 'type': action.payload[1]}); +} + +Future _onSearchBarTapped(Action action, Context ctx) async { + await showSearch(context: ctx.context, delegate: SearchBarDelegate()); +} + +Future _onCellTapped(Action action, Context ctx) async { + final MediaType type = action.payload[4]; + final int id = action.payload[0]; + final String bgpic = action.payload[1]; + final String title = action.payload[2]; + final String posterpic = action.payload[3]; + final String pagename = + type == MediaType.movie ? 'detailpage' : 'tvShowDetailPage'; + var data = { + 'id': id, + 'bgpic': type == MediaType.movie ? posterpic : bgpic, + 'name': title, + 'posterpic': posterpic + }; + Page page = type == MediaType.movie ? MovieDetailPage() : TvShowDetailPage(); + await Navigator.of(ctx.context).push(PageRouteBuilder( + settings: RouteSettings(name: pagename), + pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: page.buildPage(data), + ); + })); + //await Navigator.of(ctx.context).pushNamed(pagename, arguments: data); +} + +Future _trendingMore(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: + Routes.routes.buildPage('trendingPage', {'data': ctx.state.trending}), + ); + })); +} + +Future _shareMore(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: AllStreamLinkPage().buildPage( + {'type': ctx.state.showShareMovie ? MediaType.movie : MediaType.tv}), + ); + })); +} diff --git a/lib/views/home_page/page.dart b/lib/views/home_page/page.dart new file mode 100644 index 00000000..8c86a59f --- /dev/null +++ b/lib/views/home_page/page.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/popularposter_cpmponent/component.dart'; +import 'components/popularposter_cpmponent/state.dart'; +import 'components/share_component/component.dart'; +import 'components/share_component/state.dart'; +import 'components/swiper_component/component.dart'; +import 'components/swiper_component/state.dart'; +import 'components/trending_component/component.dart'; +import 'components/trending_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HomePage extends Page> + with TickerProviderMixin { + HomePage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + shouldUpdate: (o, n) { + return false; + }, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'swiper': SwiperConnector() + SwiperComponent(), + 'trending': TrendingConnector() + TrendingComponent(), + 'share': ShareConnector() + ShareComponent(), + 'popularposter': + PopularPosterConnector() + PopularPosterComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/home_page/reducer.dart b/lib/views/home_page/reducer.dart new file mode 100644 index 00000000..92dd366a --- /dev/null +++ b/lib/views/home_page/reducer.dart @@ -0,0 +1,77 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/models/video_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HomePageAction.action: _onAction, + HomePageAction.initMovie: _onInitMovie, + HomePageAction.initTV: _onInitTV, + HomePageAction.initPopularMovies: _onInitPopularMovie, + HomePageAction.initPopularTVShows: _onInitPopularTVShows, + HomePageAction.initTrending: _onInitTrending, + HomePageAction.initShareMovies: _onInitShareMovies, + HomePageAction.initShareTvShows: _onInitShareTvShows, + }, + ); +} + +HomePageState _onAction(HomePageState state, Action action) { + final HomePageState newState = state.clone(); + return newState; +} + +HomePageState _onInitShareMovies(HomePageState state, Action action) { + final BaseMovieModel d = action.payload; + final HomePageState newState = state.clone(); + newState.shareMovies = d; + return newState; +} + +HomePageState _onInitShareTvShows(HomePageState state, Action action) { + final BaseTvShowModel d = action.payload; + final HomePageState newState = state.clone(); + newState.shareTvshows = d; + return newState; +} + +HomePageState _onInitMovie(HomePageState state, Action action) { + final VideoListModel model = action.payload ?? null; + final HomePageState newState = state.clone(); + newState.movie = model; + return newState; +} + +HomePageState _onInitTV(HomePageState state, Action action) { + final VideoListModel model = action.payload ?? null; + final HomePageState newState = state.clone(); + newState.tv = model; + return newState; +} + +HomePageState _onInitPopularMovie(HomePageState state, Action action) { + final VideoListModel model = action.payload ?? null; + final HomePageState newState = state.clone(); + newState.popularMovies = model; + return newState; +} + +HomePageState _onInitPopularTVShows(HomePageState state, Action action) { + final VideoListModel model = action.payload ?? null; + final HomePageState newState = state.clone(); + newState.popularTVShows = model; + return newState; +} + +HomePageState _onInitTrending(HomePageState state, Action action) { + final SearchResultModel model = action.payload ?? null; + final HomePageState newState = state.clone(); + newState.trending = model; + return newState; +} diff --git a/lib/views/home_page/state.dart b/lib/views/home_page/state.dart new file mode 100644 index 00000000..9dd5b90c --- /dev/null +++ b/lib/views/home_page/state.dart @@ -0,0 +1,53 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/models/video_list.dart'; + +class HomePageState implements Cloneable { + VideoListModel movie; + VideoListModel tv; + VideoListModel popularMovies; + VideoListModel popularTVShows; + BaseMovieModel shareMovies; + BaseTvShowModel shareTvshows; + SearchResultModel trending; + ScrollController scrollController; + bool showHeaderMovie; + bool showPopMovie; + bool showShareMovie; + AnimationController animatedController; + + @override + HomePageState clone() { + return HomePageState() + ..tv = tv + ..movie = movie + ..popularMovies = popularMovies + ..popularTVShows = popularTVShows + ..showHeaderMovie = showHeaderMovie + ..showPopMovie = showPopMovie + ..shareMovies = shareMovies + ..shareTvshows = shareTvshows + ..showShareMovie = showShareMovie + ..trending = trending + ..scrollController = scrollController + ..animatedController = animatedController; + } +} + +HomePageState initState(Map args) { + var state = HomePageState(); + state.movie = new VideoListModel.fromParams(results: List()); + state.tv = new VideoListModel.fromParams(results: List()); + state.popularMovies = + new VideoListModel.fromParams(results: List()); + state.popularTVShows = + new VideoListModel.fromParams(results: List()); + state.trending = SearchResultModel.fromParams(results: []); + state.showPopMovie = true; + state.showHeaderMovie = true; + state.showShareMovie = true; + return state; +} diff --git a/lib/views/home_page/view.dart b/lib/views/home_page/view.dart new file mode 100644 index 00000000..7b8a8ec1 --- /dev/null +++ b/lib/views/home_page/view.dart @@ -0,0 +1,98 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/backdrop.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + HomePageState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Scaffold( + appBar: AppBar( + backgroundColor: _theme.bottomAppBarColor, + brightness: Brightness.dark, + elevation: 0.0, + automaticallyImplyLeading: false, + title: _SearchBar( + onTap: () => dispatch(HomePageActionCreator.onSearchBarTapped()), + ), + ), + body: BackDrop( + backLayerHeight: Adapt.px(580) + Adapt.padTopH(), + backChild: viewService.buildComponent('header'), + frontBackGroundColor: _theme.backgroundColor, + frontChildren: [ + const _Line(), + viewService.buildComponent('swiper'), + viewService.buildComponent('trending'), + viewService.buildComponent('share'), + viewService.buildComponent('popularposter'), + ], + ), + ); + }, + ); +} + +class _SearchBar extends StatelessWidget { + final Function onTap; + const _SearchBar({this.onTap}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.only(left: Adapt.px(30), right: Adapt.px(30)), + height: Adapt.px(70), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + color: const Color.fromRGBO(57, 57, 57, 1), + ), + child: Row( + children: [ + Icon( + Icons.search, + color: Colors.grey, + ), + SizedBox(width: Adapt.px(20)), + SizedBox( + width: Adapt.screenW() - Adapt.px(200), + child: Text( + I18n.of(context).searchbartxt, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: Colors.grey, fontSize: Adapt.px(28)), + ), + ), + ], + ), + ), + ); + } +} + +class _Line extends StatelessWidget { + const _Line({Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Padding( + padding: EdgeInsets.only(bottom: 20), + child: Center( + child: Container( + width: 40, + height: 3, + color: _theme.primaryColorDark, + ), + ), + ); + } +} diff --git a/lib/views/listdetail_page/action.dart b/lib/views/listdetail_page/action.dart new file mode 100644 index 00000000..842e8f03 --- /dev/null +++ b/lib/views/listdetail_page/action.dart @@ -0,0 +1,50 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; +import 'package:movie/models/enums/screenshot_type.dart'; +import 'package:movie/models/list_detail_mode.dart'; +import 'package:movie/models/sort_condition.dart'; + +enum ListDetailPageAction { + action, + setListDetail, + cellTapped, + loadMore, + sortChanged, + setSort, + screenShot, + showShareCard, +} + +class ListDetailPageActionCreator { + static Action onAction() { + return const Action(ListDetailPageAction.action); + } + + static Action showShareCard() { + return const Action(ListDetailPageAction.showShareCard); + } + + static Action setListDetail(UserListDetailModel d) { + return Action(ListDetailPageAction.setListDetail, payload: d); + } + + static Action cellTapped(UserListDetail result) { + return Action(ListDetailPageAction.cellTapped, payload: result); + } + + static Action loadMore(ListDetailModel d) { + return Action(ListDetailPageAction.loadMore, payload: d); + } + + static Action sortChanged(SortCondition d) { + return Action(ListDetailPageAction.sortChanged, payload: d); + } + + static Action setSort(SortCondition d) { + return Action(ListDetailPageAction.setSort, payload: d); + } + + static Action screenShot(ScreenShotType type) { + return Action(ListDetailPageAction.screenShot, payload: type); + } +} diff --git a/lib/views/listdetail_page/components/body_component/action.dart b/lib/views/listdetail_page/components/body_component/action.dart new file mode 100644 index 00000000..e42a6dc4 --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum BodyAction { action } + +class BodyActionCreator { + static Action onAction() { + return const Action(BodyAction.action); + } +} diff --git a/lib/views/listdetail_page/components/body_component/adapter/adapter.dart b/lib/views/listdetail_page/components/body_component/adapter/adapter.dart new file mode 100644 index 00000000..721fed84 --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/adapter/adapter.dart @@ -0,0 +1,11 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/listdetail_page/components/listcell_component/component.dart'; + +import '../state.dart'; + +class GridAdapter extends SourceFlowAdapter { + GridAdapter() + : super( + pool: >{'listCell': ListCellComponent()}, + ); +} diff --git a/lib/views/listdetail_page/components/body_component/component.dart b/lib/views/listdetail_page/components/body_component/component.dart new file mode 100644 index 00000000..05f7a87a --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'adapter/adapter.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class BodyComponent extends Component { + BodyComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.listItems != newState.listItems; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + GridAdapter(), + slots: >{}), + ); +} diff --git a/lib/views/listdetail_page/components/body_component/effect.dart b/lib/views/listdetail_page/components/body_component/effect.dart new file mode 100644 index 00000000..d0f3b72d --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + BodyAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/listdetail_page/components/body_component/reducer.dart b/lib/views/listdetail_page/components/body_component/reducer.dart new file mode 100644 index 00000000..cbd45e82 --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + BodyAction.action: _onAction, + }, + ); +} + +BodyState _onAction(BodyState state, Action action) { + final BodyState newState = state.clone(); + return newState; +} diff --git a/lib/views/listdetail_page/components/body_component/state.dart b/lib/views/listdetail_page/components/body_component/state.dart new file mode 100644 index 00000000..8d8c8a98 --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/state.dart @@ -0,0 +1,37 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; +import 'package:movie/views/listdetail_page/components/listcell_component/state.dart'; +import 'package:movie/views/listdetail_page/state.dart'; + +class BodyState extends MutableSource implements Cloneable { + UserListDetailModel listItems; + @override + BodyState clone() { + return BodyState()..listItems = listItems; + } + + @override + Object getItemData(int index) => + ListCellState(cellData: listItems.data[index]); + + @override + String getItemType(int index) => 'listCell'; + + @override + int get itemCount => listItems?.data?.length ?? 0; + + @override + void setItemData(int index, Object data) {} +} + +class BodyConnector extends ConnOp { + @override + BodyState get(ListDetailPageState state) { + BodyState mstate = BodyState(); + mstate.listItems = state.listItems; + return mstate; + } + + @override + void set(ListDetailPageState state, BodyState subState) {} +} diff --git a/lib/views/listdetail_page/components/body_component/view.dart b/lib/views/listdetail_page/components/body_component/view.dart new file mode 100644 index 00000000..0252cda9 --- /dev/null +++ b/lib/views/listdetail_page/components/body_component/view.dart @@ -0,0 +1,64 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView(BodyState state, Dispatch dispatch, ViewService viewService) { + final _adapter = viewService.buildAdapter(); + + final width = Adapt.screenW() / 3; + return state.listItems == null + ? _ShimmerBody() + : SliverGrid( + delegate: SliverChildBuilderDelegate((context, index) { + return _adapter.itemBuilder(context, index); + }, childCount: _adapter.itemCount), + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: width, + childAspectRatio: 2 / 3, + crossAxisSpacing: Adapt.px(10), + mainAxisSpacing: Adapt.px(10), + ), + ); +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + width: (Adapt.screenW() - Adapt.px(20)) / 3, + height: Adapt.screenW() / 2, + color: Colors.grey, + ); + } +} + +class _ShimmerBody extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Wrap( + spacing: Adapt.px(10), + runSpacing: Adapt.px(10), + children: [ + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell(), + _ShimmerCell() + ], + ), + )); + } +} diff --git a/lib/views/listdetail_page/components/header_component/action.dart b/lib/views/listdetail_page/components/header_component/action.dart new file mode 100644 index 00000000..13544d73 --- /dev/null +++ b/lib/views/listdetail_page/components/header_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum HeaderAction { action } + +class HeaderActionCreator { + static Action onAction() { + return const Action(HeaderAction.action); + } +} diff --git a/lib/views/listdetail_page/components/header_component/component.dart b/lib/views/listdetail_page/components/header_component/component.dart new file mode 100644 index 00000000..6aca59ab --- /dev/null +++ b/lib/views/listdetail_page/components/header_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.backGroundUrl != newState.backGroundUrl; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/listdetail_page/components/header_component/effect.dart b/lib/views/listdetail_page/components/header_component/effect.dart new file mode 100644 index 00000000..ef23ed69 --- /dev/null +++ b/lib/views/listdetail_page/components/header_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HeaderAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/listdetail_page/components/header_component/reducer.dart b/lib/views/listdetail_page/components/header_component/reducer.dart new file mode 100644 index 00000000..868d7f39 --- /dev/null +++ b/lib/views/listdetail_page/components/header_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HeaderAction.action: _onAction, + }, + ); +} + +HeaderState _onAction(HeaderState state, Action action) { + final HeaderState newState = state.clone(); + return newState; +} diff --git a/lib/views/listdetail_page/components/header_component/state.dart b/lib/views/listdetail_page/components/header_component/state.dart new file mode 100644 index 00000000..eef81872 --- /dev/null +++ b/lib/views/listdetail_page/components/header_component/state.dart @@ -0,0 +1,34 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/views/listdetail_page/state.dart'; + +class HeaderState implements Cloneable { + int listid; + String backGroundUrl; + String description; + List sortBy; + String sortType; + FirebaseUser user; + @override + HeaderState clone() { + return HeaderState(); + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(ListDetailPageState state) { + HeaderState mstate = HeaderState(); + mstate.listid = state.listDetailModel.id; + mstate.backGroundUrl = state.listDetailModel?.backGroundUrl ?? ''; + mstate.description = state.listDetailModel?.description ?? ''; + mstate.sortBy = state.sortBy; + mstate.sortType = state.sortType; + mstate.user = state.user.firebaseUser; + return mstate; + } + + @override + void set(ListDetailPageState state, HeaderState subState) {} +} diff --git a/lib/views/listdetail_page/components/header_component/view.dart b/lib/views/listdetail_page/components/header_component/view.dart new file mode 100644 index 00000000..006142b8 --- /dev/null +++ b/lib/views/listdetail_page/components/header_component/view.dart @@ -0,0 +1,277 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/views/listdetail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + return FlexibleSpaceBar( + background: state.listid != null + ? _Header( + backGroundUrl: state.backGroundUrl, + user: state.user, + description: state.description, + dispatch: dispatch, + sortBy: state.sortBy, + ) + : _ShimmerHeader(), + ); +} + +class _ShimmerHeader extends StatelessWidget { + @override + Widget build(BuildContext context) { + final Color baseColor = const Color(0xFF505050); + return Container( + alignment: Alignment.bottomLeft, + padding: EdgeInsets.all(Adapt.px(30)), + child: Shimmer.fromColors( + baseColor: baseColor, + highlightColor: Color(0xFF707070), + child: SafeArea( + child: Container( + padding: EdgeInsets.only(top: Adapt.px(100)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: Adapt.px(100), + height: Adapt.px(100), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(50)), + color: baseColor), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'A list by', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30)), + ), + SizedBox( + height: Adapt.px(5), + ), + Container( + width: Adapt.px(120), + height: Adapt.px(28), + color: baseColor, + ) + ], + ), + Expanded( + child: Container(), + ), + _IconButton(icon: Icons.edit, onPress: () {}), + _IconButton(icon: Icons.share, onPress: () {}), + _IconButton(icon: Icons.sort, onPress: () {}), + ], + ), + SizedBox( + height: Adapt.px(20), + ), + Text('About this list', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30))), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.screenW() - Adapt.px(60), + height: Adapt.px(26), + color: baseColor, + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.screenW() - Adapt.px(60), + height: Adapt.px(26), + color: baseColor, + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.screenW() - Adapt.px(200), + height: Adapt.px(26), + color: baseColor, + ), + SizedBox( + height: Adapt.px(30), + ), + ], + ), + ), + ), + ), + ); + } +} + +class _IconButton extends StatelessWidget { + final Function onPress; + final IconData icon; + const _IconButton({this.icon, this.onPress}); + @override + Widget build(BuildContext context) { + return IconButton( + icon: Icon(icon, color: const Color(0xFFFFFFFF)), + onPressed: onPress, + ); + } +} + +class _Header extends StatelessWidget { + final String backGroundUrl; + final FirebaseUser user; + final Dispatch dispatch; + final List> sortBy; + final String description; + const _Header( + {this.backGroundUrl, + this.description, + this.dispatch, + this.sortBy, + this.user}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(backGroundUrl), + )), + child: Container( + alignment: Alignment.bottomLeft, + padding: EdgeInsets.all(Adapt.px(30)), + color: Colors.black.withOpacity(0.7), + child: SafeArea( + child: Container( + padding: EdgeInsets.only(top: Adapt.px(100)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(children: [ + Container( + width: Adapt.px(100), + height: Adapt.px(100), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(Adapt.px(50)), + image: user.photoUrl != null + ? DecorationImage( + fit: BoxFit.cover, + image: + CachedNetworkImageProvider(user.photoUrl)) + : null), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'A list by', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30)), + ), + SizedBox( + height: Adapt.px(5), + ), + SizedBox( + width: Adapt.px(200), + child: Text( + user.displayName ?? '', + style: TextStyle(color: Colors.white), + ), + ) + ], + ), + Expanded( + child: Container(), + ), + _IconButton( + icon: Icons.share, + onPress: () => dispatch( + ListDetailPageActionCreator.showShareCard())), + PopupMenuButton( + offset: Offset(0, Adapt.px(100)), + icon: Icon(Icons.sort, color: Colors.white), + onSelected: (selected) => dispatch( + ListDetailPageActionCreator.sortChanged(selected)), + itemBuilder: (ctx) { + return sortBy.map((s) { + final unSelectedStyle = TextStyle(color: Colors.grey); + final selectedStyle = + TextStyle(fontWeight: FontWeight.bold); + return PopupMenuItem( + value: s, + child: Row( + children: [ + Text( + s.name, + style: s.isSelected + ? selectedStyle + : unSelectedStyle, + ), + Expanded( + child: Container(), + ), + s.isSelected ? Icon(Icons.check) : SizedBox() + ], + ), + ); + }).toList(); + }, + ) + ]), + SizedBox( + height: Adapt.px(20), + ), + Text('About this list', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30))), + Container( + width: Adapt.screenW() - Adapt.px(60), + height: Adapt.px(120), + child: Text( + description, + overflow: TextOverflow.ellipsis, + maxLines: 4, + style: + TextStyle(color: Colors.white, fontSize: Adapt.px(26)), + ), + ), + SizedBox( + height: Adapt.px(30), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/listdetail_page/components/infogroup_component/component.dart b/lib/views/listdetail_page/components/infogroup_component/component.dart new file mode 100644 index 00000000..bc43a84a --- /dev/null +++ b/lib/views/listdetail_page/components/infogroup_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class InfoGroupComponent extends Component { + InfoGroupComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.itemCount != newState.itemCount || + oldState.rating != newState.rating || + oldState.revenue != newState.revenue || + oldState.runTime != newState.runTime; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/listdetail_page/components/infogroup_component/state.dart b/lib/views/listdetail_page/components/infogroup_component/state.dart new file mode 100644 index 00000000..8631cd49 --- /dev/null +++ b/lib/views/listdetail_page/components/infogroup_component/state.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/listdetail_page/state.dart'; + +class InfoGroupState implements Cloneable { + int itemCount; + double rating; + int runTime; + double revenue; + @override + InfoGroupState clone() { + return InfoGroupState(); + } +} + +class InfoGroupConnector extends ConnOp { + @override + InfoGroupState get(ListDetailPageState state) { + InfoGroupState mstate = InfoGroupState(); + mstate.itemCount = state.listDetailModel?.itemCount ?? 0; + mstate.rating = state.listDetailModel?.totalRated ?? 0.0; + mstate.runTime = state.listDetailModel?.runTime ?? 0; + mstate.revenue = state.listDetailModel?.revenue ?? 0; + return mstate; + } + + @override + void set(ListDetailPageState state, InfoGroupState subState) {} +} diff --git a/lib/views/listdetail_page/components/infogroup_component/view.dart b/lib/views/listdetail_page/components/infogroup_component/view.dart new file mode 100644 index 00000000..089e69b5 --- /dev/null +++ b/lib/views/listdetail_page/components/infogroup_component/view.dart @@ -0,0 +1,118 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + InfoGroupState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + + return Container( + padding: EdgeInsets.symmetric(vertical: Adapt.px(20)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical(top: Radius.circular(Adapt.px(40))), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _InfoCell(value: state.itemCount.toString() ?? '0', title: 'ITEMS'), + Container( + color: Colors.grey[300], + width: Adapt.px(1), + height: Adapt.px(60), + ), + _InfoCell( + value: '', + title: 'RATING', + valueChild: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + (state.rating / state.itemCount).toStringAsFixed(1) ?? '0.0', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(28)), + ), + Icon( + Icons.star, + size: Adapt.px(20), + ) + ], + ), + ), + Container( + color: Colors.grey[300], + width: Adapt.px(1), + height: Adapt.px(60), + ), + _InfoCell( + value: _covertDuration(state.runTime ?? 0), + title: 'RUNTIME', + ), + Container( + color: Colors.grey[300], + width: Adapt.px(1), + height: Adapt.px(60), + ), + _InfoCell( + value: + '\$${((state.revenue ?? 0) / 1000000000).toStringAsFixed(1)} B', + title: 'REVENUE', + ), + ], + ), + ); +} + +String _covertDuration(int d) { + String result = ''; + Duration duration = Duration(minutes: d); + int h = duration.inHours; + int countedMin = h * 60; + int m = duration.inMinutes - countedMin; + result += h > 0 ? '$h H ' : ''; + result += '$m M'; + return result; +} + +class _InfoCell extends StatelessWidget { + final Widget valueChild; + final String value; + final String title; + _InfoCell({ + this.title, + this.value, + this.valueChild, + }); + @override + Widget build(BuildContext context) { + final titleStyle = + TextStyle(fontSize: Adapt.px(26), fontWeight: FontWeight.bold); + final valueStyle = + TextStyle(fontWeight: FontWeight.bold, fontSize: Adapt.px(28)); + return SizedBox( + width: Adapt.px(160), + child: Column( + children: [ + valueChild == null + ? Text( + value ?? '', + style: valueStyle, + ) + : valueChild, + SizedBox( + height: Adapt.px(8), + ), + Text( + title, + style: titleStyle, + ), + ], + ), + ); + } +} diff --git a/lib/views/listdetail_page/components/listcell_component/action.dart b/lib/views/listdetail_page/components/listcell_component/action.dart new file mode 100644 index 00000000..85ae895a --- /dev/null +++ b/lib/views/listdetail_page/components/listcell_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum ListCellAction { action } + +class ListCellActionCreator { + static Action onAction() { + return const Action(ListCellAction.action); + } +} diff --git a/lib/views/listdetail_page/components/listcell_component/component.dart b/lib/views/listdetail_page/components/listcell_component/component.dart new file mode 100644 index 00000000..4817fec0 --- /dev/null +++ b/lib/views/listdetail_page/components/listcell_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ListCellComponent extends Component { + ListCellComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.cellData != newState.cellData; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/listdetail_page/components/listcell_component/effect.dart b/lib/views/listdetail_page/components/listcell_component/effect.dart new file mode 100644 index 00000000..c0cf2720 --- /dev/null +++ b/lib/views/listdetail_page/components/listcell_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ListCellAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/listdetail_page/components/listcell_component/reducer.dart b/lib/views/listdetail_page/components/listcell_component/reducer.dart new file mode 100644 index 00000000..9cab14cb --- /dev/null +++ b/lib/views/listdetail_page/components/listcell_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ListCellAction.action: _onAction, + }, + ); +} + +ListCellState _onAction(ListCellState state, Action action) { + final ListCellState newState = state.clone(); + return newState; +} diff --git a/lib/views/listdetail_page/components/listcell_component/state.dart b/lib/views/listdetail_page/components/listcell_component/state.dart new file mode 100644 index 00000000..17aa5f33 --- /dev/null +++ b/lib/views/listdetail_page/components/listcell_component/state.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; + +class ListCellState implements Cloneable { + UserListDetail cellData; + ListCellState({this.cellData}); + @override + ListCellState clone() { + return ListCellState()..cellData = cellData; + } +} + +ListCellState initState(Map args) { + return ListCellState(); +} diff --git a/lib/views/listdetail_page/components/listcell_component/view.dart b/lib/views/listdetail_page/components/listcell_component/view.dart new file mode 100644 index 00000000..01d00dc1 --- /dev/null +++ b/lib/views/listdetail_page/components/listcell_component/view.dart @@ -0,0 +1,47 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/listdetail_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + ListCellState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + final d = state.cellData; + return GestureDetector( + onTap: () => dispatch(ListDetailPageActionCreator.cellTapped(d)), + child: Container( + decoration: BoxDecoration( + color: _theme.primaryColorDark, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(d.photoUrl, ImageSize.w300)))), + child: Column( + children: [ + Container( + padding: EdgeInsets.all(Adapt.px(10)), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + Icons.star, + color: Colors.white, + size: Adapt.px(30), + ), + Text( + d.rated.toStringAsFixed(1), + style: TextStyle(color: Colors.white), + ) + ], + )) + ], + ), + ), + ); +} diff --git a/lib/views/listdetail_page/components/sharecard_component/action.dart b/lib/views/listdetail_page/components/sharecard_component/action.dart new file mode 100644 index 00000000..26648987 --- /dev/null +++ b/lib/views/listdetail_page/components/sharecard_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum ShareCardAction { action } + +class ShareCardActionCreator { + static Action onAction() { + return const Action(ShareCardAction.action); + } +} diff --git a/lib/views/listdetail_page/components/sharecard_component/component.dart b/lib/views/listdetail_page/components/sharecard_component/component.dart new file mode 100644 index 00000000..340c4fb8 --- /dev/null +++ b/lib/views/listdetail_page/components/sharecard_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class ShareCardComponent extends Component { + ShareCardComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.listDetailModel != newState.listDetailModel || + oldState.user != newState.user; + }, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/listdetail_page/components/sharecard_component/effect.dart b/lib/views/listdetail_page/components/sharecard_component/effect.dart new file mode 100644 index 00000000..05ec15be --- /dev/null +++ b/lib/views/listdetail_page/components/sharecard_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ShareCardAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/listdetail_page/components/sharecard_component/state.dart b/lib/views/listdetail_page/components/sharecard_component/state.dart new file mode 100644 index 00000000..983e8c69 --- /dev/null +++ b/lib/views/listdetail_page/components/sharecard_component/state.dart @@ -0,0 +1,26 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/views/listdetail_page/state.dart'; + +class ShareCardState implements Cloneable { + UserList listDetailModel; + FirebaseUser user; + @override + ShareCardState clone() { + return ShareCardState(); + } +} + +class ShareCardConnector extends ConnOp { + @override + ShareCardState get(ListDetailPageState state) { + ShareCardState mstate = ShareCardState(); + mstate.listDetailModel = state.listDetailModel; + mstate.user = state.user.firebaseUser; + return mstate; + } + + @override + void set(ListDetailPageState state, ShareCardState subState) {} +} diff --git a/lib/views/listdetail_page/components/sharecard_component/view.dart b/lib/views/listdetail_page/components/sharecard_component/view.dart new file mode 100644 index 00000000..cb712a09 --- /dev/null +++ b/lib/views/listdetail_page/components/sharecard_component/view.dart @@ -0,0 +1,164 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; + +import 'state.dart'; + +Widget buildView( + ShareCardState state, Dispatch dispatch, ViewService viewService) { + final d = state.listDetailModel; + final int _itemCount = d.itemCount; + final double _totalRated = d.totalRated; + return Column( + children: [ + SizedBox( + height: Adapt.px(20), + ), + Text(d.listName, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(45), + fontWeight: FontWeight.bold)), + SizedBox( + height: Adapt.px(20), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: Adapt.px(150), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + image: state.user.photoUrl != null + ? DecorationImage( + image: CachedNetworkImageProvider( + state.user.photoUrl)) + : null), + ), + SizedBox( + height: Adapt.px(10), + ), + Text( + 'A list by', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30)), + ), + SizedBox( + height: Adapt.px(5), + ), + SizedBox( + width: Adapt.px(130), + child: Text( + state.user.displayName ?? '', + style: TextStyle(color: Colors.white), + ), + ) + ], + ), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + children: [ + Row( + children: [ + _InfoCell( + value: _itemCount?.toString() ?? '0', + title: 'ITEMS', + ), + SizedBox( + width: Adapt.px(20), + ), + _InfoCell( + value: + (_totalRated / _itemCount).toStringAsFixed(1) ?? '0.0', + title: 'RATING', + ), + ], + ), + SizedBox(height: Adapt.px(20)), + Row( + children: [ + _InfoCell( + value: _covertDuration(d.runTime ?? 0), + title: 'RUNTIME', + ), + SizedBox(width: Adapt.px(20)), + _InfoCell( + value: + '\$${((d.revenue ?? 0) / 1000000000).toStringAsFixed(1)} B', + title: 'REVENUE', + ), + ], + ) + ], + ) + ], + ), + ], + ); +} + +String _covertDuration(int d) { + String result = ''; + Duration duration = Duration(minutes: d); + int h = duration.inHours; + int countedMin = h * 60; + int m = duration.inMinutes - countedMin; + result += h > 0 ? '$h H ' : ''; + result += '$m M'; + return result; +} + +class _InfoCell extends StatelessWidget { + final Widget valueChild; + final String value; + final String title; + _InfoCell({ + this.title, + this.value, + this.valueChild, + }); + @override + Widget build(BuildContext context) { + final titleStyle = TextStyle( + fontSize: Adapt.px(26), + fontWeight: FontWeight.bold, + color: const Color(0xFFFFFFFF)); + final valueStyle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(28), + color: const Color(0xFFFFFFFF)); + return SizedBox( + width: Adapt.px(160), + child: Column( + children: [ + valueChild == null + ? Text( + value ?? '', + style: valueStyle, + ) + : valueChild, + SizedBox( + height: Adapt.px(8), + ), + Text( + title, + style: titleStyle, + ), + ], + ), + ); + } +} diff --git a/lib/views/listdetail_page/effect.dart b/lib/views/listdetail_page/effect.dart new file mode 100644 index 00000000..e6cb5a41 --- /dev/null +++ b/lib/views/listdetail_page/effect.dart @@ -0,0 +1,66 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/widgets/share_card.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + Lifecycle.initState: _onInit, + ListDetailPageAction.action: _onAction, + ListDetailPageAction.cellTapped: _cellTapped, + ListDetailPageAction.sortChanged: _sortChanged, + ListDetailPageAction.showShareCard: _showShareCard, + }); +} + +void _onAction(Action action, Context ctx) {} +void _showShareCard(Action action, Context ctx) { + showDialog( + context: ctx.context, + builder: (context) { + return ShareCard( + backgroundImage: ctx.state.listDetailModel?.backGroundUrl ?? '', + qrValue: "https://www.themoviedb.org/list/${ctx.state.listId}", + header: ctx.buildComponent('shareCard'), + ); + }); +} + +Future _onInit(Action action, Context ctx) async { + if (ctx.state.listDetailModel?.id != null) { + final _baseApi = BaseApi.instance; + final _detailItem = + await _baseApi.getUserListDetailItems(ctx.state.listDetailModel?.id); + if (_detailItem.success) + ctx.dispatch( + ListDetailPageActionCreator.setListDetail(_detailItem.result)); + } +} + +Future _cellTapped(Action action, Context ctx) async { + UserListDetail d = action.payload; + if (d != null) { + await Navigator.of(ctx.context).pushNamed( + d.mediaType == 'movie' ? 'detailpage' : 'tvShowDetailPage', + arguments: { + 'id': d.mediaid, + 'bgpic': d.photoUrl, + 'name': d.mediaName, + 'posterpic': d.photoUrl + }); + } +} + +Future _sortChanged(Action action, Context ctx) async { + final SortCondition model = action.payload; + if (model.value != ctx.state.sortType) { + ctx.dispatch(ListDetailPageActionCreator.setSort(model)); + _loadData(action, ctx); + } +} + +Future _loadData(Action action, Context ctx) async {} diff --git a/lib/views/listdetail_page/page.dart b/lib/views/listdetail_page/page.dart new file mode 100644 index 00000000..118d6296 --- /dev/null +++ b/lib/views/listdetail_page/page.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/listdetail_page/components/header_component/state.dart'; +import 'package:movie/views/listdetail_page/components/infogroup_component/component.dart'; + +import 'components/body_component/component.dart'; +import 'components/body_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/infogroup_component/state.dart'; +import 'components/sharecard_component/component.dart'; +import 'components/sharecard_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ListDetailPage extends Page> { + ListDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'infoGroup': InfoGroupConnector() + InfoGroupComponent(), + 'shareCard': ShareCardConnector() + ShareCardComponent(), + 'body': BodyConnector() + BodyComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/listdetail_page/reducer.dart b/lib/views/listdetail_page/reducer.dart new file mode 100644 index 00000000..9176cdbd --- /dev/null +++ b/lib/views/listdetail_page/reducer.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; +import 'package:movie/models/sort_condition.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ListDetailPageAction.action: _onAction, + ListDetailPageAction.setSort: _setSort, + ListDetailPageAction.setListDetail: _setDetail, + }, + ); +} + +ListDetailPageState _onAction(ListDetailPageState state, Action action) { + final ListDetailPageState newState = state.clone(); + return newState; +} + +ListDetailPageState _setSort(ListDetailPageState state, Action action) { + final SortCondition model = action.payload; + final ListDetailPageState newState = state.clone(); + int index = state.sortBy.indexOf(model); + newState.sortBy.forEach((f) { + f.isSelected = false; + }); + newState.sortBy[index].isSelected = true; + newState.sortType = model.value; + return newState; +} + +ListDetailPageState _setDetail(ListDetailPageState state, Action action) { + final UserListDetailModel model = action.payload; + final ListDetailPageState newState = state.clone(); + newState.listItems = model; + return newState; +} diff --git a/lib/views/listdetail_page/state.dart b/lib/views/listdetail_page/state.dart new file mode 100644 index 00000000..f8175162 --- /dev/null +++ b/lib/views/listdetail_page/state.dart @@ -0,0 +1,60 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; +import 'package:movie/models/enums/list_sort_type.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/sort_condition.dart'; + +class ListDetailPageState + implements GlobalBaseState, Cloneable { + String listId; + UserList listDetailModel; + UserListDetailModel listItems; + ScrollController scrollController; + List sortBy; + String sortType; + + @override + ListDetailPageState clone() { + return ListDetailPageState() + ..listDetailModel = listDetailModel + ..listId = listId + ..sortBy = sortBy + ..sortType = sortType + ..listItems = listItems + ..scrollController = scrollController + ..user = user; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +ListDetailPageState initState(Map args) { + ListDetailPageState state = ListDetailPageState(); + state.listDetailModel = args['list']; + state.sortBy = [ + SortCondition( + isSelected: true, + name: 'Original Order', + value: ListSortType.originalOrderAsc), + SortCondition( + isSelected: false, name: 'Rating', value: ListSortType.voteAverageDesc), + SortCondition( + isSelected: false, + name: 'Release Date', + value: ListSortType.releaseDateDesc), + SortCondition( + isSelected: false, name: 'Title', value: ListSortType.titleAsc), + ]; + state.sortType = ListSortType.originalOrderAsc; + return state; +} diff --git a/lib/views/listdetail_page/view.dart b/lib/views/listdetail_page/view.dart new file mode 100644 index 00000000..126b23bc --- /dev/null +++ b/lib/views/listdetail_page/view.dart @@ -0,0 +1,35 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'state.dart'; + +Widget buildView( + ListDetailPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + return Scaffold( + body: CustomScrollView( + controller: state.scrollController, + slivers: [ + SliverAppBar( + backgroundColor: Color.fromRGBO(50, 50, 50, 1), + pinned: true, + title: Text( + state?.listDetailModel?.listName ?? '', + style: TextStyle(fontWeight: FontWeight.bold), + ), + expandedHeight: Adapt.px(550), + flexibleSpace: viewService.buildComponent('header'), + bottom: PreferredSize( + preferredSize: Size.fromHeight(Adapt.px(100)), + child: viewService.buildComponent('infoGroup'), + ), + ), + viewService.buildComponent('body'), + const SliverToBoxAdapter( + child: const SizedBox(height: 20), + ) + ], + ), + ); + }); +} diff --git a/lib/views/login_page/action.dart b/lib/views/login_page/action.dart new file mode 100644 index 00000000..1c098db3 --- /dev/null +++ b/lib/views/login_page/action.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum LoginPageAction { + action, + loginclicked, + signUp, + googleSignIn, + switchLoginMode, + facebookSignIn, + sendVerificationCode, + countryCodeChange, +} + +class LoginPageActionCreator { + static Action onAction() { + return const Action(LoginPageAction.action); + } + + static Action onLoginClicked() { + return const Action(LoginPageAction.loginclicked); + } + + static Action onSignUp() { + return const Action(LoginPageAction.signUp); + } + + static Action onGoogleSignIn() { + return const Action(LoginPageAction.googleSignIn); + } + + static Action switchLoginMode() { + return const Action(LoginPageAction.switchLoginMode); + } + + static Action sendVerificationCode() { + return const Action(LoginPageAction.sendVerificationCode); + } + + static Action countryCodeChange(String code) { + return Action(LoginPageAction.countryCodeChange, payload: code); + } +} diff --git a/lib/views/login_page/effect.dart b/lib/views/login_page/effect.dart new file mode 100644 index 00000000..65a8693f --- /dev/null +++ b/lib/views/login_page/effect.dart @@ -0,0 +1,204 @@ +import 'dart:convert'; +import 'dart:ui' as ui; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart' hide Action; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:movie/actions/pop_result.dart'; +import 'package:movie/actions/user_info_operate.dart'; +import 'package:movie/models/country_phone_code.dart'; +import 'package:movie/views/register_page/page.dart'; +import 'action.dart'; +import 'state.dart'; +import 'package:toast/toast.dart'; + +Effect buildEffect() { + return combineEffects(>{ + LoginPageAction.action: _onAction, + LoginPageAction.loginclicked: _onLoginClicked, + LoginPageAction.signUp: _onSignUp, + LoginPageAction.googleSignIn: _onGoogleSignIn, + LoginPageAction.sendVerificationCode: _onSendVerificationCode, + Lifecycle.initState: _onInit, + Lifecycle.build: _onBuild, + Lifecycle.dispose: _onDispose + }); +} + +final FirebaseAuth _auth = FirebaseAuth.instance; +void _onInit(Action action, Context ctx) async { + ctx.state..emailLogin = true; + ctx.state.accountFocusNode = FocusNode(); + ctx.state.pwdFocusNode = FocusNode(); + final Object ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 2000)); + ctx.state.submitAnimationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 1000)); + ctx.state.accountTextController = TextEditingController(); + ctx.state.passWordTextController = TextEditingController(); + ctx.state.phoneTextController = TextEditingController(); + ctx.state.codeTextContraller = TextEditingController(); + ctx.state.countryCode = '+1'; + final _jsonStr = await CountryPhoneCode.getCountryJson(ctx.context); + final countriesJson = json.decode(_jsonStr); + ctx.state.countryCodes = List(); + for (var country in countriesJson) { + ctx.state.countryCodes.add(CountryPhoneCode.fromJson(country)); + } + ctx.state.countryCode = ctx.state.countryCodes + .singleWhere((e) => e.code == ui.window.locale.countryCode, + orElse: () => null) + ?.dialCode ?? + '+1'; +} + +void _onBuild(Action action, Context ctx) { + Future.delayed(Duration(milliseconds: 150), + () => ctx.state.animationController.forward()); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); + ctx.state.accountFocusNode.dispose(); + ctx.state.pwdFocusNode.dispose(); + ctx.state.submitAnimationController.dispose(); + ctx.state.accountTextController.dispose(); + ctx.state.passWordTextController.dispose(); + ctx.state.phoneTextController.dispose(); + ctx.state.codeTextContraller.dispose(); +} + +void _onAction(Action action, Context ctx) {} + +Future _onLoginClicked(Action action, Context ctx) async { + AuthResult _result; + ctx.state.submitAnimationController.forward(); + if (ctx.state.emailLogin) + _result = await _emailSignIn(action, ctx); + else + _result = await _phoneNumSignIn(action, ctx); + if (_result?.user == null) { + Toast.show("Account verification required", ctx.context, + duration: 3, gravity: Toast.BOTTOM); + ctx.state.submitAnimationController.reverse(); + } else { + var user = _result?.user; + var _nickName = user.displayName ?? + user.phoneNumber.substring(user.phoneNumber.length - 4); + + if (user.displayName == null) + user + .updateProfile(UserUpdateInfo()..displayName = _nickName) + .then((v) => UserInfoOperate.whenLogin(user, _nickName)); + UserInfoOperate.whenLogin(user, _nickName); + Navigator.of(ctx.context).pop({'s': true, 'name': _nickName}); + } +} + +Future _emailSignIn( + Action action, Context ctx) async { + if (ctx.state.accountTextController.text != '' && + ctx.state.passWordTextController.text != '') { + try { + final _email = ctx.state.accountTextController.text.trim(); + return await _auth.signInWithEmailAndPassword( + email: _email, password: ctx.state.passWordTextController.text); + } on Exception catch (e) { + Toast.show(e.toString(), ctx.context, duration: 3, gravity: Toast.BOTTOM); + ctx.state.submitAnimationController.reverse(); + } + } + return null; +} + +Future _phoneNumSignIn( + Action action, Context ctx) async { + if (_verificationId != null && ctx.state.codeTextContraller.text.isNotEmpty) { + try { + final _credential = PhoneAuthProvider.getCredential( + verificationId: _verificationId, + smsCode: ctx.state.codeTextContraller.text); + return await _auth.signInWithCredential(_credential); + } on Exception catch (e) { + Toast.show(e.toString(), ctx.context, duration: 3, gravity: Toast.BOTTOM); + ctx.state.submitAnimationController.reverse(); + } + } + + return null; +} + +Future _onSignUp(Action action, Context ctx) async { + Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (context, an, _) { + return FadeTransition( + opacity: an, + child: RegisterPage().buildPage(null), + ); + })).then((results) { + if (results is PopWithResults) { + PopWithResults popResult = results; + if (popResult.toPage == 'mainpage') + Navigator.of(ctx.context).pop(results.results); + } + }); +} + +void _onGoogleSignIn(Action action, Context ctx) async { + ctx.state.submitAnimationController.forward(); + try { + GoogleSignIn _googleSignIn = GoogleSignIn(); + final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); + if (googleUser == null) + return ctx.state.submitAnimationController.reverse(); + final GoogleSignInAuthentication googleAuth = + await googleUser.authentication; + final AuthCredential credential = GoogleAuthProvider.getCredential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + final FirebaseUser user = + (await _auth.signInWithCredential(credential)).user; + assert(user.email != null); + assert(user.displayName != null); + assert(!user.isAnonymous); + assert(await user.getIdToken() != null); + + final FirebaseUser currentUser = await _auth.currentUser(); + assert(user.uid == currentUser.uid); + if (user != null) { + UserInfoOperate.whenLogin(user, user.displayName); + Navigator.of(ctx.context).pop({'s': true, 'name': user.displayName}); + } else { + ctx.state.submitAnimationController.reverse(); + Toast.show("Google signIn fail", ctx.context, + duration: 3, gravity: Toast.BOTTOM); + } + } on Exception catch (e) { + ctx.state.submitAnimationController.reverse(); + Toast.show(e.toString(), ctx.context, duration: 5, gravity: Toast.BOTTOM); + } +} + +String _verificationId; +void _onSendVerificationCode(Action action, Context ctx) async { + if (ctx.state.phoneTextController.text.isEmpty || + ctx.state.phoneTextController.text.length < 8) + return Toast.show('Invalid phone number', ctx.context); + _auth.verifyPhoneNumber( + phoneNumber: ctx.state.countryCode + ctx.state.phoneTextController.text, + timeout: Duration(seconds: 60), + verificationCompleted: null, + verificationFailed: (AuthException e) { + print('error code: ${e.code}, message: ${e.message}'); + Toast.show(e.message, ctx.context, + gravity: Toast.TOP, duration: Toast.LENGTH_LONG); + }, + codeSent: (String verificationId, [int]) { + _verificationId = verificationId; + print(verificationId); + }, + codeAutoRetrievalTimeout: null); +} diff --git a/lib/views/login_page/page.dart b/lib/views/login_page/page.dart new file mode 100644 index 00000000..d8745480 --- /dev/null +++ b/lib/views/login_page/page.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class LoginPage extends Page> + with TickerProviderMixin { + LoginPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/login_page/reducer.dart b/lib/views/login_page/reducer.dart new file mode 100644 index 00000000..d721319a --- /dev/null +++ b/lib/views/login_page/reducer.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + LoginPageAction.action: _onAction, + LoginPageAction.switchLoginMode: _switchLoginMode, + LoginPageAction.countryCodeChange: _onCountryCodeChange, + }, + ); +} + +LoginPageState _onAction(LoginPageState state, Action action) { + final LoginPageState newState = state.clone(); + return newState; +} + +LoginPageState _switchLoginMode(LoginPageState state, Action action) { + final LoginPageState newState = state.clone(); + newState.emailLogin = !state.emailLogin; + return newState; +} + +LoginPageState _onCountryCodeChange(LoginPageState state, Action action) { + final String _code = action.payload; + final LoginPageState newState = state.clone(); + newState.countryCode = _code; + return newState; +} diff --git a/lib/views/login_page/state.dart b/lib/views/login_page/state.dart new file mode 100644 index 00000000..424b2794 --- /dev/null +++ b/lib/views/login_page/state.dart @@ -0,0 +1,53 @@ +import 'dart:ui'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/country_phone_code.dart'; +import 'package:movie/models/app_user.dart'; + +class LoginPageState implements GlobalBaseState, Cloneable { + String account = ''; + String pwd = ''; + bool emailLogin; + TextEditingController accountTextController; + TextEditingController passWordTextController; + TextEditingController phoneTextController; + TextEditingController codeTextContraller; + AnimationController animationController; + AnimationController submitAnimationController; + FocusNode accountFocusNode; + FocusNode pwdFocusNode; + String countryCode; + List countryCodes; + + @override + LoginPageState clone() { + return LoginPageState() + ..account = account + ..pwd = pwd + ..emailLogin = emailLogin + ..accountFocusNode = accountFocusNode + ..pwdFocusNode = pwdFocusNode + ..animationController = animationController + ..submitAnimationController = submitAnimationController + ..accountTextController = accountTextController + ..passWordTextController = passWordTextController + ..phoneTextController = phoneTextController + ..codeTextContraller = codeTextContraller + ..countryCode = countryCode + ..countryCodes = countryCodes; + } + + @override + Color themeColor; + + @override + Locale locale; + + @override + AppUser user; +} + +LoginPageState initState(Map args) { + return LoginPageState(); +} diff --git a/lib/views/login_page/view.dart b/lib/views/login_page/view.dart new file mode 100644 index 00000000..e9d9087c --- /dev/null +++ b/lib/views/login_page/view.dart @@ -0,0 +1,729 @@ +import 'dart:async'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/customcliper_path.dart'; +import 'package:movie/models/country_phone_code.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:toast/toast.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + LoginPageState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + body: Stack( + children: [ + _BackGround(controller: state.animationController), + _LoginBody( + animationController: state.animationController, + submitAnimationController: state.submitAnimationController, + emailLogin: state.emailLogin, + accountFocusNode: state.accountFocusNode, + pwdFocusNode: state.pwdFocusNode, + accountTextController: state.accountTextController, + passWordTextController: state.passWordTextController, + phoneTextController: state.phoneTextController, + codeTextContraller: state.codeTextContraller, + countryCode: state.countryCode, + countryCodes: state.countryCodes, + dispatch: dispatch, + ), + _AppBar(), + ], + ), + ); +} + +class _BackGround extends StatelessWidget { + final AnimationController controller; + const _BackGround({this.controller}); + @override + Widget build(BuildContext context) { + final double headerHeight = Adapt.screenH() / 3; + return Column(children: [ + ClipPath( + clipper: CustomCliperPath( + height: headerHeight, + width: Adapt.screenW(), + radius: Adapt.px(1000)), + child: Container( + height: headerHeight, + width: Adapt.screenW(), + decoration: BoxDecoration( + color: Colors.black87, + image: DecorationImage( + colorFilter: + ColorFilter.mode(Colors.black, BlendMode.color), + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'https://image.tmdb.org/t/p/original/mAkPFEWkwKz9nmKyCiuETfTdpgX.jpg'))), + alignment: Alignment.center, + child: Container( + color: Color.fromRGBO(20, 20, 20, 0.8), + alignment: Alignment.center, + height: headerHeight, + width: Adapt.screenW(), + child: SlideTransition( + position: Tween(begin: Offset(0, -1), end: Offset.zero) + .animate(CurvedAnimation( + parent: controller, + curve: Interval( + 0.0, + 0.4, + curve: Curves.ease, + ), + )), + child: Image.asset( + 'images/tmdb_blue.png', + width: Adapt.px(150), + height: Adapt.px(150), + color: Colors.white, + )), + )), + ), + Expanded(child: SizedBox()), + Container( + height: Adapt.px(200), + width: Adapt.screenW(), + padding: EdgeInsets.only(bottom: Adapt.px(20)), + alignment: Alignment.bottomCenter, + child: SafeArea( + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: controller, + curve: Interval( + 0.7, + 1.0, + curve: Curves.ease, + ), + )), + child: Text('Powered by The Movie DB')), + )), + ]); + } +} + +class _AppBar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Positioned( + top: 0.0, + left: 0.0, + right: 0.0, + child: AppBar( + brightness: Brightness.dark, + backgroundColor: Colors.transparent, + elevation: 0.0, + iconTheme: IconThemeData(color: Colors.white), + ), + ); + } +} + +class _EmailEntry extends StatelessWidget { + final AnimationController controller; + final TextEditingController accountTextController; + final TextEditingController passWordTextController; + final FocusNode accountFocusNode; + final FocusNode pwdFocusNode; + final Function(String) onSubmit; + const _EmailEntry( + {this.controller, + this.accountFocusNode, + this.pwdFocusNode, + this.accountTextController, + this.passWordTextController, + this.onSubmit}); + @override + Widget build(BuildContext context) { + final accountCurve = CurvedAnimation( + parent: controller, + curve: Interval( + 0.3, + 0.5, + curve: Curves.ease, + ), + ); + final passwordCurve = CurvedAnimation( + parent: controller, + curve: Interval( + 0.4, + 0.6, + curve: Curves.ease, + ), + ); + final _theme = ThemeStyle.getTheme(context); + + return Column(children: [ + SlideTransition( + position: + Tween(begin: Offset(0, 1), end: Offset.zero).animate(accountCurve), + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(accountCurve), + child: Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: TextField( + focusNode: accountFocusNode, + controller: accountTextController, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + style: TextStyle(fontSize: Adapt.px(35)), + cursorColor: _theme.iconTheme.color, + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Account', + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle(fontSize: Adapt.px(35)), + focusedBorder: new UnderlineInputBorder( + borderSide: new BorderSide(color: Colors.black87))), + onSubmitted: (s) { + accountFocusNode.nextFocus(); + }, + ), + )), + ), + SlideTransition( + position: + Tween(begin: Offset(0, 1), end: Offset.zero).animate(passwordCurve), + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(passwordCurve), + child: Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: TextField( + focusNode: pwdFocusNode, + controller: passWordTextController, + style: TextStyle(fontSize: Adapt.px(35)), + cursorColor: _theme.iconTheme.color, + obscureText: true, + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'PassWord', + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle(fontSize: Adapt.px(35)), + focusedBorder: new UnderlineInputBorder( + borderSide: new BorderSide(color: Colors.black87))), + onSubmitted: onSubmit, + ), + ), + ), + ), + ]); + } +} + +class _PhoneNumberEntry extends StatelessWidget { + final TextEditingController phoneTextController; + final TextEditingController codeTextContraller; + final List countryCodes; + final String countryCode; + final Function(String) countryCodeTap; + final Function sendVerificationCode; + const _PhoneNumberEntry( + {this.phoneTextController, + this.codeTextContraller, + this.countryCodeTap, + this.countryCode, + this.countryCodes, + this.sendVerificationCode}); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Column(children: [ + SizedBox(height: Adapt.px(40)), + TextField( + controller: phoneTextController, + keyboardType: TextInputType.number, + textInputAction: TextInputAction.next, + cursorColor: Colors.black, + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Phone Number', + prefixIcon: InkWell( + onTap: () => showDialog( + context: context, + builder: (context) { + return _CountryCodeDialog( + countries: countryCodes, + onCellTap: countryCodeTap, + ); + }), + child: SizedBox( + width: Adapt.px(60), + child: Center( + child: Text( + countryCode, + ), + ), + )), + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle(color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black87), + ), + ), + ), + SizedBox(height: Adapt.px(80)), + Theme( + child: TextField( + controller: codeTextContraller, + keyboardType: TextInputType.number, + textInputAction: TextInputAction.done, + cursorColor: Colors.black, + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Verification Code', + prefixIcon: Icon(Icons.sms), + suffixIcon: _SmsSendCell( + phone: phoneTextController, + onPress: sendVerificationCode, + ), + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: + TextStyle(color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black87), + ), + ), + ), + data: Theme.of(context).copyWith( + primaryColor: Colors.black87, + ), + ), + SizedBox(height: Adapt.px(40)) + ]), + ); + } +} + +class _SubmitButton extends StatelessWidget { + final AnimationController controller; + final Function onSubimt; + const _SubmitButton({this.controller, this.onSubimt}); + @override + Widget build(BuildContext context) { + final submitWidth = CurvedAnimation( + parent: controller, + curve: Interval( + 0.0, + 0.5, + curve: Curves.ease, + ), + ); + final loadCurved = CurvedAnimation( + parent: controller, + curve: Interval( + 0.5, + 1.0, + curve: Curves.ease, + ), + ); + return AnimatedBuilder( + animation: controller, + builder: (ctx, w) { + double buttonWidth = Adapt.screenW() * 0.8; + return Container( + margin: EdgeInsets.only(top: Adapt.px(60)), + height: Adapt.px(100), + child: Stack( + children: [ + Container( + height: Adapt.px(100), + width: Tween(begin: buttonWidth, end: Adapt.px(100)) + .animate(submitWidth) + .value, + child: FlatButton( + color: Colors.black87, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(50))), + child: Text('Sign In', + style: TextStyle( + color: Colors.white, + fontSize: Tween(begin: Adapt.px(35), end: 0.0) + .animate(submitWidth) + .value)), + onPressed: onSubimt, + ), + ), + ScaleTransition( + scale: Tween(begin: 0.0, end: 1.0).animate(loadCurved), + child: Container( + width: Adapt.px(100), + height: Adapt.px(100), + padding: EdgeInsets.all(Adapt.px(20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(50))), + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.white), + ), + ), + ) + ], + ), + ); + }, + ); + } +} + +class _LoginBody extends StatelessWidget { + final Dispatch dispatch; + final AnimationController animationController; + final AnimationController submitAnimationController; + final TextEditingController phoneTextController; + final TextEditingController codeTextContraller; + final TextEditingController accountTextController; + final TextEditingController passWordTextController; + final FocusNode accountFocusNode; + final FocusNode pwdFocusNode; + final List countryCodes; + final String countryCode; + final bool emailLogin; + const _LoginBody( + {this.accountFocusNode, + this.accountTextController, + this.animationController, + this.codeTextContraller, + this.dispatch, + this.emailLogin, + this.passWordTextController, + this.phoneTextController, + this.pwdFocusNode, + this.submitAnimationController, + this.countryCode, + this.countryCodes}); + @override + Widget build(BuildContext context) { + final cardCurve = CurvedAnimation( + parent: animationController, + curve: Interval( + 0, + 0.4, + curve: Curves.ease, + ), + ); + final submitCurve = CurvedAnimation( + parent: animationController, + curve: Interval( + 0.5, + 0.7, + curve: Curves.ease, + ), + ); + + return Center( + child: SlideTransition( + position: + Tween(begin: Offset(0, 1), end: Offset.zero).animate(cardCurve), + child: Card( + elevation: 10, + child: Container( + height: Adapt.screenH() / 2, + width: Adapt.screenW() * 0.9, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + /*IndexedStack( + index: state.emailLogin ? 0 : 1, + children: [ + _buildEmailEntry(), + _buildPhoneNumberEntry(), + ], + ),*/ + AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: emailLogin + ? _EmailEntry( + onSubmit: (s) => + dispatch(LoginPageActionCreator.onLoginClicked()), + controller: animationController, + accountFocusNode: accountFocusNode, + pwdFocusNode: pwdFocusNode, + accountTextController: accountTextController, + passWordTextController: passWordTextController, + ) + : _PhoneNumberEntry( + phoneTextController: phoneTextController, + codeTextContraller: codeTextContraller, + countryCode: countryCode, + countryCodes: countryCodes, + sendVerificationCode: () => dispatch( + LoginPageActionCreator.sendVerificationCode()), + countryCodeTap: (str) => dispatch( + LoginPageActionCreator.countryCodeChange(str)), + ), + ), + SlideTransition( + position: Tween(begin: Offset(0, 1), end: Offset.zero) + .animate(submitCurve), + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(submitCurve), + child: _SubmitButton( + controller: submitAnimationController, + onSubimt: () => + dispatch(LoginPageActionCreator.onLoginClicked()), + ), + )), + Container( + padding: EdgeInsets.fromLTRB( + Adapt.px(50), Adapt.px(20), Adapt.px(50), Adapt.px(20)), + alignment: Alignment.centerRight, + child: FadeTransition( + opacity: + Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: animationController, + curve: Interval( + 0.7, + 1.0, + curve: Curves.ease, + ), + )), + child: GestureDetector( + onTap: () => + dispatch(LoginPageActionCreator.onSignUp()), + child: Text( + 'Sign up for an account', + style: TextStyle(color: Colors.grey), + ), + ), + )), + Container( + alignment: Alignment.bottomRight, + height: Adapt.px(120), + child: FadeTransition( + opacity: + Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: animationController, + curve: Interval( + 0.7, + 1.0, + curve: Curves.ease, + ), + )), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () => dispatch( + LoginPageActionCreator.switchLoginMode()), + child: Image.asset( + emailLogin + ? 'images/phone_sms.png' + : 'images/email_login.png', + width: Adapt.px(50), + ), + ), + SizedBox(width: Adapt.px(20)), + InkWell( + onTap: () => + dispatch(LoginPageActionCreator.onGoogleSignIn()), + child: Image.asset( + 'images/google.png', + width: Adapt.px(50), + ), + ), + SizedBox(width: Adapt.px(20)), + Icon( + FontAwesomeIcons.facebook, + color: Colors.blue[700], + size: Adapt.px(45), + ), + SizedBox(width: Adapt.px(50)), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class _SmsSendCell extends StatefulWidget { + final Function onPress; + final TextEditingController phone; + const _SmsSendCell({this.phone, this.onPress}); + @override + _SmsSendCellState createState() => _SmsSendCellState(); +} + +class _SmsSendCellState extends State<_SmsSendCell> { + bool _isWaiting = false; + int _counter = 0; + Timer _timer; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return _isWaiting + ? Container( + width: Adapt.px(90), + alignment: Alignment.center, + margin: EdgeInsets.symmetric(vertical: Adapt.px(15)), + padding: EdgeInsets.all(Adapt.px(10)), + decoration: BoxDecoration( + border: Border.all(color: _theme.iconTheme.color), + borderRadius: BorderRadius.circular(Adapt.px(10))), + child: Text('$_counter s'), + ) + : InkWell( + onTap: () { + if (widget.phone.text.length > 8) { + widget.onPress(); + _isWaiting = true; + _counter = 60; + setState(() {}); + _timer = Timer.periodic(Duration(seconds: 1), (timer) { + if (_counter > 1) + setState(() { + _counter--; + }); + else { + _isWaiting = false; + setState(() {}); + timer.cancel(); + } + }); + } else + Toast.show('Invalid phone number', context, + gravity: Toast.CENTER); + }, + child: Icon(Icons.send)); + } +} + +class _CountryCodeDialog extends StatefulWidget { + final List countries; + final Function(String) onCellTap; + const _CountryCodeDialog({@required this.countries, this.onCellTap}); + @override + _CountryCodeDialogState createState() => _CountryCodeDialogState(); +} + +class _CountryCodeDialogState extends State<_CountryCodeDialog> { + final _width = Adapt.screenW() - Adapt.px(80); + List _countries; + TextEditingController _controller; + @override + void initState() { + _countries = widget.countries; + _controller = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(30))), + contentPadding: EdgeInsets.zero, + title: Theme( + child: TextField( + controller: _controller, + cursorColor: Colors.black, + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Search', + prefixIcon: Icon(Icons.search), + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle(color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black87), + ), + ), + onChanged: (str) { + _countries = widget.countries + .where((e) => e.name.toUpperCase().contains(str.toUpperCase())) + .toList(); + setState(() {}); + }, + ), + data: Theme.of(context).copyWith( + primaryColor: Colors.black87, + ), + ), + children: [ + Container( + height: Adapt.screenH() / 2, + width: _width, + child: ListView.separated( + padding: EdgeInsets.all(Adapt.px(40)), + separatorBuilder: (_, __) => Divider( + height: 25, + ), + itemCount: _countries.length, + itemBuilder: (_, index) { + final d = _countries[index]; + return _CountryCell( + data: d, + onTap: widget.onCellTap, + ); + }, + ), + ) + ], + ); + } +} + +class _CountryCell extends StatelessWidget { + final CountryPhoneCode data; + final Function(String) onTap; + _CountryCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _width = Adapt.screenW() - Adapt.px(80); + final _textStyle = TextStyle(fontSize: Adapt.px(28)); + return InkWell( + key: ValueKey(data.name), + onTap: () { + onTap(data.dialCode); + Navigator.of(context).pop(); + }, + child: Container( + child: Row( + children: [ + Text(data.flag, style: _textStyle), + SizedBox(width: Adapt.px(20)), + Container( + constraints: BoxConstraints(maxWidth: _width - Adapt.px(340)), + child: Text(data.name, style: _textStyle), + ), + Text(' (${data.dialCode})', style: _textStyle), + ], + ), + ), + ); + } +} diff --git a/lib/views/main_page/action.dart b/lib/views/main_page/action.dart new file mode 100644 index 00000000..121bfbcd --- /dev/null +++ b/lib/views/main_page/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MainPageAction { action, tabchanged } + +class MainPageActionCreator { + static Action onAction() { + return const Action(MainPageAction.action); + } + + static Action onTabChanged(int index) { + return Action(MainPageAction.tabchanged, payload: index); + } +} diff --git a/lib/views/main_page/effect.dart b/lib/views/main_page/effect.dart new file mode 100644 index 00000000..aa4b0559 --- /dev/null +++ b/lib/views/main_page/effect.dart @@ -0,0 +1,169 @@ +import 'dart:io'; +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action, Page; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/actions/downloader_callback.dart'; +import 'package:movie/actions/api/github_api.dart'; +import 'package:movie/actions/local_notification.dart'; +import 'package:movie/actions/version_comparison.dart'; +import 'package:movie/models/notification_model.dart'; +import 'package:movie/views/tvshow_detail_page/page.dart'; +import 'package:movie/widgets/update_info_dialog.dart'; +import 'package:movie/views/detail_page/page.dart'; +import 'package:package_info/package_info.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MainPageAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +ReceivePort _port = ReceivePort(); +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + final _preferences = await SharedPreferences.getInstance(); + + final _localNotification = LocalNotification.instance; + + await _localNotification.init(); + + _localNotification.didReceiveLocalNotification = (id, title, body, payload) => + _didReceiveLocalNotification(id, title, body, payload, ctx); + + FirebaseMessaging().configure(onMessage: (message) async { + NotificationList _list; + if (_preferences.containsKey('notifications')) { + final String _notifications = _preferences.getString('notifications'); + _list = NotificationList(_notifications); + } + if (_list == null) _list = NotificationList.fromParams(notifications: []); + final _notificationMessage = NotificationModel.fromMap(message); + _list.notifications.add(_notificationMessage); + _preferences.setString('notifications', _list.toString()); + _localNotification.sendNotification(_notificationMessage.notification.title, + _notificationMessage.notification?.body ?? '', + id: int.parse(_notificationMessage.id), + payload: _notificationMessage.type); + print(_list.toString()); + }, onResume: (message) async { + _push(message, ctx); + }, onLaunch: (message) async { + _push(message, ctx); + }); + + if (Platform.isAndroid) _bindBackgroundIsolate(); + + FlutterDownloader.registerCallback(DownloaderCallBack.callback); + + await _checkAppUpdate(ctx); +} + +void _onDispose(Action action, Context ctx) { + if (Platform.isAndroid) _unbindBackgroundIsolate(); +} + +Future _push(Map message, Context ctx) async { + if (message != null) { + final _notificationMessage = NotificationModel.fromMap(message); + var data = { + 'id': int.parse(_notificationMessage.id.toString()), + 'bgpic': _notificationMessage.posterPic, + 'name': _notificationMessage.name, + 'posterpic': _notificationMessage.posterPic + }; + Page page = _notificationMessage.type == 'movie' + ? MovieDetailPage() + : TvShowDetailPage(); + await Navigator.of(ctx.state.scaffoldKey.currentContext) + .push(PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: page.buildPage(data), + ); + })); + } +} + +Future _checkAppUpdate(Context ctx) async { + if (!Platform.isAndroid) return; + + final _preferences = await SharedPreferences.getInstance(); + String _ignoreVersion = _preferences.getString('IgnoreVersion') ?? ''; + + final _packageInfo = await PackageInfo.fromPlatform(); + final _github = GithubApi.instance; + final _result = await _github.checkUpdate(); + if (_result.success) { + if (_ignoreVersion == _result.result.tagName) return; + final _shouldUpdate = VersionComparison() + .compare(_packageInfo.version, _result.result.tagName); + final _apk = _result.result.assets.singleWhere( + (e) => e.contentType == 'application/vnd.android.package-archive'); + if (_apk != null && _shouldUpdate) { + await showDialog( + context: ctx.context, + builder: (context) { + return UpdateInfoDialog( + version: _result.result.tagName, + describe: _result.result.body, + packageSize: (_apk.size / 1048576), + downloadUrl: _apk.browserDownloadUrl, + ); + }); + } + } +} + +void _bindBackgroundIsolate() { + bool isSuccess = IsolateNameServer.registerPortWithName( + _port.sendPort, 'downloader_send_port'); + if (!isSuccess) { + _unbindBackgroundIsolate(); + _bindBackgroundIsolate(); + return; + } + _port.listen((dynamic data) async { + String id = data[0]; + DownloadTaskStatus status = data[1]; + if (status == DownloadTaskStatus.complete) { + List _tasks = await FlutterDownloader.loadTasks(); + final _file = _tasks.singleWhere((e) => e.taskId == id, orElse: null); + if (_file.filename.split('.').last == 'apk') + await FlutterDownloader.open(taskId: id); + } + print('UI Isolate Callback: $data'); + }); +} + +void _unbindBackgroundIsolate() { + IsolateNameServer.removePortNameMapping('downloader_send_port'); +} + +Future _didReceiveLocalNotification(int id, String title, String body, + String payload, Context ctx) async { + Page page = payload == 'movie' ? MovieDetailPage() : TvShowDetailPage(); + var data = { + payload == 'movie' ? 'id' : 'tvid': id, + payload == 'movie' ? 'title' : 'name': title, + }; + await Navigator.of(ctx.state.scaffoldKey.currentContext).push( + PageRouteBuilder( + pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: page.buildPage(data), + ); + }, + ), + ); +} diff --git a/lib/views/main_page/page.dart b/lib/views/main_page/page.dart new file mode 100644 index 00000000..bda7705c --- /dev/null +++ b/lib/views/main_page/page.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MainPage extends Page> { + MainPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + shouldUpdate: (oldState, newState) { + return oldState.locale != newState.locale || + oldState.selectedIndex != newState.selectedIndex; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/main_page/reducer.dart b/lib/views/main_page/reducer.dart new file mode 100644 index 00000000..3bc62e32 --- /dev/null +++ b/lib/views/main_page/reducer.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MainPageAction.action: _onAction, + MainPageAction.tabchanged:_onTabChanged + }, + ); +} + +MainPageState _onAction(MainPageState state, Action action) { + final MainPageState newState = state.clone(); + return newState; +} +MainPageState _onTabChanged(MainPageState state, Action action) { + final int newindex=action.payload??0; + final MainPageState newState = state.clone(); + newState.selectedIndex=newindex; + return newState; +} diff --git a/lib/views/main_page/state.dart b/lib/views/main_page/state.dart new file mode 100644 index 00000000..5e686a14 --- /dev/null +++ b/lib/views/main_page/state.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; + +class MainPageState implements GlobalBaseState, Cloneable { + int selectedIndex = 0; + List pages; + GlobalKey scaffoldKey = GlobalKey(); + @override + MainPageState clone() { + return MainPageState() + ..pages = pages + ..selectedIndex = selectedIndex + ..scaffoldKey = scaffoldKey + ..locale = locale; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +MainPageState initState(Map args) { + return MainPageState()..pages = args['pages']; +} diff --git a/lib/views/main_page/view.dart b/lib/views/main_page/view.dart new file mode 100644 index 00000000..ce95bd55 --- /dev/null +++ b/lib/views/main_page/view.dart @@ -0,0 +1,90 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/keepalive_widget.dart'; +import 'package:movie/generated/i18n.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + MainPageState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + Adapt.initContext(context); + final pageController = PageController(); + final _lightTheme = ThemeData.light().copyWith( + backgroundColor: Colors.white, + tabBarTheme: TabBarTheme( + labelColor: Color(0XFF505050), + unselectedLabelColor: Colors.grey)); + final _darkTheme = ThemeData.dark().copyWith( + backgroundColor: Color(0xFF303030), + tabBarTheme: TabBarTheme( + labelColor: Colors.white, unselectedLabelColor: Colors.grey)); + final MediaQueryData _mediaQuery = MediaQuery.of(context); + final ThemeData _theme = + _mediaQuery.platformBrightness == Brightness.light + ? _lightTheme + : _darkTheme; + Widget _buildPage(Widget page) { + return KeepAliveWidget(page); + } + + return Scaffold( + key: state.scaffoldKey, + body: PageView( + physics: NeverScrollableScrollPhysics(), + children: state.pages.map(_buildPage).toList(), + controller: pageController, + onPageChanged: (int i) => + dispatch(MainPageActionCreator.onTabChanged(i)), + ), + bottomNavigationBar: BottomNavigationBar( + backgroundColor: _theme.backgroundColor, + items: [ + BottomNavigationBarItem( + icon: Icon( + state.selectedIndex == 0 ? Icons.home : Icons.home_outlined, + size: Adapt.px(44)), + label: I18n.of(context).home, + ), + BottomNavigationBarItem( + icon: Icon( + state.selectedIndex == 1 + ? Icons.movie_creation + : Icons.movie_creation_outlined, + size: Adapt.px(44)), + label: I18n.of(context).discover, + ), + BottomNavigationBarItem( + icon: Icon( + state.selectedIndex == 2 + ? Icons.calendar_today + : Icons.calendar_today_outlined, + size: Adapt.px(44)), + label: I18n.of(context).coming, + ), + BottomNavigationBarItem( + icon: Icon( + state.selectedIndex == 3 + ? Icons.account_circle + : Icons.account_circle_outlined, + size: Adapt.px(44), + ), + label: I18n.of(context).account, + ), + ], + currentIndex: state.selectedIndex, + selectedItemColor: _theme.tabBarTheme.labelColor, + unselectedItemColor: _theme.tabBarTheme.unselectedLabelColor, + onTap: (int index) { + pageController.jumpToPage(index); + }, + type: BottomNavigationBarType.fixed, + ), + ); + }, + ); +} diff --git a/lib/views/moremedia_page/action.dart b/lib/views/moremedia_page/action.dart new file mode 100644 index 00000000..533e12ee --- /dev/null +++ b/lib/views/moremedia_page/action.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +enum MoreMediaPageAction { action, loadMore, cellTapped } + +class MoreMediaPageActionCreator { + static Action onAction() { + return const Action(MoreMediaPageAction.action); + } + + static Action loadMore(VideoListModel list) { + return Action(MoreMediaPageAction.loadMore, payload: list); + } + + static Action cellTapped( + int id, String title, String bgpic, String posterpic) { + return Action(MoreMediaPageAction.cellTapped, + payload: [id, title, bgpic, posterpic]); + } +} diff --git a/lib/views/moremedia_page/effect.dart b/lib/views/moremedia_page/effect.dart new file mode 100644 index 00000000..8950376a --- /dev/null +++ b/lib/views/moremedia_page/effect.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/response_model.dart'; +import 'package:movie/models/video_list.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MoreMediaPageAction.action: _onAction, + MoreMediaPageAction.cellTapped: _cellTapped, + Lifecycle.initState: _onInit, + Lifecycle.build: _onBuild, + Lifecycle.dispose: _onDispose + }); +} + +void _onInit(Action action, Context ctx) { + ctx.state.scrollController = ScrollController() + ..addListener(() { + bool isBottom = ctx.state.scrollController.position.pixels == + ctx.state.scrollController.position.maxScrollExtent; + if (isBottom) { + _loadMore(action, ctx); + } + }); + final Object tickerProvider = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: tickerProvider, + duration: + Duration(milliseconds: 300 * ctx.state.videoList.results.length)); +} + +void _onBuild(Action action, Context ctx) { + Future.delayed(const Duration(milliseconds: 200), + () => ctx.state.animationController.forward()); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.stop(canceled: false); + ctx.state.animationController.dispose(); + ctx.state.scrollController.dispose(); +} + +void _onAction(Action action, Context ctx) {} + +Future _loadMore(Action action, Context ctx) async { + ResponseModel model; + final _tmdb = TMDBApi.instance; + int page = ctx.state.videoList.page + 1; + if (page <= ctx.state.videoList.totalPages) { + if (ctx.state.mediaType == MediaType.movie) + model = await _tmdb.getNowPlayingMovie(page: page); + else + model = await _tmdb.getTVOnTheAir(page: page); + } + if (model.success) + ctx.dispatch(MoreMediaPageActionCreator.loadMore(model.result)); +} + +Future _cellTapped(Action action, Context ctx) async { + if (ctx.state.mediaType == MediaType.movie) + await Navigator.of(ctx.context).pushNamed('moviedetailpage', arguments: { + 'movieid': action.payload[0], + 'bgpic': action.payload[2], + 'title': action.payload[1], + 'posterpic': action.payload[3] + }); + else + await Navigator.of(ctx.context).pushNamed('tvdetailpage', arguments: { + 'tvid': action.payload[0], + 'bgpic': action.payload[2], + 'name': action.payload[1], + 'posterpic': action.payload[3] + }); +} diff --git a/lib/views/moremedia_page/page.dart b/lib/views/moremedia_page/page.dart new file mode 100644 index 00000000..501874c1 --- /dev/null +++ b/lib/views/moremedia_page/page.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MoreMediaPage extends Page> + with TickerProviderMixin { + MoreMediaPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/moremedia_page/reducer.dart b/lib/views/moremedia_page/reducer.dart new file mode 100644 index 00000000..8407b3ea --- /dev/null +++ b/lib/views/moremedia_page/reducer.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MoreMediaPageAction.action: _onAction, + MoreMediaPageAction.loadMore: _loadMore + }, + ); +} + +MoreMediaPageState _onAction(MoreMediaPageState state, Action action) { + final MoreMediaPageState newState = state.clone(); + return newState; +} + +MoreMediaPageState _loadMore(MoreMediaPageState state, Action action) { + final VideoListModel model = + action.payload ?? VideoListModel.fromParams(results: []); + final MoreMediaPageState newState = state.clone(); + newState.videoList.results.addAll(model.results); + newState.videoList.page = model.page; + return newState; +} diff --git a/lib/views/moremedia_page/state.dart b/lib/views/moremedia_page/state.dart new file mode 100644 index 00000000..69612d12 --- /dev/null +++ b/lib/views/moremedia_page/state.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/video_list.dart'; + +class MoreMediaPageState implements Cloneable { + MediaType mediaType; + VideoListModel videoList; + ScrollController scrollController; + AnimationController animationController; + + @override + MoreMediaPageState clone() { + return MoreMediaPageState() + ..videoList = videoList + ..scrollController = scrollController + ..mediaType = mediaType + ..animationController = animationController; + } +} + +MoreMediaPageState initState(Map args) { + MoreMediaPageState state = MoreMediaPageState(); + state.videoList = args['list'] ?? VideoListModel.fromParams(results: []); + state.mediaType = args['type'] ?? MediaType.movie; + return state; +} diff --git a/lib/views/moremedia_page/view.dart b/lib/views/moremedia_page/view.dart new file mode 100644 index 00000000..7f00d16e --- /dev/null +++ b/lib/views/moremedia_page/view.dart @@ -0,0 +1,146 @@ +import 'dart:math'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/video_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + MoreMediaPageState state, Dispatch dispatch, ViewService viewService) { + Random random = Random(DateTime.now().millisecondsSinceEpoch); + + Widget _buildCell(VideoListResult d) { + int index = state.videoList.results.indexOf(d); + double w = Adapt.screenW() / 2; + double h = w * 1.5; + var curve = CurvedAnimation( + parent: state.animationController, + curve: Interval( + index * (1.0 / state.videoList.results.length), + (index + 1) * (1.0 / state.videoList.results.length), + curve: Curves.ease, + ), + ); + return SlideTransition( + position: Tween(begin: Offset(0, 1), end: Offset.zero).animate(curve), + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(curve), + child: GestureDetector( + onTap: () => dispatch(MoreMediaPageActionCreator.cellTapped( + d.id, d.title ?? d.name, d.backdropPath, d.posterPath)), + child: Container( + alignment: Alignment.bottomLeft, + width: w, + height: h, + padding: EdgeInsets.all(Adapt.px(10)), + decoration: BoxDecoration( + color: Color.fromRGBO(random.nextInt(255), random.nextInt(255), + random.nextInt(255), random.nextDouble()), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(d.posterPath == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl(d.posterPath, ImageSize.w300)))), + child: Column( + children: [ + Container( + alignment: Alignment.topRight, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.star, + color: Colors.white, + size: Adapt.px(30), + ), + SizedBox( + width: Adapt.px(5), + ), + Text( + d.voteAverage.toStringAsFixed(1), + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30), + shadows: [ + Shadow( + blurRadius: 2, + //offset: Offset(Adapt.px(1),Adapt.px(1)), + color: Colors.black87) + ]), + ) + ], + ), + ), + Expanded( + child: SizedBox(), + ), + Row( + children: [ + Container( + width: w - Adapt.px(10) * 2, + child: Text(d.title ?? d.name, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold, + shadows: [ + Shadow( + blurRadius: 3, + //offset: Offset(Adapt.px(1),Adapt.px(1)), + color: Colors.black87) + ])), + ) + ], + ) + ], + ), + ), + ), + ), + ); + } + + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.white, + brightness: Brightness.light, + iconTheme: IconThemeData(color: Colors.black), + title: Text( + state.mediaType == MediaType.movie + ? I18n.of(viewService.context).inTheaters + : I18n.of(viewService.context).onTV, + style: TextStyle(color: Colors.black), + ), + ), + body: CustomScrollView( + controller: state.scrollController, + slivers: [ + SliverGrid.extent( + childAspectRatio: 2 / 3, + maxCrossAxisExtent: Adapt.screenW() / 2, + children: state.videoList.results.map(_buildCell).toList()), + SliverToBoxAdapter( + child: Offstage( + offstage: state.videoList.results.length == + state.videoList.totalResults, + child: Container( + height: Adapt.px(120), + alignment: Alignment.center, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.black), + ), + ), + ), + ) + ], + )); +} diff --git a/lib/views/moviedetail_page/action.dart b/lib/views/moviedetail_page/action.dart new file mode 100644 index 00000000..1431e890 --- /dev/null +++ b/lib/views/moviedetail_page/action.dart @@ -0,0 +1,70 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/media_account_state_model.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:palette_generator/palette_generator.dart'; + +enum MovieDetailPageAction { + action, + init, + setbgcolor, + setVideos, + setImages, + setReviews, + setAccountState, + recommendationTapped, + castCellTapped, + openMenu, + showSnackBar +} + +class MovieDetailPageActionCreator { + static Action onAction() { + return const Action(MovieDetailPageAction.action); + } + + static Action onInit(MovieDetailModel model) { + return Action(MovieDetailPageAction.init, payload: model); + } + + static Action onsetColor(PaletteGenerator c) { + return Action(MovieDetailPageAction.setbgcolor, payload: c); + } + + static Action onSetImages(ImageModel c) { + return Action(MovieDetailPageAction.setImages, payload: c); + } + + static Action onSetReviews(ReviewModel c) { + return Action(MovieDetailPageAction.setReviews, payload: c); + } + + static Action onSetVideos(VideoModel c) { + return Action(MovieDetailPageAction.setVideos, payload: c); + } + + static Action onRecommendationTapped(int movieid, String backpic) { + return Action(MovieDetailPageAction.recommendationTapped, + payload: [movieid, backpic]); + } + + static Action onCastCellTapped( + int peopleid, String profilePath, String profileName) { + return Action(MovieDetailPageAction.castCellTapped, + payload: [peopleid, profilePath, profileName]); + } + + static Action onSetAccountState(MediaAccountStateModel model) { + return Action(MovieDetailPageAction.setAccountState, payload: model); + } + + static Action openMenu() { + return Action(MovieDetailPageAction.openMenu); + } + + static Action showSnackBar(String message) { + return Action(MovieDetailPageAction.showSnackBar, payload: message); + } +} diff --git a/lib/views/moviedetail_page/components/info_component/action.dart b/lib/views/moviedetail_page/components/info_component/action.dart new file mode 100644 index 00000000..b5559b7d --- /dev/null +++ b/lib/views/moviedetail_page/components/info_component/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum InfoAction { action, externalTapped } + +class InfoActionCreator { + static Action onAction() { + return const Action(InfoAction.action); + } + + static Action onExternalTapped(String url) { + return Action(InfoAction.externalTapped, payload: url); + } +} diff --git a/lib/views/moviedetail_page/components/info_component/component.dart b/lib/views/moviedetail_page/components/info_component/component.dart new file mode 100644 index 00000000..7fd48200 --- /dev/null +++ b/lib/views/moviedetail_page/components/info_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class InfoComponent extends Component { + InfoComponent() + : super( + view: buildView, + effect: buildEffect(), + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/moviedetail_page/components/info_component/effect.dart b/lib/views/moviedetail_page/components/info_component/effect.dart new file mode 100644 index 00000000..f95a40ae --- /dev/null +++ b/lib/views/moviedetail_page/components/info_component/effect.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + InfoAction.action: _onAction, + InfoAction.externalTapped: _onExternalTapped + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onExternalTapped(Action action, Context ctx) async { + var url = action.payload; + if (await canLaunch(url)) { + await launch(url); + } +} diff --git a/lib/views/moviedetail_page/components/info_component/state.dart b/lib/views/moviedetail_page/components/info_component/state.dart new file mode 100644 index 00000000..a9944553 --- /dev/null +++ b/lib/views/moviedetail_page/components/info_component/state.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/movie_detail.dart'; + +import '../../state.dart'; + +class InfoState implements Cloneable { + MovieDetailModel movieDetailModel; + + @override + InfoState clone() { + return InfoState(); + } +} + +class InfoConnector extends ConnOp { + @override + InfoState get(MovieDetailPageState state) { + InfoState substate = new InfoState(); + substate.movieDetailModel = state.movieDetailModel; + return substate; + } +} diff --git a/lib/views/moviedetail_page/components/info_component/view.dart b/lib/views/moviedetail_page/components/info_component/view.dart new file mode 100644 index 00000000..ef4a3d72 --- /dev/null +++ b/lib/views/moviedetail_page/components/info_component/view.dart @@ -0,0 +1,375 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/genre.dart'; +import 'package:movie/models/production_companie.dart'; +import 'package:movie/widgets/shimmercell.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/releasedatetype.dart'; +import 'package:movie/models/release_date_model.dart'; + +import 'dart:ui' as ui; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView(InfoState state, Dispatch dispatch, ViewService viewService) { + Widget _buildInfoCell(String title, String value) { + return Container( + width: Adapt.px(300), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold), + ), + SizedBox( + height: Adapt.px(8), + ), + value == null + ? ShimmerCell(Adapt.px(150), Adapt.px(30), 0) + : Text( + value, + style: + TextStyle(color: Colors.black87, fontSize: Adapt.px(24)), + ) + ], + ), + ); + } + + Widget _buildExternalCell(String icon, String url, String id) { + return id != null + ? InkWell( + borderRadius: BorderRadius.circular(Adapt.px(30)), + onTap: () => dispatch(InfoActionCreator.onExternalTapped(url + id)), + child: Container( + width: Adapt.px(60), + height: Adapt.px(60), + child: Image.asset( + icon, + ), + ), + ) + : Container(); + } + + Widget _buildGenderCell(Genre g) { + return Chip( + elevation: 3.0, + backgroundColor: Colors.white, + label: Text(g.name), + ); + } + + Widget _buildProductionCompanieCell(ProductionCompanie d) { + if (d.logoPath != null) + return Container( + margin: EdgeInsets.only(bottom: Adapt.px(20)), + width: Adapt.px(120), + height: Adapt.px(60), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.scaleDown, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(d.logoPath, ImageSize.w300)))), + ); + else + return Container(); + } + + Widget _buildReleaseDateCell(ReleaseDateInfo d) { + return Container( + padding: EdgeInsets.only(bottom: Adapt.px(20)), + width: Adapt.px(320), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(60), + height: Adapt.px(40), + decoration: BoxDecoration( + image: DecorationImage( + alignment: Alignment.topLeft, + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'http://www.geonames.org/flags/x/${ui.window.locale.countryCode.toLowerCase()}.gif'))), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + DateFormat.yMMMd() + .format(DateTime.tryParse(d.releaseDate ?? '1900-01-01')), + style: TextStyle(fontSize: Adapt.px(24))), + SizedBox( + height: Adapt.px(5), + ), + Row( + children: [ + d.certification != '' + ? Container( + margin: EdgeInsets.only(right: Adapt.px(10)), + padding: EdgeInsets.all(Adapt.px(8)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(10)), + color: Colors.black87), + child: Text(d.certification, + style: TextStyle( + fontSize: Adapt.px(20), color: Colors.white)), + ) + : Container(), + Container( + width: Adapt.px(150), + child: Text( + ReleaseDateType.releaseDateType[d.type], + style: TextStyle(fontSize: Adapt.px(24)), + ), + ), + ], + ), + ], + ) + ], + ), + ); + } + + Widget _getReleaseDate() { + if (state.movieDetailModel?.releaseDates != null) { + var q = state?.movieDetailModel?.releaseDates?.results + ?.where((d) => d.iso31661 == ui.window.locale.countryCode) + ?.toList(); + ReleaseDateResult data; + if (q != null && q.length > 0) { + data = q.first; + return Wrap( + spacing: Adapt.px(20), + children: data.releaseDates.map(_buildReleaseDateCell).toList()); + } + } + return Wrap( + spacing: Adapt.px(40), + children: [ + ShimmerCell(Adapt.px(120), Adapt.px(60), 0), + ShimmerCell(Adapt.px(120), Adapt.px(60), 0) + ], + ); + } + + Widget _getExternal() { + var d = state.movieDetailModel.externalIds; + if (d != null) + return Row( + children: [ + _buildExternalCell('images/facebook_circle.png', + 'https://www.facebook.com/', d.facebookId), + SizedBox( + width: Adapt.px(10), + ), + _buildExternalCell( + 'images/twitter_circle.png', 'https://twitter.com/', d.twitterId), + SizedBox( + width: Adapt.px(10), + ), + _buildExternalCell('images/instagram_circle.png', + 'https://www.instagram.com/', d.instagramId), + SizedBox( + width: Adapt.px(20), + ), + (d.facebookId == null && + d.twitterId == null && + d.instagramId == null) || + state.movieDetailModel.homepage == null + ? Container() + : Container( + width: Adapt.px(2), + height: Adapt.px(50), + color: Colors.grey, + ), + SizedBox( + width: Adapt.px(20), + ), + state.movieDetailModel.homepage != null + ? InkWell( + borderRadius: BorderRadius.circular(Adapt.px(30)), + onTap: () => dispatch(InfoActionCreator.onExternalTapped( + state.movieDetailModel.homepage)), + child: Container( + width: Adapt.px(40), + height: Adapt.px(40), + child: Image.asset( + 'images/link_bold.png', + ), + )) + : SizedBox(), + ], + ); + else + return Row( + children: [ + ShimmerCell(Adapt.px(60), Adapt.px(60), Adapt.px(30)), + SizedBox( + width: Adapt.px(20), + ), + ShimmerCell(Adapt.px(60), Adapt.px(60), Adapt.px(30)), + SizedBox( + width: Adapt.px(20), + ), + ShimmerCell(Adapt.px(60), Adapt.px(60), Adapt.px(30)) + ], + ); + } + + Widget _getFacts() { + final moneyformat = new NumberFormat("###,###"); + return Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: Adapt.px(30), + ), + Text( + I18n.of(viewService.context).facts, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(40), + fontWeight: FontWeight.bold), + ), + SizedBox( + height: Adapt.px(10), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(viewService.context).company, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold), + ), + SizedBox(height: Adapt.px(10)), + Wrap( + spacing: Adapt.px(40), + children: state.movieDetailModel?.productionCompanies != null + ? state.movieDetailModel.productionCompanies + .map(_buildProductionCompanieCell) + .toList() + : [ + ShimmerCell(Adapt.px(120), Adapt.px(60), 0), + ShimmerCell(Adapt.px(120), Adapt.px(60), 0) + ], + ) + ], + ), + SizedBox( + height: Adapt.px(10), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(viewService.context).releaseInformation, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold), + ), + SizedBox(height: Adapt.px(10)), + _getReleaseDate() + ], + ), + Row( + children: [ + _buildInfoCell(I18n.of(viewService.context).status, + state.movieDetailModel?.status), + ], + ), + SizedBox( + height: Adapt.px(10), + ), + Row( + children: [ + _buildInfoCell(I18n.of(viewService.context).originalLanguage, + state.movieDetailModel?.originalLanguage), + _buildInfoCell( + I18n.of(viewService.context).runtime, + state.movieDetailModel.runtime == null + ? 'none' + : state.movieDetailModel.runtime.toString() + 'M'), + ], + ), + SizedBox( + height: Adapt.px(10), + ), + Row( + children: [ + _buildInfoCell( + I18n.of(viewService.context).budget, + '\$' + + moneyformat.format(state.movieDetailModel?.budget ?? 0)), + _buildInfoCell( + I18n.of(viewService.context).revenue, + "\$" + + moneyformat.format(state.movieDetailModel?.revenue ?? 0)), + ], + ), + SizedBox( + height: Adapt.px(10), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(viewService.context).genders, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold), + ), + Wrap( + spacing: Adapt.px(20), + children: state.movieDetailModel?.genres != null + ? state.movieDetailModel.genres + .map(_buildGenderCell) + .toList() + : [ + ShimmerCell(Adapt.px(100), Adapt.px(50), Adapt.px(25)), + ShimmerCell(Adapt.px(120), Adapt.px(50), Adapt.px(25)), + ShimmerCell(Adapt.px(80), Adapt.px(50), Adapt.px(25)), + ], + ) + ], + ), + ], + ), + ); + } + + return Container( + padding: EdgeInsets.only( + left: Adapt.px(30), right: Adapt.px(30), bottom: Adapt.px(70)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _getExternal(), + _getFacts(), + ], + ), + ); +} diff --git a/lib/views/moviedetail_page/components/keywords_component/action.dart b/lib/views/moviedetail_page/components/keywords_component/action.dart new file mode 100644 index 00000000..2b295525 --- /dev/null +++ b/lib/views/moviedetail_page/components/keywords_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum KeyWordsAction { action } + +class KeyWordsActionCreator { + static Action onAction() { + return const Action(KeyWordsAction.action); + } +} diff --git a/lib/views/moviedetail_page/components/keywords_component/component.dart b/lib/views/moviedetail_page/components/keywords_component/component.dart new file mode 100644 index 00000000..70d91458 --- /dev/null +++ b/lib/views/moviedetail_page/components/keywords_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class KeyWordsComponent extends Component { + KeyWordsComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/moviedetail_page/components/keywords_component/effect.dart b/lib/views/moviedetail_page/components/keywords_component/effect.dart new file mode 100644 index 00000000..83721d3c --- /dev/null +++ b/lib/views/moviedetail_page/components/keywords_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + KeyWordsAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/moviedetail_page/components/keywords_component/reducer.dart b/lib/views/moviedetail_page/components/keywords_component/reducer.dart new file mode 100644 index 00000000..c105db00 --- /dev/null +++ b/lib/views/moviedetail_page/components/keywords_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + KeyWordsAction.action: _onAction, + }, + ); +} + +KeyWordsState _onAction(KeyWordsState state, Action action) { + final KeyWordsState newState = state.clone(); + return newState; +} diff --git a/lib/views/moviedetail_page/components/keywords_component/state.dart b/lib/views/moviedetail_page/components/keywords_component/state.dart new file mode 100644 index 00000000..5eac047f --- /dev/null +++ b/lib/views/moviedetail_page/components/keywords_component/state.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/keyword.dart'; + +import '../../state.dart'; + +class KeyWordsState implements Cloneable { + KeyWordModel keywords; + @override + KeyWordsState clone() { + return KeyWordsState() + ..keywords=keywords; + } +} + +KeyWordsState initKeyWordsState(Map args) { + return KeyWordsState(); +} +class KeyWordsConnector + extends ConnOp { + @override + KeyWordsState get(MovieDetailPageState state) { + KeyWordsState mstate = KeyWordsState(); + mstate.keywords = state.movieDetailModel?.keywords??KeyWordModel.fromParams(keywords: List()); + return mstate; + } +} diff --git a/lib/views/moviedetail_page/components/keywords_component/view.dart b/lib/views/moviedetail_page/components/keywords_component/view.dart new file mode 100644 index 00000000..7969e400 --- /dev/null +++ b/lib/views/moviedetail_page/components/keywords_component/view.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + KeyWordsState state, Dispatch dispatch, ViewService viewService) { + Widget _buildKeyWordChip(KeyWordData k) { + return Chip( + elevation: 3.0, + backgroundColor: Colors.white, + label: Text(k.name), + ); + } + + Widget _buildKeyWordShimmer(double w) { + return SizedBox( + child: Shimmer.fromColors( + baseColor: Colors.grey[200], + highlightColor: Colors.grey[100], + child: Container( + width: w, + height: Adapt.px(50), + margin: EdgeInsets.only(bottom: Adapt.px(20)), + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(Adapt.px(25)), + ), + ), + ), + ); + } + + List _buildKeyBody() { + if (state.keywords.keywords.length > 0) + return state.keywords.keywords.map(_buildKeyWordChip).toList(); + else + return [ + _buildKeyWordShimmer(Adapt.px(100)), + _buildKeyWordShimmer(Adapt.px(200)), + _buildKeyWordShimmer(Adapt.px(150)), + _buildKeyWordShimmer(Adapt.px(230)), + _buildKeyWordShimmer(Adapt.px(150)), + _buildKeyWordShimmer(Adapt.px(120)), + ]; + } + + Widget _getKeyWordCell() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(Adapt.px(30)), + child: Text(I18n.of(viewService.context).tags, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(40), + fontWeight: FontWeight.w800)), + ), + Container( + padding: + EdgeInsets.fromLTRB(Adapt.px(30), 0, Adapt.px(30), Adapt.px(30)), + child: Wrap( + spacing: Adapt.px(15), + direction: Axis.horizontal, + children: _buildKeyBody(), + ), + ), + ], + ); + } + + return _getKeyWordCell(); +} diff --git a/lib/views/moviedetail_page/components/menu_component/action.dart b/lib/views/moviedetail_page/components/menu_component/action.dart new file mode 100644 index 00000000..a57c9774 --- /dev/null +++ b/lib/views/moviedetail_page/components/menu_component/action.dart @@ -0,0 +1,41 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MenuAction { + action, + setRating, + updateRating, + setFavorite, + updateFavorite, + setWatchlist, + updateWatchlist +} + +class MenuActionCreator { + static Action onAction() { + return const Action(MenuAction.action); + } + + static Action setRating(double d) { + return Action(MenuAction.setRating, payload: d); + } + + static Action updateRating(double d) { + return Action(MenuAction.updateRating, payload: d); + } + + static Action setFavorite(bool isFavorite) { + return Action(MenuAction.setFavorite, payload: isFavorite); + } + + static Action updateFavorite(bool isFavorite) { + return Action(MenuAction.updateFavorite, payload: isFavorite); + } + + static Action setWatchlist(bool isAdd) { + return Action(MenuAction.setWatchlist, payload: isAdd); + } + + static Action updateWatctlist(bool isAdd) { + return Action(MenuAction.updateWatchlist, payload: isAdd); + } +} diff --git a/lib/views/moviedetail_page/components/menu_component/component.dart b/lib/views/moviedetail_page/components/menu_component/component.dart new file mode 100644 index 00000000..e00548f2 --- /dev/null +++ b/lib/views/moviedetail_page/components/menu_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MenuComponent extends Component { + MenuComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/moviedetail_page/components/menu_component/effect.dart b/lib/views/moviedetail_page/components/menu_component/effect.dart new file mode 100644 index 00000000..14ca6296 --- /dev/null +++ b/lib/views/moviedetail_page/components/menu_component/effect.dart @@ -0,0 +1,47 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/views/moviedetail_page/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MenuAction.action: _onAction, + MenuAction.setRating: _setRating, + MenuAction.setFavorite: _setFavorite, + MenuAction.setWatchlist: _setWatchlist + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _setRating(Action action, Context ctx) async { + ctx.dispatch(MenuActionCreator.updateRating(action.payload)); + final _tmdb = TMDBApi.instance; + var r = await _tmdb.rateMovie(ctx.state.id, action.payload); + if (r) + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar( + 'your rating has been saved')); +} + +Future _setFavorite(Action action, Context ctx) async { + final bool f = action.payload; + ctx.dispatch(MenuActionCreator.updateFavorite(f)); + final _tmdb = TMDBApi.instance; + var r = await _tmdb.markAsFavorite(ctx.state.id, MediaType.movie, f); + if (r) + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar( + f ? 'has been mark as favorite' : 'has been removed')); +} + +Future _setWatchlist(Action action, Context ctx) async { + final bool f = action.payload; + ctx.dispatch(MenuActionCreator.updateWatctlist(f)); + final _tmdb = TMDBApi.instance; + var r = await _tmdb.addToWatchlist(ctx.state.id, MediaType.movie, f); + if (r) + ctx.broadcast(MovieDetailPageActionCreator.showSnackBar(f + ? 'has been add to your watchlist' + : 'has been removed from your watchlist')); +} diff --git a/lib/views/moviedetail_page/components/menu_component/reducer.dart b/lib/views/moviedetail_page/components/menu_component/reducer.dart new file mode 100644 index 00000000..d974736a --- /dev/null +++ b/lib/views/moviedetail_page/components/menu_component/reducer.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/media_account_state_model.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MenuAction.action: _onAction, + MenuAction.updateRating: _updateRating, + MenuAction.updateFavorite: _updateFavorite, + MenuAction.updateWatchlist: _updateWatchlist + }, + ); +} + +MenuState _onAction(MenuState state, Action action) { + final MenuState newState = state.clone(); + return newState; +} + +MenuState _updateRating(MenuState state, Action action) { + final MenuState newState = state.clone(); + newState.accountState.rated = RatedResult.fromParams(value: action.payload); + newState.accountState.isRated = true; + return newState; +} + +MenuState _updateFavorite(MenuState state, Action action) { + final bool favorite = action.payload; + final MenuState newState = state.clone(); + newState.accountState.favorite = favorite; + return newState; +} + +MenuState _updateWatchlist(MenuState state, Action action) { + final bool isAdd = action.payload; + final MenuState newState = state.clone(); + newState.accountState.watchlist = isAdd; + return newState; +} diff --git a/lib/views/moviedetail_page/components/menu_component/state.dart b/lib/views/moviedetail_page/components/menu_component/state.dart new file mode 100644 index 00000000..40afa135 --- /dev/null +++ b/lib/views/moviedetail_page/components/menu_component/state.dart @@ -0,0 +1,43 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/media_account_state_model.dart'; + +import '../../state.dart'; + +class MenuState implements Cloneable { + int id; + String backdropPic; + String posterPic; + String name; + String overWatch; + MediaAccountStateModel accountState; + + @override + MenuState clone() { + return MenuState() + ..accountState = accountState + ..posterPic = posterPic + ..backdropPic = backdropPic + ..id = id + ..overWatch = overWatch + ..name = name; + } +} + +class MenuConnector extends ConnOp { + @override + MenuState get(MovieDetailPageState state) { + MenuState substate = new MenuState(); + substate.posterPic = state.posterPic; + substate.name = state.title; + substate.accountState = state.accountState; + substate.id = state.movieid; + substate.backdropPic = state.backdropPic; + substate.overWatch = state.movieDetailModel.overview; + return substate; + } + + @override + void set(MovieDetailPageState state, MenuState subState) { + state.accountState = subState.accountState; + } +} diff --git a/lib/views/moviedetail_page/components/menu_component/view.dart b/lib/views/moviedetail_page/components/menu_component/view.dart new file mode 100644 index 00000000..bf77395d --- /dev/null +++ b/lib/views/moviedetail_page/components/menu_component/view.dart @@ -0,0 +1,223 @@ +import 'dart:ui' as ui; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/widgets/dialogratingbar.dart'; +import 'package:movie/widgets/medialist_card.dart'; +import 'package:movie/widgets/share_card.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView(MenuState state, Dispatch dispatch, ViewService viewService) { + Widget _buildListTitel(IconData icon, String title, void onTap(), + {Color iconColor = const Color.fromRGBO(50, 50, 50, 1)}) { + TextStyle titleStyle = + TextStyle(color: Color.fromRGBO(50, 50, 50, 1), fontSize: Adapt.px(40)); + return ListTile( + leading: Icon( + icon, + color: iconColor, + ), + title: Text(title, style: titleStyle), + onTap: onTap, + ); + } + + void _addToList() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + return MediaListCardDialog( + type: MediaType.movie, + mediaId: state.id, + ); + }); + } + + void _rateIt() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + double rate = state.accountState.rated?.value ?? 0; + return DialogRatingBar( + rating: rate, + submit: (d) => dispatch(MenuActionCreator.setRating(d)), + ); + }); + } + + void _share() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + var width = (Adapt.screenW() - Adapt.px(60)).floorToDouble(); + var height = ((width - Adapt.px(40)) / 2).floorToDouble(); + return ShareCard( + backgroundImage: ImageUrl.getUrl(state.backdropPic, ImageSize.w300), + qrValue: + 'https://www.themoviedb.org/movie/${state.id}?language=${ui.window.locale.languageCode}', + headerHeight: height, + header: Column(children: [ + SizedBox( + height: Adapt.px(20), + ), + Row( + children: [ + SizedBox( + width: Adapt.px(20), + ), + Container( + width: Adapt.px(120), + height: Adapt.px(120), + decoration: BoxDecoration( + border: + Border.all(color: Colors.white, width: Adapt.px(5)), + borderRadius: BorderRadius.circular(Adapt.px(60)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(ImageUrl.getUrl( + state.posterPic, ImageSize.w300)))), + ), + SizedBox( + width: Adapt.px(20), + ), + Container( + width: width - Adapt.px(310), + child: Text(state.name, + maxLines: 2, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(40), + fontWeight: FontWeight.bold, + shadows: [ + Shadow(offset: Offset(Adapt.px(1), Adapt.px(1))) + ])), + ), + ], + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + width: width - Adapt.px(40), + height: height - Adapt.px(170), + child: Text(state.overWatch, + overflow: TextOverflow.ellipsis, + maxLines: 5, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(26), + shadows: [ + Shadow( + offset: Offset(Adapt.px(1), Adapt.px(1)), + blurRadius: 3) + ])), + ) + ]), + ); + }); + } + + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.vertical(top: Radius.circular(Adapt.px(50)))), + //padding: EdgeInsets.only(top:Adapt.px(30)), + child: ListView( + physics: ClampingScrollPhysics(), + children: [ + Container( + margin: EdgeInsets.all(Adapt.px(20)), + height: Adapt.px(100), + child: Row( + children: [ + Container( + height: Adapt.px(100), + width: Adapt.px(100), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(Adapt.px(50)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(state.posterPic, ImageSize.w300)))), + ), + SizedBox( + width: Adapt.px(30), + ), + SizedBox( + width: Adapt.screenW() - Adapt.px(170), + child: Text( + state.name, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(40), + fontWeight: FontWeight.bold), + )), + ], + ), + ), + Divider( + height: 1, + ), + _buildListTitel(Icons.format_list_bulleted, 'Add to List', _addToList), + Divider( + height: Adapt.px(10), + ), + _buildListTitel( + state.accountState.favorite + ? Icons.favorite + : Icons.favorite_border, + 'Mark as Favorite', () { + Navigator.of(viewService.context).pop(); + dispatch(MenuActionCreator.setFavorite(!state.accountState.favorite)); + }, + iconColor: state.accountState.favorite + ? Colors.pink[400] + : Color.fromRGBO(50, 50, 50, 1)), + Divider( + height: Adapt.px(10), + ), + _buildListTitel( + Icons.flag, + 'Add to your Watchlist', + () { + Navigator.of(viewService.context).pop(); + dispatch( + MenuActionCreator.setWatchlist(!state.accountState.watchlist)); + }, + iconColor: state.accountState.watchlist + ? Colors.red + : Color.fromRGBO(50, 50, 50, 1), + ), + Divider( + height: Adapt.px(10), + ), + _buildListTitel( + state.accountState.isRated == true ? Icons.star : Icons.star_border, + 'Rate It', + _rateIt, + iconColor: state.accountState.isRated == true + ? Colors.amber + : Color.fromRGBO(50, 50, 50, 1)), + Divider( + height: Adapt.px(10), + ), + _buildListTitel(Icons.share, 'Share', _share), + Divider( + height: Adapt.px(10), + ), + ], + ), + ); +} diff --git a/lib/views/moviedetail_page/effect.dart b/lib/views/moviedetail_page/effect.dart new file mode 100644 index 00000000..990230dd --- /dev/null +++ b/lib/views/moviedetail_page/effect.dart @@ -0,0 +1,82 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter/widgets.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MovieDetailPageAction.action: _onAction, + MovieDetailPageAction.recommendationTapped: _onRecommendationTapped, + MovieDetailPageAction.castCellTapped: _onCastCellTapped, + MovieDetailPageAction.openMenu: _openMenu, + MovieDetailPageAction.showSnackBar: _showSnackBar, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + try { + final Object ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 1000)); + ctx.state.scrollController = new ScrollController(); + /*var paletteGenerator = await PaletteGenerator.fromImageProvider( + CachedNetworkImageProvider(ImageUrl.getUrl(ctx.state.posterPic, ImageSize.w300))); + ctx.dispatch(MovieDetailPageActionCreator.onsetColor(paletteGenerator));*/ + final _tmdb = TMDBApi.instance; + final r = await _tmdb.getMovieDetail(ctx.state.movieid, + appendtoresponse: + 'keywords,recommendations,credits,external_ids,release_dates'); + if (r.success) { + ctx.dispatch(MovieDetailPageActionCreator.onInit(r.result)); + ctx.state.animationController.forward(); + } + final accountstate = await _tmdb.getMovieAccountState(ctx.state.movieid); + if (accountstate.success) + ctx.dispatch( + MovieDetailPageActionCreator.onSetAccountState(accountstate.result)); + final l = await _tmdb.getMovieReviews(ctx.state.movieid); + if (l.success) + ctx.dispatch(MovieDetailPageActionCreator.onSetReviews(l.result)); + final k = await _tmdb.getMovieImages(ctx.state.movieid); + if (k.success) + ctx.dispatch(MovieDetailPageActionCreator.onSetImages(k.result)); + final f = await _tmdb.getMovieVideo(ctx.state.movieid); + if (f.success) + ctx.dispatch(MovieDetailPageActionCreator.onSetVideos(f.result)); + } on Exception catch (_) {} +} + +Future _onRecommendationTapped( + Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('moviedetailpage', + arguments: {'movieid': action.payload[0], 'bgpic': action.payload[1]}); +} + +Future _onCastCellTapped( + Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('peopledetailpage', arguments: { + 'peopleid': action.payload[0], + 'profilePath': action.payload[1], + 'profileName': action.payload[2] + }); +} + +void _openMenu(Action action, Context ctx) { + showModalBottomSheet( + context: ctx.context, + backgroundColor: Colors.transparent, + builder: (context) { + return ctx.buildComponent('menu'); + }); +} + +void _showSnackBar(Action action, Context ctx) { + Scaffold.of(ctx.context).showSnackBar(SnackBar( + content: Text(action.payload ?? ''), + )); +} diff --git a/lib/views/moviedetail_page/page.dart b/lib/views/moviedetail_page/page.dart new file mode 100644 index 00000000..52b42bf4 --- /dev/null +++ b/lib/views/moviedetail_page/page.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/moviedetail_page/components/info_component/component.dart'; +import 'package:movie/views/moviedetail_page/components/keywords_component/component.dart'; +import 'package:movie/views/moviedetail_page/components/keywords_component/state.dart'; + +import 'components/info_component/state.dart'; +import 'components/menu_component/component.dart'; +import 'components/menu_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MovieDetailPage extends Page> + with TickerProviderMixin { + MovieDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'keywords': KeyWordsConnector() + KeyWordsComponent(), + 'info': InfoConnector() + InfoComponent(), + 'menu': MenuConnector() + MenuComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/moviedetail_page/reducer.dart b/lib/views/moviedetail_page/reducer.dart new file mode 100644 index 00000000..d6bcc271 --- /dev/null +++ b/lib/views/moviedetail_page/reducer.dart @@ -0,0 +1,75 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/media_account_state_model.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:palette_generator/palette_generator.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MovieDetailPageAction.action: _onAction, + MovieDetailPageAction.init: _onInit, + MovieDetailPageAction.setbgcolor: _onSetColor, + MovieDetailPageAction.setImages: _onSetImages, + MovieDetailPageAction.setReviews: _onSetReviews, + MovieDetailPageAction.setVideos: _onSetVideos, + MovieDetailPageAction.setAccountState: _onSetAccountState + }, + ); +} + +MovieDetailPageState _onAction(MovieDetailPageState state, Action action) { + final MovieDetailPageState newState = state.clone(); + return newState; +} + +MovieDetailPageState _onInit(MovieDetailPageState state, Action action) { + MovieDetailModel model = action.payload ?? new MovieDetailModel.fromParams(); + final MovieDetailPageState newState = state.clone(); + newState.movieDetailModel = model; + newState.backdropPic = model.backdropPath; + newState.posterPic = model.posterPath; + newState.title = model.title; + return newState; +} + +MovieDetailPageState _onSetColor(MovieDetailPageState state, Action action) { + PaletteGenerator c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.palette = c; + return newState; +} + +MovieDetailPageState _onSetImages(MovieDetailPageState state, Action action) { + ImageModel c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.imagesmodel = c; + return newState; +} + +MovieDetailPageState _onSetReviews(MovieDetailPageState state, Action action) { + ReviewModel c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.reviewModel = c; + return newState; +} + +MovieDetailPageState _onSetVideos(MovieDetailPageState state, Action action) { + VideoModel c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.videomodel = c; + return newState; +} + +MovieDetailPageState _onSetAccountState( + MovieDetailPageState state, Action action) { + MediaAccountStateModel c = action.payload; + final MovieDetailPageState newState = state.clone(); + newState.accountState = c; + return newState; +} diff --git a/lib/views/moviedetail_page/state.dart b/lib/views/moviedetail_page/state.dart new file mode 100644 index 00000000..9b12a72a --- /dev/null +++ b/lib/views/moviedetail_page/state.dart @@ -0,0 +1,84 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/media_account_state_model.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:palette_generator/palette_generator.dart'; + +class MovieDetailPageState + implements GlobalBaseState, Cloneable { + GlobalKey scaffoldkey; + MovieDetailModel movieDetailModel; + String backdropPic; + String title; + String posterPic; + int movieid; + Color mainColor; + Color tabTintColor; + PaletteGenerator palette; + ImageModel imagesmodel; + ReviewModel reviewModel; + VideoModel videomodel; + ScrollController scrollController; + MediaAccountStateModel accountState; + AnimationController animationController; + + @override + MovieDetailPageState clone() { + return MovieDetailPageState() + ..scaffoldkey = scaffoldkey + ..movieDetailModel = movieDetailModel + ..mainColor = mainColor + ..tabTintColor = tabTintColor + ..palette = palette + ..movieid = movieid + ..reviewModel = reviewModel + ..imagesmodel = imagesmodel + ..videomodel = videomodel + ..backdropPic = backdropPic + ..posterPic = posterPic + ..title = title + ..scrollController = scrollController + ..accountState = accountState + ..animationController = animationController; + } + + @override + Color themeColor = Colors.black; + + @override + Locale locale; + + @override + AppUser user; +} + +MovieDetailPageState initState(Map args) { + Random random = new Random(DateTime.now().millisecondsSinceEpoch); + var state = MovieDetailPageState(); + state.scaffoldkey = GlobalKey(); + state.movieid = args['movieid']; + if (args['bgpic'] != null) state.backdropPic = args['bgpic']; + if (args['posterpic'] != null) state.posterPic = args['posterpic']; + if (args['title'] != null) state.title = args['title']; + state.movieDetailModel = new MovieDetailModel.fromParams(); + state.mainColor = Color.fromRGBO( + random.nextInt(200), random.nextInt(100), random.nextInt(255), 1); + state.tabTintColor = Color.fromRGBO( + random.nextInt(200), random.nextInt(100), random.nextInt(255), 1); + state.palette = new PaletteGenerator.fromColors( + List()..add(new PaletteColor(Colors.black87, 0))); + state.imagesmodel = new ImageModel.fromParams( + posters: List(), backdrops: List()); + state.reviewModel = new ReviewModel.fromParams(results: List()); + state.videomodel = new VideoModel.fromParams(results: List()); + state.accountState = + new MediaAccountStateModel.fromParams(favorite: false, watchlist: false); + return state; +} diff --git a/lib/views/moviedetail_page/view.dart b/lib/views/moviedetail_page/view.dart new file mode 100644 index 00000000..b7a45707 --- /dev/null +++ b/lib/views/moviedetail_page/view.dart @@ -0,0 +1,897 @@ +import 'dart:collection'; +import 'dart:math'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/actions/videourl.dart'; +import 'package:movie/actions/votecolorhelper.dart'; +import 'package:movie/widgets/videoplayeritem.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:parallax_image/parallax_image.dart'; +import 'package:shimmer/shimmer.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:video_player/video_player.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + MovieDetailPageState state, Dispatch dispatch, ViewService viewService) { + Random random = new Random(DateTime.now().millisecondsSinceEpoch); + var s = state.movieDetailModel; + //var dominantColor = state.palette?.dominantColor?.color ?? Colors.black38; + var dominantColor = state.mainColor; + double evote = 0.0; + + Widget _buildCreditsCell(CastData p) { + return GestureDetector( + onTap: () => dispatch(MovieDetailPageActionCreator.onCastCellTapped( + p.id, p.profilePath, p.name)), + child: Container( + margin: EdgeInsets.only(left: Adapt.px(20)), + width: Adapt.px(240), + height: Adapt.px(400), + child: Card( + shape: + RoundedRectangleBorder(side: BorderSide(color: Colors.grey[100])), + elevation: 1.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Hero( + tag: 'people' + p.id.toString(), + child: Container( + width: Adapt.px(240), + height: Adapt.px(260), + decoration: BoxDecoration( + color: Colors.grey[200], + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + p.profilePath == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl( + p.profilePath, ImageSize.w300)))), + ), + ), + Padding( + padding: EdgeInsets.only( + top: Adapt.px(20), left: Adapt.px(20), right: Adapt.px(20)), + child: Hero( + tag: 'Actor' + p.id.toString(), + child: Material( + child: Text( + p.name, + maxLines: 2, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + fontWeight: FontWeight.w600), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only( + left: Adapt.px(20), + right: Adapt.px(20), + bottom: Adapt.px(20)), + child: Text( + p.character, + maxLines: 2, + style: TextStyle(color: Colors.black, fontSize: Adapt.px(24)), + ), + ) + ], + ), + ), + ), + ); + } + + Widget _buildRecommendationCell(VideoListResult d) { + return GestureDetector( + child: Container( + padding: EdgeInsets.only( + left: Adapt.px(30), + ), + width: Adapt.px(400), + height: Adapt.px(400) * 9 / 16, + child: Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(10)), + child: FadeInImage.assetNetwork( + fit: BoxFit.cover, + width: Adapt.px(400), + height: Adapt.px(400) * 9 / 16, + placeholder: 'images/CacheBG.jpg', + image: ImageUrl.getUrl( + d.backdropPath ?? '/eIkFHNlfretLS1spAcIoihKUS62.jpg', + ImageSize.w400), + ), + ), + Container( + padding: EdgeInsets.all(Adapt.px(10)), + alignment: Alignment.bottomLeft, + child: Text( + d.originalTitle, + softWrap: false, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(28), + shadows: [ + Shadow( + blurRadius: 1.2, + color: Colors.black87, + offset: Offset(Adapt.px(2), Adapt.px(2))) + ]), + ), + ), + Container( + padding: EdgeInsets.all(Adapt.px(10)), + alignment: Alignment.topRight, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.star, + color: Colors.white, + size: Adapt.px(28), + ), + Text(d.voteAverage.toString(), + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(28), + shadows: [ + Shadow( + blurRadius: 1.2, + color: Colors.black87, + offset: Offset(Adapt.px(3), Adapt.px(3))) + ])) + ], + ), + ), + ], + )), + onTap: () => dispatch(MovieDetailPageActionCreator.onRecommendationTapped( + d.id, d.backdropPath)), + ); + } + + Widget _buildVideoCell(VideoResult d) { + return Container( + padding: EdgeInsets.fromLTRB(Adapt.px(30), 0, Adapt.px(30), Adapt.px(30)), + child: Card( + elevation: 2.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + VideoPlayerItem( + vc: VideoPlayerController.network(VideoUrl.getUrl(d.key, d.site)), + coverurl: 'https://i.ytimg.com/vi/${d.key}/hqdefault.jpg', + showplayer: true, + ), + Padding( + padding: EdgeInsets.all(Adapt.px(20)), + child: Text( + d.name, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(35), + fontWeight: FontWeight.w500), + ), + ), + ], + ), + ), + ); + } + + Widget _buildCreditsShimmerCell() { + return SizedBox( + width: Adapt.px(240), + height: Adapt.px(480), + child: Shimmer.fromColors( + baseColor: Colors.grey[200], + highlightColor: Colors.grey[100], + child: Column( + children: [ + Container( + color: Colors.grey[200], + width: Adapt.px(240), + height: Adapt.px(260), + ), + Container( + height: Adapt.px(24), + margin: EdgeInsets.fromLTRB(0, Adapt.px(15), Adapt.px(20), 0), + color: Colors.grey[200], + ), + Container( + height: Adapt.px(24), + margin: EdgeInsets.fromLTRB(0, Adapt.px(5), Adapt.px(20), 0), + color: Colors.grey[200], + ), + Container( + height: Adapt.px(24), + margin: EdgeInsets.fromLTRB( + 0, Adapt.px(5), Adapt.px(70), Adapt.px(20)), + color: Colors.grey[200], + ), + ], + ), + ), + ); + } + + Widget _buildImageCell(ImageData d) { + double w = (Adapt.screenW() - Adapt.px(100)) / 2; + double h = w / d.aspectRatio; + return Container( + width: w, + height: h, + decoration: BoxDecoration( + color: Color.fromRGBO(random.nextInt(255), random.nextInt(255), + random.nextInt(255), random.nextDouble()), + ), + child: ParallaxImage( + extent: h, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(d.filePath, ImageSize.w300))), + ); + } + + Widget _buildShimmerVideoCell() { + return Container( + padding: EdgeInsets.fromLTRB(Adapt.px(30), 0, Adapt.px(30), Adapt.px(30)), + child: Shimmer.fromColors( + highlightColor: Colors.grey[100], + baseColor: Colors.grey[200], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: Adapt.px(10), + ), + Container( + height: (Adapt.screenW() - Adapt.px(60)) * 9 / 16, + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + height: Adapt.px(35), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + margin: EdgeInsets.only(right: Adapt.px(200)), + height: Adapt.px(35), + color: Colors.grey[200], + ), + ], + ), + ), + ); + } + + Widget _buildRecommendationShimmer() { + return SizedBox( + child: Shimmer.fromColors( + baseColor: Colors.grey[200], + highlightColor: Colors.grey[100], + child: Container( + width: Adapt.px(400), + height: Adapt.px(400) * 9 / 16, + margin: EdgeInsets.only(left: Adapt.px(30)), + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(Adapt.px(10)), + ), + ), + ), + ); + } + + List _buildRecommendationBody() { + if (state.movieDetailModel?.recommendations != null) + return state.movieDetailModel.recommendations.results + .map(_buildRecommendationCell) + .toList(); + else + return [ + _buildRecommendationShimmer(), + _buildRecommendationShimmer(), + _buildRecommendationShimmer(), + ]; + } + + Widget _getVideoBody() { + if (state.videomodel.results.length > 0) + return SliverList( + delegate: + SliverChildBuilderDelegate((BuildContext contxt, int index) { + return _buildVideoCell(state.videomodel.results[index]); + }, childCount: state.videomodel.results.length)); + else + return SliverList( + delegate: + SliverChildBuilderDelegate((BuildContext contxt, int index) { + return _buildShimmerVideoCell(); + }, childCount: 3)); + } + + Widget _getImageBody() { + var hset = new HashSet() + ..addAll(state.imagesmodel.backdrops) + ..addAll(state.imagesmodel.posters); + var allimage = hset.toList(); + if (allimage.length > 0) + return SliverStaggeredGrid.countBuilder( + crossAxisCount: 4, + staggeredTileBuilder: (int index) => StaggeredTile.fit(2), + mainAxisSpacing: Adapt.px(20), + crossAxisSpacing: Adapt.px(20), + itemCount: allimage.length, + itemBuilder: (BuildContext contxt, int index) { + return _buildImageCell(allimage[index]); + }, + ); + /*return SliverList( + delegate: + SliverChildBuilderDelegate((BuildContext contxt, int index) { + return _buildImageCell(allimage[index]); + }, childCount: allimage.length));*/ + else + return SliverList( + delegate: + SliverChildBuilderDelegate((BuildContext contxt, int index) { + return _buildShimmerVideoCell(); + }, childCount: 3)); + } + + Widget _getPosterPic() { + if (state.posterPic == null) + return SizedBox( + child: Shimmer.fromColors( + baseColor: Colors.grey[500], + highlightColor: Colors.grey[100], + child: Container( + height: Adapt.px(300), + width: Adapt.px(200), + color: Colors.grey[500], + ), + )); + else + return Card( + elevation: 20.0, + child: CachedNetworkImage( + height: Adapt.px(300), + width: Adapt.px(200), + fit: BoxFit.cover, + imageUrl: ImageUrl.getUrl(state.posterPic, ImageSize.w300), + placeholder: (c, s) { + return Container( + height: Adapt.px(300), + width: Adapt.px(200), + color: Colors.grey, + ); + }, + ), + ); + } + + Widget _getTitle() { + if (state.title == null) + return SizedBox( + child: Shimmer.fromColors( + baseColor: Colors.grey[500], + highlightColor: Colors.grey[100], + child: Container( + height: Adapt.px(50), + width: Adapt.px(200), + color: Colors.grey[500], + ), + )); + else + return RichText( + text: TextSpan(children: [ + TextSpan( + text: state.title ?? '', + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: Adapt.px(50), + color: Colors.white, + shadows: [ + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 2.0, + color: Colors.black, + ), + ])), + TextSpan( + text: s.title == null + ? ' (-)' + : ' (${DateTime.tryParse(s.releaseDate)?.year.toString()})', + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: Adapt.px(30), + color: Colors.grey[400], + shadows: [ + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 2.0, + color: Colors.black, + ), + ])), + ]), + ); + } + + Widget _getOverWatch() { + if (state.movieDetailModel.overview == null) + return SizedBox( + child: Shimmer.fromColors( + baseColor: Colors.grey[200], + highlightColor: Colors.grey[100], + child: Container( + child: Column( + children: [ + Container( + margin: EdgeInsets.only(left: Adapt.px(60)), + color: Colors.grey[200], + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: Colors.grey[200], + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: Colors.grey[200], + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: Colors.grey[200], + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: Colors.grey[200], + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: Colors.grey[200], + height: Adapt.px(30), + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + color: Colors.grey[200], + height: Adapt.px(30), + ), + ], + ), + ), + )); + else + return Text(s.overview, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + height: 1.2, + fontWeight: FontWeight.w400)); + } + + Widget _getCreditsCells() { + if (state.movieDetailModel?.credits != null) + return ListView( + scrollDirection: Axis.horizontal, + children: + state.movieDetailModel.credits.cast.map(_buildCreditsCell).toList(), + ); + else + return ListView( + scrollDirection: Axis.horizontal, + children: [ + SizedBox( + width: Adapt.px(30), + ), + _buildCreditsShimmerCell(), + SizedBox( + width: Adapt.px(30), + ), + _buildCreditsShimmerCell(), + SizedBox( + width: Adapt.px(30), + ), + _buildCreditsShimmerCell(), + ], + ); + } + + Widget _buildHeader() { + return Container( + child: Stack( + children: [ + Container( + width: Adapt.screenW(), + height: Adapt.px(400), + decoration: BoxDecoration( + image: DecorationImage( + colorFilter: + ColorFilter.mode(dominantColor, BlendMode.color), + image: CachedNetworkImageProvider(state.backdropPic == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl(state.backdropPic, ImageSize.w500)), + fit: BoxFit.cover)), + ), + Container( + width: Adapt.screenW(), + height: Adapt.px(401), + color: dominantColor.withOpacity(.8), + ), + Container( + alignment: Alignment.bottomLeft, + padding: EdgeInsets.fromLTRB( + Adapt.px(30), Adapt.px(180), Adapt.px(30), Adapt.px(220)), + child: Row( + children: [ + _getPosterPic(), + SizedBox( + width: Adapt.px(20), + ), + Container( + padding: EdgeInsets.only(top: Adapt.px(150)), + width: Adapt.screenW() * 0.6, + child: _getTitle(), + ), + ], + ), + ), + Container( + alignment: Alignment.bottomLeft, + padding: EdgeInsets.only(bottom: Adapt.px(120)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + child: Row( + children: [ + AnimatedBuilder( + animation: state.animationController, + builder: (ctx, widget) { + var animate = Tween( + begin: 0.0, end: s.voteAverage ?? evote) + .animate(CurvedAnimation( + parent: state.animationController, + curve: Curves.ease, + )) + .value; + return Stack( + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(Adapt.px(40))), + child: CircularProgressIndicator( + strokeWidth: 6.0, + valueColor: + new AlwaysStoppedAnimation( + VoteColorHelper.getColor(animate)), + backgroundColor: Colors.grey, + value: animate / 10, + )), + Container( + width: Adapt.px(80), + height: Adapt.px(80), + child: Center( + child: Text( + (animate * 10).floor().toString() + '%', + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: Adapt.px(28), + color: Colors.white), + ), + )) + ], + ); + }, + ), + SizedBox( + width: Adapt.px(30), + ), + Text(I18n.of(viewService.context).userScore, + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: Adapt.px(30), + color: Colors.white)) + ], + ), + ), + Container( + width: 1, + height: Adapt.px(40), + color: Colors.grey[400], + ), + Container( + child: Row( + children: [ + Icon(Icons.play_arrow, color: Colors.white), + Text(I18n.of(viewService.context).playTrailer, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: Adapt.px(30), + color: Colors.white)) + ], + ), + ) + ], + ), + ) + ], + ), + ); + } + + return Scaffold( + key: state.scaffoldkey, + body: DefaultTabController( + length: 4, + child: NestedScrollView( + controller: state.scrollController, + headerSliverBuilder: (BuildContext context, bool de) { + return [ + SliverOverlapAbsorber( + handle: + NestedScrollView.sliverOverlapAbsorberHandleFor(context), + sliver: SliverAppBar( + pinned: true, + /*backgroundColor: state.palette.darkVibrantColor?.color ?? + Colors.black87,*/ + backgroundColor: dominantColor, + expandedHeight: Adapt.px(700), + centerTitle: false, + title: Text(de ? state.title ?? '' : ''), + actions: [ + IconButton( + icon: Icon(Icons.more_vert), + color: Colors.white, + iconSize: Adapt.px(50), + onPressed: () => + dispatch(MovieDetailPageActionCreator.openMenu()), + ) + ], + bottom: PreferredSize( + preferredSize: new Size(double.infinity, Adapt.px(60)), + child: Container( + width: Adapt.screenW(), + color: Colors.white, + child: TabBar( + labelColor: Colors.black, + /*indicatorColor: + state.palette.lightVibrantColor?.color ?? + Colors.black,*/ + indicatorColor: state.tabTintColor, + indicatorSize: TabBarIndicatorSize.label, + isScrollable: true, + labelStyle: TextStyle( + fontSize: Adapt.px(35), + fontWeight: FontWeight.w600), + tabs: [ + Tab(text: I18n.of(viewService.context).main), + Tab(text: I18n.of(viewService.context).videos), + Tab(text: I18n.of(viewService.context).images), + Tab(text: I18n.of(viewService.context).reviews), + ], + )), + ), + flexibleSpace: FlexibleSpaceBar( + centerTitle: false, + background: _buildHeader(), + )), + ) + ]; + }, + body: TabBarView( + children: [ + Container(child: Builder(builder: (BuildContext context) { + return CustomScrollView(slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + ), + SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.fromLTRB( + Adapt.px(30), Adapt.px(30), Adapt.px(30), 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(I18n.of(viewService.context).overView, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(40), + fontWeight: FontWeight.w800)), + SizedBox( + height: Adapt.px(30), + ), + _getOverWatch(), + ], + ), + ), + ), + SliverToBoxAdapter( + child: AnimatedSwitcher( + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + duration: Duration(milliseconds: 600), + child: Column( + key: ValueKey(state.movieDetailModel.id), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(Adapt.px(30)), + child: Text( + I18n.of(viewService.context) + .topBilledCast, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(40), + fontWeight: FontWeight.w800)), + ), + Container( + height: Adapt.px(450), + child: _getCreditsCells(), + ), + ], + ))), + SliverToBoxAdapter( + child: viewService.buildComponent('keywords'), + ), + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(Adapt.px(30)), + child: Text( + I18n.of(viewService.context).recommendations, + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(40), + fontWeight: FontWeight.w800)), + ), + Container( + margin: EdgeInsets.only(bottom: Adapt.px(30)), + height: Adapt.px(400) * 9 / 16, + child: ListView( + scrollDirection: Axis.horizontal, + children: _buildRecommendationBody(), + ), + ), + ], + )), + SliverToBoxAdapter( + child: viewService.buildComponent('info'), + ), + ]); + })), + Container(child: Builder(builder: (BuildContext context) { + return CustomScrollView(slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + ), + _getVideoBody() + ]); + })), + Container(child: Builder(builder: (BuildContext context) { + return CustomScrollView(slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + ), + _getImageBody() + ]); + })), + Container(child: Builder(builder: (BuildContext context) { + return CustomScrollView(slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor( + context), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext contxt, int index) { + return GestureDetector( + child: Padding( + padding: EdgeInsets.fromLTRB( + Adapt.px(30), 0, Adapt.px(30), Adapt.px(30)), + child: Card( + child: Container( + padding: EdgeInsets.all(Adapt.px(30)), + height: 300, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'A Review by ${state.reviewModel.results[index].author}', + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(30), + fontWeight: FontWeight.w700), + ), + SizedBox( + height: Adapt.px(20), + ), + new Expanded( + child: new LayoutBuilder(builder: + (BuildContext context, + BoxConstraints constraints) { + print(constraints); + return new Text( + state.reviewModel.results[index] + .content, + overflow: TextOverflow.fade, + maxLines: (constraints.maxHeight / + Theme.of(context) + .textTheme + .bodyText1 + .fontSize) + .floor(), + ); + }), + ), + ], + ), + ), + ), + ), + onTap: () async { + var url = state.reviewModel.results[index].url; + if (await canLaunch(url)) { + await launch(url); + } + }, + ); + }, childCount: state.reviewModel.results.length), + ), + ]); + })), + ], + ))), + ); +} diff --git a/lib/views/mylists_page/action.dart b/lib/views/mylists_page/action.dart new file mode 100644 index 00000000..8494722a --- /dev/null +++ b/lib/views/mylists_page/action.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/models/mylist_model.dart'; + +enum MyListsPageAction { + action, + setAccount, + setList, + loadMore, + createList, + onEdit, +} + +class MyListsPageActionCreator { + static Action onAction() { + return const Action(MyListsPageAction.action); + } + + static Action setAccount(String accountid) { + return Action(MyListsPageAction.setAccount, payload: accountid); + } + + static Action setList(UserListModel list) { + return Action(MyListsPageAction.setList, payload: list); + } + + static Action loadMore(MyListModel list) { + return Action(MyListsPageAction.loadMore, payload: list); + } + + static Action createList({Object d}) { + return Action(MyListsPageAction.createList, payload: d); + } + + static Action onEdit(bool isEdit) { + return Action(MyListsPageAction.onEdit, payload: isEdit); + } +} diff --git a/lib/views/mylists_page/adapter/action.dart b/lib/views/mylists_page/adapter/action.dart new file mode 100644 index 00000000..2a9a2d68 --- /dev/null +++ b/lib/views/mylists_page/adapter/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MyListAction { action } + +class MyListActionCreator { + static Action onAction() { + return const Action(MyListAction.action); + } +} diff --git a/lib/views/mylists_page/adapter/adapter.dart b/lib/views/mylists_page/adapter/adapter.dart new file mode 100644 index 00000000..522eefd2 --- /dev/null +++ b/lib/views/mylists_page/adapter/adapter.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/mylists_page/listcell_component/component.dart'; +import 'package:movie/views/mylists_page/state.dart'; + +import 'reducer.dart'; + +class MyListAdapter extends SourceFlowAdapter { + MyListAdapter() + : super( + pool: >{'listCell': ListCellComponent()}, + reducer: buildReducer(), + ); +} diff --git a/lib/views/mylists_page/adapter/reducer.dart b/lib/views/mylists_page/adapter/reducer.dart new file mode 100644 index 00000000..d7608fdb --- /dev/null +++ b/lib/views/mylists_page/adapter/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/views/mylists_page/state.dart'; +import '../listcell_component/action.dart' as listcell_action; +import 'action.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MyListAction.action: _onAction, + listcell_action.ListCellAction.onDeleteList: _onDeleteList, + }, + ); +} + +MyListsPageState _onAction(MyListsPageState state, Action action) { + final MyListsPageState newState = state.clone(); + return newState; +} + +MyListsPageState _onDeleteList(MyListsPageState state, Action action) { + final UserList _list = action.payload; + final MyListsPageState newState = state.clone(); + if (_list != null) (state.listData).data.remove(_list); + return newState; +} diff --git a/lib/views/mylists_page/addcell_component/component.dart b/lib/views/mylists_page/addcell_component/component.dart new file mode 100644 index 00000000..1305fd93 --- /dev/null +++ b/lib/views/mylists_page/addcell_component/component.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class AddCellComponent extends Component { + AddCellComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.animationController != newState.animationController; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/mylists_page/addcell_component/state.dart b/lib/views/mylists_page/addcell_component/state.dart new file mode 100644 index 00000000..c6163956 --- /dev/null +++ b/lib/views/mylists_page/addcell_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/views/mylists_page/state.dart'; + +class AddCellState implements Cloneable { + AnimationController animationController; + @override + AddCellState clone() { + return AddCellState(); + } +} + +class AddCellConnector extends ConnOp { + @override + AddCellState get(MyListsPageState state) { + AddCellState mstate = AddCellState(); + mstate.animationController = state.animationController; + return mstate; + } +} diff --git a/lib/views/mylists_page/addcell_component/view.dart b/lib/views/mylists_page/addcell_component/view.dart new file mode 100644 index 00000000..84b6ac16 --- /dev/null +++ b/lib/views/mylists_page/addcell_component/view.dart @@ -0,0 +1,43 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/views/mylists_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + AddCellState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: SizeTransition( + sizeFactor: Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation(curve: Curves.ease, parent: state.animationController)), + child: InkWell( + onTap: () => dispatch(MyListsPageActionCreator.createList()), + child: Container( + margin: EdgeInsets.only( + top: Adapt.px(20), left: Adapt.px(20), right: Adapt.px(20)), + height: Adapt.px(400), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey, width: 2), + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.add, + size: Adapt.px(50), + ), + SizedBox( + width: Adapt.px(20), + ), + Text( + 'Create new list', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(35)), + ) + ], + ), + ), + ), + )); +} diff --git a/lib/views/mylists_page/effect.dart b/lib/views/mylists_page/effect.dart new file mode 100644 index 00000000..80885a7e --- /dev/null +++ b/lib/views/mylists_page/effect.dart @@ -0,0 +1,55 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + Lifecycle.initState: _onInit, + Lifecycle.deactivate: _onDeactivate, + Lifecycle.dispose: _onDispose, + MyListsPageAction.createList: _createList, + }); +} + +Future _onInit(Action action, Context ctx) async { + final Object ticker = ctx.stfState; + ctx.state.animationController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 300)); + ctx.state.cellAnimationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 1000)); + ctx.state.scrollController = ScrollController(keepScrollOffset: false); + if (ctx.state.user != null) { + final _baseApi = BaseApi.instance; + final _data = await _baseApi.getUserList(ctx.state.user.firebaseUser.uid); + if (_data.success) + ctx.dispatch(MyListsPageActionCreator.setList(_data.result)); + } +} + +void _onDispose(Action action, Context ctx) { + ctx.state.cellAnimationController.stop(); + ctx.state.scrollController.dispose(); + ctx.state.animationController.dispose(); + ctx.state.cellAnimationController.dispose(); +} + +void _onDeactivate(Action action, Context ctx) { + ctx.state.cellAnimationController.stop(); + ctx.state.animationController.stop(); +} + +void _createList(Action action, Context ctx) async { + ctx.state.animationController.value = 0; + ctx.state.cellAnimationController.reset(); + ctx.dispatch(MyListsPageActionCreator.onEdit(false)); + await Navigator.of(ctx.context) + .pushNamed('createListPage', arguments: action.payload) + .then((d) { + if (d != null) { + ctx.state.listData.data.insert(0, d); + ctx.dispatch(MyListsPageActionCreator.setList(ctx.state.listData)); + } + }); +} diff --git a/lib/views/mylists_page/listcell_component/action.dart b/lib/views/mylists_page/listcell_component/action.dart new file mode 100644 index 00000000..a6c4981a --- /dev/null +++ b/lib/views/mylists_page/listcell_component/action.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; + +enum ListCellAction { + action, + onEdit, + deleteList, + onDeleteList, + cellTapped, +} + +class ListCellActionCreator { + static Action onAction() { + return const Action(ListCellAction.action); + } + + static Action onEdit({Object d}) { + return Action(ListCellAction.onEdit, payload: d); + } + + static Action cellTapped(UserList d) { + return Action(ListCellAction.cellTapped, payload: d); + } + + static Action deleteList(UserList d) { + return Action(ListCellAction.deleteList, payload: d); + } + + static Action onDeleteList(UserList d) { + return Action(ListCellAction.onDeleteList, payload: d); + } +} diff --git a/lib/views/mylists_page/listcell_component/component.dart b/lib/views/mylists_page/listcell_component/component.dart new file mode 100644 index 00000000..9e16a53a --- /dev/null +++ b/lib/views/mylists_page/listcell_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ListCellComponent extends Component { + ListCellComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.cellAnimationController != + newState.cellAnimationController || + oldState.cellData != newState.cellData || + oldState.isEdit != newState.isEdit; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/mylists_page/listcell_component/effect.dart b/lib/views/mylists_page/listcell_component/effect.dart new file mode 100644 index 00000000..4ffd7a96 --- /dev/null +++ b/lib/views/mylists_page/listcell_component/effect.dart @@ -0,0 +1,70 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/views/mylists_page/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ListCellAction.action: _onAction, + ListCellAction.cellTapped: _cellTapped, + ListCellAction.deleteList: _deleteList, + ListCellAction.onEdit: _onEdit, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _cellTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .pushNamed('ListDetailPage', arguments: {'list': action.payload}); +} + +void _deleteList(Action action, Context ctx) { + final UserList d = action.payload; + if (d != null) { + showDialog( + context: ctx.context, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + //title: Text('Rewind and remember'), + content: SingleChildScrollView( + child: ListBody( + children: [ + Text('Are you sure delete?'), + ], + ), + ), + actions: [ + FlatButton( + child: Text('Cancel'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + FlatButton( + child: Text('Submit'), + onPressed: () { + final _baseApi = BaseApi.instance; + _baseApi.deleteUserList(d.id).then((d) {}); + ctx.dispatch(ListCellActionCreator.onDeleteList(d)); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } +} + +void _onEdit(Action action, Context ctx) async { + ctx.state.animationController.value = 0; + ctx.state.cellAnimationController.reset(); + ctx.dispatch(MyListsPageActionCreator.onEdit(false)); + await Navigator.of(ctx.context) + .pushNamed('createListPage', arguments: action.payload); +} diff --git a/lib/views/mylists_page/listcell_component/reducer.dart b/lib/views/mylists_page/listcell_component/reducer.dart new file mode 100644 index 00000000..9cab14cb --- /dev/null +++ b/lib/views/mylists_page/listcell_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ListCellAction.action: _onAction, + }, + ); +} + +ListCellState _onAction(ListCellState state, Action action) { + final ListCellState newState = state.clone(); + return newState; +} diff --git a/lib/views/mylists_page/listcell_component/state.dart b/lib/views/mylists_page/listcell_component/state.dart new file mode 100644 index 00000000..7513d50b --- /dev/null +++ b/lib/views/mylists_page/listcell_component/state.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; + +class ListCellState implements Cloneable { + UserList cellData; + AnimationController cellAnimationController; + + AnimationController animationController; + bool isEdit; + + ListCellState( + {this.cellAnimationController, + this.cellData, + this.isEdit, + this.animationController}); + @override + ListCellState clone() { + return ListCellState()..cellData = cellData; + } +} + +ListCellState initState(Map args) { + return ListCellState(); +} diff --git a/lib/views/mylists_page/listcell_component/view.dart b/lib/views/mylists_page/listcell_component/view.dart new file mode 100644 index 00000000..7f3b7ef2 --- /dev/null +++ b/lib/views/mylists_page/listcell_component/view.dart @@ -0,0 +1,146 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; + +import 'dart:ui' as ui; +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + ListCellState state, Dispatch dispatch, ViewService viewService) { + final d = state.cellData; + final animate = TweenSequence([ + TweenSequenceItem( + tween: Tween(begin: 0.0, end: 0.003), weight: 0.5), + TweenSequenceItem(tween: Tween(begin: 0.003, end: 0.0), weight: 1), + TweenSequenceItem( + tween: Tween(begin: 0.0, end: -0.003), weight: 0.5), + TweenSequenceItem(tween: Tween(begin: -0.003, end: 0.0), weight: 1), + TweenSequenceItem( + tween: Tween(begin: 0.0, end: 0.003), weight: 0.5), + TweenSequenceItem(tween: Tween(begin: 0.003, end: 0.0), weight: 1), + TweenSequenceItem( + tween: Tween(begin: 0.0, end: -0.003), weight: 0.5), + TweenSequenceItem(tween: Tween(begin: -0.003, end: 0.0), weight: 1), + ]); + + Widget _buildListCell() { + var date = DateTime.parse(d.updateTime); + return RotationTransition( + turns: animate.animate(CurvedAnimation( + parent: state.cellAnimationController, curve: Curves.ease)), + child: GestureDetector( + onTap: () { + if (!state.isEdit) dispatch(ListCellActionCreator.cellTapped(d)); + }, + child: Padding( + padding: EdgeInsets.only( + top: Adapt.px(20), left: Adapt.px(20), right: Adapt.px(20)), + child: Container( + height: Adapt.px(400), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + color: Colors.grey[200], + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(d.backGroundUrl))), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + color: Colors.black.withOpacity(0.7), + ), + child: Stack( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Text( + d.listName, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(45), + fontWeight: FontWeight.bold, + fontStyle: FontStyle.italic), + ), + SizedBox( + height: Adapt.px(15), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('${d.itemCount} Items', + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold, + fontStyle: FontStyle.italic)), + SizedBox( + width: Adapt.px(20), + ), + Container( + padding: EdgeInsets.all(Adapt.px(8)), + decoration: BoxDecoration( + color: Colors.white30, + borderRadius: + BorderRadius.circular(Adapt.px(10))), + child: Text( + 'PUBLIC', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(24)), + ), + ) + ], + ), + SizedBox( + height: Adapt.px(8), + ), + Text( + 'Updated ' + + TimelineUtil.format( + date.millisecondsSinceEpoch, + locTimeMs: + DateTime.now().millisecondsSinceEpoch, + locale: ui.window.locale.languageCode, + ), + style: TextStyle( + color: Colors.white54, + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold), + ) + ], + ), + state.isEdit + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: Icon(Icons.delete_outline, + color: Colors.red), + onPressed: () => dispatch( + ListCellActionCreator.deleteList(d)), + ), + IconButton( + icon: Icon(Icons.edit, color: Colors.white), + onPressed: () => dispatch( + ListCellActionCreator.onEdit( + d: {'list': d})), + ), + ], + ) + : Container() + ], + )), + ), + ), + ), + ); + } + + return _buildListCell(); +} diff --git a/lib/views/mylists_page/page.dart b/lib/views/mylists_page/page.dart new file mode 100644 index 00000000..1e42fcbb --- /dev/null +++ b/lib/views/mylists_page/page.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/mylists_page/addcell_component/component.dart'; +import 'package:movie/views/mylists_page/addcell_component/state.dart'; + +import 'adapter/adapter.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MyListsPage extends Page> + with TickerProviderMixin { + MyListsPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + MyListAdapter(), + slots: >{ + 'addCell': AddCellConnector() + AddCellComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/mylists_page/reducer.dart b/lib/views/mylists_page/reducer.dart new file mode 100644 index 00000000..5088f534 --- /dev/null +++ b/lib/views/mylists_page/reducer.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MyListsPageAction.action: _onAction, + MyListsPageAction.setAccount: _setAccount, + MyListsPageAction.setList: _setList, + MyListsPageAction.onEdit: _onEdit, + }, + ); +} + +MyListsPageState _onAction(MyListsPageState state, Action action) { + final MyListsPageState newState = state.clone(); + return newState; +} + +MyListsPageState _setAccount(MyListsPageState state, Action action) { + String accountid = action.payload[0]; + final MyListsPageState newState = state.clone(); + newState.accountId = accountid; + return newState; +} + +MyListsPageState _setList(MyListsPageState state, Action action) { + final UserListModel model = action.payload; + final MyListsPageState newState = state.clone(); + newState.listData = model; + return newState; +} + +MyListsPageState _onEdit(MyListsPageState state, Action action) { + final bool isEdit = action.payload; + final MyListsPageState newState = state.clone(); + newState.isEdit = isEdit; + return newState; +} diff --git a/lib/views/mylists_page/state.dart b/lib/views/mylists_page/state.dart new file mode 100644 index 00000000..f310c3f2 --- /dev/null +++ b/lib/views/mylists_page/state.dart @@ -0,0 +1,62 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/views/mylists_page/listcell_component/state.dart'; + +class MyListsPageState extends MutableSource + implements GlobalBaseState, Cloneable { + String accountId; + ScrollController scrollController; + bool isEdit; + AnimationController animationController; + AnimationController cellAnimationController; + GlobalKey listkey; + UserListModel listData; + + @override + MyListsPageState clone() { + return MyListsPageState() + ..accountId = accountId + ..scrollController = scrollController + ..isEdit = isEdit + ..animationController = animationController + ..cellAnimationController = cellAnimationController + ..listkey = listkey + ..user = user + ..listData = listData; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; + + @override + Object getItemData(int index) => ListCellState( + cellData: listData.data[index], + cellAnimationController: cellAnimationController, + animationController: animationController, + isEdit: isEdit); + + @override + String getItemType(int index) => 'listCell'; + + @override + int get itemCount => listData?.data?.length ?? 0; + + @override + void setItemData(int index, Object data) {} +} + +MyListsPageState initState(Map args) { + MyListsPageState state = MyListsPageState(); + state.isEdit = false; + state.listkey = GlobalKey(); + return state; +} diff --git a/lib/views/mylists_page/view.dart b/lib/views/mylists_page/view.dart new file mode 100644 index 00000000..2531e081 --- /dev/null +++ b/lib/views/mylists_page/view.dart @@ -0,0 +1,100 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + MyListsPageState state, Dispatch dispatch, ViewService viewService) { + final _adapter = viewService.buildAdapter(); + + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + + return Scaffold( + appBar: AppBar( + backgroundColor: _theme.backgroundColor, + title: Text( + 'My Lists', + style: _theme.textTheme.bodyText1, + ), + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + actions: [ + IconButton( + icon: AnimatedSwitcher( + child: state.isEdit + ? Icon( + Icons.check, + key: ValueKey(state.isEdit), + ) + : Icon(Icons.edit, key: ValueKey(state.isEdit)), + duration: Duration(milliseconds: 200), + ), + onPressed: () async { + await state.scrollController.position.animateTo(0.0, + curve: Curves.ease, duration: Duration(milliseconds: 200)); + final r = !state.isEdit; + if (r) { + await state.animationController.forward(from: 0.0); + state.cellAnimationController.repeat(); + dispatch(MyListsPageActionCreator.onEdit(r)); + } else { + await state.animationController.reverse(from: 1.0); + state.cellAnimationController.reset(); + dispatch(MyListsPageActionCreator.onEdit(r)); + } + }, + ), + ], + ), + body: CustomScrollView( + controller: state.scrollController, + slivers: [ + viewService.buildComponent('addCell'), + state.listData == null + ? _ShimmerList() + : SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext ctx, int index) { + return _adapter.itemBuilder(ctx, index); + }, childCount: _adapter.itemCount), + ), + ], + )); + }); +} + +class _ListShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only( + top: Adapt.px(20), left: Adapt.px(20), right: Adapt.px(20)), + width: Adapt.screenW(), + height: Adapt.px(400), + decoration: BoxDecoration( + color: const Color(0xFFEEEEEE), + borderRadius: BorderRadius.circular(Adapt.px(30))), + ); + } +} + +class _ShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column(children: [ + _ListShimmerCell(), + _ListShimmerCell(), + _ListShimmerCell() + ]))); + } +} diff --git a/lib/views/notification_page/action.dart b/lib/views/notification_page/action.dart new file mode 100644 index 00000000..7b8d9fcf --- /dev/null +++ b/lib/views/notification_page/action.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/notification_model.dart'; + +enum NotificationAction { action, setNotifications, cellTapped } + +class NotificationActionCreator { + static Action onAction() { + return const Action(NotificationAction.action); + } + + static Action setNotifications(NotificationList list) { + return Action(NotificationAction.setNotifications, payload: list); + } + + static Action cellTapped(NotificationModel data) { + return Action(NotificationAction.cellTapped, payload: data); + } +} diff --git a/lib/views/notification_page/effect.dart b/lib/views/notification_page/effect.dart new file mode 100644 index 00000000..0e71f425 --- /dev/null +++ b/lib/views/notification_page/effect.dart @@ -0,0 +1,52 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action, Page; +import 'package:movie/models/notification_model.dart'; +import 'package:movie/views/detail_page/page.dart'; +import 'package:movie/views/tvshow_detail_page/page.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + NotificationAction.action: _onAction, + NotificationAction.cellTapped: _cellTapped, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + final _preferences = await SharedPreferences.getInstance(); + NotificationList _list; + if (_preferences.containsKey('notifications')) { + final String _notifications = _preferences.getString('notifications'); + _list = NotificationList(_notifications); + } + if (_list != null) + ctx.dispatch(NotificationActionCreator.setNotifications(_list)); +} + +void _cellTapped(Action action, Context ctx) async { + final NotificationModel _model = action.payload; + if (_model == null) return; + for (var item in ctx.state.notificationList.notifications) { + if (item == _model && !item.read) { + item.read = true; + } + } + final _preferences = await SharedPreferences.getInstance(); + _preferences.setString( + 'notifications', ctx.state.notificationList.toString()); + ctx.dispatch( + NotificationActionCreator.setNotifications(ctx.state.notificationList)); + + var data = { + 'id': int.parse(_model.id.toString()), + 'name': _model.name, + }; + Page page = _model.type == 'movie' ? MovieDetailPage() : TvShowDetailPage(); + await Navigator.of(ctx.context) + .push(MaterialPageRoute(builder: (context) => page.buildPage(data))); +} diff --git a/lib/views/notification_page/page.dart b/lib/views/notification_page/page.dart new file mode 100644 index 00000000..930f2642 --- /dev/null +++ b/lib/views/notification_page/page.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class NotificationPage extends Page> { + NotificationPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }), + middleware: >[ + ],); + +} diff --git a/lib/views/notification_page/reducer.dart b/lib/views/notification_page/reducer.dart new file mode 100644 index 00000000..e3133d72 --- /dev/null +++ b/lib/views/notification_page/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/notification_model.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + NotificationAction.action: _onAction, + NotificationAction.setNotifications: _setNotifications, + }, + ); +} + +NotificationState _onAction(NotificationState state, Action action) { + final NotificationState newState = state.clone(); + return newState; +} + +NotificationState _setNotifications(NotificationState state, Action action) { + final NotificationList _list = action.payload; + final NotificationState newState = state.clone(); + newState.notificationList = _list; + return newState; +} diff --git a/lib/views/notification_page/state.dart b/lib/views/notification_page/state.dart new file mode 100644 index 00000000..868e17a1 --- /dev/null +++ b/lib/views/notification_page/state.dart @@ -0,0 +1,14 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/notification_model.dart'; + +class NotificationState implements Cloneable { + NotificationList notificationList; + @override + NotificationState clone() { + return NotificationState()..notificationList = notificationList; + } +} + +NotificationState initState(Map args) { + return NotificationState(); +} diff --git a/lib/views/notification_page/view.dart b/lib/views/notification_page/view.dart new file mode 100644 index 00000000..dd335cc1 --- /dev/null +++ b/lib/views/notification_page/view.dart @@ -0,0 +1,211 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/local_notification.dart'; +import 'package:movie/models/notification_model.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'dart:ui' as ui; +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + NotificationState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + final _lenght = state.notificationList?.notifications?.length ?? 0; + return Scaffold( + backgroundColor: _theme.backgroundColor, + appBar: AppBar( + title: Text( + 'Notifications', + style: TextStyle(color: _theme.iconTheme.color), + ), + centerTitle: false, + elevation: 0.0, + backgroundColor: _theme.backgroundColor, + iconTheme: _theme.iconTheme, + brightness: _theme.brightness, + actions: [ + _SearchButton( + onTap: () async { + await LocalNotification.instance + .sendNotification('title', 'body'); + }, + ) + ], + ), + body: _lenght > 0 + ? ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(30)), + separatorBuilder: (_, index) => SizedBox(height: Adapt.px(40)), + itemCount: state.notificationList?.notifications?.length ?? 0, + itemBuilder: (_, index) { + return _ItemCell( + data: state + .notificationList?.notifications[_lenght - 1 - index], + onTap: (d) => + dispatch(NotificationActionCreator.cellTapped(d)), + ); + }, + ) + : const _EmtypList(), + ); + }, + ); +} + +class _SearchButton extends StatelessWidget { + final Function onTap; + const _SearchButton({this.onTap}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Icon(Icons.search), + ), + ); + } +} + +class _ItemCell extends StatefulWidget { + final NotificationModel data; + final Function(NotificationModel) onTap; + const _ItemCell({this.data, this.onTap}); + @override + _ItemCellState createState() => _ItemCellState(); +} + +class _ItemCellState extends State<_ItemCell> { + final GlobalKey _key = GlobalKey(); + double _height = 0; + _getSizes(_) { + final RenderBox renderBox = _key.currentContext.findRenderObject(); + final size = renderBox.size; + _height = size.height; + setState(() {}); + } + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback(_getSizes); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final DateTime _date = DateTime.parse(widget.data.date); + final String timeline = TimelineUtil.format( + _date.millisecondsSinceEpoch, + locTimeMs: DateTime.now().millisecondsSinceEpoch, + locale: ui.window.locale.languageCode, + ); + return GestureDetector( + onTap: () => widget.onTap(widget.data), + child: Container( + decoration: BoxDecoration( + color: _theme.brightness == Brightness.light + ? const Color(0xFFF5F7FB) + : _theme.primaryColorLight, + borderRadius: BorderRadius.circular(Adapt.px(30)), + ), + child: Stack(children: [ + Row( + children: [ + Container( + key: _key, + width: Adapt.screenW() - Adapt.px(240), + padding: EdgeInsets.all(Adapt.px(40)), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + timeline, + style: TextStyle( + fontSize: Adapt.px(22), + color: const Color(0xFF717171), + ), + ), + SizedBox(height: Adapt.px(15)), + Text( + widget.data.notification?.body ?? '', + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: Adapt.px(24), + height: 1.5, + ), + ), + ], + ), + ), + widget.data.posterPic != null + ? Container( + width: Adapt.px(160), + height: _height, + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(30)), + image: DecorationImage( + fit: BoxFit.cover, + image: + CachedNetworkImageProvider(widget.data.posterPic), + ), + ), + ) + : SizedBox(), + ], + ), + _CircleDot(read: widget.data.read), + ]), + ), + ); + } +} + +class _CircleDot extends StatelessWidget { + final bool read; + const _CircleDot({this.read}); + @override + Widget build(BuildContext context) { + return read + ? const SizedBox() + : Transform.translate( + offset: Offset(-Adapt.px(3), -Adapt.px(3)), + child: Container( + width: Adapt.px(20), + height: Adapt.px(20), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.amber, + ), + ), + ); + } +} + +class _EmtypList extends StatelessWidget { + const _EmtypList(); + @override + Widget build(BuildContext context) { + return Container( + child: Center( + child: const Text( + 'Empty List', + style: TextStyle( + fontSize: 20, + color: const Color(0xFF9E9E9E), + ), + ), + )); + } +} diff --git a/lib/views/payment_page/action.dart b/lib/views/payment_page/action.dart new file mode 100644 index 00000000..3088bce8 --- /dev/null +++ b/lib/views/payment_page/action.dart @@ -0,0 +1,44 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_creditcard.dart'; +import 'package:movie/models/base_api_model/braintree_customer.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; + +enum PaymentPageAction { + action, + setTransactions, + setCustomer, + showHistory, + showBillingAddress, + createCard, + insertCreditCard, +} + +class PaymentPageActionCreator { + static Action onAction() { + return const Action(PaymentPageAction.action); + } + + static Action setTransactions(TransactionModel transactions) { + return Action(PaymentPageAction.setTransactions, payload: transactions); + } + + static Action setCustomer(BraintreeCustomer customer) { + return Action(PaymentPageAction.setCustomer, payload: customer); + } + + static Action showHistory() { + return const Action(PaymentPageAction.showHistory); + } + + static Action showBillingAddress() { + return const Action(PaymentPageAction.showBillingAddress); + } + + static Action createCard() { + return const Action(PaymentPageAction.createCard); + } + + static Action insertCreditCard(CreditCard card) { + return Action(PaymentPageAction.insertCreditCard, payload: card); + } +} diff --git a/lib/views/payment_page/components/android_pay_component/component.dart b/lib/views/payment_page/components/android_pay_component/component.dart new file mode 100644 index 00000000..e0b0c46b --- /dev/null +++ b/lib/views/payment_page/components/android_pay_component/component.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class AndroidPayComponent extends Component { + AndroidPayComponent() + : super( + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/payment_page/components/android_pay_component/state.dart b/lib/views/payment_page/components/android_pay_component/state.dart new file mode 100644 index 00000000..9081e4a3 --- /dev/null +++ b/lib/views/payment_page/components/android_pay_component/state.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +class AndroidPayState implements Cloneable { + + @override + AndroidPayState clone() { + return AndroidPayState(); + } +} + +AndroidPayState initState(Map args) { + return AndroidPayState(); +} diff --git a/lib/views/payment_page/components/android_pay_component/view.dart b/lib/views/payment_page/components/android_pay_component/view.dart new file mode 100644 index 00000000..625d4431 --- /dev/null +++ b/lib/views/payment_page/components/android_pay_component/view.dart @@ -0,0 +1,8 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; + +import 'state.dart'; + +Widget buildView(AndroidPayState state, Dispatch dispatch, ViewService viewService) { + return Container(); +} diff --git a/lib/views/payment_page/components/apple_pay_component/component.dart b/lib/views/payment_page/components/apple_pay_component/component.dart new file mode 100644 index 00000000..335fe0f1 --- /dev/null +++ b/lib/views/payment_page/components/apple_pay_component/component.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class ApplePayComponent extends Component { + ApplePayComponent() + : super( + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/payment_page/components/apple_pay_component/state.dart b/lib/views/payment_page/components/apple_pay_component/state.dart new file mode 100644 index 00000000..1dd7bc39 --- /dev/null +++ b/lib/views/payment_page/components/apple_pay_component/state.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +class ApplePayState implements Cloneable { + + @override + ApplePayState clone() { + return ApplePayState(); + } +} + +ApplePayState initState(Map args) { + return ApplePayState(); +} diff --git a/lib/views/payment_page/components/apple_pay_component/view.dart b/lib/views/payment_page/components/apple_pay_component/view.dart new file mode 100644 index 00000000..d86e93e6 --- /dev/null +++ b/lib/views/payment_page/components/apple_pay_component/view.dart @@ -0,0 +1,8 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; + +import 'state.dart'; + +Widget buildView(ApplePayState state, Dispatch dispatch, ViewService viewService) { + return Container(); +} diff --git a/lib/views/payment_page/components/billing_address_component/action.dart b/lib/views/payment_page/components/billing_address_component/action.dart new file mode 100644 index 00000000..0d5d5c92 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/action.dart @@ -0,0 +1,37 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; + +enum BillingAddressAction { + action, + create, + edit, + insert, + update, + delete, +} + +class BillingAddressActionCreator { + static Action onAction() { + return const Action(BillingAddressAction.action); + } + + static Action onCreate() { + return const Action(BillingAddressAction.create); + } + + static Action onEdit(BillingAddress address) { + return Action(BillingAddressAction.edit, payload: address); + } + + static Action onInsert(BillingAddress address) { + return Action(BillingAddressAction.insert, payload: address); + } + + static Action onUpdate(BillingAddress address) { + return Action(BillingAddressAction.update, payload: address); + } + + static Action onDelete(BillingAddress address) { + return Action(BillingAddressAction.delete, payload: address); + } +} diff --git a/lib/views/payment_page/components/billing_address_component/component.dart b/lib/views/payment_page/components/billing_address_component/component.dart new file mode 100644 index 00000000..59c70a28 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/component.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/payment_page/components/billing_address_component/create_address_component/component.dart'; +import 'package:movie/views/payment_page/components/billing_address_component/create_address_component/state.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class BillingAddressComponent extends Component { + BillingAddressComponent() + : super( + view: buildView, + shouldUpdate: (oldState, newState) { + return oldState.addresses != newState.addresses || + oldState.createAddressState != newState.createAddressState; + }, + effect: buildEffect(), + reducer: buildReducer(), + dependencies: Dependencies( + adapter: null, + slots: >{ + 'createAddress': + CreateAddressConnector() + CreateAddressComponent() + }), + ); +} diff --git a/lib/views/payment_page/components/billing_address_component/create_address_component/action.dart b/lib/views/payment_page/components/billing_address_component/create_address_component/action.dart new file mode 100644 index 00000000..e5f1ba94 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/create_address_component/action.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/country_phone_code.dart'; + +enum CreateAddressAction { action, setRegion, save, delete, loading } + +class CreateAddressActionCreator { + static Action onAction() { + return const Action(CreateAddressAction.action); + } + + static Action setRegion(CountryPhoneCode region) { + return Action(CreateAddressAction.setRegion, payload: region); + } + + static Action onSave() { + return const Action(CreateAddressAction.save); + } + + static Action onDelete() { + return const Action(CreateAddressAction.delete); + } + + static Action onLoading(bool loading) { + return Action(CreateAddressAction.loading, payload: loading); + } +} diff --git a/lib/views/payment_page/components/billing_address_component/create_address_component/component.dart b/lib/views/payment_page/components/billing_address_component/create_address_component/component.dart new file mode 100644 index 00000000..162986e6 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/create_address_component/component.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CreateAddressComponent extends Component { + CreateAddressComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.countries != newState.countries || + oldState.region != newState.region || + oldState.loading != newState.loading; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}, + ), + ); +} diff --git a/lib/views/payment_page/components/billing_address_component/create_address_component/effect.dart b/lib/views/payment_page/components/billing_address_component/create_address_component/effect.dart new file mode 100644 index 00000000..0b6e4bc2 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/create_address_component/effect.dart @@ -0,0 +1,97 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; +import 'package:movie/views/payment_page/components/billing_address_component/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CreateAddressAction.action: _onAction, + CreateAddressAction.save: _onSave, + CreateAddressAction.delete: _onDelete, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + ctx.state.loading = false; + ctx.state.firstNameController = TextEditingController(); + ctx.state.lastNameController = TextEditingController(); + ctx.state.companyController = TextEditingController(); + ctx.state.cityController = TextEditingController(); + ctx.state.provinceController = TextEditingController(); + ctx.state.postalCodeController = TextEditingController(); + ctx.state.streetAddressController = TextEditingController(); + ctx.state.extendedAddressController = TextEditingController(); + if (ctx.state.billingAddress != null) { + ctx.state.firstNameController.text = ctx.state.billingAddress.firstName; + ctx.state.lastNameController.text = ctx.state.billingAddress.lastName; + ctx.state.companyController.text = ctx.state.billingAddress.company; + ctx.state.cityController.text = ctx.state.billingAddress.locality; + ctx.state.provinceController.text = ctx.state.billingAddress.region; + ctx.state.postalCodeController.text = ctx.state.billingAddress.postalCode; + ctx.state.streetAddressController.text = + ctx.state.billingAddress.streetAddress; + ctx.state.extendedAddressController.text = + ctx.state.billingAddress.extendedAddress; + } +} + +void _onDispose(Action action, Context ctx) async { + ctx.state.firstNameController.dispose(); + ctx.state.lastNameController.dispose(); + ctx.state.companyController.dispose(); + ctx.state.cityController.dispose(); + ctx.state.provinceController.dispose(); + ctx.state.postalCodeController.dispose(); + ctx.state.streetAddressController.dispose(); + ctx.state.extendedAddressController.dispose(); +} + +void _onSave(Action action, Context ctx) async { + ctx.dispatch(CreateAddressActionCreator.onLoading(true)); + final _address = BillingAddress.fromParams( + customerId: ctx.state.customerId, + company: ctx.state.companyController.text, + firstName: ctx.state.firstNameController.text, + countryName: ctx.state.region.name, + extendedAddress: ctx.state.extendedAddressController.text, + lastName: ctx.state.lastNameController.text, + locality: ctx.state.cityController.text, + postalCode: ctx.state.postalCodeController.text, + region: ctx.state.provinceController.text, + streetAddress: ctx.state.streetAddressController.text); + final _baseApi = BaseApi.instance; + if (ctx.state.billingAddress != null) { + _address.id = ctx.state.billingAddress.id; + var _r = await _baseApi.updateBillAddress(_address); + if (_r != null) ctx.dispatch(BillingAddressActionCreator.onUpdate(_r)); + Navigator.of(ctx.context).pop(); + } else { + var _r = await _baseApi.createBillAddress(_address); + if (_r != null) ctx.dispatch(BillingAddressActionCreator.onInsert(_r)); + Navigator.of(ctx.context).pop(); + } + + ctx.dispatch(CreateAddressActionCreator.onLoading(false)); +} + +void _onDelete(Action action, Context ctx) async { + if (ctx.state.billingAddress != null && ctx.state.customerId != null) { + final _baseApi = BaseApi.instance; + ctx.dispatch(CreateAddressActionCreator.onLoading(true)); + final _r = await _baseApi.deleteBillAddress(ctx.state.billingAddress); + if (_r != null) { + ctx.dispatch( + BillingAddressActionCreator.onDelete(ctx.state.billingAddress)); + + ctx.dispatch(CreateAddressActionCreator.onLoading(false)); + Navigator.of(ctx.context).pop(); + } + } +} diff --git a/lib/views/payment_page/components/billing_address_component/create_address_component/reducer.dart b/lib/views/payment_page/components/billing_address_component/create_address_component/reducer.dart new file mode 100644 index 00000000..5ec4406a --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/create_address_component/reducer.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/country_phone_code.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CreateAddressAction.action: _onAction, + CreateAddressAction.setRegion: _setRegion, + CreateAddressAction.loading: _loading, + }, + ); +} + +CreateAddressState _onAction(CreateAddressState state, Action action) { + final CreateAddressState newState = state.clone(); + return newState; +} + +CreateAddressState _setRegion(CreateAddressState state, Action action) { + final CountryPhoneCode _region = action.payload; + final CreateAddressState newState = state.clone(); + newState.region = _region; + return newState; +} + +CreateAddressState _loading(CreateAddressState state, Action action) { + final bool _loading = action.payload ?? false; + final CreateAddressState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/payment_page/components/billing_address_component/create_address_component/state.dart b/lib/views/payment_page/components/billing_address_component/create_address_component/state.dart new file mode 100644 index 00000000..80b98814 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/create_address_component/state.dart @@ -0,0 +1,53 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; +import 'package:movie/models/country_phone_code.dart'; + +import '../state.dart'; + +class CreateAddressState implements Cloneable { + List countries; + bool loading; + String customerId; + BillingAddress billingAddress; + CountryPhoneCode region; + TextEditingController firstNameController; + TextEditingController lastNameController; + TextEditingController companyController; + TextEditingController cityController; + TextEditingController provinceController; + TextEditingController postalCodeController; + TextEditingController streetAddressController; + TextEditingController extendedAddressController; + @override + CreateAddressState clone() { + return CreateAddressState() + ..customerId = customerId + ..countries = countries + ..loading = loading + ..billingAddress = billingAddress + ..region = region + ..firstNameController = firstNameController + ..lastNameController = lastNameController + ..companyController = companyController + ..cityController = cityController + ..provinceController = provinceController + ..postalCodeController = postalCodeController + ..streetAddressController = streetAddressController + ..extendedAddressController = extendedAddressController; + } +} + +class CreateAddressConnector + extends ConnOp { + @override + CreateAddressState get(BillingAddressState state) { + CreateAddressState mstate = state.createAddressState; + return mstate; + } + + @override + void set(BillingAddressState state, CreateAddressState subState) { + state.createAddressState = subState; + } +} diff --git a/lib/views/payment_page/components/billing_address_component/create_address_component/view.dart b/lib/views/payment_page/components/billing_address_component/create_address_component/view.dart new file mode 100644 index 00000000..c42b4d84 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/create_address_component/view.dart @@ -0,0 +1,382 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/loading_layout.dart'; +import 'package:movie/models/country_phone_code.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CreateAddressState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Stack(children: [ + Scaffold( + //resizeToAvoidBottomPadding: false, + backgroundColor: _theme.primaryColorDark, + appBar: AppBar( + backgroundColor: _theme.primaryColorDark, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + elevation: 0.0, + centerTitle: false, + title: Text( + '${state.billingAddress == null ? 'Create' : 'Edit'} Address', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + actions: [ + _SaveButton( + onTap: () => dispatch(CreateAddressActionCreator.onSave()), + ) + ], + ), + body: Container( + margin: EdgeInsets.only(top: Adapt.px(20)), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: ListView( + children: [ + SizedBox(height: Adapt.px(80)), + _RegionCell( + countries: state.countries ?? [], + region: state.region, + onTap: (d) => + dispatch(CreateAddressActionCreator.setRegion(d)), + ), + SizedBox(height: Adapt.px(30)), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _CustomTextField( + controller: state.firstNameController, + width: Adapt.px(300), + title: 'First Name', + ), + _CustomTextField( + controller: state.lastNameController, + width: Adapt.px(300), + title: 'Last Name', + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _CustomTextField( + controller: state.companyController, + width: Adapt.px(300), + title: 'Company', + ), + _CustomTextField( + controller: state.cityController, + width: Adapt.px(300), + title: 'City', + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _CustomTextField( + controller: state.provinceController, + width: Adapt.px(300), + title: 'State/Province', + ), + _CustomTextField( + controller: state.postalCodeController, + width: Adapt.px(300), + title: 'Postal Code', + ), + ], + ), + _CustomTextField( + controller: state.streetAddressController, + title: 'Street Address', + ), + _CustomTextField( + controller: state.extendedAddressController, + title: 'Extended Address', + ), + SizedBox(height: Adapt.px(30)), + _DeleteButton( + show: state.billingAddress != null, + onTap: () => dispatch(CreateAddressActionCreator.onDelete()), + ), + ], + ), + ), + ), + LoadingLayout( + title: 'Loading', + show: state.loading, + ) + ]); + }, + ); +} + +class _SaveButton extends StatelessWidget { + final Function onTap; + const _SaveButton({this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return InkWell( + onTap: onTap, + child: Container( + margin: EdgeInsets.only(right: Adapt.px(20)), + padding: EdgeInsets.all(Adapt.px(20)), + child: Center( + child: Text( + 'Save', + style: TextStyle( + color: _theme.textTheme.bodyText1.color, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ); + } +} + +class _DeleteButton extends StatelessWidget { + final bool show; + final Function onTap; + const _DeleteButton({this.onTap, @required this.show}); + @override + Widget build(BuildContext context) { + return show + ? GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(vertical: Adapt.px(25)), + decoration: BoxDecoration( + color: Color(0xFFFF0000), + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: Center( + child: Text( + 'DELETE', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30), + color: const Color(0xFFFFFFFF), + ), + )), + )) + : SizedBox(); + } +} + +class _RegionCell extends StatelessWidget { + final List countries; + final CountryPhoneCode region; + final Function(CountryPhoneCode) onTap; + const _RegionCell({this.countries, this.region, this.onTap}); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Region', style: TextStyle(fontSize: Adapt.px(30))), + SizedBox(height: Adapt.px(20)), + GestureDetector( + onTap: () => showDialog( + context: context, + builder: (context) { + return _CountryCodeDialog( + countries: countries, + onCellTap: onTap, + ); + }), + child: Container( + height: Adapt.px(85), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(20)), + border: Border.all(color: Color(0xFF9E9E9E)), + ), + child: region == null + ? Container( + alignment: Alignment.centerLeft, + width: Adapt.screenW(), + child: Text( + '-', + style: TextStyle(fontSize: Adapt.px(30)), + )) + : Row( + children: [ + Text( + region.flag, + style: TextStyle(fontSize: Adapt.px(30)), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: Adapt.screenW() - Adapt.px(250), + child: Text( + region.name, + maxLines: 2, + ), + ) + ], + ), + ), + ) + ], + ); + } +} + +class _CountryCodeDialog extends StatefulWidget { + final List countries; + final Function(CountryPhoneCode) onCellTap; + const _CountryCodeDialog({@required this.countries, this.onCellTap}); + @override + _CountryCodeDialogState createState() => _CountryCodeDialogState(); +} + +class _CountryCodeDialogState extends State<_CountryCodeDialog> { + final _width = Adapt.screenW() - Adapt.px(80); + List _countries; + TextEditingController _controller; + @override + void initState() { + _countries = widget.countries; + _controller = TextEditingController(); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(30))), + contentPadding: EdgeInsets.zero, + title: Theme( + child: TextField( + controller: _controller, + cursorColor: Colors.black, + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Search', + prefixIcon: Icon(Icons.search), + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle(color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black87), + ), + ), + onChanged: (str) { + _countries = widget.countries + .where((e) => e.name.toUpperCase().contains(str.toUpperCase())) + .toList(); + setState(() {}); + }, + ), + data: Theme.of(context).copyWith( + primaryColor: Colors.black87, + ), + ), + children: [ + Container( + height: Adapt.screenH() / 2, + width: _width, + child: ListView.separated( + padding: EdgeInsets.all(Adapt.px(40)), + separatorBuilder: (_, __) => Divider( + height: 25, + ), + itemCount: _countries.length, + itemBuilder: (_, index) { + final d = _countries[index]; + return _CountryCell( + data: d, + onTap: widget.onCellTap, + ); + }, + ), + ) + ], + ); + } +} + +class _CountryCell extends StatelessWidget { + final CountryPhoneCode data; + final Function(CountryPhoneCode) onTap; + _CountryCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _width = Adapt.screenW() - Adapt.px(80); + final _textStyle = TextStyle(fontSize: Adapt.px(28)); + return InkWell( + key: ValueKey(data.name), + onTap: () { + onTap(data); + Navigator.of(context).pop(); + }, + child: Container( + child: Row( + children: [ + Text(data.flag, style: _textStyle), + SizedBox(width: Adapt.px(20)), + Container( + constraints: BoxConstraints(maxWidth: _width - Adapt.px(200)), + child: Text(data.name, style: _textStyle), + ), + ], + ), + ), + ); + } +} + +class _CustomTextField extends StatelessWidget { + final String title; + final double width; + final TextEditingController controller; + const _CustomTextField({this.title, this.width, this.controller}); + @override + Widget build(BuildContext context) { + final _intputBorder = OutlineInputBorder( + borderRadius: BorderRadius.circular(Adapt.px(20)), + borderSide: BorderSide(color: const Color(0xFF9E9E9E))); + return Container( + width: width ?? Adapt.screenW(), + padding: EdgeInsets.only(bottom: Adapt.px(30)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: TextStyle(fontSize: Adapt.px(30))), + SizedBox(height: Adapt.px(20)), + TextField( + controller: controller, + cursorColor: const Color(0xFF9E9E9E), + decoration: InputDecoration( + contentPadding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + enabledBorder: _intputBorder, + disabledBorder: _intputBorder, + focusedBorder: _intputBorder, + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/payment_page/components/billing_address_component/effect.dart b/lib/views/payment_page/components/billing_address_component/effect.dart new file mode 100644 index 00000000..2aeeffab --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/effect.dart @@ -0,0 +1,52 @@ +import 'dart:convert' show json; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; +import 'package:movie/models/country_phone_code.dart'; +import 'action.dart'; +import 'create_address_component/state.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + BillingAddressAction.action: _onAction, + BillingAddressAction.create: _onCreate, + BillingAddressAction.edit: _onEdit, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + ctx.state.createAddressState = CreateAddressState(); + final _jsonStr = await CountryPhoneCode.getCountryJson(ctx.context); + final _countriesJson = json.decode(_jsonStr); + final _countries = List(); + for (var _country in _countriesJson) { + _countries.add(CountryPhoneCode.fromJson(_country)); + } + ctx.state.createAddressState.countries = _countries; + + ctx.state.createAddressState.customerId = ctx.state.customerId; +} + +Future _onCreate(Action action, Context ctx) async { + ctx.state.createAddressState.region = null; + ctx.state.createAddressState.billingAddress = null; + await Navigator.of(ctx.context).push( + MaterialPageRoute(builder: (_) => ctx.buildComponent('createAddress'))); +} + +Future _onEdit(Action action, Context ctx) async { + final BillingAddress _address = action.payload; + ctx.state.createAddressState.region = + ctx.state.createAddressState.countries.firstWhere( + (e) => e.code == _address.countryCodeAlpha2, + orElse: () => null, + ); + ctx.state.createAddressState.billingAddress = _address; + await Navigator.of(ctx.context).push( + MaterialPageRoute(builder: (_) => ctx.buildComponent('createAddress'))); +} diff --git a/lib/views/payment_page/components/billing_address_component/reducer.dart b/lib/views/payment_page/components/billing_address_component/reducer.dart new file mode 100644 index 00000000..f40dbe57 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/reducer.dart @@ -0,0 +1,50 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + BillingAddressAction.action: _onAction, + BillingAddressAction.update: _onUpdate, + BillingAddressAction.insert: _onInsert, + BillingAddressAction.delete: _onDelete, + }, + ); +} + +BillingAddressState _onAction(BillingAddressState state, Action action) { + final BillingAddressState newState = state.clone(); + return newState; +} + +BillingAddressState _onUpdate(BillingAddressState state, Action action) { + final BillingAddress _address = action.payload; + final BillingAddressState newState = state.clone(); + final _list = newState.addresses.map((e) { + if (e.id == _address.id) return _address; + return e; + }).toList(); + newState.addresses = _list; + return newState; +} + +BillingAddressState _onInsert(BillingAddressState state, Action action) { + final BillingAddress _address = action.payload; + final BillingAddressState newState = state.clone(); + final _list = newState.addresses.map((e) => e).toList(); + _list.insert(0, _address); + newState.addresses = _list; + return newState; +} + +BillingAddressState _onDelete(BillingAddressState state, Action action) { + final BillingAddress _address = action.payload; + final BillingAddressState newState = state.clone(); + final _list = newState.addresses.map((e) => e).toList(); + _list.remove(_address); + newState.addresses = _list; + return newState; +} diff --git a/lib/views/payment_page/components/billing_address_component/state.dart b/lib/views/payment_page/components/billing_address_component/state.dart new file mode 100644 index 00000000..60a650c5 --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/state.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; +import 'package:movie/views/payment_page/state.dart'; + +import 'create_address_component/state.dart'; + +class BillingAddressState implements Cloneable { + List addresses; + CreateAddressState createAddressState; + String customerId; + @override + BillingAddressState clone() { + return BillingAddressState() + ..addresses = addresses + ..customerId = customerId + ..createAddressState = createAddressState; + } +} + +class BillingAddressConnector + extends ConnOp { + @override + BillingAddressState get(PaymentPageState state) { + BillingAddressState mstate = state.billingAddressState; + return mstate; + } + + @override + void set(PaymentPageState state, BillingAddressState subState) { + state.billingAddressState = subState; + } +} diff --git a/lib/views/payment_page/components/billing_address_component/view.dart b/lib/views/payment_page/components/billing_address_component/view.dart new file mode 100644 index 00000000..64188d8b --- /dev/null +++ b/lib/views/payment_page/components/billing_address_component/view.dart @@ -0,0 +1,161 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/braintree_billing_address.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + BillingAddressState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.primaryColorDark, + appBar: AppBar( + backgroundColor: _theme.primaryColorDark, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + elevation: 0.0, + centerTitle: false, + title: Text( + 'Billing Address', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + actions: [ + _AddButton( + onTap: () => dispatch(BillingAddressActionCreator.onCreate()), + ), + ], + ), + body: Container( + margin: EdgeInsets.only(top: Adapt.px(20)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: state.addresses == null + ? Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(_theme.iconTheme.color), + ), + ) + : (state.addresses?.length ?? 0) > 0 + ? ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(40)), + itemBuilder: (_, index) => _AddressCell( + address: state.addresses[index], + onTap: (a) => + dispatch(BillingAddressActionCreator.onEdit(a)), + ), + separatorBuilder: (_, __) => Divider(), + itemCount: state.addresses?.length ?? 0, + ) + : const _EmptyListCell(), + ), + ); + }, + ); +} + +class _AddButton extends StatelessWidget { + final Function onTap; + const _AddButton({this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return InkWell( + onTap: onTap, + child: Container( + margin: EdgeInsets.only(right: Adapt.px(20)), + padding: EdgeInsets.all(Adapt.px(20)), + child: Center( + child: Text( + 'Add', + style: TextStyle( + color: _theme.textTheme.bodyText1.color, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ); + } +} + +class _AddressCell extends StatelessWidget { + final BillingAddress address; + final Function(BillingAddress) onTap; + const _AddressCell({this.address, this.onTap}); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(30)), + //height: Adapt.px(140), + decoration: BoxDecoration( + // color: const Color(0xFFF0F0F0), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${address?.firstName} ${address?.lastName}', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: Adapt.px(28)), + ), + SizedBox(height: Adapt.px(10)), + // Text(address?.countryCodeAlpha3 ?? ''), + Text(address?.streetAddress ?? ''), + Text( + '${address?.locality}, ${address?.region} ${address?.postalCode}'), + ], + ), + Expanded(child: SizedBox()), + GestureDetector( + onTap: () => onTap(address), + child: Container( + padding: EdgeInsets.all(Adapt.px(15)), + decoration: BoxDecoration( + border: Border.all(color: const Color(0xFF9E9E9E)), + borderRadius: BorderRadius.circular(Adapt.px(15))), + child: Icon( + FontAwesomeIcons.pen, + size: Adapt.px(20), + color: const Color(0xFF9E9E9E), + ), + ), + ), + ], + ), + ); + } +} + +class _EmptyListCell extends StatelessWidget { + const _EmptyListCell(); + @override + Widget build(BuildContext context) { + return const Center( + child: const Text( + 'Empty List', + style: TextStyle( + color: const Color(0xFF9E9E9E), + fontSize: 16, + ), + ), + ); + } +} diff --git a/lib/views/payment_page/components/create_card_component/action.dart b/lib/views/payment_page/components/create_card_component/action.dart new file mode 100644 index 00000000..c4d9cbd4 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/action.dart @@ -0,0 +1,36 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum CreateCardAction { + action, + nextTapped, + backTapped, + setInputIndex, + loading, + scan, +} + +class CreateCardActionCreator { + static Action onAction() { + return const Action(CreateCardAction.action); + } + + static Action nextTapped() { + return const Action(CreateCardAction.nextTapped); + } + + static Action backTapped() { + return const Action(CreateCardAction.backTapped); + } + + static Action setInputIndex(int index) { + return Action(CreateCardAction.setInputIndex, payload: index); + } + + static Action loading(bool loading) { + return Action(CreateCardAction.loading, payload: loading); + } + + static Action scan() { + return const Action(CreateCardAction.scan); + } +} diff --git a/lib/views/payment_page/components/create_card_component/component.dart b/lib/views/payment_page/components/create_card_component/component.dart new file mode 100644 index 00000000..1d8a44fb --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/scan_component/component.dart'; +import 'components/scan_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CreateCardComponent extends Component + with TickerProviderMixin { + CreateCardComponent() + : super( + view: buildView, + effect: buildEffect(), + reducer: buildReducer(), + dependencies: Dependencies( + adapter: null, + slots: >{ + 'scan': ScanConnector() + ScanComponent() + }), + ); +} diff --git a/lib/views/payment_page/components/create_card_component/components/scan_component/action.dart b/lib/views/payment_page/components/create_card_component/components/scan_component/action.dart new file mode 100644 index 00000000..2f9f481a --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/components/scan_component/action.dart @@ -0,0 +1,18 @@ +import 'package:camera/camera.dart'; +import 'package:fish_redux/fish_redux.dart'; + +enum ScanAction { action, updateController, takePicture } + +class ScanActionCreator { + static Action onAction() { + return const Action(ScanAction.action); + } + + static Action updateController(CameraController controller) { + return Action(ScanAction.updateController, payload: controller); + } + + static Action takePicture() { + return const Action(ScanAction.takePicture); + } +} diff --git a/lib/views/payment_page/components/create_card_component/components/scan_component/component.dart b/lib/views/payment_page/components/create_card_component/components/scan_component/component.dart new file mode 100644 index 00000000..902fdb20 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/components/scan_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class ScanComponent extends Component { + ScanComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/payment_page/components/create_card_component/components/scan_component/effect.dart b/lib/views/payment_page/components/create_card_component/components/scan_component/effect.dart new file mode 100644 index 00000000..74a0d418 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/components/scan_component/effect.dart @@ -0,0 +1,55 @@ +import 'dart:io'; + +import 'package:camera/camera.dart'; +import 'package:firebase_ml_vision/firebase_ml_vision.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:path_provider/path_provider.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + ScanAction.action: _onAction, + ScanAction.takePicture: _takePicture, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer(); +void _takePicture(Action action, Context ctx) async { + final Directory extDir = await getApplicationDocumentsDirectory(); + final String dirPath = '${extDir.path}/Pictures/flutter_test'; + await Directory(dirPath).create(recursive: true); + final String filePath = + '$dirPath/${DateTime.now().millisecondsSinceEpoch}.jpg'; + ctx.state.controller.takePicture(filePath).then((value) { + final _image = FirebaseVisionImage.fromFilePath(filePath); + _recognizer.processImage(_image).then((d) { + print(d.text); + }); + }); + /*ctx.state.controller.startImageStream((image) { + FirebaseVisionImage.fromBytes( + image.planes[0].bytes, + FirebaseVisionImageMetadata( + planeData: [], + rawFormat: image.format.raw, + size: Size(image.width.toDouble(), image.height.toDouble()))); + });*/ +} + +void _onInit(Action action, Context ctx) async { + final _cameras = await availableCameras(); + if (_cameras.length > 0) { + final _controller = CameraController(_cameras[0], ResolutionPreset.medium); + _controller..initialize(); + ctx.dispatch(ScanActionCreator.updateController(_controller)); + } +} + +void _onDispose(Action action, Context ctx) { + ctx.state.controller?.dispose(); +} diff --git a/lib/views/payment_page/components/create_card_component/components/scan_component/reducer.dart b/lib/views/payment_page/components/create_card_component/components/scan_component/reducer.dart new file mode 100644 index 00000000..4f91d40b --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/components/scan_component/reducer.dart @@ -0,0 +1,26 @@ +import 'package:camera/camera.dart'; +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + ScanAction.action: _onAction, + ScanAction.updateController: _updateController + }, + ); +} + +ScanState _onAction(ScanState state, Action action) { + final ScanState newState = state.clone(); + return newState; +} + +ScanState _updateController(ScanState state, Action action) { + final CameraController _controller = action.payload; + final ScanState newState = state.clone(); + newState.controller = _controller; + return newState; +} diff --git a/lib/views/payment_page/components/create_card_component/components/scan_component/state.dart b/lib/views/payment_page/components/create_card_component/components/scan_component/state.dart new file mode 100644 index 00000000..759a66a5 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/components/scan_component/state.dart @@ -0,0 +1,24 @@ +import 'package:camera/camera.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/payment_page/components/create_card_component/state.dart'; + +class ScanState implements Cloneable { + CameraController controller; + @override + ScanState clone() { + return ScanState()..controller = controller; + } +} + +class ScanConnector extends ConnOp { + @override + ScanState get(CreateCardState state) { + ScanState mstate = state.scanState; + return mstate; + } + + @override + void set(CreateCardState state, ScanState subState) { + state.scanState = subState; + } +} diff --git a/lib/views/payment_page/components/create_card_component/components/scan_component/view.dart b/lib/views/payment_page/components/create_card_component/components/scan_component/view.dart new file mode 100644 index 00000000..2afda2b2 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/components/scan_component/view.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:camera/camera.dart'; +import 'action.dart'; +import 'state.dart'; + +Widget buildView(ScanState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + appBar: AppBar(), + body: Column( + children: [ + state.controller != null + ? AspectRatio( + aspectRatio: state.controller.value.aspectRatio, + child: CameraPreview(state.controller)) + : SizedBox(), + FlatButton( + onPressed: () => dispatch(ScanActionCreator.takePicture()), + child: Text('take a picture')) + ], + ), + ); +} diff --git a/lib/views/payment_page/components/create_card_component/effect.dart b/lib/views/payment_page/components/create_card_component/effect.dart new file mode 100644 index 00000000..2cafe1ac --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/effect.dart @@ -0,0 +1,147 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/actions/creditcard_verify.dart'; +import 'package:movie/models/base_api_model/braintree_creditcard.dart'; +import 'package:movie/views/payment_page/action.dart'; +import 'package:movie/views/payment_page/components/create_card_component/components/scan_component/state.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CreateCardAction.action: _onAction, + CreateCardAction.nextTapped: _nextTapped, + CreateCardAction.backTapped: _backTapped, + CreateCardAction.scan: _onScan, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} +final _cardVerify = CreditCardVerify(); +void _nextTapped(Action action, Context ctx) async { + switch (ctx.state.inputIndex) { + case 0: + if (_cardVerify.verify(ctx.state.cardNumberController.text) == '-' || + ctx.state.cardNumberController.text.length < 16) return; + ctx.state.inputIndex++; + ctx.dispatch(CreateCardActionCreator.setInputIndex(ctx.state.inputIndex)); + ctx.state.swiperController + .next() + .then((value) => ctx.state.cardNumberFocusNode.nextFocus()); + break; + case 1: + if (ctx.state.holderNameController.text.isEmpty || + ctx.state.holderNameController.text.length < 4) return; + + ctx.state.inputIndex++; + ctx.state.swiperController + .next() + .then((value) => ctx.state.holderNameFocusNode.nextFocus()); + + break; + case 2: + if (ctx.state.expriedDateController.text.isEmpty || + ctx.state.expriedDateController.text.length < 3) return; + + ctx.state.inputIndex++; + ctx.dispatch(CreateCardActionCreator.setInputIndex(ctx.state.inputIndex)); + ctx.state.animationController.forward(); + ctx.state.swiperController + .next() + .then((value) => ctx.state.expriedDaterFocusNode.nextFocus()); + + break; + case 3: + if (ctx.state.cvvController.text.isEmpty || + ctx.state.cvvController.text.length < 2) return; + ctx.state.cvvFocusNode.unfocus(); + ctx.dispatch(CreateCardActionCreator.loading(true)); + final _baseApi = BaseApi.instance; + final _r = await _baseApi.createCreditCard(CreditCard.fromParams( + customerId: ctx.state.customerId, + expirationMonth: ctx.state.expriedDateController.text.substring(0, 2), + expirationYear: ctx.state.expriedDateController.text.substring(2, 4), + maskedNumber: ctx.state.cardNumberController.text, + cardholderName: ctx.state.holderNameController.text, + bin: ctx.state.cvvController.text, + )); + if (_r.success) { + if (_r.result['status']) { + final _card = CreditCard(_r.result['data']); + ctx.dispatch(PaymentPageActionCreator.insertCreditCard(_card)); + Navigator.of(ctx.context).pop(); + } else + Toast.show(_r.result['message'], ctx.context, duration: 5); + } + + ctx.dispatch(CreateCardActionCreator.loading(false)); + break; + } +} + +void _backTapped(Action action, Context ctx) async { + switch (ctx.state.inputIndex) { + case 1: + ctx.state.inputIndex--; + ctx.dispatch(CreateCardActionCreator.setInputIndex(ctx.state.inputIndex)); + ctx.state.swiperController + .previous() + .then((value) => ctx.state.holderNameFocusNode.previousFocus()); + break; + case 2: + ctx.state.inputIndex--; + ctx.state.swiperController + .previous() + .then((value) => ctx.state.expriedDaterFocusNode.previousFocus()); + + break; + case 3: + ctx.state.animationController.reverse(); + ctx.state.inputIndex--; + ctx.dispatch(CreateCardActionCreator.setInputIndex(ctx.state.inputIndex)); + ctx.state.swiperController + .previous() + .then((value) => ctx.state.cvvFocusNode.previousFocus()); + break; + } +} + +void _onScan(Action action, Context ctx) async { + ctx.state.scanState = ScanState(); + await Navigator.of(ctx.context).push( + MaterialPageRoute(builder: (context) => ctx.buildComponent('scan'))); +} + +void _onInit(Action action, Context ctx) async { + ctx.state.inputIndex = 0; + ctx.state.swiperController = SwiperController(); + ctx.state.cardNumberController = TextEditingController(); + ctx.state.holderNameController = TextEditingController(); + ctx.state.expriedDateController = TextEditingController(); + ctx.state.cvvController = TextEditingController(); + ctx.state.cardNumberFocusNode = FocusNode(); + ctx.state.holderNameFocusNode = FocusNode(); + ctx.state.expriedDaterFocusNode = FocusNode(); + ctx.state.cvvFocusNode = FocusNode(); + final Object _ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: _ticker, duration: Duration(milliseconds: 600)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.swiperController.dispose(); + ctx.state.cardNumberController.dispose(); + ctx.state.holderNameController.dispose(); + ctx.state.expriedDateController.dispose(); + ctx.state.cvvController.dispose(); + ctx.state.animationController.dispose(); + ctx.state.cardNumberFocusNode.dispose(); + ctx.state.expriedDaterFocusNode.dispose(); + ctx.state.cvvFocusNode.dispose(); + ctx.state.holderNameFocusNode.dispose(); +} diff --git a/lib/views/payment_page/components/create_card_component/reducer.dart b/lib/views/payment_page/components/create_card_component/reducer.dart new file mode 100644 index 00000000..313d7bf7 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/reducer.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CreateCardAction.action: _onAction, + CreateCardAction.setInputIndex: _setInputIndex, + CreateCardAction.loading: _loading, + }, + ); +} + +CreateCardState _onAction(CreateCardState state, Action action) { + final CreateCardState newState = state.clone(); + return newState; +} + +CreateCardState _setInputIndex(CreateCardState state, Action action) { + final int _index = action.payload; + final CreateCardState newState = state.clone(); + newState.inputIndex = _index; + return newState; +} + +CreateCardState _loading(CreateCardState state, Action action) { + final bool _loading = action.payload ?? false; + final CreateCardState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/payment_page/components/create_card_component/state.dart b/lib/views/payment_page/components/create_card_component/state.dart new file mode 100644 index 00000000..12688af5 --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/state.dart @@ -0,0 +1,55 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/views/payment_page/state.dart'; + +import 'components/scan_component/state.dart'; + +class CreateCardState implements Cloneable { + String customerId; + AnimationController animationController; + TextEditingController cardNumberController; + TextEditingController holderNameController; + TextEditingController expriedDateController; + TextEditingController cvvController; + FocusNode cardNumberFocusNode; + FocusNode holderNameFocusNode; + FocusNode expriedDaterFocusNode; + FocusNode cvvFocusNode; + SwiperController swiperController; + int inputIndex; + bool loading; + ScanState scanState; + + @override + CreateCardState clone() { + return CreateCardState() + ..customerId = customerId + ..animationController = animationController + ..cardNumberController = cardNumberController + ..holderNameController = holderNameController + ..expriedDateController = expriedDateController + ..cvvController = cvvController + ..cardNumberFocusNode = cardNumberFocusNode + ..holderNameFocusNode = holderNameFocusNode + ..expriedDaterFocusNode = expriedDaterFocusNode + ..cvvFocusNode = cvvFocusNode + ..swiperController = swiperController + ..inputIndex = inputIndex + ..loading = loading + ..scanState = scanState; + } +} + +class CreateCardConnector extends ConnOp { + @override + CreateCardState get(PaymentPageState state) { + CreateCardState mstate = state.createCardState; + return mstate; + } + + @override + void set(PaymentPageState state, CreateCardState subState) { + state.createCardState = subState; + } +} diff --git a/lib/views/payment_page/components/create_card_component/view.dart b/lib/views/payment_page/components/create_card_component/view.dart new file mode 100644 index 00000000..edb08dbb --- /dev/null +++ b/lib/views/payment_page/components/create_card_component/view.dart @@ -0,0 +1,779 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/creditcard_verify.dart'; +import 'package:movie/widgets/loading_layout.dart'; +import 'package:movie/style/themestyle.dart'; +import 'dart:math' as math; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CreateCardState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Stack( + children: [ + Scaffold( + backgroundColor: _theme.primaryColorDark, + appBar: AppBar( + backgroundColor: _theme.primaryColorDark, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + elevation: 0.0, + centerTitle: false, + title: Text( + 'Add Card', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + actions: [ + _ScanButton( + onTap: () => dispatch(CreateCardActionCreator.scan()), + ) + ], + ), + body: Container( + margin: EdgeInsets.only(top: Adapt.px(20)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(430)), + Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(50)), + child: Text( + 'Type in your card details:', + style: TextStyle( + fontSize: Adapt.px(45), fontWeight: FontWeight.w600), + ), + ), + _InputPanel( + cardNumberController: state.cardNumberController, + holderNameController: state.holderNameController, + expriedDateController: state.expriedDateController, + cvvController: state.cvvController, + swiperController: state.swiperController, + cardNumberFocusNode: state.cardNumberFocusNode, + holderNameFocusNode: state.holderNameFocusNode, + expriedDaterFocusNode: state.expriedDaterFocusNode, + cvvFocusNode: state.cvvFocusNode, + onSubmitted: () => + dispatch(CreateCardActionCreator.nextTapped()), + ), + SizedBox(height: Adapt.px(10)), + _ButtonGroup( + currectIndex: state.inputIndex, + onBackPressed: () => + dispatch(CreateCardActionCreator.backTapped()), + onNextPressed: () => + dispatch(CreateCardActionCreator.nextTapped()), + ) + ], + ), + ), + ), + Container( + padding: EdgeInsets.only(top: Adapt.padTopH() + Adapt.px(180)), + child: Material( + color: null, + child: _CardCell( + controller: state.animationController, + cardNumberController: state.cardNumberController, + holderNameController: state.holderNameController, + expriedDateController: state.expriedDateController, + cvvController: state.cvvController, + ), + )), + LoadingLayout( + title: 'Saving', + show: state.loading, + ) + ], + ); + }, + ); +} + +class _ScanButton extends StatelessWidget { + final Function onTap; + const _ScanButton({this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Container( + width: Adapt.px(120), + height: Adapt.px(50), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.circular(Adapt.px(25))), + margin: EdgeInsets.only( + right: Adapt.px(40), top: Adapt.px(15), bottom: Adapt.px(15)), + child: Icon( + Icons.camera_alt, + color: const Color(0xFFA0A0A0), + ), + ), + ); + } +} + +class _CardCell extends StatelessWidget { + final AnimationController controller; + final TextEditingController cardNumberController; + final TextEditingController holderNameController; + final TextEditingController expriedDateController; + final TextEditingController cvvController; + const _CardCell( + {this.controller, + this.cardNumberController, + this.expriedDateController, + this.holderNameController, + this.cvvController}); + @override + Widget build(BuildContext context) { + final animation = Tween(begin: 0, end: 180.0).animate( + CurvedAnimation( + parent: controller, curve: Interval(0, 1, curve: Curves.ease))); + return AnimatedBuilder( + animation: animation, + builder: (_, __) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Transform( + alignment: Alignment.center, + transform: Matrix4.identity() + ..setEntry(3, 2, 0.0025) + ..rotateY(math.pi * animation.value / 180), + child: animation.value < 90 + ? _CardFrontPanel( + controller: controller, + cardNumberController: cardNumberController, + holderNameController: holderNameController, + expriedDateController: expriedDateController, + ) + : _CardBackPanel( + cardNumberController: cardNumberController, + cvvController: cvvController, + ), + ), + ); + }); + } +} + +class _CardFrontPanel extends StatefulWidget { + final AnimationController controller; + final TextEditingController cardNumberController; + final TextEditingController holderNameController; + final TextEditingController expriedDateController; + const _CardFrontPanel({ + this.controller, + this.cardNumberController, + this.expriedDateController, + this.holderNameController, + }); + @override + _CardFrontPanelState createState() => _CardFrontPanelState(); +} + +class _CardFrontPanelState extends State<_CardFrontPanel> { + String _cardNumber = 'XXXXXXXXXXXXXXXX'; + String _hoster = 'XXX XXX'; + String _expried = 'MMYY'; + String _cardType = '-'; + final CreditCardVerify _cardVerify = CreditCardVerify(); + + final _creditCardTheme = { + 'Visa': ['images/visa_logo.png', const Color(0xFF8085C1)], + 'JCB': ['images/jcb_logo.png', const Color(0xFFE394A2)], + 'Discover': ['images/discover_logo.png', const Color(0XFF66AA9E)], + 'MasterCard': ['images/mastercard_logo.png', const Color(0xFF252529)], + '-': ['images/visa_logo.png', const Color(0xFF556677)], + }; + @override + void initState() { + _setCreditCardNumber(); + _setHolder(); + _setExpriedDate(); + widget.cardNumberController.addListener(_setCreditCardNumber); + widget.holderNameController.addListener(_setHolder); + widget.expriedDateController.addListener(_setExpriedDate); + super.initState(); + } + + @override + void dispose() { + widget.cardNumberController.removeListener(_setCreditCardNumber); + widget.holderNameController.removeListener(_setHolder); + widget.expriedDateController.removeListener(_setExpriedDate); + super.dispose(); + } + + _setCreditCardNumber() { + if (widget.cardNumberController.text.isEmpty) + _cardNumber = 'XXXXXXXXXXXXXXXX'; + else { + String _text = widget.cardNumberController.text; + int _lenght = _text.length; + if (_lenght < 16) { + for (int i = 0; i < 16 - _lenght; i++) { + _text = _text + 'X'; + } + } + _cardNumber = _text; + _cardType = _cardVerify.verify(widget.cardNumberController.text); + } + setState(() {}); + } + + _setHolder() { + if (widget.holderNameController.text.isEmpty) + _hoster = 'XXX XXX'; + else + _hoster = widget.holderNameController.text; + setState(() {}); + } + + _setExpriedDate() { + if (widget.expriedDateController.text.isEmpty) + _expried = 'MMYY'; + else { + int _lenght = widget.expriedDateController.text.length; + String _text = widget.expriedDateController.text; + if (_lenght < 4) { + for (int i = 0; i < 4 - _lenght; i++) { + if (_lenght + i < 2) + _text = _text + 'M'; + else + _text = _text + 'Y'; + } + } + _expried = _text; + } + setState(() {}); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Stack(children: [ + AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: Container( + key: ValueKey('value$_cardType'), + width: Adapt.screenW() - Adapt.px(80), + height: Adapt.px(380), + padding: EdgeInsets.all(Adapt.px(40)), + alignment: Alignment.topRight, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + blurRadius: Adapt.px(20), + color: _theme.brightness == Brightness.light + ? _theme.primaryColorDark + : const Color(0x00000000), + offset: Offset(0, Adapt.px(10)), + ), + ], + color: _creditCardTheme[_cardType][1], + borderRadius: BorderRadius.circular(Adapt.px(30)), + ), + child: _cardType == '-' + ? Container( + height: Adapt.px(60), + width: Adapt.px(60), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF667788), + ), + ) + : Image.asset( + _creditCardTheme[_cardType][0], + alignment: Alignment.centerRight, + width: Adapt.px(120), + height: Adapt.px(50), + ), + )), + Container( + width: Adapt.screenW() - Adapt.px(80), + height: Adapt.px(380), + padding: EdgeInsets.all(Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + SizedBox(height: Adapt.px(50)), + const Spacer(), + Container( + padding: EdgeInsets.all(Adapt.px(10)), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + _cardNumber.substring(0, 4), + style: TextStyle( + color: Color(0xFFFFFFFF), fontSize: Adapt.px(40)), + ), + Text( + _cardNumber.substring(4, 8), + style: TextStyle( + color: Color(0xFFFFFFFF), fontSize: Adapt.px(40)), + ), + Text( + _cardNumber.substring(8, 12), + style: TextStyle( + color: Color(0xFFFFFFFF), fontSize: Adapt.px(40)), + ), + Text( + _cardNumber.substring(12, 16), + style: TextStyle( + color: Color(0xFFFFFFFF), fontSize: Adapt.px(40)), + ) + ], + ), + ), + Expanded(child: SizedBox()), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Padding( + padding: EdgeInsets.only(left: Adapt.px(8)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'HOLDER NAME', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: Adapt.px(20)), + ), + SizedBox(height: Adapt.px(8)), + Text( + _hoster, + style: TextStyle(color: const Color(0xFFD0D0D0)), + ) + ], + )), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + 'EXPRIED DATE', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: Adapt.px(20)), + ), + SizedBox(height: Adapt.px(8)), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${_expried.substring(0, 2)}/${_expried.substring(2, 4)}', + style: TextStyle(color: const Color(0xFFD0D0D0)), + ) + ]) + ], + ), + ]), + ], + )) + ]); + } +} + +class _CardBackPanel extends StatefulWidget { + final TextEditingController cardNumberController; + final TextEditingController cvvController; + const _CardBackPanel({this.cvvController, this.cardNumberController}); + @override + _CardBackPanelState createState() => _CardBackPanelState(); +} + +class _CardBackPanelState extends State<_CardBackPanel> { + String _cvv = 'XXX'; + final CreditCardVerify _cardVerify = CreditCardVerify(); + String _cardType; + final _creditCardTheme = { + 'Visa': ['images/visa_logo.png', const Color(0xFF8085C1)], + 'JCB': ['images/jcb_logo.png', const Color(0xFFE394A2)], + 'Discover': ['images/discover_logo.png', const Color(0XFF66AA9E)], + 'MasterCard': ['images/mastercard_logo.png', const Color(0xFF252529)], + '-': ['images/visa_logo.png', const Color(0xFF556677)], + }; + @override + void initState() { + _cardType = _cardVerify.verify(widget.cardNumberController.text); + _setCVV(); + widget.cvvController.addListener(_setCVV); + super.initState(); + } + + @override + void dispose() { + widget.cvvController.removeListener(_setCVV); + super.dispose(); + } + + _setCVV() { + if (widget.cvvController.text.isEmpty) + _cvv = 'XXX'; + else { + int _lenght = widget.cvvController.text.length; + String _text = widget.cvvController.text; + if (_lenght < 3) { + for (int i = 0; i < 3 - _lenght; i++) { + _text = _text + 'X'; + } + } + _cvv = _text; + } + setState(() {}); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Transform( + alignment: Alignment.center, + transform: Matrix4.identity()..rotateY(math.pi), + child: Container( + width: Adapt.screenW() - Adapt.px(80), + height: Adapt.px(380), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + blurRadius: Adapt.px(20), + color: _theme.brightness == Brightness.light + ? _theme.primaryColorDark + : const Color(0x00000000), + offset: Offset(0, Adapt.px(10))) + ], + color: _creditCardTheme[_cardType][1], + borderRadius: BorderRadius.circular(Adapt.px(30)), + ), + child: Container( + child: Column(children: [ + SizedBox(height: Adapt.px(40)), + Container( + height: Adapt.px(80), + color: const Color(0xFF000000), + ), + SizedBox(height: Adapt.px(30)), + Row(children: [ + SizedBox(width: Adapt.px(30)), + Container( + width: Adapt.screenW() - Adapt.px(350), + height: Adapt.px(60), + decoration: BoxDecoration( + borderRadius: BorderRadius.horizontal( + left: Radius.circular(Adapt.px(10)), + ), + color: Color(0xFFD0D0D0)), + ), + Container( + width: Adapt.px(80), + height: Adapt.px(60), + decoration: BoxDecoration( + borderRadius: BorderRadius.horizontal( + right: Radius.circular(Adapt.px(10))), + color: Color(0xFFFFFFFF), + ), + child: Center(child: Text(_cvv)), + ), + ]), + Expanded(child: SizedBox()), + Container( + padding: EdgeInsets.only(right: Adapt.px(30)), + alignment: Alignment.topRight, + child: Image.asset( + _creditCardTheme[_cardType][0], + alignment: Alignment.centerRight, + height: Adapt.px(50), + width: Adapt.px(120), + ), + ), + SizedBox(height: Adapt.px(30)) + ]), + ), + ), + ); + } +} + +class _InputPanel extends StatelessWidget { + final TextEditingController cardNumberController; + final TextEditingController holderNameController; + final TextEditingController expriedDateController; + final TextEditingController cvvController; + + final FocusNode cardNumberFocusNode; + final FocusNode holderNameFocusNode; + final FocusNode expriedDaterFocusNode; + final FocusNode cvvFocusNode; + final SwiperController swiperController; + final Function onSubmitted; + const _InputPanel( + {this.cardNumberController, + this.cvvController, + this.expriedDateController, + this.holderNameController, + this.swiperController, + this.cardNumberFocusNode, + this.cvvFocusNode, + this.expriedDaterFocusNode, + this.holderNameFocusNode, + this.onSubmitted}); + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(190), + child: Swiper( + controller: swiperController, + physics: NeverScrollableScrollPhysics(), + viewportFraction: 0.9, + loop: false, + fade: 0.2, + itemCount: 4, + itemBuilder: (_, index) { + Widget _child; + switch (index) { + case 0: + _child = _CreditCardTextField( + controller: cardNumberController, + focusNode: cardNumberFocusNode, + textInputAction: TextInputAction.next, + onSubmitted: onSubmitted, + ); + break; + case 1: + _child = _CustomTextField( + title: 'Holder Name', + controller: holderNameController, + focusNode: holderNameFocusNode, + onSubmitted: onSubmitted, + textInputAction: TextInputAction.next, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp("[a-zA-Z ]")) + ], + ); + break; + case 2: + _child = _CustomTextField( + title: 'Expried Date', + maxLength: 4, + inputType: TextInputType.number, + controller: expriedDateController, + focusNode: expriedDaterFocusNode, + textInputAction: TextInputAction.next, + onSubmitted: onSubmitted, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'\d+')) + ], + ); + break; + case 3: + _child = _CustomTextField( + title: 'CVV', + maxLength: 3, + inputType: TextInputType.number, + controller: cvvController, + focusNode: cvvFocusNode, + onSubmitted: onSubmitted, + textInputAction: TextInputAction.done, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'\d+')) + ], + ); + break; + default: + _child = SizedBox(); + break; + } + return _child; + }, + ), + ); + } +} + +class _CustomTextField extends StatelessWidget { + final String title; + final double width; + final int maxLength; + final TextInputType inputType; + final TextEditingController controller; + final FocusNode focusNode; + final TextInputAction textInputAction; + final List inputFormatters; + final String errorText; + final Function onSubmitted; + const _CustomTextField( + {this.title, + this.width, + this.controller, + this.focusNode, + this.maxLength, + this.inputType, + this.inputFormatters, + this.textInputAction, + this.onSubmitted, + this.errorText}); + @override + Widget build(BuildContext context) { + final _intputBorder = OutlineInputBorder( + borderRadius: BorderRadius.circular(Adapt.px(20)), + borderSide: BorderSide(color: const Color(0xFF9E9E9E))); + final _errorBorder = OutlineInputBorder( + borderRadius: BorderRadius.circular(Adapt.px(20)), + borderSide: BorderSide(color: const Color(0xFFFF00000))); + return Container( + width: width ?? Adapt.screenW(), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: TextStyle( + fontSize: Adapt.px(30), color: const Color(0xFF9E9E9E))), + SizedBox(height: Adapt.px(20)), + TextField( + controller: controller, + focusNode: focusNode, + cursorColor: const Color(0xFF9E9E9E), + maxLength: maxLength, + keyboardType: inputType, + inputFormatters: inputFormatters, + textInputAction: textInputAction, + //onSubmitted: (s) => onSubmitted, + onEditingComplete: onSubmitted, + decoration: InputDecoration( + counter: SizedBox(), + errorText: errorText, + errorBorder: _errorBorder, + focusedErrorBorder: _errorBorder, + contentPadding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(20)), + enabledBorder: _intputBorder, + disabledBorder: _intputBorder, + focusedBorder: _intputBorder, + ), + ), + ], + ), + ); + } +} + +class _CreditCardTextField extends StatefulWidget { + final TextEditingController controller; + final FocusNode focusNode; + final TextInputAction textInputAction; + + final Function onSubmitted; + + const _CreditCardTextField( + {this.controller, + this.focusNode, + this.textInputAction, + this.onSubmitted}); + @override + _CreditCardTextFieldState createState() => _CreditCardTextFieldState(); +} + +class _CreditCardTextFieldState extends State<_CreditCardTextField> { + final CreditCardVerify _cardVerify = CreditCardVerify(); + bool error; + @override + void initState() { + error = false; + widget.controller.addListener(_checkCardNumber); + super.initState(); + } + + @override + void dispose() { + widget.controller.removeListener(_checkCardNumber); + super.dispose(); + } + + _checkCardNumber() { + error = _cardVerify.verify(widget.controller.text) == '-' && + widget.controller.text.length == 16; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return _CustomTextField( + title: 'Card Number', + maxLength: 16, + inputType: TextInputType.number, + controller: widget.controller, + focusNode: widget.focusNode, + textInputAction: widget.textInputAction, + onSubmitted: widget.onSubmitted, + inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'\d+'))], + errorText: error ? 'invalid card number' : null, + ); + } +} + +class _ButtonGroup extends StatelessWidget { + final int currectIndex; + final Function onNextPressed; + final Function onBackPressed; + const _ButtonGroup( + {this.currectIndex, this.onBackPressed, this.onNextPressed}); + @override + Widget build(BuildContext context) { + return Row( + children: [ + currectIndex != 0 + ? GestureDetector( + onTap: onBackPressed, + child: Container( + height: Adapt.px(80), + width: Adapt.px(80), + margin: EdgeInsets.only(left: Adapt.px(60)), + decoration: BoxDecoration( + border: Border.all(color: const Color(0xFFE0E0E0)), + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: Icon( + Icons.chevron_left, + color: const Color(0xFFE0E0E0), + ), + ), + ) + : SizedBox(), + Expanded(child: SizedBox()), + GestureDetector( + onTap: onNextPressed, + child: Container( + height: Adapt.px(80), + width: Adapt.px(120), + margin: EdgeInsets.only(right: Adapt.px(60)), + decoration: BoxDecoration( + color: Color(0xFF303030), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: Center( + child: Text( + currectIndex != 3 ? 'Next' : 'Done', + style: TextStyle(color: const Color(0xFFFFFFFF)), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/views/payment_page/components/history_component/action.dart b/lib/views/payment_page/components/history_component/action.dart new file mode 100644 index 00000000..fb0468f2 --- /dev/null +++ b/lib/views/payment_page/components/history_component/action.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; + +enum HistoryAction { + action, + setTransactions, + loading, +} + +class HistoryActionCreator { + static Action onAction() { + return const Action(HistoryAction.action); + } + + static Action setTransactions(TransactionModel transactions) { + return Action(HistoryAction.setTransactions, payload: transactions); + } + + static Action loading(bool loading) { + return Action(HistoryAction.loading, payload: loading); + } +} diff --git a/lib/views/payment_page/components/history_component/component.dart b/lib/views/payment_page/components/history_component/component.dart new file mode 100644 index 00000000..47fd8463 --- /dev/null +++ b/lib/views/payment_page/components/history_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HistoryComponent extends Component { + HistoryComponent() + : super( + view: buildView, + effect: buildEffect(), + reducer: buildReducer(), + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/payment_page/components/history_component/effect.dart b/lib/views/payment_page/components/history_component/effect.dart new file mode 100644 index 00000000..6f68a2aa --- /dev/null +++ b/lib/views/payment_page/components/history_component/effect.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HistoryAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + if (ctx.state.transactions == null) { + ctx.dispatch(HistoryActionCreator.loading(true)); + final _baseApi = BaseApi.instance; + final _transaction = + await _baseApi.transactionSearch(ctx.state.user.firebaseUser.uid); + print(_transaction.toString()); + if (_transaction.success) + ctx.dispatch(HistoryActionCreator.setTransactions(_transaction.result)); + ctx.dispatch(HistoryActionCreator.loading(false)); + } +} + +void _onDispose(Action action, Context ctx) {} diff --git a/lib/views/payment_page/components/history_component/reducer.dart b/lib/views/payment_page/components/history_component/reducer.dart new file mode 100644 index 00000000..8df2dcf7 --- /dev/null +++ b/lib/views/payment_page/components/history_component/reducer.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HistoryAction.action: _onAction, + HistoryAction.setTransactions: _setTransactions, + HistoryAction.loading: _loading, + }, + ); +} + +HistoryState _onAction(HistoryState state, Action action) { + final HistoryState newState = state.clone(); + return newState; +} + +HistoryState _setTransactions(HistoryState state, Action action) { + final TransactionModel _transasctions = action.payload; + final HistoryState newState = state.clone(); + newState.transactions = _transasctions; + return newState; +} + +HistoryState _loading(HistoryState state, Action action) { + final bool _loading = action.payload ?? false; + final HistoryState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/payment_page/components/history_component/state.dart b/lib/views/payment_page/components/history_component/state.dart new file mode 100644 index 00000000..7e835182 --- /dev/null +++ b/lib/views/payment_page/components/history_component/state.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; +import 'package:movie/views/payment_page/state.dart'; + +class HistoryState implements Cloneable { + TransactionModel transactions; + AppUser user; + bool loading; + @override + HistoryState clone() { + return HistoryState() + ..transactions = transactions + ..loading = loading + ..user = user; + } +} + +class HistoryConnector extends ConnOp { + @override + HistoryState get(PaymentPageState state) { + HistoryState mstate = HistoryState(); + mstate.transactions = state.transactions; + mstate.user = state.user; + mstate.loading = state.loading; + return mstate; + } + + @override + void set(PaymentPageState state, HistoryState subState) { + state.transactions = subState.transactions; + state.loading = subState.loading; + } +} diff --git a/lib/views/payment_page/components/history_component/view.dart b/lib/views/payment_page/components/history_component/view.dart new file mode 100644 index 00000000..ea0f4794 --- /dev/null +++ b/lib/views/payment_page/components/history_component/view.dart @@ -0,0 +1,140 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + HistoryState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.primaryColorDark, + appBar: AppBar( + backgroundColor: _theme.primaryColorDark, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + elevation: 0.0, + centerTitle: false, + title: Text('Payment History', + style: TextStyle(color: _theme.textTheme.bodyText1.color)), + ), + body: Container( + margin: EdgeInsets.only(top: Adapt.px(20)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: + BorderRadius.vertical(top: Radius.circular(Adapt.px(60))), + ), + child: Column( + children: [ + Expanded( + child: state.loading + ? Center( + child: CircularProgressIndicator( + valueColor: + AlwaysStoppedAnimation(_theme.iconTheme.color), + ), + ) + : (state.transactions?.list?.length ?? 0) > 0 + ? ListView.separated( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), + vertical: Adapt.px(40)), + itemBuilder: (_, index) => _TransactionCell( + data: state.transactions?.list[index]), + separatorBuilder: (_, __) => + SizedBox(height: Adapt.px(20)), + itemCount: state.transactions?.list?.length ?? 0) + : const Center( + child: const Text( + 'Empty List', + style: TextStyle( + color: const Color(0xFF9E9E9E), fontSize: 16), + ), + ), + ) + ], + ), + ), + ); + }, + ); +} + +class _TransactionCell extends StatelessWidget { + final Transaction data; + const _TransactionCell({this.data}); + @override + Widget build(BuildContext context) { + final _icons = { + 'Visa': [FontAwesomeIcons.ccVisa, const Color(0xFFAABBFF)], + 'JCB': [FontAwesomeIcons.ccJcb, const Color(0xFFAADDDD)], + 'Discover': [FontAwesomeIcons.ccDiscover, const Color(0xFFBBCCDD)], + 'MasterCard': [FontAwesomeIcons.ccMastercard, const Color(0xFF306080)], + 'PayPal': [FontAwesomeIcons.paypal, const Color(0xFF20A5F0)], + 'GooglePay': [FontAwesomeIcons.google, const Color(0xFF506070)], + 'ApplePay': [FontAwesomeIcons.applePay, const Color(0xFF505050)], + '-': [FontAwesomeIcons.carCrash, const Color(0xFF000000)] + }; + String name; + String type = '-'; + if (data.creditCard.lastFour != null) { + name = '**** **** **** ${data.creditCard.lastFour}'; + type = data.creditCard.cardType.value; + } else if (data.payPalDetails != null) { + name = data.payPalDetails.payerEmail; + type = 'PayPal'; + } else if (data.androidPayDetails != null) { + name = '**** **** **** ${data.androidPayDetails.last4}'; + type = 'GooglePay'; + } else if (data.androidPayDetails != null) { + name = '**** **** **** ${data.androidPayDetails.last4}'; + type = 'GooglePay'; + } + return Container( + height: Adapt.px(150), + //color: const Color(0xFFF0E0C0), + child: Row( + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + color: _icons[type][1], + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: Icon( + _icons[type][0], + color: const Color(0xFFFFFFFF), + size: Adapt.px(30), + ), + ), + SizedBox(width: Adapt.px(40)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: Adapt.screenW() - Adapt.px(300), + child: Text(name ?? '-'), + ), + Text( + DateFormat.yMMMd().format(DateTime.parse(data.createdAt)), + style: TextStyle( + color: const Color(0xFF9E9E9E), fontSize: Adapt.px(20)), + ), + ], + ), + Expanded(child: SizedBox()), + Text('\$${data.amount}') + ], + ), + ); + } +} diff --git a/lib/views/payment_page/effect.dart b/lib/views/payment_page/effect.dart new file mode 100644 index 00000000..e45f12e0 --- /dev/null +++ b/lib/views/payment_page/effect.dart @@ -0,0 +1,53 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PaymentPageAction.action: _onAction, + PaymentPageAction.showHistory: _showHistory, + PaymentPageAction.showBillingAddress: _showBillingAddress, + PaymentPageAction.createCard: _createCard, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + ctx.state.swiperController = SwiperController(); + if (ctx.state.user == null) return; + ctx.state.billingAddressState.customerId = ctx.state.user.firebaseUser.uid; + final _baseApi = BaseApi.instance; + final _customer = + await _baseApi.getBraintreeCustomer(ctx.state.user.firebaseUser.uid); + if (_customer.success) + ctx.dispatch(PaymentPageActionCreator.setCustomer(_customer.result)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.swiperController.dispose(); +} + +void _showHistory(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .push(MaterialPageRoute(builder: (_) => ctx.buildComponent('history'))); +} + +void _showBillingAddress(Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + MaterialPageRoute(builder: (_) => ctx.buildComponent('billingAddress'))); +} + +void _createCard(Action action, Context ctx) async { + // if (ctx.state.customer != null && ctx.state.user?.firebaseUser != null) { + ctx.state.createCardState.customerId = ctx.state.user.firebaseUser.uid; + ctx.state.createCardState.loading = false; + await Navigator.of(ctx.context).push( + MaterialPageRoute(builder: (_) => ctx.buildComponent('createCard'))); + //} +} diff --git a/lib/views/payment_page/page.dart b/lib/views/payment_page/page.dart new file mode 100644 index 00000000..76c51998 --- /dev/null +++ b/lib/views/payment_page/page.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/billing_address_component/component.dart'; +import 'components/billing_address_component/state.dart'; +import 'components/create_card_component/component.dart'; +import 'components/create_card_component/state.dart'; +import 'components/history_component/component.dart'; +import 'components/history_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PaymentPage extends Page> { + PaymentPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'createCard': CreateCardConnector() + CreateCardComponent(), + 'history': HistoryConnector() + HistoryComponent(), + 'billingAddress': + BillingAddressConnector() + BillingAddressComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/payment_page/reducer.dart b/lib/views/payment_page/reducer.dart new file mode 100644 index 00000000..be8e2734 --- /dev/null +++ b/lib/views/payment_page/reducer.dart @@ -0,0 +1,46 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_creditcard.dart'; +import 'package:movie/models/base_api_model/braintree_customer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PaymentPageAction.action: _onAction, + PaymentPageAction.setTransactions: _setTransactions, + PaymentPageAction.setCustomer: _setCustomer, + PaymentPageAction.insertCreditCard: _insertCreditCard, + }, + ); +} + +PaymentPageState _onAction(PaymentPageState state, Action action) { + final PaymentPageState newState = state.clone(); + return newState; +} + +PaymentPageState _setTransactions(PaymentPageState state, Action action) { + final _transactions = action.payload; + final PaymentPageState newState = state.clone(); + newState.transactions = _transactions; + return newState; +} + +PaymentPageState _setCustomer(PaymentPageState state, Action action) { + final BraintreeCustomer _customer = action.payload; + final PaymentPageState newState = state.clone(); + newState.customer = _customer; + newState.billingAddressState = newState.billingAddressState.clone() + ..addresses = _customer.addresses; + return newState; +} + +PaymentPageState _insertCreditCard(PaymentPageState state, Action action) { + CreditCard _card = action.payload; + final PaymentPageState newState = state.clone(); + if (newState.customer?.creditCards != null) + newState.customer.creditCards.insert(0, _card); + return newState; +} diff --git a/lib/views/payment_page/state.dart b/lib/views/payment_page/state.dart new file mode 100644 index 00000000..57527fd2 --- /dev/null +++ b/lib/views/payment_page/state.dart @@ -0,0 +1,46 @@ +import 'dart:ui'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/braintree_customer.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; + +import 'components/billing_address_component/state.dart'; +import 'components/create_card_component/state.dart'; + +class PaymentPageState implements GlobalBaseState, Cloneable { + BillingAddressState billingAddressState; + CreateCardState createCardState; + TransactionModel transactions; + BraintreeCustomer customer; + SwiperController swiperController; + bool loading; + @override + PaymentPageState clone() { + return PaymentPageState() + ..transactions = transactions + ..customer = customer + ..swiperController = swiperController + ..user = user + ..loading = loading + ..billingAddressState = billingAddressState + ..createCardState = createCardState; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +PaymentPageState initState(Map args) { + return PaymentPageState() + ..loading = false + ..createCardState = CreateCardState() + ..billingAddressState = BillingAddressState(); +} diff --git a/lib/views/payment_page/view.dart b/lib/views/payment_page/view.dart new file mode 100644 index 00000000..26cc9055 --- /dev/null +++ b/lib/views/payment_page/view.dart @@ -0,0 +1,538 @@ +import 'dart:io'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/braintree_creditcard.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/payment_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + PaymentPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.primaryColorDark, + appBar: AppBar( + backgroundColor: _theme.primaryColorDark, + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + elevation: 0.0, + centerTitle: false, + title: Text( + 'Payment', + style: TextStyle(color: _theme.textTheme.bodyText1.color), + ), + ), + body: Column(children: [ + _Header(user: state.user), + _Body( + creditCards: state.customer?.creditCards, + dispatch: dispatch, + ), + ]), + ); + }); +} + +class _Header extends StatelessWidget { + final AppUser user; + const _Header({this.user}); + @override + Widget build(BuildContext context) { + final _premiumType = user.premium?.premiumType ?? 0; + final _premiumInfo = { + 0: ['-', ''], + 1: ['2.99', ''], + 2: ['6.99', '3'], + 3: ['9.99', '6'], + 4: ['16.99', '12'] + }; + return Column(children: [ + SizedBox(height: Adapt.px(30)), + Text.rich( + TextSpan(children: [ + TextSpan( + text: '\$${_premiumInfo[_premiumType][0]}', + style: + TextStyle(fontSize: Adapt.px(60), fontWeight: FontWeight.bold), + ), + TextSpan( + text: + ' / ${_premiumInfo[_premiumType][1]} month${_premiumType > 1 ? 's' : ''}', + style: TextStyle(fontSize: Adapt.px(28)), + ) + ]), + ), + SizedBox(height: Adapt.px(10)), + Text.rich( + TextSpan(children: [ + TextSpan( + text: 'Next Payment ', + style: TextStyle( + fontSize: Adapt.px(22), + color: const Color(0xFF9E9E9E), + ), + ), + TextSpan( + text: _premiumType > 0 && user.premium?.expireDate != null + ? DateFormat.yMMMd().format( + DateTime.parse(user.premium.expireDate) + .add(Duration(days: 1)), + ) + : '-', + style: TextStyle( + fontSize: Adapt.px(22), + ), + ) + ]), + ), + SizedBox(height: Adapt.px(50)) + ]); + } +} + +class _CreditCardCell extends StatelessWidget { + final CreditCard creditCard; + const _CreditCardCell({this.creditCard}); + + @override + Widget build(BuildContext context) { + final _creditCardTheme = { + 'Visa': ['images/visa_logo.png', const Color(0xFF9E92E1)], + 'JCB': ['images/jcb_logo.png', const Color(0xFFE3C4C2)], + 'Discover': ['images/discover_logo.png', const Color(0XFF66AA9E)], + 'MasterCard': ['images/mastercard_logo.png', const Color(0xFF556677)], + '-': ['images/visa_logo.png', const Color(0xFF556677)], + }; + final Color _cardColor = + _creditCardTheme[creditCard?.cardType?.value ?? '-'][1]; + + final TextStyle _textStyle = TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: Adapt.px(35), + ); + + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + color: const Color(0xFFFFFFFF), + ), + child: Container( + width: Adapt.screenW(), + height: Adapt.px(420), + padding: EdgeInsets.symmetric(horizontal: 40, vertical: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + _cardColor.withAlpha(120), + _cardColor.withAlpha(200), + _cardColor, + ], + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Align( + alignment: Alignment.topRight, + child: Container( + constraints: BoxConstraints(maxWidth: Adapt.px(150)), + height: Adapt.px(50), + child: Image.asset( + _creditCardTheme[creditCard?.cardType?.value ?? '-'][0], + fit: BoxFit.contain, + ), + ), + ), + SizedBox(height: Adapt.px(80)), + Container( + height: Adapt.px(40), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('****', style: _textStyle), + Text('****', style: _textStyle), + Text('****', style: _textStyle), + Text( + '${creditCard?.lastFour ?? '****'}', + style: _textStyle, + ) + ], + ), + ), + Expanded(child: SizedBox()), + Text( + 'Expires', + style: TextStyle(color: Color(0xFFE0E0E0)), + ), + const SizedBox(height: 2), + Text( + creditCard?.expirationDate ?? 'MM/yyyy', + style: TextStyle(color: Color(0xFFFFFFFF)), + ) + ], + ), + ), + ); + } +} + +class _OtherPaymentCell extends StatelessWidget { + final IconData icon; + final String title; + final Function onTap; + const _OtherPaymentCell( + {@required this.icon, @required this.title, this.onTap}); + @override + Widget build(BuildContext context) { + return SizedBox( + child: Row( + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + border: Border.all( + width: Adapt.px(2), color: const Color(0xFF9E9E9E)), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: Icon(icon, color: const Color(0xFF9E9E9E)), + ), + SizedBox(width: Adapt.px(20)), + Text( + title, + style: TextStyle(fontSize: Adapt.px(28)), + ) + ], + ), + ); + } +} + +class _OptionCell extends StatelessWidget { + final String title; + final Function onTap; + const _OptionCell({@required this.title, this.onTap}); + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(60), vertical: Adapt.px(40)), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle(fontSize: Adapt.px(30)), + ), + Icon( + Icons.arrow_forward_ios, + size: Adapt.px(40), + color: const Color(0xFF9E9E9E), + ) + ], + ), + ), + ); + } +} + +class _Body extends StatelessWidget { + final List creditCards; + final SwiperController controller; + final Dispatch dispatch; + const _Body({this.creditCards, this.controller, this.dispatch}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Expanded( + child: Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: ListView( + physics: BouncingScrollPhysics(), + children: [ + SizedBox(height: Adapt.px(80)), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(60)), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Saved Cards', + style: TextStyle(fontSize: Adapt.px(30)), + ), + _AddCardButton( + onTap: () => + dispatch(PaymentPageActionCreator.createCard()), + ) + ], + ), + ), + SizedBox(height: Adapt.px(50)), + creditCards == null + ? _CreditCardSwiperShimmer( + controller: controller, + ) + : creditCards.length > 0 + ? _CreditCardSwiper( + creditCards: creditCards, + controller: controller, + ) + : _EmptyCreditCard(), + Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(60), vertical: Adapt.px(50)), + child: Text( + 'Other Payments', + style: TextStyle(fontSize: Adapt.px(30)), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(60)), + child: Row( + children: [ + _OtherPaymentCell( + icon: FontAwesomeIcons.paypal, + title: 'PayPal', + ), + Expanded(child: SizedBox()), + Platform.isIOS + ? _OtherPaymentCell( + icon: FontAwesomeIcons.apple, + title: 'Apple Pay', + ) + : _OtherPaymentCell( + icon: FontAwesomeIcons.google, + title: 'Google Pay', + ) + ], + ), + ), + SizedBox(height: Adapt.px(40)), + _OptionCell( + title: 'Payment History', + onTap: () => dispatch( + PaymentPageActionCreator.showHistory(), + ), + ), + _OptionCell( + title: 'Billing Address', + onTap: () => + dispatch(PaymentPageActionCreator.showBillingAddress()), + ) + ], + ), + ), + ); + } +} + +class _AddCardButton extends StatelessWidget { + final Function onTap; + const _AddCardButton({this.onTap}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Adapt.px(60), + height: Adapt.px(60), + decoration: BoxDecoration( + border: Border.all( + color: const Color(0xFF9E9E9E), + width: .5, + ), + borderRadius: BorderRadius.circular( + Adapt.px(15), + ), + ), + child: Icon( + Icons.add, + size: Adapt.px(25), + color: const Color(0xFF9E9E9E), + ), + )); + } +} + +class _CreditCardSwiper extends StatelessWidget { + final List creditCards; + final SwiperController controller; + const _CreditCardSwiper({this.creditCards, this.controller}); + @override + Widget build(BuildContext context) { + final int lenght = creditCards?.length ?? 0; + List _opacitys = []; + List _rotates = []; + List _scales = []; + List _offsets = []; + if (lenght == 1) { + _opacitys = [1.0]; + _rotates = [0.0]; + _scales = [.9]; + _offsets = [Offset.zero]; + } else if (lenght == 2) { + _opacitys = [1.0, 0.0]; + _rotates = [0.0, 25 / 180]; + _scales = [.9, 1.0]; + _offsets = [ + Offset.zero, + Offset(Adapt.screenW(), 0), + ]; + } else if (lenght == 3) { + _opacitys = [1.0, 1.0, 0.0]; + _rotates = [0.0, 0, 25 / 180]; + _scales = [0.85, 0.9, 1.0]; + _offsets = [ + Offset(0.0, -20), + Offset.zero, + Offset(Adapt.screenW(), 0), + ]; + } else if (lenght == 4) { + _opacitys = [1.0, 1.0, 0.0, 0.0]; + _rotates = [0, 0, 25 / 180, 0]; + _scales = [0.85, 0.9, 1.0, 1.0]; + _offsets = [ + Offset(0.0, -20), + Offset.zero, + Offset(Adapt.screenW(), 0), + Offset(Adapt.screenW(), 0), + ]; + } else if (lenght > 4) { + _opacitys = [1.0, 1.0, 1.0, 0.0, 0.0]; + _rotates = [0.0, 0.0, 0.0, 25 / 180, 0.0]; + _scales = [0.8, 0.85, 0.9, 1.0, 1.0, 1.0]; + _offsets = [ + Offset(0.0, -40), + Offset(0.0, -20), + Offset.zero, + Offset(Adapt.screenW(), 0), + Offset(Adapt.screenW(), 0), + ]; + List(lenght - 4).forEach((e) { + _opacitys.insert(0, 0); + _rotates.insert(0, 0); + _scales.insert(0, 0); + _offsets.insert(0, Offset.zero); + }); + } + return Container( + height: Adapt.px(480), + child: Swiper( + controller: controller, + itemCount: lenght, + layout: SwiperLayout.CUSTOM, + customLayoutOption: + CustomLayoutOption(stateCount: lenght, startIndex: 0) + .addOpacity(_opacitys) + .addRotate(_rotates) + .addScale(_scales, Alignment.center) + .addTranslate(_offsets), + itemHeight: Adapt.px(420), + itemWidth: Adapt.screenW(), + itemBuilder: (context, index) { + return _CreditCardCell( + creditCard: creditCards[index], + ); + }, + ), + ); + } +} + +class _CreditCardSwiperShimmer extends StatelessWidget { + final SwiperController controller; + const _CreditCardSwiperShimmer({this.controller}); + @override + Widget build(BuildContext context) { + final _opacitys = [1.0, 1.0, 1.0, 0.0, 0.0]; + final _rotates = [0.0, 0.0, 0.0, 25 / 180, 0.0]; + final _scales = [0.8, 0.85, 0.9, 1.0, 1.0, 1.0]; + final _offsets = [ + Offset(0.0, -40), + Offset(0.0, -20), + Offset.zero, + Offset(Adapt.screenW(), 0), + Offset(Adapt.screenW(), 0), + ]; + final _cardColors = [ + const Color(0xFF9E92E1), + const Color(0xFF556677), + const Color(0xFFE3C4C2), + const Color(0XFF66AA9E), + const Color(0xFF556677), + ]; + return Container( + height: Adapt.px(480), + child: Swiper( + controller: controller, + itemCount: 5, + layout: SwiperLayout.CUSTOM, + customLayoutOption: CustomLayoutOption(stateCount: 5, startIndex: 2) + .addOpacity(_opacitys) + .addRotate(_rotates) + .addScale(_scales, Alignment.center) + .addTranslate(_offsets), + itemHeight: Adapt.px(420), + itemWidth: Adapt.screenW(), + itemBuilder: (context, index) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + color: const Color(0xFFFFFFFF), + ), + child: Container( + width: Adapt.screenW(), + height: Adapt.px(420), + padding: EdgeInsets.symmetric(horizontal: 40, vertical: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + _cardColors[index].withAlpha(120), + _cardColors[index].withAlpha(200), + _cardColors[index], + ], + ), + ), + child: Center( + child: Text( + 'Loading', + style: TextStyle( + fontSize: Adapt.px(40), + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ); + }, + )); + } +} + +class _EmptyCreditCard extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(480), child: Center(child: Text('empty'))); + } +} diff --git a/lib/views/peopledetail_page/action.dart b/lib/views/peopledetail_page/action.dart new file mode 100644 index 00000000..b98643bc --- /dev/null +++ b/lib/views/peopledetail_page/action.dart @@ -0,0 +1,42 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/models/people_detail.dart'; + +enum PeopleDetailPageAction { + action, + init, + setCreditModel, + showBiography, + cellTapped, + showMovie, +} + +class PeopleDetailPageActionCreator { + static Action onAction() { + return const Action(PeopleDetailPageAction.action); + } + + static Action onInit(PeopleDetailModel p) { + return Action(PeopleDetailPageAction.init, payload: p); + } + + static Action onSetCreditModel( + CombinedCreditsModel p, List cast) { + return Action(PeopleDetailPageAction.setCreditModel, payload: [p, cast]); + } + + static Action onShowBiography() { + return Action(PeopleDetailPageAction.showBiography); + } + + static Action onCellTapped( + int id, String bgpic, String name, String poster, MediaType type) { + return Action(PeopleDetailPageAction.cellTapped, + payload: [id, bgpic, name, poster, type]); + } + + static Action showMovie(bool d) { + return Action(PeopleDetailPageAction.showMovie, payload: d); + } +} diff --git a/lib/views/peopledetail_page/components/gallery_component/action.dart b/lib/views/peopledetail_page/components/gallery_component/action.dart new file mode 100644 index 00000000..f7a02367 --- /dev/null +++ b/lib/views/peopledetail_page/components/gallery_component/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum GalleryAction { action, imageCellTapped, viewMoreTapped } + +class GalleryActionCreator { + static Action onAction() { + return const Action(GalleryAction.action); + } + + static Action viewMoreTapped() { + return const Action(GalleryAction.viewMoreTapped); + } +} diff --git a/lib/views/peopledetail_page/components/gallery_component/component.dart b/lib/views/peopledetail_page/components/gallery_component/component.dart new file mode 100644 index 00000000..6451606c --- /dev/null +++ b/lib/views/peopledetail_page/components/gallery_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class GalleryComponent extends Component { + GalleryComponent() + : super( + shouldUpdate: (olditem, newitem) { + return newitem.images != olditem.images; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/peopledetail_page/components/gallery_component/effect.dart b/lib/views/peopledetail_page/components/gallery_component/effect.dart new file mode 100644 index 00000000..124d05d5 --- /dev/null +++ b/lib/views/peopledetail_page/components/gallery_component/effect.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/views/gallery_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + GalleryAction.action: _onAction, + GalleryAction.viewMoreTapped: _viewMoreTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _viewMoreTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context) + .push(PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: GalleryPage().buildPage({'images': ctx.state.images.profiles}), + ); + })); +} diff --git a/lib/views/peopledetail_page/components/gallery_component/reducer.dart b/lib/views/peopledetail_page/components/gallery_component/reducer.dart new file mode 100644 index 00000000..6c3328e3 --- /dev/null +++ b/lib/views/peopledetail_page/components/gallery_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + GalleryAction.action: _onAction, + }, + ); +} + +GalleryState _onAction(GalleryState state, Action action) { + final GalleryState newState = state.clone(); + return newState; +} diff --git a/lib/views/peopledetail_page/components/gallery_component/state.dart b/lib/views/peopledetail_page/components/gallery_component/state.dart new file mode 100644 index 00000000..411de038 --- /dev/null +++ b/lib/views/peopledetail_page/components/gallery_component/state.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/people_detail.dart'; +import 'package:movie/views/peopledetail_page/state.dart'; + +class GalleryState implements Cloneable { + ProfileImages images; + GalleryState({this.images}); + + @override + GalleryState clone() { + return GalleryState(); + } +} + +class GalleryConnector extends ConnOp { + @override + GalleryState get(PeopleDetailPageState state) { + GalleryState mstate = GalleryState(); + mstate.images = state.peopleDetailModel.images; + return mstate; + } +} diff --git a/lib/views/peopledetail_page/components/gallery_component/view.dart b/lib/views/peopledetail_page/components/gallery_component/view.dart new file mode 100644 index 00000000..77b00459 --- /dev/null +++ b/lib/views/peopledetail_page/components/gallery_component/view.dart @@ -0,0 +1,135 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/people_detail.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + GalleryState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + key: ValueKey('gallery'), + padding: EdgeInsets.only(top: Adapt.px(50)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Row( + children: [ + Text( + 'Photos', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500), + ), + Expanded(child: Container()), + InkWell( + onTap: () => + dispatch(GalleryActionCreator.viewMoreTapped()), + child: Text( + 'View more', + style: + TextStyle(color: Colors.grey, fontSize: Adapt.px(24)), + ), + ) + ], + )), + SizedBox(height: Adapt.px(30)), + _Gallery(images: state?.images), + SizedBox(height: Adapt.px(50)), + ], + ), + ), + ); +} + +class _ImageCell extends StatelessWidget { + final ImageData data; + const _ImageCell({this.data}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Hero( + key: ValueKey('image${data.filePath}'), + tag: 'image${data.filePath}', + child: Container( + width: Adapt.px(200), + height: Adapt.px(180), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.filePath, ImageSize.w300), + ), + ), + ), + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + width: Adapt.px(200), + height: Adapt.px(180), + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 4, + itemBuilder: (context, index) => _ShimmerCell(), + )); + } +} + +class _Gallery extends StatelessWidget { + final ProfileImages images; + const _Gallery({this.images}); + @override + Widget build(BuildContext context) { + var _model = images?.profiles ?? []; + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: Container( + key: ValueKey(_model), + height: Adapt.px(180), + child: _model.length > 0 + ? ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + scrollDirection: Axis.horizontal, + separatorBuilder: (context, index) => + SizedBox(width: Adapt.px(30)), + itemCount: _model.length, + itemBuilder: (_, index) => _ImageCell(data: _model[index]), + ) + : _ShimmerList(), + ), + ); + } +} diff --git a/lib/views/peopledetail_page/components/header_component/action.dart b/lib/views/peopledetail_page/components/header_component/action.dart new file mode 100644 index 00000000..a082b9d8 --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum HeaderAction { action, bioReadMore } + +class HeaderActionCreator { + static Action onAction() { + return const Action(HeaderAction.action); + } + + static Action bioReadMore() { + return const Action(HeaderAction.bioReadMore); + } +} diff --git a/lib/views/peopledetail_page/components/header_component/component.dart b/lib/views/peopledetail_page/components/header_component/component.dart new file mode 100644 index 00000000..265f75ac --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/component.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (olditem, newitem) { + return newitem.biography != olditem.biography || + newitem.birthday != olditem.birthday || + newitem.character != olditem.character || + newitem.deathday != newitem.deathday || + newitem.peopleid != olditem.peopleid || + newitem.profileName != olditem.profileName || + newitem.profilePath != olditem.profilePath; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/peopledetail_page/components/header_component/components/cast_list.dart b/lib/views/peopledetail_page/components/header_component/components/cast_list.dart new file mode 100644 index 00000000..ebda8233 --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/components/cast_list.dart @@ -0,0 +1,256 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/actions/api/graphql_client.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/base_cast_list.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/cast_list/cast_list_page/components/cast_list_create.dart'; +import 'package:toast/toast.dart'; + +class CastList extends StatefulWidget { + final BaseCast cast; + const CastList({Key key, @required this.cast}) : super(key: key); + @override + _CastListState createState() => _CastListState(); +} + +class _CastListState extends State { + Stream _data; + BaseCast _cast; + BaseCastList _selectedList; + @override + void initState() { + _cast = widget.cast; + _onInit(); + super.initState(); + } + + void _onSelected(BaseCastList selected) { + _selectedList = selected; + } + + void _onInit() { + final _user = GlobalStore.store.getState().user; + if (_user?.firebaseUser != null) + _data = BaseGraphQLClient.instance + .castListSubscription(_user.firebaseUser.uid); + } + + void _onAdd() async { + await Navigator.of(context) + .push(MaterialPageRoute(builder: (_) => CastListCreate())); + } + + void _onOk(BuildContext c) async { + if (_selectedList == null) return; + final _user = GlobalStore.store.getState().user; + if (_user?.firebaseUser == null) return Toast.show('Please login', c); + _cast.listId = _selectedList.id; + + BaseGraphQLClient.instance.addCast(_selectedList, _cast); + + Navigator.of(c).pop(); + } + + @override + Widget build(BuildContext context) { + final Size _size = MediaQuery.of(context).size; + final _theme = ThemeStyle.getTheme(context); + return SimpleDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)), + elevation: 0.0, + title: _Title(onAdd: _onAdd), + children: [ + Container( + height: _size.height / 2, + width: _size.width, + child: StreamBuilder( + stream: _data, + builder: (_, snapShot) { + switch (snapShot.connectionState) { + case ConnectionState.waiting: + return Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(_theme.iconTheme.color), + )); + case ConnectionState.active: + case ConnectionState.done: + final _castList = CastListModel.fromMap(snapShot.data.data); + final List _list = _castList.list + ..sort( + (a, b) => a.updateTime.isBefore(b.updateTime) ? 1 : 0); + return _CastListView( + data: _list, + onSelected: _onSelected, + ); + + case ConnectionState.none: + default: + return Center( + child: Text( + 'Empty List', + style: TextStyle(fontSize: 18), + )); + } + }, + ), + ), + _ButtonPanel( + onSubmit: () => _onOk(context), + onCancel: () => Navigator.of(context).pop(), + ), + ], + ); + } +} + +class _Title extends StatelessWidget { + final Function onAdd; + const _Title({this.onAdd}); + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Cast Lists'), + GestureDetector( + onTap: onAdd, + child: Icon(Icons.add_circle), + ), + ], + ); + } +} + +class _CastListView extends StatefulWidget { + final List data; + final Function(BaseCastList) onSelected; + const _CastListView({this.data, this.onSelected}); + @override + _CastListViewState createState() => _CastListViewState(); +} + +class _CastListViewState extends State<_CastListView> { + BaseCastList _selected; + + void _onSelected(BaseCastList selected) { + _selected = selected; + if (widget.onSelected != null) widget.onSelected(selected); + setState(() {}); + } + + @override + void didUpdateWidget(_CastListView oldWidget) { + //if (oldWidget.data != widget.data) initSelected(); + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + initSelected(); + super.initState(); + } + + initSelected() { + if (widget.data.length > 0) _onSelected(widget.data[0]); + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 10), + itemBuilder: (_, index) { + return _CastListCell( + data: widget.data[index], + selected: widget.data[index].id == _selected.id, + onTap: _onSelected, + ); + }, + separatorBuilder: (_, index) => SizedBox(height: 10), + itemCount: widget.data.length); + } +} + +class _CastListCell extends StatelessWidget { + final BaseCastList data; + final bool selected; + final Function(BaseCastList) onTap; + const _CastListCell({this.data, this.selected, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(data), + child: Container( + padding: EdgeInsets.all(10), + decoration: selected + ? BoxDecoration( + border: Border.all(color: _theme.iconTheme.color), + borderRadius: BorderRadius.circular(5), + ) + : null, + child: Text( + data.name ?? '', + style: TextStyle(fontSize: 18), + ), + )); + } +} + +class _ButtonPanel extends StatelessWidget { + final Function onSubmit; + final Function onCancel; + const _ButtonPanel({this.onSubmit, this.onCancel}); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + _Button( + text: 'cancel', + onPress: onCancel, + ), + SizedBox(width: 24), + _Button( + text: 'ok', + onPress: onSubmit, + ), + ], + ), + ); + } +} + +class _Button extends StatelessWidget { + final String text; + final Function onPress; + const _Button({this.onPress, this.text}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _textStyle = TextStyle( + fontSize: 16, + color: _theme.brightness == Brightness.light + ? const Color(0xFFFFFFFF) + : const Color(0xFF000000)); + return InkWell( + onTap: onPress, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), + constraints: BoxConstraints(minWidth: 80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: _theme.iconTheme.color), + child: Center( + child: Text( + text, + style: _textStyle, + ), + ), + ), + ); + } +} diff --git a/lib/views/peopledetail_page/components/header_component/effect.dart b/lib/views/peopledetail_page/components/header_component/effect.dart new file mode 100644 index 00000000..841b4e62 --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/effect.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HeaderAction.action: _onAction, + HeaderAction.bioReadMore: _bioReadMore + }); +} + +void _onAction(Action action, Context ctx) {} +void _bioReadMore(Action action, Context ctx) {} diff --git a/lib/views/peopledetail_page/components/header_component/reducer.dart b/lib/views/peopledetail_page/components/header_component/reducer.dart new file mode 100644 index 00000000..868d7f39 --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HeaderAction.action: _onAction, + }, + ); +} + +HeaderState _onAction(HeaderState state, Action action) { + final HeaderState newState = state.clone(); + return newState; +} diff --git a/lib/views/peopledetail_page/components/header_component/state.dart b/lib/views/peopledetail_page/components/header_component/state.dart new file mode 100644 index 00000000..def2748f --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/state.dart @@ -0,0 +1,47 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/peopledetail_page/state.dart'; + +class HeaderState implements Cloneable { + String profilePath; + String profileName; + String biography; + String character; + int peopleid; + String birthday; + String deathday; + HeaderState( + {this.peopleid, + this.biography, + this.profileName, + this.profilePath, + this.character, + this.birthday, + this.deathday}); + + @override + HeaderState clone() { + return HeaderState() + ..biography = biography + ..birthday = birthday + ..character = character + ..deathday = deathday + ..peopleid = peopleid + ..profileName = profileName + ..profilePath = profilePath; + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(PeopleDetailPageState state) { + HeaderState mstate = HeaderState(); + mstate.peopleid = state.peopleid; + mstate.biography = state.peopleDetailModel.biography; + mstate.profileName = state.profileName; + mstate.profilePath = state.profilePath; + mstate.character = state.character; + mstate.deathday = state.peopleDetailModel.deathday; + mstate.birthday = state.peopleDetailModel?.birthday; + return mstate; + } +} diff --git a/lib/views/peopledetail_page/components/header_component/view.dart b/lib/views/peopledetail_page/components/header_component/view.dart new file mode 100644 index 00000000..8c7468de --- /dev/null +++ b/lib/views/peopledetail_page/components/header_component/view.dart @@ -0,0 +1,261 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/base_api_model/cast_list_detail.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/peopledetail_page/components/header_component/components/cast_list.dart'; +import 'package:movie/widgets/expandable_text.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + key: ValueKey('header'), + width: Adapt.screenW(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Hero( + tag: 'people${state.peopleid}', + child: Material( + child: Container( + height: Adapt.px(900), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + blurRadius: 20, + spreadRadius: -15.0, + offset: Offset(0, 25), + color: Colors.black38), + ], + color: Colors.grey[200], + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(Adapt.px(50)), + ), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(state.profilePath, ImageSize.w300)), + ), + ), + ), + ), + ), + SizedBox(height: Adapt.px(50)), + _NamePanel( + id: state.peopleid, + name: state.profileName, + birthday: state.birthday, + deathday: state.deathday, + profilePath: state.profilePath, + ), + SizedBox(height: Adapt.px(50)), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Text( + I18n.of(viewService.context).biography, + softWrap: true, + style: TextStyle(fontWeight: FontWeight.w500, fontSize: 18), + ), + ), + SizedBox(height: Adapt.px(30)), + _BiographyCell( + biography: state.biography, + profileName: state.profileName, + ), + SizedBox(height: Adapt.px(50)) + ], + ), + ), + ); +} + +class _BiographyShimmer extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final Color _baseColor = Colors.grey[200]; + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Container( + child: Column( + children: [ + Container( + margin: EdgeInsets.only(left: Adapt.px(60)), + color: _baseColor, + height: Adapt.px(30), + ), + SizedBox(height: Adapt.px(10)), + Container( + color: _baseColor, + height: Adapt.px(30), + ), + SizedBox(height: Adapt.px(10)), + Container( + color: _baseColor, + height: Adapt.px(30), + ), + SizedBox(height: Adapt.px(10)), + Container( + color: _baseColor, + height: Adapt.px(30), + ), + SizedBox(height: Adapt.px(10)), + Container( + color: _baseColor, + height: Adapt.px(30), + ), + SizedBox(height: Adapt.px(10)), + Container( + color: _baseColor, + height: Adapt.px(30), + ), + ], + ), + ), + ); + } +} + +class _BiographyCell extends StatelessWidget { + final String biography; + final String profileName; + const _BiographyCell({this.biography, this.profileName}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: biography == null + ? _BiographyShimmer() + : ExpandableText( + biography == null || biography?.isEmpty == true + ? "We don't have a biography for $profileName" + : biography, + maxLines: 5, + style: TextStyle( + fontSize: 16, + height: 1.5, + color: _theme.textTheme.bodyText1.color), + ), + ); + } +} + +class _NameCell extends StatelessWidget { + final String profileName; + const _NameCell({this.profileName}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final Size _size = MediaQuery.of(context).size; + return Container( + width: _size.width - 120, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: profileName == null + ? SizedBox( + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Container( + height: Adapt.px(50), + width: Adapt.px(300), + color: Colors.grey[200], + ), + ), + ) + : Text( + profileName ?? '', + style: TextStyle(fontSize: 24, fontWeight: FontWeight.w700), + ), + ); + } +} + +class _YearsOld extends StatelessWidget { + final String birthday; + final String deathday; + const _YearsOld({this.birthday, this.deathday}); + @override + Widget build(BuildContext context) { + if (birthday != null) { + final _now = deathday != null + ? DateTime.parse(deathday).year + : DateTime.now().year; + + int yearold = _now - DateTime.parse(birthday).year; + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Text( + '$yearold years old', + style: TextStyle(color: Colors.grey[600], fontSize: 16), + )); + } else + return SizedBox( + height: Adapt.px(35), + ); + } +} + +class _NamePanel extends StatelessWidget { + final int id; + final String profilePath; + final String name; + final String birthday; + final String deathday; + const _NamePanel( + {this.id, this.name, this.birthday, this.deathday, this.profilePath}); + @override + Widget build(BuildContext context) { + void _showCsatList() { + showDialog( + context: context, + builder: (_) => CastList( + cast: BaseCast.fromParams( + name: name, castId: id, profileUrl: profilePath))); + } + + return Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _NameCell( + profileName: name, + ), + _YearsOld( + birthday: birthday, + deathday: deathday, + ), + ], + ), + Spacer(), + GestureDetector( + onTap: _showCsatList, + child: Icon( + Icons.add_circle_outline, + size: 20, + ), + ), + SizedBox(width: 15), + GestureDetector( + onTap: () async { + await Navigator.of(context).pushNamed("castListPage"); + }, + child: Icon( + Icons.favorite_border, + size: 20, + )), + SizedBox(width: Adapt.px(40)) + ], + ); + } +} diff --git a/lib/views/peopledetail_page/components/knownfor_component/action.dart b/lib/views/peopledetail_page/components/knownfor_component/action.dart new file mode 100644 index 00000000..4e947c8c --- /dev/null +++ b/lib/views/peopledetail_page/components/knownfor_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum KnownForAction { action } + +class KnownForActionCreator { + static Action onAction() { + return const Action(KnownForAction.action); + } +} diff --git a/lib/views/peopledetail_page/components/knownfor_component/component.dart b/lib/views/peopledetail_page/components/knownfor_component/component.dart new file mode 100644 index 00000000..6251dc73 --- /dev/null +++ b/lib/views/peopledetail_page/components/knownfor_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class KnownForComponent extends Component { + KnownForComponent() + : super( + shouldUpdate: (olditem, newitem) { + return newitem.cast != olditem.cast; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/peopledetail_page/components/knownfor_component/effect.dart b/lib/views/peopledetail_page/components/knownfor_component/effect.dart new file mode 100644 index 00000000..a61d697b --- /dev/null +++ b/lib/views/peopledetail_page/components/knownfor_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + KnownForAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/peopledetail_page/components/knownfor_component/reducer.dart b/lib/views/peopledetail_page/components/knownfor_component/reducer.dart new file mode 100644 index 00000000..0cbb755a --- /dev/null +++ b/lib/views/peopledetail_page/components/knownfor_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + KnownForAction.action: _onAction, + }, + ); +} + +KnownForState _onAction(KnownForState state, Action action) { + final KnownForState newState = state.clone(); + return newState; +} diff --git a/lib/views/peopledetail_page/components/knownfor_component/state.dart b/lib/views/peopledetail_page/components/knownfor_component/state.dart new file mode 100644 index 00000000..c0b31605 --- /dev/null +++ b/lib/views/peopledetail_page/components/knownfor_component/state.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/views/peopledetail_page/state.dart'; + +class KnownForState implements Cloneable { + List cast; + + KnownForState({this.cast}); + + @override + KnownForState clone() { + return KnownForState()..cast = cast; + } +} + +class KnownForConnector extends ConnOp { + @override + KnownForState get(PeopleDetailPageState state) { + KnownForState mstate = KnownForState(); + mstate.cast = state.knowForCast ?? []; + return mstate; + } +} diff --git a/lib/views/peopledetail_page/components/knownfor_component/view.dart b/lib/views/peopledetail_page/components/knownfor_component/view.dart new file mode 100644 index 00000000..f35dc0e1 --- /dev/null +++ b/lib/views/peopledetail_page/components/knownfor_component/view.dart @@ -0,0 +1,186 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/peopledetail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + KnownForState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: AnimatedSwitcher( + key: ValueKey('knownfor'), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + duration: Duration(milliseconds: 600), + child: Container( + key: ValueKey(state.cast), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Text( + I18n.of(viewService.context).knownFor, + softWrap: true, + style: TextStyle(fontWeight: FontWeight.w500, fontSize: 18), + ), + ), + SizedBox( + height: Adapt.px(30), + ), + _KownForList( + cast: state.cast, + dispatch: dispatch, + ), + ], + ), + ), + ), + ); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + return SizedBox( + width: 100, + height: 160, + child: Column( + children: [ + Container( + color: Colors.grey[200], + width: 100, + height: 140, + ), + Container( + height: 10, + margin: EdgeInsets.fromLTRB(0, 8, 8, 0), + color: Colors.grey[200], + ), + Container( + height: 10, + margin: EdgeInsets.fromLTRB(0, 5, 30, 0), + color: Colors.grey[200], + ), + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + physics: NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + itemBuilder: (_, __) => const _ShimmerCell(), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + itemCount: 3, + ), + ); + } +} + +class _KownForCell extends StatelessWidget { + final Function onTap; + final CombinedCastData data; + const _KownForCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + key: ValueKey('knowforCell${data.id}'), + onTap: onTap, + child: Container( + width: 100, + height: 200, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 100, + height: 140, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: _theme.primaryColorLight, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300)), + ), + ), + ), + SizedBox(height: 8), + Container( + height: 40, + alignment: Alignment.center, + child: Text( + data.title ?? data.name, + maxLines: 3, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 12), + ), + ) + ], + ), + ), + ); + } +} + +class _KownForList extends StatelessWidget { + final List cast; + final Dispatch dispatch; + const _KownForList({this.cast, this.dispatch}); + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: cast.length > 0 + ? ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(30)), + scrollDirection: Axis.horizontal, + itemCount: cast.length, + itemBuilder: (_, index) { + final _d = cast[index]; + return _KownForCell( + data: _d, + onTap: () => dispatch( + PeopleDetailPageActionCreator.onCellTapped( + _d.id, + _d.backdropPath, + _d.title ?? _d.name, + _d.posterPath, + _d.mediaType == 'movie' + ? MediaType.movie + : MediaType.person, + ), + ), + ); + }, + ) + : const _ShimmerList(), + ); + } +} diff --git a/lib/views/peopledetail_page/components/personalinfo_component/action.dart b/lib/views/peopledetail_page/components/personalinfo_component/action.dart new file mode 100644 index 00000000..5921fd2a --- /dev/null +++ b/lib/views/peopledetail_page/components/personalinfo_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum PersonalInfoAction { action } + +class PersonalInfoActionCreator { + static Action onAction() { + return const Action(PersonalInfoAction.action); + } +} diff --git a/lib/views/peopledetail_page/components/personalinfo_component/component.dart b/lib/views/peopledetail_page/components/personalinfo_component/component.dart new file mode 100644 index 00000000..37aab0a5 --- /dev/null +++ b/lib/views/peopledetail_page/components/personalinfo_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PersonalInfoComponent extends Component { + PersonalInfoComponent() + : super( + shouldUpdate: (olditem, newitem) { + return newitem.peopleDetailModel != olditem.peopleDetailModel; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/peopledetail_page/components/personalinfo_component/effect.dart b/lib/views/peopledetail_page/components/personalinfo_component/effect.dart new file mode 100644 index 00000000..5958e223 --- /dev/null +++ b/lib/views/peopledetail_page/components/personalinfo_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PersonalInfoAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/peopledetail_page/components/personalinfo_component/reducer.dart b/lib/views/peopledetail_page/components/personalinfo_component/reducer.dart new file mode 100644 index 00000000..b702933f --- /dev/null +++ b/lib/views/peopledetail_page/components/personalinfo_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PersonalInfoAction.action: _onAction, + }, + ); +} + +PersonalInfoState _onAction(PersonalInfoState state, Action action) { + final PersonalInfoState newState = state.clone(); + return newState; +} diff --git a/lib/views/peopledetail_page/components/personalinfo_component/state.dart b/lib/views/peopledetail_page/components/personalinfo_component/state.dart new file mode 100644 index 00000000..fbb9bc37 --- /dev/null +++ b/lib/views/peopledetail_page/components/personalinfo_component/state.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/people_detail.dart'; +import 'package:movie/views/peopledetail_page/state.dart'; + +class PersonalInfoState implements Cloneable { + PeopleDetailModel peopleDetailModel; + int creditcount; + + PersonalInfoState({this.peopleDetailModel, this.creditcount}); + + @override + PersonalInfoState clone() { + return PersonalInfoState() + ..peopleDetailModel = peopleDetailModel + ..creditcount = creditcount; + } +} + +class PersonalInfoConnector + extends ConnOp { + @override + PersonalInfoState get(PeopleDetailPageState state) { + PersonalInfoState mstate = PersonalInfoState(); + mstate.peopleDetailModel = state.peopleDetailModel; + mstate.creditcount = + state.creditsModel.cast.length + state.creditsModel.crew.length; + return mstate; + } +} diff --git a/lib/views/peopledetail_page/components/personalinfo_component/view.dart b/lib/views/peopledetail_page/components/personalinfo_component/view.dart new file mode 100644 index 00000000..52bfcf7b --- /dev/null +++ b/lib/views/peopledetail_page/components/personalinfo_component/view.dart @@ -0,0 +1,119 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/people_detail.dart'; + +import 'state.dart'; + +Widget buildView( + PersonalInfoState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(viewService.context).personalInfo, + softWrap: true, + style: TextStyle(fontWeight: FontWeight.w500, fontSize: 18), + ), + SizedBox(height: Adapt.px(50)), + _InfoBody( + data: state.peopleDetailModel, + creditcount: state.creditcount, + ), + SizedBox(height: Adapt.px(50)), + ], + ), + ), + ); +} + +class _InfoBody extends StatelessWidget { + final PeopleDetailModel data; + final int creditcount; + const _InfoBody({this.data, this.creditcount}); + @override + Widget build(BuildContext context) { + final _titleStyle = TextStyle(color: Colors.grey[600], fontSize: 14); + final _valueStyle = TextStyle(fontSize: 16, fontWeight: FontWeight.w500); + String birthday; + if (data?.birthday != null) + birthday = DateFormat.yMMMMd().format(DateTime.parse(data.birthday)); + return Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(30))), + child: Container( + padding: EdgeInsets.all(Adapt.px(30)), + width: Adapt.screenW() - Adapt.px(60), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(context).gender, + style: _titleStyle, + ), + SizedBox(height: Adapt.px(8)), + Text( + data?.gender == 2 ? 'Male' : 'Female', + style: _valueStyle, + ), + Divider(height: Adapt.px(40)), + Text( + I18n.of(context).knownFor, + style: _titleStyle, + ), + SizedBox(height: Adapt.px(8)), + Text( + data?.knownForDepartment ?? '', + style: _valueStyle, + ), + Divider(height: Adapt.px(40)), + Text( + 'Birth', + style: _titleStyle, + ), + SizedBox(height: Adapt.px(8)), + Text( + '${birthday ?? ''} in ${data?.placeOfBirth ?? ''}', + style: _valueStyle, + ), + Divider(height: Adapt.px(40)), + Text( + I18n.of(context).knownCredits, + style: _titleStyle, + ), + SizedBox(height: Adapt.px(8)), + Text( + '${creditcount ?? 0}', + style: _valueStyle, + ), + Divider(height: Adapt.px(40)), + Text( + I18n.of(context).officialSite, + style: _titleStyle, + ), + SizedBox(height: Adapt.px(8)), + Text( + '${data?.homepage ?? '-'}', + style: _valueStyle, + ), + Divider(height: Adapt.px(40)), + Text( + I18n.of(context).alsoKnownAs, + style: _titleStyle, + ), + SizedBox(height: Adapt.px(8)), + Text( + data?.alsoKnownAs?.join(' , ') ?? '-', + style: _valueStyle, + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/peopledetail_page/components/timeline_component/action.dart b/lib/views/peopledetail_page/components/timeline_component/action.dart new file mode 100644 index 00000000..1f2834a9 --- /dev/null +++ b/lib/views/peopledetail_page/components/timeline_component/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TimeLineAction { action, actingChanged } + +class TimeLineActionCreator { + static Action onAction() { + return const Action(TimeLineAction.action); + } + + static Action onActingChanged(bool d) { + return Action(TimeLineAction.actingChanged, payload: d); + } +} diff --git a/lib/views/peopledetail_page/components/timeline_component/component.dart b/lib/views/peopledetail_page/components/timeline_component/component.dart new file mode 100644 index 00000000..4f67cc3b --- /dev/null +++ b/lib/views/peopledetail_page/components/timeline_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TimeLineComponent extends Component { + TimeLineComponent() + : super( + shouldUpdate: (olditem, newitem) { + return newitem.movies != olditem.movies || + newitem.department != olditem.department || + olditem.showmovie != newitem.showmovie || + newitem.tvshows != olditem.tvshows; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/peopledetail_page/components/timeline_component/effect.dart b/lib/views/peopledetail_page/components/timeline_component/effect.dart new file mode 100644 index 00000000..42be02af --- /dev/null +++ b/lib/views/peopledetail_page/components/timeline_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TimeLineAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/peopledetail_page/components/timeline_component/reducer.dart b/lib/views/peopledetail_page/components/timeline_component/reducer.dart new file mode 100644 index 00000000..9b55f442 --- /dev/null +++ b/lib/views/peopledetail_page/components/timeline_component/reducer.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TimeLineAction.action: _onAction, + TimeLineAction.actingChanged:_onActingChanged, + }, + ); +} + +TimeLineState _onAction(TimeLineState state, Action action) { + final TimeLineState newState = state.clone(); + return newState; +} +TimeLineState _onActingChanged(TimeLineState state, Action action) { + final b=action.payload??true; + final TimeLineState newState = state.clone(); + newState.showmovie=b; + return newState; +} diff --git a/lib/views/peopledetail_page/components/timeline_component/state.dart b/lib/views/peopledetail_page/components/timeline_component/state.dart new file mode 100644 index 00000000..27b3c807 --- /dev/null +++ b/lib/views/peopledetail_page/components/timeline_component/state.dart @@ -0,0 +1,47 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/views/peopledetail_page/state.dart'; + +class TimeLineState implements Cloneable { + String department; + bool showmovie = true; + List movies; + List tvshows; + ScrollPhysics scrollPhysics; + + TimeLineState( + {this.department, + this.showmovie, + this.scrollPhysics, + this.movies, + this.tvshows}); + + @override + TimeLineState clone() { + return TimeLineState() + ..department = department + ..showmovie = showmovie + ..scrollPhysics = scrollPhysics + ..movies = movies + ..tvshows = tvshows; + } +} + +class TimeLineConnector extends ConnOp { + @override + TimeLineState get(PeopleDetailPageState state) { + TimeLineState mstate = TimeLineState(); + mstate.department = state.peopleDetailModel.knownForDepartment; + mstate.showmovie = state.showmovie; + mstate.scrollPhysics = state.pageScrollPhysics; + mstate.movies = state.movies; + mstate.tvshows = state.tvshows; + return mstate; + } + + @override + void set(PeopleDetailPageState state, TimeLineState subState) { + state.showmovie = subState.showmovie; + } +} diff --git a/lib/views/peopledetail_page/components/timeline_component/view.dart b/lib/views/peopledetail_page/components/timeline_component/view.dart new file mode 100644 index 00000000..1e1e6213 --- /dev/null +++ b/lib/views/peopledetail_page/components/timeline_component/view.dart @@ -0,0 +1,154 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/peopledetail_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + TimeLineState state, Dispatch dispatch, ViewService viewService) { + return _ActingBody( + data: state.showmovie ? state.movies : state.tvshows, + scrollPhysics: state.scrollPhysics, + showMovie: state.showmovie, + onTap: (d) => dispatch(PeopleDetailPageActionCreator.onCellTapped( + d.id, + d.backdropPath, + d.title ?? d.name, + d.posterPath, + d.mediaType == 'movie' ? MediaType.movie : MediaType.person)), + ); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + return Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: Adapt.px(24), + width: Adapt.px(500), + color: const Color(0xFFEEEEEE), + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + height: Adapt.px(24), + width: Adapt.px(150), + color: const Color(0xFFEEEEEE), + ), + ], + ), + ], + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + children: [ + const SizedBox(height: 10), + const _ShimmerCell(), + const SizedBox(height: 20), + const _ShimmerCell(), + const SizedBox(height: 20), + const _ShimmerCell(), + const SizedBox(height: 20), + const _ShimmerCell(), + const SizedBox(height: 10), + ], + ), + ), + ), + ); + } +} + +class _Cell extends StatelessWidget { + final CombinedCastData data; + final Function onTap; + const _Cell({Key key, @required this.data, this.onTap}) : super(key: key); + @override + Widget build(BuildContext context) { + final double _leftwidth = (Adapt.screenW() - 100); + String date = + data.mediaType == 'movie' ? data.releaseDate : data.firstAirDate; + date = date == null || date?.isEmpty == true + ? '-' + : DateTime.parse(date).year.toString(); + return GestureDetector( + key: ValueKey('timelineCell${data.creditId}'), + onTap: onTap, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: _leftwidth, + child: Text(data.title ?? data.name, + style: TextStyle(fontWeight: FontWeight.w600)), + ), + SizedBox( + width: _leftwidth, + child: Text( + data?.character?.isEmpty == true || + data.character == null + ? '-' + : data.character, + style: TextStyle(color: Colors.grey[400]))) + ], + ), + Text(date) + ], + ), + ), + ); + } +} + +class _ActingBody extends StatelessWidget { + final bool showMovie; + final List data; + final Function(CombinedCastData) onTap; + final ScrollPhysics scrollPhysics; + const _ActingBody( + {this.showMovie, this.data, this.onTap, this.scrollPhysics}); + @override + Widget build(BuildContext context) { + return data.length > 0 + ? SliverList( + delegate: SliverChildBuilderDelegate((_, index) { + final d = data[index]; + return _Cell( + key: ValueKey("Cell${d.id}"), + data: d, + onTap: () => onTap(d), + ); + }, childCount: data.length)) + : _ShimmerList(); + } +} diff --git a/lib/views/peopledetail_page/effect.dart b/lib/views/peopledetail_page/effect.dart new file mode 100644 index 00000000..d048cf78 --- /dev/null +++ b/lib/views/peopledetail_page/effect.dart @@ -0,0 +1,69 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/models.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PeopleDetailPageAction.action: _onAction, + PeopleDetailPageAction.cellTapped: _cellTapped, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + int id = ctx.state.peopleid; + await Future.delayed(Duration(milliseconds: 200), () async { + final _tmdb = TMDBApi.instance; + final _peopleDetail = + await _tmdb.getPeopleDetail(id, appendToResponse: 'images'); + if (_peopleDetail.success) + ctx.dispatch(PeopleDetailPageActionCreator.onInit(_peopleDetail.result)); + var _combinedCredits = await _tmdb.getCombinedCredits(id); + if (_combinedCredits.success) { + var cast = List(); + cast = new List()..addAll(_combinedCredits.result.cast); + cast.sort((a, b) => b.voteCount.compareTo(a.voteCount)); + _combinedCredits.result.cast = new List() + ..addAll(_combinedCredits.result.cast); + _combinedCredits.result.cast.sort((a, b) { + String date1 = a.mediaType == 'movie' ? a.releaseDate : a.firstAirDate; + String date2 = b.mediaType == 'movie' ? b.releaseDate : b.firstAirDate; + date1 = date1 == null || date1?.isEmpty == true ? '2099-01-01' : date1; + date2 = date2 == null || date2?.isEmpty == true ? '2099-01-01' : date2; + DateTime time1 = DateTime.parse(date1); + DateTime time2 = DateTime.parse(date2); + return time2.year == time1.year + ? (time2.month > time1.month ? 1 : -1) + : (time2.year > time1.year ? 1 : -1); + }); + + var _model = _combinedCredits.result.cast ?? []; + ctx.state.movies = _model.where((d) => d.mediaType == 'movie').toList(); + ctx.state.tvshows = _model.where((d) => d.mediaType == 'tv').toList(); + ctx.dispatch(PeopleDetailPageActionCreator.onSetCreditModel( + _combinedCredits.result, cast)); + } + }); +} + +void _cellTapped(Action action, Context ctx) async { + final MediaType type = action.payload[4]; + final int id = action.payload[0]; + final String title = action.payload[2]; + final String posterpic = action.payload[3]; + final String pagename = + type == MediaType.movie ? 'detailpage' : 'tvShowDetailPage'; + var data = { + 'id': id, + 'bgpic': posterpic, + 'name': title, + 'posterpic': posterpic + }; + await Navigator.of(ctx.context).pushNamed(pagename, arguments: data); +} diff --git a/lib/views/peopledetail_page/page.dart b/lib/views/peopledetail_page/page.dart new file mode 100644 index 00000000..6caef69e --- /dev/null +++ b/lib/views/peopledetail_page/page.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/gallery_component/component.dart'; +import 'components/gallery_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/knownfor_component/component.dart'; +import 'components/knownfor_component/state.dart'; +import 'components/personalinfo_component/component.dart'; +import 'components/personalinfo_component/state.dart'; +import 'components/timeline_component/component.dart'; +import 'components/timeline_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PeopleDetailPage + extends Page> { + PeopleDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'personalInfo': + PersonalInfoConnector() + PersonalInfoComponent(), + 'knowFor': KnownForConnector() + KnownForComponent(), + 'gallery': GalleryConnector() + GalleryComponent(), + 'timeline': TimeLineConnector() + TimeLineComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/peopledetail_page/reducer.dart b/lib/views/peopledetail_page/reducer.dart new file mode 100644 index 00000000..e9c5da75 --- /dev/null +++ b/lib/views/peopledetail_page/reducer.dart @@ -0,0 +1,64 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/models/people_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PeopleDetailPageAction.action: _onAction, + PeopleDetailPageAction.init: _onInit, + PeopleDetailPageAction.setCreditModel: _onSetCreditModel, + PeopleDetailPageAction.showBiography: _onShowBiography, + PeopleDetailPageAction.showMovie: _showMovie, + }, + ); +} + +PeopleDetailPageState _onAction(PeopleDetailPageState state, Action action) { + final PeopleDetailPageState newState = state.clone(); + return newState; +} + +PeopleDetailPageState _onInit(PeopleDetailPageState state, Action action) { + final PeopleDetailModel m = action.payload ?? + PeopleDetailModel.fromParams(alsoKnownAs: List()); + final PeopleDetailPageState newState = state.clone(); + newState.peopleDetailModel = m; + newState.profilePath = m.profilePath; + return newState; +} + +PeopleDetailPageState _onSetCreditModel( + PeopleDetailPageState state, Action action) { + final CombinedCreditsModel m = + action.payload[0] ?? CombinedCreditsModel.fromParams(cast: [], crew: []); + final List cast = action.payload[1] ?? []; + final PeopleDetailPageState newState = state.clone(); + newState.creditsModel = m; + newState.knowForCast = cast; + return newState; +} + +PeopleDetailPageState _onShowBiography( + PeopleDetailPageState state, Action action) { + final PeopleDetailPageState newState = state.clone(); + if (state.isBiographyOpen) { + newState.biographyHeight = Adapt.px(200); + newState.isBiographyOpen = false; + } else { + newState.biographyHeight = Adapt.px(500); + newState.isBiographyOpen = true; + } + return newState; +} + +PeopleDetailPageState _showMovie(PeopleDetailPageState state, Action action) { + final b = action.payload ?? true; + final PeopleDetailPageState newState = state.clone(); + newState.showmovie = b; + return newState; +} diff --git a/lib/views/peopledetail_page/state.dart b/lib/views/peopledetail_page/state.dart new file mode 100644 index 00000000..14c6b3b8 --- /dev/null +++ b/lib/views/peopledetail_page/state.dart @@ -0,0 +1,71 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/models/people_detail.dart'; + +class PeopleDetailPageState + implements GlobalBaseState, Cloneable { + PeopleDetailModel peopleDetailModel; + CombinedCreditsModel creditsModel; + List knowForCast; + List movies; + List tvshows; + int peopleid; + double biographyHeight; + bool isBiographyOpen; + bool showmovie; + String profilePath; + String profileName; + String character; + ScrollPhysics pageScrollPhysics; + @override + PeopleDetailPageState clone() { + return PeopleDetailPageState() + ..peopleDetailModel = peopleDetailModel + ..peopleid = peopleid + ..profilePath = profilePath + ..profileName = profileName + ..creditsModel = creditsModel + ..isBiographyOpen = isBiographyOpen + ..biographyHeight = biographyHeight + ..showmovie = showmovie + ..knowForCast = knowForCast + ..pageScrollPhysics = pageScrollPhysics + ..movies = movies + ..tvshows = tvshows; + } + + @override + Color themeColor; + + @override + Locale locale; + + @override + AppUser user; +} + +PeopleDetailPageState initState(Map args) { + var state = PeopleDetailPageState(); + state.peopleDetailModel = + PeopleDetailModel.fromParams(alsoKnownAs: List()); + state.creditsModel = CombinedCreditsModel.fromParams( + cast: List(), crew: List()); + state.biographyHeight = Adapt.px(200.0); + state.isBiographyOpen = false; + state.showmovie = true; + state.pageScrollPhysics = ClampingScrollPhysics(); + state.knowForCast = []; + state.peopleid = args['peopleid']; + state.profilePath = args['profilePath']; + state.profileName = args['profileName']; + state.character = args['character']; + state.movies = []; + state.tvshows = []; + return state; +} diff --git a/lib/views/peopledetail_page/view.dart b/lib/views/peopledetail_page/view.dart new file mode 100644 index 00000000..a11175dc --- /dev/null +++ b/lib/views/peopledetail_page/view.dart @@ -0,0 +1,128 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + PeopleDetailPageState state, Dispatch dispatch, ViewService viewService) { + //var adapter = viewService.buildAdapter(); + return Scaffold( + //backgroundColor: Colors.grey[100], + body: AnnotatedRegion( + value: SystemUiOverlayStyle.light, + child: Stack( + alignment: Alignment.topRight, + children: [ + CustomScrollView( + slivers: [ + viewService.buildComponent('header'), + viewService.buildComponent('personalInfo'), + viewService.buildComponent('knowFor'), + viewService.buildComponent('gallery'), + _ActionTitle( + title: state.peopleDetailModel?.knownForDepartment ?? 'Acting', + showMovie: state.showmovie, + onTap: (b) => + dispatch(PeopleDetailPageActionCreator.showMovie(b)), + ), + viewService.buildComponent('timeline'), + SliverToBoxAdapter( + child: const SizedBox(height: 20), + ) + ], + ), + SafeArea( + child: Container( + margin: EdgeInsets.only(top: 10, right: 20), + width: 30, + height: 30, + decoration: + BoxDecoration(shape: BoxShape.circle, color: Colors.black38), + child: IconButton( + padding: EdgeInsets.zero, + onPressed: () => Navigator.of(viewService.context).pop(), + icon: Icon( + Icons.close, + size: 20, + ), + color: Colors.white, + ), + ), + ), + ], + ), + ), + ); +} + +class _ActionTitle extends StatelessWidget { + final String title; + final bool showMovie; + final Function(bool) onTap; + const _ActionTitle({this.title, this.onTap, this.showMovie}); + @override + Widget build(BuildContext context) { + final _selectTextStyle = TextStyle(fontWeight: FontWeight.w500); + final _unSelectTextStyle = TextStyle(color: Colors.grey); + return SliverToBoxAdapter( + child: Padding( + padding: + EdgeInsets.fromLTRB(Adapt.px(30), 0, Adapt.px(30), Adapt.px(30)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _Title(department: title), + Expanded( + child: Container(), + ), + GestureDetector( + onTap: () => onTap(true), + child: Text(I18n.of(context).movies, + style: showMovie ? _selectTextStyle : _unSelectTextStyle), + ), + SizedBox( + width: Adapt.px(20), + ), + GestureDetector( + onTap: () => onTap(false), + child: Text(I18n.of(context).tvShows, + style: showMovie ? _unSelectTextStyle : _selectTextStyle), + ) + ], + ), + ), + ); + } +} + +class _Title extends StatelessWidget { + final String department; + const _Title({this.department}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return department == null + ? SizedBox( + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Container( + height: Adapt.px(40), + width: Adapt.px(150), + color: Colors.grey[200], + ), + ), + ) + : Text( + department ?? '', + softWrap: true, + style: TextStyle(fontWeight: FontWeight.w500, fontSize: 18), + ); + } +} diff --git a/lib/views/premium_page/action.dart b/lib/views/premium_page/action.dart new file mode 100644 index 00000000..7aed9a13 --- /dev/null +++ b/lib/views/premium_page/action.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_subscription.dart'; + +enum PremiumPageAction { action, setSubscription, changePlan, loading } + +class PremiumPageActionCreator { + static Action onAction() { + return const Action(PremiumPageAction.action); + } + + static Action setSubscription(BraintreeSubscription subscription) { + return Action(PremiumPageAction.setSubscription, payload: subscription); + } + + static Action changePlan() { + return Action(PremiumPageAction.changePlan); + } + + static Action loading(bool loading) { + return Action(PremiumPageAction.loading, payload: loading); + } +} diff --git a/lib/views/premium_page/components/plan_component/action.dart b/lib/views/premium_page/components/plan_component/action.dart new file mode 100644 index 00000000..b89d6439 --- /dev/null +++ b/lib/views/premium_page/components/plan_component/action.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum PlanAction { action, unSubscribe, loading } + +class PlanActionCreator { + static Action onAction() { + return const Action(PlanAction.action); + } + + static Action unSubscribe() { + return const Action(PlanAction.unSubscribe); + } + + static Action loading(bool loading) { + return Action(PlanAction.unSubscribe, payload: loading); + } +} diff --git a/lib/views/premium_page/components/plan_component/component.dart b/lib/views/premium_page/components/plan_component/component.dart new file mode 100644 index 00000000..d521f0e4 --- /dev/null +++ b/lib/views/premium_page/components/plan_component/component.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PlanComponent extends Component { + PlanComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + }),); + +} diff --git a/lib/views/premium_page/components/plan_component/effect.dart b/lib/views/premium_page/components/plan_component/effect.dart new file mode 100644 index 00000000..6dcb69c7 --- /dev/null +++ b/lib/views/premium_page/components/plan_component/effect.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/action.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/views/premium_page/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PlanAction.action: _onAction, + PlanAction.unSubscribe: _unSubscribe, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _unSubscribe(Action action, Context ctx) async { + ctx.dispatch(PremiumPageActionCreator.loading(true)); + if (ctx.state?.user?.premium != null) { + final _baseApi = BaseApi.instance; + final _result = await _baseApi.cancelSubscription(ctx.state.user.premium); + if (_result.success) + GlobalStore.store + .dispatch(GlobalActionCreator.setUserPremium(_result.result)); + } + ctx.dispatch(PremiumPageActionCreator.loading(false)); +} diff --git a/lib/views/premium_page/components/plan_component/reducer.dart b/lib/views/premium_page/components/plan_component/reducer.dart new file mode 100644 index 00000000..153178a7 --- /dev/null +++ b/lib/views/premium_page/components/plan_component/reducer.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer(>{ + PlanAction.action: _onAction, + PlanAction.loading: _loading, + }); +} + +PlanState _onAction(PlanState state, Action action) { + final PlanState newState = state.clone(); + return newState; +} + +PlanState _loading(PlanState state, Action action) { + final bool _loading = action.payload ?? false; + final PlanState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/premium_page/components/plan_component/state.dart b/lib/views/premium_page/components/plan_component/state.dart new file mode 100644 index 00000000..0ba12e43 --- /dev/null +++ b/lib/views/premium_page/components/plan_component/state.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/views/premium_page/state.dart'; + +class PlanState implements Cloneable { + ScrollController scrollController; + AppUser user; + bool loading; + @override + PlanState clone() { + return PlanState() + ..user = user + ..loading = loading + ..scrollController = scrollController; + } +} + +class PlanConnector extends ConnOp { + @override + PlanState get(PremiumPageState state) { + PlanState mstate = PlanState(); + mstate.scrollController = state.scrollController; + mstate.user = state.user; + mstate.loading = state.loading; + return mstate; + } + + @override + void set(PremiumPageState state, PlanState subState) { + state.loading = subState.loading; + } +} diff --git a/lib/views/premium_page/components/plan_component/view.dart b/lib/views/premium_page/components/plan_component/view.dart new file mode 100644 index 00000000..7517d939 --- /dev/null +++ b/lib/views/premium_page/components/plan_component/view.dart @@ -0,0 +1,275 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/checkout_model.dart'; +import 'package:movie/models/enums/premium_type.dart'; +import 'package:movie/views/premium_page/components/plan_component/action.dart'; + +import 'state.dart'; + +Widget buildView(PlanState state, Dispatch dispatch, ViewService viewService) { + return AnnotatedRegion( + value: SystemUiOverlayStyle.light, + child: Stack(children: [ + _Background(controller: state.scrollController), + _Swiper( + scrollController: state.scrollController, + user: state.user, + dispatch: dispatch, + ), + _Appbar(), + state.loading ? _LoadingLayout() : SizedBox() + ])); +} + +class _SubscriptionPlanItem { + int id; + String name; + double amount; + PremiumType type; + _SubscriptionPlanItem({this.id, this.name, this.amount, this.type}); +} + +class _Background extends StatelessWidget { + final ScrollController controller; + const _Background({this.controller}); + @override + Widget build(BuildContext context) { + return ListView( + controller: controller, + scrollDirection: Axis.horizontal, + children: [ + Container( + height: Adapt.screenH(), + width: Adapt.screenW() * 4, + foregroundDecoration: BoxDecoration(color: Color(0x90000000)), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'https://image.tmdb.org/t/p/original/2lBOQK06tltt8SQaswgb8d657Mv.jpg'), + ), + ), + ), + ], + ); + } +} + +class _SubscriptionPlanCell extends StatelessWidget { + final _SubscriptionPlanItem data; + final bool isSubscried; + final Dispatch dispatch; + const _SubscriptionPlanCell({this.data, this.isSubscried, this.dispatch}); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(50)), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 30), + Container( + child: Text( + '${data.name} of premium for \$ ${data.amount}', + style: TextStyle( + fontSize: Adapt.px(60), + color: const Color(0xFFFFFFFF), + fontWeight: FontWeight.bold), + ), + ), + const SizedBox(height: 20), + const Text( + 'Watch Movie and TvShows without ads, download video if support', + style: TextStyle(color: const Color(0xFF9E9E9E), height: 1.6), + ), + const SizedBox(height: 30), + SizedBox( + width: Adapt.screenW(), + height: Adapt.px(30), + child: isSubscried + ? const Text( + 'This is your current plan', + style: TextStyle( + color: const Color(0xFFFFB74D), + ), + ) + : null, + ), + const SizedBox(height: 10), + isSubscried + ? GestureDetector( + onTap: () => dispatch(PlanActionCreator.unSubscribe()), + child: Container( + height: Adapt.px(80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + border: Border.all(color: Color(0xFFEB7875)), + color: Color(0x50000000), + ), + child: Center( + child: const Text( + 'UNSUBSCRIBE', + style: TextStyle( + color: const Color(0xFFEB7875), + ), + ), + ), + ), + ) + : GestureDetector( + onTap: () async => await Navigator.of(context) + .pushNamed('checkoutPage', arguments: { + 'data': CheckOutModel( + name: 'Premium ${data.name}', + amount: data.amount, + premiumType: data.type, + isPremium: true) + }), + child: Container( + height: Adapt.px(80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + color: const Color(0xFFEB7875), + ), + child: Center( + child: const Text( + 'SUBSCRIBE', + style: TextStyle( + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ), + ], + ), + ); + } +} + +class _Swiper extends StatefulWidget { + final ScrollController scrollController; + final Dispatch dispatch; + final AppUser user; + const _Swiper({this.scrollController, this.user, this.dispatch}); + @override + _SwiperState createState() => _SwiperState(); +} + +class _SwiperState extends State<_Swiper> { + SwiperController _controller; + int selectIndex = 0; + final double itemWidth = Adapt.screenW() * 0.6; + final _items = [ + _SubscriptionPlanItem( + id: 1, name: '1 Month', amount: 2.99, type: PremiumType.oneMonth), + _SubscriptionPlanItem( + id: 2, name: '3 Months', amount: 6.99, type: PremiumType.threeMonths), + _SubscriptionPlanItem( + id: 3, name: '6 Months', amount: 9.99, type: PremiumType.sixMonths), + _SubscriptionPlanItem( + id: 4, name: '12 Months', amount: 16.99, type: PremiumType.twelveMonths) + ]; + @override + void initState() { + _controller = SwiperController(); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + child: Swiper( + itemCount: 4, + controller: _controller, + onIndexChanged: (index) { + setState(() { + selectIndex = index; + }); + widget.scrollController.animateTo(Adapt.screenW() * selectIndex, + duration: Duration(milliseconds: 600), curve: Curves.ease); + }, + loop: false, + fade: 0.1, + viewportFraction: 0.6, + scale: 0.5, + itemBuilder: (_, index) { + final _item = _items[index]; + return _SubscriptionPlanCell( + dispatch: widget.dispatch, + data: _item, + isSubscried: widget.user.premium?.premiumType == _item.id && + widget.user.premium.subscription, + ); + }, + ), + ); + } +} + +class _Appbar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Positioned( + top: 0, + left: 0, + right: 0, + child: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + centerTitle: false, + title: Text('Subscription Plan'), + )); + } +} + +class _LoadingLayout extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: Container( + width: Adapt.screenW(), + height: Adapt.screenH(), + color: const Color(0x20000000), + child: Center( + child: Container( + width: Adapt.px(300), + height: Adapt.px(300), + decoration: BoxDecoration( + color: const Color(0xAA000000), + borderRadius: BorderRadius.circular( + Adapt.px(20), + ), + ), + child: + Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(const Color(0xFFFFFFFF)), + ), + SizedBox(height: Adapt.px(30)), + const Text( + 'Working', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 14, + ), + ) + ]), + ), + ), + ), + ); + } +} diff --git a/lib/views/premium_page/components/premium_info_component/action.dart b/lib/views/premium_page/components/premium_info_component/action.dart new file mode 100644 index 00000000..7708168c --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum PremiumInfoAction { action, subscribeChanged } + +class PremiumInfoActionCreator { + static Action onAction() { + return const Action(PremiumInfoAction.action); + } + + static Action subscribeChanged() { + return const Action(PremiumInfoAction.subscribeChanged); + } +} diff --git a/lib/views/premium_page/components/premium_info_component/component.dart b/lib/views/premium_page/components/premium_info_component/component.dart new file mode 100644 index 00000000..723771b4 --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PremiumInfoComponent extends Component { + PremiumInfoComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent() + }), + ); +} diff --git a/lib/views/premium_page/components/premium_info_component/components/header_component/component.dart b/lib/views/premium_page/components/premium_info_component/components/header_component/component.dart new file mode 100644 index 00000000..c122fbdc --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/components/header_component/component.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + view: buildView, + shouldUpdate: (oldState, newState) { + return oldState.user != newState.user; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/premium_page/components/premium_info_component/components/header_component/state.dart b/lib/views/premium_page/components/premium_info_component/components/header_component/state.dart new file mode 100644 index 00000000..d9c0c75e --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/components/header_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/views/premium_page/components/premium_info_component/state.dart'; + +class HeaderState implements Cloneable { + AppUser user; + @override + HeaderState clone() { + return HeaderState(); + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(PremiumInfoState state) { + HeaderState mstate = HeaderState(); + mstate.user = state.user; + return mstate; + } +} diff --git a/lib/views/premium_page/components/premium_info_component/components/header_component/view.dart b/lib/views/premium_page/components/premium_info_component/components/header_component/view.dart new file mode 100644 index 00000000..fd27e455 --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/components/header_component/view.dart @@ -0,0 +1,175 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/user_premium_model.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + return Container( + margin: EdgeInsets.only(top: Adapt.padTopH()), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + height: Adapt.px(300), + child: Stack( + children: [ + _HeaderInfo(user: state.user), + GestureDetector( + onTap: () => Navigator.of(viewService.context).pop(), + child: Align( + alignment: Alignment.topRight, + child: Icon( + Icons.close, + color: Colors.grey, + ), + ), + ) + ], + ), + ); +} + +class _HeaderInfo extends StatelessWidget { + final AppUser user; + const _HeaderInfo({@required this.user}); + @override + Widget build(BuildContext context) { + final _premiumInfo = { + 1: '\$ 2.99 / month', + 2: '\$ 6.99 / 3 months', + 3: '\$ 9.99 / 6 months', + 4: '\$ 16.99 / 1 year' + }; + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: Adapt.px(180), + height: Adapt.px(180), + decoration: BoxDecoration( + color: const Color(0xFF9E92E1), + borderRadius: BorderRadius.circular( + Adapt.px(20), + ), + ), + child: Center( + child: const Text( + 'logo', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + ), + ), + SizedBox(width: Adapt.px(40)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Premium', + style: TextStyle( + color: const Color(0xFF9E9E9E), fontSize: Adapt.px(28)), + ), + SizedBox(height: Adapt.px(8)), + Text( + _premiumInfo[user?.premium?.premiumType ?? 1], + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + ), + SizedBox(height: Adapt.px(15)), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: 'Next payment ', + style: TextStyle( + color: const Color(0xFF9E9E9E), + )), + TextSpan( + text: user.premium.subscription + ? DateFormat.yMMMd().format( + DateTime.parse(user.premium.expireDate) + .add(Duration(days: 1))) + : '-', + style: TextStyle(fontWeight: FontWeight.bold)) + ], + ), + ), + SizedBox(height: Adapt.px(8)), + _LinearProgressIndicator( + premiumData: user.premium, + ), + SizedBox(height: Adapt.px(5)), + SizedBox( + width: Adapt.px(400), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + DateFormat.MMMd() + .format(DateTime.parse(user.premium.startDate)), + style: TextStyle( + color: const Color(0xFFA0A0A0), + fontSize: Adapt.px(20), + ), + ), + Text( + DateFormat.MMMd() + .format(DateTime.parse(user.premium.expireDate)), + style: TextStyle( + color: const Color(0xFFA0A0A0), fontSize: Adapt.px(20)), + ), + ], + ), + ), + ], + ), + ], + ); + } +} + +class _LinearProgressIndicator extends StatelessWidget { + final UserPremiumData premiumData; + const _LinearProgressIndicator({this.premiumData}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _total = + DateTime.parse(premiumData.expireDate).millisecondsSinceEpoch - + DateTime.parse(premiumData.startDate).millisecondsSinceEpoch; + final _value = + DateTime.now().add(Duration(hours: 2)).millisecondsSinceEpoch - + DateTime.parse(premiumData.startDate).millisecondsSinceEpoch; + return Container( + width: Adapt.px(400), + height: Adapt.px(22), + padding: EdgeInsets.all(Adapt.px(6)), + decoration: BoxDecoration( + color: _theme.brightness == Brightness.light + ? const Color(0xFFE0E0E0) + : const Color(0xFF606060), + borderRadius: BorderRadius.circular(Adapt.px(11))), + child: Row(children: [ + Container( + width: (_value / _total) * Adapt.px(390), + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Colors.purple[200], + Colors.purple[100], + ]), + borderRadius: BorderRadius.circular( + Adapt.px(7.5), + ), + ), + ) + ]), + ); + } +} diff --git a/lib/views/premium_page/components/premium_info_component/effect.dart b/lib/views/premium_page/components/premium_info_component/effect.dart new file mode 100644 index 00000000..ee30889a --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/effect.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PremiumInfoAction.action: _onAction, + PremiumInfoAction.subscribeChanged: _subscribeChanged, + }); +} + +void _onAction(Action action, Context ctx) {} +void _subscribeChanged(Action action, Context ctx) {} diff --git a/lib/views/premium_page/components/premium_info_component/reducer.dart b/lib/views/premium_page/components/premium_info_component/reducer.dart new file mode 100644 index 00000000..8de48820 --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PremiumInfoAction.action: _onAction, + }, + ); +} + +PremiumInfoState _onAction(PremiumInfoState state, Action action) { + final PremiumInfoState newState = state.clone(); + return newState; +} diff --git a/lib/views/premium_page/components/premium_info_component/state.dart b/lib/views/premium_page/components/premium_info_component/state.dart new file mode 100644 index 00000000..72f32e87 --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/state.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/braintree_subscription.dart'; +import 'package:movie/views/premium_page/state.dart'; + +class PremiumInfoState implements Cloneable { + AppUser user; + BraintreeSubscription subscription; + bool loading; + @override + PremiumInfoState clone() { + return PremiumInfoState()..user = user; + } +} + +class PremiumInfoConnector extends ConnOp { + @override + PremiumInfoState get(PremiumPageState state) { + PremiumInfoState mstate = PremiumInfoState(); + mstate.user = state.user; + mstate.subscription = state.subscription; + mstate.loading = state.loading; + return mstate; + } +} diff --git a/lib/views/premium_page/components/premium_info_component/view.dart b/lib/views/premium_page/components/premium_info_component/view.dart new file mode 100644 index 00000000..0347d502 --- /dev/null +++ b/lib/views/premium_page/components/premium_info_component/view.dart @@ -0,0 +1,344 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/braintree_creditcard.dart'; +import 'package:movie/models/base_api_model/braintree_subscription.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/models/base_api_model/braintree_transaction.dart'; +import 'package:movie/views/premium_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + PremiumInfoState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: Container( + color: _theme.brightness == Brightness.light + ? const Color(0xFFF0F0F0) + : const Color(0xFF505050), + child: Column( + children: [ + viewService.buildComponent('header'), + _Body( + subscription: state.subscription, + user: state.user, + dispatch: dispatch, + ) + ], + ), + )); + }); +} + +class _Body extends StatelessWidget { + final BraintreeSubscription subscription; + final AppUser user; + final Dispatch dispatch; + const _Body({this.subscription, this.user, this.dispatch}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Expanded( + child: Container( + width: Adapt.screenW(), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(50), vertical: Adapt.px(50)), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(30)), + Row(children: [ + Text( + 'Payment Method', + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.w500), + ) + ]), + SizedBox(height: Adapt.px(30)), + _PaymentMethodCell( + transaction: subscription?.transactions != null && + (subscription?.transactions?.length ?? 0) > 0 + ? subscription.transactions.last + : null), + SizedBox(height: Adapt.px(30)), + /* Padding( + padding: EdgeInsets.symmetric(vertical: Adapt.px(50)), + child: Row( + children: [ + Text( + 'Subscribe', + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.w500), + ), + Expanded(child: SizedBox()), + CupertinoSwitch( + value: user.premium.subscription, onChanged: (e) {}), + ], + ), + ),*/ + Padding( + padding: EdgeInsets.symmetric(vertical: Adapt.px(50)), + child: Row( + children: [ + Text( + 'Bill', + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.w500), + ), + Expanded(child: SizedBox()), + Icon( + Icons.arrow_forward_ios, + color: const Color(0xFF9E9E9E), + ), + ], + ), + ), + InkWell( + onTap: () => dispatch(PremiumPageActionCreator.changePlan()), + child: Padding( + padding: EdgeInsets.symmetric(vertical: Adapt.px(50)), + child: Row( + children: [ + Text( + 'Change Plan', + style: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.w500), + ), + Expanded(child: SizedBox()), + Icon( + Icons.arrow_forward_ios, + color: const Color(0xFF9E9E9E), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} + +class _PaymentMethodCell extends StatelessWidget { + final Transaction transaction; + const _PaymentMethodCell({this.transaction}); + @override + Widget build(BuildContext context) { + Widget _child; + + if (transaction == null) + _child = _PaymentMethodShimmer(); + else if (transaction.creditCard?.lastFour != null) + _child = _CreditCardCell(creditCard: transaction.creditCard); + else if (transaction.payPalDetails != null) + _child = _PayPalCell(details: transaction.payPalDetails); + else + _child = _PaymentMethodShimmer(); + + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: _child, + ); + } +} + +class _CreditCardCell extends StatelessWidget { + final CreditCard creditCard; + const _CreditCardCell({this.creditCard}); + + @override + Widget build(BuildContext context) { + final _creditCardTheme = { + 'Visa': ['images/visa_logo.png', const Color(0xFF9E92E1)], + 'JCB': ['images/jcb_logo.png', const Color(0xFFE3d2c2)], + 'Discover': ['images/discover_logo.png', const Color(0XFF66AA9E)], + 'MasterCard': ['images/mastercard_logo.png', const Color(0xFF556677)], + '-': ['images/visa_logo.png', const Color(0xFF556677)], + }; + final Color _cardColor = + _creditCardTheme[creditCard?.cardType?.value ?? '-'][1]; + + final TextStyle _textStyle = TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: Adapt.px(35), + ); + + return Container( + width: Adapt.screenW(), + height: Adapt.px(380), + padding: EdgeInsets.symmetric(horizontal: 40, vertical: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + _cardColor.withAlpha(100), + _cardColor.withAlpha(200), + _cardColor, + ], + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Align( + alignment: Alignment.topRight, + child: Container( + constraints: BoxConstraints(maxWidth: Adapt.px(150)), + height: Adapt.px(50), + child: Image.asset( + _creditCardTheme[creditCard?.cardType?.value ?? '-'][0], + fit: BoxFit.contain, + ), + ), + ), + SizedBox(height: Adapt.px(60)), + Container( + height: Adapt.px(40), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('****', style: _textStyle), + Text('****', style: _textStyle), + Text('****', style: _textStyle), + Text( + '${creditCard?.lastFour ?? '****'}', + style: _textStyle, + ) + ], + ), + ), + Expanded(child: SizedBox()), + Text( + 'Expires', + style: TextStyle(color: Color(0xFFE0E0E0)), + ), + const SizedBox(height: 2), + Text( + creditCard?.expirationDate ?? 'MM/yyyy', + style: TextStyle(color: Color(0xFFFFFFFF)), + ) + ], + ), + ); + } +} + +class _PayPalCell extends StatelessWidget { + final PayPalDetails details; + const _PayPalCell({this.details}); + @override + Widget build(BuildContext context) { + final _cardColor = const Color(0xFF1080F0); + return Container( + width: Adapt.screenW(), + height: Adapt.px(380), + padding: EdgeInsets.symmetric(horizontal: 40, vertical: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + _cardColor.withAlpha(100), + _cardColor.withAlpha(200), + _cardColor, + ], + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Align( + alignment: Alignment.topRight, + child: Container( + constraints: BoxConstraints(maxWidth: Adapt.px(150)), + height: Adapt.px(50), + child: Image.asset( + 'images/paypal_logo.png', + fit: BoxFit.contain, + ), + ), + ), + SizedBox(height: Adapt.px(60)), + Container( + height: Adapt.px(40), + child: Text( + details?.payerEmail ?? '-', + style: TextStyle( + color: Color(0xFFFFFFFF), + fontSize: Adapt.px(28), + ), + ), + ), + Expanded(child: SizedBox()), + Container( + height: Adapt.px(40), + child: Text( + '${details?.payerFirstName ?? '-'} ${details?.payerLastName ?? '-'}', + style: TextStyle( + color: Color(0xFFFFFFFF), + fontSize: Adapt.px(28), + ), + ), + ), + ], + ), + ); + } +} + +class _PaymentMethodShimmer extends StatelessWidget { + @override + Widget build(BuildContext context) { + final _cardColor = const Color(0xFF556677); + final _contextColor = const Color(0xFF506070); + return Container( + width: Adapt.screenW(), + height: Adapt.px(380), + padding: EdgeInsets.symmetric(horizontal: 40, vertical: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + _cardColor.withAlpha(100), + _cardColor.withAlpha(200), + _cardColor, + ], + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + color: _contextColor, + shape: BoxShape.circle, + ), + ), + SizedBox(height: Adapt.px(50)), + ], + ), + ); + } +} diff --git a/lib/views/premium_page/effect.dart b/lib/views/premium_page/effect.dart new file mode 100644 index 00000000..b8a7a29b --- /dev/null +++ b/lib/views/premium_page/effect.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PremiumPageAction.action: _onAction, + PremiumPageAction.changePlan: _changePlan, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + ctx.state.scrollController = ScrollController(); + if (ctx.state?.user?.premium != null) { + if (ctx.state.user.premium.subscriptionId == null) return; + final _baseApi = BaseApi.instance; + final _subscription = await _baseApi + .getPremiumSubscription(ctx.state.user.premium.subscriptionId); + if (_subscription.success) + ctx.dispatch( + PremiumPageActionCreator.setSubscription(_subscription.result)); + } +} + +void _changePlan(Action action, Context ctx) async { + await Navigator.of(ctx.context).push(MaterialPageRoute( + builder: (_) => Material(child: ctx.buildComponent('plan')))); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController.dispose(); +} diff --git a/lib/views/premium_page/page.dart b/lib/views/premium_page/page.dart new file mode 100644 index 00000000..6f88347f --- /dev/null +++ b/lib/views/premium_page/page.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/plan_component/component.dart'; +import 'components/plan_component/state.dart'; +import 'components/premium_info_component/component.dart'; +import 'components/premium_info_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PremiumPage extends Page> { + PremiumPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'plan': PlanConnector() + PlanComponent(), + 'info': PremiumInfoConnector() + PremiumInfoComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/premium_page/reducer.dart b/lib/views/premium_page/reducer.dart new file mode 100644 index 00000000..83af2c6c --- /dev/null +++ b/lib/views/premium_page/reducer.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/braintree_subscription.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PremiumPageAction.action: _onAction, + PremiumPageAction.setSubscription: _setSubscription, + PremiumPageAction.loading: _loading, + }, + ); +} + +PremiumPageState _onAction(PremiumPageState state, Action action) { + final PremiumPageState newState = state.clone(); + return newState; +} + +PremiumPageState _setSubscription(PremiumPageState state, Action action) { + BraintreeSubscription _subscription = action.payload; + final PremiumPageState newState = state.clone(); + newState.subscription = _subscription; + return newState; +} + +PremiumPageState _loading(PremiumPageState state, Action action) { + final bool _loading = action.payload ?? false; + final PremiumPageState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/premium_page/state.dart b/lib/views/premium_page/state.dart new file mode 100644 index 00000000..a0923a67 --- /dev/null +++ b/lib/views/premium_page/state.dart @@ -0,0 +1,34 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/braintree_subscription.dart'; + +class PremiumPageState implements GlobalBaseState, Cloneable { + BraintreeSubscription subscription; + ScrollController scrollController; + bool loading; + @override + PremiumPageState clone() { + return PremiumPageState() + ..user = user + ..subscription = subscription + ..scrollController = scrollController + ..loading = loading; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +PremiumPageState initState(Map args) { + return PremiumPageState()..loading = false; +} diff --git a/lib/views/premium_page/view.dart b/lib/views/premium_page/view.dart new file mode 100644 index 00000000..b362bcf4 --- /dev/null +++ b/lib/views/premium_page/view.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'state.dart'; + +Widget buildView( + PremiumPageState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + body: state.user.isPremium + ? viewService.buildComponent('info') + : viewService.buildComponent('plan'), + ); +} diff --git a/lib/views/register_page/action.dart b/lib/views/register_page/action.dart new file mode 100644 index 00000000..205eef24 --- /dev/null +++ b/lib/views/register_page/action.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum RegisterPageAction { + action, + registerWithEmail, +} + +class RegisterPageActionCreator { + static Action onAction() { + return const Action(RegisterPageAction.action); + } + + static Action onRegisterWithEmail() { + return const Action(RegisterPageAction.registerWithEmail); + } +} diff --git a/lib/views/register_page/effect.dart b/lib/views/register_page/effect.dart new file mode 100644 index 00000000..d43e1a2a --- /dev/null +++ b/lib/views/register_page/effect.dart @@ -0,0 +1,79 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart' hide Action; +import 'package:movie/actions/pop_result.dart'; +import 'package:movie/actions/user_info_operate.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + RegisterPageAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + RegisterPageAction.registerWithEmail: _onRegisterWithEmail + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) { + ctx.state.emailFocusNode = FocusNode(); + ctx.state.nameFocusNode = FocusNode(); + ctx.state.pwdFocusNode = FocusNode(); + ctx.state.emailTextController = TextEditingController(); + ctx.state.nameTextController = TextEditingController(); + ctx.state.passWordTextController = TextEditingController(); + final Object ticker = ctx.stfState; + ctx.state.submitAnimationController = AnimationController( + vsync: ticker, duration: Duration(milliseconds: 1000)); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.emailFocusNode.dispose(); + ctx.state.nameFocusNode.dispose(); + ctx.state.passWordTextController.dispose(); + ctx.state.pwdFocusNode.dispose(); + ctx.state.nameTextController.dispose(); + ctx.state.emailTextController.dispose(); + ctx.state.submitAnimationController.dispose(); +} + +void _onRegisterWithEmail(Action action, Context ctx) async { + if (ctx.state.nameTextController.text == '' || + ctx.state.emailTextController.text == '' || + ctx.state.passWordTextController.text == '') { + Toast.show('Please enter all information', ctx.context, + duration: 3, gravity: Toast.BOTTOM); + } else { + try { + ctx.state.submitAnimationController.forward(); + final FirebaseAuth _auth = FirebaseAuth.instance; + final FirebaseUser user = (await _auth.createUserWithEmailAndPassword( + email: ctx.state.emailTextController.text, + password: ctx.state.passWordTextController.text)) + .user; + if (user != null) { + assert(ctx.state.nameTextController.text != ''); + user.sendEmailVerification(); + final UserUpdateInfo userUpdateInfo = UserUpdateInfo() + ..displayName = ctx.state.nameTextController.text; + user.updateProfile(userUpdateInfo).then((d) { + UserInfoOperate.whenLogin(user, ctx.state.nameTextController.text); + Navigator.pop( + ctx.context, + PopWithResults( + fromPage: "registerPage", + toPage: 'mainpage', + results: {'s': true, 'name': ctx.state.nameTextController.text}, + ), + ); + }); + } + } on Exception catch (e) { + ctx.state.submitAnimationController.reverse(); + Toast.show(e.toString(), ctx.context, duration: 3, gravity: Toast.BOTTOM); + } + } +} diff --git a/lib/views/register_page/page.dart b/lib/views/register_page/page.dart new file mode 100644 index 00000000..48e5cacd --- /dev/null +++ b/lib/views/register_page/page.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class RegisterPage extends Page> + with TickerProviderMixin { + RegisterPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/register_page/reducer.dart b/lib/views/register_page/reducer.dart new file mode 100644 index 00000000..102abaa0 --- /dev/null +++ b/lib/views/register_page/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + RegisterPageAction.action: _onAction, + }, + ); +} + +RegisterPageState _onAction(RegisterPageState state, Action action) { + final RegisterPageState newState = state.clone(); + return newState; +} diff --git a/lib/views/register_page/state.dart b/lib/views/register_page/state.dart new file mode 100644 index 00000000..b79836b5 --- /dev/null +++ b/lib/views/register_page/state.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; + +class RegisterPageState implements Cloneable { + String emailAddress; + String password; + String name; + TextEditingController nameTextController; + TextEditingController passWordTextController; + TextEditingController emailTextController; + FocusNode nameFocusNode; + FocusNode emailFocusNode; + FocusNode pwdFocusNode; + AnimationController submitAnimationController; + + @override + RegisterPageState clone() { + return RegisterPageState() + ..emailAddress = emailAddress + ..password = password + ..name = name + ..nameFocusNode = nameFocusNode + ..emailFocusNode = emailFocusNode + ..pwdFocusNode = pwdFocusNode + ..submitAnimationController = submitAnimationController + ..emailTextController = emailTextController + ..passWordTextController = passWordTextController + ..nameTextController = nameTextController; + } +} + +RegisterPageState initState(Map args) { + return RegisterPageState(); +} diff --git a/lib/views/register_page/view.dart b/lib/views/register_page/view.dart new file mode 100644 index 00000000..8d1773cd --- /dev/null +++ b/lib/views/register_page/view.dart @@ -0,0 +1,275 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/customcliper_path.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + RegisterPageState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + body: Stack( + children: [ + _Header(), + _RegisterForm( + dispatch: dispatch, + emailTextController: state.emailTextController, + nameTextController: state.nameTextController, + emailFocusNode: state.emailFocusNode, + nameFocusNode: state.nameFocusNode, + passWordTextController: state.passWordTextController, + pwdFocusNode: state.pwdFocusNode, + submitAnimationController: state.submitAnimationController, + ), + _AppBar(), + ], + ), + ); +} + +class _Header extends StatelessWidget { + final double headerHeight = Adapt.screenH() / 3; + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: CustomCliperPath( + height: headerHeight, width: Adapt.screenW(), radius: Adapt.px(1000)), + child: Container( + height: headerHeight, + width: Adapt.screenW(), + decoration: BoxDecoration( + color: Colors.black87, + image: DecorationImage( + colorFilter: ColorFilter.mode(Colors.black, BlendMode.color), + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'https://image.tmdb.org/t/p/original/mAkPFEWkwKz9nmKyCiuETfTdpgX.jpg'))), + alignment: Alignment.center, + child: Container( + color: Color.fromRGBO(20, 20, 20, 0.8), + alignment: Alignment.center, + height: headerHeight, + width: Adapt.screenW(), + child: Image.asset( + 'images/tmdb_blue.png', + width: Adapt.px(150), + height: Adapt.px(150), + color: Colors.white, + )), + ), + ); + } +} + +class _AppBar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Positioned( + top: 0.0, + left: 0.0, + right: 0.0, + child: AppBar( + brightness: Brightness.dark, + backgroundColor: Colors.transparent, + elevation: 0.0, + iconTheme: IconThemeData(color: Colors.white), + ), + ); + } +} + +class _SubmitButton extends StatelessWidget { + final AnimationController controller; + final Function onSubimt; + const _SubmitButton({this.controller, this.onSubimt}); + @override + Widget build(BuildContext context) { + final submitWidth = CurvedAnimation( + parent: controller, + curve: Interval( + 0.0, + 0.5, + curve: Curves.ease, + ), + ); + final loadCurved = CurvedAnimation( + parent: controller, + curve: Interval( + 0.5, + 1.0, + curve: Curves.ease, + ), + ); + return AnimatedBuilder( + animation: controller, + builder: (ctx, w) { + double buttonWidth = Adapt.screenW() * 0.8; + return Container( + margin: EdgeInsets.only(top: Adapt.px(60)), + height: Adapt.px(100), + child: Stack( + children: [ + Container( + height: Adapt.px(100), + width: Tween(begin: buttonWidth, end: Adapt.px(100)) + .animate(submitWidth) + .value, + child: FlatButton( + color: Colors.black87, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(50))), + child: Text('Submit', + style: TextStyle( + color: Colors.white, + fontSize: Tween(begin: Adapt.px(35), end: 0.0) + .animate(submitWidth) + .value)), + onPressed: onSubimt, + ), + ), + ScaleTransition( + scale: Tween(begin: 0.0, end: 1.0).animate(loadCurved), + child: Container( + width: Adapt.px(100), + height: Adapt.px(100), + padding: EdgeInsets.all(Adapt.px(20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(50))), + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.white), + ), + ), + ) + ], + ), + ); + }, + ); + } +} + +class _RegisterForm extends StatelessWidget { + final Dispatch dispatch; + final TextEditingController nameTextController; + final TextEditingController passWordTextController; + final TextEditingController emailTextController; + final FocusNode nameFocusNode; + final FocusNode emailFocusNode; + final FocusNode pwdFocusNode; + final AnimationController submitAnimationController; + const _RegisterForm( + {this.dispatch, + this.emailFocusNode, + this.emailTextController, + this.nameFocusNode, + this.nameTextController, + this.passWordTextController, + this.pwdFocusNode, + this.submitAnimationController}); + @override + Widget build(BuildContext context) { + return Center( + child: Form( + child: Card( + elevation: 10, + child: Container( + height: Adapt.screenH() / 2, + width: Adapt.screenW() * 0.9, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: TextFormField( + controller: nameTextController, + focusNode: nameFocusNode, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + cursorColor: Colors.black, + style: TextStyle(fontSize: Adapt.px(35)), + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Nickname', + floatingLabelBehavior: FloatingLabelBehavior.always, + filled: true, + prefixStyle: TextStyle( + color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: new UnderlineInputBorder( + borderSide: + new BorderSide(color: Colors.black87))), + validator: (String value) { + if (value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + onFieldSubmitted: (_) => nameFocusNode.nextFocus(), + )), + Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: TextFormField( + controller: emailTextController, + focusNode: emailFocusNode, + textInputAction: TextInputAction.next, + cursorColor: Colors.black, + style: TextStyle(fontSize: Adapt.px(35)), + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Email', + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle( + color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: new UnderlineInputBorder( + borderSide: + new BorderSide(color: Colors.black87))), + validator: (String value) { + if (value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + onFieldSubmitted: (_) => emailFocusNode.nextFocus(), + )), + Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: TextFormField( + obscureText: true, + controller: passWordTextController, + focusNode: pwdFocusNode, + textInputAction: TextInputAction.done, + cursorColor: Colors.black, + style: TextStyle(fontSize: Adapt.px(35)), + decoration: InputDecoration( + fillColor: Colors.transparent, + hintText: 'Password', + floatingLabelBehavior: FloatingLabelBehavior.auto, + filled: true, + prefixStyle: TextStyle( + color: Colors.black, fontSize: Adapt.px(35)), + focusedBorder: new UnderlineInputBorder( + borderSide: + new BorderSide(color: Colors.black87))), + validator: (String value) { + if (value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + )), + _SubmitButton( + controller: submitAnimationController, + onSubimt: () => + dispatch(RegisterPageActionCreator.onRegisterWithEmail()), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/seasondetail_page/action.dart b/lib/views/seasondetail_page/action.dart new file mode 100644 index 00000000..22d54aa5 --- /dev/null +++ b/lib/views/seasondetail_page/action.dart @@ -0,0 +1,41 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/models/video_model.dart'; + +enum SeasonDetailPageAction { + action, + seasonDetailChanged, + setVideos, + setImages, + setStreamLinks, + episodeCellTapped, +} + +class SeasonDetailPageActionCreator { + static Action onAction() { + return const Action(SeasonDetailPageAction.action); + } + + static Action onSeasonDetailChanged(Season s) { + return Action(SeasonDetailPageAction.seasonDetailChanged, payload: s); + } + + static Action setVideos(VideoModel videos) { + return Action(SeasonDetailPageAction.setVideos, payload: videos); + } + + static Action setImages(ImageModel images) { + return Action(SeasonDetailPageAction.setImages, payload: images); + } + + static Action setStreamLinks(TvShowStreamLinks streamLinks) { + return Action(SeasonDetailPageAction.setStreamLinks, payload: streamLinks); + } + + static Action episodeCellTapped(Episode p) { + return Action(SeasonDetailPageAction.episodeCellTapped, payload: p); + } +} diff --git a/lib/views/seasondetail_page/components/episodes_component/action.dart b/lib/views/seasondetail_page/components/episodes_component/action.dart new file mode 100644 index 00000000..e366d550 --- /dev/null +++ b/lib/views/seasondetail_page/components/episodes_component/action.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; + +enum EpisodesAction { action, expansionOpen, cellTapped } + +class EpisodesActionCreator { + static Action onAction() { + return const Action(EpisodesAction.action); + } + + static Action onExpansionOpen(int index, bool opened) { + return Action(EpisodesAction.expansionOpen, payload: [index, opened]); + } + + static Action onCellTapped(Episode p) { + return Action(EpisodesAction.cellTapped, payload: p); + } +} diff --git a/lib/views/seasondetail_page/components/episodes_component/component.dart b/lib/views/seasondetail_page/components/episodes_component/component.dart new file mode 100644 index 00000000..ead736d0 --- /dev/null +++ b/lib/views/seasondetail_page/components/episodes_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class EpisodesComponent extends Component { + EpisodesComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.episodes != newState.episodes; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/seasondetail_page/components/episodes_component/effect.dart b/lib/views/seasondetail_page/components/episodes_component/effect.dart new file mode 100644 index 00000000..ee80de80 --- /dev/null +++ b/lib/views/seasondetail_page/components/episodes_component/effect.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart' hide Action; +import 'package:movie/views/stream_link/episode_livestream_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + EpisodesAction.action: _onAction, + Lifecycle.initState: _onInit, + EpisodesAction.cellTapped: _onCellTapped + }); +} + +void _onAction(Action action, Context ctx) {} +void _onInit(Action action, Context ctx) {} +Future _onCellTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + PageRouteBuilder( + transitionDuration: Duration(milliseconds: 500), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + final _curvedAnimation = + CurvedAnimation(parent: animation, curve: Curves.ease); + return SlideTransition( + position: Tween( + begin: Offset(0, 1), + end: Offset.zero, + ).animate(_curvedAnimation), + child: FadeTransition( + opacity: _curvedAnimation, + child: EpisodeLiveStreamPage().buildPage( + {'selectedEpisode': action.payload, 'season': ctx.state.episodes}, + ), + ), + ); + }, + ), + ); +} diff --git a/lib/views/seasondetail_page/components/episodes_component/reducer.dart b/lib/views/seasondetail_page/components/episodes_component/reducer.dart new file mode 100644 index 00000000..b5065031 --- /dev/null +++ b/lib/views/seasondetail_page/components/episodes_component/reducer.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + EpisodesAction.action: _onAction, + EpisodesAction.expansionOpen: _onExpansionOpen + }, + ); +} + +EpisodesState _onAction(EpisodesState state, Action action) { + final EpisodesState newState = state.clone(); + return newState; +} + +EpisodesState _onExpansionOpen(EpisodesState state, Action action) { + final EpisodesState newState = state.clone(); + return newState; +} diff --git a/lib/views/seasondetail_page/components/episodes_component/state.dart b/lib/views/seasondetail_page/components/episodes_component/state.dart new file mode 100644 index 00000000..24b62cc2 --- /dev/null +++ b/lib/views/seasondetail_page/components/episodes_component/state.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/views/seasondetail_page/state.dart'; + +class EpisodesState implements Cloneable { + List episodes; + int tvid; + + EpisodesState({ + this.episodes, + this.tvid, + }); + + @override + EpisodesState clone() { + return EpisodesState()..episodes = episodes; + } +} + +class EpisodesConnector extends ConnOp { + @override + EpisodesState get(SeasonDetailPageState state) { + EpisodesState mstate = EpisodesState(); + mstate.episodes = state.seasonDetailModel.episodes; + mstate.tvid = state.tvid; + return mstate; + } +} diff --git a/lib/views/seasondetail_page/components/episodes_component/view.dart b/lib/views/seasondetail_page/components/episodes_component/view.dart new file mode 100644 index 00000000..59b2fb32 --- /dev/null +++ b/lib/views/seasondetail_page/components/episodes_component/view.dart @@ -0,0 +1,321 @@ +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/seasondetail_page/action.dart'; +import 'package:movie/widgets/expandable_text.dart'; +import 'package:movie/widgets/linear_progress_Indicator.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + EpisodesState state, Dispatch dispatch, ViewService viewService) { + return state.episodes.length > 0 + ? SliverList( + delegate: SliverChildBuilderDelegate((_, index) { + return _EpisodeCell( + data: state.episodes[index], + onTap: (d) => + dispatch(SeasonDetailPageActionCreator.episodeCellTapped(d)), + ); + }, childCount: state.episodes.length)) + : const _ShimmerList(); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final _color = const Color(0xFFFFFFFF); + return Container( + //height: Adapt.px(400), + margin: EdgeInsets.only( + top: Adapt.px(50), + ), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + height: Adapt.px(220), + width: Adapt.px(380), + transform: + Matrix4.translationValues(-Adapt.px(40), -Adapt.px(40), 0), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: Adapt.px(20), + width: Adapt.px(200), + color: _color, + ), + SizedBox(height: Adapt.px(5)), + Container( + height: Adapt.px(20), + width: Adapt.px(100), + color: _color, + ), + SizedBox(height: Adapt.px(10)), + ], + ) + ], + ), + Container( + height: Adapt.px(20), + width: Adapt.px(120), + color: _color, + ), + SizedBox(height: Adapt.px(10)), + Container( + height: Adapt.px(18), + color: _color, + ), + SizedBox(height: Adapt.px(8)), + Container( + height: Adapt.px(18), + color: _color, + ), + SizedBox(height: Adapt.px(8)), + Container( + height: Adapt.px(18), + width: Adapt.px(320), + color: _color, + ), + SizedBox(height: Adapt.px(10)), + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: SizedBox( + child: ListView.separated( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(30)), + separatorBuilder: (_, __) => SizedBox(height: Adapt.px(60)), + itemCount: 3, + itemBuilder: (_, __) => const _ShimmerCell(), + ), + ), + ), + ); + } +} + +class _EpisodeCell extends StatelessWidget { + final Episode data; + final Function(Episode) onTap; + const _EpisodeCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _imageHeight = Adapt.px(220); + final _theme = ThemeStyle.getTheme(context); + final _shadowColor = _theme.brightness == Brightness.light + ? const Color(0xFFE0E0E0) + : const Color(0x00000000); + final DateTime _airDate = DateTime.parse(data.airDate ?? '1990-01-01'); + final bool _canPlay = DateTime.now().isAfter(_airDate); + return Container( + margin: EdgeInsets.only( + left: Adapt.px(40), + right: Adapt.px(40), + top: Adapt.px(50), + bottom: Adapt.px(30), + ), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + decoration: BoxDecoration( + color: _theme.cardColor, + borderRadius: BorderRadius.circular(Adapt.px(20)), + boxShadow: [ + BoxShadow( + color: _shadowColor, + offset: Offset(Adapt.px(10), Adapt.px(20)), + blurRadius: Adapt.px(30), + ) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + GestureDetector( + onTap: () { + if (_canPlay) onTap(data); + }, + child: Container( + height: _imageHeight, + width: Adapt.px(380), + transform: Matrix4.translationValues( + -Adapt.px(40), -Adapt.px(40), 0), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + boxShadow: [ + BoxShadow( + color: _shadowColor, + offset: Offset(Adapt.px(10), Adapt.px(20)), + blurRadius: Adapt.px(20), + spreadRadius: -Adapt.px(10)) + ], + image: data.stillPath == null + ? null + : DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.stillPath, ImageSize.w300), + ), + ), + ), + child: Stack(children: [ + _canPlay + ? _PlayArrow(height: _imageHeight) + : const SizedBox(), + data.playState ? const _WatchedCell() : const SizedBox(), + ]), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'EP ${data.episodeNumber}', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: Adapt.px(30), + ), + ), + SizedBox(height: Adapt.px(5)), + Text( + data.airDate == null + ? '-' + : DateFormat.yMMMd() + .format(DateTime.parse(data.airDate)), + style: TextStyle( + fontSize: Adapt.px(20), + color: const Color(0xFF717171), + ), + ), + SizedBox(height: Adapt.px(10)), + Row(children: [ + LinearGradientProgressIndicator( + value: data.voteAverage / 10, + width: Adapt.px(120), + ), + SizedBox(width: Adapt.px(10)), + Text( + data.voteAverage.toStringAsFixed(1), + style: TextStyle( + fontSize: Adapt.px(18), + color: const Color(0xFF717171), + ), + ) + ]) + ], + ) + ], + ), + Text( + data.name, + style: + TextStyle(fontSize: Adapt.px(26), fontWeight: FontWeight.w600), + ), + SizedBox(height: Adapt.px(10)), + ExpandableText( + data.overview, + maxLines: 3, + style: TextStyle( + color: const Color(0xFF717171), + ), + ), + SizedBox(height: Adapt.px(40)), + ], + ), + ); + } +} + +class _PlayArrow extends StatelessWidget { + final double height; + const _PlayArrow({this.height}); + @override + Widget build(BuildContext context) { + final _brightness = MediaQuery.of(context).platformBrightness; + return Container( + height: height, + alignment: Alignment.center, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(50)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8, sigmaY: 8), + child: Container( + color: _brightness == Brightness.light + ? const Color(0x40FFFFFF) + : const Color(0x40000000), + width: Adapt.px(100), + height: Adapt.px(100), + child: Icon( + Icons.play_arrow, + size: 25, + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ); + } +} + +class _WatchedCell extends StatelessWidget { + const _WatchedCell(); + @override + Widget build(BuildContext context) { + final _brightness = MediaQuery.of(context).platformBrightness; + return Align( + alignment: Alignment.bottomRight, + child: Container( + margin: EdgeInsets.all(5), + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: _brightness == Brightness.light + ? const Color(0xAAF0F0F0) + : const Color(0xAA202020), + borderRadius: BorderRadius.circular(5)), + child: Text( + 'Watched', + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } +} diff --git a/lib/views/seasondetail_page/components/header_component/component.dart b/lib/views/seasondetail_page/components/header_component/component.dart new file mode 100644 index 00000000..5be0b6af --- /dev/null +++ b/lib/views/seasondetail_page/components/header_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.airDate != newState.airDate || + oldState.name != newState.name || + oldState.overwatch != newState.overwatch || + oldState.posterurl != newState.posterurl || + oldState.seasonNumber != newState.seasonNumber || + oldState.images != newState.images; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/seasondetail_page/components/header_component/state.dart b/lib/views/seasondetail_page/components/header_component/state.dart new file mode 100644 index 00000000..140dea38 --- /dev/null +++ b/lib/views/seasondetail_page/components/header_component/state.dart @@ -0,0 +1,53 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/views/seasondetail_page/state.dart'; + +class HeaderState implements Cloneable { + String posterurl; + String name; + String seasonName; + String overwatch; + String airDate; + int seasonNumber; + VideoModel videos; + ImageModel images; + + HeaderState( + {this.name, + this.overwatch, + this.posterurl, + this.airDate, + this.seasonNumber, + this.seasonName, + this.images, + this.videos}); + + @override + HeaderState clone() { + return HeaderState() + ..posterurl = posterurl + ..name = name + ..overwatch + ..seasonName = seasonName + ..seasonNumber = seasonNumber + ..videos = videos + ..images = images; + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(SeasonDetailPageState state) { + HeaderState mstate = HeaderState(); + mstate.posterurl = state.seasonDetailModel?.posterPath; + mstate.overwatch = state.seasonDetailModel?.overview; + mstate.name = state.tvShowName; + mstate.airDate = state.seasonDetailModel?.airDate; + mstate.seasonName = state.name ?? ''; + mstate.seasonNumber = state.seasonNumber; + mstate.images = state.images; + mstate.videos = state.videos; + return mstate; + } +} diff --git a/lib/views/seasondetail_page/components/header_component/view.dart b/lib/views/seasondetail_page/components/header_component/view.dart new file mode 100644 index 00000000..abe4b227 --- /dev/null +++ b/lib/views/seasondetail_page/components/header_component/view.dart @@ -0,0 +1,382 @@ +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/expandable_text.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart'; +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: _HeaderPanel( + backgroundUrl: state.posterurl, + title: state.name, + seasonName: state.seasonName, + overview: state.overwatch, + images: state.images, + videos: state.videos, + ), + ); +} + +class _HeaderPanel extends StatelessWidget { + final String title; + final String seasonName; + final String backgroundUrl; + final ImageModel images; + final VideoModel videos; + final String overview; + const _HeaderPanel( + {this.backgroundUrl, + this.seasonName, + this.title, + this.overview, + this.images, + this.videos}); + @override + Widget build(BuildContext context) { + return Container( + width: Adapt.screenW(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(30)), + child: Text( + seasonName, + style: TextStyle( + fontSize: Adapt.px(50), + fontWeight: FontWeight.w600, + ), + ), + ), + _SwiperPanel( + backdrops: images?.posters ?? [], + videos: videos?.results ?? [], + ), + overview != null && overview != '' + ? _OverviewPanel( + overview: overview, + ) + : SizedBox() + ], + ), + ); + } +} + +class _OverviewPanel extends StatelessWidget { + final String overview; + const _OverviewPanel({this.overview}); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(30)), + child: Text( + 'Overview', + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.w600, + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: ExpandableText( + overview ?? '', + maxLines: 3, + style: TextStyle( + fontSize: Adapt.px(24), + color: const Color(0xFF717171), + ), + ), + ) + ], + ); + } +} + +class _SwiperPanel extends StatefulWidget { + final List videos; + final List backdrops; + const _SwiperPanel({this.videos, this.backdrops}); + @override + _SwiperPanelState createState() => _SwiperPanelState(); +} + +class _SwiperPanelState extends State<_SwiperPanel> { + int _currentIndex; + @override + void initState() { + _currentIndex = 0; + super.initState(); + } + + _setCurrectIndex(int index) { + setState(() { + _currentIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + final _size = Adapt.screenW() - _padding * 2; + return Container( + height: _size + Adapt.px(30), + child: Column( + children: [ + SizedBox( + height: _size, + child: Swiper( + itemCount: 5, + onIndexChanged: _setCurrectIndex, + itemWidth: Adapt.screenW(), + itemBuilder: (context, index) { + if (index == 0 && widget.videos.length > 0) { + return _VideoCell( + videos: widget.videos, + ); + } + return _ImageCell( + url: widget.backdrops.length > index + 1 + ? widget.backdrops[index].filePath + : null, + ); + }, + ), + ), + SizedBox(height: Adapt.px(20)), + _SwiperPagination( + lenght: 5, + currentIndex: _currentIndex, + ), + ], + ), + ); + } +} + +class _SwiperPagination extends StatelessWidget { + final int lenght; + final int currentIndex; + const _SwiperPagination({this.lenght, this.currentIndex}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _cellWidth = Adapt.px(20); + final _height = Adapt.px(6); + final _width = + lenght > 0 ? _cellWidth * lenght + Adapt.px(10) * (lenght - 1) : 0.0; + return Container( + width: _width, + height: _height, + child: Align( + alignment: Alignment.center, + child: ListView.separated( + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(10)), + itemCount: lenght, + itemBuilder: (_, index) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + width: _cellWidth, + height: _height, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(_height / 2), + color: index == currentIndex + ? _theme.iconTheme.color + : _theme.primaryColorDark, + ), + ); + }, + ), + )); + } +} + +class _ImageCell extends StatelessWidget { + final String url; + const _ImageCell({this.url}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _margin = Adapt.px(40); + final _size = Adapt.screenW() - 2 * _margin; + return Container( + width: _size, + height: _size, + margin: EdgeInsets.symmetric(horizontal: _margin), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(30)), + color: _theme.primaryColorDark, + image: url == null + ? null + : DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(url, ImageSize.w500), + ), + ), + ), + ); + } +} + +class _VideoCell extends StatefulWidget { + final List videos; + const _VideoCell({this.videos}); + @override + _VideoCellState createState() => _VideoCellState(); +} + +class _VideoCellState extends State<_VideoCell> { + YoutubePlayerController _youtubePlayerController; + String _videoId = ''; + bool _playVideo = false; + + @override + void didUpdateWidget(_VideoCell oldWidget) { + if (oldWidget.videos != widget.videos) _updateYoutubeController(); + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + _youtubePlayerController?.dispose(); + super.dispose(); + } + + @override + void initState() { + _updateYoutubeController(); + _youtubePlayerController = YoutubePlayerController( + initialVideoId: _videoId, + ); + super.initState(); + } + + _updateYoutubeController() { + if ((widget.videos?.length ?? 0) > 0) { + _videoId = widget.videos[0].key; + setState(() {}); + } + } + + _startPlayVideo(bool play) { + if (!play) { + _youtubePlayerController.reset(); + _youtubePlayerController.reload(); + } else + _youtubePlayerController.play(); + setState(() { + _playVideo = play; + }); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final double _padding = Adapt.px(40); + final _size = Adapt.screenW() - _padding * 2; + return Stack( + children: [ + Container( + margin: EdgeInsets.symmetric(horizontal: _padding), + height: _size, + width: _size, + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(25)), + image: (widget.videos.length ?? 0) > 0 + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'https://i.ytimg.com/vi/${widget.videos[0]?.key ?? ''}/hqdefault.jpg'), + ) + : null, + ), + child: Container( + decoration: BoxDecoration( + color: const Color(0x55000000), + borderRadius: BorderRadius.circular(Adapt.px(25)), + ), + ), + ), + GestureDetector( + onTap: () => _startPlayVideo(true), + child: Container( + height: _size, + alignment: Alignment.center, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(50)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8, sigmaY: 8), + child: Container( + color: const Color(0x40FFFFFF), + width: Adapt.px(100), + height: Adapt.px(100), + child: Icon( + Icons.play_arrow, + size: 25, + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ), + ), + _VideoPlayer( + controller: _youtubePlayerController, + play: _playVideo, + onEnd: () => _startPlayVideo(false), + ) + ], + ); + } +} + +class _VideoPlayer extends StatelessWidget { + final YoutubePlayerController controller; + final bool play; + final Function onEnd; + const _VideoPlayer({this.controller, this.play, this.onEnd}); + @override + Widget build(BuildContext context) { + final double _padding = Adapt.px(40); + final _size = Adapt.screenW() - _padding * 2; + return play + ? Container( + margin: EdgeInsets.symmetric(horizontal: _padding), + height: _size, + width: _size, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(25)), + child: YoutubePlayer( + controller: controller, + onEnded: (d) => onEnd(), + progressColors: ProgressBarColors( + playedColor: const Color(0xFFFFFFFF), + handleColor: const Color(0xFFFFFFFF), + bufferedColor: const Color(0xFFE0E0E0), + ), + ), + ), + ) + : SizedBox(); + } +} diff --git a/lib/views/seasondetail_page/components/seasoncast_component/action.dart b/lib/views/seasondetail_page/components/seasoncast_component/action.dart new file mode 100644 index 00000000..f362b800 --- /dev/null +++ b/lib/views/seasondetail_page/components/seasoncast_component/action.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum SeasonCastAction { + action, + buttonClicked, + castCellTapped, +} + +class SeasonCastActionCreator { + static Action onAction() { + return const Action(SeasonCastAction.action); + } + + static Action onButtonClicked() { + return const Action(SeasonCastAction.buttonClicked); + } + + static Action onCastCellTapped( + int peopleid, String profilePath, String profileName) { + return Action(SeasonCastAction.castCellTapped, + payload: [peopleid, profilePath, profileName]); + } +} diff --git a/lib/views/seasondetail_page/components/seasoncast_component/component.dart b/lib/views/seasondetail_page/components/seasoncast_component/component.dart new file mode 100644 index 00000000..2dcad687 --- /dev/null +++ b/lib/views/seasondetail_page/components/seasoncast_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SeasonCastComponent extends Component { + SeasonCastComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.castData != newState.castData; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/seasondetail_page/components/seasoncast_component/effect.dart b/lib/views/seasondetail_page/components/seasoncast_component/effect.dart new file mode 100644 index 00000000..8bba04a1 --- /dev/null +++ b/lib/views/seasondetail_page/components/seasoncast_component/effect.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'hide Action; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SeasonCastAction.action: _onAction, + SeasonCastAction.castCellTapped:_onCastCellTapped, + }); +} + +void _onAction(Action action, Context ctx) { +} +Future _onCastCellTapped(Action action, Context ctx) async{ + await Navigator.of(ctx.context).pushNamed('peopledetailpage',arguments: {'peopleid':action.payload[0],'profilePath':action.payload[1],'profileName':action.payload[2]}); + } diff --git a/lib/views/seasondetail_page/components/seasoncast_component/reducer.dart b/lib/views/seasondetail_page/components/seasoncast_component/reducer.dart new file mode 100644 index 00000000..82c970a5 --- /dev/null +++ b/lib/views/seasondetail_page/components/seasoncast_component/reducer.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SeasonCastAction.action: _onAction, + SeasonCastAction.buttonClicked:_onButtonCilcked + }, + ); +} + +SeasonCastState _onAction(SeasonCastState state, Action action) { + final SeasonCastState newState = state.clone(); + return newState; +} +SeasonCastState _onButtonCilcked(SeasonCastState state, Action action) { + final SeasonCastState newState = state.clone(); + newState.showcount=state.showcount ==state.castData.length?6:state.castData.length; + return newState; +} diff --git a/lib/views/seasondetail_page/components/seasoncast_component/state.dart b/lib/views/seasondetail_page/components/seasoncast_component/state.dart new file mode 100644 index 00000000..faaf4af2 --- /dev/null +++ b/lib/views/seasondetail_page/components/seasoncast_component/state.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/views/seasondetail_page/state.dart'; + +class SeasonCastState implements Cloneable { + List castData; + int showcount; + + SeasonCastState({this.castData, this.showcount = 6}); + + @override + SeasonCastState clone() { + return SeasonCastState() + ..castData = castData + ..showcount = showcount; + } +} + +class SeasonCastConnector + extends ConnOp { + @override + SeasonCastState get(SeasonDetailPageState state) { + SeasonCastState mstate = state.seasonCastState; + return mstate; + } +} diff --git a/lib/views/seasondetail_page/components/seasoncast_component/view.dart b/lib/views/seasondetail_page/components/seasoncast_component/view.dart new file mode 100644 index 00000000..f01e3afc --- /dev/null +++ b/lib/views/seasondetail_page/components/seasoncast_component/view.dart @@ -0,0 +1,191 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + SeasonCastState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: Container( + key: ValueKey(state.castData), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: I18n.of(viewService.context).seasonCast, + style: TextStyle( + fontSize: Adapt.px(30), fontWeight: FontWeight.w600), + ), + TextSpan( + text: + ' ${state.castData != null ? state.castData.length.toString() : ''}', + style: TextStyle( + color: Colors.grey, + fontSize: Adapt.px(26), + ), + ), + ], + ), + ), + ), + _CastBody( + dispatch: dispatch, + castData: state.castData, + ), + ], + ), + ), + ); +} + +class _CreditsShimmerCell extends StatelessWidget { + const _CreditsShimmerCell(); + @override + Widget build(BuildContext context) { + final _width = Adapt.px(120); + final _color = const Color(0xFFFFFFFF); + return SizedBox( + width: _width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: _width, + height: _width, + decoration: BoxDecoration( + color: _color, + shape: BoxShape.circle, + ), + ), + SizedBox(height: Adapt.px(15)), + Container( + height: Adapt.px(18), + color: _color, + ), + SizedBox(height: Adapt.px(8)), + Container( + height: Adapt.px(18), + width: Adapt.px(80), + color: _color, + ), + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + physics: NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + separatorBuilder: (context, index) => SizedBox(width: Adapt.px(40)), + itemCount: 5, + itemBuilder: (context, index) => const _CreditsShimmerCell(), + ), + ); + } +} + +class _CastCell extends StatelessWidget { + final CastData data; + final Function(CastData) onTap; + const _CastCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final _width = Adapt.px(120); + return GestureDetector( + key: ValueKey(data.id), + onTap: () => onTap(data), + child: SizedBox( + width: _width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: _width, + height: _width, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _theme.primaryColorLight, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.profilePath, ImageSize.w200), + ), + ), + ), + ), + SizedBox(height: Adapt.px(8)), + Flexible( + //* Added FLexible and AutoResize text due to facing renderflex overflow error here + child: AutoSizeText( + data.name, + textAlign: TextAlign.center, + maxLines: 3, + overflow: TextOverflow.fade, + style: TextStyle( + fontSize: Adapt.px(24), + color: const Color(0xFF717171), + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + ); + } +} + +class _CastBody extends StatelessWidget { + final List castData; + final Dispatch dispatch; + const _CastBody({this.castData, this.dispatch}); + @override + Widget build(BuildContext context) { + return Container( + height: Adapt.px(220), + child: castData != null + ? ListView.separated( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + separatorBuilder: (context, index) => + SizedBox(width: Adapt.px(40)), + itemCount: castData.length, + itemBuilder: (context, index) => _CastCell( + data: castData[index], + onTap: (d) => dispatch( + SeasonCastActionCreator.onCastCellTapped( + d.id, d.profilePath, d.name), + ), + ), + ) + : const _ShimmerList(), + ); + } +} diff --git a/lib/views/seasondetail_page/effect.dart b/lib/views/seasondetail_page/effect.dart new file mode 100644 index 00000000..4a597490 --- /dev/null +++ b/lib/views/seasondetail_page/effect.dart @@ -0,0 +1,92 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/page.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SeasonDetailPageAction.action: _onAction, + SeasonDetailPageAction.episodeCellTapped: _episodeCellTapped, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + ctx.state.scrollController = new ScrollController(); + SharedPreferences preferences = await SharedPreferences.getInstance(); + final _tmdb = TMDBApi.instance; + if (ctx.state.tvid != null && ctx.state.seasonNumber != null) { + final _detail = await _tmdb.getTVSeasonDetail( + ctx.state.tvid, ctx.state.seasonNumber, + appendToResponse: 'credits'); + if (_detail.success) { + List _playState = + preferences.getStringList('TvSeason${_detail.result.id}'); + _detail.result.playStates = + _playState ?? _detail.result.episodes.map((f) => '0').toList(); + _detail.result.episodes.forEach((f) { + final index = _detail.result.episodes.indexOf(f); + f.playState = _detail.result.playStates[index] == '0' ? false : true; + }); + ctx.dispatch( + SeasonDetailPageActionCreator.onSeasonDetailChanged(_detail.result)); + } + final _videos = await _tmdb.getTvShowSeasonVideo( + ctx.state.tvid, ctx.state.seasonNumber); + if (_videos.success) + ctx.dispatch(SeasonDetailPageActionCreator.setVideos(_videos.result)); + final _images = await _tmdb.getTvShowSeasonImages( + ctx.state.tvid, ctx.state.seasonNumber); + if (_images.success) + ctx.dispatch(SeasonDetailPageActionCreator.setImages(_images.result)); + /*final _baseApi = BaseApi.instance; + final _streamLinks = await _baseApi.getTvSeasonStreamLinks( + ctx.state.tvid, ctx.state.seasonNumber); + if (_streamLinks.success) { + for (var e in ctx.state.seasonDetailModel.episodes) { + e.streamLink = _streamLinks.result.list.firstWhere((d) { + return d.episode == e.episodeNumber; + }, orElse: () => null); + } + + ctx.dispatch( + SeasonDetailPageActionCreator.setStreamLinks(_streamLinks.result)); + }*/ + } +} + +Future _episodeCellTapped( + Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + PageRouteBuilder( + transitionDuration: Duration(milliseconds: 500), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + final _curvedAnimation = + CurvedAnimation(parent: animation, curve: Curves.ease); + return SlideTransition( + position: Tween( + begin: Offset(0, 1), + end: Offset.zero, + ).animate(_curvedAnimation), + child: FadeTransition( + opacity: _curvedAnimation, + child: EpisodeLiveStreamPage().buildPage( + { + 'tvid': ctx.state.tvid, + 'tvName': ctx.state.tvShowName, + 'selectedEpisode': action.payload, + 'season': ctx.state.seasonDetailModel + }, + ), + ), + ); + }, + ), + ); +} diff --git a/lib/views/seasondetail_page/page.dart b/lib/views/seasondetail_page/page.dart new file mode 100644 index 00000000..9adaeafe --- /dev/null +++ b/lib/views/seasondetail_page/page.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/episodes_component/component.dart'; +import 'components/episodes_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/seasoncast_component/component.dart'; +import 'components/seasoncast_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SeasonDetailPage + extends Page> { + SeasonDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'seasonCast': SeasonCastConnector() + SeasonCastComponent(), + 'episode': EpisodesConnector() + EpisodesComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/seasondetail_page/reducer.dart b/lib/views/seasondetail_page/reducer.dart new file mode 100644 index 00000000..d1a28a3c --- /dev/null +++ b/lib/views/seasondetail_page/reducer.dart @@ -0,0 +1,49 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/views/seasondetail_page/components/seasoncast_component/state.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SeasonDetailPageAction.action: _onAction, + SeasonDetailPageAction.seasonDetailChanged: _onSeasonDetailChanged, + SeasonDetailPageAction.setImages: _setImages, + SeasonDetailPageAction.setVideos: _setVideos, + }, + ); +} + +SeasonDetailPageState _onAction(SeasonDetailPageState state, Action action) { + final SeasonDetailPageState newState = state.clone(); + return newState; +} + +SeasonDetailPageState _onSeasonDetailChanged( + SeasonDetailPageState state, Action action) { + final Season model = + action.payload ?? Season.fromParams(episodes: List()); + final SeasonDetailPageState newState = state.clone(); + newState.seasonDetailModel = model; + newState.seasonCastState = new SeasonCastState(castData: model.credits.cast); + return newState; +} + +SeasonDetailPageState _setVideos(SeasonDetailPageState state, Action action) { + final VideoModel _videos = action.payload; + final SeasonDetailPageState newState = state.clone(); + newState.videos = _videos; + return newState; +} + +SeasonDetailPageState _setImages(SeasonDetailPageState state, Action action) { + final ImageModel _images = action.payload; + final SeasonDetailPageState newState = state.clone(); + newState.images = _images; + return newState; +} diff --git a/lib/views/seasondetail_page/state.dart b/lib/views/seasondetail_page/state.dart new file mode 100644 index 00000000..79043492 --- /dev/null +++ b/lib/views/seasondetail_page/state.dart @@ -0,0 +1,62 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/models/video_model.dart'; + +import 'components/seasoncast_component/state.dart'; + +class SeasonDetailPageState + implements GlobalBaseState, Cloneable { + Season seasonDetailModel; + SeasonCastState seasonCastState; + VideoModel videos; + ImageModel images; + ScrollController scrollController; + String tvShowName; + String name; + String seasonpic; + int tvid; + int seasonNumber; + + @override + SeasonDetailPageState clone() { + return SeasonDetailPageState() + ..seasonDetailModel = seasonDetailModel + ..tvid = tvid + ..seasonNumber = seasonNumber + ..seasonCastState = seasonCastState + ..name = name + ..images = images + ..videos = videos + ..tvShowName = tvShowName + ..seasonpic = seasonpic + ..scrollController = scrollController; + } + + @override + Color themeColor; + + @override + Locale locale; + + @override + AppUser user; +} + +SeasonDetailPageState initState(Map args) { + SeasonDetailPageState state = SeasonDetailPageState(); + state.tvid = args['tvid']; + state.tvShowName = args['tvShowName']; + state.seasonNumber = args['seasonNumber']; + state.name = args['seasonName']; + state.seasonpic = args['posterpic']; + state.seasonDetailModel = Season.fromParams(episodes: List()); + state.seasonCastState = SeasonCastState(); + return state; +} diff --git a/lib/views/seasondetail_page/view.dart b/lib/views/seasondetail_page/view.dart new file mode 100644 index 00000000..d8c56da6 --- /dev/null +++ b/lib/views/seasondetail_page/view.dart @@ -0,0 +1,70 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + SeasonDetailPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Stack( + children: [ + Scaffold( + appBar: AppBar( + brightness: _theme.brightness, + iconTheme: _theme.iconTheme, + backgroundColor: _theme.backgroundColor, + elevation: 0.0, + centerTitle: false, + title: Text( + state.tvShowName ?? '', + style: _theme.textTheme.bodyText1, + ), + ), + backgroundColor: _theme.backgroundColor, + body: CustomScrollView( + slivers: [ + viewService.buildComponent('header'), + viewService.buildComponent('seasonCast'), + _EpisodesTitle( + title: + ' ${state.seasonDetailModel?.episodes != null ? state.seasonDetailModel?.episodes?.length?.toString() : ''}', + ), + viewService.buildComponent('episode'), + ], + )), + ], + ); + }); +} + +class _EpisodesTitle extends StatelessWidget { + final String title; + const _EpisodesTitle({this.title}); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(30)), + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: I18n.of(context).episodes, + style: TextStyle( + fontSize: Adapt.px(30), fontWeight: FontWeight.w600)), + TextSpan( + text: title, + style: TextStyle( + color: const Color(0xFF9E9E9E), fontSize: Adapt.px(26))) + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/seasons_page/action.dart b/lib/views/seasons_page/action.dart new file mode 100644 index 00000000..c64b9665 --- /dev/null +++ b/lib/views/seasons_page/action.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum SeasonsPageAction { action, cellTapped } + +class SeasonsPageActionCreator { + static Action onAction() { + return const Action(SeasonsPageAction.action); + } + + static Action onCellTapped( + int tvid, int seasonnum, String name, String posterpic) { + return Action(SeasonsPageAction.cellTapped, + payload: [tvid, seasonnum, name, posterpic]); + } +} diff --git a/lib/views/seasons_page/effect.dart b/lib/views/seasons_page/effect.dart new file mode 100644 index 00000000..dfea25b0 --- /dev/null +++ b/lib/views/seasons_page/effect.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SeasonsPageAction.action: _onAction, + SeasonsPageAction.cellTapped: _onCellTapped, + Lifecycle.initState: _onInit, + Lifecycle.build: _onBuild, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) { + final Object ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: ticker, + duration: Duration(milliseconds: 400 * ctx.state.seasons.length)); +} + +void _onBuild(Action action, Context ctx) { + Future.delayed(const Duration(milliseconds: 500), + () => ctx.state.animationController.forward()); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); +} + +Future _onCellTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('seasondetailpage', arguments: { + 'tvid': action.payload[0], + 'seasonNumber': action.payload[1], + 'name': action.payload[2], + 'posterpic': action.payload[3] + }); +} diff --git a/lib/views/seasons_page/page.dart b/lib/views/seasons_page/page.dart new file mode 100644 index 00000000..ad2f5bd9 --- /dev/null +++ b/lib/views/seasons_page/page.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SeasonsPage extends Page> + with TickerProviderMixin { + SeasonsPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/seasons_page/reducer.dart b/lib/views/seasons_page/reducer.dart new file mode 100644 index 00000000..944cd525 --- /dev/null +++ b/lib/views/seasons_page/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SeasonsPageAction.action: _onAction, + }, + ); +} + +SeasonsPageState _onAction(SeasonsPageState state, Action action) { + final SeasonsPageState newState = state.clone(); + return newState; +} diff --git a/lib/views/seasons_page/state.dart b/lib/views/seasons_page/state.dart new file mode 100644 index 00000000..87a265a1 --- /dev/null +++ b/lib/views/seasons_page/state.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/season_detail.dart'; + +class SeasonsPageState implements Cloneable { + int tvid; + List seasons; + AnimationController animationController; + + @override + SeasonsPageState clone() { + return SeasonsPageState()..seasons = seasons; + } +} + +SeasonsPageState initState(Map args) { + SeasonsPageState state = SeasonsPageState(); + state.seasons = args['list'] ?? []; + state.tvid = args['tvid']; + return state; +} diff --git a/lib/views/seasons_page/view.dart b/lib/views/seasons_page/view.dart new file mode 100644 index 00000000..071313bf --- /dev/null +++ b/lib/views/seasons_page/view.dart @@ -0,0 +1,151 @@ +import 'dart:math'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + SeasonsPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Scaffold( + appBar: AppBar( + brightness: _theme.brightness, + backgroundColor: _theme.backgroundColor, + iconTheme: _theme.iconTheme, + title: Text( + 'All Seasons', + style: _theme.textTheme.bodyText1, + ), + ), + body: Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + child: ListView.separated( + separatorBuilder: (context, index) => SizedBox(height: Adapt.px(20)), + itemCount: state.seasons.length, + itemBuilder: (ctx, index) { + return _Cell( + index: index, + season: state.seasons[index], + length: state.seasons.length, + controller: state.animationController, + onTap: (d) => dispatch(SeasonsPageActionCreator.onCellTapped( + state.tvid, d.seasonNumber, d.name, d.posterPath)), + ); + }, + ), + ), + ); + }); +} + +class _Cell extends StatelessWidget { + final int index; + final int length; + final Season season; + final Function(Season) onTap; + final AnimationController controller; + const _Cell( + {this.index, this.length, this.season, this.controller, this.onTap}); + @override + Widget build(BuildContext context) { + final Random random = Random(DateTime.now().millisecondsSinceEpoch); + final curve = CurvedAnimation( + parent: controller, + curve: Interval( + index * (1.0 / length), + (index + 1) * (1.0 / length), + curve: Curves.ease, + ), + ); + return SlideTransition( + position: Tween(begin: Offset(0, 1), end: Offset.zero).animate(curve), + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(curve), + child: GestureDetector( + onTap: () => onTap(season), + child: Card( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(225), + height: Adapt.px(380), + decoration: BoxDecoration( + color: Color.fromRGBO( + random.nextInt(255), + random.nextInt(255), + random.nextInt(255), + random.nextDouble()), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + season.posterPath == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl( + season.posterPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: Adapt.px(20), + ), + Container( + width: Adapt.screenW() - Adapt.px(320), + child: Text( + season.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30)), + ), + ), + SizedBox( + height: Adapt.px(5), + ), + Text('Air Date: ${season.airDate}'), + SizedBox( + height: Adapt.px(5), + ), + Text('Episode Count: ${season.episodeCount}'), + SizedBox( + height: Adapt.px(10), + ), + Container( + width: Adapt.screenW() - Adapt.px(320), + child: Text( + season.overview == null || season.overview == '' + ? 'No overview have been added' + : season.overview, + maxLines: 6, + overflow: TextOverflow.ellipsis, + //style: TextStyle(height: 1.2), + ), + ) + ], + ) + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/setting_page/action.dart b/lib/views/setting_page/action.dart new file mode 100644 index 00000000..555df35f --- /dev/null +++ b/lib/views/setting_page/action.dart @@ -0,0 +1,78 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/item.dart'; + +enum SettingPageAction { + action, + adultCellTapped, + adultValueUpadte, + languageTap, + setLanguage, + cleanCached, + cachedSizeUpdate, + profileEdit, + userUpdate, + openPhotoPicker, + userPanelPhotoUrlUpdate, + uploading, + loading, + checkUpdate, +} + +class SettingPageActionCreator { + static Action onAction() { + return const Action(SettingPageAction.action); + } + + static Action adultCellTapped() { + return Action(SettingPageAction.adultCellTapped); + } + + static Action adultValueUpadte(bool b) { + return Action(SettingPageAction.adultValueUpadte, payload: b); + } + + static Action cleanCached() { + return Action(SettingPageAction.cleanCached); + } + + static Action cacheSizeUpdate(double d) { + return Action(SettingPageAction.cachedSizeUpdate, payload: d); + } + + static Action profileEdit() { + return Action(SettingPageAction.profileEdit); + } + + static Action userUpadate(FirebaseUser user) { + return Action(SettingPageAction.userUpdate, payload: user); + } + + static Action openPhotoPicker() { + return const Action(SettingPageAction.openPhotoPicker); + } + + static Action userPanelPhotoUrlUpdate(String url) { + return Action(SettingPageAction.userPanelPhotoUrlUpdate, payload: url); + } + + static Action onUploading(bool isUploading) { + return Action(SettingPageAction.uploading, payload: isUploading); + } + + static Action onLoading(bool isLoading) { + return Action(SettingPageAction.loading, payload: isLoading); + } + + static Action onCheckUpdate() { + return const Action(SettingPageAction.checkUpdate); + } + + static Action languageTap(Item language) { + return Action(SettingPageAction.languageTap, payload: language); + } + + static Action setLanguage(Item language) { + return Action(SettingPageAction.setLanguage, payload: language); + } +} diff --git a/lib/views/setting_page/components/setting_body.dart b/lib/views/setting_page/components/setting_body.dart new file mode 100644 index 00000000..b6d2b612 --- /dev/null +++ b/lib/views/setting_page/components/setting_body.dart @@ -0,0 +1,377 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/app_language.dart'; +import 'package:movie/models/item.dart'; +import 'package:movie/views/setting_page/action.dart'; + +class SettingBody extends StatelessWidget { + final AnimationController pageAnimation; + final AnimationController userEditAnimation; + final FirebaseUser user; + final bool adultSwitchValue; + final double cachedSize; + final bool loading; + final String version; + final Item appLanguage; + final Dispatch dispatch; + const SettingBody( + {this.adultSwitchValue, + this.cachedSize, + this.dispatch, + this.loading, + this.pageAnimation, + this.user, + this.userEditAnimation, + this.version, + this.appLanguage}); + @override + Widget build(BuildContext context) { + final double _margin = Adapt.px(120) + Adapt.padTopH(); + final Animation _run = Tween(begin: .00, end: 1.0).animate( + CurvedAnimation(parent: userEditAnimation, curve: Curves.ease)); + return AnimatedBuilder( + animation: userEditAnimation, + builder: (_, __) { + return Padding( + padding: EdgeInsets.only( + top: _margin, left: Adapt.px(60), right: Adapt.px(60)), + child: Container( + transform: Matrix4.identity()..scale(1.0 - _run.value, 1.0, 1.0), + height: Adapt.screenH() - _margin, + child: ListView( + physics: ClampingScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + children: [ + _UserCell( + pageAnimation: pageAnimation, + userEditAnimation: userEditAnimation, + user: user, + ), + _AdultCell( + pageAnimation: pageAnimation, + adultSwitchValue: adultSwitchValue, + onTap: () => + dispatch(SettingPageActionCreator.adultCellTapped()), + ), + _LanguageCell( + pageAnimation: pageAnimation, + language: appLanguage, + onTap: (language) => + dispatch(SettingPageActionCreator.languageTap(language)), + ), + _VersionCell( + pageAnimation: pageAnimation, + version: version, + loading: loading, + onTap: () => + dispatch(SettingPageActionCreator.onCheckUpdate()), + ) + ], + ), + ), + ); + }, + ); + } +} + +class _UserCell extends StatelessWidget { + final AnimationController pageAnimation; + final AnimationController userEditAnimation; + final FirebaseUser user; + const _UserCell({this.pageAnimation, this.user, this.userEditAnimation}); + @override + Widget build(BuildContext context) { + return _ListCell( + pageAnimation: pageAnimation, + begin: .1, + end: .7, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(60)), + child: ListTile( + leading: Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF303030), + image: user?.photoUrl != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(user?.photoUrl), + ) + : null, + ), + ), + title: Text( + user?.displayName ?? 'Guest', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + subtitle: Text( + user?.email ?? '-', + maxLines: 1, + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(24)), + ), + trailing: IconButton( + onPressed: () { + if (user != null) userEditAnimation.forward(); + }, + icon: Icon(Icons.edit), + color: Colors.white, + iconSize: Adapt.px(60), + ), + ), + ), + ); + } +} + +class _AdultCell extends StatelessWidget { + final Function onTap; + final AnimationController pageAnimation; + final bool adultSwitchValue; + const _AdultCell({this.onTap, this.adultSwitchValue, this.pageAnimation}); + @override + Widget build(BuildContext context) { + return _ListCell( + pageAnimation: pageAnimation, + begin: .2, + end: .8, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(60)), + child: ListTile( + onTap: onTap, + leading: Icon( + adultSwitchValue ? Icons.visibility : Icons.visibility_off, + color: Colors.white, + size: Adapt.px(80), + ), + title: Text( + 'Adult Items', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + subtitle: Text( + adultSwitchValue ? 'on' : 'off', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + trailing: CupertinoSwitch( + onChanged: (b) => onTap(), + activeColor: Color(0xFF111111), + trackColor: Color(0xFFD0D0D0), + value: adultSwitchValue, + ), + ), + ), + ); + } +} + +class _VersionCell extends StatelessWidget { + final Function onTap; + final AnimationController pageAnimation; + final bool loading; + final String version; + const _VersionCell( + {this.onTap, this.pageAnimation, this.loading, this.version}); + @override + Widget build(BuildContext context) { + return _ListCell( + pageAnimation: pageAnimation, + begin: .4, + end: 1.0, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(60)), + child: ListTile( + leading: Icon( + Icons.system_update, + color: Colors.white, + size: Adapt.px(80), + ), + title: Text( + 'Version', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + subtitle: Text( + version ?? '-', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + trailing: IconButton( + onPressed: onTap, + icon: loading + ? SizedBox( + width: Adapt.px(40), + height: Adapt.px(40), + child: CircularProgressIndicator( + strokeWidth: Adapt.px(5), + valueColor: + AlwaysStoppedAnimation(const Color(0xFFFFFFFF)), + )) + : Icon(Icons.refresh), + color: Colors.white, + iconSize: Adapt.px(60), + ), + ), + ), + ); + } +} + +class _LanguageCell extends StatelessWidget { + final Function(Item) onTap; + final AnimationController pageAnimation; + final Item language; + const _LanguageCell({this.onTap, this.pageAnimation, this.language}); + @override + Widget build(BuildContext context) { + return _ListCell( + pageAnimation: pageAnimation, + begin: .3, + end: .9, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(60)), + child: ListTile( + onTap: () => showDialog( + context: context, + builder: (_) => _LanguageList( + onTap: onTap, + selected: language, + ), + ), + leading: Icon( + Icons.language, + color: Colors.white, + size: Adapt.px(80), + ), + title: Text( + 'Language', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + subtitle: Text( + language?.name ?? 'System default', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + trailing: Icon( + Icons.translate, + color: Colors.white, + size: Adapt.px(60), + ), + ), + ), + ); + } +} + +class _ListCell extends StatelessWidget { + final AnimationController pageAnimation; + final double begin; + final double end; + final Widget child; + const _ListCell( + {this.pageAnimation, this.begin, this.end, @required this.child}); + @override + Widget build(BuildContext context) { + final CurvedAnimation _animation = CurvedAnimation( + parent: pageAnimation, curve: Interval(begin, end, curve: Curves.ease)); + return FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(_animation), + child: SlideTransition( + position: + Tween(begin: Offset(0, 2), end: Offset.zero).animate(_animation), + child: Container( + height: Adapt.px(250), + margin: EdgeInsets.only(bottom: Adapt.px(40)), + decoration: BoxDecoration( + color: const Color(0xFF202020), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: child, + ), + ), + ); + } +} + +class _LanguageList extends StatelessWidget { + final Function(Item) onTap; + final Item selected; + const _LanguageList({this.onTap, this.selected}); + @override + Widget build(BuildContext context) { + final Size _size = MediaQuery.of(context).size; + final List data = AppLanguage.instance.supportLanguages; + return SimpleDialog( + elevation: 0.0, + backgroundColor: const Color(0xFF252525), + titleTextStyle: TextStyle(color: const Color(0xFFFFFFFF), fontSize: 20), + title: Text( + 'Support Language', + ), + children: [ + Container( + height: _size.height / 2, + width: _size.width, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 5.0), + separatorBuilder: (_, __) => SizedBox(height: 10), + physics: BouncingScrollPhysics(), + itemCount: data.length, + itemBuilder: (_, index) { + final _language = data[index]; + return GestureDetector( + onTap: () { + onTap(_language); + Navigator.of(context).pop(); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + decoration: selected.name == _language.name + ? BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all(color: const Color(0xFFFFFFFF))) + : null, + child: Text( + _language.name, + style: TextStyle( + color: const Color(0xFFFFFFFF), fontSize: 18), + ), + ), + ); + }), + ), + ], + ); + } +} diff --git a/lib/views/setting_page/effect.dart b/lib/views/setting_page/effect.dart new file mode 100644 index 00000000..a0d069a6 --- /dev/null +++ b/lib/views/setting_page/effect.dart @@ -0,0 +1,197 @@ +import 'dart:io'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/github_api.dart'; +import 'package:movie/actions/user_info_operate.dart'; +import 'package:movie/actions/version_comparison.dart'; +import 'package:movie/globalbasestate/action.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/item.dart'; +import 'package:movie/widgets/update_info_dialog.dart'; +import 'package:package_info/package_info.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:path/path.dart' as Path; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SettingPageAction.action: _onAction, + SettingPageAction.adultCellTapped: _adultCellTapped, + SettingPageAction.cleanCached: _cleanCached, + SettingPageAction.profileEdit: _profileEdit, + SettingPageAction.openPhotoPicker: _openPhotoPicker, + SettingPageAction.checkUpdate: _checkUpdate, + SettingPageAction.languageTap: _languageTap, + Lifecycle.initState: _onInit, + Lifecycle.build: _onBuild, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + Object ticker = ctx.stfState; + ctx.state.pageAnimation = AnimationController( + vsync: ticker, + duration: Duration(milliseconds: 800), + reverseDuration: Duration(milliseconds: 300)); + ctx.state.userEditAnimation = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 300)); + _getCachedSize(ctx); + ctx.state.userNameController = + TextEditingController(text: ctx.state.userName ?? '') + ..addListener(() { + ctx.state.userName = ctx.state.userNameController.text; + }); + ctx.state.phoneController = TextEditingController(text: ctx.state.phone ?? '') + ..addListener(() { + ctx.state.phone = ctx.state.phoneController.text; + }); + ctx.state.photoController = + TextEditingController(text: ctx.state.photoUrl ?? '') + ..addListener(() { + ctx.state.photoUrl = ctx.state.photoController.text; + }); + + final _packageInfo = await PackageInfo.fromPlatform(); + ctx.state.version = _packageInfo?.version ?? '-'; + SharedPreferences prefs = await SharedPreferences.getInstance(); + final _adultItem = prefs.getBool('adultItems'); + if (_adultItem != null) if (_adultItem != ctx.state.adultSwitchValue) + ctx.dispatch(SettingPageActionCreator.adultValueUpadte(_adultItem)); + final _appLanguage = prefs.getString('appLanguage'); + if (_appLanguage != null) + ctx.dispatch(SettingPageActionCreator.setLanguage(Item(_appLanguage))); +} + +void _cleanCached(Action action, Context ctx) async { + await DefaultCacheManager().emptyCache(); + /*var appDir = (await getTemporaryDirectory()).path; + new Directory(appDir).delete(recursive: true);*/ + _getCachedSize(ctx); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.pageAnimation?.dispose(); + ctx.state.userEditAnimation?.dispose(); + ctx.state.userNameController.dispose(); + ctx.state.phoneController.dispose(); + ctx.state.photoController.dispose(); +} + +void _onBuild(Action action, Context ctx) { + ctx.state.pageAnimation.forward(); +} + +void _adultCellTapped(Action action, Context ctx) async { + final _b = !(ctx.state.adultSwitchValue ?? false); + ctx.dispatch(SettingPageActionCreator.adultValueUpadte(_b)); + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setBool('adultItems', _b); + TMDBApi.instance.setAdultValue(_b); +} + +void _getCachedSize(Context ctx) async { + final directory = Directory(await DefaultCacheManager().getFilePath()); + if (directory.existsSync()) { + FileStat fileStat = directory.statSync(); + ctx.dispatch( + SettingPageActionCreator.cacheSizeUpdate(fileStat.size / 1024.0)); + } +} + +void _profileEdit(Action action, Context ctx) { + if (ctx.state.user != null) { + assert(ctx.state.userName != null && ctx.state.userName != ''); + assert(ctx.state.photoUrl != null && ctx.state.photoUrl != ''); + + ctx.dispatch(SettingPageActionCreator.onUploading(true)); + final UserUpdateInfo _userInfo = UserUpdateInfo(); + _userInfo.displayName = ctx.state.userName; + _userInfo.photoUrl = ctx.state.photoUrl; + ctx.state.user.updateProfile(_userInfo) + ..then((d) async { + final _user = await FirebaseAuth.instance.currentUser(); + + ctx.dispatch(SettingPageActionCreator.userUpadate(_user)); + + UserInfoOperate.whenLogin(_user, _user.displayName); + ctx.dispatch(SettingPageActionCreator.onUploading(false)); + ctx.state.userEditAnimation.reverse(); + }); + } +} + +Future _openPhotoPicker(Action action, Context ctx) async { + final ImagePicker _imagePicker = ImagePicker(); + final _image = await _imagePicker.getImage( + source: ImageSource.gallery, maxHeight: 100, maxWidth: 100); + if (_image != null) { + ctx.dispatch(SettingPageActionCreator.onUploading(true)); + StorageReference storageReference = FirebaseStorage.instance + .ref() + .child('avatar/${Path.basename(_image.path)}'); + StorageUploadTask uploadTask = + storageReference.putData(await _image.readAsBytes()); + await uploadTask.onComplete; + print('File Uploaded'); + storageReference.getDownloadURL().then((fileURL) { + if (fileURL != null) { + ctx.state.photoController.text = fileURL; + ctx.dispatch(SettingPageActionCreator.userPanelPhotoUrlUpdate(fileURL)); + } + ctx.dispatch(SettingPageActionCreator.onUploading(false)); + }); + } +} + +Future _checkUpdate(Action action, Context ctx) async { + if (!Platform.isAndroid) return; + + ctx.dispatch(SettingPageActionCreator.onLoading(true)); + final _github = GithubApi.instance; + final _result = await _github.checkUpdate(); + if (_result.success) { + final _shouldUpdate = + VersionComparison().compare(ctx.state.version, _result.result.tagName); + final _apk = _result.result.assets.singleWhere( + (e) => e.contentType == 'application/vnd.android.package-archive'); + + if (_apk != null && _shouldUpdate) { + await showDialog( + context: ctx.context, + builder: (context) { + return UpdateInfoDialog( + version: _result.result.tagName, + describe: _result.result.body, + packageSize: (_apk.size / 1048576), + downloadUrl: _apk.browserDownloadUrl, + ); + }); + } + } else + Toast.show(_result.message, ctx.context); + ctx.dispatch(SettingPageActionCreator.onLoading(false)); +} + +void _languageTap(Action action, Context ctx) async { + final Item _language = action.payload; + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (_language.name == 'System Default') + prefs.remove('appLanguage'); + else + prefs.setString('appLanguage', _language.toString()); + ctx.dispatch(SettingPageActionCreator.setLanguage(_language)); + GlobalStore.store.dispatch(GlobalActionCreator.changeLocale( + _language.value == null ? null : Locale(_language.value))); + TMDBApi.instance.setLanguage(_language.value); +} diff --git a/lib/views/setting_page/page.dart b/lib/views/setting_page/page.dart new file mode 100644 index 00000000..ac0e096d --- /dev/null +++ b/lib/views/setting_page/page.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SettingPage extends Page> + with TickerProviderMixin { + SettingPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/setting_page/reducer.dart b/lib/views/setting_page/reducer.dart new file mode 100644 index 00000000..69ca3d98 --- /dev/null +++ b/lib/views/setting_page/reducer.dart @@ -0,0 +1,78 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/item.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SettingPageAction.action: _onAction, + SettingPageAction.adultValueUpadte: _adultValueUpadte, + SettingPageAction.cachedSizeUpdate: _cachedSizeUpdate, + SettingPageAction.userUpdate: _userUpdate, + SettingPageAction.userPanelPhotoUrlUpdate: _userPanelPhotoUrlUpdate, + SettingPageAction.uploading: _onUploading, + SettingPageAction.loading: _onLoading, + SettingPageAction.setLanguage: _setLanguage, + }, + ); +} + +SettingPageState _onAction(SettingPageState state, Action action) { + final SettingPageState newState = state.clone(); + return newState; +} + +SettingPageState _onUploading(SettingPageState state, Action action) { + final bool _isUploading = action.payload ?? false; + final SettingPageState newState = state.clone(); + newState.uploading = _isUploading; + return newState; +} + +SettingPageState _onLoading(SettingPageState state, Action action) { + final bool _isLoading = action.payload ?? false; + final SettingPageState newState = state.clone(); + newState.loading = _isLoading; + return newState; +} + +SettingPageState _adultValueUpadte(SettingPageState state, Action action) { + final bool _b = action.payload; + final SettingPageState newState = state.clone(); + newState.adultSwitchValue = _b; + return newState; +} + +SettingPageState _cachedSizeUpdate(SettingPageState state, Action action) { + final double _c = action.payload; + final SettingPageState newState = state.clone(); + newState.cachedSize = _c; + return newState; +} + +SettingPageState _userUpdate(SettingPageState state, Action action) { + final FirebaseUser _user = action.payload; + final SettingPageState newState = state.clone(); + newState.user = _user; + newState.userName = _user.displayName; + newState.photoUrl = _user.photoUrl; + return newState; +} + +SettingPageState _userPanelPhotoUrlUpdate( + SettingPageState state, Action action) { + final String _url = action.payload; + final SettingPageState newState = state.clone(); + newState.userPanelPhotoUrl = _url; + return newState; +} + +SettingPageState _setLanguage(SettingPageState state, Action action) { + final Item _language = action.payload; + final SettingPageState newState = state.clone(); + newState.appLanguage = _language; + return newState; +} diff --git a/lib/views/setting_page/state.dart b/lib/views/setting_page/state.dart new file mode 100644 index 00000000..6bb899b6 --- /dev/null +++ b/lib/views/setting_page/state.dart @@ -0,0 +1,65 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/item.dart'; + +class SettingPageState implements Cloneable { + AnimationController pageAnimation; + AnimationController userEditAnimation; + FirebaseUser user; + String userName; + String photoUrl; + String userPanelPhotoUrl; + String phone; + String version; + Item appLanguage; + TextEditingController userNameController; + TextEditingController photoController; + TextEditingController phoneController; + bool adultSwitchValue; + bool isEditProfile; + bool uploading; + bool loading; + double cachedSize; + @override + SettingPageState clone() { + return SettingPageState() + ..pageAnimation = pageAnimation + ..userEditAnimation = userEditAnimation + ..adultSwitchValue = adultSwitchValue + ..isEditProfile = isEditProfile + ..cachedSize = cachedSize + ..user = user + ..userName = userName + ..phone = phone + ..photoUrl = photoUrl + ..userPanelPhotoUrl = userPanelPhotoUrl + ..userNameController = userNameController + ..phoneController = phoneController + ..photoController = photoController + ..uploading = uploading + ..loading = loading + ..version = version + ..appLanguage = appLanguage; + } +} + +SettingPageState initState(Map args) { + SettingPageState state = SettingPageState(); + final user = GlobalStore.store.getState().user?.firebaseUser; + if (user != null) { + state.user = user; + state.userName = user.displayName; + state.phone = user.phoneNumber; + state.photoUrl = user.photoUrl; + state.userPanelPhotoUrl = user.photoUrl; + } + state.adultSwitchValue = false; + state.isEditProfile = false; + state.uploading = false; + state.loading = false; + state.cachedSize = 0; + state.appLanguage = Item.fromParams(name: "System Default"); + return state; +} diff --git a/lib/views/setting_page/view.dart b/lib/views/setting_page/view.dart new file mode 100644 index 00000000..44d5784f --- /dev/null +++ b/lib/views/setting_page/view.dart @@ -0,0 +1,371 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/customcliper_path.dart'; +import 'action.dart'; +import 'components/setting_body.dart'; +import 'state.dart'; + +Widget buildView( + SettingPageState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + body: Stack( + children: [ + _BackGround(pageAnimation: state.pageAnimation), + SettingBody( + dispatch: dispatch, + pageAnimation: state.pageAnimation, + userEditAnimation: state.userEditAnimation, + adultSwitchValue: state.adultSwitchValue, + loading: state.loading, + cachedSize: state.cachedSize, + version: state.version, + user: state.user, + appLanguage: state.appLanguage, + ), + _UserProfilePanel( + dispatch: dispatch, + user: state.user, + phoneController: state.phoneController, + photoController: state.photoController, + userNameController: state.userNameController, + userEditAnimation: state.userEditAnimation, + userPanelPhotoUrl: state.userPanelPhotoUrl, + ), + _LoadingPanel(uploading: state.uploading), + const _AppBar(), + ], + ), + ); +} + +class _AppBar extends StatelessWidget { + const _AppBar(); + @override + Widget build(BuildContext context) { + return Positioned( + top: 0.0, + left: 0.0, + right: 0.0, + child: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + title: const Text('Settings'), + ), + ); + } +} + +class _BackGround extends StatelessWidget { + final AnimationController pageAnimation; + const _BackGround({this.pageAnimation}); + @override + Widget build(BuildContext context) { + final CurvedAnimation _heightAnimation = + CurvedAnimation(parent: pageAnimation, curve: Curves.ease); + final Animation _height = Tween(begin: Adapt.px(380), end: Adapt.px(1200)) + .animate(_heightAnimation); + final CurvedAnimation _pathAnimation = CurvedAnimation( + parent: pageAnimation, curve: Interval(0.4, 1.0, curve: Curves.ease)); + return AnimatedBuilder( + animation: pageAnimation, + builder: (_, __) { + return ClipPath( + clipper: CustomCliperPath( + height: _height.value, + width: Adapt.screenW(), + radius: Tween(begin: Adapt.px(2000), end: Adapt.px(8000)) + .animate(_pathAnimation) + .value), + child: Container( + height: _height.value, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + ColorTween( + begin: const Color(0xFF6495ED), + end: const Color(0xFF111111)) + .animate(_heightAnimation) + .value, + ColorTween( + begin: const Color(0xFF6A5ACD), + end: const Color(0xFF111111)) + .animate(_heightAnimation) + .value, + ], + stops: [ + 0.0, + 1.0 + ]), + ), + ), + ); + }, + ); + } +} + +class _LoadingPanel extends StatelessWidget { + final bool uploading; + const _LoadingPanel({@required this.uploading}); + @override + Widget build(BuildContext context) { + return uploading + ? Container( + width: Adapt.screenW(), + height: Adapt.screenH(), + color: Colors.black38, + child: Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.white), + ), + ), + ) + : SizedBox(); + } +} + +class _ButtonGrounp extends StatelessWidget { + final AnimationController userEditAnimation; + final Function submit; + const _ButtonGrounp({this.submit, this.userEditAnimation}); + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(Adapt.px(40)), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + onTap: () => userEditAnimation.reverse(), + child: Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + height: Adapt.px(80), + width: Adapt.px(200), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + border: Border.all(color: Colors.white, width: 3)), + child: Center( + child: Text( + 'Cancel', + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(35), + fontWeight: FontWeight.w500), + )), + ), + ), + SizedBox(width: Adapt.px(60)), + InkWell( + onTap: submit, + child: Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + height: Adapt.px(80), + width: Adapt.px(200), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(40)), + border: Border.all(color: Colors.white, width: 3)), + child: Center( + child: Text( + 'OK', + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(35), + fontWeight: FontWeight.w500), + ), + ), + ), + ) + ], + ), + ); + } +} + +class _UserProfileAvatar extends StatelessWidget { + final Function onTap; + final String userPanelPhotoUrl; + const _UserProfileAvatar({this.onTap, this.userPanelPhotoUrl}); + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + width: Adapt.px(150), + height: Adapt.px(150), + alignment: Alignment.center, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF303030), + image: userPanelPhotoUrl != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(userPanelPhotoUrl), + ) + : null, + ), + child: Container( + width: Adapt.px(150), + height: Adapt.px(150), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black38, + ), + child: Icon(Icons.file_upload, color: Colors.white54), + ), + ), + ), + ); + } +} + +class _TextFieldCell extends StatelessWidget { + final TextEditingController controller; + final String title; + const _TextFieldCell({this.controller, this.title}); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(35), + fontWeight: FontWeight.w600), + ), + SizedBox(height: Adapt.px(20)), + Container( + height: Adapt.px(80), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(20)), + color: Color(0xFF353535), + ), + child: TextField( + style: TextStyle(color: Colors.white, fontSize: Adapt.px(26)), + cursorColor: Colors.white, + controller: controller, + decoration: InputDecoration( + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(width: 0, color: Colors.transparent), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide(width: 0, color: Colors.transparent), + ), + ), + ), + ) + ], + ); + } +} + +class _TextFields extends StatelessWidget { + final TextEditingController userNameController; + final TextEditingController photoController; + final TextEditingController phoneController; + const _TextFields( + {this.phoneController, this.photoController, this.userNameController}); + @override + Widget build(BuildContext context) { + return Padding( + padding: + EdgeInsets.fromLTRB(Adapt.px(40), Adapt.px(80), Adapt.px(40), 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _TextFieldCell(title: 'UserName', controller: userNameController), + SizedBox(height: Adapt.px(40)), + _TextFieldCell(title: 'Phone', controller: phoneController), + SizedBox(height: Adapt.px(40)), + _TextFieldCell(title: 'PhotoUrl', controller: photoController), + ], + )); + } +} + +class _UserProfilePanel extends StatelessWidget { + final AnimationController userEditAnimation; + final String userPanelPhotoUrl; + final TextEditingController userNameController; + final TextEditingController photoController; + final TextEditingController phoneController; + final Dispatch dispatch; + final FirebaseUser user; + const _UserProfilePanel( + {this.dispatch, + this.phoneController, + this.photoController, + this.user, + this.userEditAnimation, + this.userNameController, + this.userPanelPhotoUrl}); + @override + Widget build(BuildContext context) { + final double _margin = Adapt.px(120) + Adapt.padTopH(); + final CurvedAnimation _run = + CurvedAnimation(parent: userEditAnimation, curve: Curves.ease); + return AnimatedBuilder( + animation: userEditAnimation, + builder: (_, __) { + return Padding( + padding: EdgeInsets.fromLTRB(Adapt.px(40), _margin, Adapt.px(40), 0), + child: SlideTransition( + position: + Tween(begin: Offset(1, 0.0), end: Offset.zero).animate(_run), + child: Container( + transform: Matrix4.identity()..scale(_run.value, 1.0, 1.0), + margin: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + width: Adapt.screenH() - Adapt.px(120), + height: Adapt.px(1120), + decoration: BoxDecoration( + color: Color(0xFF202020), + borderRadius: BorderRadius.circular(Adapt.px(20))), + child: ListView( + padding: EdgeInsets.zero, + physics: ClampingScrollPhysics(), + shrinkWrap: true, + children: [ + SizedBox(height: Adapt.px(60)), + _UserProfileAvatar( + userPanelPhotoUrl: userPanelPhotoUrl, + onTap: () => + dispatch(SettingPageActionCreator.openPhotoPicker()), + ), + SizedBox(height: Adapt.px(30)), + Text( + '${user?.email ?? '-'}', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: Adapt.px(35)), + ), + _TextFields( + phoneController: phoneController, + photoController: photoController, + userNameController: userNameController, + ), + SizedBox(height: Adapt.px(60)), + _ButtonGrounp( + userEditAnimation: userEditAnimation, + submit: () => + dispatch(SettingPageActionCreator.profileEdit()), + ), + ], + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/views/start_page/action.dart b/lib/views/start_page/action.dart new file mode 100644 index 00000000..f271071e --- /dev/null +++ b/lib/views/start_page/action.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum StartPageAction { action, setIsFirst, onStart } + +class StartPageActionCreator { + static Action onAction() { + return const Action(StartPageAction.action); + } + + static Action onStart() { + return const Action(StartPageAction.onStart); + } + + static Action setIsFirst(bool isFirst) { + return Action(StartPageAction.setIsFirst, payload: isFirst); + } +} diff --git a/lib/views/start_page/effect.dart b/lib/views/start_page/effect.dart new file mode 100644 index 00000000..07a8b680 --- /dev/null +++ b/lib/views/start_page/effect.dart @@ -0,0 +1,62 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/routes/routes.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + StartPageAction.action: _onAction, + StartPageAction.onStart: _onStart, + Lifecycle.build: _onBuild, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} +void _onInit(Action action, Context ctx) async { + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); + _firebaseMessaging.requestNotificationPermissions(); + _firebaseMessaging.configure(); + _firebaseMessaging.autoInitEnabled(); + ctx.state.pageController = PageController(); + SharedPreferences.getInstance().then((_p) async { + final _isFirst = _p.getBool('firstStart') ?? true; + if (!_isFirst) + await _pushToMainPage(ctx.context); + else + ctx.dispatch(StartPageActionCreator.setIsFirst(_isFirst)); + }); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.pageController.dispose(); +} + +void _onBuild(Action action, Context ctx) { + // Future.delayed(Duration(milliseconds: 0), () => _pushToMainPage(ctx.context)); +} +void _onStart(Action action, Context ctx) async { + SharedPreferences.getInstance().then((_p) { + _p.setBool('firstStart', false); + }); + await _pushToMainPage(ctx.context); +} + +Future _pushToMainPage(BuildContext context) async { + await Navigator.of(context).pushReplacement(PageRouteBuilder( + pageBuilder: (_, __, ___) { + return Routes.routes.buildPage('mainpage', { + 'pages': List.unmodifiable([ + Routes.routes.buildPage('homePage', null), + Routes.routes.buildPage('discoverPage', null), + Routes.routes.buildPage('comingPage', null), + Routes.routes.buildPage('testAccountPage', null) + ]) + }); + }, + settings: RouteSettings(name: 'mainpage'))); +} diff --git a/lib/views/start_page/page.dart b/lib/views/start_page/page.dart new file mode 100644 index 00000000..6d980322 --- /dev/null +++ b/lib/views/start_page/page.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class StartPage extends Page> { + StartPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/start_page/reducer.dart b/lib/views/start_page/reducer.dart new file mode 100644 index 00000000..7469304a --- /dev/null +++ b/lib/views/start_page/reducer.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + StartPageAction.action: _onAction, + StartPageAction.setIsFirst: _setIsFirst, + }, + ); +} + +StartPageState _onAction(StartPageState state, Action action) { + final StartPageState newState = state.clone(); + return newState; +} + +StartPageState _setIsFirst(StartPageState state, Action action) { + final bool _isFirst = action.payload; + final StartPageState newState = state.clone(); + newState.isFirstTime = _isFirst; + return newState; +} diff --git a/lib/views/start_page/state.dart b/lib/views/start_page/state.dart new file mode 100644 index 00000000..bb29baec --- /dev/null +++ b/lib/views/start_page/state.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; + +class StartPageState implements Cloneable { + PageController pageController; + bool isFirstTime; + @override + StartPageState clone() { + return StartPageState() + ..pageController = pageController + ..isFirstTime = isFirstTime; + } +} + +StartPageState initState(Map args) { + return StartPageState(); +} diff --git a/lib/views/start_page/view.dart b/lib/views/start_page/view.dart new file mode 100644 index 00000000..de9a95ac --- /dev/null +++ b/lib/views/start_page/view.dart @@ -0,0 +1,295 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/widgets/keepalive_widget.dart'; +import 'package:movie/models/enums/genres.dart'; +import 'package:movie/models/item.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'dart:ui' as ui; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + StartPageState state, Dispatch dispatch, ViewService viewService) { + final Map _movieGenres = Map(); + final Map _tvGenres = Map(); + Genres.instance.movieList.keys.forEach((e) => _movieGenres[e] = false); + Genres.instance.tvList.keys.forEach((e) => _tvGenres[e] = false); + final pages = [ + _FirstPage( + continueTapped: () => state.pageController + .nextPage(duration: Duration(milliseconds: 400), curve: Curves.ease), + ), + _SubscribeTopicPage( + title: '1.${I18n.of(viewService.context).whatKindOfMovieDoYouLike}?', + buttonTitle: '${I18n.of(viewService.context).next} >', + tag: 'movie_', + isMovie: true, + genres: _movieGenres, + backTapped: () => state.pageController.previousPage( + duration: Duration(milliseconds: 400), curve: Curves.ease), + nextTapped: () { + SharedPreferences.getInstance().then((_p) => _p.setString( + 'movieTypeSubscribed', + _movieGenres.keys + .map((e) => Item.fromParams( + name: e.toString(), value: _movieGenres[e])) + .toList() + .toString())); + state.pageController.nextPage( + duration: Duration(milliseconds: 400), curve: Curves.ease); + }), + _SubscribeTopicPage( + title: '2.${I18n.of(viewService.context).whatKindOfTvShowDoYouLike}?', + buttonTitle: '${I18n.of(viewService.context).start} >', + tag: 'tvshow_', + isMovie: false, + genres: _tvGenres, + backTapped: () => state.pageController.previousPage( + duration: Duration(milliseconds: 400), curve: Curves.ease), + nextTapped: () { + SharedPreferences.getInstance().then((_p) => _p.setString( + 'tvTypeSubscribed', + _tvGenres.keys + .map((e) => + Item.fromParams(name: e.toString(), value: _tvGenres[e])) + .toList() + .toString())); + dispatch(StartPageActionCreator.onStart()); + }), + ]; + + Widget _buildPage(Widget page) { + return keepAliveWrapper(page); + } + + return Scaffold( + body: FutureBuilder( + future: _checkContextInit( + Stream.periodic(Duration(milliseconds: 50), + (x) => MediaQuery.of(viewService.context).size.height), + ), + builder: (_, snapshot) { + if (snapshot.hasData) if (snapshot.data > 0) { + Adapt.initContext(viewService.context); + if (state.isFirstTime != true) + return Container(); + else + return PageView.builder( + physics: NeverScrollableScrollPhysics(), + controller: state.pageController, + allowImplicitScrolling: false, + itemCount: pages.length, + itemBuilder: (context, index) { + return _buildPage(pages[index]); + }, + ); + } + return Container(); + }), + ); +} + +Future _checkContextInit(Stream source) async { + await for (double value in source) { + if (value > 0) { + return value; + } + } + return 0.0; +} + +class _FirstPage extends StatelessWidget { + final Function continueTapped; + const _FirstPage({this.continueTapped}); + @override + Widget build(BuildContext context) { + return Container( + child: SafeArea( + child: Column(mainAxisAlignment: MainAxisAlignment.start, children: [ + SizedBox(height: Adapt.px(300)), + SizedBox( + width: Adapt.screenW(), + height: Adapt.px(500), + child: Lottie.asset( + 'images/landscape.json', //Lottie.network(https://assets4.lottiefiles.com/packages/lf20_umBOmV.json') + )), + Text( + '${I18n.of(context).welcome},', + style: TextStyle(fontSize: 30, fontWeight: FontWeight.w700), + ), + SizedBox(height: Adapt.px(20)), + Text( + '${I18n.of(context).letStartWithFewSteps}.', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w700), + ), + Expanded(child: SizedBox()), + GestureDetector( + onTap: continueTapped, + child: Container( + margin: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + height: 60, + decoration: BoxDecoration( + color: const Color(0xFF202F39), + borderRadius: BorderRadius.circular(30)), + child: Center( + child: Text( + I18n.of(context).continueA, + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 20, + fontWeight: FontWeight.w600), + )), + )), + SizedBox(height: Adapt.px(20)) + ]), + )); + } +} + +class _SubscribeTopicPage extends StatefulWidget { + final String title; + final String buttonTitle; + final bool isMovie; + final String tag; + final Function backTapped; + final Function nextTapped; + final Map genres; + _SubscribeTopicPage( + {this.backTapped, + this.nextTapped, + this.genres, + this.isMovie, + @required this.title, + @required this.buttonTitle, + this.tag}); + @override + _SubscribeTopicPageState createState() => _SubscribeTopicPageState(); +} + +class _SubscribeTopicPageState extends State<_SubscribeTopicPage> { + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); + final List _genres = List(); + final _languageCode = ui.window.locale.languageCode; + @override + void initState() { + final _genresMap = widget.isMovie + ? Genres.instance.getMovieGenresList(_languageCode) + : Genres.instance.getTvGenresList(_languageCode); + _genresMap.forEach((key, value) { + _genres.add(Item.fromParams(name: value, value: key)); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + child: SafeArea( + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox(height: Adapt.px(80)), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Text( + widget.title, + style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600), + )), + SizedBox(height: Adapt.px(60)), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + child: Wrap( + direction: Axis.vertical, + runSpacing: Adapt.px(20), + spacing: Adapt.px(20), + children: _genres.map((d) { + final _index = _genres.indexOf(d); + bool _selected = widget.genres[d.value]; + return GestureDetector( + key: ValueKey(d.name), + onTap: () { + _selected = !_selected; + widget.genres[d.value] = _selected; + final _topic = + '${widget.tag}genre_${d.value}_$_languageCode'; + _selected + ? _firebaseMessaging.subscribeToTopic(_topic) + : _firebaseMessaging.unsubscribeFromTopic(_topic); + setState(() {}); + }, + child: Container( + width: Adapt.px(200), + height: Adapt.px(200), + padding: EdgeInsets.all(Adapt.px(30)), + margin: EdgeInsets.only( + top: (_index + 4) % 8 == 0 ? Adapt.px(80) : 0), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _selected + ? const Color(0xFF202F39) + : const Color(0xFFF0F0F0), + ), + child: Center( + child: Text( + d.name, + style: TextStyle( + color: _selected + ? const Color(0xFFFFFFFF) + : const Color(0xFF0000000), + fontSize: Adapt.px(26), + fontWeight: FontWeight.w600), + )), + )); + }).toList() + ..add(Container(height: Adapt.px(900), width: Adapt.px(40))) + ..insert(0, + Container(height: Adapt.px(900), width: Adapt.px(40))), + ))), + Row(children: [ + SizedBox(width: Adapt.px(80)), + InkWell( + onTap: widget.backTapped, + child: SizedBox( + width: Adapt.px(100), + height: Adapt.px(80), + child: Center( + child: Text(I18n.of(context).back, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + )), + ))), + Expanded(child: SizedBox()), + GestureDetector( + onTap: () async { + widget.nextTapped(); + }, + child: Container( + width: Adapt.px(250), + margin: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + height: 60, + decoration: BoxDecoration( + color: const Color(0xFF202F39), + borderRadius: BorderRadius.circular(30)), + child: Center( + child: Text( + widget.buttonTitle, + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 20, + fontWeight: FontWeight.w600), + )), + )), + ]), + SizedBox(height: Adapt.px(20)) + ]), + )); + } +} diff --git a/lib/views/stream_link/allstreamlink_page/action.dart b/lib/views/stream_link/allstreamlink_page/action.dart new file mode 100644 index 00000000..9edc3dd0 --- /dev/null +++ b/lib/views/stream_link/allstreamlink_page/action.dart @@ -0,0 +1,56 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; +import 'package:movie/models/sort_condition.dart'; + +enum AllStreamLinkPageAction { + action, + initMovieList, + initTvShowList, + loadMoreMovies, + loadMoreTvShows, + openMenu, + search, + gridCellTapped, + sortChanged, +} + +class AllStreamLinkPageActionCreator { + static Action onAction() { + return const Action(AllStreamLinkPageAction.action); + } + + static Action sortChanged(SortCondition sortCondition) { + return Action(AllStreamLinkPageAction.sortChanged, payload: sortCondition); + } + + static Action gridCellTapped( + int id, String bgpic, String title, String posterpic) { + return Action(AllStreamLinkPageAction.gridCellTapped, + payload: [id, bgpic, title, posterpic]); + } + + static Action initMovieList(BaseMovieModel d) { + return Action(AllStreamLinkPageAction.initMovieList, payload: d); + } + + static Action initTvShowList(BaseTvShowModel d) { + return Action(AllStreamLinkPageAction.initTvShowList, payload: d); + } + + static Action loadMoreMovie(BaseMovieModel d) { + return Action(AllStreamLinkPageAction.loadMoreMovies, payload: d); + } + + static Action loadMoreTvShows(BaseTvShowModel d) { + return Action(AllStreamLinkPageAction.loadMoreTvShows, payload: d); + } + + static Action openMenu() { + return Action(AllStreamLinkPageAction.openMenu); + } + + static Action search(String query) { + return Action(AllStreamLinkPageAction.search, payload: query); + } +} diff --git a/lib/views/stream_link/allstreamlink_page/effect.dart b/lib/views/stream_link/allstreamlink_page/effect.dart new file mode 100644 index 00000000..7c6ab533 --- /dev/null +++ b/lib/views/stream_link/allstreamlink_page/effect.dart @@ -0,0 +1,134 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action, Page; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/views/detail_page/page.dart'; +import 'package:movie/views/tvshow_detail_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + AllStreamLinkPageAction.action: _onAction, + AllStreamLinkPageAction.search: _onSearch, + AllStreamLinkPageAction.gridCellTapped: _onCellTapped, + AllStreamLinkPageAction.sortChanged: _sortChanged, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) { + final Object ticker = ctx.stfState; + ctx.state.animationController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 300)); + ctx.state.scrollController = ScrollController() + ..addListener(() { + if (ctx.state.animationController.value != 0 && + !ctx.state.animationController.isAnimating) + ctx.state.animationController.reverse(); + bool bottom = ctx.state.scrollController.position.pixels == + ctx.state.scrollController.position.maxScrollExtent; + if (bottom) _loadMore(ctx); + }); + _initlist(ctx); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); + ctx.state.scrollController.dispose(); +} + +Future _sortChanged(Action action, Context ctx) async { + await ctx.state.animationController.reverse(); + final SortCondition model = action.payload; + if (model.value[0] != ctx.state.orderBy || model.value[1] != ctx.state.desc) { + ctx.state.orderBy = model.value[0]; + ctx.state.desc = model.value[1]; + int index = ctx.state.sortTypes.indexOf(model); + ctx.state.sortTypes.forEach((f) { + f.isSelected = false; + }); + ctx.state.sortTypes[index].isSelected = true; + _initlist(ctx); + } +} + +void _loadMore(Context ctx) async { + final _loading = ctx.state.loading; + final _baseApi = BaseApi.instance; + if (!_loading) { + ctx.state.loading = true; + if (ctx.state.mediaType == MediaType.movie) + _baseApi.getMovies(page: ctx.state.movieList.page + 1).then((d) { + ctx.state.loading = false; + if (d.success) + ctx.dispatch(AllStreamLinkPageActionCreator.loadMoreMovie(d.result)); + }); + else + _baseApi.getTvShows(page: ctx.state.tvList.page + 1).then((d) { + ctx.state.loading = false; + if (d.success) + ctx.dispatch( + AllStreamLinkPageActionCreator.loadMoreTvShows(d.result)); + }); + } +} + +void _initlist(Context ctx) { + final _baseApi = BaseApi.instance; + if (ctx.state.mediaType == MediaType.movie) + _baseApi.getMovies().then((d) { + if (d.success) + ctx.dispatch(AllStreamLinkPageActionCreator.initMovieList(d.result)); + }); + else + _baseApi.getTvShows().then((d) { + if (d.success) + ctx.dispatch(AllStreamLinkPageActionCreator.initTvShowList(d.result)); + }); +} + +void _onSearch(Action action, Context ctx) { + final String query = action.payload ?? ''; + final _baseApi = BaseApi.instance; + if (query != '') if (ctx.state.mediaType == MediaType.movie) + _baseApi.searchMovies(query).then((d) { + if (d.success) + ctx.dispatch(AllStreamLinkPageActionCreator.initMovieList(d.result)); + }); + else + _baseApi.searchTvShows(query).then((d) { + if (d.success) + ctx.dispatch(AllStreamLinkPageActionCreator.initTvShowList(d.result)); + }); +} + +Future _onCellTapped(Action action, Context ctx) async { + final MediaType type = ctx.state.mediaType; + final int id = action.payload[0]; + final String bgpic = action.payload[1]; + final String title = action.payload[2]; + final String posterpic = action.payload[3]; + final String pagename = + type == MediaType.movie ? 'detailpage' : 'tvShowDetailPage'; + var data = { + type == MediaType.movie ? 'id' : 'tvid': id, + 'bgpic': type == MediaType.movie ? posterpic : bgpic, + type == MediaType.tv ? 'name' : 'title': title, + 'posterpic': posterpic + }; + Page page = type == MediaType.movie ? MovieDetailPage() : TvShowDetailPage(); + await Navigator.of(ctx.context).push(PageRouteBuilder( + settings: RouteSettings(name: pagename), + pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: page.buildPage(data), + ); + })); + //await Navigator.of(ctx.context).pushNamed(pagename, arguments: data); +} diff --git a/lib/views/stream_link/allstreamlink_page/page.dart b/lib/views/stream_link/allstreamlink_page/page.dart new file mode 100644 index 00000000..f0651d49 --- /dev/null +++ b/lib/views/stream_link/allstreamlink_page/page.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class AllStreamLinkPage + extends Page> + with TickerProviderMixin { + AllStreamLinkPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/stream_link/allstreamlink_page/reducer.dart b/lib/views/stream_link/allstreamlink_page/reducer.dart new file mode 100644 index 00000000..352cdc30 --- /dev/null +++ b/lib/views/stream_link/allstreamlink_page/reducer.dart @@ -0,0 +1,61 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + AllStreamLinkPageAction.action: _onAction, + AllStreamLinkPageAction.initMovieList: _initMovieList, + AllStreamLinkPageAction.loadMoreMovies: _loadMoreMovies, + AllStreamLinkPageAction.initTvShowList: _initTvShowList, + AllStreamLinkPageAction.loadMoreTvShows: _loadMoreTvShows, + }, + ); +} + +AllStreamLinkPageState _onAction(AllStreamLinkPageState state, Action action) { + final AllStreamLinkPageState newState = state.clone(); + return newState; +} + +AllStreamLinkPageState _loadMoreMovies( + AllStreamLinkPageState state, Action action) { + final BaseMovieModel _list = action.payload; + final AllStreamLinkPageState newState = state.clone(); + if (_list != null) { + newState.movieList.page = _list.page; + newState.movieList.data.addAll(_list?.data ?? []); + } + return newState; +} + +AllStreamLinkPageState _loadMoreTvShows( + AllStreamLinkPageState state, Action action) { + final BaseTvShowModel _list = action.payload; + final AllStreamLinkPageState newState = state.clone(); + if (_list != null) { + newState.tvList.page = _list.page; + newState.tvList.data.addAll(_list?.data ?? []); + } + return newState; +} + +AllStreamLinkPageState _initMovieList( + AllStreamLinkPageState state, Action action) { + final BaseMovieModel _list = action.payload; + final AllStreamLinkPageState newState = state.clone(); + newState.movieList = _list; + return newState; +} + +AllStreamLinkPageState _initTvShowList( + AllStreamLinkPageState state, Action action) { + final BaseTvShowModel _list = action.payload; + final AllStreamLinkPageState newState = state.clone(); + newState.tvList = _list; + return newState; +} diff --git a/lib/views/stream_link/allstreamlink_page/state.dart b/lib/views/stream_link/allstreamlink_page/state.dart new file mode 100644 index 00000000..98bc6d0c --- /dev/null +++ b/lib/views/stream_link/allstreamlink_page/state.dart @@ -0,0 +1,55 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/base_movie.dart'; +import 'package:movie/models/base_api_model/base_tvshow.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/sort_condition.dart'; + +class AllStreamLinkPageState implements Cloneable { + BaseMovieModel movieList; + BaseTvShowModel tvList; + ScrollController scrollController; + GlobalKey scaffoldKey; + AnimationController animationController; + List sortTypes; + String orderBy; + bool desc; + bool loading; + MediaType mediaType; + + @override + AllStreamLinkPageState clone() { + return AllStreamLinkPageState() + ..movieList = movieList + ..tvList = tvList + ..scrollController = scrollController + ..scaffoldKey = scaffoldKey + ..animationController = animationController + ..sortTypes = sortTypes + ..orderBy = orderBy + ..desc = desc + ..loading = loading + ..mediaType = mediaType; + } +} + +AllStreamLinkPageState initState(Map args) { + AllStreamLinkPageState state = new AllStreamLinkPageState(); + state.scaffoldKey = GlobalKey(debugLabel: 'allStreamLinkPage'); + state.mediaType = args['type'] ?? MediaType.movie; + state.orderBy = 'updateTime'; + state.desc = true; + state.loading = false; + state.sortTypes = [ + SortCondition( + isSelected: true, name: 'UpdateTime Desc', value: ['updateTime', true]), + SortCondition( + isSelected: false, + name: 'UpdateTime Asc', + value: ['updateTime', false]), + SortCondition(isSelected: false, name: 'Name Desc', value: ['name', true]), + SortCondition(isSelected: false, name: 'Name Asc', value: ['name', false]), + ]; + return state; +} diff --git a/lib/views/stream_link/allstreamlink_page/view.dart b/lib/views/stream_link/allstreamlink_page/view.dart new file mode 100644 index 00000000..3b90c978 --- /dev/null +++ b/lib/views/stream_link/allstreamlink_page/view.dart @@ -0,0 +1,217 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + AllStreamLinkPageState state, Dispatch dispatch, ViewService viewService) { + return Builder(builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Scaffold( + key: state.scaffoldKey, + appBar: AppBar( + elevation: 0.0, + brightness: _theme.brightness, + backgroundColor: _theme.backgroundColor, + iconTheme: _theme.iconTheme, + title: Text( + '${state.mediaType == MediaType.movie ? 'Movie' : 'TvShows'} Share', + style: _theme.textTheme.bodyText1, + ), + actions: [ + IconButton( + icon: AnimatedIcon( + icon: AnimatedIcons.menu_close, + progress: state.animationController, + ), + onPressed: () { + if (state.animationController.value == 0) + state.animationController.forward(); + else + state.animationController.reverse(); + }, + ) + ], + ), + body: CustomScrollView( + controller: state.scrollController, + slivers: [ + _Menu( + animationController: state.animationController, + sortTypes: state.sortTypes, + sortChanged: (e) => + dispatch(AllStreamLinkPageActionCreator.sortChanged(e)), + submit: (s) => dispatch(AllStreamLinkPageActionCreator.search(s)), + ), + //_buildGridView() + + _GridView( + dispatch: dispatch, + list: state.mediaType == MediaType.movie + ? state.movieList?.data + : state.tvList?.data, + ), + ], + ), + ); + }); +} + +class _Menu extends StatelessWidget { + final AnimationController animationController; + final List> sortTypes; + final Function(String) submit; + final Function(SortCondition) sortChanged; + const _Menu( + {this.animationController, + this.submit, + this.sortChanged, + this.sortTypes}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: AnimatedBuilder( + animation: animationController, + builder: (_, __) { + return Container( + color: _theme.backgroundColor, + height: Tween(begin: 0.0, end: Adapt.px(130)) + .animate(CurvedAnimation( + parent: animationController, + curve: Curves.ease, + )) + .value, + child: Opacity( + opacity: animationController.value, + child: Row( + children: [ + Container( + width: Adapt.screenW() - Adapt.px(160), + margin: EdgeInsets.all(Adapt.px(25)), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(35))), + child: TextField( + onSubmitted: (s) => submit(s), + cursorColor: Colors.grey, + decoration: InputDecoration( + fillColor: Colors.black, + hintStyle: TextStyle(fontSize: Adapt.px(35)), + labelStyle: TextStyle(fontSize: Adapt.px(35)), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: Colors.transparent, width: 0)), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: Colors.transparent, width: 0)), + hintText: 'Search', + ), + ), + ), + PopupMenuButton( + padding: EdgeInsets.zero, + offset: Offset(0, Adapt.px(100)), + icon: Icon(Icons.sort), + onSelected: (selected) => sortChanged(selected), + itemBuilder: (ctx) { + return sortTypes.map((s) { + var unSelectedStyle = TextStyle(color: Colors.grey); + var selectedStyle = + TextStyle(fontWeight: FontWeight.bold); + return PopupMenuItem( + value: s, + child: Row( + children: [ + Text( + s.name, + style: s.isSelected + ? selectedStyle + : unSelectedStyle, + ), + Expanded( + child: Container(), + ), + s.isSelected ? Icon(Icons.check) : SizedBox() + ], + ), + ); + }).toList(); + }, + ) + ], + ), + ), + ); + }, + ), + ); + } +} + +class _GridCell extends StatelessWidget { + final dynamic data; + final Function(dynamic) onTap; + const _GridCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(data), + child: Container( + key: ValueKey(data), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + image: DecorationImage( + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.photourl, ImageSize.w300), + ), + ), + ), + ), + ); + } +} + +class _GridView extends StatelessWidget { + final dynamic list; + final Dispatch dispatch; + const _GridView({this.dispatch, this.list}); + @override + Widget build(BuildContext context) { + return list == null + ? SliverToBoxAdapter( + child: Container( + height: Adapt.px(400), + child: Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Color(0xFF505050)), + ), + ), + ), + ) + : SliverGrid.count( + crossAxisCount: 3, + childAspectRatio: 2 / 3, + children: list + .map( + (d) => _GridCell( + data: d, + onTap: (e) => dispatch( + AllStreamLinkPageActionCreator.gridCellTapped( + e.id, e.photourl, e.name, e.photourl)), + ), + ) + .toList(), + ); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/action.dart b/lib/views/stream_link/episode_livestream_page/action.dart new file mode 100644 index 00000000..4811cb6c --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/action.dart @@ -0,0 +1,55 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_comment.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; +import 'package:movie/models/episode_model.dart'; + +enum EpisodeLiveStreamAction { + action, + episodeTapped, + setSelectedEpisode, + setComment, + setStreamLink, + selectedStreamLink, + setLike, + setLoading, + markWatched, +} + +class EpisodeLiveStreamActionCreator { + static Action episodeTapped(Episode episode) { + return Action(EpisodeLiveStreamAction.episodeTapped, payload: episode); + } + + static Action setSelectedEpisode(Episode episode, TvShowStreamLink link) { + return Action(EpisodeLiveStreamAction.setSelectedEpisode, + payload: [episode, link]); + } + + static Action setComment(TvShowComments comment) { + return Action(EpisodeLiveStreamAction.setComment, payload: comment); + } + + static Action setLike(int likeCount, bool userLiked) { + return Action(EpisodeLiveStreamAction.setLike, + payload: [likeCount, userLiked]); + } + + static Action setStreamLink( + TvShowStreamLinks streamLinks, TvShowStreamLink selectedLink) { + return Action(EpisodeLiveStreamAction.setStreamLink, + payload: [streamLinks, selectedLink]); + } + + static Action selectedStreamLink(TvShowStreamLink streamLink) { + return Action(EpisodeLiveStreamAction.selectedStreamLink, + payload: streamLink); + } + + static Action setLoading(bool loading) { + return Action(EpisodeLiveStreamAction.setLoading, payload: loading); + } + + static Action markWatched(Episode episode) { + return Action(EpisodeLiveStreamAction.markWatched, payload: episode); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/action.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/action.dart new file mode 100644 index 00000000..fd7c877c --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/action.dart @@ -0,0 +1,95 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; + +enum BottomPanelAction { + action, + commentTap, + useVideoSource, + setUseVideoSource, + streamInBrowser, + setStreamInBrowser, + seletedLink, + setLike, + likeTvShow, + setOption, + reportStreamLink, + requestStreamLink, + showStreamlinkFilter, + preferHostTap, + setPreferHost, + defaultLanguageTap, + setDefaultLanguage, +} + +class BottomPanelActionCreator { + static Action onAction() { + return const Action(BottomPanelAction.action); + } + + static Action useVideoSource(bool useVideoSourceApi) { + return Action(BottomPanelAction.useVideoSource, payload: useVideoSourceApi); + } + + static Action setUseVideoSource(bool useVideoSource) { + return Action(BottomPanelAction.setUseVideoSource, payload: useVideoSource); + } + + static Action streamInBrowser(bool streamInBrowser) { + return Action(BottomPanelAction.streamInBrowser, payload: streamInBrowser); + } + + static Action setStreamInBrowser(bool streamInBrowser) { + return Action(BottomPanelAction.setStreamInBrowser, + payload: streamInBrowser); + } + + static Action seletedLink(TvShowStreamLink link) { + return Action(BottomPanelAction.seletedLink, payload: link); + } + + static Action setLike(int likeCount, bool userLiked) { + return Action(BottomPanelAction.setLike, payload: [likeCount, userLiked]); + } + + static Action likeTvShow() { + return const Action(BottomPanelAction.likeTvShow); + } + + static Action commentTap() { + return const Action(BottomPanelAction.commentTap); + } + + static Action setOption(bool useVideoSourceApi, bool streamInBrowser, + String language, String host) { + return Action(BottomPanelAction.setOption, + payload: [useVideoSourceApi, streamInBrowser, language, host]); + } + + static Action reportStreamLink() { + return const Action(BottomPanelAction.reportStreamLink); + } + + static Action requestStreamLink() { + return const Action(BottomPanelAction.requestStreamLink); + } + + static Action showStreamLinkFilter() { + return const Action(BottomPanelAction.showStreamlinkFilter); + } + + static Action defaultLanguageTap(String code) { + return Action(BottomPanelAction.defaultLanguageTap, payload: code); + } + + static Action setDefaultLanguage(String code) { + return Action(BottomPanelAction.setDefaultLanguage, payload: code); + } + + static Action preferHostTap(String host) { + return Action(BottomPanelAction.preferHostTap, payload: host); + } + + static Action setPreferHost(String host) { + return Action(BottomPanelAction.setPreferHost, payload: host); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/component.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/component.dart new file mode 100644 index 00000000..ae6cedaf --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/component.dart @@ -0,0 +1,36 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/comment_component/component.dart'; +import 'components/comment_component/state.dart'; +import 'components/streamlink_filter_component/component.dart'; +import 'components/streamlink_filter_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class BottomPanelComponent extends Component { + BottomPanelComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + clearOnDependenciesChanged: true, + shouldUpdate: (o, n) { + return o.commentCount != n.commentCount || + o.likeCount != n.likeCount || + o.streamLinks != n.streamLinks || + o.selectedLink != n.selectedLink || + o.useVideoSourceApi != n.useVideoSourceApi || + o.streamInBrowser != n.streamInBrowser || + o.userLiked != n.userLiked; + }, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'comments': CommentConnector() + CommentComponent(), + 'streamLinkFilter': + StreamLinkFilterConnector() + StreamLinkFilterComponent(), + }), + ); +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/arrow_clipper.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/arrow_clipper.dart new file mode 100644 index 00000000..ed735684 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/arrow_clipper.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class ArrowClipper extends CustomClipper { + @override + Path getClip(Size size) { + Path path = Path(); + path.moveTo(0, 0); + path.lineTo(size.width, 0); + path.lineTo(size.width / 2, size.height / 2); + return path; + } + + @override + bool shouldReclip(CustomClipper oldClipper) { + return true; + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/action.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/action.dart new file mode 100644 index 00000000..bf194ad8 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/action.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_comment.dart'; + +enum CommentAction { + action, + loadMore, + addComment, + insertComment, +} + +class CommentActionCreator { + static Action onAction() { + return const Action(CommentAction.action); + } + + static Action loadMore(TvShowComments comments) { + return Action(CommentAction.loadMore, payload: comments); + } + + static Action addComment(String comment) { + return Action(CommentAction.addComment, payload: comment); + } + + static Action insertComment(TvShowComment comment) { + return Action(CommentAction.insertComment, payload: comment); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/component.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/component.dart new file mode 100644 index 00000000..d29989bf --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CommentComponent extends Component { + CommentComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + clearOnDependenciesChanged: true, + shouldUpdate: (oldState, newState) { + return oldState.comments != newState.comments || + oldState.comments?.totalCount != newState.comments?.totalCount; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart new file mode 100644 index 00000000..1a4e8e91 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart @@ -0,0 +1,82 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/base_user.dart'; +import 'package:movie/models/base_api_model/tvshow_comment.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CommentAction.action: _onAction, + CommentAction.addComment: _addComment, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) { + ctx.state.scrollController = ScrollController() + ..addListener(() { + if (ctx.state.scrollController.position.pixels == + ctx.state.scrollController.position.maxScrollExtent) { + _loadMore(action, ctx); + } + }); + ctx.state.isBusy = false; +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController?.dispose(); +} + +void _addComment(Action action, Context ctx) async { + final String _commentTxt = action.payload; + final _user = GlobalStore.store.getState().user; + if (_user == null) { + Toast.show('login before comment', ctx.context, duration: 2); + return; + } + if (_commentTxt != '' && _commentTxt != null) { + final String _date = DateTime.now().toString(); + + final _baseApi = BaseApi.instance; + final TvShowComment _comment = TvShowComment.fromParams( + mediaId: ctx.state.tvId, + comment: _commentTxt, + uid: _user.firebaseUser.uid, + updateTime: _date, + createTime: _date, + season: ctx.state.season, + episode: ctx.state.episode, + u: BaseUser.fromParams( + uid: _user.firebaseUser.uid, + userName: _user.firebaseUser.displayName, + photoUrl: _user.firebaseUser.photoUrl), + like: 0); + ctx.dispatch(CommentActionCreator.insertComment(_comment)); + _baseApi.createTvShowComment(_comment).then((r) { + if (r.success) _comment.id = r.result.id; + }); + } +} + +void _loadMore(Action action, Context ctx) async { + if (!ctx.state.isBusy) { + ctx.state.isBusy = true; + final _baseApi = BaseApi.instance; + final _comment = await _baseApi.getTvShowComments( + ctx.state.tvId, ctx.state.season, ctx.state.episode, + page: ctx.state.comments.page + 1); + if (_comment.success) { + if (_comment.result.data.length > 0) + ctx.dispatch(CommentActionCreator.loadMore(_comment.result)); + } + + ctx.state.isBusy = false; + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart new file mode 100644 index 00000000..20aa7e3e --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart @@ -0,0 +1,44 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_comment.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CommentAction.action: _onAction, + CommentAction.insertComment: _insertComment, + CommentAction.loadMore: _loadMore, + }, + ); +} + +CommentState _onAction(CommentState state, Action action) { + final CommentState newState = state.clone(); + return newState; +} + +CommentState _insertComment(CommentState state, Action action) { + final TvShowComment _comment = action.payload; + final CommentState newState = state.clone(); + if (_comment != null) { + newState.comments.data.insert(0, _comment); + newState.comments.totalCount++; + } + return newState; +} + +CommentState _loadMore(CommentState state, Action action) { + final TvShowComments _comments = action.payload; + final CommentState newState = state.clone(); + if (_comments != null) { + final _newComments = TvShowComments.fromParams( + data: state.comments.data, + page: _comments.page, + totalCount: _comments.totalCount); + _newComments.data.addAll(_comments.data); + newState.comments = _newComments; + } + return newState; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/state.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/state.dart new file mode 100644 index 00000000..3a997516 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/state.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/tvshow_comment.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart'; + +class CommentState implements Cloneable { + TvShowComments comments; + ScrollController scrollController; + bool isBusy; + int tvId; + int episode; + int season; + + @override + CommentState clone() { + return CommentState() + ..comments = comments + ..season = season + ..episode = episode + ..tvId = tvId + ..isBusy = isBusy + ..scrollController = scrollController; + } +} + +class CommentConnector extends ConnOp { + @override + CommentState get(BottomPanelState state) { + CommentState mstate = state.commentState; + mstate.tvId = state.tvId; + mstate.season = state.season; + mstate.episode = state.selectEpisode; + return mstate; + } + + @override + void set(BottomPanelState state, CommentState subState) { + state.commentState = subState; + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/view.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/view.dart new file mode 100644 index 00000000..47a82b80 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/view.dart @@ -0,0 +1,266 @@ +import 'dart:ui' as ui; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/tvshow_comment.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CommentState state, Dispatch dispatch, ViewService viewService) { + final _height = Adapt.screenH() * 0.7; + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: const Color(0x00000000), + body: Container( + height: Adapt.screenH(), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: + BorderRadius.vertical(top: Radius.circular(Adapt.px(30))), + ), + child: Stack(children: [ + _CommentPanel( + height: _height, + comments: state.comments, + scrollController: state.scrollController, + ), + _CommentInputCell( + pageHeight: Adapt.screenH() * 0.3, + submit: (s) { + dispatch(CommentActionCreator.addComment(s)); + }, + scrollController: state.scrollController, + ), + ]), + ), + ); + }, + ); +} + +class _CommentCell extends StatelessWidget { + final TvShowComment comment; + const _CommentCell({this.comment}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + var date = DateTime.parse(comment.updateTime ?? '1970-07-10'); + final String _timeline = TimelineUtil.format( + date.millisecondsSinceEpoch, + locTimeMs: DateTime.now().millisecondsSinceEpoch, + locale: ui.window.locale.languageCode, + ); + return Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _theme.primaryColorDark, + image: comment.u.photoUrl != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(comment.u.photoUrl), + ) + : null, + ), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: Adapt.screenW() - Adapt.px(190), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + comment?.u?.userName ?? '', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: Adapt.px(28), + ), + ), + Spacer(), + Text( + _timeline, + style: TextStyle( + fontSize: Adapt.px(18), + color: const Color(0xFF717171), + ), + ), + ], + ), + SizedBox(height: Adapt.px(20)), + Text(comment?.comment ?? ''), + SizedBox(height: Adapt.px(30)), + Divider() + ], + ), + ), + ], + ), + ); + } +} + +class _CommentPanel extends StatelessWidget { + final double height; + final ScrollController scrollController; + final TvShowComments comments; + const _CommentPanel({this.comments, this.height, this.scrollController}); + @override + Widget build(BuildContext context) { + return Container( + height: height, + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), + vertical: Adapt.px(40), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Comments', + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold, + ), + ), + InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: Icon(Icons.keyboard_arrow_down), + ), + ], + )), + SizedBox(height: Adapt.px(40)), + Expanded( + child: ListView.separated( + controller: scrollController, + padding: EdgeInsets.only(bottom: Adapt.px(110)), + separatorBuilder: (_, __) => SizedBox(height: Adapt.px(30)), + itemCount: comments?.data?.length ?? 0, + itemBuilder: (context, index) { + final _d = comments.data[index]; + return _CommentCell(comment: _d); + }, + ), + ), + ], + ), + ); + } +} + +class _CommentInputCell extends StatefulWidget { + final double pageHeight; + final Function(String) submit; + final ScrollController scrollController; + const _CommentInputCell( + {this.pageHeight, this.submit, this.scrollController}); + @override + _CommentInputState createState() => _CommentInputState(); +} + +class _CommentInputState extends State<_CommentInputCell> { + bool _show = true; + TextEditingController _controller; + @override + void initState() { + super.initState(); + _controller = TextEditingController(); + if (widget.scrollController != null) + widget.scrollController?.position?.isScrollingNotifier + ?.addListener(_scrollListener); + } + + @override + void dispose() { + widget.scrollController?.removeListener(_scrollListener); + _controller?.dispose(); + super.dispose(); + } + + void _scrollListener() { + final _f = !widget.scrollController.position.isScrollingNotifier.value; + if (_f != _show) + setState(() { + _show = _f; + }); + } + + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Positioned( + bottom: 0, + left: 0, + right: 0, + child: Transform.translate( + offset: Offset(0, -widget.pageHeight), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 300), + transitionBuilder: (widget, animation) { + return SlideTransition( + position: + animation.drive(Tween(begin: Offset(0, 1), end: Offset.zero)), + child: widget, + ); + }, + child: _show + ? Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + border: Border( + top: BorderSide(color: _theme.primaryColorDark))), + child: SafeArea( + top: false, + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.symmetric(horizontal: 20), + margin: + EdgeInsets.symmetric(vertical: 15, horizontal: 10), + height: 40, + decoration: BoxDecoration( + color: _theme.primaryColorLight, + borderRadius: BorderRadius.circular(20)), + child: TextField( + onSubmitted: (s) { + widget.submit(s); + _controller.clear(); + }, + cursorColor: Colors.grey, + controller: _controller, + decoration: InputDecoration( + hintStyle: TextStyle(fontSize: 16), + labelStyle: TextStyle(fontSize: 16), + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + hintText: 'Add a comment', + ), + ), + ), + ), + ) + : SizedBox(), + ), + ), + ); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/download_menu.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/download_menu.dart new file mode 100644 index 00000000..80a433c9 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/download_menu.dart @@ -0,0 +1,440 @@ +import 'dart:io'; +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/stream_link_convert/stream_link_convert_factory.dart'; +import 'package:movie/models/download_queue.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:toast/toast.dart'; + +class DownloadMenu extends StatelessWidget { + final String tvName; + final List links; + final Function(TvShowStreamLink) playVideo; + const DownloadMenu({this.links, this.tvName, this.playVideo}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 220; + final double _arrowSize = 20.0; + return Positioned( + bottom: 80, + left: Adapt.px(375) - _width / 2, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Align( + alignment: Alignment.bottomCenter, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + padding: EdgeInsets.all(20), + height: 250, + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column(children: [ + Expanded( + child: _DownLoadTaskList( + tvName: tvName, + onPlayVideo: playVideo, + list: links + .where((e) => + e.streamLinkType.name == 'WebView' || + e.streamLinkType.name == 'other') + .toList(), + ), + ), + ]), + ), + ), + ], + ), + ), + ); + } +} + +class _DownLoadTaskList extends StatefulWidget { + final String tvName; + final Function(TvShowStreamLink) onPlayVideo; + final List list; + const _DownLoadTaskList({Key key, this.list, this.tvName, this.onPlayVideo}) + : super(key: key); + @override + _DownLoadTaskListState createState() => _DownLoadTaskListState(); +} + +class _DownLoadTaskListState extends State<_DownLoadTaskList> { + ReceivePort _port = ReceivePort(); + List _queue; + List _downloadTasks; + @override + void initState() { + super.initState(); + updateTasks(); + + IsolateNameServer.registerPortWithName( + _port.sendPort, 'downloader_send_port'); + _port.listen((dynamic data) { + String _id = data[0]; + DownloadTaskStatus _status = data[1]; + int _progress = data[2]; + final _task = _queue?.singleWhere( + (e) => e.taskId == _id, + orElse: () => null, + ); + if (_task != null) { + _task.progress = _progress < 0 ? 0 : _progress; + _task.status = _status; + setState(() {}); + } + }); + } + + Future updateTasks() async { + _downloadTasks = await FlutterDownloader.loadTasks(); + _queue = List(); + if (_queue != null) + _downloadTasks?.forEach((e) { + //FlutterDownloader.remove(taskId: e.taskId); + _queue.add(DownloadQueue( + taskId: e.taskId, + url: e.url, + filename: e.filename, + progress: e.progress, + status: e.status, + savedDir: e.savedDir, + timeCreated: e.timeCreated)); + }); + _queue.sort((a, b) => b.timeCreated.compareTo(a.timeCreated)); + setState(() {}); + } + + Future _createTask(TvShowStreamLink link) async { + try { + final _taskName = + '${widget.tvName}_S${link.season}E${link.episode}_${link.sid}'; + final _localPath = + (await _findLocalPath()) + Platform.pathSeparator + 'Download'; + final _savedDir = Directory(_localPath); + bool hasExisted = await _savedDir.exists(); + if (!hasExisted) { + _savedDir.create(); + } + String _downloadAddress; + if (link.streamLinkType.name == 'WebView') { + _downloadAddress = + await StreamLinkConvertFactory.instance.getLink(link.streamLink); + print(_downloadAddress); + } else + _downloadAddress = link.streamLink; + if (_downloadAddress == null) + return Toast.show('Invalid download address', context); + final _taskId = await FlutterDownloader.enqueue( + url: _downloadAddress, + fileName: _taskName + _getFileExtension(_downloadAddress), + savedDir: _localPath, + showNotification: true, + openFileFromNotification: true, + ); + print(_taskId); + await updateTasks(); + } on Exception catch (_) { + print(_); + } + } + + Future _retryTask(DownloadQueue queue) async { + await FlutterDownloader.retry(taskId: queue.taskId); + await updateTasks(); + return; + } + + void _playLoaclFile(TvShowStreamLink link) { + final _taskName = + '${widget.tvName}_S${link.season}E${link.episode}_${link.sid}'; + final _task = _queue?.firstWhere((e) => e.filename.contains(_taskName), + orElse: () => null); + if (_task == null) return; + TvShowStreamLink _link = TvShowStreamLink(link.toString()); + _link.streamLink = '${_task.savedDir}/${_task.filename}'; + _link.streamLinkType.id = 99; + _link.streamLinkType.name = 'localFile'; + _link.needAd = false; + _link.externalBrowser = false; + widget.onPlayVideo(_link); + } + + @override + void dispose() { + IsolateNameServer.removePortNameMapping('downloader_send_port'); + super.dispose(); + } + + Future _findLocalPath() async { + final directory = Platform.isAndroid + ? await getExternalStorageDirectory() + : await getApplicationDocumentsDirectory(); + return directory.path; + } + + String _getFileExtension(String address) { + List _fileExtensions = ['.mp4', '.m3u8', '.mkv', '.mov', '.webm']; + String _fileExtension; + for (var q in _fileExtensions) { + if (address.contains(q)) { + _fileExtension = q; + break; + } + } + return _fileExtension; + } + + @override + void didUpdateWidget(_DownLoadTaskList oldWidget) { + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.zero, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + separatorBuilder: (_, __) => SizedBox(height: 15), + itemCount: widget.list?.length ?? 0, + itemBuilder: (_, index) { + final _link = widget.list[index]; + + final _taskName = + '${widget.tvName}_S${_link.season}E${_link.episode}_${_link.sid}'; + final _task = _queue?.firstWhere((e) => e.filename.contains(_taskName), + orElse: () => null); + return _DownLoadCell( + link: _link, + queue: _task, + downloadTap: _createTask, + retryTap: _retryTask, + openFileTap: _playLoaclFile, + ); + }, + ); + } +} + +class _DownLoadCell extends StatelessWidget { + final TvShowStreamLink link; + final DownloadQueue queue; + final Function(TvShowStreamLink) downloadTap; + final Function(TvShowStreamLink) openFileTap; + final Function(DownloadQueue) retryTap; + const _DownLoadCell({ + this.link, + this.queue, + this.downloadTap, + this.openFileTap, + this.retryTap, + }); + @override + Widget build(BuildContext context) { + final Color _baseColor = const Color(0xFFFFFFFF); + final String _name = _getDomain(link.streamLink, link.streamLinkType.name); + return Container( + child: Row( + children: [ + Container( + constraints: BoxConstraints(maxWidth: 120), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _name, + maxLines: 1, + style: TextStyle( + color: _baseColor, + fontSize: 12, + ), + ), + SizedBox(height: 3), + Text( + link.language.name, + style: TextStyle( + fontSize: 10, + color: const Color(0xFF717171), + ), + ) + ], + )), + SizedBox(width: 8), + Container( + padding: EdgeInsets.all(3), + decoration: BoxDecoration( + border: Border.all(color: _baseColor), + borderRadius: BorderRadius.circular(5), + ), + child: Text( + link.quality.name, + style: TextStyle( + fontSize: 6, + color: _baseColor, + ), + ), + ), + Spacer(), + _DownloadIcon( + queue: queue, + onStart: () => downloadTap(link), + onRetry: () => retryTap(queue), + openFile: () => openFileTap(link), + ), + SizedBox(width: 5), + ], + ), + ); + } +} + +class _CircularProgressIndicator extends StatelessWidget { + final int value; + const _CircularProgressIndicator({this.value}); + @override + Widget build(BuildContext context) { + return Container( + width: 10, + height: 10, + child: CircularProgressIndicator( + strokeWidth: 2, + value: value != null ? value / 100 : null, + backgroundColor: const Color(0xFF717171), + valueColor: AlwaysStoppedAnimation(Color(0xFFFFFFFF)), + ), + ); + } +} + +class _DownloadIcon extends StatefulWidget { + final Function onStart; + final Function onRetry; + final Function openFile; + final DownloadQueue queue; + const _DownloadIcon({this.onRetry, this.onStart, this.openFile, this.queue}); + @override + _DownloadIconState createState() => _DownloadIconState(); +} + +class _DownloadIconState extends State<_DownloadIcon> { + final Color _baseColor = const Color(0xFFFFFFFF); + bool _hasTask = false; + bool _loading = false; + @override + void initState() { + super.initState(); + } + + @override + void didUpdateWidget(_DownloadIcon oldWidget) { + if (oldWidget.queue != widget.queue) { + setState(() { + _hasTask = widget.queue != null; + }); + } + super.didUpdateWidget(oldWidget); + } + + _setLoading(bool loading) { + setState(() { + _loading = loading; + }); + } + + _start() async { + if (_loading) return; + _setLoading(true); + await widget.onStart(); + _setLoading(false); + } + + _retry() async { + if (_loading) return; + _setLoading(true); + await widget.onRetry(); + _setLoading(false); + } + + @override + Widget build(BuildContext context) { + if (_loading) return _CircularProgressIndicator(); + if (_hasTask) + switch (widget.queue.status.value) { + //runing + //enqueued + case 2: + case 1: + return _CircularProgressIndicator( + value: widget.queue.progress, + ); + //complete + case 3: + return GestureDetector( + onTap: widget.openFile, + child: Icon( + Icons.play_arrow, + size: 12, + color: _baseColor, + ), + ); + case 4: + return GestureDetector( + onTap: _retry, + child: Icon( + Icons.refresh, + size: 12, + color: _baseColor, + ), + ); + } + return GestureDetector( + onTap: _start, + child: Icon( + Icons.download_sharp, + size: 12, + color: _baseColor, + ), + ); + } +} + +_getDomain(String url, String type) { + if (type.toLowerCase() == 'youtube') return 'youtube'; + if (type.toLowerCase() == 'torrent') return 'torrent'; + final _strArray = url.split('/'); + if (_strArray.length > 3) return _strArray[2]; + return url; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/option_menu.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/option_menu.dart new file mode 100644 index 00000000..cfc2f5cd --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/option_menu.dart @@ -0,0 +1,243 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/host_dialog.dart'; +import 'package:movie/widgets/language_dialog.dart'; + +import 'arrow_clipper.dart'; + +class OptionMenu extends StatelessWidget { + final bool useVideoSourceApi; + final bool streamInBrowser; + final String languageCode; + final String host; + final Function closeMenu; + final Function(bool) onUseApiTap; + final Function(bool) onStreamInBrowserTap; + final Function(String) onLanguageSelected; + final Function(String) onHostSelected; + final Function reportTap; + final Function streamLinkRequestTap; + const OptionMenu({ + this.useVideoSourceApi = false, + this.streamInBrowser = false, + this.languageCode, + this.host, + this.closeMenu, + this.onHostSelected, + this.onLanguageSelected, + this.onUseApiTap, + this.onStreamInBrowserTap, + this.reportTap, + this.streamLinkRequestTap, + }); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 260; + final double _arrowSize = 20.0; + return Positioned( + bottom: 80, + right: Adapt.px(40), + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.only(right: Adapt.px(75)), + alignment: Alignment.bottomRight, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column(children: [ + _OptionItem( + onTap: () { + closeMenu(); + showDialog( + context: context, + builder: (_) => HostDialog( + onSelected: onHostSelected, + selectedHost: host, + ), + ); + }, + icon: Icons.web, + title: 'Prefer Host', + ), + _OptionItem( + onTap: () { + closeMenu(); + showDialog( + context: context, + builder: (_) => LanguageDialog( + onTap: onLanguageSelected, + selected: languageCode, + ), + ); + }, + icon: Icons.language, + title: 'Default Language', + ), + _OptionCheckItem( + icon: Icons.settings_applications, + title: 'VideoSource Api', + selected: useVideoSourceApi, + onTap: onUseApiTap, + ), + _OptionCheckItem( + icon: Icons.open_in_browser, + title: 'Stream in browser', + selected: streamInBrowser, + onTap: onStreamInBrowserTap, + ), + _OptionItem( + onTap: streamLinkRequestTap, + icon: Icons.link, + title: 'Request StreamLink', + ), + _OptionItem( + icon: Icons.flag, + title: 'Report', + onTap: reportTap, + ), + ]), + ), + ), + ], + ), + ), + ); + } +} + +class _OptionItem extends StatelessWidget { + final String title; + final IconData icon; + final Function onTap; + const _OptionItem({@required this.title, @required this.icon, this.onTap}); + @override + Widget build(BuildContext context) { + final Color _baseColor = const Color(0xFFFFFFFF); + return InkWell( + onTap: onTap, + child: SizedBox( + height: 50, + child: Row( + children: [ + Icon( + icon, + color: _baseColor, + size: 16, + ), + SizedBox(width: 20), + Text( + title, + style: TextStyle(color: _baseColor, fontSize: 16), + ), + ], + ), + ), + ); + } +} + +class _OptionCheckItem extends StatefulWidget { + final String title; + final IconData icon; + final bool selected; + final Function(bool) onTap; + const _OptionCheckItem( + {@required this.title, + @required this.icon, + this.selected = false, + this.onTap}); + @override + _OptionCheckItemState createState() => _OptionCheckItemState(); +} + +class _OptionCheckItemState extends State<_OptionCheckItem> { + final Color _baseColor = const Color(0xFFFFFFFF); + bool _selected = false; + @override + void initState() { + _selected = widget.selected; + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + _changed() { + _selected = !_selected; + setState(() {}); + if (widget.onTap != null) widget.onTap(_selected); + } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: _changed, + child: SizedBox( + height: 50, + child: Row( + children: [ + Icon( + widget.icon, + color: _baseColor, + size: 16, + ), + const SizedBox(width: 20), + Text( + widget.title, + style: TextStyle(color: _baseColor, fontSize: 16), + ), + const Spacer(), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(3.0), + border: Border.all(color: _baseColor)), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: _selected + ? Icon( + Icons.check, + size: 10.0, + color: _baseColor, + ) + : SizedBox( + width: 10, + height: 10, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart new file mode 100644 index 00000000..167abfd0 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart @@ -0,0 +1,67 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/models.dart'; + +enum StreamLinkFilterAction { + action, + selectedLinkTap, + setSelectedLink, + hostTap, + languageTap, + qualityTap, + setHost, + setLanguage, + setQuality, + setFilterList, + sortTap, + setSort, +} + +class StreamLinkFilterActionCreator { + static Action onAction() { + return const Action(StreamLinkFilterAction.action); + } + + static Action streamlinkTap(TvShowStreamLink link) { + return Action(StreamLinkFilterAction.selectedLinkTap, payload: link); + } + + static Action setSelectedLink(TvShowStreamLink link) { + return Action(StreamLinkFilterAction.setSelectedLink, payload: link); + } + + static Action hostTap(String host) { + return Action(StreamLinkFilterAction.hostTap, payload: host); + } + + static Action languageTap(String language) { + return Action(StreamLinkFilterAction.languageTap, payload: language); + } + + static Action qualityTap(String quality) { + return Action(StreamLinkFilterAction.qualityTap, payload: quality); + } + + static Action setHost(String host) { + return Action(StreamLinkFilterAction.setHost, payload: host); + } + + static Action setLanguage(String language) { + return Action(StreamLinkFilterAction.setLanguage, payload: language); + } + + static Action setQuality(String quality) { + return Action(StreamLinkFilterAction.setQuality, payload: quality); + } + + static Action setFilterList(List list) { + return Action(StreamLinkFilterAction.setFilterList, payload: list); + } + + static Action sortTap(String sort, bool asc) { + return Action(StreamLinkFilterAction.sortTap, payload: [sort, asc]); + } + + static Action setSort(String sort, bool asc) { + return Action(StreamLinkFilterAction.setSort, payload: [sort, asc]); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart new file mode 100644 index 00000000..d4ea0167 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class StreamLinkFilterComponent extends Component { + StreamLinkFilterComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + clearOnDependenciesChanged: true, + shouldUpdate: (o, n) { + return o.sortAsc != n.sortAsc || + o.sort != n.sort || + o.selectHost != n.selectHost || + o.selectLanguage != n.selectLanguage || + o.selectQuality != n.selectQuality || + o.streamLinks != n.streamLinks || + o.filterLinks != n.filterLinks || + o.selectedLink != n.selectedLink; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}), + ); +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart new file mode 100644 index 00000000..9a07a56e --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart @@ -0,0 +1,260 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/app_language.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; + +class FilterMenu extends StatefulWidget { + final String selectedHost; + final String selectedLanguage; + final String selectedQuality; + final Function(String) hostTap; + final Function(String) languageTap; + final Function(String) qualityTap; + const FilterMenu({ + this.selectedHost, + this.selectedQuality, + this.selectedLanguage, + this.hostTap, + this.languageTap, + this.qualityTap, + }); + @override + _FilterMenuState createState() => _FilterMenuState(); +} + +class _FilterMenuState extends State { + String _selectedHost; + String _selectedLanguage; + String _selectedQuality; + @override + void initState() { + _selectedHost = widget.selectedHost; + _selectedLanguage = widget.selectedLanguage; + _selectedQuality = widget.selectedQuality; + super.initState(); + } + + _hostTap(String host) { + String _value; + if (_selectedHost != host) _value = host; + setState(() { + _selectedHost = _value; + }); + widget.hostTap(_value); + } + + _languageTap(String language) { + String _value; + if (_selectedLanguage != language) _value = language; + setState(() { + _selectedLanguage = _value; + }); + widget.languageTap(_value); + } + + _qualityTap(String quality) { + String _value; + if (_selectedQuality != quality) _value = quality; + setState(() { + _selectedQuality = _value; + }); + widget.qualityTap(_value); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = Adapt.screenW() - 40; + final double _arrowSize = 15.0; + final Color _fontColor = const Color(0xFFFFFFFF); + return Positioned( + top: Adapt.px(120) + 25, + right: 20, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Container( + padding: EdgeInsets.only(right: 56), + alignment: Alignment.bottomRight, + child: ClipPath( + clipper: ArrowClipper(mode: 'up'), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: _arrowSize / 2 - 1), + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Hosts', + style: TextStyle(color: _fontColor), + ), + SizedBox(height: 10), + _HostOption( + onTap: _hostTap, + selectedHost: _selectedHost, + ), + SizedBox(height: 20), + Text( + 'Languages', + style: TextStyle(color: _fontColor), + ), + SizedBox(height: 10), + _LanguageOption( + onTap: _languageTap, + selectedLanguage: _selectedLanguage, + ), + SizedBox(height: 20), + Text( + 'Quality', + style: TextStyle(color: _fontColor), + ), + SizedBox(height: 10), + _QualityOption( + onTap: _qualityTap, selectedQuality: _selectedQuality), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _HostOption extends StatelessWidget { + final String selectedHost; + final Function(String) onTap; + const _HostOption({this.selectedHost, this.onTap}); + @override + Widget build(BuildContext context) { + final _hosts = [ + "streamtape", + "upstream", + "uptostream", + "dood", + "mediafire", + "cloudvideo", + "onlystream", + "clipwatching", + "vidfast", + "vidoza", + "vidlox", + "gounlimited", + "supervideo", + "bitporno", + ]; + return Wrap( + runSpacing: 8, + spacing: 8, + children: _hosts + .map( + (e) => _WrapCell( + title: e, + selected: e == selectedHost, + onTap: () => onTap(e), + ), + ) + .toList(), + ); + } +} + +class _LanguageOption extends StatelessWidget { + final String selectedLanguage; + final Function(String) onTap; + const _LanguageOption({this.selectedLanguage, this.onTap}); + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 8, + spacing: 8, + children: AppLanguage.instance.supportLanguages + .where((e) => e.name != 'System Default') + .map( + (e) => _WrapCell( + title: e.name, + selected: e.name == selectedLanguage, + onTap: () => onTap(e.name), + ), + ) + .toList(), + ); + } +} + +class _QualityOption extends StatelessWidget { + final String selectedQuality; + final Function(String) onTap; + const _QualityOption({this.selectedQuality, this.onTap}); + @override + Widget build(BuildContext context) { + final _hosts = [ + "4K", + "1080p", + "720p", + "480p", + "360p", + "240p", + ]; + return Wrap( + runSpacing: 8, + spacing: 8, + children: _hosts + .map( + (e) => _WrapCell( + title: e, + selected: e == selectedQuality, + onTap: () => onTap(e), + ), + ) + .toList(), + ); + } +} + +class _WrapCell extends StatelessWidget { + final String title; + final bool selected; + final Function onTap; + const _WrapCell({this.title, this.onTap, this.selected = false}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all( + color: const Color(0xFFFFFFFF), + ), + borderRadius: BorderRadius.circular(8), + color: selected ? const Color(0xFFFFFFFF) : null, + ), + child: Text( + title, + style: TextStyle( + fontSize: 12, + color: selected ? const Color(0xFF25272E) : const Color(0xFFFFFFFF), + ), + ), + ), + ); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart new file mode 100644 index 00000000..0e1e3857 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart @@ -0,0 +1,145 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; + +class SortMenu extends StatefulWidget { + final String sort; + final bool sortAsc; + final Function(String, bool) onSortTap; + const SortMenu({this.sort, this.sortAsc, this.onSortTap}); + @override + _SortMenuState createState() => _SortMenuState(); +} + +class _SortMenuState extends State { + final double _width = 150; + final double _arrowSize = 15.0; + final List _sortList = [ + "Domain", + "Language", + "Quality", + "UpdateTime" + ]; + String _sort; + bool _asc; + @override + void initState() { + _sort = widget.sort; + _asc = widget.sortAsc ?? true; + super.initState(); + } + + _onSortTap(String sort) { + if (_sort == sort) + _asc = !_asc; + else + _asc = true; + _sort = sort; + setState(() {}); + widget.onSortTap(sort, _asc); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + return Positioned( + top: Adapt.px(120) + 25, + left: 31, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Container( + padding: EdgeInsets.only(left: 15), + alignment: Alignment.bottomLeft, + child: ClipPath( + clipper: ArrowClipper(mode: 'up'), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: _arrowSize / 2 - 1), + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _sortList + .map( + (e) => _SortCell( + title: e, + selected: e == _sort, + asc: _asc, + onTap: _onSortTap, + ), + ) + .toList(), + ), + ), + ], + ), + ), + ); + } +} + +class _SortCell extends StatelessWidget { + final String title; + final bool asc; + final bool selected; + final Function(String) onTap; + const _SortCell({ + this.title, + this.asc = false, + this.onTap, + this.selected = false, + }); + @override + Widget build(BuildContext context) { + final Color _color = const Color(0xFFFFFFFF); + return GestureDetector( + onTap: () => onTap(title), + child: Container( + padding: EdgeInsets.all(5), + margin: EdgeInsets.only(bottom: 5), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all(color: selected ? _color : Colors.transparent), + ), + child: Row( + children: [ + Text( + title, + style: TextStyle( + color: _color, + fontSize: 12, + ), + ), + Spacer(), + selected + ? Icon( + asc + ? FontAwesomeIcons.sortAlphaDown + : FontAwesomeIcons.sortAlphaUp, + color: _color, + size: 12, + ) + : SizedBox(), + ], + ), + ), + ); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart new file mode 100644 index 00000000..c164955e --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart @@ -0,0 +1,91 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/models.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + StreamLinkFilterAction.action: _onAction, + StreamLinkFilterAction.selectedLinkTap: _selectedLinkTap, + StreamLinkFilterAction.hostTap: _hostTap, + StreamLinkFilterAction.languageTap: _languageTap, + StreamLinkFilterAction.qualityTap: _qualityTap, + StreamLinkFilterAction.sortTap: _sortTap, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _selectedLinkTap(Action action, Context ctx) { + final TvShowStreamLink _link = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setSelectedLink(_link)); + Navigator.of(ctx.context).pop(); +} + +void _hostTap(Action action, Context ctx) { + final String _host = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setHost(_host)); + _updateFilter(action, ctx); +} + +void _languageTap(Action action, Context ctx) { + final String _language = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setLanguage(_language)); + _updateFilter(action, ctx); +} + +void _qualityTap(Action action, Context ctx) { + final String _qualityTap = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setQuality(_qualityTap)); + _updateFilter(action, ctx); +} + +void _sortTap(Action action, Context ctx) { + final String _sort = action.payload[0]; + final bool _asc = action.payload[1] ?? true; + ctx.dispatch(StreamLinkFilterActionCreator.setSort(_sort, _asc)); + _updateFilter(action, ctx); +} + +void _updateFilter(Action action, Context ctx) { + List _list = ctx.state.streamLinks; + if (ctx.state.selectHost != null) + _list = _list + .where((e) => e.streamLink.contains(ctx.state.selectHost)) + .toList(); + if (ctx.state.selectLanguage != null) + _list = _list + .where((e) => e.language.name == ctx.state.selectLanguage) + .toList(); + if (ctx.state.selectQuality != null) + _list = + _list.where((e) => e.quality.name == ctx.state.selectQuality).toList(); + if (ctx.state.sort != null) { + final _sort = ctx.state.sort; + final _asc = ctx.state.sortAsc ?? true; + switch (_sort) { + case 'Domain': + _asc + ? _list.sort((a, b) => a.streamLink.compareTo(b.streamLink)) + : _list.sort((a, b) => b.streamLink.compareTo(a.streamLink)); + break; + case 'Language': + _asc + ? _list.sort((a, b) => a.language.name.compareTo(b.language.name)) + : _list.sort((a, b) => b.language.name.compareTo(a.language.name)); + break; + case 'Quality': + _asc + ? _list.sort((a, b) => a.quality.id.compareTo(b.quality.id)) + : _list.sort((a, b) => b.quality.id.compareTo(a.quality.id)); + break; + case 'UpdateTime': + _asc + ? _list.sort((a, b) => a.updateTime.compareTo(b.updateTime)) + : _list.sort((a, b) => b.updateTime.compareTo(a.updateTime)); + break; + } + } + ctx.dispatch(StreamLinkFilterActionCreator.setFilterList(_list)); +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart new file mode 100644 index 00000000..b585dfa8 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart @@ -0,0 +1,72 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/models.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + StreamLinkFilterAction.action: _onAction, + StreamLinkFilterAction.setSelectedLink: _setSelectedLink, + StreamLinkFilterAction.setHost: _setHost, + StreamLinkFilterAction.setLanguage: _setLanguage, + StreamLinkFilterAction.setQuality: _setQuality, + StreamLinkFilterAction.setFilterList: _setFilterList, + StreamLinkFilterAction.setSort: _setSort, + }, + ); +} + +StreamLinkFilterState _onAction(StreamLinkFilterState state, Action action) { + final StreamLinkFilterState newState = state.clone(); + return newState; +} + +StreamLinkFilterState _setSelectedLink( + StreamLinkFilterState state, Action action) { + final TvShowStreamLink _link = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.streamLinks.remove(_link); + newState.streamLinks.insert(0, _link); + newState.selectedLink = _link; + return newState; +} + +StreamLinkFilterState _setHost(StreamLinkFilterState state, Action action) { + final String _host = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.selectHost = _host; + return newState; +} + +StreamLinkFilterState _setLanguage(StreamLinkFilterState state, Action action) { + final String _language = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.selectLanguage = _language; + return newState; +} + +StreamLinkFilterState _setQuality(StreamLinkFilterState state, Action action) { + final String _quality = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.selectQuality = _quality; + return newState; +} + +StreamLinkFilterState _setFilterList( + StreamLinkFilterState state, Action action) { + final List _list = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.filterLinks = _list; + return newState; +} + +StreamLinkFilterState _setSort(StreamLinkFilterState state, Action action) { + final String _sort = action.payload[0]; + final bool _asc = action.payload[1]; + final StreamLinkFilterState newState = state.clone(); + newState.sort = _sort; + newState.sortAsc = _asc; + return newState; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart new file mode 100644 index 00000000..becbb532 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart @@ -0,0 +1,61 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +class StreamLinkFilterState implements Cloneable { + List streamLinks; + List filterLinks; + TvShowStreamLink selectedLink; + String selectHost; + String selectLanguage; + String selectQuality; + String sort; + bool sortAsc; + GlobalKey overlayStateKey; + StreamLinkFilterState({this.overlayStateKey}); + @override + StreamLinkFilterState clone() { + return StreamLinkFilterState() + ..streamLinks = streamLinks + ..filterLinks = filterLinks + ..selectedLink = selectedLink + ..overlayStateKey = overlayStateKey + ..selectHost = selectHost + ..selectLanguage = selectLanguage + ..selectQuality = selectQuality + ..sort = sort + ..sortAsc = sortAsc; + } +} + +class StreamLinkFilterConnector + extends ConnOp { + @override + StreamLinkFilterState get(BottomPanelState state) { + StreamLinkFilterState mstate = StreamLinkFilterState(); + mstate.streamLinks = state.streamLinks?.list + ?.where((e) => e.episode == state.selectEpisode) + ?.toList(); + mstate.selectedLink = state.selectedLink; + mstate.overlayStateKey = state.streamLinkFilterState.overlayStateKey; + mstate.selectHost = state.streamLinkFilterState.selectHost; + mstate.selectLanguage = state.streamLinkFilterState.selectLanguage; + mstate.selectQuality = state.streamLinkFilterState.selectQuality; + mstate.sort = state.streamLinkFilterState.sort; + mstate.sortAsc = state.streamLinkFilterState.sortAsc; + mstate.filterLinks = state.streamLinkFilterState.filterLinks ?? + state.streamLinks?.list + ?.where((e) => e.episode == state.selectEpisode) + ?.toList(); + return mstate; + } + + @override + void set(BottomPanelState state, StreamLinkFilterState subState) { + state.selectedLink = subState.selectedLink; + state.streamLinks.list = subState.streamLinks; + state.streamLinkFilterState = subState; + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart new file mode 100644 index 00000000..7b8ae0c7 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart @@ -0,0 +1,315 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; +import 'package:movie/widgets/sliverappbar_delegate.dart'; + +import 'action.dart'; +import 'components/filter_menu.dart'; +import 'state.dart'; + +Widget buildView( + StreamLinkFilterState state, Dispatch dispatch, ViewService viewService) { + void _closeMenu(OverlayEntry overlayEntry) { + overlayEntry?.remove(); + state.overlayStateKey.currentState.setOverlayEntry(null); + overlayEntry = null; + } + + void _openFilter() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + FilterMenu( + selectedHost: state.selectHost, + selectedLanguage: state.selectLanguage, + selectedQuality: state.selectQuality, + hostTap: (host) => + dispatch(StreamLinkFilterActionCreator.hostTap(host)), + languageTap: (language) => + dispatch(StreamLinkFilterActionCreator.languageTap(language)), + qualityTap: (quality) => + dispatch(StreamLinkFilterActionCreator.qualityTap(quality)), + ) + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + void _openSort() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + SortMenu( + sort: state.sort, + sortAsc: state.sortAsc, + onSortTap: (s, b) => + dispatch(StreamLinkFilterActionCreator.sortTap(s, b)), + ) + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.backgroundColor, + body: AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: SafeArea( + child: CustomScrollView( + slivers: [ + _FilterPanel( + openFilter: _openFilter, + openSort: _openSort, + overlayStateKey: state.overlayStateKey, + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) { + final _d = state.filterLinks[index]; + return _LinkCell( + link: _d, + onTap: (link) => dispatch( + StreamLinkFilterActionCreator.streamlinkTap(link)), + ); + }, + childCount: state.filterLinks?.length ?? 0, + ), + ), + SliverToBoxAdapter( + child: SizedBox(height: 20), + ), + ], + ), + ), + ), + ); + }, + ); +} + +class _LinkCell extends StatelessWidget { + final TvShowStreamLink link; + final Function(TvShowStreamLink) onTap; + const _LinkCell({this.link, this.onTap}); + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _domain = _getDomain(link.streamLink, link.streamLinkType.name); + final _date = DateFormat.yMMMd().format(DateTime.parse(link.updateTime)); + final _borderColor = _theme.brightness == Brightness.light + ? const Color(0xFF858585) + : const Color(0xFFE0E0E0); + return GestureDetector( + onTap: () => onTap(link), + child: Container( + margin: EdgeInsets.only(top: 15, left: 20, right: 20), + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _borderColor), + //color: _theme.primaryColorDark, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(children: [ + Text( + _domain, + style: TextStyle( + fontWeight: FontWeight.bold, + ), + ), + SizedBox(width: 15), + Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + color: const Color(0xFF252525), + borderRadius: BorderRadius.circular(5), + ), + child: Text( + link.quality.name, + style: TextStyle( + fontSize: 10, + color: const Color(0xFFFFFFFF), + ), + ), + ), + Spacer(), + Text( + _date, + style: TextStyle( + fontSize: 10, + color: const Color(0xFF717171), + ), + ), + ]), + Text( + link.language.name, + style: TextStyle( + fontSize: 12, + color: const Color(0xFF717171), + ), + ) + ], + ), + ), + ); + } +} + +class _FilterPanel extends StatelessWidget { + final Function openFilter; + final Function openSort; + final Key overlayStateKey; + const _FilterPanel({this.openFilter, this.openSort, this.overlayStateKey}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _borderColor = _theme.brightness == Brightness.light + ? const Color(0xFFDEDEDE) + : const Color(0xFF505050); + return SliverPersistentHeader( + floating: true, + delegate: SliverAppBarDelegate( + minHeight: Adapt.px(120), + maxHeight: Adapt.px(120), + child: Container( + color: _theme.backgroundColor, + child: OverlayEntryManage( + key: overlayStateKey, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + margin: EdgeInsets.fromLTRB(20, 15, 20, 5), + decoration: BoxDecoration( + //color: _theme.primaryColorLight, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: _borderColor, + ), + ), + height: Adapt.px(80), + child: Row( + children: [ + _FilterOption( + title: 'sort', + onTap: openSort, + ), + Spacer(), + GestureDetector( + onTap: openFilter, + child: Container( + width: 28, + height: 28, + decoration: BoxDecoration( + color: const Color(0xFF25272E), + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + FontAwesomeIcons.filter, + size: 10, + color: const Color(0xFFFFFFFF), + ), + ), + ), + SizedBox(width: 10), + GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Container( + width: 28, + height: 28, + decoration: BoxDecoration( + border: Border.all(color: _theme.iconTheme.color), + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.close, + size: 15, + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} + +class _FilterOption extends StatelessWidget { + final String title; + final Function onTap; + const _FilterOption({Key key, this.title, this.onTap}) + : assert(title != null), + super(key: key); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Container( + height: 35, + padding: EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(8)), + child: Row( + children: [ + Text(title), + SizedBox(width: 5), + Icon( + Icons.keyboard_arrow_down, + size: 15, + ), + ], + ), + ), + ); + } +} + +_getDomain(String url, String type) { + if (type.toLowerCase() == 'youtube') return 'youtube'; + if (type.toLowerCase() == 'torrent') return 'torrent'; + final _strArray = url.split('/'); + if (_strArray.length > 3) return _strArray[2]; + return url; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/video_source_menu.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/video_source_menu.dart new file mode 100644 index 00000000..5c319333 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/video_source_menu.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'arrow_clipper.dart'; + +class VideoSourceMenu extends StatelessWidget { + final List links; + final int selectedLinkId; + final Function(TvShowStreamLink) onTap; + final Function streamLinkRequestTap; + final Function moreTap; + const VideoSourceMenu( + {this.links, + this.onTap, + this.selectedLinkId, + this.streamLinkRequestTap, + this.moreTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 180; + final double _arrowSize = 20.0; + final double _menuHeight = 210.0; + return Positioned( + bottom: 80, + left: Adapt.px(275) - _width / 2, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Align( + alignment: Alignment.bottomCenter, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + height: _menuHeight, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 15), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: links.length > 0 + ? _LinkSourcePanel( + links: links, + selectedLink: selectedLinkId, + onTap: onTap, + moreTap: moreTap, + ) + : Center( + child: SizedBox( + width: 120, + child: FlatButton( + onPressed: streamLinkRequestTap, + child: Text( + 'request stream link', + textAlign: TextAlign.center, + style: TextStyle(color: const Color(0xFFFFFFFF)), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} + +class _LinkCell extends StatelessWidget { + final bool selected; + final TvShowStreamLink data; + final Function(TvShowStreamLink) onTap; + const _LinkCell({this.data, this.onTap, this.selected}); + @override + Widget build(BuildContext context) { + final _textStyle = + const TextStyle(color: const Color(0xFFFFFFFF), fontSize: 12); + final _subTextStyle = + const TextStyle(color: const Color(0xFFD0D0D0), fontSize: 10); + final _domain = _getDomain(data.streamLink, data.streamLinkType.name); + return InkWell( + onTap: () => onTap(data), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: selected + ? BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all(color: const Color(0xFFFFFFFF))) + : null, + height: 45, + child: Row( + children: [ + SizedBox( + width: 110, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _domain, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: _textStyle, + ), + SizedBox(height: 3), + Text( + data.language.name, + style: _subTextStyle, + ), + ], + ), + ), + Spacer(), + Text( + data.quality.name, + style: _subTextStyle, + ), + ], + ), + ), + ); + } +} + +class _LinkSourcePanel extends StatelessWidget { + final List links; + final int selectedLink; + final Function(TvShowStreamLink) onTap; + final Function moreTap; + const _LinkSourcePanel( + {this.links, this.selectedLink, this.onTap, this.moreTap}); + @override + Widget build(BuildContext context) { + return Column(crossAxisAlignment: CrossAxisAlignment.end, children: [ + Expanded( + child: ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.zero, + separatorBuilder: (_, __) => SizedBox(height: 5), + itemBuilder: (_, index) { + final _link = links[index]; + return _LinkCell( + data: _link, + selected: _link.sid == selectedLink, + onTap: onTap, + ); + }, + itemCount: links.length, + ), + ), + GestureDetector( + onTap: moreTap, + child: Container( + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all( + color: const Color(0xFFFFFFFF), + ), + ), + child: Text( + 'More', + style: TextStyle( + fontSize: 10, + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ]); + } +} + +_getDomain(String url, String type) { + if (type.toLowerCase() == 'youtube') return 'youtube'; + if (type.toLowerCase() == 'torrent') return 'torrent'; + final _strArray = url.split('/'); + if (_strArray.length > 3) return _strArray[2]; + return url; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/effect.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/effect.dart new file mode 100644 index 00000000..e4f7a4ae --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/effect.dart @@ -0,0 +1,179 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/widgets/stream_link_report_dialog.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + BottomPanelAction.action: _onAction, + Lifecycle.initState: _onInit, + BottomPanelAction.useVideoSource: _useVideoSource, + BottomPanelAction.streamInBrowser: _streamInBrowser, + BottomPanelAction.commentTap: _commentTap, + BottomPanelAction.likeTvShow: _likeTvShow, + BottomPanelAction.reportStreamLink: _reportStreamLink, + BottomPanelAction.requestStreamLink: _requestStreamLink, + BottomPanelAction.showStreamlinkFilter: _showStreamlinkFilter, + BottomPanelAction.preferHostTap: _preferHostTap, + BottomPanelAction.defaultLanguageTap: _defaultLanguageTap, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _useVideoSource(Action action, Context ctx) async { + final bool _b = action.payload; + final _pre = await SharedPreferences.getInstance(); + _pre.setBool('useVideoSourceApi', _b); + ctx.dispatch(BottomPanelActionCreator.setUseVideoSource(_b)); +} + +void _streamInBrowser(Action action, Context ctx) async { + final bool _b = action.payload; + final _pre = await SharedPreferences.getInstance(); + _pre.setBool('streamInBrowser', _b); + ctx.dispatch(BottomPanelActionCreator.setStreamInBrowser(_b)); +} + +Future _commentTap(Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + PageRouteBuilder( + barrierColor: const Color(0xAA000000), + fullscreenDialog: true, + barrierDismissible: true, + opaque: false, + pageBuilder: (context, animation, subAnimation) { + return SlideTransition( + position: Tween(begin: Offset(0, 1), end: Offset(0, 0.3)) + .animate( + CurvedAnimation(parent: animation, curve: Curves.ease)), + child: ctx.buildComponent('comments'), + ); + }), + ); +} + +void _onInit(Action action, Context ctx) async { + bool _useVideoSourceApi = true; + bool _streamInBrowser = false; + String _defaultVideoLanguage; + String _preferHost; + final _pre = await SharedPreferences.getInstance(); + if (_pre.containsKey('useVideoSourceApi')) + _useVideoSourceApi = _pre.getBool('useVideoSourceApi'); + if (_pre.containsKey('streamInBrowser')) + _streamInBrowser = _pre.getBool('streamInBrowser'); + if (_pre.containsKey('defaultVideoLanguage')) + _defaultVideoLanguage = _pre.getString('defaultVideoLanguage'); + if (_pre.containsKey('preferHost')) + _preferHost = _pre.getString('preferHost'); + ctx.dispatch(BottomPanelActionCreator.setOption(_useVideoSourceApi, + _streamInBrowser, _defaultVideoLanguage, _preferHost)); +} + +Future _likeTvShow(Action action, Context ctx) async { + final user = GlobalStore.store.getState().user; + int _likeCount = ctx.state.likeCount; + bool _userLike = ctx.state.userLiked; + if (user?.firebaseUser == null) return; + _userLike ? _likeCount-- : _likeCount++; + ctx.dispatch(BottomPanelActionCreator.setLike(_likeCount, !_userLike)); + final _likeModel = TvShowLikeModel.fromParams( + tvId: ctx.state.tvId, + season: ctx.state.season, + episode: ctx.state.selectEpisode, + id: 0, + uid: user.firebaseUser.uid); + + final _result = _userLike + ? await BaseApi.instance.unlikeTvShow(_likeModel) + : await BaseApi.instance.likeTvShow(_likeModel); + print(_result.result); +} + +void _reportStreamLink(Action action, Context ctx) { + final _name = ctx.state.selectedLink?.linkName ?? 'video api'; + showDialog( + context: ctx.context, + builder: (_) { + return StreamLinkReportDialog( + report: StreamLinkReport( + mediaId: ctx.state.tvId, + mediaName: _name, + linkName: _name, + streamLink: ctx.state.selectedLink?.streamLink ?? '', + type: "tv show", + streamLinkId: ctx.state.selectedLink?.sid ?? 0, + )); + }); +} + +void _requestStreamLink(Action action, Context ctx) async { + final _name = 'S${ctx.state.season}'; + final _topic = 'tvshow_${ctx.state.tvId}_$_name'; + final _firebaseMessaging = FirebaseMessaging(); + final _token = await _firebaseMessaging.getToken(); + //_firebaseMessaging.subscribeToTopic('tvshow_${ctx.state.tvId}_$_name'); + final _baseApi = BaseApi.instance; + _baseApi.sendRequestStreamLink(StreamLinkReport() + ..mediaId = ctx.state.tvId + ..mediaName = _name + ..type = 'tvshow' + ..season = ctx.state.season); + _baseApi.subscribeTpoic(TopicSubscription.fromParams( + topicId: _topic, + cloudMessagingToken: _token, + )); + Toast.show( + 'You will be notified when the stream link has been added', ctx.context, + duration: Toast.LENGTH_LONG); +} + +void _showStreamlinkFilter(Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + PageRouteBuilder( + transitionDuration: Duration(milliseconds: 300), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + final _curvedAnimation = + CurvedAnimation(parent: animation, curve: Curves.ease); + return SlideTransition( + position: Tween( + begin: Offset(0, 1), + end: Offset.zero, + ).animate(_curvedAnimation), + child: FadeTransition( + opacity: _curvedAnimation, + child: ctx.buildComponent('streamLinkFilter')), + ); + }, + ), + ); +} + +void _preferHostTap(Action action, Context ctx) async { + final String _host = action.payload; + final _pre = await SharedPreferences.getInstance(); + if (_host == null) + _pre.remove('preferHost'); + else + _pre.setString('preferHost', _host); + ctx.dispatch(BottomPanelActionCreator.setPreferHost(_host)); +} + +void _defaultLanguageTap(Action action, Context ctx) async { + final String _code = action.payload; + final _pre = await SharedPreferences.getInstance(); + if (_code == null) + _pre.remove('defaultVideoLanguage'); + else + _pre.setString('defaultVideoLanguage', _code); + ctx.dispatch(BottomPanelActionCreator.setDefaultLanguage(_code)); +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/reducer.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/reducer.dart new file mode 100644 index 00000000..f4b23d33 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/reducer.dart @@ -0,0 +1,66 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + BottomPanelAction.action: _onAction, + BottomPanelAction.setUseVideoSource: _setUseVideoSource, + BottomPanelAction.setStreamInBrowser: _setStreamInBrowser, + BottomPanelAction.seletedLink: _selectedLink, + BottomPanelAction.setOption: _setOption, + BottomPanelAction.setLike: _setLike, + }, + ); +} + +BottomPanelState _onAction(BottomPanelState state, Action action) { + final BottomPanelState newState = state.clone(); + return newState; +} + +BottomPanelState _setUseVideoSource(BottomPanelState state, Action action) { + final bool _b = action.payload; + final BottomPanelState newState = state.clone(); + newState.useVideoSourceApi = _b; + return newState; +} + +BottomPanelState _setStreamInBrowser(BottomPanelState state, Action action) { + final bool _b = action.payload; + final BottomPanelState newState = state.clone(); + newState.streamInBrowser = _b; + return newState; +} + +BottomPanelState _selectedLink(BottomPanelState state, Action action) { + final TvShowStreamLink _link = action.payload; + final BottomPanelState newState = state.clone(); + newState.selectedLink = _link; + return newState; +} + +BottomPanelState _setOption(BottomPanelState state, Action action) { + final bool _api = action.payload[0]; + final bool _streamInBrowser = action.payload[1]; + final String _language = action.payload[2]; + final String _host = action.payload[3]; + final BottomPanelState newState = state.clone(); + newState.useVideoSourceApi = _api; + newState.streamInBrowser = _streamInBrowser; + newState.defaultVideoLanguage = _language; + newState.preferHost = _host; + return newState; +} + +BottomPanelState _setLike(BottomPanelState state, Action action) { + final int _count = action.payload[0] ?? 0; + final bool _like = action.payload[1] ?? false; + final BottomPanelState newState = state.clone(); + newState.likeCount = _count; + newState.userLiked = _like; + return newState; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart new file mode 100644 index 00000000..cfb1d194 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart @@ -0,0 +1,69 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'components/comment_component/state.dart'; +import 'components/streamlink_filter_component/state.dart'; + +class BottomPanelState implements Cloneable { + TvShowStreamLinks streamLinks; + TvShowStreamLink selectedLink; + CommentState commentState; + StreamLinkFilterState streamLinkFilterState; + bool useVideoSourceApi; + bool streamInBrowser; + bool userLiked; + int likeCount; + int tvId; + int season; + int commentCount; + int selectEpisode; + String tvName; + String preferHost; + String defaultVideoLanguage; + GlobalKey overlayStateKey; + + @override + BottomPanelState clone() { + return BottomPanelState() + ..tvId = tvId + ..tvName = tvName + ..season = season + ..userLiked = userLiked + ..useVideoSourceApi = useVideoSourceApi + ..streamInBrowser = streamInBrowser + ..likeCount = likeCount + ..streamLinks = streamLinks + ..selectedLink = selectedLink + ..commentCount = commentCount + ..selectEpisode = selectEpisode + ..commentState = commentState + ..overlayStateKey = overlayStateKey + ..streamLinkFilterState = streamLinkFilterState + ..preferHost = preferHost + ..defaultVideoLanguage = defaultVideoLanguage; + } +} + +class BottomPanelConnector + extends ConnOp { + @override + BottomPanelState get(EpisodeLiveStreamState state) { + BottomPanelState mstate = state.bottomPanelState.clone(); + mstate.selectEpisode = state.selectedEpisode.episodeNumber; + mstate.streamLinks = state.streamLinks; + mstate.selectedLink = state.selectedLink; + mstate.tvName = state.tvName; + mstate.commentCount = + state.bottomPanelState.commentState.comments?.totalCount ?? 0; + return mstate; + } + + @override + void set(EpisodeLiveStreamState state, BottomPanelState subState) { + state.bottomPanelState = subState; + state.selectedLink = subState.selectedLink; + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/view.dart b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/view.dart new file mode 100644 index 00000000..2c3a4df8 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/bottom_panel_component/view.dart @@ -0,0 +1,264 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'action.dart'; +import 'components/download_menu.dart'; +import 'components/option_menu.dart'; +import 'components/video_source_menu.dart'; +import 'state.dart'; + +Widget buildView( + BottomPanelState state, Dispatch dispatch, ViewService viewService) { + void _closeMenu(OverlayEntry overlayEntry) { + overlayEntry?.remove(); + state.overlayStateKey.currentState.setOverlayEntry(null); + overlayEntry = null; + } + + void _showOptionMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + OptionMenu( + useVideoSourceApi: state.useVideoSourceApi, + streamInBrowser: state.streamInBrowser, + host: state.preferHost, + languageCode: state.defaultVideoLanguage, + closeMenu: () => _closeMenu(menuOverlayEntry), + reportTap: () { + dispatch(BottomPanelActionCreator.reportStreamLink()); + _closeMenu(menuOverlayEntry); + }, + streamLinkRequestTap: () { + dispatch(BottomPanelActionCreator.requestStreamLink()); + _closeMenu(menuOverlayEntry); + }, + onUseApiTap: (b) => + dispatch(BottomPanelActionCreator.useVideoSource(b)), + onStreamInBrowserTap: (b) => + dispatch(BottomPanelActionCreator.streamInBrowser(b)), + onHostSelected: (s) => + dispatch(BottomPanelActionCreator.preferHostTap(s)), + onLanguageSelected: (code) => + dispatch(BottomPanelActionCreator.defaultLanguageTap(code)), + ), + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + void _showSourceMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + VideoSourceMenu( + onTap: (d) { + _closeMenu(menuOverlayEntry); + dispatch(BottomPanelActionCreator.seletedLink(d)); + }, + streamLinkRequestTap: () { + dispatch(BottomPanelActionCreator.requestStreamLink()); + _closeMenu(menuOverlayEntry); + }, + moreTap: () { + _closeMenu(menuOverlayEntry); + dispatch(BottomPanelActionCreator.showStreamLinkFilter()); + }, + selectedLinkId: state.selectedLink?.sid ?? 0, + links: state.streamLinks?.list + ?.where((e) => e.episode == state.selectEpisode) + ?.toList() ?? + [], + ), + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + void _showDownloadMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + DownloadMenu( + links: state.streamLinks?.list + ?.where((e) => e.episode == state.selectEpisode) + ?.toList() ?? + [], + tvName: state.tvName, + playVideo: (d) { + _closeMenu(menuOverlayEntry); + dispatch(BottomPanelActionCreator.seletedLink(d)); + }, + ), + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + final _theme = ThemeStyle.getTheme(viewService.context); + return OverlayEntryManage( + key: state.overlayStateKey, + child: Positioned( + left: 0, + right: 0, + bottom: 0, + child: Container( + height: 80, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + decoration: BoxDecoration( + color: _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: Row(children: [ + AnimatedSwitcher( + duration: Duration(milliseconds: 300), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + child: _ItemButton( + key: ValueKey('LikeIcons$state.userLiked'), + onTap: () => dispatch(BottomPanelActionCreator.likeTvShow()), + icon: state.userLiked ? Icons.favorite : Icons.favorite_border, + iconColor: state.userLiked + ? const Color(0xFFAA222E) + : const Color(0xFFFFFFFF), + value: _convertString(state.likeCount), + ), + ), + _ItemButton( + icon: Icons.comment, + onTap: () => dispatch(BottomPanelActionCreator.commentTap()), + value: _convertString(state.commentCount), + ), + GestureDetector( + onTap: _showSourceMenu, + child: Icon( + Icons.tv, + size: Adapt.px(30), + color: const Color(0xFFFFFFFF), + )), + SizedBox(width: Adapt.px(70)), + GestureDetector( + onTap: _showDownloadMenu, + child: Icon( + Icons.file_download, + size: Adapt.px(30), + color: const Color(0xFFFFFFFF), + ), + ), + Spacer(), + GestureDetector( + onTap: () => _showOptionMenu(), + child: Icon( + Icons.more_vert, + color: const Color(0xFFFFFFFF), + ), + ), + SizedBox(width: Adapt.px(10)), + GestureDetector( + onTap: () => Navigator.of(viewService.context).pop(), + child: Icon( + Icons.keyboard_arrow_down, + size: Adapt.px(60), + color: const Color(0xFFFFFFFF), + ), + ), + ]), + ), + ), + ); +} + +class _ItemButton extends StatelessWidget { + final Function onTap; + final IconData icon; + final Color iconColor; + final String value; + const _ItemButton( + {Key key, + this.icon, + this.iconColor = const Color(0xFFFFFFFF), + this.onTap, + this.value}) + : super(key: key); + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: SizedBox( + width: Adapt.px(110), + child: Row( + children: [ + Icon( + icon, + key: key, + size: Adapt.px(30), + color: iconColor, + ), + SizedBox(width: Adapt.px(10)), + SizedBox( + width: Adapt.px(70), + child: Text( + value, + maxLines: 1, + style: TextStyle( + color: const Color(0xFFFFFFFF), fontSize: Adapt.px(24)), + ), + ), + ], + ), + ), + ); + } +} + +String _convertString(int value) { + String _result = '$value'; + if (value >= 1000 && value < 1000000) + _result = '${(value / 1000).toStringAsFixed(0)}k'; + else if (value >= 1000000) + _result = '${(value / 1000000).toStringAsFixed(0)}m'; + return _result; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/player_component/action.dart b/lib/views/stream_link/episode_livestream_page/components/player_component/action.dart new file mode 100644 index 00000000..a77acb9f --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/player_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum PlayerAction { action } + +class PlayerActionCreator { + static Action onAction() { + return const Action(PlayerAction.action); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/player_component/component.dart b/lib/views/stream_link/episode_livestream_page/components/player_component/component.dart new file mode 100644 index 00000000..490a4d2a --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/player_component/component.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PlayerComponent extends Component { + PlayerComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + shouldUpdate: (o, n) { + return o.playerType != n.playerType || + o.streamLink != n.streamLink || + o.streamLinkId != n.streamLinkId || + o.streamInBrowser != n.streamInBrowser || + o.useVideoSourceApi != n.useVideoSourceApi || + o.needAd != n.needAd || + o.background != n.background || + o.loading != n.loading; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/episode_livestream_page/components/player_component/effect.dart b/lib/views/stream_link/episode_livestream_page/components/player_component/effect.dart new file mode 100644 index 00000000..1bdb9ab5 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/player_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PlayerAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/stream_link/episode_livestream_page/components/player_component/reducer.dart b/lib/views/stream_link/episode_livestream_page/components/player_component/reducer.dart new file mode 100644 index 00000000..d8f21c2c --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/player_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PlayerAction.action: _onAction, + }, + ); +} + +PlayerState _onAction(PlayerState state, Action action) { + final PlayerState newState = state.clone(); + return newState; +} diff --git a/lib/views/stream_link/episode_livestream_page/components/player_component/state.dart b/lib/views/stream_link/episode_livestream_page/components/player_component/state.dart new file mode 100644 index 00000000..c924bb13 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/player_component/state.dart @@ -0,0 +1,52 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/state.dart'; + +class PlayerState implements Cloneable { + String playerType; + String streamLink; + String background; + int streamLinkId; + bool useVideoSourceApi; + bool streamInBrowser; + bool needAd; + bool loading; + Episode episode; + @override + PlayerState clone() { + return PlayerState() + ..playerType = playerType + ..streamLink = streamLink + ..background = background + ..useVideoSourceApi = useVideoSourceApi + ..streamInBrowser = streamInBrowser + ..needAd = needAd + ..loading = loading + ..episode = episode; + } +} + +class PlayerConnector extends ConnOp { + @override + PlayerState get(EpisodeLiveStreamState state) { + PlayerState mstate = state.playerState.clone(); + mstate.episode = state.selectedEpisode; + mstate.loading = state.loading; + mstate.useVideoSourceApi = state.bottomPanelState.useVideoSourceApi; + mstate.streamInBrowser = state.bottomPanelState.streamInBrowser || + (state.selectedLink?.externalBrowser ?? false); + mstate.background = state.selectedEpisode.stillPath; + mstate.streamLinkId = state.selectedLink?.sid ?? 0; + mstate.needAd = state.selectedLink?.needAd ?? false; + mstate.playerType = + state.selectedLink?.streamLinkType?.name ?? 'VideoSourceApi'; + mstate.streamLink = state.selectedLink?.streamLink ?? + 'https://moviessources.cf/embed/${state.tvid}/${state.season.seasonNumber}-${state.selectedEpisode.episodeNumber}'; + return mstate; + } + + @override + void set(EpisodeLiveStreamState state, PlayerState subState) { + state.playerState = subState; + } +} diff --git a/lib/views/stream_link/episode_livestream_page/components/player_component/view.dart b/lib/views/stream_link/episode_livestream_page/components/player_component/view.dart new file mode 100644 index 00000000..ec762795 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/components/player_component/view.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/action.dart'; +import 'package:movie/widgets/video_panel.dart'; + +import 'state.dart'; + +Widget buildView( + PlayerState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: AspectRatio( + aspectRatio: 16 / 9, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(30)), + child: PlayerPanel( + loading: state.loading, + background: state.background, + streamLink: state.streamLink, + playerType: state.playerType, + linkId: state.streamLinkId, + streamInBrowser: state.streamInBrowser, + useVideoSourceApi: state.useVideoSourceApi, + needAd: state.needAd, + onPlay: () => dispatch( + EpisodeLiveStreamActionCreator.markWatched(state.episode)), + ), + ), + ), + ); +} diff --git a/lib/views/stream_link/episode_livestream_page/effect.dart b/lib/views/stream_link/episode_livestream_page/effect.dart new file mode 100644 index 00000000..3b3f760d --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/effect.dart @@ -0,0 +1,123 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/models.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + EpisodeLiveStreamAction.action: _onAction, + EpisodeLiveStreamAction.episodeTapped: _episodeTapped, + EpisodeLiveStreamAction.markWatched: _markWatched, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _episodeTapped(Action action, Context ctx) async { + final Episode _episode = action.payload; + if (_episode == null || + _episode.episodeNumber == ctx.state.selectedEpisode.episodeNumber) return; + ctx.state.scrollController.animateTo(0.0, + duration: Duration(milliseconds: 300), curve: Curves.ease); + TvShowStreamLink _link; + if (ctx.state.streamLinks != null) + _link = ctx.state.streamLinks.list.firstWhere( + (e) => e.episode == _episode.episodeNumber, + orElse: () => null); + ctx.dispatch( + EpisodeLiveStreamActionCreator.setSelectedEpisode(_episode, _link)); + await _getLike(action, ctx); + await _getComment(action, ctx); +} + +void _onInit(Action action, Context ctx) async { + ctx.state.scrollController = ScrollController(); + + BaseApi.instance + .getTvSeasonStreamLinks( + ctx.state.tvid, ctx.state.selectedEpisode.seasonNumber) + .then((value) async { + TvShowStreamLink _link; + if (value.success) { + TvShowStreamLinks _links = value.result; + if (value.result.list.length > 0) { + _links = await _sortStreamLink(_links); + _link = value.result.list.firstWhere( + (e) => e.episode == ctx.state.selectedEpisode.episodeNumber, + orElse: () => null); + } + + ctx.dispatch(EpisodeLiveStreamActionCreator.setStreamLink(_links, _link)); + } else + ctx.dispatch(EpisodeLiveStreamActionCreator.setLoading(false)); + }); + await _getLike(action, ctx); + await _getComment(action, ctx); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController.dispose(); +} + +Future _getComment(Action action, Context ctx) async { + final _comment = await BaseApi.instance.getTvShowComments( + ctx.state.tvid, + ctx.state.selectedEpisode.seasonNumber, + ctx.state.selectedEpisode.episodeNumber); + if (_comment.success) + ctx.dispatch(EpisodeLiveStreamActionCreator.setComment(_comment.result)); +} + +Future _getLike(Action action, Context ctx) async { + final _user = GlobalStore.store.getState().user; + final _like = await BaseApi.instance.getTvShowLikes( + tvid: ctx.state.tvid, + season: ctx.state.selectedEpisode.seasonNumber, + episode: ctx.state.selectedEpisode.episodeNumber, + uid: _user?.firebaseUser?.uid ?? ''); + if (_like.success) + ctx.dispatch(EpisodeLiveStreamActionCreator.setLike( + _like.result['likes'], _like.result['userLike'])); +} + +Future _sortStreamLink(TvShowStreamLinks links) async { + List _lists = links.list; + final _pre = await SharedPreferences.getInstance(); + if (_pre.containsKey('defaultVideoLanguage')) { + final _defaultVideoLanguage = _pre.getString('defaultVideoLanguage'); + final _languageList = + _lists.where((e) => e.language.code == _defaultVideoLanguage).toList(); + if (_languageList.length > 0) { + for (var d in _languageList) links.list.remove(d); + links.list.insertAll(0, _languageList); + } + } + if (_pre.containsKey('preferHost')) { + final _preferHost = _pre.getString('preferHost'); + final _hostList = + _lists.where((e) => e.streamLink.contains(_preferHost)).toList(); + if (_hostList.length > 0) { + for (var d in _hostList) links.list.remove(d); + links.list.insertAll(0, _hostList); + } + } + return links; +} + +void _markWatched(Action action, Context ctx) async { + final _pre = await SharedPreferences.getInstance(); + final _episode = action.payload as Episode; + final index = ctx.state.season.episodes.indexOf(_episode); + if (ctx.state.season.playStates[index] != '1') { + ctx.state.season.playStates[index] = '1'; + _episode.playState = true; + _pre.setStringList( + 'TvSeason${ctx.state.season.id}', ctx.state.season.playStates); + } +} diff --git a/lib/views/stream_link/episode_livestream_page/page.dart b/lib/views/stream_link/episode_livestream_page/page.dart new file mode 100644 index 00000000..eeda2a5b --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/page.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/bottom_panel_component/component.dart'; +import 'components/bottom_panel_component/state.dart'; +import 'components/player_component/component.dart'; +import 'components/player_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class EpisodeLiveStreamPage + extends Page> { + EpisodeLiveStreamPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'player': PlayerConnector() + PlayerComponent(), + 'bottomPanel': BottomPanelConnector() + BottomPanelComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/stream_link/episode_livestream_page/reducer.dart b/lib/views/stream_link/episode_livestream_page/reducer.dart new file mode 100644 index 00000000..7627e4e3 --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/reducer.dart @@ -0,0 +1,79 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; +import 'package:movie/models/episode_model.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + EpisodeLiveStreamAction.action: _onAction, + EpisodeLiveStreamAction.setSelectedEpisode: _setSelectedEpisode, + EpisodeLiveStreamAction.selectedStreamLink: _selectedStreamLink, + EpisodeLiveStreamAction.setComment: _setComment, + EpisodeLiveStreamAction.setLike: _setLike, + EpisodeLiveStreamAction.setStreamLink: _setStreamLink, + EpisodeLiveStreamAction.setLoading: _setLoading, + }, + ); +} + +EpisodeLiveStreamState _onAction(EpisodeLiveStreamState state, Action action) { + final EpisodeLiveStreamState newState = state.clone(); + return newState; +} + +EpisodeLiveStreamState _setSelectedEpisode( + EpisodeLiveStreamState state, Action action) { + final Episode _episode = action.payload[0]; + final TvShowStreamLink _link = action.payload[1]; + final EpisodeLiveStreamState newState = state.clone(); + newState.selectedEpisode = _episode; + newState.selectedLink = _link; + return newState; +} + +EpisodeLiveStreamState _setComment( + EpisodeLiveStreamState state, Action action) { + final _comments = action.payload; + final EpisodeLiveStreamState newState = state.clone(); + newState.bottomPanelState.commentState.comments = _comments; + return newState; +} + +EpisodeLiveStreamState _setLike(EpisodeLiveStreamState state, Action action) { + final int _count = action.payload[0] ?? 0; + final bool _like = action.payload[1] ?? false; + final EpisodeLiveStreamState newState = state.clone(); + newState.bottomPanelState.likeCount = _count; + newState.bottomPanelState.userLiked = _like; + return newState; +} + +EpisodeLiveStreamState _setStreamLink( + EpisodeLiveStreamState state, Action action) { + final TvShowStreamLinks _streamLinks = action.payload[0]; + final TvShowStreamLink _link = action.payload[1]; + final EpisodeLiveStreamState newState = state.clone(); + newState.selectedLink = _link; + newState.streamLinks = _streamLinks; + newState.loading = false; + return newState; +} + +EpisodeLiveStreamState _selectedStreamLink( + EpisodeLiveStreamState state, Action action) { + final TvShowStreamLink _link = action.payload; + final EpisodeLiveStreamState newState = state.clone(); + newState.selectedLink = _link; + return newState; +} + +EpisodeLiveStreamState _setLoading( + EpisodeLiveStreamState state, Action action) { + final bool _loading = action.payload; + final EpisodeLiveStreamState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/stream_link/episode_livestream_page/state.dart b/lib/views/stream_link/episode_livestream_page/state.dart new file mode 100644 index 00000000..c217ecee --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/state.dart @@ -0,0 +1,62 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/tvshow_stream_link.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/components/bottom_panel_component/components/comment_component/state.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/components/bottom_panel_component/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'components/bottom_panel_component/components/streamlink_filter_component/state.dart'; +import 'components/player_component/state.dart'; + +class EpisodeLiveStreamState implements Cloneable { + int tvid; + String tvName; + bool loading; + TvShowStreamLinks streamLinks; + TvShowStreamLink selectedLink; + Episode selectedEpisode; + Season season; + ScrollController scrollController; + PlayerState playerState; + BottomPanelState bottomPanelState; + + @override + EpisodeLiveStreamState clone() { + return EpisodeLiveStreamState() + ..loading = loading + ..tvid = tvid + ..tvName = tvName + ..season = season + ..streamLinks = streamLinks + ..selectedEpisode = selectedEpisode + ..scrollController = scrollController + ..playerState = playerState + ..bottomPanelState = bottomPanelState + ..selectedLink = selectedLink; + } +} + +EpisodeLiveStreamState initState(Map args) { + EpisodeLiveStreamState state = EpisodeLiveStreamState(); + state.tvid = args['tvid']; + state.tvName = args['tvName']; + state.season = args['season']; + state.selectedEpisode = args['selectedEpisode']; + state.bottomPanelState = BottomPanelState() + ..overlayStateKey = GlobalKey() + ..tvId = state.tvid + ..season = state.season.seasonNumber + ..useVideoSourceApi = true + ..streamInBrowser = false + ..commentState = CommentState() + ..streamLinkFilterState = StreamLinkFilterState( + overlayStateKey: GlobalKey()) + ..likeCount = 0 + ..userLiked = false; + state.playerState = PlayerState() + ..background = state.selectedEpisode.stillPath; + state.loading = true; + return state; +} diff --git a/lib/views/stream_link/episode_livestream_page/view.dart b/lib/views/stream_link/episode_livestream_page/view.dart new file mode 100644 index 00000000..40a9be9c --- /dev/null +++ b/lib/views/stream_link/episode_livestream_page/view.dart @@ -0,0 +1,314 @@ +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/expandable_text.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + EpisodeLiveStreamState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + + return Scaffold( + backgroundColor: _theme.backgroundColor, + body: AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: Stack( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: CustomScrollView( + controller: state.scrollController, + slivers: [ + SliverToBoxAdapter( + child: SizedBox(height: Adapt.px(30) + Adapt.padTopH()), + ), + viewService.buildComponent('player'), + _Header( + episode: state.selectedEpisode, + season: state.season, + ), + const _EpisodeTitle(), + _Episodes( + episodes: state.season.episodes, + episodeNumber: state.selectedEpisode.episodeNumber, + onTap: (d) => dispatch( + EpisodeLiveStreamActionCreator.episodeTapped(d)), + ), + SliverToBoxAdapter(child: const SizedBox(height: 100)), + ], + ), + ), + Container( + color: _theme.backgroundColor, + height: Adapt.padTopH(), + ), + viewService.buildComponent('bottomPanel'), + ], + ), + ), + ); + }, + ); +} + +class _Header extends StatelessWidget { + final Episode episode; + final Season season; + const _Header({this.episode, this.season}); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(top: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + episode.name, + style: TextStyle( + fontSize: Adapt.px(35), + fontWeight: FontWeight.bold, + height: 1.5, + ), + ), + SizedBox(height: Adapt.px(40)), + Row(children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: season.posterPath != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(season.posterPath, ImageSize.w300), + ), + ) + : null, + ), + ), + SizedBox(width: Adapt.px(10)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: Adapt.screenW() - Adapt.px(410), + child: Text( + season.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + DateFormat.yMMMd().format(DateTime.parse(season.airDate)), + style: TextStyle( + fontSize: Adapt.px(24), + color: const Color(0xFF717171), + ), + ), + ], + ), + Spacer(), + _CastCell(casts: season.credits.cast) + ]), + SizedBox(height: Adapt.px(40)), + ExpandableText( + season.overview, + maxLines: 3, + style: TextStyle(color: const Color(0xFF717171), height: 1.5), + ) + ], + ), + ), + ); + } +} + +class _CastCell extends StatelessWidget { + final List casts; + const _CastCell({this.casts}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + width: Adapt.px(240), + child: Row( + children: casts + .take(4) + .map((e) { + final int _index = casts.indexOf(e); + return Container( + width: Adapt.px(60), + height: Adapt.px(60), + transform: Matrix4.translationValues(10.0 * _index, 0, 0), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + border: Border.all( + color: const Color(0xFFFFFFFF), + width: 1, + ), + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(e.profilePath, ImageSize.w300), + ), + ), + ), + ); + }) + .toList() + .reversed + .toList(), + ), + ); + } +} + +class _EpisodeTitle extends StatelessWidget { + const _EpisodeTitle(); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Padding( + padding: + EdgeInsetsDirectional.only(top: Adapt.px(40), bottom: Adapt.px(30)), + child: Text( + 'Next Episode', + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.w600, + ), + ), + ), + ); + } +} + +class _Episodes extends StatelessWidget { + final List episodes; + final int episodeNumber; + final Function(Episode) onTap; + + const _Episodes({this.episodes, this.episodeNumber, this.onTap}); + @override + Widget build(BuildContext context) { + return SliverList( + delegate: SliverChildBuilderDelegate((_, index) { + int _episodeIndex = episodeNumber - 1; + int _d = _episodeIndex + index; + final int _index = _d < episodes.length ? _d : _d - episodes.length; + return _EpisodeCell( + episode: episodes[_index], + playing: episodeNumber == episodes[_index].episodeNumber, + onTap: onTap, + ); + }, childCount: episodes.length), + ); + } +} + +class _EpisodeCell extends StatelessWidget { + final Episode episode; + final bool playing; + final Function(Episode) onTap; + const _EpisodeCell({this.episode, this.onTap, this.playing = false}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(episode), + child: Padding( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + child: Row( + children: [ + Container( + width: Adapt.px(220), + height: Adapt.px(122), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: episode.stillPath == null + ? null + : DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(episode.stillPath, ImageSize.w300), + ), + ), + ), + child: _WatchedCell( + watched: episode.playState, + playing: playing, + ), + ), + SizedBox(width: Adapt.px(20)), + SizedBox( + width: Adapt.screenW() - Adapt.px(320), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'EP${episode.episodeNumber}', + style: TextStyle( + fontSize: Adapt.px(28), fontWeight: FontWeight.bold), + ), + Text(episode.name), + ], + ), + ) + ], + ), + ), + ); + } +} + +class _WatchedCell extends StatelessWidget { + final bool playing; + final bool watched; + const _WatchedCell({this.watched = false, this.playing = false}); + @override + Widget build(BuildContext context) { + final _brightness = MediaQuery.of(context).platformBrightness; + return playing || watched + ? Align( + alignment: Alignment.bottomRight, + child: Container( + margin: EdgeInsets.all(4), + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: _brightness == Brightness.light + ? const Color(0xAAF0F0F0) + : const Color(0xAA202020), + borderRadius: BorderRadius.circular(5)), + child: Text( + playing ? 'Playing' : 'Watched', + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + ), + ) + : const SizedBox(); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/action.dart b/lib/views/stream_link/movie_livestream_page/action.dart new file mode 100644 index 00000000..31e397b2 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/action.dart @@ -0,0 +1,47 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/movie_comment.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; + +enum MovieLiveStreamAction { + action, + getLike, + getComment, + setComment, + setStreamLink, + selectedStreamLink, + setLoading, + setLike, +} + +class MovieLiveStreamActionCreator { + static Action onAction() { + return const Action(MovieLiveStreamAction.action); + } + + static Action getLike() { + return const Action(MovieLiveStreamAction.getLike); + } + + static Action getComment() { + return const Action(MovieLiveStreamAction.getComment); + } + + static Action setComment(MovieComments comment) { + return Action(MovieLiveStreamAction.setComment, payload: comment); + } + + static Action setLike(int likeCount, bool userLiked) { + return Action(MovieLiveStreamAction.setLike, + payload: [likeCount, userLiked]); + } + + static Action setStreamLink( + MovieStreamLinks streamLinks, MovieStreamLink selectedLink) { + return Action(MovieLiveStreamAction.setStreamLink, + payload: [streamLinks, selectedLink]); + } + + static Action setLoading(bool loading) { + return Action(MovieLiveStreamAction.setLoading, payload: loading); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/action.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/action.dart new file mode 100644 index 00000000..935f8e33 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/action.dart @@ -0,0 +1,95 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; + +enum BottomPanelAction { + action, + commentTap, + useVideoSource, + setUseVideoSource, + streamInBrowser, + setStreamInBrowser, + seletedLink, + setLike, + likeMovie, + setOption, + reportStreamLink, + requestStreamLink, + showStreamlinkFilter, + preferHostTap, + setPreferHost, + defaultLanguageTap, + setDefaultLanguage, +} + +class BottomPanelActionCreator { + static Action onAction() { + return const Action(BottomPanelAction.action); + } + + static Action useVideoSource(bool useVideoSourceApi) { + return Action(BottomPanelAction.useVideoSource, payload: useVideoSourceApi); + } + + static Action setUseVideoSource(bool useVideoSource) { + return Action(BottomPanelAction.setUseVideoSource, payload: useVideoSource); + } + + static Action streamInBrowser(bool streamInBrowser) { + return Action(BottomPanelAction.streamInBrowser, payload: streamInBrowser); + } + + static Action setStreamInBrowser(bool streamInBrowser) { + return Action(BottomPanelAction.setStreamInBrowser, + payload: streamInBrowser); + } + + static Action seletedLink(MovieStreamLink link) { + return Action(BottomPanelAction.seletedLink, payload: link); + } + + static Action setLike(int likeCount, bool userLiked) { + return Action(BottomPanelAction.setLike, payload: [likeCount, userLiked]); + } + + static Action likeMovie() { + return const Action(BottomPanelAction.likeMovie); + } + + static Action commentTap() { + return const Action(BottomPanelAction.commentTap); + } + + static Action setOption(bool useVideoSourceApi, bool streamInBrowser, + String language, String host) { + return Action(BottomPanelAction.setOption, + payload: [useVideoSourceApi, streamInBrowser, language, host]); + } + + static Action reportStreamLink() { + return const Action(BottomPanelAction.reportStreamLink); + } + + static Action requestStreamLink() { + return const Action(BottomPanelAction.requestStreamLink); + } + + static Action showStreamLinkFilter() { + return const Action(BottomPanelAction.showStreamlinkFilter); + } + + static Action defaultLanguageTap(String code) { + return Action(BottomPanelAction.defaultLanguageTap, payload: code); + } + + static Action setDefaultLanguage(String code) { + return Action(BottomPanelAction.setDefaultLanguage, payload: code); + } + + static Action preferHostTap(String host) { + return Action(BottomPanelAction.preferHostTap, payload: host); + } + + static Action setPreferHost(String host) { + return Action(BottomPanelAction.setPreferHost, payload: host); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/component.dart new file mode 100644 index 00000000..8e9dc5ae --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/component.dart @@ -0,0 +1,37 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/comment_component/component.dart'; +import 'components/comment_component/state.dart'; +import 'components/streamlink_filter_component/component.dart'; +import 'components/streamlink_filter_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class BottomPanelComponent extends Component { + BottomPanelComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + clearOnDependenciesChanged: true, + shouldUpdate: (o, n) { + return o.commentCount != n.commentCount || + o.likeCount != n.likeCount || + o.streamLinks != n.streamLinks || + o.selectedLink != n.selectedLink || + o.useVideoSourceApi != n.useVideoSourceApi || + o.streamInBrowser != n.streamInBrowser || + o.defaultVideoLanguage != n.defaultVideoLanguage || + o.preferHost != n.preferHost || + o.userLiked != n.userLiked; + }, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'comments': CommentConnector() + CommentComponent(), + 'streamLinkFilter': + StreamLinkFilterConnector() + StreamLinkFilterComponent(), + }), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/action.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/action.dart new file mode 100644 index 00000000..65738cfb --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/action.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/movie_comment.dart'; + +enum CommentAction { + action, + loadMore, + addComment, + insertComment, +} + +class CommentActionCreator { + static Action onAction() { + return const Action(CommentAction.action); + } + + static Action loadMore(MovieComments comments) { + return Action(CommentAction.loadMore, payload: comments); + } + + static Action addComment(String comment) { + return Action(CommentAction.addComment, payload: comment); + } + + static Action insertComment(MovieComment comment) { + return Action(CommentAction.insertComment, payload: comment); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/component.dart new file mode 100644 index 00000000..d29989bf --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CommentComponent extends Component { + CommentComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + clearOnDependenciesChanged: true, + shouldUpdate: (oldState, newState) { + return oldState.comments != newState.comments || + oldState.comments?.totalCount != newState.comments?.totalCount; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart new file mode 100644 index 00000000..ccd1f8fd --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/effect.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/base_user.dart'; +import 'package:movie/models/models.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CommentAction.action: _onAction, + CommentAction.addComment: _addComment, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) { + ctx.state.scrollController = ScrollController() + ..addListener(() { + if (ctx.state.scrollController.position.pixels == + ctx.state.scrollController.position.maxScrollExtent) { + _loadMore(action, ctx); + } + }); + ctx.state.isBusy = false; +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController?.dispose(); +} + +void _addComment(Action action, Context ctx) async { + final String _commentTxt = action.payload; + final _user = GlobalStore.store.getState().user; + if (_user == null) { + Toast.show('login before comment', ctx.context, duration: 2); + return; + } + if (_commentTxt != '' && _commentTxt != null) { + final String _date = DateTime.now().toString(); + final _baseApi = BaseApi.instance; + final MovieComment _comment = MovieComment.fromParams( + mediaId: ctx.state.movieId, + comment: _commentTxt, + uid: _user.firebaseUser.uid, + updateTime: _date, + createTime: _date, + u: BaseUser.fromParams( + uid: _user.firebaseUser.uid, + userName: _user.firebaseUser.displayName, + photoUrl: _user.firebaseUser.photoUrl), + like: 0); + ctx.dispatch(CommentActionCreator.insertComment(_comment)); + _baseApi.createMovieComment(_comment).then((r) { + if (r.success) _comment.id = r.result.id; + }); + } +} + +void _loadMore(Action action, Context ctx) async { + if (!ctx.state.isBusy) { + ctx.state.isBusy = true; + final _baseApi = BaseApi.instance; + final _comment = await _baseApi.getMovieComments(ctx.state.movieId, + page: ctx.state.comments.page + 1); + if (_comment.success) { + if (_comment.result.data.length > 0) + ctx.dispatch(CommentActionCreator.loadMore(_comment.result)); + } + + ctx.state.isBusy = false; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart new file mode 100644 index 00000000..214773fa --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/reducer.dart @@ -0,0 +1,44 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/movie_comment.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CommentAction.action: _onAction, + CommentAction.insertComment: _insertComment, + CommentAction.loadMore: _loadMore, + }, + ); +} + +CommentState _onAction(CommentState state, Action action) { + final CommentState newState = state.clone(); + return newState; +} + +CommentState _insertComment(CommentState state, Action action) { + final MovieComment _comment = action.payload; + final CommentState newState = state.clone(); + if (_comment != null) { + newState.comments.data.insert(0, _comment); + newState.comments.totalCount++; + } + return newState; +} + +CommentState _loadMore(CommentState state, Action action) { + final MovieComments _comments = action.payload; + final CommentState newState = state.clone(); + if (_comments != null) { + final _newComments = MovieComments.fromParams( + data: state.comments.data, + page: _comments.page, + totalCount: _comments.totalCount); + _newComments.data.addAll(_comments.data); + newState.comments = _newComments; + } + return newState; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/state.dart new file mode 100644 index 00000000..591f0f43 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/state.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/movie_comment.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/components/bottom_panel_component/state.dart'; + +class CommentState implements Cloneable { + MovieComments comments; + ScrollController scrollController; + bool isBusy; + int movieId; + + @override + CommentState clone() { + return CommentState() + ..comments = comments + ..movieId = movieId + ..isBusy = isBusy + ..scrollController = scrollController; + } +} + +class CommentConnector extends ConnOp { + @override + CommentState get(BottomPanelState state) { + CommentState mstate = state.commentState; + mstate.movieId = state.movieId; + return mstate; + } + + @override + void set(BottomPanelState state, CommentState subState) { + state.commentState = subState; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/view.dart new file mode 100644 index 00000000..dfef3972 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/comment_component/view.dart @@ -0,0 +1,266 @@ +import 'dart:ui' as ui; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/movie_comment.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + CommentState state, Dispatch dispatch, ViewService viewService) { + final _height = Adapt.screenH() * 0.7; + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: const Color(0x00000000), + body: Container( + height: Adapt.screenH(), + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: + BorderRadius.vertical(top: Radius.circular(Adapt.px(30))), + ), + child: Stack(children: [ + _CommentPanel( + height: _height, + comments: state.comments, + scrollController: state.scrollController, + ), + _CommentInputCell( + pageHeight: Adapt.screenH() * 0.3, + submit: (s) { + dispatch(CommentActionCreator.addComment(s)); + }, + scrollController: state.scrollController, + ), + ]), + ), + ); + }, + ); +} + +class _CommentCell extends StatelessWidget { + final MovieComment comment; + const _CommentCell({this.comment}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + var date = DateTime.parse(comment.updateTime ?? '1970-07-10'); + final String _timeline = TimelineUtil.format( + date.millisecondsSinceEpoch, + locTimeMs: DateTime.now().millisecondsSinceEpoch, + locale: ui.window.locale.languageCode, + ); + return Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _theme.primaryColorDark, + image: comment.u.photoUrl != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(comment.u.photoUrl), + ) + : null, + ), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: Adapt.screenW() - Adapt.px(190), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + comment?.u?.userName ?? '', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: Adapt.px(28), + ), + ), + Spacer(), + Text( + _timeline, + style: TextStyle( + fontSize: Adapt.px(18), + color: const Color(0xFF717171), + ), + ), + ], + ), + SizedBox(height: Adapt.px(20)), + Text(comment?.comment ?? ''), + SizedBox(height: Adapt.px(30)), + Divider() + ], + ), + ), + ], + ), + ); + } +} + +class _CommentPanel extends StatelessWidget { + final double height; + final ScrollController scrollController; + final MovieComments comments; + const _CommentPanel({this.comments, this.height, this.scrollController}); + @override + Widget build(BuildContext context) { + return Container( + height: height, + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), + vertical: Adapt.px(40), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Comments', + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.bold, + ), + ), + InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: Icon(Icons.keyboard_arrow_down), + ), + ], + )), + SizedBox(height: Adapt.px(40)), + Expanded( + child: ListView.separated( + controller: scrollController, + padding: EdgeInsets.only(bottom: Adapt.px(110)), + separatorBuilder: (_, __) => SizedBox(height: Adapt.px(30)), + itemCount: comments?.data?.length ?? 0, + itemBuilder: (context, index) { + final _d = comments.data[index]; + return _CommentCell(comment: _d); + }, + ), + ), + ], + ), + ); + } +} + +class _CommentInputCell extends StatefulWidget { + final double pageHeight; + final Function(String) submit; + final ScrollController scrollController; + const _CommentInputCell( + {this.pageHeight, this.submit, this.scrollController}); + @override + _CommentInputState createState() => _CommentInputState(); +} + +class _CommentInputState extends State<_CommentInputCell> { + bool _show = true; + TextEditingController _controller; + @override + void initState() { + super.initState(); + _controller = TextEditingController(); + if (widget.scrollController != null) + widget.scrollController?.position?.isScrollingNotifier + ?.addListener(_scrollListener); + } + + @override + void dispose() { + widget.scrollController?.removeListener(_scrollListener); + _controller?.dispose(); + super.dispose(); + } + + void _scrollListener() { + final _f = !widget.scrollController.position.isScrollingNotifier.value; + if (_f != _show) + setState(() { + _show = _f; + }); + } + + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Positioned( + bottom: 0, + left: 0, + right: 0, + child: Transform.translate( + offset: Offset(0, -widget.pageHeight), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 300), + transitionBuilder: (widget, animation) { + return SlideTransition( + position: + animation.drive(Tween(begin: Offset(0, 1), end: Offset.zero)), + child: widget, + ); + }, + child: _show + ? Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + border: Border( + top: BorderSide(color: _theme.primaryColorDark))), + child: SafeArea( + top: false, + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.symmetric(horizontal: 20), + margin: + EdgeInsets.symmetric(vertical: 15, horizontal: 10), + height: 40, + decoration: BoxDecoration( + color: _theme.primaryColorLight, + borderRadius: BorderRadius.circular(20)), + child: TextField( + onSubmitted: (s) { + widget.submit(s); + _controller.clear(); + }, + cursorColor: Colors.grey, + controller: _controller, + decoration: InputDecoration( + hintStyle: TextStyle(fontSize: 16), + labelStyle: TextStyle(fontSize: 16), + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + hintText: 'Add a comment', + ), + ), + ), + ), + ) + : SizedBox(), + ), + ), + ); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/download_menu.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/download_menu.dart new file mode 100644 index 00000000..c531d356 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/download_menu.dart @@ -0,0 +1,435 @@ +import 'dart:io'; +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/stream_link_convert/stream_link_convert_factory.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; +import 'package:movie/models/download_queue.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:toast/toast.dart'; + +class DownloadMenu extends StatelessWidget { + final String movieName; + final List links; + final Function(MovieStreamLink) playVideo; + const DownloadMenu({this.links, this.movieName, this.playVideo}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 220; + final double _arrowSize = 20.0; + return Positioned( + bottom: 80, + left: Adapt.px(375) - _width / 2, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Align( + alignment: Alignment.bottomCenter, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + padding: EdgeInsets.all(20), + height: 250, + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column(children: [ + Expanded( + child: _DownLoadTaskList( + movieName: movieName, + onPlayVideo: playVideo, + list: links + .where((e) => + e.streamLinkType.name == 'WebView' || + e.streamLinkType.name == 'other') + .toList(), + ), + ), + ]), + ), + ), + ], + ), + ), + ); + } +} + +class _DownLoadTaskList extends StatefulWidget { + final String movieName; + final Function(MovieStreamLink) onPlayVideo; + final List list; + const _DownLoadTaskList( + {Key key, this.list, this.movieName, this.onPlayVideo}) + : super(key: key); + @override + _DownLoadTaskListState createState() => _DownLoadTaskListState(); +} + +class _DownLoadTaskListState extends State<_DownLoadTaskList> { + ReceivePort _port = ReceivePort(); + List _queue; + List _downloadTasks; + @override + void initState() { + super.initState(); + updateTasks(); + + IsolateNameServer.registerPortWithName( + _port.sendPort, 'downloader_send_port'); + _port.listen((dynamic data) { + String _id = data[0]; + DownloadTaskStatus _status = data[1]; + int _progress = data[2]; + final _task = _queue?.singleWhere( + (e) => e.taskId == _id, + orElse: () => null, + ); + if (_task != null) { + _task.progress = _progress < 0 ? 0 : _progress; + _task.status = _status; + setState(() {}); + } + }); + } + + Future updateTasks() async { + _downloadTasks = await FlutterDownloader.loadTasks(); + _queue = List(); + if (_queue != null) + _downloadTasks?.forEach((e) { + //FlutterDownloader.remove(taskId: e.taskId); + _queue.add(DownloadQueue( + taskId: e.taskId, + url: e.url, + filename: e.filename, + progress: e.progress, + status: e.status, + savedDir: e.savedDir, + timeCreated: e.timeCreated)); + }); + _queue.sort((a, b) => b.timeCreated.compareTo(a.timeCreated)); + setState(() {}); + } + + Future _createTask(MovieStreamLink link) async { + try { + final _taskName = '${widget.movieName}_${link.sid}'; + final _localPath = + (await _findLocalPath()) + Platform.pathSeparator + 'Download'; + final _savedDir = Directory(_localPath); + bool hasExisted = await _savedDir.exists(); + if (!hasExisted) { + _savedDir.create(); + } + String _downloadAddress; + if (link.streamLinkType.name == 'WebView') { + _downloadAddress = + await StreamLinkConvertFactory.instance.getLink(link.streamLink); + print(_downloadAddress); + } else + _downloadAddress = link.streamLink; + if (_downloadAddress == null) + return Toast.show('Invalid download address', context); + final _taskId = await FlutterDownloader.enqueue( + url: _downloadAddress, + fileName: _taskName + _getFileExtension(_downloadAddress), + savedDir: _localPath, + showNotification: true, + openFileFromNotification: true, + ); + print(_taskId); + await updateTasks(); + } on Exception catch (_) { + print(_); + } + } + + Future _retryTask(DownloadQueue queue) async { + await FlutterDownloader.retry(taskId: queue.taskId); + await updateTasks(); + return; + } + + void _playLoaclFile(MovieStreamLink link) { + final _taskName = '${widget.movieName}_${link.sid}'; + final _task = _queue?.firstWhere((e) => e.filename.contains(_taskName), + orElse: () => null); + if (_task == null) return; + MovieStreamLink _link = MovieStreamLink(link.toString()); + _link.streamLink = '${_task.savedDir}/${_task.filename}'; + _link.streamLinkType.id = 99; + _link.streamLinkType.name = 'localFile'; + widget.onPlayVideo(_link); + } + + @override + void dispose() { + IsolateNameServer.removePortNameMapping('downloader_send_port'); + super.dispose(); + } + + Future _findLocalPath() async { + final directory = Platform.isAndroid + ? await getExternalStorageDirectory() + : await getApplicationDocumentsDirectory(); + return directory.path; + } + + String _getFileExtension(String address) { + List _fileExtensions = ['.mp4', '.m3u8', '.mkv', '.mov', '.webm']; + String _fileExtension; + for (var q in _fileExtensions) { + if (address.contains(q)) { + _fileExtension = q; + break; + } + } + return _fileExtension; + } + + @override + void didUpdateWidget(_DownLoadTaskList oldWidget) { + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.zero, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + separatorBuilder: (_, __) => SizedBox(height: 15), + itemCount: widget.list?.length ?? 0, + itemBuilder: (_, index) { + final _link = widget.list[index]; + final _taskName = '${widget.movieName}_${_link.sid}'; + final _task = _queue?.firstWhere((e) => e.filename.contains(_taskName), + orElse: () => null); + return _DownLoadCell( + link: _link, + queue: _task, + downloadTap: _createTask, + retryTap: _retryTask, + openFileTap: _playLoaclFile, + ); + }, + ); + } +} + +class _DownLoadCell extends StatelessWidget { + final MovieStreamLink link; + final DownloadQueue queue; + final Function(MovieStreamLink) downloadTap; + final Function(MovieStreamLink) openFileTap; + final Function(DownloadQueue) retryTap; + const _DownLoadCell({ + this.link, + this.queue, + this.downloadTap, + this.openFileTap, + this.retryTap, + }); + @override + Widget build(BuildContext context) { + final Color _baseColor = const Color(0xFFFFFFFF); + final String _name = _getDomain(link.streamLink, link.streamLinkType.name); + return Container( + child: Row( + children: [ + Container( + constraints: BoxConstraints(maxWidth: 120), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _name, + maxLines: 1, + style: TextStyle( + color: _baseColor, + fontSize: 12, + ), + ), + SizedBox(height: 3), + Text( + link.language.name, + style: TextStyle( + fontSize: 10, + color: const Color(0xFF717171), + ), + ) + ], + )), + SizedBox(width: 8), + Container( + padding: EdgeInsets.all(3), + decoration: BoxDecoration( + border: Border.all(color: _baseColor), + borderRadius: BorderRadius.circular(5), + ), + child: Text( + link.quality.name, + style: TextStyle( + fontSize: 6, + color: _baseColor, + ), + ), + ), + Spacer(), + _DownloadIcon( + queue: queue, + onStart: () => downloadTap(link), + onRetry: () => retryTap(queue), + openFile: () => openFileTap(link), + ), + SizedBox(width: 5), + ], + ), + ); + } +} + +class _CircularProgressIndicator extends StatelessWidget { + final int value; + const _CircularProgressIndicator({this.value}); + @override + Widget build(BuildContext context) { + return Container( + width: 10, + height: 10, + child: CircularProgressIndicator( + strokeWidth: 2, + value: value != null ? value / 100 : null, + backgroundColor: const Color(0xFF717171), + valueColor: AlwaysStoppedAnimation(Color(0xFFFFFFFF)), + ), + ); + } +} + +class _DownloadIcon extends StatefulWidget { + final Function onStart; + final Function onRetry; + final Function openFile; + final DownloadQueue queue; + const _DownloadIcon({this.onRetry, this.onStart, this.openFile, this.queue}); + @override + _DownloadIconState createState() => _DownloadIconState(); +} + +class _DownloadIconState extends State<_DownloadIcon> { + final Color _baseColor = const Color(0xFFFFFFFF); + bool _hasTask = false; + bool _loading = false; + @override + void initState() { + super.initState(); + } + + @override + void didUpdateWidget(_DownloadIcon oldWidget) { + if (oldWidget.queue != widget.queue) { + setState(() { + _hasTask = widget.queue != null; + }); + } + super.didUpdateWidget(oldWidget); + } + + _setLoading(bool loading) { + setState(() { + _loading = loading; + }); + } + + _start() async { + if (_loading) return; + _setLoading(true); + await widget.onStart(); + _setLoading(false); + } + + _retry() async { + if (_loading) return; + _setLoading(true); + await widget.onRetry(); + _setLoading(false); + } + + @override + Widget build(BuildContext context) { + if (_loading) return _CircularProgressIndicator(); + if (_hasTask) + switch (widget.queue.status.value) { + //runing + //enqueued + case 2: + case 1: + return _CircularProgressIndicator( + value: widget.queue.progress, + ); + //complete + case 3: + return GestureDetector( + onTap: widget.openFile, + child: Icon( + Icons.play_arrow, + size: 12, + color: _baseColor, + ), + ); + case 4: + return GestureDetector( + onTap: _retry, + child: Icon( + Icons.refresh, + size: 12, + color: _baseColor, + ), + ); + } + return GestureDetector( + onTap: _start, + child: Icon( + Icons.download_sharp, + size: 12, + color: _baseColor, + ), + ); + } +} + +_getDomain(String url, String type) { + if (type.toLowerCase() == 'youtube') return 'youtube'; + if (type.toLowerCase() == 'torrent') return 'torrent'; + final _strArray = url.split('/'); + if (_strArray.length > 3) return _strArray[2]; + return url; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/option_menu.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/option_menu.dart new file mode 100644 index 00000000..bedfcfab --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/option_menu.dart @@ -0,0 +1,242 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; +import 'package:movie/widgets/host_dialog.dart'; +import 'package:movie/widgets/language_dialog.dart'; + +class OptionMenu extends StatelessWidget { + final bool useVideoSourceApi; + final bool streamInBrowser; + final String languageCode; + final String host; + final Function closeMenu; + final Function(bool) onUseApiTap; + final Function(bool) onStreamInBrowserTap; + final Function(String) onLanguageSelected; + final Function(String) onHostSelected; + final Function reportTap; + final Function streamLinkRequestTap; + const OptionMenu({ + this.closeMenu, + this.useVideoSourceApi = false, + this.streamInBrowser = false, + this.languageCode, + this.host, + this.onHostSelected, + this.onLanguageSelected, + this.onUseApiTap, + this.onStreamInBrowserTap, + this.reportTap, + this.streamLinkRequestTap, + }); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 260; + final double _arrowSize = 20.0; + return Positioned( + bottom: 80, + right: Adapt.px(40), + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.only(right: Adapt.px(75)), + alignment: Alignment.bottomRight, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column(children: [ + _OptionItem( + onTap: () { + closeMenu(); + showDialog( + context: context, + builder: (_) => HostDialog( + onSelected: onHostSelected, + selectedHost: host, + ), + ); + }, + icon: Icons.web, + title: 'Prefer Host', + ), + _OptionItem( + onTap: () { + closeMenu(); + showDialog( + context: context, + builder: (_) => LanguageDialog( + onTap: onLanguageSelected, + selected: languageCode, + ), + ); + }, + icon: Icons.language, + title: 'Default Language', + ), + _OptionCheckItem( + icon: Icons.settings_applications, + title: 'VideoSource Api', + selected: useVideoSourceApi, + onTap: onUseApiTap, + ), + _OptionCheckItem( + icon: Icons.open_in_browser, + title: 'Stream in browser', + selected: streamInBrowser, + onTap: onStreamInBrowserTap, + ), + _OptionItem( + onTap: streamLinkRequestTap, + icon: Icons.link, + title: 'Request StreamLink', + ), + _OptionItem( + icon: Icons.flag, + title: 'Report', + onTap: reportTap, + ), + ]), + ), + ), + ], + ), + ), + ); + } +} + +class _OptionItem extends StatelessWidget { + final String title; + final IconData icon; + final Function onTap; + const _OptionItem({@required this.title, @required this.icon, this.onTap}); + @override + Widget build(BuildContext context) { + final Color _baseColor = const Color(0xFFFFFFFF); + return InkWell( + onTap: onTap, + child: SizedBox( + height: 50, + child: Row( + children: [ + Icon( + icon, + color: _baseColor, + size: 16, + ), + SizedBox(width: 20), + Text( + title, + style: TextStyle(color: _baseColor, fontSize: 14), + ), + ], + ), + ), + ); + } +} + +class _OptionCheckItem extends StatefulWidget { + final String title; + final IconData icon; + final bool selected; + final Function(bool) onTap; + const _OptionCheckItem( + {@required this.title, + @required this.icon, + this.selected = false, + this.onTap}); + @override + _OptionCheckItemState createState() => _OptionCheckItemState(); +} + +class _OptionCheckItemState extends State<_OptionCheckItem> { + final Color _baseColor = const Color(0xFFFFFFFF); + bool _selected = false; + @override + void initState() { + _selected = widget.selected; + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + _changed() { + _selected = !_selected; + setState(() {}); + if (widget.onTap != null) widget.onTap(_selected); + } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: _changed, + child: SizedBox( + height: 50, + child: Row( + children: [ + Icon( + widget.icon, + color: _baseColor, + size: 16, + ), + const SizedBox(width: 20), + Text( + widget.title, + style: TextStyle(color: _baseColor, fontSize: 14), + ), + const Spacer(), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(3.0), + border: Border.all(color: _baseColor)), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: _selected + ? Icon( + Icons.check, + size: 10.0, + color: _baseColor, + ) + : SizedBox( + width: 10, + height: 10, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart new file mode 100644 index 00000000..9d225a5a --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/action.dart @@ -0,0 +1,67 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/models.dart'; + +enum StreamLinkFilterAction { + action, + selectedLinkTap, + setSelectedLink, + hostTap, + languageTap, + qualityTap, + setHost, + setLanguage, + setQuality, + setFilterList, + sortTap, + setSort, +} + +class StreamLinkFilterActionCreator { + static Action onAction() { + return const Action(StreamLinkFilterAction.action); + } + + static Action streamlinkTap(MovieStreamLink link) { + return Action(StreamLinkFilterAction.selectedLinkTap, payload: link); + } + + static Action setSelectedLink(MovieStreamLink link) { + return Action(StreamLinkFilterAction.setSelectedLink, payload: link); + } + + static Action hostTap(String host) { + return Action(StreamLinkFilterAction.hostTap, payload: host); + } + + static Action languageTap(String language) { + return Action(StreamLinkFilterAction.languageTap, payload: language); + } + + static Action qualityTap(String quality) { + return Action(StreamLinkFilterAction.qualityTap, payload: quality); + } + + static Action setHost(String host) { + return Action(StreamLinkFilterAction.setHost, payload: host); + } + + static Action setLanguage(String language) { + return Action(StreamLinkFilterAction.setLanguage, payload: language); + } + + static Action setQuality(String quality) { + return Action(StreamLinkFilterAction.setQuality, payload: quality); + } + + static Action setFilterList(List list) { + return Action(StreamLinkFilterAction.setFilterList, payload: list); + } + + static Action sortTap(String sort, bool asc) { + return Action(StreamLinkFilterAction.sortTap, payload: [sort, asc]); + } + + static Action setSort(String sort, bool asc) { + return Action(StreamLinkFilterAction.setSort, payload: [sort, asc]); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart new file mode 100644 index 00000000..d4ea0167 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/component.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class StreamLinkFilterComponent extends Component { + StreamLinkFilterComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + clearOnDependenciesChanged: true, + shouldUpdate: (o, n) { + return o.sortAsc != n.sortAsc || + o.sort != n.sort || + o.selectHost != n.selectHost || + o.selectLanguage != n.selectLanguage || + o.selectQuality != n.selectQuality || + o.streamLinks != n.streamLinks || + o.filterLinks != n.filterLinks || + o.selectedLink != n.selectedLink; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart new file mode 100644 index 00000000..b698db8e --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/filter_menu.dart @@ -0,0 +1,246 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/app_language.dart'; +import 'package:movie/actions/stream_link_convert/stream_link_convert_factory.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; + +class FilterMenu extends StatefulWidget { + final String selectedHost; + final String selectedLanguage; + final String selectedQuality; + final Function(String) hostTap; + final Function(String) languageTap; + final Function(String) qualityTap; + const FilterMenu({ + this.selectedHost, + this.selectedQuality, + this.selectedLanguage, + this.hostTap, + this.languageTap, + this.qualityTap, + }); + @override + _FilterMenuState createState() => _FilterMenuState(); +} + +class _FilterMenuState extends State { + String _selectedHost; + String _selectedLanguage; + String _selectedQuality; + @override + void initState() { + _selectedHost = widget.selectedHost; + _selectedLanguage = widget.selectedLanguage; + _selectedQuality = widget.selectedQuality; + super.initState(); + } + + _hostTap(String host) { + String _value; + if (_selectedHost != host) _value = host; + setState(() { + _selectedHost = _value; + }); + widget.hostTap(_value); + } + + _languageTap(String language) { + String _value; + if (_selectedLanguage != language) _value = language; + setState(() { + _selectedLanguage = _value; + }); + widget.languageTap(_value); + } + + _qualityTap(String quality) { + String _value; + if (_selectedQuality != quality) _value = quality; + setState(() { + _selectedQuality = _value; + }); + widget.qualityTap(_value); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = Adapt.screenW() - 40; + final double _arrowSize = 15.0; + final Color _fontColor = const Color(0xFFFFFFFF); + return Positioned( + top: Adapt.px(120) + 25, + right: 20, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Container( + padding: EdgeInsets.only(right: 56), + alignment: Alignment.bottomRight, + child: ClipPath( + clipper: ArrowClipper(mode: 'up'), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + Container( + width: _width, + margin: EdgeInsets.only(top: _arrowSize / 2 - 1), + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Hosts', + style: TextStyle(color: _fontColor), + ), + SizedBox(height: 10), + _HostOption( + onTap: _hostTap, + selectedHost: _selectedHost, + ), + SizedBox(height: 20), + Text( + 'Languages', + style: TextStyle(color: _fontColor), + ), + SizedBox(height: 10), + _LanguageOption( + onTap: _languageTap, + selectedLanguage: _selectedLanguage, + ), + SizedBox(height: 20), + Text( + 'Quality', + style: TextStyle(color: _fontColor), + ), + SizedBox(height: 10), + _QualityOption( + onTap: _qualityTap, selectedQuality: _selectedQuality), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _HostOption extends StatelessWidget { + final String selectedHost; + final Function(String) onTap; + const _HostOption({this.selectedHost, this.onTap}); + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 8, + spacing: 8, + children: StreamLinkConvertFactory.instance.hosts + .map( + (e) => _WrapCell( + title: e, + selected: e == selectedHost, + onTap: () => onTap(e), + ), + ) + .toList(), + ); + } +} + +class _LanguageOption extends StatelessWidget { + final String selectedLanguage; + final Function(String) onTap; + const _LanguageOption({this.selectedLanguage, this.onTap}); + @override + Widget build(BuildContext context) { + return Wrap( + runSpacing: 8, + spacing: 8, + children: AppLanguage.instance.supportLanguages + .where((e) => e.name != 'System Default') + .map( + (e) => _WrapCell( + title: e.name, + selected: e.name == selectedLanguage, + onTap: () => onTap(e.name), + ), + ) + .toList(), + ); + } +} + +class _QualityOption extends StatelessWidget { + final String selectedQuality; + final Function(String) onTap; + const _QualityOption({this.selectedQuality, this.onTap}); + @override + Widget build(BuildContext context) { + final _hosts = [ + "4K", + "1080p", + "720p", + "480p", + "360p", + "240p", + ]; + return Wrap( + runSpacing: 8, + spacing: 8, + children: _hosts + .map( + (e) => _WrapCell( + title: e, + selected: e == selectedQuality, + onTap: () => onTap(e), + ), + ) + .toList(), + ); + } +} + +class _WrapCell extends StatelessWidget { + final String title; + final bool selected; + final Function onTap; + const _WrapCell({this.title, this.onTap, this.selected = false}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all( + color: const Color(0xFFFFFFFF), + ), + borderRadius: BorderRadius.circular(8), + color: selected ? const Color(0xFFFFFFFF) : null, + ), + child: Text( + title, + style: TextStyle( + fontSize: 12, + color: selected ? const Color(0xFF25272E) : const Color(0xFFFFFFFF), + ), + ), + ), + ); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart new file mode 100644 index 00000000..0e1e3857 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart @@ -0,0 +1,145 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; + +class SortMenu extends StatefulWidget { + final String sort; + final bool sortAsc; + final Function(String, bool) onSortTap; + const SortMenu({this.sort, this.sortAsc, this.onSortTap}); + @override + _SortMenuState createState() => _SortMenuState(); +} + +class _SortMenuState extends State { + final double _width = 150; + final double _arrowSize = 15.0; + final List _sortList = [ + "Domain", + "Language", + "Quality", + "UpdateTime" + ]; + String _sort; + bool _asc; + @override + void initState() { + _sort = widget.sort; + _asc = widget.sortAsc ?? true; + super.initState(); + } + + _onSortTap(String sort) { + if (_sort == sort) + _asc = !_asc; + else + _asc = true; + _sort = sort; + setState(() {}); + widget.onSortTap(sort, _asc); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + return Positioned( + top: Adapt.px(120) + 25, + left: 31, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Container( + padding: EdgeInsets.only(left: 15), + alignment: Alignment.bottomLeft, + child: ClipPath( + clipper: ArrowClipper(mode: 'up'), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: _arrowSize / 2 - 1), + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _sortList + .map( + (e) => _SortCell( + title: e, + selected: e == _sort, + asc: _asc, + onTap: _onSortTap, + ), + ) + .toList(), + ), + ), + ], + ), + ), + ); + } +} + +class _SortCell extends StatelessWidget { + final String title; + final bool asc; + final bool selected; + final Function(String) onTap; + const _SortCell({ + this.title, + this.asc = false, + this.onTap, + this.selected = false, + }); + @override + Widget build(BuildContext context) { + final Color _color = const Color(0xFFFFFFFF); + return GestureDetector( + onTap: () => onTap(title), + child: Container( + padding: EdgeInsets.all(5), + margin: EdgeInsets.only(bottom: 5), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all(color: selected ? _color : Colors.transparent), + ), + child: Row( + children: [ + Text( + title, + style: TextStyle( + color: _color, + fontSize: 12, + ), + ), + Spacer(), + selected + ? Icon( + asc + ? FontAwesomeIcons.sortAlphaDown + : FontAwesomeIcons.sortAlphaUp, + color: _color, + size: 12, + ) + : SizedBox(), + ], + ), + ), + ); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart new file mode 100644 index 00000000..7b423978 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/effect.dart @@ -0,0 +1,91 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/models.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + StreamLinkFilterAction.action: _onAction, + StreamLinkFilterAction.selectedLinkTap: _selectedLinkTap, + StreamLinkFilterAction.hostTap: _hostTap, + StreamLinkFilterAction.languageTap: _languageTap, + StreamLinkFilterAction.qualityTap: _qualityTap, + StreamLinkFilterAction.sortTap: _sortTap, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _selectedLinkTap(Action action, Context ctx) { + final MovieStreamLink _link = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setSelectedLink(_link)); + Navigator.of(ctx.context).pop(); +} + +void _hostTap(Action action, Context ctx) { + final String _host = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setHost(_host)); + _updateFilter(action, ctx); +} + +void _languageTap(Action action, Context ctx) { + final String _language = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setLanguage(_language)); + _updateFilter(action, ctx); +} + +void _qualityTap(Action action, Context ctx) { + final String _qualityTap = action.payload; + ctx.dispatch(StreamLinkFilterActionCreator.setQuality(_qualityTap)); + _updateFilter(action, ctx); +} + +void _sortTap(Action action, Context ctx) { + final String _sort = action.payload[0]; + final bool _asc = action.payload[1] ?? true; + ctx.dispatch(StreamLinkFilterActionCreator.setSort(_sort, _asc)); + _updateFilter(action, ctx); +} + +void _updateFilter(Action action, Context ctx) { + List _list = ctx.state.streamLinks.list; + if (ctx.state.selectHost != null) + _list = _list + .where((e) => e.streamLink.contains(ctx.state.selectHost)) + .toList(); + if (ctx.state.selectLanguage != null) + _list = _list + .where((e) => e.language.name == ctx.state.selectLanguage) + .toList(); + if (ctx.state.selectQuality != null) + _list = + _list.where((e) => e.quality.name == ctx.state.selectQuality).toList(); + if (ctx.state.sort != null) { + final _sort = ctx.state.sort; + final _asc = ctx.state.sortAsc ?? true; + switch (_sort) { + case 'Domain': + _asc + ? _list.sort((a, b) => a.streamLink.compareTo(b.streamLink)) + : _list.sort((a, b) => b.streamLink.compareTo(a.streamLink)); + break; + case 'Language': + _asc + ? _list.sort((a, b) => a.language.name.compareTo(b.language.name)) + : _list.sort((a, b) => b.language.name.compareTo(a.language.name)); + break; + case 'Quality': + _asc + ? _list.sort((a, b) => a.quality.id.compareTo(b.quality.id)) + : _list.sort((a, b) => b.quality.id.compareTo(a.quality.id)); + break; + case 'UpdateTime': + _asc + ? _list.sort((a, b) => a.updateTime.compareTo(b.updateTime)) + : _list.sort((a, b) => b.updateTime.compareTo(a.updateTime)); + break; + } + } + ctx.dispatch(StreamLinkFilterActionCreator.setFilterList(_list)); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart new file mode 100644 index 00000000..f54725ed --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/reducer.dart @@ -0,0 +1,72 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/models.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + StreamLinkFilterAction.action: _onAction, + StreamLinkFilterAction.setSelectedLink: _setSelectedLink, + StreamLinkFilterAction.setHost: _setHost, + StreamLinkFilterAction.setLanguage: _setLanguage, + StreamLinkFilterAction.setQuality: _setQuality, + StreamLinkFilterAction.setFilterList: _setFilterList, + StreamLinkFilterAction.setSort: _setSort, + }, + ); +} + +StreamLinkFilterState _onAction(StreamLinkFilterState state, Action action) { + final StreamLinkFilterState newState = state.clone(); + return newState; +} + +StreamLinkFilterState _setSelectedLink( + StreamLinkFilterState state, Action action) { + final MovieStreamLink _link = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.streamLinks.list.remove(_link); + newState.streamLinks.list.insert(0, _link); + newState.selectedLink = _link; + return newState; +} + +StreamLinkFilterState _setHost(StreamLinkFilterState state, Action action) { + final String _host = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.selectHost = _host; + return newState; +} + +StreamLinkFilterState _setLanguage(StreamLinkFilterState state, Action action) { + final String _language = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.selectLanguage = _language; + return newState; +} + +StreamLinkFilterState _setQuality(StreamLinkFilterState state, Action action) { + final String _quality = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.selectQuality = _quality; + return newState; +} + +StreamLinkFilterState _setFilterList( + StreamLinkFilterState state, Action action) { + final List _list = action.payload; + final StreamLinkFilterState newState = state.clone(); + newState.filterLinks = _list; + return newState; +} + +StreamLinkFilterState _setSort(StreamLinkFilterState state, Action action) { + final String _sort = action.payload[0]; + final bool _asc = action.payload[1]; + final StreamLinkFilterState newState = state.clone(); + newState.sort = _sort; + newState.sortAsc = _asc; + return newState; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart new file mode 100644 index 00000000..c3e9c700 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart @@ -0,0 +1,57 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/components/bottom_panel_component/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +class StreamLinkFilterState implements Cloneable { + MovieStreamLinks streamLinks; + List filterLinks; + MovieStreamLink selectedLink; + String selectHost; + String selectLanguage; + String selectQuality; + String sort; + bool sortAsc; + GlobalKey overlayStateKey; + StreamLinkFilterState({this.overlayStateKey}); + @override + StreamLinkFilterState clone() { + return StreamLinkFilterState() + ..streamLinks = streamLinks + ..filterLinks = filterLinks + ..selectedLink = selectedLink + ..overlayStateKey = overlayStateKey + ..selectHost = selectHost + ..selectLanguage = selectLanguage + ..selectQuality = selectQuality + ..sort = sort + ..sortAsc = sortAsc; + } +} + +class StreamLinkFilterConnector + extends ConnOp { + @override + StreamLinkFilterState get(BottomPanelState state) { + StreamLinkFilterState mstate = StreamLinkFilterState(); + mstate.streamLinks = state.streamLinks; + mstate.selectedLink = state.selectedLink; + mstate.overlayStateKey = state.streamLinkFilterState.overlayStateKey; + mstate.selectHost = state.streamLinkFilterState.selectHost; + mstate.selectLanguage = state.streamLinkFilterState.selectLanguage; + mstate.selectQuality = state.streamLinkFilterState.selectQuality; + mstate.sort = state.streamLinkFilterState.sort; + mstate.sortAsc = state.streamLinkFilterState.sortAsc; + mstate.filterLinks = + state.streamLinkFilterState.filterLinks ?? state.streamLinks?.list; + return mstate; + } + + @override + void set(BottomPanelState state, StreamLinkFilterState subState) { + state.selectedLink = subState.selectedLink; + state.streamLinks = subState.streamLinks; + state.streamLinkFilterState = subState; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart new file mode 100644 index 00000000..37ca4581 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/view.dart @@ -0,0 +1,315 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/components/sort_menu.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; +import 'package:movie/widgets/sliverappbar_delegate.dart'; + +import 'action.dart'; +import 'components/filter_menu.dart'; +import 'state.dart'; + +Widget buildView( + StreamLinkFilterState state, Dispatch dispatch, ViewService viewService) { + void _closeMenu(OverlayEntry overlayEntry) { + overlayEntry?.remove(); + state.overlayStateKey.currentState.setOverlayEntry(null); + overlayEntry = null; + } + + void _openFilter() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + FilterMenu( + selectedHost: state.selectHost, + selectedLanguage: state.selectLanguage, + selectedQuality: state.selectQuality, + hostTap: (host) => + dispatch(StreamLinkFilterActionCreator.hostTap(host)), + languageTap: (language) => + dispatch(StreamLinkFilterActionCreator.languageTap(language)), + qualityTap: (quality) => + dispatch(StreamLinkFilterActionCreator.qualityTap(quality)), + ) + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + void _openSort() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + SortMenu( + sort: state.sort, + sortAsc: state.sortAsc, + onSortTap: (s, b) => + dispatch(StreamLinkFilterActionCreator.sortTap(s, b)), + ) + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.backgroundColor, + body: AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: SafeArea( + child: CustomScrollView( + slivers: [ + _FilterPanel( + openFilter: _openFilter, + openSort: _openSort, + overlayStateKey: state.overlayStateKey, + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) { + final _d = state.filterLinks[index]; + return _LinkCell( + link: _d, + onTap: (link) => dispatch( + StreamLinkFilterActionCreator.streamlinkTap(link)), + ); + }, + childCount: state.filterLinks?.length ?? 0, + ), + ), + SliverToBoxAdapter( + child: SizedBox(height: 20), + ), + ], + ), + ), + ), + ); + }, + ); +} + +class _LinkCell extends StatelessWidget { + final MovieStreamLink link; + final Function(MovieStreamLink) onTap; + const _LinkCell({this.link, this.onTap}); + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _domain = _getDomain(link.streamLink, link.streamLinkType.name); + final _date = DateFormat.yMMMd().format(DateTime.parse(link.updateTime)); + final _borderColor = _theme.brightness == Brightness.light + ? const Color(0xFF858585) + : const Color(0xFFE0E0E0); + return GestureDetector( + onTap: () => onTap(link), + child: Container( + margin: EdgeInsets.only(top: 15, left: 20, right: 20), + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _borderColor), + //color: _theme.primaryColorDark, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(children: [ + Text( + _domain, + style: TextStyle( + fontWeight: FontWeight.bold, + ), + ), + SizedBox(width: 15), + Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + color: const Color(0xFF252525), + borderRadius: BorderRadius.circular(5), + ), + child: Text( + link.quality.name, + style: TextStyle( + fontSize: 10, + color: const Color(0xFFFFFFFF), + ), + ), + ), + Spacer(), + Text( + _date, + style: TextStyle( + fontSize: 10, + color: const Color(0xFF717171), + ), + ), + ]), + Text( + link.language.name, + style: TextStyle( + fontSize: 12, + color: const Color(0xFF717171), + ), + ) + ], + ), + ), + ); + } +} + +class _FilterPanel extends StatelessWidget { + final Function openFilter; + final Function openSort; + final Key overlayStateKey; + const _FilterPanel({this.openFilter, this.openSort, this.overlayStateKey}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _borderColor = _theme.brightness == Brightness.light + ? const Color(0xFFDEDEDE) + : const Color(0xFF505050); + return SliverPersistentHeader( + floating: true, + delegate: SliverAppBarDelegate( + minHeight: Adapt.px(120), + maxHeight: Adapt.px(120), + child: Container( + color: _theme.backgroundColor, + child: OverlayEntryManage( + key: overlayStateKey, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + margin: EdgeInsets.fromLTRB(20, 15, 20, 5), + decoration: BoxDecoration( + //color: _theme.primaryColorLight, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: _borderColor, + ), + ), + height: Adapt.px(80), + child: Row( + children: [ + _FilterOption( + title: 'sort', + onTap: openSort, + ), + Spacer(), + GestureDetector( + onTap: openFilter, + child: Container( + width: 28, + height: 28, + decoration: BoxDecoration( + color: const Color(0xFF25272E), + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + FontAwesomeIcons.filter, + size: 10, + color: const Color(0xFFFFFFFF), + ), + ), + ), + SizedBox(width: 10), + GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Container( + width: 28, + height: 28, + decoration: BoxDecoration( + border: Border.all(color: _theme.iconTheme.color), + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.close, + size: 15, + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} + +class _FilterOption extends StatelessWidget { + final String title; + final Function onTap; + const _FilterOption({Key key, this.title, this.onTap}) + : assert(title != null), + super(key: key); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: onTap, + child: Container( + height: 35, + padding: EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(8)), + child: Row( + children: [ + Text(title), + SizedBox(width: 5), + Icon( + Icons.keyboard_arrow_down, + size: 15, + ), + ], + ), + ), + ); + } +} + +_getDomain(String url, String type) { + if (type.toLowerCase() == 'youtube') return 'youtube'; + if (type.toLowerCase() == 'torrent') return 'torrent'; + final _strArray = url.split('/'); + if (_strArray.length > 3) return _strArray[2]; + return url; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/video_source_menu.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/video_source_menu.dart new file mode 100644 index 00000000..c7b54dc2 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/video_source_menu.dart @@ -0,0 +1,206 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/arrow_clipper.dart'; + +class VideoSourceMenu extends StatelessWidget { + final List links; + final int selectedLinkId; + final Function(MovieStreamLink) onTap; + final Function moreTap; + final Function streamLinkRequestTap; + const VideoSourceMenu( + {this.links, + this.onTap, + this.selectedLinkId, + this.streamLinkRequestTap, + this.moreTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + final double _width = 180; + final double _arrowSize = 20.0; + final double _menuHeight = 210.0; + return Positioned( + bottom: 80, + left: Adapt.px(275) - _width / 2, + width: _width, + child: Material( + color: Colors.transparent, + child: Stack( + children: [ + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Align( + alignment: Alignment.bottomCenter, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _arrowSize, + height: _arrowSize, + color: _backGroundColor, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 15), + height: _menuHeight, + decoration: BoxDecoration( + color: _backGroundColor, + borderRadius: BorderRadius.circular(10), + ), + child: links.length > 0 + ? _LinkSourcePanel( + links: links.take(3).toList(), + selectedLink: selectedLinkId, + onTap: onTap, + moreTap: moreTap, + ) + : Center( + child: SizedBox( + width: 120, + child: FlatButton( + onPressed: streamLinkRequestTap, + child: Text( + 'request stream link', + textAlign: TextAlign.center, + style: TextStyle(color: const Color(0xFFFFFFFF)), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} + +class _LinkCell extends StatelessWidget { + final bool selected; + final MovieStreamLink data; + final Function(MovieStreamLink) onTap; + const _LinkCell({this.data, this.onTap, this.selected}); + @override + Widget build(BuildContext context) { + final _textStyle = + const TextStyle(color: const Color(0xFFFFFFFF), fontSize: 12); + final _subTextStyle = + const TextStyle(color: const Color(0xFFD0D0D0), fontSize: 10); + final _domain = _getDomain(data.streamLink, data.streamLinkType.name); + return InkWell( + onTap: () => onTap(data), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: selected + ? BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all(color: const Color(0xFFFFFFFF))) + : null, + height: 45, + child: Row( + children: [ + SizedBox( + width: 110, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _domain, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: _textStyle, + ), + SizedBox(height: 3), + Text( + data.language.name, + style: _subTextStyle, + ), + ], + ), + ), + Spacer(), + Text( + data.quality.name, + style: _subTextStyle, + ), + ], + ), + ), + ); + } +} + +class _LinkSourcePanel extends StatelessWidget { + final List links; + final int selectedLink; + final Function(MovieStreamLink) onTap; + final Function moreTap; + const _LinkSourcePanel({ + this.links, + this.selectedLink, + this.onTap, + this.moreTap, + }); + @override + Widget build(BuildContext context) { + return Column(crossAxisAlignment: CrossAxisAlignment.end, children: [ + Expanded( + child: ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.zero, + separatorBuilder: (_, __) => SizedBox(height: 5), + itemBuilder: (_, index) { + final _link = links[index]; + return _LinkCell( + data: _link, + selected: _link.sid == selectedLink, + onTap: onTap, + ); + }, + itemCount: links.length, + ), + ), + SizedBox(height: 10), + GestureDetector( + onTap: moreTap, + child: Container( + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all( + color: const Color(0xFFFFFFFF), + ), + ), + child: Text( + 'More', + style: TextStyle( + fontSize: 10, + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ]); + } +} + +_getDomain(String url, String type) { + if (type.toLowerCase() == 'youtube') return 'youtube'; + if (type.toLowerCase() == 'torrent') return 'torrent'; + final _strArray = url.split('/'); + if (_strArray.length > 3) return _strArray[2]; + return url; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/effect.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/effect.dart new file mode 100644 index 00000000..34cf03bd --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/effect.dart @@ -0,0 +1,171 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/widgets/stream_link_report_dialog.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:toast/toast.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + BottomPanelAction.action: _onAction, + Lifecycle.initState: _onInit, + BottomPanelAction.useVideoSource: _useVideoSource, + BottomPanelAction.streamInBrowser: _streamInBrowser, + BottomPanelAction.commentTap: _commentTap, + BottomPanelAction.likeMovie: _likeMovie, + BottomPanelAction.reportStreamLink: _reportStreamLink, + BottomPanelAction.requestStreamLink: _requestStreamLink, + BottomPanelAction.showStreamlinkFilter: _showStreamlinkFilter, + BottomPanelAction.preferHostTap: _preferHostTap, + BottomPanelAction.defaultLanguageTap: _defaultLanguageTap, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _useVideoSource(Action action, Context ctx) async { + final bool _b = action.payload; + final _pre = await SharedPreferences.getInstance(); + _pre.setBool('useVideoSourceApi', _b); + ctx.dispatch(BottomPanelActionCreator.setUseVideoSource(_b)); +} + +void _streamInBrowser(Action action, Context ctx) async { + final bool _b = action.payload; + final _pre = await SharedPreferences.getInstance(); + _pre.setBool('streamInBrowser', _b); + ctx.dispatch(BottomPanelActionCreator.setStreamInBrowser(_b)); +} + +Future _commentTap(Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + PageRouteBuilder( + barrierColor: const Color(0xAA000000), + fullscreenDialog: true, + barrierDismissible: true, + opaque: false, + pageBuilder: (context, animation, subAnimation) { + return SlideTransition( + position: Tween(begin: Offset(0, 1), end: Offset(0, 0.3)) + .animate( + CurvedAnimation(parent: animation, curve: Curves.ease)), + child: ctx.buildComponent('comments'), + ); + }), + ); +} + +void _onInit(Action action, Context ctx) async { + bool _useVideoSourceApi = true; + bool _streamInBrowser = false; + String _defaultVideoLanguage; + String _preferHost; + final _pre = await SharedPreferences.getInstance(); + if (_pre.containsKey('useVideoSourceApi')) + _useVideoSourceApi = _pre.getBool('useVideoSourceApi'); + if (_pre.containsKey('streamInBrowser')) + _streamInBrowser = _pre.getBool('streamInBrowser'); + if (_pre.containsKey('defaultVideoLanguage')) + _defaultVideoLanguage = _pre.getString('defaultVideoLanguage'); + if (_pre.containsKey('preferHost')) + _preferHost = _pre.getString('preferHost'); + ctx.dispatch(BottomPanelActionCreator.setOption(_useVideoSourceApi, + _streamInBrowser, _defaultVideoLanguage, _preferHost)); +} + +Future _likeMovie(Action action, Context ctx) async { + final user = GlobalStore.store.getState().user; + int _likeCount = ctx.state.likeCount; + bool _userLike = ctx.state.userLiked; + if (user?.firebaseUser == null) return; + _userLike ? _likeCount-- : _likeCount++; + ctx.dispatch(BottomPanelActionCreator.setLike(_likeCount, !_userLike)); + final _likeModel = MovieLikeModel.fromParams( + movieId: ctx.state.movieId, id: 0, uid: user.firebaseUser.uid); + + final _result = _userLike + ? await BaseApi.instance.unlikeMovie(_likeModel) + : await BaseApi.instance.likeMovie(_likeModel); + print(_result.result); +} + +void _reportStreamLink(Action action, Context ctx) { + final _name = ctx.state.selectedLink?.linkName ?? 'video api'; + showDialog( + context: ctx.context, + builder: (_) { + return StreamLinkReportDialog( + report: StreamLinkReport( + mediaId: ctx.state.movieId, + mediaName: _name, + linkName: _name, + streamLink: ctx.state.selectedLink?.streamLink ?? '', + type: "movie", + streamLinkId: ctx.state.selectedLink?.sid ?? 0, + )); + }); +} + +void _requestStreamLink(Action action, Context ctx) async { + final _topic = 'movie_${ctx.state.movieId}'; + final _firebaseMessaging = FirebaseMessaging(); + final _token = await _firebaseMessaging.getToken(); + //_firebaseMessaging.subscribeToTopic(_topic); + final _baseApi = BaseApi.instance; + _baseApi.sendRequestStreamLink(StreamLinkReport() + ..mediaId = ctx.state.movieId + ..mediaName = ctx.state.movieName + ..type = 'movie'); + _baseApi.subscribeTpoic(TopicSubscription.fromParams( + topicId: _topic, cloudMessagingToken: _token)); + Toast.show( + 'You will be notified when the stream link has been added', ctx.context, + duration: Toast.LENGTH_LONG); +} + +void _showStreamlinkFilter(Action action, Context ctx) async { + await Navigator.of(ctx.context).push( + PageRouteBuilder( + transitionDuration: Duration(milliseconds: 300), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + final _curvedAnimation = + CurvedAnimation(parent: animation, curve: Curves.ease); + return SlideTransition( + position: Tween( + begin: Offset(0, 1), + end: Offset.zero, + ).animate(_curvedAnimation), + child: FadeTransition( + opacity: _curvedAnimation, + child: ctx.buildComponent('streamLinkFilter')), + ); + }, + ), + ); +} + +void _preferHostTap(Action action, Context ctx) async { + final String _host = action.payload; + final _pre = await SharedPreferences.getInstance(); + if (_host == null) + _pre.remove('preferHost'); + else + _pre.setString('preferHost', _host); + ctx.dispatch(BottomPanelActionCreator.setPreferHost(_host)); +} + +void _defaultLanguageTap(Action action, Context ctx) async { + final String _code = action.payload; + final _pre = await SharedPreferences.getInstance(); + if (_code == null) + _pre.remove('defaultVideoLanguage'); + else + _pre.setString('defaultVideoLanguage', _code); + ctx.dispatch(BottomPanelActionCreator.setDefaultLanguage(_code)); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/reducer.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/reducer.dart new file mode 100644 index 00000000..f4ebf856 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/reducer.dart @@ -0,0 +1,82 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + BottomPanelAction.action: _onAction, + BottomPanelAction.setUseVideoSource: _setUseVideoSource, + BottomPanelAction.setStreamInBrowser: _setStreamInBrowser, + BottomPanelAction.seletedLink: _selectedLink, + BottomPanelAction.setOption: _setOption, + BottomPanelAction.setLike: _setLike, + BottomPanelAction.setPreferHost: _setPreferHost, + BottomPanelAction.setDefaultLanguage: _setDefaultLanguage, + }, + ); +} + +BottomPanelState _onAction(BottomPanelState state, Action action) { + final BottomPanelState newState = state.clone(); + return newState; +} + +BottomPanelState _setUseVideoSource(BottomPanelState state, Action action) { + final bool _b = action.payload; + final BottomPanelState newState = state.clone(); + newState.useVideoSourceApi = _b; + return newState; +} + +BottomPanelState _setStreamInBrowser(BottomPanelState state, Action action) { + final bool _b = action.payload; + final BottomPanelState newState = state.clone(); + newState.streamInBrowser = _b; + return newState; +} + +BottomPanelState _selectedLink(BottomPanelState state, Action action) { + final MovieStreamLink _link = action.payload; + final BottomPanelState newState = state.clone(); + newState.selectedLink = _link; + return newState; +} + +BottomPanelState _setOption(BottomPanelState state, Action action) { + final bool _api = action.payload[0]; + final bool _streamInBrowser = action.payload[1]; + final String _language = action.payload[2]; + final String _host = action.payload[3]; + final BottomPanelState newState = state.clone(); + newState.useVideoSourceApi = _api; + newState.streamInBrowser = _streamInBrowser; + newState.defaultVideoLanguage = _language; + newState.preferHost = _host; + return newState; +} + +BottomPanelState _setLike(BottomPanelState state, Action action) { + final int _count = action.payload[0] ?? 0; + final bool _like = action.payload[1] ?? false; + final BottomPanelState newState = state.clone(); + newState.likeCount = _count; + newState.userLiked = _like; + return newState; +} + +BottomPanelState _setPreferHost(BottomPanelState state, Action action) { + final String _host = action.payload; + final BottomPanelState newState = state.clone(); + newState.preferHost = _host; + return newState; +} + +BottomPanelState _setDefaultLanguage(BottomPanelState state, Action action) { + final String _code = action.payload; + final BottomPanelState newState = state.clone(); + newState.defaultVideoLanguage = _code; + return newState; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/state.dart new file mode 100644 index 00000000..fa02ce09 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/state.dart @@ -0,0 +1,64 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'components/comment_component/state.dart'; +import 'components/streamlink_filter_component/state.dart'; + +class BottomPanelState implements Cloneable { + String movieName; + String preferHost; + String defaultVideoLanguage; + MovieStreamLinks streamLinks; + MovieStreamLink selectedLink; + CommentState commentState; + StreamLinkFilterState streamLinkFilterState; + GlobalKey overlayStateKey; + bool useVideoSourceApi; + bool streamInBrowser; + bool userLiked; + int likeCount; + int movieId; + int commentCount; + @override + BottomPanelState clone() { + return BottomPanelState() + ..movieName = movieName + ..movieId = movieId + ..userLiked = userLiked + ..useVideoSourceApi = useVideoSourceApi + ..streamInBrowser = streamInBrowser + ..likeCount = likeCount + ..streamLinks = streamLinks + ..selectedLink = selectedLink + ..commentCount = commentCount + ..commentState = commentState + ..streamLinkFilterState = streamLinkFilterState + ..overlayStateKey = overlayStateKey + ..preferHost = preferHost + ..defaultVideoLanguage = defaultVideoLanguage; + } +} + +class BottomPanelConnector + extends ConnOp { + @override + BottomPanelState get(MovieLiveStreamState state) { + BottomPanelState mstate = state.bottomPanelState.clone(); + mstate.movieName = state.name; + mstate.streamLinks = state.streamLinks; + mstate.selectedLink = state.selectedLink; + mstate.commentCount = + state.bottomPanelState.commentState.comments?.totalCount ?? 0; + return mstate; + } + + @override + void set(MovieLiveStreamState state, BottomPanelState subState) { + state.bottomPanelState = subState; + state.selectedLink = subState.selectedLink; + state.streamLinks = subState.streamLinks; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/view.dart new file mode 100644 index 00000000..e6e23a55 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/bottom_panel_component/view.dart @@ -0,0 +1,257 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/download_menu.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'action.dart'; +import 'components/option_menu.dart'; +import 'components/video_source_menu.dart'; +import 'state.dart'; + +Widget buildView( + BottomPanelState state, Dispatch dispatch, ViewService viewService) { + void _closeMenu(OverlayEntry overlayEntry) { + overlayEntry?.remove(); + state.overlayStateKey.currentState.setOverlayEntry(null); + overlayEntry = null; + } + + void _showOptionMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + OptionMenu( + useVideoSourceApi: state.useVideoSourceApi, + streamInBrowser: state.streamInBrowser, + host: state.preferHost, + languageCode: state.defaultVideoLanguage, + closeMenu: () => _closeMenu(menuOverlayEntry), + reportTap: () { + dispatch(BottomPanelActionCreator.reportStreamLink()); + _closeMenu(menuOverlayEntry); + }, + streamLinkRequestTap: () { + dispatch(BottomPanelActionCreator.requestStreamLink()); + _closeMenu(menuOverlayEntry); + }, + onUseApiTap: (b) => + dispatch(BottomPanelActionCreator.useVideoSource(b)), + onStreamInBrowserTap: (b) => + dispatch(BottomPanelActionCreator.streamInBrowser(b)), + onHostSelected: (s) => + dispatch(BottomPanelActionCreator.preferHostTap(s)), + onLanguageSelected: (code) => + dispatch(BottomPanelActionCreator.defaultLanguageTap(code)), + ), + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + void _showSourceMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + VideoSourceMenu( + onTap: (d) { + _closeMenu(menuOverlayEntry); + dispatch(BottomPanelActionCreator.seletedLink(d)); + }, + moreTap: () { + _closeMenu(menuOverlayEntry); + dispatch(BottomPanelActionCreator.showStreamLinkFilter()); + }, + streamLinkRequestTap: () { + dispatch(BottomPanelActionCreator.requestStreamLink()); + _closeMenu(menuOverlayEntry); + }, + selectedLinkId: state.selectedLink?.sid ?? 0, + links: state.streamLinks?.list ?? [], + ), + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + void _showDownloadMenu() { + OverlayEntry menuOverlayEntry; + menuOverlayEntry = OverlayEntry( + builder: (context) { + return Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: () => _closeMenu(menuOverlayEntry), + child: Container( + color: Colors.transparent, + ), + )), + DownloadMenu( + links: state.streamLinks?.list ?? [], + movieName: state.movieName, + playVideo: (d) { + dispatch(BottomPanelActionCreator.seletedLink(d)); + _closeMenu(menuOverlayEntry); + }, + ), + ], + ); + }, + ); + state.overlayStateKey.currentState.setOverlayEntry(menuOverlayEntry); + Overlay.of(viewService.context).insert(menuOverlayEntry); + } + + final _theme = ThemeStyle.getTheme(viewService.context); + return OverlayEntryManage( + key: state.overlayStateKey, + child: Positioned( + left: 0, + right: 0, + bottom: 0, + child: Container( + height: 80, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + decoration: BoxDecoration( + color: _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark, + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(60)), + ), + ), + child: Row(children: [ + AnimatedSwitcher( + duration: Duration(milliseconds: 300), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + child: _ItemButton( + key: ValueKey('LikeIcons$state.userLiked'), + onTap: () => dispatch(BottomPanelActionCreator.likeMovie()), + icon: state.userLiked ? Icons.favorite : Icons.favorite_border, + iconColor: state.userLiked + ? const Color(0xFFAA222E) + : const Color(0xFFFFFFFF), + value: _convertString(state.likeCount), + ), + ), + _ItemButton( + icon: Icons.comment, + onTap: () => dispatch(BottomPanelActionCreator.commentTap()), + value: _convertString(state.commentCount), + ), + GestureDetector( + onTap: _showSourceMenu, + child: Icon( + Icons.tv, + size: Adapt.px(30), + color: const Color(0xFFFFFFFF), + )), + SizedBox(width: Adapt.px(70)), + GestureDetector( + onTap: _showDownloadMenu, + child: Icon( + Icons.file_download, + size: Adapt.px(30), + color: const Color(0xFFFFFFFF), + ), + ), + Spacer(), + GestureDetector( + onTap: () => _showOptionMenu(), + child: Icon( + Icons.more_vert, + color: const Color(0xFFFFFFFF), + )), + SizedBox(width: Adapt.px(10)), + GestureDetector( + onTap: () => Navigator.of(viewService.context).pop(), + child: Icon( + Icons.keyboard_arrow_down, + size: Adapt.px(60), + color: const Color(0xFFFFFFFF), + ), + ), + ]), + ), + ), + ); +} + +class _ItemButton extends StatelessWidget { + final Function onTap; + final IconData icon; + final Color iconColor; + final String value; + const _ItemButton( + {Key key, + this.icon, + this.iconColor = const Color(0xFFFFFFFF), + this.onTap, + this.value}) + : super(key: key); + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: SizedBox( + width: Adapt.px(110), + child: Row( + children: [ + Icon( + icon, + key: key, + size: Adapt.px(30), + color: iconColor, + ), + SizedBox(width: Adapt.px(10)), + SizedBox( + width: Adapt.px(70), + child: Text( + value, + maxLines: 1, + style: TextStyle( + color: const Color(0xFFFFFFFF), fontSize: Adapt.px(24)), + ), + ), + ], + ), + ), + ); + } +} + +String _convertString(int value) { + String _result = '$value'; + if (value >= 1000 && value < 1000000) + _result = '${(value / 1000).toStringAsFixed(0)}k'; + else if (value >= 1000000) + _result = '${(value / 1000000).toStringAsFixed(0)}m'; + return _result; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/component.dart new file mode 100644 index 00000000..b35f4b34 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class CastComponent extends Component { + CastComponent() + : super( + view: buildView, + clearOnDependenciesChanged: true, + shouldUpdate: (o, n) { + return o.casts != n.casts; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/state.dart new file mode 100644 index 00000000..c8671360 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/state.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/credits_model.dart'; + +import '../state.dart'; + +class CastState implements Cloneable { + List casts; + @override + CastState clone() { + return CastState()..casts = casts; + } +} + +class CastConnector extends ConnOp { + @override + CastState get(HeaderState state) { + CastState mstate = CastState(); + mstate.casts = state.detail?.credits?.cast ?? []; + return mstate; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/view.dart new file mode 100644 index 00000000..10132a65 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/header_component/cast_component/view.dart @@ -0,0 +1,44 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView(CastState state, Dispatch dispatch, ViewService viewService) { + final _theme = ThemeStyle.getTheme(viewService.context); + return Container( + width: Adapt.px(240), + child: Row( + children: state.casts + .take(4) + .map((e) { + final int _index = state.casts.indexOf(e); + return Container( + width: Adapt.px(60), + height: Adapt.px(60), + transform: Matrix4.translationValues(10.0 * _index, 0, 0), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + border: Border.all( + color: const Color(0xFFFFFFFF), + width: 1, + ), + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(e.profilePath, ImageSize.w300)), + ), + ), + ); + }) + .toList() + .reversed + .toList(), + ), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/header_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/header_component/component.dart new file mode 100644 index 00000000..49242e20 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/header_component/component.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'cast_component/component.dart'; +import 'cast_component/state.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + view: buildView, + shouldUpdate: (o, n) { + return o.name != n.name || + o.overview != n.overview || + o.detail != n.detail; + }, + clearOnDependenciesChanged: true, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'cast': CastConnector() + CastComponent() + }), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/header_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/header_component/state.dart new file mode 100644 index 00000000..10ff29fe --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/header_component/state.dart @@ -0,0 +1,30 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/state.dart'; + +class HeaderState implements Cloneable { + String name; + String background; + String overview; + MovieDetailModel detail; + @override + HeaderState clone() { + return HeaderState() + ..name = name + ..background = background + ..overview = overview + ..detail = detail; + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(MovieLiveStreamState state) { + HeaderState mstate = HeaderState(); + mstate.detail = state.detail; + mstate.background = state.background; + mstate.name = state.name; + mstate.overview = state.overview; + return mstate; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/header_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/header_component/view.dart new file mode 100644 index 00000000..4a42a00a --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/header_component/view.dart @@ -0,0 +1,79 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/expandable_text.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + final _theme = ThemeStyle.getTheme(viewService.context); + return SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(top: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + state.name ?? '', + style: TextStyle( + fontSize: Adapt.px(35), + fontWeight: FontWeight.bold, + height: 1.5, + ), + ), + SizedBox(height: Adapt.px(40)), + Row(children: [ + Container( + width: Adapt.px(80), + height: Adapt.px(80), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: state.detail.posterPath != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl( + state.detail.posterPath, ImageSize.w300), + ), + ) + : null, + ), + ), + SizedBox(width: Adapt.px(10)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + DateFormat.yMMMd() + .format(DateTime.parse(state.detail.releaseDate)), + ), + Text( + state.detail.genres.take(2).map((e) => e.name).join(' · '), + style: TextStyle( + fontSize: Adapt.px(24), + color: const Color(0xFF717171), + ), + ), + ], + ), + Spacer(), + viewService.buildComponent('cast') + ]), + SizedBox(height: Adapt.px(40)), + ExpandableText( + state.overview, + maxLines: 3, + style: TextStyle(color: const Color(0xFF717171), height: 1.5), + ) + ], + ), + ), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/player_component/action.dart b/lib/views/stream_link/movie_livestream_page/components/player_component/action.dart new file mode 100644 index 00000000..a77acb9f --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/player_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum PlayerAction { action } + +class PlayerActionCreator { + static Action onAction() { + return const Action(PlayerAction.action); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/player_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/player_component/component.dart new file mode 100644 index 00000000..490a4d2a --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/player_component/component.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class PlayerComponent extends Component { + PlayerComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + shouldUpdate: (o, n) { + return o.playerType != n.playerType || + o.streamLink != n.streamLink || + o.streamLinkId != n.streamLinkId || + o.streamInBrowser != n.streamInBrowser || + o.useVideoSourceApi != n.useVideoSourceApi || + o.needAd != n.needAd || + o.background != n.background || + o.loading != n.loading; + }, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/player_component/effect.dart b/lib/views/stream_link/movie_livestream_page/components/player_component/effect.dart new file mode 100644 index 00000000..1bdb9ab5 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/player_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + PlayerAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/stream_link/movie_livestream_page/components/player_component/reducer.dart b/lib/views/stream_link/movie_livestream_page/components/player_component/reducer.dart new file mode 100644 index 00000000..d8f21c2c --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/player_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + PlayerAction.action: _onAction, + }, + ); +} + +PlayerState _onAction(PlayerState state, Action action) { + final PlayerState newState = state.clone(); + return newState; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/player_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/player_component/state.dart new file mode 100644 index 00000000..72744880 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/player_component/state.dart @@ -0,0 +1,52 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/state.dart'; + +class PlayerState implements Cloneable { + String playerType; + String streamLink; + String background; + AppUser user; + int streamLinkId; + bool useVideoSourceApi; + bool streamInBrowser; + bool needAd; + bool loading; + @override + PlayerState clone() { + return PlayerState() + ..user = user + ..playerType = playerType + ..streamLink = streamLink + ..background = background + ..useVideoSourceApi = useVideoSourceApi + ..streamInBrowser = streamInBrowser + ..needAd = needAd + ..loading = loading; + } +} + +class PlayerConnector extends ConnOp { + @override + PlayerState get(MovieLiveStreamState state) { + PlayerState mstate = state.playerState.clone(); + mstate.useVideoSourceApi = state.bottomPanelState.useVideoSourceApi; + mstate.streamInBrowser = state.bottomPanelState.streamInBrowser || + (state.selectedLink?.externalBrowser ?? false); + mstate.needAd = state.selectedLink?.needAd ?? false; + mstate.background = state.background; + mstate.streamLinkId = state.selectedLink?.sid ?? 0; + mstate.loading = state.loading; + mstate.user = state.user; + mstate.playerType = + state.selectedLink?.streamLinkType?.name ?? 'VideoSourceApi'; + mstate.streamLink = state.selectedLink?.streamLink ?? + 'https://moviessources.cf/embed/${state.movieId}'; + return mstate; + } + + @override + void set(MovieLiveStreamState state, PlayerState subState) { + state.playerState = subState; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/player_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/player_component/view.dart new file mode 100644 index 00000000..11be177b --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/player_component/view.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/video_panel.dart'; + +import 'state.dart'; + +Widget buildView( + PlayerState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + child: AspectRatio( + aspectRatio: 16 / 9, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(30)), + child: PlayerPanel( + loading: state.loading, + background: state.background, + streamLink: state.streamLink, + playerType: state.playerType, + linkId: state.streamLinkId, + streamInBrowser: state.streamInBrowser, + useVideoSourceApi: state.useVideoSourceApi, + needAd: state.user.isPremium ? false : state.needAd, + ), + ), + ), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/recommendation_component/action.dart b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/action.dart new file mode 100644 index 00000000..0ff58736 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/action.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/models/video_list.dart'; + +enum RecommendationAction { action, cellTap, setDetail, setInfo } + +class RecommendationActionCreator { + static Action onAction() { + return const Action(RecommendationAction.action); + } + + static Action setInfo(VideoListResult data) { + return Action(RecommendationAction.setInfo, payload: data); + } + + static Action cellTap(VideoListResult data) { + return Action(RecommendationAction.cellTap, payload: data); + } + + static Action setDetail(MovieDetailModel detail) { + return Action(RecommendationAction.setDetail, payload: detail); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/recommendation_component/component.dart b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/component.dart new file mode 100644 index 00000000..5233a66d --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/component.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class RecommendationComponent extends Component { + RecommendationComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/recommendation_component/effect.dart b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/effect.dart new file mode 100644 index 00000000..c612e20e --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/effect.dart @@ -0,0 +1,66 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/animation.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/action.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + RecommendationAction.action: _onAction, + RecommendationAction.cellTap: _cellTap, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _cellTap(Action action, Context ctx) async { + final VideoListResult _movie = action.payload; + ctx.state.controller.animateTo(0.0, + duration: Duration(milliseconds: 300), curve: Curves.ease); + ctx.dispatch(RecommendationActionCreator.setInfo(_movie)); + BaseApi.instance.getMovieStreamLinks(_movie.id).then((value) async { + if (value.success) { + MovieStreamLinks _result = value.result; + MovieStreamLink _link; + List _lists = _result.list; + if (value.result.list.length > 0) { + final _pre = await SharedPreferences.getInstance(); + if (_pre.containsKey('defaultVideoLanguage')) { + final _defaultVideoLanguage = _pre.getString('defaultVideoLanguage'); + final _languageList = _lists + .where((e) => e.language.code == _defaultVideoLanguage) + .toList(); + if (_languageList.length > 0) { + for (var d in _languageList) _result.list.remove(d); + _result.list.insertAll(0, _languageList); + } + } + if (_pre.containsKey('preferHost')) { + final _preferHost = _pre.getString('preferHost'); + final _hostList = + _lists.where((e) => e.streamLink.contains(_preferHost)).toList(); + if (_hostList.length > 0) { + for (var d in _hostList) _result.list.remove(d); + _result.list.insertAll(0, _hostList); + } + } + _link = _result.list.first; + } + ctx.dispatch( + MovieLiveStreamActionCreator.setStreamLink(value.result, _link)); + } + }); + final _tmdb = TMDBApi.instance; + _tmdb + .getMovieDetail(_movie.id, appendtoresponse: 'recommendations,credits') + .then((d) { + if (d.success) + ctx.dispatch(RecommendationActionCreator.setDetail(d.result)); + }); + ctx.dispatch(MovieLiveStreamActionCreator.getLike()); + ctx.dispatch(MovieLiveStreamActionCreator.getComment()); +} diff --git a/lib/views/stream_link/movie_livestream_page/components/recommendation_component/reducer.dart b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/reducer.dart new file mode 100644 index 00000000..0aeceb4f --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/reducer.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/models/video_list.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + RecommendationAction.action: _onAction, + RecommendationAction.setInfo: _setInfo, + RecommendationAction.setDetail: _setDetail + }, + ); +} + +RecommendationState _onAction(RecommendationState state, Action action) { + final RecommendationState newState = state.clone(); + return newState; +} + +RecommendationState _setInfo(RecommendationState state, Action action) { + final VideoListResult _data = action.payload; + final RecommendationState newState = state.clone(); + if (_data != null) { + newState.movieId = _data.id; + newState.name = _data.title; + newState.background = _data.backdropPath; + newState.overview = _data.overview; + } + return newState; +} + +RecommendationState _setDetail(RecommendationState state, Action action) { + final MovieDetailModel _data = action.payload; + final RecommendationState newState = state.clone(); + if (_data != null) newState.detail = _data; + return newState; +} diff --git a/lib/views/stream_link/movie_livestream_page/components/recommendation_component/state.dart b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/state.dart new file mode 100644 index 00000000..3f04c065 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/state.dart @@ -0,0 +1,48 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/state.dart'; + +class RecommendationState implements Cloneable { + int movieId; + String name; + String background; + String overview; + MovieDetailModel detail; + ScrollController controller; + + @override + RecommendationState clone() { + return RecommendationState() + ..detail = detail + ..movieId = movieId + ..name = name + ..background = background + ..overview = overview + ..controller = controller; + } +} + +class RecommendationConnector + extends ConnOp { + @override + RecommendationState get(MovieLiveStreamState state) { + RecommendationState mstate = RecommendationState(); + mstate.detail = state.detail; + mstate.movieId = state.movieId; + mstate.background = state.background; + mstate.name = state.name; + mstate.overview = state.overview; + mstate.controller = state.scrollController; + return mstate; + } + + @override + void set(MovieLiveStreamState state, RecommendationState subState) { + state.detail = subState.detail; + state.name = subState.name; + state.background = subState.background; + state.movieId = subState.movieId; + state.overview = subState.overview; + } +} diff --git a/lib/views/stream_link/movie_livestream_page/components/recommendation_component/view.dart b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/view.dart new file mode 100644 index 00000000..1aa63cfc --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/components/recommendation_component/view.dart @@ -0,0 +1,97 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/widgets/linear_progress_Indicator.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + RecommendationState state, Dispatch dispatch, ViewService viewService) { + return _RecommendationList( + onTap: (d) => dispatch(RecommendationActionCreator.cellTap(d)), + recommendations: state.detail?.recommendations?.results ?? [], + ); +} + +class _RecommendationList extends StatelessWidget { + final List recommendations; + + final Function(VideoListResult) onTap; + const _RecommendationList({this.recommendations, this.onTap}); + @override + Widget build(BuildContext context) { + return SliverList( + delegate: SliverChildBuilderDelegate((_, index) { + return _RecommendationCell( + data: recommendations[index], + onTap: onTap, + ); + }, childCount: recommendations.length), + ); + } +} + +class _RecommendationCell extends StatelessWidget { + final VideoListResult data; + final Function(VideoListResult) onTap; + const _RecommendationCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(data), + child: Padding( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + child: Row( + children: [ + Container( + width: Adapt.px(220), + height: Adapt.px(122), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.backdropPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(width: Adapt.px(20)), + SizedBox( + width: Adapt.screenW() - Adapt.px(320), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${data.title}', + style: TextStyle(fontSize: Adapt.px(26)), + ), + const SizedBox(height: 6), + Row(children: [ + LinearGradientProgressIndicator( + value: data.voteAverage / 10), + const SizedBox(width: 6), + Text( + data.voteAverage.toStringAsFixed(1), + style: TextStyle( + fontSize: Adapt.px(20), + color: const Color(0xFF717171)), + ) + ]) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/views/stream_link/movie_livestream_page/effect.dart b/lib/views/stream_link/movie_livestream_page/effect.dart new file mode 100644 index 00000000..6532740c --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/effect.dart @@ -0,0 +1,78 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MovieLiveStreamAction.action: _onAction, + MovieLiveStreamAction.getLike: _getLike, + MovieLiveStreamAction.getComment: _getComment, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + ctx.state.scrollController = ScrollController(); + + BaseApi.instance.getMovieStreamLinks(ctx.state.movieId).then((value) async { + if (value.success) { + MovieStreamLinks _result = value.result; + MovieStreamLink _link; + List _lists = _result.list; + if (value.result.list.length > 0) { + final _pre = await SharedPreferences.getInstance(); + if (_pre.containsKey('defaultVideoLanguage')) { + final _defaultVideoLanguage = _pre.getString('defaultVideoLanguage'); + final _languageList = _lists + .where((e) => e.language.code == _defaultVideoLanguage) + .toList(); + if (_languageList.length > 0) { + for (var d in _languageList) _result.list.remove(d); + _result.list.insertAll(0, _languageList); + } + } + if (_pre.containsKey('preferHost')) { + final _preferHost = _pre.getString('preferHost'); + final _hostList = + _lists.where((e) => e.streamLink.contains(_preferHost)).toList(); + if (_hostList.length > 0) { + for (var d in _hostList) _result.list.remove(d); + _result.list.insertAll(0, _hostList); + } + } + _link = _result.list.first; + } + ctx.dispatch(MovieLiveStreamActionCreator.setStreamLink(_result, _link)); + } else + ctx.dispatch(MovieLiveStreamActionCreator.setLoading(false)); + }); + await _getLike(action, ctx); + await _getComment(action, ctx); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.scrollController.dispose(); +} + +Future _getComment(Action action, Context ctx) async { + final _comment = await BaseApi.instance.getMovieComments(ctx.state.movieId); + if (_comment.success) + ctx.dispatch(MovieLiveStreamActionCreator.setComment(_comment.result)); +} + +Future _getLike(Action action, Context ctx) async { + final _user = GlobalStore.store.getState().user; + final _like = await BaseApi.instance.getMovieLikes( + movieid: ctx.state.movieId, uid: _user?.firebaseUser?.uid ?? ''); + if (_like.success) + ctx.dispatch(MovieLiveStreamActionCreator.setLike( + _like.result['likes'], _like.result['userLike'])); +} diff --git a/lib/views/stream_link/movie_livestream_page/page.dart b/lib/views/stream_link/movie_livestream_page/page.dart new file mode 100644 index 00000000..a9480fb6 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/page.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/bottom_panel_component/component.dart'; +import 'components/bottom_panel_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/player_component/component.dart'; +import 'components/player_component/state.dart'; +import 'components/recommendation_component/component.dart'; +import 'components/recommendation_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MovieLiveStreamPage + extends Page> { + MovieLiveStreamPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + shouldUpdate: (o, n) { + return o.detail != n.detail || o.movieId != n.movieId; + }, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'player': PlayerConnector() + PlayerComponent(), + 'header': HeaderConnector() + HeaderComponent(), + 'recommendation': + RecommendationConnector() + RecommendationComponent(), + 'bottomPanel': BottomPanelConnector() + BottomPanelComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/stream_link/movie_livestream_page/reducer.dart b/lib/views/stream_link/movie_livestream_page/reducer.dart new file mode 100644 index 00000000..0777a907 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/reducer.dart @@ -0,0 +1,64 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MovieLiveStreamAction.action: _onAction, + MovieLiveStreamAction.selectedStreamLink: _selectedStreamLink, + MovieLiveStreamAction.setComment: _setComment, + MovieLiveStreamAction.setLike: _setLike, + MovieLiveStreamAction.setStreamLink: _setStreamLink, + MovieLiveStreamAction.setLoading: _setLoading + }, + ); +} + +MovieLiveStreamState _onAction(MovieLiveStreamState state, Action action) { + final MovieLiveStreamState newState = state.clone(); + return newState; +} + +MovieLiveStreamState _setComment(MovieLiveStreamState state, Action action) { + final _comments = action.payload; + final MovieLiveStreamState newState = state.clone(); + newState.bottomPanelState.commentState.comments = _comments; + return newState; +} + +MovieLiveStreamState _setLike(MovieLiveStreamState state, Action action) { + final int _count = action.payload[0] ?? 0; + final bool _like = action.payload[1] ?? false; + final MovieLiveStreamState newState = state.clone(); + newState.bottomPanelState.likeCount = _count; + newState.bottomPanelState.userLiked = _like; + return newState; +} + +MovieLiveStreamState _setStreamLink(MovieLiveStreamState state, Action action) { + final MovieStreamLinks _streamLinks = action.payload[0]; + final MovieStreamLink _link = action.payload[1]; + final MovieLiveStreamState newState = state.clone(); + newState.selectedLink = _link; + newState.streamLinks = _streamLinks; + newState.loading = false; + return newState; +} + +MovieLiveStreamState _selectedStreamLink( + MovieLiveStreamState state, Action action) { + final MovieStreamLink _link = action.payload; + final MovieLiveStreamState newState = state.clone(); + newState.selectedLink = _link; + return newState; +} + +MovieLiveStreamState _setLoading(MovieLiveStreamState state, Action action) { + final bool _loading = action.payload; + final MovieLiveStreamState newState = state.clone(); + newState.loading = _loading; + return newState; +} diff --git a/lib/views/stream_link/movie_livestream_page/state.dart b/lib/views/stream_link/movie_livestream_page/state.dart new file mode 100644 index 00000000..96326fbd --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/state.dart @@ -0,0 +1,76 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/base_api_model/movie_stream_link.dart'; +import 'package:movie/models/movie_detail.dart'; +import 'package:movie/views/stream_link/movie_livestream_page/components/bottom_panel_component/components/streamlink_filter_component/state.dart'; +import 'package:movie/widgets/overlay_entry_manage.dart'; + +import 'components/bottom_panel_component/components/comment_component/state.dart'; +import 'components/bottom_panel_component/state.dart'; +import 'components/player_component/state.dart'; + +class MovieLiveStreamState + implements GlobalBaseState, Cloneable { + int movieId; + String name; + String background; + String overview; + bool loading; + MovieDetailModel detail; + MovieStreamLinks streamLinks; + MovieStreamLink selectedLink; + ScrollController scrollController; + PlayerState playerState; + BottomPanelState bottomPanelState; + @override + MovieLiveStreamState clone() { + return MovieLiveStreamState() + ..movieId = movieId + ..name = name + ..overview = overview + ..background = background + ..loading = loading + ..detail = detail + ..streamLinks = streamLinks + ..selectedLink = selectedLink + ..scrollController = scrollController + ..playerState = playerState + ..bottomPanelState = bottomPanelState + ..user = user; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +MovieLiveStreamState initState(Map args) { + MovieLiveStreamState state = MovieLiveStreamState(); + state.detail = args['detail']; + if (state.detail != null) { + state.movieId = state.detail.id; + state.name = state.detail.title; + state.overview = state.detail.overview; + state.background = state.detail.backdropPath; + } + state.bottomPanelState = BottomPanelState() + ..overlayStateKey = GlobalKey() + ..movieId = state.movieId + ..useVideoSourceApi = true + ..streamInBrowser = false + ..commentState = CommentState() + ..streamLinkFilterState = StreamLinkFilterState( + overlayStateKey: GlobalKey()) + ..likeCount = 0 + ..userLiked = false; + state.playerState = PlayerState()..background = state.background; + state.loading = true; + return state; +} diff --git a/lib/views/stream_link/movie_livestream_page/view.dart b/lib/views/stream_link/movie_livestream_page/view.dart new file mode 100644 index 00000000..b30e5013 --- /dev/null +++ b/lib/views/stream_link/movie_livestream_page/view.dart @@ -0,0 +1,71 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + MovieLiveStreamState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + + return Scaffold( + backgroundColor: _theme.backgroundColor, + body: AnnotatedRegion( + value: _theme.brightness == Brightness.light + ? SystemUiOverlayStyle.dark + : SystemUiOverlayStyle.light, + child: Stack( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: CustomScrollView( + controller: state.scrollController, + slivers: [ + SliverToBoxAdapter( + child: + SizedBox(height: Adapt.px(30) + Adapt.padTopH())), + viewService.buildComponent('player'), + viewService.buildComponent('header'), + const _RecommendationTitle(), + viewService.buildComponent('recommendation'), + const SliverToBoxAdapter( + child: const SizedBox(height: 100)), + ], + ), + ), + Container( + color: _theme.backgroundColor, + height: Adapt.padTopH(), + ), + viewService.buildComponent('bottomPanel'), + ], + ), + ), + ); + }, + ); +} + +class _RecommendationTitle extends StatelessWidget { + const _RecommendationTitle(); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Padding( + padding: + EdgeInsetsDirectional.only(top: Adapt.px(40), bottom: Adapt.px(30)), + child: Text( + 'Recommendations', + style: TextStyle( + fontSize: Adapt.px(30), + fontWeight: FontWeight.w600, + ), + ), + ), + ); + } +} diff --git a/lib/views/stream_link/season_link_page/action.dart b/lib/views/stream_link/season_link_page/action.dart new file mode 100644 index 00000000..e07ed77b --- /dev/null +++ b/lib/views/stream_link/season_link_page/action.dart @@ -0,0 +1,29 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/models/tvshow_detail.dart'; + +enum SeasonLinkPageAction { + action, + getSeasonDetial, + updateSeason, + episodeCellTapped +} + +class SeasonLinkPageActionCreator { + static Action onAction() { + return const Action(SeasonLinkPageAction.action); + } + + static Action getSeasonDetial(Season d) { + return Action(SeasonLinkPageAction.getSeasonDetial, payload: d); + } + + static Action updateSeason(TVDetailModel d) { + return Action(SeasonLinkPageAction.updateSeason, payload: d); + } + + static Action onEpisodeCellTapped(Episode d) { + return Action(SeasonLinkPageAction.episodeCellTapped, payload: d); + } +} diff --git a/lib/views/stream_link/season_link_page/adapter.dart b/lib/views/stream_link/season_link_page/adapter.dart new file mode 100644 index 00000000..f8d61692 --- /dev/null +++ b/lib/views/stream_link/season_link_page/adapter.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/episodelist_component/component.dart'; +import 'state.dart'; + +class TabViewAdapter extends SourceFlowAdapter { + TabViewAdapter() + : super( + pool: >{ + 'listview': EpisodeListComponent(), + }, + ); +} diff --git a/lib/views/stream_link/season_link_page/components/appbar_component/action.dart b/lib/views/stream_link/season_link_page/components/appbar_component/action.dart new file mode 100644 index 00000000..83763805 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/appbar_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum AppBarAction { action } + +class AppBarActionCreator { + static Action onAction() { + return const Action(AppBarAction.action); + } +} diff --git a/lib/views/stream_link/season_link_page/components/appbar_component/component.dart b/lib/views/stream_link/season_link_page/components/appbar_component/component.dart new file mode 100644 index 00000000..eed8e2c2 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/appbar_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class AppBarComponent extends Component { + AppBarComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.animationController != + newState.animationController || + oldState.backdropPath != newState.backdropPath; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/season_link_page/components/appbar_component/effect.dart b/lib/views/stream_link/season_link_page/components/appbar_component/effect.dart new file mode 100644 index 00000000..e36d58dc --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/appbar_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + AppBarAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/stream_link/season_link_page/components/appbar_component/state.dart b/lib/views/stream_link/season_link_page/components/appbar_component/state.dart new file mode 100644 index 00000000..8d5d2d8c --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/appbar_component/state.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/views/stream_link/season_link_page/state.dart'; + +class AppBarState implements Cloneable { + String backdropPath; + AnimationController animationController; + @override + AppBarState clone() { + return AppBarState(); + } +} + +class AppBarConnector extends ConnOp { + @override + AppBarState get(SeasonLinkPageState state) { + AppBarState mstate = AppBarState(); + mstate.backdropPath = state.detail?.backdropPath; + mstate.animationController = state.animationController; + return mstate; + } +} diff --git a/lib/views/stream_link/season_link_page/components/appbar_component/view.dart b/lib/views/stream_link/season_link_page/components/appbar_component/view.dart new file mode 100644 index 00000000..9073243c --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/appbar_component/view.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + AppBarState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + + return SliverAppBar( + expandedHeight: Adapt.px(400), + pinned: true, + centerTitle: true, + stretch: true, + backgroundColor: const Color(0xFFA0BBCC), + flexibleSpace: Stack(fit: StackFit.expand, children: [ + Container( + alignment: Alignment.bottomLeft, + padding: EdgeInsets.only(left: Adapt.px(60), bottom: Adapt.px(20)), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(state.backdropPath, ImageSize.w500)))), + child: SlideTransition( + position: Tween(begin: Offset.zero, end: Offset(1.6, 0)) + .animate(state.animationController), + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(35)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + color: Colors.white.withOpacity(.1), + alignment: Alignment.centerLeft, + width: Adapt.px(250), + height: Adapt.px(70), + child: Row( + children: [ + Container( + height: Adapt.px(70), + width: Adapt.px(70), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _theme.backgroundColor), + child: Icon(Icons.play_arrow), + ), + SizedBox(width: Adapt.px(20)), + const Text( + 'Play Latest', + style: TextStyle(color: Colors.white), + ) + ], + ), + ), + ), + )), + ), + ]), + ); +} diff --git a/lib/views/stream_link/season_link_page/components/episode_component/action.dart b/lib/views/stream_link/season_link_page/components/episode_component/action.dart new file mode 100644 index 00000000..cb1ed391 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episode_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum EpisodeAction { action } + +class EpisodeActionCreator { + static Action onAction() { + return const Action(EpisodeAction.action); + } +} diff --git a/lib/views/stream_link/season_link_page/components/episode_component/component.dart b/lib/views/stream_link/season_link_page/components/episode_component/component.dart new file mode 100644 index 00000000..6d0c044d --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episode_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class EpisodeComponent extends Component { + EpisodeComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.episode != newState.episode || + oldState.playState != newState.playState; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/season_link_page/components/episode_component/effect.dart b/lib/views/stream_link/season_link_page/components/episode_component/effect.dart new file mode 100644 index 00000000..ee7d6f9d --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episode_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + EpisodeAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/stream_link/season_link_page/components/episode_component/reducer.dart b/lib/views/stream_link/season_link_page/components/episode_component/reducer.dart new file mode 100644 index 00000000..d8ec43bb --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episode_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + EpisodeAction.action: _onAction, + }, + ); +} + +EpisodeState _onAction(EpisodeState state, Action action) { + final EpisodeState newState = state.clone(); + return newState; +} diff --git a/lib/views/stream_link/season_link_page/components/episode_component/state.dart b/lib/views/stream_link/season_link_page/components/episode_component/state.dart new file mode 100644 index 00000000..690ae5ed --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episode_component/state.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; + +class EpisodeState implements Cloneable { + Episode episode; + bool playState; + + EpisodeState({this.episode, this.playState}); + @override + EpisodeState clone() { + return EpisodeState(); + } +} + +EpisodeState initState(Map args) { + return EpisodeState(); +} diff --git a/lib/views/stream_link/season_link_page/components/episode_component/view.dart b/lib/views/stream_link/season_link_page/components/episode_component/view.dart new file mode 100644 index 00000000..1f8ce618 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episode_component/view.dart @@ -0,0 +1,89 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/stream_link/season_link_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + EpisodeState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + + return InkWell( + key: ValueKey('Episode${state.episode.id}'), + onTap: () => dispatch( + SeasonLinkPageActionCreator.onEpisodeCellTapped(state.episode)), + child: Padding( + padding: EdgeInsets.symmetric(vertical: Adapt.px(8)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + clipBehavior: Clip.antiAlias, + children: [ + Container( + width: Adapt.px(220), + height: Adapt.px(130), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(10)), + color: _theme.primaryColorDark, + image: DecorationImage( + colorFilter: state.episode.streamLink == null + ? ColorFilter.mode(Colors.grey, BlendMode.color) + : null, + fit: BoxFit.cover, + image: CachedNetworkImageProvider(ImageUrl.getUrl( + state.episode.stillPath, ImageSize.w300)))), + ), + state.episode.streamLink != null && !state.episode.playState + ? Positioned( + top: -5, + right: -5, + child: Container( + width: Adapt.px(25), + height: Adapt.px(25), + //transform: Matrix4.translationValues(Adapt.px(204), -Adapt.px(8), 0), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all(color: Colors.white, width: 2), + color: Colors.orangeAccent), + )) + : const SizedBox() + ], + ), + SizedBox(width: Adapt.px(20)), + Container( + width: Adapt.screenW() - Adapt.px(300), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich( + TextSpan(children: [ + TextSpan( + text: '${state.episode.episodeNumber}. ', + style: TextStyle(fontSize: Adapt.px(28))), + TextSpan( + text: '${state.episode.name}', + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w800)), + ]), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + SizedBox(height: Adapt.px(5)), + Text( + '${state.episode.overview}', + maxLines: 3, + overflow: TextOverflow.ellipsis, + ) + ], + )) + ], + ), + )); +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/action.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/action.dart new file mode 100644 index 00000000..48d651ac --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/action.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/season_detail.dart'; + +enum EpisodeListAction { + action, + episodeCellTapped, + updateSeason, +} + +class EpisodeListActionCreator { + static Action onAction() { + return const Action(EpisodeListAction.action); + } + + static Action updateSeason(Season d) { + return Action(EpisodeListAction.updateSeason, payload: d); + } + + static Action onEpisodeCellTapped(Episode d) { + return Action(EpisodeListAction.episodeCellTapped, payload: d); + } +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/adapter.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/adapter.dart new file mode 100644 index 00000000..0b0362cf --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/adapter.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/stream_link/season_link_page/components/episode_component/component.dart'; +import 'state.dart'; + +class EpisodeListAdapter extends SourceFlowAdapter { + EpisodeListAdapter() + : super( + pool: >{ + 'episode': EpisodeComponent(), + }, + ); +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/component.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/component.dart new file mode 100644 index 00000000..361aff45 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/component.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'adapter.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class EpisodeListComponent extends Component { + EpisodeListComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.episodes != newState.episodes || + oldState.season != newState.season || + oldState.season.playStates != newState.season.playStates; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + EpisodeListAdapter(), + slots: >{}), + ); +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/effect.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/effect.dart new file mode 100644 index 00000000..d4e2153a --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/effect.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/episode_model.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + EpisodeListAction.action: _onAction, + EpisodeListAction.episodeCellTapped: _onEpisodeCellTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onEpisodeCellTapped(Action action, Context ctx) async { + final _episode = action.payload as Episode; + final _season = ctx.state.season; + if (_episode.streamLink != null) { + final index = _season.episodes.indexOf(_episode); + if (_season.playStates[index] != '1') { + _season.playStates[index] = '1'; + _episode.playState = true; + ctx.state.preferences + .setStringList('TvSeason${_season.id}', _season.playStates) + .then((d) { + if (d) ctx.dispatch(EpisodeListActionCreator.updateSeason(_season)); + }); + } + await Navigator.of(ctx.context) + .pushNamed('tvShowLiveStreamPage', arguments: { + 'tvid': ctx.state.tvid, + 'name': ctx.state.name, + 'season': _season, + 'episode': _episode, + }); + } +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/reducer.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/reducer.dart new file mode 100644 index 00000000..7c04c634 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/season_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + EpisodeListAction.action: _onAction, + EpisodeListAction.updateSeason: _updateSeason + }, + ); +} + +EpisodeListState _onAction(EpisodeListState state, Action action) { + final EpisodeListState newState = state.clone(); + return newState; +} + +EpisodeListState _updateSeason(EpisodeListState state, Action action) { + final Season _season = action.payload; + final EpisodeListState newState = state.clone(); + newState.season = _season; + return newState; +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/state.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/state.dart new file mode 100644 index 00000000..dceaef78 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/state.dart @@ -0,0 +1,47 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/views/stream_link/season_link_page/components/episode_component/state.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class EpisodeListState extends MutableSource + implements Cloneable { + Season season; + List episodes; + int tvid; + String name; + + SharedPreferences preferences; + EpisodeListState( + {this.episodes, this.season, this.preferences, this.tvid, this.name}); + @override + EpisodeListState clone() { + return EpisodeListState() + ..episodes = episodes + ..season = season + ..tvid = tvid + ..name = name + ..preferences = preferences; + } + + EpisodeListState initState(Map args) { + var state = EpisodeListState(); + return state; + } + + @override + Object getItemData(int index) => EpisodeState( + episode: episodes[index], playState: episodes[index].playState); + + @override + String getItemType(int index) => 'episode'; + + @override + int get itemCount => episodes?.length ?? 0; + + @override + void setItemData(int index, Object data) { + EpisodeState _e = data; + episodes[index] = _e.episode; + } +} diff --git a/lib/views/stream_link/season_link_page/components/episodelist_component/view.dart b/lib/views/stream_link/season_link_page/components/episodelist_component/view.dart new file mode 100644 index 00000000..bfb7bad6 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/episodelist_component/view.dart @@ -0,0 +1,92 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + EpisodeListState state, Dispatch dispatch, ViewService viewService) { + final _adapter = viewService.buildAdapter(); + + return state.episodes != null + ? MediaQuery.removePadding( + context: viewService.context, + removeTop: true, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + itemCount: _adapter.itemCount, + separatorBuilder: (_, __) => SizedBox( + height: Adapt.px(14), + ), + itemBuilder: _adapter.itemBuilder, + )) + : const _ShimmerTabview(); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final _color = Colors.grey[300]; + final _rightWdith = Adapt.screenW() - Adapt.px(300); + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(220), + height: Adapt.px(130), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(10)), + color: _color, + ), + ), + SizedBox(width: Adapt.px(20)), + Container( + width: Adapt.screenW() - Adapt.px(300), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: _color, width: Adapt.px(200), height: Adapt.px(30)), + SizedBox(height: Adapt.px(10)), + Container( + color: _color, width: _rightWdith, height: Adapt.px(20)), + SizedBox(height: Adapt.px(10)), + Container( + color: _color, width: _rightWdith, height: Adapt.px(20)), + SizedBox(height: Adapt.px(10)), + Container( + color: _color, width: Adapt.px(400), height: Adapt.px(20)), + ], + )) + ], + ); + } +} + +class _ShimmerTabview extends StatelessWidget { + const _ShimmerTabview(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView( + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + children: [ + const _ShimmerCell(), + SizedBox(height: Adapt.px(30)), + const _ShimmerCell(), + SizedBox(height: Adapt.px(30)), + const _ShimmerCell(), + SizedBox(height: Adapt.px(30)), + const _ShimmerCell() + ], + ), + ); + } +} diff --git a/lib/views/stream_link/season_link_page/components/header_component/action.dart b/lib/views/stream_link/season_link_page/components/header_component/action.dart new file mode 100644 index 00000000..13544d73 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/header_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum HeaderAction { action } + +class HeaderActionCreator { + static Action onAction() { + return const Action(HeaderAction.action); + } +} diff --git a/lib/views/stream_link/season_link_page/components/header_component/component.dart b/lib/views/stream_link/season_link_page/components/header_component/component.dart new file mode 100644 index 00000000..d36a3770 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/header_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.name != newState.name || + oldState.genres != newState.genres || + oldState.posterPath != newState.posterPath || + oldState.overview != newState.overview; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/season_link_page/components/header_component/effect.dart b/lib/views/stream_link/season_link_page/components/header_component/effect.dart new file mode 100644 index 00000000..ef23ed69 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/header_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HeaderAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/stream_link/season_link_page/components/header_component/state.dart b/lib/views/stream_link/season_link_page/components/header_component/state.dart new file mode 100644 index 00000000..eb85cc26 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/header_component/state.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/views/stream_link/season_link_page/state.dart'; + +class HeaderState implements Cloneable { + String name; + List genres; + String posterPath; + String overview; + @override + HeaderState clone() { + return HeaderState(); + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(SeasonLinkPageState state) { + HeaderState mstate = HeaderState(); + mstate.name = state.detail?.name ?? ''; + mstate.posterPath = state.detail?.posterPath; + mstate.overview = state.detail?.overview ?? ''; + mstate.genres = state.detail?.genres ?? []; + return mstate; + } +} diff --git a/lib/views/stream_link/season_link_page/components/header_component/view.dart b/lib/views/stream_link/season_link_page/components/header_component/view.dart new file mode 100644 index 00000000..3221072e --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/header_component/view.dart @@ -0,0 +1,86 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + return SliverToBoxAdapter( + key: ValueKey('header'), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(30), vertical: Adapt.px(50)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(state.genres.map((f) => f.name).join(' , ')), + SizedBox(height: Adapt.px(5)), + Text( + state.name, + style: + TextStyle(fontWeight: FontWeight.w700, fontSize: Adapt.px(55)), + ), + SizedBox(height: Adapt.px(30)), + _HeaderInfo( + overview: state.overview, + posterPath: state.posterPath, + ), + ], + ), + ), + ); +} + +class _HeaderInfo extends StatelessWidget { + final String overview; + final String posterPath; + const _HeaderInfo({this.overview, this.posterPath}); + @override + Widget build(BuildContext context) { + final MediaQueryData _mediaQuery = MediaQuery.of(context); + final ThemeData _theme = ThemeStyle.getTheme(context); + return Container( + height: Adapt.px(160), + decoration: BoxDecoration( + color: _mediaQuery.platformBrightness == Brightness.light + ? Color(0xFFF6F5FA) + : _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + ), + padding: EdgeInsets.all(Adapt.px(25)), + child: Row( + children: [ + Container( + width: Adapt.px(110), + height: Adapt.px(110), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(15)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(posterPath, ImageSize.w200), + ), + ), + ), + ), + SizedBox(width: Adapt.px(25)), + SizedBox( + width: Adapt.screenW() - Adapt.px(265), + child: Text( + overview, + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: Adapt.px(28)), + ), + ) + ], + ), + ); + } +} diff --git a/lib/views/stream_link/season_link_page/components/tabbar_component/action.dart b/lib/views/stream_link/season_link_page/components/tabbar_component/action.dart new file mode 100644 index 00000000..4cedf0a6 --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/tabbar_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TabbarAction { action } + +class TabbarActionCreator { + static Action onAction() { + return const Action(TabbarAction.action); + } +} diff --git a/lib/views/stream_link/season_link_page/components/tabbar_component/component.dart b/lib/views/stream_link/season_link_page/components/tabbar_component/component.dart new file mode 100644 index 00000000..a3fb60fe --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/tabbar_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'state.dart'; +import 'view.dart'; + +class TabbarComponent extends Component { + TabbarComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.tabController != newState.tabController || + oldState.seasons != newState.seasons; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/stream_link/season_link_page/components/tabbar_component/effect.dart b/lib/views/stream_link/season_link_page/components/tabbar_component/effect.dart new file mode 100644 index 00000000..b358751a --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/tabbar_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TabbarAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/stream_link/season_link_page/components/tabbar_component/state.dart b/lib/views/stream_link/season_link_page/components/tabbar_component/state.dart new file mode 100644 index 00000000..a418a7dc --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/tabbar_component/state.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/views/stream_link/season_link_page/state.dart'; + +class TabbarState implements Cloneable { + TabController tabController; + List seasons; + @override + TabbarState clone() { + return TabbarState(); + } +} + +class TabbarConnector extends ConnOp { + @override + TabbarState get(SeasonLinkPageState state) { + TabbarState mstate = TabbarState(); + mstate.tabController = state.tabController; + mstate.seasons = state.detail?.seasons ?? []; + return mstate; + } +} diff --git a/lib/views/stream_link/season_link_page/components/tabbar_component/view.dart b/lib/views/stream_link/season_link_page/components/tabbar_component/view.dart new file mode 100644 index 00000000..036a9ead --- /dev/null +++ b/lib/views/stream_link/season_link_page/components/tabbar_component/view.dart @@ -0,0 +1,36 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/sliverappbar_delegate.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'state.dart'; + +Widget buildView( + TabbarState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + final _season = state.seasons.reversed.toList(); + + return SliverPersistentHeader( + pinned: true, + delegate: SliverAppBarDelegate( + maxHeight: Adapt.px(100), + minHeight: Adapt.px(100), + child: Container( + color: _theme.backgroundColor, + child: TabBar( + isScrollable: true, + controller: state.tabController, + labelColor: _theme.tabBarTheme.labelColor, + indicatorColor: Colors.transparent, + unselectedLabelColor: Colors.grey, + labelStyle: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + unselectedLabelStyle: TextStyle( + fontSize: Adapt.px(35), fontWeight: FontWeight.bold), + tabs: _season.map((f) { + return Tab(text: f.name); + }).toList(), + ))), + ); +} diff --git a/lib/views/stream_link/season_link_page/effect.dart b/lib/views/stream_link/season_link_page/effect.dart new file mode 100644 index 00000000..3da2ef24 --- /dev/null +++ b/lib/views/stream_link/season_link_page/effect.dart @@ -0,0 +1,137 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/models/episode_model.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/views/stream_link/episode_livestream_page/page.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SeasonLinkPageAction.action: _onAction, + SeasonLinkPageAction.getSeasonDetial: _getSeasonDetail, + SeasonLinkPageAction.episodeCellTapped: _onEpisodeCellTapped, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + final _seasons = ctx.state.detail.seasons.reversed.toList(); + final Object ticker = ctx.stfState; + ctx.state.tabController = TabController( + vsync: ticker, + initialIndex: 0, + length: ctx.state.detail?.seasons?.length ?? 0) + ..addListener(() { + if (!ctx.state.tabController.indexIsChanging) { + ctx.dispatch(SeasonLinkPageActionCreator.getSeasonDetial( + _seasons[ctx.state.tabController.index])); + } + }); + ctx.state.animationController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 300)); + ctx.state.scrollController = ScrollController() + ..addListener(() { + if (ctx.state.scrollController.position.pixels >= 100 && + !ctx.state.animationController.isAnimating) + ctx.state.animationController.animateTo(1, curve: Curves.ease); + else if (ctx.state.scrollController.position.pixels < 100 && + !ctx.state.animationController.isAnimating) + ctx.state.animationController.animateTo(0, curve: Curves.ease); + }); + ctx.state.preferences = await SharedPreferences.getInstance(); + if (_seasons != null) + ctx.dispatch(SeasonLinkPageActionCreator.getSeasonDetial(_seasons[0])); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); + ctx.state.scrollController.dispose(); + ctx.state.tabController.dispose(); +} + +void _getSeasonDetail(Action action, Context ctx) async { + final Season season = action.payload; + if (season != null && season?.episodes == null) { + final _tmdb = TMDBApi.instance; + final _episode = await _tmdb.getTVSeasonDetail( + ctx.state.detail.id, season.seasonNumber, + appendToResponse: 'credits'); + if (_episode.success) { + List _playState = + ctx.state.preferences.getStringList('TvSeason${season.id}'); + season.playStates = + _playState ?? _episode.result.episodes.map((f) => '0').toList(); + season.episodes = _episode.result.episodes; + season.credits = _episode.result.credits; + + final _baseApi = BaseApi.instance; + final _streamLinks = await _baseApi.getTvSeasonStreamLinks( + ctx.state.detail.id, season.seasonNumber); + if (_streamLinks.success) + season.episodes.forEach((f) { + final index = season.episodes.indexOf(f); + f.streamLink = _streamLinks.result.list.firstWhere((d) { + return d.episode == f.episodeNumber; + }, orElse: () => null); + f.playState = season.playStates[index] == '0' ? false : true; + }); + ctx.dispatch(SeasonLinkPageActionCreator.updateSeason(ctx.state.detail)); + } + } +} + +void _onEpisodeCellTapped( + Action action, Context ctx) async { + final _episode = action.payload as Episode; + if (_episode.streamLink != null) { + Season _season = ctx.state.detail.seasons.singleWhere( + (s) => s.seasonNumber == _episode.seasonNumber, + orElse: () => null); + if (_season == null) return; + final index = _season.episodes.indexOf(_episode); + if (_season.playStates[index] != '1') { + _season.playStates[index] = '1'; + _episode.playState = true; + ctx.state.preferences + .setStringList('TvSeason${_season.id}', _season.playStates) + .then((d) { + if (d) + ctx.dispatch( + SeasonLinkPageActionCreator.updateSeason(ctx.state.detail)); + }); + } + await Navigator.of(ctx.context).push( + PageRouteBuilder( + transitionDuration: Duration(milliseconds: 500), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + final _curvedAnimation = + CurvedAnimation(parent: animation, curve: Curves.ease); + return SlideTransition( + position: Tween( + begin: Offset(0, 1), + end: Offset.zero, + ).animate(_curvedAnimation), + child: FadeTransition( + opacity: _curvedAnimation, + child: EpisodeLiveStreamPage().buildPage( + { + 'tvid': ctx.state.detail.id, + 'selectedEpisode': _episode, + 'season': _season + }, + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/views/stream_link/season_link_page/page.dart b/lib/views/stream_link/season_link_page/page.dart new file mode 100644 index 00000000..2dc52fc8 --- /dev/null +++ b/lib/views/stream_link/season_link_page/page.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'adapter.dart'; +import 'components/appbar_component/component.dart'; +import 'components/appbar_component/state.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/tabbar_component/component.dart'; +import 'components/tabbar_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SeasonLinkPage extends Page> + with TickerProviderMixin { + SeasonLinkPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + TabViewAdapter(), + slots: >{ + 'appBar': AppBarConnector() + AppBarComponent(), + 'header': HeaderConnector() + HeaderComponent(), + 'tabBar': TabbarConnector() + TabbarComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/stream_link/season_link_page/reducer.dart b/lib/views/stream_link/season_link_page/reducer.dart new file mode 100644 index 00000000..1e0eb883 --- /dev/null +++ b/lib/views/stream_link/season_link_page/reducer.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SeasonLinkPageAction.action: _onAction, + SeasonLinkPageAction.updateSeason: _updateSeason, + }, + ); +} + +SeasonLinkPageState _onAction(SeasonLinkPageState state, Action action) { + final SeasonLinkPageState newState = state.clone(); + return newState; +} + +SeasonLinkPageState _updateSeason(SeasonLinkPageState state, Action action) { + final TVDetailModel detail = action.payload; + final SeasonLinkPageState newState = state.clone(); + newState.detail = detail; + return newState; +} diff --git a/lib/views/stream_link/season_link_page/state.dart b/lib/views/stream_link/season_link_page/state.dart new file mode 100644 index 00000000..c6687a13 --- /dev/null +++ b/lib/views/stream_link/season_link_page/state.dart @@ -0,0 +1,55 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'components/episodelist_component/state.dart'; + +class SeasonLinkPageState extends MutableSource + implements Cloneable { + TVDetailModel detail; + ScrollController scrollController; + TabController tabController; + AnimationController animationController; + SharedPreferences preferences; + + @override + SeasonLinkPageState clone() { + return SeasonLinkPageState() + ..detail = detail + ..scrollController = scrollController + ..tabController = tabController + ..animationController = animationController + ..preferences = preferences; + } + + @override + Object getItemData(int index) { + final _seasons = detail.seasons.reversed.toList(); + return EpisodeListState( + episodes: _seasons[index].episodes, + season: _seasons[index], + preferences: preferences, + tvid: detail.id, + name: detail.name); + } + + @override + String getItemType(int index) => 'listview'; + + @override + int get itemCount => detail.seasons.length; + + @override + void setItemData(int index, Object data) { + int newindex = detail.seasons.length - index; + final EpisodeListState _e = data; + detail.seasons[newindex] = _e.season; + } +} + +SeasonLinkPageState initState(Map args) { + SeasonLinkPageState state = SeasonLinkPageState(); + state.detail = args['detail']; + return state; +} diff --git a/lib/views/stream_link/season_link_page/view.dart b/lib/views/stream_link/season_link_page/view.dart new file mode 100644 index 00000000..942dae94 --- /dev/null +++ b/lib/views/stream_link/season_link_page/view.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/style/themestyle.dart'; +import 'state.dart'; + +Widget buildView( + SeasonLinkPageState state, Dispatch dispatch, ViewService viewService) { + final _adapter = viewService.buildAdapter(); + return Builder( + builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + final _list = List(_adapter.itemCount).asMap().keys.map((k) { + return SizedBox( + key: Key('TabView${state.detail.seasons[k].id}'), + child: _adapter.itemBuilder(viewService.context, k)); + }).toList(); + return Scaffold( + backgroundColor: _theme.backgroundColor, + body: NestedScrollView( + controller: state.scrollController, + headerSliverBuilder: (context, bool) { + return [ + viewService.buildComponent('appBar'), + viewService.buildComponent('header'), + viewService.buildComponent('tabBar'), + ]; + }, + body: TabBarView(controller: state.tabController, children: _list), + ), + ); + }, + ); +} diff --git a/lib/views/test_page/action.dart b/lib/views/test_page/action.dart new file mode 100644 index 00000000..3915a12e --- /dev/null +++ b/lib/views/test_page/action.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; + +enum TestPageAction { action, setData, setData2 } + +class TestPageActionCreator { + static Action onAction() { + return const Action(TestPageAction.action); + } + + static Action setData(Stream d) { + return Action(TestPageAction.setData, payload: d); + } + + static Action setData2(Stream d) { + return Action(TestPageAction.setData2, payload: d); + } +} diff --git a/lib/views/test_page/components/test_component/action.dart b/lib/views/test_page/components/test_component/action.dart new file mode 100644 index 00000000..3bf33f89 --- /dev/null +++ b/lib/views/test_page/components/test_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TestAction { action } + +class TestActionCreator { + static Action onAction(int value) { + return Action(TestAction.action, payload: value); + } +} diff --git a/lib/views/test_page/components/test_component/component.dart b/lib/views/test_page/components/test_component/component.dart new file mode 100644 index 00000000..43323dcb --- /dev/null +++ b/lib/views/test_page/components/test_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TestComponent extends Component { + TestComponent() + : super( + shouldUpdate: (olditem, newitem) { + return newitem.value != olditem.value; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/test_page/components/test_component/effect.dart b/lib/views/test_page/components/test_component/effect.dart new file mode 100644 index 00000000..0d92e7cc --- /dev/null +++ b/lib/views/test_page/components/test_component/effect.dart @@ -0,0 +1,11 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TestAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) {} diff --git a/lib/views/test_page/components/test_component/reducer.dart b/lib/views/test_page/components/test_component/reducer.dart new file mode 100644 index 00000000..1e7772db --- /dev/null +++ b/lib/views/test_page/components/test_component/reducer.dart @@ -0,0 +1,18 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TestAction.action: _onAction, + }, + ); +} + +TestState _onAction(TestState state, Action action) { + final TestState newState = state.clone(); + newState.value = action.payload ?? 0; + return newState; +} diff --git a/lib/views/test_page/components/test_component/state.dart b/lib/views/test_page/components/test_component/state.dart new file mode 100644 index 00000000..de8e0d1f --- /dev/null +++ b/lib/views/test_page/components/test_component/state.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/test_page/state.dart'; + +class TestState implements Cloneable { + int value; + @override + TestState clone() { + return TestState()..value = value; + } +} + +class TestConnector extends ConnOp { + @override + TestState get(TestPageState state) { + TestState substate = new TestState(); + + return substate; + } + + @override + void set(TestPageState state, TestState subState) {} +} diff --git a/lib/views/test_page/components/test_component/view.dart b/lib/views/test_page/components/test_component/view.dart new file mode 100644 index 00000000..52d52d35 --- /dev/null +++ b/lib/views/test_page/components/test_component/view.dart @@ -0,0 +1,28 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/test_inherited_widget.dart'; + +import 'state.dart'; + +Widget buildView(TestState state, Dispatch dispatch, ViewService viewService) { + return Center( + child: Column( + children: [ + SizedBox(height: Adapt.px(200)), + Text( + '${TestInheritedWidget.of(viewService.context).counter.value}', + key: + ValueKey(TestInheritedWidget.of(viewService.context).counter.value), + ), + SizedBox(height: Adapt.px(100)), + FlatButton( + color: Colors.amber, + onPressed: () { + TestInheritedWidget.of(viewService.context).counter.value++; + }, + child: Text('add'), + ) + ], + )); +} diff --git a/lib/views/test_page/effect.dart b/lib/views/test_page/effect.dart new file mode 100644 index 00000000..84c39676 --- /dev/null +++ b/lib/views/test_page/effect.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/graphql_client.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TestPageAction.action: _onAction, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} +void _onInit(Action action, Context ctx) { + var res = BaseGraphQLClient.instance + .castListSubscription("WaViBxaJwEbRIzc0Jx3K4RM4fr02"); + ctx.dispatch(TestPageActionCreator.setData(res)); + + var res2 = BaseGraphQLClient.instance.tvShowCommentSubscription(1399); + ctx.dispatch(TestPageActionCreator.setData2(res2)); +} + +void _onDispose(Action action, Context ctx) {} diff --git a/lib/views/test_page/page.dart b/lib/views/test_page/page.dart new file mode 100644 index 00000000..1772a47c --- /dev/null +++ b/lib/views/test_page/page.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'components/test_component/component.dart'; +import 'components/test_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TestPage extends Page> { + TestPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'test': TestConnector() + TestComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/test_page/reducer.dart b/lib/views/test_page/reducer.dart new file mode 100644 index 00000000..7c5f7e28 --- /dev/null +++ b/lib/views/test_page/reducer.dart @@ -0,0 +1,33 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TestPageAction.action: _onAction, + TestPageAction.setData: _setData, + TestPageAction.setData2: _setData2 + }, + ); +} + +TestPageState _onAction(TestPageState state, Action action) { + final TestPageState newState = state.clone(); + return newState; +} + +TestPageState _setData(TestPageState state, Action action) { + final Stream d = action.payload; + final TestPageState newState = state.clone(); + newState.testData = d; + return newState; +} + +TestPageState _setData2(TestPageState state, Action action) { + final Stream d = action.payload; + final TestPageState newState = state.clone(); + newState.testData2 = d; + return newState; +} diff --git a/lib/views/test_page/state.dart b/lib/views/test_page/state.dart new file mode 100644 index 00000000..62ca9c53 --- /dev/null +++ b/lib/views/test_page/state.dart @@ -0,0 +1,33 @@ +import 'dart:ui'; + +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; + +class TestPageState implements GlobalBaseState, Cloneable { + Stream testData; + Stream testData2; + @override + TestPageState clone() { + return TestPageState() + ..testData = testData + ..testData2 = testData2 + ..themeColor = themeColor + ..locale = locale + ..user = user; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +TestPageState initState(Map args) { + return TestPageState(); +} diff --git a/lib/views/test_page/view.dart b/lib/views/test_page/view.dart new file mode 100644 index 00000000..086a2a67 --- /dev/null +++ b/lib/views/test_page/view.dart @@ -0,0 +1,50 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; + +import 'state.dart'; + +Widget buildView( + TestPageState state, Dispatch dispatch, ViewService viewService) { + return Scaffold( + backgroundColor: Color(0xFFF0F0F0), + appBar: AppBar( + backgroundColor: state.themeColor, + title: Text('${state?.locale?.languageCode}'), + ), + body: Column(children: [ + SizedBox( + height: 200, + child: StreamBuilder( + stream: state.testData2, + builder: (_, snapShot) { + switch (snapShot.connectionState) { + case ConnectionState.none: + case ConnectionState.waiting: + return Center(child: Text('waiting')); + case ConnectionState.active: + case ConnectionState.done: + print(snapShot.data); + return Center( + child: Text(snapShot.data?.data?.toString() ?? '')); + default: + return Center(child: Text('waiting')); + } + }, + ), + ), + ]), + ); +} + +class _StripeTest extends StatefulWidget { + @override + _StripeTestState createState() => _StripeTestState(); +} + +class _StripeTestState extends State<_StripeTest> { + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/views/trending_page/action.dart b/lib/views/trending_page/action.dart new file mode 100644 index 00000000..47802023 --- /dev/null +++ b/lib/views/trending_page/action.dart @@ -0,0 +1,38 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/search_result.dart'; + +enum TrendingPageAction { + action, + showFilter, + setMediaType, + updateList, + loadMore, + cellTapped +} + +class TrendingPageActionCreator { + static Action onAction() { + return const Action(TrendingPageAction.action); + } + + static Action showFilter() { + return const Action(TrendingPageAction.showFilter); + } + + static Action setMediaType(MediaType mediaType) { + return Action(TrendingPageAction.setMediaType, payload: mediaType); + } + + static Action updateList(SearchResultModel d) { + return Action(TrendingPageAction.updateList, payload: d); + } + + static Action loadMore(SearchResultModel d) { + return Action(TrendingPageAction.loadMore, payload: d); + } + + static Action cellTapped(SearchResult d) { + return Action(TrendingPageAction.cellTapped, payload: d); + } +} diff --git a/lib/views/trending_page/adpater/action.dart b/lib/views/trending_page/adpater/action.dart new file mode 100644 index 00000000..4b662c5a --- /dev/null +++ b/lib/views/trending_page/adpater/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TrendingAdapterAction { action } + +class TrendingAdapterActionCreator { + static Action onAction() { + return const Action(TrendingAdapterAction.action); + } +} diff --git a/lib/views/trending_page/adpater/adapter.dart b/lib/views/trending_page/adpater/adapter.dart new file mode 100644 index 00000000..4c8397c8 --- /dev/null +++ b/lib/views/trending_page/adpater/adapter.dart @@ -0,0 +1,15 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/trending_page/components/trendingcell_component/component.dart'; +import 'package:movie/views/trending_page/state.dart'; + +import 'reducer.dart'; + +class TrendingAdapter extends SourceFlowAdapter { + TrendingAdapter() + : super( + pool: >{ + 'trendingCell': TrendingCellComponent() + }, + reducer: buildReducer(), + ); +} diff --git a/lib/views/trending_page/adpater/reducer.dart b/lib/views/trending_page/adpater/reducer.dart new file mode 100644 index 00000000..63cfad1b --- /dev/null +++ b/lib/views/trending_page/adpater/reducer.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/views/trending_page/components/trendingcell_component/action.dart'; +import 'package:movie/views/trending_page/state.dart'; +import '../components/filter_component/action.dart' as fliter_action; +import 'action.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TrendingAdapterAction.action: _onAction, + fliter_action.FilterAction.updateList: _updateList, + TrendingCellAction.setLiked: _setLiked, + }, + ); +} + +TrendingPageState _onAction(TrendingPageState state, Action action) { + final TrendingPageState newState = state.clone(); + return newState; +} + +TrendingPageState _updateList(TrendingPageState state, Action action) { + final TrendingPageState newState = state.clone(); + newState.trending = action.payload; + return newState; +} + +TrendingPageState _setLiked(TrendingPageState state, Action action) { + final bool _liked = action.payload[0]; + final int _index = action.payload[1]; + final TrendingPageState newState = state.clone(); + newState.trending.results[_index].liked = _liked; + return newState; +} diff --git a/lib/views/trending_page/components/filter_component/action.dart b/lib/views/trending_page/components/filter_component/action.dart new file mode 100644 index 00000000..1b276737 --- /dev/null +++ b/lib/views/trending_page/components/filter_component/action.dart @@ -0,0 +1,41 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/models/sort_condition.dart'; + +enum FilterAction { + action, + dateChanged, + mediaTypeChanged, + updateList, + updateDate, + updateMediaType +} + +class FilterActionCreator { + static Action onAction() { + return const Action(FilterAction.action); + } + + static Action dateChanged(bool b) { + return Action(FilterAction.dateChanged, payload: b); + } + + static Action mediaTypeChanged(SortCondition sortCondition) { + return Action(FilterAction.mediaTypeChanged, payload: sortCondition); + } + + static Action updateList(SearchResultModel d) { + return Action(FilterAction.updateList, payload: d); + } + + static Action updateDate(bool b) { + return Action(FilterAction.updateDate, payload: b); + } + + static Action updateMediaType( + List sortConditions, MediaType selectType) { + return Action(FilterAction.updateMediaType, + payload: [sortConditions, selectType]); + } +} diff --git a/lib/views/trending_page/components/filter_component/component.dart b/lib/views/trending_page/components/filter_component/component.dart new file mode 100644 index 00000000..f406bf1e --- /dev/null +++ b/lib/views/trending_page/components/filter_component/component.dart @@ -0,0 +1,25 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class FilterComponent extends Component { + FilterComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.animationController != + newState.animationController || + oldState.isToday != newState.isToday || + oldState.mediaTypes != newState.mediaTypes || + oldState.mediaTypes != newState.mediaTypes; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/trending_page/components/filter_component/effect.dart b/lib/views/trending_page/components/filter_component/effect.dart new file mode 100644 index 00000000..b02be24d --- /dev/null +++ b/lib/views/trending_page/components/filter_component/effect.dart @@ -0,0 +1,52 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/enums/time_window.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + FilterAction.action: _onAction, + FilterAction.mediaTypeChanged: _mediaTypeChanged, + FilterAction.dateChanged: _dateChanged, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _mediaTypeChanged(Action action, Context ctx) async { + await ctx.state.animationController.reverse(); + final SortCondition model = action.payload; + var _mt = ctx.state.mediaTypes; + if (model.isSelected != true) { + if (!ctx.state.refreshController.isAnimating) + await ctx.state.refreshController.forward(); + int index = _mt.indexOf(model); + _mt.forEach((f) { + f.isSelected = false; + }); + _mt[index].isSelected = true; + ctx.dispatch(FilterActionCreator.updateMediaType(_mt, model.value)); + _loadData(ctx); + } +} + +Future _dateChanged(Action action, Context ctx) async { + await ctx.state.animationController.reverse(); + final bool _b = action.payload ?? true; + if (_b != ctx.state.isToday) { + if (!ctx.state.refreshController.isAnimating) + await ctx.state.refreshController.forward(); + ctx.dispatch(FilterActionCreator.updateDate(_b)); + _loadData(ctx); + } +} + +Future _loadData(Context ctx) async { + final _tmdb = TMDBApi.instance; + var r = await _tmdb.getTrending(ctx.state.selectMediaType, + ctx.state.isToday ? TimeWindow.day : TimeWindow.week); + if (r.success) ctx.dispatch(FilterActionCreator.updateList(r.result)); + ctx.state.refreshController.reset(); +} diff --git a/lib/views/trending_page/components/filter_component/reducer.dart b/lib/views/trending_page/components/filter_component/reducer.dart new file mode 100644 index 00000000..61fa2779 --- /dev/null +++ b/lib/views/trending_page/components/filter_component/reducer.dart @@ -0,0 +1,35 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + FilterAction.action: _onAction, + FilterAction.updateDate: _updateDate, + FilterAction.updateMediaType: _updateMediaType, + }, + ); +} + +FilterState _onAction(FilterState state, Action action) { + final FilterState newState = state.clone(); + return newState; +} + +FilterState _updateDate(FilterState state, Action action) { + final bool _isTiday = action.payload ?? true; + final FilterState newState = state.clone(); + newState.isToday = _isTiday; + return newState; +} + +FilterState _updateMediaType(FilterState state, Action action) { + final _mediaTypes = action.payload[0]; + final _selectType = action.payload[1]; + final FilterState newState = state.clone(); + newState.mediaTypes = _mediaTypes; + newState.selectMediaType = _selectType; + return newState; +} diff --git a/lib/views/trending_page/components/filter_component/state.dart b/lib/views/trending_page/components/filter_component/state.dart new file mode 100644 index 00000000..abc5a881 --- /dev/null +++ b/lib/views/trending_page/components/filter_component/state.dart @@ -0,0 +1,43 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/views/trending_page/state.dart'; + +class FilterState implements Cloneable { + AnimationController animationController; + List mediaTypes; + + AnimationController refreshController; + MediaType selectMediaType; + bool isToday; + @override + FilterState clone() { + return FilterState() + ..refreshController = refreshController + ..animationController = animationController + ..isToday = isToday + ..mediaTypes = mediaTypes + ..selectMediaType = selectMediaType; + } +} + +class FilterConnector extends ConnOp { + @override + FilterState get(TrendingPageState state) { + FilterState mstate = FilterState(); + mstate.animationController = state.animationController; + mstate.isToday = state.isToday; + mstate.mediaTypes = state.mediaTypes; + mstate.selectMediaType = state.selectMediaType; + mstate.refreshController = state.refreshController; + return mstate; + } + + @override + void set(TrendingPageState state, FilterState subState) { + state.isToday = subState.isToday; + state.mediaTypes = subState.mediaTypes; + state.selectMediaType = subState.selectMediaType; + } +} diff --git a/lib/views/trending_page/components/filter_component/view.dart b/lib/views/trending_page/components/filter_component/view.dart new file mode 100644 index 00000000..fcb2a0e4 --- /dev/null +++ b/lib/views/trending_page/components/filter_component/view.dart @@ -0,0 +1,95 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/models/sort_condition.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + FilterState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + + final TextStyle _selectTS = + TextStyle(fontWeight: FontWeight.bold, fontSize: Adapt.px(30)); + + final TextStyle _unSelectTS = TextStyle(fontSize: Adapt.px(30)); + + PopupMenuItem _buildCell(SortCondition s) { + final unSelectedStyle = TextStyle(color: Colors.grey); + final selectedStyle = TextStyle(fontWeight: FontWeight.bold); + return PopupMenuItem( + value: s, + child: Row( + children: [ + Text( + s.name, + style: s.isSelected ? selectedStyle : unSelectedStyle, + ), + Expanded( + child: Container(), + ), + s.isSelected ? Icon(Icons.check) : SizedBox() + ], + ), + ); + } + + return SliverToBoxAdapter( + child: AnimatedBuilder( + animation: state.animationController, + builder: (_, __) { + return Container( + width: Adapt.px(300), + height: Tween(begin: 0.0, end: Adapt.px(80)) + .animate(CurvedAnimation( + parent: state.animationController, + curve: Curves.ease, + )) + .value, + color: _theme.backgroundColor, + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Row( + children: [ + InkWell( + onTap: () => dispatch(FilterActionCreator.dateChanged(true)), + child: Text( + 'Today', + style: state.isToday ? _selectTS : _unSelectTS, + ), + ), + SizedBox( + width: Adapt.px(50), + ), + InkWell( + onTap: () => dispatch(FilterActionCreator.dateChanged(false)), + child: Text( + 'This Week', + style: state.isToday ? _unSelectTS : _selectTS, + )), + Expanded( + child: SizedBox(), + ), + FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: state.animationController, + curve: Interval(0.5, 1, curve: Curves.ease))), + child: PopupMenuButton( + padding: EdgeInsets.zero, + offset: Offset(0, Adapt.px(100)), + icon: Icon(Icons.apps), + onSelected: (selected) => + dispatch(FilterActionCreator.mediaTypeChanged(selected)), + itemBuilder: (ctx) { + return state.mediaTypes.map(_buildCell).toList(); + }, + ), + ) + ], + ), + ); + }, + ), + ); +} diff --git a/lib/views/trending_page/components/trendingcell_component/action.dart b/lib/views/trending_page/components/trendingcell_component/action.dart new file mode 100644 index 00000000..35603926 --- /dev/null +++ b/lib/views/trending_page/components/trendingcell_component/action.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TrendingCellAction { action, setLiked, onLikeTap } + +class TrendingCellActionCreator { + static Action onAction() { + return const Action(TrendingCellAction.action); + } + + static Action setLiked(bool liked, int index) { + return Action(TrendingCellAction.setLiked, payload: [liked, index]); + } + + static Action onLikeTap() { + return const Action(TrendingCellAction.onLikeTap); + } +} diff --git a/lib/views/trending_page/components/trendingcell_component/component.dart b/lib/views/trending_page/components/trendingcell_component/component.dart new file mode 100644 index 00000000..eeee9296 --- /dev/null +++ b/lib/views/trending_page/components/trendingcell_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TrendingCellComponent extends Component { + TrendingCellComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.index != newState.index || + oldState.cellData != newState.cellData || + oldState.liked != newState.liked; + }, + clearOnDependenciesChanged: true, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/trending_page/components/trendingcell_component/effect.dart b/lib/views/trending_page/components/trendingcell_component/effect.dart new file mode 100644 index 00000000..92e4043d --- /dev/null +++ b/lib/views/trending_page/components/trendingcell_component/effect.dart @@ -0,0 +1,73 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/actions/api/graphql_client.dart'; +import 'package:movie/models/base_api_model/movie_like_model.dart'; +import 'package:movie/models/base_api_model/tvshow_like_model.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TrendingCellAction.action: _onAction, + TrendingCellAction.onLikeTap: _onLikeTap, + Lifecycle.initState: _onInit, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _onInit(Action action, Context ctx) async { + if (ctx.state.user.firebaseUser == null) return; + final _type = ctx.state.cellData.mediaType; + String _mapKey = ''; + final _id = ctx.state.cellData.id; + final _uid = ctx.state.user.firebaseUser.uid; + QueryResult _result; + bool _liked = false; + switch (_type) { + case 'movie': + _mapKey = 'movie'; + _result = await BaseGraphQLClient.instance.getMovieLiked(_id, _uid); + break; + case 'tv': + _mapKey = 'tvshow'; + _result = await BaseGraphQLClient.instance.getTvShowLiked(_id, _uid); + break; + case 'person': + _mapKey = 'cast'; + return; + } + if (_result == null || _result?.hasException == true) return; + final _data = _result.data[_mapKey]; + _liked = _data['userLiked']; + if (_liked != ctx.state.liked) + ctx.dispatch(TrendingCellActionCreator.setLiked(_liked, ctx.state.index)); +} + +void _onLikeTap(Action action, Context ctx) async { + if (ctx.state.user.firebaseUser == null) return; + final _type = ctx.state.cellData.mediaType; + final _id = ctx.state.cellData.id; + final _uid = ctx.state.user.firebaseUser.uid; + final bool _liked = ctx.state.liked; + switch (_type) { + case 'movie': + _liked + ? BaseApi.instance + .unlikeMovie(MovieLikeModel.fromParams(movieId: _id, uid: _uid)) + : BaseApi.instance + .likeMovie(MovieLikeModel.fromParams(movieId: _id, uid: _uid)); + break; + case 'tv': + _liked + ? BaseApi.instance.unlikeTvShow(TvShowLikeModel.fromParams( + tvId: _id, uid: _uid, season: 1, episode: 1)) + : BaseApi.instance.likeTvShow(TvShowLikeModel.fromParams( + tvId: _id, uid: _uid, season: 1, episode: 1)); + break; + case 'person': + break; + } + ctx.dispatch(TrendingCellActionCreator.setLiked(!_liked, ctx.state.index)); +} diff --git a/lib/views/trending_page/components/trendingcell_component/reducer.dart b/lib/views/trending_page/components/trendingcell_component/reducer.dart new file mode 100644 index 00000000..09ba9234 --- /dev/null +++ b/lib/views/trending_page/components/trendingcell_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TrendingCellAction.action: _onAction, + }, + ); +} + +TrendingCellState _onAction(TrendingCellState state, Action action) { + final TrendingCellState newState = state.clone(); + return newState; +} diff --git a/lib/views/trending_page/components/trendingcell_component/state.dart b/lib/views/trending_page/components/trendingcell_component/state.dart new file mode 100644 index 00000000..90c61518 --- /dev/null +++ b/lib/views/trending_page/components/trendingcell_component/state.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/search_result.dart'; + +class TrendingCellState implements Cloneable { + SearchResult cellData; + bool liked; + AppUser user; + int index; + TrendingCellState({this.cellData, this.index, this.user, this.liked}); + @override + TrendingCellState clone() { + return TrendingCellState() + ..cellData = cellData + ..user = user + ..liked = liked + ..index = index; + } +} + +TrendingCellState initState(Map args) { + return TrendingCellState(); +} diff --git a/lib/views/trending_page/components/trendingcell_component/view.dart b/lib/views/trending_page/components/trendingcell_component/view.dart new file mode 100644 index 00000000..679a6b1f --- /dev/null +++ b/lib/views/trending_page/components/trendingcell_component/view.dart @@ -0,0 +1,134 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/genres.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/trending_page/action.dart'; +import 'package:parallax_image/parallax_image.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + TrendingCellState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + final SearchResult d = state.cellData; + return GestureDetector( + key: ValueKey('trendingCell${d.id}+${d.name}'), + onTap: () => dispatch(TrendingPageActionCreator.cellTapped(d)), + child: Container( + margin: EdgeInsets.only( + bottom: Adapt.px(50), left: Adapt.px(30), right: Adapt.px(30)), + decoration: BoxDecoration( + color: _theme.cardColor, + boxShadow: [ + BoxShadow( + blurRadius: Adapt.px(15), + offset: Offset(Adapt.px(10), Adapt.px(15)), + color: _theme.primaryColorDark) + ], + borderRadius: BorderRadius.circular(Adapt.px(30)), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _ImageCell(url: d.posterPath ?? d.profilePath), + SizedBox(width: Adapt.px(50)), + _Info( + data: d, + index: state.index, + ), + Container( + height: Adapt.px(280), + child: IconButton( + padding: EdgeInsets.only(left: Adapt.px(20)), + iconSize: Adapt.px(40), + icon: state.liked + ? const Icon( + Icons.favorite, + color: const Color(0xFFFF0000), + ) + : const Icon(Icons.favorite_border), + onPressed: () => dispatch(TrendingCellActionCreator.onLikeTap()), + ), + ) + ], + ), + ), + ); +} + +class _ImageCell extends StatelessWidget { + final String url; + const _ImageCell({this.url}); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Container( + width: Adapt.px(280), + height: Adapt.px(280), + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(30)), + child: Container( + color: _theme.primaryColorDark, + child: ParallaxImage( + extent: Adapt.px(280), + image: CachedNetworkImageProvider( + ImageUrl.getUrl(url, ImageSize.w300), + ), + ), + ), + ), + ); + } +} + +class _Info extends StatelessWidget { + final int index; + final SearchResult data; + const _Info({this.data, this.index}); + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: Adapt.px(20), + ), + Text( + '${index + 1}', + style: TextStyle(fontSize: Adapt.px(50), fontWeight: FontWeight.w800), + ), + SizedBox( + width: Adapt.screenW() - Adapt.px(490), + child: Text( + data.title ?? data.name, + style: + TextStyle(fontSize: Adapt.px(28), fontWeight: FontWeight.w700), + ), + ), + SizedBox(height: Adapt.px(10)), + SizedBox( + width: Adapt.screenW() - Adapt.px(490), + child: Text( + (data.genreIds ?? []) + .take(3) + .map((f) { + return data.mediaType == 'movie' + ? Genres.instance.movieList[f]?.replaceAll('_', ' & ') + : Genres.instance.tvList[f]?.replaceAll('_', ' & '); + }) + .toList() + .join(' / '), + style: TextStyle( + color: const Color(0xFF9E9E9E), fontSize: Adapt.px(22)), + )) + ], + ); + } +} diff --git a/lib/views/trending_page/effect.dart b/lib/views/trending_page/effect.dart new file mode 100644 index 00000000..19146110 --- /dev/null +++ b/lib/views/trending_page/effect.dart @@ -0,0 +1,112 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart' hide Action, Page; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/models/enums/time_window.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/views/detail_page/page.dart'; +import 'package:movie/views/peopledetail_page/page.dart'; +import 'package:movie/views/tvshow_detail_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TrendingPageAction.action: _onAction, + TrendingPageAction.showFilter: _showFilter, + TrendingPageAction.cellTapped: _cellTapped, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final Object _ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: _ticker, duration: Duration(milliseconds: 400)); + ctx.state.refreshController = AnimationController( + vsync: _ticker, duration: Duration(milliseconds: 100)); + ctx.state.controller = ScrollController() + ..addListener(() { + if (!ctx.state.animationController.isAnimating) { + if (ctx.state.animationController.value == 1.0) + ctx.state.animationController.reverse(); + } + if (ctx.state.controller.position.pixels == + ctx.state.controller.position.maxScrollExtent) _loadMore(ctx); + }); +} + +Future _onDispose(Action action, Context ctx) async { + ctx.state.controller.dispose(); + ctx.state.animationController.dispose(); + ctx.state.refreshController.dispose(); +} + +Future _showFilter(Action action, Context ctx) async { + await ctx.state.controller.animateTo(0.0, + duration: Duration(milliseconds: 300), curve: Curves.ease); + if (!ctx.state.animationController.isAnimating) { + if (ctx.state.animationController.value == 0.0) + ctx.state.animationController.forward(); + else + ctx.state.animationController.reverse(); + } +} + +Future _loadMore(Context ctx) async { + int _page = ctx.state.trending.page + 1; + if (_page <= ctx.state.trending.totalPages) { + final _tmdb = TMDBApi.instance; + var r = await _tmdb.getTrending(ctx.state.selectMediaType, + ctx.state.isToday ? TimeWindow.day : TimeWindow.week, + page: _page); + if (r.success) ctx.dispatch(TrendingPageActionCreator.loadMore(r.result)); + } +} + +Future _cellTapped(Action action, Context ctx) async { + final SearchResult _d = action.payload; + String _mediaType = _d.mediaType; + Page _page; + var _data; + switch (_mediaType) { + case 'movie': + _page = MovieDetailPage(); + _data = { + 'id': _d.id, + 'bgpic': _d.posterPath, + 'name': _d.title, + 'posterpic': _d.posterPath + }; + break; + case 'tv': + _page = TvShowDetailPage(); + _data = { + 'id': _d.id, + 'bgpic': _d.backdropPath, + 'name': _d.name, + 'posterpic': _d.posterPath + }; + break; + case 'person': + _page = PeopleDetailPage(); + _data = { + 'peopleid': _d.id, + 'profilePath': _d.profilePath, + 'profileName': _d.name, + 'character': '' + }; + break; + } + if (_page != null) + await Navigator.of(ctx.context).push(PageRouteBuilder( + transitionDuration: Duration(milliseconds: 300), + pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: _page.buildPage(_data), + ); + })); +} diff --git a/lib/views/trending_page/page.dart b/lib/views/trending_page/page.dart new file mode 100644 index 00000000..493b0111 --- /dev/null +++ b/lib/views/trending_page/page.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'adpater/adapter.dart'; +import 'components/filter_component/component.dart'; +import 'components/filter_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TrendingPage extends Page> + with TickerProviderMixin { + TrendingPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: NoneConn() + TrendingAdapter(), + slots: >{ + 'filter': FilterConnector() + FilterComponent() + }), + middleware: >[], + ); +} diff --git a/lib/views/trending_page/reducer.dart b/lib/views/trending_page/reducer.dart new file mode 100644 index 00000000..d092cac0 --- /dev/null +++ b/lib/views/trending_page/reducer.dart @@ -0,0 +1,36 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/search_result.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TrendingPageAction.action: _onAction, + TrendingPageAction.updateList: _onUpdateList, + TrendingPageAction.loadMore: _loadMore, + }, + ); +} + +TrendingPageState _onAction(TrendingPageState state, Action action) { + final TrendingPageState newState = state.clone(); + return newState; +} + +TrendingPageState _onUpdateList(TrendingPageState state, Action action) { + final TrendingPageState newState = state.clone(); + newState.trending = action.payload; + return newState; +} + +TrendingPageState _loadMore(TrendingPageState state, Action action) { + final SearchResultModel _model = action.payload; + final TrendingPageState newState = state.clone(); + if (_model != null) { + newState.trending.results.addAll(_model.results); + newState.trending.page = _model.page; + } + return newState; +} diff --git a/lib/views/trending_page/state.dart b/lib/views/trending_page/state.dart new file mode 100644 index 00000000..440dc935 --- /dev/null +++ b/lib/views/trending_page/state.dart @@ -0,0 +1,76 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/app_user.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:movie/models/sort_condition.dart'; + +import 'components/trendingcell_component/state.dart'; + +class TrendingPageState extends MutableSource + implements GlobalBaseState, Cloneable { + SearchResultModel trending; + ScrollController controller; + AnimationController animationController; + AnimationController refreshController; + List mediaTypes; + MediaType selectMediaType; + bool isToday; + + @override + TrendingPageState clone() { + return TrendingPageState() + ..trending = trending + ..controller = controller + ..animationController = animationController + ..refreshController = refreshController + ..mediaTypes = mediaTypes + ..selectMediaType = selectMediaType + ..isToday = isToday + ..user = user; + } + + @override + Object getItemData(int index) => TrendingCellState( + cellData: trending.results[index], + index: index, + user: user, + liked: trending.results[index].liked ?? false, + ); + + @override + String getItemType(int index) => 'trendingCell'; + + @override + int get itemCount => trending?.results?.length ?? 0; + + @override + void setItemData(int index, Object data) { + //TrendingCellState _trendingState = data as TrendingCellState; + //trending.results[index].liked = _trendingState.liked; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +TrendingPageState initState(Map args) { + TrendingPageState state = TrendingPageState(); + state.trending = args['data']; + state.isToday = true; + state.selectMediaType = MediaType.all; + state.mediaTypes = [ + SortCondition(isSelected: true, name: 'All', value: MediaType.all), + SortCondition(isSelected: false, name: 'Movie', value: MediaType.movie), + SortCondition(isSelected: false, name: 'TV Shows', value: MediaType.tv), + SortCondition(isSelected: false, name: 'Person', value: MediaType.person), + ]; + return state; +} diff --git a/lib/views/trending_page/view.dart b/lib/views/trending_page/view.dart new file mode 100644 index 00000000..c4dbf3d8 --- /dev/null +++ b/lib/views/trending_page/view.dart @@ -0,0 +1,96 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + TrendingPageState state, Dispatch dispatch, ViewService viewService) { + final _adapter = viewService.buildAdapter(); + return Builder( + builder: (context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Scaffold( + appBar: AppBar( + brightness: _theme.brightness, + backgroundColor: _theme.backgroundColor, + elevation: 0.0, + iconTheme: _theme.iconTheme, + title: + Text('Trending', style: TextStyle(color: _theme.iconTheme.color)), + actions: [ + IconButton( + alignment: Alignment.centerLeft, + icon: AnimatedIcon( + progress: Tween(begin: 0.0, end: 1.0) + .animate(state.animationController), + icon: AnimatedIcons.menu_close, + ), + onPressed: () => dispatch(TrendingPageActionCreator.showFilter()), + ), + ], + ), + body: CustomScrollView( + key: ValueKey(state.trending), + physics: BouncingScrollPhysics(), + controller: state.controller, + slivers: [ + viewService.buildComponent('filter'), + _Refreshing(refreshController: state.refreshController), + SliverToBoxAdapter( + child: SizedBox(height: Adapt.px(30)), + ), + SliverList( + delegate: SliverChildBuilderDelegate((ctx, index) { + return _adapter.itemBuilder(ctx, index); + }, childCount: _adapter.itemCount), + ), + _Loading(), + ], + ), + ); + }, + ); +} + +class _Refreshing extends StatelessWidget { + final AnimationController refreshController; + const _Refreshing({this.refreshController}); + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: refreshController, + curve: Curves.ease, + )), + child: SizedBox( + height: Adapt.px(5), + child: LinearProgressIndicator( + backgroundColor: Colors.white, + valueColor: AlwaysStoppedAnimation(Color(0xFF505050)), + ), + ), + ), + ); + } +} + +class _Loading extends StatelessWidget { + const _Loading(); + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return SliverToBoxAdapter( + child: Container( + padding: EdgeInsets.only(bottom: Adapt.px(30)), + alignment: Alignment.center, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(_theme.iconTheme.color), + ), + ), + ); + } +} diff --git a/lib/views/tvshow_detail_page/action.dart b/lib/views/tvshow_detail_page/action.dart new file mode 100644 index 00000000..93008ef9 --- /dev/null +++ b/lib/views/tvshow_detail_page/action.dart @@ -0,0 +1,93 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/models/video_model.dart'; + +enum TvShowDetailAction { + action, + init, + setbgcolor, + setCredits, + setVideos, + setImages, + setReviews, + setRecommendation, + setKeyWords, + setAccountState, + recommendationTapped, + castCellTapped, + openMenu, + showSnackBar, + onImageCellTapped, + moreEpisode, +} + +class TvShowDetailActionCreator { + static Action onAction() { + return const Action(TvShowDetailAction.action); + } + + static Action onInit(TVDetailModel model) { + return Action(TvShowDetailAction.init, payload: model); + } + + static Action onCredits(CreditsModel c) { + return Action(TvShowDetailAction.setCredits, payload: c); + } + + static Action onSetImages(ImageModel c) { + return Action(TvShowDetailAction.setImages, payload: c); + } + + static Action onSetReviews(ReviewModel c) { + return Action(TvShowDetailAction.setReviews, payload: c); + } + + static Action onSetRecommendations(VideoListModel c) { + return Action(TvShowDetailAction.setRecommendation, payload: c); + } + + static Action onKeyWords(KeyWordModel c) { + return Action(TvShowDetailAction.setKeyWords, payload: c); + } + + static Action onSetVideos(VideoModel c) { + return Action(TvShowDetailAction.setVideos, payload: c); + } + + static Action onRecommendationTapped(int movieid, String backpic) { + return Action(TvShowDetailAction.recommendationTapped, + payload: [movieid, backpic]); + } + + static Action onCastCellTapped( + int peopleid, String profilePath, String profileName) { + return Action(TvShowDetailAction.castCellTapped, + payload: [peopleid, profilePath, profileName]); + } + + static Action onSetAccountState(AccountState model) { + return Action(TvShowDetailAction.setAccountState, payload: model); + } + + static Action openMenu() { + return Action(TvShowDetailAction.openMenu); + } + + static Action showSnackBar(String message) { + return Action(TvShowDetailAction.showSnackBar, payload: message); + } + + static Action onImageCellTapped(int index, List data) { + return Action(TvShowDetailAction.onImageCellTapped, payload: [index, data]); + } + + static Action moreEpisode() { + return Action(TvShowDetailAction.moreEpisode); + } +} diff --git a/lib/views/tvshow_detail_page/components/cast_component/action.dart b/lib/views/tvshow_detail_page/components/cast_component/action.dart new file mode 100644 index 00000000..21b552fe --- /dev/null +++ b/lib/views/tvshow_detail_page/components/cast_component/action.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/credits_model.dart'; + +enum CastAction { + action, + castCellTapped, +} + +class CastActionCreator { + static Action onAction() { + return const Action(CastAction.action); + } + + static Action onCastCellTapped(CastData cast) { + return Action(CastAction.castCellTapped, payload: cast); + } +} diff --git a/lib/views/tvshow_detail_page/components/cast_component/component.dart b/lib/views/tvshow_detail_page/components/cast_component/component.dart new file mode 100644 index 00000000..17ca9b1d --- /dev/null +++ b/lib/views/tvshow_detail_page/components/cast_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class CastComponent extends Component { + CastComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.casts != newState.casts; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/cast_component/effect.dart b/lib/views/tvshow_detail_page/components/cast_component/effect.dart new file mode 100644 index 00000000..b008fab8 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/cast_component/effect.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/credits_model.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + CastAction.action: _onAction, + CastAction.castCellTapped: _castCellTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _castCellTapped(Action action, Context ctx) async { + final CastData _cast = action.payload; + if (_cast == null) return; + await Navigator.of(ctx.context).pushNamed('peopledetailpage', arguments: { + 'peopleid': _cast.id, + 'profilePath': _cast.profilePath, + 'profileName': _cast.name + }); +} diff --git a/lib/views/tvshow_detail_page/components/cast_component/reducer.dart b/lib/views/tvshow_detail_page/components/cast_component/reducer.dart new file mode 100644 index 00000000..6abfe894 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/cast_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + CastAction.action: _onAction, + }, + ); +} + +CastState _onAction(CastState state, Action action) { + final CastState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/cast_component/state.dart b/lib/views/tvshow_detail_page/components/cast_component/state.dart new file mode 100644 index 00000000..4c37c38c --- /dev/null +++ b/lib/views/tvshow_detail_page/components/cast_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class CastState implements Cloneable { + List casts; + @override + CastState clone() { + return CastState(); + } +} + +class CastConnector extends ConnOp { + @override + CastState get(TvShowDetailState state) { + CastState substate = new CastState(); + substate.casts = state.tvDetailModel?.credits?.cast; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/cast_component/view.dart b/lib/views/tvshow_detail_page/components/cast_component/view.dart new file mode 100644 index 00000000..b14812d5 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/cast_component/view.dart @@ -0,0 +1,192 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/tvshow_detail_page/components/cast_component/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView(CastState state, Dispatch dispatch, ViewService viewService) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: state.casts == null + ? const _ShimmerList() + : state.casts.length > 0 + ? _CastPanel( + casts: state.casts, + onTap: (d) => dispatch(CastActionCreator.onCastCellTapped(d)), + ) + : SizedBox(), + ); +} + +class _CastCell extends StatelessWidget { + final CastData data; + final Function(CastData) onTap; + const _CastCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(data), + child: Column( + children: [ + Container( + width: Adapt.px(110), + height: Adapt.px(110), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.profilePath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(height: Adapt.px(20)), + SizedBox( + width: Adapt.px(120), + child: Text( + data.name ?? '', + textAlign: TextAlign.center, + maxLines: 3, + style: TextStyle( + fontSize: Adapt.px(22), + color: const Color(0xFF717171), + ), + ), + ) + ], + ), + ); + } +} + +class _CastPanel extends StatelessWidget { + final List casts; + final Function(CastData) onTap; + const _CastPanel({Key key, @required this.casts, this.onTap}) + : assert(casts != null), + super(key: key); + @override + Widget build(BuildContext context) { + final _listviewHeight = Adapt.px(230); + final _padding = Adapt.px(40); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Text( + I18n.of(context).topBilledCast, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + ), + SizedBox(height: Adapt.px(30)), + Container( + height: _listviewHeight, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: _padding), + physics: BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(40)), + itemCount: casts.length, + itemBuilder: (_, index) { + final _d = casts[index]; + return _CastCell( + data: _d, + onTap: onTap, + ); + }, + ), + ) + ], + ); + } +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(110), + height: Adapt.px(110), + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF), + shape: BoxShape.circle, + ), + ), + SizedBox(height: Adapt.px(20)), + Container( + width: Adapt.px(120), + height: Adapt.px(18), + color: const Color(0xFFFFFFFF), + ), + SizedBox(height: Adapt.px(8)), + Container( + width: Adapt.px(80), + height: Adapt.px(18), + color: const Color(0xFFFFFFFF), + ) + ], + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final _listviewHeight = Adapt.px(230); + final _padding = Adapt.px(40); + final _theme = ThemeStyle.getTheme(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Text( + I18n.of(context).topBilledCast, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + ), + SizedBox(height: Adapt.px(30)), + Container( + height: _listviewHeight, + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: _padding), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(40)), + itemCount: 5, + itemBuilder: (_, index) { + return const _ShimmerCell(); + }, + ), + ), + ) + ], + ); + } +} diff --git a/lib/views/tvshow_detail_page/components/keyword_component/action.dart b/lib/views/tvshow_detail_page/components/keyword_component/action.dart new file mode 100644 index 00000000..85cdb733 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/keyword_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum KeywordAction { action } + +class KeywordActionCreator { + static Action onAction() { + return const Action(KeywordAction.action); + } +} diff --git a/lib/views/tvshow_detail_page/components/keyword_component/component.dart b/lib/views/tvshow_detail_page/components/keyword_component/component.dart new file mode 100644 index 00000000..1fc5a188 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/keyword_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class KeywordComponent extends Component { + KeywordComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.keywords != newState.keywords; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/keyword_component/effect.dart b/lib/views/tvshow_detail_page/components/keyword_component/effect.dart new file mode 100644 index 00000000..9f965fc6 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/keyword_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + KeywordAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/tvshow_detail_page/components/keyword_component/reducer.dart b/lib/views/tvshow_detail_page/components/keyword_component/reducer.dart new file mode 100644 index 00000000..77cea5c9 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/keyword_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + KeywordAction.action: _onAction, + }, + ); +} + +KeywordState _onAction(KeywordState state, Action action) { + final KeywordState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/keyword_component/state.dart b/lib/views/tvshow_detail_page/components/keyword_component/state.dart new file mode 100644 index 00000000..e25d0a12 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/keyword_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class KeywordState implements Cloneable { + List keywords; + @override + KeywordState clone() { + return KeywordState(); + } +} + +class KeywordConnector extends ConnOp { + @override + KeywordState get(TvShowDetailState state) { + KeywordState substate = new KeywordState(); + substate.keywords = state.tvDetailModel?.keywords?.results; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/keyword_component/view.dart b/lib/views/tvshow_detail_page/components/keyword_component/view.dart new file mode 100644 index 00000000..1019e8e3 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/keyword_component/view.dart @@ -0,0 +1,143 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView( + KeywordState state, Dispatch dispatch, ViewService viewService) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: state.keywords == null + ? const _ShimmerList() + : state.keywords.length > 0 + ? _KeyWordPanel(keywords: state.keywords) + : SizedBox(), + ); +} + +class _KeyWordCell extends StatelessWidget { + final KeyWordData data; + const _KeyWordCell({this.data}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(25), vertical: Adapt.px(13)), + height: Adapt.px(60), + decoration: BoxDecoration( + border: Border.all(color: _theme.primaryColorDark), + borderRadius: BorderRadius.circular(Adapt.px(30))), + child: Text( + data.name, + style: + TextStyle(fontSize: Adapt.px(24), color: const Color(0xFF717171)), + ), + ); + } +} + +class _KeyWordPanel extends StatelessWidget { + final List keywords; + const _KeyWordPanel({this.keywords}); + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + return Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(context).keyWords, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + SizedBox(height: Adapt.px(30)), + SizedBox( + width: Adapt.screenW(), + child: Wrap( + spacing: 12, + runSpacing: 12, + children: + keywords.take(15).map((e) => _KeyWordCell(data: e)).toList(), + ), + ), + SizedBox(height: Adapt.px(30)), + ], + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + final double width; + const _ShimmerCell(this.width); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(25), vertical: Adapt.px(13)), + width: width, + height: Adapt.px(60), + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF), + borderRadius: BorderRadius.circular( + Adapt.px(30), + ), + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + final _theme = ThemeStyle.getTheme(context); + return Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + I18n.of(context).keyWords, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + SizedBox(height: Adapt.px(30)), + Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: SizedBox( + width: Adapt.screenW(), + child: Wrap( + runAlignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + spacing: 12, + runSpacing: 12, + children: [ + const _ShimmerCell(80), + const _ShimmerCell(100), + const _ShimmerCell(90), + const _ShimmerCell(120), + const _ShimmerCell(80), + ], + ), + ), + ), + SizedBox(height: Adapt.px(30)), + ], + )); + } +} diff --git a/lib/views/tvshow_detail_page/components/last_episode_component/action.dart b/lib/views/tvshow_detail_page/components/last_episode_component/action.dart new file mode 100644 index 00000000..7f075182 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/last_episode_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum LastEpisodeAction { action } + +class LastEpisodeActionCreator { + static Action onAction() { + return const Action(LastEpisodeAction.action); + } +} diff --git a/lib/views/tvshow_detail_page/components/last_episode_component/component.dart b/lib/views/tvshow_detail_page/components/last_episode_component/component.dart new file mode 100644 index 00000000..91b509b6 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/last_episode_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class LastEpisodeComponent extends Component { + LastEpisodeComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.lastEpisodeToAir != newState.lastEpisodeToAir; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/last_episode_component/effect.dart b/lib/views/tvshow_detail_page/components/last_episode_component/effect.dart new file mode 100644 index 00000000..d3eac303 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/last_episode_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + LastEpisodeAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/tvshow_detail_page/components/last_episode_component/reducer.dart b/lib/views/tvshow_detail_page/components/last_episode_component/reducer.dart new file mode 100644 index 00000000..74729304 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/last_episode_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + LastEpisodeAction.action: _onAction, + }, + ); +} + +LastEpisodeState _onAction(LastEpisodeState state, Action action) { + final LastEpisodeState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/last_episode_component/state.dart b/lib/views/tvshow_detail_page/components/last_episode_component/state.dart new file mode 100644 index 00000000..02bea02c --- /dev/null +++ b/lib/views/tvshow_detail_page/components/last_episode_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class LastEpisodeState implements Cloneable { + AirData lastEpisodeToAir; + @override + LastEpisodeState clone() { + return LastEpisodeState()..lastEpisodeToAir = lastEpisodeToAir; + } +} + +class LastEpisodeConnector extends ConnOp { + @override + LastEpisodeState get(TvShowDetailState state) { + LastEpisodeState substate = new LastEpisodeState(); + substate.lastEpisodeToAir = state.tvDetailModel?.lastEpisodeToAir; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/last_episode_component/view.dart b/lib/views/tvshow_detail_page/components/last_episode_component/view.dart new file mode 100644 index 00000000..9d5c7e7f --- /dev/null +++ b/lib/views/tvshow_detail_page/components/last_episode_component/view.dart @@ -0,0 +1,118 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/tvshow_detail_page/action.dart'; + +import 'state.dart'; + +Widget buildView( + LastEpisodeState state, Dispatch dispatch, ViewService viewService) { + return state.lastEpisodeToAir == null + ? SizedBox() + : _LastEpisodePanel( + data: state.lastEpisodeToAir, + moreTapped: () => dispatch(TvShowDetailActionCreator.moreEpisode()), + ); +} + +class _LastEpisodePanel extends StatelessWidget { + final AirData data; + final Function moreTapped; + const _LastEpisodePanel({this.data, this.moreTapped}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + I18n.of(context).lastEpisode, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + GestureDetector( + onTap: moreTapped, + child: Text( + 'more', + style: TextStyle( + fontSize: Adapt.px(24), color: const Color(0xFF2196F3)), + ), + ) + ]), + SizedBox(height: Adapt.px(30)), + GestureDetector( + onTap: moreTapped, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: _theme.primaryColorLight, width: Adapt.px(3)), + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + child: Row( + children: [ + Container( + width: Adapt.px(200), + height: Adapt.px(160), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.horizontal( + left: Radius.circular(Adapt.px(20))), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.stillPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(width: Adapt.px(30)), + SizedBox( + width: Adapt.screenW() - Adapt.px(346), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data.name ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: Adapt.px(24)), + ), + SizedBox(height: Adapt.px(5)), + Text( + 'S${data.seasonNumber} · E${data.episodeNumber}', + style: TextStyle(fontSize: Adapt.px(18)), + ), + SizedBox(height: Adapt.px(5)), + Text( + data?.overview ?? '', + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: Adapt.px(18), + color: const Color(0xFF717171), + ), + ), + ], + ), + ), + SizedBox(width: Adapt.px(30)), + ], + ), + )), + SizedBox(height: Adapt.px(30)), + ], + ), + ); + } +} diff --git a/lib/views/tvshow_detail_page/components/menu_component/action.dart b/lib/views/tvshow_detail_page/components/menu_component/action.dart new file mode 100644 index 00000000..a57c9774 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/menu_component/action.dart @@ -0,0 +1,41 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum MenuAction { + action, + setRating, + updateRating, + setFavorite, + updateFavorite, + setWatchlist, + updateWatchlist +} + +class MenuActionCreator { + static Action onAction() { + return const Action(MenuAction.action); + } + + static Action setRating(double d) { + return Action(MenuAction.setRating, payload: d); + } + + static Action updateRating(double d) { + return Action(MenuAction.updateRating, payload: d); + } + + static Action setFavorite(bool isFavorite) { + return Action(MenuAction.setFavorite, payload: isFavorite); + } + + static Action updateFavorite(bool isFavorite) { + return Action(MenuAction.updateFavorite, payload: isFavorite); + } + + static Action setWatchlist(bool isAdd) { + return Action(MenuAction.setWatchlist, payload: isAdd); + } + + static Action updateWatctlist(bool isAdd) { + return Action(MenuAction.updateWatchlist, payload: isAdd); + } +} diff --git a/lib/views/tvshow_detail_page/components/menu_component/component.dart b/lib/views/tvshow_detail_page/components/menu_component/component.dart new file mode 100644 index 00000000..7980593b --- /dev/null +++ b/lib/views/tvshow_detail_page/components/menu_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class MenuComponent extends Component { + MenuComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.accountState != newState.accountState || + oldState.detail != newState.detail; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/menu_component/effect.dart b/lib/views/tvshow_detail_page/components/menu_component/effect.dart new file mode 100644 index 00000000..43a8791f --- /dev/null +++ b/lib/views/tvshow_detail_page/components/menu_component/effect.dart @@ -0,0 +1,99 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/views/tvshow_detail_page/action.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + MenuAction.action: _onAction, + MenuAction.setRating: _setRating, + MenuAction.setFavorite: _setFavorite, + MenuAction.setWatchlist: _setWatchlist + }); +} + +void _onAction(Action action, Context ctx) {} + +void _setFavorite(Action action, Context ctx) async { + final bool _isFavorite = ctx.state.accountState.favorite; + final user = GlobalStore.store.getState().user; + final _baseApi = BaseApi.instance; + + if (user != null) { + ctx.dispatch(MenuActionCreator.updateFavorite(!_isFavorite)); + if (_isFavorite) + await _baseApi.deleteFavorite( + user.firebaseUser.uid, MediaType.tv, ctx.state.id); + else + await _baseApi.setFavorite(UserMedia.fromParams( + uid: user.firebaseUser.uid, + name: ctx.state.name, + photoUrl: ctx.state.detail.posterPath, + overwatch: ctx.state.detail.overview, + rated: ctx.state.detail.voteAverage, + ratedCount: ctx.state.detail.voteCount, + releaseDate: ctx.state.detail.firstAirDate, + popular: ctx.state.detail.popularity, + genre: ctx.state.detail.genres.map((f) => f.name).toList().join(','), + mediaId: ctx.state.id, + mediaType: 'tv')); + await _baseApi.updateAccountState(ctx.state.accountState); + ctx.broadcast(TvShowDetailActionCreator.showSnackBar(!_isFavorite + ? 'has been mark as favorite' + : 'has been removed from your favorites')); + } +} + +Future _setRating(Action action, Context ctx) async { + final user = GlobalStore.store.getState().user; + if (user != null) { + ctx.dispatch(MenuActionCreator.updateRating(action.payload)); + final _baseApi = BaseApi.instance; + _baseApi.updateAccountState(ctx.state.accountState); + ctx.broadcast( + TvShowDetailActionCreator.showSnackBar('your rating has been saved')); + } +} + +Future _setWatchlist(Action action, Context ctx) async { + final bool _isWatchlist = ctx.state.accountState.watchlist; + final user = GlobalStore.store.getState().user; + final _baseApi = BaseApi.instance; + + if (user != null) { + ctx.dispatch(MenuActionCreator.updateWatctlist(!_isWatchlist)); + if (_isWatchlist) + await _baseApi.deleteWatchlist( + user.firebaseUser.uid, MediaType.tv, ctx.state.id); + else + await _baseApi.setWatchlist(UserMedia.fromParams( + uid: user.firebaseUser.uid, + name: ctx.state.name, + photoUrl: ctx.state.detail.posterPath, + overwatch: ctx.state.detail.overview, + rated: ctx.state.detail.voteAverage, + ratedCount: ctx.state.detail.voteCount, + releaseDate: ctx.state.detail.firstAirDate, + popular: ctx.state.detail.popularity, + genre: ctx.state.detail.genres.map((f) => f.name).toList().join(','), + mediaId: ctx.state.id, + mediaType: 'tv')); + await _baseApi.updateAccountState(ctx.state.accountState); + ctx.broadcast(TvShowDetailActionCreator.showSnackBar(!_isWatchlist + ? 'has been add to your watchlist' + : 'has been removed from your watchlist')); + } + final bool f = action.payload; + ctx.dispatch(MenuActionCreator.updateWatctlist(f)); + final _tmdb = TMDBApi.instance; + var r = await _tmdb.addToWatchlist(ctx.state.id, MediaType.movie, f); + if (r) + ctx.broadcast(TvShowDetailActionCreator.showSnackBar(f + ? 'has been add to your watchlist' + : 'has been removed from your watchlist')); +} diff --git a/lib/views/tvshow_detail_page/components/menu_component/reducer.dart b/lib/views/tvshow_detail_page/components/menu_component/reducer.dart new file mode 100644 index 00000000..28990a98 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/menu_component/reducer.dart @@ -0,0 +1,40 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + MenuAction.action: _onAction, + MenuAction.updateRating: _updateRating, + MenuAction.updateFavorite: _updateFavorite, + MenuAction.updateWatchlist: _updateWatchlist + }, + ); +} + +MenuState _onAction(MenuState state, Action action) { + final MenuState newState = state.clone(); + return newState; +} + +MenuState _updateRating(MenuState state, Action action) { + final MenuState newState = state.clone(); + newState.accountState.rated = action.payload; + return newState; +} + +MenuState _updateFavorite(MenuState state, Action action) { + final bool favorite = action.payload; + final MenuState newState = state.clone(); + newState.accountState.favorite = favorite; + return newState; +} + +MenuState _updateWatchlist(MenuState state, Action action) { + final bool isAdd = action.payload; + final MenuState newState = state.clone(); + newState.accountState.watchlist = isAdd; + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/menu_component/state.dart b/lib/views/tvshow_detail_page/components/menu_component/state.dart new file mode 100644 index 00000000..185d31b9 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/menu_component/state.dart @@ -0,0 +1,46 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class MenuState implements Cloneable { + int id; + String backdropPic; + String posterPic; + String name; + String overWatch; + AccountState accountState; + TVDetailModel detail; + + @override + MenuState clone() { + return MenuState() + ..accountState = accountState + ..posterPic = posterPic + ..backdropPic = backdropPic + ..id = id + ..overWatch = overWatch + ..name = name + ..detail = detail; + } +} + +class MenuConnector extends ConnOp { + @override + MenuState get(TvShowDetailState state) { + MenuState substate = new MenuState(); + substate.posterPic = state.tvDetailModel.posterPath; + substate.name = state.tvDetailModel.name; + substate.accountState = state.accountState; + substate.id = state.tvid; + substate.backdropPic = state.tvDetailModel.backdropPath; + substate.overWatch = state.tvDetailModel.overview; + substate.detail = state.tvDetailModel; + return substate; + } + + @override + void set(TvShowDetailState state, MenuState subState) { + state.accountState = subState.accountState; + } +} diff --git a/lib/views/tvshow_detail_page/components/menu_component/view.dart b/lib/views/tvshow_detail_page/components/menu_component/view.dart new file mode 100644 index 00000000..a6a8f028 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/menu_component/view.dart @@ -0,0 +1,231 @@ +import 'dart:ui' as ui; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/widgets/dialogratingbar.dart'; +import 'package:movie/widgets/medialist_card.dart'; +import 'package:movie/widgets/share_card.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView(MenuState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + Widget _buildListTitel(IconData icon, String title, void onTap(), + {Color iconColor = const Color.fromRGBO(50, 50, 50, 1)}) { + TextStyle titleStyle = TextStyle(fontSize: Adapt.px(35)); + return ListTile( + leading: Icon( + icon, + color: iconColor, + ), + title: Text(title, style: titleStyle), + onTap: onTap, + ); + } + + void _addToList() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + return MediaListCardDialog( + type: MediaType.tv, + mediaId: state.id, + name: state.detail.name, + photourl: state.detail.posterPath, + rated: state.detail.voteAverage, + runtime: state.detail.episodeRunTime.fold(0, (p, c) => p + c), + releaseDate: state.detail.firstAirDate, + ); + }); + } + + void _rateIt() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + double rate = state.accountState.rated ?? 0; + return DialogRatingBar( + rating: rate, + submit: (d) => dispatch(MenuActionCreator.setRating(d)), + ); + }); + } + + void _share() { + Navigator.of(viewService.context).pop(); + showDialog( + context: viewService.context, + builder: (ctx) { + var width = (Adapt.screenW() - Adapt.px(60)).floorToDouble(); + var height = ((width - Adapt.px(40)) / 2).floorToDouble(); + return ShareCard( + backgroundImage: ImageUrl.getUrl(state.backdropPic, ImageSize.w300), + qrValue: + 'https://www.themoviedb.org/tv/${state.id}?language=${ui.window.locale.languageCode}', + headerHeight: height, + header: Column(children: [ + SizedBox( + height: Adapt.px(20), + ), + Row( + children: [ + SizedBox( + width: Adapt.px(20), + ), + Container( + width: Adapt.px(120), + height: Adapt.px(120), + decoration: BoxDecoration( + border: + Border.all(color: Colors.white, width: Adapt.px(5)), + borderRadius: BorderRadius.circular(Adapt.px(60)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(ImageUrl.getUrl( + state.posterPic, ImageSize.w300)))), + ), + SizedBox( + width: Adapt.px(20), + ), + Container( + width: width - Adapt.px(285), + child: Text(state.name, + maxLines: 2, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(40), + fontWeight: FontWeight.bold, + shadows: [ + Shadow(offset: Offset(Adapt.px(1), Adapt.px(1))) + ])), + ), + ], + ), + SizedBox( + height: Adapt.px(20), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + width: width - Adapt.px(40), + height: height - Adapt.px(170), + child: Text(state.overWatch, + overflow: TextOverflow.ellipsis, + maxLines: 5, + style: TextStyle( + color: Colors.white, + fontSize: Adapt.px(26), + shadows: [ + Shadow( + offset: Offset(Adapt.px(1), Adapt.px(1)), + blurRadius: 3) + ])), + ) + ]), + ); + }); + } + + return Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical(top: Radius.circular(Adapt.px(50))), + ), + child: ListView( + physics: BouncingScrollPhysics(), + children: [ + Container( + margin: EdgeInsets.all(Adapt.px(20)), + height: Adapt.px(100), + child: Row( + children: [ + Container( + height: Adapt.px(100), + width: Adapt.px(100), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(Adapt.px(50)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(state.posterPic, ImageSize.w300)), + ), + ), + ), + SizedBox( + width: Adapt.px(30), + ), + SizedBox( + width: Adapt.screenW() - Adapt.px(170), + child: Text( + state.name ?? '', + style: TextStyle( + fontSize: Adapt.px(40), fontWeight: FontWeight.bold), + ), + ), + ], + ), + ), + Divider( + height: 1, + ), + _buildListTitel(Icons.format_list_bulleted, 'Add to List', _addToList, + iconColor: _theme.iconTheme.color), + Divider( + height: Adapt.px(1), + ), + _buildListTitel( + state.accountState.favorite + ? Icons.favorite + : Icons.favorite_border, + 'Mark as Favorite', () { + Navigator.of(viewService.context).pop(); + dispatch(MenuActionCreator.setFavorite(!state.accountState.favorite)); + }, + iconColor: state.accountState.favorite + ? Colors.pink[400] + : _theme.iconTheme.color), + Divider( + height: Adapt.px(1), + ), + _buildListTitel( + Icons.flag, + 'Add to your Watchlist', + () { + Navigator.of(viewService.context).pop(); + dispatch( + MenuActionCreator.setWatchlist(!state.accountState.watchlist)); + }, + iconColor: state.accountState.watchlist + ? Colors.red + : _theme.iconTheme.color, + ), + Divider( + height: Adapt.px(1), + ), + _buildListTitel( + state.accountState.rated != null ? Icons.star : Icons.star_border, + 'Rate It', + _rateIt, + iconColor: state.accountState.rated != null + ? Colors.amber + : _theme.iconTheme.color), + Divider( + height: Adapt.px(1), + ), + _buildListTitel(Icons.share, 'Share', _share, + iconColor: _theme.iconTheme.color), + Divider( + height: Adapt.px(1), + ), + ], + ), + ); +} diff --git a/lib/views/tvshow_detail_page/components/recommendation_component/action.dart b/lib/views/tvshow_detail_page/components/recommendation_component/action.dart new file mode 100644 index 00000000..9d0dbe1f --- /dev/null +++ b/lib/views/tvshow_detail_page/components/recommendation_component/action.dart @@ -0,0 +1,14 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; + +enum RecommendationAction { action, cellTapped } + +class RecommendationActionCreator { + static Action onAction() { + return const Action(RecommendationAction.action); + } + + static Action cellTapped(VideoListResult data) { + return Action(RecommendationAction.cellTapped, payload: data); + } +} diff --git a/lib/views/tvshow_detail_page/components/recommendation_component/component.dart b/lib/views/tvshow_detail_page/components/recommendation_component/component.dart new file mode 100644 index 00000000..3852fe52 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/recommendation_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class RecommendationComponent extends Component { + RecommendationComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.data != newState.data; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/recommendation_component/effect.dart b/lib/views/tvshow_detail_page/components/recommendation_component/effect.dart new file mode 100644 index 00000000..e0cc5d5f --- /dev/null +++ b/lib/views/tvshow_detail_page/components/recommendation_component/effect.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/video_list.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + RecommendationAction.action: _onAction, + RecommendationAction.cellTapped: _cellTapped, + }); +} + +void _onAction(Action action, Context ctx) {} +void _cellTapped(Action action, Context ctx) async { + final VideoListResult _data = action.payload; + if (_data == null) return; + await Navigator.of(ctx.context).pushNamed('tvShowDetailPage', + arguments: {'id': _data.id, 'bgpic': _data.backdropPath}); +} diff --git a/lib/views/tvshow_detail_page/components/recommendation_component/reducer.dart b/lib/views/tvshow_detail_page/components/recommendation_component/reducer.dart new file mode 100644 index 00000000..1e65ede2 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/recommendation_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + RecommendationAction.action: _onAction, + }, + ); +} + +RecommendationState _onAction(RecommendationState state, Action action) { + final RecommendationState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/recommendation_component/state.dart b/lib/views/tvshow_detail_page/components/recommendation_component/state.dart new file mode 100644 index 00000000..8462e506 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/recommendation_component/state.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class RecommendationState implements Cloneable { + List data; + @override + RecommendationState clone() { + return RecommendationState()..data = data; + } +} + +class RecommendationConnector + extends ConnOp { + @override + RecommendationState get(TvShowDetailState state) { + RecommendationState substate = new RecommendationState(); + substate.data = state.tvDetailModel?.recommendations?.results; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/recommendation_component/view.dart b/lib/views/tvshow_detail_page/components/recommendation_component/view.dart new file mode 100644 index 00000000..d8bc258a --- /dev/null +++ b/lib/views/tvshow_detail_page/components/recommendation_component/view.dart @@ -0,0 +1,185 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + RecommendationState state, Dispatch dispatch, ViewService viewService) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: state.data == null + ? const _ShimmerList() + : state.data.length > 0 + ? _RecommendationPanel( + data: state.data, + onTap: (d) => + dispatch(RecommendationActionCreator.cellTapped(d)), + ) + : SizedBox(), + ); +} + +class _RecommendationCell extends StatelessWidget { + final VideoListResult data; + final Function(VideoListResult) onTap; + const _RecommendationCell({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _width = Adapt.px(130); + return GestureDetector( + onTap: () => onTap(data), + child: Column( + children: [ + Container( + width: _width, + height: Adapt.px(200), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300), + ), + ), + ), + ), + SizedBox(height: Adapt.px(20)), + SizedBox( + width: _width, + child: Text( + data.name, + maxLines: 3, + overflow: TextOverflow.fade, + style: TextStyle(fontSize: Adapt.px(20)), + textAlign: TextAlign.center, + ), + ), + ], + ), + ); + } +} + +class _RecommendationPanel extends StatelessWidget { + final List data; + final Function(VideoListResult) onTap; + const _RecommendationPanel({this.data, this.onTap}); + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + final _listViewHeight = Adapt.px(320); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Text( + I18n.of(context).recommendations, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + ), + SizedBox(height: Adapt.px(30)), + SizedBox( + height: _listViewHeight, + child: ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: _padding), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(40)), + itemCount: data.length, + itemBuilder: (_, index) => _RecommendationCell( + data: data[index], + onTap: onTap, + ), + ), + ), + ], + ); + } +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final _width = Adapt.px(130); + final _color = const Color(0xFFFFFFFF); + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Container( + width: _width, + height: Adapt.px(200), + decoration: BoxDecoration( + color: _color, + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + ), + SizedBox(height: Adapt.px(20)), + Container( + color: _color, + width: _width, + height: Adapt.px(18), + ), + SizedBox(height: Adapt.px(8)), + Container( + color: _color, + height: Adapt.px(18), + width: Adapt.px(100), + ), + ]); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _padding = Adapt.px(40); + final _listViewHeight = Adapt.px(320); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Text( + I18n.of(context).recommendations, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + ), + SizedBox(height: Adapt.px(30)), + SizedBox( + height: _listViewHeight, + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: _padding), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(40)), + itemCount: 5, + itemBuilder: (_, index) => const _ShimmerCell(), + ), + ), + ), + ], + ); + } +} diff --git a/lib/views/tvshow_detail_page/components/season_component/action.dart b/lib/views/tvshow_detail_page/components/season_component/action.dart new file mode 100644 index 00000000..b7c83c07 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/season_component/action.dart @@ -0,0 +1,14 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/season_detail.dart'; + +enum SeasonAction { action, cellTapped } + +class SeasonActionCreator { + static Action onAction() { + return const Action(SeasonAction.action); + } + + static Action cellTapped(Season season) { + return Action(SeasonAction.cellTapped, payload: season); + } +} diff --git a/lib/views/tvshow_detail_page/components/season_component/component.dart b/lib/views/tvshow_detail_page/components/season_component/component.dart new file mode 100644 index 00000000..06d03516 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/season_component/component.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SeasonComponent extends Component { + SeasonComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.seasons != newState.seasons; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/season_component/effect.dart b/lib/views/tvshow_detail_page/components/season_component/effect.dart new file mode 100644 index 00000000..55e9e477 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/season_component/effect.dart @@ -0,0 +1,27 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/models/season_detail.dart'; + +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SeasonAction.action: _onAction, + SeasonAction.cellTapped: _cellTapped, + }); +} + +void _onAction(Action action, Context ctx) {} + +void _cellTapped(Action action, Context ctx) async { + final Season _season = action.payload; + if (_season == null) return; + await Navigator.of(ctx.context).pushNamed('seasondetailpage', arguments: { + 'tvid': ctx.state.tvid, + 'seasonNumber': _season.seasonNumber, + 'tvShowName': ctx.state.name, + 'seasonName': _season.name, + 'posterpic': _season.posterPath + }); +} diff --git a/lib/views/tvshow_detail_page/components/season_component/reducer.dart b/lib/views/tvshow_detail_page/components/season_component/reducer.dart new file mode 100644 index 00000000..6b6779fc --- /dev/null +++ b/lib/views/tvshow_detail_page/components/season_component/reducer.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SeasonAction.action: _onAction, + }, + ); +} + +SeasonState _onAction(SeasonState state, Action action) { + final SeasonState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/season_component/state.dart b/lib/views/tvshow_detail_page/components/season_component/state.dart new file mode 100644 index 00000000..f4b26bcd --- /dev/null +++ b/lib/views/tvshow_detail_page/components/season_component/state.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class SeasonState implements Cloneable { + List seasons; + int tvid; + String name; + @override + SeasonState clone() { + return SeasonState() + ..seasons = seasons + ..tvid = tvid; + } +} + +class SeasonConnector extends ConnOp { + @override + SeasonState get(TvShowDetailState state) { + SeasonState substate = new SeasonState(); + substate.seasons = state.tvDetailModel?.seasons; + substate.tvid = state.tvid; + substate.name = state.tvDetailModel?.name; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/season_component/view.dart b/lib/views/tvshow_detail_page/components/season_component/view.dart new file mode 100644 index 00000000..1093bbdf --- /dev/null +++ b/lib/views/tvshow_detail_page/components/season_component/view.dart @@ -0,0 +1,279 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/generated/i18n.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/season_detail.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + SeasonState state, Dispatch dispatch, ViewService viewService) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: state.seasons == null + ? const _ShimmerList() + : state.seasons.length > 0 + ? _SeasonPanel( + seasons: state.seasons, + onTap: (d) => dispatch(SeasonActionCreator.cellTapped(d)), + ) + : const SizedBox(), + ); +} + +class _SeasonCell extends StatelessWidget { + final Season data; + final bool watched; + final Function(Season) onTap; + const _SeasonCell({this.data, this.onTap, this.watched = false}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _subStyle = + TextStyle(fontSize: Adapt.px(16), color: const Color(0xFF717171)); + final _width = Adapt.px(130); + return GestureDetector( + onTap: () => onTap(data), + child: SizedBox( + width: _width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: _width, + height: Adapt.px(200), + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(20)), + image: data.posterPath == null + ? null + : DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.posterPath, ImageSize.w300)), + ), + ), + child: watched ? const _WatchedCell() : const SizedBox(), + ), + SizedBox(height: Adapt.px(20)), + Text( + data?.name ?? '', + maxLines: 1, + style: TextStyle(fontSize: Adapt.px(24)), + ), + Text( + data.airDate == null + ? '-' + : DateFormat.yMMMd().format(DateTime.parse(data?.airDate)), + style: _subStyle, + ), + Text( + '${data.episodeCount} Episodes', + style: _subStyle, + ) + ], + ), + ), + ); + } +} + +class _SeasonPanel extends StatefulWidget { + final List seasons; + + final Function(Season) onTap; + const _SeasonPanel({this.seasons, this.onTap}); + @override + _SeasonPanelState createState() => _SeasonPanelState(); +} + +class _SeasonPanelState extends State<_SeasonPanel> { + final _padding = Adapt.px(40); + final _listViewHeight = Adapt.px(320); + List _watchedMarks; + @override + void initState() { + _watchedMarks = List.filled(widget.seasons?.length ?? 0, false); + _markSeason(); + super.initState(); + } + + void _markSeason() async { + final _marks = List(widget.seasons?.length ?? 0); + SharedPreferences _pre = await SharedPreferences.getInstance(); + + for (var q in widget.seasons) { + int _index = widget.seasons.indexOf(q); + List _playStates = _pre.getStringList('TvSeason${q.id}'); + if (_playStates == null) + _marks[_index] = false; + else { + bool _watched = true; + for (var e in _playStates) { + if (e == '0') { + _watched = false; + break; + } + } + _marks[_index] = _watched; + } + } + + setState(() { + _watchedMarks = _marks; + }); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Text( + I18n.of(context).seasons, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + ), + SizedBox(height: Adapt.px(30)), + SizedBox( + height: _listViewHeight, + child: ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: _padding), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(40)), + itemCount: widget.seasons.length, + itemBuilder: (_, index) => _SeasonCell( + data: widget.seasons[(widget.seasons.length - 1) - index], + watched: _watchedMarks[(widget.seasons.length - 1) - index], + onTap: widget.onTap, + ), + ), + ), + ], + ); + } +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final _width = Adapt.px(130); + final _color = const Color(0xFFFFFFFF); + return SizedBox( + width: _width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: _width, + height: Adapt.px(200), + decoration: BoxDecoration( + color: _color, + borderRadius: BorderRadius.circular(Adapt.px(20)), + ), + ), + SizedBox(height: Adapt.px(20)), + Container( + height: Adapt.px(20), + color: _color, + ), + SizedBox(height: Adapt.px(8)), + Container( + height: Adapt.px(14), + width: Adapt.px(80), + color: _color, + ), + SizedBox(height: Adapt.px(8)), + Container( + height: Adapt.px(14), + width: Adapt.px(60), + color: _color, + ), + ], + ), + ); + } +} + +class _ShimmerList extends StatelessWidget { + const _ShimmerList(); + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + final _listViewHeight = Adapt.px(320); + final _theme = ThemeStyle.getTheme(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: _padding), + child: Text( + I18n.of(context).seasons, + style: TextStyle( + fontSize: Adapt.px(28), + fontWeight: FontWeight.w600, + ), + ), + ), + SizedBox(height: Adapt.px(30)), + SizedBox( + height: _listViewHeight, + child: Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: ListView.separated( + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: _padding), + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(40)), + itemCount: 5, + itemBuilder: (_, index) => const _ShimmerCell(), + ), + ), + ), + ], + ); + } +} + +class _WatchedCell extends StatelessWidget { + const _WatchedCell(); + @override + Widget build(BuildContext context) { + final _brightness = MediaQuery.of(context).platformBrightness; + return Align( + alignment: Alignment.bottomRight, + child: Container( + margin: EdgeInsets.all(5), + padding: EdgeInsets.all(3), + decoration: BoxDecoration( + color: _brightness == Brightness.light + ? const Color(0xAAF0F0F0) + : const Color(0xAA202020), + borderRadius: BorderRadius.circular(3)), + child: Text( + 'Watched', + style: TextStyle( + fontSize: 8, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } +} diff --git a/lib/views/tvshow_detail_page/components/swiper_component/action.dart b/lib/views/tvshow_detail_page/components/swiper_component/action.dart new file mode 100644 index 00000000..1aff5bdc --- /dev/null +++ b/lib/views/tvshow_detail_page/components/swiper_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum SwiperAction { action } + +class SwiperActionCreator { + static Action onAction() { + return const Action(SwiperAction.action); + } +} diff --git a/lib/views/tvshow_detail_page/components/swiper_component/component.dart b/lib/views/tvshow_detail_page/components/swiper_component/component.dart new file mode 100644 index 00000000..ed21e116 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/swiper_component/component.dart @@ -0,0 +1,21 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SwiperComponent extends Component { + SwiperComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.backdrops != newState.backdrops || + oldState.videos != newState.videos; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/swiper_component/effect.dart b/lib/views/tvshow_detail_page/components/swiper_component/effect.dart new file mode 100644 index 00000000..23c0fd50 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/swiper_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SwiperAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/tvshow_detail_page/components/swiper_component/reducer.dart b/lib/views/tvshow_detail_page/components/swiper_component/reducer.dart new file mode 100644 index 00000000..48d415fd --- /dev/null +++ b/lib/views/tvshow_detail_page/components/swiper_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SwiperAction.action: _onAction, + }, + ); +} + +SwiperState _onAction(SwiperState state, Action action) { + final SwiperState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/swiper_component/state.dart b/lib/views/tvshow_detail_page/components/swiper_component/state.dart new file mode 100644 index 00000000..48f75ef6 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/swiper_component/state.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class SwiperState implements Cloneable { + List videos; + List backdrops; + @override + SwiperState clone() { + return SwiperState(); + } +} + +class SwiperConnector extends ConnOp { + @override + SwiperState get(TvShowDetailState state) { + SwiperState substate = new SwiperState(); + substate.backdrops = state.imagesmodel?.backdrops; + substate.videos = state.videomodel?.results; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/swiper_component/view.dart b/lib/views/tvshow_detail_page/components/swiper_component/view.dart new file mode 100644 index 00000000..78c5fa00 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/swiper_component/view.dart @@ -0,0 +1,298 @@ +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/video_model.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart'; + +import 'state.dart'; + +Widget buildView( + SwiperState state, Dispatch dispatch, ViewService viewService) { + return _SwiperPanel( + backdrops: state.backdrops, + videos: state.videos, + ); +} + +class _SwiperPanel extends StatefulWidget { + final List videos; + final List backdrops; + const _SwiperPanel({this.videos, this.backdrops}); + @override + _SwiperPanelState createState() => _SwiperPanelState(); +} + +class _SwiperPanelState extends State<_SwiperPanel> { + int _currentIndex; + @override + void initState() { + _currentIndex = 0; + super.initState(); + } + + _setCurrectIndex(int index) { + setState(() { + _currentIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + final _padding = Adapt.px(40); + final _width = Adapt.screenW() - _padding * 2; + final _height = _width * 9 / 16; + return Container( + height: _height + Adapt.px(30), + child: Column( + children: [ + SizedBox( + height: _height, + child: Swiper( + itemCount: 5, + onIndexChanged: _setCurrectIndex, + itemWidth: Adapt.screenW(), + itemBuilder: (context, index) { + if (index == 0 && widget.videos.length > 0) { + return _VideoCell( + videos: widget.videos, + ); + } + return _BackDropCell( + data: widget.backdrops.length > index + 1 + ? widget.backdrops[index] + : null, + ); + }, + ), + ), + SizedBox(height: Adapt.px(20)), + _SwiperPagination( + lenght: 5, + currentIndex: _currentIndex, + ), + ], + ), + ); + } +} + +class _SwiperPagination extends StatelessWidget { + final int lenght; + final int currentIndex; + const _SwiperPagination({this.lenght, this.currentIndex}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _cellWidth = Adapt.px(20); + final _height = Adapt.px(6); + final _width = + lenght > 0 ? _cellWidth * lenght + Adapt.px(10) * (lenght - 1) : 0.0; + return Container( + width: _width, + height: _height, + child: Align( + alignment: Alignment.center, + child: ListView.separated( + scrollDirection: Axis.horizontal, + separatorBuilder: (_, __) => SizedBox(width: Adapt.px(10)), + itemCount: lenght, + itemBuilder: (_, index) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + width: _cellWidth, + height: _height, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(_height / 2), + color: index == currentIndex + ? _theme.iconTheme.color + : _theme.primaryColorDark, + ), + ); + }, + ), + )); + } +} + +class _BackDropCell extends StatelessWidget { + final ImageData data; + const _BackDropCell({this.data}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _padding = Adapt.px(40); + final _width = Adapt.screenW() - _padding * 2; + final _height = _width * 9 / 16; + return Container( + margin: EdgeInsets.symmetric(horizontal: _padding), + height: _height, + width: _width, + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(25)), + image: data != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.filePath, ImageSize.w500), + ), + ) + : null, + ), + ); + } +} + +class _VideoCell extends StatefulWidget { + final List videos; + const _VideoCell({this.videos}); + @override + _VideoCellState createState() => _VideoCellState(); +} + +class _VideoCellState extends State<_VideoCell> { + YoutubePlayerController _youtubePlayerController; + String _videoId = ''; + bool _playVideo = false; + + @override + void didUpdateWidget(_VideoCell oldWidget) { + if (oldWidget.videos != widget.videos) _updateYoutubeController(); + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + _youtubePlayerController?.dispose(); + super.dispose(); + } + + @override + void initState() { + _updateYoutubeController(); + _youtubePlayerController = YoutubePlayerController( + initialVideoId: _videoId, + ); + super.initState(); + } + + _updateYoutubeController() { + if ((widget.videos?.length ?? 0) > 0) { + _videoId = widget.videos[0].key; + setState(() {}); + } + } + + _startPlayVideo(bool play) { + if (!play) { + _youtubePlayerController.reset(); + _youtubePlayerController.reload(); + } else + _youtubePlayerController.play(); + setState(() { + _playVideo = play; + }); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final double _padding = Adapt.px(40); + final _width = Adapt.screenW() - _padding * 2; + final _height = _width * 9 / 16; + return Stack( + children: [ + Container( + margin: EdgeInsets.symmetric(horizontal: _padding), + height: _height, + width: _width, + decoration: BoxDecoration( + color: _theme.primaryColorDark, + borderRadius: BorderRadius.circular(Adapt.px(25)), + image: (widget.videos.length ?? 0) > 0 + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + 'https://i.ytimg.com/vi/${widget.videos[0]?.key ?? ''}/hqdefault.jpg'), + ) + : null, + ), + child: Container( + decoration: BoxDecoration( + color: const Color(0x55000000), + borderRadius: BorderRadius.circular(Adapt.px(25)), + ), + ), + ), + GestureDetector( + onTap: () => _startPlayVideo(true), + child: Container( + height: _height, + alignment: Alignment.center, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(50)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8, sigmaY: 8), + child: Container( + color: const Color(0x40FFFFFF), + width: Adapt.px(100), + height: Adapt.px(100), + child: Icon( + Icons.play_arrow, + size: 25, + color: const Color(0xFFFFFFFF), + ), + ), + ), + ), + ), + ), + _VideoPlayer( + controller: _youtubePlayerController, + play: _playVideo, + onEnd: () => _startPlayVideo(false), + ) + ], + ); + } +} + +class _VideoPlayer extends StatelessWidget { + final YoutubePlayerController controller; + final bool play; + final Function onEnd; + const _VideoPlayer({this.controller, this.play, this.onEnd}); + @override + Widget build(BuildContext context) { + final double _padding = Adapt.px(40); + final _width = Adapt.screenW() - _padding * 2; + final _height = _width * 9 / 16; + return play + ? Container( + margin: EdgeInsets.symmetric(horizontal: _padding), + height: _height, + width: _width, + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(25)), + child: YoutubePlayer( + controller: controller, + onEnded: (d) => onEnd(), + progressColors: ProgressBarColors( + playedColor: const Color(0xFFFFFFFF), + handleColor: const Color(0xFFFFFFFF), + bufferedColor: const Color(0xFFE0E0E0), + ), + ), + ), + ) + : const SizedBox(); + } +} diff --git a/lib/views/tvshow_detail_page/components/title_component/action.dart b/lib/views/tvshow_detail_page/components/title_component/action.dart new file mode 100644 index 00000000..87ebc0f5 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/title_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum TitleAction { action } + +class TitleActionCreator { + static Action onAction() { + return const Action(TitleAction.action); + } +} diff --git a/lib/views/tvshow_detail_page/components/title_component/component.dart b/lib/views/tvshow_detail_page/components/title_component/component.dart new file mode 100644 index 00000000..5b42d78a --- /dev/null +++ b/lib/views/tvshow_detail_page/components/title_component/component.dart @@ -0,0 +1,24 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TitleComponent extends Component { + TitleComponent() + : super( + effect: buildEffect(), + reducer: buildReducer(), + shouldUpdate: (oldState, newState) { + return oldState.name != newState.name || + oldState.genres != newState.genres || + oldState.contentRatings != newState.contentRatings || + oldState.vote != newState.vote || + oldState.overview != newState.overview; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/tvshow_detail_page/components/title_component/effect.dart b/lib/views/tvshow_detail_page/components/title_component/effect.dart new file mode 100644 index 00000000..db160ebe --- /dev/null +++ b/lib/views/tvshow_detail_page/components/title_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TitleAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/tvshow_detail_page/components/title_component/reducer.dart b/lib/views/tvshow_detail_page/components/title_component/reducer.dart new file mode 100644 index 00000000..cfb2f72e --- /dev/null +++ b/lib/views/tvshow_detail_page/components/title_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TitleAction.action: _onAction, + }, + ); +} + +TitleState _onAction(TitleState state, Action action) { + final TitleState newState = state.clone(); + return newState; +} diff --git a/lib/views/tvshow_detail_page/components/title_component/state.dart b/lib/views/tvshow_detail_page/components/title_component/state.dart new file mode 100644 index 00000000..4861f507 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/title_component/state.dart @@ -0,0 +1,34 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/views/tvshow_detail_page/state.dart'; + +class TitleState implements Cloneable { + String name; + List genres; + double vote; + ContentRatingModel contentRatings; + String overview; + TitleState(); + @override + TitleState clone() { + return TitleState() + ..name = name + ..genres = genres + ..vote = vote + ..contentRatings = contentRatings + ..overview = overview; + } +} + +class TitleConnector extends ConnOp { + @override + TitleState get(TvShowDetailState state) { + TitleState substate = TitleState(); + substate.name = state.tvDetailModel?.name; + substate.contentRatings = state.tvDetailModel?.contentRatings; + substate.genres = state.tvDetailModel?.genres; + substate.vote = state.tvDetailModel?.voteAverage; + substate.overview = state.tvDetailModel?.overview; + return substate; + } +} diff --git a/lib/views/tvshow_detail_page/components/title_component/view.dart b/lib/views/tvshow_detail_page/components/title_component/view.dart new file mode 100644 index 00000000..fd6f19d4 --- /dev/null +++ b/lib/views/tvshow_detail_page/components/title_component/view.dart @@ -0,0 +1,172 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/votecolorhelper.dart'; +import 'package:movie/widgets/expandable_text.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; +import 'dart:ui'; + +import 'state.dart'; + +Widget buildView(TitleState state, Dispatch dispatch, ViewService viewService) { + return AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: state.name == null + ? const _ShimmerCell() + : _Title( + name: state.name, + genres: state.genres, + contentRatings: state.contentRatings, + overview: state.overview, + vote: state.vote, + ), + ); +} + +class _ShimmerCell extends StatelessWidget { + const _ShimmerCell(); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Padding( + padding: EdgeInsets.symmetric( + vertical: Adapt.px(30), horizontal: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: Adapt.px(8)), + Container( + width: Adapt.px(350), + height: Adapt.px(25), + color: _theme.primaryColorDark, + ), + SizedBox(height: Adapt.px(20)), + Container( + width: Adapt.px(150), + height: Adapt.px(20), + color: _theme.primaryColorDark, + ), + SizedBox(height: Adapt.px(10)), + Container( + width: Adapt.px(100), + height: Adapt.px(20), + color: _theme.primaryColorDark, + ), + SizedBox(height: Adapt.px(20)), + Container( + height: Adapt.px(45), + width: Adapt.px(80), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(20), vertical: Adapt.px(8)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(22.5)), + color: _theme.primaryColorDark), + ), + SizedBox(height: Adapt.px(40)), + Container( + height: Adapt.px(20), + color: _theme.primaryColorDark, + ), + SizedBox(height: Adapt.px(12)), + Container( + height: Adapt.px(20), + color: _theme.primaryColorDark, + ), + SizedBox(height: Adapt.px(12)), + Container( + width: Adapt.px(350), + height: Adapt.px(20), + color: _theme.primaryColorDark, + ), + ], + ), + ), + ); + } +} + +class _Title extends StatelessWidget { + final String name; + final List genres; + final double vote; + final ContentRatingModel contentRatings; + final String overview; + final ViewService viewService; + const _Title( + {this.name, + this.contentRatings, + this.genres, + this.overview, + this.vote, + this.viewService}); + @override + Widget build(BuildContext context) { + final _rate = contentRatings?.results?.firstWhere( + (e) => e?.iso31661 == window.locale.countryCode, + orElse: () => null); + return Container( + width: Adapt.screenW(), + padding: EdgeInsets.symmetric( + vertical: Adapt.px(30), horizontal: Adapt.px(40)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name ?? '', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30), + ), + ), + SizedBox(height: Adapt.px(15)), + Text( + genres?.take(3)?.map((e) => e.name)?.join(', ') ?? '', + style: TextStyle( + color: const Color(0xFF717171), + fontSize: Adapt.px(22), + ), + ), + SizedBox(height: Adapt.px(8)), + Text( + 'Certification ${_rate?.rating ?? '-'}', + style: TextStyle( + color: const Color(0xFF717171), + fontSize: Adapt.px(22), + ), + ), + SizedBox(height: Adapt.px(20)), + Container( + height: Adapt.px(45), + padding: EdgeInsets.symmetric( + horizontal: Adapt.px(20), vertical: Adapt.px(8)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(Adapt.px(22.5)), + color: VoteColorHelper.getColor(vote ?? 0)), + child: Text( + vote?.toStringAsFixed(1) ?? '0.0', + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: Adapt.px(24), + letterSpacing: 1.5, + fontWeight: FontWeight.w600), + ), + ), + SizedBox(height: Adapt.px(25)), + ExpandableText( + overview ?? '', + maxLines: 3, + style: TextStyle( + fontSize: Adapt.px(26), + color: const Color(0xFF717171), + ), + ) + ], + ), + ); + } +} diff --git a/lib/views/tvshow_detail_page/effect.dart b/lib/views/tvshow_detail_page/effect.dart new file mode 100644 index 00000000..f9d18dfc --- /dev/null +++ b/lib/views/tvshow_detail_page/effect.dart @@ -0,0 +1,118 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/widgets/gallery_photoview_wrapper.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/image_model.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + TvShowDetailAction.action: _onAction, + TvShowDetailAction.recommendationTapped: _onRecommendationTapped, + TvShowDetailAction.castCellTapped: _onCastCellTapped, + TvShowDetailAction.openMenu: _openMenu, + TvShowDetailAction.showSnackBar: _showSnackBar, + TvShowDetailAction.onImageCellTapped: _onImageCellTapped, + TvShowDetailAction.moreEpisode: _moreEpisode, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + try { + Future.delayed(Duration(milliseconds: 300), () async { + final _tmdb = TMDBApi.instance; + final _tvDetail = await _tmdb.getTVDetail(ctx.state.tvid, + appendtoresponse: + 'keywords,recommendations,credits,external_ids,content_ratings'); + if (_tvDetail.success) { + ctx.dispatch(TvShowDetailActionCreator.onInit(_tvDetail.result)); + } + + final _tvVideo = await _tmdb.getTVVideo(ctx.state.tvid); + if (_tvVideo.success) + ctx.dispatch(TvShowDetailActionCreator.onSetVideos(_tvVideo.result)); + final _tvImages = await _tmdb.getTVImages(ctx.state.tvid); + if (_tvImages.success) + ctx.dispatch(TvShowDetailActionCreator.onSetImages(_tvImages.result)); + + final _user = GlobalStore.store.getState().user; + if (_user != null) { + final _baseApi = BaseApi.instance; + final _accountstate = await _baseApi.getAccountState( + _user?.firebaseUser?.uid, ctx.state.tvid, MediaType.tv); + if (_accountstate.success) + ctx.dispatch(TvShowDetailActionCreator.onSetAccountState( + _accountstate.result)); + } + }); + } on Exception catch (_) {} +} + +void _onDispose(Action action, Context ctx) {} + +void _moreEpisode(Action action, Context ctx) async { + if (ctx.state.tvDetailModel != null) + await Navigator.of(ctx.context).pushNamed('seasonLinkPage', arguments: { + 'tvid': ctx.state.tvid, + 'detail': ctx.state.tvDetailModel, + }); +} + +Future _onRecommendationTapped( + Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('tvShowdetailpage', + arguments: {'id': action.payload[0], 'bgpic': action.payload[1]}); +} + +Future _onCastCellTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).pushNamed('peopledetailpage', arguments: { + 'peopleid': action.payload[0], + 'profilePath': action.payload[1], + 'profileName': action.payload[2] + }); +} + +void _openMenu(Action action, Context ctx) { + showModalBottomSheet( + context: ctx.context, + backgroundColor: Colors.transparent, + builder: (context) { + return ctx.buildComponent('menu'); + }); +} + +void _showSnackBar(Action action, Context ctx) { + Scaffold.of(ctx.context).showSnackBar(SnackBar( + content: Text(action.payload ?? ''), + )); +} + +Future _onImageCellTapped(Action action, Context ctx) async { + final int _index = action.payload[0]; + final List _images = action.payload[1]; + await Navigator.of(ctx.context).push( + PageRouteBuilder( + transitionDuration: Duration(milliseconds: 300), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + return new FadeTransition( + opacity: animation, + child: GalleryPhotoViewWrapper( + imageSize: ImageSize.w400, + galleryItems: _images, + initialIndex: _index, + ), + ); + }, + ), + ); +} diff --git a/lib/views/tvshow_detail_page/page.dart b/lib/views/tvshow_detail_page/page.dart new file mode 100644 index 00000000..60ab782b --- /dev/null +++ b/lib/views/tvshow_detail_page/page.dart @@ -0,0 +1,47 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/cast_component/component.dart'; +import 'components/cast_component/state.dart'; +import 'components/keyword_component/component.dart'; +import 'components/keyword_component/state.dart'; +import 'components/last_episode_component/component.dart'; +import 'components/last_episode_component/state.dart'; +import 'components/menu_component/component.dart'; +import 'components/menu_component/state.dart'; +import 'components/recommendation_component/component.dart'; +import 'components/recommendation_component/state.dart'; +import 'components/season_component/component.dart'; +import 'components/season_component/state.dart'; +import 'components/swiper_component/component.dart'; +import 'components/swiper_component/state.dart'; + +import 'components/title_component/component.dart'; +import 'components/title_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class TvShowDetailPage extends Page> + with TickerProviderMixin { + TvShowDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'menu': MenuConnector() + MenuComponent(), + 'swiper': SwiperConnector() + SwiperComponent(), + 'title': TitleConnector() + TitleComponent(), + 'cast': CastConnector() + CastComponent(), + 'lastEpisode': LastEpisodeConnector() + LastEpisodeComponent(), + 'season': SeasonConnector() + SeasonComponent(), + 'keyword': KeywordConnector() + KeywordComponent(), + 'recommendation': + RecommendationConnector() + RecommendationComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/tvshow_detail_page/reducer.dart b/lib/views/tvshow_detail_page/reducer.dart new file mode 100644 index 00000000..d2ef3970 --- /dev/null +++ b/lib/views/tvshow_detail_page/reducer.dart @@ -0,0 +1,91 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/models/video_model.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + TvShowDetailAction.action: _onAction, + TvShowDetailAction.init: _onInit, + TvShowDetailAction.setCredits: _onCredits, + TvShowDetailAction.setImages: _onSetImages, + TvShowDetailAction.setReviews: _onSetReviews, + TvShowDetailAction.setRecommendation: _onSetRecommendations, + TvShowDetailAction.setKeyWords: _onSetKeyWords, + TvShowDetailAction.setVideos: _onSetVideos, + TvShowDetailAction.setAccountState: _onSetAccountState + }, + ); +} + +TvShowDetailState _onAction(TvShowDetailState state, Action action) { + final TvShowDetailState newState = state.clone(); + return newState; +} + +TvShowDetailState _onInit(TvShowDetailState state, Action action) { + TVDetailModel model = action.payload ?? new TVDetailModel.fromParams(); + final TvShowDetailState newState = state.clone(); + newState.tvDetailModel = model; + return newState; +} + +TvShowDetailState _onCredits(TvShowDetailState state, Action action) { + CreditsModel c = action.payload; + final TvShowDetailState newState = state.clone(); + newState.creditsModel = c; + return newState; +} + +TvShowDetailState _onSetImages(TvShowDetailState state, Action action) { + ImageModel c = action.payload; + final TvShowDetailState newState = state.clone(); + newState.imagesmodel = c; + return newState; +} + +TvShowDetailState _onSetReviews(TvShowDetailState state, Action action) { + ReviewModel c = action.payload; + final TvShowDetailState newState = state.clone(); + newState.reviewModel = c; + return newState; +} + +TvShowDetailState _onSetRecommendations( + TvShowDetailState state, Action action) { + VideoListModel c = action.payload; + final TvShowDetailState newState = state.clone(); + newState.recommendations = c; + return newState; +} + +TvShowDetailState _onSetKeyWords(TvShowDetailState state, Action action) { + KeyWordModel c = action.payload ?? + new KeyWordModel.fromParams(keywords: List()); + final TvShowDetailState newState = state.clone(); + newState.keywords = c; + return newState; +} + +TvShowDetailState _onSetVideos(TvShowDetailState state, Action action) { + VideoModel c = action.payload; + final TvShowDetailState newState = state.clone(); + newState.videomodel = c; + return newState; +} + +TvShowDetailState _onSetAccountState(TvShowDetailState state, Action action) { + AccountState c = action.payload; + final TvShowDetailState newState = state.clone(); + newState.accountState = c; + return newState; +} diff --git a/lib/views/tvshow_detail_page/state.dart b/lib/views/tvshow_detail_page/state.dart new file mode 100644 index 00000000..7182b26f --- /dev/null +++ b/lib/views/tvshow_detail_page/state.dart @@ -0,0 +1,66 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/account_state.dart'; +import 'package:movie/models/credits_model.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:movie/models/keyword.dart'; +import 'package:movie/models/review.dart'; +import 'package:movie/models/tvshow_detail.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:movie/models/video_model.dart'; + +class TvShowDetailState implements Cloneable { + GlobalKey scaffoldkey; + TVDetailModel tvDetailModel; + int tvid; + CreditsModel creditsModel; + ImageModel imagesmodel; + ReviewModel reviewModel; + VideoListModel recommendations; + KeyWordModel keywords; + VideoModel videomodel; + AccountState accountState; + @override + TvShowDetailState clone() { + return TvShowDetailState() + ..scaffoldkey = scaffoldkey + ..tvDetailModel = tvDetailModel + ..creditsModel = creditsModel + ..tvid = tvid + ..reviewModel = reviewModel + ..imagesmodel = imagesmodel + ..recommendations = recommendations + ..keywords = keywords + ..videomodel = videomodel + ..accountState = accountState; + } +} + +TvShowDetailState initState(Map args) { + TvShowDetailState state = TvShowDetailState(); + state.scaffoldkey = + GlobalKey(debugLabel: '_TvShowDetailPagekey'); + state.tvid = args['id']; + + state.tvDetailModel = new TVDetailModel.fromParams(); + state.creditsModel = new CreditsModel.fromParams( + cast: List(), crew: List()); + + state.imagesmodel = new ImageModel.fromParams( + posters: List(), backdrops: List()); + state.reviewModel = new ReviewModel.fromParams(results: List()); + state.recommendations = + new VideoListModel.fromParams(results: List()); + state.keywords = new KeyWordModel.fromParams( + keywords: List(), results: List()); + state.videomodel = new VideoModel.fromParams(results: List()); + state.accountState = AccountState.fromParams( + id: 0, + uid: GlobalStore.store.getState().user?.firebaseUser?.uid, + mediaId: state.tvid, + favorite: false, + watchlist: false, + mediaType: 'tv'); + return state; +} diff --git a/lib/views/tvshow_detail_page/view.dart b/lib/views/tvshow_detail_page/view.dart new file mode 100644 index 00000000..d250559c --- /dev/null +++ b/lib/views/tvshow_detail_page/view.dart @@ -0,0 +1,48 @@ +import 'dart:ui'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + TvShowDetailState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + final _theme = ThemeStyle.getTheme(context); + return Scaffold( + backgroundColor: _theme.backgroundColor, + appBar: AppBar( + iconTheme: _theme.iconTheme, + elevation: 0.0, + backgroundColor: _theme.backgroundColor, + brightness: _theme.brightness, + title: Text( + state?.tvDetailModel?.name ?? '', + style:TextStyle(color: _theme.textTheme.bodyText1.color), + ), + actions: [ + IconButton( + icon:const Icon(Icons.more_vert), + onPressed: () => dispatch(TvShowDetailActionCreator.openMenu())) + ], + ), + body: ListView( + padding: EdgeInsets.symmetric(vertical: Adapt.px(30)), + physics: BouncingScrollPhysics(), + children: [ + viewService.buildComponent('swiper'), + viewService.buildComponent('title'), + viewService.buildComponent('cast'), + viewService.buildComponent('season'), + viewService.buildComponent('lastEpisode'), + viewService.buildComponent('keyword'), + viewService.buildComponent('recommendation'), + ], + ), + ); + }, + ); +} diff --git a/lib/views/views.dart b/lib/views/views.dart new file mode 100644 index 00000000..d04c4e79 --- /dev/null +++ b/lib/views/views.dart @@ -0,0 +1,37 @@ +export 'cast_list/cast_list_detail_page/page.dart'; +export 'cast_list/cast_list_page/page.dart'; +export 'checkout_page/page.dart'; +export 'coming_page/page.dart'; +export 'createlist_page/page.dart'; +export 'discover_page/page.dart'; +export 'download_page/page.dart'; +export 'episodedetail_page/page.dart'; +export 'favorites_page/page.dart'; +export 'gallery_page/page.dart'; +export 'home_page/page.dart'; +export 'listdetail_page/page.dart'; +export 'login_page/page.dart'; +export 'main_page/page.dart'; +export 'moremedia_page/page.dart'; +export 'mylists_page/page.dart'; +export 'notification_page/page.dart'; +export 'payment_page/page.dart'; +export 'peopledetail_page/page.dart'; +export 'premium_page/page.dart'; +export 'register_page/page.dart'; +export 'seasondetail_page/page.dart'; +export 'seasons_page/page.dart'; +export 'setting_page/page.dart'; +export 'start_page/page.dart'; +export 'stream_link/allstreamlink_page/page.dart'; +export 'stream_link/episode_livestream_page/page.dart'; +export 'stream_link/movie_livestream_page/page.dart'; +export 'stream_link/season_link_page/page.dart'; +export 'test_page/page.dart'; +export 'trending_page/page.dart'; +export 'tvshow_detail_page/page.dart'; +export 'watchlist_page/page.dart'; +export 'watchlistdetail_page/page.dart'; + +export 'detail_page/page.dart'; +export 'account_page/page.dart'; diff --git a/lib/views/watchlist_page/action.dart b/lib/views/watchlist_page/action.dart new file mode 100644 index 00000000..d71b9dfc --- /dev/null +++ b/lib/views/watchlist_page/action.dart @@ -0,0 +1,32 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; + +enum WatchlistPageAction { + action, + setTVShow, + swiperChanged, + swiperCellTapped, + setMovie, +} + +class WatchlistPageActionCreator { + static Action onAction() { + return const Action(WatchlistPageAction.action); + } + + static Action setTVShow(UserMediaModel d) { + return Action(WatchlistPageAction.setTVShow, payload: d); + } + + static Action swiperChanged(UserMedia d) { + return Action(WatchlistPageAction.swiperChanged, payload: d); + } + + static Action swiperCellTapped() { + return const Action(WatchlistPageAction.swiperCellTapped); + } + + static Action setMovie(UserMediaModel d) { + return Action(WatchlistPageAction.setMovie, payload: d); + } +} diff --git a/lib/views/watchlist_page/components/header_component/action.dart b/lib/views/watchlist_page/components/header_component/action.dart new file mode 100644 index 00000000..59d4a382 --- /dev/null +++ b/lib/views/watchlist_page/components/header_component/action.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum HeaderAction { + action, + widthChanged, +} + +class HeaderActionCreator { + static Action onAction() { + return const Action(HeaderAction.action); + } + + static Action widthChanged(bool d) { + return Action(HeaderAction.widthChanged, payload: d); + } +} diff --git a/lib/views/watchlist_page/components/header_component/component.dart b/lib/views/watchlist_page/components/header_component/component.dart new file mode 100644 index 00000000..cef0c650 --- /dev/null +++ b/lib/views/watchlist_page/components/header_component/component.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class HeaderComponent extends Component { + HeaderComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.animationController != + newState.animationController || + oldState.isMovie != newState.isMovie; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/watchlist_page/components/header_component/effect.dart b/lib/views/watchlist_page/components/header_component/effect.dart new file mode 100644 index 00000000..ef23ed69 --- /dev/null +++ b/lib/views/watchlist_page/components/header_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + HeaderAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/watchlist_page/components/header_component/reducer.dart b/lib/views/watchlist_page/components/header_component/reducer.dart new file mode 100644 index 00000000..1f8969ba --- /dev/null +++ b/lib/views/watchlist_page/components/header_component/reducer.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + HeaderAction.action: _onAction, + HeaderAction.widthChanged: _widthChanged, + }, + ); +} + +HeaderState _onAction(HeaderState state, Action action) { + final HeaderState newState = state.clone(); + return newState; +} + +HeaderState _widthChanged(HeaderState state, Action action) { + final bool isMovie = action.payload ?? false; + final HeaderState newState = state.clone(); + newState.isMovie = isMovie; + if (isMovie && newState.movies?.data != null) + newState.selectMdeia = newState.movies.data[0]; + else if (!isMovie && newState.tvshows?.data != null) + newState.selectMdeia = newState.tvshows.data[0]; + else + newState.selectMdeia = null; + return newState; +} diff --git a/lib/views/watchlist_page/components/header_component/state.dart b/lib/views/watchlist_page/components/header_component/state.dart new file mode 100644 index 00000000..f2f5d85f --- /dev/null +++ b/lib/views/watchlist_page/components/header_component/state.dart @@ -0,0 +1,39 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/views/watchlist_page/state.dart'; + +class HeaderState implements Cloneable { + AnimationController animationController; + bool isMovie; + + UserMedia selectMdeia; + UserMediaModel movies; + UserMediaModel tvshows; + @override + HeaderState clone() { + return HeaderState() + ..isMovie = isMovie + ..selectMdeia = selectMdeia + ..movies = movies + ..tvshows = tvshows; + } +} + +class HeaderConnector extends ConnOp { + @override + HeaderState get(WatchlistPageState state) { + final HeaderState mstate = HeaderState(); + mstate.animationController = state.animationController; + mstate.isMovie = state.isMovie; + mstate.movies = state.movies; + mstate.tvshows = state.tvshows; + return mstate; + } + + @override + void set(WatchlistPageState state, HeaderState subState) { + state.selectMdeia = subState.selectMdeia; + state.isMovie = subState.isMovie; + } +} diff --git a/lib/views/watchlist_page/components/header_component/view.dart b/lib/views/watchlist_page/components/header_component/view.dart new file mode 100644 index 00000000..096bcd63 --- /dev/null +++ b/lib/views/watchlist_page/components/header_component/view.dart @@ -0,0 +1,96 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/generated/i18n.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView( + HeaderState state, Dispatch dispatch, ViewService viewService) { + final TextStyle _selectTextStyle = + TextStyle(fontSize: Adapt.px(45), fontWeight: FontWeight.bold); + final TextStyle _unselectTextStyle = + TextStyle(fontSize: Adapt.px(30), fontWeight: FontWeight.bold); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + InkWell( + onTap: () { + if (!state.isMovie) { + dispatch(HeaderActionCreator.widthChanged(true)); + state.animationController.reverse(); + } + }, + child: Container( + alignment: Alignment.bottomCenter, + height: Adapt.px(60), + width: Adapt.px(250), + child: Text( + I18n.of(viewService.context).movies, + style: state.isMovie ? _selectTextStyle : _unselectTextStyle, + ), + ), + ), + InkWell( + onTap: () { + if (state.isMovie) { + dispatch(HeaderActionCreator.widthChanged(false)); + state.animationController.forward(from: 0.0); + } + }, + child: Container( + alignment: Alignment.bottomCenter, + height: Adapt.px(60), + width: Adapt.px(250), + child: Text( + I18n.of(viewService.context).tvShows, + style: state.isMovie ? _unselectTextStyle : _selectTextStyle, + )), + ), + Expanded( + child: Container(), + ), + Container( + width: Adapt.px(50), + height: Adapt.px(50), + decoration: BoxDecoration( + color: Colors.black87, + borderRadius: BorderRadius.circular(Adapt.px(10))), + child: IconButton( + padding: EdgeInsets.zero, + icon: Icon(Icons.close, color: Colors.white), + onPressed: () => Navigator.of(viewService.context).pop(), + ), + ), + SizedBox( + width: Adapt.px(30), + ) + ], + ), + SizedBox( + height: Adapt.px(10), + ), + Container( + alignment: Alignment.centerLeft, + width: Adapt.px(500), + child: SlideTransition( + position: Tween(begin: Offset.zero, end: Offset(1, 0)).animate( + CurvedAnimation( + curve: Curves.ease, parent: state.animationController)), + child: Container( + width: Adapt.px(250), + height: Adapt.px(20), + decoration: + BoxDecoration(color: Colors.orange, shape: BoxShape.circle), + ), + ), + ), + SizedBox(height: Adapt.px(80)), + ], + ); +} diff --git a/lib/views/watchlist_page/components/info_component/component.dart b/lib/views/watchlist_page/components/info_component/component.dart new file mode 100644 index 00000000..c218c28e --- /dev/null +++ b/lib/views/watchlist_page/components/info_component/component.dart @@ -0,0 +1,16 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'state.dart'; +import 'view.dart'; + +class InfoComponent extends Component { + InfoComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.selectMdeia != newState.selectMdeia; + }, + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/watchlist_page/components/info_component/state.dart b/lib/views/watchlist_page/components/info_component/state.dart new file mode 100644 index 00000000..13ed3476 --- /dev/null +++ b/lib/views/watchlist_page/components/info_component/state.dart @@ -0,0 +1,20 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/views/watchlist_page/state.dart'; + +class InfoState implements Cloneable { + UserMedia selectMdeia; + @override + InfoState clone() { + return InfoState()..selectMdeia = selectMdeia; + } +} + +class InfoConnector extends ConnOp { + @override + InfoState get(WatchlistPageState state) { + final InfoState mstate = InfoState(); + mstate.selectMdeia = state.selectMdeia; + return mstate; + } +} diff --git a/lib/views/watchlist_page/components/info_component/view.dart b/lib/views/watchlist_page/components/info_component/view.dart new file mode 100644 index 00000000..4279bb93 --- /dev/null +++ b/lib/views/watchlist_page/components/info_component/view.dart @@ -0,0 +1,96 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'state.dart'; + +Widget buildView(InfoState state, Dispatch dispatch, ViewService viewService) { + final ThemeData _theme = ThemeStyle.getTheme(viewService.context); + var _d = state.selectMdeia; + Widget _child = _d == null + ? Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: Adapt.px(45), + width: Adapt.px(400), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(30), + ), + Container( + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + height: Adapt.px(24), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + Container( + height: Adapt.px(24), + width: Adapt.px(200), + color: Colors.grey[200], + ), + SizedBox( + height: Adapt.px(8), + ), + ], + ), + ) + : Column( + key: ValueKey(_d), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(_d.name, + style: TextStyle( + fontSize: Adapt.px(45), fontWeight: FontWeight.bold)), + SizedBox( + height: Adapt.px(20), + ), + Text(_d.genre.split(',')?.join(' / ') ?? ''), + SizedBox( + height: Adapt.px(20), + ), + Text( + _d.overwatch ?? '', + maxLines: 5, + ) + ], + ); + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(50)), + child: AnimatedSwitcher( + transitionBuilder: (w, a) { + return SlideTransition( + position: a.drive(Tween(begin: Offset(0, 0.2), end: Offset.zero)), + child: FadeTransition( + opacity: a, + child: w, + ), + ); + }, + duration: Duration(milliseconds: 300), + reverseDuration: Duration(milliseconds: 0), + child: _child, + ), + ); +} diff --git a/lib/views/watchlist_page/components/swiper_component/action.dart b/lib/views/watchlist_page/components/swiper_component/action.dart new file mode 100644 index 00000000..1aff5bdc --- /dev/null +++ b/lib/views/watchlist_page/components/swiper_component/action.dart @@ -0,0 +1,9 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum SwiperAction { action } + +class SwiperActionCreator { + static Action onAction() { + return const Action(SwiperAction.action); + } +} diff --git a/lib/views/watchlist_page/components/swiper_component/component.dart b/lib/views/watchlist_page/components/swiper_component/component.dart new file mode 100644 index 00000000..f6dabf6a --- /dev/null +++ b/lib/views/watchlist_page/components/swiper_component/component.dart @@ -0,0 +1,23 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class SwiperComponent extends Component { + SwiperComponent() + : super( + shouldUpdate: (oldState, newState) { + return oldState.isMovie != newState.isMovie || + oldState.movies != newState.movies || + oldState.tvshows != newState.tvshows || + oldState.swiperController != newState.swiperController; + }, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, slots: >{}), + ); +} diff --git a/lib/views/watchlist_page/components/swiper_component/effect.dart b/lib/views/watchlist_page/components/swiper_component/effect.dart new file mode 100644 index 00000000..23c0fd50 --- /dev/null +++ b/lib/views/watchlist_page/components/swiper_component/effect.dart @@ -0,0 +1,12 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + SwiperAction.action: _onAction, + }); +} + +void _onAction(Action action, Context ctx) { +} diff --git a/lib/views/watchlist_page/components/swiper_component/reducer.dart b/lib/views/watchlist_page/components/swiper_component/reducer.dart new file mode 100644 index 00000000..48d415fd --- /dev/null +++ b/lib/views/watchlist_page/components/swiper_component/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + SwiperAction.action: _onAction, + }, + ); +} + +SwiperState _onAction(SwiperState state, Action action) { + final SwiperState newState = state.clone(); + return newState; +} diff --git a/lib/views/watchlist_page/components/swiper_component/state.dart b/lib/views/watchlist_page/components/swiper_component/state.dart new file mode 100644 index 00000000..ad4f2ac9 --- /dev/null +++ b/lib/views/watchlist_page/components/swiper_component/state.dart @@ -0,0 +1,31 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/views/watchlist_page/state.dart'; + +class SwiperState implements Cloneable { + bool isMovie; + SwiperController swiperController; + UserMediaModel movies; + UserMediaModel tvshows; + @override + SwiperState clone() { + return SwiperState(); + } +} + +class SwiperConnector extends ConnOp { + @override + SwiperState get(WatchlistPageState state) { + final SwiperState mstate = SwiperState(); + mstate.isMovie = state.isMovie; + mstate.movies = state.movies; + mstate.tvshows = state.tvshows; + return mstate; + } + + @override + void set(WatchlistPageState state, SwiperState subState) { + state.isMovie = subState.isMovie; + } +} diff --git a/lib/views/watchlist_page/components/swiper_component/view.dart b/lib/views/watchlist_page/components/swiper_component/view.dart new file mode 100644 index 00000000..e5bf3ba3 --- /dev/null +++ b/lib/views/watchlist_page/components/swiper_component/view.dart @@ -0,0 +1,213 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:movie/views/watchlist_page/action.dart'; +import 'package:shimmer/shimmer.dart'; + +import 'dart:math' as math; +import 'state.dart'; + +Widget buildView( + SwiperState state, Dispatch dispatch, ViewService viewService) { + final List _list = state.isMovie + ? (state?.movies?.data ?? []) + : (state?.tvshows?.data ?? []); + + return Container( + height: Adapt.screenH() / 2 + Adapt.px(150), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 600), + child: _list.length == 0 + ? _ShimmerCell() + : _SwiperView( + key: ValueKey(_list), + itemCount: _list.length, + viewportFraction: 0.85, + physics: BouncingScrollPhysics(), + scale: 0.9, + itemTapped: (index) => + dispatch(WatchlistPageActionCreator.swiperCellTapped()), + onPageChanged: (index) => dispatch( + WatchlistPageActionCreator.swiperChanged(_list[index])), + itemBuilder: (ctx, index) => + _SwiperCell(data: _list[index], index: index), + ), + )); +} + +class _SwiperView extends StatefulWidget { + final Key key; + final Widget Function(BuildContext, int) itemBuilder; + final Function(int) itemTapped; + final Function(int) onPageChanged; + final int itemCount; + final double viewportFraction; + final double scale; + final ScrollPhysics physics; + _SwiperView( + {this.key, + this.itemBuilder, + this.itemCount, + this.viewportFraction = 1.0, + this.scale = 1.0, + this.physics = const BouncingScrollPhysics(), + this.itemTapped, + this.onPageChanged}); + @override + _SwiperViewState createState() => _SwiperViewState(); +} + +class _SwiperViewState extends State<_SwiperView> { + PageController controller; + double pageOffset = 0; + double pxOffset = 0; + + double _itemswidht; + @override + void initState() { + _itemswidht = Adapt.screenW() * widget.viewportFraction; + controller = + PageController(viewportFraction: widget.viewportFraction ?? 1.0) + ..addListener(() { + setState(() { + pageOffset = controller.page; + pxOffset = controller.offset; + }); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return PageView.builder( + scrollDirection: Axis.horizontal, + controller: controller, + physics: widget.physics, + itemBuilder: (context, index) { + double _now = (_itemswidht * index - pxOffset) / _itemswidht; + double _offset = pageOffset - index; + double _scale = 1 - _now.abs() / 4; + double _gauss = math.exp(-(math.pow((_offset.abs() - 0.5), 2) / 0.08)); + return Transform.translate( + offset: Offset(-30 * _gauss * _offset.sign, 0), + child: Transform.scale( + scale: _now.abs() == 0 + ? 1.0 + : _scale < widget.scale ? widget.scale : _scale, + child: GestureDetector( + onTap: () => widget.itemTapped(index), + child: widget.itemBuilder(context, index), + ), + ), + ); + }, + onPageChanged: widget.onPageChanged, + itemCount: widget.itemCount, + ); + } +} + +class _SwiperCell extends StatelessWidget { + final UserMedia data; + final int index; + const _SwiperCell({this.data, this.index}); + @override + Widget build(BuildContext context) { + return Container( + key: ValueKey(data), + margin: EdgeInsets.only(right: Adapt.px(20)), + child: Hero( + tag: 'Background${data.mediaId}', + child: Stack( + alignment: Alignment.bottomRight, + children: [ + Container( + height: Adapt.screenH() / 2 + Adapt.px(80), + alignment: Alignment.bottomRight, + margin: + EdgeInsets.only(right: Adapt.px(20), bottom: Adapt.px(70)), + decoration: BoxDecoration( + color: index.isEven ? Colors.amber : Colors.blueAccent, + image: DecorationImage( + fit: BoxFit.cover, + alignment: Alignment.bottomCenter, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(data.photoUrl, ImageSize.w500), + ), + ), + boxShadow: [ + BoxShadow( + blurRadius: 20, + offset: Offset(-5, 12), + color: Colors.black26) + ], + borderRadius: BorderRadius.circular( + Adapt.px(50), + ), + ), + ), + Container( + alignment: Alignment.center, + margin: EdgeInsets.only( + right: Adapt.px(10), + bottom: Adapt.px(60), + ), + width: Adapt.px(120), + height: Adapt.px(120), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular( + Adapt.px(30), + ), + ), + child: Material( + color: Colors.transparent, + child: Text( + data.rated.toString(), + style: TextStyle( + color: Colors.tealAccent[700].withAlpha(200), + fontSize: Adapt.px(50), + fontWeight: FontWeight.bold), + ), + ), + ), + Container( + width: Adapt.px(60), + height: Adapt.px(60), + margin: EdgeInsets.only(bottom: Adapt.px(140)), + decoration: + BoxDecoration(color: Colors.white, shape: BoxShape.circle), + child: Icon(Icons.star, color: Colors.yellow), + ) + ], + ), + ), + ); + } +} + +class _ShimmerCell extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ThemeData _theme = ThemeStyle.getTheme(context); + return Shimmer.fromColors( + baseColor: _theme.primaryColorDark, + highlightColor: _theme.primaryColorLight, + child: Center( + child: Container( + width: Adapt.screenW() * .85, + height: Adapt.screenH() / 2 + Adapt.px(80), + margin: EdgeInsets.only(right: Adapt.px(20), bottom: Adapt.px(70)), + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(Adapt.px(50))), + ), + ), + ); + } +} diff --git a/lib/views/watchlist_page/effect.dart b/lib/views/watchlist_page/effect.dart new file mode 100644 index 00000000..fba89b05 --- /dev/null +++ b/lib/views/watchlist_page/effect.dart @@ -0,0 +1,56 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/animation.dart'; +import 'package:flutter/material.dart' hide Action; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/views/watchlistdetail_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + WatchlistPageAction.action: _onAction, + WatchlistPageAction.swiperCellTapped: _swiperCellTapped, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final Object ticker = ctx.stfState; + final _baseApi = BaseApi.instance; + ctx.state.animationController = + AnimationController(vsync: ticker, duration: Duration(milliseconds: 300)); + ctx.state.swiperController = SwiperController(); + if (ctx.state.user != null) { + final movie = + await _baseApi.getWatchlist(ctx.state.user.firebaseUser.uid, 'movie'); + if (movie.success) + ctx.dispatch(WatchlistPageActionCreator.setMovie(movie.result)); + final tv = + await _baseApi.getWatchlist(ctx.state.user.firebaseUser.uid, 'tv'); + if (tv.success) + ctx.dispatch(WatchlistPageActionCreator.setTVShow(tv.result)); + } +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); + ctx.state.swiperController.dispose(); +} + +Future _swiperCellTapped(Action action, Context ctx) async { + await Navigator.of(ctx.context).push(PageRouteBuilder( + transitionDuration: Duration(milliseconds: 600), + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + return FadeTransition( + opacity: Tween(begin: 0.0, end: 1.0) + .animate(CurvedAnimation(parent: animation, curve: Curves.ease)), + child: + WatchlistDetailPage().buildPage({'data': ctx.state.selectMdeia}), + ); + })); +} diff --git a/lib/views/watchlist_page/page.dart b/lib/views/watchlist_page/page.dart new file mode 100644 index 00000000..7616d7cb --- /dev/null +++ b/lib/views/watchlist_page/page.dart @@ -0,0 +1,30 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'components/header_component/component.dart'; +import 'components/header_component/state.dart'; +import 'components/info_component/component.dart'; +import 'components/info_component/state.dart'; +import 'components/swiper_component/component.dart'; +import 'components/swiper_component/state.dart'; +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class WatchlistPage extends Page> + with TickerProviderMixin { + WatchlistPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{ + 'header': HeaderConnector() + HeaderComponent(), + 'swiper': SwiperConnector() + SwiperComponent(), + 'info': InfoConnector() + InfoComponent(), + }), + middleware: >[], + ); +} diff --git a/lib/views/watchlist_page/reducer.dart b/lib/views/watchlist_page/reducer.dart new file mode 100644 index 00000000..4fb2bdd6 --- /dev/null +++ b/lib/views/watchlist_page/reducer.dart @@ -0,0 +1,43 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + WatchlistPageAction.action: _onAction, + WatchlistPageAction.setTVShow: _setTVShow, + WatchlistPageAction.swiperChanged: _swiperChanged, + WatchlistPageAction.setMovie: _setMovie, + }, + ); +} + +WatchlistPageState _onAction(WatchlistPageState state, Action action) { + final WatchlistPageState newState = state.clone(); + return newState; +} + +WatchlistPageState _setTVShow(WatchlistPageState state, Action action) { + final UserMediaModel model = action.payload; + final WatchlistPageState newState = state.clone(); + newState.tvshows = model; + return newState; +} + +WatchlistPageState _swiperChanged(WatchlistPageState state, Action action) { + final UserMedia model = action.payload; + final WatchlistPageState newState = state.clone(); + newState.selectMdeia = model; + return newState; +} + +WatchlistPageState _setMovie(WatchlistPageState state, Action action) { + final UserMediaModel movie = action.payload; + final WatchlistPageState newState = state.clone(); + newState.movies = movie; + if (movie.data.length > 0) newState.selectMdeia = movie.data[0]; + return newState; +} diff --git a/lib/views/watchlist_page/state.dart b/lib/views/watchlist_page/state.dart new file mode 100644 index 00000000..5efdc055 --- /dev/null +++ b/lib/views/watchlist_page/state.dart @@ -0,0 +1,44 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:movie/globalbasestate/state.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/app_user.dart'; + +class WatchlistPageState + implements GlobalBaseState, Cloneable { + int accountId; + AnimationController animationController; + UserMedia selectMdeia; + bool isMovie; + SwiperController swiperController; + UserMediaModel movies; + UserMediaModel tvshows; + @override + WatchlistPageState clone() { + return WatchlistPageState() + ..accountId = accountId + ..animationController = animationController + ..selectMdeia = selectMdeia + ..swiperController = swiperController + ..isMovie = isMovie + ..movies = movies + ..tvshows = tvshows + ..user = user; + } + + @override + Locale locale; + + @override + Color themeColor; + + @override + AppUser user; +} + +WatchlistPageState initState(Map args) { + WatchlistPageState state = WatchlistPageState(); + state.isMovie = true; + return state; +} diff --git a/lib/views/watchlist_page/view.dart b/lib/views/watchlist_page/view.dart new file mode 100644 index 00000000..cf5926f4 --- /dev/null +++ b/lib/views/watchlist_page/view.dart @@ -0,0 +1,26 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; + +import 'state.dart'; + +Widget buildView( + WatchlistPageState state, Dispatch dispatch, ViewService viewService) { + return Builder( + builder: (context) { + Widget _buildBody() { + return SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + viewService.buildComponent('header'), + viewService.buildComponent('swiper'), + viewService.buildComponent('info'), + ], + ), + ); + } + + return Scaffold(body: _buildBody()); + }, + ); +} diff --git a/lib/views/watchlistdetail_page/action.dart b/lib/views/watchlistdetail_page/action.dart new file mode 100644 index 00000000..c2a3f683 --- /dev/null +++ b/lib/views/watchlistdetail_page/action.dart @@ -0,0 +1,13 @@ +import 'package:fish_redux/fish_redux.dart'; + +enum WatchlistDetailPageAction { action, meidaTap } + +class WatchlistDetailPageActionCreator { + static Action onAction() { + return const Action(WatchlistDetailPageAction.action); + } + + static Action meidaTap() { + return const Action(WatchlistDetailPageAction.meidaTap); + } +} diff --git a/lib/views/watchlistdetail_page/effect.dart b/lib/views/watchlistdetail_page/effect.dart new file mode 100644 index 00000000..e78fd42f --- /dev/null +++ b/lib/views/watchlistdetail_page/effect.dart @@ -0,0 +1,50 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart' hide Action, Page; +import 'package:movie/views/detail_page/page.dart'; +import 'package:movie/views/tvshow_detail_page/page.dart'; +import 'action.dart'; +import 'state.dart'; + +Effect buildEffect() { + return combineEffects(>{ + WatchlistDetailPageAction.action: _onAction, + WatchlistDetailPageAction.meidaTap: _mediaTap, + Lifecycle.initState: _onInit, + Lifecycle.dispose: _onDispose, + }); +} + +void _onAction(Action action, Context ctx) {} + +Future _onInit(Action action, Context ctx) async { + final Object ticker = ctx.stfState; + ctx.state.animationController = AnimationController( + vsync: ticker, + duration: Duration(milliseconds: 1500), + reverseDuration: Duration(milliseconds: 300)); + await Future.delayed(Duration(milliseconds: 600), + () => ctx.state.animationController.forward()); +} + +void _onDispose(Action action, Context ctx) { + ctx.state.animationController.dispose(); +} + +void _mediaTap(Action action, Context ctx) async { + final _media = ctx.state.mediaData; + final Page _page = + _media.mediaType == 'movie' ? MovieDetailPage() : TvShowDetailPage(); + var data = { + 'id': _media.mediaId, + 'bgpic': _media.photoUrl, + 'name': _media.name, + }; + await Navigator.of(ctx.context).push( + PageRouteBuilder(pageBuilder: (context, animation, secAnimation) { + return FadeTransition( + opacity: animation, + child: _page.buildPage(data), + ); + }), + ); +} diff --git a/lib/views/watchlistdetail_page/page.dart b/lib/views/watchlistdetail_page/page.dart new file mode 100644 index 00000000..9d6e44fd --- /dev/null +++ b/lib/views/watchlistdetail_page/page.dart @@ -0,0 +1,22 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'effect.dart'; +import 'reducer.dart'; +import 'state.dart'; +import 'view.dart'; + +class WatchlistDetailPage + extends Page> + with SingleTickerProviderMixin { + WatchlistDetailPage() + : super( + initState: initState, + effect: buildEffect(), + reducer: buildReducer(), + view: buildView, + dependencies: Dependencies( + adapter: null, + slots: >{}), + middleware: >[], + ); +} diff --git a/lib/views/watchlistdetail_page/reducer.dart b/lib/views/watchlistdetail_page/reducer.dart new file mode 100644 index 00000000..b01ad971 --- /dev/null +++ b/lib/views/watchlistdetail_page/reducer.dart @@ -0,0 +1,17 @@ +import 'package:fish_redux/fish_redux.dart'; + +import 'action.dart'; +import 'state.dart'; + +Reducer buildReducer() { + return asReducer( + >{ + WatchlistDetailPageAction.action: _onAction, + }, + ); +} + +WatchlistDetailPageState _onAction(WatchlistDetailPageState state, Action action) { + final WatchlistDetailPageState newState = state.clone(); + return newState; +} diff --git a/lib/views/watchlistdetail_page/state.dart b/lib/views/watchlistdetail_page/state.dart new file mode 100644 index 00000000..2a28febb --- /dev/null +++ b/lib/views/watchlistdetail_page/state.dart @@ -0,0 +1,19 @@ +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/animation.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; + +class WatchlistDetailPageState implements Cloneable { + UserMedia mediaData; + AnimationController animationController; + + @override + WatchlistDetailPageState clone() { + return WatchlistDetailPageState()..mediaData = mediaData; + } +} + +WatchlistDetailPageState initState(Map args) { + WatchlistDetailPageState state = WatchlistDetailPageState(); + state.mediaData = args['data']; + return state; +} diff --git a/lib/views/watchlistdetail_page/view.dart b/lib/views/watchlistdetail_page/view.dart new file mode 100644 index 00000000..af86d043 --- /dev/null +++ b/lib/views/watchlistdetail_page/view.dart @@ -0,0 +1,286 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fish_redux/fish_redux.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/base_api_model/user_media.dart'; +import 'package:movie/models/enums/imagesize.dart'; + +import 'action.dart'; +import 'state.dart'; + +Widget buildView(WatchlistDetailPageState state, Dispatch dispatch, + ViewService viewService) { + return Scaffold( + body: Container( + child: Column( + children: [ + Hero( + tag: 'Background${state.mediaData.mediaId}', + child: Material( + child: GestureDetector( + onTap: () => + dispatch(WatchlistDetailPageActionCreator.meidaTap()), + child: Container( + height: Adapt.screenH() / 2 + Adapt.px(120), + alignment: Alignment.bottomRight, + decoration: BoxDecoration( + color: Colors.grey[200], + image: DecorationImage( + alignment: Alignment.bottomCenter, + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl( + state.mediaData.photoUrl, ImageSize.w500), + ), + ), + boxShadow: [ + BoxShadow( + blurRadius: 20, + offset: Offset(-5, 12), + color: Colors.black26) + ], + borderRadius: BorderRadius.circular( + Adapt.px(50), + ), + ), + ), + ), + ), + ), + SizedBox( + height: Adapt.px(80), + ), + _Info( + mediaData: state.mediaData, + animationController: state.animationController, + ), + Expanded(child: SizedBox()), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: Colors.teal[200], shape: BoxShape.circle), + child: IconButton( + padding: EdgeInsets.zero, + icon: Icon( + Icons.arrow_back, + size: Adapt.px(50), + color: Colors.white, + ), + onPressed: () async { + state.animationController.reverse().then((f) { + Future.delayed(Duration(milliseconds: 80), () { + Navigator.of(viewService.context).pop(); + }); + }); + }, + ), + ), + SizedBox(width: 20), + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: Colors.orangeAccent[400], shape: BoxShape.circle), + child: IconButton( + padding: EdgeInsets.zero, + icon: Icon( + Icons.more_vert_outlined, + size: Adapt.px(50), + color: Colors.white, + ), + onPressed: () => + dispatch(WatchlistDetailPageActionCreator.meidaTap()), + ), + ), + ], + ), + SizedBox(height: Adapt.px(40)), + ], + ), + ), + ); +} + +class _ColumnCell extends StatelessWidget { + final AnimationController animationController; + final double start; + final double end; + final String title; + final String value; + const _ColumnCell({ + this.animationController, + this.end, + this.start, + this.title, + this.value, + }); + @override + Widget build(BuildContext context) { + final curve = Curves.ease; + final position = Tween(begin: Offset(0, 0.8), end: Offset.zero).animate( + CurvedAnimation( + parent: animationController, + curve: Interval(start, end, curve: curve))); + final opacity = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: animationController, + curve: Interval(start, end, curve: curve))); + return SlideTransition( + position: position, + child: Opacity( + opacity: opacity.value, + child: Column( + children: [ + Text( + value, + style: TextStyle( + fontSize: Adapt.px(45), fontWeight: FontWeight.bold), + ), + Text( + title, + ) + ], + ), + ), + ); + } +} + +class _Info extends StatelessWidget { + final AnimationController animationController; + final UserMedia mediaData; + const _Info({this.animationController, this.mediaData}); + @override + Widget build(BuildContext context) { + final _d = mediaData; + final curve = Curves.ease; + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: AnimatedBuilder( + animation: animationController, + builder: (context, child) { + var titlePosition = Tween(begin: Offset(0, 1.0), end: Offset.zero) + .animate(CurvedAnimation( + parent: animationController, + curve: Interval(0, 0.3, curve: curve))); + var titleOpacity = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation( + parent: animationController, + curve: Interval(0, 0.3, curve: curve))); + var owPosition = Tween(begin: Offset(0, 0.2), end: Offset.zero) + .animate(CurvedAnimation( + parent: animationController, + curve: Interval(0.3, 0.6, curve: curve))); + var owOpacity = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation( + parent: animationController, + curve: Interval(0.3, 0.6, curve: curve))); + return Container( + child: Column( + children: [ + SlideTransition( + position: titlePosition, + child: Opacity( + opacity: titleOpacity.value, + child: Container( + child: Text( + _d.name, + maxLines: 1, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: Adapt.px(45), + fontWeight: FontWeight.bold), + ), + ), + ), + ), + SizedBox( + height: Adapt.px(60), + ), + SlideTransition( + position: owPosition, + child: Opacity( + opacity: owOpacity.value, + child: Text( + _d.overwatch, + maxLines: 3, + ))), + SizedBox( + height: Adapt.px(60), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _ColumnCell( + value: _d.rated.toString(), + title: 'Score', + start: 0.6, + end: 0.8, + animationController: animationController, + ), + Opacity( + opacity: Tween(begin: 0.0, end: 1.0) + .animate( + CurvedAnimation( + parent: animationController, + curve: Interval(0.7, 0.8, curve: curve), + ), + ) + .value, + child: Container( + width: Adapt.px(3), + height: Adapt.px(60), + color: Colors.grey[200], + )), + SlideTransition( + position: owPosition, + child: Opacity( + opacity: owOpacity.value, + child: _ColumnCell( + value: _d.ratedCount?.toString() ?? '', + title: 'Rated', + start: 0.7, + end: 0.9, + animationController: animationController, + ), + ), + ), + Opacity( + opacity: Tween(begin: 0.0, end: 1.0) + .animate(CurvedAnimation( + parent: animationController, + curve: Interval(0.8, 0.9, curve: curve))) + .value, + child: Opacity( + opacity: owOpacity.value, + child: Container( + width: Adapt.px(3), + height: Adapt.px(60), + color: Colors.grey[200], + ))), + SlideTransition( + position: owPosition, + child: Opacity( + opacity: owOpacity.value, + child: _ColumnCell( + value: _d.popular?.toStringAsFixed(0) ?? '', + title: 'Popular', + start: 0.8, + end: 1.0, + animationController: animationController, + ), + ), + ), + ], + ), + ], + ), + ); + }, + )); + } +} diff --git a/lib/widgets/arrow_clipper.dart b/lib/widgets/arrow_clipper.dart new file mode 100644 index 00000000..758c6ca1 --- /dev/null +++ b/lib/widgets/arrow_clipper.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class ArrowClipper extends CustomClipper { + final String mode; + const ArrowClipper({this.mode = 'down'}); + @override + Path getClip(Size size) { + Path path = Path(); + switch (mode) { + case 'up': + path.moveTo(size.width / 2, 0); + path.lineTo(size.width, size.height / 2); + path.lineTo(0, size.height / 2); + break; + case 'down': + path.moveTo(0, 0); + path.lineTo(size.width, 0); + path.lineTo(size.width / 2, size.height / 2); + break; + } + + return path; + } + + @override + bool shouldReclip(CustomClipper oldClipper) { + return true; + } +} diff --git a/lib/widgets/backdrop.dart b/lib/widgets/backdrop.dart new file mode 100644 index 00000000..2dd9090d --- /dev/null +++ b/lib/widgets/backdrop.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +class BackDrop extends StatefulWidget { + final Widget backChild; + final List frontChildren; + final Color frontBackGroundColor; + final double backLayerHeight; + BackDrop({ + Key key, + @required this.backChild, + @required this.frontChildren, + this.frontBackGroundColor, + this.backLayerHeight = 0.0, + }) : super(key: key); + @override + BackDropState createState() => BackDropState(); +} + +class BackDropState extends State with TickerProviderStateMixin { + GlobalKey key; + final ClampingScrollPhysics _clampingScrollPhysics = ClampingScrollPhysics(); + @override + void initState() { + key = GlobalKey(); + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + void didUpdateWidget(BackDrop oldWidget) { + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + final _mediaQuery = MediaQuery.of(context); + double _initialChildSize = + 1 - (widget.backLayerHeight / _mediaQuery.size.height); + return Stack( + children: [ + Container( + key: key, + child: widget.backChild, + ), + DraggableScrollableSheet( + initialChildSize: _initialChildSize, + minChildSize: _initialChildSize, + builder: (BuildContext context, ScrollController scrollController) { + return Container( + padding: EdgeInsets.only(top: 20), + decoration: BoxDecoration( + color: widget.frontBackGroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), + ), + ), + child: Theme( + data: Theme.of(context) + .copyWith(accentColor: Colors.transparent), + child: ListView.builder( + controller: scrollController, + physics: _clampingScrollPhysics, + itemBuilder: (_, index) => widget.frontChildren[index], + itemCount: widget.frontChildren?.length ?? 0, + ), + ), + ); + }), + ], + ); + } +} diff --git a/lib/widgets/chromecast_dialog.dart b/lib/widgets/chromecast_dialog.dart new file mode 100644 index 00000000..7dc635ac --- /dev/null +++ b/lib/widgets/chromecast_dialog.dart @@ -0,0 +1,573 @@ +import 'dart:async'; + +import 'package:dart_chromecast/casting/cast.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mdns_plugin/flutter_mdns_plugin.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:observable/observable.dart'; +import 'package:video_player/video_player.dart'; + +import 'service_discovery.dart'; + +class ChromecastDialog extends StatefulWidget { + final ServiceDiscovery serviceDiscovery; + final VideoPlayerController videoController; + + ChromecastDialog({this.videoController, this.serviceDiscovery}); + @override + _ChromecastDialogState createState() => _ChromecastDialogState(); +} + +class _ChromecastDialogState extends State { + List _devices = []; + bool _connected = false; + CastSender _castSender; + @override + void initState() { + widget.serviceDiscovery.changes.listen((List _) { + _updateDevices(); + }); + _updateDevices(); + super.initState(); + } + + void _connectToDevice(CastDevice device) async { + _castSender = CastSender(device); + _connected = await _castSender.connect(); + if (!_connected) { + print('Something wrong with chromecast'); + return; + } + setState(() {}); + _castSender.launch(); + } + + void _disconnectToDevice() { + _castSender.castSessionController.close(); + _castSender.stop(); + _castSender.disconnect().then((d) { + if (d) + setState(() { + _connected = false; + }); + }); + } + + _deviceDidUpdate() { + setState(() => {}); + } + + CastDevice _deviceByName(String name) { + return _devices.firstWhere((CastDevice d) => d.name == name, + orElse: () => null); + } + + CastDevice _castDeviceFromServiceInfo(ServiceInfo serviceInfo) { + CastDevice castDevice = CastDevice( + name: serviceInfo.name, + type: serviceInfo.type, + host: serviceInfo.address, + port: serviceInfo.port); + return castDevice; + } + + _updateDevices() { + _devices = + widget.serviceDiscovery.foundServices.map((ServiceInfo serviceInfo) { + CastDevice device = _deviceByName(serviceInfo.name); + if (null == device) { + device = _castDeviceFromServiceInfo(serviceInfo); + } + return device; + }).toList(); + _deviceDidUpdate(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.transparent, + body: SafeArea( + bottom: false, + child: Column( + children: [ + _Header(), + _connected + ? _ConnectedPanel( + castSender: _castSender, + onDisconnect: _disconnectToDevice, + ) + : _DeviceList( + devices: _devices, + onConnect: _connectToDevice, + ), + _ControlsPanel( + castSender: _castSender, + controller: widget.videoController, + ), + ], + ), + )); + } +} + +class _Header extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 30), + child: Row(children: [ + Icon( + Icons.cast, + color: const Color(0xFFFFFFFF), + ), + SizedBox(width: 20), + Text( + 'Chromecast', + style: TextStyle(color: Color(0xFFFFFFFF)), + ), + Spacer(), + GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Icon( + Icons.close, + color: const Color(0xFFFFFFFF), + ), + ) + ]), + ); + } +} + +class _DeviceList extends StatelessWidget { + final List devices; + final Function(CastDevice) onConnect; + const _DeviceList({this.devices, this.onConnect}); + @override + Widget build(BuildContext context) { + return Container( + height: 300, + child: devices.length > 0 + ? ListView.separated( + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 20), + itemCount: devices?.length ?? 0, + separatorBuilder: (_, index) => SizedBox(height: 20), + itemBuilder: (_, index) => _DeviceItem( + device: devices[index], + onTap: onConnect, + ), + ) + : Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + Color(0xFFFFFFFF), + ), + ), + ), + ); + } +} + +class _DeviceItem extends StatelessWidget { + final CastDevice device; + final Function(CastDevice) onTap; + const _DeviceItem({ + @required this.device, + this.onTap, + }); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => onTap(device), + child: Container( + child: Text( + device?.name ?? 'no name', + maxLines: 1, + overflow: TextOverflow.fade, + style: TextStyle( + color: Color(0xFFFFFFFF), + ), + ), + ), + ); + } +} + +class _ConnectedPanel extends StatelessWidget { + final CastSender castSender; + final Function onDisconnect; + const _ConnectedPanel({this.onDisconnect, this.castSender}); + @override + Widget build(BuildContext context) { + final Color _baseColor = const Color(0xFFFFFFFF); + return Container( + height: 300, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + castSender?.device?.name ?? 'no name', + style: TextStyle( + fontWeight: FontWeight.bold, + color: _baseColor, + ), + ), + SizedBox(height: 15), + GestureDetector( + onTap: onDisconnect, + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(color: _baseColor), + borderRadius: BorderRadius.circular(8), + ), + child: Text( + 'Disconnect', + style: TextStyle( + color: _baseColor, + ), + ), + ), + ) + ], + ), + ); + } +} + +class _ControlsPanel extends StatefulWidget { + final CastSender castSender; + final VideoPlayerController controller; + const _ControlsPanel({this.castSender, this.controller}); + @override + _ControlsPanelState createState() => _ControlsPanelState(); +} + +class _ControlsPanelState extends State<_ControlsPanel> { + CastSender _castSender; + double duration = 0; + bool _isPlaying = false; + Timer _timer; + + @override + void initState() { + _castSender = widget.castSender; + _timer = Timer.periodic(Duration(seconds: 1), (timer) { + if (_castSender != null && + _castSender?.castSession?.isConnected == true) { + duration = _castSender.castSession.castMediaStatus.position; + setState(() {}); + } + }); + super.initState(); + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } + + @override + void didUpdateWidget(covariant _ControlsPanel oldWidget) { + if (widget.castSender != _castSender) _onConnected(); + super.didUpdateWidget(oldWidget); + } + + _onConnected() async { + _castSender = widget.castSender; + await Future.delayed(Duration(milliseconds: 300), () { + _castSender?.load( + CastMedia( + contentId: widget.controller.dataSource, + title: 'Video', + autoPlay: true, + ), + ); + }); + _castSender.castMediaStatusController.stream.listen((onData) { + setState(() { + _isPlaying = onData.isPlaying; + duration = onData.position; + }); + }, onDone: () { + setState(() {}); + }); + setState(() {}); + } + + _onPlay() { + if (_castSender == null) return; + _isPlaying ? _castSender.pause() : _castSender.play(); + setState(() { + _isPlaying = !_isPlaying; + }); + } + + _onForward() { + if (_castSender == null) return; + _castSender.seek(_castSender.castSession.castMediaStatus.position + 30.0); + } + + _onReplay() { + if (_castSender == null) return; + _castSender.seek(_castSender.castSession.castMediaStatus.position - 30.0); + } + + String format(Duration d) => d.toString().split('.').first.padLeft(8, "0"); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Expanded( + child: Container( + decoration: BoxDecoration( + color: _theme.backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(25), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _ControlButton( + icon: Icons.replay_30_outlined, + onTap: _onReplay, + ), + _ControlButton( + icon: _isPlaying ? Icons.pause : Icons.play_arrow, + onTap: _onPlay, + ), + _ControlButton( + icon: Icons.forward_30_outlined, + onTap: _onForward, + ), + ], + ), + SizedBox(height: 50), + Text(format(Duration(milliseconds: (duration * 1000).toInt()))), + SizedBox(height: 30), + Container( + height: 50, + padding: EdgeInsets.symmetric(horizontal: 40), + child: _ChromecastProgressBar( + duration: widget.controller.value.duration, + position: Duration(milliseconds: (duration * 1000).toInt()), + castSender: _castSender, + ), + ) + ], + ), + ), + ); + } +} + +class _ControlButton extends StatelessWidget { + final Function onTap; + final IconData icon; + const _ControlButton({this.onTap, this.icon}); + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Icon( + icon, + size: 50, + ), + ); + } +} + +class _ChromecastProgressBar extends StatefulWidget { + _ChromecastProgressBar( + {this.onDragEnd, + this.onDragStart, + this.onDragUpdate, + this.duration, + this.position, + this.castSender}); + final Duration duration; + final Duration position; + final CastSender castSender; + final Function() onDragStart; + final Function() onDragEnd; + final Function() onDragUpdate; + + @override + _VideoProgressBarState createState() { + return _VideoProgressBarState(); + } +} + +class _VideoProgressBarState extends State<_ChromecastProgressBar> { + _VideoProgressBarState() { + listener = () { + setState(() {}); + }; + } + + Duration _position = Duration(milliseconds: 0); + VoidCallback listener; + + @override + void initState() { + _updatePosition(); + super.initState(); + } + + _updatePosition() { + if (widget.castSender?.castSession?.castMediaStatus?.isPlaying ?? false) + setState(() { + _position = widget.position; + }); + } + + @override + void didUpdateWidget(covariant _ChromecastProgressBar oldWidget) { + if (widget.position != _position) _updatePosition(); + super.didUpdateWidget(oldWidget); + } + + @override + void deactivate() { + super.deactivate(); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final bool _light = _theme.brightness == Brightness.light; + final Color _barBackgroundColor = + _light ? Color(0xA4202020) : Color(0xA4FFFFFF); + final Color _barPlayedColor = + _light ? Color(0xFF000000) : Color(0xFFFFFFFF); + final Color _barCircleColor = + _light ? Color(0xFF000000) : Color(0xFFFFFFFF); + void seekToRelativePosition(Offset globalPosition) { + final box = context.findRenderObject() as RenderBox; + final Offset tapPos = box.globalToLocal(globalPosition); + final double relative = tapPos.dx / box.size.width; + final Duration position = widget.duration * relative; + setState(() { + _position = position; + }); + widget.castSender.seek(position.inSeconds.toDouble()); + } + + return GestureDetector( + child: Center( + child: Container( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + color: Colors.transparent, + child: CustomPaint( + painter: _ProgressBarPainter(widget.duration, _position, + barBackgroundColor: _barBackgroundColor, + barCircleColor: _barCircleColor, + barPlayedColor: _barPlayedColor), + ), + ), + ), + onHorizontalDragStart: (DragStartDetails details) { + if (!(widget.castSender?.castSession?.isConnected == true)) { + return; + } + + if (widget.castSender.castSession.castMediaStatus.isPlaying) { + widget.castSender.togglePause(); + } + + if (widget.onDragStart != null) { + widget.onDragStart(); + } + }, + onHorizontalDragUpdate: (DragUpdateDetails details) { + if (!(widget.castSender?.castSession?.isConnected == true)) { + return; + } + seekToRelativePosition(details.globalPosition); + + if (widget.onDragUpdate != null) { + widget.onDragUpdate(); + } + }, + onHorizontalDragEnd: (DragEndDetails details) { + if (!widget.castSender.castSession.castMediaStatus.isPlaying) { + widget.castSender.play(); + } + if (widget.onDragEnd != null) { + widget.onDragEnd(); + } + }, + onTapDown: (TapDownDetails details) { + if (!(widget.castSender?.castSession?.isConnected == true)) { + return; + } + seekToRelativePosition(details.globalPosition); + }, + ); + } +} + +class _ProgressBarPainter extends CustomPainter { + _ProgressBarPainter(this.duration, this.position, + {this.barBackgroundColor, this.barCircleColor, this.barPlayedColor}); + final Duration position; + final Duration duration; + final Color barBackgroundColor; + final Color barPlayedColor; + final Color barCircleColor; + @override + bool shouldRepaint(CustomPainter painter) { + return true; + } + + @override + void paint(Canvas canvas, Size size) { + final barHeight = 5.0; + final handleHeight = 6.0; + final baseOffset = size.height / 2 - barHeight / 2.0; + + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromPoints( + Offset(0.0, baseOffset), + Offset(size.width, baseOffset + barHeight), + ), + Radius.circular(4.0), + ), + Paint()..color = barBackgroundColor, + ); + final double playedPartPercent = + position.inMilliseconds / duration.inMilliseconds; + final double playedPart = + playedPartPercent > 1 ? size.width : playedPartPercent * size.width; + + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromPoints( + Offset(0.0, baseOffset), + Offset(playedPart, baseOffset + barHeight), + ), + Radius.circular(4.0), + ), + Paint()..color = barPlayedColor, + ); + + final shadowPath = Path() + ..addOval(Rect.fromCircle( + center: Offset(playedPart, baseOffset + barHeight / 2), + radius: handleHeight)); + + canvas.drawShadow(shadowPath, Colors.black, 0.2, false); + canvas.drawCircle( + Offset(playedPart, baseOffset + barHeight / 2), + handleHeight, + Paint()..color = barCircleColor, + ); + } +} diff --git a/lib/widgets/custom_video_controls.dart b/lib/widgets/custom_video_controls.dart new file mode 100644 index 00000000..70531e15 --- /dev/null +++ b/lib/widgets/custom_video_controls.dart @@ -0,0 +1,677 @@ +import 'dart:async'; +import 'dart:math' as math; +import 'dart:ui' as ui; + +import 'package:chewie/chewie.dart'; +// ignore: implementation_imports +import 'package:chewie/src/cupertino_progress_bar.dart'; +// ignore: implementation_imports +import 'package:chewie/src/utils.dart'; +// ignore: unused_import +import 'package:dart_chromecast/casting/cast_device.dart'; +// ignore: unused_import +import 'package:dart_chromecast/casting/cast_media.dart'; +// ignore: unused_import +import 'package:dart_chromecast/casting/cast_sender.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/widgets/chromecast_dialog.dart'; +import 'package:movie/widgets/service_discovery.dart'; +import 'package:open_iconic_flutter/open_iconic_flutter.dart'; +import 'package:video_player/video_player.dart'; + +class CustomCupertinoControls extends StatefulWidget { + const CustomCupertinoControls({ + @required this.backgroundColor, + @required this.iconColor, + }); + + final Color backgroundColor; + final Color iconColor; + + @override + State createState() { + return _CupertinoControlsState(); + } +} + +class _CupertinoControlsState extends State { + VideoPlayerValue _latestValue; + double _latestVolume; + bool _hideStuff = true; + Timer _hideTimer; + final marginSize = 10.0; + Timer _expandCollapseTimer; + Timer _initTimer; + ServiceDiscovery _serviceDiscovery; + + VideoPlayerController controller; + ChewieController chewieController; + + @override + Widget build(BuildContext context) { + chewieController = ChewieController.of(context); + + if (_latestValue.hasError) { + return chewieController.errorBuilder != null + ? chewieController.errorBuilder( + context, + chewieController.videoPlayerController.value.errorDescription, + ) + : Center( + child: Icon( + OpenIconicIcons.ban, + color: Colors.white, + size: 42, + ), + ); + } + + final backgroundColor = widget.backgroundColor.withOpacity(.8); + final iconColor = widget.iconColor; + chewieController = ChewieController.of(context); + controller = chewieController.videoPlayerController; + final orientation = MediaQuery.of(context).orientation; + final barHeight = orientation == Orientation.portrait ? 30.0 : 47.0; + final buttonPadding = orientation == Orientation.portrait ? 16.0 : 24.0; + + return MouseRegion( + onHover: (_) { + _cancelAndRestartTimer(); + }, + child: GestureDetector( + onTap: () { + _cancelAndRestartTimer(); + }, + child: AbsorbPointer( + absorbing: _hideStuff, + child: Column( + children: [ + _buildTopBar( + backgroundColor, iconColor, barHeight, buttonPadding), + _buildHitArea(), + _buildBottomBar(backgroundColor, iconColor, barHeight), + ], + ), + ), + ), + ); + } + + @override + void initState() { + _serviceDiscovery = ServiceDiscovery(); + _serviceDiscovery.startDiscovery(); + super.initState(); + } + + @override + void dispose() { + _dispose(); + super.dispose(); + } + + void _dispose() { + controller.removeListener(_updateState); + _hideTimer?.cancel(); + _expandCollapseTimer?.cancel(); + _initTimer?.cancel(); + } + + @override + void didChangeDependencies() { + final _oldController = chewieController; + chewieController = ChewieController.of(context); + controller = chewieController.videoPlayerController; + + if (_oldController != chewieController) { + _dispose(); + _initialize(); + } + + super.didChangeDependencies(); + } + + AnimatedOpacity _buildBottomBar( + Color backgroundColor, + Color iconColor, + double barHeight, + ) { + return AnimatedOpacity( + opacity: _hideStuff ? 0.0 : 1.0, + duration: Duration(milliseconds: 300), + child: Container( + color: Colors.transparent, + alignment: Alignment.bottomCenter, + margin: EdgeInsets.all(marginSize), + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: BackdropFilter( + filter: ui.ImageFilter.blur( + sigmaX: 10.0, + sigmaY: 10.0, + ), + child: Container( + height: barHeight, + color: backgroundColor, + child: chewieController.isLive + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildPlayPause(controller, iconColor, barHeight), + _buildLive(iconColor), + ], + ) + : Row( + children: [ + _buildSkipBack(iconColor, barHeight), + _buildPlayPause(controller, iconColor, barHeight), + _buildSkipForward(iconColor, barHeight), + _buildPosition(iconColor), + _buildProgressBar(), + _buildRemaining(iconColor) + ], + ), + ), + ), + ), + ), + ); + } + + Widget _buildLive(Color iconColor) { + return Padding( + padding: EdgeInsets.only(right: 12.0), + child: Text( + 'LIVE', + style: TextStyle(color: iconColor, fontSize: 12.0), + ), + ); + } + + GestureDetector _buildGobackButton( + Color backgroundColor, + Color iconColor, + double barHeight, + double buttonPadding, + ) { + return GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: AnimatedOpacity( + opacity: _hideStuff ? 0.0 : 1.0, + duration: Duration(milliseconds: 300), + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 10.0), + child: Container( + height: barHeight, + padding: EdgeInsets.only( + left: buttonPadding, + right: buttonPadding, + ), + color: backgroundColor, + child: Center( + child: Icon( + OpenIconicIcons.chevronLeft, + color: iconColor, + size: 12.0, + ), + ), + ), + ), + ), + ), + ); + } + + GestureDetector _buildChromeCastButton( + Color backgroundColor, + Color iconColor, + double barHeight, + double buttonPadding, + ) { + return GestureDetector( + onTap: () async { + controller.pause(); + await Navigator.of(context).push( + PageRouteBuilder( + barrierColor: const Color(0xDD000000), + fullscreenDialog: true, + barrierDismissible: true, + opaque: false, + pageBuilder: (context, animation, subAnimation) { + return SlideTransition( + position: + Tween(begin: Offset(0, 1), end: Offset(0, 0)) + .animate(CurvedAnimation( + parent: animation, curve: Curves.ease)), + child: ChromecastDialog( + videoController: controller, + serviceDiscovery: _serviceDiscovery, + ), + ); + }), + ); + /*showGeneralDialog( + context: context, + barrierLabel: '', + barrierColor: Colors.black87, + transitionDuration: Duration(milliseconds: 200), + barrierDismissible: true, + pageBuilder: (_, __, ___) => DevicePicker( + videoController: controller, + serviceDiscovery: _serviceDiscovery, + ), + );*/ + }, + child: AnimatedOpacity( + opacity: _hideStuff ? 0.0 : 1.0, + duration: Duration(milliseconds: 300), + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 10.0), + child: Container( + height: barHeight, + padding: EdgeInsets.only( + left: buttonPadding, + right: buttonPadding, + ), + color: backgroundColor, + child: Center( + child: Icon( + Icons.cast, + color: iconColor, + size: 15.0, + ), + ), + ), + ), + ), + ), + ); + } + + GestureDetector _buildExpandButton( + Color backgroundColor, + Color iconColor, + double barHeight, + double buttonPadding, + ) { + return GestureDetector( + onTap: _onExpandCollapse, + child: AnimatedOpacity( + opacity: _hideStuff ? 0.0 : 1.0, + duration: Duration(milliseconds: 300), + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 10.0), + child: Container( + height: barHeight, + padding: EdgeInsets.only( + left: buttonPadding, + right: buttonPadding, + ), + color: backgroundColor, + child: Center( + child: Icon( + chewieController.isFullScreen + ? OpenIconicIcons.fullscreenExit + : OpenIconicIcons.fullscreenEnter, + color: iconColor, + size: 12.0, + ), + ), + ), + ), + ), + ), + ); + } + + Expanded _buildHitArea() { + return Expanded( + child: GestureDetector( + onTap: _latestValue != null && _latestValue.isPlaying + ? _cancelAndRestartTimer + : () { + _hideTimer?.cancel(); + + setState(() { + _hideStuff = false; + }); + }, + child: Container( + color: Colors.transparent, + ), + ), + ); + } + + GestureDetector _buildMuteButton( + VideoPlayerController controller, + Color backgroundColor, + Color iconColor, + double barHeight, + double buttonPadding, + ) { + return GestureDetector( + onTap: () { + _cancelAndRestartTimer(); + + if (_latestValue.volume == 0) { + controller.setVolume(_latestVolume ?? 0.5); + } else { + _latestVolume = controller.value.volume; + controller.setVolume(0.0); + } + }, + child: AnimatedOpacity( + opacity: _hideStuff ? 0.0 : 1.0, + duration: Duration(milliseconds: 300), + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 10.0), + child: Container( + color: backgroundColor, + child: Container( + height: barHeight, + padding: EdgeInsets.only( + left: buttonPadding, + right: buttonPadding, + ), + child: Icon( + (_latestValue != null && _latestValue.volume > 0) + ? Icons.volume_up + : Icons.volume_off, + color: iconColor, + size: 16.0, + ), + ), + ), + ), + ), + ), + ); + } + + GestureDetector _buildPlayPause( + VideoPlayerController controller, + Color iconColor, + double barHeight, + ) { + return GestureDetector( + onTap: _playPause, + child: Container( + height: barHeight, + color: Colors.transparent, + padding: EdgeInsets.only( + left: 6.0, + right: 6.0, + ), + child: Icon( + controller.value.isPlaying + ? OpenIconicIcons.mediaPause + : OpenIconicIcons.mediaPlay, + color: iconColor, + size: 16.0, + ), + ), + ); + } + + Widget _buildPosition(Color iconColor) { + final position = + _latestValue != null ? _latestValue.position : Duration(seconds: 0); + + return Padding( + padding: EdgeInsets.only(right: 12.0), + child: Text( + formatDuration(position), + style: TextStyle( + color: iconColor, + fontSize: 12.0, + ), + ), + ); + } + + Widget _buildRemaining(Color iconColor) { + final position = _latestValue != null && _latestValue.duration != null + ? _latestValue.duration - _latestValue.position + : Duration(seconds: 0); + + return Padding( + padding: EdgeInsets.only(right: 12.0), + child: Text( + '-${formatDuration(position)}', + style: TextStyle(color: iconColor, fontSize: 12.0), + ), + ); + } + + GestureDetector _buildSkipBack(Color iconColor, double barHeight) { + return GestureDetector( + onTap: _skipBack, + child: Container( + height: barHeight, + color: Colors.transparent, + margin: EdgeInsets.only(left: 10.0), + padding: EdgeInsets.only( + left: 6.0, + right: 6.0, + ), + child: Transform( + alignment: Alignment.center, + transform: Matrix4.skewY(0.0) + ..rotateX(math.pi) + ..rotateZ(math.pi), + child: Icon( + OpenIconicIcons.reload, + color: iconColor, + size: 12.0, + ), + ), + ), + ); + } + + GestureDetector _buildSkipForward(Color iconColor, double barHeight) { + return GestureDetector( + onTap: _skipForward, + child: Container( + height: barHeight, + color: Colors.transparent, + padding: EdgeInsets.only( + left: 6.0, + right: 8.0, + ), + margin: EdgeInsets.only( + right: 8.0, + ), + child: Icon( + OpenIconicIcons.reload, + color: iconColor, + size: 12.0, + ), + ), + ); + } + + Widget _buildTopBar( + Color backgroundColor, + Color iconColor, + double barHeight, + double buttonPadding, + ) { + return Container( + height: barHeight, + margin: EdgeInsets.only( + top: marginSize, + right: marginSize, + left: marginSize, + ), + child: Row( + children: [ + _buildGobackButton( + backgroundColor, iconColor, barHeight, buttonPadding), + SizedBox(width: 10), + chewieController.allowFullScreen + ? _buildExpandButton( + backgroundColor, iconColor, barHeight, buttonPadding) + : Container(), + Expanded(child: Container()), + chewieController.allowMuting + ? _buildMuteButton(controller, backgroundColor, iconColor, + barHeight, buttonPadding) + : Container(), + SizedBox(width: 10), + _buildChromeCastButton( + backgroundColor, iconColor, barHeight, buttonPadding) + ], + ), + ); + } + + void _cancelAndRestartTimer() { + _hideTimer?.cancel(); + + setState(() { + _hideStuff = false; + + _startHideTimer(); + }); + } + + Future _initialize() async { + controller.addListener(_updateState); + + _updateState(); + + if ((controller.value != null && controller.value.isPlaying) || + chewieController.autoPlay) { + _startHideTimer(); + } + + if (chewieController.showControlsOnInitialize) { + _initTimer = Timer(Duration(milliseconds: 200), () { + setState(() { + _hideStuff = false; + }); + }); + } + } + + void _onExpandCollapse() { + setState(() { + _hideStuff = true; + + chewieController.toggleFullScreen(); + _expandCollapseTimer = Timer(Duration(milliseconds: 300), () { + setState(() { + _cancelAndRestartTimer(); + }); + }); + }); + } + + Widget _buildProgressBar() { + return Expanded( + child: Padding( + padding: EdgeInsets.only(right: 12.0), + child: CupertinoVideoProgressBar( + controller, + onDragStart: () { + _hideTimer?.cancel(); + }, + onDragEnd: () { + _startHideTimer(); + }, + colors: chewieController.cupertinoProgressColors ?? + ChewieProgressColors( + playedColor: Color.fromARGB( + 120, + 255, + 255, + 255, + ), + handleColor: Color.fromARGB( + 255, + 255, + 255, + 255, + ), + bufferedColor: Color.fromARGB( + 60, + 255, + 255, + 255, + ), + backgroundColor: Color.fromARGB( + 20, + 255, + 255, + 255, + ), + ), + ), + ), + ); + } + + void _playPause() { + bool isFinished = _latestValue.position >= _latestValue.duration; + + setState(() { + if (controller.value.isPlaying) { + _hideStuff = false; + _hideTimer?.cancel(); + controller.pause(); + } else { + _cancelAndRestartTimer(); + + if (!controller.value.initialized) { + controller.initialize().then((_) { + controller.play(); + }); + } else { + if (isFinished) { + controller.seekTo(Duration(seconds: 0)); + } + controller.play(); + } + } + }); + } + + void _skipBack() { + _cancelAndRestartTimer(); + final beginning = Duration(seconds: 0).inMilliseconds; + final skip = (_latestValue.position - Duration(seconds: 15)).inMilliseconds; + controller.seekTo(Duration(milliseconds: math.max(skip, beginning))); + } + + void _skipForward() { + _cancelAndRestartTimer(); + final end = _latestValue.duration.inMilliseconds; + final skip = (_latestValue.position + Duration(seconds: 15)).inMilliseconds; + controller.seekTo(Duration(milliseconds: math.min(skip, end))); + } + + void _startHideTimer() { + _hideTimer = Timer(const Duration(seconds: 3), () { + setState(() { + _hideStuff = true; + }); + }); + } + + void _updateState() { + setState(() { + _latestValue = controller.value; + }); + } +} diff --git a/lib/widgets/customcliper_path.dart b/lib/widgets/customcliper_path.dart new file mode 100644 index 00000000..cc2abdc3 --- /dev/null +++ b/lib/widgets/customcliper_path.dart @@ -0,0 +1,34 @@ +import 'dart:ui'; +import 'dart:math' as math; +import 'package:flutter/widgets.dart'; + +class CustomCliperPath extends CustomClipper { + final double radius; + final double height; + final double width; + + CustomCliperPath({this.radius, this.height, this.width}); + + double degree2Radian(int degree) { + return (math.pi * degree / 180); + } + + @override + getClip(Size size) { + Path path = Path(); + path.moveTo(0, height); + path.addArc( + Rect.fromCircle( + radius: radius, center: Offset(width / 2, height - radius)), + 0, + 180); + return path; + } + + @override + bool shouldReclip(CustomCliperPath oldClipper) { + return this.radius != oldClipper.radius || + this.height != oldClipper.height || + this.width != oldClipper.width; + } +} \ No newline at end of file diff --git a/lib/widgets/dialogratingbar.dart b/lib/widgets/dialogratingbar.dart new file mode 100644 index 00000000..e21b2741 --- /dev/null +++ b/lib/widgets/dialogratingbar.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:movie/actions/adapt.dart'; + +class DialogRatingBar extends StatefulWidget { + final double rating; + final Function(double) submit; + + DialogRatingBar({this.rating, this.submit}); + + @override + DialogRatingBarState createState() => DialogRatingBarState(); +} + +class DialogRatingBarState extends State { + double rating; + Function(double) submit; + @override + void initState() { + rating = widget.rating; + submit = widget.submit; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(20))), + children: [ + Container( + width: Adapt.px(300), + height: Adapt.px(100), + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RatingBar( + initialRating: rating / 2, + ratingWidget: RatingWidget( + full: const Icon( + Icons.star, + color: Colors.amber, + ), + half: const Icon( + Icons.star_half_outlined, + color: Colors.amber, + ), + empty: const Icon( + Icons.star_border_outlined, + color: Colors.grey, + ), + ), + glow: false, + allowHalfRating: true, + onRatingUpdate: (rated) { + setState(() { + rating = rated * 2; + }); + }, + ), + SizedBox( + width: Adapt.px(20), + ), + Text( + rating.toStringAsFixed(0), + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ) + ], + ), + ), + Divider( + height: Adapt.px(40), + ), + Container( + height: Adapt.px(40), + child: FlatButton( + child: Text('ok', + style: TextStyle( + color: Colors.blueAccent, fontSize: Adapt.px(35))), + onPressed: () { + submit(rating); + Navigator.of(context).pop(); + }, + ), + ) + ], + ); + } +} diff --git a/lib/widgets/expandable_text.dart b/lib/widgets/expandable_text.dart new file mode 100644 index 00000000..f512d2f6 --- /dev/null +++ b/lib/widgets/expandable_text.dart @@ -0,0 +1,79 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +class ExpandableText extends StatefulWidget { + const ExpandableText(this.text, + {Key key, this.maxLines = 2, this.style, this.onTap}) + : assert(text != null), + super(key: key); + + final String text; + final int maxLines; + final TextStyle style; + final Function(bool) onTap; + + @override + ExpandableTextState createState() => ExpandableTextState(); +} + +class ExpandableTextState extends State { + bool _readMore = true; + void _onTapLink() { + setState(() => _readMore = !_readMore); + if (widget.onTap != null) widget.onTap(_readMore); + } + + @override + Widget build(BuildContext context) { + final colorClickableText = Colors.blue; + TextSpan link = TextSpan( + text: _readMore ? "... more" : " less", + style: TextStyle( + color: colorClickableText, + ), + recognizer: TapGestureRecognizer()..onTap = _onTapLink); + Widget result = LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + assert(constraints.hasBoundedWidth); + final double maxWidth = constraints.maxWidth; + final text = TextSpan(text: widget.text, style: widget.style); + TextPainter textPainter = TextPainter( + text: link, + textDirection: TextDirection.rtl, + maxLines: widget.maxLines, + ellipsis: '...', + ); + textPainter.layout(minWidth: constraints.minWidth, maxWidth: maxWidth); + final linkSize = textPainter.size; + textPainter.text = text; + textPainter.layout(minWidth: constraints.minWidth, maxWidth: maxWidth); + final textSize = textPainter.size; + int endIndex; + final pos = textPainter.getPositionForOffset(Offset( + textSize.width - linkSize.width, + textSize.height, + )); + endIndex = textPainter.getOffsetBefore(pos.offset); + var textSpan; + if (textPainter.didExceedMaxLines) { + textSpan = TextSpan( + text: _readMore ? widget.text.substring(0, endIndex) : widget.text, + style: widget.style, + children: [link], + ); + } else { + textSpan = TextSpan( + text: widget.text, + style: widget.style, + ); + } + return RichText( + softWrap: true, + overflow: TextOverflow.clip, + text: textSpan, + ); + }, + ); + return result; + } +} diff --git a/lib/widgets/gallery_photoview_wrapper.dart b/lib/widgets/gallery_photoview_wrapper.dart new file mode 100644 index 00000000..6ec0fd1c --- /dev/null +++ b/lib/widgets/gallery_photoview_wrapper.dart @@ -0,0 +1,119 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/image_model.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:photo_view/photo_view_gallery.dart'; + +class GalleryPhotoViewWrapper extends StatefulWidget { + GalleryPhotoViewWrapper( + {this.loadingChild, + this.backgroundDecoration, + this.minScale, + this.maxScale, + this.initialIndex, + @required this.imageSize, + @required this.galleryItems}) + : pageController = PageController(initialPage: initialIndex); + + final Widget loadingChild; + final Decoration backgroundDecoration; + final dynamic minScale; + final dynamic maxScale; + final int initialIndex; + final PageController pageController; + final List galleryItems; + final ImageSize imageSize; + + @override + State createState() { + return _GalleryPhotoViewWrapperState(); + } +} + +class _GalleryPhotoViewWrapperState extends State { + int currentIndex; + @override + void initState() { + currentIndex = widget.initialIndex; + super.initState(); + } + + void onPageChanged(int index) { + setState(() { + currentIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + color: Colors.black, + decoration: widget.backgroundDecoration, + constraints: BoxConstraints.expand( + height: MediaQuery.of(context).size.height, + ), + child: Stack( + children: [ + GestureDetector( + onVerticalDragUpdate: (dragUpdateDetails) { + Navigator.of(context).pop(); + }, + behavior: HitTestBehavior.translucent, + child: PhotoViewGallery.builder( + scrollPhysics: const BouncingScrollPhysics(), + builder: _buildItem, + itemCount: widget.galleryItems.length, + loadingChild: widget.loadingChild, + backgroundDecoration: widget.backgroundDecoration, + pageController: widget.pageController, + onPageChanged: onPageChanged, + )), + Container( + alignment: Alignment.bottomRight, + padding: const EdgeInsets.all(20.0), + child: Text( + "Image ${currentIndex + 1}", + style: const TextStyle( + color: Colors.white, fontSize: 17.0, decoration: null), + ), + ), + Material( + color: Colors.transparent, + child: SafeArea( + child: Container( + padding: EdgeInsets.only(left: Adapt.px(30)), + child: IconButton( + icon: Icon( + Icons.close, + color: Colors.white, + size: Adapt.px(50), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + ), + ) + ], + )), + ); + } + + PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index) { + final ImageData item = widget.galleryItems[index]; + String url = item.filePath == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl(item.filePath, widget.imageSize); + return PhotoViewGalleryPageOptions( + imageProvider: CachedNetworkImageProvider(url), + initialScale: PhotoViewComputedScale.contained, + heroAttributes: PhotoViewHeroAttributes(tag: '$url$index'), + ); + } +} diff --git a/lib/widgets/hero_dialog_route.dart b/lib/widgets/hero_dialog_route.dart new file mode 100644 index 00000000..52108acb --- /dev/null +++ b/lib/widgets/hero_dialog_route.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class HeroDialogRoute extends PageRoute { + HeroDialogRoute({this.builder, this.bgColor}) : super(); + + final WidgetBuilder builder; + final Color bgColor; + + @override + bool get opaque => false; + + @override + bool get barrierDismissible => true; + + @override + Duration get transitionDuration => const Duration(milliseconds: 300); + + @override + bool get maintainState => true; + + @override + Color get barrierColor => bgColor ?? Colors.black54; + + @override + Widget buildTransitions(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + return new FadeTransition( + opacity: new CurvedAnimation(parent: animation, curve: Curves.easeOut), + child: child); + } + + @override + Widget buildPage(BuildContext context, Animation animation, + Animation secondaryAnimation) { + return builder(context); + } + + @override + String get barrierLabel => null; +} diff --git a/lib/widgets/host_dialog.dart b/lib/widgets/host_dialog.dart new file mode 100644 index 00000000..b880ee66 --- /dev/null +++ b/lib/widgets/host_dialog.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/stream_link_convert/stream_link_convert_factory.dart'; +import 'package:movie/style/themestyle.dart'; + +class HostDialog extends StatefulWidget { + final String selectedHost; + final Function(String) onSelected; + const HostDialog({this.selectedHost, this.onSelected}); + @override + _HostDialogState createState() => _HostDialogState(); +} + +class _HostDialogState extends State { + String _selectedHost; + + @override + void initState() { + _selectedHost = widget.selectedHost; + super.initState(); + } + + _onSelected(String host) { + if (_selectedHost == host) + _selectedHost = null; + else + _selectedHost = host; + setState(() {}); + if (widget.onSelected != null) widget.onSelected(_selectedHost); + } + + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + return SimpleDialog( + contentPadding: const EdgeInsets.all(24), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + backgroundColor: _backGroundColor, + title: Text( + 'Prefer Host', + style: TextStyle(color: const Color(0xFFFFFFFF)), + ), + children: [ + Wrap( + runSpacing: 8, + spacing: 8, + children: StreamLinkConvertFactory.instance.hosts + .map( + (e) => _WrapCell( + title: e, + selected: e == _selectedHost, + onTap: _onSelected, + ), + ) + .toList(), + ), + ], + ); + } +} + +class _WrapCell extends StatelessWidget { + final String title; + final bool selected; + final Function(String) onTap; + const _WrapCell({this.title, this.onTap, this.selected = false}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => onTap(title), + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all( + color: const Color(0xFFFFFFFF), + ), + borderRadius: BorderRadius.circular(8), + color: selected ? const Color(0xFFFFFFFF) : null, + ), + child: Text( + title, + style: TextStyle( + fontSize: 12, + color: selected ? const Color(0xFF25272E) : const Color(0xFFFFFFFF), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/imageview_wrapper.dart b/lib/widgets/imageview_wrapper.dart new file mode 100644 index 00000000..be613c52 --- /dev/null +++ b/lib/widgets/imageview_wrapper.dart @@ -0,0 +1,58 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:photo_view/photo_view.dart'; + +class HeroPhotoViewWrapper extends StatelessWidget { + const HeroPhotoViewWrapper( + {this.url, + this.loadingChild, + this.backgroundDecoration, + this.minScale, + this.maxScale}); + + final String url; + final Widget loadingChild; + final Decoration backgroundDecoration; + final dynamic minScale; + final dynamic maxScale; + + @override + Widget build(BuildContext context) { + return Container( + constraints: BoxConstraints.expand( + height: MediaQuery.of(context).size.height, + ), + child: Stack( + children: [ + PhotoView( + imageProvider: CachedNetworkImageProvider(url), + loadingChild: loadingChild, + backgroundDecoration: backgroundDecoration, + minScale: minScale, + maxScale: maxScale, + heroAttributes: PhotoViewHeroAttributes(tag: '$url'), + ), + Material( + color: Colors.transparent, + child: SafeArea( + child: Container( + padding: EdgeInsets.only(left: Adapt.px(30)), + child: IconButton( + icon: Icon( + Icons.close, + color: Colors.white, + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + ), + ) + ], + )); + } +} diff --git a/lib/widgets/keepalive_widget.dart b/lib/widgets/keepalive_widget.dart new file mode 100644 index 00000000..61efb46d --- /dev/null +++ b/lib/widgets/keepalive_widget.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class KeepAliveWidget extends StatefulWidget { + final Widget child; + + const KeepAliveWidget(this.child); + + @override + State createState() => KeepAliveState(); +} + +class KeepAliveState extends State + with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; + + @override + Widget build(BuildContext context) { + super.build(context); + return widget.child; + } +} + +Widget keepAliveWrapper(Widget child) { + return KeepAliveWidget(child); +} \ No newline at end of file diff --git a/lib/widgets/language_dialog.dart b/lib/widgets/language_dialog.dart new file mode 100644 index 00000000..7a8cea04 --- /dev/null +++ b/lib/widgets/language_dialog.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/app_language.dart'; +import 'package:movie/models/models.dart'; +import 'package:movie/style/themestyle.dart'; + +class LanguageDialog extends StatefulWidget { + final Function(String) onTap; + final String selected; + const LanguageDialog({this.onTap, this.selected}); + @override + _LanguageDialogState createState() => _LanguageDialogState(); +} + +class _LanguageDialogState extends State { + final List _data = AppLanguage.instance.supportLanguages + .where((e) => e.name != 'System Default') + .toList(); + String _selectedCode; + @override + void initState() { + _selectedCode = widget.selected; + super.initState(); + } + + _onSelected(String code) { + if (_selectedCode == code) + _selectedCode = null; + else + _selectedCode = code; + setState(() {}); + if (widget.onTap != null) widget.onTap(_selectedCode); + } + + @override + Widget build(BuildContext context) { + final Size _size = MediaQuery.of(context).size; + final _theme = ThemeStyle.getTheme(context); + final _backGroundColor = _theme.brightness == Brightness.light + ? const Color(0xFF25272E) + : _theme.primaryColorDark; + return SimpleDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + elevation: 0.0, + backgroundColor: _backGroundColor, + titleTextStyle: TextStyle(color: const Color(0xFFFFFFFF), fontSize: 18), + title: Text( + 'Default Language', + ), + children: [ + Container( + height: _size.height / 2, + width: _size.width, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 5.0), + separatorBuilder: (_, __) => SizedBox(height: 10), + physics: BouncingScrollPhysics(), + itemCount: _data.length, + itemBuilder: (_, index) { + final _language = _data[index]; + return _LangageListCell( + onTap: _onSelected, + selected: _selectedCode == _language.value, + language: _language, + ); + }, + ), + ), + ], + ); + } +} + +class _LangageListCell extends StatelessWidget { + final Function(String) onTap; + final Item language; + final bool selected; + const _LangageListCell({this.onTap, this.language, this.selected = false}); + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + onTap(language.value); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + border: Border.all( + color: + selected ? const Color(0xFFFFFFFF) : Colors.transparent)), + child: Text( + language.name, + style: TextStyle(color: const Color(0xFFFFFFFF), fontSize: 14), + ), + ), + ); + } +} diff --git a/lib/widgets/linear_progress_Indicator.dart b/lib/widgets/linear_progress_Indicator.dart new file mode 100644 index 00000000..48caaf0c --- /dev/null +++ b/lib/widgets/linear_progress_Indicator.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/style/themestyle.dart'; + +class LinearGradientProgressIndicator extends StatelessWidget { + final double value; + final double width; + final List colors; + const LinearGradientProgressIndicator( + {this.value, + this.width = 80, + this.colors = const [ + const Color(0xFF90CAF9), + const Color(0xFFE1BEE7), + ]}) + : assert(colors.length > 0 && colors != null), + assert(value != null && value <= 1); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return Container( + width: width + Adapt.px(12), + height: Adapt.px(22), + padding: EdgeInsets.all(Adapt.px(6)), + decoration: BoxDecoration( + color: _theme.brightness == Brightness.light + ? const Color(0xFFF0F0F0) + : const Color(0xFF606060), + borderRadius: BorderRadius.circular(Adapt.px(11))), + child: Row(children: [ + Container( + width: value * width, + decoration: BoxDecoration( + gradient: LinearGradient(colors: colors), + borderRadius: BorderRadius.circular( + Adapt.px(7.5), + ), + ), + ) + ]), + ); + } +} diff --git a/lib/widgets/loading_layout.dart b/lib/widgets/loading_layout.dart new file mode 100644 index 00000000..4ec0a775 --- /dev/null +++ b/lib/widgets/loading_layout.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; + +class LoadingLayout extends StatelessWidget { + final String title; + final bool show; + const LoadingLayout({this.show, @required this.title}); + @override + Widget build(BuildContext context) { + return show + ? Material( + color: Colors.transparent, + child: Container( + width: Adapt.screenW(), + height: Adapt.screenH(), + color: const Color(0x20000000), + child: Center( + child: Container( + width: Adapt.px(300), + height: Adapt.px(300), + decoration: BoxDecoration( + color: const Color(0xAA000000), + borderRadius: BorderRadius.circular( + Adapt.px(20), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator( + valueColor: + AlwaysStoppedAnimation(const Color(0xFFFFFFFF)), + ), + SizedBox(height: Adapt.px(30)), + Text( + title, + style: TextStyle( + color: const Color(0xFFFFFFFF), + fontSize: 14, + ), + ) + ]), + ), + ), + ), + ) + : SizedBox(); + } +} diff --git a/lib/widgets/medialist_card.dart b/lib/widgets/medialist_card.dart new file mode 100644 index 00000000..e5f35856 --- /dev/null +++ b/lib/widgets/medialist_card.dart @@ -0,0 +1,269 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/globalbasestate/store.dart'; +import 'package:movie/models/base_api_model/user_list.dart'; +import 'package:movie/models/base_api_model/user_list_detail.dart'; +import 'package:movie/models/enums/media_type.dart'; +import 'package:movie/models/mylist_model.dart'; +import 'package:movie/models/response_model.dart'; +import 'package:movie/style/themestyle.dart'; + +class MediaListCardDialog extends StatefulWidget { + final MediaType type; + final int mediaId; + final String name; + final double rated; + final String photourl; + final int runtime; + final int revenue; + final String releaseDate; + MediaListCardDialog( + {@required this.type, + @required this.mediaId, + this.name, + this.rated, + this.photourl, + this.runtime = 0, + this.revenue = 0, + this.releaseDate}); + @override + MediaListCardDialogState createState() => MediaListCardDialogState(); +} + +class MediaListCardDialogState extends State { + Future lists; + ScrollController scrollController; + Future> _userList; + + final _user = GlobalStore.store.getState().user; + + final _baseApi = BaseApi.instance; + + initUserlist() { + if (_user != null) + setState(() { + _userList = _baseApi.getUserList(_user.firebaseUser.uid); + }); + } + + void _createList(BuildContext context) async { + if (_user != null) { + setState(() { + _userList = null; + }); + await Navigator.of(context).pushNamed('createListPage'); + initUserlist(); + } + } + + Future _submit() async { + final _list = await _userList; + Navigator.of(context).pop(); + String _mediaType = widget.type == MediaType.movie ? 'movie' : 'tv'; + if (_user != null && _list != null) { + var d = _list.result.data.singleWhere((f) => f.selected == 1); + if (d != null) { + var item = await _baseApi.getUserListDetailItem( + d.id, _mediaType, widget.mediaId); + if (!item.success) { + d.totalRated += widget.rated; + d.runTime += widget.runtime; + d.itemCount += 1; + d.revenue += widget.revenue; + await _baseApi.updateUserList(d); + await _baseApi.addUserListDetail(UserListDetail.fromParams( + mediaid: widget.mediaId, + mediaName: widget.name, + mediaType: _mediaType, + rated: widget.rated, + runTime: widget.runtime, + revenue: double.parse(widget.revenue?.toString() ?? '0.0'), + photoUrl: widget.photourl, + listid: d.id)); + } + } + } + } + + void _onSelected(UserList userlist) async { + final l = await _userList; + l.result.data.forEach((f) { + if (f.selected == 1) f.selected = 0; + }); + userlist.selected = 1; + setState(() {}); + } + + @override + void initState() { + initUserlist(); + scrollController = ScrollController(); + super.initState(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final Size _size = MediaQuery.of(context).size; + return SimpleDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(20))), + title: _Title(onAdd: () => _createList(context)), + children: [ + Container( + width: _size.width, + height: _size.height / 2, + child: FutureBuilder>( + future: _userList, + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + case ConnectionState.active: + case ConnectionState.waiting: + return Container( + margin: EdgeInsets.only(top: Adapt.px(30)), + alignment: Alignment.center, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.black), + ), + ); + case ConnectionState.done: + if (snapshot.hasData && snapshot.data.success) { + final List _list = + snapshot.data?.result?.data ?? []; + return ListView.separated( + padding: EdgeInsets.symmetric( + horizontal: 24, vertical: 10), + itemBuilder: (_, index) { + final d = _list[index]; + return _ListCell( + data: d, + selected: d.selected == 1, + onTap: _onSelected, + ); + }, + separatorBuilder: (_, index) => SizedBox(height: 10), + itemCount: _list.length); + } else + return SizedBox(); + } + return SizedBox(); + }, + ), + ), + _ButtonPanel( + onSubmit: _submit, + onCancel: () => Navigator.of(context).pop(), + ) + ]); + } +} + +class _Title extends StatelessWidget { + final Function onAdd; + const _Title({this.onAdd}); + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Add to my list'), + GestureDetector( + onTap: onAdd, + child: Icon(Icons.add_circle), + ), + ], + ); + } +} + +class _ListCell extends StatelessWidget { + final UserList data; + final bool selected; + final Function(UserList) onTap; + const _ListCell({this.data, this.selected, this.onTap}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + return GestureDetector( + onTap: () => onTap(data), + child: Container( + padding: EdgeInsets.all(10), + decoration: selected + ? BoxDecoration( + border: Border.all(color: _theme.iconTheme.color), + borderRadius: BorderRadius.circular(5), + ) + : null, + child: Text( + data.listName ?? '', + style: TextStyle(fontSize: 18), + ), + )); + } +} + +class _ButtonPanel extends StatelessWidget { + final Function onSubmit; + final Function onCancel; + const _ButtonPanel({this.onSubmit, this.onCancel}); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + _Button( + text: 'cancel', + onPress: onCancel, + ), + SizedBox(width: 24), + _Button( + text: 'ok', + onPress: onSubmit, + ), + ], + ), + ); + } +} + +class _Button extends StatelessWidget { + final String text; + final Function onPress; + const _Button({this.onPress, this.text}); + @override + Widget build(BuildContext context) { + final _theme = ThemeStyle.getTheme(context); + final _textStyle = TextStyle( + fontSize: 16, + color: _theme.brightness == Brightness.light + ? const Color(0xFFFFFFFF) + : const Color(0xFF000000)); + return InkWell( + onTap: onPress, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), + constraints: BoxConstraints(minWidth: 80), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: _theme.iconTheme.color), + child: Center( + child: Text( + text, + style: _textStyle, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/overlay_entry_manage.dart b/lib/widgets/overlay_entry_manage.dart new file mode 100644 index 00000000..c8b57d61 --- /dev/null +++ b/lib/widgets/overlay_entry_manage.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class OverlayEntryManage extends StatefulWidget { + final Widget child; + const OverlayEntryManage({Key key, this.child}) : super(key: key); + @override + OverlayEntryManageState createState() => OverlayEntryManageState(); +} + +class OverlayEntryManageState extends State { + OverlayEntry _currentOverlayEntry; + void setOverlayEntry(OverlayEntry overlayEntry) { + _currentOverlayEntry = overlayEntry; + } + + Future _onWillPop() { + if (_currentOverlayEntry != null) { + _currentOverlayEntry?.remove(); + _currentOverlayEntry = null; + return Future.value(false); + } + return Future.value(true); + } + + @override + Widget build(BuildContext context) { + return WillPopScope(onWillPop: () => _onWillPop(), child: widget.child); + } +} diff --git a/lib/widgets/scrollview_background.dart b/lib/widgets/scrollview_background.dart new file mode 100644 index 00000000..65b0717d --- /dev/null +++ b/lib/widgets/scrollview_background.dart @@ -0,0 +1,51 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ScrollViewBackGround extends StatefulWidget { + final double height; + final ScrollController scrollController; + final double maxOpacity; + final Widget child; + ScrollViewBackGround( + {Key key, + this.child, + this.scrollController, + this.height, + this.maxOpacity}) + : super(key: key); + @override + ScrollViewBackGroundState createState() => ScrollViewBackGroundState(); +} + +class ScrollViewBackGroundState extends State { + double op; + void _scrolllistener() { + double o = widget.scrollController.position.pixels / widget.height; + if (o > widget.maxOpacity) o = widget.maxOpacity; + setState(() { + op = o; + }); + } + + @override + void initState() { + op = 0.0; + widget.scrollController.addListener(_scrolllistener); + + super.initState(); + } + + @override + void dispose() { + widget.scrollController.removeListener(_scrolllistener); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.black.withOpacity(op), + child: widget.child, + ); + } +} diff --git a/lib/widgets/searchbar_delegate.dart b/lib/widgets/searchbar_delegate.dart new file mode 100644 index 00000000..6c69338a --- /dev/null +++ b/lib/widgets/searchbar_delegate.dart @@ -0,0 +1,482 @@ +import 'dart:math'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/api/tmdb_api.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/response_model.dart'; +import 'package:movie/models/search_result.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class SearchBarDelegate extends SearchDelegate { + SearchResultModel searchResultModel; + List searchHistory; + SharedPreferences prefs; + @override + List buildActions(BuildContext context) { + return [ + IconButton( + icon: Icon(Icons.clear), + onPressed: () { + query = ""; + showSuggestions(context); + }, + ), + ]; + } + + @override + Widget buildLeading(BuildContext context) { + return IconButton( + icon: AnimatedIcon( + icon: AnimatedIcons.menu_arrow, progress: transitionAnimation), + onPressed: () { + close(context, null); + }, + ); + } + + Future> _getData() { + if (query != '' && query != null) + return TMDBApi.instance.searchMulit(query); + else + return null; + } + + Future> _getHistory() async { + if (prefs == null) prefs = await SharedPreferences.getInstance(); + searchHistory = prefs.getStringList('searchHistory') ?? List(); + return searchHistory; + } + + @override + Widget buildResults(BuildContext context) { + if (prefs != null && query != '') { + int index = searchHistory.indexOf(query); + if (index < 0) { + searchHistory.insert(0, query); + prefs.setStringList('searchHistory', searchHistory); + } + } + return FutureBuilder>( + future: _getData(), // a previously-obtained Future or null + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + return Container( + child: Center( + child: Text('No Result'), + ), + ); + case ConnectionState.active: + case ConnectionState.waiting: + return Container( + margin: EdgeInsets.only(top: Adapt.px(30)), + alignment: Alignment.topCenter, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.black), + ), + ); + case ConnectionState.done: + if (snapshot.hasError) return Text('Error: ${snapshot.error}'); + return _ResultList( + query: query, + results: snapshot.data?.result?.results ?? [], + ); + } + return null; + }, + ); + } + + Widget _buildHistoryList() { + return FutureBuilder>( + future: _getHistory(), // a previously-obtained Future or null + builder: (BuildContext context, AsyncSnapshot> snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + return _buildHistoryList(); + case ConnectionState.active: + case ConnectionState.waiting: + return Container( + margin: EdgeInsets.only(top: Adapt.px(30)), + alignment: Alignment.topCenter, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.black)), + ); + case ConnectionState.done: + if (snapshot.hasError) return Text('Error: ${snapshot.error}'); + return Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: + EdgeInsets.fromLTRB(Adapt.px(30), Adapt.px(30), 0, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'History', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(35)), + ), + searchHistory.length > 0 + ? SizedBox( + height: Adapt.px(40), + child: IconButton( + padding: EdgeInsets.all(0), + icon: Icon(Icons.delete_outline), + onPressed: () { + if (prefs != null && + searchHistory.length > 0) { + searchHistory = List(); + prefs.remove('searchHistory'); + query = ''; + showSuggestions(context); + } + }, + ), + ) + : SizedBox() + ], + )), + searchHistory != null && searchHistory.length > 0 + ? Container( + padding: + EdgeInsets.symmetric(horizontal: Adapt.px(30)), + width: Adapt.screenW(), + child: Wrap( + spacing: Adapt.px(20), + children: searchHistory.take(10).map((s) { + return ActionChip( + avatar: Icon( + Icons.history, + color: Colors.grey[500], + ), + // backgroundColor: Colors.grey[200], + label: Text(s), + //labelStyle: TextStyle(color: Colors.black87), + onPressed: () { + query = s; + showResults(context); + }, + ); + }).toList()), + ) + : Container( + padding: EdgeInsets.only(left: Adapt.px(30)), + child: Text('no search history'), + ), + ], + ), + ); + } + return null; + }, + ); + } + + @override + Widget buildSuggestions(BuildContext context) { + return FutureBuilder>( + future: _getData(), // a previously-obtained Future or null + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + return _buildHistoryList(); + case ConnectionState.active: + case ConnectionState.waiting: + return Container( + margin: EdgeInsets.only(top: Adapt.px(30)), + alignment: Alignment.topCenter, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.black)), + ); + case ConnectionState.done: + if (snapshot.hasError) return Text('Error: ${snapshot.error}'); + return _SuggestionList( + query: query, + suggestions: snapshot.data?.result?.results ?? [], + onSelected: (String suggestion) { + query = suggestion; + showResults(context); + }, + ); + } + return null; + }, + ); + } + + @override + ThemeData appBarTheme(BuildContext context) { + assert(context != null); + final ThemeData theme = Theme.of(context); + + assert(theme != null); + final _lightTheme = theme.copyWith( + inputDecorationTheme: + InputDecorationTheme(hintStyle: TextStyle(color: Colors.grey)), + primaryColor: Colors.white, + primaryIconTheme: theme.primaryIconTheme.copyWith(color: Colors.grey), + primaryColorBrightness: Brightness.light, + primaryTextTheme: theme.textTheme, + ); + final _darkTheme = theme.copyWith( + inputDecorationTheme: + InputDecorationTheme(hintStyle: TextStyle(color: Colors.grey)), + primaryColor: Color(0xFF303030), + primaryIconTheme: theme.primaryIconTheme.copyWith(color: Colors.grey), + primaryColorBrightness: Brightness.dark, + primaryTextTheme: theme.textTheme, + ); + final MediaQueryData _mediaQuery = MediaQuery.of(context); + final ThemeData _newtheme = + _mediaQuery.platformBrightness == Brightness.light + ? _lightTheme + : _darkTheme; + return _newtheme; + } +} + +Widget _buildSuggestionCell(SearchResult s, ValueChanged tapped) { + IconData iconData = s.mediaType == 'movie' + ? Icons.movie + : s.mediaType == 'tv' ? Icons.live_tv : Icons.person; + String name = s.mediaType == 'movie' ? s.title : s.name; + return Container( + height: Adapt.px(100), + child: ListTile( + leading: Icon(iconData), + title: new Text(name), + onTap: () => tapped(name), + )); +} + +class _SuggestionList extends StatelessWidget { + const _SuggestionList({this.suggestions, this.query, this.onSelected}); + + final List suggestions; + final String query; + final ValueChanged onSelected; + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: suggestions.length, + itemBuilder: (BuildContext context, int i) { + final SearchResult suggestion = suggestions[i]; + return _buildSuggestionCell(suggestion, onSelected); + }, + ); + } +} + +Random _random = Random(DateTime.now().millisecondsSinceEpoch); + +Widget _buildResultCell(SearchResult s, BuildContext ctx) { + IconData iconData = s.mediaType == 'movie' + ? Icons.movie + : s.mediaType == 'tv' ? Icons.live_tv : Icons.person; + String imageurl = s.mediaType != 'person' ? s.posterPath : s.profilePath; + String name = s.mediaType == "movie" ? s.title : s.name; + return GestureDetector( + child: Padding( + padding: EdgeInsets.only(bottom: Adapt.px(20)), + child: Card( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: Adapt.px(240), + height: Adapt.px(350), + decoration: BoxDecoration( + color: Color.fromRGBO( + _random.nextInt(255), + _random.nextInt(255), + _random.nextInt(255), + _random.nextDouble()), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(imageurl == null + ? ImageUrl.emptyimage + : ImageUrl.getUrl(imageurl, ImageSize.w300)))), + ), + SizedBox( + width: Adapt.px(20), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: Adapt.px(20), + ), + Row( + children: [ + Icon( + iconData, + size: Adapt.px(40), + ), + SizedBox( + width: Adapt.px(10), + ), + Container( + width: Adapt.screenW() - Adapt.px(370), + child: Text( + name, + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: Adapt.px(30)), + ), + ), + ], + ), + SizedBox( + height: Adapt.px(10), + ), + s.mediaType != 'person' + ? Container( + width: Adapt.screenW() - Adapt.px(320), + child: Text( + s.overview ?? 'no description', + overflow: TextOverflow.ellipsis, + maxLines: 7, + style: TextStyle( + fontSize: Adapt.px(26), wordSpacing: 1.2), + ), + ) + : Container( + width: Adapt.screenW() - Adapt.px(320), + child: Wrap( + spacing: Adapt.px(10), + children: s.knownFor.map((d) { + return Chip( + backgroundColor: Colors.grey[200], + label: Text( + d.title ?? '', + style: TextStyle(fontSize: Adapt.px(24)), + ), + ); + }).toList(), + )), + ], + ) + ], + ), + ), + ), + onTap: () async { + switch (s.mediaType) { + case 'movie': + return await Navigator.of(ctx).pushNamed('detailpage', arguments: { + 'id': s.id, + 'bgpic': s.posterPath, + 'title': s.title, + 'posterpic': s.posterPath + }); + case 'tv': + return await Navigator.of(ctx).pushNamed('tvShowDetailPage', + arguments: { + 'id': s.id, + 'bgpic': s.backdropPath, + 'name': s.name, + 'posterpic': s.posterPath + }); + case 'person': + return await Navigator.of(ctx).pushNamed('peopledetailpage', + arguments: { + 'peopleid': s.id, + 'profilePath': s.profilePath, + 'profileName': s.name + }); + default: + return null; + } + }, + ); +} + +class _ResultList extends StatefulWidget { + const _ResultList({this.results, this.query}); + + final List results; + final String query; + + @override + _ResultListState createState() => _ResultListState(); +} + +class _ResultListState extends State<_ResultList> { + ScrollController scrollController; + List results; + String query; + int pageindex; + int totalpage; + bool isloading; + + Future loadData() async { + bool isBottom = scrollController.position.pixels == + scrollController.position.maxScrollExtent; + if (isBottom && totalpage > pageindex) { + setState(() { + isloading = true; + }); + pageindex++; + final r = await TMDBApi.instance.searchMulit(query, page: pageindex); + if (r != null) { + setState(() { + if (r.success) { + pageindex = r.result.page; + totalpage = r.result.totalPages; + results.addAll(r.result.results); + } + isloading = false; + }); + } + } + } + + Widget _buildFooter() { + return Offstage( + offstage: !isloading, + child: Container( + height: Adapt.px(80), + alignment: Alignment.center, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.black)), + )); + } + + @override + void initState() { + results = widget.results; + query = widget.query; + pageindex = 1; + totalpage = 2; + isloading = false; + scrollController = ScrollController()..addListener(loadData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(20)), + child: ListView( + controller: scrollController, + children: results + .map((result) => _buildResultCell(result, context)) + .toList() + ..add(_buildFooter())), + ); + } +} diff --git a/lib/widgets/service_discovery.dart b/lib/widgets/service_discovery.dart new file mode 100644 index 00000000..2468e1bf --- /dev/null +++ b/lib/widgets/service_discovery.dart @@ -0,0 +1,30 @@ +import 'dart:convert' show utf8; +import 'dart:typed_data'; +import 'package:flutter_mdns_plugin/flutter_mdns_plugin.dart'; +import 'package:observable/observable.dart'; + +class ServiceDiscovery extends ChangeNotifier { + FlutterMdnsPlugin _flutterMdnsPlugin; + List foundServices = []; + + ServiceDiscovery() { + _flutterMdnsPlugin = FlutterMdnsPlugin( + discoveryCallbacks: DiscoveryCallbacks( + onDiscoveryStarted: () => {}, + onDiscoveryStopped: () => {}, + onDiscovered: (ServiceInfo serviceInfo) => {}, + onResolved: (ServiceInfo serviceInfo) { + print('found device ${serviceInfo.toString()}'); + if (null != serviceInfo.attr && null != serviceInfo.attr['fn']) { + Uint8List l = Uint8List.fromList(serviceInfo.attr['fn']); + serviceInfo.name = utf8.decode(l); + } + foundServices.add(serviceInfo); + notifyChange(); + })); + } + + startDiscovery() { + _flutterMdnsPlugin.startDiscovery('_googlecast._tcp'); + } +} diff --git a/lib/widgets/share_card.dart b/lib/widgets/share_card.dart new file mode 100644 index 00000000..474917e2 --- /dev/null +++ b/lib/widgets/share_card.dart @@ -0,0 +1,222 @@ +import 'dart:io'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/widgets/shimmercell.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:screenshot/screenshot.dart'; +import 'package:share_extend/share_extend.dart'; + +class ShareCard extends StatefulWidget { + final String backgroundImage; + final String qrValue; + final Widget header; + final double headerHeight; + ShareCard( + {Key key, + @required this.backgroundImage, + @required this.qrValue, + @required this.header, + this.headerHeight}) + : super(key: key); + @override + ShareCardState createState() => ShareCardState(); +} + +class ShareCardState extends State { + String backgroundImage; + String qrValue; + Widget header; + double headerHeight; + ScreenshotController screenshotController; + double width = (Adapt.screenW() - Adapt.px(60)).floorToDouble(); + double height = (Adapt.screenH() / 2).floorToDouble(); + @override + void initState() { + backgroundImage = widget.backgroundImage; + qrValue = widget.qrValue; + header = widget.header; + screenshotController = ScreenshotController(); + headerHeight = + widget.headerHeight ?? ((width - Adapt.px(40)) / 2).floorToDouble(); + super.initState(); + } + + Future _buildShareCard() async { + //var paletteGenerator = await PaletteGenerator.fromImageProvider(CachedNetworkImageProvider(backgroundImage)); + //Color maincolor = paletteGenerator==null?Color.fromRGBO(50, 50, 50, 1):paletteGenerator.dominantColor; + Color maincolor = Color.fromRGBO(70, 70, 70, 1); + return Container( + width: width, + height: height, + margin: EdgeInsets.all(Adapt.px(20)), + decoration: BoxDecoration(boxShadow: [ + BoxShadow( + blurRadius: 20.0, + spreadRadius: 0.1, + offset: Offset(0, 5), + color: Colors.black45), + ]), + child: Screenshot( + controller: screenshotController, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: width - Adapt.px(40), + height: headerHeight, + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(20))), + image: DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider(backgroundImage))), + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + stops: [ + 0.25, + 0.50, + 0.75, + 1.0 + ], + colors: [ + maincolor.withOpacity(0.7), + maincolor.withOpacity(0.8), + maincolor.withOpacity(0.9), + maincolor, + ]), + borderRadius: BorderRadius.vertical( + top: Radius.circular(Adapt.px(20))), + ), + child: header, + ), + ), + Container( + height: height - headerHeight, + decoration: BoxDecoration( + color: maincolor, + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(Adapt.px(20))), + ), + alignment: Alignment.center, + child: QrImage( + backgroundColor: Colors.white, + data: qrValue, + size: Adapt.px(320), + ), + ), + ], + )), + ); + } + + Widget _showShareCard() { + return FutureBuilder( + future: _buildShareCard(), + builder: (context, snapshot) { + var width = Adapt.screenW() - Adapt.px(60); + var height = Adapt.screenH() / 2; + switch (snapshot.connectionState) { + case ConnectionState.none: + return Container( + width: width, + height: height, + child: Center( + child: Text('build failed'), + ), + ); + case ConnectionState.active: + case ConnectionState.waiting: + return Container( + margin: EdgeInsets.all(Adapt.px(20)), + alignment: Alignment.center, + child: ShimmerCell(width, height, Adapt.px(20)), + ); + case ConnectionState.done: + if (snapshot.hasError) return Text('Error: ${snapshot.error}'); + return snapshot.data; + } + return null; + }); + } + + void shareTapped() { + screenshotController.capture().then((File image) async { + ShareExtend.share(image.path, "image"); + }).catchError((onError) { + print(onError); + }); + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + backgroundColor: Colors.transparent, + contentPadding: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(20))), + children: [ + Stack( + children: [ + Container( + height: height + Adapt.px(130), + padding: EdgeInsets.only(top: height / 2), + child: Container( + padding: EdgeInsets.only(top: height / 2 + Adapt.px(20)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(Adapt.px(30))), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () {}, + child: SizedBox( + width: Adapt.px(200), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.file_download), + Text( + 'DownLoad', + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold), + ) + ], + ), + )), + SizedBox( + width: Adapt.px(30), + ), + GestureDetector( + onTap: shareTapped, + child: SizedBox( + width: Adapt.px(200), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.share), + Text('Share', + style: TextStyle( + color: Colors.black, + fontSize: Adapt.px(28), + fontWeight: FontWeight.bold)) + ]), + )), + ]), + ), + ), + _showShareCard(), + ], + ) + ], + ); + } +} diff --git a/lib/widgets/shimmercell.dart b/lib/widgets/shimmercell.dart new file mode 100644 index 00000000..517c62bc --- /dev/null +++ b/lib/widgets/shimmercell.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/style/themestyle.dart'; +import 'package:shimmer/shimmer.dart'; + +class ShimmerCell extends StatelessWidget { + const ShimmerCell(this.width, this.height, this.borderRadius, + {Key key, + this.margin = EdgeInsets.zero, + this.baseColor, + this.highlightColor}) + : super(key: key); + + final double width; + final double height; + final double borderRadius; + final EdgeInsetsGeometry margin; + final Color baseColor; + final Color highlightColor; + + @override + Widget build(BuildContext context) { + final MediaQueryData _mediaQuery = MediaQuery.of(context); + final ThemeData _theme = _mediaQuery.platformBrightness == Brightness.light + ? ThemeStyle.lightTheme + : ThemeStyle.darkTheme; + return Shimmer.fromColors( + baseColor: baseColor ?? _theme.primaryColorDark, + highlightColor: highlightColor ?? _theme.primaryColorLight, + child: Container( + width: width, + height: height, + margin: margin, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(borderRadius), + color: Colors.grey[200], + ), + ), + ); + } +} diff --git a/lib/widgets/sliverappbar_delegate.dart b/lib/widgets/sliverappbar_delegate.dart new file mode 100644 index 00000000..f0462551 --- /dev/null +++ b/lib/widgets/sliverappbar_delegate.dart @@ -0,0 +1,35 @@ +import 'dart:math' as math; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class SliverAppBarDelegate extends SliverPersistentHeaderDelegate { + SliverAppBarDelegate({ + @required this.minHeight, + @required this.maxHeight, + @required this.child, + }); + + final double minHeight; + final double maxHeight; + final Widget child; + + @override + double get minExtent => minHeight; + + @override + double get maxExtent => math.max(maxHeight, minHeight); + + @override + Widget build( + BuildContext context, double shrinkOffset, bool overlapsContent) { + return new SizedBox.expand(child: child); + } + + @override + bool shouldRebuild(SliverAppBarDelegate oldDelegate) { + return maxHeight != oldDelegate.maxHeight || + minHeight != oldDelegate.minHeight || + child != oldDelegate.child; + } +} diff --git a/lib/widgets/stream_link_report_dialog.dart b/lib/widgets/stream_link_report_dialog.dart new file mode 100644 index 00000000..19ea6bb3 --- /dev/null +++ b/lib/widgets/stream_link_report_dialog.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/api/base_api.dart'; +import 'package:movie/models/base_api_model/stream_link_report.dart'; + +class StreamLinkReportDialog extends StatefulWidget { + final StreamLinkReport report; + StreamLinkReportDialog({Key key, @required this.report}) : super(key: key); + @override + _StreamLinkReportDialogState createState() => _StreamLinkReportDialogState(); +} + +class _StreamLinkReportDialogState extends State { + String _radioGroup; + TextEditingController _textEditingController; + FocusNode _textFoucsNode; + final _baseApi = BaseApi.instance; + final List _radioValues = [ + 'this video can\'t play', + 'content doesn\'t match', + 'too slow to play', + 'sexual content', + 'other' + ]; + @override + initState() { + _textEditingController = TextEditingController(); + _textFoucsNode = FocusNode(); + super.initState(); + } + + @override + dispose() { + _textEditingController.dispose(); + _textFoucsNode.dispose(); + super.dispose(); + } + + _onRadioChanged(String d) { + setState(() { + _radioGroup = d; + }); + + if (_radioGroup == 'other') + Future.delayed( + Duration(milliseconds: 100), () => _textFoucsNode.requestFocus()); + else if (_textEditingController.text.isNotEmpty) + _textEditingController.text = ''; + } + + _submit() { + if (_radioGroup != null) { + if (_radioGroup == 'other') + widget.report.content = _textEditingController.text; + else + widget.report.content = _radioGroup; + _baseApi.sendStreamLinkReport(widget.report); + } + Navigator.of(context).pop(); + } + + Widget _buildRadioCell(String d) { + return ListTile( + onTap: () => _onRadioChanged(d), + leading: Radio( + groupValue: _radioGroup, + value: d, + onChanged: _onRadioChanged, + ), + title: Text(d), + ); + } + + Widget _buildOtherTextField() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(50)), + child: TextField( + focusNode: _textFoucsNode, + autofocus: true, + controller: _textEditingController, + enabled: _radioGroup == 'other', + )); + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(20))), + contentPadding: EdgeInsets.zero, + title: Text('Report a problem'), + children: [ + Divider(), + Material( + color: Colors.transparent, + child: Container( + width: Adapt.px(600), + height: Adapt.px(650), + child: ListView( + children: _radioValues.map(_buildRadioCell).toList() + ..add(_buildOtherTextField()), + ), + ), + ), + Divider(), + Padding( + padding: EdgeInsets.symmetric(vertical: Adapt.px(20)), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () => _submit(), + child: Text( + 'OK', + style: TextStyle(fontSize: Adapt.px(35)), + )), + SizedBox(width: Adapt.px(60)), + ], + )) + ], + ); + } +} diff --git a/lib/widgets/update_info_dialog.dart b/lib/widgets/update_info_dialog.dart new file mode 100644 index 00000000..3a957021 --- /dev/null +++ b/lib/widgets/update_info_dialog.dart @@ -0,0 +1,104 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class UpdateInfoDialog extends StatelessWidget { + final String version; + final String describe; + final double packageSize; + final String downloadUrl; + const UpdateInfoDialog( + {@required this.version, + @required this.describe, + this.packageSize, + this.downloadUrl}); + + void _startDownload(BuildContext context) async { + try { + final _localPath = + (await _findLocalPath()) + Platform.pathSeparator + 'Download'; + final _savedDir = Directory(_localPath); + bool hasExisted = await _savedDir.exists(); + if (!hasExisted) { + _savedDir.create(); + } + final _taskId = await FlutterDownloader.enqueue( + url: downloadUrl, + savedDir: _localPath, + showNotification: true, + openFileFromNotification: true, + ); + print(_taskId); + } on Exception catch (_) { + print(_); + } + Navigator.of(context).pop(); + } + + _ignoreVersion(BuildContext context) async { + SharedPreferences _p = await SharedPreferences.getInstance(); + _p.setString('IgnoreVersion', version); + Navigator.of(context).pop(); + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + contentPadding: EdgeInsets.only(bottom: Adapt.px(20)), + titlePadding: EdgeInsets.symmetric( + horizontal: Adapt.px(40), vertical: Adapt.px(30)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Adapt.px(20))), + title: Text('New Version'), + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + //constraints: BoxConstraints(minHeight: Adapt.px(350)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + version, + style: TextStyle( + fontSize: Adapt.px(28), fontWeight: FontWeight.w600), + ), + SizedBox(height: Adapt.px(20)), + Text(describe), + SizedBox(height: Adapt.px(50)), + Text('package size: ${packageSize.toStringAsFixed(2)} MB') + ], + )), + Container( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(40)), + child: Row(children: [ + Expanded(child: SizedBox()), + FlatButton( + onPressed: () => _ignoreVersion(context), + child: Text( + 'ignore', + style: TextStyle(color: Colors.grey, fontSize: Adapt.px(30)), + ), + ), + FlatButton( + onPressed: () => _startDownload(context), + child: Text( + 'download', + style: + TextStyle(color: Colors.blue, fontSize: Adapt.px(30)), + )) + ]), + ) + ]); + } +} + +Future _findLocalPath() async { + final directory = Platform.isAndroid + ? await getExternalStorageDirectory() + : await getApplicationDocumentsDirectory(); + return directory.path; +} diff --git a/lib/widgets/video_panel.dart b/lib/widgets/video_panel.dart new file mode 100644 index 00000000..712855c7 --- /dev/null +++ b/lib/widgets/video_panel.dart @@ -0,0 +1,350 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:chewie/chewie.dart'; +import 'package:firebase_admob/firebase_admob.dart'; +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/actions/stream_link_convert/stream_link_convert_factory.dart'; +import 'package:movie/actions/ads_config.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/widgets/web_torrent_player.dart'; +import 'package:movie/widgets/webview_player.dart'; +import 'package:movie/widgets/youtube_player.dart'; +import 'package:toast/toast.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:video_player/video_player.dart'; + +import 'custom_video_controls.dart'; + +class PlayerPanel extends StatefulWidget { + final String streamLink; + final String background; + final String playerType; + final bool streamInBrowser; + final bool useVideoSourceApi; + final bool needAd; + final bool loading; + final bool autoPlay; + final int linkId; + final Function onPlay; + const PlayerPanel({ + Key key, + this.streamLink, + this.playerType, + this.background, + this.linkId, + this.loading = false, + this.useVideoSourceApi = true, + this.streamInBrowser = false, + this.needAd = false, + this.autoPlay = false, + this.onPlay, + }) : assert(streamLink != null), + super(key: key); + @override + _PlayerPanelState createState() => _PlayerPanelState(); +} + +class _PlayerPanelState extends State + with AutomaticKeepAliveClientMixin { + bool _play = false; + final _rewardedVideoAd = RewardedVideoAd.instance; + bool _isRewarded = false; + bool _needAd = false; + bool _loading = false; + bool _haveOpenAds = false; + String _playerType; + String _directUrl; + + @override + bool get wantKeepAlive => true; + @override + void initState() { + _needAd = widget.needAd; + _loading = widget.loading; + _playerType = widget.playerType; + _addAdsListener(); + super.initState(); + } + + @override + void dispose() { + _rewardedVideoAd.listener = null; + super.dispose(); + } + + @override + void didUpdateWidget(PlayerPanel oldWidget) { + if (oldWidget.streamLink != widget.streamLink || + oldWidget.playerType != widget.playerType || + oldWidget.linkId != widget.linkId || + oldWidget.background != widget.background) { + setState(() { + _play = false; + }); + } + if (_needAd != widget.needAd && !_haveOpenAds) _setNeedAd(widget.needAd); + if (_loading != widget.loading) _setLoading(widget.loading); + if (_playerType != widget.playerType) _setPlayerType(widget.playerType); + //if (widget.autoPlay) _playTapped(context); + super.didUpdateWidget(oldWidget); + } + + _addAdsListener() { + _rewardedVideoAd.listener = + (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) { + switch (event) { + case RewardedVideoAdEvent.loaded: + print('loaded'); + _setLoading(false); + _rewardedVideoAd.show(); + break; + case RewardedVideoAdEvent.failedToLoad: + _setLoading(false); + _startPlayer(); + print('failedToLoad'); + break; + case RewardedVideoAdEvent.closed: + if (_isRewarded) { + _startPlayer(); + } + print('closed'); + break; + case RewardedVideoAdEvent.rewarded: + _isRewarded = true; + _haveOpenAds = true; + _setNeedAd(false); + print('rewarded'); + break; + default: + break; + } + }; + } + + _playTapped(BuildContext context) async { + if (widget.loading) return; + if (!widget.useVideoSourceApi && widget.playerType == 'VideoSourceApi') + return Toast.show('no streamlink at this moment', context); + if (_needAd) { + _setLoading(true); + // _rewardedVideoAd.load( + // adUnitId: RewardedVideoAd.testAdUnitId, + // targetingInfo: AdsConfig.instance.targetingInfo); + return; + } + await _startPlayer(); + } + + _startPlayer() async { + if (widget.streamInBrowser && + (widget.playerType == 'WebView' || + widget.playerType == 'VideoSourceApi')) { + await launch( + widget.streamLink, + enableJavaScript: true, + ); + } else if (widget.playerType == 'WebView') await _getDirectUrl(); + setState(() { + _play = true; + }); + if (widget.onPlay != null) widget.onPlay(); + } + + _getDirectUrl() async { + _setLoading(true); + _directUrl = + await StreamLinkConvertFactory.instance.getLink(widget.streamLink); + print(_directUrl); + if (_directUrl != null) { + _playerType = 'urlresolver'; + } + _setLoading(false); + } + + _setLoading(bool loading) { + setState(() { + _loading = loading; + }); + } + + _setPlayerType(String type) { + setState(() { + _playerType = type; + }); + } + + _setNeedAd(bool needAd) { + _needAd = needAd; + } + + @override + Widget build(BuildContext context) { + super.build(context); + return _play + ? _Player( + streamLink: + _playerType == 'urlresolver' ? _directUrl : widget.streamLink, + playerType: _playerType, + ) + : GestureDetector( + onTap: () => _playTapped(context), + child: _Background( + url: widget.background, + loading: _loading, + ), + ); + } +} + +class _Player extends StatelessWidget { + final String playerType; + final String streamLink; + const _Player({this.playerType, this.streamLink}); + @override + Widget build(BuildContext context) { + switch (playerType) { + case 'YouTube': + return YoutubePlayer(streamLink: streamLink); + case 'WebView': + return WebViewPlayer(streamLink: streamLink, filterUrl: streamLink); + case 'urlresolver': + case 'other': + return VideoPlayer( + controller: VideoPlayerController.network(streamLink)); + case 'localFile': + return VideoPlayer( + controller: VideoPlayerController.file(File(streamLink)), + ); + case 'Torrent': + return WebTorrentPlayer( + key: ValueKey(streamLink), + url: streamLink, + ); + case 'VideoSourceApi': + return WebViewPlayer( + streamLink: streamLink, filterUrl: 'https://moviessources.cf'); + default: + return SizedBox(); + } + } +} + +class VideoPlayer extends StatefulWidget { + final VideoPlayerController controller; + const VideoPlayer({this.controller}); + @override + _VideoPlayerState createState() => _VideoPlayerState(); +} + +class _VideoPlayerState extends State { + ChewieController _chewieController; + + @override + void initState() { + _init(); + super.initState(); + } + + _init() { + widget.controller.initialize().then((value) { + _chewieController = ChewieController( + videoPlayerController: widget.controller, + customControls: CustomCupertinoControls( + backgroundColor: Colors.black, + iconColor: Colors.white, + ), + allowedScreenSleep: false, + autoPlay: true, + aspectRatio: widget.controller.value.aspectRatio, + ); + setState(() {}); + }); + } + + @override + void dispose() { + widget.controller?.dispose(); + _chewieController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.black, + child: _chewieController == null + ? Center( + child: Container( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + const Color(0xFFFFFFFF), + ), + ), + ), + ) + : Chewie(controller: _chewieController), + ); + } +} + +class _Background extends StatelessWidget { + final String url; + final bool loading; + const _Background({@required this.url, this.loading}); + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: const Color(0xFFAABBEE), + image: url != null + ? DecorationImage( + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl(url, ImageSize.original), + ), + ) + : null, + ), + child: loading + ? Center( + child: Container( + child: const CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(const Color(0xFFFFFFFF)), + ), + ), + ) + : _PlayArrow(), + ); + } +} + +class _PlayArrow extends StatelessWidget { + const _PlayArrow(); + @override + Widget build(BuildContext context) { + final _brightness = MediaQuery.of(context).platformBrightness; + return Center( + child: ClipRRect( + borderRadius: BorderRadius.circular(Adapt.px(50)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8, sigmaY: 8), + child: Container( + color: _brightness == Brightness.light + ? const Color(0x40FFFFFF) + : const Color(0x40000000), + width: Adapt.px(100), + height: Adapt.px(100), + child: Icon( + Icons.play_arrow, + size: 25, + color: const Color(0xFFFFFFFF), + ), + ), + ), + )); + } +} diff --git a/lib/widgets/videoplayeritem.dart b/lib/widgets/videoplayeritem.dart new file mode 100644 index 00000000..d3cd83f5 --- /dev/null +++ b/lib/widgets/videoplayeritem.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:video_player/video_player.dart'; +import 'package:chewie/chewie.dart'; + +class VideoPlayerItem extends StatefulWidget { + final VideoPlayerController vc; + final String coverurl; + final bool showplayer; + final int playtime; + final int duration; + VideoPlayerItem( + {@required this.vc, + this.coverurl, + this.showplayer, + this.playtime, + this.duration, + Key key}) + : super(key: key); + @override + VideoPlayerItemState createState() => VideoPlayerItemState(); +} + +class VideoPlayerItemState extends State { + ChewieController chewieController; + VideoPlayerController vc; + bool showplayer = true; + void playButtonClicked() { + if (!vc.value.initialized) { + vc.initialize().then((_) { + setState(() { + showplayer = false; + }); + vc.play(); + }); + } else if (!vc.value.isPlaying) { + setState(() { + showplayer = false; + }); + vc.play(); + } else { + setState(() { + showplayer = true; + }); + vc.pause(); + } + } + + @override + void initState() { + setState(() { + showplayer = widget.showplayer; + }); + vc = widget.vc; + chewieController = new ChewieController( + videoPlayerController: vc, + aspectRatio: 16 / 9, + ); + super.initState(); + } + + @override + void dispose() { + super.dispose(); + vc.pause(); + //vc.dispose(); + chewieController.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: Adapt.screenW(), + height: Adapt.screenW() * 9 / 16, + child: Stack( + children: [ + SizedBox.expand( + child: new FittedBox( + fit: BoxFit.cover, + child: FadeInImage.assetNetwork( + placeholder: 'images/CacheBG.jpg', + image: widget.coverurl, + )), + ), + Container( + color: Colors.black38, + ), + Center( + child: IconButton( + iconSize: Adapt.px(120), + icon: Icon(Icons.play_circle_outline), + color: Colors.white, + onPressed: playButtonClicked, + ), + ), + Offstage( + offstage: showplayer, + child: Container( + child: Chewie( + key: Key(chewieController.videoPlayerController.dataSource), + controller: chewieController, + ), + ), + ), + ], + )); + } +} diff --git a/lib/widgets/watchlistdetail.dart b/lib/widgets/watchlistdetail.dart new file mode 100644 index 00000000..d5e91fcd --- /dev/null +++ b/lib/widgets/watchlistdetail.dart @@ -0,0 +1,235 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:movie/actions/adapt.dart'; +import 'package:movie/actions/imageurl.dart'; +import 'package:movie/models/enums/imagesize.dart'; +import 'package:movie/models/video_list.dart'; +import 'package:video_player/video_player.dart'; + +class WatchlistDetail extends StatefulWidget { + final int initialIndex; + final VideoListModel data; + + WatchlistDetail({this.initialIndex, this.data}); + @override + WatchlistDetailState createState() => WatchlistDetailState(); +} + +class WatchlistDetailState extends State + with TickerProviderStateMixin { + double startY; + double endY; + VideoPlayerController videoPlayerController; + AnimationController animationController; + FadeAnimation imageFadeAnim = + FadeAnimation(child: const Icon(Icons.play_arrow, size: 100.0)); + @override + void initState() { + videoPlayerController = VideoPlayerController.network( + 'http://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4'); + animationController = + AnimationController(vsync: this, duration: Duration(milliseconds: 200)); + videoPlayerController.initialize(); + super.initState(); + } + + @override + void dispose() { + videoPlayerController.dispose(); + animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final List children = [ + GestureDetector( + child: VideoPlayer(videoPlayerController), + onTap: () { + if (!videoPlayerController.value.initialized) { + return; + } + if (videoPlayerController.value.isPlaying) { + imageFadeAnim = + FadeAnimation(child: const Icon(Icons.pause, size: 100.0)); + videoPlayerController.pause(); + } else { + imageFadeAnim = + FadeAnimation(child: const Icon(Icons.play_arrow, size: 100.0)); + videoPlayerController.play(); + } + }, + ), + Align( + alignment: Alignment.bottomCenter, + child: VideoProgressIndicator( + videoPlayerController, + allowScrubbing: true, + ), + ), + Center(child: imageFadeAnim), + Center( + child: videoPlayerController.value.isBuffering + ? const CircularProgressIndicator() + : null), + ]; + return GestureDetector( + onVerticalDragUpdate: (dragUpdateDetails) { + endY = dragUpdateDetails.globalPosition.dy; + print( + 'dragUpdateDetails-' + dragUpdateDetails.globalPosition.toString()); + print('dddd' + (endY - startY).toString()); + if (endY - startY > 150 && startY <= 150) Navigator.of(context).pop(); + }, + onVerticalDragStart: (dragStartDetails) { + startY = dragStartDetails.localPosition.dy; + print('dragStartDetails' + dragStartDetails.localPosition.toString()); + }, + onVerticalDragEnd: (dragEndDetails) { + if (endY - startY < 150) animationController.reverse(); + }, + behavior: HitTestBehavior.translucent, + child: Scaffold( + backgroundColor: Colors.transparent, + body: ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(Adapt.px(30)), + topRight: Radius.circular(Adapt.px(30)), + ), + child: Container( + height: Adapt.screenH() * 0.8, + color: Colors.white, + padding: EdgeInsets.only(top: Adapt.px(30)), + child: PageView.builder( + controller: PageController(initialPage: widget.initialIndex), + physics: ClampingScrollPhysics(), + scrollDirection: Axis.horizontal, + pageSnapping: true, + itemBuilder: (ctx, index) { + return Stack( + children: [ + Material( + child: Container( + width: Adapt.screenW(), + height: Adapt.screenH() * 0.8, + decoration: BoxDecoration( + image: DecorationImage( + colorFilter: ColorFilter.mode( + Colors.white, BlendMode.color), + fit: BoxFit.cover, + image: CachedNetworkImageProvider( + ImageUrl.getUrl( + widget.data.results[index].posterPath, + ImageSize.w300)))), + child: Container( + color: Colors.white.withAlpha(240), + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: Adapt.px(30)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: Colors.black, + height: Adapt.px(400), + child: Stack( + fit: StackFit.passthrough, + children: children, + ), + ), + Text( + widget.data.results[index].name, + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: Adapt.px(45)), + ), + Text( + widget.data.results[index].overview, + style: TextStyle(color: Colors.black), + ), + ], + ), + ), + ], + ); + }, + itemCount: widget.data.results.length, + ), + ), + )), + ); + } +} + +class FadeAnimation extends StatefulWidget { + FadeAnimation( + {this.child, this.duration = const Duration(milliseconds: 500)}); + + final Widget child; + final Duration duration; + + @override + _FadeAnimationState createState() => _FadeAnimationState(); +} + +class _FadeAnimationState extends State + with SingleTickerProviderStateMixin { + AnimationController animationController; + + @override + void initState() { + super.initState(); + animationController = + AnimationController(duration: widget.duration, vsync: this); + animationController.addListener(() { + if (mounted) { + setState(() {}); + } + }); + animationController.forward(from: 0.0); + } + + @override + void deactivate() { + animationController.stop(); + super.deactivate(); + } + + @override + void didUpdateWidget(FadeAnimation oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.child != widget.child) { + animationController.forward(from: 0.0); + } + } + + @override + void dispose() { + animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return animationController.isAnimating + ? Opacity( + opacity: 1.0 - animationController.value, + child: widget.child, + ) + : Container(); + } +} + +typedef Widget VideoWidgetBuilder( + BuildContext context, VideoPlayerController controller); + +abstract class PlayerLifeCycle extends StatefulWidget { + PlayerLifeCycle(this.dataSource, this.childBuilder); + + final VideoWidgetBuilder childBuilder; + final String dataSource; +} diff --git a/lib/widgets/web_torrent_player.dart b/lib/widgets/web_torrent_player.dart new file mode 100644 index 00000000..1d5193ac --- /dev/null +++ b/lib/widgets/web_torrent_player.dart @@ -0,0 +1,173 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:movie/actions/adapt.dart'; + +class WebTorrentPlayer extends StatefulWidget { + final String url; + WebTorrentPlayer({Key key, @required this.url}) : super(key: key); + @override + WebTorrentPlayerState createState() => WebTorrentPlayerState(); +} + +class WebTorrentPlayerState extends State { + String _url; + @override + void initState() { + _url = widget.url; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AspectRatio( + aspectRatio: 16 / 9, + child: InAppWebView( + initialOptions: InAppWebViewGroupOptions(), + initialData: InAppWebViewInitialData(data: """ + + + + WebTorrent video player + + + +
+
+ + +
+ + +
+ + + + + + + + + +"""), + initialHeaders: {}, + ), + ); + } + + @override + void didUpdateWidget(WebTorrentPlayer oldWidget) { + if (oldWidget.url != widget.url) + setState(() { + _url = widget.url; + }); + super.didUpdateWidget(oldWidget); + } +} diff --git a/lib/widgets/webview_player.dart b/lib/widgets/webview_player.dart new file mode 100644 index 00000000..ca3ec400 --- /dev/null +++ b/lib/widgets/webview_player.dart @@ -0,0 +1,151 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; + +class WebViewPlayer extends StatefulWidget { + final String streamLink; + final String filterUrl; + const WebViewPlayer({@required this.streamLink, @required this.filterUrl}); + @override + _WebviewPlayerState createState() => _WebviewPlayerState(); +} + +class _WebviewPlayerState extends State { + String _streamlink; + bool _loadFinsh; + bool _fullScreen; + + void init() { + _loadFinsh = false; + _fullScreen = false; + _streamlink = Uri.dataFromString( + ''' + +
+ +
+ + + + + ''', + mimeType: 'text/html', + ).toString(); + } + + @override + void initState() { + init(); + super.initState(); + } + + _toggleFullScreenMode(bool fullScreen) { + _fullScreen = fullScreen; + if (_fullScreen) { + SystemChrome.setPreferredOrientations([ + DeviceOrientation.landscapeLeft, + DeviceOrientation.landscapeRight, + ]); + } else { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + } + } + + @override + void didUpdateWidget(WebViewPlayer oldWidget) { + if (oldWidget.streamLink != widget.streamLink) { + init(); + setState(() {}); + } + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + return Container( + color: const Color(0xFF000000), + child: IndexedStack( + index: _loadFinsh ? 0 : 1, + children: [ + InAppWebView( + initialUrl: _streamlink, + initialOptions: InAppWebViewGroupOptions( + android: AndroidInAppWebViewOptions( + supportMultipleWindows: false, + ), + crossPlatform: InAppWebViewOptions( + javaScriptEnabled: true, + supportZoom: false, + disableHorizontalScroll: true, + disableVerticalScroll: true, + useShouldOverrideUrlLoading: true, + mediaPlaybackRequiresUserGesture: false, + preferredContentMode: UserPreferredContentMode.MOBILE, + debuggingEnabled: true, + ), + ), + onProgressChanged: (controller, progress) { + print(progress.toString()); + if (progress == 100 && !_loadFinsh) { + _loadFinsh = true; + setState(() {}); + } + }, + onEnterFullscreen: (_) { + _toggleFullScreenMode(true); + }, + onExitFullscreen: (_) { + _toggleFullScreenMode(false); + }, + onLoadStop: (controller, url) { + controller.evaluateJavascript(source: ''' + function getElementsClass(classnames) { + var classobj = new Array(); + var classint = 0; + var tags = document.getElementsByTagName("*"); + for (var i in tags) { + if (tags[i].nodeType == 1) { + if (tags[i].getAttribute("class")==classnames) { + classobj[classint] = tags[i]; + classint++; + } + } + } + return classobj; + } + var a = getElementsClass("server-list-btnx btn btn-warning start-animation btn-lg mobile-responsive"); + if(a) { + a[0].style.display = "none"; + } + '''); + }, + shouldOverrideUrlLoading: + (controller, shouldOverrideUrlLoadingRequest) { + if (shouldOverrideUrlLoadingRequest.url + .compareTo(widget.filterUrl) == + 0) { + controller.stopLoading(); + } + return; + }, + ), + Center( + child: Container( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(const Color(0xFFFFFFFF)), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/youtube_player.dart b/lib/widgets/youtube_player.dart new file mode 100644 index 00000000..01a1ce32 --- /dev/null +++ b/lib/widgets/youtube_player.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart' as youtube; + +class YoutubePlayer extends StatefulWidget { + final String streamLink; + const YoutubePlayer({this.streamLink}); + @override + _YoutubePlayerState createState() => _YoutubePlayerState(); +} + +class _YoutubePlayerState extends State { + youtube.YoutubePlayerController _controller; + @override + void initState() { + _controller = youtube.YoutubePlayerController( + initialVideoId: widget.streamLink, + flags: youtube.YoutubePlayerFlags( + autoPlay: true, + ), + ); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return youtube.YoutubePlayer( + controller: _controller, + topActions: [ + IconButton( + icon: Icon( + Icons.chevron_left, + color: Colors.white, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ) + ], + progressIndicatorColor: Colors.red, + progressColors: youtube.ProgressBarColors( + playedColor: Colors.amber, + handleColor: Colors.amberAccent, + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 00000000..cc61e8df --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,135 @@ +name: movie +description: A new Flutter project. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.1+1 + +environment: + sdk: ">=2.8.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + flutter_mdns_plugin: + git: + url: https://github.com/terrabythia/flutter_mdns_plugin.git + ref: master + observable: any + dart_chromecast: ^0.2.2 + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.2 + dio: ^3.0.9 + dio_http_cache: ^0.2.5 + fish_redux: ^0.3.3 + common_utils: ^1.2.1 + path_provider: ^1.3.0 + shared_preferences: ^0.5.3+4 + palette_generator: ^0.2.0 + shimmer: ^1.0.1 + url_launcher: ^5.2.5 + chewie: ^0.9.10 + video_player: ^0.10.5+2 + youtube_player_flutter: ^7.0.0+6 + intl: + cached_network_image: ^2.0.0 + parallax_image: ^0.3.1+1 + flutter_staggered_grid_view: ^0.3.0 + collection: ^1.14.11 + photo_view: ^0.8.0 + toast: ^0.1.5 + permission_handler: ^3.2.2 + screenshot: ^0.1.1 + share_extend: ^1.0.9 + qr_flutter: ^2.1.0+55 + flutter_rating_bar: ^3.0.0 + flutter_swiper: ^1.1.6 + font_awesome_flutter: ^8.5.0 + flutter_inappwebview: ^3.4.0+2 + flutter_cache_manager: ^1.1.3 + image_picker: ^0.6.7+2 + cloud_firestore: ^0.13.4+2 + firebase_auth: ^0.15.5+3 + google_sign_in: ^4.2.0 + firebase_storage: ^3.1.3 + firebase_analytics: ^5.0.11 + firebase_messaging: ^6.0.13 + firebase_admob: ^0.9.3+1 + firebase_ml_vision: ^0.9.4 + lottie: ^0.4.0+1 + package_info: ^0.4.0+16 + flutter_downloader: ^1.5.0 + flutter_braintree: ^0.6.0 + camera: ^0.5.8+2 + flutter_local_notifications: ^1.4.4+1 + graphql_flutter: ^3.0.1 + auto_size_text: ^2.1.0 + modal_bottom_sheet: ^0.2.0+1 + + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_localizations: + sdk: flutter + flutter_launcher_icons: ^0.7.3 + +flutter_icons: + android: true + ios: true + image_path: "images/icons/icon3.png" + +# For information on the generic Dart part of this file, see the +# following page: https://www.dartlang.org/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + # - images/a_dot_burr.jpeg + - images/ + - lib/models/country_phone_codes.json + - appconfig.json + + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 00000000..9d3e3c32 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,28 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MaterialApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 00000000..c7969e13 --- /dev/null +++ b/web/index.html @@ -0,0 +1,10 @@ + + + + + flutter_movie + + + + +