<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
<package >
  <metadata>
    <id>Org.Apache.REEF.FatNuGet</id>
    <version>$version$</version>
    <title>Org.Apache.REEF.FatNuGet</title>
    <authors>The Apache REEF project</authors>
    <owners>The Apache REEF project</owners>
    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0</licenseUrl>
    <projectUrl>http://reef.apache.org/</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Provide single package which contains all necessary REEF/WAKE/TANG projects.</description>
    <copyright>The Apache Software Foundation</copyright>
    <tags>Single package which contains all Reef/Wake/Tang projects </tags>
    <dependencies>
      <dependency id="Microsoft.Hadoop.Avro" version="1.5.6" />
      <dependency id="Newtonsoft.Json" version="8.0.3" />
      <dependency id="protobuf-net" version="2.0.0.668" />
      <dependency id="Rx-Core" version="2.2.5" />
    </dependencies>
  </metadata>
  <files>
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\NugetExeFix.txt" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Client.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Client.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Common.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Common.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Driver.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Driver.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Evaluator.exe" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Examples.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Examples.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.FatNuGet.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.FatNuGet.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.IMRU.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.IMRU.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.IO.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.IO.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Network.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Network.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Tang.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Tang.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Utilities.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Utilities.pdb" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Wake.dll" target="lib\net45" />
    <file src="..\bin\$Platform$\$Configuration$\Org.Apache.REEF.FatNuGet\Org.Apache.REEF.Wake.pdb" target="lib\net45" />
  </files>
</package>
