[
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Github Actions\n\non:\n  schedule:\n    - cron: \"0 0 * * 1\"\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        format: [darwin-dmg, darwin-pkg, darwin, linux-appimage, linux-deb, linux-pkg, linux-rpm, linux-snap, linux, windows-msi, windows]\n    container:\n      image: goflutter/hover:v0.47.2\n\n    steps:\n      - name: Update flutter\n        run: |\n          apt-get update\n          apt-get install -y unzip\n          flutter upgrade\n      - uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n      - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*\n      - name: Run `hover build ${{ matrix.format }}`\n        run: |\n          cd $GITHUB_WORKSPACE\n          export VERSION_NAME=$(git describe --tags $(git rev-list --tags --max-count=1))\n          cd stocks && hover build ${{ matrix.format }} --version-number ${VERSION_NAME} --debug\n          ls -lah ./go/build/outputs/${{ matrix.format }}-debug_unopt/*\n      - uses: actions/upload-artifact@v2\n        with:\n          name: ${{ matrix.format }}\n          path: stocks/go/build/outputs/${{ matrix.format }}-debug_unopt/*\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\n*.iml\n.flutter-plugins-dependencies\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "stages:\n  - build\n\n# .hoverBuildPackaged is a template job that we re-use for a number of concrete\n# build jobs. This allows us to have a single job definition that is re-used for\n# all the separate targets.\n.hoverBuildPackaged:\n  stage: build\n  image: goflutter/hover:v0.47.2\n  cache:\n    key: one-key-4-all\n    paths:\n      - /root/.pub-cache\n      - /root/.cache/go-build\n  script:\n    - declare -x VERSION_NAME=$(git describe --tags | sed 's/-//g')\n    - cd stocks && hover build ${PACKAGING_TYPE} --version-number ${VERSION_NAME}\n  artifacts:\n    paths:\n      - stocks/go/build/outputs/${PACKAGING_TYPE}\n    expire_in: 20 weeks\n\n## Build\n\nbuild:darwin-dmg:\n  variables:\n    PACKAGING_TYPE: darwin-dmg\n  extends: .hoverBuildPackaged\n\nbuild:darwin-pkg:\n  variables:\n    PACKAGING_TYPE: darwin-pkg\n  extends: .hoverBuildPackaged\n\nbuild:linux-appimage:\n  variables:\n    PACKAGING_TYPE: linux-appimage\n  extends: .hoverBuildPackaged\n\nbuild:linux-deb:\n  variables:\n    PACKAGING_TYPE: linux-deb\n  extends: .hoverBuildPackaged\n\nbuild:linux-rpm:\n  variables:\n    PACKAGING_TYPE: linux-rpm\n  extends: .hoverBuildPackaged\n\nbuild:linux-pkg:\n  variables:\n    PACKAGING_TYPE: linux-pkg\n  extends: .hoverBuildPackaged\n\nbuild:linux-snap:\n  variables:\n    PACKAGING_TYPE: linux-snap\n  extends: .hoverBuildPackaged\n\nbuild:windows-msi:\n  variables:\n    PACKAGING_TYPE: windows-msi\n  extends: .hoverBuildPackaged\n"
  },
  {
    "path": "README.md",
    "content": "# go-flutter-desktop/examples\n\nThis repository contains some example applications that can be built using [go-flutter](https://github.com/go-flutter-desktop/go-flutter).\n\n## Compiled example ![Github Actions](https://github.com/go-flutter-desktop/examples/workflows/Github%20Actions/badge.svg)  \nPre-compiled examples are available as [Github action](https://github.com/go-flutter-desktop/examples/actions) artifacts.  \n\n## Getting started\n\n### Install dependencies\n\nYou'll need to have the following tools installed on your machine.\n\n- [flutter](https://flutter.dev)\n- [go](https://golang.org)\n- [hover](https://github.com/go-flutter-desktop/hover)\n\n### Run the example\n\n```bash\ngit clone https://github.com/go-flutter-desktop/examples.git\ncd examples/[.....] # select an example project\nhover run\n```\n\n## Issues\n\nPlease report issues at the [go-flutter issue tracker](https://github.com/go-flutter-desktop/go-flutter/issues/).\n"
  },
  {
    "path": "draggable_borderless/.gitignore",
    "content": "# Miscellaneous\n*.class\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# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\n/build/\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": "draggable_borderless/.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: bc7bc940836f1f834699625426795fd6f07c18ec\n  channel: beta\n\nproject_type: app\n"
  },
  {
    "path": "draggable_borderless/README.md",
    "content": "# draggable_borderless\n\nA [go-flutter-desktop](https://github.com/go-flutter-desktop/go-flutter/wiki/Plugin-info) GLFW plugin example.  \nIn this example we are answering issue [#214](https://github.com/go-flutter-desktop/go-flutter/issues/214): *\"how to drag undecorated window\".*  \n\ngo-flutter has multiples [option](https://github.com/go-flutter-desktop/go-flutter/wiki/Options), one of them been [`flutter.WindowMode(flutter.WindowModeBorderless)`](https://github.com/go-flutter-desktop/examples/blob/f6eddd4e0051944ab41b0a9e12d8a4a0d0af2fdd/draggable_borderless/desktop/cmd/options.go#L11).  \nThis example uses this option, which hide the window decoration (title bar, close/maximize/.. buttons) making the window un-draggable using 'classic' mouse interaction. \n\nTo solve this limitation a [`GLFW-Plugin`](https://github.com/go-flutter-desktop/go-flutter/wiki/GLFW-Plugin-example) has been written.\n\nThe GLFW answer comes from https://stackoverflow.com/a/46205940 with a little\ntwist.  \nThe window is only draggable from the [Flutter AppBar](https://api.flutter.dev/flutter/material/AppBar-class.html) widget.\n\nThe source code of the plugin has been placed directly in the [`go/cmd/options.go`](./go/cmd/options.go) file.  \nA custom `AppBar` widget has been created, the source code is available in the\n[`lib/main_desktop.dart`](./lib/main_desktop.dart) file.\n\n## Demo\n<p align=\"center\">\n  <img src=\"./app_bar_drag.gif\" width=\"650\" align=\"center\" alt=\"Demo of the\n  example\">\n</p>\n"
  },
  {
    "path": "draggable_borderless/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "draggable_borderless/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "draggable_borderless/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n\t\"github.com/go-gl/glfw/v3.3/glfw\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(400, 300),\n\tflutter.WindowMode(flutter.WindowModeBorderless),\n\tflutter.AddPlugin(&AppBarDraggable{}),\n}\n\n// AppBarDraggable is a plugin that makes moving the bordreless window possible\ntype AppBarDraggable struct {\n\twindow           *glfw.Window\n\tcursorPosY       int\n\tcursorPosX       int\n}\n\nvar _ flutter.Plugin = &AppBarDraggable{}     // compile-time type check\nvar _ flutter.PluginGLFW = &AppBarDraggable{} // compile-time type check\n// AppBarDraggable struct must implement InitPlugin and InitPluginGLFW\n\n// InitPlugin creates a MethodChannel for \"samples.go-flutter.dev/draggable\"\nfunc (p *AppBarDraggable) InitPlugin(messenger plugin.BinaryMessenger) error {\n\tchannel := plugin.NewMethodChannel(messenger, \"samples.go-flutter.dev/draggable\", plugin.StandardMethodCodec{})\n\tchannel.HandleFunc(\"onPanStart\", p.onPanStart)\n\tchannel.HandleFuncSync(\"onPanUpdate\", p.onPanUpdate) // MUST RUN ON THE MAIN THREAD (use of HandleFuncSync)\n\tchannel.HandleFunc(\"onClose\", p.onClose)\n\treturn nil\n}\n\n// InitPluginGLFW is used to gain control over the glfw.Window\nfunc (p *AppBarDraggable) InitPluginGLFW(window *glfw.Window) error {\n\tp.window = window\n\treturn nil\n}\n\n// onPanStart/onPanUpdate a golang / flutter implemantation of:\n// \"GLFW how to drag undecorated window without lag\"\n// https://stackoverflow.com/a/46205940\nfunc (p *AppBarDraggable) onPanStart(arguments interface{}) (reply interface{}, err error) {\n\targumentsMap := arguments.(map[interface{}]interface{})\n\tp.cursorPosX = int(argumentsMap[\"dx\"].(float64))\n\tp.cursorPosY = int(argumentsMap[\"dy\"].(float64))\n\treturn nil, nil\n}\n\n// onPanUpdate calls GLFW functions that aren't thread safe.\n// to run function on the main go-flutter thread, use HandleFuncSync instead of HandleFunc!\nfunc (p *AppBarDraggable) onPanUpdate(arguments interface{}) (reply interface{}, err error) {\n\txpos, ypos := p.window.GetCursorPos() // This function must only be called from the main thread.\n\tdeltaX := int(xpos) - p.cursorPosX\n\tdeltaY := int(ypos) - p.cursorPosY\n\n\tx, y := p.window.GetPos()           // This function must only be called from the main thread.\n\tp.window.SetPos(x+deltaX, y+deltaY) // This function must only be called from the main thread.\n\n\treturn nil, nil\n}\n\nfunc (p *AppBarDraggable) onClose(arguments interface{}) (reply interface{}, err error) {\n\t// This function may be called from any thread. Access is not synchronized.\n\tp.window.SetShouldClose(true)\n\treturn nil, nil\n}\n"
  },
  {
    "path": "draggable_borderless/go/go.mod",
    "content": "module draggable_borderless/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "draggable_borderless/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 h1:ddtotcEXIT7dFhSeXIWjK8YMFYl5bB2NdYQwgv6Uqjk=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "draggable_borderless/go/hover.yaml",
    "content": "#application-name: \"draggable_borderless\" # Uncomment to modify this value.\n#executable-name: \"draggable_borderless\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"draggableborderless\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "draggable_borderless/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/services.dart';\n\nvoid main() {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  runApp(MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      debugShowCheckedModeBanner: false,\n      title: 'Flutter Code Sample for widgets.Listener',\n      theme: ThemeData(\n        // If the host is missing some fonts, it can cause the\n        // text to not be rendered or worse the app might crash.\n        fontFamily: 'Roboto',\n        primarySwatch: Colors.blue,\n      ),\n      home: Scaffold(\n        appBar: DraggebleAppBar(title: \"Draggable borderless\"),\n        body: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: <Widget>[\n              Text(\n                'Select the AppBar to drag the window',\n                style: TextStyle(fontSize: 18),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass DraggebleAppBar extends StatelessWidget implements PreferredSizeWidget {\n  static const platform_channel_draggable =\n      MethodChannel('samples.go-flutter.dev/draggable');\n\n  AppBar appBar;\n\n  DraggebleAppBar({@required String title}) {\n    this.appBar = AppBar(\n      title: Text(title),\n      actions: <Widget>[\n        new IconButton(\n          icon: new Icon(Icons.close),\n          onPressed: () async =>\n              await platform_channel_draggable.invokeMethod(\"onClose\"),\n        ),\n      ],\n      leading: new Container(),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n        child: appBar, onPanStart: onPanStart, onPanUpdate: onPanUpdate);\n  }\n\n  @override\n  Size get preferredSize => new Size.fromHeight(kToolbarHeight);\n\n  void onPanUpdate(DragUpdateDetails details) async {\n    await platform_channel_draggable.invokeMethod('onPanUpdate');\n  }\n\n  void onPanStart(DragStartDetails details) async {\n    await platform_channel_draggable.invokeMethod('onPanStart',\n        {\"dx\": details.globalPosition.dx, \"dy\": details.globalPosition.dy});\n  }\n}\n"
  },
  {
    "path": "draggable_borderless/pubspec.yaml",
    "content": "name: draggable_borderless\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.2.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  # assets:\n  #  - images/a_dot_burr.jpeg\n  #  - images/a_dot_ham.jpeg\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "keyboard_event/.gitignore",
    "content": "# Miscellaneous\n*.class\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/\n/build/\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": "keyboard_event/README.md",
    "content": "# keyboard_event\n\nA [`RawKeyEvent`](https://api.flutter.dev/flutter/services/RawKeyEvent-class.html) go-flutter-desktop example.\n\n\n## Demo\n<p align=\"center\">\n  <img src=\"./keyboard_event.gif\" width=\"650\" align=\"center\" alt=\"Demo of the\n  example\">\n</p>\n\n\n"
  },
  {
    "path": "keyboard_event/fonts/Roboto/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "keyboard_event/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "keyboard_event/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "keyboard_event/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(800, 1280),\n}\n"
  },
  {
    "path": "keyboard_event/go/go.mod",
    "content": "module keyboard_event/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "keyboard_event/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "keyboard_event/go/hover.yaml",
    "content": "#application-name: \"keyboard_event\" # Uncomment to modify this value.\n#executable-name: \"keyboard_event\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"keyboardevent\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "keyboard_event/lib/app.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Code Sample for Keyboard event',\n      theme: ThemeData(\n        // If the host is missing some fonts, it can cause the\n        // text to not be rendered or worse the app might crash.\n        fontFamily: 'Roboto',\n        primarySwatch: Colors.blue,\n      ),\n      home: KeyboardTestPage(),\n    );\n  }\n}\n\n/// Keyboard test page for the example application.\nclass KeyboardTestPage extends StatefulWidget {\n  @override\n  State<StatefulWidget> createState() {\n    return _KeyboardTestPageState();\n  }\n}\n\nclass _KeyboardTestPageState extends State<KeyboardTestPage> {\n  final List<String> _messages = [];\n\n  final FocusNode _focusNode = FocusNode();\n  final ScrollController _scrollController = new ScrollController();\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    FocusScope.of(context).requestFocus(_focusNode);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: AppBar(\n        title: new Text('Keyboard events test'),\n      ),\n      body: new RawKeyboardListener(\n        focusNode: _focusNode,\n        onKey: onKeyEvent,\n        child: Container(\n          padding: EdgeInsets.symmetric(horizontal: 16.0),\n          child: SingleChildScrollView(\n              controller: _scrollController,\n              child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: _messages.map((m) => new Text(m)).toList())),\n        ),\n      ),\n    );\n  }\n\n  void onKeyEvent(RawKeyEvent event) {\n    bool isKeyDown;\n    switch (event.runtimeType) {\n      case RawKeyDownEvent:\n        isKeyDown = true;\n        break;\n      case RawKeyUpEvent:\n        isKeyDown = false;\n        break;\n      default:\n        throw new Exception('Unexpected runtimeType of RawKeyEvent');\n    }\n\n    _addMessage(\n        '${event.data.runtimeType} - ${isKeyDown ? 'KeyDown' : 'KeyUp'}:\\n- Modifiers: ${event.data.modifiersPressed}\\n- KeyLabel: ${event.data.keyLabel}\\n- physicalKey: ${event.data.physicalKey}\\n- logicalkey: ${event.data.logicalKey}\\n- character: ${event.character}');\n  }\n\n  void _addMessage(String message) {\n    setState(() {\n      _messages.add(message);\n    });\n    SchedulerBinding.instance.addPostFrameCallback((_) {\n      _scrollController.jumpTo(\n        _scrollController.position.maxScrollExtent,\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "keyboard_event/lib/main.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'package:keyboard_event/app.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "keyboard_event/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.dart';\n\nimport 'package:keyboard_event/app.dart';\n\nvoid main() {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "keyboard_event/pubspec.yaml",
    "content": "name: keyboard_event\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  fonts:\n    - family: Roboto\n      fonts:\n        - asset: fonts/Roboto/Roboto-Thin.ttf\n          weight: 100\n        - asset: fonts/Roboto/Roboto-Light.ttf\n          weight: 300\n        - asset: fonts/Roboto/Roboto-Regular.ttf\n          weight: 400\n        - asset: fonts/Roboto/Roboto-Medium.ttf\n          weight: 500\n        - asset: fonts/Roboto/Roboto-Bold.ttf\n          weight: 700\n        - asset: fonts/Roboto/Roboto-Black.ttf\n          weight: 900\n"
  },
  {
    "path": "plugin_tutorial/.gitignore",
    "content": "# Miscellaneous\n*.class\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/\n/build/\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": "plugin_tutorial/README.md",
    "content": "# plugin_tutorial\n\nA detailed tutorial for developing plugins is available at: [go-flutter wiki](https://github.com/go-flutter-desktop/go-flutter/wiki/Implement-a-plugin).\n\nThe plugins source code is stored in the same example: [./go-plugin-example](./go-plugin-example)\n"
  },
  {
    "path": "plugin_tutorial/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "plugin_tutorial/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "plugin_tutorial/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/plugins/go-plugin-example/battery\"\n\t\"github.com/go-flutter-desktop/plugins/go-plugin-example/complex\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(100, 100),\n\tflutter.PopBehavior(flutter.PopBehaviorClose), // on SystemNavigator.pop() closes the app\n\tflutter.AddPlugin(&battery.MyBatteryPlugin{}), // our wiki plugin\n\tflutter.AddPlugin(&complex.Example{}),         // another example\n}\n"
  },
  {
    "path": "plugin_tutorial/go/go.mod",
    "content": "module plugin_tutorial/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-flutter-desktop/plugins/go-plugin-example/battery 01528a4714a5\n\tgithub.com/go-flutter-desktop/plugins/go-plugin-example/complex 01528a4714a5\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n\nreplace github.com/go-flutter-desktop/plugins/go-plugin-example/battery => ../go-plugin-example/battery\n\nreplace github.com/go-flutter-desktop/plugins/go-plugin-example/complex => ../go-plugin-example/complex\n"
  },
  {
    "path": "plugin_tutorial/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "plugin_tutorial/go/hover.yaml",
    "content": "#application-name: \"plugin_tutorial\" # Uncomment to modify this value.\n#executable-name: \"plugin_tutorial\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"plugintutorial\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/battery/go.mod",
    "content": "module github.com/go-flutter-desktop/plugins/go-plugin-example/battery\n\ngo 1.19\n\nrequire github.com/go-flutter-desktop/go-flutter v0.52.2\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/battery/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/battery/main.go",
    "content": "package battery\n\nimport (\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n)\n\n//  Make sure to use the same channel name as was used on the Flutter client side.\nconst channelName = \"samples.flutter.dev/battery\"\n\n// MyBatteryPlugin demonstrates how to call a platform-specific API to retrieve\n// the current battery level.\n//\n// This example matches the guide example available on:\n// https://flutter.dev/docs/development/platform-integration/platform-channels\ntype MyBatteryPlugin struct{}\n\nvar _ flutter.Plugin = &MyBatteryPlugin{} // compile-time type check\n\n// InitPlugin creates a MethodChannel and set a HandleFunc to the\n// shared 'getBatteryLevel' method.\n// https://godoc.org/github.com/go-flutter-desktop/go-flutter/plugin#MethodChannel\n//\n// The plugin is using a MethodChannel through the StandardMethodCodec.\n//\n// You can also use the more basic BasicMessageChannel, which supports basic,\n// asynchronous message passing using a custom message codec.\n// You can also use the specialized BinaryCodec, StringCodec, and JSONMessageCodec\n// struct, or create your own codec.\n//\n// The JSONMessageCodec was deliberately left out because in Go its better to\n// decode directly to known structs.\nfunc (p *MyBatteryPlugin) InitPlugin(messenger plugin.BinaryMessenger) error {\n\tchannel := plugin.NewMethodChannel(messenger, channelName, plugin.StandardMethodCodec{})\n\tchannel.HandleFunc(\"getBatteryLevel\", handleGetBatteryLevel)\n\treturn nil // no error\n}\n\n// handleGetBatteryLevel is called when the method getBatteryLevel is invoked by\n// the dart code.\n// The function returns a fake battery level, without raising an error.\n//\n// Supported return types of StandardMethodCodec codec are described in a table:\n// https://godoc.org/github.com/go-flutter-desktop/go-flutter/plugin#StandardMessageCodec\nfunc handleGetBatteryLevel(arguments interface{}) (reply interface{}, err error) {\n\tbatteryLevel := int32(55) // Your platform-specific API\n\treturn batteryLevel, nil\n}\n"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/complex/go.mod",
    "content": "module github.com/go-flutter-desktop/plugins/go-plugin-example/complex\n\ngo 1.19\n\nrequire github.com/go-flutter-desktop/go-flutter v0.52.2\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/complex/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/complex/main.go",
    "content": "package complex\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n)\n\n// Example demonstrates how to call a platform-specific API to retrieve\n// a complex data structure\ntype Example struct {\n\tchannel *plugin.MethodChannel\n}\n\nvar _ flutter.Plugin = &Example{}\n\n// InitPlugin creates a MethodChannel and set a HandleFunc to the\n// shared 'getData' method.\nfunc (p *Example) InitPlugin(messenger plugin.BinaryMessenger) error {\n\tp.channel = plugin.NewMethodChannel(messenger, \"instance.id/go/data\", plugin.StandardMethodCodec{})\n\tp.channel.HandleFunc(\"getData\", getRemotesFunc)\n\tp.channel.HandleFunc(\"mutualCall\", p.mutualCall)\n\tp.channel.HandleFunc(\"getError\", getErrorFunc)\n\tp.channel.CatchAllHandleFunc(catchAllTest)\n\n\treturn nil\n}\n\n// mutualCall is attached to the plugin struct\nfunc (p *Example) mutualCall(arguments interface{}) (reply interface{}, err error) {\n\tgo func() {\n\t\ttime.Sleep(3 * time.Second)\n\t\tif rep, err := p.channel.InvokeMethodWithReply(\"InvokeMethodWithReply\", \"text_from_golang\"); err != nil {\n\t\t\tlog.Println(\"InvokeMethod error:\", err)\n\t\t} else {\n\t\t\tif rep.(string) != \"text_from_dart\" {\n\t\t\t\tlog.Println(\"InvokeMethod error: rep.(string) != \\\"text_from_dart\\\"\")\n\t\t\t\tos.Exit(1)\n\t\t\t}\n\t\t}\n\t}()\n\n\tif arguments.(string) != \"hello_from_dart\" {\n\t\tlog.Println(\"InvokeMethod error: arguments.(string) !=  \\\"hello_from_dart\\\"\")\n\t\tos.Exit(1)\n\t}\n\n\treturn \"hello_from_go\", nil\n}\n\nfunc catchAllTest(methodCall interface{}) (reply interface{}, err error) {\n\tmethod := methodCall.(plugin.MethodCall)\n\t// return the randomized Method Name\n\treturn method.Method, nil\n}\n\nfunc getRemotesFunc(arguments interface{}) (reply interface{}, err error) {\n\tdartMsg := arguments.(string) // reading the string argument\n\tif dartMsg != \"HelloFromDart\" {\n\t\treturn nil, errors.New(\"wrong message value, expecting 'HelloFromDart' got '\" + dartMsg + \"'\")\n\t}\n\n\tvar sectionList = make([]interface{}, 4)\n\tsectionList[0] = map[interface{}]interface{}{\n\t\t\"instanceid\": int32(1023),\n\t\t\"pcbackup\":   \"test\",\n\t\t\"brbackup\":   \"test2\",\n\t}\n\tsectionList[1] = map[interface{}]interface{}{\n\t\t\"instanceid\": int32(1024),\n\t\t\"pcbackup\":   \"test\",\n\t\t\"brbackup\":   \"test2\",\n\t}\n\n\tsectionList[2] = map[interface{}]interface{}{\n\t\t\"instanceid\": int32(1056),\n\t\t\"pcbackup\":   \"coucou\",\n\t\t\"brbackup\":   \"coucou2\",\n\t}\n\n\tsectionList[3] = map[interface{}]interface{}{\n\t\t\"instanceid\": int32(3322),\n\t\t\"pcbackup\":   \"finaly\",\n\t\t\"brbackup\":   \"finaly2\",\n\t}\n\n\treturn sectionList, nil\n}\n\nfunc getErrorFunc(arguments interface{}) (reply interface{}, err error) {\n\treturn nil, plugin.NewError(\"customErrorCode\", errors.New(\"Some error\"))\n}\n"
  },
  {
    "path": "plugin_tutorial/lib/main_desktop.dart",
    "content": "import 'package:flutter/services.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'dart:math';\nimport 'dart:async' as async;\n\n// The client and host sides of a channel are connected through\n// a channel name passed in the channel constructor.\nconst platform_channel_battery =\n    const MethodChannel('samples.flutter.dev/battery');\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  // Example from the WIKI\n  //\n  test('Test Battery Plugin result', () async {\n    // Invoke a method on the method channel, specifying the concrete\n    // method to call via the String identifier.\n    final int result =\n        await platform_channel_battery.invokeMethod('getBatteryLevel');\n    expect(result, 55);\n\n    final String batteryLevel = '          -- Battery level at $result % .';\n    print(batteryLevel);\n  });\n\n  group('Complex plugin', () {\n    const platform_complex_structure =\n        const MethodChannel('instance.id/go/data');\n\n    // A more complicated plugin\n    test('Test StandardMethodCodec array of map', () async {\n      final List<dynamic> result =\n          await platform_complex_structure.invokeMethod('getData',\n              \"HelloFromDart\"); // passing \"HelloFromDart\" as an argument\n      expect(result, [\n        {\"instanceid\": 1023, \"pcbackup\": \"test\", \"brbackup\": \"test2\"},\n        {\"instanceid\": 1024, \"pcbackup\": \"test\", \"brbackup\": \"test2\"},\n        {\"instanceid\": 1056, \"pcbackup\": \"coucou\", \"brbackup\": \"coucou2\"},\n        {\"instanceid\": 3322, \"pcbackup\": \"finaly\", \"brbackup\": \"finaly2\"}\n      ]);\n    });\n\n    test('Test golang InvokeMethodWithReply', () async {\n      var method;\n      var arguments;\n      async.Completer completer = new async.Completer();\n\n      platform_complex_structure.setMethodCallHandler((MethodCall call) async {\n        method = call.method;\n        arguments = call.arguments;\n        completer.complete();\n        return \"text_from_dart\";\n      });\n\n      // Triggers the above setMethodCallHandler handler\n      var result = await platform_complex_structure.invokeMethod(\n          'mutualCall', 'hello_from_dart');\n      expect(result, \"hello_from_go\");\n\n      await completer.future;\n\n      expect(method, \"InvokeMethodWithReply\");\n      expect(arguments, \"text_from_golang\");\n    });\n\n    test('Custom errors', () async {\n      var matcher = predicate(\n          (e) => e is PlatformException && e.code == \"customErrorCode\");\n      expect(\n        platform_complex_structure.invokeMethod('getError'),\n        throwsA(matcher),\n      );\n    });\n\n    test('Test golang CatchAllHandleFunc', () async {\n      // golang can return the random methodName\n      final String methodName =\n          'test/' + new Random().nextInt(100000).toString();\n      final String resultPathPrefix =\n          await platform_complex_structure.invokeMethod(methodName);\n      expect(resultPathPrefix, methodName);\n    });\n  });\n\n  tearDownAll(() async {\n    SystemNavigator.pop(); // close the app\n  });\n}\n"
  },
  {
    "path": "plugin_tutorial/pubspec.yaml",
    "content": "name: plugin_tutorial\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.2.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n"
  },
  {
    "path": "pointer_demo/.gitignore",
    "content": "# Miscellaneous\n*.class\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/\n/build/\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": "pointer_demo/README.md",
    "content": "# pointer_demo\n\nA new go-flutter-desktop example.\n\n\n## Demo\n<p align=\"center\">\n  <img src=\"./hover.gif\" width=\"650\" align=\"center\" alt=\"Demo of the\n  example\">\n</p>\n\n\n"
  },
  {
    "path": "pointer_demo/fonts/Roboto/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "pointer_demo/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "pointer_demo/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "pointer_demo/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(800, 1280),\n}\n"
  },
  {
    "path": "pointer_demo/go/go.mod",
    "content": "module pointer_demo/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "pointer_demo/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "pointer_demo/go/hover.yaml",
    "content": "#application-name: \"pointer_demo\" # Uncomment to modify this value.\n#executable-name: \"pointer_demo\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"pointerdemo\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "pointer_demo/lib/app.dart",
    "content": "// This example makes a [Container] react to being entered by a mouse\n// pointer, showing a count of the number of entries and exits.\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\n\nvoid main() => runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Code Sample for widgets.Listener',\n      theme: ThemeData(\n        // If the host is missing some fonts, it can cause the\n        // text to not be rendered or worse the app might crash.\n        fontFamily: 'Roboto',\n        primarySwatch: Colors.blue,\n      ),\n      home: MyStatefulWidget(),\n    );\n  }\n}\n\nclass MyStatefulWidget extends StatefulWidget {\n  MyStatefulWidget({Key key}) : super(key: key);\n\n  @override\n  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();\n}\n\nclass _MyStatefulWidgetState extends State<MyStatefulWidget> {\n  int _enterCounter = 0;\n  int _exitCounter = 0;\n  double x = 0.0;\n  double y = 0.0;\n  String _mouseStatus = \"hovering\";\n\n  void _incrementCounter(PointerEnterEvent details) {\n    setState(() {\n      _enterCounter++;\n    });\n  }\n\n  void _decrementCounter(PointerExitEvent details) {\n    setState(() {\n      _exitCounter++;\n    });\n  }\n\n  void _updateLocation(PointerHoverEvent details) {\n    setState(() {\n      x = details.position.dx;\n      y = details.position.dy;\n      _mouseStatus = \"hovering, button ${details.buttons.toString()}\";\n    });\n  }\n\n  void _updateMove(PointerMoveEvent details) {\n    setState(() {\n      x = details.position.dx;\n      y = details.position.dy;\n      _mouseStatus = \"dragging, button ${details.buttons.toString()}\";\n    });\n  }\n\n  void _pointerDown(PointerDownEvent details) {\n    setState(() {\n      x = details.position.dx;\n      y = details.position.dy;\n      _mouseStatus = \"down, button ${details.buttons.toString()}\";\n    });\n  }\n\n  void _pointerUp(PointerUpEvent details) {\n    setState(() {\n      x = details.position.dx;\n      y = details.position.dy;\n      _mouseStatus = \"up, button ${details.buttons.toString()}\";\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Hover Example'),\n      ),\n      body: Center(\n        child: ConstrainedBox(\n          constraints: BoxConstraints.tight(Size(300.0, 200.0)),\n          child: MouseRegion(\n            onEnter: _incrementCounter,\n            onExit: _decrementCounter,\n            child: Listener(\n              onPointerDown: _pointerDown,\n              onPointerUp: _pointerUp,\n              onPointerMove: _updateMove,\n              onPointerHover: _updateLocation,\n              child: Container(\n                color: Colors.lightBlueAccent,\n                child: Column(\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: <Widget>[\n                    Text('You have pointed at this box this many times:'),\n                    Text(\n                      '$_enterCounter Entries\\n$_exitCounter Exits',\n                    ),\n                    Text(\n                      'The cursor is here: (${x.toStringAsFixed(2)}, ${y.toStringAsFixed(2)})',\n                    ),\n                    Divider(),\n                    Text(\n                      'The mouse is ${_mouseStatus}',\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "pointer_demo/lib/main.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'package:pointer_demo/app.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "pointer_demo/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart' show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.dart';\n\nimport 'package:pointer_demo/app.dart';\n\nvoid main() {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "pointer_demo/pubspec.yaml",
    "content": "name: pointer_demo\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  fonts:\n    - family: Roboto\n      fonts:\n        - asset: fonts/Roboto/Roboto-Thin.ttf\n          weight: 100\n        - asset: fonts/Roboto/Roboto-Light.ttf\n          weight: 300\n        - asset: fonts/Roboto/Roboto-Regular.ttf\n          weight: 400\n        - asset: fonts/Roboto/Roboto-Medium.ttf\n          weight: 500\n        - asset: fonts/Roboto/Roboto-Bold.ttf\n          weight: 700\n        - asset: fonts/Roboto/Roboto-Black.ttf\n          weight: 900\n"
  },
  {
    "path": "renovate.json",
    "content": "{\n  \"extends\": [\"config:base\"],\n  \"automerge\": true,\n  \"major\": {\n    \"automerge\": false\n  },\n  \"gomodTidy\": true,\n  \"requiredStatusChecks\": null,\n  \"postUpdateOptions\": [\n    \"gomodTidy\"\n  ],\n  \"ignoreDeps\": [\n    \"golang.org/x/crypto\",\n    \"golang.org/x/net\",\n    \"golang.org/x/sys\",\n    \"intl\"\n  ],\n  \"ignorePaths\": [\n    \"*/android/**\"\n  ]\n}\n"
  },
  {
    "path": "stocks/.gitignore",
    "content": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\n\nbuild/\n"
  },
  {
    "path": "stocks/README.md",
    "content": "# Stocks\n\n[Example from the flutter repo](https://github.com/flutter/flutter/tree/master/examples/stocks)  \nDemo app for the material design widgets and other features provided by Flutter.\n\n# Difference\n\nThe only edit made was to change the font to Roboto.  \n_If the host is missing some fonts, it can cause the text to not be rendered or\nworse the app might crash_\n\n```diff\ndiff --git a/examples/stocks/lib/main.dart b/examples/stocks/lib/main.dart\nindex d415902d7..eba3362d9 100644\n--- a/examples/stocks/lib/main.dart\n+++ b/examples/stocks/lib/main.dart\n@@ -71,12 +71,14 @@ class StocksAppState extends State<StocksApp> {\n       case StockMode.optimistic:\n         return new ThemeData(\n           brightness: Brightness.light,\n-          primarySwatch: Colors.purple\n+          primarySwatch: Colors.purple,\n+          fontFamily: 'Roboto'\n         );\n       case StockMode.pessimistic:\n         return new ThemeData(\n           brightness: Brightness.dark,\n-          accentColor: Colors.redAccent\n+          accentColor: Colors.redAccent,\n+          fontFamily: 'Roboto'\n         );\n     }\n     assert(_configuration.stockMode != null);\ndiff --git a/examples/stocks/pubspec.yaml b/examples/stocks/pubspec.yaml\nindex 162a7914e..6dba3fbca 100644\n--- a/examples/stocks/pubspec.yaml\n+++ b/examples/stocks/pubspec.yaml\n@@ -74,4 +74,18 @@ dev_dependencies:\n flutter:\n   uses-material-design: true\n \n-# PUBSPEC CHECKSUM: cf1e\n+  fonts:\n+    - family: Roboto\n+      fonts:\n+        - asset: fonts/Roboto/Roboto-Thin.ttf\n+          weight: 100\n+        - asset: fonts/Roboto/Roboto-Light.ttf\n+          weight: 300\n+        - asset: fonts/Roboto/Roboto-Regular.ttf\n+          weight: 400\n+        - asset: fonts/Roboto/Roboto-Medium.ttf\n+          weight: 500\n+        - asset: fonts/Roboto/Roboto-Bold.ttf\n+          weight: 700\n+        - asset: fonts/Roboto/Roboto-Black.ttf\n+          weight: 900\n```\n\n"
  },
  {
    "path": "stocks/fonts/Roboto/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "stocks/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "stocks/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "stocks/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(800, 1280),\n}\n"
  },
  {
    "path": "stocks/go/go.mod",
    "content": "module stocks/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "stocks/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "stocks/go/hover.yaml",
    "content": "#application-name: \"stocks\" # Uncomment to modify this value.\n#executable-name: \"stocks\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"stocks\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "stocks/go/packaging/darwin-bundle/{{.applicationName}} {{.version}}.app/Contents/Info.plist.tmpl",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//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>English</string>\n        <key>CFBundleExecutable</key>\n        <string>{{.executableName}}</string>\n        <key>CFBundleGetInfoString</key>\n        <string>{{.description}}</string>\n        <key>CFBundleIconFile</key>\n        <string>icon.icns</string>\n        <key>NSHighResolutionCapable</key>\n        <true/>\n        <key>CFBundleIdentifier</key>\n        <string>{{.organizationName}}.{{.packageName}}</string>\n        <key>CFBundleInfoDictionaryVersion</key>\n        <string>6.0</string>\n        <key>CFBundleLongVersionString</key>\n        <string>{{.version}}</string>\n        <key>CFBundleName</key>\n        <string>{{.applicationName}}</string>\n        <key>CFBundlePackageType</key>\n        <string>APPL</string>\n        <key>CFBundleShortVersionString</key>\n        <string>{{.version}}</string>\n        <key>CFBundleSignature</key>\n        <string>{{.organizationName}}.{{.packageName}}</string>\n        <key>CFBundleVersion</key>\n        <string>{{.version}}</string>\n        <key>CSResourcesFileMapped</key>\n        <true/>\n        <key>NSHumanReadableCopyright</key>\n        <string></string>\n        <key>NSPrincipalClass</key>\n        <string>NSApplication</string>\n    </dict>\n</plist>\n"
  },
  {
    "path": "stocks/go/packaging/darwin-pkg/flat/Distribution.tmpl",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<installer-gui-script minSpecVersion=\"1\">\n\t<title>{{.applicationName}}</title>\n\t<background alignment=\"topleft\" file=\"root/Applications/{{.applicationName}}.app/Contents/MacOS/assets/icon.png\"/>\n\t<choices-outline>\n\t    <line choice=\"choiceBase\"/>\n    </choices-outline>\n    <choice id=\"choiceBase\" title=\"base\">\n        <pkg-ref id=\"{{.organizationName}}.base.pkg\"/>\n    </choice>\n    <pkg-ref id=\"{{.organizationName}}.base.pkg\" version=\"{{.version}}\" auth=\"Root\">#base.pkg</pkg-ref>\n</installer-gui-script>\n"
  },
  {
    "path": "stocks/go/packaging/darwin-pkg/flat/base.pkg/PackageInfo.tmpl",
    "content": "<pkg-info format-version=\"2\" identifier=\"{{.organizationName}}.base.pkg\" version=\"{{.version}}\" install-location=\"/\" auth=\"root\">\n\t<bundle-version>\n\t\t<bundle id=\"{{.organizationName}}\" CFBundleIdentifier=\"{{.organizationName}}.{{.packageName}}\" path=\"./Applications/{{.applicationName}}.app\" CFBundleVersion=\"{{.version}}\"/>\n    </bundle-version>\n</pkg-info>\n"
  },
  {
    "path": "stocks/go/packaging/linux-appimage/AppRun.tmpl",
    "content": "#!/bin/sh\ncd \"$(dirname \"$0\")\"\nexec ./build/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-appimage/{{.packageName}}.desktop.tmpl",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName}}\nIcon={{.iconPath}}\nExec={{.executablePath}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-deb/DEBIAN/control.tmpl",
    "content": "Package: {{.packageName}}\nArchitecture: amd64\nMaintainer: @{{.author}}\nPriority: optional\nVersion: {{.version}}\nDescription: {{.description}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-deb/usr/bin/{{.executableName}}.tmpl",
    "content": "#!/bin/sh\n/usr/lib/{{.packageName}}/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-deb/usr/share/applications/{{.executableName}}.desktop.tmpl",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName}}\nIcon={{.iconPath}}\nExec={{.executablePath}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-pkg/PKGBUILD.tmpl",
    "content": "pkgname={{.packageName}}\npkgver={{.version}}\npkgrel={{.release}}\npkgdesc=\"{{.description}}\"\narch=(\"x86_64\")\nlicense=('{{.license}}')\n\npackage() {\n    mkdir -p $pkgdir/\n    cp * $pkgdir/ -r\n}\n"
  },
  {
    "path": "stocks/go/packaging/linux-pkg/src/usr/bin/{{.executableName}}.tmpl",
    "content": "#!/bin/sh\n/usr/lib/{{.packageName}}/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-pkg/src/usr/share/applications/{{.executableName}}.desktop.tmpl",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName}}\nIcon={{.iconPath}}\nExec={{.executablePath}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-rpm/BUILDROOT/{{.packageName}}-{{.version}}-{{.release}}.x86_64/usr/bin/{{.executableName}}.tmpl",
    "content": "#!/bin/sh\n/usr/lib/{{.packageName}}/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-rpm/BUILDROOT/{{.packageName}}-{{.version}}-{{.release}}.x86_64/usr/share/applications/{{.executableName}}.desktop.tmpl",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName}}\nIcon={{.iconPath}}\nExec={{.executablePath}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-rpm/SPECS/{{.packageName}}.spec.tmpl",
    "content": "Name: {{.packageName}}\nVersion: {{.version}}\nRelease: {{.release}}\nSummary: {{.description}}\nLicense: {{.license}}\n\n%description\n{{.description}}\n\n%install\nmkdir -p $RPM_BUILD_ROOT%{_bindir}\nmkdir -p $RPM_BUILD_ROOT/usr/lib/{{.packageName}}\nmkdir -p $RPM_BUILD_ROOT%{_datadir}/applications\ncp -R $RPM_BUILD_DIR/{{.packageName}}-{{.version}}-{{.release}}.x86_64/* $RPM_BUILD_ROOT\nchmod 0755 $RPM_BUILD_ROOT%{_bindir}/{{.executableName}}\nchmod 0755 $RPM_BUILD_ROOT%{_datadir}/applications/{{.executableName}}.desktop\n\n%files\n%{_bindir}/{{.executableName}}\n/usr/lib/{{.packageName}}/\n%{_datadir}/applications/{{.executableName}}.desktop\n"
  },
  {
    "path": "stocks/go/packaging/linux-snap/snap/local/{{.executableName}}.desktop.tmpl",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName}}\nIcon={{.iconPath}}\nExec={{.executablePath}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-snap/snap/snapcraft.yaml.tmpl",
    "content": "name: {{.packageName}}\nbase: core18\nversion: '{{.version}}'\nsummary: {{.description}}\ndescription: |\n  {{.description}}\nconfinement: devmode\ngrade: devel\napps:\n  {{.packageName}}:\n    command: {{.executableName}}\n    desktop: local/{{.executableName}}.desktop\nparts:\n  desktop:\n    plugin: dump\n    source: snap\n  assets:\n    plugin: dump\n    source: build/assets\n  app:\n    plugin: dump\n    source: build\n    stage-packages:\n      - libx11-6\n      - libxrandr2\n      - libxcursor1\n      - libxinerama1\n"
  },
  {
    "path": "stocks/go/packaging/windows-msi/upgrade-code.txt",
    "content": "dd8de1ec-bfb9-4bd9-a59a-59e092dae8cb\n# This GUID is your upgrade code and ensures that you can properly update your app.\n# Don't change it."
  },
  {
    "path": "stocks/go/packaging/windows-msi/{{.packageName}}.wxs.tmpl",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\n    <Product Id=\"*\" UpgradeCode=\"{{.upgradeCode}}\" Version=\"{{.version}}\" Language=\"1033\" Name=\"{{.applicationName}}\" Manufacturer=\"{{.author}}\">\n        <Package InstallerVersion=\"300\" Compressed=\"yes\"/>\n        <Media Id=\"1\" Cabinet=\"{{.packageName}}.cab\" EmbedCab=\"yes\" />\n        <Directory Id=\"TARGETDIR\" Name=\"SourceDir\">\n            <Directory Id=\"ProgramFilesFolder\">\n                <Directory Id=\"APPLICATIONROOTDIRECTORY\" Name=\"{{.applicationName}}\">\n                    <?include directories.wxi ?>\n                </Directory>\n            </Directory>\n            <Directory Id=\"ProgramMenuFolder\">\n                <Directory Id=\"ApplicationProgramsFolder\" Name=\"{{.applicationName}}\"/>\n            </Directory>\n        </Directory>\n        <Icon Id=\"ShortcutIcon\" SourceFile=\"build{{.pathSeparator}}assets{{.pathSeparator}}icon.ico\"/>\n        <Property Id=\"ARPPRODUCTICON\" Value=\"ShortcutIcon\"/>\n        <?include directory_refs.wxi ?>\n        <DirectoryRef Id=\"ApplicationProgramsFolder\">\n            <Component Id=\"ApplicationShortcut\" Guid=\"*\">\n                <Shortcut Id=\"ApplicationStartMenuShortcut\"\n                          Name=\"{{.applicationName}}\"\n                          Description=\"{{.description}}\"\n                          Target=\"[#{{.executableName}}.exe]\"\n                          WorkingDirectory=\"APPLICATIONROOTDIRECTORY\"\n                          Icon=\"ShortcutIcon\"/>\n                <RemoveFolder Id=\"CleanUpShortCut\" On=\"uninstall\"/>\n                <RegistryValue Root=\"HKCU\" Key=\"Software\\{{.author}}\\{{.packageName}}\" Name=\"installed\" Type=\"integer\" Value=\"1\" KeyPath=\"yes\"/>\n            </Component>\n        </DirectoryRef>\n        <Feature Id=\"MainApplication\" Title=\"{{.applicationName}}\" Level=\"1\">\n            <ComponentRef Id=\"ApplicationShortcut\"/>\n            <?include component_refs.wxi ?>\n        </Feature>\n    </Product>\n</Wix>\n"
  },
  {
    "path": "stocks/lib/i18n/.dartignore",
    "content": ""
  },
  {
    "path": "stocks/lib/i18n/regenerate.md",
    "content": "## Regenerating the i18n files\n\nThe files in this directory are based on ../lib/stock_strings.dart\nwhich defines all of the localizable strings used by the stocks\napp. The stocks app uses\nthe [Dart `intl` package](https://github.com/dart-lang/intl).\n\nRebuilding everything requires two steps.\n\nWith the `examples/stocks` as the current directory, generate\n`intl_messages.arb` from `lib/stock_strings.dart`:\n```\nflutter pub pub run intl_translation:extract_to_arb --output-dir=lib/i18n lib/stock_strings.dart\n```\nThe `intl_messages.arb` file is a JSON format map with one entry for\neach `Intl.message()` function defined in `stock_strings.dart`. This\nfile was used to create the English and Spanish localizations,\n`stocks_en.arb` and `stocks_es.arb`. The `intl_messages.arb` wasn't\nchecked into the repository, since it only serves as a template for\nthe other `.arb` files.\n\n\nWith the `examples/stocks` as the current directory, generate a\n`stock_messages_<locale>.dart` for each `stocks_<locale>.arb` file and\n`stock_messages_all.dart`, which imports all of the messages files:\n```\nflutter pub pub run intl_translation:generate_from_arb --output-dir=lib/i18n \\\n   --generated-file-prefix=stock_ --no-use-deferred-loading lib/*.dart lib/i18n/stocks_*.arb\n```\n\nThe `StockStrings` class uses the generated `initializeMessages()`\nfunction (`stock_messages_all.dart`) to load the localized messages\nand `Intl.message()` to look them up.\n"
  },
  {
    "path": "stocks/lib/i18n/stock_messages_all.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that looks up messages for specific locales by\n// delegating to the appropriate library.\n\nimport 'dart:async';\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n// ignore: implementation_imports\nimport 'package:intl/src/intl_helpers.dart';\n\nimport 'stock_messages_en.dart' as messages_en;\nimport 'stock_messages_es.dart' as messages_es;\n\ntypedef Future<dynamic> LibraryLoader();\nMap<String, LibraryLoader> _deferredLibraries = {\n  'en': () => new Future.value(null),\n  'es': () => new Future.value(null),\n};\n\nMessageLookupByLibrary _findExact(localeName) {\n  switch (localeName) {\n    case 'en':\n      return messages_en.messages;\n    case 'es':\n      return messages_es.messages;\n    default:\n      return null;\n  }\n}\n\n/// User programs should call this before using [localeName] for messages.\nFuture<bool> initializeMessages(String localeName) async {\n  var availableLocale = Intl.verifiedLocale(\n    localeName,\n    (locale) => _deferredLibraries[locale] != null,\n    onFailure: (_) => null);\n  if (availableLocale == null) {\n    return new Future.value(false);\n  }\n  var lib = _deferredLibraries[availableLocale];\n  await (lib == null ? new Future.value(false) : lib());\n  initializeInternalMessageLookup(() => new CompositeMessageLookup());\n  messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);\n  return new Future.value(true);\n}\n\nbool _messagesExistFor(String locale) {\n  try {\n    return _findExact(locale) != null;\n  } catch (e) {\n    return false;\n  }\n}\n\nMessageLookupByLibrary _findGeneratedMessagesFor(locale) {\n  var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor,\n      onFailure: (_) => null);\n  if (actualLocale == null) return null;\n  return _findExact(actualLocale);\n}\n"
  },
  {
    "path": "stocks/lib/i18n/stock_messages_en.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a en locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\n// ignore: unused_element\nfinal _keepAnalysisHappy = Intl.defaultLocale;\n\n// ignore: non_constant_identifier_names\ntypedef MessageIfAbsent(String message_str, List args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  get localeName => 'en';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"market\" : MessageLookupByLibrary.simpleMessage(\"MARKET\"),\n    \"portfolio\" : MessageLookupByLibrary.simpleMessage(\"PORTFOLIO\"),\n    \"title\" : MessageLookupByLibrary.simpleMessage(\"Stocks\")\n  };\n}\n"
  },
  {
    "path": "stocks/lib/i18n/stock_messages_es.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a es locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\n// ignore: unused_element\nfinal _keepAnalysisHappy = Intl.defaultLocale;\n\n// ignore: non_constant_identifier_names\ntypedef MessageIfAbsent(String message_str, List args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  get localeName => 'es';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"market\" : MessageLookupByLibrary.simpleMessage(\"MERCADO\"),\n    \"portfolio\" : MessageLookupByLibrary.simpleMessage(\"CARTERA\"),\n    \"title\" : MessageLookupByLibrary.simpleMessage(\"Acciones\")\n  };\n}\n"
  },
  {
    "path": "stocks/lib/i18n/stocks_en.arb",
    "content": "{\n  \"title\": \"Stocks\",\n  \"@title\": {\n    \"description\": \"Title for the Stocks application\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n\n  \"market\": \"MARKET\",\n  \"@market\": {\n    \"description\": \"Label for the Market tab\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n\n  \"portfolio\": \"PORTFOLIO\",\n  \"@portfolio\": {\n    \"description\": \"Label for the Portfolio tab\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  }\n}\n"
  },
  {
    "path": "stocks/lib/i18n/stocks_es.arb",
    "content": "{\n  \"title\": \"Acciones\",\n  \"@title\": {\n    \"description\": \"Title for the Stocks application\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n\n  \"market\": \"MERCADO\",\n  \"@market\": {\n    \"description\": \"Label for the Market tab\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n\n  \"portfolio\": \"CARTERA\",\n  \"@portfolio\": {\n    \"description\": \"Label for the Portfolio tab\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  }\n}\n"
  },
  {
    "path": "stocks/lib/main.dart",
    "content": "import 'package:flutter/widgets.dart';\nimport 'package:stocks/stock.dart';\n\nvoid main() {\n  runApp(new StocksApp());\n}\n"
  },
  {
    "path": "stocks/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:stocks/stock.dart';\n\nvoid main() {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  runApp(new StocksApp());\n}\n"
  },
  {
    "path": "stocks/lib/stock.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nlibrary stocks;\n\nimport 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart'\n    show\n        debugPaintSizeEnabled,\n        debugPaintBaselinesEnabled,\n        debugPaintLayerBordersEnabled,\n        debugPaintPointersEnabled,\n        debugRepaintRainbowEnabled;\nimport 'package:flutter_localizations/flutter_localizations.dart';\n\nimport 'package:flutter/foundation.dart' show debugDefaultTargetPlatformOverride;\n\nimport 'stock_data.dart';\nimport 'stock_home.dart';\nimport 'stock_settings.dart';\nimport 'stock_strings.dart';\nimport 'stock_symbol_viewer.dart';\nimport 'stock_types.dart';\n\nclass _StocksLocalizationsDelegate extends LocalizationsDelegate<StockStrings> {\n  @override\n  Future<StockStrings> load(Locale locale) => StockStrings.load(locale);\n\n  @override\n  bool isSupported(Locale locale) => locale.languageCode == 'es' || locale.languageCode == 'en';\n\n  @override\n  bool shouldReload(_StocksLocalizationsDelegate old) => false;\n}\n\nclass StocksApp extends StatefulWidget {\n  @override\n  StocksAppState createState() => new StocksAppState();\n}\n\nclass StocksAppState extends State<StocksApp> {\n  StockData stocks;\n\n  StockConfiguration _configuration = new StockConfiguration(\n      stockMode: StockMode.optimistic,\n      backupMode: BackupMode.enabled,\n      debugShowGrid: false,\n      debugShowSizes: false,\n      debugShowBaselines: false,\n      debugShowLayers: false,\n      debugShowPointers: false,\n      debugShowRainbow: false,\n      showPerformanceOverlay: false,\n      showSemanticsDebugger: false);\n\n  @override\n  void initState() {\n    super.initState();\n    stocks = new StockData();\n  }\n\n  void configurationUpdater(StockConfiguration value) {\n    setState(() {\n      _configuration = value;\n    });\n  }\n\n  ThemeData get theme {\n    switch (_configuration.stockMode) {\n      case StockMode.optimistic:\n        return new ThemeData(brightness: Brightness.light, primarySwatch: Colors.purple, fontFamily: 'Roboto');\n      case StockMode.pessimistic:\n        return new ThemeData(brightness: Brightness.dark, accentColor: Colors.redAccent, fontFamily: 'Roboto');\n    }\n    assert(_configuration.stockMode != null);\n    return null;\n  }\n\n  Route<dynamic> _getRoute(RouteSettings settings) {\n    // Routes, by convention, are split on slashes, like filesystem paths.\n    final List<String> path = settings.name.split('/');\n    // We only support paths that start with a slash, so bail if\n    // the first component is not empty:\n    if (path[0] != '') return null;\n    // If the path is \"/stock:...\" then show a stock page for the\n    // specified stock symbol.\n    if (path[1].startsWith('stock:')) {\n      // We don't yet support subpages of a stock, so bail if there's\n      // any more path components.\n      if (path.length != 2) return null;\n      // Extract the symbol part of \"stock:...\" and return a route\n      // for that symbol.\n      final String symbol = path[1].substring(6);\n      return new MaterialPageRoute<void>(\n        settings: settings,\n        builder: (BuildContext context) => new StockSymbolPage(symbol: symbol, stocks: stocks),\n      );\n    }\n    // The other paths we support are in the routes table.\n    return null;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(() {\n      debugPaintSizeEnabled = _configuration.debugShowSizes;\n      debugPaintBaselinesEnabled = _configuration.debugShowBaselines;\n      debugPaintLayerBordersEnabled = _configuration.debugShowLayers;\n      debugPaintPointersEnabled = _configuration.debugShowPointers;\n      debugRepaintRainbowEnabled = _configuration.debugShowRainbow;\n      return true;\n    }());\n    return new MaterialApp(\n      title: 'Stocks',\n      theme: theme,\n      localizationsDelegates: <LocalizationsDelegate<dynamic>>[\n        new _StocksLocalizationsDelegate(),\n        GlobalMaterialLocalizations.delegate,\n        GlobalWidgetsLocalizations.delegate,\n      ],\n      supportedLocales: const <Locale>[\n        const Locale('en', 'US'),\n        const Locale('es', 'ES'),\n      ],\n      debugShowMaterialGrid: _configuration.debugShowGrid,\n      showPerformanceOverlay: _configuration.showPerformanceOverlay,\n      showSemanticsDebugger: _configuration.showSemanticsDebugger,\n      routes: <String, WidgetBuilder>{\n        '/': (BuildContext context) => new StockHome(stocks, _configuration, configurationUpdater),\n        '/settings': (BuildContext context) => new StockSettings(_configuration, configurationUpdater)\n      },\n      onGenerateRoute: _getRoute,\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_arrow.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/material.dart';\n\nclass StockArrowPainter extends CustomPainter {\n  StockArrowPainter({ this.color, this.percentChange });\n\n  final Color color;\n  final double percentChange;\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    final Paint paint = new Paint()..color = color;\n    paint.strokeWidth = 1.0;\n    const double padding = 2.0;\n    assert(padding > paint.strokeWidth / 2.0); // make sure the circle remains inside the box\n    final double r = (size.shortestSide - padding) / 2.0; // radius of the circle\n    final double centerX = padding + r;\n    final double centerY = padding + r;\n\n    // Draw the arrow.\n    const double w = 8.0;\n    double h = 5.0;\n    double arrowY;\n    if (percentChange < 0.0) {\n      h = -h;\n      arrowY = centerX + 1.0;\n    } else {\n      arrowY = centerX - 1.0;\n    }\n    final Path path = new Path();\n    path.moveTo(centerX, arrowY - h); // top of the arrow\n    path.lineTo(centerX + w, arrowY + h);\n    path.lineTo(centerX - w, arrowY + h);\n    path.close();\n    paint.style = PaintingStyle.fill;\n    canvas.drawPath(path, paint);\n\n    // Draw a circle that circumscribes the arrow.\n    paint.style = PaintingStyle.stroke;\n    canvas.drawCircle(new Offset(centerX, centerY), r, paint);\n  }\n\n  @override\n  bool shouldRepaint(StockArrowPainter oldDelegate) {\n    return oldDelegate.color != color\n        || oldDelegate.percentChange != percentChange;\n  }\n}\n\nclass StockArrow extends StatelessWidget {\n  const StockArrow({ Key key, this.percentChange }) : super(key: key);\n\n  final double percentChange;\n\n  int _colorIndexForPercentChange(double percentChange) {\n    const double maxPercent = 10.0;\n    final double normalizedPercentChange = math.min(percentChange.abs(), maxPercent) / maxPercent;\n    return 100 + (normalizedPercentChange * 8.0).floor() * 100;\n  }\n\n  Color _colorForPercentChange(double percentChange) {\n    if (percentChange > 0)\n      return Colors.green[_colorIndexForPercentChange(percentChange)];\n    return Colors.red[_colorIndexForPercentChange(percentChange)];\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Container(\n      width: 40.0,\n      height: 40.0,\n      margin: const EdgeInsets.symmetric(horizontal: 5.0),\n      child: new CustomPaint(\n        painter: new StockArrowPainter(\n          // TODO(jackson): This should change colors with the theme\n          color: _colorForPercentChange(percentChange),\n          percentChange: percentChange\n        )\n      )\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_data.dart",
    "content": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Snapshot from http://www.nasdaq.com/screening/company-list.aspx\n// Fetched 2/23/2014.\n// \"Symbol\",\"Name\",\"LastSale\",\"MarketCap\",\"IPOyear\",\"Sector\",\"industry\",\"Summary Quote\",\n// Data in stock_data.json\n\nimport 'dart:convert';\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:http/http.dart' as http;\n\nfinal math.Random _rng = new math.Random();\n\nclass Stock {\n  String symbol;\n  String name;\n  double lastSale;\n  String marketCap;\n  double percentChange;\n\n  Stock(this.symbol, this.name, this.lastSale, this.marketCap, this.percentChange);\n\n  Stock.fromFields(List<String> fields) {\n    // FIXME: This class should only have static data, not lastSale, etc.\n    // \"Symbol\",\"Name\",\"LastSale\",\"MarketCap\",\"IPOyear\",\"Sector\",\"industry\",\"Summary Quote\",\n    lastSale = 0.0;\n    try {\n      lastSale = double.parse(fields[2]);\n    } catch (_) {}\n    symbol = fields[0];\n    name = fields[1];\n    marketCap = fields[4];\n    percentChange = (_rng.nextDouble() * 20) - 10;\n  }\n}\n\nclass StockData extends ChangeNotifier {\n  StockData() {\n    if (actuallyFetchData) {\n      _httpClient = new http.Client();\n      _fetchNextChunk();\n    }\n  }\n\n  final List<String> _symbols = <String>[];\n  final Map<String, Stock> _stocks = <String, Stock>{};\n\n  Iterable<String> get allSymbols => _symbols;\n\n  Stock operator [](String symbol) => _stocks[symbol];\n\n  bool get loading => _httpClient != null;\n\n  void add(List<dynamic> data) {\n    for (List<dynamic> fields in data) {\n      final Stock stock = new Stock.fromFields(fields.cast<String>());\n      _symbols.add(stock.symbol);\n      _stocks[stock.symbol] = stock;\n    }\n    _symbols.sort();\n    notifyListeners();\n  }\n\n  static const int _chunkCount = 30;\n  int _nextChunk = 0;\n\n  String _urlToFetch(int chunk) {\n    return 'https://domokit.github.io/examples/stocks/data/stock_data_$chunk.json';\n  }\n\n  http.Client _httpClient;\n\n  static bool actuallyFetchData = true;\n\n  void _fetchNextChunk() {\n    _httpClient.get(_urlToFetch(_nextChunk++)).then<Null>((http.Response response) {\n      final String json = response.body;\n      if (json == null) {\n        debugPrint('Failed to load stock data chunk ${_nextChunk - 1}');\n        _end();\n        return;\n      }\n      const JsonDecoder decoder = const JsonDecoder();\n      add(decoder.convert(json));\n      if (_nextChunk < _chunkCount) {\n        _fetchNextChunk();\n      } else {\n        _end();\n      }\n    });\n  }\n\n  void _end() {\n    _httpClient?.close();\n    _httpClient = null;\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_home.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart' show debugDumpRenderTree, debugDumpLayerTree, debugDumpSemanticsTree, DebugSemanticsDumpOrder;\nimport 'package:flutter/scheduler.dart' show timeDilation;\nimport 'stock_data.dart';\nimport 'stock_list.dart';\nimport 'stock_strings.dart';\nimport 'stock_symbol_viewer.dart';\nimport 'stock_types.dart';\n\ntypedef void ModeUpdater(StockMode mode);\n\nenum _StockMenuItem { autorefresh, refresh, speedUp, speedDown }\nenum StockHomeTab { market, portfolio }\n\nclass _NotImplementedDialog extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return new AlertDialog(\n      title: const Text('Not Implemented'),\n      content: const Text('This feature has not yet been implemented.'),\n      actions: <Widget>[\n        new FlatButton(\n          onPressed: debugDumpApp,\n          child: new Row(\n            children: <Widget>[\n              const Icon(\n                Icons.dvr,\n                size: 18.0,\n              ),\n              new Container(\n                width: 8.0,\n              ),\n              const Text('DUMP APP TO CONSOLE'),\n            ],\n          ),\n        ),\n        new FlatButton(\n          onPressed: () {\n            Navigator.pop(context, false);\n          },\n          child: const Text('OH WELL'),\n        ),\n      ],\n    );\n  }\n}\n\nclass StockHome extends StatefulWidget {\n  const StockHome(this.stocks, this.configuration, this.updater);\n\n  final StockData stocks;\n  final StockConfiguration configuration;\n  final ValueChanged<StockConfiguration> updater;\n\n  @override\n  StockHomeState createState() => new StockHomeState();\n}\n\nclass StockHomeState extends State<StockHome> {\n  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();\n  final TextEditingController _searchQuery = new TextEditingController();\n  bool _isSearching = false;\n  bool _autorefresh = false;\n\n  void _handleSearchBegin() {\n    ModalRoute.of(context).addLocalHistoryEntry(new LocalHistoryEntry(\n      onRemove: () {\n        setState(() {\n          _isSearching = false;\n          _searchQuery.clear();\n        });\n      },\n    ));\n    setState(() {\n      _isSearching = true;\n    });\n  }\n\n  void _handleStockModeChange(StockMode value) {\n    if (widget.updater != null)\n      widget.updater(widget.configuration.copyWith(stockMode: value));\n  }\n\n  void _handleStockMenu(BuildContext context, _StockMenuItem value) {\n    switch (value) {\n      case _StockMenuItem.autorefresh:\n        setState(() {\n          _autorefresh = !_autorefresh;\n        });\n        break;\n      case _StockMenuItem.refresh:\n        showDialog<void>(\n          context: context,\n          builder: (BuildContext context) => new _NotImplementedDialog(),\n        );\n        break;\n      case _StockMenuItem.speedUp:\n        timeDilation /= 5.0;\n        break;\n      case _StockMenuItem.speedDown:\n        timeDilation *= 5.0;\n        break;\n    }\n  }\n\n  Widget _buildDrawer(BuildContext context) {\n    return new Drawer(\n      child: new ListView(\n        children: <Widget>[\n          const DrawerHeader(child: const Center(child: const Text('Stocks'))),\n          const ListTile(\n            leading: const Icon(Icons.assessment),\n            title: const Text('Stock List'),\n            selected: true,\n          ),\n          const ListTile(\n            leading: const Icon(Icons.account_balance),\n            title: const Text('Account Balance'),\n            enabled: false,\n          ),\n          new ListTile(\n            leading: const Icon(Icons.dvr),\n            title: const Text('Dump App to Console'),\n            onTap: () {\n              try {\n                debugDumpApp();\n                debugDumpRenderTree();\n                debugDumpLayerTree();\n                debugDumpSemanticsTree(DebugSemanticsDumpOrder.traversalOrder);\n              } catch (e, stack) {\n                debugPrint('Exception while dumping app:\\n$e\\n$stack');\n              }\n            },\n          ),\n          const Divider(),\n          new ListTile(\n            leading: const Icon(Icons.thumb_up),\n            title: const Text('Optimistic'),\n            trailing: new Radio<StockMode>(\n              value: StockMode.optimistic,\n              groupValue: widget.configuration.stockMode,\n              onChanged: _handleStockModeChange,\n            ),\n            onTap: () {\n              _handleStockModeChange(StockMode.optimistic);\n            },\n          ),\n          new ListTile(\n            leading: const Icon(Icons.thumb_down),\n            title: const Text('Pessimistic'),\n            trailing: new Radio<StockMode>(\n              value: StockMode.pessimistic,\n              groupValue: widget.configuration.stockMode,\n              onChanged: _handleStockModeChange,\n            ),\n            onTap: () {\n              _handleStockModeChange(StockMode.pessimistic);\n            },\n          ),\n          const Divider(),\n          new ListTile(\n            leading: const Icon(Icons.settings),\n            title: const Text('Settings'),\n            onTap: _handleShowSettings,\n          ),\n          new ListTile(\n            leading: const Icon(Icons.help),\n            title: const Text('About'),\n            onTap: _handleShowAbout,\n          ),\n        ],\n      ),\n    );\n  }\n\n  void _handleShowSettings() {\n    Navigator.popAndPushNamed(context, '/settings');\n  }\n\n  void _handleShowAbout() {\n    showAboutDialog(context: context);\n  }\n\n  Widget buildAppBar() {\n    return new AppBar(\n      elevation: 0.0,\n      title: new Text(StockStrings.of(context).title()),\n      actions: <Widget>[\n        new IconButton(\n          icon: const Icon(Icons.search),\n          onPressed: _handleSearchBegin,\n          tooltip: 'Search',\n        ),\n        new PopupMenuButton<_StockMenuItem>(\n          onSelected: (_StockMenuItem value) { _handleStockMenu(context, value); },\n          itemBuilder: (BuildContext context) => <PopupMenuItem<_StockMenuItem>>[\n            new CheckedPopupMenuItem<_StockMenuItem>(\n              value: _StockMenuItem.autorefresh,\n              checked: _autorefresh,\n              child: const Text('Autorefresh'),\n            ),\n            const PopupMenuItem<_StockMenuItem>(\n              value: _StockMenuItem.refresh,\n              child: const Text('Refresh'),\n            ),\n            const PopupMenuItem<_StockMenuItem>(\n              value: _StockMenuItem.speedUp,\n              child: const Text('Increase animation speed'),\n            ),\n            const PopupMenuItem<_StockMenuItem>(\n              value: _StockMenuItem.speedDown,\n              child: const Text('Decrease animation speed'),\n            ),\n          ],\n        ),\n      ],\n      bottom: new TabBar(\n        tabs: <Widget>[\n          new Tab(text: StockStrings.of(context).market()),\n          new Tab(text: StockStrings.of(context).portfolio()),\n        ],\n      ),\n    );\n  }\n\n  static Iterable<Stock> _getStockList(StockData stocks, Iterable<String> symbols) {\n    return symbols.map<Stock>((String symbol) => stocks[symbol])\n        .where((Stock stock) => stock != null);\n  }\n\n  Iterable<Stock> _filterBySearchQuery(Iterable<Stock> stocks) {\n    if (_searchQuery.text.isEmpty)\n      return stocks;\n    final RegExp regexp = new RegExp(_searchQuery.text, caseSensitive: false);\n    return stocks.where((Stock stock) => stock.symbol.contains(regexp));\n  }\n\n  void _buyStock(Stock stock) {\n    setState(() {\n      stock.percentChange = 100.0 * (1.0 / stock.lastSale);\n      stock.lastSale += 1.0;\n    });\n    _scaffoldKey.currentState.showSnackBar(new SnackBar(\n      content: new Text('Purchased ${stock.symbol} for ${stock.lastSale}'),\n      action: new SnackBarAction(\n        label: 'BUY MORE',\n        onPressed: () {\n          _buyStock(stock);\n        },\n      ),\n    ));\n  }\n\n  Widget _buildStockList(BuildContext context, Iterable<Stock> stocks, StockHomeTab tab) {\n    return new StockList(\n      stocks: stocks.toList(),\n      onAction: _buyStock,\n      onOpen: (Stock stock) {\n        Navigator.pushNamed(context, '/stock:${stock.symbol}');\n      },\n      onShow: (Stock stock) {\n        _scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) => new StockSymbolBottomSheet(stock: stock));\n      },\n    );\n  }\n\n  Widget _buildStockTab(BuildContext context, StockHomeTab tab, List<String> stockSymbols) {\n    return new AnimatedBuilder(\n      key: new ValueKey<StockHomeTab>(tab),\n      animation: new Listenable.merge(<Listenable>[_searchQuery, widget.stocks]),\n      builder: (BuildContext context, Widget child) {\n        return _buildStockList(context, _filterBySearchQuery(_getStockList(widget.stocks, stockSymbols)).toList(), tab);\n      },\n    );\n  }\n\n  static const List<String> portfolioSymbols = const <String>['AAPL','FIZZ', 'FIVE', 'FLAT', 'ZINC', 'ZNGA'];\n\n  Widget buildSearchBar() {\n    return new AppBar(\n      leading: new BackButton(\n        color: Theme.of(context).accentColor,\n      ),\n      title: new TextField(\n        controller: _searchQuery,\n        autofocus: true,\n        decoration: const InputDecoration(\n          hintText: 'Search stocks',\n        ),\n      ),\n      backgroundColor: Theme.of(context).canvasColor,\n    );\n  }\n\n  void _handleCreateCompany() {\n    showModalBottomSheet<void>(\n      context: context,\n      builder: (BuildContext context) => new _CreateCompanySheet(),\n    );\n  }\n\n  Widget buildFloatingActionButton() {\n    return new FloatingActionButton(\n      tooltip: 'Create company',\n      child: const Icon(Icons.add),\n      backgroundColor: Theme.of(context).accentColor,\n      onPressed: _handleCreateCompany,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new DefaultTabController(\n      length: 2,\n      child: new Scaffold(\n        key: _scaffoldKey,\n        appBar: _isSearching ? buildSearchBar() : buildAppBar(),\n        floatingActionButton: buildFloatingActionButton(),\n        drawer: _buildDrawer(context),\n        body: new TabBarView(\n          children: <Widget>[\n            _buildStockTab(context, StockHomeTab.market, widget.stocks.allSymbols),\n            _buildStockTab(context, StockHomeTab.portfolio, portfolioSymbols),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass _CreateCompanySheet extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return new Column(\n      children: const <Widget>[\n        const TextField(\n          autofocus: true,\n          decoration: const InputDecoration(\n            hintText: 'Company Name',\n          ),\n        ),\n        const Text('(This demo is not yet complete.)'),\n        // For example, we could add a button that actually updates the list\n        // and then contacts the server, etc.\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_list.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\n\nimport 'stock_data.dart';\nimport 'stock_row.dart';\n\nclass StockList extends StatelessWidget {\n  const StockList({ Key key, this.stocks, this.onOpen, this.onShow, this.onAction }) : super(key: key);\n\n  final List<Stock> stocks;\n  final StockRowActionCallback onOpen;\n  final StockRowActionCallback onShow;\n  final StockRowActionCallback onAction;\n\n  @override\n  Widget build(BuildContext context) {\n    return new ListView.builder(\n      key: const ValueKey<String>('stock-list'),\n      itemExtent: StockRow.kHeight,\n      itemCount: stocks.length,\n      itemBuilder: (BuildContext context, int index) {\n        return new StockRow(\n          stock: stocks[index],\n          onPressed: onOpen,\n          onDoubleTap: onShow,\n          onLongPressed: onAction\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_row.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\n\nimport 'stock_arrow.dart';\nimport 'stock_data.dart';\n\ntypedef void StockRowActionCallback(Stock stock);\n\nclass StockRow extends StatelessWidget {\n  StockRow({\n    this.stock,\n    this.onPressed,\n    this.onDoubleTap,\n    this.onLongPressed\n  }) : super(key: new ObjectKey(stock));\n\n  final Stock stock;\n  final StockRowActionCallback onPressed;\n  final StockRowActionCallback onDoubleTap;\n  final StockRowActionCallback onLongPressed;\n\n  static const double kHeight = 79.0;\n\n  GestureTapCallback _getHandler(StockRowActionCallback callback) {\n    return callback == null ? null : () => callback(stock);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final String lastSale = '\\$${stock.lastSale.toStringAsFixed(2)}';\n    String changeInPrice = '${stock.percentChange.toStringAsFixed(2)}%';\n    if (stock.percentChange > 0)\n      changeInPrice = '+' + changeInPrice;\n    return new InkWell(\n      onTap: _getHandler(onPressed),\n      onDoubleTap: _getHandler(onDoubleTap),\n      onLongPress: _getHandler(onLongPressed),\n      child: new Container(\n        padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 20.0),\n        decoration: new BoxDecoration(\n          border: new Border(\n            bottom: new BorderSide(color: Theme.of(context).dividerColor)\n          )\n        ),\n        child: new Row(\n          children: <Widget>[\n            new Container(\n              margin: const EdgeInsets.only(right: 5.0),\n              child: new Hero(\n                tag: stock,\n                child: new StockArrow(percentChange: stock.percentChange)\n              )\n            ),\n            new Expanded(\n              child: new Row(\n                children: <Widget>[\n                  new Expanded(\n                    flex: 2,\n                    child: new Text(\n                      stock.symbol\n                    )\n                  ),\n                  new Expanded(\n                    child: new Text(\n                      lastSale,\n                      textAlign: TextAlign.right\n                    )\n                  ),\n                  new Expanded(\n                    child: new Text(\n                      changeInPrice,\n                      textAlign: TextAlign.right\n                    )\n                  ),\n                ],\n                crossAxisAlignment: CrossAxisAlignment.baseline,\n                textBaseline: DefaultTextStyle.of(context).style.textBaseline\n              )\n            ),\n          ]\n        )\n      )\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_settings.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\n\nimport 'stock_types.dart';\n\nclass StockSettings extends StatefulWidget {\n  const StockSettings(this.configuration, this.updater);\n\n  final StockConfiguration configuration;\n  final ValueChanged<StockConfiguration> updater;\n\n  @override\n  StockSettingsState createState() => new StockSettingsState();\n}\n\nclass StockSettingsState extends State<StockSettings> {\n  void _handleOptimismChanged(bool value) {\n    value ??= false;\n    sendUpdates(widget.configuration.copyWith(stockMode: value ? StockMode.optimistic : StockMode.pessimistic));\n  }\n\n  void _handleBackupChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(backupMode: value ? BackupMode.enabled : BackupMode.disabled));\n  }\n\n  void _handleShowGridChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(debugShowGrid: value));\n  }\n\n  void _handleShowSizesChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(debugShowSizes: value));\n  }\n\n  void _handleShowBaselinesChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(debugShowBaselines: value));\n  }\n\n  void _handleShowLayersChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(debugShowLayers: value));\n  }\n\n  void _handleShowPointersChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(debugShowPointers: value));\n  }\n\n  void _handleShowRainbowChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(debugShowRainbow: value));\n  }\n\n\n  void _handleShowPerformanceOverlayChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(showPerformanceOverlay: value));\n  }\n\n  void _handleShowSemanticsDebuggerChanged(bool value) {\n    sendUpdates(widget.configuration.copyWith(showSemanticsDebugger: value));\n  }\n\n  void _confirmOptimismChange() {\n    switch (widget.configuration.stockMode) {\n      case StockMode.optimistic:\n        _handleOptimismChanged(false);\n        break;\n      case StockMode.pessimistic:\n        showDialog<bool>(\n          context: context,\n           builder: (BuildContext context) {\n            return new AlertDialog(\n              title: const Text('Change mode?'),\n              content: const Text('Optimistic mode means everything is awesome. Are you sure you can handle that?'),\n              actions: <Widget>[\n                new FlatButton(\n                  child: const Text('NO THANKS'),\n                  onPressed: () {\n                    Navigator.pop(context, false);\n                  }\n                ),\n                new FlatButton(\n                  child: const Text('AGREE'),\n                  onPressed: () {\n                    Navigator.pop(context, true);\n                  }\n                ),\n              ],\n            );\n          },\n        ).then<void>(_handleOptimismChanged);\n        break;\n    }\n  }\n\n  void sendUpdates(StockConfiguration value) {\n    if (widget.updater != null)\n      widget.updater(value);\n  }\n\n  Widget buildAppBar(BuildContext context) {\n    return new AppBar(\n      title: const Text('Settings')\n    );\n  }\n\n  Widget buildSettingsPane(BuildContext context) {\n    final List<Widget> rows = <Widget>[\n      new ListTile(\n        leading: const Icon(Icons.thumb_up),\n        title: const Text('Everything is awesome'),\n        onTap: _confirmOptimismChange,\n        trailing: new Checkbox(\n          value: widget.configuration.stockMode == StockMode.optimistic,\n          onChanged: (bool value) => _confirmOptimismChange(),\n        ),\n      ),\n      new ListTile(\n        leading: const Icon(Icons.backup),\n        title: const Text('Back up stock list to the cloud'),\n        onTap: () { _handleBackupChanged(!(widget.configuration.backupMode == BackupMode.enabled)); },\n        trailing: new Switch(\n          value: widget.configuration.backupMode == BackupMode.enabled,\n          onChanged: _handleBackupChanged,\n        ),\n      ),\n      new ListTile(\n        leading: const Icon(Icons.picture_in_picture),\n        title: const Text('Show rendering performance overlay'),\n        onTap: () { _handleShowPerformanceOverlayChanged(!widget.configuration.showPerformanceOverlay); },\n        trailing: new Switch(\n          value: widget.configuration.showPerformanceOverlay,\n          onChanged: _handleShowPerformanceOverlayChanged,\n        ),\n      ),\n      new ListTile(\n        leading: const Icon(Icons.accessibility),\n        title: const Text('Show semantics overlay'),\n        onTap: () { _handleShowSemanticsDebuggerChanged(!widget.configuration.showSemanticsDebugger); },\n        trailing: new Switch(\n          value: widget.configuration.showSemanticsDebugger,\n          onChanged: _handleShowSemanticsDebuggerChanged,\n        ),\n      ),\n    ];\n    assert(() {\n      // material grid and size construction lines are only available in checked mode\n      rows.addAll(<Widget>[\n        new ListTile(\n          leading: const Icon(Icons.border_clear),\n          title: const Text('Show material grid (for debugging)'),\n          onTap: () { _handleShowGridChanged(!widget.configuration.debugShowGrid); },\n          trailing: new Switch(\n            value: widget.configuration.debugShowGrid,\n            onChanged: _handleShowGridChanged,\n          ),\n        ),\n        new ListTile(\n          leading: const Icon(Icons.border_all),\n          title: const Text('Show construction lines (for debugging)'),\n          onTap: () { _handleShowSizesChanged(!widget.configuration.debugShowSizes); },\n          trailing: new Switch(\n            value: widget.configuration.debugShowSizes,\n            onChanged: _handleShowSizesChanged,\n          ),\n        ),\n        new ListTile(\n          leading: const Icon(Icons.format_color_text),\n          title: const Text('Show baselines (for debugging)'),\n          onTap: () { _handleShowBaselinesChanged(!widget.configuration.debugShowBaselines); },\n          trailing: new Switch(\n            value: widget.configuration.debugShowBaselines,\n            onChanged: _handleShowBaselinesChanged,\n          ),\n        ),\n        new ListTile(\n          leading: const Icon(Icons.filter_none),\n          title: const Text('Show layer boundaries (for debugging)'),\n          onTap: () { _handleShowLayersChanged(!widget.configuration.debugShowLayers); },\n          trailing: new Switch(\n            value: widget.configuration.debugShowLayers,\n            onChanged: _handleShowLayersChanged,\n          ),\n        ),\n        new ListTile(\n          leading: const Icon(Icons.mouse),\n          title: const Text('Show pointer hit-testing (for debugging)'),\n          onTap: () { _handleShowPointersChanged(!widget.configuration.debugShowPointers); },\n          trailing: new Switch(\n            value: widget.configuration.debugShowPointers,\n            onChanged: _handleShowPointersChanged,\n          ),\n        ),\n        new ListTile(\n          leading: const Icon(Icons.gradient),\n          title: const Text('Show repaint rainbow (for debugging)'),\n          onTap: () { _handleShowRainbowChanged(!widget.configuration.debugShowRainbow); },\n          trailing: new Switch(\n            value: widget.configuration.debugShowRainbow,\n            onChanged: _handleShowRainbowChanged,\n          ),\n        ),\n      ]);\n      return true;\n    }());\n    return new ListView(\n      padding: const EdgeInsets.symmetric(vertical: 20.0),\n      children: rows,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: buildAppBar(context),\n      body: buildSettingsPane(context)\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_strings.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\n\nimport 'package:intl/intl.dart';\nimport 'package:flutter/widgets.dart';\n\nimport 'i18n/stock_messages_all.dart';\n\n// Information about how this file relates to i18n/stock_messages_all.dart and how the i18n files\n// were generated can be found in i18n/regenerate.md.\n\nclass StockStrings {\n  StockStrings(Locale locale) : _localeName = locale.toString();\n\n  final String _localeName;\n\n  static Future<StockStrings> load(Locale locale) {\n    return initializeMessages(locale.toString())\n      .then((Object _) {\n        return new StockStrings(locale);\n      });\n  }\n\n  static StockStrings of(BuildContext context) {\n    return Localizations.of<StockStrings>(context, StockStrings);\n  }\n\n  String title() {\n    return Intl.message(\n      '<Stocks>',\n      name: 'title',\n      desc: 'Title for the Stocks application',\n      locale: _localeName,\n    );\n  }\n\n  String market() => Intl.message(\n    'MARKET',\n    name: 'market',\n    desc: 'Label for the Market tab',\n    locale: _localeName,\n  );\n\n  String portfolio() => Intl.message(\n    'PORTFOLIO',\n    name: 'portfolio',\n    desc: 'Label for the Portfolio tab',\n    locale: _localeName,\n  );\n}\n"
  },
  {
    "path": "stocks/lib/stock_symbol_viewer.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\n\nimport 'stock_arrow.dart';\nimport 'stock_data.dart';\n\nclass _StockSymbolView extends StatelessWidget {\n  const _StockSymbolView({ this.stock, this.arrow });\n\n  final Stock stock;\n  final Widget arrow;\n\n  @override\n  Widget build(BuildContext context) {\n    assert(stock != null);\n    final String lastSale = '\\$${stock.lastSale.toStringAsFixed(2)}';\n    String changeInPrice = '${stock.percentChange.toStringAsFixed(2)}%';\n    if (stock.percentChange > 0)\n      changeInPrice = '+' + changeInPrice;\n\n    return new Container(\n      padding: const EdgeInsets.all(20.0),\n      child: new Column(\n        children: <Widget>[\n          new Row(\n            children: <Widget>[\n              new Text(\n                '${stock.symbol}',\n              ),\n              arrow,\n            ],\n            mainAxisAlignment: MainAxisAlignment.spaceBetween\n          ),\n          new Text('Last Sale'),\n          new Text('$lastSale ($changeInPrice)'),\n          new Container(\n            height: 8.0\n          ),\n          new Text('Market Cap'),\n          new Text('${stock.marketCap}'),\n          new Container(\n            height: 8.0\n          ),\n          new RichText(\n            text: new TextSpan(\n              style: DefaultTextStyle.of(context).style.merge(const TextStyle(fontSize: 8.0)),\n              text: 'Prices may be delayed by ',\n              children: const <TextSpan>[\n                const TextSpan(text: 'several', style: const TextStyle(fontStyle: FontStyle.italic)),\n                const TextSpan(text: ' years.'),\n              ]\n            )\n          ),\n        ],\n        mainAxisSize: MainAxisSize.min\n      )\n    );\n  }\n}\n\nclass StockSymbolPage extends StatelessWidget {\n  const StockSymbolPage({ this.symbol, this.stocks });\n\n  final String symbol;\n  final StockData stocks;\n\n  @override\n  Widget build(BuildContext context) {\n    return new AnimatedBuilder(\n      animation: stocks,\n      builder: (BuildContext context, Widget child) {\n        final Stock stock = stocks[symbol];\n        return new Scaffold(\n          appBar: new AppBar(\n            title: new Text(stock?.name ?? symbol)\n          ),\n          body: new SingleChildScrollView(\n            child: new Container(\n              margin: const EdgeInsets.all(20.0),\n              child: new Card(\n                child: new AnimatedCrossFade(\n                  duration: const Duration(milliseconds: 300),\n                  firstChild: const Padding(\n                    padding: const EdgeInsets.all(20.0),\n                    child: const Center(child: const CircularProgressIndicator()),\n                  ),\n                  secondChild: stock != null\n                    ? new _StockSymbolView(\n                      stock: stock,\n                      arrow: new Hero(\n                        tag: stock,\n                        child: new StockArrow(percentChange: stock.percentChange),\n                      ),\n                    ) : new Padding(\n                        padding: const EdgeInsets.all(20.0),\n                        child: new Center(child: new Text('$symbol not found')),\n                    ),\n                  crossFadeState: stock == null && stocks.loading ? CrossFadeState.showFirst : CrossFadeState.showSecond,\n                ),\n              )\n            )\n          )\n        );\n      },\n    );\n  }\n}\n\nclass StockSymbolBottomSheet extends StatelessWidget {\n  const StockSymbolBottomSheet({ this.stock });\n\n  final Stock stock;\n\n  @override\n  Widget build(BuildContext context) {\n    return new Container(\n      padding: const EdgeInsets.all(10.0),\n      decoration: const BoxDecoration(\n        border: const Border(top: const BorderSide(color: Colors.black26))\n      ),\n      child: new _StockSymbolView(\n        stock: stock,\n        arrow: new StockArrow(percentChange: stock.percentChange)\n      )\n   );\n  }\n}\n"
  },
  {
    "path": "stocks/lib/stock_types.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/foundation.dart';\n\nenum StockMode { optimistic, pessimistic }\nenum BackupMode { enabled, disabled }\n\nclass StockConfiguration {\n  StockConfiguration({\n    @required this.stockMode,\n    @required this.backupMode,\n    @required this.debugShowGrid,\n    @required this.debugShowSizes,\n    @required this.debugShowBaselines,\n    @required this.debugShowLayers,\n    @required this.debugShowPointers,\n    @required this.debugShowRainbow,\n    @required this.showPerformanceOverlay,\n    @required this.showSemanticsDebugger\n  }) : assert(stockMode != null),\n       assert(backupMode != null),\n       assert(debugShowGrid != null),\n       assert(debugShowSizes != null),\n       assert(debugShowBaselines != null),\n       assert(debugShowLayers != null),\n       assert(debugShowPointers != null),\n       assert(debugShowRainbow != null),\n       assert(showPerformanceOverlay != null),\n       assert(showSemanticsDebugger != null);\n\n  final StockMode stockMode;\n  final BackupMode backupMode;\n  final bool debugShowGrid;\n  final bool debugShowSizes;\n  final bool debugShowBaselines;\n  final bool debugShowLayers;\n  final bool debugShowPointers;\n  final bool debugShowRainbow;\n  final bool showPerformanceOverlay;\n  final bool showSemanticsDebugger;\n\n  StockConfiguration copyWith({\n    StockMode stockMode,\n    BackupMode backupMode,\n    bool debugShowGrid,\n    bool debugShowSizes,\n    bool debugShowBaselines,\n    bool debugShowLayers,\n    bool debugShowPointers,\n    bool debugShowRainbow,\n    bool showPerformanceOverlay,\n    bool showSemanticsDebugger\n  }) {\n    return new StockConfiguration(\n      stockMode: stockMode ?? this.stockMode,\n      backupMode: backupMode ?? this.backupMode,\n      debugShowGrid: debugShowGrid ?? this.debugShowGrid,\n      debugShowSizes: debugShowSizes ?? this.debugShowSizes,\n      debugShowBaselines: debugShowBaselines ?? this.debugShowBaselines,\n      debugShowLayers: debugShowLayers ?? this.debugShowLayers,\n      debugShowPointers: debugShowPointers ?? this.debugShowPointers,\n      debugShowRainbow: debugShowRainbow ?? this.debugShowRainbow,\n      showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay,\n      showSemanticsDebugger: showSemanticsDebugger ?? this.showSemanticsDebugger\n    );\n  }\n}\n"
  },
  {
    "path": "stocks/pubspec.yaml",
    "content": "name: stocks\ndescription: A simple stocks application\n\nenvironment:\n  # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.\n  sdk: \">=2.0.0-dev.68.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n  intl:\n  http:\n\nflutter:\n  uses-material-design: true\n\n  fonts:\n    - family: Roboto\n      fonts:\n        - asset: fonts/Roboto/Roboto-Thin.ttf\n          weight: 100\n        - asset: fonts/Roboto/Roboto-Light.ttf\n          weight: 300\n        - asset: fonts/Roboto/Roboto-Regular.ttf\n          weight: 400\n        - asset: fonts/Roboto/Roboto-Medium.ttf\n          weight: 500\n        - asset: fonts/Roboto/Roboto-Bold.ttf\n          weight: 700\n        - asset: fonts/Roboto/Roboto-Black.ttf\n          weight: 900\n"
  },
  {
    "path": "text_demo/.gitignore",
    "content": "# Miscellaneous\n*.class\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/\n/build/\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": "text_demo/fonts/Roboto/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "text_demo/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "text_demo/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "text_demo/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(800, 1280),\n}\n"
  },
  {
    "path": "text_demo/go/go.mod",
    "content": "module text_demo/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n\n// replace github.com/go-flutter-desktop/go-flutter => /home/drakirus/lab/flutter/go-flutter\n"
  },
  {
    "path": "text_demo/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "text_demo/go/hover.yaml",
    "content": "#application-name: \"text_demo\" # Uncomment to modify this value.\n#executable-name: \"text_demo\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"textdemo\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "text_demo/lib/app.dart",
    "content": "// This example demos the TextField/SelectableText widget and keyboard\n// integration with the go-flutter text backend\n\nimport 'package:flutter/material.dart';\n\nvoid main() => runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Code Sample for testing text input',\n      theme: ThemeData(\n        // If the host is missing some fonts, it can cause the\n        // text to not be rendered or worse the app might crash.\n        fontFamily: 'Roboto',\n        primarySwatch: Colors.blue,\n      ),\n      home: MyStatefulWidget(),\n    );\n  }\n}\n\nclass MyStatefulWidget extends StatefulWidget {\n  MyStatefulWidget({Key key}) : super(key: key);\n\n  @override\n  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();\n}\n\nclass _MyStatefulWidgetState extends State<MyStatefulWidget> {\n  FocusNode myFocus = FocusNode();\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Hover Example'),\n      ),\n      body: Container(\n        child: Column(\n          children: [\n            Padding(\n              padding: EdgeInsets.all(16.0),\n              child: SelectableText.rich(\n                // this text can be copied with \"Ctrl-C\"\n                TextSpan(\n                  text: 'Hello', // default text style\n                  children: <TextSpan>[\n                    TextSpan(\n                        text: ' beautiful world',\n                        style: TextStyle(fontWeight: FontWeight.bold)),\n                    TextSpan(\n                        text: ' (should be copyable)',\n                        style: TextStyle(\n                            fontStyle: FontStyle.italic, fontSize: 10)),\n                  ],\n                ),\n              ),\n            ),\n            Padding(\n              padding: new EdgeInsets.all(8.0),\n              child: new Column(children: <Widget>[\n                TextField(\n                  obscureText: false,\n                  decoration: InputDecoration(\n                    border: OutlineInputBorder(),\n                    labelText: 'TextField',\n                  ),\n                  onSubmitted: (value) {\n                    print(\"TextField 1:\" + value);\n                  },\n                  onEditingComplete: () =>\n                      FocusScope.of(context).requestFocus(myFocus),\n                ),\n                TextField(\n                  decoration: InputDecoration(hintText: 'Multiline TextField'),\n                  maxLines: 4,\n                  focusNode: myFocus,\n                  onSubmitted: (value) {\n                    setState(() {\n                      print(\"TextField 2:\" + value);\n                    });\n                  },\n                ),\n              ]),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "text_demo/lib/main.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'package:text_demo/app.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "text_demo/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.dart';\n\nimport 'package:text_demo/app.dart';\n\nvoid main() {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "text_demo/pubspec.yaml",
    "content": "name: text_demo\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  fonts:\n    - family: Roboto\n      fonts:\n        - asset: fonts/Roboto/Roboto-Thin.ttf\n          weight: 100\n        - asset: fonts/Roboto/Roboto-Light.ttf\n          weight: 300\n        - asset: fonts/Roboto/Roboto-Regular.ttf\n          weight: 400\n        - asset: fonts/Roboto/Roboto-Medium.ttf\n          weight: 500\n        - asset: fonts/Roboto/Roboto-Bold.ttf\n          weight: 700\n        - asset: fonts/Roboto/Roboto-Black.ttf\n          weight: 900\n"
  },
  {
    "path": "texture_tutorial/.gitignore",
    "content": "# Miscellaneous\n*.class\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/\n/build/\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": "texture_tutorial/README.md",
    "content": "# texture_tutorial\n\nThe plugins source code is stored in the same example: [./go-texture-example](./go-texture-example).\n\nMultiples path are hard coded, run the app in the root of the flutter project!\n(`hover run`)\n\n## Demo\n<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/7476655/62157099-b1793180-b30c-11e9-9ca1-677f44432ebc.gif\" width=\"650\" align=\"center\" alt=\"Demo of the\n  example\">\n</p>\n\nIf you get errors with this example, please report an issue!\n"
  },
  {
    "path": "texture_tutorial/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "texture_tutorial/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "texture_tutorial/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/plugins/go-texture-example/example_gif\"\n\t\"github.com/go-flutter-desktop/plugins/go-texture-example/example_image\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(1260, 580),\n\tflutter.AddPlugin(&example_image.ImagePlugin{}),\n\tflutter.AddPlugin(&example_gif.GifPlugin{}),\n}\n"
  },
  {
    "path": "texture_tutorial/go/go.mod",
    "content": "module texture_tutorial/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-flutter-desktop/plugins/go-texture-example/example_gif 01528a4714a5\n\tgithub.com/go-flutter-desktop/plugins/go-texture-example/example_image 01528a4714a5\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n\nreplace github.com/go-flutter-desktop/plugins/go-texture-example/example_image => ../go-texture-example/image\n\nreplace github.com/go-flutter-desktop/plugins/go-texture-example/example_gif => ../go-texture-example/gif\n"
  },
  {
    "path": "texture_tutorial/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "texture_tutorial/go/hover.yaml",
    "content": "#application-name: \"texture_tutorial\" # Uncomment to modify this value.\n#executable-name: \"texture_tutorial\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"texturetutorial\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "texture_tutorial/go-texture-example/gif/go.mod",
    "content": "module github.com/go-flutter-desktop/plugins/go-texture-example/example_gif\n\ngo 1.19\n\nrequire github.com/go-flutter-desktop/go-flutter v0.52.2\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "texture_tutorial/go-texture-example/gif/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "texture_tutorial/go-texture-example/gif/main.go",
    "content": "package example_gif\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"image/draw\"\n\t\"image/gif\"\n\t\"os\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n)\n\n// GifPlugin is a texture plugin example\ntype GifPlugin struct {\n\tgif  *gif.GIF\n\trgba *image.RGBA // in-memory buffer for the next image to be displayed\n}\n\nvar _ flutter.PluginTexture = &GifPlugin{} // compile-time type check\n\n// InitPlugin is used because PluginTexture must implement flutter.Plugin.\n// InitPlugin delays the first frame, it's better to have images decoded\n// on demand in a HandleFunc (non-bloking).\nfunc (p *GifPlugin) InitPlugin(messenger plugin.BinaryMessenger) error {\n\n\t// hard-coded path, run the app with `hover run` in the project root\n\tfile := \"./SampleVideo.gif\"\n\tgifFile, err := os.Open(file)\n\tif err != nil {\n\t\tfmt.Printf(\"gif %q not found on disk: %v\\n\", file, err)\n\t\treturn err\n\t}\n\n\tp.gif, err = gif.DecodeAll(gifFile)\n\tif err != nil {\n\t\tfmt.Printf(\"error decoding file %s:%v\\n\", file, err)\n\t\treturn err\n\t}\n\n\tgifWidth, gifHeight := getGifDimensions(p.gif)\n\n\tp.rgba = image.NewRGBA(image.Rect(0, 0, gifWidth, gifHeight))\n\tif p.rgba.Stride != p.rgba.Rect.Size().X*4 {\n\t\treturn errors.New(\"unsupported stride\\n\")\n\t}\n\n\tdraw.Draw(p.rgba, p.rgba.Bounds(), p.gif.Image[0], image.ZP, draw.Over)\n\n\treturn nil\n}\n\n// InitPluginTexture is used to create and manage backend textures\nfunc (p *GifPlugin) InitPluginTexture(registry *flutter.TextureRegistry) error {\n\n\ttexture := registry.NewTexture()\n\n\t// for this exmaple I have hard-coded a `textureId: 2` in the flutter\n\t// Texture widget.\n\ttexture.ID = 2\n\t// You should never change this ID, `registry.NewTexture()` will keep track\n\t// of the textureId counter for you.\n\t// You should send the texture.ID number to dart using some sort of platform\n\t// channel, and use the go generated textureId in flutter.\n\n\tgo func() {\n\t\tfor { // looping gif\n\t\t\tfor i, srcImg := range p.gif.Image {\n\t\t\t\ttime.Sleep(time.Millisecond * 10 * time.Duration(p.gif.Delay[i]))\n\t\t\t\tdraw.Draw(p.rgba, p.rgba.Bounds(), srcImg, image.ZP, draw.Over) // get the frame's pixels\n\t\t\t\ttexture.FrameAvailable()                                        // redraw (calls textureHanler, and retrive the pixel)\n\t\t\t}\n\t\t}\n\t\t// In this fairly simple example no golang mutex/channel were used to sync draw.Draw and textureHanler.\n\t}()\n\n\treturn texture.Register(p.textureHanler)\n}\n\n// textureHanler is executed on the main thread, try to make this handle as\n// light as possible.\n// In this case the handler is only sending the pixel buffer drawn in a\n// goroutine.\nfunc (p *GifPlugin) textureHanler(width, height int) (bool, *flutter.PixelBuffer) {\n\treturn true, &flutter.PixelBuffer{\n\t\tPix:    p.rgba.Pix,\n\t\tWidth:  p.rgba.Bounds().Size().X,\n\t\tHeight: p.rgba.Bounds().Size().Y,\n\t}\n}\n\nfunc getGifDimensions(gif *gif.GIF) (x, y int) {\n\tvar lowestX int\n\tvar lowestY int\n\tvar highestX int\n\tvar highestY int\n\tfor _, gif := range gif.Image {\n\t\tif gif.Rect.Min.X < lowestX {\n\t\t\tlowestX = gif.Rect.Min.X\n\t\t}\n\t\tif gif.Rect.Min.Y < lowestY {\n\t\t\tlowestY = gif.Rect.Min.Y\n\t\t}\n\t\tif gif.Rect.Max.X > highestX {\n\t\t\thighestX = gif.Rect.Max.X\n\t\t}\n\t\tif gif.Rect.Max.Y > highestY {\n\t\t\thighestY = gif.Rect.Max.Y\n\t\t}\n\t}\n\treturn highestX - lowestX, highestY - lowestY\n}\n"
  },
  {
    "path": "texture_tutorial/go-texture-example/image/go.mod",
    "content": "module github.com/go-flutter-desktop/plugins/go-texture-example/example_image\n\ngo 1.19\n\nrequire github.com/go-flutter-desktop/go-flutter v0.52.2\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "texture_tutorial/go-texture-example/image/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "texture_tutorial/go-texture-example/image/main.go",
    "content": "package example_image\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"image/draw\"\n\t\"os\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n)\n\n// ImagePlugin is a texture plugin example\ntype ImagePlugin struct{}\n\nvar _ flutter.PluginTexture = &ImagePlugin{} // compile-time type check\n\n// InitPlugin is used because PluginTexture must implement flutter.Plugin\nfunc (p *ImagePlugin) InitPlugin(messenger plugin.BinaryMessenger) error {\n\treturn nil\n}\n\n// InitPluginTexture is used to create and manage backend textures\nfunc (p *ImagePlugin) InitPluginTexture(registry *flutter.TextureRegistry) error {\n\n\ttexture := registry.NewTexture()\n\n\t// for this exmaple I have hard-coded a `textureId: 1` in the flutter\n\t// Texture widget.\n\ttexture.ID = 1\n\t// You should never change this ID, `registry.NewTexture()` will keep track\n\t// of the textureId counter for you.\n\t// You should send the texture.ID number to dart using some sort of platform\n\t// channel, and use the go generated textureId in flutter.\n\n\t// after 5 seconds, remove the texture from the scene.\n\tgo func() {\n\t\ttime.Sleep(5 * time.Second)\n\t\tfmt.Printf(\"texture_tutorial: UnRegistering texture %v after 5 seconds\\n\", texture.ID)\n\t\terr := texture.UnRegister()\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"texture_tutorial: %v\\n\", err)\n\t\t}\n\t\ttexture.FrameAvailable() // redraw\n\t}()\n\n\treturn texture.Register(p.textureHanler)\n}\n\nfunc (p *ImagePlugin) textureHanler(width, height int) (bool, *flutter.PixelBuffer) {\n\n\t// hard-coded path, run the app with `hover run` in the project root\n\tfile := \"./test.png\"\n\timgFile, err := os.Open(file)\n\tif err != nil {\n\t\tfmt.Printf(\"image %q not found on disk: %v\\n\", file, err)\n\t\treturn false, nil\n\t}\n\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\tfmt.Printf(\"error decoding file %s:%v\\n\", file, err)\n\t\treturn false, nil\n\t}\n\n\trgba := image.NewRGBA(img.Bounds())\n\tif rgba.Stride != rgba.Rect.Size().X*4 {\n\t\tfmt.Printf(\"unsupported stride\\n\")\n\t\treturn false, nil\n\t}\n\n\tdraw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src)\n\treturn true, &flutter.PixelBuffer{\n\t\tPix:    rgba.Pix,\n\t\tWidth:  rgba.Bounds().Size().X,\n\t\tHeight: rgba.Bounds().Size().Y,\n\t}\n}\n"
  },
  {
    "path": "texture_tutorial/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.dart';\n\nvoid main() {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  runApp(MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'go-flutter Texture API',\n      theme: ThemeData(\n        // If the host is missing some fonts, it can cause the\n        // text to not be rendered or worse the app might crash.\n        fontFamily: 'Roboto',\n        primarySwatch: Colors.blue,\n      ),\n      home: Scaffold(\n        appBar: AppBar(\n          title: Text('Texture Examples'),\n        ),\n        body: Center(\n          child: Row(\n            mainAxisAlignment: MainAxisAlignment.spaceAround,\n            children: <Widget>[\n              Column(\n                children: <Widget>[\n                  Spacer(flex: 2),\n                  Text('Gif Player (2sec gif)'),\n                  Spacer(flex: 2),\n                  ConstrainedBox(\n                    constraints: BoxConstraints.tight(Size(640, 360)),\n                    // hard-coded to 2, gif.\n                    // (Not the best practise, let go-flutter generate this ID\n                    // and send it back to the dart code using platform\n                    // messages)\n                    child: Texture(textureId: 2), \n                  ),\n                  Spacer(flex: 3),\n                ],\n              ),\n              Column(\n                children: <Widget>[\n                  Spacer(flex: 2),\n                  Text('Image Texture (Cleared after 5s)'),\n                  Spacer(flex: 2),\n                  ConstrainedBox(\n                    constraints: BoxConstraints.tight(Size(330, 319)),\n                    child: Texture(textureId: 1), // hard-coded to 1, image\n                  ),\n                  Spacer(flex: 3),\n                ],\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "texture_tutorial/pubspec.yaml",
    "content": "name: texture_tutorial\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n"
  },
  {
    "path": "xbox_controller/.gitignore",
    "content": "# Miscellaneous\n*.class\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/\n/build/\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": "xbox_controller/README.md",
    "content": "# xbox_controller\n\nA project demonstrating:\n  - The [EventChannel](https://godoc.org/github.com/go-flutter-desktop/go-flutter/plugin#EventChannel) specialized platform channel.\n\nThe demo uses the game engine [flame](https://github.com/flame-engine/flame).\n\n## Demo\n<p align=\"center\">\n  <img src=\"./xbox_controller.gif\" width=\"650\" align=\"center\" alt=\"Demo of the\n  example\">\n</p>\n\n\n"
  },
  {
    "path": "xbox_controller/fonts/Roboto/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "xbox_controller/go/.gitignore",
    "content": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "xbox_controller/go/cmd/import-path_provider-plugin.go",
    "content": "package main\n\n// DO NOT EDIT, this file is generated by hover at compile-time for the path_provider plugin.\n\nimport (\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\tpath_provider \"github.com/go-flutter-desktop/plugins/path_provider\"\n)\n\nfunc init() {\n\t// Only the init function can be tweaked by plugin maker.\n\toptions = append(options, flutter.AddPlugin(&path_provider.PathProviderPlugin{\n\t\tVendorName:      flutter.ProjectOrganizationName,\n\t\tApplicationName: flutter.ProjectName,\n\t}))\n}\n"
  },
  {
    "path": "xbox_controller/go/cmd/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/pkg/errors\"\n)\n\n// vmArguments may be set by hover at compile-time\nvar vmArguments string\n\nfunc main() {\n\t// DO NOT EDIT, add options in options.go\n\tmainOptions := []flutter.Option{\n\t\tflutter.OptionVMArguments(strings.Split(vmArguments, \";\")),\n\t\tflutter.WindowIcon(iconProvider),\n\t}\n\terr := flutter.Run(append(options, mainOptions...)...)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc iconProvider() ([]image.Image, error) {\n\texecPath, err := os.Executable()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to resolve executable path\")\n\t}\n\texecPath, err = filepath.EvalSymlinks(execPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to eval symlinks for executable path\")\n\t}\n\timgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), \"assets\", \"icon.png\"))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to open assets/icon.png\")\n\t}\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to decode image\")\n\t}\n\treturn []image.Image{img}, nil\n}\n"
  },
  {
    "path": "xbox_controller/go/cmd/options.go",
    "content": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\tcontroller \"github.com/go-flutter-desktop/plugins/xbox\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowInitialDimensions(1600, 1100),\n\tflutter.WindowDimensionLimits(1600, 1100, 1600, 1100),\n\tflutter.AddPlugin(&controller.XBOXStream{}),\n}\n"
  },
  {
    "path": "xbox_controller/go/go.mod",
    "content": "module xbox_controller/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-flutter-desktop/plugins/path_provider v0.5.0\n\tgithub.com/go-flutter-desktop/plugins/xbox 01528a4714a5\n\tgithub.com/pkg/errors v0.9.1\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/adrg/xdg v0.4.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect\n\tgolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n\nreplace github.com/go-flutter-desktop/plugins/xbox => ../go-plugin-example/controller\n"
  },
  {
    "path": "xbox_controller/go/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=\ngithub.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.1/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-flutter-desktop/plugins/path_provider v0.5.0 h1:5Rcq05GUsi8HssKQ6S7wPzLzRg455UymCPRMve0uz7s=\ngithub.com/go-flutter-desktop/plugins/path_provider v0.5.0/go.mod h1:x1kDFgkxLKR0Xp51zJPX3G8+B0y87EBaZB3/WzKIilo=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=\ngolang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "xbox_controller/go/hover.yaml",
    "content": "#application-name: \"xbox_controller\" # Uncomment to modify this value.\n#executable-name: \"xbox_controller\" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces\n#package-name: \"xboxcontroller\" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces\nlicense: \"\" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses\ntarget: lib/main_desktop.dart\n# opengl: \"none\" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)\ndocker: false\nengine-version: \"\" # change to a engine version commit\n"
  },
  {
    "path": "xbox_controller/go-plugin-example/controller/go.mod",
    "content": "module github.com/go-flutter-desktop/plugins/xbox\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164\n)\n\nrequire (\n\tgithub.com/Xuanwo/go-locale v1.1.0 // indirect\n\tgithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect\n\tgolang.org/x/text v0.3.7 // indirect\n)\n"
  },
  {
    "path": "xbox_controller/go-plugin-example/controller/go.sum",
    "content": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=\ngithub.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=\ngithub.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 h1:ddtotcEXIT7dFhSeXIWjK8YMFYl5bB2NdYQwgv6Uqjk=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=\ngithub.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=\ngolang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "xbox_controller/go-plugin-example/controller/main.go",
    "content": "package controller\n\nimport (\n\t\"reflect\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n\t\"github.com/go-gl/glfw/v3.3/glfw\"\n)\n\n// XBOXStream demonstrates how to use the EventChannel.\ntype XBOXStream struct {\n\tstop chan bool\n}\n\nvar _ flutter.Plugin = &XBOXStream{} // compile-time type check\n\nfunc (p *XBOXStream) InitPlugin(messenger plugin.BinaryMessenger) error {\n\tp.stop = make(chan bool)\n\tchannel := plugin.NewEventChannel(messenger, \"go-flutter-sample/xbox_controller\", plugin.StandardMethodCodec{})\n\tchannel.Handle(p)\n\treturn nil\n}\n\nfunc (p *XBOXStream) OnListen(arguments interface{}, sink *plugin.EventSink) {\n\tjoy := glfw.Joystick1\n\n\tvar lastJoystickInfo map[interface{}]interface{}\n\tfor {\n\t\tselect {\n\t\tcase <-p.stop:\n\t\t\treturn\n\t\tdefault:\n\n\t\t\tvar present bool\n\t\t\tif joy.Present() {\n\t\t\t\tpresent = true\n\n\t\t\t\tglfwButtons := joy.GetButtons()\n\t\t\t\tbuttons := make([]interface{}, len(glfwButtons))\n\t\t\t\tfor i, v := range glfwButtons {\n\t\t\t\t\tbuttons[i] = v == 1\n\t\t\t\t}\n\n\t\t\t\tglfwAxes := joy.GetAxes()\n\t\t\t\taxes := make([]interface{}, len(glfwAxes))\n\t\t\t\tfor i, v := range glfwAxes {\n\t\t\t\t\taxes[i] = float64(v)\n\t\t\t\t}\n\n\t\t\t\tjoystickInfo := map[interface{}]interface{}{\n\t\t\t\t\t\"name\":    joy.GetName(),\n\t\t\t\t\t\"buttons\": buttons,\n\t\t\t\t\t\"axes\":    axes,\n\t\t\t\t}\n\n\t\t\t\t// don't send duplicated succeding message, (reduces serialisation).\n\t\t\t\tif !reflect.DeepEqual(lastJoystickInfo, joystickInfo) {\n\t\t\t\t\tsink.Success(joystickInfo)\n\t\t\t\t\tlastJoystickInfo = joystickInfo\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !present {\n\t\t\t\t// no joysticks present\n\n\t\t\t\t// EndOfStream will call OnCancel, which will send true in the channel\n\t\t\t\t// p.stop, which will stop the OnListen goroutine.\n\t\t\t\tsink.EndOfStream()\n\t\t\t}\n\n\t\t\ttime.Sleep(5 * time.Millisecond) // Constantly polling joysticks event\n\t\t\t// no wait for joysticks events available\n\t\t}\n\t}\n}\nfunc (p *XBOXStream) OnCancel(arguments interface{}) {\n\t// I choose to use channels to Cancel events.\n\t// Mutex can also work.\n\t// I found that channels are bit more reliable than Mutex during hot restart.\n\tp.stop <- true\n}\n"
  },
  {
    "path": "xbox_controller/lib/game.dart",
    "content": "import 'package:flame/game.dart';\nimport 'package:flame_svg/flame_svg.dart';\nimport 'package:flame/position.dart';\nimport 'package:flame/text_config.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nimport 'dart:async';\n\nconst XBOXEventStream = const EventChannel('go-flutter-sample/xbox_controller');\n\nclass MyGame extends BaseGame {\n  Svg svgInstance;\n  TextConfig config = TextConfig(\n      fontSize: 20.0, fontFamily: 'Roboto', color: Colors.pinkAccent);\n\n  Controller controller = Controller.messageAsName(\n      \"No game controller connected (Click to connect)\");\n\n  StreamSubscription _xboxInputSubs;\n\n  Size screenSize;\n  MyGame(this.screenSize) {\n    _start();\n    searchController();\n  }\n\n  void searchController() {\n    if (_xboxInputSubs != null) {\n      return;\n    }\n    this.controller = Controller.messageAsName(\"Searching controller...\");\n\n    _xboxInputSubs =\n        XBOXEventStream.receiveBroadcastStream().listen(_updateGameController);\n    _xboxInputSubs.onDone(() async {\n      await Future.delayed(Duration(seconds: 1));\n      this.controller = Controller.messageAsName(\n          \"No game controller connected (Click to connect)\");\n      _xboxInputSubs = null;\n    });\n  }\n\n  void _updateGameController(ctrl) {\n    // print(ctrl);\n    this.controller = Controller(\n        name: ctrl[\"name\"],\n        stickAxes: ctrl[\"axes\"].cast<double>(),\n        buttons: ctrl[\"buttons\"].cast<bool>());\n  }\n\n  void _start() {\n    svgInstance = Svg('xbox-controller.svg');\n  }\n\n  @override\n  void render(Canvas canvas) {\n    super.render(canvas);\n\n    final Rect rect = Rect.fromLTWH(0, 0, screenSize.width, screenSize.height);\n\n    canvas.drawRect(rect, Paint()..color = Colors.white);\n    canvas.drawRect(rect, Paint()..color = Colors.black12);\n\n    config.render(canvas, this.controller.name, Position(10, 10));\n\n    svgInstance.renderPosition(canvas, Position(100, 0), 600, 500);\n\n    canvas.drawCircle(\n        Offset(269 + this.controller.offsetRightStick().x,\n            174 + this.controller.offsetRightStick().y),\n        7,\n        Paint()..color = Colors.white70);\n\n    canvas.drawCircle(\n        Offset(466 + this.controller.offsetLeftStick().x,\n            260 + this.controller.offsetLeftStick().y),\n        7,\n        Paint()..color = Colors.white70);\n\n    canvas.drawRect(Rect.fromLTWH(259, 91, 19, this.controller.lt() * 10),\n        Paint()..color = Colors.black54);\n\n    canvas.drawRect(Rect.fromLTWH(523, 91, 19, this.controller.rt() * 10),\n        Paint()..color = Colors.black54);\n\n    for (var btn in this.controller.pressedButtons()) {\n      canvas.drawCircle(Offset(btn.coordinates.x, btn.coordinates.y), 18,\n          Paint()..color = btn.color);\n    }\n  }\n}\n\nclass Coordinates {\n  double x, y;\n  Coordinates({this.x, this.y});\n}\n\nclass Button {\n  String name;\n  Coordinates coordinates;\n  Color color;\n  Button(this.name, this.coordinates, this.color);\n}\n\nclass Controller {\n  String name;\n  List<double> stickAxes = [0, 0, 0, 0, 0, 0, 0, 0];\n  List<bool> buttons = [\n    false,\n    false,\n    false,\n    false,\n    false,\n    false,\n    false,\n    false,\n    false,\n    false\n  ];\n\n  Controller({this.name, this.stickAxes, this.buttons});\n\n  // Named constructor\n  Controller.messageAsName(this.name);\n\n  Coordinates offsetRightStick() {\n    return Coordinates(x: (this.stickAxes[0] * 27), y: (stickAxes[1] * 27));\n  }\n\n  Coordinates offsetLeftStick() {\n    return Coordinates(x: (this.stickAxes[3] * 27), y: (stickAxes[4] * 27));\n  }\n\n  double rt() {\n    return (this.stickAxes[5] + 1) * -2;\n  }\n\n  double lt() {\n    return (this.stickAxes[2] + 1) * -2;\n  }\n\n  List<Button> pressedButtons() {\n    var list = List<Button>();\n    if (this.buttons[0])\n      list.add(Button(\"A\", Coordinates(x: 526, y: 208), Color(0xFF4AB072)));\n    if (this.buttons[1])\n      list.add(Button(\"B\", Coordinates(x: 561, y: 174), Color(0xFFBC322B)));\n    if (this.buttons[2])\n      list.add(Button(\"X\", Coordinates(x: 492, y: 174), Color(0xFF355BB8)));\n    if (this.buttons[3])\n      list.add(Button(\"Y\", Coordinates(x: 526, y: 140), Color(0xFFCFAF2B)));\n\n    if (this.buttons[12])\n      list.add(Button(\">\", Coordinates(x: 384, y: 257), Colors.white70));\n    if (this.buttons[14])\n      list.add(Button(\"<\", Coordinates(x: 292, y: 257), Colors.white70));\n    if (this.buttons[11])\n      list.add(Button(\"^\", Coordinates(x: 339, y: 210), Colors.white70));\n    if (this.buttons[13])\n      list.add(Button(\"v\", Coordinates(x: 339, y: 307), Colors.white70));\n\n    if (this.buttons[5])\n      list.add(Button(\"RB\", Coordinates(x: 535, y: 83), Colors.white70));\n    if (this.buttons[4])\n      list.add(Button(\"LB\", Coordinates(x: 266, y: 83), Colors.white70));\n    return list;\n  }\n}\n"
  },
  {
    "path": "xbox_controller/lib/main.dart",
    "content": "void main() async {\n  print(\"Desktop only application\");\n}\n"
  },
  {
    "path": "xbox_controller/lib/main_desktop.dart",
    "content": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\n\nimport 'package:flutter/material.dart';\nimport 'package:flame/flame.dart';\nimport 'package:flutter/gestures.dart';\n\nimport './game.dart';\n\nvoid main() async {\n  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;\n  WidgetsFlutterBinding.ensureInitialized();\n  final Size size = await Flame.util.initialDimensions();\n  final game = MyGame(size);\n  runApp(game.widget);\n\n  Flame.util.addGestureRecognizer(TapGestureRecognizer()\n    ..onTapDown = (TapDownDetails evt) {\n      game.searchController();\n    });\n}\n"
  },
  {
    "path": "xbox_controller/pubspec.yaml",
    "content": "name: xbox_controller\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flame:\n  flame_svg:\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons:\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n  assets:\n    - assets/xbox-controller.svg\n\n  fonts:\n    - family: Roboto\n      fonts:\n        - asset: fonts/Roboto/Roboto-Thin.ttf\n          weight: 100\n        - asset: fonts/Roboto/Roboto-Light.ttf\n          weight: 300\n        - asset: fonts/Roboto/Roboto-Regular.ttf\n          weight: 400\n        - asset: fonts/Roboto/Roboto-Medium.ttf\n          weight: 500\n        - asset: fonts/Roboto/Roboto-Bold.ttf\n          weight: 700\n        - asset: fonts/Roboto/Roboto-Black.ttf\n          weight: 900\n"
  }
]