[
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.lock\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# Visual Studio Code related\n.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: 97e03104a0913886a666a36f5d11ab5763d45e6e\n  channel: dev\n\nproject_type: app\n"
  },
  {
    "path": "README.md",
    "content": "# Flutter Netflix Clone\n\nFlutter App with the same style as Netflix for Android and iOS.\n\n<div style=\"display:flex;flex-direction:row;justify-content: space-between\">\n<img src=\"screenshots/flutter_01.png\" alt=\"screen_01\" height=\"300\" />\n<img src=\"screenshots/flutter_02.png\" alt=\"screen_02\" height=\"300\" />\n<img src=\"screenshots/flutter_03.png\" alt=\"screen_03\" height=\"300\" />\n<img src=\"screenshots/flutter_04.png\" alt=\"screen_04\" height=\"300\" />\n</div>\n\n<div style=\"display:flex;flex-direction:row;justify-content: space-between\">\n<img src=\"screenshots/splash.gif\" alt=\"screen_01\" height=\"300\" />\n<img src=\"screenshots/explore.gif\" alt=\"screen_03\" height=\"300\" />\n<img src=\"screenshots/info.gif\" alt=\"screen_02\" height=\"300\" />\n<img src=\"screenshots/intro-video.gif\" alt=\"screen_04\" height=\"300\" />\n<img src=\"screenshots/video-interaction.gif\" alt=\"screen_04\" height=\"300\" />\n</div>\n\n## Server\n\n[Netflix Flutter NodeJS & MongoDB](https://github.com/devdennysegura/nodejs-server-Flutter-Netflix-App)\n\n## Installation\n\n    $ clone this repo\n    $ Install flutter dependencies\n    $ Install Netflix NodeJS & MongoDB\n    $ Run NodeJS\n    $ Change host String on `src/resources/movie_api_provider.dart`\n    $ flutter run\n\nThanks\n------\n\n**Denny Segura** © 2018+, Released under the [MIT License].<br>\n\n> GitHub [@devdennysegura](https://github.com/devdennysegura) &nbsp;&middot;&nbsp;\n> Twitter [@dennysegura3](https://twitter.com/dennysegura3)\n\n[MIT License]: http://mit-license.org/"
  },
  {
    "path": "android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\nandroid {\n    compileSdkVersion 27\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"com.example.netflix.clone\"\n        minSdkVersion 21\n        targetSdkVersion 27\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            // TODO: Add your own signing config for the release build.\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig signingConfigs.debug\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n}\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.netflixclone\">\n\n    <!-- The INTERNET permission is required for development. Specifically,\n         flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <!-- io.flutter.app.FlutterApplication is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    <application\n        android:name=\"io.flutter.app.FlutterApplication\"\n        android:label=\"Netflix\"\n        android:icon=\"@mipmap/ic_launcher\">\n        <activity\n            android:name=\".MainActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- This keeps the window background of the activity showing\n                 until Flutter renders its first frame. It can be removed if\n                 there is no splash screen (such as the default splash screen\n                 defined in @style/LaunchTheme). -->\n            <meta-data\n                android:name=\"io.flutter.app.android.SplashScreenUntilFirstFrame\"\n                android:value=\"true\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/java/com/example/netflixclone/MainActivity.java",
    "content": "package com.example.netflixclone;\n\nimport android.os.Bundle;\nimport io.flutter.app.FlutterActivity;\nimport io.flutter.plugins.GeneratedPluginRegistrant;\n\npublic class MainActivity extends FlutterActivity {\n  @Override\n  protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    GeneratedPluginRegistrant.registerWith(this);\n  }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/black\" />\n    <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item>\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "buildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.2.1'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.2-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')\nif (pluginsFile.exists()) {\n    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }\n}\n\nplugins.each { name, path ->\n    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()\n    include \":$name\"\n    project(\":$name\").projectDir = pluginDirectory\n}\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>8.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/flutter_export_environment.sh",
    "content": "#!/bin/sh\n# This is a generated file; do not edit or check into version control.\nexport \"FLUTTER_ROOT=/Users/dennysegura/development/flutter\"\nexport \"FLUTTER_APPLICATION_PATH=/Users/dennysegura/Dev/Flutter/flutter-netflix-clone\"\nexport \"FLUTTER_TARGET=lib/main.dart\"\nexport \"FLUTTER_BUILD_DIR=build\"\nexport \"SYMROOT=${SOURCE_ROOT}/../build/ios\"\nexport \"FLUTTER_FRAMEWORK_DIR=/Users/dennysegura/development/flutter/bin/cache/artifacts/engine/ios\"\nexport \"FLUTTER_BUILD_NAME=1.0.0\"\nexport \"FLUTTER_BUILD_NUMBER=1\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n# platform :ios, '9.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef parse_KV_file(file, separator='=')\n  file_abs_path = File.expand_path(file)\n  if !File.exists? file_abs_path\n    return [];\n  end\n  pods_ary = []\n  skip_line_start_symbols = [\"#\", \"/\"]\n  File.foreach(file_abs_path) { |line|\n      next if skip_line_start_symbols.any? { |symbol| line =~ /^\\s*#{symbol}/ }\n      plugin = line.split(pattern=separator)\n      if plugin.length == 2\n        podname = plugin[0].strip()\n        path = plugin[1].strip()\n        podpath = File.expand_path(\"#{path}\", file_abs_path)\n        pods_ary.push({:name => podname, :path => podpath});\n      else\n        puts \"Invalid plugin specification: #{line}\"\n      end\n  }\n  return pods_ary\nend\n\ntarget 'Runner' do\n  # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock\n  # referring to absolute paths on developers' machines.\n  system('rm -rf .symlinks')\n  system('mkdir -p .symlinks/plugins')\n\n  # Flutter Pods\n  generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig')\n  if generated_xcode_build_settings.empty?\n    puts \"Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first.\"\n  end\n  generated_xcode_build_settings.map { |p|\n    if p[:name] == 'FLUTTER_FRAMEWORK_DIR'\n      symlink = File.join('.symlinks', 'flutter')\n      File.symlink(File.dirname(p[:path]), symlink)\n      pod 'Flutter', :path => File.join(symlink, File.basename(p[:path]))\n    end\n  }\n\n  # Plugin Pods\n  plugin_pods = parse_KV_file('../.flutter-plugins')\n  plugin_pods.map { |p|\n    symlink = File.join('.symlinks', 'plugins', p[:name])\n    File.symlink(p[:path], symlink)\n    pod p[:name], :path => File.join(symlink, 'ios')\n  }\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    target.build_configurations.each do |config|\n      config.build_settings['ENABLE_BITCODE'] = 'NO'\n    end\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.h",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : FlutterAppDelegate\n\n@end\n"
  },
  {
    "path": "ios/Runner/AppDelegate.m",
    "content": "#include \"AppDelegate.h\"\n#include \"GeneratedPluginRegistrant.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application\n    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  [GeneratedPluginRegistrant registerWithRegistry:self];\n  // Override point for customization after application launch.\n  return [super application:application didFinishLaunchingWithOptions:launchOptions];\n}\n\n@end\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou 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."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>netflix_clone</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/main.m",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char* argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };\n\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };\n\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };\n\t\t97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,\n\t\t\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,\n\t\t\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2D5378251FAA1A9400D5DBA9 /* flutter_assets */,\n\t\t\t\t3B80C3931E831B6300D905FE /* App.framework */,\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\tCF3B75C9A7D2FA2A4C99F110 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,\n\t\t\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146F21CF9000F007C117D /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0910;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,\n\t\t\t\t97C146F31CF9000F007C117D /* main.m in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = S8QB4VV633;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.netflixClone;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.netflixClone;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.netflixClone;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0910\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "lib/app.dart",
    "content": "library netflix;\n\n// Dart Imports\nimport 'dart:async';\nimport 'dart:convert';\n\n// Flutter imports\nimport 'package:http/http.dart' show Client;\nimport 'package:rxdart/rxdart.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\n// Plugins import...\nimport 'package:fluro/fluro.dart';\nimport 'package:video_player/video_player.dart';\n\n// Router\npart 'src/helpers/config/constants.dart';\npart 'src/helpers/config/application.dart';\npart 'src/helpers/config/routes.dart';\npart 'src/helpers/config/route_handlers.dart';\n\n// Models\npart 'src/models/episode.dart';\npart 'src/models/result.dart';\npart 'src/models/item_model.dart';\n\n// Blocs\npart 'src/blocs/movies_bloc.dart';\n\n// Resources\npart 'src/resources/movie_api_provider.dart';\npart 'src/resources/repository.dart';\n\npart 'src/utils/theme/color.dart';\npart 'src/utils/theme/typography.dart';\npart 'src/pages/video/index.dart';\npart 'src/pages/video/state.dart';\npart 'src/pages/home/index.dart';\npart 'src/pages/home/state.dart';\npart 'src/pages/summary/index.dart';\npart 'src/pages/summary/state.dart';\npart 'src/pages/filter/index.dart';\npart 'src/pages/filter/state.dart';\npart 'src/pages/detail/index.dart';\npart 'src/pages/detail/state.dart';\n\n// Widgets\npart 'src/widgets/tvshow-list/index.dart';\npart 'src/widgets/player-life-cycle/index.dart';\npart 'src/widgets/player-life-cycle/state.dart';\npart 'src/widgets/player-controls/index.dart';\npart 'src/widgets/player-controls/state.dart';\n\nclass Netflix extends StatelessWidget {\n  Netflix({Key key}) : super(key: key) {\n    final router = Router();\n    Routes.configureRoutes(router);\n    Application.router = router;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      debugShowCheckedModeBanner: false,\n      title: 'Netflix',\n      theme: ThemeData(\n        fontFamily: 'GoogleSans',\n        primaryColor: Colors.black,\n      ),\n      onGenerateRoute: Application.router.generator,\n      home: Home(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:netflix_clone/app.dart';\n\nvoid main() => runApp(Netflix());\n\n\n\n\n"
  },
  {
    "path": "lib/src/blocs/movies_bloc.dart",
    "content": "part of netflix;\n\nclass MoviesBloc {\n  final _repository = Repository();\n  final _moviesFetcher = PublishSubject<List<ItemModel>>();\n  final _movieFetcher = PublishSubject<Result>();\n\n  Observable<List<ItemModel>> get allMovies => _moviesFetcher.stream;\n  Observable<Result> get oneMovie => _movieFetcher.stream;\n\n  fetchAllMovies() async {\n    List<ItemModel> items = await _repository.fetchAllMovies();\n    _moviesFetcher.sink.add(items);\n  }\n\n  fetchOneMovie(int id) async {\n    Result item = await _repository.fetchMovie(id);\n    _movieFetcher.sink.add(item);\n  }\n\n  dispose() {\n    _moviesFetcher.close();\n    _movieFetcher.close();\n  }\n}\n\nfinal bloc = MoviesBloc();\n"
  },
  {
    "path": "lib/src/helpers/config/application.dart",
    "content": "part of netflix;\n\nclass Application {\n  static Router router;\n}\n"
  },
  {
    "path": "lib/src/helpers/config/constants.dart",
    "content": "part of netflix;\n\nMap<String, dynamic> tvShow = {\n  \"details\": {\n    \"genres\": [\"Drama\", \"Crime\"],\n    \"cast\": [\n      {\n        \"person\": {\n          \"id\": 15429,\n          \"url\": \"http://www.tvmaze.com/people/15429/poppy-montgomery\",\n          \"name\": \"Poppy Montgomery\",\n          \"country\": {\n            \"name\": \"Australia\",\n            \"code\": \"AU\",\n            \"timezone\": \"Australia/Sydney\"\n          },\n          \"birthday\": \"1972-06-15\",\n          \"deathday\": null,\n          \"gender\": \"Female\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/161/402509.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/161/402509.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/15429\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17370,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17370/unforgettable-carrie-wells\",\n          \"name\": \"Carrie Wells\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/664.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/664.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17370\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 1368,\n          \"url\": \"http://www.tvmaze.com/people/1368/dylan-walsh\",\n          \"name\": \"Dylan Walsh\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1963-11-17\",\n          \"deathday\": null,\n          \"gender\": \"Male\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/1110.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/1110.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/1368\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17371,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17371/unforgettable-al-burns\",\n          \"name\": \"Al Burns\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/1717.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/1717.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17371\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 15430,\n          \"url\": \"http://www.tvmaze.com/people/15430/james-hiroyuki-liao\",\n          \"name\": \"James Hiroyuki Liao\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": null,\n          \"deathday\": null,\n          \"gender\": \"Male\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/3/8721.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/3/8721.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/15430\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17373,\n          \"url\": \"http://www.tvmaze.com/characters/17373/unforgettable-jay-lee\",\n          \"name\": \"Jay Lee\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/666.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/666.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17373\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 15432,\n          \"url\": \"http://www.tvmaze.com/people/15432/jane-curtin\",\n          \"name\": \"Jane Curtin\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1947-09-06\",\n          \"deathday\": null,\n          \"gender\": \"Female\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/3/8723.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/3/8723.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/15432\"}\n          }\n        },\n        \"character\": {\n          \"id\": 176064,\n          \"url\":\n              \"http://www.tvmaze.com/characters/176064/unforgettable-joanne-webster\",\n          \"name\": \"Joanne Webster\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/668.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/668.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/176064\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 10404,\n          \"url\": \"http://www.tvmaze.com/people/10404/dallas-roberts\",\n          \"name\": \"Dallas Roberts\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1970-05-10\",\n          \"deathday\": null,\n          \"gender\": \"Male\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/161/404900.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/161/404900.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/10404\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17372,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17372/unforgettable-eliot-delson\",\n          \"name\": \"Eliot Delson\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/669.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/669.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17372\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 15431,\n          \"url\": \"http://www.tvmaze.com/people/15431/tawny-cypress\",\n          \"name\": \"Tawny Cypress\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1976-08-08\",\n          \"deathday\": null,\n          \"gender\": \"Female\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/130/327329.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/130/327329.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/15431\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17374,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17374/unforgettable-cherie-rollins-murray\",\n          \"name\": \"Cherie Rollins-Murray\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/667.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/667.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17374\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 8640,\n          \"url\": \"http://www.tvmaze.com/people/8640/daya-vaidya\",\n          \"name\": \"Daya Vaidya\",\n          \"country\": {\n            \"name\": \"Nepal\",\n            \"code\": \"NP\",\n            \"timezone\": \"Asia/Kathmandu\"\n          },\n          \"birthday\": \"1980-05-20\",\n          \"deathday\": null,\n          \"gender\": \"Female\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/108/271770.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/108/271770.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/8640\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17376,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17376/unforgettable-nina-inara\",\n          \"name\": \"Nina Inara\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/670.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/670.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17376\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 9105,\n          \"url\": \"http://www.tvmaze.com/people/9105/kevin-rankin\",\n          \"name\": \"Kevin Rankin\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1976-04-18\",\n          \"deathday\": null,\n          \"gender\": \"Male\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/2/7246.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/2/7246.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/9105\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17377,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17377/unforgettable-roe-saunders\",\n          \"name\": \"Roe Saunders\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/671.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/671.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17377\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 7197,\n          \"url\": \"http://www.tvmaze.com/people/7197/michael-gaston\",\n          \"name\": \"Michael Gaston\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1962-11-05\",\n          \"deathday\": null,\n          \"gender\": \"Male\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/3/8724.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/3/8724.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/7197\"}\n          }\n        },\n        \"character\": {\n          \"id\": 17378,\n          \"url\":\n              \"http://www.tvmaze.com/characters/17378/unforgettable-mike-costello\",\n          \"name\": \"Mike Costello\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/0/665.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/0/665.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/17378\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 103992,\n          \"url\": \"http://www.tvmaze.com/people/103992/e-j-bonilla\",\n          \"name\": \"E. J. Bonilla\",\n          \"country\": null,\n          \"birthday\": null,\n          \"deathday\": null,\n          \"gender\": \"Male\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/32/81059.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/32/81059.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/103992\"}\n          }\n        },\n        \"character\": {\n          \"id\": 209904,\n          \"url\":\n              \"http://www.tvmaze.com/characters/209904/unforgettable-denny-padilla\",\n          \"name\": \"Denny Padilla\",\n          \"image\": null,\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/209904\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 141871,\n          \"url\": \"http://www.tvmaze.com/people/141871/la-la-anthony\",\n          \"name\": \"La La Anthony\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1979-06-25\",\n          \"deathday\": null,\n          \"gender\": \"Female\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/118/295914.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/118/295914.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/141871\"}\n          }\n        },\n        \"character\": {\n          \"id\": 209906,\n          \"url\":\n              \"http://www.tvmaze.com/characters/209906/unforgettable-delina-michaels\",\n          \"name\": \"Delina Michaels\",\n          \"image\": null,\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/209906\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      },\n      {\n        \"person\": {\n          \"id\": 25007,\n          \"url\": \"http://www.tvmaze.com/people/25007/kathy-najimy\",\n          \"name\": \"Kathy Najimy\",\n          \"country\": {\n            \"name\": \"United States\",\n            \"code\": \"US\",\n            \"timezone\": \"America/New_York\"\n          },\n          \"birthday\": \"1957-02-06\",\n          \"deathday\": null,\n          \"gender\": \"Female\",\n          \"image\": {\n            \"medium\":\n                \"http://static.tvmaze.com/uploads/images/medium_portrait/3/7855.jpg\",\n            \"original\":\n                \"http://static.tvmaze.com/uploads/images/original_untouched/3/7855.jpg\"\n          },\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/people/25007\"}\n          }\n        },\n        \"character\": {\n          \"id\": 216013,\n          \"url\":\n              \"http://www.tvmaze.com/characters/216013/unforgettable-sandra-russo\",\n          \"name\": \"Sandra Russo\",\n          \"image\": null,\n          \"_links\": {\n            \"self\": {\"href\": \"http://api.tvmaze.com/characters/216013\"}\n          }\n        },\n        \"self\": false,\n        \"voice\": false\n      }\n    ],\n    \"episodes\": [\n      {\n        \"id\": 5852,\n        \"url\": \"http://www.tvmaze.com/episodes/5852/unforgettable-1x01-pilot\",\n        \"name\": \"Pilot\",\n        \"season\": 1,\n        \"number\": 1,\n        \"airdate\": \"2011-09-20\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-09-21T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99519.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99519.jpg\"\n        },\n        \"summary\":\n            \"<p>When a murder reunites former detective Carrie Wells with her old colleague and flame, she must utilize her rare ability to revisit her every memory to catch the killer.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5852\"}\n        }\n      },\n      {\n        \"id\": 5853,\n        \"url\": \"http://www.tvmaze.com/episodes/5853/unforgettable-1x02-heroes\",\n        \"name\": \"Heroes\",\n        \"season\": 1,\n        \"number\": 2,\n        \"airdate\": \"2011-09-27\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-09-28T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99518.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99518.jpg\"\n        },\n        \"summary\":\n            \"<p>When a young boy witnesses a murder, Carrie must put aside the memories of her sister's death to help him lead the police to the killer.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5853\"}\n        }\n      },\n      {\n        \"id\": 5854,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5854/unforgettable-1x03-check-out-time\",\n        \"name\": \"Check Out Time\",\n        \"season\": 1,\n        \"number\": 3,\n        \"airdate\": \"2011-10-04\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-10-05T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99517.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99517.jpg\"\n        },\n        \"summary\":\n            \"<p>When a hotel maid is accused of murdering a guest who she says tried to rape her, Carrie takes matters into her own hands to uncover the truth, threatening Al's investigation.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5854\"}\n        }\n      },\n      {\n        \"id\": 5855,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5855/unforgettable-1x04-up-in-flames\",\n        \"name\": \"Up in Flames\",\n        \"season\": 1,\n        \"number\": 4,\n        \"airdate\": \"2011-10-11\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-10-12T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99516.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99516.jpg\"\n        },\n        \"summary\":\n            \"<p>When a crime scene is destroyed in an explosion moments after Carrie catches a glimpse of the room, her memories become a crucial piece of the investigation.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5855\"}\n        }\n      },\n      {\n        \"id\": 5856,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5856/unforgettable-1x05-with-honor\",\n        \"name\": \"With Honor\",\n        \"season\": 1,\n        \"number\": 5,\n        \"airdate\": \"2011-10-18\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-10-19T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99514.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99514.jpg\"\n        },\n        \"summary\":\n            \"<p>When Al's ex-partner is gunned down and the investigation reveals he may have been a dirty cop, Carrie must decide how to support him without getting too close.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5856\"}\n        }\n      },\n      {\n        \"id\": 5857,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5857/unforgettable-1x06-friended\",\n        \"name\": \"Friended\",\n        \"season\": 1,\n        \"number\": 6,\n        \"airdate\": \"2011-10-25\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-10-26T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99513.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99513.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al's investigation into the murder of a hard-partying heiress takes an unexpected turn when they discover that the woman apparently didn't exist until 18 months earlier.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5857\"}\n        }\n      },\n      {\n        \"id\": 5858,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5858/unforgettable-1x07-road-block\",\n        \"name\": \"Road Block\",\n        \"season\": 1,\n        \"number\": 7,\n        \"airdate\": \"2011-11-01\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-11-02T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99512.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99512.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie's investigation into the death of her sister moves forward, but her inability to let go may hinder the search for a missing infant whose father was murdered.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5858\"}\n        }\n      },\n      {\n        \"id\": 5859,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5859/unforgettable-1x08-lost-things\",\n        \"name\": \"Lost Things\",\n        \"season\": 1,\n        \"number\": 8,\n        \"airdate\": \"2011-11-08\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-11-09T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99511.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99511.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al investigate the death of a public defender, only to discover that the killer has a larger plan which may lead to a second murder.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5859\"}\n        }\n      },\n      {\n        \"id\": 5860,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5860/unforgettable-1x09-golden-bird\",\n        \"name\": \"Golden Bird\",\n        \"season\": 1,\n        \"number\": 9,\n        \"airdate\": \"2011-11-15\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-11-16T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99510.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99510.jpg\"\n        },\n        \"summary\":\n            \"<p>Al and Carrie investigate the murder of a teen who seemed to have no enemies. Meanwhile, Carrie looks to her estranged aunt for help with the investigation into her sister's murder.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5860\"}\n        }\n      },\n      {\n        \"id\": 5861,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5861/unforgettable-1x10-trajectories\",\n        \"name\": \"Trajectories\",\n        \"season\": 1,\n        \"number\": 10,\n        \"airdate\": \"2011-11-22\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-11-23T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99509.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99509.jpg\"\n        },\n        \"summary\":\n            \"<p>When a second murder suddenly occurs at an active crime scene, Al and Carrie must wade through hundreds of bystanders to uncover if it was retribution or an unrelated attack.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5861\"}\n        }\n      },\n      {\n        \"id\": 5862,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5862/unforgettable-1x11-spirited-away\",\n        \"name\": \"Spirited Away\",\n        \"season\": 1,\n        \"number\": 11,\n        \"airdate\": \"2011-12-13\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2011-12-14T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99507.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99507.jpg\"\n        },\n        \"summary\":\n            \"<p>When a renowned ghost hunter is killed, Carrie and Al discover that his death is linked to a chilling discovery he made on a recent assignment.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5862\"}\n        }\n      },\n      {\n        \"id\": 5863,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5863/unforgettable-1x12-butterfly-effect\",\n        \"name\": \"Butterfly Effect\",\n        \"season\": 1,\n        \"number\": 12,\n        \"airdate\": \"2012-01-03\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-01-04T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99506.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99506.jpg\"\n        },\n        \"summary\":\n            \"<p>When a construction worker with a promising future is murdered, Carrie and Al wonder if his ties to the mob were the cause of his death or an unrelated coincidence.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5863\"}\n        }\n      },\n      {\n        \"id\": 5864,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5864/unforgettable-1x13-brotherhood\",\n        \"name\": \"Brotherhood\",\n        \"season\": 1,\n        \"number\": 13,\n        \"airdate\": \"2012-01-10\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-01-11T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99505.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99505.jpg\"\n        },\n        \"summary\":\n            \"<p>Routine investigation into a college student's death takes a disturbing turn for Carrie when a suspect makes a dangerous move to outwit her memory.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5864\"}\n        }\n      },\n      {\n        \"id\": 5865,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5865/unforgettable-1x14-carries-caller\",\n        \"name\": \"Carrie's Caller\",\n        \"season\": 1,\n        \"number\": 14,\n        \"airdate\": \"2012-02-07\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-02-08T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99503.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99503.jpg\"\n        },\n        \"summary\":\n            \"<p>Serial killer with knowledge of Carrie's memory abilities taunts the Queens PD as his list of victims grows.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5865\"}\n        }\n      },\n      {\n        \"id\": 5866,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5866/unforgettable-1x15-the-following-sea\",\n        \"name\": \"The Following Sea\",\n        \"season\": 1,\n        \"number\": 15,\n        \"airdate\": \"2012-02-14\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-02-15T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99502.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99502.jpg\"\n        },\n        \"summary\":\n            \"<p>When a key witness in his murder case vanishes before testifying, Al scrambles to find her before the suspect walks free.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5866\"}\n        }\n      },\n      {\n        \"id\": 5867,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5867/unforgettable-1x16-heartbreak\",\n        \"name\": \"Heartbreak\",\n        \"season\": 1,\n        \"number\": 16,\n        \"airdate\": \"2012-02-21\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-02-22T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99501.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99501.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al are at a loss to explain how a murder victim mysteriously appeared in an empty ballpark.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5867\"}\n        }\n      },\n      {\n        \"id\": 5868,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5868/unforgettable-1x17-blind-alleys\",\n        \"name\": \"Blind Alleys\",\n        \"season\": 1,\n        \"number\": 17,\n        \"airdate\": \"2012-02-28\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-02-29T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99500.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99500.jpg\"\n        },\n        \"summary\":\n            \"<p>Al and Carrie are forced to the sidelines by a negotiator when the father of a suspect that Roe shot takes members of the Queens PD, including Nina, hostage in a desperate quest for justice.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5868\"}\n        }\n      },\n      {\n        \"id\": 5869,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5869/unforgettable-1x18-the-comeback\",\n        \"name\": \"The Comeback\",\n        \"season\": 1,\n        \"number\": 18,\n        \"airdate\": \"2012-03-20\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-03-21T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99498.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99498.jpg\"\n        },\n        \"summary\":\n            \"<p>When Carrie's latest case is stalled by a powerful family's influence, she receives assistance from a lawyer who may be the mysterious caller who orchestrated a series of sniper attacks.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5869\"}\n        }\n      },\n      {\n        \"id\": 5870,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5870/unforgettable-1x19-allegiances\",\n        \"name\": \"Allegiances\",\n        \"season\": 1,\n        \"number\": 19,\n        \"airdate\": \"2012-03-27\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-03-28T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99497.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99497.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie's personal and professional lives collide when her boyfriend, the son of a mob boss, is revealed to have ties to suspects in a murder investigation.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5870\"}\n        }\n      },\n      {\n        \"id\": 5871,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5871/unforgettable-1x20-you-are-here\",\n        \"name\": \"You Are Here\",\n        \"season\": 1,\n        \"number\": 20,\n        \"airdate\": \"2012-04-10\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-04-11T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99496.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99496.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al must get inside the mind of a deranged conspiracy theorist before he sets off a series of bombs.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5871\"}\n        }\n      },\n      {\n        \"id\": 5872,\n        \"url\": \"http://www.tvmaze.com/episodes/5872/unforgettable-1x21-endgame\",\n        \"name\": \"Endgame\",\n        \"season\": 1,\n        \"number\": 21,\n        \"airdate\": \"2012-05-01\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-05-02T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99495.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99495.jpg\"\n        },\n        \"summary\":\n            \"<p>When Walter Morgan turns up dead, Carrie must locate his killer while deflecting attention from the prime suspect - her.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5872\"}\n        }\n      },\n      {\n        \"id\": 5873,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5873/unforgettable-1x22-the-man-in-the-woods\",\n        \"name\": \"The Man in the Woods\",\n        \"season\": 1,\n        \"number\": 22,\n        \"airdate\": \"2012-05-08\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2012-05-09T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99492.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99492.jpg\"\n        },\n        \"summary\":\n            \"<p>When a murder occurs in Syracuse which mirrors the death of her sister, Carrie and Al travel upstate to confront the suspect.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5873\"}\n        }\n      },\n      {\n        \"id\": 5874,\n        \"url\": \"http://www.tvmaze.com/episodes/5874/unforgettable-2x01-bigtime\",\n        \"name\": \"Bigtime\",\n        \"season\": 2,\n        \"number\": 1,\n        \"airdate\": \"2013-07-28\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-07-29T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99490.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99490.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al's reputation for closing cases results in an offer to join the Major Crimes Section of the NYPD. But when their first case - a high-profile child kidnapping - hits close to home for Carrie, it leaves her wondering if a move from Queens to Manhattan is what's best for her.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5874\"}\n        }\n      },\n      {\n        \"id\": 5875,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5875/unforgettable-2x02-incognito\",\n        \"name\": \"Incognito\",\n        \"season\": 2,\n        \"number\": 2,\n        \"airdate\": \"2013-08-04\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-08-05T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99488.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99488.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie goes undercover with a team of bank robbers when The Major Crimes Section gets a lead on the gang's leader, a notorious thief who rarely shows his face.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5875\"}\n        }\n      },\n      {\n        \"id\": 5876,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5876/unforgettable-2x03-day-of-the-jackie\",\n        \"name\": \"Day of the Jackie\",\n        \"season\": 2,\n        \"number\": 3,\n        \"airdate\": \"2013-08-11\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-08-12T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99487.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99487.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al are unable to discern why a businessman was murdered in his hotel room until it's discovered that his death was collateral damage in a larger plot to assassinate a diplomat.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5876\"}\n        }\n      },\n      {\n        \"id\": 5877,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5877/unforgettable-2x04-memory-kings\",\n        \"name\": \"Memory Kings\",\n        \"season\": 2,\n        \"number\": 4,\n        \"airdate\": \"2013-08-18\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-08-19T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99485.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99485.jpg\"\n        },\n        \"summary\":\n            \"<p>When the scientist who helped Carrie understand her memory abilities is murdered, she must track down other people with the same skill in the hopes that one of them holds the key to finding the killer.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5877\"}\n        }\n      },\n      {\n        \"id\": 5878,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5878/unforgettable-2x05-past-tense\",\n        \"name\": \"Past Tense\",\n        \"season\": 2,\n        \"number\": 5,\n        \"airdate\": \"2013-08-25\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-08-26T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99484.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99484.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al's latest case - the murder of an Afghani cab driver - has the potential to turn into a matter of national security when it's discovered that the victim was a government informant.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5878\"}\n        }\n      },\n      {\n        \"id\": 5879,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5879/unforgettable-2x06-line-up-or-shut-up\",\n        \"name\": \"Line Up or Shut Up\",\n        \"season\": 2,\n        \"number\": 6,\n        \"airdate\": \"2013-09-01\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-09-02T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99483.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99483.jpg\"\n        },\n        \"summary\":\n            \"<p>When a young man is found dead in an expensive sports car he was delivering to a diplomat, each clue leads Carrie and Al to yet another possible motive for the murder.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5879\"}\n        }\n      },\n      {\n        \"id\": 5880,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5880/unforgettable-2x07-maps-and-legends\",\n        \"name\": \"Maps and Legends\",\n        \"season\": 2,\n        \"number\": 7,\n        \"airdate\": \"2013-09-08\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2013-09-09T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99482.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99482.jpg\"\n        },\n        \"summary\":\n            \"<p>The murder of an urban explorer leads Carrie and Al to not only search for the killer, but to pick up the trail of clues the victim was following on the hunt for a treasure supposedly hidden under the streets of New York.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5880\"}\n        }\n      },\n      {\n        \"id\": 5881,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5881/unforgettable-2x08-till-death\",\n        \"name\": \"Till Death\",\n        \"season\": 2,\n        \"number\": 8,\n        \"airdate\": \"2014-04-04\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-04-05T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99480.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99480.jpg\"\n        },\n        \"summary\":\n            \"<p>After a wealthy couple is murdered, Carrie and Al pose as a married couple to lure in the killer, who Al believes is linked to a series of unsolved homicides he once investigated.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5881\"}\n        }\n      },\n      {\n        \"id\": 5882,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5882/unforgettable-2x09-flesh-and-blood\",\n        \"name\": \"Flesh and Blood\",\n        \"season\": 2,\n        \"number\": 9,\n        \"airdate\": \"2014-04-11\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-04-12T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99479.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99479.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie catches a deadly assassin who has eluded her before, but must put her personal vendetta aside when it's revealed that the woman has vital information to prevent a terrorist attack on New York City.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5882\"}\n        }\n      },\n      {\n        \"id\": 5883,\n        \"url\": \"http://www.tvmaze.com/episodes/5883/unforgettable-2x10-manhunt\",\n        \"name\": \"Manhunt\",\n        \"season\": 2,\n        \"number\": 10,\n        \"airdate\": \"2014-04-18\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-04-19T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99477.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99477.jpg\"\n        },\n        \"summary\":\n            \"<p>When a defense attorney is killed, Carrie and Al hunt for a recently paroled criminal who may be looking to settle other scores.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5883\"}\n        }\n      },\n      {\n        \"id\": 5884,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5884/unforgettable-2x11-east-of-islip\",\n        \"name\": \"East of Islip\",\n        \"season\": 2,\n        \"number\": 11,\n        \"airdate\": \"2014-04-25\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-04-26T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99476.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99476.jpg\"\n        },\n        \"summary\":\n            \"<p>Eliot agrees to let Carrie and Al use his Hamptons beach house in exchange for their help with a local murder investigation, but uncovering the secrets of the tight-knit community prove to be a challenge.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5884\"}\n        }\n      },\n      {\n        \"id\": 5885,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5885/unforgettable-2x12-omega-hour\",\n        \"name\": \"Omega Hour\",\n        \"season\": 2,\n        \"number\": 12,\n        \"airdate\": \"2014-05-02\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-05-03T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99475.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99475.jpg\"\n        },\n        \"summary\":\n            \"<p>Eliot and the mayor are trapped in an elevator by a cybercriminal who threatens to send them to their death, forcing Carrie to work from within the building to thwart his plans.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5885\"}\n        }\n      },\n      {\n        \"id\": 5886,\n        \"url\": \"http://www.tvmaze.com/episodes/5886/unforgettable-2x13-reunion\",\n        \"name\": \"Reunion\",\n        \"season\": 2,\n        \"number\": 13,\n        \"airdate\": \"2014-05-09\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-05-10T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99474.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99474.jpg\"\n        },\n        \"summary\":\n            \"<p>When a high school classmate of Carrie's is murdered at her reunion, she must revisit her memories as a teenager for clues to the motive.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5886\"}\n        }\n      },\n      {\n        \"id\": 5887,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5887/unforgettable-3x01-new-hundred\",\n        \"name\": \"New Hundred\",\n        \"season\": 3,\n        \"number\": 1,\n        \"airdate\": \"2014-06-29\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2014-06-30T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/22/57048.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/22/57048.jpg\"\n        },\n        \"summary\":\n            \"<p>The Secret Service enlists Carrie and Al's help when a murder investigation leads them to uncover a counterfeiting ring run by an assassin.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5887\"}\n        }\n      },\n      {\n        \"id\": 5888,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5888/unforgettable-3x02-the-combination\",\n        \"name\": \"The Combination\",\n        \"season\": 3,\n        \"number\": 2,\n        \"airdate\": \"2014-07-06\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2014-07-07T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/24/62286.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/24/62286.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al must uncover the pieces of a championship boxer's past to figure out who was able to beat him to death without any indication that he defended himself or fought back.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5888\"}\n        }\n      },\n      {\n        \"id\": 5889,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5889/unforgettable-3x03-the-haircut\",\n        \"name\": \"The Haircut\",\n        \"season\": 3,\n        \"number\": 3,\n        \"airdate\": \"2014-07-13\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-07-14T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/24/62289.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/24/62289.jpg\"\n        },\n        \"summary\":\n            \"<p>As Lee Anne's lawsuit against the police department continues to scandalize the city, a judge suggests that she accept a settlement offer. Meanwhile, Jamie and Roy argue opposing sides of a \\\"stand your ground\\\" case.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5889\"}\n        }\n      },\n      {\n        \"id\": 5890,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5890/unforgettable-3x04-cashing-out\",\n        \"name\": \"Cashing Out\",\n        \"season\": 3,\n        \"number\": 4,\n        \"airdate\": \"2014-07-20\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-07-21T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99466.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99466.jpg\"\n        },\n        \"summary\":\n            \"<p>When Carrie recognizes a murdered city official as someone she played poker with at an underground casino, she puts her career on the line by admitting her illegal activities and volunteers to go back to the tables undercover.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5890\"}\n        }\n      },\n      {\n        \"id\": 5891,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5891/unforgettable-3x05-a-moveable-feast\",\n        \"name\": \"A Moveable Feast\",\n        \"season\": 3,\n        \"number\": 5,\n        \"airdate\": \"2014-07-27\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-07-28T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99467.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99467.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al must find the connection between a murdered coast guard officer, a celebrity chef who threw him out of his restaurant and a missing block of C-4 before the explosives are used.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5891\"}\n        }\n      },\n      {\n        \"id\": 5892,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5892/unforgettable-3x06-stray-bullet\",\n        \"name\": \"Stray Bullet\",\n        \"season\": 3,\n        \"number\": 6,\n        \"airdate\": \"2014-08-03\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-08-04T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99469.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99469.jpg\"\n        },\n        \"summary\":\n            \"<p>Al becomes the prime suspect in the murder of a parolee he helped put in jail, forcing Carrie to conduct an off-the-books investigation to prove his innocence to Internal Affairs.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5892\"}\n        }\n      },\n      {\n        \"id\": 5893,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5893/unforgettable-3x07-throwing-shade\",\n        \"name\": \"Throwing Shade\",\n        \"season\": 3,\n        \"number\": 7,\n        \"airdate\": \"2014-08-17\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-08-18T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99470.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99470.jpg\"\n        },\n        \"summary\":\n            \"<p>When one of Eliot's oldest friends, the campaign manager for a mayoral candidate, is murdered, he is forced to face his past and current demons as Carrie and Al work to uncover the killer.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5893\"}\n        }\n      },\n      {\n        \"id\": 5894,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5894/unforgettable-3x08-the-island\",\n        \"name\": \"The Island\",\n        \"season\": 3,\n        \"number\": 8,\n        \"airdate\": \"2014-08-24\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-08-25T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99472.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99472.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al's investigation into the death of a college dropout takes a surprising turn when they discover he had been living in an off-the-grid community on an abandoned island near Manhattan.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5894\"}\n        }\n      },\n      {\n        \"id\": 5895,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5895/unforgettable-3x09-admissions\",\n        \"name\": \"Admissions\",\n        \"season\": 3,\n        \"number\": 9,\n        \"airdate\": \"2014-08-30\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2014-08-31T00:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99473.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99473.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al dig into the secrets of students and faculty at an elite prep school when a high-powered CEO and father of one of the students is murdered.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5895\"}\n        }\n      },\n      {\n        \"id\": 5896,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5896/unforgettable-3x10-fire-and-ice\",\n        \"name\": \"Fire and Ice\",\n        \"season\": 3,\n        \"number\": 10,\n        \"airdate\": \"2014-08-31\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-09-01T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99465.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99465.jpg\"\n        },\n        \"summary\":\n            \"<p>When Homeland Security takes over a bombing investigation from Major Crimes, Carrie doubts their conclusion that it's tied to terrorism and secretly continues her own investigation. Meanwhile, Webster makes friends with Murray's daughter.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5896\"}\n        }\n      },\n      {\n        \"id\": 5897,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5897/unforgettable-3x11-true-identity\",\n        \"name\": \"True Identity\",\n        \"season\": 3,\n        \"number\": 11,\n        \"airdate\": \"2014-09-07\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2014-09-08T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99463.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99463.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al investigate the murder of a high-end matchmaking service employee, but each secret they uncover in the victim's life only serves to create a new possible suspect and motive.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5897\"}\n        }\n      },\n      {\n        \"id\": 5898,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/5898/unforgettable-3x12-moving-on\",\n        \"name\": \"Moving On\",\n        \"season\": 3,\n        \"number\": 12,\n        \"airdate\": \"2014-09-14\",\n        \"airtime\": \"21:30\",\n        \"airstamp\": \"2014-09-15T01:30:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99461.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99461.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al delve into the disturbing - and dangerous - world of celebrity obsession when a television star is found murdered in his dressing room.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5898\"}\n        }\n      },\n      {\n        \"id\": 5899,\n        \"url\": \"http://www.tvmaze.com/episodes/5899/unforgettable-3x13-doa\",\n        \"name\": \"DOA\",\n        \"season\": 3,\n        \"number\": 13,\n        \"airdate\": \"2014-09-14\",\n        \"airtime\": \"22:30\",\n        \"airstamp\": \"2014-09-15T02:30:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99460.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99460.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie is unable to utilize her perfect memory when an assassin doses her with a deadly poison that attacks her brain, leaving Al on a desperate hunt for the antidote.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/5899\"}\n        }\n      },\n      {\n        \"id\": 213033,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/213033/unforgettable-4x01-blast-from-the-past\",\n        \"name\": \"Blast from the Past\",\n        \"season\": 4,\n        \"number\": 1,\n        \"airdate\": \"2015-11-27\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2015-11-28T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/32/81086.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/32/81086.jpg\"\n        },\n        \"summary\":\n            \"<p>Eddie Martin, Carrie's long-lost husband, pays a visit to Major Crimes while investigating a meth crew that is involved in something more nefarious than dealing drugs.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/213033\"}\n        }\n      },\n      {\n        \"id\": 376859,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/376859/unforgettable-4x02-gut-check\",\n        \"name\": \"Gut Check\",\n        \"season\": 4,\n        \"number\": 2,\n        \"airdate\": \"2015-11-27\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2015-11-28T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/32/81087.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/32/81087.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al are assigned to transport the star witness in a high-profile securities fraud case to Miami, while attempting to evade the killers on their trail.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/376859\"}\n        }\n      },\n      {\n        \"id\": 426210,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/426210/unforgettable-4x03-behind-the-beat\",\n        \"name\": \"Behind the Beat\",\n        \"season\": 4,\n        \"number\": 3,\n        \"airdate\": \"2015-12-04\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2015-12-05T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/32/81874.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/32/81874.jpg\"\n        },\n        \"summary\":\n            \"<p>When a young jazz prodigy is found shot to death, Major Crime is called in to investigate. Through their hunt for a murderer, Carrie and the team navigate the halls of an ultra-competitive music conservatory before diving deep into the underbelly of the city's jazz club scene where talent, fame and love might be just enough to get you killed.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/426210\"}\n        }\n      },\n      {\n        \"id\": 404149,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/404149/unforgettable-4x04-dollars-and-scents\",\n        \"name\": \"Dollars And Scents\",\n        \"season\": 4,\n        \"number\": 4,\n        \"airdate\": \"2015-12-11\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2015-12-12T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/34/86379.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/34/86379.jpg\"\n        },\n        \"summary\":\n            \"<p>The murder of a deli employee ignites a hunt for a criminal organization.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/404149\"}\n        }\n      },\n      {\n        \"id\": 480202,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/480202/unforgettable-4x05-all-in\",\n        \"name\": \"All In\",\n        \"season\": 4,\n        \"number\": 5,\n        \"airdate\": \"2015-12-18\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2015-12-19T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/35/89290.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/35/89290.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie's old flame resurfaces and a murder investigation leads the team to Atlantic City.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/480202\"}\n        }\n      },\n      {\n        \"id\": 532035,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/532035/unforgettable-4x06-the-return-of-eddie\",\n        \"name\": \"The Return of Eddie\",\n        \"season\": 4,\n        \"number\": 6,\n        \"airdate\": \"2016-01-01\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2016-01-02T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/37/94093.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/37/94093.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al suspect that a tabloid cameraman's death during a convenience-store robbery may be more than just a random act of violence.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/532035\"}\n        }\n      },\n      {\n        \"id\": 532036,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/532036/unforgettable-4x07-we-can-be-heroes\",\n        \"name\": \"We Can Be Heroes\",\n        \"season\": 4,\n        \"number\": 7,\n        \"airdate\": \"2016-01-08\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2016-01-09T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99459.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99459.jpg\"\n        },\n        \"summary\":\n            \"<p>Major Crimes determines that the kidnapping of a prominent scientist's son was not a crime of opportunity but rather a calculated scheme for revenge.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/532036\"}\n        }\n      },\n      {\n        \"id\": 533174,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/533174/unforgettable-4x08-breathing-space\",\n        \"name\": \"Breathing Space\",\n        \"season\": 4,\n        \"number\": 8,\n        \"airdate\": \"2016-01-15\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2016-01-16T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99454.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99454.jpg\"\n        },\n        \"summary\":\n            \"<p>Suspects are plentiful in the case of a murdered aerospace engineer; the Major Crimes team learns that the victim was working on a billionaire's top-secret space mission.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/533174\"}\n        }\n      },\n      {\n        \"id\": 546033,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/546033/unforgettable-4x09-shelter-from-the-storm\",\n        \"name\": \"Shelter from the Storm\",\n        \"season\": 4,\n        \"number\": 9,\n        \"airdate\": \"2016-01-15\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2016-01-16T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/39/99520.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/39/99520.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie, Al and a captured criminal hole up in in an abandoned precinct as a sinister storm approaches, with their captive's violent crew hot on their tail.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/546033\"}\n        }\n      },\n      {\n        \"id\": 533175,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/533175/unforgettable-4x10-game-on\",\n        \"name\": \"Game On\",\n        \"season\": 4,\n        \"number\": 10,\n        \"airdate\": \"2016-01-22\",\n        \"airtime\": \"20:00\",\n        \"airstamp\": \"2016-01-23T01:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/40/102250.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/40/102250.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al investigate the world of high-stakes video games and corporate espionage after a man is found dead inside a haunted-house attraction.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/533175\"}\n        }\n      },\n      {\n        \"id\": 570267,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/570267/unforgettable-4x11-about-face\",\n        \"name\": \"About Face\",\n        \"season\": 4,\n        \"number\": 11,\n        \"airdate\": \"2016-01-22\",\n        \"airtime\": \"21:00\",\n        \"airstamp\": \"2016-01-23T02:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/40/102251.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/40/102251.jpg\"\n        },\n        \"summary\":\n            \"<p>Carrie and Al receive new information in the cold case of a missing surgeon, putting them on the trail of two con artists.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/570267\"}\n        }\n      },\n      {\n        \"id\": 570269,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/570269/unforgettable-4x12-bad-company\",\n        \"name\": \"Bad Company\",\n        \"season\": 4,\n        \"number\": 12,\n        \"airdate\": \"2016-01-22\",\n        \"airtime\": \"22:00\",\n        \"airstamp\": \"2016-01-23T03:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/40/102252.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/40/102252.jpg\"\n        },\n        \"summary\":\n            \"<p>Capt. Russo is suspected in the murder of an informant, leading Carrie and Al into a cat-and-mouse game with a corrupt former cop.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/570269\"}\n        }\n      },\n      {\n        \"id\": 570271,\n        \"url\":\n            \"http://www.tvmaze.com/episodes/570271/unforgettable-4x13-paranoid-android\",\n        \"name\": \"Paranoid Android\",\n        \"season\": 4,\n        \"number\": 13,\n        \"airdate\": \"2016-01-22\",\n        \"airtime\": \"23:00\",\n        \"airstamp\": \"2016-01-23T04:00:00+00:00\",\n        \"runtime\": 60,\n        \"image\": {\n          \"medium\":\n              \"http://static.tvmaze.com/uploads/images/medium_landscape/40/102253.jpg\",\n          \"original\":\n              \"http://static.tvmaze.com/uploads/images/original_untouched/40/102253.jpg\"\n        },\n        \"summary\":\n            \"<p>The search for a wanted shooter triggers a flashback that conflicts with Carrie's perfect memory; the Major Crimes team uncovers a nefarious conspiracy involving trained killers.</p>\",\n        \"_links\": {\n          \"self\": {\"href\": \"http://api.tvmaze.com/episodes/570271\"}\n        }\n      }\n    ],\n    \"year\": \"2011-09-20\",\n    \"description\":\n        \"<p><b>Unforgettable</b> follows Carrie Wells, an enigmatic former police detective with a rare condition that makes her memory so flawless that every place, every conversation, every moment of joy and every heartbreak is forever embedded in her mind. It's not just that she doesn't forget anything - she can't; except for one thing: the details that would help solve her sister's long-ago murder. Carrie has tried to put her past behind her, but she's unexpectedly reunited with her ex-boyfriend and partner, NYPD Detective Al Burns when she consults on a homicide case.</p>\"\n  },\n  \"_id\": \"5bedbeffa70245f2bbdd6a05\",\n  \"id\": 89,\n  \"name\": \"Unforgettable\",\n  \"image\":\n      \"http://static.tvmaze.com/uploads/images/original_untouched/0/663.jpg\"\n};\n"
  },
  {
    "path": "lib/src/helpers/config/route_handlers.dart",
    "content": "part of netflix;\n\nvar rootHandler = Handler(\n  handlerFunc: (BuildContext context, Map<String, List<String>> params,\n      [dynamic object]) {\n    return Home();\n  },\n);\nvar summaryRouteHandler = Handler(\n  handlerFunc: (BuildContext context, Map<String, List<String>> params,\n      [dynamic object]) {\n    return Summary();\n  },\n);\nvar detailRouteHandler = Handler(\n  handlerFunc: (BuildContext context, Map<String, List<String>> params,\n      [dynamic object]) {\n    return TvShow(match: object['match'], item: object['show']);\n  },\n);\nvar trailerRouteHandler = Handler(\n  handlerFunc: (BuildContext context, Map<String, List<String>> params,\n      [dynamic object]) {\n    return Video(title: object['title']);\n  },\n);\nvar filterRouteHandler = Handler(\n  handlerFunc: (BuildContext context, Map<String, List<String>> params,\n      [dynamic object]) {\n    return Filter(\n      type: object['type'],\n    );\n  },\n);\n"
  },
  {
    "path": "lib/src/helpers/config/routes.dart",
    "content": "part of netflix;\n\nclass Routes {\n  static String root = '/';\n  static String summary = '/summary';\n  static String detail = '/detail';\n  static String filter = '/filter';\n  static String video = '/trailer';\n\n  static void configureRoutes(Router router) {\n    router.notFoundHandler = Handler(handlerFunc:\n        (BuildContext context, Map<String, List<String>> params,\n            [dynamic object]) {\n      print('ROUTE WAS NOT FOUND !!!');\n      return null;\n    });\n    router.define(root, handler: rootHandler);\n    router.define(summary, handler: summaryRouteHandler);\n    router.define(detail, handler: detailRouteHandler);\n    router.define(filter, handler: filterRouteHandler);\n    router.define(video, handler: trailerRouteHandler);\n  }\n}\n"
  },
  {
    "path": "lib/src/models/episode.dart",
    "content": "part of netflix;\n\nclass Episode {\n  int _number;\n  int _season;\n  String _image;\n  String _summary;\n  String _name;\n  int _duration;\n\n  Episode.fromJson(Map<String, dynamic> parsedJson) {\n    RegExp exp = new RegExp(r\"<[^>]*>\");\n    _number = parsedJson['number'];\n    _season = parsedJson['season'];\n    _image = (parsedJson['image'] ?? {})['medium'];\n    _summary = parsedJson['summary'] != null\n        ? parsedJson['summary'].replaceAll(exp, '')\n        : '';\n    _name = parsedJson['name'];\n    _duration = parsedJson['airtime'] != null &&\n            parsedJson['airtime'].toString().isNotEmpty\n        ? int.parse(parsedJson['airtime'].split(':')[0])\n        : 0;\n  }\n\n  int get number => _number;\n  int get season => _season;\n  String get image => _image;\n  String get summary => _summary;\n  String get name => _name;\n  int get duration => _duration;\n}\n"
  },
  {
    "path": "lib/src/models/item_model.dart",
    "content": "part of netflix;\n\nclass ItemModel {\n  String _title;\n  List<Result> _results = [];\n\n  ItemModel.fromJson(Map<String, dynamic> parsedJson) {\n    _title = parsedJson['title'];\n    _results = List.from(parsedJson['items'])\n        .map(\n          (r) => Result.fromJson(r),\n        )\n        .toList();\n  }\n\n  List<Result> get results => _results;\n  String get title => _title;\n}\n"
  },
  {
    "path": "lib/src/models/result.dart",
    "content": "part of netflix;\n\nclass Result {\n  int id;\n  String _name;\n  String _image;\n  List<String> _genres;\n  List<String> _cast;\n  List<Episode> _episodes;\n  List<int> _seasons = [];\n  DateTime _date;\n  String _description;\n\n  Result.fromJson(Map<String, dynamic> parsedJson) {\n    _name = parsedJson['name'];\n    _image = parsedJson['image'];\n    _genres = List.from(parsedJson['details']['genres'])\n        .map((genre) => genre.toString())\n        .toList();\n    _cast = List.from(parsedJson['details']['cast'])\n        .map((cast) => cast['person']['name'].toString())\n        .toList();\n    _date = parsedJson['year'] != null\n        ? DateTime.parse(parsedJson['year'].toString())\n        : DateTime.now();\n    RegExp exp = new RegExp(r\"<[^>]*>\");\n    _description = parsedJson['details']['description'].replaceAll(exp, '');\n    _episodes = List.from(parsedJson['details']['episodes'])\n        .map((e) => Episode.fromJson(e))\n        .toList();\n    List.from(parsedJson['details']['episodes']).forEach((s) {\n      int seasonNumber = int.parse(s['season'].toString());\n      if (!_seasons.contains(seasonNumber)) _seasons.add(seasonNumber);\n    });\n  }\n\n  String get name => _name;\n  String get image => _image;\n  List<String> get genres => _genres;\n  List<String> get cast => _cast;\n  DateTime get date => _date;\n  String get description => _description;\n  List<Episode> get episodes => _episodes;\n  List<int> get seasons => _seasons;\n}\n"
  },
  {
    "path": "lib/src/pages/detail/index.dart",
    "content": "part of netflix;\n\nclass TvShow extends StatefulWidget {\n  final int match;\n  final Result item;\n\n  TvShow({\n    Key key,\n    this.match,\n    this.item,\n  }) : super(key: key);\n\n  @override\n  TvShowState createState() => TvShowState();\n}\n"
  },
  {
    "path": "lib/src/pages/detail/state.dart",
    "content": "part of netflix;\n\nclass TvShowState extends State<TvShow> {\n  var currentSeason = 1;\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Size screenSize = MediaQuery.of(context).size;\n    List<Episode> seasonEpisodes = widget.item.episodes\n        .where((Episode e) => e.season == currentSeason)\n        .toList();\n    return Scaffold(\n      backgroundColor: Colors.black,\n      body: CustomScrollView(\n        slivers: <Widget>[\n          SliverAppBar(\n            primary: true,\n            expandedHeight: 430.0,\n            backgroundColor: Colors.black,\n            flexibleSpace: FlexibleSpaceBar(\n              collapseMode: CollapseMode.pin,\n              background: Container(\n                child: Stack(\n                  fit: StackFit.loose,\n                  children: <Widget>[\n                    Container(\n                      width: screenSize.width,\n                      height: 220,\n                      child: Center(\n                        child: Container(\n                          height: 64.0,\n                          width: 64.0,\n                          child: OutlineButton(\n                            padding: EdgeInsets.all(0.0),\n                            onPressed: () => print('play'),\n                            shape: RoundedRectangleBorder(\n                              borderRadius: BorderRadius.all(\n                                Radius.circular(32.0),\n                              ),\n                            ),\n                            child: Container(\n                              height: 64.0,\n                              width: 64.0,\n                              decoration: BoxDecoration(\n                                color: Color.fromRGBO(0, 0, 0, 0.3),\n                                borderRadius: BorderRadius.circular(32.0),\n                              ),\n                              child: Icon(\n                                Icons.play_arrow,\n                                color: Colors.white,\n                                size: 48.0,\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                      decoration: BoxDecoration(\n                        image: DecorationImage(\n                          image: NetworkImage(\n                            widget.item.image,\n                          ),\n                          fit: BoxFit.fitWidth,\n                        ),\n                      ),\n                    ),\n                    Container(\n                      width: screenSize.width,\n                      height: 220,\n                      child: DecoratedBox(\n                        decoration: BoxDecoration(\n                          gradient: LinearGradient(\n                            begin: FractionalOffset.topCenter,\n                            end: FractionalOffset.bottomCenter,\n                            stops: [0.1, 0.4, 1.0],\n                            colors: [\n                              Colors.black54,\n                              Colors.transparent,\n                              Colors.black\n                            ],\n                          ),\n                        ),\n                        child: Padding(\n                          padding: EdgeInsets.only(\n                              left: 8.0, right: 8.0, bottom: 20.0),\n                          child: Column(\n                            mainAxisAlignment: MainAxisAlignment.end,\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              Text(\n                                widget.item.name,\n                                maxLines: 3,\n                                textAlign: TextAlign.left,\n                                style: TextStyle(\n                                  color: Colors.white,\n                                  fontWeight: FontWeight.w700,\n                                  fontSize: 18.0,\n                                ),\n                              )\n                            ],\n                          ),\n                        ),\n                      ),\n                    ),\n                    Positioned(\n                      top: 220,\n                      child: Container(\n                        padding: EdgeInsets.only(left: 8.0, right: 30.0),\n                        width: screenSize.width,\n                        child: Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            Text(\n                              '${widget.match}% de coicidencia',\n                              textAlign: TextAlign.left,\n                              style: TextStyle(\n                                color: Color.fromRGBO(0, 255, 0, 0.8),\n                                fontWeight: FontWeight.w600,\n                                fontSize: 15.0,\n                              ),\n                            ),\n                            Text(\n                              widget.item.date.year.toString(),\n                              textAlign: TextAlign.left,\n                              style: TextStyle(\n                                color: Color.fromRGBO(255, 255, 255, 0.3),\n                                fontWeight: FontWeight.w400,\n                                fontSize: 12.0,\n                              ),\n                            ),\n                            Text(\n                              '16 +',\n                              textAlign: TextAlign.left,\n                              style: TextStyle(\n                                color: Color.fromRGBO(255, 255, 255, 0.3),\n                                fontWeight: FontWeight.w400,\n                                fontSize: 12.0,\n                              ),\n                            ),\n                            Text(\n                              '${widget.item.seasons.length} temporadas',\n                              textAlign: TextAlign.left,\n                              style: TextStyle(\n                                color: Color.fromRGBO(255, 255, 255, 0.3),\n                                fontWeight: FontWeight.w400,\n                                fontSize: 12.0,\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ),\n                    Positioned(\n                      top: 240,\n                      child: Container(\n                        padding: EdgeInsets.symmetric(horizontal: 8.0),\n                        width: screenSize.width,\n                        child: Column(\n                          mainAxisAlignment: MainAxisAlignment.start,\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: <Widget>[\n                            Padding(\n                              padding: EdgeInsets.only(top: 8.0),\n                              child: Container(\n                                child: Text(\n                                  widget.item.description,\n                                  overflow: TextOverflow.ellipsis,\n                                  maxLines: 3,\n                                  textAlign: TextAlign.left,\n                                  style: TextStyle(\n                                    color: Color.fromRGBO(255, 255, 255, 0.8),\n                                    fontWeight: FontWeight.w400,\n                                    fontSize: 12.0,\n                                  ),\n                                ),\n                              ),\n                            ),\n                            Padding(\n                              padding: EdgeInsets.only(top: 8.0),\n                              child: Container(\n                                child: RichText(\n                                  maxLines: 2,\n                                  overflow: TextOverflow.ellipsis,\n                                  text: TextSpan(\n                                    style: TextStyle(\n                                      color: Color.fromRGBO(255, 255, 255, 0.3),\n                                      fontWeight: FontWeight.w400,\n                                      fontSize: 12.0,\n                                    ),\n                                    children: <TextSpan>[\n                                      TextSpan(\n                                        text: 'Protagonizada por: ',\n                                        style: TextStyle(\n                                            fontWeight: FontWeight.bold),\n                                      ),\n                                      TextSpan(\n                                          text: widget.item.cast.join(', ')),\n                                    ],\n                                  ),\n                                ),\n                              ),\n                            ),\n                            Padding(\n                              padding: EdgeInsets.only(top: 8.0),\n                              child: Row(\n                                children: <Widget>[\n                                  FlatButton(\n                                    textColor: Colors.white70,\n                                    onPressed: () => print('Mi Lista'),\n                                    child: Container(\n                                      height: 50.0,\n                                      child: Column(\n                                        mainAxisAlignment:\n                                            MainAxisAlignment.spaceAround,\n                                        children: <Widget>[\n                                          Icon(\n                                            Icons.add,\n                                            size: 32.0,\n                                          ),\n                                          Text(\n                                            'Mi Lista',\n                                            style: TextStyle(fontSize: 10.0),\n                                          )\n                                        ],\n                                      ),\n                                    ),\n                                  ),\n                                  FlatButton(\n                                    textColor: Colors.white70,\n                                    onPressed: () => print('calificar'),\n                                    child: Container(\n                                      height: 50.0,\n                                      child: Column(\n                                        mainAxisAlignment:\n                                            MainAxisAlignment.spaceAround,\n                                        children: <Widget>[\n                                          Icon(\n                                            Icons.thumb_up,\n                                            size: 24.0,\n                                          ),\n                                          Text(\n                                            'Calificar',\n                                            style: TextStyle(fontSize: 10.0),\n                                          )\n                                        ],\n                                      ),\n                                    ),\n                                  ),\n                                  FlatButton(\n                                    textColor: Colors.white70,\n                                    onPressed: () => print('Compartir'),\n                                    child: Container(\n                                      height: 50.0,\n                                      child: Column(\n                                        mainAxisAlignment:\n                                            MainAxisAlignment.spaceAround,\n                                        children: <Widget>[\n                                          Icon(\n                                            Icons.share,\n                                            size: 20.0,\n                                          ),\n                                          Text(\n                                            'Compartir',\n                                            style: TextStyle(fontSize: 10.0),\n                                          )\n                                        ],\n                                      ),\n                                    ),\n                                  ),\n                                ],\n                              ),\n                            ),\n                            Padding(\n                              padding: EdgeInsets.only(top: 8.0),\n                              child: Container(\n                                child: Text(\n                                  'EPISODIOS',\n                                  overflow: TextOverflow.ellipsis,\n                                  maxLines: 3,\n                                  textAlign: TextAlign.left,\n                                  style: TextStyle(\n                                    color: Color.fromRGBO(255, 255, 255, 0.8),\n                                    fontWeight: FontWeight.w700,\n                                    fontSize: 15.0,\n                                  ),\n                                ),\n                              ),\n                            ),\n                            FlatButton(\n                              padding: EdgeInsets.all(0.0),\n                              onPressed: widget.item.seasons.length > 1\n                                  ? () => print('cambiando temporada')\n                                  : null,\n                              child: Row(\n                                children: <Widget>[\n                                  Text(\n                                    'Temporada $currentSeason',\n                                    overflow: TextOverflow.ellipsis,\n                                    maxLines: 3,\n                                    textAlign: TextAlign.left,\n                                    style: TextStyle(\n                                      color: Color.fromRGBO(255, 255, 255, 0.6),\n                                      fontWeight: FontWeight.w500,\n                                      fontSize: 15.0,\n                                    ),\n                                  ),\n                                  (widget.item.seasons.length > 1\n                                      ? Padding(\n                                          padding: EdgeInsets.only(left: 8.0),\n                                          child: Icon(\n                                            Icons.arrow_drop_down,\n                                            color: Color.fromRGBO(\n                                                255, 255, 255, 0.6),\n                                          ),\n                                        )\n                                      : Container())\n                                ],\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          SliverList(\n            delegate: SliverChildBuilderDelegate(\n              (context, index) => Container(\n                    margin: EdgeInsets.only(bottom: 16.0),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          children: <Widget>[\n                            Container(\n                              margin: EdgeInsets.only(right: 8.0),\n                              width: 150.0,\n                              height: 90.0,\n                              decoration: BoxDecoration(\n                                image: DecorationImage(\n                                  image:\n                                      NetworkImage(seasonEpisodes[index].image),\n                                ),\n                              ),\n                              child: Center(\n                                child: Container(\n                                  height: 32.0,\n                                  width: 32.0,\n                                  child: OutlineButton(\n                                    padding: EdgeInsets.all(0.0),\n                                    onPressed: () => print('play'),\n                                    shape: RoundedRectangleBorder(\n                                      borderRadius: BorderRadius.all(\n                                        Radius.circular(32.0),\n                                      ),\n                                    ),\n                                    child: Container(\n                                      height: 32.0,\n                                      width: 32.0,\n                                      decoration: BoxDecoration(\n                                        color: Color.fromRGBO(0, 0, 0, 0.3),\n                                        borderRadius:\n                                            BorderRadius.circular(16.0),\n                                      ),\n                                      child: Icon(\n                                        Icons.play_arrow,\n                                        color: Colors.white,\n                                        size: 24.0,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                              ),\n                            ),\n                            Column(\n                              mainAxisAlignment: MainAxisAlignment.start,\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: <Widget>[\n                                Text(\n                                  '${index + 1}. ${seasonEpisodes[index].name}',\n                                  maxLines: 1,\n                                  overflow: TextOverflow.ellipsis,\n                                  style: TextStyle(\n                                    fontWeight: FontWeight.w600,\n                                    fontSize: 14.0,\n                                    color: Color.fromRGBO(255, 255, 255, 0.8),\n                                  ),\n                                ),\n                                Text(\n                                  '${seasonEpisodes[index].duration}m',\n                                  maxLines: 1,\n                                  overflow: TextOverflow.ellipsis,\n                                  style: TextStyle(\n                                    fontSize: 12.0,\n                                    color: Color.fromRGBO(255, 255, 255, 0.3),\n                                  ),\n                                )\n                              ],\n                            )\n                          ],\n                        ),\n                        Text(\n                          seasonEpisodes[index].summary,\n                          maxLines: 3,\n                          overflow: TextOverflow.ellipsis,\n                          style: TextStyle(\n                            fontSize: 10.0,\n                            color: Color.fromRGBO(255, 255, 255, 0.3),\n                          ),\n                        )\n                      ],\n                    ),\n                  ),\n              childCount: seasonEpisodes.length,\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/pages/filter/index.dart",
    "content": "part of netflix;\n\nclass Filter extends StatefulWidget {\n  final String title;\n  final String type;\n  Filter({\n    Key key,\n    this.title,\n    this.type,\n  }) : super(key: key);\n\n  @override\n  FilterState createState() => FilterState();\n}\n"
  },
  {
    "path": "lib/src/pages/filter/state.dart",
    "content": "part of netflix;\n\nclass FilterState extends State<Filter> {\n  String filterSelected;\n  List<String> options = ['Series', 'Películas', 'Mi-lista'];\n  dynamic tvShow = {\n    \"details\": {\n      \"genres\": [\"Drama\", \"Crime\"],\n      \"year\": \"2011-09-20\",\n      \"description\":\n          \"<p><b>Unforgettable</b> follows Carrie Wells, an enigmatic former police detective with a rare condition that makes her memory so flawless that every place, every conversation, every moment of joy and every heartbreak is forever embedded in her mind. It's not just that she doesn't forget anything - she can't; except for one thing: the details that would help solve her sister's long-ago murder. Carrie has tried to put her past behind her, but she's unexpectedly reunited with her ex-boyfriend and partner, NYPD Detective Al Burns when she consults on a homicide case.</p>\"\n    },\n    \"_id\": \"5bedbf00a70245f2bbdd6a64\",\n    \"id\": 89,\n    \"name\": \"Unforgettable\",\n    \"image\":\n        \"http://static.tvmaze.com/uploads/images/original_untouched/0/663.jpg\"\n  };\n  @override\n  void initState() {\n    filterSelected = widget.type;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Size screenSize = MediaQuery.of(context).size;\n    return CustomScrollView(\n      slivers: <Widget>[\n        SliverAppBar(\n          primary: true,\n          expandedHeight: screenSize.height * 0.65,\n          backgroundColor: Colors.black,\n          leading: Image.asset('assets/images/netflix_icon.png'),\n          // titleSpacing: 20.0,\n          title: Title(\n            color: Colors.black,\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: <Widget>[\n                Hero(\n                  tag: widget.type,\n                  child: FlatButton(\n                    onPressed: () => print(widget.type),\n                    child: Text(\n                      widget.type.replaceAll('-', ' '),\n                      style: TextStyle(\n                        color: Colors.white,\n                        fontWeight: FontWeight.w400,\n                        fontSize: 14.0,\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n          flexibleSpace: FlexibleSpaceBar(\n            collapseMode: CollapseMode.pin,\n            background: Container(\n              child: Stack(\n                fit: StackFit.expand,\n                children: <Widget>[\n                  Image.network(\n                    tvShow['image'],\n                    fit: BoxFit.cover,\n                  ),\n                  DecoratedBox(\n                    decoration: BoxDecoration(\n                      gradient: LinearGradient(\n                        begin: FractionalOffset.topCenter,\n                        end: FractionalOffset.bottomCenter,\n                        stops: [0.1, 0.6, 1.0],\n                        colors: [\n                          Colors.black54,\n                          Colors.transparent,\n                          Colors.black\n                        ],\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/pages/home/index.dart",
    "content": "part of netflix;\n\nclass Home extends StatefulWidget {\n  Home({Key key, this.title}) : super(key: key);\n  final String title;\n\n  @override\n  HomeState createState() => HomeState();\n}"
  },
  {
    "path": "lib/src/pages/home/state.dart",
    "content": "part of netflix;\n\nclass HomeState extends State<Home> with SingleTickerProviderStateMixin {\n  TabController controller;\n\n  @override\n  void initState() {\n    super.initState();\n    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light\n        .copyWith(statusBarColor: Colors.transparent));\n    controller = TabController(length: 5, initialIndex: 0, vsync: this);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      backgroundColor: Colors.black,\n      bottomNavigationBar: TabBar(\n        labelStyle: TextStyle(fontSize: 10.0),\n        indicatorWeight: 0.1,\n        controller: controller,\n        tabs: <Widget>[\n          Tab(text: 'Inicio', icon: Icon(Icons.home)),\n          Tab(text: 'Buscar', icon: Icon(Icons.search)),\n          Tab(text: 'Próximamente', icon: Icon(Icons.ondemand_video)),\n          Tab(text: 'Descargas', icon: Icon(Icons.file_download)),\n          Tab(text: 'Más', icon: Icon(Icons.menu)),\n        ],\n      ),\n      body: TabBarView(\n        controller: controller,\n        physics: NeverScrollableScrollPhysics(),\n        children: <Widget>[\n          Summary(),\n          Summary(),\n          Summary(),\n          Summary(),\n          Summary(),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/pages/summary/index.dart",
    "content": "part of netflix;\n\nclass Summary extends StatefulWidget {\n  Summary({Key key, this.title}) : super(key: key);\n  final String title;\n\n  @override\n  SummaryState createState() => SummaryState();\n}"
  },
  {
    "path": "lib/src/pages/summary/state.dart",
    "content": "part of netflix;\n\nclass SummaryState extends State<Summary> {\n  \n  void goTo(String type) {\n    Application.router.navigateTo(\n      context,\n      '${Routes.filter}',\n      transition: TransitionType.nativeModal,\n      transitionDuration: const Duration(milliseconds: 200),\n      object: {'type': type},\n    );\n  }\n\n  void goToDetail(Result item, int match) {\n    Application.router.navigateTo(\n      context,\n      '${Routes.detail}',\n      transition: TransitionType.inFromRight,\n      transitionDuration: const Duration(milliseconds: 200),\n      object: {'match': match, 'show': item},\n    );\n  }\n\n  void showTrailer() {\n    SystemChrome.setPreferredOrientations([\n      DeviceOrientation.landscapeRight,\n      DeviceOrientation.landscapeLeft,\n    ]).then((e) {\n      Application.router.navigateTo(\n        context,\n        Routes.video,\n        object: {'title': 'Unforgettable'},\n        transition: TransitionType.inFromBottom,\n        transitionDuration: const Duration(milliseconds: 200),\n      );\n    });\n  }\n\n  List<Widget> renderMainGenres() {\n    List<Widget> genres = List.from(tvShow['details']['genres'].map((g) {\n      return Padding(\n        padding: EdgeInsets.symmetric(horizontal: 8.0),\n        child: Text(\n          g,\n          style: TextStyle(\n            color: Colors.white,\n            fontWeight: FontWeight.w400,\n            fontSize: 12.0,\n          ),\n        ),\n      );\n    }).toList());\n    return genres;\n  }\n\n  Widget renderTitle(String tag, String text) {\n    return Hero(\n      tag: tag,\n      child: FlatButton(\n        onPressed: () => goTo(tag),\n        child: Text(\n          text,\n          style: TextStyle(\n            color: Colors.white,\n            fontWeight: FontWeight.w400,\n            fontSize: 14.0,\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final Size screenSize = MediaQuery.of(context).size;\n    final Result show = Result.fromJson(tvShow);\n    bloc.fetchAllMovies();\n    return StreamBuilder(\n      stream: bloc.allMovies,\n      builder: (context, AsyncSnapshot<List<ItemModel>> snapshot) {\n        if (snapshot.hasData) {\n          return CustomScrollView(\n            slivers: <Widget>[\n              SliverAppBar(\n                primary: true,\n                expandedHeight: screenSize.height * 0.65,\n                backgroundColor: Colors.black,\n                leading: Image.asset('assets/images/netflix_icon.png'),\n                titleSpacing: 20.0,\n                title: Title(\n                  color: Colors.black,\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      renderTitle('Series', 'Series'),\n                      renderTitle('Películas', 'Películas'),\n                      renderTitle('Mi-lista', 'Mi lista'),\n                    ],\n                  ),\n                ),\n                flexibleSpace: FlexibleSpaceBar(\n                  collapseMode: CollapseMode.pin,\n                  background: Container(\n                    child: Stack(\n                      fit: StackFit.expand,\n                      children: <Widget>[\n                        Image.network(show.image, fit: BoxFit.cover),\n                        DecoratedBox(\n                          decoration: BoxDecoration(\n                            gradient: LinearGradient(\n                              begin: FractionalOffset.topCenter,\n                              end: FractionalOffset.bottomCenter,\n                              stops: [0.1, 0.6, 1.0],\n                              colors: [\n                                Colors.black54,\n                                Colors.transparent,\n                                Colors.black\n                              ],\n                            ),\n                          ),\n                          child: Container(\n                            height: 40.0,\n                            width: screenSize.width,\n                            child: Column(\n                              mainAxisAlignment: MainAxisAlignment.end,\n                              children: <Widget>[\n                                Padding(\n                                  padding: EdgeInsets.only(bottom: 8.0),\n                                  child: Container(\n                                    decoration: const BoxDecoration(\n                                      border: Border(\n                                        bottom: BorderSide(\n                                          width: 3.0,\n                                          color:\n                                              Color.fromRGBO(185, 3, 12, 1.0),\n                                        ),\n                                      ),\n                                    ),\n                                    child: Text(\n                                      tvShow['name'].replaceAll(' ', '\\n'),\n                                      maxLines: 3,\n                                      textAlign: TextAlign.left,\n                                      style: TextStyle(\n                                        height: 0.65,\n                                        color: Colors.white,\n                                        fontWeight: FontWeight.w700,\n                                        fontSize: 30.0,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                                Row(\n                                  mainAxisAlignment: MainAxisAlignment.center,\n                                  children: renderMainGenres(),\n                                ),\n                                Container(\n                                  padding: EdgeInsets.symmetric(vertical: 16.0),\n                                  child: Row(\n                                    mainAxisAlignment: MainAxisAlignment.center,\n                                    children: <Widget>[\n                                      FlatButton(\n                                        textColor: Colors.white,\n                                        child: Column(\n                                          children: <Widget>[\n                                            Icon(Icons.add),\n                                            Text(\n                                              'Mi lista',\n                                              style: TextStyle(\n                                                  fontSize: 10.0,\n                                                  fontWeight: FontWeight.w300),\n                                            ),\n                                          ],\n                                        ),\n                                        onPressed: () => print('mi lista'),\n                                      ),\n                                      RaisedButton(\n                                        textColor: Colors.black,\n                                        color: Colors.white,\n                                        child: Row(\n                                          children: <Widget>[\n                                            Icon(Icons.play_arrow),\n                                            Text(\n                                              'Reproducir',\n                                              style: TextStyle(\n                                                fontSize: 16.0,\n                                                fontWeight: FontWeight.w500,\n                                              ),\n                                            ),\n                                          ],\n                                        ),\n                                        onPressed: showTrailer,\n                                      ),\n                                      FlatButton(\n                                        textColor: Colors.white,\n                                        child: Column(\n                                          children: <Widget>[\n                                            Icon(Icons.info_outline),\n                                            Text(\n                                              'Información',\n                                              style: TextStyle(\n                                                  fontSize: 10.0,\n                                                  fontWeight: FontWeight.w300),\n                                            ),\n                                          ],\n                                        ),\n                                        onPressed: () => goToDetail(show, 99),\n                                      ),\n                                    ],\n                                  ),\n                                )\n                              ],\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n              SliverList(\n                delegate: SliverChildBuilderDelegate(\n                  (context, index) => ShowsList(\n                        items: snapshot.data[index].results,\n                        onTap: goToDetail,\n                        title: snapshot.data[index].title,\n                      ),\n                  childCount: snapshot.data.length,\n                ),\n              )\n            ],\n          );\n        } else if (snapshot.hasError) {\n          return Text(snapshot.error.toString());\n        }\n        return Center(\n            child: CircularProgressIndicator(\n          valueColor:\n              AlwaysStoppedAnimation<Color>(Color.fromRGBO(219, 0, 0, 1.0)),\n        ));\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/pages/video/index.dart",
    "content": "part of netflix;\n\nclass Video extends StatefulWidget {\n  final String title;\n  Video({Key key, this.title}) : super(key: key);\n\n  @override\n  VideoState createState() => VideoState();\n}\n"
  },
  {
    "path": "lib/src/pages/video/state.dart",
    "content": "part of netflix;\n\nclass VideoState extends State<Video> {\n  VideoPlayerController vcontroller;\n  bool controlVisible;\n  Timer timer;\n\n  @override\n  void initState() {\n    controlVisible = true;\n    vcontroller = VideoPlayerController.asset('assets/video/promo.mp4');\n    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark.copyWith(\n      statusBarColor: Colors.transparent,\n    ));\n    super.initState();\n    autoHide();\n  }\n\n  @override\n  void deactivate() {\n    super.deactivate();\n  }\n\n  @override\n  void dispose() {\n    vcontroller?.dispose();\n    timer?.cancel();\n    SystemChrome.setPreferredOrientations([\n      DeviceOrientation.portraitDown,\n      DeviceOrientation.portraitUp,\n    ]);\n    super.dispose();\n  }\n\n  void handlerGesture() {\n    setState(() {\n      controlVisible = !controlVisible;\n    });\n    autoHide();\n  }\n\n  void autoHide() {\n    if (controlVisible) {\n      timer = Timer(\n          Duration(seconds: 5), () => setState(() => controlVisible = false));\n    } else {\n      timer?.cancel();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final aspectRatio = 0.75;\n    return Scaffold(\n      backgroundColor: Colors.black,\n      body: Stack(\n        fit: StackFit.expand,\n        children: <Widget>[\n          PlayerLifeCycle(\n            vcontroller,\n            (BuildContext context, VideoPlayerController controller) =>\n                AspectRatio(\n                  aspectRatio: aspectRatio,\n                  child: VideoPlayer(vcontroller),\n                ),\n          ),\n          GestureDetector(\n            child: PlayerControl(\n              vcontroller,\n              visible: controlVisible,\n              title: widget.title,\n            ),\n            onTap: handlerGesture,\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/resources/movie_api_provider.dart",
    "content": "part of netflix;\n\nclass MovieApiProvider {\n  final String host = 'https://your-host';\n  Client client = Client();\n\n  Future<List<ItemModel>> fetchMovieList() async {\n    final response = await client.get('$host/api/Home');\n    if (response.statusCode == 200) {\n      return List.from(json.decode(response.body))\n          .map((m) => ItemModel.fromJson(m))\n          .toList();\n    } else {\n      throw Exception('Failed to load post');\n    }\n  }\n\n  Future<Result> fetchOne(int id) async {\n    final response = await client.get('$host/api/show/$id');\n    if (response.statusCode == 200) {\n      return Result.fromJson(json.decode(response.body));\n    } else {\n      throw Exception('Failed to load post');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/src/resources/repository.dart",
    "content": "part of netflix;\n\nclass Repository {\n  final moviesApiProvider = MovieApiProvider();\n\n  Future<List<ItemModel>> fetchAllMovies() => moviesApiProvider.fetchMovieList();\n  Future<Result> fetchMovie(int id) => moviesApiProvider.fetchOne(id);\n}\n"
  },
  {
    "path": "lib/src/utils/theme/color.dart",
    "content": "part of netflix;\n\nclass Palette {\n  static const Color dune = Color.fromRGBO(40, 38, 35, 1.0);\n  static const Color yellowOrange = Color.fromRGBO(250, 186, 59, 1.0);\n}\n"
  },
  {
    "path": "lib/src/utils/theme/typography.dart",
    "content": "part of netflix;\n\nclass TextTheme {\n  static const TextStyle heading1 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 96.0,\n    letterSpacing: -1.5,\n    fontWeight: FontWeight.w300,\n  );\n  static const TextStyle heading2 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 60.0,\n    letterSpacing: -0.5,\n    fontWeight: FontWeight.w300,\n  );\n  static const TextStyle heading3 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 48.0,\n    letterSpacing: 0.0,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle heading4 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 34.0,\n    letterSpacing: 0.25,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle heading5 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 24.0,\n    letterSpacing: 0.0,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle heading6 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 20.0,\n    letterSpacing: 0.15,\n    fontWeight: FontWeight.w600,\n  );\n  static const TextStyle subtitle1 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 16.0,\n    letterSpacing: 0.15,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle subtitle2 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 14.0,\n    letterSpacing: 0.1,\n    fontWeight: FontWeight.w600,\n  );\n  static const TextStyle body1 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 16.0,\n    letterSpacing: 0.5,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle body2 = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 14.0,\n    letterSpacing: 0.25,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle button = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 14.0,\n    letterSpacing: 1.25,\n    fontWeight: FontWeight.w600,\n  );\n  static const TextStyle caption = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 12.0,\n    letterSpacing: 0.4,\n    fontWeight: FontWeight.w400,\n  );\n  static const TextStyle overline = TextStyle(\n    fontFamily: 'GoogleSans',\n    fontSize: 10.0,\n    letterSpacing: 1.5,\n    fontWeight: FontWeight.w400,\n  );\n}\n"
  },
  {
    "path": "lib/src/widgets/player-controls/index.dart",
    "content": "part of netflix;\n\nclass PlayerControl extends StatefulWidget {\n  final VideoPlayerController controller;\n  final String title;\n  final bool visible;\n\n  PlayerControl(this.controller, {this.visible, this.title, Key key}) : super(key: key);\n\n  @override\n  PlayerControlState createState() => PlayerControlState();\n}\n"
  },
  {
    "path": "lib/src/widgets/player-controls/state.dart",
    "content": "part of netflix;\n\nclass PlayerControlState extends State<PlayerControl> {\n  VideoPlayerController get controller => widget.controller;\n  String get title => widget.title ?? '';\n  bool get visible => widget.visible ?? false;\n\n  @override\n  void initState() {\n    super.initState();\n    Timer(Duration(milliseconds: 500), init);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n  }\n\n  void init() {\n    if (mounted)\n      controller.addListener(() {\n        setState(() {});\n      });\n  }\n\n  void replay(double min, double current) {\n    double anchor = current - 10000;\n    controller\n        .seekTo(Duration(milliseconds: (anchor < min ? min : anchor).round()));\n  }\n\n  void forward(double max, double current) {\n    double anchor = current + 10000;\n    controller\n        .seekTo(Duration(milliseconds: (anchor > max ? max : anchor).round()));\n  }\n\n  void playcontinue() {\n    if (controller.value.isPlaying) {\n      controller.pause();\n    } else {\n      controller.play();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Duration duration = controller != null &&\n            controller.value != null &&\n            controller.value.duration != null\n        ? controller.value.duration\n        : null;\n    Duration position = controller != null && controller.value != null\n        ? controller.value.position\n        : null;\n    int timeDuration = duration != null && position != null\n        ? duration.inMilliseconds - position.inMilliseconds\n        : 0;\n    Duration timeline = duration != null && position != null\n        ? Duration(milliseconds: (timeDuration < 0 ? 0 : timeDuration))\n        : null;\n    String durationText =\n        timeline != null ? timeline.toString().split('.').first : '';\n    final Size screenSize = MediaQuery.of(context).size;\n    double currentValue = position != null\n        ? controller.value.position.inMilliseconds?.toDouble() ?? 0.0\n        : 0.0;\n    final double minValue = 0.0;\n    double maxValue = duration != null\n        ? controller.value.duration.inMilliseconds?.toDouble()\n        : 0.0;\n    return AnimatedContainer(\n      duration: Duration(milliseconds: 500),\n      height: screenSize.height,\n      width: screenSize.width,\n      color: Color.fromRGBO(0, 0, 0, 0.3),\n      padding:\n          EdgeInsets.only(bottom: 20.0, left: 20.0, right: 20.0, top: 10.0),\n      child: Opacity(\n        opacity: visible ? 1 : 0,\n        child: visible\n            ? Column(\n                mainAxisSize: MainAxisSize.min,\n                mainAxisAlignment: MainAxisAlignment.end,\n                children: <Widget>[\n                  Container(\n                    width: screenSize.width,\n                    height: 30.0,\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.center,\n                      children: <Widget>[\n                        IconButton(\n                          padding: EdgeInsets.all(0.0),\n                          color: Colors.white,\n                          icon: Icon(Icons.arrow_back),\n                          onPressed: () => Application.router.pop(context),\n                        ),\n                        Container(\n                          width: screenSize.width - 100.0,\n                          child: Center(\n                            child: Text(\n                              title,\n                              style: TextStyle(\n                                color: Colors.white,\n                                fontSize: 14.0,\n                              ),\n                            ),\n                          ),\n                        )\n                      ],\n                    ),\n                  ),\n                  Container(\n                    width: screenSize.width,\n                    height: 268.0,\n                    child: Row(\n                      crossAxisAlignment: CrossAxisAlignment.center,\n                      mainAxisAlignment: MainAxisAlignment.spaceAround,\n                      children: <Widget>[\n                        IconButton(\n                          color: Colors.white,\n                          iconSize: 40.0,\n                          icon: Icon(Icons.replay_10),\n                          onPressed: () => replay(minValue, currentValue),\n                        ),\n                        IconButton(\n                          color: Colors.white,\n                          iconSize: 80.0,\n                          icon: Icon(controller.value.isPlaying\n                              ? Icons.pause\n                              : Icons.play_arrow),\n                          onPressed: playcontinue,\n                        ),\n                        IconButton(\n                          color: Colors.white,\n                          iconSize: 40.0,\n                          icon: Icon(Icons.forward_10),\n                          onPressed: () => forward(maxValue, currentValue),\n                        )\n                      ],\n                    ),\n                  ),\n                  Row(\n                    mainAxisSize: MainAxisSize.max,\n                    children: <Widget>[\n                      Container(\n                        width: screenSize.width - 90.0,\n                        child: Slider(\n                          activeColor: Color.fromRGBO(219, 0, 0, 1.0),\n                          inactiveColor: Color.fromRGBO(86, 77, 77, 1.0),\n                          value:\n                              currentValue > maxValue ? maxValue : currentValue,\n                          onChanged: (double value) => controller\n                              .seekTo(Duration(milliseconds: value.round())),\n                          min: minValue,\n                          max: maxValue,\n                        ),\n                      ),\n                      Text(\n                        durationText,\n                        style: TextStyle(fontSize: 12.0, color: Colors.white),\n                      )\n                    ],\n                  ),\n                ],\n              )\n            : Container(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/widgets/player-life-cycle/index.dart",
    "content": "part of netflix;\n\ntypedef Widget VideoWidgetBuilder(\n    BuildContext context, VideoPlayerController controller);\n\nclass PlayerLifeCycle extends StatefulWidget {\n  final VideoPlayerController controller;\n  final VideoWidgetBuilder childBuilder;\n\n  PlayerLifeCycle(this.controller, this.childBuilder, {Key key})\n      : super(key: key);\n\n  @override\n  PlayerLifeCycleState createState() => PlayerLifeCycleState();\n}\n"
  },
  {
    "path": "lib/src/widgets/player-life-cycle/state.dart",
    "content": "part of netflix;\n\nclass PlayerLifeCycleState extends State<PlayerLifeCycle> {\n  VideoPlayerController get controller => widget.controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller.addListener(() {\n      if (controller.value.hasError) {\n        print(controller.value.errorDescription);\n      }\n    });\n    controller.initialize();\n    controller.setLooping(false);\n    controller.play();\n  }\n\n  @override\n  void deactivate() {\n    super.deactivate();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return widget.childBuilder(context, controller);\n  }\n}\n"
  },
  {
    "path": "lib/src/widgets/tvshow-list/index.dart",
    "content": "part of netflix;\n\nclass ShowsList extends StatelessWidget {\n  final ScrollController controller = ScrollController();\n  final String title;\n  final List<Result> items;\n  final Function onTap;\n\n  ShowsList({\n    this.title,\n    this.items,\n    this.onTap,\n  });\n\n  List<Widget> renderItems() {\n    return items.map((item) {\n      return InkWell(\n        onTap: () => onTap(item, 99),\n        child: Container(\n          margin: EdgeInsets.symmetric(horizontal: 2.5),\n          width: 120.0,\n          height: 140.0,\n          child: Image.network(item.image, fit: BoxFit.cover),\n        ),\n      );\n    }).toList();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Container(\n      margin: new EdgeInsets.only(top: 8.0),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        mainAxisAlignment: MainAxisAlignment.start,\n        children: <Widget>[\n          Text(\n            title,\n            textAlign: TextAlign.start,\n            style: TextStyle(color: Colors.white),\n          ),\n          SingleChildScrollView(\n            controller: controller,\n            scrollDirection: Axis.horizontal,\n            child: Row(\n              children: renderItems(),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: netflix_clone\ndescription: A new Flutter project.\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.0.0-dev.68.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  cupertino_icons: ^0.1.2\n  rxdart: ^0.20.0\n  http: ^0.12.0\n  video_player: ^0.8.0\n  fluro:\n    git: https://github.com/devdennysegura/fluro.git\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\nflutter:\n  uses-material-design: true\n  assets:\n   - assets/images/1.jpg\n   - assets/images/2.jpg\n   - assets/images/3.jpg\n   - assets/images/default-image.png\n   - assets/images/Netflix-logo.png\n   - assets/images/netflix_icon.png\n   - assets/images/1.5x/netflix_icon.png\n   - assets/images/2.0x/netflix_icon.png\n   - assets/images/3.0x/netflix_icon.png\n   - assets/images/4.0x/netflix_icon.png\n   - assets/images/user.png\n   - assets/video/promo.mp4\n  fonts:\n    - family: GoogleSans\n      fonts:\n        - asset: assets/fonts/product-sans/regular.ttf\n          weight: 400\n        - asset: assets/fonts/product-sans/bold.ttf\n          weight: 700\n        - asset: assets/fonts/product-sans/bold-italic.ttf\n          style: italic\n          weight: 700\n        - asset: assets/fonts/product-sans/medium.ttf\n          weight: 600\n        - asset: assets/fonts/product-sans/medium-italic.ttf\n          style: italic\n          weight: 600\n        - asset: assets/fonts/product-sans/italic.ttf\n          style: italic\n"
  },
  {
    "path": "test/widget_test.dart",
    "content": "// // This is a basic Flutter widget test.\n// //\n// // To perform an interaction with a widget in your test, use the WidgetTester\n// // utility that Flutter provides. For example, you can send tap and scroll\n// // gestures. You can also use WidgetTester to find child widgets in the widget\n// // tree, read text, and verify that the values of widget properties are correct.\n\n// import 'package:flutter/material.dart';\n// import 'package:flutter_test/flutter_test.dart';\n\n// import 'package:netflix_clone/main.dart';\n\n// void main() {\n//   testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n//     // Build our app and trigger a frame.\n//     await tester.pumpWidget(MyApp());\n\n//     // Verify that our counter starts at 0.\n//     expect(find.text('0'), findsOneWidget);\n//     expect(find.text('1'), findsNothing);\n\n//     // Tap the '+' icon and trigger a frame.\n//     await tester.tap(find.byIcon(Icons.add));\n//     await tester.pump();\n\n//     // Verify that our counter has incremented.\n//     expect(find.text('0'), findsNothing);\n//     expect(find.text('1'), findsOneWidget);\n//   });\n// }\n"
  }
]