Most of the packages that were used by Buildroot to produce the image files,
including Buildroot itself, have open-source licenses. It is your
responsibility to comply to the requirements of these licenses.
To make this easier for you, Buildroot collected in this directory some
material you may need to get it done.

This material is composed of the following items.
 * The scripts used to control compilation of the packages and the generation
   of image files, i.e. the Buildroot sources.
   Note: this has not been saved due to technical limitations, you must
   collect it manually.
 * The Buildroot configuration file; this has been saved in buildroot.config.
 * The toolchain (cross-compiler and related tools) used to generate all the
   compiled programs.
   Note: this may have not been saved due to technical limitations, you may
   need to collect it manually.
 * The original source code for all packages; this has been saved in the
   sources/ subdirectory (except for the non-redistributable packages, which
   have not been saved). Patches that were applied are also saved, along
   with a file named 'series' that lists the patches in the order they were
   applied. Patches are under the same license as the files that they modify
   in the original package.
   Note: Buildroot applies additional patches to Libtool scripts of
   autotools-based packages. These patches can be found under
   support/libtool in the Buildroot source and, due to technical
   limitations, are not saved with the package sources. You may need
   to collect them manually.
 * A manifest file listing the configured packages and related information.
 * The license text of the packages; they have been saved in the licenses/
   subdirectory.

